# Parity matrix Frozen migration evidence. Preserve its fixture definitions and recorded results; use the [v0.1.0 ledger](../releases/v0.1.0.md) for current release qualification. Passing this historical matrix is not a new candidate pass. > **Recorded result (2026-08-31 KST):** the complete `v0.6.5-dfm` live matrix is > green at `eb4ba77`: PASS 57 + PASS* 3 (C-shared E-2, E-3, E-6), FAIL 0, > BLOCKED 0. The final host-only fix and 13/13 cheap/parity re-audit are green > at `d126e56`. Qwen Q5+Sidecar owns the campaign's only two-hour soak; > DeepSeek retains its ordinary functional, KV, API, proof, and performance > cells. ## Qwen v0.6.5 delta re-stamp (`8006198`) Full identities, artifact scope, commands, hashes, and raw-evidence paths are recorded in [QWEN_V065_RESTAMP_2026-08-31.md](QWEN_V065_RESTAMP_2026-08-31.md). | Axis | Result | |---|---| | Numerical | Q5 loader, SSD-PLE, QSA, MoE, GDN, two-bank batch, embedded MTP, and shared MMQ gates PASS | | Token | Qwen tokenizer goldens PASS; C→Rust→Rust→C text and image outputs are exact | | KV | same-image reuse, changed-pixel rejection, cross-worker disk restore, two-bank disk/partial-fork lifecycle PASS | | Wire/API | image Chat, Responses, and Anthropic PASS; continuous width 2, static width 2, serial fallback, `/v1/models`, and `/v1/stats` PASS | | Performance | text ABBA: prefill 99.97%, decode 100.00%, TTFT +0.95%, worker VmHWM +4.40%, GPU residency exact; image prefill 100.20%, TTFT +0.32%; exact-262K prefill 99.64% | | Hard gates | 7,202.3-second Qwen soak: 3,610/3,610 requests, 158 barriers, 79 images, RSS drift 0.0011%/0.0%, swap 0; 262K direct: 248,320 finite logits, argmax 198 exact, f32 mismatches 0; KV 4-way, MTP 1.01→2.00 tok/step with exact output, forced static route 2/2 PASS | This is the requested Q5 main GGUF plus shared Sidecar scope. Safetensors, resident BF16, Q6, and their reference gates were intentionally not loaded. ## Current v0.6.5 full re-stamp (`eb4ba77` + `d126e56`) Evidence root: `scratch/rust-host-live/v065-full-restamp-20260831-184200/`. The classified live ledger is `gates-results.txt`; the final host/parity audit is under `final-audit-d126e56/`. | Group | Logical result | |---|---| | G0 cheap/parity/shared kernels | 13 PASS | | G1 DeepSeek KV/API/proof | 23 PASS | | G2 Motif family/shutdown/barrier/ABBA | 9 PASS; E-4/E-5 fixed and re-run green | | G3 Solar | 8 PASS + 1 PASS*(E-3) | | G4 K-EXAONE | 2 PASS + 1 PASS*(E-2) | | G5 dots3-note | 2 PASS + 1 PASS*(E-6) | All three PASS* cells were re-run against a C control in this campaign. E-2 and E-6 used exact `v0.6.5-dfm` sm_121a test binaries; E-3 reproduced in the frozen C server. The candidate and exact-tag Dots3 runs produced identical `first=63594/63594`, `batch_cos=0.98607464`, and `batch_nrmse=0.201895`. No C-pass/Rust-fail cell remains. The current Motif ABBA ratios are 99.90% prefill, 99.33% decode, +1.07% TTFT, and +1.03% host VmHWM, with exact GPU residency and zero swap. The proof set passes smoke 2/2, captured/eager long 6/6, tracked v0.6.5 OPP-C 5/5, and C→Rust OPP-C 5/5. After the host-only socket compatibility fix, all 13 G0 cells, clippy, final default/C builds, and `ds4-eval --self-test-extractors` pass at `d126e56`. The detailed incremental evidence below is retained for provenance. Statements that a later phase was “pending” describe the named historical commit only and are superseded by this current re-stamp. ## Historical post-promote §10 (`cb11c0b`) Evidence: `.omo/evidence/task-53-rerun-cb11c0b.txt`. PASS 55 + PASS* 5 (E-2..E-6) + FAIL 0 + BLOCKED 0. | Axis | Result | |---|---| | Numerical | family kernels + mmq PASS; family IMA/decode gaps = E-2..E-6 (C-shared) | | Token | DeepSeek logprob vectors PASS; Motif batch expected-vector miss = E-4 | | KV | DeepSeek 4-way ordinary/continued/tool-map/periodic/evict/partial PASS; Motif shutdown 4-way PASS | | Wire/API | DeepSeek 4 surfaces × serial/cont/static PASS (C=`ds4-server-c`, Rust=`ds4-server`); barrier width=2 PASS | | Performance | Motif ABBA PASS (prefill 99.95%, decode 100%, TTFT +1.1%, HWM +1.0%); proofs smoke/long/opp-c/rust-opp-c PASS | The historical two-hour mixed DeepSeek soak is not repeated. This campaign's only long soak was the now-green Qwen Q5+Sidecar two-bank gate; DeepSeek still runs the ordinary functional, parity, proof, and performance cells. “Rust works” is not `cargo build`. A host change is accepted only when all five axes that it can affect are green. CUDA optimization commits already require a correctness proof **and** a speed proof (`AGENTS.md`). The same bar applies to migration commits. ## Five axes | Contract | Requirement | Oracle | |---|---|---| | Numerical | logits / fixtures stay inside existing tolerances | family CUDA fixtures, `test-mmq-parity`, `test-model-family-kernels`, CPU-vs-GPU refs where they exist | | Token | deterministic path emits the same token ids | greedy / temp-0 benches, tokenizer goldens, motif/solar sentinels | | KV | save / restore / reuse / prefix / eviction identical | KVC 4-way matrix; `ds4_session_save_payload` / load; bank restore | | Wire/API | schema, event automaton, route engagement, semantic equivalence | `docs/ds4-api-surface-matrix.md` + `ds4_test --server` | | Performance | no unexplained regression vs C on GB10 | [BASELINE.md](BASELINE.md) thresholds; AB/BA or ABBA | Live sampled HTTP bodies are **not** a byte oracle. Continuous temp-0 can jitter. Live gates check schema, automata, routing, and semantic equivalence — the same rule the API matrix already records. Do not refresh goldens to hide a Rust miss. ## Phase gates ### Phase 1 — workspace + FFI skeleton - `cargo check -p ds4-sys` (and empty member crates) succeeds - Header exists; no bindgen of `ds4.h` - No production binary replaced ### Phase 3 — FFI shadow (`ds4-rs` / `ds4-bench-rs` / `ds4-agent-rs`, historical) Same model, same arguments, C vs Rust wrapper around the **same** C core: | Check | Pass | |---|---| | Token output | Fixed-seed sampled C/Rust stdout is byte-identical (`ae12f463...`); post-port greedy stdout is also exact (`a12b7cb4...`). Fixed-seed non-TTY thinking output is exact in both modes (`--think`: 292 bytes, `ad6d107f...`; `--nothink`: 52 bytes, `ae12f463...`). Same-prompt server pair returned `Hi.` / stop / 13+2 | | KV behavior | save/load round-trip matches C (synthetic). Live Rust benchmark restored the 64-token frontier before incrementally syncing to 128; checkpoint sizes were 18,632,800 and 24,556,624 bytes | | Prefill / decode tok/s | Local C/Rust benchmark ABBA is green below; full production-path performance remains pending | | Memory | sequential; C server peak `nvidia-smi` 102833 MiB, Rust server 99077 MiB; teardown + `clear_cache` returned ~115 GiB available | | Agent shadow | `make test-agent-parity` is green: the 7,579-byte built-in prompt, fixed-input datetime message, selected non-TTY projector tapes, both supported DSML openers, and the 393,216-token high-thinking boundary are covered. The release binary links over the existing native core; live generation, transcript token tape, streaming, malformed/in-think DSML, tools, KV, MTP, and distributed paths remain pending | If FFI alone regresses performance, **stop**. Do not port subsystems on a dirty seam. ### Phase 4 — KV store (historical incremental evidence; current gate green) Preserve magic `KVC`, file version `1`, payload ABI `2` (`ds4_kvstore.c`), 48-byte fixed header, endianness, key = rendered byte prefix SHA, eviction and prefix policy, trailer hooks. Hard gate (all four): ```text C save → Rust load Rust save → C load Rust save → Rust load C save → C load ``` No new checkpoint format. The isolated seams are green for metadata-only KVC indexing (including a sparse 4 GiB payload fixture), bounded text-prefix comparison, embedded DSV4 range validation, and a file-backed Rust payload writer. The writer stages the complete stream before eviction, protects a replaced destination, preserves the C-compatible O(trailer) fast path, and produces payload/trailer bytes read exactly by the C oracle. The no-GPU C oracle also proves nonzero seek, exact length, EOF rejection, and `uint64` overflow rejection. The ordinary serial Motif-3 no-think/no-tools slice is now live-green under the policy both servers implement (`cold=0, continued=0`). In `scratch/rust-host-live/rust-kv-no-think-final-IHtJue/`, C and Rust generated the same 301,972,392-byte `5522739e3318261231ec3ddd49a24da9e66a5118.kv`; visible text and payload bytes were exact, apart from volatile header counters/timestamps after reads. All four restart cells returned `RESTORED_OK` with 6,896 cached prompt tokens and 15 new prompt tokens: ```text C save → Rust load PASS Rust save → C load PASS Rust save → Rust load PASS C save → C load PASS ``` Request SHA-256 values were `a765063d149094c6542f42e7156735a8d466cc7f4eab1eac71e0fc40a7cbadbb` (A), `083ab2beb504500ee28dafe0d8184b53d7795d6958712c78b1c045cdf2c3d827` (evict), and `4ae9a992140aa7cd98a7ec0467b299c66ffcb4154c2429ca202239caa8cc9d4b` (restore). The 94,162,541,472-byte GGUF was `Motif-3-MQ87-88-FIT.gguf`. The C binary was `04f25a86040940674984c35160d2e4eec7f6c6d4e30313815ce10309cd57e662` and the Rust four-way binary was `dae70ae2f909fe6c0713a609a285c272db8d1b6ec0e2856a70bd361753625ff4`. The common launch contract was serial (`DS4_SERVER_COALESCE_MAX=1` / `--cont-width 0`), ctx 8192, max output 128, disk budget 2048 MiB, and minimum checkpoint 512 tokens; C additionally set both unimplemented policy knobs to zero. Follow-up `e5830c218361ec2288e98992cd388be1a5a24a04` corrected the Rust timing porcelain so a live Rust cache hit now reports `prefill_tokens=15` and `prefill_cached_tokens=6896`, matching C (post-fix binary `52471e49c4c22bde2f1abb063755847ff5d738da705896e925e8b7468b8ec197`). The initial comparable single cells exposed a real lifecycle regression: C was 879--934 ms TTFT while Rust was 1,590--1,715 ms because the Rust server opened with deferred boot prewarm and never called it. Commit `f4a632e` added the opaque prewarm call after batch placement, preserving C's placement contract. The same model, request C, KVC, serial lane, and cache-clear protocol then gave: ```text C 880.9 ms Rust 836.0 ms Rust 860.4 ms C 897.5 ms ``` C mean was 889.2 ms and Rust mean 848.2 ms (-4.61%), so the scoped restore TTFT gate is green. All four cells returned `RESTORED_OK`, 6,896 cached tokens, and 15 computed tokens. Commit `4fc8ef4` then matched C's reported prefill timing scope (computed suffix sync only): live Rust was 69.2 tok/s versus C 68.2--69.0, with TTFT still 840.4 ms. The ABBA binary SHA-256 was `00da345a5e09887d82b514c80b4674aa37311e0903ad50ff9cae82b1db3a34b3`; the timing-scope binary was `ea714d4d7ae4e2618bf052aa842d40e290cd978ac404ac1f39aa15f5d76779f9`. The C-default ordinary cold slice (`cold_max=30000`, trim 32, align 2048) is live-green for this fixture under `scratch/rust-host-live/rust-cold-default-0IeCd9/`. For the 6,782-token Motif fixture, both hosts selected the same 6,144-token prefix. The rendered text SHA-256 was `ebd540ec7d9b9059649a1066c222dae4b02ca54bed54570da6fda0b81fd66f5e` and the payload SHA-256 was `0f0af1d1e189561aee24534cb4918bc292ef68a418522a51e615ac0bfade5862` for both C and Rust. Rust→Rust, Rust→C, and C→Rust restart cells restored the prefix and emitted the same 106-token output (`49b5f8a8b7c4e3aa2f768fd3afd29ad33a1d2cc327fe0361a0cd6d2c21afcdd9`) at 2,038.4/2,078.9/2,018.0 ms TTFT. Header timestamps and hit counters remain intentionally volatile; the text and payload bodies are exact. These cells are a correctness/cross-read gate, not a cold-policy ABBA performance claim. The ordinary serial continued final-sync call/order is CPU-green, while the decode frontier is live-green under `scratch/rust-host-live/continued-fourway-oJTYrf/`. C and Rust used ctx 8,192, `cold=0`, `continued=6800`, trim 0, align 1, and request A (`a765063d...`). Both wrote `411e439f9951c2df3addaa93e73cabee465bf0b2.kv`, 300,423,338 bytes, reason 2, ext 0, model 3, tokens 6,800, ctx 8,192. The rendered-text SHA-256 was `025231236a8afc77532eeecdb6ea16b3f94b51456641e29224438813605764ae` and payload SHA-256 was `be4d59a936d236809bfeae3953408b067df3a5dac86212b85df21ecf98550838` for both hosts; their 114-token answer was exact. The first restart fixture was intentionally retained as a negative oracle: Motif live generation contains ``, while a closed no-think assistant history drops that empty pair in both C and Rust. It therefore misses the record by construction. The positive fixture prepends the same empty pair to the assistant replay (SHA-256 `6bbd72ee...`) so its rendered bytes preserve the live KVC prefix. Four isolated/cross-host loader cells then passed: ```text C save → Rust load PASS cached=6800 computed=111 output=4 Rust save → C load PASS cached=6800 computed=111 output=4 Rust save → Rust load PASS cached=6800 computed=111 output=4 C save → C load PASS cached=6800 computed=111 output=4 ``` All returned `RESTORED_OK` with semantic response SHA-256 `f61bf763...`. The C binary was `04f25a86...`; the live-tested Rust binary was `beadabe4...`. The subsequent cheap-frontier build `42a1ddfb...` removes the non-due token-vector copy and passed the full CPU/parity/link gates; it did not need another 100 GiB live matrix because checkpoint bytes and ordering are unchanged. Teardown and `clear_cache` ran between resident models, and the final host had no compute application or listener. These cells prove decode-frontier continued correctness and cross-read; the final-sync call/order is covered by the CPU integration test. Neither is a performance gate. The scoped ordinary-serial DeepSeek tool-map slice is live-green under `scratch/rust-host-live/tool-fourway-20260825/` at `cc1bf0f`. The producer fixture used OpenAI Chat, no-think, `pair_values(a: integer, b: integer)`, and asserted `finish_reason=tool_calls`; literal `tool_choice=required` was not used because that path ends in the same tool parse error on the C oracle. C and Rust both sampled arguments `{"a":1,"b":2}` with 365 prompt + 59 output tokens, then an unrelated `EVICT_OK` request saved the live state. Both hosts wrote a 25,851,198-byte record named `29cf875c11df369237f528cb8155b8d1979f5b32.kv`: reason 3, ext flags 1, model 0, payload ABI 2, 424 tokens, 1,913 text bytes, 25,848,936 payload bytes, and a valid one-entry 297-byte `KTM\x01` trailer. The rendered-text SHA-256 is `20e492de0058ac24efd1bc22b72b7467caad69d7cec8d3d0468b1bde2ddb7c11` and the payload SHA-256 is `f427f9263acf8316bf9bd9de03467a52cb77909ae16882e5316148f33cbf9c8e` for both producers. The 244-byte sampled DSML occurs in the checkpoint text and in each trailer. The trailers differ only in the process-unique tool ID; header timestamps are run-specific: `call_361e9fbdea60bfa15a23be22020fede1` for C and `call_aefef96b236c98f22ce68ef16d907c57` for Rust. Each loader ran in a fresh process against an isolated copy of the selected record. Its assistant-history arguments were deliberately reordered to `{"b":2,"a":1}`, so a canonical re-render cannot match the saved prefix without KTM restoration: ```text C save → Rust load PASS cached=424 computed=28 output=5 TTFT=436.9 ms Rust save → C load PASS cached=424 computed=28 output=5 TTFT=493.1 ms Rust save → Rust load PASS cached=424 computed=28 output=5 TTFT=435.8 ms C save → C load PASS cached=424 computed=28 output=5 TTFT=485.8 ms ``` Every cell returned `RESTORED_OK`, finish `stop`, prompt tokens 452, `prefill_cached_tokens=424`, and the serial OpenAI Chat route. C binary SHA-256 was `04f25a86040940674984c35160d2e4eec7f6c6d4e30313815ce10309cd57e662`; Rust binary SHA-256 was `6e920f1d46e79ac5f733ce3243c5b1799091d80f885d57025d0fb143bf6975ef`. The complete process was sequential; every resident exited before `clear_cache`, and the final host had no GPU compute application. #### Intermediate-prefill continued checkpoint The scoped DeepSeek ordinary-serial gate is live-green under `scratch/rust-host-live/intermediate-prefill-fourway-40gDCF/` at `8361116`. The deterministic OpenAI Chat/no-think producer request SHA-256 is `efecb01d300f7e4f0e67420a7e9ce3be286d9665d716c55662aaa67e0ce79fd7`: 6,778 raw user tokens plus four chat-framing tokens made a 6,782-token prompt. With ctx 8,192, `cold=0`, `continued=4096`, trim 0, and align 1, the 4,096 frontier is reached inside prefill and the final prompt plus output stays below the next 8,192 frontier. Both producers returned `PREFILL_OK`, finish `stop`, and the serial route. C and Rust wrote the same `af7f4f7b6cc1a33c0ca93d55f7dc11bb08c0c507.kv`: ```text size: 41,956,589 bytes reason/ext: 2 / 0 model/ABI: 0 / 2 tokens/ctx: 4,096 / 8,192 text/payload: 14,617 / 41,941,920 bytes text SHA-256: 2dfc39c82411c86cadeabdfc517d0450054a0cba7c32bf4afb2b5f197dea9384 payload SHA: 00d8719acee5341f3e92feb45347a43fa41d11f0102148c1775feffcdd318f1c ``` Each loader was a fresh process with an isolated copy of that one record and `continued=0`. The loader request SHA-256 is `6f29e35888928f2ac2228046695f3859c2c0d816301e6574c56bcb5e3beb3443`: ```text C save → Rust load PASS cached=4096 computed=2686 output=5 TTFT=3642.8 ms Rust save → C load PASS cached=4096 computed=2686 output=5 TTFT=3656.3 ms Rust save → Rust load PASS cached=4096 computed=2686 output=5 TTFT=3644.0 ms C save → C load PASS cached=4096 computed=2686 output=5 TTFT=3729.4 ms ``` All cells returned `RESTORED_OK`, finish `stop`, prompt tokens 6,782, matching prefill usage/timing counts, and the serial route; normalized semantic SHA-256 is `7f0f6d75bd5f83e33fbd25eb224ced322825960f7e94a9467eca8ce71a125dcd`. The 86,720,111,488-byte DeepSeek V4 Flash IQ2XXS/w2Q2K model was shared. Its SHA-256 is `ca22ae2f838e14077c22bc1c1417b71b45b5e5a3687bd96c2ac6e17fdb6261c0`. C binary SHA-256 was `04f25a86040940674984c35160d2e4eec7f6c6d4e30313815ce10309cd57e662`; Rust binary SHA-256 was `3fd0e40320d06eae6891c5399fe622df16b9dfdfa081d92dd1df1519ff003736`. Every resident exited before `clear_cache`; final inspection found no GPU compute application or listener and 117 GiB available. This is a correctness and cross-read gate, not an ABBA performance claim, and it does not itself cover Motif/Solar callback semantics or the separately green width-1 bank lane. #### Width-1 continuous-bank shutdown checkpoint The scoped Motif-3 OpenAI Chat, no-think/no-tools bank lane is live-green under `scratch/rust-host-live/bank-fourway-20260825-093322/`. `e9dfd77` exposes opaque native bank snapshots and bounded payload save/load, `0e4a178` adds the strict-suffix bank candidate, and `15b016c` owns width-1 host metadata/policy, warm/disk admit, retirement, checkpoint/evict/shutdown persistence, and graceful shutdown ordering. CPU/oracle/link gates at that commit were `make test-kv-parity` (38 unit + 11 cross-language), `make test-server-parity` (88 unit + all integration matrices), and `make ds4-server-rs`. The native rolling scheduler and opaque bank payload remain C. The live fixture used the 94,162,541,472-byte `Motif-3-MQ87-88-FIT.gguf`, ctx 8,192, max output 128, temperature 0, thinking disabled, no tools, disk budget 2,048 MiB, minimum checkpoint 512, `cold=0`, `continued=0`, and `DS4_SERVER_BANK_CHECKPOINT=0`. The C oracle allocated two banks while Rust used `--cont-width 1`; every cell admitted one request into bank 0, so this is not multi-bank evidence. Producer and loader request SHA-256 values were `a765063d...` and `14042672...`. C and Rust graceful-shutdown producers wrote the same `3faf064c1bf3e92ef70f356f5c1c7baeb0dd62bc.kv`: ```text size: 301,972,407 bytes reason/ext: 8 / 16 (bank-shutdown / EXT_BANK_REPLAY_V1) quant/model: 2 / 3 tokens/ctx: 6,896 / 8,192 text/payload: 24,591 / 301,947,764 bytes trailer: 0 bytes text SHA-256: bb9a55e900337c73272f430fc3b66efa01966e6ba70fe31ec01a4e60aea9856c payload SHA: df417b44399e62795a644431dafa537c5780a5753ab4d193d73f4c43208044c2 ``` Each loader was a fresh process with an isolated copy of the selected record: ```text C save → Rust load PASS cached=6896 computed=15 output=4 Rust save → C load PASS cached=6896 computed=15 output=4 Rust save → Rust load PASS cached=6896 computed=15 output=4 C save → C load PASS cached=6896 computed=15 output=4 ``` All four returned `RESTORED_OK`, finish `stop`, prompt tokens 6,911, and the continuous OpenAI Chat route. The C binary SHA-256 was `04f25a86...`; the Rust four-way/ABBA binary was `287c821a...` at `15b016c`. The same C-produced bank record then drove a 114-token C→Rust→Rust→C restore ABBA. The request SHA-256 was `d68b6990...`, and all completion text was exact (`faf7c021...`): | Cell | Prefill tok/s | Decode tok/s | TTFT ms | Device census GiB | |---|---:|---:|---:|---:| | C #1 | 76.0 | 14.9 | 375.0 | 99.15 | | Rust #1 | 76.4 | 14.8 | 388.4 | 98.82 | | Rust #2 | 76.1 | 14.7 | 387.4 | 98.82 | | C #2 | 76.1 | 14.9 | 398.7 | 99.15 | C/Rust means were 76.05/76.25 tok/s prefill, 14.90/14.75 tok/s decode (-1.01%), and 386.85/387.90 ms TTFT (+0.27%), inside the provisional gate. Peak host RSS was not captured, so this is not full memory-performance closure. Commit `98d81b9` then passed native continuous decode duration/token/step through the opaque callback; CUDA execution and bank behavior did not change. Its bridge/core/server/KV/link gates are green. A post-fix C→Rust short loader cell used Rust binary `6c25d952...` and returned `RESTORED_OK` with cached/computed/output 6,896/15/4, 12.3 decode tok/s, and 1.25 tok/step. That matches the C loader cells' 12.0--12.1 tok/s and 1.25 tok/step and closes the short-response timing-porcelain discrepancy. The 114-token ABBA was not repeated after this timing-only commit; its `15b016c` binary provenance remains explicit above. At that historical snapshot this was not the whole Phase 4 gate. Live default configured 10,000-token/effective aligned 10,240-token reason-bank-checkpoint, live reason-bank-evict, full default-policy ABBA, multi-bank fork/partial and pin/claim behavior, bank tool/thinking/extension integration, other families and surfaces, and peak host-RSS/soak evidence remain pending. Intermediate-prefill and tool-map replay retain their separately scoped limitations above. ### Phase 5 — web utility Resource ownership (`OwnedFd`, `TcpStream`, `Child`, `Vec`) without changing the subprocess/search contract. No Tokio. ### Phase 6 — distributed Explicit integer codecs. Wire bytes match C. Do not serialize `#[repr(C)]` Rust structs. Runtime is production-integrated through blocking Rust coordinator/worker orchestration: CLI/route, HELLO/WORK/RESULT, receive prefetch, hop relay, reconnect, and snapshot gather/scatter ordering are host-owned. Layer-slice evaluation and opaque GPU snapshot bytes stay native. ### Phase 7 — server shadow `route_decide` + `request_compute_needs` are the routing oracle. The HTTP door (reader, native error envelopes, schema-format refusal, `/v1/models` porcelain), the four JSON parsers (chat / completion / Anthropic / Responses, tokenize/render cut off), the four tape stream projectors plus buffered finals and incremental live DSML tool stream (OpenAI + Anthropic; Responses has no incremental tool stream in C), enqueue/shed + job-id mint, the host-owned `/metrics` `/v1/stats` porcelain including the memgov census format (live CUDA census + observation via `ds4_bridge_mem_*_snap` when an engine is open; absence-not-zero when unsupported), family render including tool-schema / invoke reconstruct (DSML / Motif / EXAONE / dots3 / Solar C oracle), NULL-handle tokenize/sample FFI, the serial decode driver (scripted tape, no GGUF), generated-message tool parse (DSML / Hermes / dots3 / Solar C goldens), SemAccum stop / no-tools cut / DSML `tool_calls` verdict, and finalize `tool_calls` / `tool_use` wire, the Inc 5a/5b/5c continuation registry (publish / resolve / hold / pin / TTL / bank claim + serial 503/409), and corrective recovery retry (`decode_again` / model-visible tool error + tag-completion repair) are `make test-server-parity`. The loaded-engine shadow now accepts and parses in client threads, then routes jobs through a bounded FIFO to one non-`Send` inference owner. Stable continuation pins, queue-inclusive TTFT, ordered terminal publication, nonblocking bounded sends, real TCP disconnect, slow-reader, and exactly-once settlement regressions are green at `6545d44` (`make test-server-parity`). Live Motif generate: content/finish/usage-count/`cache_write_tokens` match. Live CUDA census: `census_supported=1` epoch=1636 weight_artifact 86.07 GiB (`scratch/rust-host-live/`). Serial buffered responses emit a C-shaped `timings` object. Live serial/continuous/static routing, width-2 barriers, multi-bank fork/partial/evict/shutdown, four surfaces, tool/continuation/KV extensions, disconnect/slow-reader handling, and the smoke/long/OPP-C proof harness are green in the current 60-cell matrix. Qwen additionally covers image requests, MTP, exact/configured 262K, and the two-hour soak. Do not improve the table. All four surfaces: ```text POST /v1/chat/completions POST /v1/completions POST /v1/messages POST /v1/responses ``` plus `/v1/models`, `/v1/stats`, `/metrics`. Preserve ID formats (including the documented Anthropic `chatcmpl-N` quirk), `finish_reason` mapping, native error envelopes, stream event order, continuation / trust-domain semantics, chunked bodies, typed schema-format refusal (v0.6.3). Replay the `ds4_test --server` fixture inventory listed in the API matrix. Live gates follow that document, not byte dumps. ### Phase 8 — `ds4.c` leaves | Slice | Gate | |---|---| | Model metadata | enum/shape values match `g_ds4_shape` / catalog — **green** (`make test-catalog-parity`) | | GGUF catalog | mmap; no full-file `Vec`; first-shard `split.count` identity — **green** on synthetic v3; host `weights_bind` name catalog + bind-plan check/match + host tensor-dir apply (skip `parse_tensors` when installed) + host `config_validate` / apply shape+compress (skip C validate when installed) + host bind map (skip C name walk when installed) + host `weights_validate_layout` (skip C main-model layout when bind map installed) + host MTP/DSpark sibling name/layout catalogs + sibling BindPlan resolve/validate + sibling bind map FFI (native swaps the sibling map around its own open+bind window and skips that sibling's C layout check; live DSpark drafter 81/81 + Rust `--dspark` decode green) + host-table clear before sibling `model_open` green; sibling pointer assignment / CUDA upload still native | | Tokenizer | encode/decode/special/template/stop exact token ids — **green** on synthetic GGUF (`make test-tokenizer-parity`); family chat transcript framing is exact for DeepSeek, Motif-3, Solar Open2, EXAONE, and Dots3 across none/low/high/max think modes, with byte payload and malformed-control errors covered; host vocab apply (skip C `vocab_load` when installed) + `Model` host tokenize green; live Motif specials + encode `hi`→8320 | | Session | ownership + sync/eval/rewind/payload — **ledger + DSV4 prefix green** (`make test-session-parity`: rewrite/prefix/plan/rewind/generation + header/token tapes); GPU/logits tail / CUDA eval still native | | Backend dispatch | CUDA path unchanged; no extra dynamic dispatch on the hot path | ### Proof harness (any phase that can touch CUDA execution) ```text make proof-cuda-smoke make proof-cuda-long make proof-cuda-opp-c make proof-rust-cuda-opp-c ``` `proof-cuda-opp-c` remains the native-drift gate against a tracked golden. A persisted `CUDA_ARCH=sm_121` build selects the GB10 snapshot validated against the `v0.6.5-dfm`/Qwen C cut; the older v0.6.3 snapshot is retained under its own namespace. Other builds keep their original generic snapshot and require separate architecture approval. `proof-rust-cuda-opp-c` is the separate host-parity gate: it writes a temporary snapshot with the current C oracle, then checks the Rust binary through the same stable runner path. Its artifacts remain under `/tmp/ds4_proof/proof-rust-cuda-opp-c.*` for audit; it does not rewrite or replace either tracked native golden. Both OPP-C gates must be green before the Rust execution path becomes default. Long-context captured-vs-eager stays a release gate. ### Phase 9 / split See work instruction §26. `SPLIT_READINESS.md` is now green because Runtime, Correctness, Performance, and Architecture (unsafe confined to reviewed FFI/native/OS adapters) passed the current audit. ```bash rg -n 'unsafe \{' crates/ ``` Almost every hit must sit in `crates/ds4-sys` or a native adapter. ## Family regression set (must stay green) Makefile variables, not flags: | Family | Targets | |---|---| | Motif-3 | `test-motif3-{loader,reference,tokenizer,cuda,resident,batch}` | | Solar | `test-solar-{loader,tokenizer,forward,session,kda,kda-prefill,kda-chunk,gates,kv}` | | K-EXAONE | `test-exaone-{ref,kernels,batch}` | | dots3-note | `test-dots3-{loader,tokenizer,resident}` | | Qwen3.8 Flash Next | `test-qwen4exp-{loader,tokenizer,ple,ple-cuda,primitives,hc-forward,ple-compute,qsa,qsa-forward,moe,moe-forward,gdn,gdn-forward,batch}` on Q5+Sidecar | | Shared | `test-model-family-kernels`, `test-mmq-parity` | Resident tests load real weights. Use tmux + workspace-local `../scripts/guarded-run.sh` (outside this repository). One resident model at a time. ## Performance protocol Same host, same artifact, clocks recorded. Minimum order: ```text C → Rust → Rust → C ``` or ABBA. Publish SHA + GGUF identity + command/env with the numbers. Unexplained 2–3% is a fail even if it sits inside the provisional percent table. ### Recorded ABBA (2026-08-31, Qwen Q5+Sidecar) Candidate `6ca85c8`, C Qwen cut `4d40d97`, Q5 three-shard main GGUF plus the shared four-file SSD-PLE Sidecar, ctx 196,608, two banks, prefill chunk 8,192, embedded MTP draft 2, temperature 0. Every cell used a fresh owner/worker pair; C and Rust were never resident together, and `clear_cache` ran only after both PIDs exited. All text cells returned the same 64-token output (SHA-256 `3ab21f93...`): | Cell | Prefill tok/s | Decode tok/s | TTFT ms | Worker VmHWM KiB | Worker GPU MiB | |---|---:|---:|---:|---:|---:| | C #1 | 519.7 | 14.4 | 7,954.7 | 1,852,404 | 23,471 | | Rust #1 | 518.6 | 14.5 | 8,044.9 | 1,933,444 | 23,471 | | Rust #2 | 518.8 | 14.4 | 8,041.3 | 1,929,004 | 23,471 | | C #2 | 518.0 | 14.5 | 7,979.9 | 1,847,240 | 23,471 | Rust/C means were 99.97% prefill, 100.00% decode, +0.95% TTFT, +4.40% worker VmHWM, and identical GPU residency. All four image cells returned `MEN WALK ON MOON` (SHA-256 `991530ac...`); Rust/C means were 100.20% image prefill and +0.32% image TTFT. The six-token image decode sample is not used as a performance gate. ### Recorded ABBA (2026-08-24, cross-lane) Host SHA `9463b3c` (+ scratch runner `scratch/rust-host-live/abba.sh`), GGUF `Motif-3-MQ87-88-FIT.gguf`, ctx 8192, cold 6782-token prompt, 114 decode tokens, temp 0, thinking disabled, sequential loads with teardown + `clear_cache` between cells: | Cell | Lane | prefill tok/s | decode tok/s | ttft ms | peak GPU MiB | |---|---|---|---|---|---| | C #1 | continuous | 633.4 | 14.8 | 10755 | 112145 | | Rust #1 | serial | 579.8 | 15.4 | 11834 | 102357 | | Rust #2 | serial | 577.5 | 15.5 | 11877 | 102357 | | C #2 | continuous | 633.0 | 14.8 | 10780 | 114529 | All four completions are byte-identical greedy text (SHA1 `4d34f24352e7`) — the Token axis passes across hosts and lanes. Pair spreads are ≤0.4%. The −8.6% prefill / +4.4% decode delta was attributed to the lane difference and re-measured after the continuous port (below). ### Recorded ABBA (2026-08-24, same lane: both continuous) Same protocol, `ds4-server-rs --cont-width 2` routing `openai_chat_continuous`, all four completions byte-identical (same SHA1 `4d34f24352e7`): | Cell | Lane | prefill tok/s | decode tok/s | ttft ms | |---|---|---|---|---| | C #1 | continuous | 579.2 | 14.9 | 11767 | | Rust #1 | continuous | 590.8 | 14.8 | 11521 | | Rust #2 | continuous | 592.9 | 14.7 | 11480 | | C #2 | continuous | 633.9 | 14.9 | 10751 | Rust pair spread 0.4%; the C pair spread is 9.0% (579/634 — the cross-lane run's C pair sat at 633.4/633.0), so the −2.4% Rust mean prefill delta is inside the C cell noise; decode is within 1%. No unexplained regression. At that recorded snapshot Rust continuous still had one active job: client ingress is concurrent behind the FIFO, but the sole owner runs each job to completion. The rolling scheduler, bank admit, per-seq eos, and engine usage split are the same native path; live multi-client width and the Anthropic/Responses cont promotion are follow-ups. ### Recorded ABBA (2026-08-24, local benchmark shadow) Host commit `a9ba7b38cbf683f03c21e2604e055356ec2a2ad2` (`v0.6.3-dfm`), NVIDIA GB10, driver 610.43.02, CUDA 13.3. C binary SHA-256 `3c0af3d1d860cf3d2800261d51e729c3ca96aae3d048551ed721ed717aed0f8c`; Rust binary SHA-256 `a66d97c48755af0e54178c57a5d70765019eade45cb9a038ccfd5615c940dae3`. Model artifact: `DeepSeek-V4-Flash-IQ2XXS-w2Q2K-AProjQ8-SExpQ8-OutQ8-chat-v2-imatrix-0731.gguf` (86,720,111,488 bytes; model label `DeepSeek V4 Flash`, revision label `0731-chat-v2`, quant label `IQ2XXS-w2Q2K-AProjQ8-SExpQ8-OutQ8`). Order was C → Rust → Rust → C with teardown and `clear_cache` between cells. Both binaries used the same raw prompt, frontiers 1024→2048, `ctx_alloc=2081`, 32 decode tokens, width 1, and default packed FP8 KV + FP4 index; no `DS4_*` override was set. Logs and CSVs are under `scratch/rust-host-live/bench-abba-20260824/`. ```bash $BIN --cuda -m "$MODEL" --prompt-file tests/long_context_essay_prompt.txt \ --ctx-start 1024 --ctx-max 2048 --ctx-alloc 2081 --step-incr 1024 \ --gen-tokens 32 --csv "$CELL.csv" ``` | Cell | Frontier | Prefill tok/s | Decode tok/s | Steady decode tok/s | First decode token s | Host max RSS KiB | KV bytes | |---|---:|---:|---:|---:|---:|---:|---:| | C #1 | 1024 | 838.58 | 22.78 | 22.94 | 0.0531 | 8,972,888 | 28,482,336 | | C #1 | 2048 | 945.37 | 23.10 | 23.10 | 0.0433 | 8,972,888 | 32,968,864 | | Rust #1 | 1024 | 850.48 | 22.83 | 22.96 | 0.0517 | 9,024,668 | 28,482,336 | | Rust #1 | 2048 | 953.26 | 23.10 | 23.10 | 0.0433 | 9,024,668 | 32,968,864 | | Rust #2 | 1024 | 845.62 | 22.88 | 23.01 | 0.0518 | 9,025,144 | 28,482,336 | | Rust #2 | 2048 | 954.29 | 22.93 | 22.92 | 0.0433 | 9,025,144 | 32,968,864 | | C #2 | 1024 | 843.66 | 22.91 | 23.06 | 0.0523 | 8,972,584 | 28,482,336 | | C #2 | 2048 | 947.30 | 23.10 | 23.11 | 0.0439 | 8,972,584 | 32,968,864 | Rust/C mean ratios were 100.82% / 100.79% prefill and 100.04% / 99.63% decode at the two frontiers. Rust host max RSS was +0.58%; KV bytes matched exactly. This passes the Phase 3 FFI-overhead thresholds. GPU resident peak was not sampled, so this is not the full pre-split performance gate. ## Status of this matrix The superseded subsystem status is available as an [archived snapshot](https://github.com/Baekpica/ds4-dfm-rs/blob/ac750d61ef0306d30cc595081883f61ec847c3d8/docs/rust-migration/STATUS.md). Current release gates belong in the [v0.1.0 ledger](../releases/v0.1.0.md).