diff --git a/dirigo-results/0.2.13-port/intercept/zerocache/conf-ref.json b/dirigo-results/0.2.13-port/intercept/zerocache/conf-ref.json new file mode 100644 index 00000000000..522f818e182 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/zerocache/conf-ref.json @@ -0,0 +1,63 @@ +{ + "exe": "/home/bob/bin/strata-sycl-host.sh", + "args": [ + "--pack", + "/home/bob/XeStrata-data/packs/coder-iq1_m", + "--native", + "/home/bob/strata-models/IQ1_M/Qwen3.8-Flash-Next-GSQ-RCO-IQ1_M-00001-of-00002.gguf", + "--ple-gguf", + "/home/bob/strata-models/IQ1_M/Qwen3.8-Flash-Next-GSQ-RCO-IQ1_M-00002-of-00002.gguf", + "--expert-profile", + "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/data/expert-profile-mine.bin", + "--expert-cache", + "auto", + "--stream-experts", + "--prefill", + "auto", + "--prompt-cache", + "6", + "--prompt-cache-every", + "4096", + "--batch", + "0", + "--spec", + "6", + "--spec-min-p", + "0.5", + "--mtp", + "/home/bob/XeStrata-data/mtp/rt", + "--mtp-draft-vocab", + "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/data/draft_vocab_en.bin", + "--mtp-window", + "8192", + "--max-context", + "131072", + "--kv", + "int8", + "--kv-resident", + "32768", + "--vram-reserve-mib", + "700", + "--conversation-cache-mib", + "2048" + ], + "cwd": "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13", + "tokenizer": "/home/bob/XeStrata-data/packs/coder-iq1_m/tokenizer", + "model_name": "qwen3.8-flash-next-coder-iq1_m", + "log": "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/strata-coder-iq1_m-sycl-tuned.log", + "port": 8095, + "backend": "sycl", + "open_browser": false, + "thinking_policy": "on", + "conv_route": "on", + "conv_route_batch_after": 4, + "short_answer": { + "spec": 0, + "max_tokens": 16 + }, + "spec_window": 0, + "spec_window_needle_min": 6000, + "code_tune": { + "mode": "off" + } +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/zerocache/conf-zero.json b/dirigo-results/0.2.13-port/intercept/zerocache/conf-zero.json new file mode 100644 index 00000000000..2bc6c6ae576 --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/zerocache/conf-zero.json @@ -0,0 +1,63 @@ +{ + "exe": "/home/bob/bin/strata-sycl-host.sh", + "args": [ + "--pack", + "/home/bob/XeStrata-data/packs/coder-iq1_m", + "--native", + "/home/bob/strata-models/IQ1_M/Qwen3.8-Flash-Next-GSQ-RCO-IQ1_M-00001-of-00002.gguf", + "--ple-gguf", + "/home/bob/strata-models/IQ1_M/Qwen3.8-Flash-Next-GSQ-RCO-IQ1_M-00002-of-00002.gguf", + "--expert-profile", + "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/data/expert-profile-mine.bin", + "--expert-cache", + "auto", + "--stream-experts", + "--prefill", + "auto", + "--prompt-cache", + "0", + "--prompt-cache-every", + "4096", + "--batch", + "0", + "--spec", + "6", + "--spec-min-p", + "0.5", + "--mtp", + "/home/bob/XeStrata-data/mtp/rt", + "--mtp-draft-vocab", + "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/data/draft_vocab_en.bin", + "--mtp-window", + "8192", + "--max-context", + "131072", + "--kv", + "int8", + "--kv-resident", + "32768", + "--vram-reserve-mib", + "700", + "--conversation-cache-mib", + "2048" + ], + "cwd": "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13", + "tokenizer": "/home/bob/XeStrata-data/packs/coder-iq1_m/tokenizer", + "model_name": "qwen3.8-flash-next-coder-iq1_m", + "log": "/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731/strata-0.2.13/strata-coder-iq1_m-sycl-tuned.log", + "port": 8095, + "backend": "sycl", + "open_browser": false, + "thinking_policy": "on", + "conv_route": "on", + "conv_route_batch_after": 4, + "short_answer": { + "spec": 0, + "max_tokens": 16 + }, + "spec_window": 0, + "spec_window_needle_min": 6000, + "code_tune": { + "mode": "off" + } +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/zerocache/ladder-ref.json b/dirigo-results/0.2.13-port/intercept/zerocache/ladder-ref.json new file mode 100644 index 00000000000..7f618de6f7f --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/zerocache/ladder-ref.json @@ -0,0 +1,137 @@ +[ + { + "target": 75, + "ttft_ms": 559.0, + "wall_ms": 674.1, + "prompt_tokens": 126, + "reused": 0, + "fresh": 126, + "prefill_ms": 538, + "prefill_tps": 234.3, + "decode_ms": 133, + "park_tokens": 96, + "park_ms": 99.3, + "kv_hit_pct": 94.4, + "kv_mib_from_ram": 1.7, + "server_ms": 21.0, + "label": "ref" + }, + { + "target": 75, + "ttft_ms": 546.1, + "wall_ms": 605.6, + "prompt_tokens": 126, + "reused": 0, + "fresh": 126, + "prefill_ms": 525, + "prefill_tps": 240.0, + "decode_ms": 79, + "park_tokens": 138, + "park_ms": 102.5, + "kv_hit_pct": 91.21, + "kv_mib_from_ram": 1.6, + "server_ms": 21.1, + "label": "ref" + }, + { + "target": 75, + "ttft_ms": 467.0, + "wall_ms": 525.4, + "prompt_tokens": 126, + "reused": 0, + "fresh": 126, + "prefill_ms": 446, + "prefill_tps": 282.8, + "decode_ms": 78, + "park_tokens": 133, + "park_ms": 114.8, + "server_ms": 21.0, + "label": "ref" + }, + { + "target": 512, + "ttft_ms": 588.5, + "wall_ms": 656.3, + "prompt_tokens": 456, + "reused": 0, + "fresh": 456, + "prefill_ms": 566, + "prefill_tps": 805.9, + "decode_ms": 87, + "server_ms": 22.5, + "label": "ref" + }, + { + "target": 512, + "ttft_ms": 537.2, + "wall_ms": 628.0, + "prompt_tokens": 456, + "reused": 0, + "fresh": 456, + "prefill_ms": 515, + "prefill_tps": 886.2, + "decode_ms": 110, + "kv_hit_pct": 90.86, + "kv_mib_from_ram": 5.6, + "server_ms": 22.2, + "label": "ref" + }, + { + "target": 512, + "ttft_ms": 537.3, + "wall_ms": 628.2, + "prompt_tokens": 456, + "reused": 0, + "fresh": 456, + "prefill_ms": 515, + "prefill_tps": 886.0, + "decode_ms": 110, + "kv_hit_pct": 92.27, + "kv_mib_from_ram": 5.6, + "server_ms": 22.3, + "label": "ref" + }, + { + "target": 2048, + "ttft_ms": 1481.6, + "wall_ms": 1550.2, + "prompt_tokens": 1608, + "reused": 0, + "fresh": 1608, + "prefill_ms": 1454, + "prefill_tps": 1105.6, + "decode_ms": 90, + "server_ms": 27.6, + "label": "ref" + }, + { + "target": 2048, + "ttft_ms": 1463.3, + "wall_ms": 1532.0, + "prompt_tokens": 1608, + "reused": 0, + "fresh": 1608, + "prefill_ms": 1436, + "prefill_tps": 1120.2, + "decode_ms": 90, + "kv_hit_pct": 90.89, + "kv_mib_from_ram": 19.5, + "server_ms": 27.3, + "label": "ref" + }, + { + "target": 2048, + "ttft_ms": 1463.3, + "wall_ms": 1532.1, + "prompt_tokens": 1608, + "reused": 0, + "fresh": 1608, + "prefill_ms": 1436, + "prefill_tps": 1119.9, + "decode_ms": 90, + "kv_hit_pct": 90.89, + "kv_mib_from_ram": 19.5, + "server_ms": 27.3, + "label": "ref" + } +] \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/zerocache/ladder-zero.json b/dirigo-results/0.2.13-port/intercept/zerocache/ladder-zero.json new file mode 100644 index 00000000000..05ca8d1faee --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/zerocache/ladder-zero.json @@ -0,0 +1,135 @@ +[ + { + "target": 75, + "ttft_ms": 364.3, + "wall_ms": 479.1, + "prompt_tokens": 126, + "reused": 0, + "fresh": 126, + "prefill_ms": 343, + "prefill_tps": 367.3, + "decode_ms": 133, + "kv_hit_pct": 90.77, + "kv_mib_from_ram": 1.2, + "server_ms": 21.3, + "label": "zero" + }, + { + "target": 75, + "ttft_ms": 350.0, + "wall_ms": 408.4, + "prompt_tokens": 126, + "reused": 0, + "fresh": 126, + "prefill_ms": 329, + "prefill_tps": 383.2, + "decode_ms": 78, + "kv_hit_pct": 87.02, + "kv_mib_from_ram": 1.6, + "server_ms": 21.0, + "label": "zero" + }, + { + "target": 75, + "ttft_ms": 345.8, + "wall_ms": 422.8, + "prompt_tokens": 126, + "reused": 0, + "fresh": 126, + "prefill_ms": 324, + "prefill_tps": 388.3, + "decode_ms": 96, + "server_ms": 21.8, + "label": "zero" + }, + { + "target": 512, + "ttft_ms": 588.3, + "wall_ms": 679.2, + "prompt_tokens": 456, + "reused": 0, + "fresh": 456, + "prefill_ms": 566, + "prefill_tps": 806.3, + "decode_ms": 110, + "kv_hit_pct": 92.09, + "kv_mib_from_ram": 1.6, + "server_ms": 22.3, + "label": "zero" + }, + { + "target": 512, + "ttft_ms": 539.7, + "wall_ms": 607.4, + "prompt_tokens": 456, + "reused": 0, + "fresh": 456, + "prefill_ms": 517, + "prefill_tps": 882.4, + "decode_ms": 87, + "kv_hit_pct": 92.27, + "kv_mib_from_ram": 5.6, + "server_ms": 22.7, + "label": "zero" + }, + { + "target": 512, + "ttft_ms": 538.1, + "wall_ms": 606.2, + "prompt_tokens": 456, + "reused": 0, + "fresh": 456, + "prefill_ms": 515, + "prefill_tps": 884.8, + "decode_ms": 88, + "kv_hit_pct": 90.86, + "kv_mib_from_ram": 5.6, + "server_ms": 23.1, + "label": "zero" + }, + { + "target": 2048, + "ttft_ms": 1495.1, + "wall_ms": 1587.7, + "prompt_tokens": 1608, + "reused": 0, + "fresh": 1608, + "prefill_ms": 1468, + "prefill_tps": 1095.7, + "decode_ms": 114, + "kv_hit_pct": 90.86, + "kv_mib_from_ram": 5.6, + "server_ms": 27.1, + "label": "zero" + }, + { + "target": 2048, + "ttft_ms": 1462.8, + "wall_ms": 1531.4, + "prompt_tokens": 1608, + "reused": 0, + "fresh": 1608, + "prefill_ms": 1436, + "prefill_tps": 1120.1, + "decode_ms": 90, + "kv_hit_pct": 92.3, + "kv_mib_from_ram": 19.5, + "server_ms": 26.8, + "label": "zero" + }, + { + "target": 2048, + "ttft_ms": 1471.3, + "wall_ms": 1569.9, + "prompt_tokens": 1608, + "reused": 0, + "fresh": 1608, + "prefill_ms": 1444, + "prefill_tps": 1113.7, + "decode_ms": 121, + "kv_hit_pct": 90.89, + "kv_mib_from_ram": 19.5, + "server_ms": 27.3, + "label": "zero" + } +] \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/zerocache/mixed-zero.json b/dirigo-results/0.2.13-port/intercept/zerocache/mixed-zero.json new file mode 100644 index 00000000000..e503ad34cbc --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/zerocache/mixed-zero.json @@ -0,0 +1,62 @@ +{ + "label": "zero", + "singles": 2, + "steps": [ + { + "ttft": 1.9927, + "wall": 2.207, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R1" + }, + { + "ttft": 1.9645, + "wall": 2.831, + "chars": 303, + "finish": "length", + "text": "Based on the handbook provided, here is a structured summary of the rules. The data has been organized by **Field Name**", + "step": "C1" + }, + { + "ttft": 2.4818, + "wall": 3.004, + "chars": 182, + "finish": "length", + "text": "Based on the handbook provided, there are **two** rules that map to column 42:\n\n1. **RULE 067**: field `delta610` is op", + "step": "C2" + }, + { + "ttft": 0.3898, + "wall": 0.922, + "chars": 161, + "finish": "length", + "text": "Based on the record provided, here is the extracted information:\n\n* **Record ID:** R474354\n* **Owner:** c\n* **Amou", + "step": "S1" + }, + { + "ttft": 0.3874, + "wall": 0.531, + "chars": 58, + "finish": "stop", + "text": "The status is not explicitly provided in the given record.", + "step": "S2" + }, + { + "ttft": 2.3899, + "wall": 2.891, + "chars": 133, + "finish": "stop", + "text": "There are **18** rules in the handbook that mention a field starting with `gamma`. Here is the list:\n\n* **RULE 011**: ", + "step": "C3" + }, + { + "ttft": 2.1115, + "wall": 2.327, + "chars": 69, + "finish": "stop", + "text": "Rule 007 mandates that the required field alpha160 maps to column 31.", + "step": "R2" + } + ] +} \ No newline at end of file diff --git a/dirigo-results/0.2.13-port/intercept/zerocache/strata-zerocache-sweep.sh b/dirigo-results/0.2.13-port/intercept/zerocache/strata-zerocache-sweep.sh new file mode 100755 index 00000000000..11b12cfa9fb --- /dev/null +++ b/dirigo-results/0.2.13-port/intercept/zerocache/strata-zerocache-sweep.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash +# strata-zerocache-sweep.sh - is a 0-slot prompt cache a real profile, or a one-shot-only trap? +# +# Section 6 left one lead open: a start-up `--prompt-cache 0` measured 58 ms cheaper per request than the router's +# cache-off path at 75 tokens (324 ms against 382). This window runs that profile against the traffic shape it would +# have to serve, and checks the thing the router cannot do in it: +# +# zero --prompt-cache 0 + conv_route on ladder at 75/512/2048, then the mixed shape +# ref deployed config, ladder only the reference for the same prompts on this card today +# +# The router's cache_on comes from the START-UP args (`--prompt-cache N`), so with 0 it has no value to switch back +# to: a conversation in this profile should re-read its own context every turn. If C2 re-prefills, "0 slots" is a +# one-shot-only deployment and the 58 ms is not worth a profile. +# +# UNDO: rm this file and ~/strata-zerocache-sweep +set -uo pipefail +S=/media/bob/3d651e2c-e9a4-4758-ba77-863725fe3731 +TREE=$S/strata-0.2.13 +BASE=$TREE/strata-coder-iq1_m-sycl-tuned.json +OUT=$HOME/strata-zerocache-sweep +LADDER=$HOME/bin/strata-intercept-probe.py +MIXED=$HOME/bin/strata-mixed-probe.py +mkdir -p "$OUT" + +python3 - "$BASE" "$OUT/conf-ref.json" "$OUT/conf-zero.json" <<'PY' +import json, sys +src, ref, zero = sys.argv[1:4] +d = json.load(open(src)); json.dump(d, open(ref, "w"), indent=1) +# --prompt-cache is an ENGINE argument (it lives in the config's args list), not a server flag: SRV_ARGS cannot set +# it, because serve/server.py rejects what it does not know. Rewrite the value in place instead. +z = json.load(open(src)); a = list(z.get("args", [])) +if "--prompt-cache" in a: + a[a.index("--prompt-cache") + 1] = "0" +else: + a += ["--prompt-cache", "0"] +z["args"] = a; json.dump(z, open(zero, "w"), indent=1) +print(ref, "->", " ".join(d.get("args", []))[:120]) +print(zero, "->", " ".join(a)[:120]) +PY + +arm() { # tag server-args... ; runs ladder always, mixed only when MIX=1 + local tag=$1; shift + local conf="$OUT/conf-$tag.json" + echo "[$(date +%H:%M:%S)] ===== zero-$tag SRV_ARGS='$*'" + SRV_ARGS="$*" ~/bin/strata-card-window.sh "$TREE" 8097 --conf "$conf" -- bash -c " + curl -s -m 5 http://127.0.0.1:\$PORT/v1/status | python3 -c 'import json,sys;d=json.load(sys.stdin);print(\" engine:\",d[\"engine\"])' + /usr/bin/python3 $LADDER --port \$PORT --log \"\$(python3 -c \"import json;print(json.load(open('$conf'))['log'])\")\" \ + --out $OUT/ladder-$tag.json --label $tag --sizes 75,512,2048 --samples 3 + if [ \"\${MIX:-0}\" = 1 ]; then + /usr/bin/python3 $MIXED --url http://127.0.0.1:\$PORT --label $tag --singles 2 --out $OUT/mixed-$tag.json + fi + " 2>&1 | grep -E '=====|engine:|^ [0-9]|ttft|C2|wrote|restore' +} + +# ref ladder already measured in the first attempt (ladder-ref.json); re-run it only when REF=1 +[ "${REF:-0}" = 1 ] && MIX=0 arm ref +MIX=1 arm zero +echo "[$(date +%H:%M:%S)] zero-cache sweep done" diff --git a/docs/PERF-NEXT.md b/docs/PERF-NEXT.md index d3dc0478edf..fef3028a35e 100644 --- a/docs/PERF-NEXT.md +++ b/docs/PERF-NEXT.md @@ -36,6 +36,7 @@ important as the open one. | `--ple-row-cache` 4 M / 16 M rows, `--ple-inflight` 1024 | 4 M rows and inflight 1024 are **flat** (inside the 0.2–3.6 % drift band); 16 M rows (1.44 GB) costs **−8 % on fresh 4.2k, −8…−12 % on 8.8k, −17 % on a 4.4k follow-up, −10 % on 30k**. The 94 MB default and inflight 256 stand — [the sweep](../dirigo-results/0.2.13-port/ple-sweep/) | | `spec_window` policy | recovered only half the retrieval loss (+1.3…4.8 % vs +3.6…7.5 %) — left off | | DFlash2 / DSpark drafters | **CUDA/HIP only**; the SYCL delta in 0.2.12 is 3 lines in `prefill.cpp` | +| `--prompt-cache 0` as a deployment profile | equal to the router's cache-off path at matched sizes, and every conversation turn re-prefills: `C2` 2.482 s, `C3` 2.390 s against 0.587 / 0.549 — §8 | | `conv-route-batch-after` 1 | wins 0.52 s over the first six single-shot requests of a burst, loses **1.88 s** on the conversation turn that follows it — §7 | | `--spec 0` to remove drafting entirely | the engine refuses it on a native IQ pack: *"it needs `--native` SHARD1, `--spec T (T >= 2)` and `--prefill` CHUNK"* — so drafting cannot be excluded this way | @@ -52,7 +53,7 @@ fixed term. | --- | --- | --- | --- | --- | | 1 | ~~ship `conv-route-batch-after` 1–2~~ | **closed, keep 4.** §7: 1 buys 0.52 s across the first six single-shot requests and costs **1.88 s** on the next conversation turn (`C2` 2.465 s against 0.587) — break-even at ~21 single-shots per conversation re-open | — | done; the config key that would have set it was also dead (PR #16) | | 2 | engine-side per-request timer | §6 leaves **~165 ms** inside prefill that no configuration lever explains (PLE reads excluded, cache slots ~58 ms of it); naming it needs a phase timer in the request path | code, a day | timestamp slot setup / first-layer expert reach / KV alloc per request | -| 3 | a one-shot mode that also drops the cache slots | §6: `--prompt-cache 0` is **58 ms cheaper per request** than the router's cache-off path at 75 tokens, and far more stable (324 ms against 382, spread 323–339 against 327–537). The setting is restart-class today | engine work to make it per-request | the same ladder with a 0-slot variant | +| 3 | ~~a one-shot mode that also drops the cache slots~~ | **closed, §8**: no saving over the router's cache-off path at matched sizes (+2 ms at 456 tokens, +8 ms at 1,608), and a 0-slot start severs conversation reuse for good — every turn re-prefilled | — | done | | 4 | residency-biased router on SYCL | `route_prior.cu` is CUDA-only; here **12,288 of 24,576** experts are resident, so half of every token's experts cross PCIe. Upstream measured +15 % / +37 % on a 12 GB NVIDIA card | engine port, days | decode lanes, 5 interleaved pairs | | 5 | prefill chunk at 4k/8k/12k with intervals | 16k/32k were tested, but 8,192 was never shown to be the knee | ~20 min | paired, three prompt sizes, per-prompt medians | | 6 | CPU pool workers and affinity on the 7700X | 15 workers is a 16-thread default; p-core pinning was **+27 %** decode on the 13700K | 15 min | workers 8/12/15/16, `--pool-affinity` on/off | @@ -102,9 +103,11 @@ on, like stock) — client TTFT from the first content delta, and the engine's o 290 ms once the cache is off. 3. **Parking is ~101 ms and happens after the answer**, in both modes; it is not part of TTFT, and with the cache off it stops entirely. -4. **The cache slots cost something even when unused**: `--prompt-cache 0` measured 324 ms median at 75 tokens - (323–339) against 382 ms on the router's cache-off path (327–537), the same prompts and the same build, with a - repeated default arm reproducing 382 ms exactly. +4. **Retracted the same day — the cache slots cost nothing when unused.** A first comparison put `--prompt-cache 0` at + 324 ms against 382 ms on the router's cache-off path at 75 tokens, read as a 58 ms slot cost. A matched-size rerun + (§8) shows that was an artefact: the 382 ms arm's median included its first samples while the cache was still on + (the hysteresis), so it measured the cache-on state, not the slots. At sizes both arms serve cache-off, the 0-slot + profile is equal — 456 tokens: 539.7 against 537.3; 1,608 tokens: 1,471.3 against 1,463.3. 5. **The draft layer could not be switched off to test its share**: `--spec 0` is refused on a native IQ pack, which needs `--spec T (T >= 2)`. 6. **What is left is ~165 ms** inside prefill after the cache slots' ~58 ms, unexplained by any configuration lever @@ -151,7 +154,33 @@ Decision: **4 stands.** 1 is only right for a pure single-shot queue, and this f Artifacts: [`0.2.13-port/intercept/mixed/`](../dirigo-results/0.2.13-port/intercept/mixed/) — both arms, the two inert runs that exposed the dead key, the probe and the driver. -## 8. Method rules these numbers were produced under +## 8. The 0-slot profile: no saving, and no chat + +Two windows on the build: the deployed config, and the same config with `--prompt-cache 0` in the engine arguments. +Each ran the ladder at 126 / 456 / 1,608 real tokens (three samples each, so the first three requests are still inside +the router's cache-on hysteresis) and then the mixed traffic shape. + +| real tokens | deployed TTFT | 0 slots TTFT | difference | +| --- | --- | --- | --- | +| 126 | 546.1 ms (cache on, 102 ms park) | **350.0 ms** | −196.1 ms | +| 456 | 537.3 ms (cache off) | 539.7 ms | +2.4 ms | +| 1,608 | 1,463.3 ms (cache off) | 1,471.3 ms | +8.0 ms | + +1. **The 58 ms from §6 does not exist.** Where both arms serve with the cache off, the times are equal within noise; + the 196 ms at 126 tokens is the cache-on state (§6's own +212 ms intercept and ~102 ms park) that the reference arm + had not yet switched out of. +2. **0 slots severs conversation reuse permanently.** The router's cache-on value comes from the start-up arguments, so + a server started at 0 has nothing to switch back to: `C2` 2.482 s, `C3` 2.390 s, `R2` 2.111 s — every turn and repeat + re-reads its context, against 0.587 / 0.549 / 2.330 on the deployed config. +3. **So there is no profile to offer.** A 0-slot deployment is a one-shot-only server that saves nothing on one-shots. + +This closes the last non-engine lead. What is left — the ~165 ms inside prefill — needs a phase timer in the request +path, which means a build. + +Artifacts: [`0.2.13-port/intercept/zerocache/`](../dirigo-results/0.2.13-port/intercept/zerocache/) — both ladders, the +mixed shape, the configs, the driver, and the window log with every restore line. + +## 9. Method rules these numbers were produced under - Paired or interleaved arms; median of repeats; the box's run-to-run spread stated next to the effect. - One prompt per configuration is not a measurement: every lane here has several requests, and a single-prompt