How it works

From nightly benchmark to ranked answer.

Model Maverick is a measurement system with a policy engine on top. Here is the whole pipeline — how scores come to exist, how your rules shape them, and why every answer can be audited after the fact.

Layer 1 · Measurement

The capability matrix

The core data structure is a matrix: model columns on one axis, capability × difficulty cells on the other. A model column is a (provider, model, endpoint, settings) tuple — so claude-sonnet-5 direct and the same model with thinking enabled are separate, separately measured things. Each cell holds quality, pass rate, cost, and latency — smoothed over recent nights of runs (more on that below).

The matrix is fed by a private, versioned task corpus: 200+ tasks across ten capabilities and five authored difficulty tiers. Golden answers and hidden test suites never enter a prompt, which blocks the contamination that makes public benchmark scores unreliable. Every score row and every recommendation carries a matrix_version, so any decision can be audited against the exact tasks and graders that produced it.

Grading: deterministic first, judges last

Every task carries its grader as data, validated at authoring time. Deterministic graders (test suites, schema validation, rule scans) and reference graders (golden answers, key-fact coverage) do most of the work. A single cross-family LLM judge — temperature 0, order-swapped to cancel position bias — covers rubric dimensions like code idiom and summary readability.

The judge role itself is earned empirically: the critique_and_judging capability doubles as judge selection, so judging goes to models that measurably rank well at it, not to reputation.

Scoring: variance is risk, so it subtracts

Each task runs three times per model column. A model that passes four times in five is riskier than its average suggests, so variance subtracts from quality. A second penalty, ambiguity, applies when graders disagree about a single output — an answer the graders split on is harder to trust than a clean result with the same score.

Nightly numbers feed an exponentially weighted moving average (EWMA) — a running average where the most recent nights count the most and older results gradually fade. Think of it as a trend line rather than a scoreboard: last night moves it, but can't yank it. Rankings are driven by that smoothed score, so one noisy night cannot flip a recommendation, while a genuine change still shows up within a few nights. And when the smoothed score drops sharply, that raises a regression alert — which is how you find out a provider changed a model under you before your users do.

Predictions locked before results, scored after

Before each nightly run, the system locks its predicted ranking and stores it. After the run, the prediction is scored against reality with a Brier score. Locking first makes hindsight impossible: the calibration series shows exactly how well the benchmark predicts itself, capability by capability, and where it is blind. That history — not optimism — is what gates any shortcut like matrix completion.

The nightly loop

What happens every night.

Five stages, in order — ending in the capability matrix your requests read the next day.

repeats every night — full corpus sweep weekly 01 LOCK predict tonight'srankings — storedbefore any run hindsight-proof 02 RUN corpus tasks ×model columns ×3 repeats spend guard checksprojected cost first 03 GRADE tests · schemas ·golden answers ·one LLM judge judge: cross-family,order-swapped 04 SCORE variance & ambiguitysubtract · fold intothe running average recent nightscount most (EWMA) 05 CHECK regression scan ·Brier-score thelocked prediction alerts fire here fresh aggregates ⌖ THE CAPABILITY MATRIX quality · pass rate · cost · latency — per model, per capability, per difficulty tier stamped with matrix_version · read by every recommendation you request tomorrow
Layer 2 · Decision

The policy engine: five steps, in order

  1. Pool restriction. Intersect all model columns with the caller's pool. Pools are the compliance boundary — a request can never widen its own.
  2. Allowlist. If allowed_models is present, it must be a subset of the pool. An unknown entry is a loud, named error — no silent dropping, no silent widening.
  3. Standing constraints. Apply stored filters: zero-retention requirements, cost and latency ceilings. These can't empty the set, because configuration writes reject any combination with zero usable columns.
  4. Request preferences. Per-request ceilings deprioritize rather than drop. If every survivor violates one, the best available returns anyway with the violations named.
  5. Rank. Raw scores normalize across the survivors at query time — "best of these four" is computed on the four — then order under your mode: quality, balanced, or cost.

The result is a guarantee: a well-formed request from a configured tenant always returns a model. Difficulty shortfalls and preference violations arrive as flags on a real recommendation, never as an empty response.

Classification: declared or inferred

A declared workload (capability, difficulty, domain) skips classification entirely and sends nothing but labels. A raw prompt goes through a small, cheap classifier at temperature 0 with structured output, cached by prompt hash, with its confidence surfaced in the response. High-stakes routes can require declared workloads and take the classifier out of the loop.

Tie-breaking favors your invoice

Ties inside the noise band resolve to the cheaper column, and a same-family downgrade is preferred over a cross-family swap — fewer prompt-format surprises when you step down.

Where the cost numbers come from

Every model column carries a current price snapshot — provider list prices, synced as they change. Every benchmark run records the tokens it used and what it cost. Fold the two together and each matrix cell knows the measured, typical cost of work at that capability and difficulty: what a tier-3 extraction actually costs to run on a given model, at today's prices.

That number enters the decision three ways. Your per-capability weights say how much cost matters next to quality and latency. Your mode sets the band — balanced takes the cheapest model within a point or two of the best; cost widens the band. And a per-request ceiling like max_cost_per_run is checked against the estimate: a pick that violates it still returns — deprioritized, never dropped — with the violation named, limit and estimate side by side, so your code can decide.

The estimate is honest about being an estimate: measured from corpus tasks of the same capability and difficulty, priced at current rates. It's the typical cost of work shaped like yours — not a metered quote on your exact document.

The request path

What happens on every request.

One call in, a ranked answer out, milliseconds end to end — and a paper trail that lasts. On an SDK, all of it happens invisibly inside the client you already use.

01 REQUEST prompt — or adeclared workload(no classifier) SDK · MCP · REST 02 CLASSIFY capability · tier ·domain tags declared? skipped.cached by hash 03 POLICY pool ∩ allowlist →standing constraints hard boundary —can't empty the set 04 RANK normalize acrosssurvivors · applyyour mode ties go to thecheaper column 05 RESPOND ranked list + checkspec + honest flags the list is yourfallback chain afterwards: SDK telemetry ties what production did back to the same recommendation_id — automatically
two prompts, two answers
POST /v1/recommend

"Summarize this customer email in one sentence."

classified: summarization_synthesis · tier 1

claude-haiku-4-5 anthropic

Every tracked model clears tier-1 summarization, so the cheapest column wins. A frontier model here would do the same job at 30× the price.

then: gemini-3.1-flash · escalation, same pool

POST /v1/recommend

"Migrate our billing service from REST to gRPC — schemas, handlers, and tests."

classified: code_generation · tier 5

gpt-5.5 openai

Only frontier columns clear tier-5 code generation at this quality bar. Sending this to a mini model saves pennies and costs you a sprint.

then: claude-fable-5 · escalation, same pool

Same endpoint. Same policy. The prompt decides the model — and when the nightly benchmarks shift, so does the answer.

The cost guardrail

Never pay more for an answer than it's worth.

Every feature earns something each time it runs — a ticket triaged, an email summarized, a contract parsed. A model call that costs more than that turns the feature into a leak. One number in your policy, max_cost_per_run, is the cap on what a single call may cost. Three walkthroughs:

WALKTHROUGH / 01

The free tier

A free-plan email summarizer. It earns nothing directly — it exists to convert signups.

worth per call~$0.005
ceiling you set$0.002
⌖ the pickhaiku-class · $0.0004

Maverick can only surface models whose measured cost for this work fits under the cap. Your free tier physically can't choose a model that loses you money.

WALKTHROUGH / 02

The high-volume route

Tagging 50,000 support tickets a month. Easy work — tier 1 — and every tracked model passes it.

frontier model$0.03 → $1,500/mo
⌖ the pick$0.002 → $100/mo

Same pass rate either way. The guardrail turns "we should really downsize that model" from a backlog ticket into a number the engine enforces — and $1,400 a month stays yours.

WALKTHROUGH / 03

The route worth real money

Extracting obligations from signed contracts — each run replaces an hour of paralegal review.

worth per callbillable hours
ceiling you setloose, or none
⌖ the pickclears tier 4

A missed obligation costs more than any model call, so here the quality bar leads and the guardrail stays out of the way. Guardrails are per route — tight where calls earn pennies, generous where mistakes are expensive.

And when nothing fits under a ceiling? A per-request cap never strands you: the best model still returns, with the violation named — limit and estimate, side by side — so your code decides. A standing tenant cap is a hard wall, and Maverick refuses to save a wall that would leave you zero usable models.

The API

One request, one defensible answer.

The engine's native surface — what every SDK, gateway plugin, and MCP tool speaks underneath, and an open door for stacks we don't wrap yet. REST with per-tenant keys; agents get the same three operations as MCP tools (recommend_model, get_policy, list_models).

Request
POST /v1/recommend
{
  "workload": {
    "prompt": "Extract the parties, dates, and obligations from this contract: ..."
  },
  "pool": "vertex-only",
  "mode": "balanced",
  "constraints": { "max_cost_per_run": 0.01 }
}
Response
{
  "classification": {
    "capability": "structured_extraction",
    "difficulty": 3,
    "domain_tags": ["legal"],
    "high_stakes": true,
    "confidence": 0.91
  },
  "recommendations": [
    { "provider": "anthropic", "model": "claude-sonnet-5", "endpoint": "vertex",
      "score": 94.1, "clears_difficulty": true,
      "reason": "cheapest column clearing tier-3 extraction at your quality bar" },
    { "provider": "anthropic", "model": "claude-opus-4-8", "endpoint": "vertex",
      "score": 96.3, "clears_difficulty": true, "reason": "escalation target" },
    { "provider": "google", "model": "gemini-3.1-pro", "endpoint": "vertex",
      "score": 92.8, "clears_difficulty": true, "reason": "cross-family alternative" }
  ],
  "check_spec": { "type": "json_schema", "ref": "checks/extraction/v3" },
  "constraints_met": true,
  "violations": [],
  "recommendation_id": "rec_01J...",
  "matrix_version": "2026-07-01",
  "measured": true
}
Layer 3 · Accountability

Every decision leaves a trace

Each response carries a recommendation_id. The by-id history endpoint returns the full decision trace: classification with confidence and method, the pool and allowlist applied, mode and weights, every surviving column with its query-time score, and every excluded column with the reason it never competed. "Why did it pick Haiku over Opus?" resolves directly from this record.

Prompts are fingerprints, not files

Prompts are never stored by default. Each request is fingerprinted with an HMAC-SHA256 keyed per tenant — one-way, exact-match only, and untestable without your key. The same prompt always produces the same fingerprint, so the audit log can answer how often an exact prompt arrived and how it was classified each time, without holding the prompt itself.

When you genuinely need to see what the classifier saw, debug capture is a time-boxed window during which prompts are stored encrypted, access-logged, and hard-deleted at expiry. Off by default, scoped to one API key or to low-confidence classifications, and refused entirely for tenants whose configuration promises zero retention.

The loop closes itself

You never report anything. The SDKs and gateway plugins observe what production did with each pick — success, parse failure, escalation, latency — and batch it back as fire-and-forget telemetry, keyed to the same recommendation_id. Recommendation, decision trace, and real-world result land in one ledger, per tenant, queryable, without a single customer-side integration.

Telemetry is opt-out, and off means off — zero calls home. The only consequence is stated, never punished: without observed outcomes, your rankings stay purely benchmark-driven.

See it against your workloads.

Early access tenants get onboarding with real traffic, not a sandbox demo.

Request early access