# Phase C+25 — Re-validation ## Gates | # | Gate | Status | Evidence | |---|---|---|---| | 1 | Build clean | ✅ | `cargo build --release` succeeds; only pre-existing dead-code warning. | | 2 | Phase B `image_canonical_sha256` unchanged | ✅ | Zero engine LOC modified → Phase B hash is `ea8d160e…` by construction. | | 3 | Engine determinism (3× cold) | ✅ | `c25-digest-rep{1,2,3}.json` all identical: instructions=50000007 imports=40390 unimpl=0 draws=0 swaps=1 unique_render_targets=0. | | 4 | Main matched-prefix advances past 105,112 | ✅ | **105,112 → 105,128 (+16)** — see `diff-postfix.md`. | | 5 | Sister chains preserved | ✅ | 4→11=11, 7→2=32, 12→7=4, 14→9=41, 15→10=16 — all unchanged vs Phase W. | | 6 | Kernel tests pass | ✅ | xenia-kernel: 217 passed, 0 failed (unchanged baseline). | | 7 | Diff-tool unit tests pass | ✅ | 39 baseline + 4 new C+25 tests = 43 PASS. | | 8 | `--no-canonicalize-allocators` backward-compat | ✅ | Flag unchanged; raw-VA comparison still available. | | 9 | Progression metric — **PRIMARY gate** | ⚠️ **NEGATIVE** | swaps=1, draws=0, unique_render_targets=0. **Wedge persists per Phase W finding.** | ## Per-chain matched-prefix delta | chain | Phase W (pre) | C+25 (post) | Δ | |---|---|---|---| | canary tid=6 → ours tid=1 (main) | 105,112 | **105,128** | **+16** | | canary tid=4 → ours tid=11 | 11 | 11 | 0 | | canary tid=7 → ours tid=2 | 32 | 32 | 0 | | canary tid=12 → ours tid=7 | 4 | 4 | 0 | | canary tid=14 → ours tid=9 | 41 | 41 | 0 | | canary tid=15 → ours tid=10 | 16 | 16 | 0 | Zero regressions on any chain. ## Progression metric (PRIMARY) 3 cold reproducible runs: | field | rep1 | rep2 | rep3 | vs Phase W | |---|---|---|---|---| | instructions | 50000007 | 50000007 | 50000007 | unchanged | | imports | 40390 | 40390 | 40390 | unchanged | | unimpl | 0 | 0 | 0 | unchanged | | **draws** | **0** | **0** | **0** | **unchanged** | | **swaps** | **1** | **1** | **1** | **unchanged** | | **unique_render_targets** | **0** | **0** | **0** | **unchanged** | | shader_blobs_live | 0 | 0 | 0 | unchanged | | texture_cache_entries | 0 | 0 | 0 | unchanged | **Verdict: matched-prefix advanced (+16) but the wedge is structurally unchanged.** This is the expected outcome per cascade-prediction gate E (~10% probability of movement). The C+25 fix is a diff-tool canonicalization, not an engine behavior change; the engine's boot trajectory is byte-identical to Phase W (digest fields prove it). The next divergence at idx 105,128 (`thread.create.ctx_ptr`: canary `0xbe56bb3c` in vC0… heap region vs ours `0x42453b3c` in unified heap) is another deferred-Path-β symptom — a heap-VA leaking into a non-return payload field. Canonicalization could be extended to cover specific payload fields too, but that's a follow-up scope decision. ## Determinism note The engine binary is `xrs-c25` (renamed from `xrs-verify-c23`; built from the same source tree, which is unchanged by C+25 since the C+25 diff is Python-only). All 3 cold runs used `XENIA_CACHE_WIPE=1` and produced identical digests, confirming the engine's cold-boot trajectory is the same as Phase W's `73e99d6002…`-class run.