Install any skill in seconds. Free to start, no credit card required.
Get Started Free →mlx-serve benchmarking methodology — bench.sh usage, comparison-trap rules (same-methodology CSVs only, spec-decode variance, thermal lies, engine naming), perf-claim etiquette. Use before running benchmarks or making any performance claim.
.claude/skills/ddalcu-bench/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-19 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-09 | ✗→✓ | ▲ Improved | -26% | 0% |
| case-01 | ✗→✓ | ▲ Improved | 43% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 54% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 33% | 0% |
llmprobe is the measurement layer. tests/bench.sh boots mlx-serve (one model at a time: boot, probe, kill, settle) and llmprobe takes every number via --bench-only. We do not hand-roll timing loops — llmprobe discards a warmup per scenario, reports median-of-3 as median (min-max), refuses to fabricate a number when usage is missing, records the machine it ran on, and applies the same protocol to every engine.
./tests/bench.sh # every model (~did we regress)
./tests/bench.sh --only qwen36-27b # one row
./tests/bench.sh --url 127.0.0.1:1234 -m <id> # a server someone else started
./tests/bench.sh --full # median of 3 per rung, to 64kEach cell is mlx-serve at its FASTEST. --mtp is forced wherever the checkpoint ships an MTP head, because it is default-OFF on MoE targets and that is where it pays most (35B-A3B reads 157 without and 191 with). Everything else is already on by default. The mode that actually engaged is read off the server's own [spec-stats] mode= lines and named beside the number — a mode that silently stops engaging shows up as a bare cell, which is the regression signal.
Another engine = another URL. Start LM Studio / oMLX / MTPLX / llama-server yourself, then --url host:port -m <id>. Same script, same probe, nothing about their binaries, ports or version strings lives in the bench.
The only artifacts: the paste-ready rows bench.sh prints at the end, which go into benchmarks.md (one column per release in the history table, plus the cross-engine table rewritten when a comparison is run), and the saved llmprobe reports + server logs under ~/claude-tmp/bench-<tag>/.
env $VAR, so a multi-switch arm's first switch swallowed the rest as its value and the "composed" arm silently ran the fast path — reading a 2x win as "neutral" for half a session (live 2026-07-30, story in docs/qwentts-cache.md).lms unload --all), so waiting on its port burns the full timeout on every stop — measured 11 of 20 min on one run. This is why bench.sh no longer manages other engines at all.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-19 | fail→pass | 14,806 | 7,214 | -51% | 1 | 1 | 0% | 2,165 | 2,225 | +3% | 0 | 0 | — |
case-09 | fail→pass | 16,169 | 4,977 | -69% | 1 | 1 | 0% | 2,664 | 1,978 | -26% | 0 | 0 | — |
case-10 | pass→pass | 10,386 | 4,303 | -59% | 1 | 1 | 0% | 2,019 | 1,881 | -7% | 0 | 0 | — |
case-01 | fail→pass | 9,417 | 8,684 | -8% | 1 | 1 | 0% | 1,871 | 2,683 | +43% | 0 | 0 | — |
case-02 | fail→fail | 4,367 | 4,916 | +13% | 1 | 1 | 0% | 258 | 1,439 | +458% | 0 | 0 | — |
case-03 | fail→pass | 15,165 | 18,404 | +21% | 1 | 1 | 0% | 2,886 | 4,438 | +54% | 0 | 0 | — |
case-04 | fail→pass | 13,036 | 11,982 | -8% | 1 | 1 | 0% | 2,428 | 3,239 | +33% | 0 | 0 | — |
case-05 | pass→pass | 8,325 | 5,863 | -30% | 1 | 1 | 0% | 1,642 | 2,195 | +34% | 0 | 0 | — |
case-06 | pass→pass | 9,122 | 7,347 | -19% | 1 | 1 | 0% | 1,777 | 2,564 | +44% | 0 | 0 | — |
case-07 | fail→pass | 7,910 | 1,722 | -78% | 1 | 1 | 0% | 1,338 | 1,282 | -4% | 0 | 0 | — |
case-08 | fail→pass | 8,892 | 1,729 | -81% | 1 | 1 | 0% | 1,554 | 1,316 | -15% | 0 | 0 | — |
case-11 | fail→pass | 12,082 | 3,992 | -67% | 1 | 1 | 0% | 2,019 | 1,802 | -11% | 0 | 0 | — |
case-12 | fail→pass | 12,725 | 4,475 | -65% | 1 | 1 | 0% | 2,066 | 1,895 | -8% | 0 | 0 | — |
case-13 | pass→pass | 10,684 | 5,002 | -53% | 1 | 1 | 0% | 1,764 | 1,812 | +3% | 0 | 0 | — |
case-14 | fail→pass | 8,594 | 7,028 | -18% | 1 | 1 | 0% | 1,478 | 2,299 | +56% | 0 | 0 | — |
case-15 | pass→pass | 12,141 | 7,998 | -34% | 1 | 1 | 0% | 1,927 | 2,389 | +24% | 0 | 0 | — |
case-16 | pass→pass | 14,703 | 10,394 | -29% | 1 | 1 | 0% | 2,381 | 2,785 | +17% | 0 | 0 | — |
case-17 | fail→pass | 17,730 | 3,786 | -79% | 1 | 1 | 0% | 2,804 | 1,729 | -38% | 0 | 0 | — |
case-18 | fail→pass | 19,351 | 2,648 | -86% | 1 | 1 | 0% | 3,044 | 1,556 | -49% | 0 | 0 | — |
case-20 | fail→pass | 10,291 | 2,426 | -76% | 1 | 1 | 0% | 1,840 | 1,441 | -22% | 0 | 0 | — |
case-21 | fail→fail | 12,311 | 4,679 | -62% | 1 | 1 | 0% | 2,228 | 1,859 | -17% | 0 | 0 | — |
case-22 | fail→pass | 12,833 | 4,685 | -63% | 1 | 1 | 0% | 2,207 | 1,884 | -15% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 21 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +64 percentage points is the difference between those two pass rates over the 21 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.6-flash | verified | 8/21/2026 | +68% |
Other measured skills in the registry, with their headline benchmark lift.