Method

How the audit works, and where it stops

1. Collect

Every OpenRouter endpoint of a model is pinned (no fallbacks to other providers) and sent the same requests: 48 general-purpose prompts at temperature 0 (greedy), the same 48 at temperature 1 with top_p 1 (sampled), and four greedy prompts twice more (determinism). Separate sets cover long context (4k-32k tokens with a planted fact) and edge cases (one-word prompts, exact formats, JSON, emoji, non-Latin scripts, code). Reasoning models are asked for low effort and their reasoning text is kept.

2. Reference runs

The same prompts go through local runs that land in the same format and are scored identically:

Honest machines agree across vendors: the same gpt-oss-20b weights on an NVIDIA RTX 4090 (CUDA), an Intel Arc Pro B70 (Vulkan, Linux), an AMD Radeon AI PRO R9700 (Vulkan, Windows) and a Grace CPU land at regret 0.0013-0.0035, against the substitute's 0.25. On Qwen3.8-27B the R9700 running the referee's own file differs on 0.5% of tokens, all near-ties.

The referee itself has to be checked too. Our first gpt-oss-20b referee, a DGX Spark, was ten times noisier than that: on Blackwell GPUs llama.cpp processes prompts in MXFP4 activations, which against the model's reference implementation (Hugging Face transformers, BF16) picks a different top token on 7% of positions instead of 2%. It made every gpt-oss-20b endpoint look like honest noise. Rescored on an RTX 4090, the endpoints spread from fidelity 97 to 61. The other models' referees use 8-bit weights, which do not take that path.

3. Replay on a referee

The exact prompt tokens are rebuilt with the model's own chat template; the reply's tokens are recovered from the provider's logprobs when available (re-tokenizing text can split differently). One forward pass of the real weights over prompt and reply gives, at every position, the model's full next-token distribution. From that:

Intervals come from resampling whole replies (tokens within a reply are correlated).

4. Checks that need no referee

5. Cooperative mode

Providers that opt in return a signed receipt with every reply: exact prompt and output token ids and top-20 probabilities, sampled with a public rule from a seed the client picks. The client checks the signature, its own prompt, the seed, the sampling rule and the text exactly, and can audit any span on a referee; audit spans are chosen only after the receipt exists, so the provider can't anticipate them.

What it costs, measured with llama.cpp on a DGX Spark (gpt-oss-20b): the rule runs inside the engine and stays within a few percent of normal throughput when its per-request work is spread over CPU cores; the reference server serves 16-32 verifying clients at 134-142 tokens/s with continuous batching, every reply checked; a receipt is about 700 bytes, and the full trace (about 0.4 KB per token) is sent only when a reply is challenged. Auditing runs at about 2.5x the generation rate, so at a 5% spot-check rate one referee GPU covers roughly fifty generating GPUs.

What the checks cannot prove

Reproducing

Everything here comes from the llm-verification repository: an OpenRouter collector, a small llama.cpp front end that scores replies with full-vocabulary statistics, the report and site builders, and 140 tests (including fuzz tests and regression tests for an independent red-team review). Referees ran on an M5 Max (Metal) and a DGX Spark (CUDA); the vLLM BF16 reference ran on a rented RTX PRO 6000.

Overview · Results · Case studies