# Draft-head bracketed matrix — RESULTS

- **Run id:** `drafthead-matrix-2×3-2026-08-19`
- **Executed (UTC):** 2026-08-21T06:35:47Z – 2026-08-21T07:09:30Z (33 m 43 s)
- **Where:** the inference workstation, inside a declared maintenance window
- **Runtime:** ollama 0.32.13
- **Model:** `qwen3.8:27b` (Q4_K_M, 27.3B, ctx 32768)
- **Pre-registration:** `../PROTOCOL.md`, sha256
  `d4a44d904d925d5886fdbb825a8a02c0cdf549ae0622d7e63a60f383f0adda75` —
  verified byte-identical to the window brief's pinned value **before** the
  first scored call and again **after** the last. Not amended; no REFUSED-if-amended
  condition arose.
- **Raw:** `runs.json` (consolidated + derived), `../results/runs.jsonl`
  (one row per call, written incrementally), `../results/meta.json`,
  `../results/run.log`
- **Calls:** 270 scored, 0 refusals, 0 errors of any kind

---

## 1. HEADLINE

Three things came out of this run, and they should be read in this order.

**(a) The bracket DISAGREES at n=30.** Block A and block B — same
`draft_num_predict 4`, same posture, 11 minutes apart with the draft-0 block
between them — differ by 5.72% at the ~8k tier and 3.67% at ~32k, both outside
the brief's ~3% tolerance. Per the brief's own law, **the draft-head
contribution figures in §4 are published as a disagreement, not as a
conclusion.**

**(b) The pre-registered prediction is MIXED.** Its first clause holds
decisively: with the draft head disabled the tier ordering is monotonic and
gently declining. Its second clause fails: the 8k > 1k inversion **did not
reappear** with the draft head enabled. There was no inversion in this run to
attribute to anything — not in block A, not in block B, not pooled, not at
n=10, not at n=30.

**(c) The finding this run actually establishes is about variance, not
ordering.** The draft head multiplies run-to-run decode dispersion by roughly
11× to 38× depending on tier. With the head off, decode is a metronome
(σ = 0.10–0.14 tok/s, cv ≈ 0.15–0.19%). With it on, the same cells scatter
(σ = 2.2–7.0 tok/s, cv ≈ 2.0–6.4%). This is the mechanism the hypothesis
proposed — draft acceptance is a property of the text being generated, not of
prompt length — observed directly and at high confidence. It is a *mechanism*
result, and it is not the same thing as the ordering claim the prediction made.

---

## 2. WHAT RAN

The bracketed design from the window brief, exactly:

| block | `draft_num_predict` | window (UTC) | runner restart |
|---|---|---|---|
| A | 4 (shipped default) | 06:35:57Z – 06:46:43Z | none — already at 4 |
| Z | 0 | 06:46:43Z – 06:58:20Z | **yes**, `load_duration` 4590.3 ms |
| B | 4 | 06:58:20Z – 07:09:27Z | **yes**, `load_duration` 5142.0 ms |

**Two runner restarts total**, as designed — not sixty. Every call carried
`draft_num_predict` explicitly at its block's value, so no call could silently
change the runner's launch flags; within a block every `load_duration` sat at
282–300 ms, which is the no-restart signature established by the capability
probe.

Posture on every scored call (the C5 posture): `num_ctx 32768`, `think: false`
explicit, `temperature 0`, `seed 0`, `num_predict 256`, `keep_alive -1`,
serial, 0.5 s between calls.

Prompt tiers were repetition-built and calibrated against the tokenizer at run
start (97.0 tokens per repetition unit, 66.9 tokens of template overhead). Every
call carried a unique nonce at the **head** of the prompt, so no call could be a
prefix-cache hit. Measured prompt sizes were exact and invariant across all 270
calls:

| tier | units | measured `prompt_eval_count` |
|---|---|---|
| ~1k | 10 | 1041 (all 90 calls) |
| ~8k | 84 | 8219 (all 90 calls) |
| ~32k | 319 | 31015 (all 90 calls) |

The ~32k tier leaves 1497 tokens of headroom under `num_ctx`, so no prompt was
silently truncated.

Warm-up: 2 unscored calls after each block's configuration change, discarded.
Tiers were round-robined within each block (rep-major), so any within-block
drift spreads evenly across tiers instead of pooling into one.

---

## 3. CELL TABLE — decode throughput (tok/s), n = 30 per cell

| block | draft | tier | median &nbsp; [min – max] &nbsp; IQR | n=10 median | output tokens |
|---|---|---|---|---|---|
| A | 4 | ~1k | **109.13** &nbsp; [101.32 – 114.14] &nbsp; 106.22–111.09 | 111.54 | 170 [158–197] |
| A | 4 | ~8k | **109.60** &nbsp; [96.70 – 121.15] &nbsp; 103.64–116.47 | 104.79 | 174 [158–200] |
| A | 4 | ~32k | **94.41** &nbsp; [86.05 – 103.99] &nbsp; 89.93–95.86 | 94.99 | 206 [158–211] |
| Z | 0 | ~1k | **76.11** &nbsp; [75.89 – 76.36] &nbsp; 76.00–76.28 | 76.27 | 192 [156–204] |
| Z | 0 | ~8k | **74.46** &nbsp; [74.27 – 74.70] &nbsp; 74.37–74.63 | 74.61 | 174 [141–211] |
| Z | 0 | ~32k | **68.94** &nbsp; [68.78 – 69.18] &nbsp; 68.89–69.04 | 69.02 | 200 [171–208] |
| B | 4 | ~1k | **109.08** &nbsp; [100.85 – 113.11] &nbsp; 107.63–110.04 | 108.77 | 176 [166–193] |
| B | 4 | ~8k | **103.50** &nbsp; [95.82 – 122.57] &nbsp; 100.19–110.98 | 103.50 | 182 [140–217] |
| B | 4 | ~32k | **91.01** &nbsp; [86.18 – 103.81] &nbsp; 89.84–94.72 | 92.32 | 202 [160–218] |

Output length was not held fixed — generations ran to a natural stop between 140
and 218 tokens rather than hitting the 256 cap. Throughput is a rate, so this
does not bias the comparison, but it is recorded because it is one of the things
that varies per call and therefore one of the things the draft head's acceptance
rate responds to.

Prompt-eval throughput, for context — it is stable between the two draft-4
blocks to within 0.6%, which matters for §4:

| block | ~1k | ~8k | ~32k |
|---|---|---|---|
| A (draft 4) | 2353 | 3430 | 3222 |
| Z (draft 0) | 2801 | 3671 | 3443 |
| B (draft 4) | 2341 | 3411 | 3211 |

---

## 4. THE BRACKET — it disagreed, and here is the disagreement

| tier | block A | block B | gap | within ~3%? |
|---|---|---|---|---|
| ~1k | 109.13 | 109.08 | **0.04%** | yes |
| ~8k | 109.60 | 103.50 | **5.72%** | **NO** |
| ~32k | 94.41 | 91.01 | **3.67%** | **NO** |

**Bracket verdict: DISAGREE.** Two of three tiers are outside tolerance.

Bootstrap on the A−B median difference (20,000 resamples, independent
resampling of each block):

| tier | A − B (tok/s) | 95% CI | excludes zero? |
|---|---|---|---|
| ~1k | +0.05 | [−1.58, +1.32] | no |
| ~8k | +6.10 | [−0.06, +9.98] | no (only just) |
| ~32k | +3.40 | [+0.05, +4.52] | **yes** |

So the ~32k gap is a real difference between the two blocks; the ~8k gap, though
larger in percent, is not statistically separable from zero.

### What the disagreement is, and what it is not

Per the brief this is where the draft-head contribution stops being a
conclusion. It is still worth stating precisely what moved, because the run
carries its own controls:

- **The box did not drift.** The draft-0 block ran *between* A and B and is
  stable to ±0.25 tok/s across all 90 of its calls. Prompt-eval throughput in A
  and B matches to within 0.6%. A thermal or contention drift large enough to
  move the draft-4 8k median by 6 tok/s would have moved these too. It did not.
- **The ~1k tier agrees to 0.04%.** A process-level offset between the two
  runners would not spare the 1k tier and hit only the other two.
- **The disagreement is concentrated where the draft-4 arm is noisiest.** The
  cells that failed are the cells with cv 4.1% and 6.4%; the cell that passed
  has cv 2.0–2.8%.

That points at sampling variance inside a high-dispersion arm rather than at
session contamination. But note the honest consequence, which cuts against the
design rather than for it: **a ±3% agreement tolerance is not a drift detector
for an arm whose coefficient of variation is 6.4%.** At n=30 the standard error
of the 8k median is ≈1.6 tok/s, so a ±3% band (±3.2 tok/s) is roughly ±2 SE — a
band that will fail on chance alone a meaningful fraction of the time. The
bracket did not malfunction; it was specified without knowing the dispersion of
the thing it was checking.

### The bracket at the pre-registered n

The brief's design bullet states n=10 per tier; its call-count arithmetic
(90 per block, 270 total, ~45 min) requires n=30. This run executed n=30 and
reports both. At the pre-registered n=10 the bracket **passes on all three
tiers**:

| tier | A (n=10) | B (n=10) | gap | within ~3%? |
|---|---|---|---|---|
| ~1k | 111.54 | 108.77 | 2.52% | yes |
| ~8k | 104.79 | 103.50 | 1.23% | yes |
| ~32k | 94.99 | 92.32 | 2.85% | yes |

This is reported for completeness and **is not offered as a rescue.** Taking the
n=10 pass over the n=30 failure would be choosing the sample size by its answer.
The executed design is n=30 and its bracket verdict is DISAGREE. What the n=10
row genuinely shows is that the pass/fail flips with sample size, which is
further evidence that the tolerance is measuring noise rather than drift.

---

## 5. ANSWER 1 — draft-head contribution per tier

**Published as a disagreement per §4, not as a ratified figure.**

| tier | draft-4 (pooled A+B) | draft-0 | ratio | cost of disabling | share of the 2.95× ceiling |
|---|---|---|---|---|---|
| ~1k | 109.08 | 76.11 | **1.43×** | 30.2% | 49% |
| ~8k | 105.14 | 74.46 | **1.41×** | 29.2% | 48% |
| ~32k | 92.44 | 68.94 | **1.34×** | 25.4% | 45% |

Against the measured 2.95×-acceptance ceiling from the prior capability receipt,
the realized speedup lands at **45–49% of the theoretical maximum**, with the
remainder consumed by drafting and verification overhead. The ratio declines
gently with prompt depth (1.43× → 1.34×).

The pre-registered sub-claim — *"disabling the draft head is expected to cost
roughly 20–50% of decode throughput"* — is **CONFIRMED**: measured cost is
25.4–30.2%, inside the predicted band at every tier.

> One coincidence to defuse before someone else finds it: the prior probe
> measured draft *acceptance* at 49.1%, and this run's ceiling utilization is
> 45–49%. These are different quantities and their proximity is arithmetic
> coincidence, not a derivation. Do not write them up as the same number.

---

## 6. ANSWER 2 — the anomaly test

The question the matrix existed to answer: **does 8k > 1k appear only in
draft-4 rows?**

| arm | ~1k | ~8k | ~32k | monotonic declining? | 8k > 1k? | 8k vs 1k |
|---|---|---|---|---|---|---|
| draft-4, pooled A+B | 109.08 | 105.14 | 92.44 | **yes** | no | −3.61% |
| draft-4, block A | 109.13 | 109.60 | 94.41 | no | (+0.44%) | +0.44% |
| draft-4, block B | 109.08 | 103.50 | 91.01 | **yes** | no | −5.11% |
| draft-0 | 76.11 | 74.46 | 68.94 | **yes** | no | −2.16% |

Bootstrap on the within-arm 8k−1k median difference:

| arm | 8k − 1k | 95% CI | excludes zero? |
|---|---|---|---|
| draft-4 (pooled) | −3.94 | [−5.54, +1.13] | no |
| draft-0 | −1.64 | [−1.83, −1.45] | **yes** |

And on the 32k−8k step, where both arms decline unambiguously:

| arm | 32k − 8k | 95% CI | excludes zero? |
|---|---|---|---|
| draft-4 (pooled) | −12.70 | [−18.19, −9.95] | yes |
| draft-0 | −5.52 | [−5.67, −5.43] | yes |

### Verdict on the pre-registered prediction: **MIXED**

Stated plainly, both halves:

- **The draft-0 clause is CONFIRMED, and emphatically.** With the head disabled
  the ordering is 1k > 8k > 32k, monotone, gently declining, with the 8k−1k step
  separated from zero by a bootstrap CI of [−1.83, −1.45] and a per-cell σ of
  0.13 tok/s. This is the expected physics, and the draft-0 arm renders it
  almost noise-free. Whatever else is true, **KV-cache depth does impose a
  gentle monotone decode penalty on this model, and that penalty is now
  measured**: −2.16% from 1k to 8k, −7.4% from 8k to 32k.

- **The draft-4 clause is NOT CONFIRMED.** The inversion did not reappear. The
  pooled draft-4 ordering is monotone declining like draft-0's, and the pooled
  8k−1k difference is statistically indistinguishable from zero. Block A alone
  shows a +0.44% 8k-over-1k excess, which is a rounding error against that
  cell's 7.0 tok/s σ, and it vanishes at n=10 and reverses in block B.

Because the prediction is conditional — *the inversion will reappear with the
head enabled* — and no inversion appeared, the matrix **cannot attribute
exhibit fourteen's anomaly to the draft head.** Not because the draft head was
exonerated, but because the phenomenon under investigation did not occur in this
run. The hypothesis is neither confirmed nor refuted; it is **untested by this
data**, and it should be recorded that way in register #8.

Note carefully what this run does *not* license: it does not say the inversion
was imaginary, and it does not say the draft head is innocent. It says the
inversion is **not a reproducible property of this posture on this prompt
corpus**, which is a narrower and better-supported claim.

### Why the verdict is trustworthy even though the bracket failed

The bracket failure bears on §5's magnitudes. It does not undermine §6, because
§6's finding is robust across every slicing of the data: no inversion appears in
block A at n=10, block B at n=10 or n=30, the pool at either n, or the draft-0
arm anywhere. The one cell that shows any 8k-over-1k excess shows +0.44%, which
is a fortieth of the effect C5 reported. A conclusion that survives all six
independent slicings is not resting on the two blocks agreeing.

---

## 7. ANSWER 3 — the ~1k draft-4 tier against C5's 115.69

| reading | ~1k decode median (tok/s) |
|---|---|
| C5 (prior stopwatch leg, same posture, same runtime version) | **115.69** |
| this run, block A (n=30) | 109.13 |
| this run, block B (n=30) | 109.08 |
| this run, pooled draft-4 (n=60) | 109.08 |

Relative difference: **−5.71%**. C5's 1k figure sits above this run's pooled
median but *inside* its observed range (max single call 114.14 in A, 113.11 in
B), so the 1k tiers are broadly compatible.

**The 8k tier is not compatible, and this is the sharpest unexplained thing in
the run.** C5 reported 133.54 tok/s at ~8k. The fastest single ~8k call observed
here across 60 draft-4 calls was **122.57**, and the fastest in block A was
121.15. C5's 8k median therefore lies **above the maximum of every 8k
measurement this run produced**. That is not sampling variation within one
distribution — the distributions do not overlap at that point.

So the honest reading of Question 3 is two-part:

1. At ~1k, this run and C5 agree to within 6%, which is unremarkable given a
   2.0–2.8% cv and different prompt content.
2. At ~8k, this run cannot reproduce C5's figure at all, and the gap is outside
   the range of anything measured here. **Something about C5's ~8k condition
   differed from this run's ~8k condition**, and until that is identified, C5's
   inverted ordering should not be treated as a measured property of the model.

The leading candidate is the prompt corpus. This run's prompts are
repetition-built from a single paragraph; C5's were not. Draft acceptance
depends on the text being generated, and a corpus that elicits highly
predictable continuations will accept more drafted tokens and decode faster. A
repetition-heavy prompt plausibly elicits *different* continuation entropy than
C5's material at the same token count. That is a testable proposition, not a
finding — see §9.

---

## 8. THE VARIANCE FINDING — what this run establishes best

This was not a pre-registered question, and it is the most solid thing the
matrix produced.

| cell | σ (tok/s) | cv | | cell | σ (tok/s) | cv |
|---|---|---|---|---|---|---|
| A ~1k (draft 4) | 3.04 | 2.78% | | Z ~1k (draft 0) | 0.14 | **0.19%** |
| A ~8k (draft 4) | 7.00 | 6.39% | | Z ~8k (draft 0) | 0.13 | **0.17%** |
| A ~32k (draft 4) | 3.86 | 4.09% | | Z ~32k (draft 0) | 0.10 | **0.15%** |
| B ~1k (draft 4) | 2.21 | 2.02% | | | | |
| B ~8k (draft 4) | 6.65 | 6.43% | | | | |
| B ~32k (draft 4) | 3.77 | 4.14% | | | | |

With the draft head off, thirty consecutive calls at ~8k returned decode rates
spanning 74.27 to 74.70 tok/s — a total spread of 0.43 tok/s over eleven
minutes. With it on, the same tier spans 95.82 to 122.57.

**The draft head is the dominant source of run-to-run timing variance on this
model — roughly 11× the dispersion at ~1k, 27× at ~32k, and 37× at ~8k.**

Two consequences worth carrying forward:

1. **Any decode benchmark of a spec-decoding model needs far more samples than
   one of a non-spec model to reach the same confidence.** At cv 6.4%, n=10
   gives a median with ~2.6% standard error; distinguishing a 3% effect needs
   n in the hundreds, not tens. Several existing readings were taken at n=10.
2. **The mechanism half of the register #8 hypothesis is supported even though
   its prediction is not.** Acceptance-driven variance is real, large, and
   content-dependent — exactly as the hypothesis reasoned. What the hypothesis
   got wrong was expecting that variance to express itself as a *stable,
   reproducible ordering* between tiers. It does not; it expresses itself as
   scatter.

---

## 9. WHAT SHOULD HAPPEN NEXT

Ordered by what each buys.

1. **Replay C5's actual prompt corpus at both draft settings.** This is the
   direct test of §7's leading candidate and the only route that can close
   exhibit fourteen's anomaly. Same bracketed design, same two-reload cost, but
   with C5's material instead of repetition-built prompts. If the inversion
   reappears on C5's corpus and not on this one, the anomaly is a corpus
   property and the register entry can be closed honestly.
2. **Re-specify the bracket tolerance from measured dispersion.** A fixed ±3% is
   the wrong instrument. The tolerance should be derived from the arm's own
   observed cv — e.g. agreement within 2 standard errors of the block median —
   so the check fails when the session drifted rather than when the dice landed.
3. **Re-examine any published decode figure taken at n=10 on this model.** §8
   sets the precision of an n=10 median on a spec-decoding arm at roughly ±2.6%
   at ~8k. Figures quoted more tightly than that are quoted beyond their
   resolution.

---

## 10. RESIDENCY, HEALTH AND END STATE

**Residency.** `/api/ps` was sampled at eight points. At every one, the loaded
set was exactly one model — the subject — with far-future expiry. No other model
was loaded at any point, by this lane or anything else.

| phase | UTC | resident | VRAM | expiry |
|---|---|---|---|---|
| pre-run | 06:35:47Z | subject only | 16.33 GiB | 2318 |
| block A start | 06:35:57Z | subject only | 16.33 GiB | 2318 |
| block A end | 06:46:43Z | subject only | 16.33 GiB | 2318 |
| block Z start | 06:46:55Z | subject only | 16.53 GiB | 2318 |
| block Z end | 06:58:20Z | subject only | 16.53 GiB | 2318 |
| block B start | 06:58:31Z | subject only | 16.33 GiB | 2318 |
| block B end | 07:09:27Z | subject only | 16.33 GiB | 2318 |
| post-run | 07:09:30Z | subject only | 16.33 GiB | 2318 |

Incidental observation: the spec-off runner reports **0.20 GiB more** resident
VRAM than the spec-on runner (16.53 vs 16.33 GiB), consistently across both
draft-0 samples. Recorded, not explained; it is the opposite of the naive
expectation and may simply be an allocation-accounting difference.

**Health.** Eight front-page GETs on the live product (front page only, never an
ask), one at each block boundary: all **HTTP 200**, 0.134–0.148 s. No 5xx, no
slowness, no pause triggered.

**End state.** The brief requires `draft_num_predict` restored to the shipped
default of 4, verified. Block B left the runner at 4; the end-state probe at
07:09:28Z re-asserted 4 and returned `load_duration` **287.7 ms** — the
no-restart signature. Had the runner been at any other value, that call would
have forced a relaunch and reported 4000–5000 ms as blocks Z and B both did.
**The runner is on its shipped default and was not disturbed after block B.**

That probe also returned 115.25 tok/s at the ~1k tier, above this run's 1k
median and close to C5's 115.69 — a single call, quoted only because it is the
end-state receipt and someone will otherwise wonder why it is not in the tables.
It is n=1 and means nothing on its own.

**Not touched, per the lane's standing laws:** no systemd unit, no warm timer,
no daemon restart, no Modelfile edit, no model copy, no model loaded that the
brief did not name. Every configuration change went through a per-request option
on the named subject and nothing else.

---

## 11. FILES

| file | contents |
|---|---|
| `RESULTS.md` | this document |
| `runs.json` | consolidated cells, bracket, bootstrap, verdicts |
| `../results/runs.jsonl` | one row per call, written incrementally during the run |
| `../results/meta.json` | calibration, health checks, residency samples, refusals |
| `../results/run.log` | the run's own progress log |
| `../results/WINDOW-RUN-2026-08-21.md` | window-owner summary |
| `../matrix_run.py` | the driver as executed |
| `../matrix_analyze.py` | jsonl → runs.json, medians, bootstrap, verdicts |
| `../matrix_tables.py` | runs.json → the tables above |

All timestamps UTC. All artifacts box-neutral: no host, port, address, unit
name, or hardware part appears in any of them, including the code — the endpoint
is read from the environment at run time and never written down.
