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.

Scoreboard: Strim against each rival, verdict counts per regime
Regimevs 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 LOSS3 WIN · 0 TIE · 0 LOSS3 WIN · 0 TIE · 0 LOSS3 WIN · 0 TIE · 0 LOSS
Cold prefilltok/s on a cold 4K, 16K, 32K prompt (3 cells)0 WIN · 2 TIE · 1 LOSS0 WIN · 0 TIE · 3 LOSS3 WIN · 0 TIE · 0 LOSS3 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 LOSS4 WIN · 0 TIE · 0 LOSS4 WIN · 0 TIE · 0 LOSS1 WIN · 0 TIE · 0 LOSS
Concurrencyaggregate tok/s at c=4 and c=8, three prompt sizes (6 cells)3 WIN · 2 TIE · 1 LOSS2 WIN · 2 TIE · 2 LOSS4 WIN · 2 TIE · 0 LOSS2 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 LOSS7 WIN · 4 TIE · 1 LOSS12 WIN · 0 TIE · 0 LOSS4 WIN · 0 TIE · 0 LOSS · 4 not claimable
Memorypeak footprint over the whole run (1 cell)1 WIN · 0 TIE · 0 LOSS1 WIN · 0 TIE · 0 LOSS1 WIN · 0 TIE · 0 LOSS1 WIN · 0 TIE · 0 LOSS
All counted cells22 WIN · 5 TIE · 2 LOSS17 WIN · 6 TIE · 6 LOSS27 WIN · 2 TIE · 0 LOSS14 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.

Speed-up of Strim over each rival, per measurementRight of 1× Strim is faster, left it is slower. Higher is always better: for seconds the ratio is inverted.
Strim vs rapid-mlx vs mlx-vlm vs mlx-lm vs oMLX: speed-up per measurementDot chart on a log scale. Each row is one measurement; the circle is Strim relative to rapid-mlx, the diamond is Strim relative to mlx-vlm, the square is Strim relative to mlx-lm, the triangle is Strim relative to oMLX, 1x meaning equal and right meaning Strim is faster. The badge reads WIN, TIE or LOSS against the best rival, or not claimable. Summary: vs rapid-mlx: 22 wins, 5 ties, 2 losses; vs mlx-vlm: 17 wins, 6 ties, 6 losses; vs mlx-lm: 27 wins, 2 ties, 0 losses; vs omlx: 14 wins, 0 ties, 0 losses.Strim (the 1× line)rapid-mlx (MTP)mlx-vlm (no MTP)mlx-lm (no MTP)oMLX (no MTP)vs the best rival0.75×1×2×4×← Strim slowerStrim faster →Log scale. 1× = equal; the shaded strip is the 2% tie band. Seconds are inverted so that right is always better.Decodedecode @ 4KWIN 1.50×rapid-mlxdecode 256 tok @ 4K ctx: vs rapid-mlx 1.50× WIN; vs mlx-vlm 2.31× WIN; vs mlx-lm 2.50× WIN; vs omlx 2.25× WIN;decode @ 16KWIN 1.43×rapid-mlxdecode 256 tok @ 16K ctx: vs rapid-mlx 1.43× WIN; vs mlx-vlm 2.11× WIN; vs mlx-lm 2.27× WIN; vs omlx 2.07× WIN;decode @ 32KWIN 1.24×rapid-mlxdecode 128 tok @ 32K ctx: vs rapid-mlx 1.24× WIN; vs mlx-vlm 1.78× WIN; vs mlx-lm 1.89× WIN; vs omlx 1.75× WIN;Cold prefillcold prefill 4KLOSS 0.98×mlx-vlmcold 4K prefill: vs rapid-mlx 1.00× TIE; vs mlx-vlm 0.98× LOSS; vs mlx-lm 1.05× WIN; vs omlx 1.11× WIN;cold prefill 16KLOSS 0.97×mlx-vlmcold 16K prefill: vs rapid-mlx 0.99× TIE; vs mlx-vlm 0.97× LOSS; vs mlx-lm 1.05× WIN; vs omlx 1.08× WIN;cold prefill 32KLOSS 0.96×mlx-vlmcold 32K prefill: vs rapid-mlx 0.97× LOSS; vs mlx-vlm 0.96× LOSS; vs mlx-lm 1.04× WIN; vs omlx 1.07× WIN;Shared prefix4 agents, 16K prefix: tok/sWIN 2.81×mlx-vlmW5 4 clients, 16K shared prefix aggregate: vs rapid-mlx 2.92× WIN; vs mlx-vlm 2.81× WIN; vs mlx-lm 2.92× WIN; vs omlx n/a;4 agents: p50 TTFTWIN 3.47×mlx-vlmW5 p50 TTFT: vs rapid-mlx 3.62× WIN; vs mlx-vlm 3.47× WIN; vs mlx-lm 3.62× WIN; vs omlx n/a;4 agents: p95 TTFTWIN 3.09×mlx-vlmW5 p95 TTFT: vs rapid-mlx 3.22× WIN; vs mlx-vlm 3.09× WIN; vs mlx-lm 3.21× WIN; vs omlx n/a;8-turn replay prefillTIE 1.00×rapid-mlxagent replay prefill sum T1-T8: vs rapid-mlx 1.00× TIE; vs mlx-vlm 3.93× WIN; vs mlx-lm 1.12× WIN; vs omlx 1.32× WIN;Concurrencyc=4 512-tok: tok/sLOSS 0.97×rapid-mlxc=4 512-tok prompts aggregate: vs rapid-mlx 0.97× LOSS; vs mlx-vlm 1.03× WIN; vs mlx-lm 1.04× WIN; vs omlx 1.27× WIN;c=8 512-tok: tok/sWIN 1.02×mlx-vlmc=8 512-tok prompts aggregate: vs rapid-mlx 1.06× WIN; vs mlx-vlm 1.02× WIN; vs mlx-lm 1.12× WIN; vs omlx 1.30× WIN;c=4 agent: tok/sTIE 1.01×mlx-vlmc=4 agent prompts (~2.8K tok) aggregate: vs rapid-mlx 1.04× WIN; vs mlx-vlm 1.01× TIE; vs mlx-lm 1.05× WIN; vs omlx not claimable;c=8 agent: tok/sTIE 1.00×mlx-vlmc=8 agent prompts aggregate: vs rapid-mlx 1.10× WIN; vs mlx-vlm 1.00× TIE; vs mlx-lm 1.13× WIN; vs omlx not claimable;c=4 4K: tok/sLOSS 0.98×mlx-vlmc=4 4K prompts aggregate (prefill-bound): vs rapid-mlx 1.01× TIE; vs mlx-vlm 0.98× LOSS; vs mlx-lm 1.01× TIE; vs omlx n/a;c=8 4K: tok/sLOSS 0.96×mlx-vlmc=8 4K prompts aggregate (prefill-bound): vs rapid-mlx 1.01× TIE; vs mlx-vlm 0.96× LOSS; vs mlx-lm 1.02× TIE; vs omlx n/a;Latencyc=4 512-tok: p50 TTFTWIN 1.54×mlx-vlmc=4 512-tok prompts p50 TTFT: vs rapid-mlx 1.57× WIN; vs mlx-vlm 1.54× WIN; vs mlx-lm 1.65× WIN; vs omlx 2.04× WIN;c=4 512-tok: p95 TTFTTIE 1.01×mlx-vlmc=4 512-tok prompts p95 TTFT: vs rapid-mlx 1.02× WIN; vs mlx-vlm 1.01× TIE; vs mlx-lm 1.08× WIN; vs omlx 1.40× WIN;c=8 512-tok: p50 TTFTWIN 1.62×mlx-vlmc=8 512-tok prompts p50 TTFT: vs rapid-mlx 2.19× WIN; vs mlx-vlm 1.62× WIN; vs mlx-lm 2.26× WIN; vs omlx 2.13× WIN;c=8 512-tok: p95 TTFTLOSS 0.94×mlx-vlmc=8 512-tok prompts p95 TTFT: vs rapid-mlx 2.05× WIN; vs mlx-vlm 0.94× LOSS; vs mlx-lm 2.13× WIN; vs omlx 1.37× WIN;

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.

Peak memory footprint by workload (GB)Engine process tree, includes Metal buffers; maximum over passes and sessions. Nobody swapped.
Peak memory footprint, Strim vs rapid-mlx vs mlx-vlm vs mlx-lm vs oMLXGrouped bars, GB. Whole run peak: Strim 30.8, rapid-mlx 35.9, mlx-vlm 36.3, mlx-lm 37.5, oMLX 55.2. Strim has the lowest peak in 2 of 9 workload cells.Strimrapid-mlx (MTP)mlx-vlm (no MTP)mlx-lm (no MTP)oMLX (no MTP)0102030405060Peak 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 GBPeak over the whole run30.835.936.337.555.2warmup: strim 18.4 GB, rapid-mlx 20.1 GB, mlx-vlm 19.3 GB, mlx-lm 17.6 GB, omlx 18.8 GBwarmup18.420.119.317.618.8greedy agreement: strim 17.5 GB, rapid-mlx 17.4 GB, mlx-vlm 16.9 GB, mlx-lm 17.8 GB, omlx 19.7 GBgreedy agreement17.517.416.917.819.7cold 4K and 16K: strim 23.3 GB, rapid-mlx 22.1 GB, mlx-vlm 20.5 GB, mlx-lm 21.7 GB, omlx 24.7 GBcold 4K and 16K23.322.120.521.724.7cold 32K: strim 28.7 GB, rapid-mlx 24.8 GB, mlx-vlm 23.5 GB, mlx-lm 27 GB, omlx 29 GBcold 32K28.724.823.527.029.0c=4/8, 4K prompts: strim 30 GB, rapid-mlx 31.3 GB, mlx-vlm 36.3 GB, mlx-lm 34.4 GB, omlx 49.5 GBc=4/8, 4K prompts30.031.336.334.449.5c=4/8, 512-token prompts: strim 26 GB, rapid-mlx 20.4 GB, mlx-vlm 24.4 GB, mlx-lm 23.9 GB, omlx 28.1 GBc=4/8, 512-token prompts26.020.424.423.928.1c=4/8, agent prompts: strim 29.5 GB, rapid-mlx 26.6 GB, mlx-vlm 33.8 GB, mlx-lm 31.5 GB, omlx 43.7 GBc=4/8, agent prompts29.526.633.831.543.74 agents, 16K shared prefix: strim 30.8 GB, rapid-mlx 33.5 GB, mlx-vlm 30.2 GB, mlx-lm 31.4 GB, omlx 40.5 GB4 agents, 16K shared prefix30.833.530.231.440.58-turn replay: strim 27.5 GB, rapid-mlx 35.9 GB, mlx-vlm 28.6 GB, mlx-lm 37.5 GB, omlx 36.9 GB8-turn replay27.535.928.637.536.9Peak physical footprint of the engine process tree, GB (includes Metal buffers). Bars start at zero.

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.

First-token latency (TTFT) at c=4 and c=8, secondsMedian (p50) and 95th percentile (p95). Lower is better; bars start at zero, each prompt class has its own scale.
First-token latency (TTFT) at 4 and 8 concurrent requestsGrouped bars in seconds for Strim, rapid-mlx, mlx-vlm, mlx-lm, oMLX, median (p50) and 95th percentile (p95), for 512-token, agent-style and 4K prompts. Each row carries a WIN, TIE, LOSS or not-claimable badge for Strim against the best rival.Strimrapid-mlx (MTP)mlx-vlm (no MTP)mlx-lm (no MTP)oMLX (no MTP)512-token prompts0 to 10 s, lower is bettervs the best rivalc=4 512-tok prompts p50 TTFT: strim 1.49 s, rapid-mlx 2.34 s, mlx-vlm 2.31 s, mlx-lm 2.47 s, omlx 3.05 sc=4 p501.492.342.312.473.05WIN 1.54×mlx-vlmc=4 512-tok prompts p95 TTFT: strim 2.29 s, rapid-mlx 2.34 s, mlx-vlm 2.31 s, mlx-lm 2.47 s, omlx 3.20 sc=4 p952.292.342.312.473.20TIE 1.01×mlx-vlmc=8 512-tok prompts p50 TTFT: strim 2.68 s, rapid-mlx 5.89 s, mlx-vlm 4.34 s, mlx-lm 6.06 s, omlx 5.73 sc=8 p502.685.894.346.065.73WIN 1.62×mlx-vlmc=8 512-tok prompts p95 TTFT: strim 4.61 s, rapid-mlx 9.47 s, mlx-vlm 4.34 s, mlx-lm 9.84 s, omlx 6.30 sc=8 p954.619.474.349.846.30LOSS 0.94×mlx-vlmAgent prompts, about 2.8K tokens0 to 40 s, lower is bettervs the best rivalc=4 agent prompts p50 TTFT: strim 7.68 s, rapid-mlx 13.44 s, mlx-vlm 12.43 s, mlx-lm 13.47 s, omlx 13.32 sc=4 p507.6813.4412.4313.4713.32WIN 1.62×mlx-vlmc=4 agent prompts p95 TTFT: strim 12.07 s, rapid-mlx 13.44 s, mlx-vlm 12.43 s, mlx-lm 13.47 s, omlx 13.47 sc=4 p9512.0713.4412.4313.4713.47WIN 1.03×mlx-vlmc=8 agent prompts p50 TTFT: strim 13.34 s, rapid-mlx 22.10 s, mlx-vlm 23.10 s, mlx-lm 22.61 s, omlx 25.08 sc=8 p5013.3422.1023.1022.6125.08WIN 1.66×rapid-mlxc=8 agent prompts p95 TTFT: strim 22.67 s, rapid-mlx 30.98 s, mlx-vlm 23.10 s, mlx-lm 31.68 s, omlx 25.69 sc=8 p9522.6730.9823.1031.6825.69TIE 1.02×mlx-vlm4K prompts0 to 40 s, lower is bettervs the best rivalc=4 4K prompts p50 TTFT: strim 10.36 s, rapid-mlx 16.86 s, mlx-vlm 16.17 s, mlx-lm 16.84 s, omlx n/ac=4 p5010.3616.8616.1716.84n/aWIN 1.56×mlx-vlmc=4 4K prompts p95 TTFT: strim 16.00 s, rapid-mlx 16.86 s, mlx-vlm 16.17 s, mlx-lm 16.85 s, omlx n/ac=4 p9516.0016.8616.1716.85n/aTIE 1.01×mlx-vlmc=8 4K prompts p50 TTFT: strim 18.75 s, rapid-mlx 26.56 s, mlx-vlm 32.07 s, mlx-lm 26.83 s, omlx n/ac=8 p5018.7526.5632.0726.83n/aWIN 1.42×rapid-mlxc=8 4K prompts p95 TTFT: strim 32.00 s, rapid-mlx 36.24 s, mlx-vlm 32.07 s, mlx-lm 36.57 s, omlx n/ac=8 p9532.0036.2432.0736.57n/aTIE 1.00×mlx-vlmBadge: Strim vs the best rival (WIN = faster by more than 2%). p95 with 4 or 8 requests is the slowest request.

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.

Functionality matrix (verified 2026-10-28)
FeatureStrimrapid-mlx 0.15.7mlx-vlm 0.7.10
Single binary, no Python runtimeRuntimeYesSwift, one process, one binaryNoPython package (fastapi/uvicorn)NoPython package (uvicorn server)
Install footprintRuntime34 MB binary + weights159 MB keg + Python deps256 MB venv
Runs many modelsModelsNoOne model only (Qwen3.8-27B 4-bit)YesMany models, vision, audio, embeddingsYesMany models, vision, audio, embeddings
MTP speculative decodingDecodingYesDefault, adaptive depth 2-4Yes--speculative-config mtp (used in h2h)Partial--draft-kind mtp exists; off in h2h
Continuous batchingDecodingYesBatched decode, join/leaveYes--max-num-seqsYes--max-num-seqs
Chunked prefillDecodingYes1,024-token chunks interleaved with decodeYes--prefill-step-sizeYes--prefill-step-size
Structured output (json_schema)DecodingYesjson_object, json_schema, tool_choice (constrained decoding)Yesllguidance, json_schema (not exercised by us)Yesresponse_format (not exercised by us)
Reasoning / thinking separationDecodingPartialTemplate renders thinking; separate output not verifiedYes--reasoning-parserYesreasoning_content, --thinking-budget
Tool callingDecodingYesStreaming Qwen parser; tool_choice=required enforcedYesMany tool parsersYesParser inferred from processor
Cross-request prefix cacheCacheYesExact trie: a hit equals a miss bitwiseYesRadix or hash index; exactness UnknownPartialIn code; cached=0 with h2h server defaults
Disk-persisted prefix cacheCacheYesOpt-in (STRIM_PREFIX_DISK=1), per-model directoryYesSaved on shutdownYesSSD tier
Priority and memory-based admissionServingYesInteractive vs background classes, memory budgetPartialfcfs or shortest_validated_tail; no priority classesNot foundNo evidence found
Memory budget / swap protectionServingPartialAdmission by memory budget; no OS swap guardYes--gpu-memory-utilization and more knobsPartial--max-kv-size, --expert-cache-gb
Server authServingYesBearer token on by default, separate control tokenPartialOpt-in --api-keyPartialOpt-in --api-key; default host 0.0.0.0
OpenAI Chat CompletionsAPIYesYesYes
OpenAI ResponsesAPIYesWith response storeYesYes
Anthropic MessagesAPIYesWith count_tokensYesYesWith count_tokens
Streaming (SSE)APIYesYesYes
Sandboxed local-model job harnessAgentsYesWorktree jobs, harness-run verify, SHA-256 patch approvalPartialConfigures external agents; no local job runner foundNot foundNo evidence found
MCPAgentsYesMCP server at /mcp, 4 toolsPartialMCP client side; acting as server UnknownNot foundNo evidence found
Menu-bar appProductPartialSwiftUI shell, buildsPartialDesktop app; menu-bar form UnknownNoNo
LicenseProductMITApache-2.0MIT

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.
Decode speed of 7 engines on Qwen3.8-27BDecode speed in tokens per second at 4K context on Qwen3.8-27B, Apple M5 Max (head-to-head of 2026-10-28): Strim 75.3, rapid-mlx 50.1, oMLX 33.5, mlx-vlm 32.7, mlx-lm 30.1, llama.cpp 27.4 (earlier run), Ollama 24.0 (earlier run). Dashed hollow beads are llama.cpp and Ollama from the 2026-10-26 run.0183654729075.3Strim24.0 Ollama27.4 llama.cpp30.1 mlx-lm32.7 mlx-vlm33.5 oMLX50.1 rapid-mlxDecode speed of 7 engines on Qwen3.8-27BDecode speed in tokens per second at 4K context on Qwen3.8-27B, Apple M5 Max (head-to-head of 2026-10-28): Strim 75.3, rapid-mlx 50.1, oMLX 33.5, mlx-vlm 32.7, mlx-lm 30.1, llama.cpp 27.4 (earlier run), Ollama 24.0 (earlier run). Dashed hollow beads are llama.cpp and Ollama from the 2026-10-26 run.Strim75.3rapid-mlx50.1oMLX33.5mlx-vlm32.7mlx-lm30.1llama.cpp27.4Ollama24.0
Decode speed in tokens per second at 4K context, Qwen3.8-27B 4-bit, Apple M5 Max 64 GB, one engine at a time. Head-to-head of 2026-10-28, Strim build ee9f9d8, 2 passes.

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.

Strim against each rival, median of 2 passes (bold = best of the 5)
MeasurementStrimrapid-mlxmlx-vlmmlx-lmoMLXvs rapid-mlxvs mlx-vlmvs mlx-lmvs oMLX
decode @ 4Ktok/s75.3450.1232.6930.1133.53WINWINWINWIN
decode @ 32Ktok/s52.1742.1729.3527.6229.9WINWINWINWIN
4 agents, 16K prefix: tok/stok/s9.7733.3443.4733.346n/aWINWINWINn/a
c=8 agent: p50 TTFTs, lower is better13.3422.123.122.6125.08WINWINWINNC
cold 32K TTFTs, lower is better37.0636.0235.5138.5339.79LOSSLOSSWINWIN
c=8 agent: tok/stok/s31.1928.4731.1827.6326.89WINTIEWINNC
8-turn agent replay, summed prefills, lower is better48.9349.13192.555.0264.84TIEWINWINWIN
Peak memory, whole runGB, lower is better30.835.936.337.555.2WINWINWINWIN

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.

Decode speed, tok/s (higher is better)Greedy, after a cold prompt of each size: 256 tokens at 4K and 16K, 128 tokens at 32K.
  • 4K context
    • Strim75.34Strim: 75.34 tok/s
    • rapid-mlx (MTP)50.12rapid-mlx (MTP): 50.12 tok/s
    • mlx-vlm (no MTP)32.69mlx-vlm (no MTP): 32.69 tok/s
    • mlx-lm (no MTP)30.11mlx-lm (no MTP): 30.11 tok/s
    • oMLX (no MTP)33.53oMLX (no MTP): 33.53 tok/s
  • 16K context
    • Strim65.18Strim: 65.18 tok/s
    • rapid-mlx (MTP)45.75rapid-mlx (MTP): 45.75 tok/s
    • mlx-vlm (no MTP)30.93mlx-vlm (no MTP): 30.93 tok/s
    • mlx-lm (no MTP)28.68mlx-lm (no MTP): 28.68 tok/s
    • oMLX (no MTP)31.42oMLX (no MTP): 31.42 tok/s
  • 32K context
    • Strim52.17Strim: 52.17 tok/s
    • rapid-mlx (MTP)42.17rapid-mlx (MTP): 42.17 tok/s
    • mlx-vlm (no MTP)29.35mlx-vlm (no MTP): 29.35 tok/s
    • mlx-lm (no MTP)27.62mlx-lm (no MTP): 27.62 tok/s
    • oMLX (no MTP)29.9oMLX (no MTP): 29.9 tok/s

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 prompt time to first token, s (lower is better)One distinct prompt at a time, no cache hit possible.
  • 4K prompt
    • Strim4.13Strim: 4.13 s
    • rapid-mlx (MTP)4.12rapid-mlx (MTP): 4.12 s
    • mlx-vlm (no MTP)4.039mlx-vlm (no MTP): 4.039 s
    • mlx-lm (no MTP)4.327mlx-lm (no MTP): 4.327 s
    • oMLX (no MTP)4.58oMLX (no MTP): 4.58 s
  • 16K prompt
    • Strim17.02Strim: 17.02 s
    • rapid-mlx (MTP)16.86rapid-mlx (MTP): 16.86 s
    • mlx-vlm (no MTP)16.59mlx-vlm (no MTP): 16.59 s
    • mlx-lm (no MTP)17.82mlx-lm (no MTP): 17.82 s
    • oMLX (no MTP)18.38oMLX (no MTP): 18.38 s
  • 32K prompt
    • Strim37.06Strim: 37.06 s
    • rapid-mlx (MTP)36.02rapid-mlx (MTP): 36.02 s
    • mlx-vlm (no MTP)35.51mlx-vlm (no MTP): 35.51 s
    • mlx-lm (no MTP)38.53mlx-lm (no MTP): 38.53 s
    • oMLX (no MTP)39.79oMLX (no MTP): 39.79 s

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.

Median first-token latency under concurrency, s (lower is better)c = number of simultaneous requests. 512-token, agent-style (about 2.8K tokens) and distinct 4K prompts.
  • c=4, 512-token prompts
    • Strim1.493Strim: 1.493 s
    • rapid-mlx (MTP)2.339rapid-mlx (MTP): 2.339 s
    • mlx-vlm (no MTP)2.305mlx-vlm (no MTP): 2.305 s
    • mlx-lm (no MTP)2.467mlx-lm (no MTP): 2.467 s
    • oMLX (no MTP)3.049oMLX (no MTP): 3.049 s
  • c=8, 512-token prompts
    • Strim2.683Strim: 2.683 s
    • rapid-mlx (MTP)5.889rapid-mlx (MTP): 5.889 s
    • mlx-vlm (no MTP)4.34mlx-vlm (no MTP): 4.34 s
    • mlx-lm (no MTP)6.064mlx-lm (no MTP): 6.064 s
    • oMLX (no MTP)5.726oMLX (no MTP): 5.726 s
  • c=4, agent prompts
    • Strim7.678Strim: 7.678 s
    • rapid-mlx (MTP)13.44rapid-mlx (MTP): 13.44 s
    • mlx-vlm (no MTP)12.43mlx-vlm (no MTP): 12.43 s
    • mlx-lm (no MTP)13.47mlx-lm (no MTP): 13.47 s
    • oMLX (no MTP)13.32oMLX (no MTP): 13.32 s
  • c=8, agent prompts
    • Strim13.34Strim: 13.34 s
    • rapid-mlx (MTP)22.1rapid-mlx (MTP): 22.1 s
    • mlx-vlm (no MTP)23.1mlx-vlm (no MTP): 23.1 s
    • mlx-lm (no MTP)22.61mlx-lm (no MTP): 22.61 s
    • oMLX (no MTP)25.08oMLX (no MTP): 25.08 s
  • c=4, 4K prompts
    • Strim10.36Strim: 10.36 s
    • rapid-mlx (MTP)16.86rapid-mlx (MTP): 16.86 s
    • mlx-vlm (no MTP)16.17mlx-vlm (no MTP): 16.17 s
    • mlx-lm (no MTP)16.84mlx-lm (no MTP): 16.84 s
    • oMLX (no MTP)n/aoMLX (no MTP): n/a
  • c=8, 4K prompts
    • Strim18.75Strim: 18.75 s
    • rapid-mlx (MTP)26.56rapid-mlx (MTP): 26.56 s
    • mlx-vlm (no MTP)32.07mlx-vlm (no MTP): 32.07 s
    • mlx-lm (no MTP)26.83mlx-lm (no MTP): 26.83 s
    • oMLX (no MTP)n/aoMLX (no MTP): n/a

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.

Aggregate decode throughput under concurrency, tok/s (higher is better)Total generated tokens per second across all simultaneous requests: the one fully comparable concurrency number.
  • c=4, 512-token prompts
    • Strim69.22Strim: 69.22 tok/s
    • rapid-mlx (MTP)71.69rapid-mlx (MTP): 71.69 tok/s
    • mlx-vlm (no MTP)67.29mlx-vlm (no MTP): 67.29 tok/s
    • mlx-lm (no MTP)66.31mlx-lm (no MTP): 66.31 tok/s
    • oMLX (no MTP)54.61oMLX (no MTP): 54.61 tok/s
  • c=8, 512-token prompts
    • Strim76.37Strim: 76.37 tok/s
    • rapid-mlx (MTP)71.76rapid-mlx (MTP): 71.76 tok/s
    • mlx-vlm (no MTP)74.65mlx-vlm (no MTP): 74.65 tok/s
    • mlx-lm (no MTP)67.9mlx-lm (no MTP): 67.9 tok/s
    • oMLX (no MTP)58.74oMLX (no MTP): 58.74 tok/s
  • c=4, agent prompts
    • Strim28.73Strim: 28.73 tok/s
    • rapid-mlx (MTP)27.73rapid-mlx (MTP): 27.73 tok/s
    • mlx-vlm (no MTP)28.57mlx-vlm (no MTP): 28.57 tok/s
    • mlx-lm (no MTP)27.22mlx-lm (no MTP): 27.22 tok/s
    • oMLX (no MTP)25.28oMLX (no MTP): 25.28 tok/s
  • c=8, agent prompts
    • Strim31.19Strim: 31.19 tok/s
    • rapid-mlx (MTP)28.47rapid-mlx (MTP): 28.47 tok/s
    • mlx-vlm (no MTP)31.18mlx-vlm (no MTP): 31.18 tok/s
    • mlx-lm (no MTP)27.63mlx-lm (no MTP): 27.63 tok/s
    • oMLX (no MTP)26.89oMLX (no MTP): 26.89 tok/s
  • c=4, 4K prompts
    • Strim13.24Strim: 13.24 tok/s
    • rapid-mlx (MTP)13.16rapid-mlx (MTP): 13.16 tok/s
    • mlx-vlm (no MTP)13.52mlx-vlm (no MTP): 13.52 tok/s
    • mlx-lm (no MTP)13.1mlx-lm (no MTP): 13.1 tok/s
    • oMLX (no MTP)n/aoMLX (no MTP): n/a
  • c=8, 4K prompts
    • Strim13.29Strim: 13.29 tok/s
    • rapid-mlx (MTP)13.2rapid-mlx (MTP): 13.2 tok/s
    • mlx-vlm (no MTP)13.84mlx-vlm (no MTP): 13.84 tok/s
    • mlx-lm (no MTP)13.04mlx-lm (no MTP): 13.04 tok/s
    • oMLX (no MTP)n/aoMLX (no MTP): n/a

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).

Tail first-token latency (p95), s (lower is better)With 4 or 8 requests per cell, p95 is the slowest request.
  • c=4, 512-token prompts
    • Strim2.292Strim: 2.292 s
    • rapid-mlx (MTP)2.339rapid-mlx (MTP): 2.339 s
    • mlx-vlm (no MTP)2.305mlx-vlm (no MTP): 2.305 s
    • mlx-lm (no MTP)2.469mlx-lm (no MTP): 2.469 s
    • oMLX (no MTP)3.198oMLX (no MTP): 3.198 s
  • c=8, 512-token prompts
    • Strim4.61Strim: 4.61 s
    • rapid-mlx (MTP)9.466rapid-mlx (MTP): 9.466 s
    • mlx-vlm (no MTP)4.341mlx-vlm (no MTP): 4.341 s
    • mlx-lm (no MTP)9.837mlx-lm (no MTP): 9.837 s
    • oMLX (no MTP)6.304oMLX (no MTP): 6.304 s
  • c=4, agent prompts
    • Strim12.07Strim: 12.07 s
    • rapid-mlx (MTP)13.44rapid-mlx (MTP): 13.44 s
    • mlx-vlm (no MTP)12.43mlx-vlm (no MTP): 12.43 s
    • mlx-lm (no MTP)13.47mlx-lm (no MTP): 13.47 s
    • oMLX (no MTP)13.47oMLX (no MTP): 13.47 s
  • c=8, agent prompts
    • Strim22.67Strim: 22.67 s
    • rapid-mlx (MTP)30.98rapid-mlx (MTP): 30.98 s
    • mlx-vlm (no MTP)23.1mlx-vlm (no MTP): 23.1 s
    • mlx-lm (no MTP)31.68mlx-lm (no MTP): 31.68 s
    • oMLX (no MTP)25.69oMLX (no MTP): 25.69 s
  • c=4, 4K prompts
    • Strim16Strim: 16 s
    • rapid-mlx (MTP)16.86rapid-mlx (MTP): 16.86 s
    • mlx-vlm (no MTP)16.17mlx-vlm (no MTP): 16.17 s
    • mlx-lm (no MTP)16.85mlx-lm (no MTP): 16.85 s
    • oMLX (no MTP)n/aoMLX (no MTP): n/a
  • c=8, 4K prompts
    • Strim32Strim: 32 s
    • rapid-mlx (MTP)36.24rapid-mlx (MTP): 36.24 s
    • mlx-vlm (no MTP)32.07mlx-vlm (no MTP): 32.07 s
    • mlx-lm (no MTP)36.57mlx-lm (no MTP): 36.57 s
    • oMLX (no MTP)n/aoMLX (no MTP): n/a

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.

Four agents sharing a 16K prefix: median first-token latency, s (lower is better)Four clients send the same 16K prefix with different suffixes at once.
    • Strim20.29Strim: 20.29 s
    • rapid-mlx (MTP)73.53rapid-mlx (MTP): 73.53 s
    • mlx-vlm (no MTP)70.48mlx-vlm (no MTP): 70.48 s
    • mlx-lm (no MTP)73.4mlx-lm (no MTP): 73.4 s
    • oMLX (no MTP)n/aoMLX (no MTP): n/a
Four agents sharing a 16K prefix: aggregate throughput, tok/s (higher is better)Neither rival shares the prefix across requests in this setup.
    • Strim9.773Strim: 9.773 tok/s
    • rapid-mlx (MTP)3.344rapid-mlx (MTP): 3.344 tok/s
    • mlx-vlm (no MTP)3.473mlx-vlm (no MTP): 3.473 tok/s
    • mlx-lm (no MTP)3.346mlx-lm (no MTP): 3.346 tok/s
    • oMLX (no MTP)n/aoMLX (no MTP): n/a

With a shared 16K prefix Strim is 2.8-2.9x faster than each rival in aggregate throughput.

Agent replay: summed prefill over 8 turns, s (lower is better)Synthetic session, prompts 4.1K to 40.8K tokens, each turn resends the history. Prefill sum is the sum of per-turn first-token latency.
  • Turns 1 to 8
    • Strim48.93Strim: 48.93 s
    • rapid-mlx (MTP)49.13rapid-mlx (MTP): 49.13 s
    • mlx-vlm (no MTP)192.5mlx-vlm (no MTP): 192.5 s
    • mlx-lm (no MTP)55.02mlx-lm (no MTP): 55.02 s
    • oMLX (no MTP)64.84oMLX (no MTP): 64.84 s
  • Turns 1 to 6
    • Strim34.6Strim: 34.6 s
    • rapid-mlx (MTP)34.77rapid-mlx (MTP): 34.77 s
    • mlx-vlm (no MTP)107.7mlx-vlm (no MTP): 107.7 s
    • mlx-lm (no MTP)39.31mlx-lm (no MTP): 39.31 s
    • oMLX (no MTP)44.9oMLX (no MTP): 44.9 s

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.

All 33 cells: median of 2 passes; ratio = Strim / rival; bold = best of the 5
CellUnitStrimrapid-mlx (MTP)mlx-vlm (no MTP)mlx-lm (no MTP)oMLX (no MTP)Strim / rapid-mlxStrim / mlx-vlmStrim / mlx-lmStrim / oMLXvs rapid-mlxvs mlx-vlmvs mlx-lmvs oMLX
cold 4K prefilltok/s994.5996.81017949.1896.71.00×0.98×1.05×1.11×TIELOSSWINWIN
cold 4K TTFTs4.134.124.0394.3274.581.00×1.02×0.95×0.90×TIELOSSWINWIN
decode 256 tok @ 4K ctxtok/s75.3450.1232.6930.1133.531.50×2.30×2.50×2.25×WINWINWINWIN
cold 16K prefilltok/s963.1972.4988919.8891.90.99×0.97×1.05×1.08×TIELOSSWINWIN
cold 16K TTFTs17.0216.8616.5917.8218.381.01×1.03×0.96×0.93×TIELOSSWINWIN
decode 256 tok @ 16K ctxtok/s65.1845.7530.9328.6831.421.42×2.11×2.27×2.07×WINWINWINWIN
cold 32K prefilltok/s884.6910923.2850.8823.70.97×0.96×1.04×1.07×LOSSLOSSWINWIN
cold 32K TTFTs37.0636.0235.5138.5339.791.03×1.04×0.96×0.93×LOSSLOSSWINWIN
decode 128 tok @ 32K ctxtok/s52.1742.1729.3527.6229.91.24×1.78×1.89×1.74×WINWINWINWIN
c=4 512-tok prompts aggregatetok/s69.2271.6967.2966.3154.610.97×1.03×1.04×1.27×LOSSWINWINWIN
c=4 512-tok prompts p50 TTFTs1.4932.3392.3052.4673.0490.64×0.65×0.61×0.49×WINWINWINWIN
c=4 512-tok prompts p95 TTFTs2.2922.3392.3052.4693.1980.98×0.99×0.93×0.72×WINTIEWINWIN
c=8 512-tok prompts aggregatetok/s76.3771.7674.6567.958.741.06×1.02×1.12×1.30×WINWINWINWIN
c=8 512-tok prompts p50 TTFTs2.6835.8894.346.0645.7260.46×0.62×0.44×0.47×WINWINWINWIN
c=8 512-tok prompts p95 TTFTs4.619.4664.3419.8376.3040.49×1.06×0.47×0.73×WINLOSSWINWIN
c=4 agent prompts (~2.8K tok) aggregatetok/s28.7327.7328.5727.2225.281.04×1.01×1.06×1.14×WINTIEWINNC
c=4 agent prompts p50 TTFTs7.67813.4412.4313.4713.320.57×0.62×0.57×0.58×WINWINWINNC
c=4 agent prompts p95 TTFTs12.0713.4412.4313.4713.470.90×0.97×0.90×0.90×WINWINWINNC
c=8 agent prompts aggregatetok/s31.1928.4731.1827.6326.891.10×1.00×1.13×1.16×WINTIEWINNC
c=8 agent prompts p50 TTFTs13.3422.123.122.6125.080.60×0.58×0.59×0.53×WINWINWINNC
c=8 agent prompts p95 TTFTs22.6730.9823.131.6825.690.73×0.98×0.72×0.88×WINTIEWINNC
c=4 4K prompts aggregate (prefill-bound)tok/s13.2413.1613.5213.1n/a1.01×0.98×1.01×n/aTIELOSSTIEn/a
c=4 4K prompts p50 TTFTs10.3616.8616.1716.84n/a0.61×0.64×0.62×n/aWINWINWINn/a
c=4 4K prompts p95 TTFTs1616.8616.1716.85n/a0.95×0.99×0.95×n/aWINTIEWINn/a
c=8 4K prompts aggregate (prefill-bound)tok/s13.2913.213.8413.04n/a1.01×0.96×1.02×n/aTIELOSSTIEn/a
c=8 4K prompts p50 TTFTs18.7526.5632.0726.83n/a0.71×0.58×0.70×n/aWINWINWINn/a
c=8 4K prompts p95 TTFTs3236.2432.0736.57n/a0.88×1.00×0.88×n/aWINTIEWINn/a
W5 4 clients, 16K shared prefix aggregatetok/s9.7733.3443.4733.346n/a2.92×2.81×2.92×n/aWINWINWINn/a
W5 p50 TTFTs20.2973.5370.4873.4n/a0.28×0.29×0.28×n/aWINWINWINn/a
W5 p95 TTFTs22.8373.5370.4873.4n/a0.31×0.32×0.31×n/aWINWINWINn/a
agent replay prefill sum T1-T8s48.9349.13192.555.0264.841.00×0.25×0.89×0.75×TIEWINWINWIN
agent replay prefill sum T1-T6s34.634.77107.739.3144.91.00×0.32×0.88×0.77×TIEWINWINWIN
agent replay T8 cached fraction%87.2587.23087.2685.251.00×n/a1.00×1.02×TIEn/aTIEWIN

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.

tok/sstok/stok/sstok/stok/sstok/stok/ssstok/ssstok/ssstok/ssstok/ssstok/ssstok/sssss%
Per-engine detail: median, spread, valid
CellUnitStrim medianrangevalidrapid-mlx (MTP) medianrangevalidmlx-vlm (no MTP) medianrangevalidmlx-lm (no MTP) medianrangevalidoMLX (no MTP) medianrangevalid
cold 4K prefill994.58.51yes996.86.40yes10172.28yes949.10.22yes896.70.99yes
cold 4K TTFT4.130.04yes4.120.03yes4.0390.01yes4.3270.00yes4.580.01yes
decode 256 tok @ 4K ctx75.341.40yes50.122.42yes32.690.06yes30.110.05yes33.530.02yes
cold 16K prefill963.114.1yes972.48.76yes9880.93yes919.80.02yes891.90.38yes
cold 16K TTFT17.020.25yes16.860.15yes16.590.02yes17.820.00yes18.380.01yes
decode 256 tok @ 16K ctx65.185.42yes45.750.60yes30.930.06yes28.680.13yes31.420.03yes
cold 32K prefill884.623.9yes9106.12yes923.20.49yes850.81.06yes823.72.32yes
cold 32K TTFT37.061.00yes36.020.24yes35.510.02yes38.530.05yes39.790.11yes
decode 128 tok @ 32K ctx52.176.12yes42.170.40yes29.350.19yes27.620.01yes29.90.06yes
c=4 512-tok prompts aggregate69.220.64yes71.690.13yes67.290.47yes66.310.21yes54.611.38yes
c=4 512-tok prompts p50 TTFT1.4930.01yes2.3390.01yes2.3050.01yes2.4670.00yes3.0490.25yes
c=4 512-tok prompts p95 TTFT2.2920.01yes2.3390.01yes2.3050.01yes2.4690.00yes3.1980.25yes
c=8 512-tok prompts aggregate76.370.62yes71.760.19yes74.650.45yes67.90.03yes58.740.20yes
c=8 512-tok prompts p50 TTFT2.6830.07yes5.8890.02yes4.340.04yes6.0640.02yes5.7260.05yes
c=8 512-tok prompts p95 TTFT4.610.09yes9.4660.03yes4.3410.04yes9.8370.03yes6.3040.08yes
c=4 agent prompts (~2.8K tok) aggregate28.730.02yes27.730.06yes28.570.16yes27.220.14yes25.280.00no
c=4 agent prompts p50 TTFT7.6780.04yes13.440.03yes12.430.07yes13.470.06yes13.320.00no
c=4 agent prompts p95 TTFT12.070.09yes13.440.03yes12.430.07yes13.470.06yes13.470.00no
c=8 agent prompts aggregate31.190.27yes28.470.74yes31.180.15yes27.630.07yes26.890.00no
c=8 agent prompts p50 TTFT13.340.04yes22.10.21yes23.10.06yes22.610.05yes25.080.00no
c=8 agent prompts p95 TTFT22.670.30yes30.980.95yes23.10.06yes31.680.08yes25.690.00no
c=4 4K prompts aggregate (prefill-bound)13.240.09yes13.160.13yes13.520.07yes13.10.03yesn/an/an/a
c=4 4K prompts p50 TTFT10.360.05yes16.860.07yes16.170.08yes16.840.04yesn/an/an/a
c=4 4K prompts p95 TTFT160.09yes16.860.07yes16.170.08yes16.850.04yesn/an/an/a
c=8 4K prompts aggregate (prefill-bound)13.290.17yes13.20.02yes13.840.11yes13.040.01yesn/an/an/a
c=8 4K prompts p50 TTFT18.750.21yes26.560.06yes32.070.26yes26.830.03yesn/an/an/a
c=8 4K prompts p95 TTFT320.39yes36.240.06yes32.070.26yes36.570.04yesn/an/an/a
W5 4 clients, 16K shared prefix aggregate9.7730.08yes3.3440.00yes3.4730.06yes3.3460.01yesn/an/an/a
W5 p50 TTFT20.290.15yes73.530.01yes70.481.19yes73.40.19yesn/an/an/a
W5 p95 TTFT22.830.15yes73.530.01yes70.481.19yes73.40.19yesn/an/an/a
agent replay prefill sum T1-T848.930.21yes49.130.17yes192.50.76yes55.022.27yes64.840.15yes
agent replay prefill sum T1-T634.60.16yes34.770.08yes107.70.82yes39.310.11yes44.90.00yes
agent replay T8 cached fraction87.250.00yes87.230.00yes00.00yes87.260.00yes85.250.00yes

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.

1agree, w3, w3_32kprimaryCLEAN2.531w4, w4s, w6primaryCLEAN3.631w5, replayprimaryCLEAN2.441agree, w3, w3_32kprimaryPOLLUTED2.941w4, w4s, w6primaryCLEAN4.681w5, replayprimaryCLEAN1.901agree, w3, w3_32kprimaryCLEAN2.891w4, w4s, w6primaryPOLLUTED1.841w5, replayprimaryCLEAN1.681agree, w3, w3_32kprimaryCLEAN2.051w4, w4s, w6primaryCLEAN1.101w5, replayprimaryCLEAN1.511agree, w3, w3_32kprimaryCLEAN2.761w4, w4s, w6primaryCLEAN2.781w5, replayprimaryCLEAN1.922agree, w3, w3_32kprimaryCLEAN1.742w4, w4s, w6primaryCLEAN2.392w5, replayprimaryCLEAN1.742agree, w3, w3_32kprimaryCLEAN1.482w4, w4s, w6primaryCLEAN1.502w5, replayprimaryCLEAN1.412agree, w3, w3_32kprimaryCLEAN1.852w4, w4s, w6primaryCLEAN3.692w5, replayprimaryCLEAN2.722agree, w3, w3_32kprimaryCLEAN1.692w4, w4s, w6primaryCLEAN1.862w5, replayprimaryCLEAN1.832agree, w3, w3_32kprimaryCLEAN1.882w4, w4s, w6primaryCLEAN1.522w5, replayprimaryCLEAN1.341agree, w3, w3_32krerunPOLLUTED1.501w4, w4s, w6rerunCLEAN1.921agree, w3, w3_32krerunCLEAN1.76
Session validity: 33 records including retained reruns
EnginePassCell groupsAttemptStatusLoad max
Strim
Strim
Strim
rapid-mlx
rapid-mlx
rapid-mlx
mlx-vlm
mlx-vlm
mlx-vlm
mlx-lm
mlx-lm
mlx-lm
oMLX
oMLX
oMLX
oMLX
oMLX
oMLX
mlx-lm
mlx-lm
mlx-lm
mlx-vlm
mlx-vlm
mlx-vlm
rapid-mlx
rapid-mlx
rapid-mlx
Strim
Strim
Strim
rapid-mlx
mlx-vlm
rapid-mlx

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×).
Peak memory over the whole run (engine process tree, includes Metal buffers), GB
MeasureStrimrapid-mlxmlx-vlmmlx-lmoMLX
Peak physical footprint, whole run30.835.936.337.555.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 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)). 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.

Cache and memory work, before and after (committed A/B in the cache-footprint directory)
MeasureBeforeAfter
Replay summed prefill, 8 turns (s)52.349.6 / 49.9
Cached tokens at replay turn 23,0724,084
Lowest per-cell peak footprint (GB)31.127.0
Highest per-cell peak footprint (GB)41.932.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.

Exact prefix cache: first token on a hit vs a miss (in-process checkprefix, synthetic prompts)
CaseMiss (s)Hit (s)Speedup
4,096 tokens, 3,072 shared3.9941.0223.91×
8,192 tokens, 6,144 shared8.2043.4402.38×
4,096 tokens, 3,072 shared, with MTP head state4.0941.0513.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:

Greedy 16-token agreement of the default (blocked) path with two alternatives
Promptvs serial kernelvs tensor recurrence
4K prompt a16/1614/16
4K prompt b16/1616/16
4K prompt c16/1616/16
4K prompt d6/1616/16
4K prompt e4/164/16
1K prompt a16/1616/16
1K prompt b16/1616/16
1K prompt c16/1616/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 verify command the harness runs itself (verified, failed or unverified).
  • An MCP endpoint on strim serve with 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 -p and codex exec clients 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.
30-minute real-client soak
MeasureValue
Tasks run120 tasks
Tasks passed116 tasks
Claude Code + Strim tasks60 tasks
Claude Code + Strim passed56 tasks
Claude Code pass rate93.3%
Codex + Strim tasks60 tasks
Codex + Strim passed60 tasks
Codex pass rate100.0%
Failed tasks4 tasks
Run length30.3 min
Server crashes0
Server restarts0
HTTP 5xx events0
Requests served665
Requests failed0
RSS minimum8687 MB
RSS maximum8713 MB
RSS slope24.0 MB/h
TTFT median, first quartile249 ms
TTFT median, last quartile310 ms
TTFT p901,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-auth opens 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.

Memory tiers for the supported 4-bit checkpoint (computed, not measured, except 64 GB)
Mac memoryContext (tokens)Status
8 GBunsupportedDoes not fit: even a 2-bit 27B exceeds the GPU budget.
16 GBunsupportedDoes not fit in practice with 4-bit weights plus MTP head and runtime.
24 GB15K/29K / 23K/45KEstimate for 4-bit: very short context only (bf16 KV / q8 KV, low and high GPU budget).
32 GB114K/214K (low) 154K/291K (high)Estimate (bf16 KV / q8 KV).
36 GB163K/307K - 220K+Estimate (bf16 KV / q8 KV).
48 GB310K+Estimate (bf16 KV).
64 GBfull 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 StrimApp is a menu-bar shell over an older service and does not drive strim 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 from summary.md by strim site build and 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.
Versions
ComponentVersionSource
HardwareApple M5 Max, 64 GBbench/results/h2h-final3-20261028/summary.md
macOS27.0.1bench/results/h2h-final-20261028/summary.md
MLX SwiftMLX Swift 0.32.3 (Cmlx)docs/PREFILL-SPIKE-2026-10-26.md
Strim build in the head-to-headstrim 0.1.1 (ee9f9d8)bench/results/h2h-final3-20261028/summary.md
rapid-mlxrapid-mlx 0.15.7bench/results/h2h-final3-20261028/summary.md
mlx-vlmmlx-vlm 0.7.10bench/results/h2h-final3-20261028/summary.md
mlx-lmmlx-lm 0.32.2bench/results/h2h-final3-20261028/summary.md
oMLXoMLX 0.4.5.dev1bench/results/h2h-final3-20261028/summary.md
Claude Code (soak client)Claude Code 2.1.310bench/soak/README.md
Codex (soak client)codex 0.164.0bench/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
idvalueunitsourcemethodcaveat
pc.4k.miss3.994sbench/results/prefix-cache-exact-20261026/checkprefix-4096.logcheckprefix 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.hit1.022sbench/results/prefix-cache-exact-20261026/checkprefix-4096.logcheckprefix N=4096, shared 3072 tokens: TTFT with a 3072-token prefix hit.Synthetic prompts, in-process, no HTTP.
pc.4k.speedup3.91xbench/results/prefix-cache-exact-20261026/checkprefix-4096.logmiss / hit TTFT as printed by checkprefix.Speedup grows with the shared fraction; here 3072 of 4096 tokens shared.
pc.8k_6k.miss8.204sbench/results/prefix-cache-exact-20261026/checkprefix-8192.logcheckprefix N=8192, shared 6144: TTFT on a miss.Synthetic prompts, in-process.
pc.8k_6k.hit3.440sbench/results/prefix-cache-exact-20261026/checkprefix-8192.logcheckprefix N=8192, shared 6144: TTFT on a hit.Synthetic prompts, in-process. Recomputes the 2048-token tail.
pc.8k_6k.speedup2.38xbench/results/prefix-cache-exact-20261026/checkprefix-8192.logmiss / hit TTFT as printed by checkprefix.
pc.mtp4k.miss4.094sbench/results/dec-wave3-20261026/checkprefix-4096-mtp.logcheckprefix 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.hit1.051sbench/results/dec-wave3-20261026/checkprefix-4096-mtp.logcheckprefix with MTP head, N=4096, shared 3072: TTFT (prefill + seed) on a hit.In-process.
pc.mtp4k.speedup3.90xbench/results/dec-wave3-20261026/checkprefix-4096-mtp.logmiss / hit TTFT with MTP over the cache.
pc.mtp8k.miss8.157sbench/results/dec-wave3-20261026/checkprefix-8192-mtp.logcheckprefix N=8192, shared 3072: TTFT on a miss.Synthetic prompts, in-process.
pc.mtp8k.hit1.091sbench/results/dec-wave3-20261026/checkprefix-8192-mtp.logcheckprefix 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.speedup7.48xbench/results/dec-wave3-20261026/checkprefix-8192-mtp.logmiss / hit TTFT as printed by checkprefix.See pc.mtp8k.hit caveat.
pc.node_mb210.8MBbench/results/dec-wave3-20261026/checkprefix-4096-mtp.logPlain 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_mb4.01MBbench/results/dec-wave3-20261026/checkprefix-4096-mtp.logExtra bytes per node for the MTP head state (+1.90%).
pc.policy_cost_4k0.6%bench/results/prefix-cache-exact-20261026/checkprefix-4096.logCost 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_4k65%bench/results/dec-wave3-20261026/checkprefix-4096-mtp.logMTP 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_continueIDENTICAL over 20 tokensbench/results/dec-wave3-20261026/checkprefix-4096-mtp.logHot 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.serial16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (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.tensor14/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_a.Same near-tie caveat.
lc.p4k_b.serial16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (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.tensor16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_b.Same near-tie caveat.
lc.p4k_c.serial16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (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.tensor16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_c.Same near-tie caveat.
lc.p4k_d.serial6/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (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.tensor16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_d.Same near-tie caveat.
lc.p4k_e.serial4/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (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.tensor4/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p4k_e.Same near-tie caveat.
lc.p1k_a.serial16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (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.tensor16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p1k_a.Same near-tie caveat.
lc.p1k_b.serial16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (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.tensor16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p1k_b.Same near-tie caveat.
lc.p1k_c.serial16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (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.tensor16/16tokens agreebench/results/longctx-validate-20261026/summary.mdBlocked (default) vs tensor-recurrence prefill, greedy 16 tokens, prompt p1k_c.Same near-tie caveat.
lc.first_token8/8prompts agreebench/results/longctx-validate-20261026/summary.mdFirst generated token agrees across default, serial and tensor paths.Natural repo prose, disjoint windows, Qwen tokenizer.
lc.spec_exact_4k0/2EXACTbench/results/longctx-validate-20261026/summary.mdSpeculative 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_s134.0ms/passdocs/BATCH-MTP-2026-10-26.mdVerify-pass cost, B=1, S=1, 1K context.Median of 6 rounds; background load avg 3-4, absolute ms +-5%.
bm.ms_b1_s235.1ms/passdocs/BATCH-MTP-2026-10-26.mdVerify-pass cost, B=1, S=2, 1K context.As above.
bm.ms_b4_s156.0ms/passdocs/BATCH-MTP-2026-10-26.mdVerify-pass cost, B=4, S=1, 1K context.As above.
bm.ms_b4_s3120.3ms/passdocs/BATCH-MTP-2026-10-26.mdVerify-pass cost, B=4, S=3, 1K context.As above.
bm.bound.b1.prose_s21.46xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s31.79xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s43.13xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s21.25xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s31.2xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s41.9xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s21.03xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s31.06xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s41.55xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s20.99xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s30.93xdocs/BATCH-MTP-2026-10-26.mdUpper-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_s41.57xdocs/BATCH-MTP-2026-10-26.mdUpper-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_ratio0.90-0.98qmm / bf16docs/PREFILL-SPIKE-2026-10-26.mdMLX 4-bit qmm throughput as a fraction of dense bf16 matmul, 12 shape/M combinations.MLX already dispatches NAX kernels on this machine.
ps.plateau62-63TF/sdocs/PREFILL-SPIKE-2026-10-26.mdSustained dense GEMM plateau across shapes and dtypes.True hardware peak unverified.
ps.bound+5-8%end-to-enddocs/PREFILL-SPIKE-2026-10-26.mdUpper 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_4k944tok/sdocs/PREFILL-SPIKE-2026-10-26.mdbenchprefill 4096, single pass, rep 3 (936 / 947 / 944).Loaded machine (load 2.7-5.0).
ps.gemm_share90%docs/PREFILL-SPIKE-2026-10-26.mdShare of 4K prefill that is GEMM-bound (about 90-94%).Derived from effective TF/s, not a profile.
bg.before825-846tok/sdocs/BLOCKED-GDN-PREFILL-2026-10-26.md4K prefill with the serial GDN kernel.Light and heavy load mixed.
bg.after_light915tok/sdocs/BLOCKED-GDN-PREFILL-2026-10-26.md4K prefill with the blocked GDN kernel, load 3.7.Kernel ported from rapid-mlx (Apache-2.0).
bg.after_heavy878tok/sdocs/BLOCKED-GDN-PREFILL-2026-10-26.md4K prefill with the blocked GDN kernel, load 7.3.Kernel ported from rapid-mlx (Apache-2.0).
bp.b4_4k0.95xdocs/BATCH-PREFILL-2026-10-26.mdBatched vs serial 4K prefill, B=4: slower.Not adopted.
soak.smoke.tasks2/2tasks passedbench/results/soak-20261027/smoke-20261026T212306Z/summary.txt5-minute smoke run (one claude -p task, one codex exec task).n=2 only; shows the harness path works, not reliability.
soak.smoke.crashes0bench/results/soak-20261027/smoke-20261026T212306Z/summary.txtServer crashes in the 5-minute smoke run.n=2 tasks, 0.6 min.
soak.tasks_total120tasksbench/results/soak-20261027/run2/summary.txtTasks 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_passed116tasksbench/results/soak-20261027/run2/summary.txtTasks 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_claude93.3%bench/results/soak-20261027/run2/summary.txtClaude 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_codex100.0%bench/results/soak-20261027/run2/summary.txtCodex 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.crashes0bench/results/soak-20261027/run2/summary.txtServer 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.restarts0bench/results/soak-20261027/run2/summary.txtServer 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.http5xx0bench/results/soak-20261027/run2/summary.txtHTTP 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_total665bench/results/soak-20261027/run2/summary.txtServer 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_failed0bench/results/soak-20261027/run2/summary.txtServer 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_slope24.0MB/hbench/results/soak-20261027/run2/summary.txtRSS 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_q1249msbench/results/soak-20261027/run2/summary.txtTTFT 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_q4310msbench/results/soak-20261027/run2/summary.txtTTFT 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_p901,334msbench/results/soak-20261027/run2/summary.txtTTFT 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.failures4tasksbench/results/soak-20261027/run2/summary.txtFailed 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_tasks60tasksbench/results/soak-20261027/run2/summary.txtClaude 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_passed56tasksbench/results/soak-20261027/run2/summary.txtClaude 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_tasks60tasksbench/results/soak-20261027/run2/summary.txtCodex + 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_passed60tasksbench/results/soak-20261027/run2/summary.txtCodex + 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_min30.3minbench/results/soak-20261027/run2/summary.txtWall-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_min8687MBbench/results/soak-20261027/run2/summary.txtLowest 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_max8713MBbench/results/soak-20261027/run2/summary.txtHighest 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_a1/4tasks passedbench/results/soak-20261027/rerun-a/summary.txtClaude 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_b4/4tasks passedbench/results/soak-20261027/rerun-b/summary.txtClaude 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_range2-4tokensdocs/STATUS.mdAdaptive MTP draft depth range.From the status document; fixed depth 2 is the opt-out (STRIM_MTP_FIXED=1).
bg.block48tokensdocs/BLOCKED-GDN-PREFILL-2026-10-26.mdBlock size staged in threadgroup memory by the blocked GDN kernel.
cfg.chunk1,024tokensbench/results/prefix-cache-exact-20261026/checkprefix-4096.logAligned prefill chunk / trie node size.Printed as chunk=1024 by checkprefix.
ver.mlx_swiftMLX Swift 0.32.3 (Cmlx)docs/PREFILL-SPIKE-2026-10-26.mdVersion of MLX Swift.
ver.claudeClaude Code 2.1.310bench/soak/README.mdVersion of Claude Code (soak).
ver.codexcodex 0.164.0bench/soak/README.mdVersion of Codex (soak).
harness.tools4toolsbench/results/mcp-smoke-20261027/summary.mdMCP tools/list on strim serve (strim_task, strim_job, strim_cancel, strim_ask).Smoke run, one server, one session.
harness.rerun_runs4runsbench/results/mcp-clients-20261027/summary.mdReal 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_pass4runs passedbench/results/mcp-clients-20261027/summary.mdRuns 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_n1run per cellbench/results/mcp-clients-20261027/summary.mdSample size of each cell in the rerun table.One run per client and prompt; parent output varies run to run.
harness.delegated_in29.9Kinput tokensdocs/PLAN-PRODUCT-2026-10-27.mdParent total input when a one-line fix was delegated through strim_task (3 turns).Trivial task, n=1: no saving shown.
harness.alone_in25.5Kinput tokensdocs/PLAN-PRODUCT-2026-10-27.mdParent total input when the same fix was done alone (5 turns).Trivial task, n=1: no saving shown.
harness.agentbench_tasks30tasksdocs/PLAN-PRODUCT-2026-10-27.mdSize of the real-task corpus the 3-arm agent benchmark will run on (not yet run).Planned measurement; no result exists yet.
ver.rapidrapid-mlx 0.15.7bench/results/h2h-final3-20261028/summary.mdVersion of rapid-mlx in the final head-to-head.MTP on, --max-num-seqs 4.
ver.mlxvlmmlx-vlm 0.7.10bench/results/h2h-final3-20261028/summary.mdVersion of mlx-vlm in the final head-to-head.Server defaults, no MTP.
ver.strim_h2hstrim 0.1.1 (ee9f9d8)bench/results/h2h-final3-20261028/summary.mdStrim build in the final head-to-head.Commits after this build were not benchmarked.
ver.macos27.0.1bench/results/h2h-final-20261028/summary.mdmacOS version of the benchmark machine.
ver.hwApple M5 Max, 64 GBbench/results/h2h-final3-20261028/summary.mdBenchmark machine.The only machine Strim has been tested on.
cf.replay_before52.3sbench/results/cache-footprint-20261027/NOTES.mdAgent 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_ab49.6 / 49.9sbench/results/cache-footprint-20261027/NOTES.mdSame 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_before3,072tokensbench/results/cache-footprint-20261027/NOTES.mdCached prompt tokens at replay turn 2 before the assistant-start cuts.Synthetic replay.
cf.cached_t2_after4,084tokensbench/results/cache-footprint-20261027/NOTES.mdCached prompt tokens at replay turn 2 with the assistant-start cuts (turn end becomes a trie node).Synthetic replay.
cf.fp_old_lo31.1GBbench/results/cache-footprint-20261027/NOTES.mdLowest 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_hi41.9GBbench/results/cache-footprint-20261027/NOTES.mdHighest per-cell peak footprint before (W5, 41894 MB).Peak phys_footprint, one run per cell.
cf.fp_new_lo27.0GBbench/results/cache-footprint-20261027/NOTES.mdLowest per-cell peak footprint after (replay2, 26983 MB).Peak phys_footprint, one run per cell.
cf.fp_new_hi32.6GBbench/results/cache-footprint-20261027/NOTES.mdHighest per-cell peak footprint after (W5, 32573 MB).Peak phys_footprint, one run per cell.
cf.cold_16k17.2-17.3sbench/results/cache-footprint-20261027/NOTES.mdCold 16K TTFT in the old and the new build (no regression).One session.
cb.c4_before57.4tok/sdocs/PLAN-CONCURRENCY-2026-10-27.mdServed 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_after63.3tok/sdocs/PLAN-CONCURRENCY-2026-10-27.mdSame, 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_before66.2tok/sdocs/PLAN-CONCURRENCY-2026-10-27.mdServed aggregate decode at 8 concurrent 512-token requests before the kernels.Same load caveat.
cb.c8_after73.1tok/sdocs/PLAN-CONCURRENCY-2026-10-27.mdSame, with the batched kernels.Same load caveat; included in the head-to-head build.
cb.step_before49.5ms/stepdocs/PLAN-CONCURRENCY-2026-10-27.mdBatched decode step time at B=4, 512 context, before the batch-dimension kernels.benchbatch microbenchmark.
cb.step_after42.3ms/stepdocs/PLAN-CONCURRENCY-2026-10-27.mdBatched decode step time at B=4 with the kernels.benchbatch microbenchmark.
cb.step_floor34msdocs/PLAN-CONCURRENCY-2026-10-27.mdPlain single-stream decode step (weight-bandwidth floor).From the plan document.
cb.agree_off6/8prompts identicaldocs/PLAN-CONCURRENCY-2026-10-27.mdBatched 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_on8/8prompts identicaldocs/PLAN-CONCURRENCY-2026-10-27.mdSame 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_bound1.09xxdocs/PLAN-CONCURRENCY-2026-10-27.mdUpper bound for MTP inside the batch (before draft cost): measured no-go.Computed from measured verify cost and acceptance.
ad.max_inflight8requestsdocs/ADMISSION.mdDefault 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_findings14findingsdocs/SECURITY-REVIEW-2026-10-28-server.mdFindings (F1 to F14) of the server HTTP surface review.Read-only review plus an isolated arithmetic repro; no live server, no GPU.
sec.server_fixed6findingsdocs/SECURITY-REVIEW-2026-10-28-server.mdServer 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_high1findingsdocs/SECURITY-REVIEW-2026-10-28-server.mdHigh-severity server findings (F1, integer overflow trap from a client-controlled token count), fixed.No critical findings.
sec.exec_fixed5findingsdocs/SECURITY-REVIEW-2026-10-28-exec.mdProcess-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_gib56.0GiBdocs/RESEARCH-QUANT-TIERS-2026-10-27.mdMetal 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.w414.09GiBdocs/RESEARCH-QUANT-TIERS-2026-10-27.mdComputed 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.f417.0GiBdocs/RESEARCH-QUANT-TIERS-2026-10-27.mdComputed 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.t8nodocs/RESEARCH-QUANT-TIERS-2026-10-27.md8 GB tier: even a 2-bit 27B exceeds the GPU budget.Computed.
qt.t16nodocs/RESEARCH-QUANT-TIERS-2026-10-27.md16 GB tier: does not fit in practice.Computed; no 4-bit configuration fits.
qt.t2415K/29K / 23K/45Ktokensdocs/RESEARCH-QUANT-TIERS-2026-10-27.md24 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.t32114K/214K (low) 154K/291K (high)tokensdocs/RESEARCH-QUANT-TIERS-2026-10-27.md32 GB tier, 4-bit g64: context estimate (bf16 KV / q8 KV) at the low and high GPU budget.Computed, not measured.
qt.t36163K/307K - 220K+tokensdocs/RESEARCH-QUANT-TIERS-2026-10-27.md36 GB tier, 4-bit g64: context estimate (bf16 KV / q8 KV).Computed, not measured.
qt.t48310K+tokensdocs/RESEARCH-QUANT-TIERS-2026-10-27.md48 GB tier, 4-bit g64: context estimate (bf16 KV).Computed, not measured.
qt.t64fulldocs/RESEARCH-QUANT-TIERS-2026-10-27.md64 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.runs120runsbench/results/agentbench-20261028/report.mdRuns 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.corpus17tasksdocs/RESEARCH-QUANT-TIERS-2026-10-27.mdTasks 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.strim994.5tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx996.8tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm1017tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm949.1tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx896.7tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.00xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.98xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.05xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.11xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim4.13sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx4.12sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm4.039sbench/results/h2h-final3-20261028/summary.mdHead-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-lm4.327sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx4.58sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.00xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.02xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.95xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.90xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim75.34tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx50.12tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm32.69tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm30.11tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx33.53tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.50xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm2.30xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm2.50xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx2.25xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim963.1tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx972.4tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm988tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm919.8tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx891.9tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.99xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.97xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.05xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.08xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim17.02sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx16.86sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm16.59sbench/results/h2h-final3-20261028/summary.mdHead-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-lm17.82sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx18.38sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.01xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.03xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.96xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.93xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim65.18tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx45.75tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm30.93tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm28.68tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx31.42tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.42xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm2.11xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm2.27xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx2.07xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim884.6tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx910tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm923.2tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm850.8tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx823.7tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.97xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.96xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.04xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.07xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim37.06sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx36.02sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm35.51sbench/results/h2h-final3-20261028/summary.mdHead-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-lm38.53sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx39.79sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.03xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.04xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.96xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.93xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim52.17tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx42.17tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm29.35tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm27.62tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx29.9tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.24xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.78xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.89xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.74xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim69.22tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx71.69tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm67.29tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm66.31tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx54.61tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.97xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.03xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.04xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.27xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim1.493sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx2.339sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm2.305sbench/results/h2h-final3-20261028/summary.mdHead-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-lm2.467sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx3.049sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.64xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.65xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.61xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.49xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim2.292sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx2.339sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm2.305sbench/results/h2h-final3-20261028/summary.mdHead-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-lm2.469sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx3.198sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.98xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.99xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.93xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.72xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim76.37tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx71.76tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm74.65tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm67.9tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx58.74tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.06xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.02xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.12xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.30xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim2.683sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx5.889sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm4.34sbench/results/h2h-final3-20261028/summary.mdHead-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-lm6.064sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx5.726sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.46xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.62xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.44xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.47xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim4.61sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx9.466sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm4.341sbench/results/h2h-final3-20261028/summary.mdHead-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-lm9.837sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx6.304sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.49xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.06xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.47xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.73xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim28.73tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx27.73tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm28.57tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm27.22tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx25.28tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.04xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.01xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.06xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.14xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxNCbench/results/h2h-final3-20261028/summary.mdFinal 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.strim7.678sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx13.44sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm12.43sbench/results/h2h-final3-20261028/summary.mdHead-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-lm13.47sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx13.32sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.57xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.62xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.57xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.58xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxNCbench/results/h2h-final3-20261028/summary.mdFinal 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.strim12.07sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx13.44sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm12.43sbench/results/h2h-final3-20261028/summary.mdHead-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-lm13.47sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx13.47sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.90xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.97xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.90xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.90xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxNCbench/results/h2h-final3-20261028/summary.mdFinal 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.strim31.19tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx28.47tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm31.18tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm27.63tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx26.89tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.10xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.00xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.13xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.16xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxNCbench/results/h2h-final3-20261028/summary.mdFinal 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.strim13.34sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx22.1sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm23.1sbench/results/h2h-final3-20261028/summary.mdHead-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-lm22.61sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx25.08sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.60xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.58xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.59xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.53xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxNCbench/results/h2h-final3-20261028/summary.mdFinal 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.strim22.67sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx30.98sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm23.1sbench/results/h2h-final3-20261028/summary.mdHead-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-lm31.68sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx25.69sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.73xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.98xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.72xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.88xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxNCbench/results/h2h-final3-20261028/summary.mdFinal 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.strim13.24tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx13.16tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm13.52tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm13.1tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingtok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.01xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.98xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.01xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim10.36sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx16.86sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm16.17sbench/results/h2h-final3-20261028/summary.mdHead-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-lm16.84sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingsbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.61xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.64xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.62xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim16sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx16.86sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm16.17sbench/results/h2h-final3-20261028/summary.mdHead-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-lm16.85sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingsbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.95xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.99xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.95xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim13.29tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx13.2tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm13.84tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm13.04tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingtok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.01xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.96xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmLOSSbench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.02xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim18.75sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx26.56sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm32.07sbench/results/h2h-final3-20261028/summary.mdHead-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-lm26.83sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingsbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.71xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.58xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.70xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim32sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx36.24sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm32.07sbench/results/h2h-final3-20261028/summary.mdHead-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-lm36.57sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingsbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.88xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm1.00xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.88xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim9.773tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx3.344tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm3.473tok/sbench/results/h2h-final3-20261028/summary.mdHead-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-lm3.346tok/sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingtok/sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx2.92xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm2.81xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm2.92xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim20.29sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx73.53sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm70.48sbench/results/h2h-final3-20261028/summary.mdHead-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-lm73.4sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingsbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.28xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.29xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.28xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim22.83sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx73.53sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm70.48sbench/results/h2h-final3-20261028/summary.mdHead-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-lm73.4sbench/results/h2h-final3-20261028/summary.mdHead-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.omlxn/a pendingsbench/results/h2h-final3-20261028/summary.mdHead-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-mlx0.31xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.32xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.31xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxn/abench/results/h2h-final3-20261028/summary.mdFinal 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.strim48.93sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx49.13sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm192.5sbench/results/h2h-final3-20261028/summary.mdHead-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-lm55.02sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx64.84sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.00xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.25xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.89xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.75xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim34.6sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx34.77sbench/results/h2h-final3-20261028/summary.mdHead-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-vlm107.7sbench/results/h2h-final3-20261028/summary.mdHead-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-lm39.31sbench/results/h2h-final3-20261028/summary.mdHead-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.omlx44.9sbench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.00xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlm0.32xbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmWINbench/results/h2h-final3-20261028/summary.mdFinal 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-lm0.88xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmWINbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx0.77xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim87.25%bench/results/h2h-final3-20261028/summary.mdHead-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-mlx87.23%bench/results/h2h-final3-20261028/summary.mdHead-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-vlm0%bench/results/h2h-final3-20261028/summary.mdHead-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-lm87.26%bench/results/h2h-final3-20261028/summary.mdHead-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.omlx85.25%bench/results/h2h-final3-20261028/summary.mdHead-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-mlx1.00xbench/results/h2h-final3-20261028/summary.mdFinal 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-mlxTIEbench/results/h2h-final3-20261028/summary.mdFinal 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-vlmn/abench/results/h2h-final3-20261028/summary.mdFinal 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-lm1.00xbench/results/h2h-final3-20261028/summary.mdFinal 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-lmTIEbench/results/h2h-final3-20261028/summary.mdFinal 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.omlx1.02xbench/results/h2h-final3-20261028/summary.mdFinal 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.omlxWINbench/results/h2h-final3-20261028/summary.mdFinal 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.strim30.8GBbench/results/h2h-final3-20261028/summary.mdPeak 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-mlx35.9GBbench/results/h2h-final3-20261028/summary.mdPeak 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-vlm36.3GBbench/results/h2h-final3-20261028/summary.mdPeak 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-lm37.5GBbench/results/h2h-final3-20261028/summary.mdPeak 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.omlx55.2GBbench/results/h2h-final3-20261028/summary.mdPeak 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.self8/8prompts identicalbench/results/h2h-final3-20261028/summary.mdStrim 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-mlx7/8prompts identicalbench/results/h2h-final3-20261028/summary.mdStrim against rapid-mlx, 8 fixed prompts, 64 greedy tokens.Sanity check only: near-ties diverge, one divergence flips every later token.
final.agree.mlx-vlm6/8prompts identicalbench/results/h2h-final3-20261028/summary.mdStrim against mlx-vlm, 8 fixed prompts, 64 greedy tokens.Sanity check only: near-ties diverge, one divergence flips every later token.
final.agree.mlx-lm6/8prompts identicalbench/results/h2h-final3-20261028/summary.mdStrim against mlx-lm, 8 fixed prompts, 64 greedy tokens.Sanity check only: near-ties diverge, one divergence flips every later token.
final.agree.omlx7/8prompts identicalbench/results/h2h-final3-20261028/summary.mdStrim 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-mlx24-50%bench/results/h2h-final3-20261028/summary.mdDecode 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-vlm1.8-2.3xbench/results/h2h-final3-20261028/summary.mdDecode 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-lm1.9-2.5xbench/results/h2h-final3-20261028/summary.mdDecode 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.omlx1.7-2.2xbench/results/h2h-final3-20261028/summary.mdDecode 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_speedup2.8-2.9xbench/results/h2h-final3-20261028/summary.mdAggregate 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_lower29-56%bench/results/h2h-final3-20261028/summary.mdMedian 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_lower2-4%bench/results/h2h-final3-20261028/summary.mdAggregate 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_n3cellsbench/results/h2h-final3-20261028/summary.mdNumber 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_worse6%bench/results/h2h-final3-20261028/summary.mdp95 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_n1cellsbench/results/h2h-final3-20261028/summary.mdNumber 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_gap2-4%bench/results/h2h-final3-20261028/summary.mdCold 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_loss4K, 16K and 32Kbench/results/h2h-final3-20261028/summary.mdCold 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_tienonebench/results/h2h-final3-20261028/summary.mdCold 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.passes2passesbench/results/h2h-final3-20261028/summary.mdPasses 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.buildee9f9d8bench/results/h2h-final3-20261028/summary.mdStrim commit that was benchmarked (from the summary title).Commits after this one were not benchmarked.
final.val.sessions30sessionsbench/results/h2h-final3-20261028/summary.mdEngine sessions (engine x pass x cell group) listed in the per-session load table.
final.val.polluted2sessionsbench/results/h2h-final3-20261028/summary.mdSessions 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.clean28sessionsbench/results/h2h-final3-20261028/summary.mdPrimary engine sessions marked CLEAN; later retries are retained separately.Claims additionally require claim_eligible for both engines in each cell.
final.val.load_max4.7bench/results/h2h-final3-20261028/summary.mdHighest 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.swap0MBbench/results/h2h-final3-20261028/summary.mdLargest swap growth in any benchmark session.Baseline swap was pre-existing.
ver.h2h.rapid-mlxrapid-mlx 0.15.7bench/results/h2h-final3-20261028/summary.mdMeasured version of rapid-mlx in the head-to-head run (engine_meta.version in results.json, listed in the summary).
ver.h2h.mlx-vlmmlx-vlm 0.7.10bench/results/h2h-final3-20261028/summary.mdMeasured version of mlx-vlm in the head-to-head run (engine_meta.version in results.json, listed in the summary).
ver.h2h.mlx-lmmlx-lm 0.32.2bench/results/h2h-final3-20261028/summary.mdMeasured version of mlx-lm in the head-to-head run (engine_meta.version in results.json, listed in the summary).
ver.h2h.omlxoMLX 0.4.5.dev1bench/results/h2h-final3-20261028/summary.mdMeasured version of omlx in the head-to-head run (engine_meta.version in results.json, listed in the summary).