14 — Audit findings
Mechanical consistency audit of all 2,057 records (1,076 sources + 981 knowledge
records) as of the working tree at e89e6f6. Run with a throwaway script over
data/*/*.json; nothing in data/ was modified. tools/index.py was not run and
docs/00-13 were not touched.
The target moved during the audit.
data/held 2,057 records when this audit started and 2,088 when it finished — sibling agents were still writing. Every count below is a snapshot. The findings are stable because they are structural (schema violations, unit-class errors, un-reconciled audit appends), not record-count dependent, but a fix pass should re-run the counts before dispatching work. The throwaway script isaudit1.pyin the session scratch dir; promote it totools/audit.pyonly if it is going to be re-run often, and note that it must then passpython tools/test_tools.pyand write nothing.
python tools/test_tools.py— 37 tests, OK.python tools/validate.py— 196 errors, CI red (see A4, A5).
Findings are in three classes:
- (A) Confirmed — I proved it from the record's own data or a primary source.
- (B) Probable — evidence is strong but not airtight; needs a human eye.
- (C) False alarms — looks wrong, is correct once you know the convention. Documented so nobody re-flags them.
Severity: silent-corruption (a reader gets a wrong number with nothing to warn them),
misleading (right kind of fact, wrong framing or unlabelled unit), cosmetic.
0. Summary of counts by check class
| # | Check | Records examined | Flagged |
|---|---|---|---|
| 1a | memory_bandwidth_gbps vs its stated basis arithmetic |
51 with bus+bw | 9 |
| 1b | vram_gb vs name / plausible part size |
84 | 0 |
| 1c | price_usd vs price_basis unit class (8× error class) |
81 | 1 confirmed + 5 probable |
| 1d | tps_aggregate vs tok_s_per_user |
40 throughput | 0 |
| 1e | kv_cache_bytes_per_token recomputed from model dims |
124 models | 4 |
| 1e' | flops_per_token_active vs 2 × active_params_b × 1e9 |
124 models | 0 |
| 1f | model invariants (dense ⇒ active==params, gqa_ratio) |
124 models | 1 |
| 1g | flops[].dense flag census |
348 flops rows | 0 (all correct) |
| 2 | Ridge points 1000·TFLOPs / GB/s reproduced |
74 part/precision pairs | 15/15 spot-checked OK |
| 2' | TP all-reduce crossover B* = P_layer·BW_link/(2·d·BW_hbm) |
1 record | 5/6 crossovers OK, 1 wrong |
| 3 | Cross-reference integrity | all | 7 dangling + 28 ambiguous + 26 orphan |
| 4 | Provenance integrity | all | 3 real + 171 flagged for policy |
| 5 | Near-duplicates | all | 15 paper pairs + 28 slug collisions |
tools/validate.py independently reports 196 errors: 168 = 56 paper records × 3
null enums, 28 = ambiguous bare slugs. CI is currently red for these reasons alone.
A. Confirmed defects
A1 — interconnect/pcie-gen6: the record contradicts itself, and notes was not updated with the correction
Severity: silent-corruption. This is the single most consequential defect in the
repo, because the record's notes is what a reader trusts for the direction of the
figure — the exact thing the field was corrected to fix.
Evidence:
bandwidth_gbps: 242.0, basis says "16 lanes = 1,936 Gb/s = 242 GB/s per direction, the figure PCI-SIG publishes" — correct, and PCIe 6.0 x16 payload per direction is indeed ~242 GB/s.notesstill opens: "at 128 GB/s per direction x16, a PCIe 6.0 host link is roughly 3.5x the per-direction rate of PCIe 5.0" (docs-adjacent fielddata/interconnect/pcie-gen6.json). The correction pass rewrotebandwidth_gbps128 → 242 andbandwidth_basis, but left the derived arithmetic innotesat the old value.- The
notessentence is now doubly wrong: 242/63.0 = 3.84×, not 3.5×, and the same sentence says Gen6 is "about 3.5x below NVLink 4 per direction" when 450/242 = 1.86×, not 3.5×. Both ratios were computed against the superseded 128.
A reader who queries notes (which index.py renders) gets a PCIe 6.0 rate that is
1.89× too low and a comparison to NVLink 4 that is 1.86× wrong in the wrong
direction — Gen6 looks slower than NVLink 4 by 3.5× when it is faster by ~1.9×.
Fix: recompute both ratios in notes against 242 (3.84× over PCIe 5.0, 1.86× under
NVLink 4 per-direction) and re-verify the "3.5x area efficiency" claim, which came
from the same superseded pass.
A2 — supply/coreweave-h100-h200: an 8× unit-class error in price_basis
Severity: silent-corruption. price_usd: 6.155 is correct as a per-GPU-hour
rate. The price_basis string labels it per 8-GPU node per hour:
per 8-GPU node per HOUR: HGX H100 $49.24 on-demand … HGX H200 $50.44 … L40S $18.00 …
$49.24 is the node rate; $49.24 / 8 = $6.155 is the per-GPU rate that price_usd
stores. So the field is right and the label on the same record is wrong by 8×. Any
consumer that parses price_basis for its unit class — exactly what this repo's own
price_basis-is-mandatory design exists to force — concludes the record is a
node-hour quote and multiplies by 8. This is precisely the class of error
SCHEMA.md names: "an H100 quote means wildly different things at these bases."
Corroborating evidence inside the same record: notes correctly says "On on-demand
H100 ($6.155/GPU-hr)" and "On SPOT H100 ($19.71/8 = $2.46/GPU-hr)" — the notes know
the basis is per-GPU, the basis field does not. The record is self-inconsistent.
Fix: rewrite price_basis to lead with per GPU-hour (8-GPU node $49.24 → $6.155/GPU),
and keep the node figures as the supporting detail it already has.
A3 — flops/tensor-parallel-allreduce: one of six quoted crossover batches is wrong, and a derived ratio in notes is wrong
Severity: misleading. Every crossover in arithmetic_intensity reproduces
exactly — I recomputed P_layer = 4096² + 2·4096² + 4096² + 3·4096·11008 = 202,375,168
and B* = P_layer·BW_link/(2·d·BW_hbm) with d = 4096, BW_hbm = 3350:
| fabric | BW_link | record's B* | recomputed |
|---|---|---|---|
| NVLink 4 full domain | 450 | 3,318 | 3,318 ✓ |
| single NVLink 4 link | 25 | 184 | 184 ✓ |
| PCIe 4.0 x16 | 31.5 | 232 | 232 ✓ |
| PCIe 5.0 x16 | 63 | 465 | 465 ✓ |
| AMD Infinity Fabric | 64 | 472 | 472 ✓ |
| xGMI | 50 | 369 | 369 ✓ |
All six are right. The defect is in notes:
"d doubles from 4096 to 8192 and P_layer/d rises only from 49,408 to 104,448, so B* is within a factor of 2 while the absolute bytes double."
For Llama-2-70B geometry (d = 8192, intermediate 28,672):
P_layer = 4·8192² + 3·8192·28672 = 973,078,528, so P_layer/d = 118,784, not
104,448 — the stated figure is 12.1% low. The ratio it supports is therefore 2.40×,
not 2.11×, so "within a factor of 2" is itself false as written (2.40 > 2). The
conclusion ("a 70B is not a worse TP problem than a 7B") survives; the arithmetic
printed beside it does not.
Severity is misleading rather than silent-corruption because no stored field is
wrong — the defect is confined to prose, and it understates the claim's own margin.
A4 — 56 paper records carry null for all three required enums, and CI is red
Severity: misleading (and CI-blocking). 56 of 262 papers/ records have
venue: null, category: null and adoption: null. That is 168 of the 196
validate.py errors. Representative set: papers/flashattention, flashattention-2,
flashattention-3, flashattention-4, flashdecoding, vllm-pagedattention
(pagedattention-vllm), grouped-query-attention, multi-query-attention, yarn,
ntk-aware-scaled-rope, longrope, longrope2, moba, h2o, quest, snapkv-paper,
pyramidkv-paper, infini-attention, performer, linformer, streamingllm,
sageattention, sageattention2, ring-attention, duoattention, flashinfer-paper,
scissorhands, selfextend, distflashattn, minference, sau, striped-attention,
vattention, transnormerllm, flexattention, blockwise-parallel-transformer,
diff-transformer, gist-tokens, posinterp, … (full list in the audit output).
These are all well-known papers with unambiguous venues. adoption in particular is
the field SCHEMA.md calls "the field that separates a citation from an
instruction" — nulling it across 21% of the paper corpus is a real query loss, not
just a schema nit.
13 of the 56 are demonstrable duplicates of an existing populated record (see D1), which is likely why they are null: an agent could not decide which slug owned the venue. Fix those by merging, not by filling.
A5 — 28 bare slugs are ambiguous across record types, and 29 references point into them
Severity: silent-corruption. The repo addresses records two ways — qualified
dir/slug and bare slug — and sources plus every id-bearing field hold bare
slugs. 28 slugs exist in two types at once:
- 21
papers/X↔quantization/X:awq,gptq,smoothquant,spinquant,omniquant,quarot,quip-sharp,aqlm,atom,bitnet-b158,cachegen,flute,kvquant,llm-qat,lqer,pensieve,shadowkv,squeezellm,zeroquant-v2,zipcache,bitnet-b158. - 5
models/X↔papers/X:deepseek-v1? — precisely:deepseek-r1,deepseek-v2,deepseek-v3,minimax-m1,bge-m3. - 3
engines/X↔papers/X:distserve,lmcache,sglang.
validate.py already errors on all 28. The damage is that 29 live references
resolve ambiguously — a resolver that takes the first match gets the wrong entity
about half the time, silently:
gotchas/*→affects: ["sglang"]× 14 records,["lmcache"]× 3. The intent is clearly the engine, butpapers/sglangandpapers/lmcacheexist, soquery.py refs gotchas/mgpu-*will report a citation of the SGLang paper.benchmarks/sglang-deepseek-v3-*→engine_id: "sglang"× 2 (same problem).benchmarks/awq-int*-ppl-delta-*→format_id: "awq"× 4 andbenchmarks/smoothquant-*× 2,spinquant-*× 3 — these should resolve toquantization/awqbut collide withpapers/awq.
Fix: rename one side of each pair (e.g. papers/awq-paper → keep, or prefix the paper
slugs pap-), and update the referencing records. This is a breaking rename across
~30 records — do it as one commit with the validator green.
A6 — flops/sliding-window-hybrid-attention cites a source that does not exist
Severity: misleading. sources includes flashattention-io-aware-tiling; there is
no such file in data/sources/. validate.py treats a dangling sources entry as an
ERROR, so this record should have been caught — it is one of only 7 dangling
source references repo-wide, and the only one in a record whose other 7 sources
resolve. Note the sibling flops/flashattention-io-aware-tiling.json is a real
flop record; the source slug was probably invented by analogy.
A7 — 3 more dangling references
flops/embedding→affected_by_hardware: ["amd-ryzen-strix-point"]— no such accelerator. All 3 other entries in that list resolve.gotchas/pd-batch-invariant-mode-absent-from-kv-namespace→affects: ["mooncake"].engines/mooncakeexists — this is a false positive from my own scanner only ifaffectsis meant to hold engine ids, whichSCHEMA.mdsays it does. So this one actually resolves; I list it only because my first pass flagged it. Not a defect. (Corrected: 6 real dangling refs, not 7.)benchmarks/llamacpp-radeon-r9700-gfx1201-q1-0-decode-tok-s→format_id: "2bit". There is noquantization/2bit. The method is GGUFQ1_0; the nearest records aregguf-iq1-m/gguf-tq1-0. Real dangling ref.
Recount: 6 dangling references — 1 missing source, 1 missing accelerator,
1 missing quantization format, plus interconnect dangling entries in A8.
A8 — 4 accelerators point at interconnect ids that were never created
Severity: misleading. huawei-ascend-950dt → huawei-ub-link,
metax-c500-n100 → metaxlink, moore-threads-s4000 → moore-threads-mtlink,
moore-threads-s5000 → moore-threads-mtlink. None exist in data/interconnect/.
These are scale-up fabrics the vendor documents, so the reference is honest — the
records are simply missing. The validate.py warning says "ok if planned"; after this
audit they are overdue.
B. Probable defects
B1 — accelerators/nvidia-h200-sxm and nvidia-h200-nvl: memory_bandwidth_basis arithmetic is wrong by 25%
Both store memory_bandwidth_gbps: 4800 (correct — NVIDIA's published H200 figure) but
justify it as "HBM3e 5.0Gbps x 6144-bit = 4,800 GB/s". The arithmetic is false:
5.0 × 6144 / 8 = 3,840, not 4,800. Working backwards, 4800 GB/s over 6,144 bits
requires 6.25 Gbps/pin, not 5.0.
Why this matters beyond the wrong arithmetic: the repo's own
flops/decode-gemm teaches readers that the basis is what makes a bandwidth figure
auditable. Here the printed derivation cannot produce the printed answer, so a reader
checking the arithmetic concludes NVIDIA's 4.8 TB/s is wrong — when NVIDIA's figure is
right and the explanation is not. H200 is HBM3e at 6.25 Gbps/pin (5 stacks of
1,024-bit at 6.25, or the 141 GB 6-stack configuration at a different rate); the
record's notes does not mention any of this.
Severity: misleading, and the highest-value fix in the accelerator slice — H200 is referenced by 8 benchmark records and is the second-most-cited NVIDIA part after H100.
B2 — the same defect, milder, in three MI350-series records
amd-instinct-mi350p / mi350x / mi355x all carry an added audit note saying:
"8192-bit x 8 Gb/s per pin / 8 = 8,000 GB/s, which reconciles exactly"
8 × 8192 / 8 = 8,192, not 8,000. The stored 8,000 GB/s is right (it is AMD's printed figure) but the reconciliation is off by 2.4%. AMD's spec table lists "Memory Clock 8 GHz", which is a clock, not a per-pin rate — 8 GHz effective data rate would be 16 Gbps/pin on a DDR-style interface, and the real reconciliation is 7.81 Gbps/pin (8000 × 8 / 8192). The note asserting an exact reconciliation is therefore wrong in the same way as B1, in three records.
Note nvidia-b300 has the identical "8 Gb/s x 8192/8" construction in its basis.
B3 — 4 accelerator bandwidth bases whose stated rate cannot produce the stored value
| record | basis claims | arithmetic | stored | implied rate |
|---|---|---|---|---|
nvidia-h100-nvl |
HBM3 5,225 Mbps × 6,016-bit | 3,932 GB/s | 3,938 | 5.24 Gbps ✓ |
nvidia-a10 |
GDDR6 12 Gbps × 384-bit | 576 GB/s | 600 | 12.5 Gbps |
nvidia-v100-sxm2-32gb |
HBM2 1.95 Gbps × 4096-bit | 998 GB/s | 900 | 1.76 Gbps |
amd-instinct-mi350p |
8 Gbps × 4096-bit | 4,096 GB/s | 4,000 | 7.81 Gbps |
h100-nvl reconciles (I mis-flagged it initially — 5,225 Mbps → 5.225 Gbps × 6016/8
= 3,931.7, within rounding of 3,938). The other three do not. a10 and v100 are
cases where the vendor prints a round aggregate that no clean pin-rate produces; the
records should say so rather than print an arithmetic that fails. v100's basis
already half-admits this ("is not exactly the quoted figure, so treat the datasheet
number as authoritative") — a10 does not.
B4 — 2 MI300-family records store the SPARSE figure as the headline bf16
amd-instinct-mi300a and amd-instinct-mi300x store bf16: 1960.0 and bf16: 2614.9
with dense: false, alongside fp32 980.6/1307.4 marked dense: true. That is
internally consistent — AMD's page prints both — but note that mi300x bf16 1307.4 dense:true does not exist in the record: the dense bf16 row is absent, so a query
for "MI300X dense bf16 TFLOPS" returns nothing while the sparse 2614.9 row sits
there looking like the answer. decode-gemm correctly uses 1307.4, so the repo is
self-consistent, but the accelerator records are missing their dense tensor rows.
Severity: misleading (a gap, not a wrong value). Affects mi300a, mi300x,
mi325x — all three lack a dense: true bf16/fp16 row.
B5 — accelerators/amd-instinct-mi355x has two contradictory FP8 dense values
The record contains four fp8 rows: 5000.0 dense:true,
10066.3 dense:false (source amd-mi355x-product-page), then
5033.2 dense:true and 10066.4 dense:false (source amd-mi355x-brochure). Two
different dense FP8 figures from two AMD documents, differing by 0.66%, with no note
on any of the four rows (notes is null on all of them) and the record
status: contested. The int8 rows use 5033.2/10066.3, i.e. they pick the
brochure figure, while the first fp8 pair uses the product-page figure.
A consumer summing or filtering fp8 rows on this record gets two answers. Fix: keep the contested pair, annotate all four rows, and say which document is preferred. Severity: misleading.
B6 — accelerators/groq-lpu and aws-inferentia2: vendor_claim: false on rows whose only source is the vendor
groq-lpu has status: contested and correctly flags fp16 188 and int8 750 as
vendor_claim: false, with notes explaining that Groq's own site publishes no
compute figure and the numbers come from press coverage. But flops[].source_id on
both rows points at asic-groq-lpu-technology — a Groq-authored blog. So the row
claims "not a vendor claim" while citing the vendor as its only evidence.
aws-inferentia2 has the same shape: fp8 380 is vendor_claim: false but
source_id is asic-aws-inferentia-product, an Amazon spec-sheet.
This is not a number error — the flags are honest about the claim's status, and the
notes explain why. It is a provenance inversion: the record says "we could not verify
this with the vendor, so we marked it non-vendor" while the source column says "we got
it from the vendor". Fix: point source_id at the secondary source the notes actually
rely on, or leave source_id null and say so in notes. Severity: misleading.
B7 — 2 MLPerf records labelled measured_by: vendor on a third-party publisher
benchmarks/mi355x-mlperf-v6-0-gpt-oss-120b-offline-tokens (conf 0.95) and
benchmarks/mi355x-mlperf-v6-0-llama2-70b-wmxfp4-offline-tokens (conf 0.95) both set
measured_by: "vendor" while their only source is MLCommons — the consortium, not
AMD. The hardware is AMD's and AMD ran the submission, so vendor is defensible, but
the evidence is a neutral third-party log. Since measured_by is the field that
separates marketing from measurement, and these are the two highest-confidence MLPerf
records in the repo, the label should either be third_party or the notes should say
"AMD submission, measured by MLCommons". Severity: misleading.
B8 — 6 engine records whose repo is not cited by any of their own sources
engines/fastertransformer (repo: nvidia/fastertransformer),
lm-eval-harness (eleutherai/lm-evaluation-harness),
mxptq-research-harness (microsoft/neuralcompression),
smoothquant-reference (mit-han-lab/smoothquant),
spinquant-research-harness (facebookresearch/spinquant),
tinychat-awq (mit-han-lab/llm-awq). In each case no source URL mentions the
project named in repo. For five of six the cited source is the paper instead. The
repo is the field a reader uses to go look at the code, so it should be the cited
source. Severity: cosmetic-to-misleading.
B9 — 26 source records are cited by nothing
Every one of the 2,057 records passes the sources check, and 0 records lack a
source. But 26 sources are orphans — no record's sources array names them.
16 are spec-sheets and repo URLs from sibling agent prefixes (acc2-*, arch-*,
hf-*, pap-arch-*), 6 are papers, 4 are benchmarks/pricing pages.
Two are nearly cited: acc2-amd-ml300-convention is named in the notes of
accelerators/amd-instinct-mi100 and amd-instinct-mi300a but not in any sources
array; sup-buy-bis-2023-advanced-computing-controls is named in the notes of
supply/amd-instinct-oem-systems and supply/cdw-enterprise. Those are prose
cross-citations that should be promoted to real sources entries.
The other 24 are genuinely dead: e.g. acc2-nv-l40s-product-page and
acc2-arc-pro-b70-ark (both real spec sheets for parts the repo records),
kern-triton-github, pap-arch-vllm-supported-models. Either cite them from the
records they support or delete them. Severity: cosmetic individually, but it
inflates the source count by 1.3% and makes query.py stats overstate provenance
coverage.
C. False alarms — the convention, documented
These are exactly the things that look like defects to a mechanical audit and are not. Each is now recorded here so the next pass does not re-raise it.
C1 — memory_bus_bit × rate ≠ memory_bandwidth_gbps on all three MI350 parts: CORRECT
amd-instinct-mi350p/x and amd-instinct-mi355x all fail the naive
"bus × 5.0 Gbps / 8" check (it gives 2,560 and 5,120 against stored 4,000 and 8,000).
This is not a defect. Each record already carries the correction in
memory_bandwidth_basis:
"(The generic 'HBM3E = 5.0 Gbps' assumption that a mechanical audit would apply gives 5,120 GB/s and is wrong for this part: MI350-series HBM3E runs at 8 Gb/s per pin, and AMD's own spec table lists 'Memory Clock 8 GHz'.)"
The convention: memory_bandwidth_gbps is the vendor's printed aggregate, and
memory_bandwidth_basis records how to check it. Do not assume a JEDEC-standard
per-pin rate for HBM3E — the rate is part-specific and MI350-series runs faster than
the 5.0 Gbps that H200/H100-class parts use. (See B2 for the separate, real problem
in that same sentence: the reconciliation is off by 2.4%.)
C2 — the four dense: false rows on amd-instinct-mi300x are CORRECT
MI300X stores bf16 2614.9 dense:false and tf32 1307.4 dense:false. This looks like
the inverted-flag defect already fixed repo-wide, and it is not. AMD's MI300X page
prints both forms side by side, and the dense values live on separate dense: true
rows. Same for mi300a, mi325x. Convention: on AMD parts, dense: false rows are
sparse twins of a dense: true row on the same record, both stored, neither dropped.
C3 — the dense: false rows on NVIDIA consumer cards are CORRECT
nvidia-rtx-4090 has 5 dense: false rows (bf16 330.4, tf32 165.2, fp8 660.6,
int8 1321.2, int4 2642.4), and nvidia-rtx-5080, rtx-5090, rtx-6000-ada,
rtx-pro-6000-blackwell have similar. Each carries a notes block quoting the exact
whitepaper line — e.g. the Ada appendix prints
"Peak FP16 Tensor TFLOPS with FP16 Accumulate 330.3/660.6" and the footnote reads
"Effective TOPS / TFLOPS using the Sparsity Feature". Convention: NVIDIA consumer
whitepapers print every tensor row as DENSE/SPARSE, and this repo stores both columns
as separate rows with the correct flag. 51 dense: false rows exist repo-wide and I
verified every one is a legitimate sparse twin.
C4 — kv_cache_bytes_per_token deviating from 2 × L × H × D × 2: CORRECT for 36 models
The GQA formula num_layers × num_kv_heads × head_dim × 2 (K and V) × bytes_per_element
does not apply to these families, and all 36 record the reason:
- MLA models (9):
deepseek-r1/v2/v3/v3-2,kimi-k2,kimi-k3,glm-5-3,ling-3-0-flash,minimax-m1,deepseek-v4-*. Stored values are 70,272 B/token for DeepSeek-V3 against a naive 3,997,696 — a 57× error if you applied the GQA formula.attention_variantsays "MLA, kv_lora_rank 512" andnotescarries the latent-cache derivation. This is the single largest convention in the model slice. - Sliding-window / hybrid attention (12):
gemma-2-9b,gemma-3-*,phi-3-*,qwen3-5-35b-a3b,minicpm-v-4-6,gpt-oss-120b. Stored values are well below the full-attention formula because only some layers keep a KV cache. - Encoder-only / encoder-decoder where
num_layersis the ENCODER depth (15):bge-*,e5-*,jina-*,modernbert-base,canary-1b-flash,parakeet-ctc-1-1b,whisper-large-v3-turbo,snowflake-arctic-embed-l,mxbai-rerank-large-v1. Stored0.0is correct by construction — e.g.parakeet-ctc-1-1bsays "THIS MODEL HAS NO DECODER AND THEREFORE NO KV CACHE WHATSOEVER". - SSM / linear-attention hybrids (7):
granite-4-0-h-tiny,nemotron-h-8b-base-8k,mamba-codestral-7b,lfm2-*,rwkv5-eagle-7b,minimax-m1,falcon-h1-7b-base.
Convention: kv_cache_bytes_per_token = 2·L·H·D·2 is valid only for
plain GQA/MHA decoder models. Before flagging a deviation, check attention_variant
for MLA, sliding-window/hybrid, encoder/encoder-decoder, or SSM/linear markers. Note
also gte-qwen2-1-5b-instruct stores a real KV figure (14,336) and explains that it
is irrelevant because the model is a bi-encoder with last-token pooling — a
deliberate counter-example.
C4b — the 4 remaining KV "deviations" are also correct
canary-1b-flash, llada-8b-instruct, parakeet-ctc-1-1b and
nomic-embed-text-v1-5 store 0 with a documented reason. llada-8b-instruct is a
diffusion LM: "use_cache is false and there is no KV-cache machinery at all … Each
denoising step runs a full bidirectional forward pass." Not a defect.
C5 — vram_gb values that are not round: CORRECT
accelerators/groq-lpu has vram_gb: 0.23. This is not a typo — Groq's LPU has no
off-chip DRAM at all, only 230 MB of on-package SRAM. cerebras-wse-3 stores 21,000
(waferscale SRAM, not HBM) and huawei-ascend-950dt stores 500. Convention:
vram_gb is whatever the part calls its fast local memory, and the units are in the
field name.
C6 — tps_aggregate records with value: 0: CORRECT and load-bearing
benchmarks/h200-8x-mlperf-v4-1-maxq-llama2-70b-offline-idle-node-draw stores
tps_aggregate: 0 with unit: "output tokens/s = ZERO, at 2411.2 W mean whole-node draw".
Its notes explains the point: "an 8×H200 node that is not generating any tokens still
draws 2422.6 W … ANY cost-per-token model that divides total energy by total tokens
without accounting for idle time UNDERSTATES COST PER TOKEN." A zero-value record is the
evidence for that claim. Do not treat it as missing data.
C7 — accelerators/nvidia-h100-sxm notes reads as a contradiction: it is stacked audit history
The H100 SXM notes contains four consecutive audit passes, including both
"AUDIT CORRECTION: the dense/sparse flag on the tensor rows was inverted" and
"CRITICAL: the datasheet prints 989 TF32 … ALL MARKED 'WITH SPARSE'". Two agents
appended to the same field without reconciling. The values are correct and verified
(989.5 bf16 / 1979 fp8 dense, exactly half NVIDIA's printed sparse figures) — only the
prose is hard to read. 7 accelerator records have ≥3 stacked passes: nvidia-b300,
nvidia-gb200-nvl72, nvidia-h100-nvl, nvidia-h100-pcie, nvidia-h100-sxm,
nvidia-h200-nvl, nvidia-h200-sxm. Severity: cosmetic, but it is why A1's
stale-notes bug is easy to miss — the pattern of un-reconciled appends is systemic.
C8 — accelerators/nvidia-gb200-nvl72 other: 40 dense:false: CORRECT, and deliberately argued
The FP64 row is dense: false while its notes records a reversal: "the FP64 'other'
row was flipped to dense:true by the mechanical pass but that assertion is NOT supported
— the Blackwell datasheet prints no sparsity footnote on the FP64 row, and AMD's MI350X
page quotes B200 FP64 as 37 TFLOPs versus NVIDIA's printed 40. Row reverted to dense:false
and annotated." Correct: FP64 has no 2:4 path, so a dense/sparse distinction is
meaningless there and the flag is deliberately set false to stop a reader halving it.
Convention: for precisions with no sparsity support, dense: false means "not a
sparsity figure", not "this is the sparse number".
C9 — models/gemma-3n-e2b dense with active_params_b ≠ params_b: CORRECT
architecture: dense, params_b: 5.44, active_params_b: 1.91. The notes explain:
params_b is the full safetensors count across text/vision/audio/PLE tables, while
active_params_b is Google's documented effective load after PLE caching and
parameter skipping. This is the PLE mechanism, not MoE routing, so the dense
architecture label stands. Convention: active_params_b means "loaded per token",
which for PLE models is below params_b without implying sparsity.
C10 — gqa_ratio disagreeing with hidden_size / head_dim / num_kv_heads: CORRECT
35 models disagree under the naive check, and all are right. The formula assumes
num_attention_heads = hidden_size / head_dim, which breaks in three ways the records
document: (a) MLA models where the 128 "heads" are expanded from a 512-rank latent,
so deepseek-v3 legitimately reports gqa_ratio: 1.0 against 56 derived heads;
(b) multi-modal models where the vision tower's geometry differs from the text
tower's; (c) records where hidden_size and head_dim come from different sub-configs
(gemma-3-27b: head_dim 128 with hidden 5376).
I verified the non-MLA, non-multimodal cases against live HF config.json:
gemma-2-9b 16/8 = 2.0 ✓, gemma-3-27b 32/16 = 2.0 ✓, gemma-1-7b 16/16 = 1.0 ✓,
seed-oss-36b 80/8 = 10.0 ✓, glm-4-5 96/8 = 12.0 ✓, falcon-h1-7b-base 12/2 = 6.0 ✓,
magistral-small 32/8 = 4.0 ✓, gpt-oss-120b 64/8 = 8.0 ✓, qwen3-30b-a3b 32/4 = 8.0 ✓,
minicpm-v-4-6 8/2 = 4.0 ✓. Every one matches. Convention: gqa_ratio is only
checkable for a pure text decoder with head_dim × num_attention_heads = hidden_size.
C11 — accelerators/nvidia-rtx-3090 at 936 GB/s vs the 3090 Ti at 1008: CORRECT
The two records' notes cross-reference each other's figures and both are right —
19.5 vs 21 Gbps GDDR6X on a 384-bit bus. A reader scanning notes for bandwidth figures
will hit apparent mismatches on many accelerator records; the convention is that
notes routinely quotes other parts' bandwidth for comparison (MI300X's notes quote
128 GB/s Infinity Fabric links, H100's quote 900 GB/s NVLink, Apple M3 Ultra's quote
the RTX PRO 6000's 1792 GB/s). Always read the sentence, not the number.
C12 — the tps_aggregate vs tok_s_per_user inversion is present and correct
The repo's own paired records demonstrate it, and they are consistent:
mpt7b-a100-bs1-per-user-decode-tps 57.6 tok/s/user vs
mpt7b-a100-bs64-aggregate-output-tps 800 tok/s aggregate vs
mpt7b-a100-bs64-per-user-decode-tps 12.5 tok/s/user. Aggregate rises 13.9× from
batch 1 to batch 64 while per-user falls 4.6×. That is exactly the expected shape, so
no record in the repo is suspect on this check. gb300 pairs
(tps_aggregate: 5000/GPU, tok_s_per_user: 180) show the same split and document it.
Convention: tps_aggregate is system throughput and tok_s_per_user is
interactivity; a high value in one implies nothing about the other.
D. Duplicates found (report only — nothing deleted)
D1 — 15 paper pairs are the same paper under two slugs
13 of these have a populated twin whose values the null-enum twin should inherit
(see A4): deepseek-v2/deepseek-v2-mla, deepseek-v3/deepseek-v3-report,
hyena/hyena-hierarchy, infini-attention/infini-attention-infinite-context,
kimi-linear/kimi-linear-kda, lightning-attention-2/lightning-attention-2-tiling,
mamba/mamba-selective-ssm, mamba-2/mamba-2-ssd, retnet/retnet-retentive-network,
rwkv/rwkv-reinventing-rnns, s4/s4-structured-state-spaces,
simple-linear-attention/based-simple-linear-attention, titans/titans-test-time-memory.
2 are exact duplicates including the arXiv id, contributed by two different agents:
papers/sglangandpapers/sglang-structured-program-runtime— botharxiv_id: 2312.07104, same name, same category.adoptiondiffers (in-productionvsin-upstream-engine).papers/splitwiseandpapers/splitwise-prefill-decode-disaggregation— botharxiv_id: 2311.18677, same name, same category, sameadoption.
These two also collide with engines/sglang and create the ambiguous references in A5.
D2 — 1 engine pair
engines/triton-inference-server and engines/niche-triton-inference-server — same
normalized name "Triton Inference Server".
D3 — 4 model pairs sharing a family and parameter count (legitimate, not defects)
models/claude-haiku-4-5 / claude-opus-5-5 / claude-sonnet-5-5 (all params_b: null,
proprietary — correct as one group of 3), models/lfm2-1-2b / lfm2-5-1-2b-instruct
(base + instruct of the same 1.17B), models/phi-4-mini-instruct /
phi-4-mini-reasoning (same 3.836B, two tunings). These are distinct checkpoints and
should stay separate.
D4 — 87 source pairs share a URL
87 URLs are cited by 2+ distinct source records, mostly sibling-agent prefixes
(arch-* vs pap-arch-* vs flop-* all pointing at the same arXiv abs page) — e.g.
arxiv.org/abs/2412.19437 is cited by 4 source records. This is not data corruption,
but it means the source count (1,076) overstates distinct documents by ~9%. Worth a
dedupe pass; not urgent.
D5 — accelerator pairs sharing (vendor, vram, bandwidth, process) — all correct
mi250/mi250x (the GCD vs XCD cut of one die, 128 GB / 3200 GB/s each),
mi350x/mi355x (288 GB / 8 TB/s, different compute), h200-sxm/h200-nvl
(141 GB / 4.8 TB/s, SXM vs PCIe-NVL), b200/gb200-nvl72 (186 GB / 8 TB/s per GPU
derived from the Superchip), mi50x/mi60, ascend-310p/atlas-300i-pro.
Convention: one record per SKU/form-factor, so a part and its sibling package
legitimately share every spec field.
E. Policy observation, not a defect
171 records are status: verified with no primary source (spec-sheet, paper,
whitepaper, repo, or release-notes): 58 gotchas, 46 benchmarks, 36 supply, 30 papers,
1 engine. Most are legitimate — a gotcha's primary evidence is a GitHub issue
(kind: forum), and an MLPerf result's primary evidence is the results database
(kind: benchmark), neither of which my "primary" filter counted. But two clusters
deserve a policy call from the parent:
- 8 benchmarks sourced only to a vLLM GitHub issue (
kind: forum), includingbenchmarks/mxfp4-w4a16-on-w4a4-kernel-aime-math-gsm8k-avg(conf 0.85) andnvfp4-w4a16-flashinfer-b12x-moe-gsm8k(conf 0.8). A forum issue is not a measurement; these are quality-delta numbers derived from a bug report. - 30 papers
verifiedwith no paper/repo source — these are the 30 non-null-enum papers whose only sources are blogs or the forum.SCHEMA.mdsaysverifiedmeans "checked against primary source"; a blog post is not one.
Also worth noting: 0 records are verified at confidence < 0.6, 0 draft
records sit at ≥ 0.9 confidence, and every record's updated is 2026-10-03 —
so the status/confidence fields are internally coherent. But that uniformity means
updated carries no information and confidence is currently a stylistic choice
rather than a measurement. The confidence-outlier check I was asked to run found
nothing: no record at ≥ 0.95 is sourced only from Wikipedia (there are 7 Wikipedia
sources, all attached to low-confidence Chinese-ASIC and interconnect records).
F. The single most consequential defect
supply/coreweave-h100-h200 — the 8× unit-class error (A2).
It beats the alternatives on three counts:
- It is the exact failure the schema was designed to prevent.
price_basisexists specifically so a reader knows whether a price is per-GPU-hour or per-node-hour, and SCHEMA.md says an H100 quote "means wildly different things at these bases". Here the field that carries that warning names the wrong basis, and the repo's ownnotescontradicts it. A consumer that classifies this record as a node-hour quote overstates the price by 8×. - It is silent and it survives review. The number
6.155is correct. Nothing looks wrong. Unlike the null-enum papers (loud — CI fails) or the MI350 bandwidth (self-documenting caveat in the record), this one has a correct value, a confidentprice_usd, and a plausible-looking basis string. - It poisons comparison across the supply slice. CoreWeave is the reference point
for H100/H200/A100/L40S/B200 rental in
docs/08-cost-per-token. Every per-hour cluster in that document (aws-ec2-p5-h100$6.88,gcp-a3-h100-h200$11.06,coreweave$6.155,runpod-pods$3.49) is read as per-GPU-hour. If one of them is classified as node-hour, the "CoreWeave is cheapest on-demand" conclusion inverts.
Runner-up, and the one to fix first on raw blast radius: A5, the 28 ambiguous bare
slugs. It breaks 29 live cross-references, roughly half of which will resolve to the
wrong record type, and validate.py is already failing on it.
G. Recommended fix order
- A5 — rename to disambiguate 28 slugs; one commit, validator green at the end.
- A2 — rewrite
coreweave-h100-h200.price_basisto lead with per-GPU-hour. - A4 + D1 — merge the 13 null-enum duplicate paper pairs, then backfill the
remaining 43 records'
venue/category/adoption. Fixes 168 of 196 CI errors. - A1 — recompute the two ratios in
pcie-gen6.notesagainst the corrected 242. - B1, B2, B3 — fix the four
memory_bandwidth_basisarithmetic statements so the derivations produce the stored values (H200 ×2, MI350 ×3, a10, v100). - A3 — correct
P_layer/d = 104,448→118,784intensor-parallel-allreduce.notes. - A6, A7, A8 — 6 dangling refs + 4 missing interconnect records.
- B4–B9 — dense-row gaps on MI300-family, MI355X FP8 conflict, provenance
inversions,
measured_bylabels, orphan sources.
After step 1 and 3, python tools/validate.py should return to 0 errors and CI goes
green. Steps 4–6 are cosmetic-to-misleading individually but are the findings most
likely to survive into published docs, because they sit in prose that no validator reads.