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
Default table, by the repo's `difficulty/` label (issues without one: judge
the tier yourself from the issue's shape):
**Assess each issue at spawn time.** You have just read its body to write the
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 |
|---|---|
| hard | Fable (`--tool claude --extra-args "--model claude-fable-5"`) |
| moderate | Opus (`--tool claude --extra-args "--model claude-opus-5"`) |
| easy / trivial | Sonnet (`--tool claude --extra-args "--model claude-sonnet-5"`) |
- Body settles the approach (root cause named, fix shape decided, numbers
suggested, files pointed at) — the thinking happened at filing time; the
session executes. **Sonnet** (`--tool claude --extra-args "--model
claude-sonnet-5"`), regardless of size: a large mechanical CRUD issue is
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
on codex", "use ox alpha for the easy ones") — no config file. Route by how
much judgment the session still has to exercise, not by the label alone: an
issue whose body already settles the approach (root cause named, fix shape
decided, numbers suggested) drops a tier, because the thinking happened when
it was filed. When a tier
has two models, alternate within it rather than draining one first — a bad
run should be visible early. Escalate *sideways* (the tier's other model)
before escalating up, and never de-escalate mid-issue.
A `difficulty/` label is one input — a filing-time guess that cannot see how
much the body scaffolds. Trust your read of the body over it; the label is a
tie-breaker. When in doubt between two tiers take the lower one: escalation
on failure is cheap, and a failed cheap run teaches something a successful
expensive run does not.
The operator overrides any of this by just saying so in the invocation ("run
these on codex", "use ox alpha for the easy ones") — no config file. When
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