Compare commits

...
Author SHA1 Message Date
Brent VatneandClaude Opus 5.5 3af45ebf84 feat: default to Claude Opus 5.5 and install Claude Code 2.1.280
The scaffolded default model moves from anthropic/claude-sonnet-5 to
anthropic/claude-opus-5-5, and the security and coordinator pins move from
claude-opus-5 to claude-opus-5-5. Claude Code 2.1.212 rejects Opus 5.5
("version 2.1.280 or newer is required"), so every workflow template installs
2.1.280.

The CLI bump re-checked the deny list: 2.1.280 adds ListAgents, which is now
in ALWAYS_DENIED_TOOLS; every other denied name stays hidden.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-23 11:34:00 -07:00
13 changed files with 28 additions and 25 deletions

No files matched your search

+1 -1
View File
@@ -3,7 +3,7 @@ description: Security and secrets. Injection, credential or secret leakage, unsa
alwaysRun: true
# Security is the highest-stakes agent, so it runs on the Opus tier (included in
# the Max/Team subscription the claude-code engine authenticates with).
model: anthropic/claude-opus-5
model: anthropic/claude-opus-5-5
---
# Security & secrets
+2 -2
View File
@@ -2,13 +2,13 @@
// Default model for every agent. Override per-agent via frontmatter in the
// agent's markdown, or at runtime with the REVIEWER_MODEL env var
// (e.g. REVIEWER_MODEL=anthropic/claude-haiku-4-5).
"model": "anthropic/claude-sonnet-5",
"model": "anthropic/claude-opus-5-5",
// Agents: every markdown file in agents/ is one reviewer (id = filename).
// Add or remove files to change the roster — no list needed here.
// shared.md (prepended to every agent + coordinator) and coordinator.md are
// reserved filenames. Per-agent overrides go in each file's YAML frontmatter,
// e.g. `---\nmodel: anthropic/claude-opus-5\n---`.
// e.g. `---\nmodel: anthropic/claude-opus-5-5\n---`.
"policy": {
// Phase 1: keep signal high by surfacing only critical/warning.
+1 -1
View File
@@ -57,7 +57,7 @@ jobs:
# like `opencode-ai` in package.json — an unpinned CLI would silently drift
# on every CI run; bump it deliberately.
- name: Install Claude Code CLI
run: bun install -g @anthropic-ai/[email protected]12
run: bun install -g @anthropic-ai/[email protected]80
# SECURITY: the TRUSTED BASE checkout above includes .expo-code-review/
# config.jsonc, whose auth.tokenEnv names the env var the CLI forwards as the
+12 -10
View File
@@ -328,7 +328,7 @@ your-monorepo/
// apps/api/.expo-agents/code-review/config.jsonc (the api team owns this)
{
// NO "auth" block — locked centrally; a tokenEnv here is rejected by loader + CI guard.
"model": "anthropic/claude-sonnet-5",
"model": "anthropic/claude-opus-5-5",
"policy": { "includeSuggestions": false },
"noise": { "additionalIgnores": ["apps/api/**/__generated__/**"] }
// shared.md, coordinator.md, agents/*.md live beside this file — the api team's roster.
@@ -475,7 +475,7 @@ cacheable size (~1–4K tokens) show `cache read 0` — expected, not a bug.
---
description: One line the router uses to decide relevance.
alwaysRun: true # run even when the router would skip this agent
model: anthropic/claude-opus-5 # override the default model
model: anthropic/claude-haiku-4-5 # override the default model
temperature: 0.1
---
@@ -491,7 +491,7 @@ per-repo `noise.additionalIgnores`.
```jsonc
{
"model": "anthropic/claude-sonnet-5", // default model for the specialists
"model": "anthropic/claude-opus-5-5", // default model for the specialists
"policy": { "includeSuggestions": false }, // suppress suggestion-severity findings
"chunk": { "maxChangedLines": 1000, "maxFiles": 20 }, // concurrency defaults: 6 (API key) / 3 (subscription)
"noise": { "additionalIgnores": ["packages/*/build/**"] },
@@ -514,15 +514,17 @@ Precedence: **`REVIEWER_MODEL` env** (global override) → per-file **frontmatte
`model:`** → **`config.jsonc` `model`** (the default). So a repo can run a mixed
setup, and a developer can override everything locally.
- **Specialist agents** (correctness/security/consistency) benefit from a
reasoning-tier model — **`anthropic/claude-sonnet-5`** is the quality/speed
sweet spot (the scaffolded default). The **Opus tier** finds more but is slower
and more expensive, so scope it to the highest-stakes agent: **security runs on
`anthropic/claude-opus-5`** (set in `security.md` frontmatter), the rest on the
default.
- **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
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
strong model; the scaffold pins it to `anthropic/claude-opus-5` in
strong model; the scaffold pins it to `anthropic/claude-opus-5-5` in
`coordinator.md` frontmatter.
- **Opus 5.5 needs Claude Code 2.1.280 or newer.** Older CLIs reject it with a 400,
so keep the workflow's `@anthropic-ai/claude-code` pin at 2.1.280 or later.
- If latency/timeouts dominate on big PRs, moving the specialists to a faster model
(e.g. `anthropic/claude-haiku-4-5`) is the most direct lever (a real recall
tradeoff — measure it).
+2 -2
View File
@@ -599,9 +599,9 @@ test("buildClaudeArgs: reviewer tools honor the configured read set (list ignore
"--allowedTools Read(//work/repo/**) Grep(//work/repo/**) Glob(//work/repo/**)",
);
// `list` has no scoped Claude equivalent and is silently ignored (no crash, no rule).
expect(joined).not.toContain("List");
expect(args.some((arg) => arg.startsWith("List("))).toBe(false);
expect(joined).toContain(
"--disallowedTools Bash Edit Write NotebookEdit NotebookRead WebFetch WebSearch Task TodoWrite BashOutput KillShell ExitPlanMode",
"--disallowedTools Bash Edit Write NotebookEdit NotebookRead WebFetch WebSearch Task TodoWrite BashOutput KillShell ExitPlanMode ListAgents",
);
});
+2 -1
View File
@@ -92,7 +92,7 @@ const READ_TOOL_MAP: Record<string, "Read" | "Grep" | "Glob"> = {
glob: "Glob",
};
const ALL_READ_TOOLS = ["Read", "Grep", "Glob"] as const;
// @ref LLP 0003#claude-code-cli-containment [implements] — deny enumeration (not allow-only) because an empty/absent --allowedTools list default-ALLOWS reads; verified against claude 2.1.212, revisit on every CLI version bump
// @ref LLP 0003#claude-code-cli-containment [implements] — deny enumeration (not allow-only) because an empty/absent --allowedTools list default-ALLOWS reads; verified against claude 2.1.212, tool list re-checked against 2.1.280 (ListAgents added), revisit on every CLI version bump
/**
* Tools never available to a review pass, whatever the role. A DENY enumeration is
* the only workable containment: permission rules cannot fail closed here — reads
@@ -117,6 +117,7 @@ const ALWAYS_DENIED_TOOLS = [
"BashOutput",
"KillShell",
"ExitPlanMode",
"ListAgents",
];
/**
+1 -1
View File
@@ -7,7 +7,7 @@ alwaysRun: true
# default model. Scoped to this one agent to limit the extra latency/rate-limit cost;
# subdivide-on-timeout + the per-fetch deadline keep a slow Opus pass from hanging.
# @ref LLP 0009#config-and-prompt-templates [implements]
model: anthropic/claude-opus-5
model: anthropic/claude-opus-5-5
---
# Security & secrets
+1 -1
View File
@@ -84,7 +84,7 @@ jobs:
# The anthropic/… models run through the Claude Code CLI (claude-code
# engine). Pinned exactly — see workflow.yml (expo-code-review.yml).
- name: Install Claude Code CLI
run: npm install -g @anthropic-ai/[email protected]12
run: npm install -g @anthropic-ai/[email protected]80
# SECURITY: the base-ref checkout includes every .expo-code-review/ config,
# whose auth.tokenEnv names the forwarded model credential. `ecr verify-config`
+1 -1
View File
@@ -115,7 +115,7 @@ jobs:
# engine). Pinned exactly — see workflow.yml (expo-code-review.yml).
- name: Install Claude Code CLI
if: steps.cmd.outputs.run == 'true'
run: npm install -g @anthropic-ai/[email protected]12
run: npm install -g @anthropic-ai/[email protected]80
# SECURITY: the base-ref checkout above includes every .expo-code-review/
# config.jsonc + routing.jsonc, whose auth.tokenEnv names the env var the CLI
+2 -2
View File
@@ -5,13 +5,13 @@
// below for the credential. Override per-agent via frontmatter in the agent's
// markdown, or at runtime with the REVIEWER_MODEL env var
// (e.g. REVIEWER_MODEL=anthropic/claude-haiku-4-5).
"model": "anthropic/claude-sonnet-5",
"model": "anthropic/claude-opus-5-5",
// Agents: every markdown file in agents/ is one reviewer (id = filename).
// Add or remove files to change the roster — no list needed here.
// shared.md (prepended to every agent + coordinator) and coordinator.md are
// reserved filenames. Per-agent overrides go in each file's YAML frontmatter,
// e.g. `---\nmodel: anthropic/claude-opus-5\n---`.
// e.g. `---\nmodel: anthropic/claude-opus-5-5\n---`.
// @ref LLP 0009#config-and-prompt-templates [implements] — suggestions off by default, not a schema limit
"policy": {
+1 -1
View File
@@ -5,7 +5,7 @@
# than the small serial-tail latency it adds (no repo tools, one bounded pass).
# Override with a cheaper model if you'd rather trade decision quality for latency.
# @ref LLP 0009#config-and-prompt-templates [implements]
model: anthropic/claude-opus-5
model: anthropic/claude-opus-5-5
---
# Coordinator — consolidation & decision
+1 -1
View File
@@ -4,7 +4,7 @@
{
// Default model for every agent in this scope. Override per-agent via frontmatter,
// or at runtime with REVIEWER_MODEL.
"model": "anthropic/claude-sonnet-5",
"model": "anthropic/claude-opus-5-5",
// Agents: every markdown file in agents/ beside this file is one reviewer for this
// scope (id = filename). shared.md + coordinator.md are this scope's prompts.
+1 -1
View File
@@ -72,7 +72,7 @@ jobs:
# would silently drift on every CI run; bump it deliberately. Remove this
# step if you switch every model to an OpenCode-served provider.
- name: Install Claude Code CLI
run: npm install -g @anthropic-ai/[email protected]12
run: npm install -g @anthropic-ai/[email protected]80
# SECURITY: the TRUSTED BASE checkout above includes every
# .expo-code-review/config.jsonc + routing.jsonc, whose auth.tokenEnv names the