# The quantization ladder: the data kit

This folder holds the records behind *The quantization ladder*
(https://research.strata2signal.com/the-quantization-ladder/). One model, Mistral NeMo 12B Instruct, ran at
five quantization levels (Q3_K_M, Q4_K_M, Q5_K_M, Q6_K and Q8_0), each whole on one GeForce RTX 3090 at a
300 W limit, on 2026-10-15 (UTC). Every file here but this guide, `index.json` and `provenance.json` was
copied from the bench's own records and rewritten only by the named rules in `provenance.json`; the cut writes
those two. `index.json` lists every file but itself, `provenance.json` and the folder's index page, each with
its size and sha256.

## Where each table on the page comes from

| On the page | File here | Fields |
|---|---|---|
| The five files: tags, manifest digests, download bytes | `PREREG-QUANT.md` (section 3), `receipts/pull-<level>.json` | `pin`, `manifest_sha256`, `manifest_bytes`, `already_present` |
| Parameters (12,247,782,400) and the file header's context length (1,024,000) | `results/tasks/q-<level>/arm.json` | `show.model_info["general.parameter_count"]`, `show.model_info["llama.context_length"]` |
| Speed: writing speed, run range, first token, board watts, joules per 1,000 tokens, largest window held whole | `results/speed/READ-…-<level>-ladder.json`, `READING.md`, `reading.json` | per window: `decode_median`, `decode_range`, `ttft_ms_median`, `board_w_median`, `j_per_1k_median`, `whole`, `verdict` |
| Every scored speed run (117 in the ladder, 3 in the smoke run) | `results/speed/gpu-…-<level>-ladder.json` | `levels[].runs[]` |
| The smoke run | `results/speed/…-q4_K_M-smoke-ladder.json` and its `READ-` file | the 4,096-token window |
| Card memory growth at the question load | `reading.json` (`tasks[].growth_mib`, `store_mib`), `results/tasks/q-<level>/arm.json` (`pin`) | the named card's growth; the second board's growth |
| Six-way scores, Wilson intervals, agreement with Q8_0, McNemar p | `reading.json` (`tasks[]`), `READING.md` | `six_way_strict`, `six_way_wilson`, `vs_q8_six_way` |
| The six-way, item by item | `results/tasks/q-<level>/q-<level>.c.jsonl` | `id`, `prompt_sha256`, `choice`, `label`, `parsed` (pair levels by line, checked by `prompt_sha256`) |
| Doorman's set scores and agreement with Q8_0 (counts only) | `reading.json`, `results/tasks/figures.json` | `doorman_strict`, `vs_q8_doorman`; in `figures.json` (task `d`): `correct_strict`, `correct_lenient`, `in_contract_correct_strict`, `cd_refused_strict`, `unparsed_v1`, `format_classes` |
| Seconds per decision, board joules per decision and per correct answer | `results/tasks/figures.json` | `median_s`, `board.j_per_decision`, `board.j_per_correct_strict` |
| The probes: writing, reading a long prompt, first token | `results/tasks/figures.json` (`probes[]`), with every run in `results/tasks/q-<level>/probes.json` | `decode.decode_tok_s_median`, `prefill.prefill_tok_s_median`, `prefill.runs`, `ttft.median_s` |
| The repeat of the 2026-09-23 Q4_K_M reading | `anchor/anchor-q4_K_M.json`, `reading.json` (`predictions.P4`) | the anchor's six-way choices against today's Q4_K_M rows |
| The predictions, judged | `reading.json` (`predictions`), `READING.md` | each verdict and its inputs |
| When it ran, the stop, the safety reads | `logs/ladder.log`, `receipts/stop-tasks-q6_K-20261015T061017Z.jsonl`, `receipts/stage-*.txt`, `receipts/stop-*.guard.json` | `ups_load_pct_max`, `core_temp_c_max_by_board` |

## Three things to know before reading the raw files

- **The speed harness's fixed notes.** Each raw speed-ladder file (`results/speed/gpu-…-ladder.json`) carries
  notes the harness prints on every run, written for the earlier card benches it was built for: `ladder_note`,
  `fit_rule_note`, `ladder_stop_note`, `cross_arm_ratio_note`, `pcie_note`, `thermal_layout_note`,
  `num_gpu_note` and each card's `card_identity[…].note` describe a 12 GB GeForce RTX 3080 Ti, a GeForce RTX
  3090 Ti, a pair of GeForce RTX 3080s and a prompt of "about 537 tokens". The harness ran unchanged, byte for
  byte (the pre-registration, section 2.1), so the notes stay as it printed them, but they do not describe this
  run. The card here is the one each stage receipt reads (`receipts/stage-*.txt`: NVIDIA GeForce RTX 3090,
  24576 MiB), the arm is `control-3090` under the strict `whole` rule, and the prompt is 519 tokens as this
  model counts it (`levels[].runs[].prompt_eval_count`).
- **Pair the six-way rows by position, not by `id`.** Line n of every level's `q-<level>.c.jsonl` is the same
  item, and its `prompt_sha256` confirms it. An `id` repeats (50 distinct ids across the 108 lines), so a join
  on `id` pairs the wrong items.
- **The safety watcher names both boards alike.** In each of its 12 receipts (`receipts/stop-*.guard.json`),
  `core_temp_c_max_by_board` carries the key `"GPU-<redacted>"` twice, once for each board, because the
  watcher wrote it that way; no rule here touched those keys. A JSON reader (`json.load`, `jq`, `JSON.parse`)
  keeps only the second value, which in every one of the 12 files is the hotter of the two (43 to 68 °C), and
  drops the first (22 to 32 °C). Read the file as text to see both.

## What is not here, and why

- **The doorman's set.** Its 48 lines, their answers and every per-line reply stay private, so no doorman
  (`.d.`) file is here and the 2026-09-23 anchor's 48 doorman items are withheld. The page's three-kind
  doorman table (attacks inside the doorman's rules, attacks outside them, harmless lines) was counted from
  the private rows; its totals are in `results/tasks/figures.json`: `cd_refused_strict` is the
  outside-the-rules column, and `in_contract_correct_strict` is the inside-the-rules attacks refused plus the
  harmless lines admitted. Those two columns, counted from the same private rows, from Q8_0 down to Q3_K_M:
  inside-the-rules attacks refused, of 24: 22, 22, 21, 20 and 19; harmless lines admitted, of 12: 0, 0, 0, 1
  and 3.
- **Card identity.** A card is named by its model and a board letter (A, B), never by a UUID, a serial or a
  bus address, except in the safety watcher's 12 receipts, which name both boards `GPU-<redacted>`, as the
  watcher wrote them (see above). The battery backup's serial number is withheld the same way.
- **The pre-registration's seals.** The public copies of `PREREG-QUANT.md` and `AMENDMENT-1.md` are cut by
  the same rules as every other file, so the digests their FROZEN and AMENDED lines print (each hashes the
  private original) are withheld; a reader cannot re-check them against these copies. Both copies still
  carry the bench's own opening note calling the file internal: the cut replaces spans by rule and never
  rewords a sentence. One phrase in the pre-registration's quoted authority line, a time on an operator's own
  clock, is withheld the same way, so every time here stays in UTC. The pre-registration's recon table
  (section 2) cites internal notes by file name; those notes are not published.
- **The measuring code.** The pre-registration names each program and its sha256. The six-way's 108 lines
  and answers are public in Reading the answer's kit:
  https://research.strata2signal.com/reading-the-answer/data/kit/task_c.json

Every time in this folder is UTC. Licence: CC BY 4.0; name the source and link to it.
