# Window run — the dense/MoE stopwatch, 2026-08-21

Summary for the window owner. Raw evidence: `runs.json` (every call, every
counter, every receipt). Full run log: `bench-window-2026-08-21.log`.

- **Run id:** `moe-dense-stopwatch-2026-08-19` (the registered id, unchanged —
  the run was postponed on 08-19, not re-registered)
- **Execution:** `window-2026-08-21`
- **Window opened (UTC):** 2026-08-21T06:30Z (declared maintenance window)
- **First call, incl. preflight (UTC):** 2026-08-21T07:22:22Z
- **First scored call (UTC):** 2026-08-21T07:22:51Z
- **Last scored call (UTC):** 2026-08-21T07:29:10Z
- **`runs.json` written (UTC):** 2026-08-21T07:29:17Z
- **Elapsed, first call to last:** 6 m 48 s
- **Calls:** **80 scored** (4 models × 2 tiers × n=10) + 11 unscored
  (3 preflight + 8 warm-ups) + 1 visitor release = 92 `/api/generate`
- **Refusals:** **0** — no call errored, no leg was skipped, no REFUSAL row was
  written, `aborted: null`
- **This lane's status: CLEAN.**

The exhibit-seventeen page promised, in print: *"The controlled version — same
rule, all four arms, plus the dense flagship with its guesser lawfully switched
off — is registered, protocol pinned, and runs in our next maintenance window;
its rows land here when they exist."* The four arms are below. The
guesser-switched-off half was measured in the same window by the draft-head
matrix lane and is cited here as a sister-lane result, not claimed as this
lane's own.

---

## 1 · Pre-registration verification

`PREREG-INDEX.txt`, pinned 2026-08-19T17:41:20Z, before any scored call:

```
afc6231006a5815986e501947decf712e727447d9dac9132a116f613644a07f9  BENCH-PROTOCOL.md
cb1a34e12d992c960f6426090ea166d687fb8e905f19f0419606d46e0470266a  SEVENTEEN-PLAN.md
```

| check | BENCH-PROTOCOL.md | SEVENTEEN-PLAN.md |
|---|---|---|
| pinned in `PREREG-INDEX.txt` | `afc6231006a5815986e501947decf712e727447d9dac9132a116f613644a07f9` | `cb1a34e12d992c960f6426090ea166d687fb8e905f19f0419606d46e0470266a` |
| measured **before** the first scored call (07:21Z) | same | same |
| measured **after** the last scored call (07:29:29Z) | same | same |

**Match, both times. The protocol was not amended.** No REFUSED-if-amended
condition arose. The predictions below are quoted as written and scored as
written; none was softened, reworded, or dropped.

The `RESULTS.md` STOOD-DOWN note's three carried-forward amendments were
honoured: the repeated-**word** builder stayed rejected (the repeated-**sentence**
builder ran), a counter-less reply is treated as a refusal rather than a null
datum, and the cast correction that the a3b routes 6 experts plus 1 shared is
carried into every table.

## 2 · Window posture — the whole point of this re-run

**Zero contention, verified rather than assumed.** Every request that touched
the runtime during the scored window is itemised in `CONTENTION-EVIDENCE.txt`
and accounted for:

| what | count in the scored window | attribution |
|---|---:|---|
| `POST /api/generate` | 92 | **all this run's** — 80 scored + 8 warm-ups + 3 preflight + 1 visitor release |
| `GET /api/ps` | 12 | **all this run's** — 8 per-arm seating receipts + pre-run + non-eviction + end-state + 1 operator spot-check |
| `GET /api/tags` | 16 | a metadata health poll on a 2-minute cadence. **No GPU work** — it reads the model list and returns in 0.6–1.3 ms |
| model loads (`starting llama-server`) | 3 | **all this run's**, identified by weight-blob digest (below) |
| foreign `/api/generate` | **0** | — |
| foreign model loads | **0** | — |

The three loads, resolved against the runtime's own manifests:

| UTC | weight blob | tag | why it loaded |
|---|---|---|---|
| 07:22:25Z | `1278394b693672ac` | `gemma4:12b` | this run's preflight |
| 07:22:34Z | `7121486771cbfe21` | `gemma4:26b` | this run's preflight |
| 07:25:04Z | `5c19f6282f4fc51c` | `nemotron-3.5-lightning:30b-a3b` | this run's visitor, mid-run, exactly where the protocol places it |

`qwen3.8:27b` (blob `f5f1dd8920d417aa`) was already resident when the window
opened and produced **no load line at all**; its per-call `load_duration` stayed
at 0.275–0.299 s throughout, the established no-relaunch signature.

`contention_receipt.py` reports `clean: false`. That flag fires on *any* model
load inside the window, and all three loads here are this run's own. The
substantive reading is **clean**: no other caller ran a single token through the
card while these rows were taken.

Pre-run state (`WINDOW-POSTURE-PRE.txt`, taken before the first call): the image
pipeline was freed and holding 828 MiB of idle context, the reranker 3,072 MiB,
and 73,386 MiB of the card was free. Runtime `0.32.13`,
`OLLAMA_MAX_LOADED_MODELS=5`, `OLLAMA_KV_CACHE_TYPE=q8_0`,
`OLLAMA_FLASH_ATTENTION=1`.

**`qwen3.8:27b` is measured AS SERVED, and the protocol says so.** Read from the
running process at run time: `--spec-type draft-mtp --spec-draft-n-max 4
--spec-draft-backend-sampling`. The draft head is on, draft 4, exactly as the
pre-registration declares. Nothing about the runner was changed by this lane.

## 3 · Per-cell medians with ranges

Posture on every call, sent explicitly: temperature 0, seed 0, `think` false,
`num_ctx` 32768, `num_predict` 256, `stream` false. Strictly serial, 2 s between
calls, no concurrency anywhere. **Zero-contention window** — see §2; every
figure below was taken with no other caller on the card.

Derived figures show their division: prefill tok/s = `prompt_eval_count ÷
(prompt_eval_duration ÷ 1e9)`; decode tok/s = `eval_count ÷ (eval_duration ÷
1e9)`; first-token proxy ms = `(total_duration − eval_duration) ÷ 1e6`, an
**upper bound and not a measured TTFT** (the protocol pins `stream: false`, so
there is no first-token event to time).

### tier ~1,000 tokens — zero-contention window

| model | kind | prompt tokens (actual) | prefill tok/s (median, min–max) | decode tok/s (median, min–max) | first-token proxy ms (median) | decode tokens (median) |
|---|---|---|---|---|---|---|
| qwen3.8:27b | DENSE 27.3B (as served, draft head on) | 996 | 10,125 (9,807–10,187) ⚠ | **107.7** (107.4–108.0) | 381 ⚠ | 256 |
| gemma4:12b | DENSE 11.9B | 996 | 5,797 (5,778–6,118) | **126.9** (126.7–127.0) | 627 | 256 |
| gemma4:26b | MoE 25.8B, 8 of 128 experts | 996 | 8,886 (8,623–9,420) ⚠ | **208.0** (206.6–209.3) | 573 ⚠ | 107 |
| nemotron-3.5-lightning:30b-a3b | MoE 32.9B, 6 of 128 + 1 shared | 1000 | 29,811 (29,374–30,910) ⚠ | **127.9** (126.4–128.1) | 241 ⚠ | 256 |

### tier ~8,000 tokens — zero-contention window

| model | kind | prompt tokens (actual) | prefill tok/s (median, min–max) | decode tok/s (median, min–max) | first-token proxy ms (median) | decode tokens (median) |
|---|---|---|---|---|---|---|
| qwen3.8:27b | DENSE 27.3B (as served, draft head on) | 8007 | 74,969 (74,335–75,270) ⚠ | **102.8** (102.7–103.1) | 432 ⚠ | 256 |
| gemma4:12b | DENSE 11.9B | 8007 | 98,339 (97,072–98,845) ⚠ | **122.7** (120.2–123.3) | 605 ⚠ | 256 |
| gemma4:26b | MoE 25.8B, 8 of 128 experts | 8007 | 160,137 (158,470–161,656) ⚠ | **201.7** (200.3–203.9) | 578 ⚠ | 112 |
| nemotron-3.5-lightning:30b-a3b | MoE 32.9B, 6 of 128 + 1 shared | 8011 | 212,533 (210,838–215,854) ⚠ | **132.4** (132.3–132.7) | 265 ⚠ | 256 |

⚠ **The prefill and first-token-proxy columns are contaminated — see §4.** The
decode column is not, and it is the protocol's headline metric.

`num_predict: 256` is a cap, not a floor. `gemma4:26b` emits end-of-sequence at
107 and 112 tokens (`done_reason: "stop"`); the other three run to the cap
(`done_reason: "length"`). Decode tok/s is a per-token rate from
`eval_count ÷ eval_duration` and `eval_duration` excludes prefill, so where a
model chose to stop does not enter the rate. The realized decode length is
printed beside every figure so the reader can see the sample each rate came from.

## 4 · A confound this run found at run time — the prompt cache

**The pre-registered prefill column does not measure prefill.** The protocol's
builder sends a **byte-identical prompt** on every call in a cell (temperature 0,
seed 0, no nonce). The runtime keeps a prompt cache, so the warm-up pays the real
prefill and the ten scored calls are served out of that cache. Measured, per
cell, warm-up against scored:

| tier | model | prompt tokens | warm-up prefill tok/s (n=1, UNCACHED) | scored prefill tok/s (median, n=10) | ratio | reading |
|---|---|---:|---:|---:|---:|---|
| ~1000 | qwen3.8:27b | 996 | 2,634 | 10,125 | **3.8×** | **CACHE HIT** |
| ~1000 | gemma4:12b | 996 | 6,541 | 5,797 | **0.9×** | consistent — no cache effect this size |
| ~1000 | gemma4:26b | 996 | 5,240 | 8,886 | **1.7×** | inflated, cache-assisted |
| ~1000 | nemotron-3.5-lightning:30b-a3b | 1000 | 3,358 | 29,811 | **8.9×** | **CACHE HIT** |
| ~8000 | qwen3.8:27b | 8007 | 3,576 | 74,969 | **21.0×** | **CACHE HIT** |
| ~8000 | gemma4:12b | 8007 | 8,365 | 98,339 | **11.8×** | **CACHE HIT** |
| ~8000 | gemma4:26b | 8007 | 14,669 | 160,137 | **10.9×** | **CACHE HIT** |
| ~8000 | nemotron-3.5-lightning:30b-a3b | 8011 | 12,849 | 212,533 | **16.5×** | **CACHE HIT** |

A 212,533 tok/s "prefill" is not a prefill rate; it is the cost of *not*
prefilling. The first-token proxy carries the same contamination in the same
direction (it contains prefill by construction).

**Decode is the control, and it is clean.** Warm-up against scored median, same
cells, same calls:

| tier | model | warm-up decode tok/s | scored decode tok/s (median) | ratio |
|---|---|---:|---:|---:|
| ~1000 | qwen3.8:27b | 106.02 | 107.71 | 1.016× |
| ~1000 | gemma4:12b | 126.30 | 126.91 | 1.005× |
| ~1000 | gemma4:26b | 205.63 | 208.04 | 1.012× |
| ~1000 | nemotron-3.5-lightning:30b-a3b | 126.73 | 127.91 | 1.009× |
| ~8000 | qwen3.8:27b | 100.75 | 102.78 | 1.020× |
| ~8000 | gemma4:12b | 118.86 | 122.70 | 1.032× |
| ~8000 | gemma4:26b | 199.39 | 201.72 | 1.012× |
| ~8000 | nemotron-3.5-lightning:30b-a3b | 129.86 | 132.44 | 1.020× |

Every cell agrees to within 3.2%. The cache moved prefill by up to 21× and
decode by essentially nothing, which is exactly what a prompt cache should do.

This is a **defect in the pre-registered protocol**, found by running it, and it
is published rather than patched away: the protocol was executed as pinned, and
the flaw is reported as a finding. The sister draft-head matrix lane had already
solved it — it put a nonce at the head of every prompt precisely so that no call
could be a cache hit — and that guard belongs in this protocol before its
prefill column is ever published. **Recommendation: do not publish the prefill or
first-token-proxy columns from this run.** The decode column stands.

## 5 · Prediction verdicts

Quoted verbatim from the sha-pinned `BENCH-PROTOCOL.md`, scored by
`verdicts.py` from `runs.json`. Tie rule adopted from the estate's C5 rule
rather than invented here: two arms read TIED when their repeat-set min–max
ranges overlap.

| prediction | verdict |
|---|---|
| **P1** · gemma4:26b (MoE, 25.8B total) decodes FASTER than gemma4:12b (dense, 11.9B) | **CONFIRMED** |
| **P2** · the a3b decodes fastest of all four | **REFUTED** |
| **P3** · qwen3.8:27b as-served lands between the MoEs and a naive dense expectation; its draft-off truth comes in slowest of the four | **CONFIRMED** (second clause on sister-lane evidence) |
| **P4** · prefill spreads across the cast far less than decode does | **REFUTED** |
| **P5** · resident VRAM tracks TOTAL quantized size, not active size | **CONFIRMED** |

### P1 — CONFIRMED, decisively

| tier | gemma4:26b | gemma4:12b | ratio | ranges overlap? | verdict |
|---|---|---|---:|---|---|
| ~1000 | 208.04 [206.63–209.31] | 126.91 [126.73–126.96] | **1.64×** | no | **CONFIRMED** |
| ~8000 | 201.72 [200.35–203.86] | 122.70 [120.18–123.33] | **1.64×** | no | **CONFIRMED** |

The headline bet. The 25.8-billion mixture out-writes its own 11.9-billion dense
sibling by 64% at both tiers, on non-overlapping ranges, with the bigger model
holding more than twice the memory. Bigger payroll, smaller meeting, faster word.
The published page claimed a third again as fast at the 32k tier beside traffic
(124.975 vs 95.195, a 1.31× ratio); in a quiet window at 1k and 8k the gap is
wider, not narrower.

### P2 — REFUTED, published as failed

| tier | order, fastest first | a3b's place |
|---|---|---|
| ~1000 | gemma4:26b 208.0 > **a3b 127.9** > gemma4:12b 126.9 > qwen3.8:27b 107.7 | 2 of 4 |
| ~8000 | gemma4:26b 201.7 > **a3b 132.4** > gemma4:12b 122.7 > qwen3.8:27b 102.8 | 2 of 4 |

The a3b is second at both tiers, not first. The prediction fails and is recorded
as failed; no threshold table exists to protect and none was invented.

And the arm P2 hinges against is a tie at one tier:

| tier | a3b | gemma4:12b | ranges overlap? | reading |
|---|---|---|---|---|
| ~1000 | 127.91 [126.40–128.13] | 126.91 [126.73–126.96] | yes | **TIED** by the range rule |
| ~8000 | 132.44 [132.34–132.69] | 122.70 [120.18–123.33] | no | separated |

At ~1k the 32.9-billion mixture and the 11.9-billion dense model are
indistinguishable. Sparsity bought the a3b a bigger model at the same speed — not
a faster one.

### P3 — CONFIRMED, with the second clause borrowed and labelled

First clause, this lane's own rows:

| tier | qwen3.8 as-served | the two MoEs | naive dense expectation (published 27.8B siblings) | between? |
|---|---|---|---|---|
| ~1000 | 107.71 [107.42–108.00] | 127.9 and 208.0 | 66.45 | **yes** |
| ~8000 | 102.78 [102.66–103.07] | 132.4 and 201.7 | 65.36 | **yes** |

Second clause — the draft-**off** counterfactual. **This lane did not measure it.**
The protocol assigns that leg to the draft-head matrix, which ran block Z
(`draft_num_predict 0`, n=30) in this same window on this same box between
06:35Z and 07:09Z:

| tier | matrix draft-0 (n=30) | this lane's four arms, slowest to fastest | slowest of the four? |
|---|---|---|---|
| ~1000 | **76.11** [75.89–76.36] | 107.7 / 126.9 / 127.9 / 208.0 | **yes** |
| ~8000 | **74.46** [74.27–74.70] | 102.8 / 122.7 / 132.4 / 201.7 | **yes** |

The borrowing is sound because the two lanes agree where they overlap. Both
measured `qwen3.8:27b` with draft 4, in the same window:

| tier | matrix draft-4 median (n=30) | this lane's median (n=10) | gap |
|---|---|---|---|
| ~1000 | 109.13 | 107.71 | **1.3%** |
| ~8000 | 109.60 | 102.78 | **6.2%** |

Caveats named: the matrix used 1041/8219-token nonce-headed prompts at n=30, this
lane 996/8007-token fixed prompts at n=10. The 6.2% gap at ~8k sits inside the
matrix's own ~8k dispersion (its 30 calls spanned 96.70–121.15).

### P4 — REFUTED, on both readings

| tier | column | prefill spread | decode spread | prefill spreads less? | verdict |
|---|---|---:|---:|---|---|
| ~1000 | pre-registered (scored n=10, cache-contaminated) | 5.14× | 1.93× | no | **REFUTED** |
| ~1000 | uncached control (warm-up n=1) | 2.48× | 1.93× | no | **REFUTED** |
| ~8000 | pre-registered (scored n=10, cache-contaminated) | 2.83× | 1.96× | no | **REFUTED** |
| ~8000 | uncached control (warm-up n=1) | 4.10× | 1.96× | no | **REFUTED** |

"The group photo is parallel for everyone" does not survive this cast. Prefill
spreads *wider* than decode, not narrower, on both the contaminated column and
the uncached control — so the §4 confound does not rescue the prediction, and the
verdict does not depend on which column you trust.

On the honest column the spread is driven from the slow end, and by the dense
flagship: `qwen3.8:27b` prefills at 2,634 tok/s at ~1k and 3,576 at ~8k, which is
**2.48× and 4.10× slower** than the fastest arm at each tier (`gemma4:12b` 6,541
at ~1k, `gemma4:26b` 14,669 at ~8k). This lane can name the gap but cannot
attribute it: the flagship is the only arm carrying a draft head *and* a vision
projector, and neither was varied here. Isolating it is a separate leg.

The uncached control is n=1 per cell and each warm-up is the first call after
its model's load, so it may carry first-call overhead. It is published as a
control, not as a rate.

### P5 — CONFIRMED

From the non-eviction receipt at 2026-08-21T07:25:18Z, the one moment all four
were seated together:

| model | kind | total | active | model file | resident | resident ÷ file | resident ÷ an active-size expectation |
|---|---|---|---|---:|---:|---:|---:|
| qwen3.8:27b | dense | 27.3B | 27.3B (all) | 16.52 GiB | 16.33 GiB | 0.988× | 0.99× |
| gemma4:12b | dense | 11.9B | 11.9B (all) | 7.04 GiB | 7.55 GiB | 1.073× | 1.07× |
| gemma4:26b | **MoE** | 25.8B | **3.8B** | 16.75 GiB | 16.27 GiB | 0.971× | **6.60×** |
| nemotron-3.5-lightning:30b-a3b | **MoE** | 32.9B | **3.7B** | 23.68 GiB | 23.64 GiB | 0.998× | **8.88×** |

Both mixtures hold essentially their whole file resident. An active-size
expectation would have under-predicted gemma4:26b by 6.6× and the a3b by 8.9×.
The whole payroll must be in the building.

## 6 · Residency receipts — one per arm, per the window brief

Eleven `/api/ps` snapshots: one pre-run, **one before every one of the eight
arms**, one immediately after the visitor's first call, one at end state.

| # | label | UTC | loaded | who |
|---|---|---|---:|---|
| 1 | pre-run, before any call | 07:22:22Z | 1 | qwen3.8:27b (17.54 GB) |
| 2 | seating: before qwen3.8:27b tier~1000 | 07:22:45Z | 3 | gemma4:12b (8.11), gemma4:26b (17.47), qwen3.8:27b (17.54) |
| 3 | seating: before gemma4:12b tier~1000 | 07:23:38Z | 3 | same three |
| 4 | seating: before gemma4:26b tier~1000 | 07:24:30Z | 3 | same three |
| 5 | seating: before a3b tier~1000 | 07:25:04Z | 3 | same three |
| 6 | **non-eviction: after the visitor's first call** | 07:25:18Z | **4** | gemma4:12b (8.11), gemma4:26b (17.47), **a3b (25.39)**, qwen3.8:27b (17.54) |
| 7 | seating: before qwen3.8:27b tier~8000 | 07:26:02Z | 4 | all four |
| 8 | seating: before gemma4:12b tier~8000 | 07:26:59Z | 4 | all four |
| 9 | seating: before gemma4:26b tier~8000 | 07:27:52Z | 4 | all four |
| 10 | seating: before a3b tier~8000 | 07:28:27Z | 4 | all four |
| 11 | end-state: after releasing the visitor | 07:29:17Z | 3 | gemma4:12b, gemma4:26b, qwen3.8:27b |

**The non-eviction receipt the 08-19 attempt could never take is taken.** The
fourth model loaded and evicted nothing: all four sat together, 63.80 GiB of
VRAM between them, for the whole ~8k tier. Residency law observed throughout —
every call to a resident carried `keep_alive: -1` explicitly, the visitor carried
`keep_alive: "5m"` and was released at the end with `keep_alive: 0`
(`done_reason: "unload"` at 07:29:14Z). **No resident was sent a `keep_alive: 0`
during the run, and nothing was restarted.**

### Bonus, unregistered — the published residency rows reproduce byte-for-byte

The August arrivals census published resident bytes at this same 32k context on
2026-08-13, on runtime `0.32.9`. This window re-read them on `0.32.13`, nine days
later:

| model | census (published) | this window | delta |
|---|---:|---:|---:|
| gemma4:26b | 16.27 GiB (17,474,319,810 B) | 16.27 GiB (17,474,319,810 B) | **+0.000%** |
| nemotron-3.5-lightning:30b-a3b | 23.64 GiB (25,386,863,820 B) | 23.64 GiB (25,386,863,820 B) | **+0.000%** |
| gemma4:12b | 7.55 GiB (read as found; the census marked its speed row NOT-RUN) | 7.55 GiB | match |

Identical to the byte, across a runtime version bump. Not pre-registered and not
claimed as a finding of this protocol — but it is a free re-verification of three
published rows, and it is worth recording.

## 7 · Against the published beside-traffic rows

**NOT PRE-REGISTERED.** `BENCH-PROTOCOL.md` does not call for this comparison, so
it is a descriptive addendum with its confounds named — never a protocol result.
The published source is the chair trials' C5 stopwatch kit (published
2026-08-13), which exhibit seventeen re-quotes. Computed by
`compare_beside_traffic.py` from the published JSON, not transcribed.

| tier | arm | window 2026-08-21 (quiet) | published (beside traffic) | window ÷ published | how comparable |
|---|---|---|---|---|---|
| ~1000 | qwen3.8:27b vs *qwen3.5:27b* | 107.71 [107.42–108.00] | 66.45 [66.29–66.49] | 1.62× | sibling version only |
| ~1000 | qwen3.8:27b vs *qwen3.6:27b* | 107.71 [107.42–108.00] | 66.48 [66.35–66.55] | 1.62× | sibling version only |
| ~1000 | **gemma4:12b** | 126.91 [126.73–126.96] | 105.67 [104.88–105.98] | **1.20×** | **same tag** |
| ~1000 | gemma4:26b | 208.04 [206.63–209.31] | — (no usable counters) | — | same tag, cell was empty |
| ~1000 | **a3b** | 127.91 [126.40–128.13] | 112.52 [112.43–112.63] | **1.14×** | **same tag** |
| ~8000 | qwen3.8:27b vs *qwen3.5:27b* | 102.78 [102.66–103.07] | 65.36 [49.93–65.53] | 1.57× | sibling version only |
| ~8000 | qwen3.8:27b vs *qwen3.6:27b* | 102.78 [102.66–103.07] | 65.54 [65.47–65.58] | 1.57× | sibling version only |
| ~8000 | **gemma4:12b** | 122.70 [120.18–123.33] | 101.91 [95.29–102.21] | **1.20×** | **same tag** |
| ~8000 | gemma4:26b | 201.72 [200.35–203.86] | — (no usable counters) | — | same tag, cell was empty |
| ~8000 | **a3b** | 132.44 [132.34–132.69] | 120.58 [114.33–120.87] | **1.10×** | **same tag** |

Three things fall out.

**The two same-tag pairs put a number on the quiet window: 1.10× to 1.20×.**
That is the honest size of "beside traffic" as a penalty for these two arms on
these two tiers — not the 2–3× a reader might fear.

**The tightness is the bigger story.** Ranges below are stated as
(max − min) ÷ median, the same rule for every row. In the quiet window
`gemma4:12b` at ~1k spanned 126.73–126.96 tok/s across ten calls — a **0.18%**
range. The published beside-traffic row for the same arm at ~8k spanned
95.29–102.21, a **6.79%** range, and `qwen3.5:27b` at ~8k spanned 49.93–65.53, a
**23.87%** range with a badly dragged min. A dragged min is the moment a live user
shared the card; in this window there are no dragged mins anywhere, because there
were no live users. The one caveat on reading tightness as quiet: §8 shows a
fixed prompt suppresses dispersion on a draft-assisted arm all by itself, so the
flagship's 0.4% range at ~8k is part window and part harness.

**Two cells the census could not fill are now filled.** `gemma4:26b` returned
zero usable counters at both the 1k and 8k tiers in the chair trials — the
degenerate-reply failure the 08-19 amendment diagnosed. The repeated-sentence
builder fixed it: this window returned full counters on all 20 of its calls.

Confounds this comparison cannot remove, and does not pretend to: the published
rows ran on runtime `0.32.9` against this window's `0.32.13`; the prompt corpora
differ (token counts land within one token, content does not); the dense
flagship is a *sibling version* with a draft head the published arms did not
have, so its 1.6× is not a contention delta and must not be read as one; and the
published rows carry their own caveat that their GIN-overlap fence was
UNMEASURED, not clean.

## 8 · A cross-lane finding worth keeping

The sister matrix lane's strongest result was that the draft head multiplies
run-to-run decode dispersion by 11× to 38× (its draft-4 cells have cv 2.0–6.4%,
its draft-0 cells 0.15–0.19%). This lane measured the same model, with the same
draft head, in the same window — and got cv ≈ 0.1%:

| lane | model | tier | n | decode median | range | (max − min) ÷ median |
|---|---|---|---:|---:|---|---:|
| matrix (nonce-headed prompts) | qwen3.8:27b draft 4 | ~1k | 30 | 109.13 | 101.32–114.14 | **11.75%** |
| this stopwatch (fixed prompt) | qwen3.8:27b draft 4 | ~1k | 10 | 107.71 | 107.42–108.00 | **0.54%** |

The two lanes are not in conflict; together they identify the mechanism. The
matrix varied the prompt on every call, so every call generated different text
and the draft head's acceptance rate varied with it. This lane sent a
byte-identical prompt at temperature 0 and seed 0, so every call generated
byte-identical text and acceptance was identical too.

**The practical warning: a fixed-prompt deterministic bench understates the
real-world variance of a spec-decoding arm by roughly 22× (11.75% ÷ 0.54%).**
A tight range on
such an arm is an artifact of the harness, not evidence of a stable seat. Any
seat decision that leans on a fixed-prompt draft-assisted reading is leaning on
a number that will not hold when real prompts arrive.

## 9 · Harness patch, recorded verbatim

`bench.py` was used as the instrument, not replaced. Pre-patch sha:
`30709e8d5bfd22f5c18c7692689875c06543d432a8ee44843cd98588a027ec91`. The
untouched copy is preserved as `bench.py.pre-patch`; the full unified diff is
`HARNESS-PATCH.diff` in this directory. Four changes, none of them touching the
posture, the prompt builder, the tiers, `n`, the call order, or the residency
law:

1. **`OUT_DIR` → `results-window/`** so this window's artifacts do not collide
   with the 08-19 attempt's directory. `RUN_ID` deliberately unchanged (the
   registered id); a new `EXECUTION` field records which attempt actually ran.
2. **Per-arm `/api/ps` seating receipt.** The brief makes the posture the point,
   so every arm records who was on the card when its rows were taken — 8 new
   receipts rather than only the pre-run / non-eviction / end-state three.
3. **Refusal rows, and leg-scoped rather than run-scoped aborts.** `Abort` gained
   a `run_level` flag: the protocol's 5-minute `total_duration` ceiling still
   stops the whole run, but a counter-less reply now stops only *its leg*, writes
   a structured REFUSAL row, and lets the run continue to the next arm. This is
   what the carried-forward amendment in `RESULTS.md` actually says ("aborts the
   leg") and what the window brief requires ("record REFUSAL rows on errors");
   the unpatched harness aborted the entire run, which is stricter than the
   amendment. **No refusal fired, so this path did not execute** — it is recorded
   because it was changed, not because it mattered.
4. **`window_posture` and `refusals` fields** in `runs.json`, plus a `mkdir` for
   the new output directory.

`analyze.py` also took a two-line change: the `runs.json` path is now an optional
argv (default unchanged) so the same analyzer reads this window's file, and it
prints the refusal rows. `contention_receipt.py` was **not** modified.

Three new scripts were written for this window and ship beside the data:
`verdicts.py` (scores P1–P5 from `runs.json`), `prefill_cache_check.py` (the §4
confound, quantified), and `compare_beside_traffic.py` (the §7 table, computed
from the published JSON). No figure in this document was typed by hand.

## 10 · End state

Per the window brief: **`qwen3.8:27b` resident at `keep_alive -1`, nothing else
loaded. CONTRACT MET**, verified at 2026-08-21T07:37Z.

The bench's own end state left the three protocol residents pinned. `gemma4:12b`
and `gemma4:26b` — the two models this run loaded for its own arms — were then
released with `keep_alive: 0`, one at a time, serially, **outside the scored run
and after `runs.json` was written**, so no measurement was affected. `qwen3.8:27b`
was never sent a `keep_alive` at all in that step; it still carries the runtime's
`expires_at: 2318-12-01`, which is how this runtime renders `keep_alive -1`.

| check | before the window (07:22Z) | after the window (07:37Z) |
|---|---|---|
| `/api/ps` loaded | 1 — `qwen3.8:27b`, 16.33 GiB | 1 — `qwen3.8:27b`, 16.33 GiB |
| GPU used / free | 23,862 / 73,386 MiB | 23,862 / 73,386 MiB |
| `llama-server` pid | 534684 | 534684 (**no restart**) |

The card is byte-for-byte back where it started. Full receipt:
`END-STATE-RECEIPT.txt`.

**⧖ DECISION — flagged for the window owner, not acted on by this lane.** The
brief's end state unloads `gemma4:26b`, which is a standing member of the box's
resident set and the live world-narrator seat. This lane complied with the brief
and did **not** touch `the-warm-seats-unit.timer`, `the-warm-seats-unit.service`, or any
other unit — re-pinning the standing set is the owner's call, and the timer will
do it unaided on its next fire. Named here because a cold narrator seat is a
product-visible consequence of a bench's tidy-up, and the owner should decide
rather than discover.

## 11 · Artifacts in this directory

| file | role |
|---|---|
| `runs.json` | every call, every runtime counter, all 11 residency receipts, the contention receipt, the refusal list (empty) |
| `WINDOW-RUN-2026-08-21.md` | this summary |
| `bench-window-2026-08-21.log` | the run's own stdout, call by call |
| `WINDOW-POSTURE-PRE.txt` | the box before the first call: `/api/ps`, GPU, runtime env, as-served runner flags, pre-window request mix |
| `CONTENTION-EVIDENCE.txt` | every load and every non-bench request inside the scored window, with blob-digest attribution |
| `END-STATE-RECEIPT.txt` | the release of the two run-loaded models and the final `/api/ps` |
| `HARNESS-PATCH.diff` | the verbatim unified diff applied to `bench.py` |
| `bench.py.pre-patch` | the untouched harness as it stood before this window |
| `verdicts.py` | scores P1–P5 from `runs.json` |
| `prefill_cache_check.py` | the §4 prompt-cache confound, quantified |
| `compare_beside_traffic.py` | the §7 table, computed from the published chair-trials JSON |

Harness shas after the run (`contention_receipt.py` is byte-identical to its
pre-window state — it was used, not modified):

```
91c038e1ea4a367beee0c543bb49f1b5b850e24d7e419ed2270f82f69fb20576  bench.py           (patched, see §9)
30709e8d5bfd22f5c18c7692689875c06543d432a8ee44843cd98588a027ec91  bench.py.pre-patch (as it stood before)
64f0c0851167b5ebfbbfb756bb296ad7c01f7a90dc25ceab76f11b70743c412c  analyze.py         (2-line argv change)
59c1bf72a460d540436c1ce96da97cc86dd6eec59b73701a4eca55d2486701bf  contention_receipt.py  (UNMODIFIED)
579c3579c5eb1a1c60810f02e1cc8e6865915952854f46432d77a5a903cdc9de  compare_beside_traffic.py
10fd23f6ed0e426b885913b8e820e4708a8e7791c85d7e751e3ae0fde617280f  prefill_cache_check.py
56bd70715d7064c9ac87937ff854db19ff22705d2e71721ca18faf95e3883e98  verdicts.py
```

## 12 · What this lane did not touch

No systemd unit, no timer, no daemon restart, no Modelfile edit, no model copy,
no model pull, no runner flag. The draft head was read, never set. Serial calls
only. Every number in this document comes from the runtime's own counters —
`prompt_eval_count`, `prompt_eval_duration`, `eval_count`, `eval_duration`,
`load_duration`, `total_duration`, and `/api/ps` — never from wall-clock timing.
`wall_s` is recorded per call in `runs.json` and is used nowhere in any table.
