Strim benchmarks
Every head-to-head cell of Strim against rapid-mlx, mlx-vlm, mlx-lm and oMLX on Qwen3.8-27B 4-bit, plus the method, the caveats and the engineering notes behind the landing page. Wins and losses are drawn the same way.
- Run
- h2h-final3-20261028 (results.json), 2026-10-28
- Strim build
- ee9f9d8, 2 passes of one rep, medians, 2% tie band
- Rivals
- rapid-mlx 0.15.7 (MTP on,
--max-num-seqs 4), mlx-vlm 0.7.10 (no MTP), mlx-lm 0.32.2 (no MTP), oMLX 0.4.5.dev1 (no MTP) - Machine
- Apple M5 Max, 64 GB, macOS 27.0.1; model Qwen3.8-27B 4-bit + MTP head
Validity. 28 of 30 primary sessions were clean; 2 were marked polluted. Reruns are retained in the data. Claims use only cells marked claim eligible (highest primary-session 1-minute load 4.7). Method and every cell.
Not claimable: 15 comparisons excluded (open for the list)
Verdicts are only printed for a cell when every pass of both engines is present, none was excluded (abort, memory guard, OOM, timeout) and every session was clean. The numbers below stay visible; no WIN or LOSS is attached to these comparisons:
- c=4 agent: tok/s vs oMLX: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=4 agent: p50 TTFT vs oMLX: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=4 agent: p95 TTFT vs oMLX: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=8 agent: tok/s vs oMLX: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=8 agent: p50 TTFT vs oMLX: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=8 agent: p95 TTFT vs oMLX: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=4 4K: tok/s vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=4 4K: p50 TTFT vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=4 4K: p95 TTFT vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=8 4K: tok/s vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=8 4K: p50 TTFT vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- c=8 4K: p95 TTFT vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- 4 agents, 16K prefix: tok/s vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- 4 agents: p50 TTFT vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
- 4 agents: p95 TTFT vs oMLX: oMLX: no valid value, pass 1 excluded (engine_guard_abort, memory_abort_watchdog), pass 2 excluded (engine_guard_abort, memory_abort_watchdog)
What the data supports, and what it does not
Strim against rapid-mlx, mlx-vlm, mlx-lm and oMLX on Qwen3.8-27B 4-bit, one machine. Every claim below is computed from the cells in Results; losses are listed next to the wins.
Decode
24-50% faster decode
than rapid-mlx, the closest rival; 1.8-2.3x the speed of mlx-vlm, 1.9-2.5x the speed of mlx-lm and 1.7-2.2x the speed of oMLX, at 4K to 32K context. At 4K: Strim 75.34 vs rapid-mlx 50.12 vs mlx-vlm 32.69 vs mlx-lm 30.11 vs oMLX 33.53 tok/s.
Engines differ in speculative decoding (MTP) and prefix caching; see the table of rivals above. Details
Four agents, one 16K prefix
2.8-2.9x faster aggregate
Four clients on one 16K prefix, aggregate tok/s. Median first token: Strim 20.29 s vs rapid-mlx 73.53 s vs mlx-vlm 70.48 s vs mlx-lm 73.4 s.
Engines without a cross-request prefix cache cannot share the prefix in this setup. Details
Median first token under concurrency
29-56% lower, 4 to 8 concurrent
Against each rival, over 512-token, agent-style and 4K prompts.
Some rivals report first tokens batch-synchronously, so their median is a weaker number. Details
Agent replay
48.93 s 8-turn replay
Summed prefill. Verdict against rapid-mlx (49.13 s): TIE; mlx-vlm (192.5 s): WIN; mlx-lm (55.02 s): WIN; oMLX (64.84 s): WIN.
Engines without a cross-request prefix cache re-prefill every turn. Details
Where Strim is not faster
- cold prefill is 2-4% behind it at 4K, 16K and 32K; aggregate throughput at 4 to 8 concurrent requests trails the best rival by more than 2% in 3 of 6 cells (2-4%); p95 first-token latency is more than 2% worse in 1 of 6 cells (6%).
- No "fastest overall". 4 rivals, one model, one machine, thinking off. No head-to-head against llama.cpp, Ollama or LM Studio exists, so none is claimed.
Strim vs rapid-mlx, mlx-vlm, mlx-lm and oMLX at a glance
Head-to-head of 2026-10-28 (h2h-final3-20261028): Strim build ee9f9d8 (strim 0.1.1); rivals: rapid-mlx (MTP) 0.15.7, mlx-vlm (no MTP) 0.7.10, mlx-lm (no MTP) 0.32.2, oMLX (no MTP) 0.4.5.dev1. Qwen3.8-27B 4-bit + MTP head on Apple M5 Max, 64 GB, macOS 27.0.1, 2 passes of one rep. Wins and losses are drawn the same way. A verdict is WIN or LOSS only outside a 2% band. Only numbers measured on that build are shown; work done since is not re-benchmarked and not included.
| Regime | vs rapid-mlx (MTP) | vs mlx-vlm (no MTP) | vs mlx-lm (no MTP) | vs oMLX (no MTP) |
|---|---|---|---|---|
| Decodetok/s at 4K, 16K, 32K context (3 cells) | 3 WIN · 0 TIE · 0 LOSS | 3 WIN · 0 TIE · 0 LOSS | 3 WIN · 0 TIE · 0 LOSS | 3 WIN · 0 TIE · 0 LOSS |
| Cold prefilltok/s on a cold 4K, 16K, 32K prompt (3 cells) | 0 WIN · 2 TIE · 1 LOSS | 0 WIN · 0 TIE · 3 LOSS | 3 WIN · 0 TIE · 0 LOSS | 3 WIN · 0 TIE · 0 LOSS |
| Shared prefix4 agents on a 16K prefix (aggregate, p50, p95) and 8-turn replay (4 cells) | 3 WIN · 1 TIE · 0 LOSS | 4 WIN · 0 TIE · 0 LOSS | 4 WIN · 0 TIE · 0 LOSS | 1 WIN · 0 TIE · 0 LOSS |
| Concurrencyaggregate tok/s at c=4 and c=8, three prompt sizes (6 cells) | 3 WIN · 2 TIE · 1 LOSS | 2 WIN · 2 TIE · 2 LOSS | 4 WIN · 2 TIE · 0 LOSS | 2 WIN · 0 TIE · 0 LOSS · 2 not claimable |
| LatencyTTFT p50 and p95 at c=4 and c=8, three prompt sizes (12 cells) | 12 WIN · 0 TIE · 0 LOSS | 7 WIN · 4 TIE · 1 LOSS | 12 WIN · 0 TIE · 0 LOSS | 4 WIN · 0 TIE · 0 LOSS · 4 not claimable |
| Memorypeak footprint over the whole run (1 cell) | 1 WIN · 0 TIE · 0 LOSS | 1 WIN · 0 TIE · 0 LOSS | 1 WIN · 0 TIE · 0 LOSS | 1 WIN · 0 TIE · 0 LOSS |
| All counted cells | 22 WIN · 5 TIE · 2 LOSS | 17 WIN · 6 TIE · 6 LOSS | 27 WIN · 2 TIE · 0 LOSS | 14 WIN · 0 TIE · 0 LOSS · 6 not claimable |
Regimes with at least one LOSS against a rival: Cold prefill, Concurrency, Latency. Cells are counted once (cold prefill by tok/s, not again by first-token time). Every cell is in the full table.
Memory
Peak physical footprint over the whole run: Strim 30.8 GB, rapid-mlx 35.9 GB, mlx-vlm 36.3 GB, mlx-lm 37.5 GB, oMLX 55.2 GB. Claims compare each engine with Strim; the whole-run values are measured maxima, not steady-state memory.
Strim has the lowest peak in 2 of 9 workload cells.
Latency
Median first-token WIN counts (p50): rapid-mlx 6 of 6; mlx-vlm 6 of 6; mlx-lm 6 of 6; oMLX 2 of 6. Tail p95 WIN/LOSS counts: rapid-mlx 6 of 6/0 of 6; mlx-vlm 1 of 6/1 of 6; mlx-lm 6 of 6/0 of 6; oMLX 2 of 6/0 of 6. With four or eight requests per cell p95 is the slowest request, and the rivals deliver first tokens batch-synchronously, so their p50 is a weaker number than Strim's.
Functionality
Strim is a one-model engine, so it does not try to match the rivals on breadth. Rows are checked against the installed packages, their --help, their README or this repository; see the comparison notes for the evidence behind every cell. Rows with a Yes: Strim 16 of 20, rapid-mlx (MTP) 14 of 20, mlx-vlm (no MTP) 11 of 20.
| Feature | Strim | rapid-mlx 0.15.7 | mlx-vlm 0.7.10 |
|---|---|---|---|
| Single binary, no Python runtimeRuntime | YesSwift, one process, one binary | NoPython package (fastapi/uvicorn) | NoPython package (uvicorn server) |
| Install footprintRuntime | 34 MB binary + weights | 159 MB keg + Python deps | 256 MB venv |
| Runs many modelsModels | NoOne model only (Qwen3.8-27B 4-bit) | YesMany models, vision, audio, embeddings | YesMany models, vision, audio, embeddings |
| MTP speculative decodingDecoding | YesDefault, adaptive depth 2-4 | Yes--speculative-config mtp (used in h2h) | Partial--draft-kind mtp exists; off in h2h |
| Continuous batchingDecoding | YesBatched decode, join/leave | Yes--max-num-seqs | Yes--max-num-seqs |
| Chunked prefillDecoding | Yes1,024-token chunks interleaved with decode | Yes--prefill-step-size | Yes--prefill-step-size |
| Structured output (json_schema)Decoding | Yesjson_object, json_schema, tool_choice (constrained decoding) | Yesllguidance, json_schema (not exercised by us) | Yesresponse_format (not exercised by us) |
| Reasoning / thinking separationDecoding | PartialTemplate renders thinking; separate output not verified | Yes--reasoning-parser | Yesreasoning_content, --thinking-budget |
| Tool callingDecoding | YesStreaming Qwen parser; tool_choice=required enforced | YesMany tool parsers | YesParser inferred from processor |
| Cross-request prefix cacheCache | YesExact trie: a hit equals a miss bitwise | YesRadix or hash index; exactness Unknown | PartialIn code; cached=0 with h2h server defaults |
| Disk-persisted prefix cacheCache | YesOpt-in (STRIM_PREFIX_DISK=1), per-model directory | YesSaved on shutdown | YesSSD tier |
| Priority and memory-based admissionServing | YesInteractive vs background classes, memory budget | Partialfcfs or shortest_validated_tail; no priority classes | Not foundNo evidence found |
| Memory budget / swap protectionServing | PartialAdmission by memory budget; no OS swap guard | Yes--gpu-memory-utilization and more knobs | Partial--max-kv-size, --expert-cache-gb |
| Server authServing | YesBearer token on by default, separate control token | PartialOpt-in --api-key | PartialOpt-in --api-key; default host 0.0.0.0 |
| OpenAI Chat CompletionsAPI | Yes | Yes | Yes |
| OpenAI ResponsesAPI | YesWith response store | Yes | Yes |
| Anthropic MessagesAPI | YesWith count_tokens | Yes | YesWith count_tokens |
| Streaming (SSE)API | Yes | Yes | Yes |
| Sandboxed local-model job harnessAgents | YesWorktree jobs, harness-run verify, SHA-256 patch approval | PartialConfigures external agents; no local job runner found | Not foundNo evidence found |
| MCPAgents | YesMCP server at /mcp, 4 tools | PartialMCP client side; acting as server Unknown | Not foundNo evidence found |
| Menu-bar appProduct | PartialSwiftUI shell, builds | PartialDesktop app; menu-bar form Unknown | NoNo |
| LicenseProduct | MIT | Apache-2.0 | MIT |
Not found means no evidence was found in what was checked, not proof of absence. Unknown means not verified. Where a rival is ahead of Strim (Strim has No or Partial, a rival has Yes): Runs many models; Reasoning / thinking separation; Memory budget / swap protection.
Wider field: five engines, with two earlier-run points
- Dashed hollow beads are llama.cpp and Ollama from the 2026-10-26 run.
The five filled points are medians from the same 2026-10-28 head-to-head, built from Strim ee9f9d8; llama.cpp and Ollama are hollow dashed beads from the earlier run. They are visual context only. Current run source; earlier run source.
Results
The headline rows first, then every cell. Bars always start at zero. Every number carries its figure id as a hover title and appears in the figure index.
| Measurement | Strim | rapid-mlx | mlx-vlm | mlx-lm | oMLX | vs rapid-mlx | vs mlx-vlm | vs mlx-lm | vs oMLX |
|---|---|---|---|---|---|---|---|---|---|
| decode @ 4Ktok/s | 75.34 | 50.12 | 32.69 | 30.11 | 33.53 | WIN | WIN | WIN | WIN |
| decode @ 32Ktok/s | 52.17 | 42.17 | 29.35 | 27.62 | 29.9 | WIN | WIN | WIN | WIN |
| 4 agents, 16K prefix: tok/stok/s | 9.773 | 3.344 | 3.473 | 3.346 | n/a | WIN | WIN | WIN | n/a |
| c=8 agent: p50 TTFTs, lower is better | 13.34 | 22.1 | 23.1 | 22.61 | 25.08 | WIN | WIN | WIN | NC |
| cold 32K TTFTs, lower is better | 37.06 | 36.02 | 35.51 | 38.53 | 39.79 | LOSS | LOSS | WIN | WIN |
| c=8 agent: tok/stok/s | 31.19 | 28.47 | 31.18 | 27.63 | 26.89 | WIN | TIE | WIN | NC |
| 8-turn agent replay, summed prefills, lower is better | 48.93 | 49.13 | 192.5 | 55.02 | 64.84 | TIE | WIN | WIN | WIN |
| Peak memory, whole runGB, lower is better | 30.8 | 35.9 | 36.3 | 37.5 | 55.2 | WIN | WIN | WIN | WIN |
Final head-to-head: Strim vs rapid-mlx, mlx-vlm, mlx-lm and oMLX
Qwen3.8-27B 4-bit served alone over HTTP by each engine, one engine on the GPU at a time, thinking off, greedy decoding, on one Apple M5 Max with 64 GB. 2 passes (pass 1 in the order Strim, rapid-mlx, mlx-vlm, mlx-lm, oMLX; pass 2 reversed), one rep per pass, so each value is the median of two runs, which is their mean. The largest swap growth in any session was 0 MB. Strim is build ee9f9d8; rapid-mlx ran as --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit} (MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on). mlx-vlm ran as --model models/qwen38-4bit --port 8651 (server defaults) (MTP: no; prefix cache: no cross-request reuse (0% cached in replay)). mlx-lm ran as --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4 (MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache). oMLX ran as serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8) (MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits)). Verdict: WIN / LOSS when the ratio is outside a 2% band, otherwise TIE. Raw files, launch lines and the full per-rival tables: summary.md.
Strim decodes 24-50% faster than rapid-mlx, the closest rival; 1.8-2.3x the speed of mlx-vlm, 1.9-2.5x the speed of mlx-lm and 1.7-2.2x the speed of oMLX, at 4K to 32K context. rapid-mlx also uses MTP, so the gap to it is the engine, not the speculative head. mlx-vlm, mlx-lm and oMLX have no MTP, so their gap includes it.
Cold prefill (tok/s): within the 2% band of the best rival at none, 2-4% behind it at 4K, 16K and 32K. A tie is not a win.
Strim has the lowest median first-token latency at 4 to 8 concurrent requests, 29-56% lower than each rival. Caveat: rival p50 and p95 are nearly identical (their requests report first tokens batch-synchronously), so their p50 is a weaker number than Strim's per-request TTFT.
Strim is more than 2% behind the best rival in 3 of these six cells, by 2-4%. Batched decode narrows the gap but the remaining cost is the quantized matmul at 4 to 8 rows (below).
Strim's p95 is more than 2% worse than the best rival in 1 of these six cells, by 6%. The same staggering that gives a low median pushes the last request out.
With a shared 16K prefix Strim is 2.8-2.9x faster than each rival in aggregate throughput.
8-turn replay, summed prefill: Strim 48.93 s vs rapid-mlx 49.13 s vs mlx-vlm 192.5 s vs mlx-lm 55.02 s vs oMLX 64.84 s. Verdict against rapid-mlx: TIE; Verdict against mlx-vlm: WIN; Verdict against mlx-lm: WIN; Verdict against oMLX: WIN. Engines with a cross-request prefix cache reuse part of the turn-8 prompt; the others re-prefill it. Replay resends recorded assistant turns, so Strim's token ledger and hot-session reuse do not apply: a lower bound for Strim on a live agent.
| Cell | Unit | Strim | rapid-mlx (MTP) | mlx-vlm (no MTP) | mlx-lm (no MTP) | oMLX (no MTP) | Strim / rapid-mlx | Strim / mlx-vlm | Strim / mlx-lm | Strim / oMLX | vs rapid-mlx | vs mlx-vlm | vs mlx-lm | vs oMLX |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cold 4K prefill | tok/s | 994.5 | 996.8 | 1017 | 949.1 | 896.7 | 1.00× | 0.98× | 1.05× | 1.11× | TIE | LOSS | WIN | WIN |
| cold 4K TTFT | s | 4.13 | 4.12 | 4.039 | 4.327 | 4.58 | 1.00× | 1.02× | 0.95× | 0.90× | TIE | LOSS | WIN | WIN |
| decode 256 tok @ 4K ctx | tok/s | 75.34 | 50.12 | 32.69 | 30.11 | 33.53 | 1.50× | 2.30× | 2.50× | 2.25× | WIN | WIN | WIN | WIN |
| cold 16K prefill | tok/s | 963.1 | 972.4 | 988 | 919.8 | 891.9 | 0.99× | 0.97× | 1.05× | 1.08× | TIE | LOSS | WIN | WIN |
| cold 16K TTFT | s | 17.02 | 16.86 | 16.59 | 17.82 | 18.38 | 1.01× | 1.03× | 0.96× | 0.93× | TIE | LOSS | WIN | WIN |
| decode 256 tok @ 16K ctx | tok/s | 65.18 | 45.75 | 30.93 | 28.68 | 31.42 | 1.42× | 2.11× | 2.27× | 2.07× | WIN | WIN | WIN | WIN |
| cold 32K prefill | tok/s | 884.6 | 910 | 923.2 | 850.8 | 823.7 | 0.97× | 0.96× | 1.04× | 1.07× | LOSS | LOSS | WIN | WIN |
| cold 32K TTFT | s | 37.06 | 36.02 | 35.51 | 38.53 | 39.79 | 1.03× | 1.04× | 0.96× | 0.93× | LOSS | LOSS | WIN | WIN |
| decode 128 tok @ 32K ctx | tok/s | 52.17 | 42.17 | 29.35 | 27.62 | 29.9 | 1.24× | 1.78× | 1.89× | 1.74× | WIN | WIN | WIN | WIN |
| c=4 512-tok prompts aggregate | tok/s | 69.22 | 71.69 | 67.29 | 66.31 | 54.61 | 0.97× | 1.03× | 1.04× | 1.27× | LOSS | WIN | WIN | WIN |
| c=4 512-tok prompts p50 TTFT | s | 1.493 | 2.339 | 2.305 | 2.467 | 3.049 | 0.64× | 0.65× | 0.61× | 0.49× | WIN | WIN | WIN | WIN |
| c=4 512-tok prompts p95 TTFT | s | 2.292 | 2.339 | 2.305 | 2.469 | 3.198 | 0.98× | 0.99× | 0.93× | 0.72× | WIN | TIE | WIN | WIN |
| c=8 512-tok prompts aggregate | tok/s | 76.37 | 71.76 | 74.65 | 67.9 | 58.74 | 1.06× | 1.02× | 1.12× | 1.30× | WIN | WIN | WIN | WIN |
| c=8 512-tok prompts p50 TTFT | s | 2.683 | 5.889 | 4.34 | 6.064 | 5.726 | 0.46× | 0.62× | 0.44× | 0.47× | WIN | WIN | WIN | WIN |
| c=8 512-tok prompts p95 TTFT | s | 4.61 | 9.466 | 4.341 | 9.837 | 6.304 | 0.49× | 1.06× | 0.47× | 0.73× | WIN | LOSS | WIN | WIN |
| c=4 agent prompts (~2.8K tok) aggregate | tok/s | 28.73 | 27.73 | 28.57 | 27.22 | 25.28 | 1.04× | 1.01× | 1.06× | 1.14× | WIN | TIE | WIN | NC |
| c=4 agent prompts p50 TTFT | s | 7.678 | 13.44 | 12.43 | 13.47 | 13.32 | 0.57× | 0.62× | 0.57× | 0.58× | WIN | WIN | WIN | NC |
| c=4 agent prompts p95 TTFT | s | 12.07 | 13.44 | 12.43 | 13.47 | 13.47 | 0.90× | 0.97× | 0.90× | 0.90× | WIN | WIN | WIN | NC |
| c=8 agent prompts aggregate | tok/s | 31.19 | 28.47 | 31.18 | 27.63 | 26.89 | 1.10× | 1.00× | 1.13× | 1.16× | WIN | TIE | WIN | NC |
| c=8 agent prompts p50 TTFT | s | 13.34 | 22.1 | 23.1 | 22.61 | 25.08 | 0.60× | 0.58× | 0.59× | 0.53× | WIN | WIN | WIN | NC |
| c=8 agent prompts p95 TTFT | s | 22.67 | 30.98 | 23.1 | 31.68 | 25.69 | 0.73× | 0.98× | 0.72× | 0.88× | WIN | TIE | WIN | NC |
| c=4 4K prompts aggregate (prefill-bound) | tok/s | 13.24 | 13.16 | 13.52 | 13.1 | n/a | 1.01× | 0.98× | 1.01× | n/a | TIE | LOSS | TIE | n/a |
| c=4 4K prompts p50 TTFT | s | 10.36 | 16.86 | 16.17 | 16.84 | n/a | 0.61× | 0.64× | 0.62× | n/a | WIN | WIN | WIN | n/a |
| c=4 4K prompts p95 TTFT | s | 16 | 16.86 | 16.17 | 16.85 | n/a | 0.95× | 0.99× | 0.95× | n/a | WIN | TIE | WIN | n/a |
| c=8 4K prompts aggregate (prefill-bound) | tok/s | 13.29 | 13.2 | 13.84 | 13.04 | n/a | 1.01× | 0.96× | 1.02× | n/a | TIE | LOSS | TIE | n/a |
| c=8 4K prompts p50 TTFT | s | 18.75 | 26.56 | 32.07 | 26.83 | n/a | 0.71× | 0.58× | 0.70× | n/a | WIN | WIN | WIN | n/a |
| c=8 4K prompts p95 TTFT | s | 32 | 36.24 | 32.07 | 36.57 | n/a | 0.88× | 1.00× | 0.88× | n/a | WIN | TIE | WIN | n/a |
| W5 4 clients, 16K shared prefix aggregate | tok/s | 9.773 | 3.344 | 3.473 | 3.346 | n/a | 2.92× | 2.81× | 2.92× | n/a | WIN | WIN | WIN | n/a |
| W5 p50 TTFT | s | 20.29 | 73.53 | 70.48 | 73.4 | n/a | 0.28× | 0.29× | 0.28× | n/a | WIN | WIN | WIN | n/a |
| W5 p95 TTFT | s | 22.83 | 73.53 | 70.48 | 73.4 | n/a | 0.31× | 0.32× | 0.31× | n/a | WIN | WIN | WIN | n/a |
| agent replay prefill sum T1-T8 | s | 48.93 | 49.13 | 192.5 | 55.02 | 64.84 | 1.00× | 0.25× | 0.89× | 0.75× | TIE | WIN | WIN | WIN |
| agent replay prefill sum T1-T6 | s | 34.6 | 34.77 | 107.7 | 39.31 | 44.9 | 1.00× | 0.32× | 0.88× | 0.77× | TIE | WIN | WIN | WIN |
| agent replay T8 cached fraction | % | 87.25 | 87.23 | 0 | 87.26 | 85.25 | 1.00× | n/a | 1.00× | 1.02× | TIE | n/a | TIE | WIN |
Verdicts: WIN means Strim is better by more than 2%, LOSS worse by more than 2%, TIE within 2%. Lower-is-better cells (TTFT, time) win with a ratio below 1.
| Cell | Unit | Strim median | range | valid | rapid-mlx (MTP) median | range | valid | mlx-vlm (no MTP) median | range | valid | mlx-lm (no MTP) median | range | valid | oMLX (no MTP) median | range | valid |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| cold 4K prefill | tok/s994.5 | 8.51 | yes | 996.8 | 6.40 | yes | 1017 | 2.28 | yes | 949.1 | 0.22 | yes | 896.7 | 0.99 | yes | |
| cold 4K TTFT | s4.13 | 0.04 | yes | 4.12 | 0.03 | yes | 4.039 | 0.01 | yes | 4.327 | 0.00 | yes | 4.58 | 0.01 | yes | |
| decode 256 tok @ 4K ctx | tok/s75.34 | 1.40 | yes | 50.12 | 2.42 | yes | 32.69 | 0.06 | yes | 30.11 | 0.05 | yes | 33.53 | 0.02 | yes | |
| cold 16K prefill | tok/s963.1 | 14.1 | yes | 972.4 | 8.76 | yes | 988 | 0.93 | yes | 919.8 | 0.02 | yes | 891.9 | 0.38 | yes | |
| cold 16K TTFT | s17.02 | 0.25 | yes | 16.86 | 0.15 | yes | 16.59 | 0.02 | yes | 17.82 | 0.00 | yes | 18.38 | 0.01 | yes | |
| decode 256 tok @ 16K ctx | tok/s65.18 | 5.42 | yes | 45.75 | 0.60 | yes | 30.93 | 0.06 | yes | 28.68 | 0.13 | yes | 31.42 | 0.03 | yes | |
| cold 32K prefill | tok/s884.6 | 23.9 | yes | 910 | 6.12 | yes | 923.2 | 0.49 | yes | 850.8 | 1.06 | yes | 823.7 | 2.32 | yes | |
| cold 32K TTFT | s37.06 | 1.00 | yes | 36.02 | 0.24 | yes | 35.51 | 0.02 | yes | 38.53 | 0.05 | yes | 39.79 | 0.11 | yes | |
| decode 128 tok @ 32K ctx | tok/s52.17 | 6.12 | yes | 42.17 | 0.40 | yes | 29.35 | 0.19 | yes | 27.62 | 0.01 | yes | 29.9 | 0.06 | yes | |
| c=4 512-tok prompts aggregate | tok/s69.22 | 0.64 | yes | 71.69 | 0.13 | yes | 67.29 | 0.47 | yes | 66.31 | 0.21 | yes | 54.61 | 1.38 | yes | |
| c=4 512-tok prompts p50 TTFT | s1.493 | 0.01 | yes | 2.339 | 0.01 | yes | 2.305 | 0.01 | yes | 2.467 | 0.00 | yes | 3.049 | 0.25 | yes | |
| c=4 512-tok prompts p95 TTFT | s2.292 | 0.01 | yes | 2.339 | 0.01 | yes | 2.305 | 0.01 | yes | 2.469 | 0.00 | yes | 3.198 | 0.25 | yes | |
| c=8 512-tok prompts aggregate | tok/s76.37 | 0.62 | yes | 71.76 | 0.19 | yes | 74.65 | 0.45 | yes | 67.9 | 0.03 | yes | 58.74 | 0.20 | yes | |
| c=8 512-tok prompts p50 TTFT | s2.683 | 0.07 | yes | 5.889 | 0.02 | yes | 4.34 | 0.04 | yes | 6.064 | 0.02 | yes | 5.726 | 0.05 | yes | |
| c=8 512-tok prompts p95 TTFT | s4.61 | 0.09 | yes | 9.466 | 0.03 | yes | 4.341 | 0.04 | yes | 9.837 | 0.03 | yes | 6.304 | 0.08 | yes | |
| c=4 agent prompts (~2.8K tok) aggregate | tok/s28.73 | 0.02 | yes | 27.73 | 0.06 | yes | 28.57 | 0.16 | yes | 27.22 | 0.14 | yes | 25.28 | 0.00 | no | |
| c=4 agent prompts p50 TTFT | s7.678 | 0.04 | yes | 13.44 | 0.03 | yes | 12.43 | 0.07 | yes | 13.47 | 0.06 | yes | 13.32 | 0.00 | no | |
| c=4 agent prompts p95 TTFT | s12.07 | 0.09 | yes | 13.44 | 0.03 | yes | 12.43 | 0.07 | yes | 13.47 | 0.06 | yes | 13.47 | 0.00 | no | |
| c=8 agent prompts aggregate | tok/s31.19 | 0.27 | yes | 28.47 | 0.74 | yes | 31.18 | 0.15 | yes | 27.63 | 0.07 | yes | 26.89 | 0.00 | no | |
| c=8 agent prompts p50 TTFT | s13.34 | 0.04 | yes | 22.1 | 0.21 | yes | 23.1 | 0.06 | yes | 22.61 | 0.05 | yes | 25.08 | 0.00 | no | |
| c=8 agent prompts p95 TTFT | s22.67 | 0.30 | yes | 30.98 | 0.95 | yes | 23.1 | 0.06 | yes | 31.68 | 0.08 | yes | 25.69 | 0.00 | no | |
| c=4 4K prompts aggregate (prefill-bound) | tok/s13.24 | 0.09 | yes | 13.16 | 0.13 | yes | 13.52 | 0.07 | yes | 13.1 | 0.03 | yes | n/a | n/a | n/a | |
| c=4 4K prompts p50 TTFT | s10.36 | 0.05 | yes | 16.86 | 0.07 | yes | 16.17 | 0.08 | yes | 16.84 | 0.04 | yes | n/a | n/a | n/a | |
| c=4 4K prompts p95 TTFT | s16 | 0.09 | yes | 16.86 | 0.07 | yes | 16.17 | 0.08 | yes | 16.85 | 0.04 | yes | n/a | n/a | n/a | |
| c=8 4K prompts aggregate (prefill-bound) | tok/s13.29 | 0.17 | yes | 13.2 | 0.02 | yes | 13.84 | 0.11 | yes | 13.04 | 0.01 | yes | n/a | n/a | n/a | |
| c=8 4K prompts p50 TTFT | s18.75 | 0.21 | yes | 26.56 | 0.06 | yes | 32.07 | 0.26 | yes | 26.83 | 0.03 | yes | n/a | n/a | n/a | |
| c=8 4K prompts p95 TTFT | s32 | 0.39 | yes | 36.24 | 0.06 | yes | 32.07 | 0.26 | yes | 36.57 | 0.04 | yes | n/a | n/a | n/a | |
| W5 4 clients, 16K shared prefix aggregate | tok/s9.773 | 0.08 | yes | 3.344 | 0.00 | yes | 3.473 | 0.06 | yes | 3.346 | 0.01 | yes | n/a | n/a | n/a | |
| W5 p50 TTFT | s20.29 | 0.15 | yes | 73.53 | 0.01 | yes | 70.48 | 1.19 | yes | 73.4 | 0.19 | yes | n/a | n/a | n/a | |
| W5 p95 TTFT | s22.83 | 0.15 | yes | 73.53 | 0.01 | yes | 70.48 | 1.19 | yes | 73.4 | 0.19 | yes | n/a | n/a | n/a | |
| agent replay prefill sum T1-T8 | s48.93 | 0.21 | yes | 49.13 | 0.17 | yes | 192.5 | 0.76 | yes | 55.02 | 2.27 | yes | 64.84 | 0.15 | yes | |
| agent replay prefill sum T1-T6 | s34.6 | 0.16 | yes | 34.77 | 0.08 | yes | 107.7 | 0.82 | yes | 39.31 | 0.11 | yes | 44.9 | 0.00 | yes | |
| agent replay T8 cached fraction | %87.25 | 0.00 | yes | 87.23 | 0.00 | yes | 0 | 0.00 | yes | 87.26 | 0.00 | yes | 85.25 | 0.00 | yes |
Valid = results.json claim_eligible for that engine and cell. A measured but ineligible comparison is shown with its value and marked no; aborted oMLX cells show n/a.
| Engine | Pass | Cell groups | Attempt | Status | Load max |
|---|---|---|---|---|---|
| Strim | 1agree, w3, w3_32kprimaryCLEAN2.53|||||
| Strim | 1w4, w4s, w6primaryCLEAN3.63|||||
| Strim | 1w5, replayprimaryCLEAN2.44|||||
| rapid-mlx | 1agree, w3, w3_32kprimaryPOLLUTED2.94|||||
| rapid-mlx | 1w4, w4s, w6primaryCLEAN4.68|||||
| rapid-mlx | 1w5, replayprimaryCLEAN1.90|||||
| mlx-vlm | 1agree, w3, w3_32kprimaryCLEAN2.89|||||
| mlx-vlm | 1w4, w4s, w6primaryPOLLUTED1.84|||||
| mlx-vlm | 1w5, replayprimaryCLEAN1.68|||||
| mlx-lm | 1agree, w3, w3_32kprimaryCLEAN2.05|||||
| mlx-lm | 1w4, w4s, w6primaryCLEAN1.10|||||
| mlx-lm | 1w5, replayprimaryCLEAN1.51|||||
| oMLX | 1agree, w3, w3_32kprimaryCLEAN2.76|||||
| oMLX | 1w4, w4s, w6primaryCLEAN2.78|||||
| oMLX | 1w5, replayprimaryCLEAN1.92|||||
| oMLX | 2agree, w3, w3_32kprimaryCLEAN1.74|||||
| oMLX | 2w4, w4s, w6primaryCLEAN2.39|||||
| oMLX | 2w5, replayprimaryCLEAN1.74|||||
| mlx-lm | 2agree, w3, w3_32kprimaryCLEAN1.48|||||
| mlx-lm | 2w4, w4s, w6primaryCLEAN1.50|||||
| mlx-lm | 2w5, replayprimaryCLEAN1.41|||||
| mlx-vlm | 2agree, w3, w3_32kprimaryCLEAN1.85|||||
| mlx-vlm | 2w4, w4s, w6primaryCLEAN3.69|||||
| mlx-vlm | 2w5, replayprimaryCLEAN2.72|||||
| rapid-mlx | 2agree, w3, w3_32kprimaryCLEAN1.69|||||
| rapid-mlx | 2w4, w4s, w6primaryCLEAN1.86|||||
| rapid-mlx | 2w5, replayprimaryCLEAN1.83|||||
| Strim | 2agree, w3, w3_32kprimaryCLEAN1.88|||||
| Strim | 2w4, w4s, w6primaryCLEAN1.52|||||
| Strim | 2w5, replayprimaryCLEAN1.34|||||
| rapid-mlx | 1agree, w3, w3_32krerunPOLLUTED1.50|||||
| mlx-vlm | 1w4, w4s, w6rerunCLEAN1.92|||||
| rapid-mlx | 1agree, w3, w3_32krerunCLEAN1.76
Honest losses
- cold 4K prefill: 2% behind mlx-vlm (ratio 0.978×).
- cold 4K TTFT: 2% behind mlx-vlm (ratio 0.978×).
- cold 16K prefill: 3% behind mlx-vlm (ratio 0.975×).
- cold 16K TTFT: 3% behind mlx-vlm (ratio 0.975×).
- cold 32K prefill: 4% behind mlx-vlm (ratio 0.958×).
- cold 32K TTFT: 4% behind mlx-vlm (ratio 0.958×).
- c=4 512-tok prompts aggregate: 3% behind rapid-mlx (ratio 0.966×).
- c=8 512-tok prompts p95 TTFT: 6% behind mlx-vlm (ratio 0.942×).
- c=4 4K prompts aggregate (prefill-bound): 2% behind mlx-vlm (ratio 0.979×).
- c=8 4K prompts aggregate (prefill-bound): 4% behind mlx-vlm (ratio 0.960×).
| Measure | Strim | rapid-mlx | mlx-vlm | mlx-lm | oMLX |
|---|---|---|---|---|---|
| Peak physical footprint, whole run | 30.8 | 35.9 | 36.3 | 37.5 | 55.2 |
Whole-run maximum over passes and sessions, not steady state. oMLX measured 55.2 GB and exceeded the watchdog threshold; its abort note is retained in the session flags. Largest swap growth: 0 MB.
Greedy agreement (sanity check only)
8 fixed prompts, 64 greedy tokens. Strim against itself across the two passes: 8/8 identical. Strim against rapid-mlx: 7/8; Strim against mlx-vlm: 6/8; Strim against mlx-lm: 6/8; Strim against oMLX: 7/8. The divergences are bf16 near-ties, where a single flipped token changes every later one; it is a sanity check, not a quality measurement.
Caveats that change how to read the table
- Validity. 28 of 30 primary sessions were clean; 2 were marked polluted. Reruns are retained in the data. Claims use only cells marked claim eligible (highest primary-session 1-minute load 4.7). Method and every cell.
- Two passes, one rep each. Pass-to-pass spread is listed in the raw summary; prefill gaps of a few percent sit near the edge of the 2% tie band, so a single flipped pass can change a verdict.
- Rival configuration. rapid-mlx ran as
--no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}(MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on). mlx-vlm ran as--model models/qwen38-4bit --port 8651 (server defaults)(MTP: no; prefix cache: no cross-request reuse (0% cached in replay)). mlx-lm ran as--model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4(MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache). oMLX ran asserve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8)(MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits)). Defaults were used otherwise; rival tuning was not explored. - TTFT definitions differ in practice. Rivals report batch-synchronous first tokens, so aggregate throughput is the only fully comparable concurrency number.
- Later commits are not included. Only the build named above was measured.
- One model, one machine, thinking off, synthetic agent prompts and a synthetic 8-turn fixture.
Prefix cache and memory
Coding agents resend the same system prompt, tool schemas and history every turn. The cache stores engine state at chunk boundaries and restores the longest match, so only the new tail is prefilled. The latest cache work added a cut at the start of each assistant turn, so the end of the previous prompt becomes a cache node, and a footprint cap that sheds stale nodes under memory pressure.
| Measure | Before | After |
|---|---|---|
| Replay summed prefill, 8 turns (s) | 52.3 | 49.6 / 49.9 |
| Cached tokens at replay turn 2 | 3,072 | 4,084 |
| Lowest per-cell peak footprint (GB) | 31.1 | 27.0 |
| Highest per-cell peak footprint (GB) | 41.9 | 32.6 |
Replay: the final head-to-head measured 48.93 s for the same replay on the same build. Cold 16K first token stayed at 17.2-17.3 s (no regression). The earlier footprint growth was by design (the trie filled to its cap), not a leak. The head-to-head numbers already include this work; do not add the two together.
| Case | Miss (s) | Hit (s) | Speedup |
|---|---|---|---|
| 4,096 tokens, 3,072 shared | 3.994 | 1.022 | 3.91× |
| 8,192 tokens, 6,144 shared | 8.204 | 3.440 | 2.38× |
| 4,096 tokens, 3,072 shared, with MTP head state | 4.094 | 1.051 | 3.90× |
n=1 per row, in-process, no HTTP, earlier build. A hit still pays for the unshared tail. The aligned-chunk policy costs 0.6% versus one-shot prefill at 4K. A trie node is 210.8 MB; the MTP head adds 4.01 MB per node.
How it works
Decoding a 27B dense model is limited by memory bandwidth: every token streams the whole weight set. The gains come from more tokens per weight read, avoiding repeated work, and not wasting time between kernels.
MTP speculative decoding
The Qwen3.8 checkpoint ships a small multi-token-prediction head. Strim loads it (models/qwen38-mtp-4bit), drafts tokens with it and verifies them in one pass of the full model. Rejected drafts are rolled back exactly: the attention cache is sliced and per-token linear-attention (GDN) states are restored. Depth adapts (2-4 tokens). A 48k frequency-ranked draft vocabulary keeps the head cheap; verification uses the full vocabulary, so a missing token costs a rejected draft, never a wrong output. For sampled decoding the accept/residual/bonus rule keeps the output distribution unchanged.
Exact, chunk-aligned prefix cache
A trie over 1,024-token chunks holds KV, GDN state, conv state and the MTP head state per node, with an LRU byte budget. Prefill always runs in aligned chunks of that size whether or not the cache is used, so a hit restores exactly the state a miss would have computed. The token ledger records the exact ids the model produced, so resent histories reuse the model's own tokens and keep hitting the cache.
Blocked GDN prefill kernel
Linear-attention layers need a sequential recurrence. A blocked Metal kernel stages 48-token blocks in threadgroup memory and keeps state in registers. It was ported from rapid-mlx (Apache-2.0, itself adapted from oMLX) and is credited in NOTICE. At 4K it measured 825-846 tok/s before and 915 tok/s after at light load (878 at heavier load). The reduction order differs from the serial kernel, which is the source of the near-tie differences in Quality.
Batched decode kernels
Concurrent requests decode in lockstep through one batched forward pass. Batch-dimension GDN decode and conv Metal kernels (one dispatch for all sequences, per-row arithmetic identical to the single-stream kernel) cut the B=4 step from 49.5 to 42.3 ms against a single-stream floor of 34 ms. Served aggregate throughput went from 57.4 to 63.3 tok/s at c=4 and from 66.2 to 73.1 at c=8 in that sweep.
Those sweep numbers were taken under machine load and are already included in the build used for the head-to-head; they are not additional gains. The remaining c=4 gap is the quantized matmul at 4 to 8 rows. MTP inside the batch was measured and rejected (upper bound 1.09x before draft cost). See PLAN-CONCURRENCY.
Admission control
Every request takes a slot before the engine is touched. Interactive requests go first; background work (x-strim-priority: background, delegated jobs) is capped one slot below the total and re-queues between agent turns while interactive work is active, never mid-token. The default total is 8 slots (an admission cap, not the engine batch size). The engine also admits by memory and refuses requests that would not fit. Waiters are bounded and have a deadline. See ADMISSION.md.
Sandboxed harness
Delegated jobs run the local model as a coding agent in an isolated git worktree under sandbox-exec (no network, no credential reads, scrubbed environment), with contained file tools and a harness-run verify command. See Agents and Security.
Tried, measured, rejected
- MTP inside the batch. Verify cost grows steeply with batch size: at 1K context 34.0 ms/pass for one token vs 120.3 ms/pass for three tokens each across four sequences. Upper-bound speedup over plain batching on prose 1.25× at B=2 and 0.99× at B=4, before draft and rollback costs. No-go. BATCH-MTP.
- A custom 4-bit prefill GEMM. 4-bit matmul already runs at 0.90-0.98 of dense bf16 and dense GEMM plateaus at 62-63 TF/s; the optimistic end-to-end bound is +5-8%, below the plan's gate. No-go. PREFILL-SPIKE.
- Batched prefill. B=4 at 4K ran at 0.95× the serial speed. Not adopted. BATCH-PREFILL.
Quality and exactness
The claim is narrow and has two parts.
- Exact where it says so. A prefix-cache hit equals a miss bitwise (final-position logits and greedy tokens), within one fixed chunking policy: prefill always runs in aligned chunks, so cached and uncached runs follow the same arithmetic. That policy itself differs from a one-shot prefill (it costs 0.6% at 4K).
- Not bitwise where it does not. Batched decode, the blocked GDN prefill kernel, speculative decoding and the cache cuts can change near-tie tokens (bf16 logits that tie within rounding; one flipped token changes every later one). Measured: greedy output over 8 fixed prompts and 64 tokens, Strim against itself across passes 8/8 identical, against rapid-mlx 7/8, against mlx-vlm 6/8. The batch kernels raised agreement with each prompt's own single-stream run from 6/8 to 8/8 at 96 tokens.
Multi-step agent quality has been checked on the corpora described in Agents (a real-client soak with toy tasks, a small real-client delegation run, and a Swift and Go task corpus of 17 tasks), not on a broad benchmark. What is not validated is listed under Limits.
Parity gates against Hugging Face
- Tokenizer. Byte-level BPE checked against the HF tokenizer on encode, decode (including special tokens) and every chunking of streamed decode. Fixture tokenizer_parity.json, frozen; test
TokenizerParityTests(skipped when the weights are absent). - Chat template. The native Qwen3.8 renderer (tool calls, reasoning, generation prompts) against HF-rendered text. Fixture template_parity.json.
- Prompt ids. Template then tokenizer, including incremental multi-turn sessions through the ledger, equals HF ids. Fixture prompt_parity.json.
- Special-token injection. User text (messages, reasoning, tool results, tool names, arguments, schemas) is tokenized as plain text, so a user cannot smuggle control strings into the prompt. Fixture prompt_adversarial.json.
Prefix cache gate
The checkprefix gate compares a cold run against hits on the final-position logit hash and 16 greedy tokens, and checks a cold store against the no-store reference, a second hit (no aliasing), a short prompt hitting a longer stored prefix, a forked tail, eviction under a tiny budget and an unrelated prompt missing cleanly. With MTP it also compares head KV, seed hidden state, logits and 64 speculative tokens. Logs: 4K, 8K, MTP. A hot session continued for 20 tokens equals a cold re-prefill (IDENTICAL over 20 tokens).
Known near-tie caveats
On 8 natural prompts (1K and 4K) the first generated token agreed on 8/8 prompts across all three kernel paths and every run was deterministic. The next 16 greedy tokens agree on most prompts and diverge at a bf16 near-tie on others:
| Prompt | vs serial kernel | vs tensor recurrence |
|---|---|---|
| 4K prompt a | 16/16 | 14/16 |
| 4K prompt b | 16/16 | 16/16 |
| 4K prompt c | 16/16 | 16/16 |
| 4K prompt d | 6/16 | 16/16 |
| 4K prompt e | 4/16 | 4/16 |
| 1K prompt a | 16/16 | 16/16 |
| 1K prompt b | 16/16 | 16/16 |
| 1K prompt c | 16/16 | 16/16 |
Divergences are at logits that tie within bf16 rounding. Speculative-vs-greedy parity at 4K is not exact: 0/2 prompts matched exactly. Source: longctx-validate. Earlier build; the kernel is unchanged.
Agent harness, MCP and soak
Status in three parts: what is built, what has evidence, and what has not been validated.
Built
- A job harness that runs the local model as a sandboxed coding agent in a git worktree, with a required
verifycommand the harness runs itself (verified, failed or unverified). - An MCP endpoint on
strim servewith 4 tools (strim_task,strim_job,strim_cancel,strim_ask). - A real-client soak driver (
strim soak) and an agent benchmark (strim agentbench) over a corpus of 17 Swift and Go tasks (12 test-fix, 3 mechanical-edit, 2 repo-qa).
Evidence
- Delegation works end to end on trivial tasks. Real Claude Code and Codex delegated through the MCP tools: 4 of 4 runs passed their deterministic checks on the stock release build (n=1 per cell, one-line fixes and questions).
- Token saving is not shown. On a one-line fix the parent used 29.9K input tokens delegated against 25.5K alone, so no saving (n=1).
- Soak, earlier build. One 30-minute run of real
claude -pandcodex execclients against the server on toy tasks (below). It shows the client-to-server path was stable, not how well the model codes. Results: pass rates below. - Agent benchmark, free arms. One run of 120 runs (harness arm and Claude Code arm on the local model) exists, on the earlier corpus. Part of it had an unusable test environment inside the sandboxes, so its pass rates measure the environment and are not quoted here. The corpus was then reduced to Swift and Go and has not been re-run.
| Measure | Value |
|---|---|
| Tasks run | 120 tasks |
| Tasks passed | 116 tasks |
| Claude Code + Strim tasks | 60 tasks |
| Claude Code + Strim passed | 56 tasks |
| Claude Code pass rate | 93.3% |
| Codex + Strim tasks | 60 tasks |
| Codex + Strim passed | 60 tasks |
| Codex pass rate | 100.0% |
| Failed tasks | 4 tasks |
| Run length | 30.3 min |
| Server crashes | 0 |
| Server restarts | 0 |
| HTTP 5xx events | 0 |
| Requests served | 665 |
| Requests failed | 0 |
| RSS minimum | 8687 MB |
| RSS maximum | 8713 MB |
| RSS slope | 24.0 MB/h |
| TTFT median, first quartile | 249 ms |
| TTFT median, last quartile | 310 ms |
| TTFT p90 | 1,334 ms |
Scope. This soak ran on the earlier build with the earlier harness (2026-10-27). The 4 failures were all Claude Code at one task whose test command the harness allow-list denied; fixed afterwards (1/4 before the fix, 4/4 after, in short reruns outside the 30-minute result). A run that failed because of a harness path error is kept as evidence and excluded from every figure.
Not yet validated
- A live soak with real Claude Code and Codex on the current build under the current sandboxed harness (the sandbox path of the new harness has not been exercised live).
- The paid agent-benchmark pilot (parent arms with real subscriptions). It has not been run, so there is no evidence that delegation saves parent tokens. Plan: PLAN-PRODUCT.
- The agent benchmark on the current Swift and Go corpus, with multi-step tasks, for batched decode and the cache cuts against single-stream.
Security posture
Strim is a local, single-user server. It is not designed to be exposed to a network, and it does not defend against another process running as the same macOS user.
Design
- Loopback only, with Host and Origin checks (DNS-rebinding and cross-site defence) and a refusal of cross-site fetches.
- Bearer token by default (
~/.strim/token, mode 0600, constant-time comparison), plus a separate control token for the menu-bar app.--no-authopens only the API side for loopback development. - The local model is untrusted. Its shell runs under
sandbox-exec(no network, writes only to the job worktree, no reads of credential directories), file tools are contained to the job workspace, jobs run in an isolated worktree, and a patch is applied only after an explicit approval carrying the SHA-256 of the exact bytes reviewed.
Reviewed and fixed (2026-10-28)
Three reviews: the server HTTP surface, every process launch and model-influenced code path, and release hygiene (secrets, personal data, licenses, supply chain).
- Server surface: 14 findings, no critical and 1 high (an integer overflow trap from a client-controlled token count). 6 are fixed and one more partly: token-count clamping and saturating admission math, connection cap and head, body and idle deadlines, bounded request pipelining, a bounded response store, a waiter cap and queue deadline, a job-queue cap, and a minimal unauthenticated
/health. - Process launches: 5 findings fixed: credential directories refused as job working directories, sandbox reads of shared temp areas denied, paid benchmark arms without a shell tool, the MCP token passed by environment reference instead of written to a file, and an opt-in for the unsandboxed legacy scripts.
- Release hygiene: personal paths and a hostname scrubbed from committed results, token files ignored by git, license notices completed.
Residual risk, stated plainly
- Any project under a non-denied home directory is allowed as a job working directory by default.
- Paid benchmark arms must let the client read its own login file; file tools are denied it by permission rule, not by the sandbox.
- No per-route body limit (one cap for all routes); no wall-clock limit on a running generation (output length is bounded instead); one API token means one priority class.
- Token-store hardening against symlink races and permissive MCP token defaults are documented but not reworked (same-user only).
- The reviews were read-only: no live server test, no fuzzing of the tokenizer or template parsers, and some sandbox fixes were not executed under
sandbox-exec. The low and info items of the process-launch review were not addressed.
Report a vulnerability through GitHub private vulnerability reporting (the repository's Security tab); see SECURITY.md. Reviews: server, process launches, release hygiene.
Supported scope
Strim supports Qwen3.8-27B (dense), 4-bit affine g64 with its MTP head, and nothing else. It has been tested only on a 64 GB M5 Max. Other quantizations are on the roadmap and not shipped; other models (including Qwen4) are not supported.
| Mac memory | Context (tokens) | Status |
|---|---|---|
| 8 GB | unsupported | Does not fit: even a 2-bit 27B exceeds the GPU budget. |
| 16 GB | unsupported | Does not fit in practice with 4-bit weights plus MTP head and runtime. |
| 24 GB | 15K/29K / 23K/45K | Estimate for 4-bit: very short context only (bf16 KV / q8 KV, low and high GPU budget). |
| 32 GB | 114K/214K (low) 154K/291K (high) | Estimate (bf16 KV / q8 KV). |
| 36 GB | 163K/307K - 220K+ | Estimate (bf16 KV / q8 KV). |
| 48 GB | 310K+ | Estimate (bf16 KV). |
| 64 GB | full context (measured machine) | The only tier Strim has been run on. |
Computed from the model config with an assumed 5.5 GiB for macOS and apps; weights are 14.09 GiB of text-only 4-bit and the fixed engine overhead is about 17.0 GiB. On the test machine the GPU working-set limit measured 56.0 GiB. Source: RESEARCH-QUANT-TIERS. No smaller Mac has been tested.
16 GB and below are unsupported. The rows for 24 to 48 GB are computed estimates, not measurements; no smaller Mac has run Strim.
Limitations
- One model, one quantization, one machine class (64 GB Apple Silicon), one user. All measurements come from a single M5 Max.
- Two passes with one rep each. Treat differences of a few percent as noise; gaps of a few percent sit at the edge of the 2% tie band.
- Not faster: cold prefill is 2-4% behind it at 4K, 16K and 32K; aggregate throughput at 4 to 8 concurrent requests trails the best rival by more than 2% in 3 of 6 cells (2-4%); p95 first-token latency is more than 2% worse in 1 of 6 cells (6%).
- Only the build named in the run summary at the top was benchmarked; later commits were not.
- The prefix cache is in memory only. Speculative decoding and batching can differ from greedy at bf16 near-ties.
- Not yet validated: live soak on the current build and harness, the paid agent-benchmark pilot, token savings from delegation, multi-step quality of batched decode and the cache cuts, other Mac memory tiers (see Agents and Scope).
- The shipped
StrimAppis a menu-bar shell over an older service and does not drivestrim serve.
Roadmap
- Qwen4 readiness — planned. Make layer and head dimensions config-driven instead of fixed to Qwen3.8-27B (research note).
- Mixed quantization per memory tier — planned. Other bit widths for other Macs, with a quality gate (research note).
- GPU-index decode — planned.
- Batched-matmul tuning for c=4 — planned: the quantized matmul at 4 to 8 rows is the remaining aggregate-throughput gap.
- Cold-prefill kernels — planned: the cold-prefill gap at long prompts.
- Paid agent-benchmark pilot — planned: the test that decides whether delegation saves parent tokens.
- Menu-bar app and a disk-backed prefix cache, after the benchmark gate.
Reproduce
Hardware: Apple M5 Max, 64 GB, macOS 27.0.1. Versions: strim 0.1.1 (ee9f9d8), rapid-mlx 0.15.7, mlx-vlm 0.7.10, mlx-lm 0.32.2, oMLX 0.4.5.dev1.
Run GPU benchmarks one at a time in a foreground shell (the runner takes lockf /tmp/strim-bench.lock). Models live under models/; rival engines must be installed separately.
# head-to-head: OUTDIR [passes] [engines] [cell groups]; pass 2 runs the engines in reverse order
bench/h2h/run.sh bench/results/<dir> 1,2 strim,rapid-mlx,mlx-vlm,mlx-lm,omlx g1,g2,g3
bench/h2h/summarize.sh bench/results/<dir> # writes summary.md and results.json
# flags used
strim serve models/qwen38-4bit models/qwen38-mtp-4bit --port 8203 --no-auth
rapid-mlx --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}
mlx_vlm.server --model models/qwen38-4bit --port 8651 (server defaults)
mlx_lm.server --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4
omlx serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8)
# engine-level gates
swift test --disable-sandbox
.build/release/strim checkprefix models/qwen38-4bit 4096 3 models/qwen38-mtp-4bit
.build/release/strim enginebench models/qwen38-4bit models/qwen38-mtp-4bit
# real-client soak
lockf -k /tmp/strim-bench.lock .build/release/strim soak --duration 30 --arms both
# regenerate this page and the README from site/data/results.json
.build/release/strim site build
.build/release/strim site check
The model-backed tests skip cleanly when models/ is absent. Details: BENCH.md, bench/h2h/run.sh, soak/README.md.
Methodology
- Final head-to-head. Runner
bench/h2h/{run,pass,summarize,watchdog,agree,agent-prompts}.sh(shell, jq, awk). Per pass and engine, sessions are short and contiguous; each engine is the only GPU job; a watchdog aborts on memory limits. The figure rows are generated fromsummary.mdbystrim site buildand re-checked cell by cell against it. - Thinking off for all engines so the chat template is identical. Decode = (completion tokens − 1) / (last chunk time − first chunk time) from
usage.completion_tokens. TTFT = first non-empty output chunk minus send time. - Cold prompts carry a unique head so no engine can hit a cache across reps. Statistics: medians over two passes; no confidence intervals (the sample is too small).
- Earlier 8-engine run (2026-10-26) not repeated for the final build. Only the llama.cpp and Ollama decode points are shown as hollow dashed earlier-run beads; their full historical scoreboard is not mixed with this run.
| Component | Version | Source |
|---|---|---|
| Hardware | Apple M5 Max, 64 GB | bench/results/h2h-final3-20261028/summary.md |
| macOS | 27.0.1 | bench/results/h2h-final-20261028/summary.md |
| MLX Swift | MLX Swift 0.32.3 (Cmlx) | docs/PREFILL-SPIKE-2026-10-26.md |
| Strim build in the head-to-head | strim 0.1.1 (ee9f9d8) | bench/results/h2h-final3-20261028/summary.md |
| rapid-mlx | rapid-mlx 0.15.7 | bench/results/h2h-final3-20261028/summary.md |
| mlx-vlm | mlx-vlm 0.7.10 | bench/results/h2h-final3-20261028/summary.md |
| mlx-lm | mlx-lm 0.32.2 | bench/results/h2h-final3-20261028/summary.md |
| oMLX | oMLX 0.4.5.dev1 | bench/results/h2h-final3-20261028/summary.md |
| Claude Code (soak client) | Claude Code 2.1.310 | bench/soak/README.md |
| Codex (soak client) | codex 0.164.0 | bench/soak/README.md |
Raw data: h2h-final3-20261028, cache-footprint, concurrency plan, soak run.
License and credits
MIT, see LICENSE. Third-party notices: NOTICE and THIRD-PARTY.md. The blocked GDN prefill kernel is ported from Rapid-MLX (Apache-2.0), which adapted it from oMLX (Apache-2.0); the Apache-2.0 text is in LICENSES/. MLX Swift (MIT) is linked through SwiftPM. Contributions: CONTRIBUTING.md.
Figure index
Every number on this page is one of the 592 figures below, defined in site/data/results.json with its source file, method note and caveat. strim site check verifies that each value occurs in its source file.
Show all figures
| id | value | unit | source | method | caveat |
|---|---|---|---|---|---|
pc.4k.miss | 3.994 | s | bench/results/prefix-cache-exact-20261026/checkprefix-4096.log | checkprefix N=4096, shared 3072 tokens: TTFT on a miss (no store). | Synthetic prompts, in-process, no HTTP. Idle GPU assumed; load not recorded. |
pc.4k.hit | 1.022 | s | bench/results/prefix-cache-exact-20261026/checkprefix-4096.log | checkprefix N=4096, shared 3072 tokens: TTFT with a 3072-token prefix hit. | Synthetic prompts, in-process, no HTTP. |
pc.4k.speedup | 3.91 | x | bench/results/prefix-cache-exact-20261026/checkprefix-4096.log | miss / hit TTFT as printed by checkprefix. | Speedup grows with the shared fraction; here 3072 of 4096 tokens shared. |
pc.8k_6k.miss | 8.204 | s | bench/results/prefix-cache-exact-20261026/checkprefix-8192.log | checkprefix N=8192, shared 6144: TTFT on a miss. | Synthetic prompts, in-process. |
pc.8k_6k.hit | 3.440 | s | bench/results/prefix-cache-exact-20261026/checkprefix-8192.log | checkprefix N=8192, shared 6144: TTFT on a hit. | Synthetic prompts, in-process. Recomputes the 2048-token tail. |
pc.8k_6k.speedup | 2.38 | x | bench/results/prefix-cache-exact-20261026/checkprefix-8192.log | miss / hit TTFT as printed by checkprefix. | |
pc.mtp4k.miss | 4.094 | s | bench/results/dec-wave3-20261026/checkprefix-4096-mtp.log | checkprefix with MTP head, N=4096, shared 3072: TTFT (prefill + seed) on a miss. | In-process; MTP head state is stored in the trie nodes. |
pc.mtp4k.hit | 1.051 | s | bench/results/dec-wave3-20261026/checkprefix-4096-mtp.log | checkprefix with MTP head, N=4096, shared 3072: TTFT (prefill + seed) on a hit. | In-process. |
pc.mtp4k.speedup | 3.90 | x | bench/results/dec-wave3-20261026/checkprefix-4096-mtp.log | miss / hit TTFT with MTP over the cache. | |
pc.mtp8k.miss | 8.157 | s | bench/results/dec-wave3-20261026/checkprefix-8192-mtp.log | checkprefix N=8192, shared 3072: TTFT on a miss. | Synthetic prompts, in-process. |
pc.mtp8k.hit | 1.091 | s | bench/results/dec-wave3-20261026/checkprefix-8192-mtp.log | checkprefix N=8192, shared 3072: TTFT on a hit. | Synthetic prompts, in-process. The log header says shared=3072, but the store at that step already held the full prompt's nodes (21 nodes, 4427 MB), so the matched length is probably larger than 3072 and is not printed for this step. The log's section (g) 8K numbers (hit 6.084 s vs miss 22.906 s) were taken at a much slower prefill rate (367 tok/s, versus about 1,000 elsewhere) and are not used. |
pc.mtp8k.speedup | 7.48 | x | bench/results/dec-wave3-20261026/checkprefix-8192-mtp.log | miss / hit TTFT as printed by checkprefix. | See pc.mtp8k.hit caveat. |
pc.node_mb | 210.8 | MB | bench/results/dec-wave3-20261026/checkprefix-4096-mtp.log | Plain trie node (1024 tokens) accounted size. | Accounted size; see memory section for the real-memory finding that preceded the conv-state fix. |
pc.mtp_node_extra_mb | 4.01 | MB | bench/results/dec-wave3-20261026/checkprefix-4096-mtp.log | Extra bytes per node for the MTP head state (+1.90%). | |
pc.policy_cost_4k | 0.6 | % | bench/results/prefix-cache-exact-20261026/checkprefix-4096.log | Cost of the aligned 1024-token chunk prefill policy versus one-shot prefill at N=4096 (chunked 1026 tok/s, one-shot 1032 tok/s). | Single measurement. |
pc.mtp_accept_4k | 65 | % | bench/results/dec-wave3-20261026/checkprefix-4096-mtp.log | MTP draft acceptance in the 4K cache-hit spec-decode check (2.37 tokens/pass; hit 48.3 vs miss 49.9 tok/s). | 64 tokens on one synthetic prompt; not representative of real text. |
pc.hot_continue | IDENTICAL over 20 tokens | bench/results/dec-wave3-20261026/checkprefix-4096-mtp.log | Hot session continuation vs cold re-prefill, 20 greedy tokens. | Informational check; min cold margin 0.000 (a bf16 tie was present and still matched). | |
lc.p4k_a.serial | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs serial GDN kernel, greedy 16 tokens, prompt p4k_a. | Divergence is at a bf16 near-tie (logits printed bf16-rounded); a single tie flips all later tokens. |
lc.p4k_a.tensor | 14/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_a. | Same near-tie caveat. |
lc.p4k_b.serial | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs serial GDN kernel, greedy 16 tokens, prompt p4k_b. | Divergence is at a bf16 near-tie (logits printed bf16-rounded); a single tie flips all later tokens. |
lc.p4k_b.tensor | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_b. | Same near-tie caveat. |
lc.p4k_c.serial | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs serial GDN kernel, greedy 16 tokens, prompt p4k_c. | Divergence is at a bf16 near-tie (logits printed bf16-rounded); a single tie flips all later tokens. |
lc.p4k_c.tensor | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_c. | Same near-tie caveat. |
lc.p4k_d.serial | 6/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs serial GDN kernel, greedy 16 tokens, prompt p4k_d. | Divergence is at a bf16 near-tie (logits printed bf16-rounded); a single tie flips all later tokens. |
lc.p4k_d.tensor | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_d. | Same near-tie caveat. |
lc.p4k_e.serial | 4/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs serial GDN kernel, greedy 16 tokens, prompt p4k_e. | Divergence is at a bf16 near-tie (logits printed bf16-rounded); a single tie flips all later tokens. |
lc.p4k_e.tensor | 4/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_e. | Same near-tie caveat. |
lc.p1k_a.serial | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs serial GDN kernel, greedy 16 tokens, prompt p1k_a. | Divergence is at a bf16 near-tie (logits printed bf16-rounded); a single tie flips all later tokens. |
lc.p1k_a.tensor | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p1k_a. | Same near-tie caveat. |
lc.p1k_b.serial | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs serial GDN kernel, greedy 16 tokens, prompt p1k_b. | Divergence is at a bf16 near-tie (logits printed bf16-rounded); a single tie flips all later tokens. |
lc.p1k_b.tensor | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p1k_b. | Same near-tie caveat. |
lc.p1k_c.serial | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs serial GDN kernel, greedy 16 tokens, prompt p1k_c. | Divergence is at a bf16 near-tie (logits printed bf16-rounded); a single tie flips all later tokens. |
lc.p1k_c.tensor | 16/16 | tokens agree | bench/results/longctx-validate-20261026/summary.md | Blocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p1k_c. | Same near-tie caveat. |
lc.first_token | 8/8 | prompts agree | bench/results/longctx-validate-20261026/summary.md | First generated token agrees across default, serial and tensor paths. | Natural repo prose, disjoint windows, Qwen tokenizer. |
lc.spec_exact_4k | 0/2 | EXACT | bench/results/longctx-validate-20261026/summary.md | Speculative vs greedy parity at 4K: p4k_a and p4k_c both MISMATCH (first diff at generated token 14 and 18). | Not EXACT at 4K; same as the HANDOFF note. |
bm.ms_b1_s1 | 34.0 | ms/pass | docs/BATCH-MTP-2026-10-26.md | Verify-pass cost, B=1, S=1, 1K context. | Median of 6 rounds; background load avg 3-4, absolute ms +-5%. |
bm.ms_b1_s2 | 35.1 | ms/pass | docs/BATCH-MTP-2026-10-26.md | Verify-pass cost, B=1, S=2, 1K context. | As above. |
bm.ms_b4_s1 | 56.0 | ms/pass | docs/BATCH-MTP-2026-10-26.md | Verify-pass cost, B=4, S=1, 1K context. | As above. |
bm.ms_b4_s3 | 120.3 | ms/pass | docs/BATCH-MTP-2026-10-26.md | Verify-pass cost, B=4, S=3, 1K context. | As above. |
bm.bound.b1.prose_s2 | 1.46 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=1, prose s2. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b1.prose_s3 | 1.79 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=1, prose s3. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b1.code_s4 | 3.13 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=1, code s4. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b2.prose_s2 | 1.25 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=2, prose s2. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b2.prose_s3 | 1.2 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=2, prose s3. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b2.code_s4 | 1.9 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=2, code s4. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b3.prose_s2 | 1.03 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=3, prose s2. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b3.prose_s3 | 1.06 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=3, prose s3. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b3.code_s4 | 1.55 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=3, code s4. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b4.prose_s2 | 0.99 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=4, prose s2. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b4.prose_s3 | 0.93 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=4, prose s3. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
bm.bound.b4.code_s4 | 1.57 | x | docs/BATCH-MTP-2026-10-26.md | Upper-bound aggregate speedup of in-batch MTP over plain batched decode, B=4, code s4. | Optimistic: ignores draft cost (2-6 ms/pass), reseed and rollback. Verdict: NO-GO for general BatchSpec. |
ps.qmm_ratio | 0.90-0.98 | qmm / bf16 | docs/PREFILL-SPIKE-2026-10-26.md | MLX 4-bit qmm throughput as a fraction of dense bf16 matmul, 12 shape/M combinations. | MLX already dispatches NAX kernels on this machine. |
ps.plateau | 62-63 | TF/s | docs/PREFILL-SPIKE-2026-10-26.md | Sustained dense GEMM plateau across shapes and dtypes. | True hardware peak unverified. |
ps.bound | +5-8% | end-to-end | docs/PREFILL-SPIKE-2026-10-26.md | Upper bound on end-to-end 4K prefill gain from a custom 4-bit GEMM (about 990-1,020 tok/s from 944). | Optimistic bound; gate was 1.3x, step 3 not built. |
ps.prefill_4k | 944 | tok/s | docs/PREFILL-SPIKE-2026-10-26.md | benchprefill 4096, single pass, rep 3 (936 / 947 / 944). | Loaded machine (load 2.7-5.0). |
ps.gemm_share | 90 | % | docs/PREFILL-SPIKE-2026-10-26.md | Share of 4K prefill that is GEMM-bound (about 90-94%). | Derived from effective TF/s, not a profile. |
bg.before | 825-846 | tok/s | docs/BLOCKED-GDN-PREFILL-2026-10-26.md | 4K prefill with the serial GDN kernel. | Light and heavy load mixed. |
bg.after_light | 915 | tok/s | docs/BLOCKED-GDN-PREFILL-2026-10-26.md | 4K prefill with the blocked GDN kernel, load 3.7. | Kernel ported from rapid-mlx (Apache-2.0). |
bg.after_heavy | 878 | tok/s | docs/BLOCKED-GDN-PREFILL-2026-10-26.md | 4K prefill with the blocked GDN kernel, load 7.3. | Kernel ported from rapid-mlx (Apache-2.0). |
bp.b4_4k | 0.95 | x | docs/BATCH-PREFILL-2026-10-26.md | Batched vs serial 4K prefill, B=4: slower. | Not adopted. |
soak.smoke.tasks | 2/2 | tasks passed | bench/results/soak-20261027/smoke-20261026T212306Z/summary.txt | 5-minute smoke run (one claude -p task, one codex exec task). | n=2 only; shows the harness path works, not reliability. |
soak.smoke.crashes | 0 | bench/results/soak-20261027/smoke-20261026T212306Z/summary.txt | Server crashes in the 5-minute smoke run. | n=2 tasks, 0.6 min. | |
soak.tasks_total | 120 | tasks | bench/results/soak-20261027/run2/summary.txt | Tasks run. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. Pass = deterministic check + client exit 0 within the cap; failures are listed in the summary file. |
soak.tasks_passed | 116 | tasks | bench/results/soak-20261027/run2/summary.txt | Tasks passed (check + client exit 0). 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. Pass = deterministic check + client exit 0 within the cap; failures are listed in the summary file. |
soak.pass_claude | 93.3 | % | bench/results/soak-20261027/run2/summary.txt | Claude Code pass rate. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. Pass = deterministic check + client exit 0 within the cap; failures are listed in the summary file. |
soak.pass_codex | 100.0 | % | bench/results/soak-20261027/run2/summary.txt | Codex pass rate. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. Pass = deterministic check + client exit 0 within the cap; failures are listed in the summary file. |
soak.crashes | 0 | bench/results/soak-20261027/run2/summary.txt | Server crashes. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. | |
soak.restarts | 0 | bench/results/soak-20261027/run2/summary.txt | Server restarts. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. | |
soak.http5xx | 0 | bench/results/soak-20261027/run2/summary.txt | HTTP 5xx events. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. | |
soak.requests_total | 665 | bench/results/soak-20261027/run2/summary.txt | Server requests served. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. | |
soak.requests_failed | 0 | bench/results/soak-20261027/run2/summary.txt | Server requests failed. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. | |
soak.rss_slope | 24.0 | MB/h | bench/results/soak-20261027/run2/summary.txt | RSS slope over the run. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.ttft_q1 | 249 | ms | bench/results/soak-20261027/run2/summary.txt | TTFT median, first quartile of requests. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.ttft_q4 | 310 | ms | bench/results/soak-20261027/run2/summary.txt | TTFT median, last quartile of requests. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.ttft_p90 | 1,334 | ms | bench/results/soak-20261027/run2/summary.txt | TTFT p90. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.failures | 4 | tasks | bench/results/soak-20261027/run2/summary.txt | Failed tasks, all clients. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.claude_tasks | 60 | tasks | bench/results/soak-20261027/run2/summary.txt | Claude Code + Strim tasks run. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.claude_passed | 56 | tasks | bench/results/soak-20261027/run2/summary.txt | Claude Code + Strim tasks passed (check + client exit 0). 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. Pass = deterministic check + client exit 0 within the cap; failures are listed in the summary file. |
soak.codex_tasks | 60 | tasks | bench/results/soak-20261027/run2/summary.txt | Codex + Strim tasks run. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.codex_passed | 60 | tasks | bench/results/soak-20261027/run2/summary.txt | Codex + Strim tasks passed (check + client exit 0). 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. Pass = deterministic check + client exit 0 within the cap; failures are listed in the summary file. |
soak.elapsed_min | 30.3 | min | bench/results/soak-20261027/run2/summary.txt | Wall-clock length of the run. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.rss_min | 8687 | MB | bench/results/soak-20261027/run2/summary.txt | Lowest server RSS sample. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.rss_max | 8713 | MB | bench/results/soak-20261027/run2/summary.txt | Highest server RSS sample. 30-minute real-client soak (earlier soak harness): claude -p and codex exec alternating on a toy repo, one concurrent pair every 6 tasks. | Earlier build and earlier harness (2026-10-27); not repeated on the current build or the current sandboxed harness. Single complete run of at least 30 minutes. |
soak.rerun_a | 1/4 | tasks passed | bench/results/soak-20261027/rerun-a/summary.txt | Claude Code tasks passed in the first rerun, before the harness allow-list fix (4 sequential claude -p tasks, not part of the soak). | Short rerun, not part of the 30-minute result. |
soak.rerun_b | 4/4 | tasks passed | bench/results/soak-20261027/rerun-b/summary.txt | Claude Code tasks passed after the harness allow-list fix (4 sequential claude -p tasks, not part of the soak). | Short rerun, not part of the 30-minute result. |
mtp.depth_range | 2-4 | tokens | docs/STATUS.md | Adaptive MTP draft depth range. | From the status document; fixed depth 2 is the opt-out (STRIM_MTP_FIXED=1). |
bg.block | 48 | tokens | docs/BLOCKED-GDN-PREFILL-2026-10-26.md | Block size staged in threadgroup memory by the blocked GDN kernel. | |
cfg.chunk | 1,024 | tokens | bench/results/prefix-cache-exact-20261026/checkprefix-4096.log | Aligned prefill chunk / trie node size. | Printed as chunk=1024 by checkprefix. |
ver.mlx_swift | MLX Swift 0.32.3 (Cmlx) | docs/PREFILL-SPIKE-2026-10-26.md | Version of MLX Swift. | ||
ver.claude | Claude Code 2.1.310 | bench/soak/README.md | Version of Claude Code (soak). | ||
ver.codex | codex 0.164.0 | bench/soak/README.md | Version of Codex (soak). | ||
harness.tools | 4 | tools | bench/results/mcp-smoke-20261027/summary.md | MCP tools/list on strim serve (strim_task, strim_job, strim_cancel, strim_ask). | Smoke run, one server, one session. |
harness.rerun_runs | 4 | runs | bench/results/mcp-clients-20261027/summary.md | Real Claude Code and Codex runs against the stock release build after the MCP fixes (2 Claude, 2 Codex). | n=1 per cell; trivial tasks (ask a question, fix a one-line bug). |
harness.rerun_pass | 4 | runs passed | bench/results/mcp-clients-20261027/summary.md | Runs of the rerun table whose deterministic check passed (answer correct / git apply ok and tests pass, test files unchanged). | n=1 per cell; says the delegation path works, not that it saves tokens. |
harness.rerun_n | 1 | run per cell | bench/results/mcp-clients-20261027/summary.md | Sample size of each cell in the rerun table. | One run per client and prompt; parent output varies run to run. |
harness.delegated_in | 29.9K | input tokens | docs/PLAN-PRODUCT-2026-10-27.md | Parent total input when a one-line fix was delegated through strim_task (3 turns). | Trivial task, n=1: no saving shown. |
harness.alone_in | 25.5K | input tokens | docs/PLAN-PRODUCT-2026-10-27.md | Parent total input when the same fix was done alone (5 turns). | Trivial task, n=1: no saving shown. |
harness.agentbench_tasks | 30 | tasks | docs/PLAN-PRODUCT-2026-10-27.md | Size of the real-task corpus the 3-arm agent benchmark will run on (not yet run). | Planned measurement; no result exists yet. |
ver.rapid | rapid-mlx 0.15.7 | bench/results/h2h-final3-20261028/summary.md | Version of rapid-mlx in the final head-to-head. | MTP on, --max-num-seqs 4. | |
ver.mlxvlm | mlx-vlm 0.7.10 | bench/results/h2h-final3-20261028/summary.md | Version of mlx-vlm in the final head-to-head. | Server defaults, no MTP. | |
ver.strim_h2h | strim 0.1.1 (ee9f9d8) | bench/results/h2h-final3-20261028/summary.md | Strim build in the final head-to-head. | Commits after this build were not benchmarked. | |
ver.macos | 27.0.1 | bench/results/h2h-final-20261028/summary.md | macOS version of the benchmark machine. | ||
ver.hw | Apple M5 Max, 64 GB | bench/results/h2h-final3-20261028/summary.md | Benchmark machine. | The only machine Strim has been tested on. | |
cf.replay_before | 52.3 | s | bench/results/cache-footprint-20261027/NOTES.md | Agent replay (8 turns, 4.1K to 40.8K tokens) summed prefill before the assistant-start prefix cuts: mean of 4 ABAB runs of the previous engine build. | Synthetic replay, same session as the other cache-footprint figures; absolute values move with machine load. |
cf.replay_after_ab | 49.6 / 49.9 | s | bench/results/cache-footprint-20261027/NOTES.md | Same replay with assistant-start cuts on by default (two runs, committed tree). | Two runs, not a mean; the final head-to-head measured 49.7 s for the same replay on the same build. |
cf.cached_t2_before | 3,072 | tokens | bench/results/cache-footprint-20261027/NOTES.md | Cached prompt tokens at replay turn 2 before the assistant-start cuts. | Synthetic replay. |
cf.cached_t2_after | 4,084 | tokens | bench/results/cache-footprint-20261027/NOTES.md | Cached prompt tokens at replay turn 2 with the assistant-start cuts (turn end becomes a trie node). | Synthetic replay. |
cf.fp_old_lo | 31.1 | GB | bench/results/cache-footprint-20261027/NOTES.md | Lowest per-cell peak physical footprint before the cache and memory work (replay1 31128 MB). | Peak phys_footprint of the engine process, one run per cell. |
cf.fp_old_hi | 41.9 | GB | bench/results/cache-footprint-20261027/NOTES.md | Highest per-cell peak footprint before (W5, 41894 MB). | Peak phys_footprint, one run per cell. |
cf.fp_new_lo | 27.0 | GB | bench/results/cache-footprint-20261027/NOTES.md | Lowest per-cell peak footprint after (replay2, 26983 MB). | Peak phys_footprint, one run per cell. |
cf.fp_new_hi | 32.6 | GB | bench/results/cache-footprint-20261027/NOTES.md | Highest per-cell peak footprint after (W5, 32573 MB). | Peak phys_footprint, one run per cell. |
cf.cold_16k | 17.2-17.3 | s | bench/results/cache-footprint-20261027/NOTES.md | Cold 16K TTFT in the old and the new build (no regression). | One session. |
cb.c4_before | 57.4 | tok/s | docs/PLAN-CONCURRENCY-2026-10-27.md | Served aggregate decode at 4 concurrent 512-token requests before the batch-dimension GDN decode and conv kernels. | Measured under load (the plan states 2-7 load average), so the absolute values are lower than the quiet-machine head-to-head; compare within the pair only. Already included in the build used for the head-to-head. |
cb.c4_after | 63.3 | tok/s | docs/PLAN-CONCURRENCY-2026-10-27.md | Same, with the batched kernels (default on). | Same load caveat; included in the head-to-head build, do not add it to the head-to-head figures. |
cb.c8_before | 66.2 | tok/s | docs/PLAN-CONCURRENCY-2026-10-27.md | Served aggregate decode at 8 concurrent 512-token requests before the kernels. | Same load caveat. |
cb.c8_after | 73.1 | tok/s | docs/PLAN-CONCURRENCY-2026-10-27.md | Same, with the batched kernels. | Same load caveat; included in the head-to-head build. |
cb.step_before | 49.5 | ms/step | docs/PLAN-CONCURRENCY-2026-10-27.md | Batched decode step time at B=4, 512 context, before the batch-dimension kernels. | benchbatch microbenchmark. |
cb.step_after | 42.3 | ms/step | docs/PLAN-CONCURRENCY-2026-10-27.md | Batched decode step time at B=4 with the kernels. | benchbatch microbenchmark. |
cb.step_floor | 34 | ms | docs/PLAN-CONCURRENCY-2026-10-27.md | Plain single-stream decode step (weight-bandwidth floor). | From the plan document. |
cb.agree_off | 6/8 | prompts identical | docs/PLAN-CONCURRENCY-2026-10-27.md | Batched decode without the kernels: prompts whose 96-token greedy output equals their own single-stream run (batch of 8). | 8 fixed realistic prompts; each divergence is a single near-tie. |
cb.agree_on | 8/8 | prompts identical | docs/PLAN-CONCURRENCY-2026-10-27.md | Same with the batch kernels on: prompts identical to their own single-stream run at 96 tokens (7/8 at 128 tokens and 6K characters). | 8 fixed realistic prompts; divergences are bf16 near-ties from the M>1 quantized matmul, not from the GDN kernels. |
cb.mtp_bound | 1.09x | x | docs/PLAN-CONCURRENCY-2026-10-27.md | Upper bound for MTP inside the batch (before draft cost): measured no-go. | Computed from measured verify cost and acceptance. |
ad.max_inflight | 8 | requests | docs/ADMISSION.md | Default total admission slots (STRIM_MAX_SESSIONS); background work is capped one below. | An admission cap, not the engine batch size; the engine admits by memory. |
sec.server_findings | 14 | findings | docs/SECURITY-REVIEW-2026-10-28-server.md | Findings (F1 to F14) of the server HTTP surface review. | Read-only review plus an isolated arithmetic repro; no live server, no GPU. |
sec.server_fixed | 6 | findings | docs/SECURITY-REVIEW-2026-10-28-server.md | Server findings marked Fixed in the fix-status table (F1, F2, F3, F4, F6, F8). | A seventh (F7) is fixed partly; others are residual or were handled by the process-launch review. |
sec.server_high | 1 | findings | docs/SECURITY-REVIEW-2026-10-28-server.md | High-severity server findings (F1, integer overflow trap from a client-controlled token count), fixed. | No critical findings. |
sec.exec_fixed | 5 | findings | docs/SECURITY-REVIEW-2026-10-28-exec.md | Process-launch and model-influenced-code findings fixed (H1, M1 to M4). | The low and info items (L1 to L5, I1 to I3) were not addressed; residuals are listed per finding. |
qt.mem_gib | 56.0 | GiB | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | Metal recommendedMaxWorkingSetSize on the 64 GB test machine (87.5% of RAM). | Measured on one machine and one macOS version; other tiers are not measured. |
qt.w4 | 14.09 | GiB | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | Computed text-only weight size of a 4-bit affine g64 quantization of the 27B backbone. | Computed from the config, not measured; the checkpoint on disk also carries a vision tower. |
qt.f4 | 17.0 | GiB | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | Computed fixed engine overhead F for 4-bit g64 (weights, MTP head, one GDN state, MLX cache and prefill transient). | Computed with assumptions, not measured on other tiers. |
qt.t8 | no | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | 8 GB tier: even a 2-bit 27B exceeds the GPU budget. | Computed. | |
qt.t16 | no | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | 16 GB tier: does not fit in practice. | Computed; no 4-bit configuration fits. | |
qt.t24 | 15K/29K / 23K/45K | tokens | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | 24 GB tier, 4-bit g64: context estimate (bf16 KV / q8 KV) at the 75% and 87.5% GPU budget. | Computed, not measured; uses an assumed 5.5 GiB for macOS and apps. |
qt.t32 | 114K/214K (low) 154K/291K (high) | tokens | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | 32 GB tier, 4-bit g64: context estimate (bf16 KV / q8 KV) at the low and high GPU budget. | Computed, not measured. |
qt.t36 | 163K/307K - 220K+ | tokens | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | 36 GB tier, 4-bit g64: context estimate (bf16 KV / q8 KV). | Computed, not measured. |
qt.t48 | 310K+ | tokens | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | 48 GB tier, 4-bit g64: context estimate (bf16 KV). | Computed, not measured. |
qt.t64 | full | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | 64 GB tier, 4-bit g64: the full 262K native context fits (single sequence, no prefix cache). | Computed; the 64 GB tier is also the only measured one. | |
ab.runs | 120 | runs | bench/results/agentbench-20261028/report.md | Runs of the free arms (H harness, C Claude Code client on the local model) in the agent benchmark of 2026-10-28. | Earlier 30-task corpus: some tasks had an unusable test environment inside the sandboxes, so those results measure the environment, not the model. No pass rate from this run is quoted. |
ab.corpus | 17 | tasks | docs/RESEARCH-QUANT-TIERS-2026-10-27.md | Tasks in the current agent task corpus (12 test-fix, 3 mechanical-edit, 2 repo-qa; Swift and Go). | Not yet re-run with the agent benchmark; the research note says 17 tasks are too few for fine decisions. |
final.c4k_pf.strim | 994.5 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K prefill, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.c4k_pf.rapid-mlx | 996.8 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K prefill, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.c4k_pf.mlx-vlm | 1017 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K prefill, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.c4k_pf.mlx-lm | 949.1 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K prefill, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.c4k_pf.omlx | 896.7 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K prefill, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.c4k_pf.ratio.rapid-mlx | 1.00 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 4K prefill, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c4k_pf.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 4K prefill against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c4k_pf.ratio.mlx-vlm | 0.98 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 4K prefill, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c4k_pf.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 4K prefill against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c4k_pf.ratio.mlx-lm | 1.05 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 4K prefill, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c4k_pf.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 4K prefill against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c4k_pf.ratio.omlx | 1.11 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 4K prefill, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c4k_pf.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 4K prefill against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c4k_tt.strim | 4.13 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.c4k_tt.rapid-mlx | 4.12 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.c4k_tt.mlx-vlm | 4.039 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.c4k_tt.mlx-lm | 4.327 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.c4k_tt.omlx | 4.58 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 4K TTFT, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.c4k_tt.ratio.rapid-mlx | 1.00 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 4K TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c4k_tt.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 4K TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c4k_tt.ratio.mlx-vlm | 1.02 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 4K TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c4k_tt.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 4K TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c4k_tt.ratio.mlx-lm | 0.95 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 4K TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c4k_tt.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 4K TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c4k_tt.ratio.omlx | 0.90 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 4K TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c4k_tt.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 4K TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d4k.strim | 75.34 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 4K ctx, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.d4k.rapid-mlx | 50.12 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 4K ctx, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.d4k.mlx-vlm | 32.69 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 4K ctx, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.d4k.mlx-lm | 30.11 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 4K ctx, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.d4k.omlx | 33.53 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 4K ctx, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.d4k.ratio.rapid-mlx | 1.50 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 256 tok @ 4K ctx, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d4k.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 256 tok @ 4K ctx against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d4k.ratio.mlx-vlm | 2.30 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 256 tok @ 4K ctx, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d4k.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 256 tok @ 4K ctx against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d4k.ratio.mlx-lm | 2.50 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 256 tok @ 4K ctx, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d4k.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 256 tok @ 4K ctx against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d4k.ratio.omlx | 2.25 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 256 tok @ 4K ctx, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d4k.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 256 tok @ 4K ctx against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c16k_pf.strim | 963.1 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K prefill, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.c16k_pf.rapid-mlx | 972.4 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K prefill, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.c16k_pf.mlx-vlm | 988 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K prefill, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.c16k_pf.mlx-lm | 919.8 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K prefill, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.c16k_pf.omlx | 891.9 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K prefill, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.c16k_pf.ratio.rapid-mlx | 0.99 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 16K prefill, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c16k_pf.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 16K prefill against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c16k_pf.ratio.mlx-vlm | 0.97 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 16K prefill, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c16k_pf.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 16K prefill against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c16k_pf.ratio.mlx-lm | 1.05 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 16K prefill, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c16k_pf.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 16K prefill against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c16k_pf.ratio.omlx | 1.08 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 16K prefill, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c16k_pf.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 16K prefill against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c16k_tt.strim | 17.02 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.c16k_tt.rapid-mlx | 16.86 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.c16k_tt.mlx-vlm | 16.59 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.c16k_tt.mlx-lm | 17.82 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.c16k_tt.omlx | 18.38 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 16K TTFT, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.c16k_tt.ratio.rapid-mlx | 1.01 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 16K TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c16k_tt.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 16K TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c16k_tt.ratio.mlx-vlm | 1.03 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 16K TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c16k_tt.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 16K TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c16k_tt.ratio.mlx-lm | 0.96 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 16K TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c16k_tt.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 16K TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c16k_tt.ratio.omlx | 0.93 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 16K TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c16k_tt.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 16K TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d16k.strim | 65.18 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 16K ctx, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.d16k.rapid-mlx | 45.75 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 16K ctx, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.d16k.mlx-vlm | 30.93 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 16K ctx, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.d16k.mlx-lm | 28.68 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 16K ctx, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.d16k.omlx | 31.42 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 256 tok @ 16K ctx, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.d16k.ratio.rapid-mlx | 1.42 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 256 tok @ 16K ctx, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d16k.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 256 tok @ 16K ctx against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d16k.ratio.mlx-vlm | 2.11 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 256 tok @ 16K ctx, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d16k.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 256 tok @ 16K ctx against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d16k.ratio.mlx-lm | 2.27 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 256 tok @ 16K ctx, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d16k.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 256 tok @ 16K ctx against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d16k.ratio.omlx | 2.07 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 256 tok @ 16K ctx, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d16k.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 256 tok @ 16K ctx against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c32k_pf.strim | 884.6 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K prefill, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.c32k_pf.rapid-mlx | 910 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K prefill, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.c32k_pf.mlx-vlm | 923.2 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K prefill, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.c32k_pf.mlx-lm | 850.8 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K prefill, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.c32k_pf.omlx | 823.7 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K prefill, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.c32k_pf.ratio.rapid-mlx | 0.97 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 32K prefill, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c32k_pf.verdict.rapid-mlx | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 32K prefill against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c32k_pf.ratio.mlx-vlm | 0.96 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 32K prefill, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c32k_pf.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 32K prefill against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c32k_pf.ratio.mlx-lm | 1.04 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 32K prefill, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c32k_pf.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 32K prefill against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c32k_pf.ratio.omlx | 1.07 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 32K prefill, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c32k_pf.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 32K prefill against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c32k_tt.strim | 37.06 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.c32k_tt.rapid-mlx | 36.02 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.c32k_tt.mlx-vlm | 35.51 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.c32k_tt.mlx-lm | 38.53 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.c32k_tt.omlx | 39.79 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): cold 32K TTFT, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.c32k_tt.ratio.rapid-mlx | 1.03 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 32K TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c32k_tt.verdict.rapid-mlx | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 32K TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c32k_tt.ratio.mlx-vlm | 1.04 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 32K TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c32k_tt.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 32K TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c32k_tt.ratio.mlx-lm | 0.96 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 32K TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c32k_tt.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 32K TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.c32k_tt.ratio.omlx | 0.93 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: cold 32K TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.c32k_tt.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for cold 32K TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d32k.strim | 52.17 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 128 tok @ 32K ctx, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.d32k.rapid-mlx | 42.17 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 128 tok @ 32K ctx, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.d32k.mlx-vlm | 29.35 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 128 tok @ 32K ctx, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.d32k.mlx-lm | 27.62 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 128 tok @ 32K ctx, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.d32k.omlx | 29.9 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): decode 128 tok @ 32K ctx, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.d32k.ratio.rapid-mlx | 1.24 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 128 tok @ 32K ctx, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d32k.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 128 tok @ 32K ctx against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d32k.ratio.mlx-vlm | 1.78 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 128 tok @ 32K ctx, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d32k.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 128 tok @ 32K ctx against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d32k.ratio.mlx-lm | 1.89 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 128 tok @ 32K ctx, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d32k.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 128 tok @ 32K ctx against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.d32k.ratio.omlx | 1.74 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: decode 128 tok @ 32K ctx, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.d32k.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for decode 128 tok @ 32K ctx against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a512c4.strim | 69.22 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts aggregate, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.a512c4.rapid-mlx | 71.69 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts aggregate, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.a512c4.mlx-vlm | 67.29 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts aggregate, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.a512c4.mlx-lm | 66.31 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts aggregate, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.a512c4.omlx | 54.61 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts aggregate, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.a512c4.ratio.rapid-mlx | 0.97 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts aggregate, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a512c4.verdict.rapid-mlx | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts aggregate against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a512c4.ratio.mlx-vlm | 1.03 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts aggregate, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a512c4.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts aggregate against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a512c4.ratio.mlx-lm | 1.04 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts aggregate, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a512c4.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts aggregate against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a512c4.ratio.omlx | 1.27 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts aggregate, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a512c4.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts aggregate against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_512c4.strim | 1.493 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p50 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p50_512c4.rapid-mlx | 2.339 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p50 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p50_512c4.mlx-vlm | 2.305 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p50 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p50_512c4.mlx-lm | 2.467 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p50 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p50_512c4.omlx | 3.049 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p50 TTFT, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p50_512c4.ratio.rapid-mlx | 0.64 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts p50 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_512c4.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts p50 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_512c4.ratio.mlx-vlm | 0.65 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts p50 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_512c4.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts p50 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_512c4.ratio.mlx-lm | 0.61 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts p50 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_512c4.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts p50 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_512c4.ratio.omlx | 0.49 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts p50 TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_512c4.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts p50 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_512c4.strim | 2.292 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p95 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p95_512c4.rapid-mlx | 2.339 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p95 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p95_512c4.mlx-vlm | 2.305 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p95 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p95_512c4.mlx-lm | 2.469 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p95 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p95_512c4.omlx | 3.198 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 512-tok prompts p95 TTFT, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p95_512c4.ratio.rapid-mlx | 0.98 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts p95 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_512c4.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts p95 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_512c4.ratio.mlx-vlm | 0.99 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts p95 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_512c4.verdict.mlx-vlm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts p95 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_512c4.ratio.mlx-lm | 0.93 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts p95 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_512c4.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts p95 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_512c4.ratio.omlx | 0.72 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 512-tok prompts p95 TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_512c4.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 512-tok prompts p95 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a512c8.strim | 76.37 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts aggregate, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.a512c8.rapid-mlx | 71.76 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts aggregate, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.a512c8.mlx-vlm | 74.65 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts aggregate, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.a512c8.mlx-lm | 67.9 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts aggregate, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.a512c8.omlx | 58.74 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts aggregate, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.a512c8.ratio.rapid-mlx | 1.06 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts aggregate, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a512c8.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts aggregate against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a512c8.ratio.mlx-vlm | 1.02 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts aggregate, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a512c8.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts aggregate against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a512c8.ratio.mlx-lm | 1.12 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts aggregate, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a512c8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts aggregate against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a512c8.ratio.omlx | 1.30 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts aggregate, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a512c8.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts aggregate against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_512c8.strim | 2.683 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p50 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p50_512c8.rapid-mlx | 5.889 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p50 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p50_512c8.mlx-vlm | 4.34 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p50 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p50_512c8.mlx-lm | 6.064 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p50 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p50_512c8.omlx | 5.726 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p50 TTFT, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p50_512c8.ratio.rapid-mlx | 0.46 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts p50 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_512c8.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts p50 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_512c8.ratio.mlx-vlm | 0.62 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts p50 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_512c8.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts p50 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_512c8.ratio.mlx-lm | 0.44 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts p50 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_512c8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts p50 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_512c8.ratio.omlx | 0.47 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts p50 TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_512c8.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts p50 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_512c8.strim | 4.61 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p95 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p95_512c8.rapid-mlx | 9.466 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p95 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p95_512c8.mlx-vlm | 4.341 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p95 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p95_512c8.mlx-lm | 9.837 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p95 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p95_512c8.omlx | 6.304 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 512-tok prompts p95 TTFT, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p95_512c8.ratio.rapid-mlx | 0.49 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts p95 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_512c8.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts p95 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_512c8.ratio.mlx-vlm | 1.06 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts p95 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_512c8.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts p95 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_512c8.ratio.mlx-lm | 0.47 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts p95 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_512c8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts p95 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_512c8.ratio.omlx | 0.73 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 512-tok prompts p95 TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_512c8.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 512-tok prompts p95 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aagc4.strim | 28.73 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts (~2.8K tok) aggregate, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.aagc4.rapid-mlx | 27.73 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts (~2.8K tok) aggregate, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.aagc4.mlx-vlm | 28.57 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts (~2.8K tok) aggregate, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.aagc4.mlx-lm | 27.22 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts (~2.8K tok) aggregate, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.aagc4.omlx | 25.28 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts (~2.8K tok) aggregate, omlx. Median of 1 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.aagc4.ratio.rapid-mlx | 1.04 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts (~2.8K tok) aggregate, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aagc4.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts (~2.8K tok) aggregate against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aagc4.ratio.mlx-vlm | 1.01 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts (~2.8K tok) aggregate, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aagc4.verdict.mlx-vlm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts (~2.8K tok) aggregate against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aagc4.ratio.mlx-lm | 1.06 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts (~2.8K tok) aggregate, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aagc4.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts (~2.8K tok) aggregate against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aagc4.ratio.omlx | 1.14 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts (~2.8K tok) aggregate, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aagc4.verdict.omlx | NC | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts (~2.8K tok) aggregate against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Not claimable: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog). The summary.md verdict is withheld here because the cell is not claim_eligible. | |
final.p50_agc4.strim | 7.678 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p50 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p50_agc4.rapid-mlx | 13.44 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p50 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p50_agc4.mlx-vlm | 12.43 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p50 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p50_agc4.mlx-lm | 13.47 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p50 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p50_agc4.omlx | 13.32 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p50 TTFT, omlx. Median of 1 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p50_agc4.ratio.rapid-mlx | 0.57 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts p50 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_agc4.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts p50 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_agc4.ratio.mlx-vlm | 0.62 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts p50 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_agc4.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts p50 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_agc4.ratio.mlx-lm | 0.57 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts p50 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_agc4.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts p50 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_agc4.ratio.omlx | 0.58 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts p50 TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_agc4.verdict.omlx | NC | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts p50 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Not claimable: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog). The summary.md verdict is withheld here because the cell is not claim_eligible. | |
final.p95_agc4.strim | 12.07 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p95 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p95_agc4.rapid-mlx | 13.44 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p95 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p95_agc4.mlx-vlm | 12.43 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p95 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p95_agc4.mlx-lm | 13.47 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p95 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p95_agc4.omlx | 13.47 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 agent prompts p95 TTFT, omlx. Median of 1 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p95_agc4.ratio.rapid-mlx | 0.90 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts p95 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_agc4.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts p95 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_agc4.ratio.mlx-vlm | 0.97 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts p95 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_agc4.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts p95 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_agc4.ratio.mlx-lm | 0.90 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts p95 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_agc4.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts p95 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_agc4.ratio.omlx | 0.90 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 agent prompts p95 TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_agc4.verdict.omlx | NC | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 agent prompts p95 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Not claimable: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog). The summary.md verdict is withheld here because the cell is not claim_eligible. | |
final.aagc8.strim | 31.19 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts aggregate, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.aagc8.rapid-mlx | 28.47 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts aggregate, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.aagc8.mlx-vlm | 31.18 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts aggregate, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.aagc8.mlx-lm | 27.63 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts aggregate, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.aagc8.omlx | 26.89 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts aggregate, omlx. Median of 1 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.aagc8.ratio.rapid-mlx | 1.10 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts aggregate, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aagc8.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts aggregate against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aagc8.ratio.mlx-vlm | 1.00 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts aggregate, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aagc8.verdict.mlx-vlm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts aggregate against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aagc8.ratio.mlx-lm | 1.13 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts aggregate, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aagc8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts aggregate against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aagc8.ratio.omlx | 1.16 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts aggregate, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aagc8.verdict.omlx | NC | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts aggregate against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Not claimable: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog). The summary.md verdict is withheld here because the cell is not claim_eligible. | |
final.p50_agc8.strim | 13.34 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p50 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p50_agc8.rapid-mlx | 22.1 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p50 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p50_agc8.mlx-vlm | 23.1 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p50 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p50_agc8.mlx-lm | 22.61 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p50 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p50_agc8.omlx | 25.08 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p50 TTFT, omlx. Median of 1 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p50_agc8.ratio.rapid-mlx | 0.60 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts p50 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_agc8.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts p50 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_agc8.ratio.mlx-vlm | 0.58 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts p50 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_agc8.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts p50 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_agc8.ratio.mlx-lm | 0.59 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts p50 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_agc8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts p50 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_agc8.ratio.omlx | 0.53 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts p50 TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_agc8.verdict.omlx | NC | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts p50 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Not claimable: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog). The summary.md verdict is withheld here because the cell is not claim_eligible. | |
final.p95_agc8.strim | 22.67 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p95 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p95_agc8.rapid-mlx | 30.98 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p95 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p95_agc8.mlx-vlm | 23.1 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p95 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p95_agc8.mlx-lm | 31.68 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p95 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p95_agc8.omlx | 25.69 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 agent prompts p95 TTFT, omlx. Median of 1 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p95_agc8.ratio.rapid-mlx | 0.73 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts p95 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_agc8.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts p95 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_agc8.ratio.mlx-vlm | 0.98 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts p95 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_agc8.verdict.mlx-vlm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts p95 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_agc8.ratio.mlx-lm | 0.72 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts p95 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_agc8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts p95 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_agc8.ratio.omlx | 0.88 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 agent prompts p95 TTFT, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_agc8.verdict.omlx | NC | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 agent prompts p95 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Not claimable: oMLX: pass 2 excluded (engine_guard_abort, memory_abort_watchdog). The summary.md verdict is withheld here because the cell is not claim_eligible. | |
final.a4kc4.strim | 13.24 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts aggregate (prefill-bound), strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.a4kc4.rapid-mlx | 13.16 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts aggregate (prefill-bound), rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.a4kc4.mlx-vlm | 13.52 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts aggregate (prefill-bound), mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.a4kc4.mlx-lm | 13.1 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts aggregate (prefill-bound), mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.a4kc4.omlx | n/a pending | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts aggregate (prefill-bound), omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.a4kc4.ratio.rapid-mlx | 1.01 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts aggregate (prefill-bound), Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a4kc4.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts aggregate (prefill-bound) against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a4kc4.ratio.mlx-vlm | 0.98 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts aggregate (prefill-bound), Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a4kc4.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts aggregate (prefill-bound) against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a4kc4.ratio.mlx-lm | 1.01 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts aggregate (prefill-bound), Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a4kc4.verdict.mlx-lm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts aggregate (prefill-bound) against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a4kc4.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts aggregate (prefill-bound) against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_4kc4.strim | 10.36 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p50 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p50_4kc4.rapid-mlx | 16.86 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p50 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p50_4kc4.mlx-vlm | 16.17 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p50 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p50_4kc4.mlx-lm | 16.84 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p50 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p50_4kc4.omlx | n/a pending | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p50 TTFT, omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p50_4kc4.ratio.rapid-mlx | 0.61 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts p50 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_4kc4.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts p50 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_4kc4.ratio.mlx-vlm | 0.64 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts p50 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_4kc4.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts p50 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_4kc4.ratio.mlx-lm | 0.62 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts p50 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_4kc4.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts p50 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_4kc4.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts p50 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_4kc4.strim | 16 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p95 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p95_4kc4.rapid-mlx | 16.86 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p95 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p95_4kc4.mlx-vlm | 16.17 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p95 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p95_4kc4.mlx-lm | 16.85 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p95 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p95_4kc4.omlx | n/a pending | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=4 4K prompts p95 TTFT, omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p95_4kc4.ratio.rapid-mlx | 0.95 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts p95 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_4kc4.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts p95 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_4kc4.ratio.mlx-vlm | 0.99 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts p95 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_4kc4.verdict.mlx-vlm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts p95 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_4kc4.ratio.mlx-lm | 0.95 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=4 4K prompts p95 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_4kc4.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts p95 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_4kc4.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=4 4K prompts p95 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a4kc8.strim | 13.29 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts aggregate (prefill-bound), strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.a4kc8.rapid-mlx | 13.2 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts aggregate (prefill-bound), rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.a4kc8.mlx-vlm | 13.84 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts aggregate (prefill-bound), mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.a4kc8.mlx-lm | 13.04 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts aggregate (prefill-bound), mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.a4kc8.omlx | n/a pending | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts aggregate (prefill-bound), omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.a4kc8.ratio.rapid-mlx | 1.01 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts aggregate (prefill-bound), Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a4kc8.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts aggregate (prefill-bound) against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a4kc8.ratio.mlx-vlm | 0.96 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts aggregate (prefill-bound), Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a4kc8.verdict.mlx-vlm | LOSS | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts aggregate (prefill-bound) against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a4kc8.ratio.mlx-lm | 1.02 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts aggregate (prefill-bound), Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.a4kc8.verdict.mlx-lm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts aggregate (prefill-bound) against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.a4kc8.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts aggregate (prefill-bound) against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_4kc8.strim | 18.75 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p50 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p50_4kc8.rapid-mlx | 26.56 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p50 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p50_4kc8.mlx-vlm | 32.07 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p50 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p50_4kc8.mlx-lm | 26.83 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p50 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p50_4kc8.omlx | n/a pending | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p50 TTFT, omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p50_4kc8.ratio.rapid-mlx | 0.71 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts p50 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_4kc8.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts p50 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_4kc8.ratio.mlx-vlm | 0.58 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts p50 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_4kc8.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts p50 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_4kc8.ratio.mlx-lm | 0.70 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts p50 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_4kc8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts p50 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_4kc8.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts p50 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_4kc8.strim | 32 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p95 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p95_4kc8.rapid-mlx | 36.24 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p95 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p95_4kc8.mlx-vlm | 32.07 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p95 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p95_4kc8.mlx-lm | 36.57 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p95 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p95_4kc8.omlx | n/a pending | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): c=8 4K prompts p95 TTFT, omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p95_4kc8.ratio.rapid-mlx | 0.88 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts p95 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_4kc8.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts p95 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_4kc8.ratio.mlx-vlm | 1.00 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts p95 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_4kc8.verdict.mlx-vlm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts p95 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_4kc8.ratio.mlx-lm | 0.88 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: c=8 4K prompts p95 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_4kc8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts p95 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_4kc8.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for c=8 4K prompts p95 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aw5.strim | 9.773 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 4 clients, 16K shared prefix aggregate, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.aw5.rapid-mlx | 3.344 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 4 clients, 16K shared prefix aggregate, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.aw5.mlx-vlm | 3.473 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 4 clients, 16K shared prefix aggregate, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.aw5.mlx-lm | 3.346 | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 4 clients, 16K shared prefix aggregate, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.aw5.omlx | n/a pending | tok/s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 4 clients, 16K shared prefix aggregate, omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.aw5.ratio.rapid-mlx | 2.92 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 4 clients, 16K shared prefix aggregate, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aw5.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 4 clients, 16K shared prefix aggregate against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aw5.ratio.mlx-vlm | 2.81 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 4 clients, 16K shared prefix aggregate, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aw5.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 4 clients, 16K shared prefix aggregate against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aw5.ratio.mlx-lm | 2.92 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 4 clients, 16K shared prefix aggregate, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.aw5.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 4 clients, 16K shared prefix aggregate against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.aw5.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 4 clients, 16K shared prefix aggregate against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_w5.strim | 20.29 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p50 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p50_w5.rapid-mlx | 73.53 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p50 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p50_w5.mlx-vlm | 70.48 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p50 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p50_w5.mlx-lm | 73.4 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p50 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p50_w5.omlx | n/a pending | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p50 TTFT, omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p50_w5.ratio.rapid-mlx | 0.28 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 p50 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_w5.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 p50 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_w5.ratio.mlx-vlm | 0.29 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 p50 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_w5.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 p50 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_w5.ratio.mlx-lm | 0.28 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 p50 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p50_w5.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 p50 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p50_w5.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 p50 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_w5.strim | 22.83 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p95 TTFT, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.p95_w5.rapid-mlx | 73.53 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p95 TTFT, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.p95_w5.mlx-vlm | 70.48 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p95 TTFT, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.p95_w5.mlx-lm | 73.4 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p95 TTFT, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.p95_w5.omlx | n/a pending | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): W5 p95 TTFT, omlx. No valid value: every pass of this cell was excluded or the engine aborted (n/a in summary.md). | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.p95_w5.ratio.rapid-mlx | 0.31 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 p95 TTFT, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_w5.verdict.rapid-mlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 p95 TTFT against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_w5.ratio.mlx-vlm | 0.32 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 p95 TTFT, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_w5.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 p95 TTFT against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_w5.ratio.mlx-lm | 0.31 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: W5 p95 TTFT, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.p95_w5.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 p95 TTFT against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.p95_w5.verdict.omlx | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for W5 p95 TTFT against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rp8.strim | 48.93 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T8, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.rp8.rapid-mlx | 49.13 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T8, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.rp8.mlx-vlm | 192.5 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T8, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.rp8.mlx-lm | 55.02 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T8, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.rp8.omlx | 64.84 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T8, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.rp8.ratio.rapid-mlx | 1.00 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay prefill sum T1-T8, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rp8.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay prefill sum T1-T8 against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rp8.ratio.mlx-vlm | 0.25 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay prefill sum T1-T8, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rp8.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay prefill sum T1-T8 against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rp8.ratio.mlx-lm | 0.89 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay prefill sum T1-T8, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rp8.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay prefill sum T1-T8 against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rp8.ratio.omlx | 0.75 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay prefill sum T1-T8, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rp8.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay prefill sum T1-T8 against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rp6.strim | 34.6 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T6, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.rp6.rapid-mlx | 34.77 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T6, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.rp6.mlx-vlm | 107.7 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T6, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.rp6.mlx-lm | 39.31 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T6, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.rp6.omlx | 44.9 | s | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay prefill sum T1-T6, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.rp6.ratio.rapid-mlx | 1.00 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay prefill sum T1-T6, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rp6.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay prefill sum T1-T6 against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rp6.ratio.mlx-vlm | 0.32 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay prefill sum T1-T6, Strim median divided by mlx-vlm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rp6.verdict.mlx-vlm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay prefill sum T1-T6 against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rp6.ratio.mlx-lm | 0.88 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay prefill sum T1-T6, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rp6.verdict.mlx-lm | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay prefill sum T1-T6 against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rp6.ratio.omlx | 0.77 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay prefill sum T1-T6, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rp6.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay prefill sum T1-T6 against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rpc8.strim | 87.25 | % | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay T8 cached fraction, strim. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | Strim build ee9f9d8 (serve defaults: MTP head, admission, batched decode, prefix cache); later commits were not benchmarked. |
final.rpc8.rapid-mlx | 87.23 | % | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay T8 cached fraction, rapid-mlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | rapid-mlx 0.15.7, flags: --no-telemetry serve models/qwen38-4bit --port 8651 --max-num-seqs 4 --speculative-config {mtp,qwen38-mtp-4bit}; MTP: yes (--speculative-config mtp, qwen38-mtp-4bit); prefix cache: yes, default on; rival tuning was not explored. |
final.rpc8.mlx-vlm | 0 | % | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay T8 cached fraction, mlx-vlm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-vlm 0.7.10, flags: --model models/qwen38-4bit --port 8651 (server defaults); MTP: no; prefix cache: no cross-request reuse (0% cached in replay); rival tuning was not explored. |
final.rpc8.mlx-lm | 87.26 | % | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay T8 cached fraction, mlx-lm. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | mlx-lm 0.32.2, flags: --model models/qwen38-4bit --port 8654 --decode-concurrency 4 --prompt-concurrency 4; MTP: no (no speculative decoding); prefix cache: yes, default in-memory LRU prompt cache; rival tuning was not explored. |
final.rpc8.omlx | 85.25 | % | bench/results/h2h-final3-20261028/summary.md | Head-to-head 2026-10-28 (h2h-final3-20261028): agent replay T8 cached fraction, omlx. Median of 2 passes (1 rep each); HTTP, one engine at a time, Qwen3.8-27B 4-bit, thinking off, greedy. | oMLX 0.4.5.dev1, flags: serve --model-dir <scratch>/models (symlink to models/qwen38-4bit) --port 8653, HOME=<scratch>/home, defaults otherwise (memory-guard balanced, max-concurrent-requests 8); MTP: no (MTP needs oMLX's own checkpoint; stock weights have no MTP head); prefix cache: yes, default paged SSD prefix cache under the scratch HOME (fresh per session, so no cross-session hits); rival tuning was not explored. |
final.rpc8.ratio.rapid-mlx | 1.00 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay T8 cached fraction, Strim median divided by rapid-mlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rpc8.verdict.rapid-mlx | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay T8 cached fraction against rapid-mlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rpc8.verdict.mlx-vlm | n/a | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay T8 cached fraction against mlx-vlm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rpc8.ratio.mlx-lm | 1.00 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay T8 cached fraction, Strim median divided by mlx-lm median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rpc8.verdict.mlx-lm | TIE | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay T8 cached fraction against mlx-lm. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.rpc8.ratio.omlx | 1.02 | x | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: agent replay T8 cached fraction, Strim median divided by omlx median (displayed in summary.md). | Ratio of two medians of two passes; the TIE band is 2%. |
final.rpc8.verdict.omlx | WIN | bench/results/h2h-final3-20261028/summary.md | Final head-to-head: verdict for agent replay T8 cached fraction against omlx. Higher-is-better cells win with ratio above 1, lower-is-better cells (TTFT, time) with ratio below 1; TIE is within 2%. NC = not claimable (claim_eligible is not true for Strim or the rival). | Verdicts at the edge of the 2% band can flip with one pass (summary.md lists six such cells). | |
final.mem.strim | 30.8 | GB | bench/results/h2h-final3-20261028/summary.md | Peak physical footprint of the engine process tree over the whole run (max over passes and sessions), strim: 30763 / 8711 MB footprint / RSS in summary.md, shown here in GB. | phys_footprint includes Metal buffers. Whole-run maximum, not steady state; abort limit was 42 GB. |
final.mem.rapid-mlx | 35.9 | GB | bench/results/h2h-final3-20261028/summary.md | Peak physical footprint of the engine process tree over the whole run (max over passes and sessions), rapid-mlx: 35892 / 15640 MB footprint / RSS in summary.md, shown here in GB. | phys_footprint includes Metal buffers. Whole-run maximum, not steady state; abort limit was 42 GB. |
final.mem.mlx-vlm | 36.3 | GB | bench/results/h2h-final3-20261028/summary.md | Peak physical footprint of the engine process tree over the whole run (max over passes and sessions), mlx-vlm: 36313 / 16287 MB footprint / RSS in summary.md, shown here in GB. | phys_footprint includes Metal buffers. Whole-run maximum, not steady state; abort limit was 42 GB. |
final.mem.mlx-lm | 37.5 | GB | bench/results/h2h-final3-20261028/summary.md | Peak physical footprint of the engine process tree over the whole run (max over passes and sessions), mlx-lm: 37450 / 15319 MB footprint / RSS in summary.md, shown here in GB. | phys_footprint includes Metal buffers. Whole-run maximum, not steady state; abort limit was 42 GB. |
final.mem.omlx | 55.2 | GB | bench/results/h2h-final3-20261028/summary.md | Peak physical footprint of the engine process tree over the whole run (max over passes and sessions), omlx: 55210 / 18988 MB footprint / RSS in summary.md, shown here in GB. | phys_footprint includes Metal buffers. Whole-run maximum, not steady state; abort limit was 42 GB. |
final.agree.self | 8/8 | prompts identical | bench/results/h2h-final3-20261028/summary.md | Strim pass 1 against Strim pass 2, 8 fixed prompts, 64 greedy tokens. | Sanity check only: near-ties diverge, one divergence flips every later token. |
final.agree.rapid-mlx | 7/8 | prompts identical | bench/results/h2h-final3-20261028/summary.md | Strim against rapid-mlx, 8 fixed prompts, 64 greedy tokens. | Sanity check only: near-ties diverge, one divergence flips every later token. |
final.agree.mlx-vlm | 6/8 | prompts identical | bench/results/h2h-final3-20261028/summary.md | Strim against mlx-vlm, 8 fixed prompts, 64 greedy tokens. | Sanity check only: near-ties diverge, one divergence flips every later token. |
final.agree.mlx-lm | 6/8 | prompts identical | bench/results/h2h-final3-20261028/summary.md | Strim against mlx-lm, 8 fixed prompts, 64 greedy tokens. | Sanity check only: near-ties diverge, one divergence flips every later token. |
final.agree.omlx | 7/8 | prompts identical | bench/results/h2h-final3-20261028/summary.md | Strim against omlx, 8 fixed prompts, 64 greedy tokens. | Sanity check only: near-ties diverge, one divergence flips every later token. |
final.claim.decode_vs.rapid-mlx | 24-50% | bench/results/h2h-final3-20261028/summary.md | Decode speed over rapid-mlx at 4K, 16K and 32K context: range of strim/rapid-mlx - 1, as a percentage, over the three decode cells (claimable cells only). | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.decode_vs.mlx-vlm | 1.8-2.3x | bench/results/h2h-final3-20261028/summary.md | Decode speed over mlx-vlm at 4K, 16K and 32K context: range of strim/mlx-vlm over the three decode cells (claimable cells only). | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.decode_vs.mlx-lm | 1.9-2.5x | bench/results/h2h-final3-20261028/summary.md | Decode speed over mlx-lm at 4K, 16K and 32K context: range of strim/mlx-lm over the three decode cells (claimable cells only). | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.decode_vs.omlx | 1.7-2.2x | bench/results/h2h-final3-20261028/summary.md | Decode speed over oMLX at 4K, 16K and 32K context: range of strim/omlx over the three decode cells (claimable cells only). | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.w5_speedup | 2.8-2.9x | bench/results/h2h-final3-20261028/summary.md | Aggregate throughput of 4 clients sharing a 16K prefix: range of strim/rival over all rivals. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.ttft_p50_lower | 29-56% | bench/results/h2h-final3-20261028/summary.md | Median first-token latency at 4 and 8 concurrent requests (512-token, agent and 4K prompts): range of 1 - strim/rival over six cells and all rivals. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.agg_lower | 2-4% | bench/results/h2h-final3-20261028/summary.md | Aggregate throughput gap to the best rival at c=4 and c=8 over the six concurrency cells, counting only cells where Strim is more than 2% behind. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.agg_lower_n | 3 | cells | bench/results/h2h-final3-20261028/summary.md | Number of the six aggregate-throughput cells where Strim is more than 2% behind the best rival. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. |
final.claim.p95_worse | 6% | bench/results/h2h-final3-20261028/summary.md | p95 first-token gap to the best rival over the six c=4/c=8 cells, counting only cells where Strim is more than 2% slower. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.p95_worse_n | 1 | cells | bench/results/h2h-final3-20261028/summary.md | Number of the six p95 cells where Strim is more than 2% slower than the best rival. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. |
final.claim.prefill_gap | 2-4% | bench/results/h2h-final3-20261028/summary.md | Cold prefill (tok/s) gap to the best rival over 4K, 16K and 32K, counting only sizes where Strim is more than 2% behind. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.prefill_loss | 4K, 16K and 32K | bench/results/h2h-final3-20261028/summary.md | Cold prompt sizes where Strim prefill is more than 2% behind the best rival. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.prefill_tie | none | bench/results/h2h-final3-20261028/summary.md | Cold prompt sizes where Strim prefill is within 2% of, or ahead of, the best rival. | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. | |
final.claim.passes | 2 | passes | bench/results/h2h-final3-20261028/summary.md | Passes per engine (pass 1 in the order of the engines list, pass 2 reversed). | Recomputed from the displayed ratios by strim site build; there is no hand-typed claim wording. |
final.claim.build | ee9f9d8 | bench/results/h2h-final3-20261028/summary.md | Strim commit that was benchmarked (from the summary title). | Commits after this one were not benchmarked. | |
final.val.sessions | 30 | sessions | bench/results/h2h-final3-20261028/summary.md | Engine sessions (engine x pass x cell group) listed in the per-session load table. | |
final.val.polluted | 2 | sessions | bench/results/h2h-final3-20261028/summary.md | Sessions the summary marks POLLUTED (foreign CPU load above the protocol limit of 3). | A polluted session is not a clean measurement; rerun before treating the numbers as final. |
final.val.clean | 28 | sessions | bench/results/h2h-final3-20261028/summary.md | Primary engine sessions marked CLEAN; later retries are retained separately. | Claims additionally require claim_eligible for both engines in each cell. |
final.val.load_max | 4.7 | bench/results/h2h-final3-20261028/summary.md | Highest 1-minute load average recorded at a cell start, over all sessions (per-session table). | Includes the engine's own load; the protocol limit for a clean session is 3 from non-engine work. | |
final.claim.swap | 0 | MB | bench/results/h2h-final3-20261028/summary.md | Largest swap growth in any benchmark session. | Baseline swap was pre-existing. |
ver.h2h.rapid-mlx | rapid-mlx 0.15.7 | bench/results/h2h-final3-20261028/summary.md | Measured version of rapid-mlx in the head-to-head run (engine_meta.version in results.json, listed in the summary). | ||
ver.h2h.mlx-vlm | mlx-vlm 0.7.10 | bench/results/h2h-final3-20261028/summary.md | Measured version of mlx-vlm in the head-to-head run (engine_meta.version in results.json, listed in the summary). | ||
ver.h2h.mlx-lm | mlx-lm 0.32.2 | bench/results/h2h-final3-20261028/summary.md | Measured version of mlx-lm in the head-to-head run (engine_meta.version in results.json, listed in the summary). | ||
ver.h2h.omlx | oMLX 0.4.5.dev1 | bench/results/h2h-final3-20261028/summary.md | Measured version of omlx in the head-to-head run (engine_meta.version in results.json, listed in the summary). |