# Phase C+2 — re-validation ## Gate 1 — Determinism (cvar-OFF) 3 fresh runs of `xrs-phaseC2 check -n 50000000 --stable-digest --out …`: | run | digest md5 | |-----|------------| | 1 | 608d8e8d293250698207a7d8fc0c18df | | 2 | 608d8e8d293250698207a7d8fc0c18df | | 3 | 608d8e8d293250698207a7d8fc0c18df | | Phase C+1 baseline | 608d8e8d293250698207a7d8fc0c18df | **Result**: ✅ byte-identical to C+1 baseline. Expected: this session only modified `tools/diff-events/diff_events.py` (Python diff tool); zero ours engine code touched. ## Gate 2 — Phase B `image_canonical_sha256` Not re-snapshotted. Inferred OK by Gate 1 (no image-loading or memory- layout code modified). ## Gate 3 — Phase A matched-prefix extension (THE KEY METRIC) Re-ran the existing capture pair (canary from `phase-c-first-divergence/ phase-a/canary.jsonl`; ours from `phase-c1-keQuerySystemTime/ours.jsonl`) through the upgraded diff tool. No fresh engine runs needed — diff tool change is comparison-side only. | chain | C+1 matched (pre-canonicalize) | C+2 matched (post-canonicalize) | Δ | |-------|--------------------------------|--------------------------------|----| | canary tid=6 → ours tid=1 (main) | 161 | **102014** | **+101853** | | canary tid=4 → ours tid=11 | 5 | 5 | 0 | | canary tid=7 → ours tid=2 | 2 | 2 | 0 | | canary tid=12 → ours tid=7 | 2 | 2 | 0 | | canary tid=14 → ours tid=9 | 11 | 11 | 0 | | canary tid=15 → ours tid=10 | — (no div) | — (no div) | 0 | **Main thread matched prefix: 161 → 102014. Gate 3 ✅** (strictly greater than 161, as required). The new divergence at idx=102014 on tid=6→tid=1 is `RtlImageXexHeaderField` returning `805433576` (`0x3001F0E8`) in canary vs `0` in ours — the next Phase C+3 target. Off-thread divergences (tid=4/7/12/14) are unchanged by this fix because their divergences are not allocator-related. ## Gate 4 — Build No engine build required (Python tool only). `python3 -c 'import xenia-rs.tools.diff-events.diff_events'` not applicable (script, not package). The tool runs end-to-end on three input pairs (validation checks below) without traceback. ## Gate 5 — Phase A determinism (emitter) Emitter unchanged. The Phase A capture files used as input are byte- identical to those used in C+1 (no re-emit). Gate vacuous; recorded N/A. ## Gate 6 — Backward compatibility (diff-tool flag) ``` python3 diff_events.py --no-canonicalize-allocators \ --canary ...canary.jsonl --ours ...c1-ours.jsonl ``` Result table: | canary_tid | ours_tid | matched | canary_total | ours_total | first_divergence_at | |---|---|---|---|---|---| | 4 | 11 | 5 | 47573 | 9 | 5 | | 6 | 1 | 161 | 329948 | 108492 | 161 | | 7 | 2 | 2 | 29 | 33 | 2 | | 12 | 7 | 2 | 6689 | 3 | 2 | | 14 | 9 | 11 | 1371603 | 75 | 11 | | 15 | 10 | 15 | 863209 | 15 | — | **Matches the C+1 pre-fix table byte-for-byte. ✅** The new flag reproduces the legacy behavior exactly. ## Gate 7 — Self-diff sanity (no false positive) ``` python3 diff_events.py --validate-identical \ --canary phase-a-diff-harness/canary-sanity.jsonl \ --ours phase-a-diff-harness/canary-sanity.jsonl exit code: 0 ``` A stream diffed against itself reports zero divergences. The canonicalization is *idempotent under self-diff* — both sides assign the same ordinals on the same stream, so the sentinels match. ✅ ``` python3 diff_events.py --validate-identical \ --canary phase-c1-keQuerySystemTime/ours.jsonl \ --ours phase-c1-keQuerySystemTime/ours.jsonl exit code: 0 ``` ## Summary | gate | result | |---|---| | 1. cvar-OFF determinism (3 ours runs vs C+1 baseline) | ✅ all 4 = `608d8e8d…` | | 2. Phase B `image_canonical_sha256` | ✅ (inferred from gate 1) | | 3. Phase A main matched prefix > 161 | ✅ **161 → 102014** (+101853) | | 4. Build clean | ✅ (Python only) | | 5. Phase A determinism | ✅ (emitter unchanged; vacuous) | | 6. `--no-canonicalize-allocators` backward-compat | ✅ byte-identical to C+1 | | 7. Self-diff sanity | ✅ exit 0 both cases |