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>
107 lines
4.2 KiB
Markdown
107 lines
4.2 KiB
Markdown
# Phase C+10 — NtQueryFullAttributesFile — Re-validation
|
|
|
|
Validation against the Phase 1 emitter extension (only landed work).
|
|
No fix landed for the actual divergence (ESCALATED — see
|
|
`escalation.md`).
|
|
|
|
## Gate matrix
|
|
|
|
| # | gate | result |
|
|
|---|---|---|
|
|
| 1 | cvar-OFF determinism 50M (3 runs) | PASS — all 3 = `b8fa0e0460359a4f660adb7605e053de` (UNCHANGED from C+9 baseline; extension is zero-cost when cvar OFF) |
|
|
| 2 | Phase B `image_loaded_sha256` | PASS — `ea8d160e9369328a5b922258a92113efb8d7ce3e1a5c12cc521e375985c91c18` (matches baseline; XEX loader untouched) |
|
|
| 3 | Phase A main matched-prefix | UNCHANGED — 102404 (no fix landed; matched-prefix advance NOT expected this session) |
|
|
| 3b | tid=4 → 11 unchanged | PASS — 9 (no regression) |
|
|
| 3c | tid=7 → 2 unchanged | PASS — 29 (no regression) |
|
|
| 3d | tid=12 → 7 unchanged | PASS — 2 (no regression) |
|
|
| 3e | tid=14 → 9 unchanged | PASS — 39 (no regression) |
|
|
| 3f | tid=15 → 10 unchanged | PASS — 15 (no regression) |
|
|
| 4 | Both engines build clean | PASS (1 unrelated `walk_committed_regions` dead-code warning, pre-existing C+9) |
|
|
| 5 | Phase A emitter determinism (2 runs) | PASS — both = `7489e90ef4c9be629af8c9fabb1cbdd7` |
|
|
| 6 | Unit tests | PASS — 165 → 165 (no new tests; no regressions) |
|
|
|
|
## Stable-digest comparison
|
|
|
|
| field | C+9 baseline | C+10 post-extension | delta |
|
|
|---|---|---|---|
|
|
| (all stable fields, 3 runs) | `b8fa0e0460359a4f660adb7605e053de` | `b8fa0e0460359a4f660adb7605e053de` | 0 |
|
|
|
|
Extension is purely emitter-side, cvar-gated default-off, behaviorally
|
|
inert. Determinism unchanged.
|
|
|
|
## Phase A determinism
|
|
|
|
```
|
|
ours.jsonl (run 1) det-fields md5: 7489e90ef4c9be629af8c9fabb1cbdd7
|
|
ours-determ.jsonl (run 2) det-fields md5: 7489e90ef4c9be629af8c9fabb1cbdd7
|
|
```
|
|
|
|
Byte-identical on deterministic fields. New `--phase-a` det baseline
|
|
`7489e90e…` (replaces C+9's `0b299c37…`). The signature changed
|
|
because the new `args_resolved.path` field IS part of the
|
|
deterministic payload — but it's stable across runs (path string is
|
|
read directly out of guest memory, fully deterministic for fixed
|
|
input).
|
|
|
|
## Per-chain summary
|
|
|
|
| chain | C+9 baseline | C+10 (after emitter extension) | delta |
|
|
|---|---|---|---|
|
|
| canary tid=6 → ours tid=1 (main) | 102404 | 102404 | 0 (no fix landed) |
|
|
| canary tid=4 → ours tid=11 | 9 | 9 | 0 |
|
|
| canary tid=7 → ours tid=2 | 29 | 29 | 0 |
|
|
| canary tid=12 → ours tid=7 | 2 | 2 | 0 |
|
|
| canary tid=14 → ours tid=9 | 39 | 39 | 0 |
|
|
| canary tid=15 → ours tid=10 | 15 | 15 | 0 |
|
|
|
|
All chains unchanged. No regressions. No advances (as expected — no
|
|
behavioral change to either engine).
|
|
|
|
## Confirmed framing (Phase 1 success)
|
|
|
|
The divergence path is now visible in the diff output:
|
|
|
|
```
|
|
canary[6][102403] kernel.call NtQueryFullAttributesFile
|
|
args_resolved.path = "cache:\d4ea4615\e\46ee8ca"
|
|
ours [1][102403] kernel.call NtQueryFullAttributesFile
|
|
args_resolved.path = "cache:\d4ea4615\e\46ee8ca"
|
|
```
|
|
|
|
Both engines query the SAME path. Both successfully read the
|
|
OBJECT_ATTRIBUTES.name_ptr. Divergence is purely in
|
|
`vfs.stat`/`file_system().ResolvePath` outcome (canary's mount has
|
|
the file; ours's wiped cache doesn't).
|
|
|
|
## Sources of truth for the path field
|
|
|
|
Both engines read directly out of guest memory at the same point in
|
|
the dispatch sequence (right before the export handler runs). The
|
|
resulting string is byte-identical when input is identical. This is
|
|
verified by the byte-identical det-fields md5 across runs.
|
|
|
|
## Phase 6 status
|
|
|
|
Gates 1-2, 3b-3f, 4-6 all pass. Gate 3 main-prefix did NOT advance.
|
|
This is because **no fix was landed** — Phase 4 ESCALATED.
|
|
|
|
The session's contribution is:
|
|
* Permanent emitter extension on both engines (~80 LOC each).
|
|
* Path framing captured for the divergence.
|
|
* Classification + scope-decision memo in `escalation.md`.
|
|
|
|
## Next target
|
|
|
|
Same idx 102,404, but in a dedicated cache-subsystem session that
|
|
can:
|
|
|
|
1. Re-test AUDIT-053's warm-start regression under AUDIT-054's
|
|
FILE_DIRECTORY_FILE fix.
|
|
2. Decide between cache-build subsystem vs cache-seed-from-canary vs
|
|
stub-success.
|
|
3. Land + re-validate the cache-state mechanism + run Phase A to
|
|
measure the cascade.
|
|
|
|
The path framing landed in this session is the permanent input for
|
|
that follow-up session.
|