Research

Benchmarks

Every result below comes from a benchmark in our own repository, re-runnable against the same fixtures. Each table states what was run, how many trials, and when — a figure without those three is an assertion rather than a result.

Routing strategies

2026-08-28

32 graded cases × 3 models, 7 trials per cell, pooled across 6 repeat runs.

StrategySuccessTotal costCost / success
always_premium99.1%$0.0487$0.001535
task_tier_heuristic98.7%$0.0416$0.001318
always_balanced98.7%$0.0202$0.000641
planverity_router @0.7595.1%$0.0107$0.000350
planverity_router @0.8598.7%$0.0213$0.000674
How to read this

Best cost-per-success of any strategy, but it does NOT dominate always_balanced — at 0.75 it trades 3.6 points of success for half the cost, and at 0.85 it matches on success at roughly 5% more. What it does beat outright is always_premium and the hand-rolled heuristic, and that heuristic is itself dominated by simply using one balanced model.

Quality floor sweep

2026-08-28

Single run, suite starter-v2, 32 cases. Router behaviour as the floor rises.

FloorRouter successRouter costalways_balancedalways_economy
none84.4%$0.0056100% / $0.019284.4% / $0.0056
0.6090.6%$0.0083100% / $0.019284.4% / $0.0056
0.6593.8%$0.0097100% / $0.019284.4% / $0.0056
0.7093.8%$0.0106100% / $0.019284.4% / $0.0056
0.75100%$0.0220100% / $0.019284.4% / $0.0056
How to read this

With no floor the router correctly reduces to 'cheapest' and matches always_economy exactly — any comparison at that setting is vacuous. The floor is the dial, and quoting a single point on this curve without the rest of it would be cherry-picking.

Tool selection — 60-tool catalogue

2026-08-28

38 tasks × 60 deliberately confusable tools, 21 of them in policy-denied classes. Selection only, no model calls.

StrategyRecallPrecisionForbidden exposuresSchema tokens
all_tools (no policy)100%1%7983775
all_permitted100%6%0809
keyword91%15%0285
keyword_stemmed91%15%0291
lexical96%16%0292
semantic80%13%0321
hybrid_rrf93%16%0293
How to read this

798 is 21 dangerous tools exposed on all 38 tasks — the naive baseline sends every money-moving and destructive tool on every request. Every policy-respecting strategy is zero structurally, because the filter runs before ranking. Value splits as policy 3775 → 809 tokens, then ranking 809 → 292: most of the benefit is the filter, not the ranker.

Tool selection — 18-tool catalogue

2026-08-27

Same 38 tasks against the smaller catalogue, before stemming was added.

StrategyRecallPrecisionForbidden exposuresSchema tokens
all_tools (no policy)100%4%1521153
all_permitted93%12%0385
keyword93%17%0273
lexical93%17%0273
semantic93%14%0326
hybrid_rrf87%16%0272
How to read this

At this size lexical and keyword selected identical sets on all 38 tasks — verified by diff, not inferred from equal metrics. The sophisticated ranker bought nothing here, and at 60 tools it initially did worse than substring matching. The cause turned out to be a missing stemmer one layer below, not the ranker.

Semantic ranking, four attempts

2026-08-28

Real text-embedding-3-small vectors over policy-permitted tools, K=5.

RankerRecall @5Verdict
lexical (default)3/4kept
semantic (cosine)3/4no gain, more tokens
hybrid RRF3/4below its better input
MMR λ=0.51/4materially worse
MMR λ=0.31/4materially worse
How to read this

Semantic features must demonstrate repeatable benefit or be disabled. Three independent measurements failed to beat deterministic ranking, so the infrastructure stays built, tested and off by default. MMR was our own first instinct and it was the worst option of the five.

Spend cap enforcement

2026-08-28

Live against Postgres. Concurrent reservations issued against a known remaining budget.

PropertyResult
6 concurrent reservations vs remaining budget2 granted, 4 refused, cap not breached
Exact boundary (4 × 0.25 into a 1.00 cap)4 granted, 5th refused
Reserve then settlereserved 0.0000830, settled 0.0000790, headroom returned
Rewrite a settled rowrefused by trigger
Delete a reservation rowrefused by trigger
Capped request through the gatewayHTTP 402, no ledger row, nothing billed
How to read this

A cap that can be exceeded under concurrency is not a cap. The check and the reservation share one transaction behind a lock on the budget scope, and the comparison runs in SQL numeric rather than JavaScript floats — money comparisons in float64 are how an off-by-a-fraction breach goes unnoticed.

Every routable model, measured

2026-09-04

Suite starter-v2, 32 graded cases per model, 5 repeat runs, ~3,900 graded trials spanning all six providers. Deterministic graders only; no model grades another. Infrastructure errors are excluded from the pass rate (a rate limit is not a quality failure), so cost/success counts only calls that actually ran. Two defects were found by this run and fixed before these figures: a numeric grader that read “1,368.50” as two numbers had been recording correct answers as failures for every model, and three Ollama endpoints that returned HTTP 402 on every call were disabled rather than logged as quality failures.

ModelPassAvg latencyCost / success
zai / glm-5.3-flash98.2%2,361ms$0.0000267
gemini-3.1-flash-lite88.0%694ms$0.0000288
gemini-3.5-flash-lite87.0%657ms$0.0000427
gemini-3-flash-preview99.5%2,184ms$0.0000498
gemini-3.7-flash100%1,392ms$0.0000655
gpt-5.4-mini84.9%620ms$0.0000986
gemini-3.5-flash98.4%2,138ms$0.0001516
claude-haiku-4-587.7%798ms$0.0002028
deepseek-v4-flash99.4%1,477ms$0.0002294
gpt-5.488.5%754ms$0.0003121
zai / glm-4.5-air96.8%6,648ms$0.0004567
zai / glm-5.3100%4,868ms$0.0005629
deepseek-v4-pro99.7%2,325ms$0.0006138
claude-sonnet-598.8%1,419ms$0.0006154
zai / glm-4.699.4%6,774ms$0.0010387
zai / glm-599.4%5,159ms$0.0011640
claude-opus-599.2%1,957ms$0.0014858
ollama / gpt-oss:20b98.4%2,527msunpriced
ollama / gpt-oss:120b97.4%858msunpriced
How to read this

Read the saturation before the spread. Nine of these score 98% or better, which means starter-v2 no longer separates the top of the field — a benchmark almost everything passes measures very little while still looking like evidence, and the honest next step is harder cases, not a louder claim. What the suite still supports is the cost axis, where the spread is real: gemini-3.7-flash passed every case at roughly a ninth of Sonnet's cost per success, and glm-5.3-flash at about a twenty-third. That is an argument for routing which did not exist while the pool was effectively one vendor — measured in August, routing was Pareto-efficient but did not beat simply always using one good mid-tier model. Three caveats travel with these numbers: this is our suite and not your workload, so a task type absent from it is unmeasured rather than proven; the two Ollama models carry no pricing row, so they have no cost/success figure and would fail closed under a cost ceiling whatever their quality; and glm-4.5-air threw 14 infrastructure errors, correctly excluded from the pass rate above but a reliability signal that a quality column is the wrong place to look for.

Numbers that say what they are

The console distinguishes measured from estimated everywhere, because the difference is the product.

“Not yet measured” is not zero

Verified quality needs a grader on live traffic. Until that exists the console says so, rather than rendering an unmeasured score as 0 or as a failure.

An absent baseline is not free

When no alternative model was feasible, savings show “no alternative existed” — never $0, which would claim the alternative cost nothing.

Unpriced is not free either

An endpoint with no price on file fails closed under a cost ceiling. Cost estimation returns null, never zero, so unknown cannot masquerade as cheap.

Why the losses are here. A routing product that publishes only favourable comparisons is not offering evidence, it is offering marketing with numbers attached. The two results most damaging to the pitch — that our router does not dominate a single good mid-tier model, and that semantic ranking has failed three times — are on this page because leaving them off would make everything else on it worth less.
Research · Planverity