feat(blitz): spawn-time model assessment over label table
ci / nix (push) Successful in 7s
ci / lint (push) Successful in 11s

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Miguel Palhas
2026-08-23 15:54:46 +01:00
parent febf397885
commit b735c16b30
+24 -16
View File
@@ -11,24 +11,32 @@ babysitting and cleanup.
## Model routing ## Model routing
Default table, by the repo's `difficulty/` label (issues without one: judge **Assess each issue at spawn time.** You have just read its body to write the
the tier yourself from the issue's shape): prompt — use that read to pick the model. The question is not "how big is
this" but **how much judgment does the session still have to exercise**:
| Difficulty | Models | - Body settles the approach (root cause named, fix shape decided, numbers
|---|---| suggested, files pointed at) — the thinking happened at filing time; the
| hard | Fable (`--tool claude --extra-args "--model claude-fable-5"`) | session executes. **Sonnet** (`--tool claude --extra-args "--model
| moderate | Opus (`--tool claude --extra-args "--model claude-opus-5"`) | claude-sonnet-5"`), regardless of size: a large mechanical CRUD issue is
| easy / trivial | Sonnet (`--tool claude --extra-args "--model claude-sonnet-5"`) | still execution.
- Body states the goal but the session must design the interface, choose the
data model, or amend the design doc — **Opus** (`--model claude-opus-5`).
- The design doc itself is thin or contradictory where this issue lives,
correctness is subtle, or the change is cross-cutting with unclear blast
radius — **Fable** (`--model claude-fable-5`).
The operator overrides this by just saying so in the invocation ("run these A `difficulty/` label is one input — a filing-time guess that cannot see how
on codex", "use ox alpha for the easy ones") — no config file. Route by how much the body scaffolds. Trust your read of the body over it; the label is a
much judgment the session still has to exercise, not by the label alone: an tie-breaker. When in doubt between two tiers take the lower one: escalation
issue whose body already settles the approach (root cause named, fix shape on failure is cheap, and a failed cheap run teaches something a successful
decided, numbers suggested) drops a tier, because the thinking happened when expensive run does not.
it was filed. When a tier
has two models, alternate within it rather than draining one first — a bad The operator overrides any of this by just saying so in the invocation ("run
run should be visible early. Escalate *sideways* (the tier's other model) these on codex", "use ox alpha for the easy ones") — no config file. When
before escalating up, and never de-escalate mid-issue. routing across peer models, alternate rather than draining one first — a bad
run should be visible early. Escalate *sideways* (a peer model) before
escalating up, and never de-escalate mid-issue.
## Spawning ## Spawning