FreshContextA context lab · Fife
Drawing
02 · Benchmarks
Sheet
2 of 3
Rev
A · 2026-10-01

Working drawing 02Benchmarks, as measured

The measured state of local AI.

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

616Runs
160Configurations
17Suites
79Findings
7Revised, in public
Fig. 2Every run

Every run, shown.

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
Source: runlog.json · 616 entries · 160 configurations
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
Decode speed against active parametersEach mark is one GGUF build measured with llama-bench on a Mac Studio M1 Max with 64 GB. Hatched marks are mixture-of-experts models, open marks are dense. Speed tracks the parameters read per token, not the size of the model. The full table follows the figure.0204060801001202B4B8B16B32BActive params (log)Decode tok/s5.3×Qwen3.8 27B UD-Q4_K_XL — 8.8 tok/s decode, 27.3207B active of 27.3B, 17.9 GBQwen3.8 27BMuse Glimmer 30B kquant — 9.8 tok/s decode, 27.8548B active of 27.9B, 19.6 GBThinkingCap 27B Q4_K_M — 10.3 tok/s decode, 27.3207B active of 27.3B, 16.8 GBGemma 4 31B q4_0 — 15.3 tok/s decode, 30.6973B active of 30.7B, 17.6 GBQwen3.5 9B (community fine-tune) IQ4_NL — 30.5 tok/s decode, 9.19709B active of 9.2B, 6.8 GBQwen3.5 9B (MTP) Q8_0 — 31.6 tok/s decode, 9.19709B active of 9.2B, 9.8 GBQwen3.5 9B Q8_0 — 31.6 tok/s decode, 8.9538B active of 9.0B, 9.5 GBQwen3.5 9B Q4_K_M — 31.7 tok/s decode, 8.9538B active of 9.0B, 5.7 GBQwen3.5 9B (MTP) Q4_K_M — 32.5 tok/s decode, 9.19709B active of 9.2B, 5.9 GBGemma 4 12B q4_0 — 34.2 tok/s decode, 11.9074B active of 11.9B, 7.0 GBQwen3 8B Q8_0 — 37.0 tok/s decode, 8.19074B active of 8.2B, 8.7 GBQwen3 8B Q4_K_M — 41.1 tok/s decode, 8.19074B active of 8.2B, 5.0 GBOrnith 1.5 35B-A3B Q5_K_M — 45.2 tok/s decode, 3B active of 35.5B, 25.4 GBQwen3.6 35B-A3B UD-Q5_K_M — 46.1 tok/s decode, 3B active of 35.5B, 27.1 GBQwen3.6 35B-A3BNemotron Lightning 31B-A3.5B Q4_K_M — 50.0 tok/s decode, 3.5B active of 32.9B, 25.5 GBOrnith 1.5 35B-A3B Q6_K — 50.3 tok/s decode, 3B active of 35.5B, 29.2 GBAgents-A1 35B-A3B Q4_K_M — 52.3 tok/s decode, 3B active of 34.7B, 21.2 GBAgents-A1 4B Q4_K_M — 53.5 tok/s decode, 4.20575B active of 4.2B, 2.7 GBQwen3-Coder 30B-A3B Q4_K_M — 64.4 tok/s decode, 3B active of 30.5B, 18.6 GBGemma 4 E4B q4_0 — 66.7 tok/s decode, 4B active of 7.5B, 5.2 GBGemma 4 26B-A4B q4_0 — 70.1 tok/s decode, 4B active of 25.2B, 14.4 GBGemma 4 E2B q4_0 — 109.9 tok/s decode, 2B active of 4.6B, 3.4 GBGemma 4 E2B
Decode speed against active parametersEach mark is one GGUF build measured with llama-bench on a Mac Studio M1 Max with 64 GB. Hatched marks are mixture-of-experts models, open marks are dense. Speed tracks the parameters read per token, not the size of the model. The full table follows the figure.0204060801001202B3B4B6B8B12B16B24B32BActive parameters per token (log scale)Decode, tokens per second5.3×Qwen3.8 27B UD-Q4_K_XL — 8.8 tok/s decode, 27.3207B active of 27.3B, 17.9 GBQwen3.8 27BMuse Glimmer 30B kquant — 9.8 tok/s decode, 27.8548B active of 27.9B, 19.6 GBThinkingCap 27B Q4_K_M — 10.3 tok/s decode, 27.3207B active of 27.3B, 16.8 GBGemma 4 31B q4_0 — 15.3 tok/s decode, 30.6973B active of 30.7B, 17.6 GBGemma 4 31BQwen3.5 9B (community fine-tune) IQ4_NL — 30.5 tok/s decode, 9.19709B active of 9.2B, 6.8 GBQwen3.5 9B (MTP) Q8_0 — 31.6 tok/s decode, 9.19709B active of 9.2B, 9.8 GBQwen3.5 9B Q8_0 — 31.6 tok/s decode, 8.9538B active of 9.0B, 9.5 GBQwen3.5 9B Q4_K_M — 31.7 tok/s decode, 8.9538B active of 9.0B, 5.7 GBQwen3.5 9B (MTP) Q4_K_M — 32.5 tok/s decode, 9.19709B active of 9.2B, 5.9 GBGemma 4 12B q4_0 — 34.2 tok/s decode, 11.9074B active of 11.9B, 7.0 GBGemma 4 12BQwen3 8B Q8_0 — 37.0 tok/s decode, 8.19074B active of 8.2B, 8.7 GBQwen3 8BQwen3 8B Q4_K_M — 41.1 tok/s decode, 8.19074B active of 8.2B, 5.0 GBOrnith 1.5 35B-A3B Q5_K_M — 45.2 tok/s decode, 3B active of 35.5B, 25.4 GBQwen3.6 35B-A3B UD-Q5_K_M — 46.1 tok/s decode, 3B active of 35.5B, 27.1 GBQwen3.6 35B-A3BNemotron Lightning 31B-A3.5B Q4_K_M — 50.0 tok/s decode, 3.5B active of 32.9B, 25.5 GBNemotron Lightning 31B-A3.5BOrnith 1.5 35B-A3B Q6_K — 50.3 tok/s decode, 3B active of 35.5B, 29.2 GBAgents-A1 35B-A3B Q4_K_M — 52.3 tok/s decode, 3B active of 34.7B, 21.2 GBAgents-A1 4B Q4_K_M — 53.5 tok/s decode, 4.20575B active of 4.2B, 2.7 GBQwen3-Coder 30B-A3B Q4_K_M — 64.4 tok/s decode, 3B active of 30.5B, 18.6 GBQwen3-Coder 30B-A3BGemma 4 E4B q4_0 — 66.7 tok/s decode, 4B active of 7.5B, 5.2 GBGemma 4 26B-A4B q4_0 — 70.1 tok/s decode, 4B active of 25.2B, 14.4 GBGemma 4 26B-A4BGemma 4 E2B q4_0 — 109.9 tok/s decode, 2B active of 4.6B, 3.4 GBGemma 4 E2B40Mixture of experts,~3B active: 45–64 tok/s42Dense, 27–31B:9–15 tok/s
Mac Studio M1 Max, 64 GB · llama.cpp b10369 (6e62ba538), Metal · hatched: mixture of experts · open: dense
The table behind Fig. 3
Fleet bench, controlled llama-bench, one build per row
ModelQuantArchTotalActiveGBDecode tok/sPrefill tok/s
Gemma 4 E2Bq4_0dense4.6B2B*3.4109.91363
Gemma 4 26B-A4Bq4_0MoE25.2B4B14.470.1678
Gemma 4 E4Bq4_0dense7.5B4B*5.266.7696
Qwen3-Coder 30B-A3BQ4_K_MMoE30.5B3B18.664.4645
Agents-A1 4BQ4_K_Mdense4.2B4.20575B2.753.5650
Agents-A1 35B-A3BQ4_K_MMoE34.7B3B21.252.3625
Ornith 1.5 35B-A3BQ6_KMoE35.5B3B29.250.3611
Nemotron Lightning 31B-A3.5BQ4_K_MMoE32.9B3.5B25.550.0519
Qwen3.6 35B-A3BUD-Q5_K_MMoE35.5B3B27.146.1627
Ornith 1.5 35B-A3BQ5_K_MMoE35.5B3B25.445.2573
Qwen3 8BQ4_K_Mdense8.2B8.19074B5.041.1384
Qwen3 8BQ8_0dense8.2B8.19074B8.737.0440
Gemma 4 12Bq4_0dense11.9B11.9074B7.034.2268
Qwen3.5 9B (MTP)Q4_K_Mdense9.2B9.19709B5.932.5358
Qwen3.5 9BQ4_K_Mdense9.0B8.9538B5.731.7354
Qwen3.5 9BQ8_0dense9.0B8.9538B9.531.6413
Qwen3.5 9B (MTP)Q8_0dense9.2B9.19709B9.831.6412
Qwen3.5 9B (community fine-tune)IQ4_NLdense9.2B9.19709B6.830.5385
Gemma 4 31Bq4_0dense30.7B30.6973B17.615.3101
ThinkingCap 27BQ4_K_Mdense27.3B27.3207B16.810.3101
Muse Glimmer 30Bkquantdense27.9B27.8548B19.69.899
Qwen3.8 27BUD-Q4_K_XLdense27.3B27.3207B17.98.893

* 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
Modelnullschemaworldviewgroundingepistemicstoolcallcontractsynthesisenrichmentscreeningtaggertagger nullable
Bonsai 8B 1-bit
68.5 tok/s · 1.1 GB
19.44055.280.8020.8658386.780.386.3
Ornith 35B-A3B
53.4 tok/s · 21.7 GB
36.18576—8066.7—————
BTL-4 Q4_K_M
48.5 tok/s · 20.5 GB
44.45576.810093.370.883.398.891.796.494.1
Qwen3.8-9B distill
30.8 tok/s · 9.8 GB
18.14067.295.802583.395.991.794.496.3
BTL-4 IQ2_XXS
23.6 tok/s · 10.0 GB
36.162.576.810076.764.68098.79596.596.2
Bonsai 27B 1-bit
20.0 tok/s · 3.5 GB
18.14067.287.5100253595.196.791.795
Bonsai 27B ternary
17.3 tok/s · 7.2 GB
27.842.568.885.41007566.788.493.396.297.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
8K32K128K256K8K: 46.3 tok/s, 23.4 GB16K: 46.4 tok/s, 23.4 GB32K: 48.1 tok/s, 23.5 GB64K: 46.1 tok/s, 23.7 GB128K: 46.5 tok/s, 24.1 GB47 t/s24 GB
Qwen3.6 35B-A3B
8K → 128K · memory 24.5 → 27.5 GB
8K32K128K256K8K: 42.6 tok/s, 24.5 GB16K: 42.3 tok/s, 25.3 GB32K: 41.0 tok/s, 25.6 GB64K: 43.1 tok/s, 26.3 GB128K: 42.3 tok/s, 27.5 GB42 t/s28 GB
ThinkingCap 27B
8K → 128K · memory 16.4 → 24.1 GB
8K32K128K256K8K: 11.2 tok/s, 16.4 GB16K: 11.2 tok/s, 17.1 GB32K: 11.2 tok/s, 18.1 GB64K: 11.1 tok/s, 20.1 GB128K: 11.1 tok/s, 24.1 GB11 t/s24 GB
Gemma 4 31B
8K → 128K · memory 20.5 → 30.1 GB
8K32K128K256K8K: 15.2 tok/s, 20.5 GB16K: 15.3 tok/s, 21.4 GB32K: 15.1 tok/s, 22.6 GB64K: 15.2 tok/s, 25.1 GB128K: 15.2 tok/s, 30.1 GB15 t/s30 GB
Muse Glimmer 30B
8K → 128K · memory 18.0 → 20.4 GB
8K32K128K256K8K: 9.7 tok/s, 18.0 GB16K: 9.8 tok/s, 19.0 GB32K: 9.8 tok/s, 19.2 GB64K: 9.8 tok/s, 19.6 GB128K: 9.8 tok/s, 20.4 GB10 t/s20 GB
Gemma 4 E2B
8K → 128K · memory 3.3 → 4.1 GB
8K32K128K256K8K: 55.7 tok/s, 3.3 GB16K: 158.3 tok/s, 3.4 GB32K: 148.7 tok/s, 3.5 GB64K: 149.6 tok/s, 3.7 GB128K: 154.1 tok/s, 4.1 GB154 t/s4 GB
Gemma 4 E4B
8K → 128K · memory 5.1 → 7.1 GB
8K32K128K256K8K: 101.4 tok/s, 5.1 GB16K: 91.5 tok/s, 5.3 GB32K: 98.7 tok/s, 5.6 GB64K: 103.1 tok/s, 6.1 GB128K: 99.9 tok/s, 7.1 GB100 t/s7 GB
Gemma 4 12B
8K → 256K · memory 8.1 → 12.1 GB
8K32K128K256K8K: 32.7 tok/s, 8.1 GB16K: 32.0 tok/s, 8.3 GB32K: 33.6 tok/s, 8.6 GB64K: 33.4 tok/s, 9.1 GB128K: 33.2 tok/s, 10.1 GB256K: 32.4 tok/s, 12.1 GB32 t/s12 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
Aggregate throughput against parallel slotsThree Gemma 4 models served with 1 to 16 parallel slots. Aggregate tokens per second rises with each lane added; a single request does not get faster.0100200300124816Parallel slotsGemma 4 E2B, 1 slots: 95.1 tok/s aggregateGemma 4 E2B, 2 slots: 121.5 tok/s aggregateGemma 4 E2B, 4 slots: 182.8 tok/s aggregateGemma 4 E2B, 8 slots: 223.8 tok/s aggregateGemma 4 E2B, 16 slots: 281.2 tok/s aggregateE2B 3.0×Gemma 4 E4B, 1 slots: 56.3 tok/s aggregateGemma 4 E4B, 2 slots: 68.1 tok/s aggregateGemma 4 E4B, 4 slots: 103.8 tok/s aggregateGemma 4 E4B, 8 slots: 122.4 tok/s aggregateGemma 4 E4B, 16 slots: 165.4 tok/s aggregateE4B 2.9×Gemma 4 12B, 1 slots: 29.8 tok/s aggregateGemma 4 12B, 2 slots: 32.3 tok/s aggregateGemma 4 12B, 4 slots: 47.7 tok/s aggregateGemma 4 12B, 8 slots: 53.4 tok/s aggregateGemma 4 12B, 16 slots: 85.9 tok/s aggregate12B 2.9×
Aggregate throughput against parallel slotsThree Gemma 4 models served with 1 to 16 parallel slots. Aggregate tokens per second rises with each lane added; a single request does not get faster.050100150200250300124816Parallel slotsGemma 4 E2B, 1 slots: 95.1 tok/s aggregateGemma 4 E2B, 2 slots: 121.5 tok/s aggregateGemma 4 E2B, 4 slots: 182.8 tok/s aggregateGemma 4 E2B, 8 slots: 223.8 tok/s aggregateGemma 4 E2B, 16 slots: 281.2 tok/s aggregateGemma 4 E2B 3.0×Gemma 4 E4B, 1 slots: 56.3 tok/s aggregateGemma 4 E4B, 2 slots: 68.1 tok/s aggregateGemma 4 E4B, 4 slots: 103.8 tok/s aggregateGemma 4 E4B, 8 slots: 122.4 tok/s aggregateGemma 4 E4B, 16 slots: 165.4 tok/s aggregateGemma 4 E4B 2.9×Gemma 4 12B, 1 slots: 29.8 tok/s aggregateGemma 4 12B, 2 slots: 32.3 tok/s aggregateGemma 4 12B, 4 slots: 47.7 tok/s aggregateGemma 4 12B, 8 slots: 53.4 tok/s aggregateGemma 4 12B, 16 slots: 85.9 tok/s aggregateGemma 4 12B 2.9×
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.

All 79 findings →

Fig. 7 — Findings by date7 revised
Findings by date79 findings between 27 August and 20 September 2026, one mark each, stacked by day. 7 marks in signal ink were later revised.27 Aug2026-08-27 · Reasoning increases misattribution under authority pressure3 Sep2026-09-07 · Specialist labels failed to predict outcomes three times in four2026-09-07 · The tagger fine-tune scored below its own base model2026-09-08 · Three different bottlenecks, depending on how the model is served2026-09-08 · The extraction suites can no longer separate the leading models2026-09-08 · Expert pruning cost this model nothing measurable2026-09-08 · mlx_lm silently ignores response_format2026-09-08 · KV cache decides what fits, and only measurement predicts KV2026-09-08 · HTTP 200 does not mean a model is loaded2026-09-08 · Schema enforcement is per-model, not per-runtime2026-09-08 · Speculative decoding did not help, by either method tested2026-09-08 · Active parameters, not total, set throughput2026-09-09 · Speculative decoding does not pay on this box except embedded MTP on llama.cpp2026-09-09 · The serving runtime changes tool-calling results more than the model does2026-09-09 · rapid-mlx drops chat_template_kwargs AND the template's default reasoning block, costing 2x wall clock2026-09-09 · oMLX degrades models it has no native kernel for, by up to 58 points2026-09-09 · No model qualifies single-source evidence, even when explicitly told to2026-09-09 · Models call tools when given an if-then rule, not when told a tool exists2026-09-09 · Converting the judge to MLX destroyed it, from 100% to 36.7%2026-09-09 · Judge and tool-use scores are runtime-sensitive because the decisions sit on ~0.4 logprob margins2026-09-09 · Running 32 requests at once is worth 3-4x, and single-stream tok/s is the wrong metric10 Sep2026-09-10 · toolscale's low levels are harder than its high levels2026-09-10 · Tool perception is binary and tracks the checkpoint, not size or vendor claims2026-09-10 · Quantisation damage is proportional to the capability present2026-09-10 · Q8_0 and BF16 are behaviourally identical; full precision buys nothing2026-09-10 · The 6.7 GB tagger is the most epistemically reliable model in the fleet2026-09-10 · gemma4-12b does not act on rules placed in tool descriptions2026-09-10 · Detecting emptiness and rejecting a plausible candidate are different capabilities2026-09-11 · Quantisation format changes output CONVENTIONS, not abstention judgement (revised)2026-09-11 · Badly-chosen mixed precision costs abstention; sensitivity-aware mixing protects it (revised)2026-09-11 · TQ2_0 is fast and lossless to pack, but ternary weights cannot be made post hoc2026-09-11 · Speculative decoding is a net loss on this hardware, in every arm tested2026-09-11 · On a sparse MoE, speculative decoding fails even at 96% draft acceptance2026-09-11 · llama.cpp's --spec-draft-p-min defaults to 0.00, which guarantees wasted drafts2026-09-11 · llama.cpp, mlx_lm and rapid-mlx decode at the same speed; only the format differs2026-09-11 · Runtime changes HOW a model phrases a refusal, and nullschema scores that as fabrication2026-09-11 · Qwen3-Next-80B at Q4_0 runs 46.7 tok/s and is workload-flat2026-09-11 · Prompt framing outweighs a 2.7x bit-width range for abstention2026-09-11 · MoE decode reaches a third of dense memory bandwidth, and no runtime fixes it2026-09-11 · The 'MLX is 3x faster on MoE' claim benchmarks Ollama, not llama.cpp2026-09-11 · The GGUF format result does not transfer to MLX -- symmetric quantisation is the WORST there2026-09-11 · Published EAGLE-3 acceptance rates did not survive either check2026-09-11 · Diffusion LLMs are compute-bound on Apple Silicon, so quantising them buys nothing2026-09-11 · A purpose-built draft gives 1.13x on structured output and loses on prose2026-09-11 · Per-token confidence flags hesitant errors and misses confident ones2026-09-11 · Byte alignment, not bit-width, determines quantised decode speed2026-09-11 · Benchmark tok/s figures are empty-context artefacts; real decode falls 2.7x with context2026-09-13 · Long-context recall does not degrade with depth; misattribution does the damage, and a string comparison catches all of it2026-09-13 · Quantised KV degrades which source a model cites, not what it answers - and the raw grader cannot see it2026-09-13 · A 23% smaller IQ3_S build decodes 27% slower than Q4_0 on the same weights - the codebook costs more than the bytes it saves2026-09-14 · Q4_0 decodes up to 2x faster than Q4_K_M at the same bit-width, and emits valid JSON more reliably (revised)2026-09-14 · Byte alignment, not bit count, governs decode speed (revised)2026-09-15 · Abstention ranges 18-61 percent across the fleet, and declining is not the same skill as noticing a correction (revised)2026-09-15 · MLX and GGUF score the same on a dense model: mean delta 0.55 points over twelve suites2026-09-15 · IQ2_XXS took 27 points off world knowledge and 17 off tool invocation on identical weights2026-09-15 · Sparsity rescues a model from K-quant misalignment and not from IQ codebook lookup2026-09-16 · An mmapped 19.6 GB checkpoint charges 5.3 GB, plateaus in 250 tokens, and reads as 20 GB if you look at the wrong column2026-09-16 · The faster the SSD, the less an expert prerouter is worth -- which inverts who should want it2026-09-16 · A trained expert prerouter buys 17% on decode and nothing on prefill17 Sep2026-09-17 · SwiftLM allocates ~10x mlx_lm's transient memory per prefill token, which is what created every context ceiling attributed here to models or hardware (revised)2026-09-17 · One baseline was 25 points off and nothing in the stamp could explain it; the other six reproduced exactly2026-09-17 · SwiftLM's TurboQuant KV claim reproduces on M1 Max; its prefill and missing prompt cache make it the wrong tool anyway2026-09-17 · SwiftLM's TurboQuant throughput table replicates on four-generation-old hardware; its memory-saving headline does not2026-09-17 · PQ2_0 and PTQ1_0 cannot post-quantise a trained model, and selectivity does not rescue them2026-09-17 · EXL3/QTIP at 4 bpw costs nothing measurable in capability and three quarters of the throughput2026-09-17 · A controlled 2x2 confirms it: the 27B loses 7.3 points to 1-bit, the 8B loses nothing2026-09-17 · A destroyed model and an incapable one produce the same zero, so the harness now refuses to run without a coherence check2026-09-18 · Two seats detect temporal conflicts, not one: k2-horizon-36b matches ornith at 4/4 (revised)2026-09-18 · 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 once2026-09-18 · 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.5x2026-09-18 · PTQ1_0 and PQ2_0 produce byte-identical output on a ternary-trained model, so the smaller file is free2026-09-18 · edge0 is 5.3 GB on its own runtime and 18.4 GB on mlx_lm; the prerouter makes prefill slower, not 59% faster2026-09-18 · Every seat emits valid typed edges; three of five turn a hedged future statement into an asserted fact2026-09-18 · A per-token memory cost that disagrees with the architecture is a runtime bug, not a hardware limit2026-09-18 · A ternary-trained Qwen3.8-27B holds parity on free-form work at 55% of the size, and loses everything it loses on schema-constrained output2026-09-19 · 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 roles2026-09-19 · 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 logprobs2026-09-20 · 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 one2026-09-20 · 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
Findings by date79 findings between 27 August and 20 September 2026, one mark each, stacked by day. 7 marks in signal ink were later revised.27 Aug2026-08-27 · Reasoning increases misattribution under authority pressure30 Aug2 Sep5 Sep2026-09-07 · Specialist labels failed to predict outcomes three times in four2026-09-07 · The tagger fine-tune scored below its own base model8 Sep2026-09-08 · Three different bottlenecks, depending on how the model is served2026-09-08 · The extraction suites can no longer separate the leading models2026-09-08 · Expert pruning cost this model nothing measurable2026-09-08 · mlx_lm silently ignores response_format2026-09-08 · KV cache decides what fits, and only measurement predicts KV2026-09-08 · HTTP 200 does not mean a model is loaded2026-09-08 · Schema enforcement is per-model, not per-runtime2026-09-08 · Speculative decoding did not help, by either method tested2026-09-08 · Active parameters, not total, set throughput2026-09-09 · Speculative decoding does not pay on this box except embedded MTP on llama.cpp2026-09-09 · The serving runtime changes tool-calling results more than the model does2026-09-09 · rapid-mlx drops chat_template_kwargs AND the template's default reasoning block, costing 2x wall clock2026-09-09 · oMLX degrades models it has no native kernel for, by up to 58 points2026-09-09 · No model qualifies single-source evidence, even when explicitly told to2026-09-09 · Models call tools when given an if-then rule, not when told a tool exists2026-09-09 · Converting the judge to MLX destroyed it, from 100% to 36.7%2026-09-09 · Judge and tool-use scores are runtime-sensitive because the decisions sit on ~0.4 logprob margins2026-09-09 · Running 32 requests at once is worth 3-4x, and single-stream tok/s is the wrong metric2026-09-10 · toolscale's low levels are harder than its high levels2026-09-10 · Tool perception is binary and tracks the checkpoint, not size or vendor claims2026-09-10 · Quantisation damage is proportional to the capability present2026-09-10 · Q8_0 and BF16 are behaviourally identical; full precision buys nothing2026-09-10 · The 6.7 GB tagger is the most epistemically reliable model in the fleet2026-09-10 · gemma4-12b does not act on rules placed in tool descriptions2026-09-10 · Detecting emptiness and rejecting a plausible candidate are different capabilities11 Sep2026-09-11 · Quantisation format changes output CONVENTIONS, not abstention judgement (revised)2026-09-11 · Badly-chosen mixed precision costs abstention; sensitivity-aware mixing protects it (revised)2026-09-11 · TQ2_0 is fast and lossless to pack, but ternary weights cannot be made post hoc2026-09-11 · Speculative decoding is a net loss on this hardware, in every arm tested2026-09-11 · On a sparse MoE, speculative decoding fails even at 96% draft acceptance2026-09-11 · llama.cpp's --spec-draft-p-min defaults to 0.00, which guarantees wasted drafts2026-09-11 · llama.cpp, mlx_lm and rapid-mlx decode at the same speed; only the format differs2026-09-11 · Runtime changes HOW a model phrases a refusal, and nullschema scores that as fabrication2026-09-11 · Qwen3-Next-80B at Q4_0 runs 46.7 tok/s and is workload-flat2026-09-11 · Prompt framing outweighs a 2.7x bit-width range for abstention2026-09-11 · MoE decode reaches a third of dense memory bandwidth, and no runtime fixes it2026-09-11 · The 'MLX is 3x faster on MoE' claim benchmarks Ollama, not llama.cpp2026-09-11 · The GGUF format result does not transfer to MLX -- symmetric quantisation is the WORST there2026-09-11 · Published EAGLE-3 acceptance rates did not survive either check2026-09-11 · Diffusion LLMs are compute-bound on Apple Silicon, so quantising them buys nothing2026-09-11 · A purpose-built draft gives 1.13x on structured output and loses on prose2026-09-11 · Per-token confidence flags hesitant errors and misses confident ones2026-09-11 · Byte alignment, not bit-width, determines quantised decode speed2026-09-11 · Benchmark tok/s figures are empty-context artefacts; real decode falls 2.7x with context2026-09-13 · Long-context recall does not degrade with depth; misattribution does the damage, and a string comparison catches all of it2026-09-13 · Quantised KV degrades which source a model cites, not what it answers - and the raw grader cannot see it2026-09-13 · A 23% smaller IQ3_S build decodes 27% slower than Q4_0 on the same weights - the codebook costs more than the bytes it saves14 Sep2026-09-14 · Q4_0 decodes up to 2x faster than Q4_K_M at the same bit-width, and emits valid JSON more reliably (revised)2026-09-14 · Byte alignment, not bit count, governs decode speed (revised)2026-09-15 · Abstention ranges 18-61 percent across the fleet, and declining is not the same skill as noticing a correction (revised)2026-09-15 · MLX and GGUF score the same on a dense model: mean delta 0.55 points over twelve suites2026-09-15 · IQ2_XXS took 27 points off world knowledge and 17 off tool invocation on identical weights2026-09-15 · Sparsity rescues a model from K-quant misalignment and not from IQ codebook lookup2026-09-16 · An mmapped 19.6 GB checkpoint charges 5.3 GB, plateaus in 250 tokens, and reads as 20 GB if you look at the wrong column2026-09-16 · The faster the SSD, the less an expert prerouter is worth -- which inverts who should want it2026-09-16 · A trained expert prerouter buys 17% on decode and nothing on prefill17 Sep2026-09-17 · SwiftLM allocates ~10x mlx_lm's transient memory per prefill token, which is what created every context ceiling attributed here to models or hardware (revised)2026-09-17 · One baseline was 25 points off and nothing in the stamp could explain it; the other six reproduced exactly2026-09-17 · SwiftLM's TurboQuant KV claim reproduces on M1 Max; its prefill and missing prompt cache make it the wrong tool anyway2026-09-17 · SwiftLM's TurboQuant throughput table replicates on four-generation-old hardware; its memory-saving headline does not2026-09-17 · PQ2_0 and PTQ1_0 cannot post-quantise a trained model, and selectivity does not rescue them2026-09-17 · EXL3/QTIP at 4 bpw costs nothing measurable in capability and three quarters of the throughput2026-09-17 · A controlled 2x2 confirms it: the 27B loses 7.3 points to 1-bit, the 8B loses nothing2026-09-17 · A destroyed model and an incapable one produce the same zero, so the harness now refuses to run without a coherence check2026-09-18 · Two seats detect temporal conflicts, not one: k2-horizon-36b matches ornith at 4/4 (revised)2026-09-18 · 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 once2026-09-18 · 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.5x2026-09-18 · PTQ1_0 and PQ2_0 produce byte-identical output on a ternary-trained model, so the smaller file is free2026-09-18 · edge0 is 5.3 GB on its own runtime and 18.4 GB on mlx_lm; the prerouter makes prefill slower, not 59% faster2026-09-18 · Every seat emits valid typed edges; three of five turn a hedged future statement into an asserted fact2026-09-18 · A per-token memory cost that disagrees with the architecture is a runtime bug, not a hardware limit2026-09-18 · A ternary-trained Qwen3.8-27B holds parity on free-form work at 55% of the size, and loses everything it loses on schema-constrained output2026-09-19 · 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 roles2026-09-19 · 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 logprobs20 Sep2026-09-20 · 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 one2026-09-20 · 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

Revised

2026-09-18Revised

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 extra­polated.

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
VerbSeatMeasuredState
Judge · generateornithContradiction 94%. Confidence you can put a threshold on.Seated
Taggemma4-12b93.8 and 97.9 on the tagger suites, best on the board.Seated
Dispatchk2-3.7b100 of 100 tool calls. Refuses small talk by design.Seated
Extractedge0 pool95% on field extraction from curated evidence.Seated
Screengranite-guardian-4.1-8b100% on fabrication and misattribution screens.Seated
Decide · temporalvon-1.0Which fact came last: 100% in 95 ms, on the CPU.Seated
Decide · aliaslaya-421mSame thing, different name: 100 of 100 in 42 ms, on the CPU.Seated
Protectgliner + presidioEach catches what the other misses. Egress fails closed.Seated
Embedbge-m3Native 8K window, dense and sparse.Seated
Rerankbge-reranker-v2-m3A 13-point margin on the failure that broke recall in August.Seated
Seephi4-visionRead a real invoice end to end. Swapped in on demand.Benched

All 32 written-up models, and every configuration measured

Test methods15 suites documented

How each run was judged.

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.
Cases
480
Runs
12
tagger nullable · tagger-nullable/1
Does allowing empty fields change tagging behaviour?
Method
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.
Cases
40
Runs
7