# Phase C+22 re-validation (2026-05-18) ## Protocol followed Cold-vs-cold per reading-error #31 + #32 + #33 + the new #34. 1. ✓ Backed up both canary cache locations (`xenia-canary/build-cross/bin/Windows/Debug/cache/` and `~/.local/share/Xenia/cache/`) to tarballs. 2. ✓ Wiped both canary caches + ours's (`~/.local/share/xenia-rs/cache/`). 3. ✓ Cold-ran ours (50M instructions) against the `.iso` path — NOT the loose `default.xex` (per new reading-error #34). 4. ✓ Cold-ran canary (90s timeout) against the `.iso` path with `--mute=true`. 5. ✓ Truncated canary log to first 250k events per tid (keeping ALL tids, NOT only tid=6 — needed for the C+18 / C+21 cross-tid shared-global heuristic). 6. ✓ Ran `diff_events.py` with full tid map `6=1,7=2,4=11,12=7,14=9,15=10`. 7. ✓ Restored both canary cache backups. ## Determinism check - ours-cold byte-identical to C+19 archive (`audit-runs/ phase-c19-NtDuplicateObject-handle-create/ours-cold.jsonl`): 121,569 events match post-normalization (host_ns and guest_cycle excluded). Reproduces deterministically. - No new engine source changes, so digest unchanged. Phase B `image_loaded_sha256 = ea8d160e9369328a5b922258a92113efb8d 7ce3e1a5c12cc521e375985c91c18` preserved. ## Gate matrix (escalation mode) | gate | result | |---------------------------------------------|-------------------| | Engine source unchanged | PASS | | Diff-tool source unchanged | PASS | | Phase A schema version 1 unchanged | PASS | | ours-cold byte-equivalent to C+19 archive | PASS (121,569 ev) | | Main matched-prefix preserved at C+21 | PASS (104,607) | | Sister chains preserved (11/32/3/41/16) | PASS | | C+21 absorber engaged (validation) | PASS (2/0 wait) | | C+18 absorber engaged (validation) | PASS (1/0 create) | | Phase B image hash preserved | PASS | | Canary caches restored | PASS | | Reading-error #34 documented + reproducible | PASS | | Tests count (no change) | 204 (unchanged) | ## What changed in the diff-tool report compared to C+21 baseline NOTHING substantive. The numbers are identical: | chain | C+21 (jitter-1) | C+22 (fresh c22) | |-----------------------------|-----------------|------------------| | tid=6→1 | 104,607 | 104,607 | | tid=4→11 | 11 | 11 | | tid=7→2 | 32 | 32 | | tid=12→7 | 3 | 3 | | tid=14→9 | 41 | 41 | | tid=15→10 | 16 | 16 | | main floating_create (c/o) | 0 / 0 | 1 / 0 | | main floating_wait (c/o) | 1 / 0 | 2 / 0 | The floating counts vary across canary cold samples (different host-scheduler interleavings emit the wait.begin in different counts and at different indices) but the matched-prefix is constant — this is the C+21 fix working as designed. ## Outcome - C+22 = ESCALATION (no engine change). - Cold-vs-cold environment is healthy and reproducible. - C+21 absorber works correctly under varying contention. - Reading-error #34 added as a methodology guard for future cold-vs-cold runs. - Next-target list updated: C+23 = D-NEW-2 (independent ε-class), C+24 = D-NEW-3 (XAudio), parallel scheduler- determinism track.