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.

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.