---
description: How to choose which model runs a piece of work in this project. Apply when deciding what to delegate and to whom, when writing an orchestration record, when a subagent seems too cheap or too expensive for its job, when a Task call fails with an unknown model, or when anyone proposes writing a model name into a file.
alwaysApply: false
---

# Lane routing

This project routes by **lane**, never by model name. The lanes are bound to real model IDs in `@docs/MODEL_ROUTING.md`, and only two places may contain a model ID: that file, and the `model:` frontmatter of `.cursor/agents/*.md`. Both are written by `/model-routing`.

| Lane | Runs | Choose it for | Never for |
| --- | --- | --- | --- |
| **fast** | scout · verifier · learning-steward | narrow search, running checks, extraction, lesson capture | architecture, ambiguous change, security sign-off |
| **mid** | builder · integrator · ux-ui-designer · ux-psychologist | implementation, debugging, ordinary planning, design work | novel high-consequence decisions without review |
| **strong** | critic · security-auditor · system-steward · planner · gauntlet-critic | adversarial review, security analysis, architecture, final synthesis | retrieval, boilerplate, anything a command can decide |
| **lead** | this session | framing, routing, judging evidence, fast-path edits | deep implementation it should have delegated |

**Routing test.** Can a cheap model succeed given a precise contract and a deterministic verifier? Yes → `fast`. Known-pattern implementation → `mid`. Otherwise → `strong`, then verify independently.

## Rules that actually bite

- **Never write a model ID into `AGENTS.md`, a rule, a skill, or a task packet.** Name the lane. A model ID outside the two allowed places is drift that survives until the model is retired and then fails loudly at the worst moment.
- **Never change a subagent's `model:` line by hand.** Run `/model-routing`, which keeps the frontmatter, `docs/MODEL_ROUTING.md`, and the lead's picker selection in agreement. Editing one of the three creates a routing that is true nowhere.
- **`model: inherit` is not a bug — but it is not free either.** It means the subagent runs on the lead's model. A roster on all-inherit has no cost split at all, so a "cheap scout" costs exactly what this session costs. If the sessionStart hook reports the routing is unbound, say so before delegating rather than after.
- **Escalate one lane, once, on evidence.** A concrete failure at the current lane justifies one step up. Record a permanent escalation in `docs/DECISIONS.md`.
- **A second vendor is a cross-model critic, not a second builder.** Give it the contract, the proposed result, and a sharp question — "what would make this fail the acceptance tests or harm users?"
- **The referee is never cheaper than the builder.** `gauntlet-critic` rides `strong` by construction; a referee weaker than the thing it judges rubber-stamps. `Auto` is disallowed on `strong` for the same reason — a parity verdict from a router that may have downgraded is not a verdict.
- **The gates assume `strong` is genuinely stronger than `mid`.** If `docs/MODEL_ROUTING.md` records a collapsed lane, high-risk work and every parity verdict need a human reviewer standing in for the independent judge. Do not quietly proceed as though the judge exists.

## Cost

Parallel subagents multiply spend close to linearly — five in parallel costs roughly five times one. That is worth it for genuinely independent work with separate owners, and pure waste for work that a single agent would have done in sequence anyway. Parallelize because ownership is disjoint, never because it looks faster.
