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>
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
.isonot.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.