# Speeds from RAM alone, compared: the data kit

This folder holds the records behind *Speeds from RAM alone, compared*
(https://research.strata2signal.com/ram-speeds-compared/) that the page's two earlier kits do not: what language
models write at, read a question at and take to the first word with no graphics card in the path. Most of the
page's bars come from those two kits, which are linked here and never copied:

- the battery page's kit, https://research.strata2signal.com/two-hours-on-battery/data/ (*Two Hours at 12 tok/s —
  On Battery*): every 2026-08-25 column (the EPYC desktop, the laptop and the mini PC at their default threads, the
  tuned-thread supplement, the thread sweeps, the cached-prompt trap, the triads of that day and the embedder),
  with its `counting-rules.md`;
- exhibit 105's kit, https://research.strata2signal.com/speeds-from-ram-alone/data/ (*Speeds from RAM alone*): the
  laptop's 2026-11-05 run, the two-channel desktop's 2026-11-04 run and the EPYC desktop's big mixture of
  2026-11-03.

Everything is CC BY 4.0. Dates and times are UTC.

## What is here

| Folder or file | What it holds |
|---|---|
| `fill-in/laptop/` | The laptop (Intel Core Ultra 9 290HX Plus, 64 GB of DDR5), 2026-11-08, 02:14:27Z to 03:02:18Z: the prompt-size ladder, `gemma4:26b` at about 500, 2,000, 4,000 and 8,000 tokens and `qwen3.5:9b` at the first three, at the engine's default 4 threads |
| `fill-in/two-channel-desktop/` | The two-channel desktop (AMD Ryzen 7 3700X, 32 GB of DDR4), 2026-11-08, 01:00:20Z to 02:06:09Z: three dense models (`qwen3.5:9b`, `gemma4:12b`, `phi4:14b`) on the frozen prompt, then the same ladder, at the default 8 threads |
| `fill-in/prompts/` | The ladder's four prompts (`fillin-p0500.txt`, `fillin-p2000.txt`, `fillin-p4000.txt`, `fillin-p8000.txt`) and their manifest, `PROMPTS.json` |
| `fill-in/memory-reads.md` | The memory-slot reads behind the page's memory column and its paper peaks, each dated; no serial numbers |
| `older-desktop/` | The older desktop (Intel Core i9-10850K, 48 GB of DDR4), 2026-09-10, ten CPU-only result files under Ollama 0.32.13: eight charted, two not |
| `charts/` | The twenty chart specs the page draws, byte for byte as the page's author wrote them |
| `facts/FACTS.md` | One row per bar: the printed value, the file's raw value, the file, the field, the rounding rule and the gates read |
| `README.md` | This guide |
| `index.json` | Every file but itself, `provenance.json` and the folder's index page, each with its size and sha256 |
| `provenance.json` | Every rule applied to every file, with how many times it fired |

In each fill-in folder, four files, copied from the bench's own result folder and rewritten only by the named rules
in `provenance.json`:

- `summary.json`: the bench's own summary of the run, written by its reader from the run's rows and telemetry;
- `triad.json`: the STREAM triad's receipt;
- `RECEIPT.txt`: the one-line RAM-RECEIPT the run printed when it finished;
- `rows.jsonl`: one row per request, warm-up and scored alike, with the engine-log lines the run kept.

## Where each figure on the page comes from

The page cites every file by its path in the kit that holds it. For the figures read from this kit:

| On the page | File here | Fields |
|---|---|---|
| The Ryzen desktop's three dense models on the frozen prompt (writing, reading, first word; T1 to T3) | `fill-in/two-channel-desktop/summary.json` | `arms[arm = "f1-qwen3.5-9b-tdef"]`, `"f1-gemma4-12b-tdef"`, `"f1-phi4-14b-tdef"`: `decode_median`, `prefill_median`, `first_word_median_ms` |
| The prompt-size ladder on both machines (the three ladder charts; T4a) | `fill-in/laptop/summary.json`, `fill-in/two-channel-desktop/summary.json` | `arms[arm = "f2-<model>-p0500"]` to `"…-p8000"`: `decode_median`, `prefill_median`, `first_word_median_ms`, `prompt_tokens`, `ctx_seen` |
| THROTTLED on the ladder (T4a, T4c) | both `summary.json` | per arm `throttled_runs`; per run `throttled`; on the desktop also `throttle_rule` and `throttle_unread_runs` |
| The hottest sensor per run (T4c) | both `summary.json` | per run `cpu_temp_max_c`; on the desktop, `sensor_temp_max_c` is the control temperature its 95 °C rule reads |
| The draft model's acceptance on the ladder (T4c) | `fill-in/laptop/rows.jsonl`, `fill-in/two-channel-desktop/rows.jsonl` | each `gemma4:26b` run's `log_receipts`, the line `draft acceptance = … ( … accepted / … generated), mean len = …` |
| Loaded sizes at a 4,096 and a 16,384-token window (T1, T6c) | `fill-in/two-channel-desktop/rows.jsonl` | `size_total`, the first row of each model and window |
| The laptop's energy on the ladder, NOT WALL (T4b) | `fill-in/laptop/summary.json` | per arm `decode_package_w_median`, `request_kj_median`; `idle_package.mean_w` |
| The 2026-11-08 triads (T0, T6a) | `fill-in/<machine>/triad.json`, `fill-in/<machine>/summary.json` | `receipt.TRIAD_BEST_GBs`, `receipt.TRIAD_WORST_GBs`; `triad.best_gbs`, `triad.worst_gbs` |
| The dense models' tokens a second per GB/s of triad, with no verdict (T6b) | `fill-in/two-channel-desktop/summary.json` | `k_no_verdict` |
| No card used on the two fill-in machines | both `summary.json` | `no_card.legs`, `no_card.verdict` |
| Memory sticks, rated and configured speeds, paper peaks (T0, T6a) | `fill-in/memory-reads.md` | per machine, with its read date |
| The older desktop's writing speeds (T10) | `older-desktop/gpu-3080-m1…m6-cpu-box.json`, `-x1`, `-x2` | `derived.decode_tok_s.median`; the model's digest at `ps_after_load[0].digest`; the memory the system reports at `free_m_before` |
| Every bar's printed value and its gates | `facts/FACTS.md` | one row per bar |

The older desktop's `-x3` and `-x4` files (`qwen3.6:27b` and `nemotron3:33b`) are here and not charted: this house
has not read those two models' architecture, so the page does not say whether they are dense or mixtures.

## How the figures were counted (the page's rules)

- **Medians of three on the fill-in runs.** Each arm, one model on one prompt at one window, ran a warm-up and three
  scored runs from a fresh load; every printed figure is the median of the three (`arms[].runs[]` holds each run).
  The battery page's 2026-08-25 figures are medians of five warm runs by its own rules (its `counting-rules.md`:
  writing is rule 1, prompt reading rule 2, the fresh first word rule 3 item 2).
- **Writing speed** is the engine's token count over its writing time (`decode_tok_s`); the client's clock is beside
  it (`decode_alt_tok_s`). **Prompt reading** is the engine's, from runs whose prompt reading passed its checks
  (`prefill_ok`: fresh, not cached, not truncated, at the registered window). **The first word** is the client's
  clock to the first token less the model's load (`load_s`), from the same runs.
- **THROTTLED** marks a run during which the laptop's throttle counter rose, or the Ryzen desktop's control
  temperature reached 95 °C, at any point from sending the request to its last token. A label, never a reason to
  drop the figure. The Ryzen desktop never reached it on these runs.
- **Energy** is the processor package's own counter (RAPL package-0), never a meter at the wall: every watt and
  joule here is NOT WALL. A request's energy on the laptop includes the model's fresh load. The Ryzen desktop's
  counter could not be read (`rapl_source`), so its energy fields are null.
- **The prompts.** The ladder's four files are the openings of this hub's own articles dated on or after 2026-11-01,
  in date order, each the longest line or sentence boundary at most its target under `gemma4:26b`'s tokenizer, then
  the instruction "Write a detailed, section-by-section summary of the text above."; each is a prefix of the next.
  `PROMPTS.json` names the seven articles they were cut from (the-3090-rig-repriced, the-night-watch,
  electricity-per-image, the-llama-weights-that-got-out, mixture-of-experts-in-plain-words,
  a-short-history-of-the-rtx-3090, speeds-from-ram-alone), each with its bytes and sha256, and the hub commit they
  were read at, `a3009db2`. The text is this hub's; any line those articles quote from others stays its authors'.
- **The frozen prompt** (the 2,101-byte prompt of the battery page's bench, which the Ryzen desktop's three dense
  models and the older desktop read) is held out: its text is in no file here, as the battery page's kit README
  says, and its sha256 stands in the rows.
- **Rounding** is done once, round-half-up on the file's own digits: writing to two decimals, prompt reading to one,
  the first word to two in seconds, watts and kJ as the file prints, k to four decimals, ratios and percentages
  from the raw fields. `facts/FACTS.md` lists every tie the rule broke.
- **The older desktop's** prompt-reading and first-word fields are cache hits (its warm-up sent the same prompt), so
  the page prints only its writing speeds; its thread count was not recorded.

## What was rewritten, and what is not here

`provenance.json` names every rule and counts it per file. In short: the older desktop's card's GPU UUID becomes a
marker naming the board by a letter; the program paths in the two triad receipts and the prompt manifest, and the
older desktop's prompt path, become `withheld-2026-11-10`; the older desktop's local clock becomes UTC; the laptop's
energy-counter path becomes words; the machines' private names and the run ids built from them become the names
the page gives the machines (`laptop-2026-11-08`, `two-channel-desktop-2026-11-08`); and two notes in the facts
sheet written for the page's own reviewers become public words. No figure moved.

Not here, and why:

- each fill-in run's one-second host telemetry, status and unit logs, restore log and timer markers, the sandbox's
  probe and argument files, the two wrapper records and the registration's pin file (which carries paths); every
  figure the page prints from those runs is in `summary.json` or `rows.jsonl`;
- the older desktop's card and split arms of the same session, which belong to *The 3080 Rig, Priced*;
- the frozen prompt's text (above);
- copies of the two earlier kits, which are linked instead.
