Files
xenia-rs/audit-runs/phase-c21-wait-begin-floating-absorb/cold-vs-cold-result.md
MechaCat02 ef93a4fa14 handoff: VSync/event-wedge fixes + iterate 2.A–2.BC research notes
Source changes (dormant parity infra, retained from iterate 2.AI/2.AO):
- xenia-kernel/exports.rs: nt_create_event manual_reset polarity +
  related event wiring
- xenia-gpu/mmio_region.rs: D1MODE_VBLANK_VLINE_STATUS hardcode parity

Also lands the audit-runs/ analysis notes (.md/.txt/.json digests) for the
iterate 2.x VSync/0x10e8/0x1004 wedge investigation. Raw trace dumps
(.jsonl/.gz/.csv/.stdout) and agent worktrees (.claude/) are gitignored as
regenerable local artifacts — see memory + HANDOFF for the running findings.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-05 07:19:08 +02:00

3.9 KiB

Phase C+21 cold-vs-cold result (2026-05-14)

Matched-prefix table (vs C+19/C+20 baseline)

chain C+19 C+20 C+21 (jitter-1) C+21 (jitter-2) C+21 (jitter-3) C+21 (fresh c21)
canary tid=6 → ours tid=1 main 104,606 104,606 104,607 104,607 104,607 104,607
canary tid=4 → ours tid=11 11 11 11 11 11 11
canary tid=7 → ours tid=2 32 32 32 32 32 32
canary tid=12 → ours tid=7 3 3 3 3 3 3
canary tid=14 → ours tid=9 41 41 41 41 41 41
canary tid=15 → ours tid=10 16 16 16 16 16 16

Main chain ADVANCED +1 vs C+19/C+20 baseline (104,606 → 104,607). The +1 is unmasking the next real downstream divergence; the C+20 wait.begin jitter event at 104,606 is now transparent.

CRITICALLY: all 4 canary cold samples now agree at 104,607 — reading-error #32 jitter cloud is fully absorbed at the diff layer.

Floating-event absorption counts

run floating_create (c/o) floating_wait (c/o)
jitter-1 0 / 1 (tid=15→10) 1 / 0 (tid=6→1)
jitter-2 0 / 1 0 / 0
jitter-3 1 / 0 + 0 / 1 3 / 0 (tid=6→1)
fresh c21 0 / 1 0 / 0

floating_create reflects C+18 absorption — observed in tid=15→10 (the original D-NEW-3 case, still firing 1 ours-side handle.create absorb). floating_wait is new in C+21 and varies with canary's host-scheduler contention pattern. Sister chains see no wait.begin absorption (their waits are per-thread, not shared- global — strict matching preserved).

Cold-stable invariants

  • ours cold digest: bit-stable across 3 runs of xrs-verify-c19 (50M instr, 39290 imports, 0 unimpl). No engine source change.
  • Phase B image hash: unchanged (no engine source change).
  • Schema version: still 1 (wire format unchanged — C+21 is diff-tool-only).

Reading-error class #32 — diff-tool counter-measure landed

Pre-C+21, matched-prefix in canary cold-vs-cold could vary by 1+ indices across canary samples (jitter-1 contended → matched=104,606 strict-fail; jitter-2 fast-path → matched=104,607 naturally; jitter-3 shifted → matched=104,603 strict-fail). Post-C+21, all samples yield matched=104,607 — the metric is now stable across canary's contention jitter.

Outcome

C+21 LANDED. Main matched-prefix 104,606 → 104,607 (+1) and deterministic across canary cold samples. Reading-error class #32 mitigated at the diff-tool layer. The next real divergence at 104,607 is an actual structural difference (canary enters another CS while ours leaves one) — handed off to C+22.

Next target

C+22 = the new divergence at tid=6→1 idx=104,607 (canary import.call RtlEnterCriticalSection vs ours import.call RtlLeaveCriticalSection). Initial framing: appears to be a CS-acquire-vs-release ordering difference in the post-fast- path RtlEnterCriticalSection sequence. Investigation will start with a static read of canary's vs ours's RtlEnter and RtlLeave control flow at this guest PC range.

Alternative: tackle D-NEW-2 (KeWaitForSingleObject timeout_ns sign/scale asymmetry on tid=12→7 idx=3) — small ε-class encoding fix, independent of scheduler determinism. Recommended path depends on cost estimate; the C+22 framing scope can pick either.