1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
# perf-matrix.yaml — THE EXPECTED CELL SET, and the ONE place a number lives.
#
# Governing spec: docs/specifications/PP-LLAMA-001-MASTER.md, PP-1 (the expected
# cell set is enumerated HERE and the verdict asserts every one is present) and
# PP-33 (every threshold, floor, ceiling, ratchet direction and phase the gate
# reads lives in this file with `threshold_class` and `author`). A gate that only
# reads the receipts it was handed cannot tell a missing host from a passing one,
# and a threshold typed into a script cannot be changed without a code review of
# the gate.
#
# GROUNDING RULE (PP-33). Every number in this file is one of:
# policy — a deliberate product decision, needs an author, NOT a measurement
# inherited — set by a prior governing spec, precedence recorded
# ratchet — today's measurement, monotone thereafter
# There are no invented continuous thresholds. A baseline that has not been
# measured under a conformant protocol is UNMEASURED with an owner and an
# expiry -- never a plausible-looking number.
#
# CELL STATUS VOCABULARY (PP-1, §7.4). A baselines.<host>.<workload> cell is:
# MEASURED {receipt, commit, n, interleaved, bands: {c<N>: {agg, dec, prefill}}}
# the seed Arm A ratchets against. `receipt` must exist in the tree.
# UNMEASURED {owner, and EXACTLY ONE of expires | expires_after}
# temporary, COUNTED against the denominator, RED once expired.
# NA {reason, decided_by, date}
# permanent, excluded from the denominator. Never a silent skip:
# the gate prints the decision and its author on every run.
#
# WHO READS WHAT
# scripts/perf_gate.sh arms, phases, baselines, ladder, hosts,
# witness, stream, expiry_anchors
# scripts/lib/perf_receipt.py ladder.declared, protocol
# scripts/lib/parity_block.py ladder.declared, arms.L3.delta, derivation
# scripts/lib/bench_receipt.py derivation.ratio_tolerance
# scripts/check_perf_matrix_schema.sh every rule stated in this header
# scripts/check_thresholds_in_matrix.sh refuses a float literal in the readers
schema_version: 2
# ---------------------------------------------------------------- protocol --
# PP-22: the protocol values are part of the JOIN KEY, so two receipts taken
# under different windows are not comparable and must not be quotiented. The
# tree's dual-bound window (max(30, 8c) samples AND 60 s) with 2 warmup requests
# per worker and a 5 s quiesce is NORMATIVE; the 10 s cooldown between lanes is
# added here so an interleaved pair cannot inherit the previous lane's thermals.
protocol:
window_ms: 60000
warmup_requests_per_worker: 2
quiesce_ms: 5000
cooldown_ms: 10000
n_predict: 128
prompt_tokens: 512
replicates_min: 5
interleaved: true
# PP-28: an unpinned sampler is an unpinned measurement. `n_predict` travels
# on the wire as OpenAI `max_tokens`; the corpus spells it that way too.
sampler:
threshold_class: policy
author: spec-owner
# ---------------------------------------------------------------- ladder ----
# PP-24. The declared ladder is a REQUEST; the derived one is what both servers
# admitted. The ladder was copied into five files (parity_block.py,
# perf_receipt.py x2, llama_pin.toml, and here); it lives here now and the
# producers read it.
ladder:
declared:
derive_from:
threshold_class: policy
author: spec-owner
# --------------------------------------------------------------- witness ----
# PP-26. A batch-invariance witness with no minimum length agrees on nothing.
# `authors:` names the author of EACH number, because these two were decided by
# different people; the block-level `author` is the default for any key it omits.
witness:
# PP-26 (v3.1): batch invariance is measured where it exists -- every slot
# of an m=c batch of identical prompts must agree with every other slot to
# min_agree_tokens, and no slot may emit one token id for max_constant_run
# steps (#2753's signature ran for 116). The m=1 reference's agreement with
# the batch is RECORDED per band (`divergence_at`), not gated: on lambda it
# measures the fp divergence between kernel families, each of which is
# batch-size invariant to the end (evidence/perf041/lambda/). It becomes a
# gate when the top-2 margin instrument lands (master §12 row 22).
min_agree_tokens: 64
max_constant_run: 16
m1_agreement: report
max_age_days: 7
threshold_class: policy
author: spec-owner
authors:
provenance: "[M] 2026-09-02 lambda RTX 4090 (evidence/perf041/lambda/witness.json, m1-vs-m4-three-prompts.txt): intra-batch and cross-m agreement within a kernel family reach n_predict; m=1-vs-batch agreement is kernel-family fp divergence, recorded not gated"
# ---------------------------------------------------------------- stream ----
# PP-27. A replayed stream reports the whole response at the end, so
# client_ttft/e2e approaches 1. At or above this the stream is not live.
stream:
live_ttft_over_e2e_max: 0.95
threshold_class: policy
author: spec-owner
# ---------------------------------------------------- comparator template ----
# PP-20 / PP-15. The comparator lane is a QUANTITY per band, never a boolean
# flag: `-np {c}`, `-c {c} * n_ctx_slot`. A numeric batch size <= 1 switches
# llama.cpp's batching OFF and is REFUSED rather than tuned.
comparator_template:
n_ctx_slot: 1024
n_ctx_slot_min: 640
n_batch_min: 2
refuse_n_batch_le: 1
kv_type: f16
fa: auto
threshold_class: policy
author: spec-owner
# ------------------------------------------------------------- derivation ----
# The tolerance a DERIVED ratio must reproduce its own samples within. It is a
# policy number like any other: it used to live as `RATIO_TOLERANCE = 0.01` in
# scripts/lib/bench_receipt.py, where no matrix change could reach it.
derivation:
ratio_tolerance:
# The bound above which a ratio is likelier a measurement error than a win.
# It used to be `CEILING = 1.50` in scripts/lib/parity_block.py, beside a
# `STRETCH = 1.50` that gated nothing at all.
sanity_ceiling:
hosts:
lambda:
accelerator: rtx-4090
compute_class: cuda
comparator: llamacpp
reachable_by:
ci_runner: none
gx10:
accelerator: gb10
compute_class: cuda
comparator: llamacpp
reachable_by:
ci_runner: none
intel:
accelerator: cpu
compute_class: cpu
comparator: llamacpp
reachable_by:
ci_runner: self-hosted
# PP-16 / #2841. `compute_class: metal` named a path NO BUILD IN THIS TREE CAN
# REACH -- crates/aprender-serve pins trueno-gpu with features ["cuda"] and
# there is no Metal inference path at all -- so every receipt this host could
# produce would have declared a class its binary never took. The honest cell
# is NA with a decider and a date, not a class nothing implements.
mini:
accelerator: m4
compute_class: null
comparator: llamacpp
reachable_by:
ci_runner: none
status: NA
reason: >-
apr has no Metal inference path; W1 cannot be measured under any class
this build reaches (#2841).
decided_by: spec-owner
date: '2026-09-02'
github_issue: 2841
# yoga joined the fleet 2026-09-09 (paiml/infra#486, YOGA-NIGHTLY-001). It is
# declared here for ONE reason and its cells say so: PP-19's host-isolation
# rule reads its host vocabulary from this block, so cuda-nightly's `ada-yoga`
# job could not name a valid `perf-yoga` group until yoga existed here.
# scripts/check_perf_concurrency_groups.sh found that job ungrouped the hour
# it was written. The jobs that name it are 67-D1 cuda-unit and 67-D2, the
# sm_89 parity host; rack-mounted, permanent, RTX 4060 Laptop (sm_89, 8 GB),
# driver 595.
#
# NO PERFORMANCE CELL, deliberately, and this is not an oversight to be filled
# in later (YOGA-NIGHTLY-001 §7, N-4): SILICON_FLOORS is keyed on compute
# capability, and yoga answers `8.9` — the same key as the 24 GB / ~450 W
# desktop 4090 the floor was derived from, from an 8 GB / 100 W laptop. The
# UNCALIBRATED-SILICON refusal cannot fire because the key MATCHES while the
# device does not. Until that is re-keyed (R-7), any number measured here
# would be compared against a floor from another machine.
yoga:
accelerator: rtx-4060-laptop
compute_class: cuda
comparator: llamacpp
reachable_by:
ci_runner: self-hosted
status: NA
reason: >-
correctness-only host. SILICON_FLOORS is keyed on compute capability and
yoga shares 8.9 with the 4090 the floor came from, so no throughput number
taken here is comparable to anything (YOGA-NIGHTLY-001 §7, R-7, N-4).
decided_by: spec-owner
date: '2026-09-09'
workloads:
arms:
# ---------------------------------------------------------------- Arm A ----
# PP-31. The arm used to ratchet scaling_efficiency(c) = (agg(c)/agg(1))/c
# UP-ONLY, which FALLS when agg(1) improves: a faster single-client path made
# the gate redder. Self-regression ratchets the QUANTITIES, per band, against
# the value the last MEASURED receipt on protected main achieved.
# scaling_efficiency and overhead_share are REPORTED and never gated.
A:
name: self-regression
phase: release
comparator_required: false
threshold_class: ratchet
direction: down-is-fail
statistic: lcb95
n_min: 5
author: perf-gate
metrics:
reported:
# --------------------------------------------------------------- Arm L3 ----
# PP-3 / PP-17 / §7.5. B1 (aggregate floor 0.80, authorless) and B2 (decode
# floor 1.00, `inherited_from` a document that never existed in any ref) are
# REPLACED by one non-inferiority arm. The gated set is ASYMMETRIC by band
# because the two metrics measure different things: at c=1 the aggregate IS
# the decode, and at c>1 the aggregate is the only number a deployment feels.
# PASS iff ratios.<metric>.lcb95 >= 1 - delta. An (cell, band, metric) absent
# from `armed_by` is REPORTING -- a gate arms when a measurement arms it,
# never on a date (P-6).
L3:
name: parity
phase: release
comparator_required: true
statistic: lcb95
threshold_class: policy
author: spec-owner
gated:
reported:
delta:
# Written by the first PASS: armed_by.<host>.<wl>.c<c>.<metric> = {receipt, commit}
armed_by:
rising_decode_trap: >-
decode_ratio RISING while agg_ratio FALLS is the serialization signature,
not a win: each request owns the whole device in turn. The measurement
that named this trap is recorded in evidence/parity/LEDGER.md -- see the
2026-08-25 row for commit 53062e7f3, whose validity_by_band marks c>1
INVALID-BUILD. The digits are deliberately NOT quoted here: PP-12 forbids
publishing a c>1 aggregate from that run, and this file used to quote two
of them.
# ---------------------------------------------------------------- Arm C ----
C:
name: integrity
phase: both
comparator_required: false
# The integrity rules (completed == requested, timeouts fatal, tokenization
# stated, drain recorded, zero-token bands refused) are unchanged from the
# governing spec this one supersedes; the precedence is recorded rather than
# re-derived, and scripts/check_perf_matrix_schema.sh checks the path exists.
threshold_class: inherited
inherited_from: docs/archive/perf-2026-09-01/APR-PERF-GATE-001-v2.2.md
author: spec-owner
# -------------------------------------------------------------- Arm L1 -----
# The v3 wire rules that need no timing: server_config presence, the derived
# ladder, the stream witness, the batch-invariance witness, the sampler pin,
# the raw sample rows, the join key and the roofline. Static, so `both`.
L1:
name: v3-schema-rules
phase: both
comparator_required: false
# ------------------------------------------------------------ expiry -------
# The UNMEASURED-cell clock. Split out of Arm A (PP-6): Arm A is a RELEASE
# arm, but "this cell has been UNMEASURED past its deadline" is a static fact
# about the matrix that a merge can and should see. Keeping it inside Arm A
# would have moved eleven armed rules to release in the same commit that
# demoted Arm A, which is a disarm wearing the shape of a refactor.
expiry:
name: baseline-clock
phase: both
comparator_required: false
# ------------------------------------------------------------- Arm C-sig ---
C_sig:
name: signature-freshness
phase: release
comparator_required: false
# --------------------------------------------------------- cell set --------
cells:
name: cell-completeness
phase: release
comparator_required: false
# ---------------------------------------------------------------- Arm D ----
D:
name: memory-efficiency
phase: reporting
promote_with: PERF-001
# The NOTE threshold: refusing work while memory sits reserved-and-empty is
# the contiguous-allocation signature this arm exists to catch. It was a
# bare `0.5` in perf_gate.sh with no author and no matrix row.
note_kv_utilization_below: 0.5
threshold_class: policy
author: perf-gate
# ---------------------------------------------------------------- Arm E ----
E:
name: prefill-decode-interference
phase: reporting
workload: W2
promote_with: PERF-001
# RATCHET BASELINES. Arm A is comparator-free, so it is the primary gate -- but
# a ratchet needs a measurement to ratchet FROM. Both committed 745fa8588 runs
# are SPENT and withdrawn (evidence/parity/LEDGER.md rows 1 and 2: the subject
# binary was built with continuous batching compiled out), so there is still
# nothing conformant to seed from. Committing a number anyway would be exactly
# the fabricated-baseline class this file exists to remove.
#
# THE FOUR W1 CELLS NO LONGER EXPIRE BY CALENDAR. They carried
# `expires: '2026-09-25'`, which would have turned Arm A into a date-armed FAIL
# on four hosts with no conformant measurement path in existence -- P-6 says no
# gate arms by date. The deadline is now the §12 row that BLOCKS the
# measurement, through the `expires_after` anchor mechanism below.
baselines:
lambda:
W1:
status: UNMEASURED
owner: perf-gate
reason: >-
Blocked on PP-LLAMA-001 row 18 (the reference measurement). The
745fa8588 lambda run is SPENT and its ratios are withdrawn.
expires_after:
W2:
status: UNMEASURED
owner: perf-gate
# NOT A CALENDAR DATE, deliberately. All four W2 cells carried
# `expires: '2026-09-25'`, and under this file's own GROUNDING RULE that
# number is none of policy / inherited / ratchet -- it is an invented
# continuous threshold, in the one file that says there are none. It also
# contradicted the section it implements: W2's expiry is dated from an
# EVENT ("PERF-001 merge + 30 days"), not from the calendar, because
# "a serialising server has no batch for a long prefill to interfere
# with, so W2 measures nothing today and a blocking W2 would be
# permanently red -- a gate people learn to walk past".
#
# The clock is therefore ARMED BY THE ANCHOR below, not by a date typed
# here. Until PERF-001 merges the cell REPORTS and says so, naming what
# has to happen; the PR that lands batching sets `merged_on` and the
# 30-day clock starts.
expires_after:
expiry_decided_by: '@noah'
expiry_cites: PP-LLAMA-001 §12
expiry_decided_on: '2026-08-29'
reason: >-
W2 is REPORTING and non-blocking. Its expiry is "PERF-001 merge + 30
days", owner @noah. The 2026-09-25 this cell used to carry had no
author (PERF-056, #2777).
D1:
# 0.65.2 post-publish dogfood parity protocol (scripts/llama_pin.toml#protocol.http,
# qwen2.5-coder-1.5b-instruct q4_k_m, ladder 1/4/8/16). NOT W1/W2: perf_gate.sh
# --workload accepts only W1|W2, so this cell is a RECORDED seed (P-6, seeded at
# achieved) that no arm consumes yet; nothing here is ARMED (armed_by untouched).
# Ledger: evidence/parity/LEDGER.md row 7. Decision: decided_by noah 2026-09-05,
# these receipts are the 0.66 baseline; discovery baseline 8e1e9ad40.
status: MEASURED
receipt: evidence/dogfood/0.65.2/lambda.json
commit: 8e1e9ad40
n: 5
interleaved: true
subject: 'published 0.65.2, default features (cpu lane; parity.lanes[0])'
bands:
c1:
c4:
c8:
c16:
D1-cuda:
# 0.65.2 post-publish dogfood parity protocol (scripts/llama_pin.toml#protocol.http,
# qwen2.5-coder-1.5b-instruct q4_k_m, ladder 1/4/8/16). NOT W1/W2: perf_gate.sh
# --workload accepts only W1|W2, so this cell is a RECORDED seed (P-6, seeded at
# achieved) that no arm consumes yet; nothing here is ARMED (armed_by untouched).
# Ledger: evidence/parity/LEDGER.md row 8. Decision: decided_by noah 2026-09-05,
# these receipts are the 0.66 baseline; discovery baseline 8e1e9ad40.
status: MEASURED
receipt: evidence/dogfood/0.65.2/lambda.json
commit: 8e1e9ad40
n: 5
interleaved: true
subject: 'published 0.65.2 installed with --features cuda (parity.lanes[1])'
bands:
c1:
c4:
c8:
c16:
gx10:
W1:
W2: *w2_expires_with_perf_001
D1:
# 0.65.2 post-publish dogfood parity protocol (scripts/llama_pin.toml#protocol.http,
# qwen2.5-coder-1.5b-instruct q4_k_m, ladder 1/4/8/16). NOT W1/W2: perf_gate.sh
# --workload accepts only W1|W2, so this cell is a RECORDED seed (P-6, seeded at
# achieved) that no arm consumes yet; nothing here is ARMED (armed_by untouched).
# Ledger: evidence/parity/LEDGER.md row 9. Decision: decided_by noah 2026-09-05,
# these receipts are the 0.66 baseline; discovery baseline 8e1e9ad40.
status: MEASURED
receipt: evidence/dogfood/0.65.2/gx10.json
commit: 8e1e9ad40
n: 5
interleaved: true
subject: 'published 0.65.2, default features; block REFUSED, c1 from parity_attempt'
bands:
c1:
c4:
c8:
c16:
intel:
W1:
W2: *w2_expires_with_perf_001
D1:
# 0.65.2 post-publish dogfood parity protocol (scripts/llama_pin.toml#protocol.http,
# qwen2.5-coder-1.5b-instruct q4_k_m, ladder 1/4/8/16). NOT W1/W2: perf_gate.sh
# --workload accepts only W1|W2, so this cell is a RECORDED seed (P-6, seeded at
# achieved) that no arm consumes yet; nothing here is ARMED (armed_by untouched).
# Ledger: evidence/parity/LEDGER.md row 10. Decision: decided_by noah 2026-09-05,
# these receipts are the 0.66 baseline; discovery baseline 8e1e9ad40.
status: MEASURED
receipt: evidence/dogfood/0.65.2/intel.json
commit: 8e1e9ad40
n: 5
interleaved: true
subject: 'published 0.65.2, default features; block REFUSED, c1 from parity_attempt'
bands:
c1:
c4:
c8:
c16:
# An NA host has no denominator cells. Both are NA with a decider and a date;
# `cell-completeness` passes an NA cell with no receipt at all, and says so.
# yoga is NA for the same STRUCTURAL reason mini is, with a different cause:
# mini has no Metal path to measure, and yoga has no floor its numbers could
# be compared against — 8.9 is the 4090's key (YOGA-NIGHTLY-001 §7, R-7).
yoga:
W1:
W2:
mini:
W1:
W2:
D1:
# 0.65.2 post-publish dogfood parity protocol (scripts/llama_pin.toml#protocol.http,
# qwen2.5-coder-1.5b-instruct q4_k_m, ladder 1/4/8/16). NOT W1/W2: perf_gate.sh
# --workload accepts only W1|W2, so this cell is a RECORDED seed (P-6, seeded at
# achieved) that no arm consumes yet; nothing here is ARMED (armed_by untouched).
# Ledger: evidence/parity/LEDGER.md row 11. Decision: decided_by noah 2026-09-05,
# these receipts are the 0.66 baseline; discovery baseline 8e1e9ad40.
status: MEASURED
receipt: evidence/dogfood/0.65.2/mini.json
commit: 8e1e9ad40
n: 5
interleaved: true
subject: 'published 0.65.2, default features; block REFUSED, c1 from parity_attempt'
bands:
c1:
c4:
c8:
c16:
# EXPIRY ANCHORS (PERF-056, #2777; PP-LLAMA-001 §8). A cell may date its expiry
# from an EVENT rather than the calendar, via `expires_after: {anchor: ID,
# days: N}`. §12 does exactly this for every non-root row and the matrix had no
# way to say it, so the rule was flattened into a hardcoded date that
# contradicted the section it came from.
#
# An unresolved anchor is NOT a free pass and NOT a silent one: the cell REPORTS
# with the anchor, its owner and its status printed on every run, so "W1 is
# still waiting on row 18" is a line in the gate output rather than an
# assumption. `perf_gate.sh` FAILS a cell whose anchor is undeclared here, whose
# `days` is not a non-negative integer, that declares both `expires` and
# `expires_after`, or whose anchor claims `status: merged` while recording no
# `merged_on` -- an expiry hanging off an event nothing defines is the absent-
# `expires` hole wearing a different field name.
#
# `scripts/spec_conformance.sh` derives each anchor's date from the master's §12
# blocked_by DAG and writes evidence/parity/derived_expiries.json; these entries
# are the matrix half of that join.
expiry_anchors:
PERF-001:
owner: '@noah'
github_issue: 2706
# DECLARED STATE, checked against docs/roadmaps/roadmap.yaml on 2026-08-29:
# `status: in_progress`, downgraded from completed the same day by PERF-041
# because the credited "3.32x aggregate at N=8" was throughput of GARBAGE
# tokens -- batched CUDA decode emitted a constant token to the max_tokens
# cap for every m>1 and never emitted a stop token (#2753), while the m=1
# fast path in the same run returned coherent English.
status: in_progress
# Set by the PR that lands batching. Null means the clock has not
# started; it does not mean the cell is exempt.
merged_on: null
decided_by: '@noah'
cites: PP-LLAMA-001 §12
PP-LLAMA-001-row-15:
owner: perf-gate
status: open
merged_on: null
decided_by: spec-owner
cites: PP-LLAMA-001 §12 row 15
reason: gx10 shakedown; until it lands, no gx10 W1 cell can be measured conformantly.
PP-LLAMA-001-row-18:
owner: perf-gate
status: open
merged_on: null
decided_by: spec-owner
cites: PP-LLAMA-001 §12 row 18
reason: the reference measurement; until it lands, no host has a seed for Arm A.
# CELL EXCEPTIONS. A per-(host, band, arm) exception, distinct from a cell
# status: a band may be NOT_APPLICABLE for the comparator arm and still fully
# gated by Arm A, which needs no comparator.
# NOT_APPLICABLE — permanent, excluded from the denominator, needs decided_by
# UNMEASURED — temporary, COUNTED against the denominator, needs an owner
# and an expiry, and goes RED once expired
# `comparator` must name a comparator some host declares; the entry that used to
# sit here named `vllm`, which no host in this file has ever declared, so it
# could not match any receipt and had never been read.
cell_exceptions:
- host: gx10
band: 16
comparator: llamacpp
arm: L3
status: NOT_APPLICABLE
permanent: false
decided_by: spec-owner
decided_on: '2026-09-02'
reason: >-
gx10 admitted 32 slots against llama.cpp's server default; the c=16 pair is
re-keyed by PP-24's derived ladder rather than compared across unequal
admission. Removed when row 15 lands.