From e31d472ff91a7a4e1301c2da3dc63c90b1871260 Mon Sep 17 00:00:00 2001 From: Paul O'Reilly Date: Thu, 10 Sep 2026 12:05:14 +1200 Subject: [PATCH] fix: migrate Claude model files to current API IDs (opus-5, sonnet-5, haiku-4.5) Bug 57d8a047-d26d-47ce-ae6f-bc5cb98fef0e: Opus-tier tasks 404'd because models/claude-opus-4.yaml pinned default_flags.model to "claude-opus-4-5", a retired ID. models/claude-sonnet-4.yaml was pinned to a dated snapshot ("claude-sonnet-4-20250514") with the same problem. Slug strategy: the registry slug (filename / RegistryEntry.name) doubles as the literal --model argument on the workflow-template pass-through path (task-templates/workflow/*.yaml `model:` field -> compiler WF-COMP-18 -> payload.runtime.model -> entrypoint/runners/claude.py `--model`), which has no translation step through this file's default_flags. So rather than patch default_flags.model in place (leaving the slug stale and the pass-through bug latent), rename the slug to match the current API ID: - models/claude-opus-4.yaml, model-registry/claude-opus-4.yaml -> claude-opus-5.yaml (name/endpoint/default_flags.model: claude-opus-5) - models/claude-sonnet-4.yaml, model-registry/claude-sonnet-4.yaml -> claude-sonnet-5.yaml (claude-sonnet-5) - model-registry/claude-haiku-4.yaml -> claude-haiku-4-5.yaml (claude-haiku-4-5); added the previously-missing models/claude-haiku-4-5.yaml so the claude runner can actually resolve this endpoint - model-registry/harness-roles.yaml, model-registry/tiers.yaml, workflows/smart-agent.yaml, task-templates/workflow/{spec,plan}-review-loop@1.yaml: updated every claude-opus-4 / claude-sonnet-4 / claude-haiku-4 reference to the new slugs - models/openrouter-sonnet.yaml: dated snapshot "claude-sonnet-4-20250514" -> "claude-sonnet-5" (third-party router proxying the same retired ID) - refreshed cost_per_1k_tokens on the three renamed registry entries to current published pricing Claude-Session: https://claude.ai/code/session_015nXvGNNNixJPFwZKZHNyha --- .../{claude-haiku-4.yaml => claude-haiku-4-5.yaml} | 4 ++-- .../{claude-opus-4.yaml => claude-opus-5.yaml} | 8 ++++---- .../{claude-sonnet-4.yaml => claude-sonnet-5.yaml} | 8 ++++---- model-registry/harness-roles.yaml | 6 +++--- model-registry/tiers.yaml | 10 +++++----- models/{claude-sonnet-4.yaml => claude-haiku-4-5.yaml} | 4 ++-- models/{claude-opus-4.yaml => claude-opus-5.yaml} | 4 ++-- models/claude-sonnet-5.yaml | 8 ++++++++ models/openrouter-sonnet.yaml | 2 +- task-templates/workflow/plan-review-loop@1.yaml | 4 ++-- task-templates/workflow/spec-review-loop@1.yaml | 4 ++-- workflows/smart-agent.yaml | 2 +- 12 files changed, 36 insertions(+), 28 deletions(-) rename model-registry/{claude-haiku-4.yaml => claude-haiku-4-5.yaml} (82%) rename model-registry/{claude-opus-4.yaml => claude-opus-5.yaml} (73%) rename model-registry/{claude-sonnet-4.yaml => claude-sonnet-5.yaml} (72%) rename models/{claude-sonnet-4.yaml => claude-haiku-4-5.yaml} (66%) rename models/{claude-opus-4.yaml => claude-opus-5.yaml} (70%) create mode 100644 models/claude-sonnet-5.yaml diff --git a/model-registry/claude-haiku-4.yaml b/model-registry/claude-haiku-4-5.yaml similarity index 82% rename from model-registry/claude-haiku-4.yaml rename to model-registry/claude-haiku-4-5.yaml index 962ac81..23e0469 100644 --- a/model-registry/claude-haiku-4.yaml +++ b/model-registry/claude-haiku-4-5.yaml @@ -1,5 +1,5 @@ -name: claude-haiku-4 -endpoint: claude-haiku-4 +name: claude-haiku-4-5 +endpoint: claude-haiku-4-5 provider: anthropic scores: complexity: 5 diff --git a/model-registry/claude-opus-4.yaml b/model-registry/claude-opus-5.yaml similarity index 73% rename from model-registry/claude-opus-4.yaml rename to model-registry/claude-opus-5.yaml index bd55592..32daf7b 100644 --- a/model-registry/claude-opus-4.yaml +++ b/model-registry/claude-opus-5.yaml @@ -1,5 +1,5 @@ -name: claude-opus-4 -endpoint: claude-opus-4 +name: claude-opus-5 +endpoint: claude-opus-5 provider: anthropic scores: complexity: 10 @@ -9,7 +9,7 @@ scores: cost_efficiency: 3 context_utilisation: 10 cost_per_1k_tokens: - input: 0.015 - output: 0.075 + input: 0.005 + output: 0.025 source: benchmark harness_version: null diff --git a/model-registry/claude-sonnet-4.yaml b/model-registry/claude-sonnet-5.yaml similarity index 72% rename from model-registry/claude-sonnet-4.yaml rename to model-registry/claude-sonnet-5.yaml index a1a0cb7..c7928ab 100644 --- a/model-registry/claude-sonnet-4.yaml +++ b/model-registry/claude-sonnet-5.yaml @@ -1,5 +1,5 @@ -name: claude-sonnet-4 -endpoint: claude-sonnet-4 +name: claude-sonnet-5 +endpoint: claude-sonnet-5 provider: anthropic scores: complexity: 8 @@ -9,7 +9,7 @@ scores: cost_efficiency: 6 context_utilisation: 8 cost_per_1k_tokens: - input: 0.003 - output: 0.015 + input: 0.002 + output: 0.01 source: benchmark harness_version: null diff --git a/model-registry/harness-roles.yaml b/model-registry/harness-roles.yaml index dc4a05e..6d9c90c 100644 --- a/model-registry/harness-roles.yaml +++ b/model-registry/harness-roles.yaml @@ -2,8 +2,8 @@ roles: code-tdd: airouter-qwen3: code-airouter-tdd-repo airouter-deepseekv4flash: code-airouter-deepseekv4flash-tdd-repo - claude-sonnet-4: code-sonnet-tdd-repo - claude-opus-4: code-opus-tdd-repo - claude-haiku-4: code-haiku-tdd-repo + claude-sonnet-5: code-sonnet-tdd-repo + claude-opus-5: code-opus-tdd-repo + claude-haiku-4-5: code-haiku-tdd-repo minimax: code-minimax-tdd-repo claude-fable-5: code-fable-tdd-repo diff --git a/model-registry/tiers.yaml b/model-registry/tiers.yaml index d919a01..a20b261 100644 --- a/model-registry/tiers.yaml +++ b/model-registry/tiers.yaml @@ -23,7 +23,7 @@ tiers: qualifies_today: - deepseek-v4flash # benchmark-inflated 9s; hold to allowed_models ceiling - minimax - - claude-opus-4 + - claude-opus-5 note: > WF-SCH-14 allowed_models ceiling remains authoritative until M7 observed-score recalibration corrects benchmark-inflated registry entries. @@ -38,8 +38,8 @@ tiers: test_pass_rate: 9 qualifies_today: - minimax - - claude-sonnet-4 - - claude-opus-4 + - claude-sonnet-5 + - claude-opus-5 coding: description: > @@ -52,6 +52,6 @@ tiers: - airouter-qwen3 - airouter-deepseekv4flash - minimax - - claude-sonnet-4 - - claude-opus-4 + - claude-sonnet-5 + - claude-opus-5 - claude-fable-5 diff --git a/models/claude-sonnet-4.yaml b/models/claude-haiku-4-5.yaml similarity index 66% rename from models/claude-sonnet-4.yaml rename to models/claude-haiku-4-5.yaml index 71c9920..c57677b 100644 --- a/models/claude-sonnet-4.yaml +++ b/models/claude-haiku-4-5.yaml @@ -1,8 +1,8 @@ -name: claude-sonnet-4 +name: claude-haiku-4-5 provider: anthropic endpoint: type: cloud_api api_key_env: ANTHROPIC_API_KEY runner: claude default_flags: - model: "claude-sonnet-4-20250514" \ No newline at end of file + model: "claude-haiku-4-5" diff --git a/models/claude-opus-4.yaml b/models/claude-opus-5.yaml similarity index 70% rename from models/claude-opus-4.yaml rename to models/claude-opus-5.yaml index 2ca1681..ffa6d57 100644 --- a/models/claude-opus-4.yaml +++ b/models/claude-opus-5.yaml @@ -1,8 +1,8 @@ -name: claude-opus-4 +name: claude-opus-5 provider: anthropic endpoint: type: cloud_api api_key_env: ANTHROPIC_API_KEY runner: claude default_flags: - model: "claude-opus-4-5" + model: "claude-opus-5" diff --git a/models/claude-sonnet-5.yaml b/models/claude-sonnet-5.yaml new file mode 100644 index 0000000..64fc9f1 --- /dev/null +++ b/models/claude-sonnet-5.yaml @@ -0,0 +1,8 @@ +name: claude-sonnet-5 +provider: anthropic +endpoint: + type: cloud_api + api_key_env: ANTHROPIC_API_KEY +runner: claude +default_flags: + model: "claude-sonnet-5" diff --git a/models/openrouter-sonnet.yaml b/models/openrouter-sonnet.yaml index 451680e..cc18d95 100644 --- a/models/openrouter-sonnet.yaml +++ b/models/openrouter-sonnet.yaml @@ -6,4 +6,4 @@ endpoint: api_key_env: OPENROUTER_API_KEY runner: agentic default_flags: - model: "anthropic/claude-sonnet-4-20250514" + model: "anthropic/claude-sonnet-5" diff --git a/task-templates/workflow/plan-review-loop@1.yaml b/task-templates/workflow/plan-review-loop@1.yaml index 1f43956..9258c4e 100644 --- a/task-templates/workflow/plan-review-loop@1.yaml +++ b/task-templates/workflow/plan-review-loop@1.yaml @@ -19,7 +19,7 @@ nodes: - id: review-opus kind: agent role: plan-review # M36 v0.6 (bug 69370eda fix) - model: claude-opus-4 + model: claude-opus-5 runtime_env: AGENT_REPO_URL: "git@gitea.oreillyit.nz-ai-enablement:skynet/agent-runtimes-agents.git" AGENT_BRANCH: "task/${item.uuid}" @@ -93,7 +93,7 @@ nodes: - id: judge-haiku kind: agent role: plan-review - model: claude-haiku-4 + model: claude-haiku-4-5 depends_on: [improve-sonnet] runtime_env: AGENT_REPO_URL: "git@gitea.oreillyit.nz-ai-enablement:skynet/agent-runtimes-agents.git" diff --git a/task-templates/workflow/spec-review-loop@1.yaml b/task-templates/workflow/spec-review-loop@1.yaml index 7a4f64f..888f30b 100644 --- a/task-templates/workflow/spec-review-loop@1.yaml +++ b/task-templates/workflow/spec-review-loop@1.yaml @@ -24,7 +24,7 @@ nodes: role: spec-review # M36 v0.6 (bug 69370eda fix): per-node role replaces # the ungrounded top-level `runtime: review-loop-repo`. # Harness resolution: (role, model) → composite. - model: claude-opus-4 + model: claude-opus-5 runtime_env: AGENT_REPO_URL: "git@gitea.oreillyit.nz-ai-enablement:skynet/agent-runtimes-agents.git" AGENT_BRANCH: "spec/${item.uuid}" @@ -104,7 +104,7 @@ nodes: - id: judge-haiku kind: agent role: spec-review - model: claude-haiku-4 + model: claude-haiku-4-5 depends_on: [improve-sonnet] runtime_env: AGENT_REPO_URL: "git@gitea.oreillyit.nz-ai-enablement:skynet/agent-runtimes-agents.git" diff --git a/workflows/smart-agent.yaml b/workflows/smart-agent.yaml index 5c10d20..ab8bfdb 100644 --- a/workflows/smart-agent.yaml +++ b/workflows/smart-agent.yaml @@ -2,7 +2,7 @@ name: smart-agent version: 1 description: > High-capability single-agent workflow. Routes to the best available reasoning model - (complexity ≥ 9 — currently claude-opus-4). Use for complex implementation, planning, + (complexity ≥ 9 — currently claude-opus-5). Use for complex implementation, planning, or analysis tasks where quality matters more than cost. MiniMax is not in the model registry and will not be auto-selected; use the