Client-side capability resolution

Show the model
five tools, not five hundred.

acri sits between your application and whichever model you call. Each task, it reads your full tool corpus once and hands over only the few tools that call actually needs — then never touches that prompt prefix again.

compass.resolve(query, corpus) simulated, from real recall@k data
corpus size100
offered to model5
resolve time0.04 ms
01THE PROBLEM

Every schema you add competes for the same attention.

Anthropic's own tool-use documentation names 30–50 tools as the point where selection accuracy starts to visibly degrade. Past that, the model isn't reading fewer words — it's choosing between more things that look alike.

84% 92% tool-selection accuracy, all 100 tools shown vs. acri's top 5 — live gemini-2.5-flash, n=50 (assay/accuracy.py)
02THE CACHING LAW

Cutting tokens can cost more, not less.

Providers price a cached prompt prefix at roughly a tenth of the uncached rate. Re-resolving tools every turn rewrites that prefix — trading a cache discount for a smaller prompt is only a real saving once the cut is steep enough.

Re-resolve every turn

turn 1
full price
turn 2
full price
turn 3
full price

Cache never hits — the prefix changes every time.

Resolve once, append

turn 1
full price
turn 2
cached
turn 3
cached

One full-price write, then ~10% cost after — illustrative, from the r < 1/10 argument below.

r · C · p  <  C · (p / 10)   ⟺   r < 1/10

Where r is the fraction of the tool block kept and C·p is the full uncached cost. Below a ~10× cut, rewriting a cached prefix is a net regression — the reason acri resolves once per task and appends, rather than re-searching every turn.

03STUDIO

Watch the resolver think.

Studio is acri's own dashboard — two read-only views over the same ledger. No separate telemetry, no data leaving the machine.

servers, models, and every tool seen in ledger history

read-only · polls .acri/ledger.jsonl every 2s · never connects to a server itself
04THE EVIDENCE

What's actually measured — and what isn't.

Every number below comes from a script in assay/. Recall degrades as the corpus grows; we report that rather than tune it away.

source: assay/recall.py (100 tools), assay/scale.py (500 tools)
krecall@k, 100 toolsrecall@k, 500 tools
174%60%
390%82%
5100%92%
10100%98%

Single model (gemini-2.5-flash), one synthetic 500-tool corpus, n=50–52 queries. No embeddings baseline yet, no significance test on the 8-point accuracy gap. Full write-up: the paper.