From 37474572498b838e5cd2136a4bddafe5c1a94a7f Mon Sep 17 00:00:00 2001 From: Philippe Loulidi <78689302+LipLoody@users.noreply.github.com> Date: Thu, 24 Sep 2026 15:32:34 -0600 Subject: [PATCH 1/2] chore: use Claude Opus 5.5 for the coordinator --- .expo-agents/code-review/coordinator.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.expo-agents/code-review/coordinator.md b/.expo-agents/code-review/coordinator.md index 1e42499..8f86a66 100644 --- a/.expo-agents/code-review/coordinator.md +++ b/.expo-agents/code-review/coordinator.md @@ -1,7 +1,6 @@ --- -# The coordinator only consolidates text (no repo tools), so a fast, cheap model -# fits and keeps this serial step from adding latency. Override as you like. -model: anthropic/claude-haiku-4-5 +# Keep the final decision on the same model as the specialist passes. +model: anthropic/claude-opus-5-5 --- # Coordinator — consolidation & decision From 81a0982ee2367547dde7f611b36b10dfba662bc4 Mon Sep 17 00:00:00 2001 From: Philippe Loulidi <78689302+LipLoody@users.noreply.github.com> Date: Wed, 30 Sep 2026 12:38:05 -0600 Subject: [PATCH 2/2] chore: name Claude Sonnet 5.5 as the cheaper step down --- .claude/skills/setup-code-review/ecr-reference.md | 2 +- README.md | 2 +- src/config/load.ts | 2 +- src/core/opencode.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.claude/skills/setup-code-review/ecr-reference.md b/.claude/skills/setup-code-review/ecr-reference.md index 2e42bb6..1245feb 100644 --- a/.claude/skills/setup-code-review/ecr-reference.md +++ b/.claude/skills/setup-code-review/ecr-reference.md @@ -149,7 +149,7 @@ Anthropic subscription/bearer envs (locked to provider `anthropic`): `CLAUDE_COD | **OpenCode + OpenAI API key** (default) | `{mode:"api-key", provider:"openai"}` (or omit auth) | `OPENAI_API_KEY` | `openai/gpt-5.5`, `openai/gpt-5.5-pro`, … | | **Codex/ChatGPT OAuth** (subscription) | `{providers:{openai:{mode:"oauth", tokenEnv:"CODEX_OAUTH_ACCESS_TOKEN"}}}` | `CODEX_OAUTH_ACCESS_TOKEN` | `openai/…` | | **Mixed** (subscription + metered pro key) | `{providers:{ openai:{mode:"oauth",tokenEnv:"CODEX_OAUTH_ACCESS_TOKEN"}, "openai-api":{mode:"api-key",tokenEnv:"OPENAI_API_KEY",upstream:"openai"} }}` | both `CODEX_OAUTH_ACCESS_TOKEN` + `OPENAI_API_KEY` | subscription for `openai/…`; alias `openai-api/gpt-5.5-pro` for pro tier | -| **Claude Code CLI on Max/Team** | `{providers:{anthropic:{tokenEnv:"CLAUDE_CODE_OAUTH_TOKEN"}}}` (auth optional) | `CLAUDE_CODE_OAUTH_TOKEN` | `anthropic/claude-sonnet-5`, … | +| **Claude Code CLI on Max/Team** | `{providers:{anthropic:{tokenEnv:"CLAUDE_CODE_OAUTH_TOKEN"}}}` (auth optional) | `CLAUDE_CODE_OAUTH_TOKEN` | `anthropic/claude-sonnet-5-5`, … | | **Other OpenCode provider** | omit auth | run `opencode auth login` + `REVIEWER_MODEL=/` | e.g. `google/gemini-3-pro` | OAuth `openai` tokenEnv: an opaque value = refresh token (codex plugin mints access); diff --git a/README.md b/README.md index ca9f57c..4cdb4ae 100644 --- a/README.md +++ b/README.md @@ -517,7 +517,7 @@ setup, and a developer can override everything locally. - **Specialist agents** (correctness/security/consistency) run on **`anthropic/claude-opus-5-5`**, the scaffolded default. It finds more than the Sonnet tier but is slower and costs about twice as much per token, so - `anthropic/claude-sonnet-5` is the step down when a repo needs faster or cheaper + `anthropic/claude-sonnet-5-5` is the step down when a repo needs faster or cheaper reviews. **Security stays pinned to `anthropic/claude-opus-5-5`** in `security.md` frontmatter, so a lower default does not move the highest-stakes agent. - **The coordinator** makes the final call (dedupe / re-judge / decide) — worth a diff --git a/src/config/load.ts b/src/config/load.ts index 0942864..74b8c47 100644 --- a/src/config/load.ts +++ b/src/config/load.ts @@ -176,7 +176,7 @@ async function loadConfigDir( // doesn't exist — which both scaffolded workflows do — so `??` (which only falls // through on null/undefined) silently replaced every configured model with "". Every // agent and the coordinator then ran on whatever OpenCode picked by default, so a - // config saying `anthropic/claude-sonnet-5` reviewed with something else entirely and + // config saying `anthropic/claude-sonnet-5-5` reviewed with something else entirely and // nothing anywhere said so. Trim too: a stray newline is the same class of accident. // @ref LLP 0006#model-resolution [constrained-by] — never ??; GitHub Actions passes an unset var as empty string, not undefined const override = process.env.REVIEWER_MODEL?.trim() || undefined; diff --git a/src/core/opencode.ts b/src/core/opencode.ts index 5ace65b..04b39aa 100644 --- a/src/core/opencode.ts +++ b/src/core/opencode.ts @@ -606,7 +606,7 @@ export function formatUnknownModels( return ( `The configured model id(s) do not exist on the running OpenCode server:\n${lines.join("\n")}\n` + `Fix the model in .expo-code-review/config.jsonc (agents' \`model\`, \`coordinator.model\`) ` + - `or REVIEWER_MODEL. Note that a model id must be "provider/model" (e.g. anthropic/claude-sonnet-5), ` + + `or REVIEWER_MODEL. Note that a model id must be "provider/model" (e.g. anthropic/claude-sonnet-5-5), ` + `and that an out-of-date \`opencode\` can reject an id a newer one accepts — run \`ecr doctor\`.` ); }