160 model configurations, 616 runs, 17 suites, on one Mac Studio between 23 August 2026 and 20 September 2026. Every run is shown, including the 3 that were flagged, and every finding we later changed our mind about. Nobody paid for a slot.
Provenance
Hardware Mac Studio M1 Max, 64GB unified memory Runtimes llama.cpp b10369 (6e62ba538), Metal; mlx-lm 0.31.3 Window 23 August 2026 – 20 September 2026 Ids every run carries dataset_id, grader_id and configuration_id; two results compare only when all three match. Data cortext-benchmarks, copied 2026-10-01
One square per run, grouped by suite, in the order they ran. Hover a square for the model, score and date.
3 runs were flagged void or killed. They stay on the drawing.
90%+ 75–89% 50–74% under 50% no score / flagged
Fig. 2 — 616 runs by suite23 August 2026 – 20 September 2026
616 runs, one square each, grouped by suite and ordered by time. Solid squares scored 90 percent or more, dense hatching 75 to 89, light hatching 50 to 74, open squares under 50, dotted squares have no score. The last row holds runs flagged void or killed.
screening84
nullschema83
grounding63
worldview56
toolcall49
synthesis49
toolscale46
chainwalk32
tagger31
epistemics25
tagger nullable25
contract25
tools22
enrichment17
needle4
sitebuild1
shapegen1
Flagged void / killed3
Fig. 3Speed
Active parameters set the speed.
Twenty-two builds under one controlled llama-bench. A mixture-of-experts model reads a slice of itself per token, so a 35B with 3B active decodes 5.3 times faster than a 27B dense model on the same Mac.
Quantisation does not reliably buy speed. Byte alignment does: Q4_0 runs at twice the speed of Q4_K_M at the same bit width.
Fig. 3 — Decode speed against active parameters22 builds
The table behind Fig. 3
Fleet bench, controlled llama-bench, one build per row
Model
Quant
Arch
Total
Active
GB
Decode tok/s
Prefill tok/s
Gemma 4 E2B
q4_0
dense
4.6B
2B*
3.4
109.9
1363
Gemma 4 26B-A4B
q4_0
MoE
25.2B
4B
14.4
70.1
678
Gemma 4 E4B
q4_0
dense
7.5B
4B*
5.2
66.7
696
Qwen3-Coder 30B-A3B
Q4_K_M
MoE
30.5B
3B
18.6
64.4
645
Agents-A1 4B
Q4_K_M
dense
4.2B
4.20575B
2.7
53.5
650
Agents-A1 35B-A3B
Q4_K_M
MoE
34.7B
3B
21.2
52.3
625
Ornith 1.5 35B-A3B
Q6_K
MoE
35.5B
3B
29.2
50.3
611
Nemotron Lightning 31B-A3.5B
Q4_K_M
MoE
32.9B
3.5B
25.5
50.0
519
Qwen3.6 35B-A3B
UD-Q5_K_M
MoE
35.5B
3B
27.1
46.1
627
Ornith 1.5 35B-A3B
Q5_K_M
MoE
35.5B
3B
25.4
45.2
573
Qwen3 8B
Q4_K_M
dense
8.2B
8.19074B
5.0
41.1
384
Qwen3 8B
Q8_0
dense
8.2B
8.19074B
8.7
37.0
440
Gemma 4 12B
q4_0
dense
11.9B
11.9074B
7.0
34.2
268
Qwen3.5 9B (MTP)
Q4_K_M
dense
9.2B
9.19709B
5.9
32.5
358
Qwen3.5 9B
Q4_K_M
dense
9.0B
8.9538B
5.7
31.7
354
Qwen3.5 9B
Q8_0
dense
9.0B
8.9538B
9.5
31.6
413
Qwen3.5 9B (MTP)
Q8_0
dense
9.2B
9.19709B
9.8
31.6
412
Qwen3.5 9B (community fine-tune)
IQ4_NL
dense
9.2B
9.19709B
6.8
30.5
385
Gemma 4 31B
q4_0
dense
30.7B
30.6973B
17.6
15.3
101
ThinkingCap 27B
Q4_K_M
dense
27.3B
27.3207B
16.8
10.3
101
Muse Glimmer 30B
kquant
dense
27.9B
27.8548B
19.6
9.8
99
Qwen3.8 27B
UD-Q4_K_XL
dense
27.3B
27.3207B
17.9
8.8
93
* Gemma E-series: effective parameters.
Fig. 4Which model for which job
No model wins everything.
Seven models across eleven suites. The best score in each column is in signal ink. The leader changes from suite to suite, which is why the rig seats by verb rather than crowning a winner.
The board · % correct · best per suite in signal ink
Model
nullschema
worldview
grounding
epistemics
toolcall
contract
synthesis
enrichment
screening
tagger
tagger nullable
Bonsai 8B 1-bit 68.5 tok/s · 1.1 GB
19.4
40
55.2
80.8
0
20.8
65
83
86.7
80.3
86.3
Ornith 35B-A3B 53.4 tok/s · 21.7 GB
36.1
85
76
—
80
66.7
—
—
—
—
—
BTL-4 Q4_K_M 48.5 tok/s · 20.5 GB
44.4
55
76.8
100
93.3
70.8
83.3
98.8
91.7
96.4
94.1
Qwen3.8-9B distill 30.8 tok/s · 9.8 GB
18.1
40
67.2
95.8
0
25
83.3
95.9
91.7
94.4
96.3
BTL-4 IQ2_XXS 23.6 tok/s · 10.0 GB
36.1
62.5
76.8
100
76.7
64.6
80
98.7
95
96.5
96.2
Bonsai 27B 1-bit 20.0 tok/s · 3.5 GB
18.1
40
67.2
87.5
100
25
35
95.1
96.7
91.7
95
Bonsai 27B ternary 17.3 tok/s · 7.2 GB
27.8
42.5
68.8
85.4
100
75
66.7
88.4
93.3
96.2
97.9
chainwalk omitted: n=2 for every model, never a usable sample. n per cell on hover.
Fig. 5Context
Context costs memory, not speed.
Eight models from 8K to 128K tokens of context, and Gemma 4 12B to 256K. Decode speed holds flat across the ladder; resident memory climbs. Context is a memory budget, not a speed tax.
Gemma 4 E2B’s first reading is a cold start and is shown as measured.
tokens / second resident GB
Nemotron Lightning 30B
8K → 128K · memory 23.4 → 24.1 GB
Qwen3.6 35B-A3B
8K → 128K · memory 24.5 → 27.5 GB
ThinkingCap 27B
8K → 128K · memory 16.4 → 24.1 GB
Gemma 4 31B
8K → 128K · memory 20.5 → 30.1 GB
Muse Glimmer 30B
8K → 128K · memory 18.0 → 20.4 GB
Gemma 4 E2B
8K → 128K · memory 3.3 → 4.1 GB
Gemma 4 E4B
8K → 128K · memory 5.1 → 7.1 GB
Gemma 4 12B
8K → 256K · memory 8.1 → 12.1 GB
Fig. 6Lanes
Parallel slots buy lanes.
Three Gemma 4 models served with 1 to 16 parallel slots. Aggregate throughput rises 2.9–3.0× across the sweep: more lanes, not a faster lane.
Fig. 6 — Aggregate throughput against slotsnp sweep
Fig. 7Findings
Where we changed our mind.
79 findings over 25 days. The 7 in signal ink were revised when later runs disagreed. They are published with the revision, not quietly dropped.
Two seats detect temporal conflicts, not one: k2-horizon-36b matches ornith at 4/4
Detecting a conflict where one record simply dates itself later and disagrees is something ornith-35b-a3b and k2-horizon-36b-a4b both do at 4/4. The other three seats score 0-50%. No seat produces false positives, so the fleet's failures are uniformly missed conflicts rather than invented ones.
contradiction/1 probe, 48 cases (32 conflict across 8 shapes, 16 no-conflict controls), identical prompt and grader for every seat. implicit arm: ornith 4/4, bonsai-2 PTQ1_0 2/4, btl-4 1/4, edge0-35b 0/4, k2-horizon-3.7b 0/4. Overall conflict detection: ornith 91%, btl-4 78%, bonsai-2 75%, edge0 72%, k2 12%. Controls: 16/16 for all five. The headerless arm -- a figure in a table row whose column header is absent -- is 0/4 for four seats and 1/4 for ornith, a uniformity that indicates the case rather than the models. Added 2026-09-18: k2-horizon-36b-a4b Q4_0, same probe, implicit 4/4, overall 39/48 (81%), controls 16/16, headerless 0/4 like everyone else. The original version of this finding named ornith as the only capable seat because k2-36b had not been run -- it was tested only in its 3.7B form, which scores 12% on conflict detection and is a tool seat.
Action Route temporal-conflict work to ornith or k2-horizon-36b. Do not generalise from a model family's small variant to its large one: k2-horizon-3.7b at 12% and k2-horizon-36b at 72% conflict detection are the same family and not interchangeable evidence.
2026-09-17Revised
SwiftLM allocates ~10x mlx_lm's transient memory per prefill token, which is what created every context ceiling attributed here to models or hardware
Measured with a fresh server per data point and a single request each, SwiftLM's peak process footprint rises ~29-34 GB over idle while prefilling a 12,000-token prompt. mlx_lm rises 3.0 GB on the same prompt, on two different models. The transient is roughly linear in prompt length at ~2.5 GB per 1,000 tokens, which pushes a 20 GB model past a 64 GB machine at around 15K tokens.
Fresh server, one request, peak phys_footprint sampled at 2 Hz. qwen3.6-35B-A3B-4bit at 12,000 tokens: SwiftLM idle 19.0 -> peak 53.0 GB (delta 34.0), mlx_lm idle 19.0 -> peak 22.0 GB (delta 3.0). gemma-4-26b-a4b-4bit at 12,000 tokens: SwiftLM 14.0 -> 43.0 (delta 29.0), mlx_lm 14.0 -> 17.0 (delta 3.0). SwiftLM's own GPU_MEM stays flat at 19-21 GB (qwen) and 15.6-15.8 GB (gemma) across every context depth, so the growth is host-side and not the GPU KV cache -- its own kv_cache_gb estimate is 0.3 GB. mlx_lm continues to 60,000 tokens at 29.0 GB total and dies near 70,000 on '[METAL] Command buffer execution failed: Insufficient Memory'. The mechanism inside SwiftLM is NOT established: the magnitude is ~3x a full-vocabulary fp32 logit vector per position, but qwen has the smaller vocabulary (248,320 vs 262,144) and the larger transient, so vocabulary does not explain it and the prefill loop in their mlx-swift-lm fork was not read.
Action Use mlx_lm for long-context work; treat SwiftLM's context ceiling as a property of SwiftLM until its prefill allocation is understood. Measure memory with a FRESH server per data point: both runtimes retain allocator pools across requests, and reusing one server produced internally contradictory per-token figures here (12,233 KB/token at 3K falling to 1,818 KB/token at 30K on the same server) that are artefacts of pool retention, not measurements of anything.
2026-09-15Revised
Abstention ranges 18-61 percent across the fleet, and declining is not the same skill as noticing a correction
CORRECTED 2026-09-15, twice in one day. The original claim -- that nullschema sits between 18 and 44 percent across every model measured, and that BTL-4 Q4_K_M at 44.4 was the first above 40 -- was FACTUALLY WRONG. qwen3.6-35b-a3b scored 61.1 percent (n=72) and was already in the results when the finding was written; it was omitted from the comparison set. The real range is 18.1 to 61.1. Abstention is still a fleet weakness, but it is not a wall at 44, and the gap between best and worst is far wider than stated.
nullschema, 72 cases each: qwen3.6-35b-a3b 61.1, BTL-4 Q4_K_M 44.4, BTL-4 IQ2_XXS 36.1, ornith-35b-a3b-q40 36.1, MiniCPM5-2B 31.9, ternary-bonsai-27b 27.8, bonsai-8b-1bit 19.4, bonsai-27b-1bit 18.1, qwen3.8-9b-distill 18.1. nullschema, 72 cases each: BTL-4 Q4_K_M 44.4, BTL-4 IQ2_XXS 36.1, ornith-35b-a3b-q40 36.1, ternary-bonsai-27b 27.8, bonsai-27b-1bit 18.1, bonsai-8b-1bit 19.4, qwen3.8-9b-distill 18.1. Best-in-class before this session was 36.1. CRITICAL QUALIFIER: worldview/2 breaks abstention into arms, and the ordering inverts. On the `superseded` arm -- a fact whose correction is also on record -- BTL-4 Q4_K_M scores 0/8 and ternary-bonsai-27b 0/8, while ornith-35b-a3b-q40 scores 8/8. BTL-4's failure mode is recorded as right_value_not_flagged (8) and overclaimed (7): it retrieves the stale value and states it without qualification. So the best abstainer on absent fields is among the worst at spotting a superseded one. `single_source` is worse still and fleet-wide: 0/8, 0/8, 2/8 -- nothing reliably flags uncorroborated evidence, consistent with models-do-not-detect-conditions.
Action Build the comparison set from every label in benchmarks/results, not from the models under discussion. This finding was written from a four-model table while nine models had scores. Keep admit.py in front of anything that writes to the graph regardless of which model is serving. Use nullschema as the gate for any new model considered for an extraction role, and treat anything below 50 percent as requiring external grounding. Screen an extraction candidate on nullschema AND on worldview/2's superseded and single_source arms, not nullschema alone. Where a role depends on using the latest version of a record, ornith-35b-a3b is currently the only model measured that does it reliably.
2026-09-14Revised
Q4_0 decodes up to 2x faster than Q4_K_M at the same bit-width, and emits valid JSON more reliably
REVISED -- scoped to DENSE models; unvalidated on MoE. Q4_0 and Q4_K_M are both ~4.5 BPW. Q4_0 decodes 1.25-2.04x faster and produces parseable output under constrained decoding far more often. It does NOT improve abstention judgement -- that was a formatting artefact, corrected below.
Identical weights, one variable. granite-guardian-8b 36.84 -> 52.22 tok/s; Qwen3.5-9B 31.24 -> 43.84 at tg64 and 21.60 -> 44.11 at tg128; qwen3.8-27b 9.79 -> 15.18; k2-36b 39.85 -> 49.67. Q4_K_M DEGRADES with output length while Q4_0 holds flat, so the gain is larger in real use than short benchmarks show (1.40x at 64 tokens, 2.04x at 128). On k2-36b's nullschema the headline 54.2 -> 65.3 decomposes as: malformed 12 -> 3, misattributed 21 -> 22. The gain is entirely fewer unparseable responses under response_format; the grader marks those enforcement_absent, i.e. arguably void runs. Judgement was unchanged. Mechanism: Q4_K_M uses 256-element super-blocks with 6-bit quantised scales and promotes some tensors to Q6_K; Q4_0 is 32-element blocks with a full fp16 scale, two weights per byte. SCOPE (2026-09-14): every model in this evidence set whose architecture is recorded is DENSE -- granite-guardian-4.1-8b and qwen3.8-27b confirmed from their GGUF headers; k2-36b is no longer on disk and its architecture is not recorded anywhere. The ratio above is therefore a dense-model result and was stated without scope. Suggestive counter-observation, NOT a measurement: two 35B-A3B MoEs serving side by side gave agents-a1 (Q4_K_M) 49.1 t/s against ornith-1.5 (Q4_0) 53.4 t/s, a ratio of 1.10x. Those are DIFFERENT WEIGHTS, so it is not a quantisation comparison and cannot confirm anything. No MoE model exists on this disk in two formats, so the clean same-weights test has not been run.
Action Do NOT apply this ratio when sizing or selecting an MoE seat -- it is unvalidated there. To close the gap, requantise one MoE to a second format (agents-a1 Q4_K_M -> Q4_0 is the cheapest path; decode speed depends on layout, not on requantisation quality loss) and run llama-bench on both. RESOLVED 2026-09-15: the MoE question is now measured, and the answer differs by format family -- see iq-codebook-penalty-transfers-to-moe-kquant-does-not. K-quant penalty falls to 1.10x on a sparse MoE; IQ codebook penalty RISES to ~2.1x. Use that finding, not this one, when sizing an MoE seat.
2026-09-14Revised
Byte alignment, not bit count, governs decode speed
REVISED -- scoped to DENSE models; unvalidated on MoE. Quantisations whose bit width divides a byte evenly (8, 4, 2) sustain far more of peak memory bandwidth than those that straddle byte boundaries (5, 6). A smaller file can be slower than a larger one.
Qwen3.5-9B, same weights requantised four ways, repeated on two prompts with under 0.3 percent variance. Q4_0 45.4 tok/s at 60 percent of 400 GB/s; Q6_K 32.1 at 59 percent; Q8_0 31.4 at 75 percent; Q5_0 30.5 at 48 percent, the worst despite being smaller than Q6_K and Q8_0. Stock Q4_K_M 32.8 at 47 percent. Independently reproduced by llama-bench: Q4_0 44.59 +/- 0.01 against Q4_K_M 31.45 +/- 0.03, a 1.42x gap. Same pattern on the 27B: Q4_0 15.8 tok/s at 62 percent beats IQ3_S 11.5 at 35 percent while being 30 percent larger. SCOPE (2026-09-14): every model in this evidence set whose architecture is recorded is DENSE -- granite-guardian-4.1-8b and qwen3.8-27b confirmed from their GGUF headers; k2-36b is no longer on disk and its architecture is not recorded anywhere. The ratio above is therefore a dense-model result and was stated without scope. Suggestive counter-observation, NOT a measurement: two 35B-A3B MoEs serving side by side gave agents-a1 (Q4_K_M) 49.1 t/s against ornith-1.5 (Q4_0) 53.4 t/s, a ratio of 1.10x. Those are DIFFERENT WEIGHTS, so it is not a quantisation comparison and cannot confirm anything. No MoE model exists on this disk in two formats, so the clean same-weights test has not been run.
Action Serve Q4_0 wherever a build exists. Do not chase sub-4-bit for speed; the unpacking cost grows faster than the byte saving. Do NOT apply this ratio when sizing or selecting an MoE seat -- it is unvalidated there. To close the gap, requantise one MoE to a second format (agents-a1 Q4_K_M -> Q4_0 is the cheapest path; decode speed depends on layout, not on requantisation quality loss) and run llama-bench on both. RESOLVED 2026-09-15: the MoE question is now measured, and the answer differs by format family -- see iq-codebook-penalty-transfers-to-moe-kquant-does-not. K-quant penalty falls to 1.10x on a sparse MoE; IQ codebook penalty RISES to ~2.1x. Use that finding, not this one, when sizing an MoE seat.
2026-09-11Revised
Quantisation format changes output CONVENTIONS, not abstention judgement
REVISED. The original claim -- that Q4_0 helps from uniform K-quants and hurts from dynamic quants -- read two different formatting artefacts as opposite capability changes. The measure of actual fabrication is unchanged by format in both directions.
Decomposing nullschema failures by type: k2-36b Q4_K_M -> Q4_0 moved malformed 12 -> 3 with misattributed 21 -> 22. qwen3.8-27b UD -> Q4_0 moved verbal-declines 6 -> 11 with misattributed 11 -> 11, identical. So k2 'improved' by emitting valid JSON more often and the 27B 'degraded' by phrasing refusals as text more often. Neither model changed how often it asserted a wrong value. A third model, Qwen3.5-9B, appeared to lose 16.7 points; 24 of 24 absent-case failures were the literal phrase 'not mentioned' -- a correct refusal in an unaccepted form.
2026-09-11Revised
Badly-chosen mixed precision costs abstention; sensitivity-aware mixing protects it
REVISED 2026-09-11. The original claim -- that non-uniform precision degrades abstention at equal average bit-width -- fails on both halves. The bit-widths were never equal, and a principled mixed-precision scheme BEATS uniform quantisation on abstention. What matters is whether the allocation is sensitivity-aware, not whether it is uniform.
The original comparison used qwen3-next-80b-reap mlx-mixed36, which declares bits:4 but overrides 487 of 542 tensors DOWN to 3-bit -- a bit-width comparison wearing a mixed-precision label. Reconverting the same prune at mixed36's own base settings (4-bit, group 64, affine, no overrides) gave nullschema 84.7% vs 47.2%, but toolcall fell 78.3% -> 25.0%. Decisively, on qwen3.8-27b the direction reverses: its Unsloth Dynamic baseline (per-tensor overrides protecting sensitive tensors) scores nullschema 76.4%, and uniform Q4_0 on the same weights scores 69.4% -- 0 cases fixed, 5 broken, every one an abstention case (3 lure, 2 absent). Mixed precision chosen by sensitivity protects exactly the capability uniform quantisation loses.
Latest
2026-09-20Confirmed
Typed decisions split across a routing table, not a winner; the only arm you can put a threshold on matters more than the most accurate one
On a 36-case typed-decision bench (evidence/modality/temporal/alias, class-balanced, one gold rendered as both NLI pair and letter question), no arm wins everything and the operational ranking is set by confidence separation, not accuracy. A 395M CPU NLI model (von-1.0) solves the two families LLMs fail; the most accurate LLM is unmonitorable; the seated tools model systematically abstains from temporal judgment rather than erring.
2026-09-20Confirmed
Two near-identical ModernBERT decision models invert each other's family profile, killing the encoder-prior hypothesis and completing a two-encoder CPU decision layer
The hypothesis that bidirectional encoders are intrinsically suited to temporal/alias reconciliation is falsified in its strong form. Von-1.0 (395M ModernBERT, NLI-trained) and Laya-421M (ModernBERT, typed-decision RL-trained) score opposite profiles on the same immutable 36 cases: what one aces the other flunks. The decision profile is a property of the TRAINING DATA, not the encoder -- and the two checkpoints happen to be complementary, covering three of four families between them on CPU.
2026-09-19Confirmed
A 34 MB model routes tool calls in ~110 ms but fires on small talk, misses jargon, and scrambles any extraction with more than two roles
Cactus Needle 3 is a real single-purpose artefact: direct-phrased tool selection at ~110 ms on CPU for 34 MB. Its usefulness ends precisely where the fleet's needs begin -- it invents tool calls on no-op inputs, misses paraphrase and jargon, and cannot keep subject/predicate/object roles straight in extraction, so it cannot gate, cannot route unsupervised, and cannot fill edges.
2026-09-19Confirmed
A typed decision costs one forward pass on an existing seat: 300 ms, calibratable distribution, no generation -- but only with few-shot examples and only where the runtime exposes logprobs
The OpenJev pattern -- ask a typed question, set max_tokens=1, read the probability distribution over the option tokens -- works against the fleet's llama.cpp seats as they are already running. Three conditions decide whether it works at all: the request must disable thinking or the read lands on reasoning logits; the prompt must carry few-shot examples or accuracy is near chance; and the serving runtime must return top_logprobs, which llama.cpp does and mlx_lm's server does not.
2026-09-18Confirmed
edge0 scores 0/8 on worldview's conflicting arm and 81% on a probe that varies one thing at a time; the arm was measuring three skills at once
worldview/2's conflicting arm reported edge0-35b as unable to notice that two records disagree. A 48-case probe that separates the variables says otherwise: edge0 detects conflicts in 72% of cases with zero false alarms, and its one real deficit is temporal. The arm's 8 cases each require conflict detection PLUS entity aliasing PLUS inferring a table column header from a fragment, and a failure on the composite cannot say which part failed.
2026-09-18Confirmed
The NaN in chad's wide-S kernel is the speculative-verify path, which is why the M1 Max gets 1.88x from the drafter where an M4 Pro gets 3.5x
On an M1 Max the fused quantized-KV attention never installs, so the cache stays fp16 at 65,536 B/token instead of 34,816. The cause is narrow: the wide-S kernel used for speculative verification returns NaN at short context, while the narrow decode kernel passes every probe. Because the numeric self-check refuses the whole module on any failure, decode loses a fast path that works.
ExperimentsTen questions, answered
Measured, not extrapolated.
Ten experiments that each asked one practical question of the hardware. Three hold up outright; the rest come with conditions, and one does not work at all.
Conditional
Two models resident at once
Can the box hold a planner and an executor simultaneously, so the plan-to-execute handoff costs nothing?
Yes, at 81920 context each, with 1.17GB of headroom. Measured 50.63GB against a ~51.8GB Metal working set. It fits, but nothing else can be running.
Holds up
Context ladder
What does each context rung actually cost in resident memory, and where is the safe ceiling?
KV cache scales with layers x kv-heads x ctx, NOT with active parameters. Decode speed is identical at every rung, context costs memory, never throughput. UPDATED 23 Aug: gemma4-31b being worst-in-fleet (+9.6GB to 128k) is about ITS 16 KV heads across 10 full-attention layers, not the Gemma 4 family. gemma4-12b holds 262144, twice the context, in 12.07GB, and at 131072 costs 10.07GB against qwen3-8b's 22.7GB. A 12B dense at less than half the price of an 8B dense at the same window. Note the caveat: per-token predictions from config arithmetic missed in BOTH directions across this family (E2B on target, E4B 2.3x over, 12B 0.5x under), so the ladder is the fact and the arithmetic is not.
Holds up
MLX versus llama.cpp
Which runtime is faster once you normalise for bits per weight?
MLX is ~1.45x faster. MLX with no speculation beats llama.cpp with MTP. The runtime is worth more than any speculation scheme.
Does not work
DSpark speculation
Does DSpark speculative decoding pay on an M1 Max?
No, it loses. 0.68-0.80x on qwen3-8b, 0.53-0.77x on muse-glimmer. Speculation spends memory bandwidth, which is the resource already saturated.
Conditional
Nemotron MTP
Does the embedded MTP draft head help Nemotron Lightning?
Only on structured output. 1.18x on maths, 0.84x on chat, it costs 16% on ordinary conversation, so it is OFF in the preset.
Conditional
MTPLX, paired sampling
Does MTPLX's speculation transfer to an M1 Max, measured under concurrent load?
Not on the model tested, but the test used a 4B on the 'speed' variant and the conclusion was over-generalised to the chip. Needs a retest with the 27B build before it counts.
Holds up
Quantisation quality
Does a 4-bit quant still do the job?
GGUF k-quant scored 28/30 on extraction, categorisation and tagging. The MLX 4-bit run returned 0/30, all UNMEASURED, not all wrong. Validity gating is why that distinction survived.
Holds up
Needle in a haystack, retrieval at full window
Allocating a long context is not the same as using one. Does the model actually RETRIEVE across its full native window?
gemma4-e2b and gemma4-e4b are 9/9 each, every length, every depth, including 126,976 tokens. The sliding-window architecture was the obvious thing to doubt (28 of E2B's 35 layers see only 512 tokens, 20 don't compute their own KV) and it retrieves flawlessly anyway. The cost is entirely PREFILL: ~1000 t/s at 8k falls to ~170 t/s at 127k, roughly 3x worse per token. Decode stays flat, so 'context costs memory, not throughput' holds for decode and NOT for prefill, which is the axis that governs agentic work at 31:1. The three older models here show NO MEASURED CASES, not zero scores: 36 rows with empty completions from the max_tokens bug, excluded rather than counted as misses.
Holds up
Fleet baseline, controlled llama-bench
What are prefill and decode actually worth on this box, measured without prompt-cache state, chat templates or thinking variance?
Quantisation does NOT reliably buy decode speed. Qwen3.5-9B decodes at ~31 t/s across IQ4_NL, Q4_K_M and Q8_0 -- a 1.9x range in bytes per token for a 4% range in throughput. Ornith Q6_K really is faster than Q5_K_M (50.3 vs 45.2, 11.3%) while being 15% larger, so that anomaly survives a clean measurement. Prefill splits the fleet 6x by active parameters: ~3B-active MoEs run 519-678 t/s, dense 27-31B run 93-101 t/s.
Conditional
dflash draft models
Does dflash speculation help, and does the newer build change it?
Helps on structured text only, 1.32x code, 1.25x maths, 1.00x chat. `model-draft` is mandatory or it silently no-ops.
SeatsWho holds which verb
Who holds which seat.
Settled on 20 September 2026. A model that was a candidate before then and did not win a seat is listed in the models index as measured, not seated, with why it was tried and what came of it.
Seats on Item 2, the Mac Studio (M1 Max, 64 GB) · as of 20 September 2026
Most suites grade mechanically, with no judge model: an answer either carries the right value and a valid address, or it fails. Open a suite for its method, grading and caveats.
chainwalk · chainwalk/3 How deep can the model chain tool calls before it loses its place?
Method
Each step appends a call and its result to the history. By step 200 the model is reading a long transcript of its own work. The suite records how far it gets and whether it deviates.
Grading
Depth reached against depth targeted, plus a check on arithmetic carried across steps.
Caveat
Chaining and arithmetic separate cleanly. Models walk 200 steps without deviating and still get the running total wrong.
Cases
2
Runs
16
contract · contract/2 Will a model follow an output convention it can only obtain by asking for it?
Method
Four arms over the same extraction task, where the answer is always absent from the document. In silent, nothing is said. In told, the convention is stated in the system prompt. In fetch, a tool is offered that returns the convention and the prompt points at it. In unmentioned, the same tool is present but nothing refers to it. The convention is an arbitrary sentinel string, so it cannot be recalled from training.
Grading
Binary. A case passes only when the field carries the exact sentinel. Abstaining in the model's own words fails, and is classified separately from inventing a value.
Caveat
A grader bug conflated a missing field with a present null field until 2026-09-09, mislabelling every null abstention as unparseable output. Pass rates were unaffected but failure-mode breakdowns before that date are wrong.
Cases
48
Runs
9
enrichment · enrichment/3 Can a local model do the enrichment work the memory layer needs?
Method
Turns are enriched with structured context. The suite measures whether the enrichment is usable downstream rather than whether it reads well.
Grading
Field level checks against the expected structure.
Caveat
Small case count. Treat single runs as indicative only.
Cases
54
Runs
4
epistemics · epistemics/4 Does the model answer from the document it was given, or from what it already knows?
Method
Documents contain facts that contradict widely known information. The model is asked questions whose answers differ depending on which source it trusts.
Grading
A case passes when the answer matches the supplied document rather than general knowledge.
Caveat
Several models now score 100 on this suite, so it has stopped discriminating.
Cases
48
Runs
6
grounding · grounding/1 Does the mitigation work, and what does each output mode cost?
Method
The same question is asked of the same document under different output modes, including free text and constrained decoding. Documents carry line addresses so any claim can be traced back to a source line.
Grading
A case passes when the answer is present in the document and correctly attributed. Answers taken from the wrong line count as misattribution, not as fabrication.
Caveat
Requires a server that honours response_format. Results from mlx_lm are not valid because it ignores the field.
Cases
125
Runs
38
nullschema · nullschema/1 Is it the schema that causes fabrication, or is it forbidding absence?
Method
Three arms run over the same documents. In forbid, the field is required and non-nullable. In permit, the type union includes null. In optional, the key may be omitted. Only cases whose true answer is absent are used, because a case with a present answer cannot separate the arms.
Grading
A case passes when the model declines, either by returning null or by omitting the key. Returning any value counts as a failure and is further classified as misattribution or fabrication.
Caveat
The three arms must differ. If they come out identical, the server ignored the schema and the run is void.
Cases
72
Runs
29
screening · screening/1 Can a second model catch the errors a grounding filter lets through?
Method
A record and a candidate extraction are shown to a judge model. Some candidates are correct, some are values lifted from the wrong part of the document, some are invented. The judge marks each one accept or reject.
Grading
Binary. A case passes when the judge's verdict matches the label.
Caveat
This suite is close to saturated. Several models now score above 95 and their confidence intervals overlap, so it no longer separates the top of the field.
Cases
60
Runs
33
shapegen · shapegen/2 Can a model write a component to a composition contract it has never seen?
Method
The model is given an interface, a set of primitives, theme tokens and one site profile. Profiles differ in their composition rules, so the same brief has different correct answers depending on the profile supplied.
Grading
Mechanical. The output is parsed and checked against the profile's rules. No judge model is involved.
Caveat
The methodology is not in any training data, so a model can only pass by following rules given in context. Currently confounded by whether the model knows @scope syntax at all.
Cases
12
Runs
1
sitebuild · sitebuild/1 Can a model build a working site in a real project with tools and a build it can run?
Method
The model gets an Astro project, benchmark data, and tools to list, read, write and build. It works until the build passes and the shapeset is accurate, or until its step budget runs out.
Grading
The final state of the filesystem. The build must pass, the shapeset must describe what actually exists, and the pages must render real data.
Caveat
A model that does nothing scored 0.91 before deliverable checks were added. Conformance rules pass vacuously when nothing was built.
Cases
1
Runs
1
synthesis · synthesis/2 Can a model synthesise a set of tool results into a usable, attributed answer?
Method
A question plus results, each carrying a REAL address: a turn id, an OKF doc slug, or an fcbench: case reference. Six arms vary only the result set - sufficient, distractor, conflicting, insufficient, stale, and single_source (one external document, no corroboration).
Grading
Mechanical, no judge model. The answer must carry the right value AND cite a valid address in the real grammar; an invented address fails on the grammar rather than on opinion. Conflicts must be flagged with both addresses, absent answers declared, and single-source claims qualified - neither asserted bare nor refused.
Caveat
Every model tested scores 0/10 on single_source, all overclaiming, despite an explicit instruction. That arm currently measures a capability nothing has rather than separating models.
Cases
60
Runs
4
tagger · tagger/2 Does the model produce tags that satisfy the contract?
Method
240 conversation turn pairs are tagged for category, topics and entities. The category must come from a fixed list, topics are bounded in number, and every entity must appear in the turn.
Grading
Rule based. Category outside the list, topic count out of range, or an entity absent from the source all fail the case.
Caveat
Contract compliance is not the same as tag quality. A human check of the gold pairs is still outstanding.
The same 240 turn pairs and the same grader as the tagger suite, with the schema permitting empty topic and entity lists.
Grading
Identical to the tagger suite.
Caveat
Paired with tagger by design. The two should be read together, never separately.
Cases
240
Runs
7
toolcall · toolcall/1 Is a model unable to call tools, or does it not perceive a need to?
Method
Five arms, identical tool machinery throughout, varying only the framing. Availability states a tool exists. Conditional puts an if-then rule in the system prompt. Descriptive puts the same rule in the tool description. Need makes the tool hold a value the model cannot otherwise produce. Unmentioned offers the tool with no reference to it anywhere.
Grading
Scored on invocation, not on the answer. A model that calls the tool and then misuses the result fails contract, not this suite.
Caveat
Results move more with the serving runtime than with the model. The same weights scored 78.3 on one server and 35.0 on another, so any comparison must hold the runtime fixed.
Cases
60
Runs
8
tools · tools/1 Given a request and a set of tools, does the model pick the right one and chain correctly?
Method
The model is offered tool definitions and asked to complete a task. Chaining matters because entities have to survive from one call to the next.
Grading
A case passes when the correct tool is selected and the arguments carry the right entities.
Caveat
Superseded for discrimination by toolscale, which varies difficulty instead of holding it fixed.
Cases
15
Runs
9
toolscale · toolscale/1 How many tools can the model choose between before it picks the wrong one?
Method
The number of available tools increases step by step. The task stays the same. The suite records the rung at which selection breaks down.
Grading
Scored by the highest rung cleared, not by a fixed pass rate.
Caveat
Built to avoid saturation. A model that clears every rung tells you the staircase needs more steps, not that the model is finished.