certhead
An output head that returns the token a dense head would have returned — and can show you why.
A language model's output head is a big matrix. Reading less of it is easy; reading less of it and still being right every time is the part that needs an argument.
certhead reads a coarse version of every vocabulary row, derives a certified interval for each row's score, discards the rows that provably cannot win, and refines only the survivors. When the intervals fail to separate, it computes the dense product rather than guess.
That last clause is the whole design. certhead can be slow. It cannot be wrong.
pip install git+https://github.com/nickharris808/certhead@v0.1.0
The comparison that is actually the point
Reading 5 bits per row is not novel — that is just quantization. The claim is what the same bytes buy you.
On the real Qwen2.5-0.5B-Instruct output head (V=151,936 × d=896), over 1,552 hidden states
captured from seven kinds of prompt, at an identical byte budget:
| wrong tokens | can it tell you which ones? | |
|---|---|---|
| quantized argmax | 151 / 1552 — 9.7% [8.3%, 11.3%] 95% CI |
no |
| certhead | 0 / 1552 | n/a — it returns the dense token |
The first token the quantizer got wrong: it said token 374 where the truth was 1887. It had no
way to know, and neither did anyone downstream.
HONEST SCOPE
Matched pairs. Each line says what is established and what is not.
| What certhead does establish | What it does not |
|---|---|
Returns the identical token to argmax(Wh), always |
This is structural, not measured — it holds because of the dense fallback. The 0/1552 is a self-check on the implementation, not the source of the guarantee |
| At 5-bit coarse, reads a median 15.8% of head bytes | 15.8% is essentially the closed form, not a pruning result — see below. Read that section before quoting the number |
| A quantized head at the same budget is wrong on 9.7% of tokens | On one model, one head, one 1,552-state corpus. Nothing here generalises to another vocabulary or hidden size |
| 5 bits is the minimum coarse width at which the bound separates for this head | That minimum is a property of this model's score-margin distribution. It is the genuinely measured quantity, and it is model-specific |
| Wall time on an MLX microbenchmark fell to ~0.52× dense | The proportionality test FAILED and no speedup is claimed. See "Do the bytes become time?" |
| Bytes read are counted, exactly, deterministically | No FLOPs, no memory-bus counters, no end-to-end serving latency is measured anywhere |
Read this before quoting "15.8%"
Every row must be read at least once, so the byte cost has a hard floor:
bytes / dense ≈ coarse_bits/32 + (survivors/V) × (refinement + dense)
At 5 bits the measured median is 0.1582 and the floor is 0.1574. The excess is +0.0009.
In other words, at the width that works, the second term has almost vanished and the number you
get is the floor — which is computable in advance from coarse_bits and d, without a GPU and
without this library.
This is stated up front because the previous version of this measurement was retracted for exactly that defect. v1.0 of the harness reported a median of 0.237 as though it were a pruning result. It was not: at a 2-bit coarse stage the certified interval had half-width ~85 against a score gap of ~21, so the coarse scan pruned 0 of 151,936 rows. Reading 8 bits of every row and eliminating nothing is not branch-and-bound; it is 8-bit quantization, and 8/32 = 0.25 was the number being reported. The retraction is recorded in the harness's own docstring, and this portfolio has retracted a headline for the same reason before.
So what is measured? The sweep, which is not predictable in advance:
| coarse bits | median bytes | floor | excess | fallback rate | certhead wrong | quantized wrong |
|---|---|---|---|---|---|---|
| 2 | 0.1898 | 0.0636 | +0.1262 | 23.9% | 0 | 1211 / 1552 |
| 4 | 0.2232 | 0.1261 | +0.0971 | 6.2% | 0 | 293 / 1552 |
| 5 | 0.1582 | 0.1574 | +0.0009 | 3.4% | 0 | 151 / 1552 |
| 6 | 0.1886 | 0.1886 | +0.0000 | 1.4% | 0 | 83 / 1552 |
| 7 | 0.2199 | 0.2199 | +0.0000 | 0.5% | 0 | 40 / 1552 |
| 8 | 0.2511 | 0.2511 | +0.0000 | 0.3% | 0 | 14 / 1552 |
The curve has a minimum at 5 bits, and that is the finding. Below it the bound is too loose and fallbacks dominate (2-bit costs more despite reading a quarter the bytes). Above it you are simply paying for a wider floor. Where that minimum sits is a fact about the model, discoverable only by measuring.
The distribution is narrow — p90 0.1627, max 0.1998 — and flat across prompt kinds (median 0.1576 for code, 0.1591 for deliberately ambiguous text). A method whose cost varied wildly by input would be more interesting; this one does not, and saying so is more useful than a mean.
Do the bytes become time?
Pre-registered answer: not proportionally. experiments/certhead/bench_mlx.py, Apple Metal,
batch 1, the real head shape:
| median time | bytes | effective bandwidth | |
|---|---|---|---|
| dense fp16 | 1.47 ms | 272 MB | 185 GB/s |
| certhead (2% survivors) | 0.76 ms | 83 MB | 109 GB/s |
(Absolute times are one machine on one thermal day and drift ~10% between runs; the ratios are what repeat, and they are what the verdict is decided on.)
Time fell to 0.52× while bytes fell to 0.30× — a proportionality gap of 1.70–2.01 across
5 independent repeats, against a threshold of 1.5 fixed before the benchmark was first run.
Verdict: BYTES_DID_NOT_BECOME_TIME, decided on the worst repeat.
The diagnostic is the bandwidth column. Dense saturates the memory system; every certhead configuration runs at roughly 60% of that rate, which is the signature of a step that costs time without moving the counted bytes — here, the survivor compaction.
This repository does not promote that 0.52× to a speedup claim, and the threshold was not retuned after the numbers came in. It is one matvec on one machine at batch 1; the one time this portfolio measured serving end to end, it got 0.997×. The counting claim is the one meant to carry weight, and it survives the negative intact.
30-second quickstart
certhead verify # the oracles that establish the invariant
certhead demo # one certified argmax, explained
$ certhead demo
synthetic head: V=4,096 d=128, coarse=5 bits
winner ................. token 1701
exact score ............ 35.029769
established by ......... proven_by_bound
max pruned upper bound 34.355208
margin ................. 0.186021
refinement stages ...... 2
head bytes read ........ 346,036 of 2,097,152 (16.5%)
survivors per stage .... [29, 1]
matches dense argmax: True
In your own code
import numpy as np
from certhead import compile_head, argmax_certified, dense_argmax
W = np.random.default_rng(0).normal(size=(4096, 128)) # your output head
head = compile_head(W, n_stages=3, tile=8, coarse_bits=5)
h = np.random.default_rng(1).normal(size=128) # a hidden state
cert = argmax_certified(head, h, W)
assert cert.winner == dense_argmax(W, h) # always true, by construction
print(cert.method) # 'proven_by_bound' or 'dense_fallback'
print(cert.byte_fraction) # may exceed 1.0 — see below
print(cert.margin) # None on a fallback: no claim the run did not earn
byte_fraction can exceed 1.0 and is deliberately not clamped. A bound too loose to prune
anything costs the coarse scan, every refinement, and the dense read on top. At 1-bit stages that
is ~1.28× dense, measured. Hiding the method's worst case behind a clamp would be its own dishonesty.
How the invariant is established
Not by sampling. A bound-based method fails exactly when two scores are nearly equal, and near-ties are vanishingly rare under any natural distribution — so a sample is drawn from precisely the region where the method cannot fail. (The sibling benchmark in this portfolio measured that effect: sampling 24% of a fully enumerable domain still admitted a one-input defect four times in five.)
So three oracles, in descending order of what they are worth:
whole_domain— enumerates a small head exhaustively (81 of 81 points) and assertsn == domain_sizeat the end, so a truncated sweep cannot report itself as complete.adversarial— constructs the hard cases rather than waiting for them: exact ties solved fromh · (wᵢ − wⱼ) = 0, then ties at 1 ULP, 1e-12, 1e-9, 1e-6, 1e-3 either side. The fallback must fire, and the suite fails if it never does.random_probe— labelled in its own output as NOT evidence of exactness, and kept only because it exercises realistic shapes the tiny exhaustive head cannot.
If you insisted on reading the 1,552-state agreement as a statistic: 1,552 trials with 0 failures rejects every rate at or above 0.0019 at the 95% level (Clopper–Pearson, exact). That bound is weaker than the structural argument, which is why the structural argument is the one quoted.
Exit codes
| code | meaning |
|---|---|
0 |
checked, and the invariant holds |
1 |
checked, and a disagreement was found |
2 |
not checked — abstain, unreadable input, or a missing dependency |
2 exists so that "we could not check" can never be misread as "it passed".
Licence and the commercial boundary
Apache-2.0, and LICENSE-TAG is CLEAN — but for a different reason than the
other packages in this portfolio, which are clean because they only measure. certhead is clean
because it computes the identical function: an equivalence-preserving rewrite that admits
nothing, refuses nothing, and gates nothing. CLAIMS-MAP.md makes that auditable
rather than asserted, including the strongest objection to it.
A certificate-carrying admission gate — one that withholds a physical resource when the evidence does not support the bound — is a separate, commercially licensed product.
Reproducing the numbers
pytest -q # 17 tests
certhead verify # the three oracles
python experiments/certhead/run_bytes.py # the sweep table (~31 min, needs a GPU/MPS)
python experiments/certhead/bench_mlx.py # the traffic verdict (Apple Metal)
run_bytes.py refuses to pad: an earlier version repeated hidden states to reach a requested
--n, which inflated every denominator with inputs carrying no new information. It now reports how
short the corpus actually is and stops.
Certificates: results/data/certhead/bytes_cert.json
· results/data/certhead/mlx_traffic_cert.json
The rest of the portfolio
25 artifacts, one idea: a measurement you cannot check is a press release. Every tool here reports; none of them gates.
Tools
abstain-bench |
how often does a verifier pass input it could not check? |
evidence |
run the whole portfolio over your repo — the weakest leg, never the mean |
floorgen |
what must your system remember? an exact lower bound |
formal-proof-mcp |
a proof kernel for your coding agent |
gatecount |
exactly how many states does removing this check admit? |
gridlock |
certify a wait-for relation cannot wedge |
honestbench |
measure your CI's escape rate |
kvleak |
cross-tenant leak scanner |
kvprobe |
model-substitution detector with a measured FPR |
preregister |
refuses to seal a plan whose conclusion is already fixed |
proof-carrying-ci |
the whole portfolio as one CI check, with SARIF |
proof-to-code-drift |
fail the build when the proof stops matching |
sf-verify |
re-derive admission decisions offline |
signoff-cert |
certificates that carry their own false-pass bound |
tokencount |
a token count both parties can recompute |
Benchmarks — each recomputes one of our own published numbers from its certificate
illusion-bench |
how many broken kernels does your oracle admit? |
kv-reuse-econ-bench |
recompute our economics headline |
llm-tenant-isolation-bench |
recompute our isolation figures |
Datasets
abstain-corpus |
32 inputs a verifier must NOT pass |
kv-reuse-econ-traces |
per-workload reuse accounting + the closed form |
kv-tenant-isolation-bench |
isolation observations, uninterpretable rows included |
llm-precision-fingerprints |
precision-labelled logprobs with a negative control |
Try it in a browser — no install, no GPU
negative-results-atlas |
ten claims we took back |
tenant-leak-demo |
the residency calculator |
wait-for-visualiser |
paste a wait-for graph, see the cycle |
Documentation
Everything above, explained in one place: https://nickharris808.github.io/evidence-docs/ —
the tutorial,
what this proves and what it does not,
and a CLI reference generated by
running --help on every published command.
The commercial edition
Everything above is measure-only and Apache-2.0: it tells you what is true and never acts on it. The enforcement side — binding a partition key at the admission decision, the compiled gate corpus, and the certificate-issuing faucet — is covered by filed patents and licensed separately.
Reading is free. Enforcing is licensed.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file certhead-0.1.0-py3-none-any.whl.
File metadata
- Download URL: certhead-0.1.0-py3-none-any.whl
- Upload date:
- Size: 29.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.2.0 CPython/3.11.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1e1c2fd29cebd16d4bff08aa1f5b085005f3b6c2e698d49ac458f4dec5829768
|
|
| MD5 |
eeb93caec19523720601287084772bd7
|
|
| BLAKE2b-256 |
b901cdbfc50f10e9490018063266c35b33236033b94e3dd1aeb91a655c92bb07
|