{
  "manifest_version": 1,
  "description": "Verified model-name and reasoning-effort capability matrix per harness. scripts/model-policy.mjs fails closed on model names and reasoning efforts not covered here, so a policy can never project a value that would 404 (OpenAI: HTTP 404 invalid_request_error/model_not_found; OpenRouter: HTTP 404) or be silently dropped at request time. Namespaces are evaluated in order; first 'match' wins. Human-readable matrix: docs/model-policy-matrix.md. Refresh workflow: .claude/skills/model-registry-refresh/SKILL.md.",
  "last_refreshed": "2026-10-06",
  "harnesses": {
    "codex": {
      "reasoning_key": "model_reasoning_effort",
      "reasoning_efforts": ["none", "minimal", "low", "medium", "high", "xhigh", "max", "ultra"],
      "reasoning_note": "Codex does not check a configured effort against the model's advertised supported_reasoning_levels: resolve_reasoning_effort (codex-rs/protocol/src/openai_models/reasoning_effort.rs) passes every value through unchanged except ultra (sent as the model's multi_agent_reasoning_effort, else max) and persistent (sent as Custom(\"disabled\")), and the advertised list is used only to fill the TUI effort picker and to remap the effort when a session switches model (core/src/session/turn_context.rs). An unsupported pairing therefore fails, if at all, at the provider, so the registry narrows per model family below to make it fail at check time instead. o-series models predate none/minimal/xhigh; \"max\" is advertised only by the gpt-6, gpt-6.1 and gpt-5.6 families, and \"ultra\" only by gpt-6-astra, gpt-6.1-sol, gpt-6-sol, gpt-5.6-sol and gpt-5.6-terra. The Responses reasoning guide states the accepted set is \"model-dependent and can include none, minimal, low, medium, high, xhigh, and max\", with defaults also model-dependent (gpt-5.6 and gpt-5.5 default to medium) — which is why narrowing lives per model here rather than at the harness level. Note that guide's detailed table omits \"minimal\" while its own opening sentence lists it; that is not treated as removal, since absence from one table contradicted by the same page's prose is not evidence a value was withdrawn. The Codex ReasoningEffort enum carries None|Minimal|Low|Medium|High|XHigh|Max|Ultra|Persistent plus a Custom(String) fallback, and the config schema types the key as a free-form non-empty string, so the harness itself does not reject a value — the narrowing here is what makes an unsupported pairing fail at check time instead of at the provider. \"ultra\" joined this vocabulary on 2026-09-23. It had been excluded because https://learn.chatgpt.com/docs/models documented the CLI effort list as Low|Medium|High|Extra high|Max and placed Ultra on web/desktop only; that page now lists \"Ultra — Maximum reasoning with automatic task delegation\" for the CLI surface, and https://learn.chatgpt.com/docs/config-file/config-reference documents model_reasoning_effort as \"low\", \"medium\", \"high\", \"xhigh\", \"max\", or \"ultra\" (\"Available levels depend on the model and client\"). It is registered only on the models whose entry in codex-rs/models-manager/models.json advertises it (gpt-6-astra, gpt-6.1-sol, gpt-6-sol, gpt-5.6-sol, gpt-5.6-terra); the docs state GPT-6 Luna stops at Max, which the catalog agrees with. \"persistent\" stays out: it is an enum variant only — absent from the config reference and advertised by no model. This registry governs codex.toml, which is the CLI — an enum variant existing is not evidence the configured surface accepts it, the same distinction that applies to the ollama and openrouter routes. Note also that UI labels differ from wire values (the app shows \"Light\" for low, \"Extra High\" for xhigh), and that the app's Speed control (Fast/Standard) is a separate axis from effort with no documented codex.toml key, so it is not projectable at all.",
      "namespaces": [
        {
          "id": "openai",
          "description": "OpenAI first-party text/coding models served by Codex's default provider. Image, audio, and video model slugs are deliberately excluded — they are not valid agent models. Note on evidence: codex-rs/models-manager/models.json is the Codex subscription picker, not the API model set (filter_by_auth narrows it further to supported_in_api entries), so a slug's absence from it is NOT evidence of retirement — the o-series and gpt-4.1-* entries below are kept for that reason. Only the provider's own deprecations page moves an entry to retiring/retired. gpt-5.2 is visible in that map but stays unregistered until its reasoning-effort list is verified. The cybersecurity models (gpt-5.6-cyber, gpt-daybreak-red-latest, gpt-daybreak-blue-latest) are deliberately unregistered: the API models page offers them only for authorized security work, so a policy could otherwise assign a model most operators cannot call. codex-auto-review is internal and outside this namespace's match.",
          "match": "^(gpt-|o[0-9])[a-z0-9.-]*$",
          "membership": "closed",
          "model_provider": null,
          "sources": [
            "Context7 /openai/codex references/latest-model.md (current model map)",
            "Context7 /openai/codex codex-rs/core/config.schema.json + codex-rs/protocol/src/openai_models.rs (verified 2026-09-05)",
            "https://developers.openai.com/codex",
            "https://developers.openai.com/api/docs/models (GPT-6 + GPT-5.6 families, verified 2026-09-05)",
            "https://developers.openai.com/api/docs/guides/reasoning?api-mode=responses (Responses reasoning.effort vocabulary and its model-dependence, verified 2026-09-08)",
            "Context7 /openai/codex codex-rs/models-manager/models.json (Codex model map, verified 2026-09-08)",
            "https://raw.githubusercontent.com/openai/codex/main/codex-rs/models-manager/models.json (gpt-6-sol, gpt-6-luna and per-model ultra support, verified 2026-09-23)",
            "https://learn.chatgpt.com/docs/config-file/config-reference (model_reasoning_effort values including ultra, verified 2026-09-23)",
            "https://learn.chatgpt.com/docs/models?surface=cli (CLI effort list including Ultra; GPT-6 Luna stops at Max, verified 2026-09-23)",
            "Context7 /openai/codex resolve_reasoning_effort, build_reasoning and turn_context (a configured effort is sent unchanged except ultra and persistent; verified 2026-09-23)",
            "https://developers.openai.com/api/docs/models (GPT-6.1 Sol model ID and reasoning list, verified 2026-10-06)",
            "https://developers.openai.com/api/docs/deprecations (2026-10-01 GPT-5.3-Codex, GPT-5.1, GPT-5.4-Nano deprecation, verified 2026-10-06)",
            "https://learn.chatgpt.com/docs/models?surface=cli (GPT-5.5 leaves ChatGPT sign-in Codex on 2026-10-14, API unaffected; verified 2026-10-06)"
          ],
          "models": [
            { "id": "gpt-6-astra", "reasoning_efforts": ["low", "medium", "high", "xhigh", "max", "ultra"], "last_verified": "2026-09-23", "source": "https://raw.githubusercontent.com/openai/codex/main/codex-rs/models-manager/models.json", "note": "flagship end-to-end coding model; the reasoning guide states outright that GPT-6 Astra does not support \"none\" reasoning effort; ultra is advertised in the Codex model catalog" },
            { "id": "gpt-6.1-sol", "reasoning_efforts": ["low", "medium", "high", "xhigh", "max", "ultra"], "last_verified": "2026-10-06", "source": "https://raw.githubusercontent.com/openai/codex/main/codex-rs/models-manager/models.json", "note": "GPT-6.1 Sol; the API models page lists reasoning low|medium|high|xhigh|max and the reasoning guide states it does not support none or minimal; ultra is advertised in the Codex model catalog. Default effort is documented inconsistently (the API reasoning guide says medium, the Codex catalog default_reasoning_level is low), so pin an effort rather than relying on the default; requires Codex CLI 0.153.0 or later" },
            { "id": "gpt-6-sol", "reasoning_efforts": ["low", "medium", "high", "xhigh", "max", "ultra"], "last_verified": "2026-09-23", "source": "https://raw.githubusercontent.com/openai/codex/main/codex-rs/models-manager/models.json", "note": "flagship coding and agentic model per the API models page; listed in the Codex picker, default medium; requires Codex CLI 0.155.0 or later" },
            { "id": "gpt-6-luna", "reasoning_efforts": ["low", "medium", "high", "xhigh", "max"], "last_verified": "2026-09-23", "source": "https://raw.githubusercontent.com/openai/codex/main/codex-rs/models-manager/models.json", "note": "efficient high-volume model per the API models page; the Codex docs state it supports efforts up to Max but not Ultra; requires Codex CLI 0.155.0 or later" },
            { "id": "gpt-5.6", "reasoning_efforts": ["none", "low", "medium", "high", "xhigh", "max"], "last_verified": "2026-09-05", "source": "https://developers.openai.com/api/docs/models", "note": "alias routing to gpt-5.6-sol; family drops minimal" },
            { "id": "gpt-5.6-sol", "reasoning_efforts": ["none", "low", "medium", "high", "xhigh", "max", "ultra"], "last_verified": "2026-09-23", "source": "https://raw.githubusercontent.com/openai/codex/main/codex-rs/models-manager/models.json", "note": "ultra is advertised in the Codex model catalog; none comes from the API models page. The Codex catalog does not list none for this model, but Codex sends a configured effort unchanged, so the API decides whether it is accepted" },
            { "id": "gpt-5.6-terra", "reasoning_efforts": ["none", "low", "medium", "high", "xhigh", "max", "ultra"], "last_verified": "2026-09-23", "source": "https://raw.githubusercontent.com/openai/codex/main/codex-rs/models-manager/models.json", "note": "ultra is advertised in the Codex model catalog; none comes from the API models page. The Codex catalog does not list none for this model, but Codex sends a configured effort unchanged, so the API decides whether it is accepted" },
            { "id": "gpt-5.6-luna", "reasoning_efforts": ["none", "low", "medium", "high", "xhigh", "max"], "last_verified": "2026-09-05", "source": "https://developers.openai.com/api/docs/models" },
            { "id": "gpt-5.5", "reasoning_efforts": ["none", "minimal", "low", "medium", "high", "xhigh"], "status": "retiring", "retirement_date": "2026-10-14", "successor": "gpt-6-sol", "last_verified": "2026-10-06", "source": "https://learn.chatgpt.com/docs/models?surface=cli", "note": "retires from ChatGPT, ChatGPT Work and Codex on all plans on 2026-10-14; the page directs ChatGPT sign-in users to replace gpt-5.5 \"in ... custom agents\" with gpt-6-sol (gpt-6-luna on Free/Go). That page states the retirement does not apply to the OpenAI API, so API-key Codex users can still call it — the entry is kept, and kept as the documented successor of gpt-5-2025-08-07, but marked retiring because Codex under ChatGPT sign-in is a surface this namespace governs. The repo policy no longer pins it" },
            { "id": "gpt-5.5-pro", "reasoning_efforts": ["none", "minimal", "low", "medium", "high", "xhigh"], "last_verified": "2026-07-09" },
            { "id": "gpt-5.4", "reasoning_efforts": ["none", "minimal", "low", "medium", "high", "xhigh"], "last_verified": "2026-09-08", "source": "Context7 /openai/codex codex-rs/models-manager/models.json (Codex model map, verified 2026-09-08)", "note": "present but visibility:hide in the Codex model map — legacy, kept because the policy still pins it; not a lifecycle status, and no retirement date is documented" },
            { "id": "gpt-5.4-mini", "reasoning_efforts": ["none", "minimal", "low", "medium", "high", "xhigh"], "last_verified": "2026-09-08", "source": "Context7 /openai/codex codex-rs/models-manager/models.json (Codex model map, verified 2026-09-08)", "note": "present but visibility:hide in the Codex model map — legacy" },
            { "id": "gpt-5.4-nano", "reasoning_efforts": ["none", "minimal", "low", "medium", "high", "xhigh"], "status": "retiring", "retirement_date": "2027-04-01", "successor": "gpt-6-luna", "last_verified": "2026-10-06", "source": "https://developers.openai.com/api/docs/deprecations", "note": "deprecation announced 2026-10-01; shutdown 2027-04-01, replacement gpt-6-luna" },
            { "id": "gpt-5.3-codex", "reasoning_efforts": ["none", "minimal", "low", "medium", "high", "xhigh"], "status": "retiring", "retirement_date": "2027-04-01", "successor": "gpt-6-sol", "last_verified": "2026-10-06", "source": "https://developers.openai.com/api/docs/deprecations", "note": "deprecation announced 2026-10-01; shutdown 2027-04-01, replacement gpt-6-sol" },
            { "id": "gpt-5.1-codex-mini", "reasoning_efforts": ["none", "minimal", "low", "medium", "high", "xhigh"], "last_verified": "2026-07-09" },
            { "id": "gpt-4.1-mini", "reasoning_efforts": [], "last_verified": "2026-07-09", "note": "non-reasoning text model" },
            { "id": "gpt-4.1-nano", "reasoning_efforts": [], "last_verified": "2026-07-09", "note": "non-reasoning text model" },
            { "id": "o1", "reasoning_efforts": ["low", "medium", "high"], "last_verified": "2026-07-09" },
            { "id": "o3", "reasoning_efforts": ["low", "medium", "high"], "last_verified": "2026-07-09" },
            { "id": "o4-mini", "reasoning_efforts": ["low", "medium", "high"], "last_verified": "2026-07-09" },
            { "id": "gpt-5-2025-08-07", "reasoning_efforts": ["minimal", "low", "medium", "high"], "status": "retiring", "retirement_date": "2026-12-11", "successor": "gpt-5.5", "last_verified": "2026-07-10", "source": "https://developers.openai.com/api/docs/deprecations", "note": "legacy dated snapshot; shutdown announced 2026-06-11, replacement gpt-5.5" },
            { "id": "gpt-5-mini-2025-08-07", "reasoning_efforts": ["minimal", "low", "medium", "high"], "status": "retiring", "retirement_date": "2026-12-11", "successor": "gpt-5.4-mini", "last_verified": "2026-07-10", "source": "https://developers.openai.com/api/docs/deprecations", "note": "legacy dated snapshot; shutdown announced 2026-06-11, replacement gpt-5.4-mini" },
            { "id": "gpt-5-nano-2025-08-07", "reasoning_efforts": ["minimal", "low", "medium", "high"], "status": "retiring", "retirement_date": "2026-12-11", "successor": "gpt-5.4-nano", "last_verified": "2026-07-10", "source": "https://developers.openai.com/api/docs/deprecations", "note": "legacy dated snapshot; shutdown announced 2026-06-11, replacement gpt-5.4-nano" }
          ]
        },
        {
          "id": "ollama",
          "description": "Local models served by Ollama, routed via a [model_providers.ollama] table (base_url http://localhost:11434/v1, wire_api responses) in the operator's codex config. Policy values must pin an explicit name:tag — floating :latest via a bare name is rejected by shape.",
          "match": "^[a-z0-9][a-z0-9._-]*:[a-z0-9][a-z0-9._-]*$",
          "membership": "open",
          "model_provider": "ollama",
          "requires_provider_table": true,
          "reasoning_efforts": [],
          "reasoning_note": "Fails closed, and the route is why. Ollama documents reasoning_effort (none|low|medium|high|max) on /v1/chat/completions, but this namespace routes through wire_api responses, and the supported request fields Ollama lists for /v1/responses are model, instructions, tools, stream, temperature, top_p, max_output_tokens, previous_response_id, conversation and truncation — reasoning_effort is absent. Codex would send the field and the route would drop it silently, which is the exact failure this registry exists to catch. That Codex applies model_reasoning_effort globally rather than per provider answers whether it is sent, not whether the route accepts it. Re-open this only on evidence about /v1/responses itself.",
          "sources": [
            "https://docs.ollama.com/api/openai-compatibility",
            "Context7 /openai/codex model-provider-info (Ollama base_url/wire_api)",
            "https://ollama.com/library (tag lists per model page, verified 2026-09-05)",
            "https://docs.ollama.com/api/openai-compatibility (per-endpoint supported request fields, verified 2026-09-05)"
          ],
          "examples": [
            "deepseek-r1:8b",
            "deepseek-r1:14b",
            "deepseek-r1:32b",
            "deepseek-r1:70b",
            "qwen3:8b",
            "qwen3:14b",
            "qwen3:32b",
            "qwen3:235b",
            "glm-5.3:cloud",
            "gpt-oss:20b",
            "gpt-oss:120b",
            "llama3.3:70b"
          ]
        },
        {
          "id": "openrouter",
          "description": "OpenRouter-served models, routed via a [model_providers.openrouter] table (base_url https://openrouter.ai/api/v1, env_key OPENROUTER_API_KEY, wire_api responses) in the operator's codex config. Slug form author/model with optional :free/:extended/:nitro/:thinking variant. The floating ~author/family-latest alias form is deliberately rejected — policy pins exact models.",
          "match": "^[a-z0-9][a-z0-9.-]*/[a-z0-9][a-z0-9._-]*(:(free|extended|nitro|thinking))?$",
          "membership": "open",
          "model_provider": "openrouter",
          "requires_provider_table": true,
          "reasoning_efforts": ["minimal", "low", "medium", "high"],
          "reasoning_note": "Verified on the route this namespace actually uses: OpenRouter's Responses reference documents a reasoning object with an effort key on POST /api/v1/responses, and its table lists exactly minimal|low|medium|high (verified 2026-09-08). That is narrower than OpenRouter's chat-completions surface, which also documents none|xhigh|max — the wider list does not apply here and is deliberately not used. This is where the ollama namespace differs rather than matching: Ollama's /v1/responses supported-field list omits reasoning_effort altogether, so it stays fail-closed. Per-model support is narrower still and cannot be gated in an open namespace, so an unsupported pairing surfaces at OpenRouter rather than at check time.",
          "sources": [
            "https://openrouter.ai/docs/api/api-reference/models/get-a-model-by-its-slug",
            "https://openrouter.ai/docs/guides/best-practices/reasoning-tokens (chat-completions surface — wider vocabulary, not the route used here)",
            "https://openrouter.ai/docs/api_reference/responses/reasoning (Responses route; the vocabulary this namespace enforces, verified 2026-09-08)"
          ],
          "examples": ["openai/gpt-6.1-sol", "anthropic/claude-sonnet-5.5", "google/gemini-3.8-flash", "anthropic/claude-sonnet-4.5", "openai/gpt-4o", "google/gemini-2.5-pro"]
        }
      ]
    },
    "claude-code": {
      "reasoning_key": "effort",
      "reasoning_efforts": ["low", "medium", "high", "xhigh", "max"],
      "reasoning_note": "Subagent frontmatter effort field (low|medium|high|xhigh|max). Per-model narrowing comes from the effort page's supported-models list plus its per-level availability sentences (verified 2026-09-08): a model absent from that list carries an empty reasoning_efforts and fails closed (Claude Haiku 4.5 and Claude Sonnet 4.5); a listed model missing from the xhigh or max sentence carries the narrower list (Opus 4.6 and Sonnet 4.6 drop xhigh; Opus 4.5 drops both). Models on every list inherit the full harness vocabulary. The floating aliases resolve to current-lineup models and inherit accordingly, except haiku.",
      "namespaces": [
        {
          "id": "alias",
          "description": "Version-floating aliases resolved by Claude Code to maintained defaults. Enumerated rather than shape-only so that per-alias effort narrowing is expressible: the alias namespace is matched before the pinned anthropic namespace, so leaving it open would let model \"haiku\" inherit the full harness vocabulary and bypass the empty reasoning_efforts carried by the pinned Claude Haiku 4.5 ids.",
          "match": "^(sonnet|opus|haiku|fable|inherit)$",
          "membership": "closed",
          "sources": ["https://code.claude.com/docs/en/sub-agents", "https://platform.claude.com/docs/en/about-claude/models/overview", "https://code.claude.com/docs/en/model-config (per-provider alias resolution, verified 2026-10-06)"],
          "models": [
            { "id": "sonnet", "last_verified": "2026-10-06", "source": "https://code.claude.com/docs/en/model-config", "note": "floating alias for the maintained Sonnet default; resolves per provider — Sonnet 5.5 on the Anthropic API, Sonnet 4.6 on Claude Platform on AWS, Sonnet 4.5 on Amazon Bedrock, Google Cloud and Microsoft Foundry. Inherits the full vocabulary, which matches the Anthropic API resolution only: on a provider where it resolves to Sonnet 4.5 an effort value is unsupported" },
            { "id": "opus", "last_verified": "2026-09-05", "note": "floating alias for the maintained Opus default" },
            { "id": "haiku", "reasoning_efforts": [], "last_verified": "2026-09-05", "source": "https://platform.claude.com/docs/en/about-claude/models/overview", "note": "resolves to Claude Haiku 4.5, which does not support effort; gated here so the alias matches the pinned ids" },
            { "id": "fable", "last_verified": "2026-09-05", "note": "floating alias for the maintained Fable default" },
            { "id": "inherit", "last_verified": "2026-09-05", "note": "uses the main conversation's model" }
          ]
        },
        {
          "id": "anthropic",
          "description": "Pinned Anthropic model IDs (same values as the --model flag). Naming convention, per https://platform.claude.com/docs/en/about-claude/models/model-ids-and-versions: from the 4.6 generation on, IDs are dateless AND are themselves the pinned snapshot (claude-opus-5, claude-sonnet-4-6) — there is no separate alias to prefer. Before 4.6, the canonical ID carries a snapshot date and the API also exposes a shorter alias pointing at the most recent dated snapshot; register BOTH and prefer the readable alias (claude-sonnet-4-5 over claude-sonnet-4-5-20250929) unless an exact snapshot is required. Do not invent an alias for a dateless ID, and do not drop the dated entry.",
          "match": "^claude-[a-z0-9.-]+$",
          "membership": "closed",
          "sources": ["https://code.claude.com/docs/en/sub-agents", "https://code.claude.com/docs/en/model-config", "https://platform.claude.com/docs/en/about-claude/models/overview", "https://platform.claude.com/docs/en/about-claude/model-deprecations", "https://platform.claude.com/docs/en/build-with-claude/effort"],
          "models": [
            { "id": "claude-fable-5-1", "last_verified": "2026-09-05", "source": "https://platform.claude.com/docs/en/about-claude/models/overview", "note": "current Fable lineup; default effort high" },
            { "id": "claude-opus-5-5", "last_verified": "2026-09-23", "source": "https://platform.claude.com/docs/en/about-claude/models/overview", "note": "current Opus lineup, released 2026-09-22; the dateless ID is its own pinned snapshot; on both the xhigh and max lists; default effort medium, unlike every other effort-capable model" },
            { "id": "claude-opus-5", "last_verified": "2026-09-23", "source": "https://platform.claude.com/docs/en/about-claude/models/overview", "note": "legacy but still available since Opus 5.5 shipped; supports all five effort levels; default effort high" },
            { "id": "claude-opus-4-8", "last_verified": "2026-09-05", "source": "https://platform.claude.com/docs/en/about-claude/model-deprecations" },
            { "id": "claude-opus-4-7", "last_verified": "2026-09-05", "source": "https://platform.claude.com/docs/en/about-claude/model-deprecations" },
            { "id": "claude-opus-4-6", "reasoning_efforts": ["low", "medium", "high", "max"], "last_verified": "2026-09-08", "source": "https://platform.claude.com/docs/en/build-with-claude/effort", "note": "effort page lists max but not xhigh for Opus 4.6" },
            { "id": "claude-opus-4-5", "reasoning_efforts": ["low", "medium", "high"], "last_verified": "2026-09-08", "source": "https://platform.claude.com/docs/en/about-claude/models/model-ids-and-versions", "note": "preferred readable form; pre-4.6 alias pointing at claude-opus-4-5-20251101. Supports effort but is absent from both the xhigh and max availability lists" },
            { "id": "claude-opus-4-5-20251101", "reasoning_efforts": ["low", "medium", "high"], "last_verified": "2026-09-08", "source": "https://platform.claude.com/docs/en/build-with-claude/effort", "note": "dated snapshot the claude-opus-4-5 alias resolves to; pin only when an exact snapshot is required" },
            { "id": "claude-sonnet-5-5", "last_verified": "2026-10-06", "source": "https://platform.claude.com/docs/en/build-with-claude/effort", "note": "current Sonnet lineup; the dateless ID is its own pinned snapshot; on both the xhigh and max lists (\"supports all five effort levels, and high is the default\"); requires Claude Code v2.1.284 or later" },
            { "id": "claude-sonnet-5", "last_verified": "2026-09-05", "source": "https://platform.claude.com/docs/en/about-claude/models/overview" },
            { "id": "claude-sonnet-4-6", "reasoning_efforts": ["low", "medium", "high", "max"], "last_verified": "2026-09-08", "source": "https://platform.claude.com/docs/en/build-with-claude/effort", "note": "effort page lists max but not xhigh for Sonnet 4.6" },
            { "id": "claude-sonnet-4-5", "reasoning_efforts": [], "last_verified": "2026-10-06", "source": "https://platform.claude.com/docs/en/about-claude/models/model-ids-and-versions", "status": "retiring", "retirement_date": "2026-11-30", "successor": "claude-sonnet-5-5", "note": "preferred readable form; pre-4.6 alias pointing at claude-sonnet-4-5-20250929, so it retires with that snapshot (deprecated 2026-09-30, replacement claude-sonnet-5-5). Absent from the effort page supported-models list, so effort is not projectable" },
            { "id": "claude-sonnet-4-5-20250929", "reasoning_efforts": [], "status": "retiring", "retirement_date": "2026-11-30", "successor": "claude-sonnet-5-5", "last_verified": "2026-10-06", "source": "https://platform.claude.com/docs/en/about-claude/model-deprecations", "note": "dated snapshot the claude-sonnet-4-5 alias resolves to; deprecated 2026-09-30, retiring 2026-11-30, replacement claude-sonnet-5-5" },
            { "id": "claude-haiku-4-5", "reasoning_efforts": [], "last_verified": "2026-09-05", "source": "https://platform.claude.com/docs/en/build-with-claude/effort", "note": "absent from the effort page supported-models list" },
            { "id": "claude-haiku-4-5-20251001", "reasoning_efforts": [], "last_verified": "2026-09-05", "source": "https://platform.claude.com/docs/en/about-claude/models/overview", "note": "dated snapshot ID; effort not supported" },
            { "id": "claude-fable-5", "last_verified": "2026-09-05", "source": "https://platform.claude.com/docs/en/about-claude/model-deprecations" }
          ]
        }
      ]
    },
    "cursor": {
      "reasoning_key": null,
      "reasoning_efforts": [],
      "reasoning_note": "Cursor exposes per-model parameters through its SDK model discovery (Cursor.models.list()), not through agent frontmatter; no effort field is projected. Invalid model names raise ConfigurationError in Cursor.",
      "namespaces": [
        {
          "id": "alias",
          "description": "auto (Cursor picks) and inherit (parent agent's model); always valid.",
          "match": "^(auto|inherit)$",
          "membership": "open",
          "sources": ["https://cursor.com/docs/subagents"]
        },
        {
          "id": "named",
          "description": "Named models documented for Cursor subagent frontmatter. Cursor's picker evolves quickly and availability is plan/admin-dependent — verify with Cursor.models.list() and extend via the refresh workflow. A model id may carry Cursor's documented per-model parameter group in square brackets (cursor.com/docs/subagents), e.g. claude-opus-5[effort=high,context=300k]; the documented keys are fast, effort and context. The allowlist below enumerates BASE ids only — the parameter group is a per-rule modifier, so membership is checked against the id with the group stripped. This pattern deliberately shapes the group only (charset, single trailing pair of brackets) rather than encoding key=value structure: a nested-quantifier pattern is rejected by the registry ReDoS guard, and the precise structure — key=value pairs, no duplicates, keys restricted to the documented set — is enforced semantically by scripts/model-policy.mjs, which gives a clearer error than a regex miss would. Evidence for entries verified 2026-10-06: the subagents page says a specific model ID may be used and points to the models reference for available IDs; each per-model page under cursor.com/docs/models states a \"Model ID\" (e.g. claude-sonnet-5-5, hyphenated, not claude-sonnet-5.5) and those are the values registered. The subagents page itself names only composer-2 and gpt-5.6-sol, so confirm with Cursor.models.list() before relying on one.",
          "match": "^[a-z0-9][a-z0-9.-]*(\\[[a-z0-9.=,]+\\])?$",
          "membership": "closed",
          "sources": ["https://cursor.com/docs/subagents", "https://cursor.com/docs/cli/reference/configuration", "https://cursor.com/docs/models (per-model pages give the Model ID, verified 2026-10-06)"],
          "models": [
            { "id": "gpt-5.6-sol", "last_verified": "2026-09-05", "source": "https://cursor.com/docs/subagents" },
            { "id": "claude-sonnet-5-5", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/claude-sonnet-5-5" },
            { "id": "claude-opus-5-5", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/claude-opus-5-5" },
            { "id": "claude-fable-5-1", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/claude-fable-5-1" },
            { "id": "gpt-5.6-terra", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/gpt-5-6-terra" },
            { "id": "gpt-5.6-luna", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/gpt-5-6-luna" },
            { "id": "gemini-3.1-pro", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/gemini-3-1-pro" },
            { "id": "gemini-3.8-flash", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/gemini-3-8-flash" },
            { "id": "grok-4.7", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/grok-4-7" },
            { "id": "grok-4.6", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/grok-4-6" },
            { "id": "muse-spark-1.3", "last_verified": "2026-10-06", "source": "https://cursor.com/docs/models/muse-spark-1-3" },
            { "id": "gpt-5.5", "last_verified": "2026-07-09" },
            { "id": "gpt-5", "last_verified": "2026-07-09" },
            { "id": "claude-opus-5", "last_verified": "2026-09-05", "source": "https://cursor.com/docs/subagents" },
            { "id": "composer-2", "last_verified": "2026-07-09" },
            { "id": "composer-2.5", "last_verified": "2026-09-05", "source": "https://cursor.com/docs/subagents" }
          ]
        }
      ]
    }
  }
}
