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

96 lines
4.4 KiB
Markdown

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