Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/setup-code-review/ecr-reference.md
Original file line number Diff line number Diff line change
Expand Up @@ -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=<provider>/<model>` | e.g. `google/gemini-3-pro` |

OAuth `openai` tokenEnv: an opaque value = refresh token (codex plugin mints access);
Expand Down
5 changes: 2 additions & 3 deletions .expo-agents/code-review/coordinator.md
Original file line number Diff line number Diff line change
@@ -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
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/config/load.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion src/core/opencode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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\`.`
);
}
Expand Down
Loading