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>
This commit is contained in:
MechaCat02
2026-06-05 07:19:08 +02:00
parent acd1656753
commit ef93a4fa14
620 changed files with 108303 additions and 1 deletions

View File

@@ -0,0 +1,70 @@
# Phase C+9 — broad impact
## Resolved divergences (C+8 → C+9)
| idx | name | C+8 ours | C+9 ours | canary | status |
|---|---|---|---|---|---|
| 102197 | `XamContentCreateEnumerator` return_value | 0 | **1317 (0x525)** | 1317 | ✅ MATCH |
## New first divergence
| idx | name | canary | ours | hypothesis |
|---|---|---|---|---|
| 102404 | `NtQueryFullAttributesFile` return_value | 0 (STATUS_SUCCESS) | 3221225524 (0xC0000034 STATUS_OBJECT_NAME_NOT_FOUND) | VFS path lookup miss — file/dir exists on canary's pre-populated cache/HDD root but not ours's fresh VFS. AUDIT-052/054 sibling class. |
## Persisting divergences (different bug, hold)
* tid=12 → 7 idx=2: `KeWaitForSingleObject` ret 258 vs 0 (held)
* tid=14 → 9 idx=39: XAudio vs `RtlEnterCriticalSection` (held)
## Coarse-counter movement
This is the first non-zero coarse digest delta since C+5
(`imports: 40470 → 40465`, -5). Interpretation: the return_value flip
at idx=102197 routes the game into a different control-flow branch
that calls 5 fewer import functions within 50M instructions. This is
exactly the bull's-eye behavior we want — the fix has visible
downstream effect.
`draws=0`/`swaps=1` stable: still in the pre-renderer boot phase.
## XAM call coverage delta
Pre-C+9: `XamContentCreateEnumerator` fired 1× with stub return.
Post-C+9: `XamContentCreateEnumerator` fires 1× with X_ERROR_NO_SUCH_USER.
Total XAM-content callsite count UNCHANGED (1 invocation in 50M).
## Reading-error class
NO new class introduced. **#28 (canary source supersedes NT-doc /
plan annotations) re-applied** with one extra rigor step: the plan's
inline constant identity (`0x525 = X_ERROR_NO_CONTENT`) was WRONG —
`0x525` is `X_ERROR_NO_SUCH_USER`. Lesson: **verify constants from
canary's xbox.h, not from the plan's natural-language descriptions**.
This is the same class of "trust the source not the framing" that #28
captures; logged here as a fresh data point.
## Deferred-item interaction check
| item | touched? |
|---|---|
| Heap region (C+2) | NO |
| Clock (Stage 2) | NO |
| Audio host-pump (AUDIT-032/048) | NO |
| KeSetEvent / KeResetEvent semantics | NO |
| VFS cache persistence (AUDIT-052/054) | NO (Phase C+10 may need to revisit) |
| `xam_user_get_signin_state` user0=1 model | FLAGGED as internal inconsistency — separate fix, not landed |
| profile-manager model | FLAGGED for future XAM-user-subsystem session |
## Internal inconsistency surfaced (NOT FIXED)
Ours's `xam_user_get_signin_state` (xam.rs:380-384) returns 1 for
`user_index == 0`, but the C+9 fix says "no profile installed → 0x525
for user 0." When the game eventually calls `XamUserGetSigninState(0)`,
canary returns 0 (idx 107996 confirmed in canary.jsonl) while ours
returns 1. This will become a Phase A first divergence in a future
Phase C session — fix shape will be: `xam_user_get_signin_state`
returns 0 unconditionally (mirror canary's "no profile manager"
default).
Single-fix discipline: NOT landed in C+9.