From da37986cd0097aedd2b8119e21e72a1c9a266864 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Tue, 30 Jun 2026 20:20:53 -0400 Subject: [PATCH] fix(#1847): resolve standard tier to claude sonnet 5 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Point the sonnet/standard tier at Claude Sonnet 5 (`claude-sonnet-5`, GA 2026-06-30) across the Anthropic-backed runtimes and provider presets, replacing the superseded `claude-sonnet-4-6`. Mirrors the change into the CONFIGURATION.md and settings-advanced.md runtime-defaults tables (the #3229 catalog↔docs parity gate) plus the pt-BR/zh-CN translations, and updates the tests that pin the old ID. Regenerates the workflow size baseline for the (smaller) settings-advanced.md. Scope is Sonnet only — opus/haiku IDs are untouched. Prepared as a 1.6.1 hotfix off the v1.6.0 tag. Co-Authored-By: Claude Opus 4.8 (cherry picked from commit 33260555b4a88a405aaf992c107d6c2fbedfd435) --- docs/CONFIGURATION.md | 8 ++++---- docs/pt-BR/CONFIGURATION.md | 8 ++++---- docs/zh-CN/CONFIGURATION.md | 8 ++++---- gsd-core/bin/shared/model-catalog.json | 16 +++++++-------- gsd-core/workflows/settings-advanced.md | 20 +++++++++---------- tests/feat-49-model-policy-presets.test.cjs | 4 ++-- ...issue-2517-runtime-aware-profiles.test.cjs | 10 +++++----- tests/model-alias-map.test.cjs | 4 ++-- tests/workflow-size-baseline.json | 2 +- 9 files changed, 40 insertions(+), 40 deletions(-) diff --git a/docs/CONFIGURATION.md b/docs/CONFIGURATION.md index f845f9dcc..ee9b49ab5 100644 --- a/docs/CONFIGURATION.md +++ b/docs/CONFIGURATION.md @@ -1407,13 +1407,13 @@ When `runtime` is set, profile tiers (`opus`/`sonnet`/`haiku`) resolve to runtim | Runtime | `opus` | `sonnet` | `haiku` | reasoning_effort | |---------|--------|----------|---------|------------------| -| `claude` | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5` | (not used) | +| `claude` | `claude-opus-4-8` | `claude-sonnet-5` | `claude-haiku-4-5` | (not used) | | `codex` | `gpt-5.5` | `gpt-5.4` | `gpt-5.4-mini` | `xhigh` / `medium` / `medium` | | `gemini` | `gemini-3.1-pro-preview` | `gemini-3-flash` | `gemini-2.5-flash-lite` | (not used) | | `qwen` | `qwen3-max-2026-01-23` | `qwen3-coder-plus` | `qwen3-coder-next` | (not used) | -| `opencode` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-4-6` | `anthropic/claude-haiku-4-5` | (not used) | -| `copilot` | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5` | (not used) | -| `hermes` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-4-6` | `anthropic/claude-haiku-4-5` | (not used) | +| `opencode` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-5` | `anthropic/claude-haiku-4-5` | (not used) | +| `copilot` | `claude-opus-4-8` | `claude-sonnet-5` | `claude-haiku-4-5` | (not used) | +| `hermes` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-5` | `anthropic/claude-haiku-4-5` | (not used) | | Group B (`kilo`, `cline`, `cursor`, `windsurf` (alias: `devin-desktop`), `augment`, `trae`, `codebuddy`, `antigravity`) | (no built-in default — your runtime handles model selection) | | | | > **How these model IDs are sourced.** The catalog (`bin/shared/model-catalog.json`) pins each runtime's tier defaults to that provider's current frontier IDs, and may intentionally carry forward-dated IDs ahead of a provider's public docs. To verify an ID is live before changing it, check the provider's own source/API — e.g. Gemini: gemini-cli `packages/core/src/config/models.ts` or `gemini --model --prompt ping`; Codex: `codex debug models` or the OpenAI Codex models page; Qwen: Alibaba Model Studio model list. Only change an ID that the provider actually rejects — absence from documentation alone is not proof of invalidity. diff --git a/docs/pt-BR/CONFIGURATION.md b/docs/pt-BR/CONFIGURATION.md index c64c815e2..9510927f6 100644 --- a/docs/pt-BR/CONFIGURATION.md +++ b/docs/pt-BR/CONFIGURATION.md @@ -1139,13 +1139,13 @@ A saída JSON de `resolve-model` inclui `reasoning_effort` quando o nível de ru | Runtime | `opus` | `sonnet` | `haiku` | reasoning_effort | |---------|--------|----------|---------|------------------| -| `claude` | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5` | (não usado) | +| `claude` | `claude-opus-4-8` | `claude-sonnet-5` | `claude-haiku-4-5` | (não usado) | | `codex` | `gpt-5.5` | `gpt-5.3-codex` | `gpt-5.4-mini` | `xhigh` / `medium` / `medium` | | `gemini` | `gemini-3-pro` | `gemini-3-flash` | `gemini-2.5-flash-lite` | (não usado) | | `qwen` | `qwen3-max-2026-01-23` | `qwen3-coder-plus` | `qwen3-coder-next` | (não usado) | -| `opencode` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-4-6` | `anthropic/claude-haiku-4-5` | (não usado) | -| `copilot` | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5` | (não usado) | -| `hermes` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-4-6` | `anthropic/claude-haiku-4-5` | (não usado) | +| `opencode` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-5` | `anthropic/claude-haiku-4-5` | (não usado) | +| `copilot` | `claude-opus-4-8` | `claude-sonnet-5` | `claude-haiku-4-5` | (não usado) | +| `hermes` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-5` | `anthropic/claude-haiku-4-5` | (não usado) | | Grupo B (`kilo`, `cline`, `cursor`, `windsurf`, `augment`, `trae`, `codebuddy`, `antigravity`) | (sem padrão integrado — seu runtime trata da seleção de modelo) | | | | **Exemplo Codex** — uma configuração, modelos em nível, sem bloco grande de `model_overrides`: diff --git a/docs/zh-CN/CONFIGURATION.md b/docs/zh-CN/CONFIGURATION.md index 07aff134a..2b49cf333 100644 --- a/docs/zh-CN/CONFIGURATION.md +++ b/docs/zh-CN/CONFIGURATION.md @@ -1108,13 +1108,13 @@ minimal < low < medium < high < xhigh < max | 运行时 | `opus` | `sonnet` | `haiku` | reasoning_effort | |---------|--------|----------|---------|------------------| -| `claude` | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5` | (不使用) | +| `claude` | `claude-opus-4-8` | `claude-sonnet-5` | `claude-haiku-4-5` | (不使用) | | `codex` | `gpt-5.5` | `gpt-5.3-codex` | `gpt-5.4-mini` | `xhigh` / `medium` / `medium` | | `gemini` | `gemini-3-pro` | `gemini-3-flash` | `gemini-2.5-flash-lite` | (不使用) | | `qwen` | `qwen3-max-2026-01-23` | `qwen3-coder-plus` | `qwen3-coder-next` | (不使用) | -| `opencode` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-4-6` | `anthropic/claude-haiku-4-5` | (不使用) | -| `copilot` | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5` | (不使用) | -| `hermes` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-4-6` | `anthropic/claude-haiku-4-5` | (不使用) | +| `opencode` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-5` | `anthropic/claude-haiku-4-5` | (不使用) | +| `copilot` | `claude-opus-4-8` | `claude-sonnet-5` | `claude-haiku-4-5` | (不使用) | +| `hermes` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-5` | `anthropic/claude-haiku-4-5` | (不使用) | | B 组(`kilo`、`cline`、`cursor`、`windsurf`、`augment`、`trae`、`codebuddy`、`antigravity`) | (无内置默认——您的运行时处理模型选择) | | | | **Codex 示例** — 单个配置,分层模型,无大型 `model_overrides` 块: diff --git a/gsd-core/bin/shared/model-catalog.json b/gsd-core/bin/shared/model-catalog.json index 308f1bcc8..6f2a28011 100644 --- a/gsd-core/bin/shared/model-catalog.json +++ b/gsd-core/bin/shared/model-catalog.json @@ -9,7 +9,7 @@ "runtimeTierDefaults": { "claude": { "opus": { "model": "claude-opus-4-8" }, - "sonnet": { "model": "claude-sonnet-4-6" }, + "sonnet": { "model": "claude-sonnet-5" }, "haiku": { "model": "claude-haiku-4-5" } }, "codex": { @@ -29,17 +29,17 @@ }, "opencode": { "opus": { "model": "anthropic/claude-opus-4-8" }, - "sonnet": { "model": "anthropic/claude-sonnet-4-6" }, + "sonnet": { "model": "anthropic/claude-sonnet-5" }, "haiku": { "model": "anthropic/claude-haiku-4-5" } }, "copilot": { "opus": { "model": "claude-opus-4-8" }, - "sonnet": { "model": "claude-sonnet-4-6" }, + "sonnet": { "model": "claude-sonnet-5" }, "haiku": { "model": "claude-haiku-4-5" } }, "hermes": { "opus": { "model": "anthropic/claude-opus-4-8" }, - "sonnet": { "model": "anthropic/claude-sonnet-4-6" }, + "sonnet": { "model": "anthropic/claude-sonnet-5" }, "haiku": { "model": "anthropic/claude-haiku-4-5" } }, "kilo": { @@ -91,13 +91,13 @@ "providerPresets": { "anthropic": { "opus": { "low": { "model": "claude-opus-4-5" }, "medium": { "model": "claude-opus-4-8" }, "high": { "model": "claude-opus-4-8" } }, - "sonnet": { "low": { "model": "claude-haiku-4-5" }, "medium": { "model": "claude-sonnet-4-6" }, "high": { "model": "claude-opus-4-8" } }, - "haiku": { "low": { "model": "claude-haiku-4-5" }, "medium": { "model": "claude-haiku-4-5" }, "high": { "model": "claude-sonnet-4-6" } } + "sonnet": { "low": { "model": "claude-haiku-4-5" }, "medium": { "model": "claude-sonnet-5" }, "high": { "model": "claude-opus-4-8" } }, + "haiku": { "low": { "model": "claude-haiku-4-5" }, "medium": { "model": "claude-haiku-4-5" }, "high": { "model": "claude-sonnet-5" } } }, "anthropic-fable": { "opus": { "low": { "model": "claude-opus-4-5" }, "medium": { "model": "claude-opus-4-8" }, "high": { "model": "claude-fable-5" } }, - "sonnet": { "low": { "model": "claude-haiku-4-5" }, "medium": { "model": "claude-sonnet-4-6" }, "high": { "model": "claude-fable-5" } }, - "haiku": { "low": { "model": "claude-haiku-4-5" }, "medium": { "model": "claude-haiku-4-5" }, "high": { "model": "claude-sonnet-4-6" } } + "sonnet": { "low": { "model": "claude-haiku-4-5" }, "medium": { "model": "claude-sonnet-5" }, "high": { "model": "claude-fable-5" } }, + "haiku": { "low": { "model": "claude-haiku-4-5" }, "medium": { "model": "claude-haiku-4-5" }, "high": { "model": "claude-sonnet-5" } } }, "openai": { "opus": { "low": { "model": "gpt-5.4", "reasoning_effort": "medium" }, "medium": { "model": "gpt-5.5", "reasoning_effort": "high" }, "high": { "model": "gpt-5.5", "reasoning_effort": "xhigh" } }, diff --git a/gsd-core/workflows/settings-advanced.md b/gsd-core/workflows/settings-advanced.md index 76f452a7b..3aad8c1d5 100644 --- a/gsd-core/workflows/settings-advanced.md +++ b/gsd-core/workflows/settings-advanced.md @@ -353,13 +353,13 @@ Built-in tier defaults by runtime: | Runtime | `opus` | `sonnet` | `haiku` | |------------|-------------------------------|---------------------------------|-------------------------------| -| `claude` | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5` | +| `claude` | `claude-opus-4-8` | `claude-sonnet-5` | `claude-haiku-4-5` | | `codex` | `gpt-5.5` | `gpt-5.4` | `gpt-5.4-mini` | | `gemini` | `gemini-3.1-pro-preview` | `gemini-3-flash` | `gemini-2.5-flash-lite` | | `qwen` | `qwen3-max-2026-01-23` | `qwen3-coder-plus` | `qwen3-coder-next` | -| `opencode` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-4-6` | `anthropic/claude-haiku-4-5` | -| `copilot` | `claude-opus-4-8` | `claude-sonnet-4-6` | `claude-haiku-4-5` | -| `hermes` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-4-6` | `anthropic/claude-haiku-4-5` | +| `opencode` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-5` | `anthropic/claude-haiku-4-5` | +| `copilot` | `claude-opus-4-8` | `claude-sonnet-5` | `claude-haiku-4-5` | +| `hermes` | `anthropic/claude-opus-4-8` | `anthropic/claude-sonnet-5` | `anthropic/claude-haiku-4-5` | | Group B (`kilo`, `cline`, `cursor`, `windsurf`, `augment`, `trae`, `codebuddy`, `antigravity`) | (no built-in default — your runtime handles model selection) | | | Display a table to the user showing the effective configuration: @@ -623,8 +623,8 @@ AskUserQuestion([ header: "Provider", multiSelect: false, options: [ - { label: "anthropic", description: "claude-opus-4-8 / claude-sonnet-4-6 / claude-haiku-4-5 (Anthropic / Claude)" }, - { label: "anthropic-fable", description: "claude-fable-5 / claude-sonnet-4-6 / claude-haiku-4-5 (Anthropic / Claude Fable opt-in)" }, + { label: "anthropic", description: "claude-opus-4-8 / claude-sonnet-5 / claude-haiku-4-5 (Anthropic / Claude)" }, + { label: "anthropic-fable", description: "claude-fable-5 / claude-sonnet-5 / claude-haiku-4-5 (Anthropic / Claude Fable opt-in)" }, { label: "openai", description: "gpt-5.5 / gpt-5.4 / gpt-5.4-mini (OpenAI / Codex)" }, { label: "Other known provider", description: "Type google or qwen; both still use the canonical tier mapping." } ] @@ -654,11 +654,11 @@ Canonical tier mappings by provider and budget: | Provider | Budget | high | medium | low | |-----------|--------|----------------------------|----------------------------|----------------------------| -| anthropic | high | claude-opus-4-8 | claude-opus-4-8 | claude-sonnet-4-6 | -| anthropic | medium | claude-opus-4-8 | claude-sonnet-4-6 | claude-haiku-4-5 | +| anthropic | high | claude-opus-4-8 | claude-opus-4-8 | claude-sonnet-5 | +| anthropic | medium | claude-opus-4-8 | claude-sonnet-5 | claude-haiku-4-5 | | anthropic | low | claude-haiku-4-5 | claude-haiku-4-5 | claude-haiku-4-5 | -| anthropic-fable | high | claude-fable-5 | claude-fable-5 | claude-sonnet-4-6 | -| anthropic-fable | medium | claude-opus-4-8 | claude-sonnet-4-6 | claude-haiku-4-5 | +| anthropic-fable | high | claude-fable-5 | claude-fable-5 | claude-sonnet-5 | +| anthropic-fable | medium | claude-opus-4-8 | claude-sonnet-5 | claude-haiku-4-5 | | anthropic-fable | low | claude-haiku-4-5 | claude-haiku-4-5 | claude-haiku-4-5 | | openai | high | gpt-5.5 | gpt-5.5 | gpt-5.5 | | openai | medium | gpt-5.5 | gpt-5.4 | gpt-5.4-mini | diff --git a/tests/feat-49-model-policy-presets.test.cjs b/tests/feat-49-model-policy-presets.test.cjs index d660a61ab..b7e3920ac 100644 --- a/tests/feat-49-model-policy-presets.test.cjs +++ b/tests/feat-49-model-policy-presets.test.cjs @@ -142,8 +142,8 @@ describe('#49 resolveModelPolicy Sub-path B: provider presets', () => { test('known provider "anthropic-fable" + tier "haiku" + budget "high" keeps low tier on Sonnet', () => { const policy = { provider: 'anthropic-fable', budget: 'high' }; const result = resolveModelPolicy(policy, 'haiku'); - assert.strictEqual(result, 'claude-sonnet-4-6', - `expected anthropic-fable haiku/high to resolve to claude-sonnet-4-6, got: ${result}`); + assert.strictEqual(result, 'claude-sonnet-5', + `expected anthropic-fable haiku/high to resolve to claude-sonnet-5, got: ${result}`); }); test('known provider "openai" + tier "sonnet" + budget "low" returns model with reasoning_effort from preset', () => { diff --git a/tests/issue-2517-runtime-aware-profiles.test.cjs b/tests/issue-2517-runtime-aware-profiles.test.cjs index dbca0dcc4..783324fec 100644 --- a/tests/issue-2517-runtime-aware-profiles.test.cjs +++ b/tests/issue-2517-runtime-aware-profiles.test.cjs @@ -709,9 +709,9 @@ describe('issue #2612: runtime "opencode" — OpenCode tier resolution', () => { assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'anthropic/claude-opus-4-8'); }); - test('sonnet tier -> anthropic/claude-sonnet-4-6', () => { + test('sonnet tier -> anthropic/claude-sonnet-5', () => { writeConfig(tmpDir, { runtime: 'opencode', model_profile: 'balanced' }); - assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-roadmapper'), 'anthropic/claude-sonnet-4-6'); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-roadmapper'), 'anthropic/claude-sonnet-5'); }); test('haiku tier -> anthropic/claude-haiku-4-5', () => { @@ -737,9 +737,9 @@ describe('issue #2612: runtime "copilot" — Copilot tier resolution', () => { assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'claude-opus-4-8'); }); - test('sonnet tier -> claude-sonnet-4-6', () => { + test('sonnet tier -> claude-sonnet-5', () => { writeConfig(tmpDir, { runtime: 'copilot', model_profile: 'balanced' }); - assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-roadmapper'), 'claude-sonnet-4-6'); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-roadmapper'), 'claude-sonnet-5'); }); test('haiku tier -> claude-haiku-4-5', () => { @@ -866,6 +866,6 @@ describe('issue #2612: partial override merge for new Group A runtimes', () => { // gsd-codebase-mapper budget -> haiku -> overridden assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-codebase-mapper'), 'claude-haiku-4-6'); // gsd-planner budget -> sonnet -> built-in default - assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'claude-sonnet-4-6'); + assert.strictEqual(resolveModelInternal(tmpDir, 'gsd-planner'), 'claude-sonnet-5'); }); }); diff --git a/tests/model-alias-map.test.cjs b/tests/model-alias-map.test.cjs index d12f07afa..c4ae2f951 100644 --- a/tests/model-alias-map.test.cjs +++ b/tests/model-alias-map.test.cjs @@ -17,8 +17,8 @@ describe('MODEL_ALIAS_MAP (#1690 regression)', () => { assert.equal(MODEL_ALIAS_MAP.opus, 'claude-opus-4-8'); }); - test('sonnet maps to claude-sonnet-4-6', () => { - assert.equal(MODEL_ALIAS_MAP.sonnet, 'claude-sonnet-4-6'); + test('sonnet maps to claude-sonnet-5', () => { + assert.equal(MODEL_ALIAS_MAP.sonnet, 'claude-sonnet-5'); }); test('haiku maps to claude-haiku-4-5', () => { diff --git a/tests/workflow-size-baseline.json b/tests/workflow-size-baseline.json index 2abd944f9..dd28be26d 100644 --- a/tests/workflow-size-baseline.json +++ b/tests/workflow-size-baseline.json @@ -67,7 +67,7 @@ "scan.md": 7688, "secure-phase.md": 13476, "session-report.md": 4044, - "settings-advanced.md": 39666, + "settings-advanced.md": 39646, "settings-integrations.md": 15848, "settings.md": 33413, "ship.md": 24647,