Wrong Numbers Book an audit

The number looks fine.
Nothing raises.
It is still wrong.

Book an audit — from $5,000

Wrong Numbers LLM eval & cost correctness audits ( fixed fee, worldwide )

( Bengaluru · IST ) Fixes merged at UK AISI inspect_evals · EleutherAI · TruLens · Pydantic GitHub / LinkedIn

( The problem )

Your eval passed.
Is the number right?

A metric with no samples reported 0.0. A 100-token request with 75 cached totalled 175. Bedrock calls were costed at zero. None of it crashed. The value stays plausible, nothing raises, and the decision you make from it is wrong.

Wrong Numbers is an audit practice for LLM evaluation and cost accounting code, run by Arthi Arumugam. It checks the code that turns model outputs into scores, or tokens into dollars, against a known-answer test or the provider's invoice, and delivers each defect as a failing test with the fix. The recurring finding across 26 merged upstream fixes: the counts look right, the score or the dollars are wrong, and nothing raises.

fixes merged upstream
26
open-source organisations
14
merged into UK AISI inspect_evals
8
fewer bytes scanned by a production agent
94%

( Motion · 17 seconds )

Anatomy of
a wrong number.

An eval dashboard reports accuracy 0.00 and a passing gate. A scan shows none of the 412 samples were scored, so the true value is nan and the gate fails closed. Then a token bill: input already includes 75 cached tokens, the endpoint adds them again for a total of 175, and the fix brings it to 100. The number looked fine. Nothing raised.

( Evidence )

Wrong numbers look fine.
That is the whole problem.

Every row is a merged pull request in someone else's repository. Each produced a clean-looking number, and most shipped with a test that fails on main.

  1. (01)

    Eval scoreUKGovernmentBEIS/inspect_evals #2174

    A metric with no samples reported 0.0

    Nothing was scored, yet the report showed a model that got everything wrong.

    Before:0.0After:nan

  2. (02)

    Costogx-ai/ogx #6415

    Cached tokens were counted twice

    The Anthropic-compatible endpoint copied OpenAI's inclusive prompt tokens into Anthropic's exclusive input tokens, then added the cache read on top.

    Before:175After:100

  3. (03)

    Eval scoretruera/trulens #2726

    The judge's scale was read as its rating

    When an LLM judge restated its scale, the parser took a number from "1 to 10" instead of the verdict.

    Before:1–10After:verdict

  4. (04)

    Costpydantic/logfire #2162

    Bedrock calls were costed at zero

    Bedrock calls were priced under the wrong provider, so those calls cost nothing on the dashboard.

    Before:$0.00After:priced

  5. (05)

    Eval scoreUKGovernmentBEIS/inspect_evals #2097

    Truncated reasoning was graded as the answer

    When output hit its length limit mid-thought, the half-finished reasoning was scored as the response.

    Before:cut-offAfter:answer

  6. (06)

    Metricdbt-labs/metricflow #2114

    One metric, two different values

    A query reducer re-evaluated a UUID at every reference. A conversion rate read 0.5 alone and 0.75 beside its own input metric.

    Before:2 valuesAfter:1 value

View all 31 findings

( Five ways in )

Fixed scope. Fixed fee.
No retainer.

No discovery-call theatre. Every engagement ends with a check that fails the next time the number goes wrong.

Is the score right? ( 03 )

  • E1

    Eval Integrity Audit

    From $5,000

    I take the eval suite you already run and check whether its numbers mean what you think they mean.

    • Scorer and metric correctness, including empty denominators
    • LLM-as-judge parsing, scales and failed ratings
    • Truncated output scored as an answer
    • Ground-truth alignment and sample counts
    You get

    A findings report with the real numbers, a fix for each, and a regression test.

    Ask about this audit
  • E2

    Eval Suite Build

    From $10,000

    Evals designed around your product's real failure modes, not a leaderboard's.

    • Ground-truth datasets and scoring rubrics
    • LLM judges whose parsing fails closed
    • Built on inspect_evals, lm-evaluation-harness, TruLens or your stack
    • Metrics that say nan, not 0.0, when nothing was measured
    You get

    A working eval suite in your repo, documented, with a baseline run.

    Ask about a build
  • E3

    Agent Regression Gates

    From $5,000

    Catch the agent run that quietly stopped calling a tool, before your users do.

    • Run diffs by tool calls, arguments, outputs, latency and cost
    • Imports from JSONL, OpenTelemetry, Langfuse and LangSmith
    • A GitHub Action that breaks CI on the gates you choose
    • Built on whatbroke, my open-source run-diffing CLI
    You get

    Gates live in your CI, tuned to your agents, with a runbook for your team.

    Ask about gates

Is the bill right? ( 02 )

  • C1

    Cost Reconciliation Audit

    From $5,000

    For teams whose reported LLM spend doesn't match the provider invoice.

    • Every provider adapter in your path, and whether its usage object is read whole
    • Cache-token conventions, which differ per provider and are routinely mixed
    • Streaming paths, where accumulated usage is overwritten by a final delta
    • Retries that are billed but never logged, and stale pricing tables
    • OpenTelemetry spans, so usage survives the trip to the dashboard
    You get

    A reconciliation report against your invoice, pull requests each carrying a test that fails before the fix, and a CI gate.

    Ask about reconciliation
  • C2

    Revenue Assurance

    $10,000

    For products that bill customers by usage: per token, per credit, per call.

    • Metered consumption against what you actually invoiced, customer by customer
    • Under-billing, which is revenue you already earned and never charged for
    • Over-billing, which is refund liability and a trust event waiting to happen
    • Cost basis against your own provider invoices, so per-customer margin is real
    • Rating logic: tiers, minimums, overages, credits, free-tier boundaries
    You get

    A signed reconciliation you can hand a CFO, board or acquirer, the recovery figure in your own numbers, and the CI gate.

    Ask about revenue assurance

Revenue assurance is a mature discipline in telecom, invented because metered billing at volume goes silently wrong and costs a fortune. AI products have identical exposure and almost no practice around it. I ran the regulated version: monthly filings across 8 US states, reconstructed from 18 months of history, zero regulatory failures.

( The record )

Merged where the industry
measures itself.

UK AI Security Institute / Snowflake TruLens / EleutherAI / Pydantic / dbt Labs / Mistral AI / LiveKit / Pipecat / deepset / Roboflow / mcp-use / ogx / respan / Unsloth

26 pull requests merged across 14 organisations, nearly all one defect class: a score, a token count or a cost that came out wrong while nothing raised. Every one is public.

( Credited )
Co-author credit on OpenAI's Agents SDK fix for responses.compact calls that were billed but left out of run totals. I reported it and wrote the first fix.
( Accepted )
NVIDIA NeMo Evaluator accepted my design for failing closed on unscored samples, and asked me to build it.
( Co-wrote )
inspect_evals' convention for what a metric reports when its denominator is empty.
See the full index
  1. 2026-07-30pipecat-ai/pipecat #5163Count cached input tokens in total_tokens for Anthropic and Bedrock
  2. 2026-07-31UKGovernmentBEIS/inspect_evals #2036Restore the denominator on confidence and apologize_rate
  3. 2026-08-02livekit/agents #6663Count cached tokens in Bedrock's prompt_tokens
  4. 2026-08-04deepset-ai/haystack-core-integrations #3717Include cached tokens in the OpenAI-compatible prompt_tokens
  5. 2026-08-07UKGovernmentBEIS/inspect_evals #2097Stop scoring truncated reasoning as the model's answer
  6. 2026-08-18mcp-use/mcp-use #2127Count Anthropic cache tokens and stop message_delta erasing usage
  7. 2026-08-19UKGovernmentBEIS/inspect_evals #2123Stop reporting a stereotype score built from samples that were never scored
  8. 2026-08-19ogx-ai/ogx #6415Stop counting cached tokens twice in the Anthropic-compat usage
  9. 2026-08-21UKGovernmentBEIS/inspect_evals #2174Return nan rather than 0.0 when a metric has no samples
  10. 2026-08-24dbt-labs/metricflow #2114Keep non-deterministic expressions materialized in the sub-query reducer
  11. 2026-08-25truera/trulens #2726Stop reading a judge's stated scale as its rating
  12. 2026-08-27pydantic/logfire #2162Price Bedrock calls under the aws provider
  13. 2026-08-31EleutherAI/lm-evaluation-harness #4068Report a sample count that does not depend on metric order
  14. 2026-09-15truera/trulens #2748Refuse a score list that does not match the labels in recall and precision

( Method )

Explain the number
before changing it.

  1. 01

    Reproduce

    Hold the model, prompts and tool schemas constant, and rerun until every number is accounted for, against a known-answer test or your provider's invoice.

  2. 02

    Measure

    A baseline noise check first, then the real numbers, with the limits of the measurement written down.

  3. 03

    Fix

    A pull request for each finding, with a test that fails on the old behaviour and passes on the new.

  4. 04

    Gate

    Checks wired into CI, so the next wrong number fails the build instead of reaching a decision or an invoice.

The thirteen recurring shapes, one after another: cache-token exclusion; a guard that filters a legal value; silent-zero metrics; a denominator that does not match what was counted; the fix lands on some twins and not others; a schema default scored as a disagreement; truncation scored as the answer; aggregate written where the per-sample value belongs; pricing tiers unreachable or mis-modeled; missing price data, and cost silently dropped; config accepted and silently ignored; a merge or copy that drops or corrupts usage; the same silence, somewhere other than a number.

( The field guide )

One bug class,
documented case by case.

Wrong Numbers is a public field guide to eval scores, token counts and costs that come out wrong while nothing raises: 31 long-form write-ups, each reproduced against an installed package, sorted into thirteen recurring shapes, each with the question that finds it.

( Defect notes )

( Questions I am asked )

What you see,
and what usually causes it.

My Anthropic bill beats my dashboard. Why?

Cached tokens, usually. Anthropic reports cache_read_input_tokens and cache_creation_input_tokens separately from input_tokens. Libraries that sum only input and output silently omit cache activity, so every cached request under-reports itself. Found and fixed in Pipecat, LiveKit, mcp-use, Haystack and Llama Stack. The other three recurring causes are a stale pricing table, streaming code that overwrites accumulated usage with the final message_delta, and failed-then-retried calls that are billed but not logged.

Read more

My eval score reads 0.0 instead of failing. Why?

An empty denominator. When a metric measures nothing, dividing by zero samples is often guarded by returning 0.0 rather than nan. But 0.0 is indistinguishable from a model that genuinely scored zero, so the run looks complete and the number is wrong. Reporting nan makes it raise.

How do I check my own stack in ten minutes?

Send one request with a known cache hit and compare three numbers: what your metering recorded, what the provider's usage object returned, and what the provider's cost report shows for that day. If the three disagree, the direction of the gap names the defect. billproof does this comparison automatically for Claude Code, Codex and Gemini CLI transcripts.

Read more

What is an LLM cost reconciliation audit?

A fixed-price review of the code that turns model usage into dollars, checked against the provider's own invoice or usage report. The deliverable is a set of failing tests, one per defect, each with the fix. It starts from $5,000 for a codebase; revenue assurance, for a product that bills its own customers per token, is $10,000.

The same metric differs between queries. Why?

Usually non-determinism inside a query reducer. If an expression is re-evaluated at every reference rather than materialised once, rows that should group together don't, and any de-duplication downstream keeps exactly what it exists to remove.

We bill customers by usage. Why does this matter?

Because the same defect that makes your dashboard wrong makes your invoices wrong. If your metering under-counts, you are giving away revenue you already earned. If it over-counts, you have refund liability and a trust problem. And if your cost basis is wrong, per-customer margin is fiction, so every pricing decision rests on a number nobody verified.

We have a data team. Why bring someone in?

Because this defect class never surfaces as an incident. Nothing pages, no test goes red, and the number stays plausible, so it is never anyone's top priority until it shows up as an invoice or a published benchmark that will not reproduce.

Where are you based, and how does this work remotely?

Bengaluru, IST. The engagement is deliverable-based and async-first: your repos, your invoices, a written reconciliation, with a kickoff and a findings call scheduled in the overlap, which is all of the UK/EU working day and US East until midday. Every merged fix on this page shipped from here into US, UK and EU codebases. Invoices in USD.

( Who does the work )

Arthi Arumugam.
Fussy about numbers.

AI engineer with a data engineering foundation. Day to day I build and operate data pipelines on BigQuery at Lumen, where I shipped a production agentic system on Vertex AI with structured-output validation as a hard gate, and own monthly regulated filings across 8 US states. That is where I got fussy about numbers that are wrong while nothing fails.

Evaluation
inspect_evals, lm-evaluation-harness, TruLens, LLM-as-judge, ground-truth evaluation
Cost & usage
Token and cache accounting across OpenAI, Anthropic, Gemini and Bedrock; OpenTelemetry, Langfuse, LangSmith
Certified
Google Cloud Professional Data Engineer · Azure Data Engineer Associate · Microsoft Fabric Data Engineer Associate
Education
M.Sc. Management, Queen Mary University of London · B.Tech Information Technology, Anna University

( Send me a number )

Let's find
the wrong number.

Tell me which providers, libraries and eval harnesses sit in your path and I'll tell you where to look first, before you engage me.