Files
xenia-rs/audit-runs/phase-c22-rtl-enter-leave-control-flow/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

4.4 KiB

Phase C+22 cold-vs-cold result (2026-05-18)

Outcome: NO engine change. ESCALATE.

Verified C+21 absorber engaged correctly on the fresh cold-vs-cold measurement; main matched-prefix is stable at 104,607 (no change from C+21 baseline). Divergence at canary idx 104,610 (post-absorb) vs ours idx 104,607 classified as (A) ours fast-paths while canary contends → state mutated during the wait → different post-acquire branch. Same root cause as C+20.

Matched-prefix table (vs C+21 baseline)

chain C+21 C+22 (fresh c22) delta
canary tid=6 → ours tid=1 main 104,607 104,607 0
canary tid=4 → ours tid=11 11 11 0
canary tid=7 → ours tid=2 32 32 0
canary tid=12 → ours tid=7 3 3 0
canary tid=14 → ours tid=9 41 41 0
canary tid=15 → ours tid=10 16 16 0

Floating-event absorption counts (fresh c22)

chain floating_create (c/o) floating_wait (c/o)
canary tid=6 → ours tid=1 main 1 / 0 2 / 0
canary tid=15 → ours tid=10 0 / 1 0 / 0
others 0 / 0 0 / 0

C+18 absorber engaged on main chain (1 canary handle.create floated) and on tid=15→10 (1 ours handle.create floated). C+21 absorber engaged on main chain (2 canary wait.begin events floated — the contention slow-path emitted them in this run).

Cold-stable invariants

  • ours-cold byte-identical to C+19 archive: 121,569 events match post-normalization (host_ns/guest_cycle excluded). Reading-error class #34 (cold-run determinism depends on input path form) discovered + documented; ALL future cold runs must use .iso not .xex.
  • Phase B image hash: ea8d160e9369328a5b922258a92113efb8d7 ce3e1a5c12cc521e375985c91c18 — unchanged (no engine source change).
  • Engine source: UNCHANGED in both ours and canary. No new exports, no new flags, no diff-tool changes.

Verification of NOT-jitter

Pattern in canary's tid=6 post-loop region (idx 104,604-104,615 import.call events only):

sample events
c21 archived E E L L
canary jitter-1 E (wait.begin slow path) E L L
canary jitter-2 E E L L
canary jitter-3 (shifted) E E L L
fresh c22 E (wait.begin slow path) E L L

All canary samples take the EXTRA nested RtlEnter after the post-loop E at 104,604. Ours never does — it goes E L NtClose. This is a real guest-code branch divergence, NOT diff-tool jitter.

Cascade outcome

  • A=verify divergence is NOT jitter: PASS
  • B=classify (A/B/C/D): PASS — (A) scheduler-determinism + post-wait state-mutation effect
  • C=land fix or escalate cleanly: ESCALATION (per prompt authorized fallback)
  • D=main matched-prefix > 104,607: N/A (no engine change)

Files

  • investigation.md — detailed framing, mechanism, rejected fixes, reading-error #34 documentation, next-targets.
  • diff-cold-vs-cold.md — full Phase A diff report (fresh c22 cold-vs-cold).
  • canary-binary-cache-pre-wipe.tar.gz — pre-wipe canary binary-dir cache backup (restored post-run).
  • canary-xdg-cache-pre-wipe.tar.gz — pre-wipe canary XDG cache backup (restored post-run).
  • ours-cold-stdout.log / canary-cold-stdout.log — run logs.

Next-target recommendation

C+23 = D-NEW-2 (KeWaitForSingleObject timeout_ns sign/scale asymmetry on canary tid=12 → ours tid=7 idx=3): canary=-30000000 vs ours=429466729600. Independent of scheduler-determinism. Out of scope for C+22 per the C+22 prompt's explicit "You may NOT ... Fix D-NEW-2 in this session." Likely ~20-40 LOC in ke_wait_for_single_object's timeout-pointer dereference.