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:
@@ -0,0 +1,169 @@
|
||||
# Phase C+22 re-invocation — ESCALATION CONFIRMED (2026-05-22)
|
||||
|
||||
## Decision
|
||||
|
||||
**RE-CONFIRM the C+22 escalation landed 2026-05-18.** No engine
|
||||
change, no diff-tool change. Class A (scheduler-determinism +
|
||||
post-wait state-mutation downstream effect) — same root cause as
|
||||
C+20, structurally parallel to C+14.
|
||||
|
||||
## Phase 0 — Class E ruled out (verified today)
|
||||
|
||||
Both engines register RtlEnterCriticalSection and
|
||||
RtlLeaveCriticalSection symmetrically:
|
||||
|
||||
| engine | RtlEnterCriticalSection | RtlLeaveCriticalSection |
|
||||
|---------|------------------------------------------------------------------|------------------------------------------------------------------|
|
||||
| canary | `xboxkrnl_table.inc:307` ord 0x125 (293) `kFunction` shimmed | `xboxkrnl_table.inc:318` ord 0x130 (304) `kFunction` shimmed |
|
||||
| ours | `exports.rs:169` `register_export(Xboxkrnl, 0x0125, …, rtl_enter)` | `exports.rs:177` `register_export(Xboxkrnl, 0x0130, …, rtl_leave)` |
|
||||
|
||||
(Note: the prompt cited "ord 293" / "ord 304" decimal; the hex
|
||||
forms 0x125 / 0x130 are the actual table indices. They match the
|
||||
decimal values — no off-by-one.)
|
||||
|
||||
Class E ruled out — both export paths reach a real implementation
|
||||
in both engines.
|
||||
|
||||
## State drift check vs prior C+22 session
|
||||
|
||||
- `xenia-rs` HEAD: `e6d43a2…` (unchanged from prior C+22 session
|
||||
on 2026-05-18 — verified by `git log -1`).
|
||||
- `exports.rs` carries the Phase D Stage 3 contention-replay
|
||||
manifest in `rtl_enter_critical_section` (lines 3290-3396).
|
||||
This was already in place at the prior C+22 session per the
|
||||
Phase D Stage 3+4 memory entry. Default-mode behavior
|
||||
unchanged (manifest short-circuits when
|
||||
`XENIA_CONTENTION_MANIFEST_PATH` unset).
|
||||
- Working tree contains uncommitted canary-side instrumentation
|
||||
for AUDIT-068/069 and Iterate 2.A (per the index entries) —
|
||||
none of it touches RtlEnter/Leave or the post-wait branch.
|
||||
- xenia-canary RtlEnter/Leave shims unchanged (same ord lookup
|
||||
table file, same line numbers).
|
||||
|
||||
## Cross-reference with C+14 + Phase D forensics
|
||||
|
||||
The Phase D D-extension memory entry already pinpoints the
|
||||
upstream root cause:
|
||||
|
||||
> tid=1 wakes from notification-event wait → consults
|
||||
> CS-protected tree at `(CS 0x828f4838).r30+48` via helper
|
||||
> `0x8245B1F8` find-or-insert → canary's tree has more entries
|
||||
> because peer tid=5 had more wall-time to insert during the
|
||||
> wait window → canary's "insert" path nested-Enter+Leaves;
|
||||
> ours's "match" path early-exits.
|
||||
|
||||
That's exactly the C+14 single-CS wrapper at `sub_8245B128` +
|
||||
the file-tracker singleton at `0x828F4838`. The C+22 prompt's
|
||||
"file-tracker state divergence (F)" hypothesis is correct, and
|
||||
the Phase D D-extension absorber (LANDED 2026-05-18) is already
|
||||
the diff-tool-level band-aid that crosses reading-error #23 in
|
||||
spirit — it absorbed +439 events past the cap by folding the
|
||||
`[Enter-block, Leave-block]` pair as a nested-CS-cleanup
|
||||
absorber. Main is now at **105,046** matched-prefix per the
|
||||
Phase D D-extension entry (not the 104,607 from C+21 — the
|
||||
absorber advanced past the cap).
|
||||
|
||||
## Reconciling 104,607 (prompt) vs 105,046 (Phase D D-ext)
|
||||
|
||||
The prompt frames today's target as "idx 104,607 cold-vs-cold
|
||||
first divergence." This was the C+21 / C+22 baseline. The Phase
|
||||
D D-extension (LANDED 2026-05-18, same date as prior C+22)
|
||||
shifted main to **105,046** via diff-tool absorber. Both can be
|
||||
true: the prompt cites the pre-D-extension cap; today's
|
||||
methodologically-correct measurement uses the post-D-extension
|
||||
diff tool.
|
||||
|
||||
Without re-running cold-vs-cold (cost-benefit unfavorable given
|
||||
no engine drift), the existing Phase D D-extension result stands
|
||||
as the most recent matched-prefix value. Today's invocation does
|
||||
not advance it.
|
||||
|
||||
## Authorized fix shape (or escalation rationale)
|
||||
|
||||
**Escalation.** Per the prompt's tripstone 5: "if this turns out
|
||||
to be the same `sub_8245B128` file-tracker issue, escalate
|
||||
cleanly. Don't push through." That tripstone fires today:
|
||||
|
||||
1. Class E ruled out (Phase 0 verification above).
|
||||
2. Class A established by prior 4-canary-sample evidence
|
||||
(jitter-1/2/3 + fresh c22, all `E E L L` nested pattern in
|
||||
canary; ours `E L NtClose` simple-release).
|
||||
3. Root cause is the C+14 / Phase D `sub_8245B128` chain reading
|
||||
the file-tracker tree at `(CS 0x828f4838).r30+48`, with
|
||||
peer tid=5 timing-dependent inserts.
|
||||
4. Authorized scope explicitly EXCLUDES "scheduler determinism"
|
||||
refactor, which is what would be required to fix at root.
|
||||
5. Diff-tool absorber for this region ALREADY LANDED (Phase D
|
||||
D-extension, +439 events past cap).
|
||||
|
||||
No engine modification within scope can advance further. The
|
||||
prompt's "quick fix ≤50 LOC" path is not available; the
|
||||
"C+14-class deferred" path is the correct outcome.
|
||||
|
||||
## Per-chain delta table
|
||||
|
||||
No fresh cold-vs-cold run executed in today's invocation (cost-
|
||||
benefit: engine state for this subsystem is unchanged from
|
||||
2026-05-18 C+22, which already executed the full protocol). Per
|
||||
Phase D D-extension's archived measurement:
|
||||
|
||||
| chain | C+21 | C+22 (prior) | Phase D D-ext | today (no run) |
|
||||
|--------------------------------|---------|--------------|---------------|----------------|
|
||||
| canary tid=6 → ours tid=1 main | 104,607 | 104,607 | **105,046** | 105,046 |
|
||||
| canary tid=4 → ours tid=11 | 11 | 11 | 11 | 11 |
|
||||
| canary tid=7 → ours tid=2 | 32 | 32 | 32 | 32 |
|
||||
| canary tid=12 → ours tid=7 | 3 | 3 | 4 (per index) | 4 |
|
||||
| canary tid=14 → ours tid=9 | 41 | 41 | 41 | 41 |
|
||||
| canary tid=15 → ours tid=10 | 16 | 16 | 16 | 16 |
|
||||
|
||||
## Jitter verification
|
||||
|
||||
Inherited from prior C+22 session (canary-jitter-1/2/3 + fresh
|
||||
c22 cold): all 4 canary samples agree on the `E E L L` nested
|
||||
pattern post-wait. Re-verification today is not warranted —
|
||||
canary table file is unchanged and the canary-jitter jsonls are
|
||||
archived intact.
|
||||
|
||||
## Gates (escalation-mode)
|
||||
|
||||
| gate | result |
|
||||
|------------------------------------------|--------|
|
||||
| Phase 0 — Class E ruled out | PASS |
|
||||
| xenia-rs HEAD unchanged for this subsys | PASS |
|
||||
| canary table file unchanged | PASS |
|
||||
| Phase B `image_canonical_sha256` | UNCHANGED `ea8d160e…` |
|
||||
| Prior escalation evidence still valid | PASS |
|
||||
| Tripstone 5 (C+14-class) fires correctly | PASS |
|
||||
| Canary caches untouched today | PASS (no run) |
|
||||
| `--mute=true` discipline | N/A (no run) |
|
||||
|
||||
## Files
|
||||
|
||||
- This file: confirmation of prior escalation.
|
||||
- Prior C+22 session artifacts: `xenia-rs/audit-runs/phase-c22-rtl-enter-leave-control-flow/`
|
||||
- `investigation.md` (263 lines)
|
||||
- `escalation.md` (123 lines)
|
||||
- `cold-vs-cold-result.md` (96 lines)
|
||||
- `re-validation.md`
|
||||
- `diff-cold-vs-cold.md`
|
||||
- `canary-binary-cache-pre-wipe.tar.gz` + `canary-xdg-cache-pre-wipe.tar.gz`
|
||||
- Phase D D-extension landed-state: see memory index entry
|
||||
`phase_d_d_extension_absorber_2026_05_18`.
|
||||
|
||||
## Next target
|
||||
|
||||
Per the prior C+22 escalation's next-target recommendation:
|
||||
|
||||
1. **C+23 = D-NEW-2** (LANDED 2026-05-18 per memory entry
|
||||
`project_phase_c23_kewait_timeout_addis_signext_2026_05_18`).
|
||||
2. **C+24 = D-NEW-3** (XAudio voice-category divergence on
|
||||
tid=14→9 sister chain).
|
||||
3. **Parallel scheduler-determinism track** — multi-session
|
||||
refactor. Memory entry
|
||||
`project_scheduler_determinism_plan_2026_05_18` documents
|
||||
the plan. Phase D Stages 0-4 already implemented the
|
||||
replay-track infrastructure; Phase D D-extension landed the
|
||||
diff-tool absorber that crossed the cap.
|
||||
|
||||
The Phase C C+22 thread is COMPLETE at the escalation
|
||||
boundary; advancement requires the parallel scheduler track.
|
||||
Reference in New Issue
Block a user