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