claude-overnight 1.25.41 → 1.25.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,7 +4,7 @@ Parallel Claude agents in isolated git worktrees. Set a usage cap so your intera
4
4
 
5
5
  Hand it an objective and a session budget, walk away, review the diff when the run ends. Every agent runs in its own worktree on its own branch — a misbehaving agent can't trash your working tree. Unmerged branches are preserved for manual review, never discarded.
6
6
 
7
- Built on the [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) — every session runs on the SDK's agent harness. Three roles, each picked independently: **planner** (thinks, steers, reviews), **worker** (runs the tasks), and an optional **fast** model (quick well-scoped edits, verified by the worker next wave). Pair any planner (Opus, Sonnet) with any worker — Anthropic, Cursor, Qwen, OpenRouter, or any Anthropic-compatible endpoint.
7
+ Built on the [Claude Agent SDK](https://www.npmjs.com/package/@anthropic-ai/claude-agent-sdk) — every session runs on the SDK's agent harness. Three roles, each picked independently: **planner** (thinks, steers, reviews), **main worker** (runs the tasks), and an optional **fast worker** (a cheaper/faster second worker for well-scoped tasks, verified by the next wave's workers). Pair any planner (Opus, Sonnet) with any worker — Anthropic, Cursor, Qwen, OpenRouter, or any Anthropic-compatible endpoint.
8
8
 
9
9
  ## Run on Qwen 3.6 Plus
10
10
 
@@ -333,7 +333,7 @@ claude-overnight "fix auth bug in src/auth.ts" "add tests for user model"
333
333
 
334
334
  ## Custom providers (Qwen, OpenRouter, any Anthropic-compatible endpoint)
335
335
 
336
- Planner, worker, and optional fast model are each picked separately -- pair Opus-on-Anthropic for the planner/thinker with a cheaper model on another provider for the bulk of work.
336
+ Planner, main worker, and optional fast worker are each picked separately -- pair Opus-on-Anthropic for the planner/thinker with a cheaper model on another provider for the bulk of work. The fast worker is a real worker (same tools, same env), just on a cheaper/faster model — steering routes well-scoped tasks to it by default.
337
337
 
338
338
  From the interactive picker, choose `Other…` on the planner, worker, or fast step:
339
339
 
@@ -353,7 +353,7 @@ From the interactive picker, choose `Other…` on the planner, worker, or fast s
353
353
 
354
354
  Saved providers live user-level at `~/.claude/claude-overnight/providers.json` (mode 0600) and show up automatically in every repo. No per-project config.
355
355
 
356
- **How routing works.** Each `query()` gets its own env override (`ANTHROPIC_BASE_URL` + `ANTHROPIC_AUTH_TOKEN`) -- planner queries use the planner provider, worker queries use the worker provider, fast queries use the fast provider. No global shell env, no proxy daemon, no `process.env` pollution between calls.
356
+ **How routing works.** Each `query()` gets its own env override (`ANTHROPIC_BASE_URL` + `ANTHROPIC_AUTH_TOKEN`) -- planner queries use the planner provider, main-worker queries use the worker provider, fast-worker queries use the fast provider. No global shell env, no proxy daemon, no `process.env` pollution between calls.
357
357
 
358
358
  **Pre-flight.** Before the swarm starts, each custom provider is pinged with a 1-turn auth check. Bad keys fail fast with `✗ worker preflight failed: ...` instead of N scattered mid-run errors.
359
359
 
@@ -1 +1 @@
1
- export declare const VERSION = "1.25.41";
1
+ export declare const VERSION = "1.25.42";
package/dist/_version.js CHANGED
@@ -1,2 +1,2 @@
1
1
  // Auto-generated by build — do not edit manually.
2
- export const VERSION = "1.25.41";
2
+ export const VERSION = "1.25.42";
package/dist/index.js CHANGED
@@ -156,7 +156,7 @@ async function main() {
156
156
  --budget=N Target number of agent runs ${chalk.dim("(default: 10)")}
157
157
  --concurrency=N Max parallel agents ${chalk.dim("(default: 5)")}
158
158
  --model=NAME Worker model override ${chalk.dim("(interactive mode picks planner + worker separately -- supports 'Other…' for Qwen / OpenRouter / etc.)")}
159
- --fast-model=NAME Fast model for quick tasks ${chalk.dim("(optional -- checked by worker model in next wave)")}
159
+ --fast-model=NAME Fast worker model for quick tasks ${chalk.dim("(optional -- checked by next wave's workers)")}
160
160
  --usage-cap=N Stop at N% utilization ${chalk.dim("(e.g. 90 to save 10% for other work)")}
161
161
  --allow-extra-usage Allow extra/overage usage ${chalk.dim("(default: stop when plan limits hit)")}
162
162
  --extra-usage-budget=N Max $ for extra usage ${chalk.dim("(implies --allow-extra-usage)")}
@@ -888,7 +888,7 @@ async function main() {
888
888
  console.error(chalk.red(` Fix the provider at ~/.claude/claude-overnight/providers.json and retry.`));
889
889
  }
890
890
  if (degradable) {
891
- console.error(chalk.yellow(` Continuing without fast — fast-eligible tasks will run on the worker model instead.`));
891
+ console.error(chalk.yellow(` Continuing without the fast worker — fast-eligible tasks will run on the main worker model instead.`));
892
892
  console.error("");
893
893
  fastDegraded = true;
894
894
  continue;
package/dist/run.js CHANGED
@@ -979,34 +979,11 @@ export async function executeRun(cfg) {
979
979
  }
980
980
  function reviewPrompt(scope, objective) {
981
981
  const scopeLine = scope === "wave"
982
- ? "You are reviewing all changes made in the most recent wave of agent work."
982
+ ? "Review and simplify all changes from the most recent wave."
983
983
  : `You are the final quality gate before this autonomous run completes.\n\nThe objective was: ${objective || "improve the codebase"}`;
984
- const diffCmd = scope === "wave"
985
- ? "Run `git diff` to see what changed."
986
- : "Run `git diff main` (or `git diff HEAD` if on the same branch) to see ALL changes made during this run.";
987
- const checks = scope === "wave"
988
- ? `1. **Missed reuse**: Did any agent write something that already exists elsewhere? Find existing utilities and suggest replacements.
989
- 2. **Quality issues**: Redundant state, copy-paste variations, leaky abstractions, stringly-typed code where enums exist, unnecessary JSX nesting, comments that narrate what the code does.
990
- 3. **Efficiency problems**: Redundant computations, sequential operations that could be parallel, hot-path bloat, recurring no-op updates, TOCTOU patterns, memory leaks.
991
- 4. **Merge conflicts or inconsistencies**: Changes that work against each other or break existing patterns.`
992
- : `1. **Architecture coherence**: Do the changes form a coherent whole, or are they a patchwork of independent edits that don't fit together?
993
- 2. **Missed reuse**: Any new code that duplicates existing functionality?
994
- 3. **Quality**: Redundant state, copy-paste variations, leaky abstractions, stringly-typed code, unnecessary nesting, narrative comments.
995
- 4. **Efficiency**: N+1 patterns, redundant computations, hot-path bloat, missing cleanup, unbounded data structures.
996
- 5. **Consistency**: Do all changes follow the project's existing patterns, conventions, and design system?
997
- 6. **Build and test**: Run the build and any existing tests. Fix any breakage.`;
998
- const close = scope === "wave"
999
- ? "Fix issues directly. Delete and simplify rather than add. If the code is already clean, skip."
1000
- : "Fix issues directly. Delete and simplify. If the codebase is clean and the build passes, say so.";
1001
984
  return `${scopeLine}
1002
985
 
1003
- ${diffCmd} Review for:
1004
-
1005
- ${checks}
1006
-
1007
- ${close}
1008
-
1009
- No need to explain your changes -- just fix them.`;
986
+ Invoke the \`simplify\` skill to review changed code for reuse, quality, and efficiency, then fix any issues found.`;
1010
987
  }
1011
988
  async function runReview(opts, scope, objective, onSwarm) {
1012
989
  const swarm = new Swarm({
package/dist/settings.js CHANGED
@@ -25,12 +25,12 @@ export async function editRunSettings(options) {
25
25
  s.workerModel = workerPick.model;
26
26
  s.workerProviderId = workerPick.providerId;
27
27
  const suggestFast = !!(options.defaults?.fastModel);
28
- const fastChoice = await select(`${chalk.cyan("③")} Fast model ${chalk.dim("(optional -- Haiku/Qwen for quick tasks, checked by worker)")}:`, [
29
- { name: "Skip", value: "skip", hint: "two-tier mode only (current setup)" },
30
- { name: "Pick a fast model", value: "pick", hint: "Haiku, Qwen, or any provider -- for well-scoped tasks" },
28
+ const fastChoice = await select(`${chalk.cyan("③")} Fast worker model ${chalk.dim("(optional -- Haiku/Qwen for well-scoped tasks, checked by next wave's workers)")}:`, [
29
+ { name: "Skip", value: "skip", hint: "single-worker mode (main worker handles everything)" },
30
+ { name: "Pick a fast worker", value: "pick", hint: "Haiku, Qwen, or any provider -- a cheaper, faster second worker" },
31
31
  ], suggestFast ? 1 : 0);
32
32
  if (fastChoice === "pick") {
33
- const fastPick = await pickModel(`${chalk.cyan("③b")} Fast model:`, models, options.defaults?.fastModel ?? s.fastModel);
33
+ const fastPick = await pickModel(`${chalk.cyan("③b")} Fast worker model:`, models, options.defaults?.fastModel ?? s.fastModel);
34
34
  s.fastModel = fastPick.model;
35
35
  s.fastProviderId = fastPick.providerId;
36
36
  }
package/dist/steering.js CHANGED
@@ -89,8 +89,8 @@ You have full creative freedom. Design the wave that will have the highest impac
89
89
  **Polish** -- Agents focus purely on feel: loading states, error messages, micro-interactions, empty states, responsiveness. Not features -- the texture that makes users trust the product.
90
90
  Example: 2 agents, one on happy paths, one on error/edge states
91
91
 
92
- **Simplify** -- A fast model agent reviews recent changes and cleans them up. Set "model": "fast".
93
- Example: 1 fast agent reviews files changed in the last wave, runs git diff, removes bloat
92
+ **Simplify** -- Invoke the 'simplify' skill. It reviews changed code and spawns parallel sub-agents for thorough review.
93
+ Example: 1 agent per wave with task type "review", let the skill handle the rest
94
94
 
95
95
  You can combine these. A wave can have 3 execute agents + 1 verification agent. Or 2 divergent explorers. Whatever the situation calls for.
96
96
 
@@ -107,23 +107,29 @@ Respond with ONLY a JSON object (no markdown fences):
107
107
  "estimatedSessionsRemaining": 15,
108
108
  "tasks": [
109
109
  {"prompt": "task instruction...", "model": "worker", "postcondition": "test -f src/new-file.ts"},
110
- {"prompt": "quick icon fix, verified by worker next wave...", "model": "fast"},
110
+ {"prompt": "quick icon fix, verified by next wave's workers...", "model": "fast"},
111
111
  {"prompt": "verify the app end-to-end...", "model": "worker", "noWorktree": true}
112
112
  ]
113
113
  }
114
114
 
115
115
  "estimatedSessionsRemaining" is REQUIRED. Your best honest estimate of how many MORE agent sessions (beyond the wave you just composed above) are needed to reach 'amazing' -- include follow-up fixes, polish, verification, and anything else you'd want before shipping. Be realistic, not optimistic. Use 0 only if truly done.
116
116
 
117
- The "model" field on each task — pick based on the task's scope and risk:
117
+ The "model" field on each task — you have **two kinds of workers**, both first-class. Pick the right one per task:
118
118
 
119
- **Use "fast" (${fastModel ?? "not set"})** for well-scoped, mechanical tasks where speed matters more than deep reasoning. The next wave's worker pass will catch and fix any issues:
119
+ **Fast worker — "fast" (${fastModel ?? "not set"})** is the default workhorse for well-scoped, mechanical tasks. It's a real worker, same tools, same environment — just a cheaper, faster model. The next wave's workers (fast or main) will catch and fix any issues. Route here by default when any of these apply:
120
120
  - Single-file edits, refactors, renames
121
+ - Surgical multi-line changes with a clear spec (add a param, wrap a call, tweak a prompt line)
121
122
  - Read/research: scan files, summarize findings
122
123
  - Build checks, postcondition verification
123
124
  - E2E test runs with concrete steps
124
125
  - Simple critiques, polish tweaks
126
+ - Running existing scripts/tests and capturing output
127
+ - Docs / markdown updates
128
+ - Stdlib-only utility scripts with a crisp spec
125
129
 
126
- **Use "worker" (${workerModel})** for multi-file features, complex logic, architectural changes, and any task where model quality matters.
130
+ **Main worker — "worker" (${workerModel})** is for tasks that genuinely need deeper reasoning: multi-file features, complex logic, architectural changes, ambiguous specs, anything where a mis-step costs more than a wave to recover from.
131
+
132
+ When in doubt, pick "fast". Both are workers; the wave loop iterates. Over-using "worker" is a real cost — aim to route the clear majority of well-scoped tasks to the fast worker whenever a fast worker is configured.
127
133
 
128
134
  Set "noWorktree": true for verify/user-test tasks -- they need the real project directory with env files, dependencies, and local config.
129
135
 
package/dist/swarm.js CHANGED
@@ -29,29 +29,9 @@ function withCursorWorkspaceHeader(env, cwd) {
29
29
  }
30
30
  import { getModelCapability } from "./models.js";
31
31
  import { createTurn, beginTurn, endTurn, updateTurn } from "./turns.js";
32
- const SIMPLIFY_PROMPT = `You just finished your task. Now review and simplify your changes.
32
+ const SIMPLIFY_PROMPT = `You just finished your task. Review and simplify your changes.
33
33
 
34
- Run \`git diff\` to see what you changed, then fix any issues:
35
-
36
- 1. **Reuse**: Search the codebase -- did you write something that already exists? Use existing utilities, helpers, patterns instead. Hand-rolled string manipulation, manual path handling, custom env checks, ad-hoc type guards -- all candidates for existing utilities.
37
-
38
- 2. **Quality**:
39
- - Redundant state: cached values that could be derived, observers that could be direct calls
40
- - Copy-paste with slight variation: near-duplicate blocks that should be unified
41
- - Leaky abstractions: exposing internals or breaking existing abstraction boundaries
42
- - Stringly-typed code: raw strings where enums/unions already exist
43
- - Unnecessary JSX nesting: wrappers that add no layout value
44
- - Comments narrating WHAT the code does -- delete them; keep only non-obvious WHY
45
-
46
- 3. **Efficiency**:
47
- - Redundant computations, repeated file reads, duplicate API calls
48
- - Sequential operations that could be parallel
49
- - Hot-path bloat: new blocking work in startup or per-request paths
50
- - Recurring no-op updates: state/store updates inside polling loops that fire unconditionally -- add change-detection guard
51
- - Unnecessary existence checks before operating (TOCTOU anti-pattern)
52
- - Memory: unbounded data structures, missing cleanup, event listener leaks
53
-
54
- Less code is better. Delete and simplify rather than add. Fix directly -- no need to explain.`;
34
+ Invoke the \`simplify\` skill to review your changes for reuse, quality, and efficiency, then fix any issues found.`;
55
35
  export class Swarm {
56
36
  agents = [];
57
37
  logs = [];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-overnight",
3
- "version": "1.25.41",
3
+ "version": "1.25.42",
4
4
  "description": "Parallel Claude agents in git worktrees with a usage cap that reserves headroom for your interactive Claude Code. Crash-safe resume. Provider-agnostic model catalog (Anthropic, Cursor, OpenAI, Gemini, DeepSeek, Llama, Qwen) with capability-based task scoping.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claude-overnight",
3
- "version": "1.25.41",
3
+ "version": "1.25.42",
4
4
  "description": "Claude Code skill for understanding, installing, and inspecting claude-overnight runs -- parallel Claude agents in git worktrees with thinking waves, multi-wave steering, and crash-safe resume. Supports Cursor API Proxy, Qwen, OpenRouter.",
5
5
  "author": {
6
6
  "name": "Francesco Fornace"
@@ -11,7 +11,7 @@ description: >
11
11
 
12
12
  # What it is
13
13
 
14
- `claude-overnight` is a CLI (npm: `claude-overnight`, bin: `claude-overnight`) that takes an objective + budget and launches many Claude agent sessions in parallel, each in an isolated git worktree. It's a local multi-session orchestrator built on top of the Claude Agent SDK -- not itself an agent harness, but a layer that plans, dispatches, and steers many sessions that run on the SDK's harness. Three roles are picked independently: **planner** (thinks, steers, reviews), **worker** (runs the tasks), and an optional **fast** model (quick well-scoped edits verified by the worker next wave). A "thinking wave" of architect sessions explores the codebase, an orchestrator synthesizes concrete tasks, worker waves run them in parallel, and steering decides between more work, reflection, or declaring done. Rate limits, crashes, and usage caps are all resumable -- nothing is lost.
14
+ `claude-overnight` is a CLI (npm: `claude-overnight`, bin: `claude-overnight`) that takes an objective + budget and launches many Claude agent sessions in parallel, each in an isolated git worktree. It's a local multi-session orchestrator built on top of the Claude Agent SDK -- not itself an agent harness, but a layer that plans, dispatches, and steers many sessions that run on the SDK's harness. Three roles are picked independently: **planner** (thinks, steers, reviews), **main worker** (runs the tasks), and an optional **fast worker** (a cheaper/faster second worker for well-scoped tasks, verified by the next wave's workers). A "thinking wave" of architect sessions explores the codebase, an orchestrator synthesizes concrete tasks, worker waves run them in parallel, and steering decides between more work, reflection, or declaring done. Rate limits, crashes, and usage caps are all resumable -- nothing is lost.
15
15
 
16
16
  **Three-layer review system** runs on every wave:
17
17
  1. **Per-agent self-review** -- after each agent finishes, the same session continues via SDK session resume (continue mechanism) with a follow-up prompt to review and simplify its own `git diff`. The agent's full context stays warm -- no initial context bloat.
@@ -55,7 +55,7 @@ Every run lives at `<repo>/.claude-overnight/runs/<ISO-timestamp>/`:
55
55
 
56
56
  | File / dir | What it tells you |
57
57
  |----------------------|-----------------------------------------------------------------------------------|
58
- | `run.json` | Machine state: objective, planner/worker/fast models, budget, cost, waves done, branches, done flag. |
58
+ | `run.json` | Machine state: objective, planner/main-worker/fast-worker models, budget, cost, waves done, branches, done flag. |
59
59
  | `status.md` | **Living project snapshot**, rewritten by steering every wave. First line = short status. |
60
60
  | `goal.md` | Evolving "north star" -- what the run currently thinks "amazing" means. |
61
61
  | `themes.md` | The thinking-wave research angles picked for this objective (human-readable). |
@@ -2,8 +2,9 @@
2
2
  name: claude-overnight-coach
3
3
  description: >
4
4
  Setup coach for claude-overnight. Turns a raw user objective into a ready
5
- objective plus recommended run settings (budget, concurrency, planner/worker
6
- models, flex, usage cap, permission mode) and an actionable preflight
5
+ objective plus recommended run settings (budget, concurrency, planner /
6
+ main-worker / optional fast-worker models, flex, usage cap, permission mode)
7
+ and an actionable preflight
7
8
  checklist. Invoked once, before the interactive pickers, to catch prompt-shape
8
9
  failures (vague, overambitious, multi-goal, unverifiable) and environmental
9
10
  failures (missing keys, dirty tree, missing .env) while they're still cheap
@@ -69,8 +70,8 @@ Rules:
69
70
  - `improvedObjective` preserves the user's voice and domain vocabulary. It MUST include a `Done:` line, a `Critical:` line (or `Critical: none` when nothing is off-limits), and a `Verify by:` line.
70
71
  - `recommended.budget` is an integer ≥ 1. `concurrency` is an integer in [1, 12]. `usageCap` is either `null` (unlimited) or a float in (0, 1].
71
72
  - `recommended.permissionMode` is `"auto" | "bypassPermissions" | "default"`.
72
- - `fastModel` is `null` unless adding one is clearly warranted for this scope + budget AND a cheap fast model is reachable from the available providers.
73
- - `recommended.plannerModel` / `workerModel` / `fastModel` MUST be model IDs that the user can actually reach given the providers listed in the input. Stock Anthropic IDs (e.g. `claude-opus-4-7`, `claude-sonnet-4-6`, `claude-haiku-4-5`) are only valid when "Anthropic direct: available" appears in the input.
73
+ - `fastModel` (the fast-worker model) is `null` unless adding one is clearly warranted for this scope + budget AND a cheap fast-worker model is reachable from the available providers.
74
+ - `recommended.plannerModel` (planner) / `workerModel` (main worker) / `fastModel` (fast worker) MUST be model IDs that the user can actually reach given the providers listed in the input. Stock Anthropic IDs (e.g. `claude-opus-4-7`, `claude-sonnet-4-6`, `claude-haiku-4-5`) are only valid when "Anthropic direct: available" appears in the input.
74
75
  - `checklist` `remediation` is an informational label — the host does NOT auto-act on it. Set it to the slug that best describes the issue, or `"none"` for purely advisory items.
75
76
  - `questions` is reserved for a future clarification loop; return `[]` for now.
76
77
 
@@ -105,27 +106,27 @@ Rows: scope. Each cell is a starting point — adjust by one step when repo fact
105
106
 
106
107
  `conc` ⇒ `recommended.concurrency` (clamp to ≤ budget).
107
108
  `flex` ⇒ `recommended.flex`.
108
- `fast=true` ⇒ recommend a fast model **if the user has one configured and reachable** from their available providers. Pick whatever the cheapest fast model is among their providers (e.g. `claude-haiku-4-5`, `composer-2-fast`, `qwen3` variants). If no fast model is reachable, set `null`.
109
- `fast=null` ⇒ do not recommend a fast model (scope too complex or no suitable fast model available).
109
+ `fast=true` ⇒ recommend a fast-worker model **if the user has one configured and reachable** from their available providers. The fast worker is a real worker (same tools, same env) on a cheaper/faster model — steering routes well-scoped tasks to it by default. Pick whatever the cheapest fast-worker model is among their providers (e.g. `claude-haiku-4-5`, `composer-2-fast`, `qwen3` variants). If none is reachable, set `null`.
110
+ `fast=null` ⇒ do not recommend a fast worker (scope too complex or no suitable fast-worker model available).
110
111
  `cap=null` ⇒ unlimited (`recommended.usageCap = null`).
111
112
 
112
- ## Planner / worker model selection
113
+ ## Planner / main-worker / fast-worker model selection
113
114
 
114
- Pick the strongest reachable model for the planner; pick a cheap-but-capable reachable model for the worker.
115
+ Pick the strongest reachable model for the planner; pick a cheap-but-capable reachable model for the main worker; optionally add a cheaper/faster second model as the fast worker.
115
116
 
116
117
  Decision order (stop at the first row whose providers are present):
117
118
 
118
119
  1. **Anthropic direct available**
119
120
  - planner: `claude-opus-4-7` (or its `-thinking-high` variant when scope is `audit-and-fix` / `research-and-implement` / `migration`).
120
- - worker: `claude-sonnet-4-6` for normal work; `claude-opus-4-7` for `wide`/`saturated` migrations or research.
121
- - fastModel: recommend the cheapest fast model available among the user's reachable providers when the matrix says `fast=true`.
121
+ - main worker: `claude-sonnet-4-6` for normal work; `claude-opus-4-7` for `wide`/`saturated` migrations or research.
122
+ - fast worker (`fastModel`): recommend the cheapest fast-worker model available among the user's reachable providers when the matrix says `fast=true`.
122
123
  2. **Custom Anthropic-compatible provider with a strong model** (e.g. `qwen3.6-plus`, `qwen3-coder-plus`)
123
124
  - planner: the strongest such model the user has.
124
- - worker: same model, or a cheaper sibling if the user has one.
125
+ - main worker: same model, or a cheaper sibling if the user has one.
125
126
  3. **Cursor proxy is the only reachable provider**
126
127
  - planner: `claude-opus-4-7` via Cursor (only if the proxy exposes it).
127
- - worker: `claude-sonnet-4-6` via Cursor, or `composer-2` for the cheapest path.
128
- - fastModel: recommend a Cursor fast model (e.g. `composer-2-fast`) when the matrix says `fast=true`.
128
+ - main worker: `claude-sonnet-4-6` via Cursor, or `composer-2` for the cheapest path.
129
+ - fast worker (`fastModel`): recommend a Cursor fast-worker model (e.g. `composer-2-fast`) when the matrix says `fast=true`.
129
130
  4. **No reachable provider** — leave `plannerModel` and `workerModel` as `claude-sonnet-4-6` and emit a `blocking` checklist item titled "No reachable provider".
130
131
 
131
132
  Never recommend Cursor models when the input does not list a `cursor proxy` provider, and never recommend stock Anthropic IDs when the input does not say "Anthropic direct: available". `fastModel` MUST be `null` rather than guessed.