audit F38+F39: strip dead LLM provider config + rewrite docs to match reality
Closes audit F38 (dead env vars in shipped templates) and F39 (doc
drift). Cortex moved to the Anthropic SDK in v0.2.0; the providers it
supports today are ``bedrock``, ``vertex``, and ``direct``. The shipped
templates and user-facing docs still advertised Azure OpenAI,
self-hosted Qwen, and local Ollama — every one of those env vars
(``CORTEX_LLM__MODE``, ``CORTEX_LLM__AZURE__*``,
``CORTEX_LLM__REMOTE__*``, ``CORTEX_LLM__LOCAL__*``,
``CORTEX_LLM__MODEL_NAME``) is silently dropped by ``LLMConfig.extra=
"ignore"`` and the legacy-fallback validator maps stale values to the
rule-based fallback. The user ends up entering credentials for a
provider that no longer exists, then wonders why the daemon never
talks to the LLM.
Changes:
- ``cortex/.env.example`` — rewrote the LLM block. It now lists
``CORTEX_LLM__PROVIDER``, the three transports, the BYOK Keychain
service / account, and explicit logical model IDs. The dead env
names are documented in a single trailing comment so a user grepping
for ``CORTEX_LLM__MODE`` lands at the deprecation note instead of an
example to copy.
- ``README.md`` — the tech-stack row, the prereqs row, the
configuration step, the "what to expect" paragraph, and the
troubleshooting subsection all rewritten to name only the real
providers, the ``CORTEX_LLM__PROVIDER`` selector, and the BYOK
Keychain step. Added a "removed providers" footnote so users
searching old docs find context.
- ``Setup.md`` — same surgery. Option A/B/C now describe Bedrock,
Vertex, and direct Anthropic API. Verification line fixed
(``get_config().llm.mode`` no longer exists; replaced with
``llm.provider``).
- ``Architecture.md`` — L4 ASCII diagram line says
``Anthropic SDK over AWS Bedrock / GCP Vertex / direct Anthropic
API`` instead of the dead ``Azure/Ollama/remote/rule`` quartet.
Test: ``cortex/tests/unit/test_seed_config_dead_envs.py`` — 7 cases.
The whole-token regression guard (``CORTEX_LLM__MODE`` matches but
``CORTEX_LLM__MODEL_DEFAULT`` does not) scans ``seed_config.py`` and
``.env.example`` for any dead env name or model value outside a
comment block. Positive checks confirm ``.env.example`` names a real
provider and the user-facing docs (``README``, ``Setup``,
``Architecture``) all mention Bedrock + Vertex + Anthropic plus at
least one of ``CORTEX_LLM__PROVIDER`` / ``ANTHROPIC_PROVIDER``.
Outcomes:
- On this branch: ``pytest cortex/tests/unit/test_seed_config_dead_envs.py``
→ 7 passed.
- On audit baseline (commit 36cc15f): the test module collects fine
(it has no external deps); 5 of the 7 cases fail —
``test_env_example_has_no_dead_env_names`` (the file has
``CORTEX_LLM__MODE``, ``CORTEX_LLM__AZURE__*``,
``CORTEX_LLM__REMOTE__*``, ``CORTEX_LLM__LOCAL__*``,
``CORTEX_LLM__MODEL_NAME``),
``test_env_example_has_no_dead_values`` (``qwen3-8b``,
``gpt-5-mini``, ``llama3.1:8b``),
``test_env_example_lists_real_providers`` (no
``CORTEX_LLM__PROVIDER``),
``test_docs_name_the_three_real_providers`` (README + Setup +
Architecture missing Bedrock/Vertex/Anthropic markers),
``test_docs_mention_the_provider_selector_env_var`` (no doc
mentions the provider selector). The two
``test_seed_config_has_no_dead_*`` cases pass on baseline because
``seed_config.py`` already used the correct provider config in the
audit baseline.