Torque
An automatic transmission for Claude Code: score every prompt, route it to the cheapest model that can still handle it, and shift models mid-session without losing the conversation. Six measured validation runs established that the v1 classifier does not work — and exactly why. This page publishes that result rather than hiding it.
By the Numbers
- 101 — Commits, 0.62 files per commit
- 6 — Measured validation runs
- ~110 — Labelled
(prompt, work-state, gear, adequate?)rows - 49% — Of Opus turns that needed no Opus at all
The Problem
On a Max subscription, roughly 94% of tokens go to the most expensive model available, regardless of whether the turn needed it. Most turns don't. The obvious fix is a router: read the prompt, guess the difficulty, send easy work to a cheaper model.
Every competing router does exactly that — and none of them publishes a number saying whether it works.
What Six Runs Established
The headline result is negative and it is precise. Across 37 turns, the classifier's score does not discriminate between routes that turned out adequate and routes that turned out inadequate:
- 15.9 vs 16.7 — Mean classifier score, adequate vs inadequate. Median 2 in both. Slightly higher on the failures.
- Not a tuning problem — Identical distributions mean no threshold change can rescue it. The prompt text carries no information about this decision.
- Adequacy is not a property of a gear — The same gear on the same prompts scored 85% against one default and 28.6% against another.
- Two gears were the same model — Measured twice; the cheaper arm cost slightly more both times.
- Prompt-text-only routing tops out near 67% — A ceiling, not a starting point.
One thing did work. Routing on work state — files touched, tests red, task open, tool failures — rather than on the sentence was worth +12 points (66.7% → 78.6%). Independently corroborated: ACRouter reports +15.3% from the same idea.
The Prize Is Still Real
18 of 37 turns could have run on a cheaper model with no loss of quality. A perfect oracle roughly doubles a Max subscriber's quota on the expensive model. Not 5–10x — that would need the trivial slice routed to the smallest model, and that model measured 60–63% adequate in every run.
The gap between that ceiling and the current classifier is the entire remaining product.
Why This Is On The Site
A router that shipped without measurement would have looked better here and been worth less. The measurement is the asset: six runs, ~110 labelled rows, and a competitive landscape where several direct competitors exist and not one of them publishes a single validation number.
It also caught its own error. An early run reported 48.6% adequate; a validation harness had reimplemented a production routing rule by hand instead of calling it, and the drift surfaced as a plausible wrong number rather than a crash. The figure is recorded as a lower bound, not a measurement. That correction is in the record too.
Direction
Stop building the classifier. Build the discriminator — route on what the work is doing, not on what the sentence looks like. The dataset to train that already exists.
Tech Stack
TypeScript ESM monorepo · @torque-cc/engine · Tauri 2 · SolidJS · Rust backend · Node validation harness