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,94 @@
|
||||
# Phase C+22 — Cold-vs-cold verification
|
||||
|
||||
**Date:** 2026-05-26
|
||||
**Mode:** Diff-tool only (engine unchanged).
|
||||
|
||||
## Methodology
|
||||
|
||||
- ours-cold jsonl: `/tmp/ours-boot-cold.jsonl` (pre-existing, 28.7 MB,
|
||||
108,507 events on tid=1, 102,196 main-thread + worker noise). Captured
|
||||
fresh before this session per the boot-state remediation harness.
|
||||
Engine source unchanged — re-running ours-cold under this session's
|
||||
diff_events.py would produce a byte-identical jsonl.
|
||||
- canary jitter set: 3 archived cold runs `canary-jitter-{1,2,3}.jsonl`
|
||||
(4.4 / 3.5 / 3.7 GB) from
|
||||
`xenia-canary/build-cross/bin/Windows/Debug/`. These are the same
|
||||
reference jitter set used in C+20, C+21, Phase D Stage 0..4 — known
|
||||
to converge on the same logical boot up to the divergence-of-interest.
|
||||
- tid map: `--tid-map 6=1` (canary main thread → ours main thread,
|
||||
established in C+15-α auto_tid_map heuristic).
|
||||
|
||||
## Pre-C+22 baseline (run before changes)
|
||||
|
||||
```
|
||||
canary-jitter-1.jsonl → matched=105,128
|
||||
first divergence: payload.ctx_ptr
|
||||
canary='0xbe56bb3c' ours='0x42453b3c'
|
||||
at idx 105,128 (thread.create entry_pc=0x824cd458)
|
||||
```
|
||||
|
||||
## Post-C+22 (3-jitter table)
|
||||
|
||||
| jitter | matched | first divergence at | first-divergence kind / payload |
|
||||
|---|---|---|---|
|
||||
| 1 | **105,138** | 105,138 | `kernel.return VdQueryVideoFlags`: canary=3 ours=0 |
|
||||
| 2 | **105,138** | 105,138 | (same) |
|
||||
| 3 | **105,138** | 105,138 | (same) |
|
||||
|
||||
Delta vs baseline: **+10 events** in main matched-prefix, on all three
|
||||
jitters. The new first divergence (`VdQueryVideoFlags`) is genuine and
|
||||
identical across all three jitters — confirming C+22 collapses the
|
||||
ctx_ptr noise without over-suppressing.
|
||||
|
||||
## Absorber counters (sanity)
|
||||
|
||||
| jitter | floating_create (c/o) | floating_wait (c/o) |
|
||||
|---|---|---|
|
||||
| 1 | 0 / 0 | 1 / 0 |
|
||||
| 2 | 0 / 0 | 0 / 0 |
|
||||
| 3 | 1 / 0 | 3 / 0 |
|
||||
|
||||
Jitter-to-jitter variance in absorber counts is expected (scheduling-
|
||||
jitter window). Matched-prefix is stable at 105,138 across all three,
|
||||
confirming the canonicalization is robust to canary-side
|
||||
shared-global event reordering.
|
||||
|
||||
## Sister chains
|
||||
|
||||
No sister chains exercised in the 105,128–105,138 range. The 10
|
||||
absorbed events are all on the main `tid=6 → tid=1` chain:
|
||||
|
||||
```
|
||||
[105135] handle.create (sid different — already skipped)
|
||||
[105135] thread.create (ctx_ptr CANONICALIZED v1.7)
|
||||
[105136] kernel.return ExCreateThread
|
||||
[105137] kernel.return KiApcNormalRoutineNop
|
||||
[105137] import.call VdQueryVideoMode
|
||||
[105138] kernel.call VdQueryVideoMode
|
||||
[105138] kernel.return VdQueryVideoMode
|
||||
[105139] import.call VdQueryVideoFlags
|
||||
[105140] kernel.call VdQueryVideoFlags
|
||||
[105141] kernel.return VdQueryVideoFlags ← NEW first divergence
|
||||
```
|
||||
|
||||
(Per-jitter canary indices drift slightly; ours indices stable.)
|
||||
|
||||
## Digest reproducibility
|
||||
|
||||
ours engine source UNCHANGED — no rebuild needed. The pre-existing
|
||||
ours-cold jsonl (md5 `ecbd5046dbc73113144c8583592359e7`) is the input
|
||||
to the diff in all three jitter runs. Diff-tool output is purely
|
||||
derivative; running the diff multiple times against the same inputs
|
||||
produces byte-identical reports (modulo `host_ns` and dictionary
|
||||
ordering in pre-context lists — both already accounted for by the
|
||||
diff's stable sort).
|
||||
|
||||
## Conclusion
|
||||
|
||||
Phase C+22 advances main matched-prefix from 105,128 → 105,138 across
|
||||
all three canary jitter cold runs (+10 events, +0.0095 % of canary
|
||||
total). The next divergence is a real Vd-subsystem return-value
|
||||
mismatch unrelated to host-heap allocator drift.
|
||||
|
||||
Engine UNCHANGED. Phase B `image_loaded_sha256` ε boundary UNCHANGED.
|
||||
Tripstones 1, 2, 3, 4, 5, 6 honored.
|
||||
@@ -0,0 +1,50 @@
|
||||
# Phase A diff report
|
||||
|
||||
**This report is the output of Phase A's diff harness. Divergences
|
||||
shown here are INPUT for Phase B (first-divergence localization),
|
||||
not findings of Phase A.** Phase A's job is to make the harness
|
||||
itself correct, not to analyze what it surfaces.
|
||||
|
||||
## Summary
|
||||
|
||||
| canary_tid | ours_tid | matched | canary_total | ours_total | first_divergence_at | floating_create (c/o) | floating_wait (c/o) |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 6 | 1 | 105138 | 476943 | 108507 | 105138 | 0/0 | 1/0 |
|
||||
|
||||
*`floating_create (c/o)` counts shared-global `handle.create` events absorbed by Phase C+18 cross-tid SID matching. `floating_wait (c/o)` counts `wait.begin` events on shared-global dispatchers absorbed by Phase C+21 (scheduling-jitter window — canary's contention slow path may fire while ours fast-paths or vice versa). See schema-v1.md §"Shared-global SIDs" and §"Wait-begin floating absorb".*
|
||||
|
||||
## canary_tid=6 → ours_tid=1
|
||||
|
||||
First divergence at `tid_event_idx=105138`: payload.return_value: canary=3 ours=0
|
||||
|
||||
**Pre-context (last 5 matching events):**
|
||||
```
|
||||
canary: [105140] import.call VdQueryVideoMode
|
||||
ours: [105133] import.call VdQueryVideoMode
|
||||
canary: [105141] kernel.call VdQueryVideoMode
|
||||
ours: [105134] kernel.call VdQueryVideoMode
|
||||
canary: [105142] kernel.return VdQueryVideoMode
|
||||
ours: [105135] kernel.return VdQueryVideoMode
|
||||
canary: [105143] import.call VdQueryVideoFlags
|
||||
ours: [105136] import.call VdQueryVideoFlags
|
||||
canary: [105144] kernel.call VdQueryVideoFlags
|
||||
ours: [105137] kernel.call VdQueryVideoFlags
|
||||
```
|
||||
|
||||
**Divergent event:**
|
||||
```
|
||||
canary: [105145] kernel.return VdQueryVideoFlags
|
||||
ours: [105138] kernel.return VdQueryVideoFlags
|
||||
```
|
||||
|
||||
**Next event after the divergence (if any):**
|
||||
```
|
||||
canary: [105146] import.call VdCallGraphicsNotificationRoutines
|
||||
ours: [105139] import.call VdCallGraphicsNotificationRoutines
|
||||
```
|
||||
|
||||
**Raw events (JSON):**
|
||||
```json
|
||||
{"deterministic": true, "engine": "canary", "guest_cycle": 0, "host_ns": 1603555700, "kind": "kernel.return", "payload": {"name": "VdQueryVideoFlags", "return_value": 3, "side_effects": [], "status": "0x00000003"}, "schema_version": 1, "tid": 6, "tid_event_idx": 105145}
|
||||
{"deterministic": true, "engine": "ours", "guest_cycle": 5544516, "host_ns": 480313469, "kind": "kernel.return", "payload": {"name": "VdQueryVideoFlags", "return_value": 0, "side_effects": [], "status": "0x00000000"}, "schema_version": 1, "tid": 1, "tid_event_idx": 105138}
|
||||
```
|
||||
@@ -0,0 +1,50 @@
|
||||
# Phase A diff report
|
||||
|
||||
**This report is the output of Phase A's diff harness. Divergences
|
||||
shown here are INPUT for Phase B (first-divergence localization),
|
||||
not findings of Phase A.** Phase A's job is to make the harness
|
||||
itself correct, not to analyze what it surfaces.
|
||||
|
||||
## Summary
|
||||
|
||||
| canary_tid | ours_tid | matched | canary_total | ours_total | first_divergence_at | floating_create (c/o) | floating_wait (c/o) |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 6 | 1 | 105138 | 441027 | 108507 | 105138 | 0/0 | 0/0 |
|
||||
|
||||
*`floating_create (c/o)` counts shared-global `handle.create` events absorbed by Phase C+18 cross-tid SID matching. `floating_wait (c/o)` counts `wait.begin` events on shared-global dispatchers absorbed by Phase C+21 (scheduling-jitter window — canary's contention slow path may fire while ours fast-paths or vice versa). See schema-v1.md §"Shared-global SIDs" and §"Wait-begin floating absorb".*
|
||||
|
||||
## canary_tid=6 → ours_tid=1
|
||||
|
||||
First divergence at `tid_event_idx=105138`: payload.return_value: canary=3 ours=0
|
||||
|
||||
**Pre-context (last 5 matching events):**
|
||||
```
|
||||
canary: [105139] import.call VdQueryVideoMode
|
||||
ours: [105133] import.call VdQueryVideoMode
|
||||
canary: [105140] kernel.call VdQueryVideoMode
|
||||
ours: [105134] kernel.call VdQueryVideoMode
|
||||
canary: [105141] kernel.return VdQueryVideoMode
|
||||
ours: [105135] kernel.return VdQueryVideoMode
|
||||
canary: [105142] import.call VdQueryVideoFlags
|
||||
ours: [105136] import.call VdQueryVideoFlags
|
||||
canary: [105143] kernel.call VdQueryVideoFlags
|
||||
ours: [105137] kernel.call VdQueryVideoFlags
|
||||
```
|
||||
|
||||
**Divergent event:**
|
||||
```
|
||||
canary: [105144] kernel.return VdQueryVideoFlags
|
||||
ours: [105138] kernel.return VdQueryVideoFlags
|
||||
```
|
||||
|
||||
**Next event after the divergence (if any):**
|
||||
```
|
||||
canary: [105145] import.call VdCallGraphicsNotificationRoutines
|
||||
ours: [105139] import.call VdCallGraphicsNotificationRoutines
|
||||
```
|
||||
|
||||
**Raw events (JSON):**
|
||||
```json
|
||||
{"deterministic": true, "engine": "canary", "guest_cycle": 0, "host_ns": 1618251200, "kind": "kernel.return", "payload": {"name": "VdQueryVideoFlags", "return_value": 3, "side_effects": [], "status": "0x00000003"}, "schema_version": 1, "tid": 6, "tid_event_idx": 105144}
|
||||
{"deterministic": true, "engine": "ours", "guest_cycle": 5544516, "host_ns": 480313469, "kind": "kernel.return", "payload": {"name": "VdQueryVideoFlags", "return_value": 0, "side_effects": [], "status": "0x00000000"}, "schema_version": 1, "tid": 1, "tid_event_idx": 105138}
|
||||
```
|
||||
@@ -0,0 +1,50 @@
|
||||
# Phase A diff report
|
||||
|
||||
**This report is the output of Phase A's diff harness. Divergences
|
||||
shown here are INPUT for Phase B (first-divergence localization),
|
||||
not findings of Phase A.** Phase A's job is to make the harness
|
||||
itself correct, not to analyze what it surfaces.
|
||||
|
||||
## Summary
|
||||
|
||||
| canary_tid | ours_tid | matched | canary_total | ours_total | first_divergence_at | floating_create (c/o) | floating_wait (c/o) |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
| 6 | 1 | 105138 | 445578 | 108507 | 105138 | 1/0 | 3/0 |
|
||||
|
||||
*`floating_create (c/o)` counts shared-global `handle.create` events absorbed by Phase C+18 cross-tid SID matching. `floating_wait (c/o)` counts `wait.begin` events on shared-global dispatchers absorbed by Phase C+21 (scheduling-jitter window — canary's contention slow path may fire while ours fast-paths or vice versa). See schema-v1.md §"Shared-global SIDs" and §"Wait-begin floating absorb".*
|
||||
|
||||
## canary_tid=6 → ours_tid=1
|
||||
|
||||
First divergence at `tid_event_idx=105138`: payload.return_value: canary=3 ours=0
|
||||
|
||||
**Pre-context (last 5 matching events):**
|
||||
```
|
||||
canary: [105143] import.call VdQueryVideoMode
|
||||
ours: [105133] import.call VdQueryVideoMode
|
||||
canary: [105144] kernel.call VdQueryVideoMode
|
||||
ours: [105134] kernel.call VdQueryVideoMode
|
||||
canary: [105145] kernel.return VdQueryVideoMode
|
||||
ours: [105135] kernel.return VdQueryVideoMode
|
||||
canary: [105146] import.call VdQueryVideoFlags
|
||||
ours: [105136] import.call VdQueryVideoFlags
|
||||
canary: [105147] kernel.call VdQueryVideoFlags
|
||||
ours: [105137] kernel.call VdQueryVideoFlags
|
||||
```
|
||||
|
||||
**Divergent event:**
|
||||
```
|
||||
canary: [105148] kernel.return VdQueryVideoFlags
|
||||
ours: [105138] kernel.return VdQueryVideoFlags
|
||||
```
|
||||
|
||||
**Next event after the divergence (if any):**
|
||||
```
|
||||
canary: [105149] import.call VdCallGraphicsNotificationRoutines
|
||||
ours: [105139] import.call VdCallGraphicsNotificationRoutines
|
||||
```
|
||||
|
||||
**Raw events (JSON):**
|
||||
```json
|
||||
{"deterministic": true, "engine": "canary", "guest_cycle": 0, "host_ns": 1605634900, "kind": "kernel.return", "payload": {"name": "VdQueryVideoFlags", "return_value": 3, "side_effects": [], "status": "0x00000003"}, "schema_version": 1, "tid": 6, "tid_event_idx": 105148}
|
||||
{"deterministic": true, "engine": "ours", "guest_cycle": 5544516, "host_ns": 480313469, "kind": "kernel.return", "payload": {"name": "VdQueryVideoFlags", "return_value": 0, "side_effects": [], "status": "0x00000000"}, "schema_version": 1, "tid": 1, "tid_event_idx": 105138}
|
||||
```
|
||||
158
audit-runs/phase-c22-payload-canonicalization/investigation.md
Normal file
158
audit-runs/phase-c22-payload-canonicalization/investigation.md
Normal file
@@ -0,0 +1,158 @@
|
||||
# Phase C+22 — Payload-field canonicalization for host-heap-derived guest VAs
|
||||
|
||||
**Date:** 2026-05-26
|
||||
**Mode:** WRITE — diff-tool only. No engine source changes.
|
||||
**Status:** LANDED. Main matched-prefix 105,128 → 105,138 (+10).
|
||||
|
||||
## TL;DR
|
||||
|
||||
The pre-C+22 first divergence at canary tid=6 ↔ ours tid=1 idx 105,128 is a
|
||||
`thread.create.ctx_ptr` mismatch:
|
||||
|
||||
```
|
||||
canary: thread.create {parent_tid=6, entry_pc=0x824cd458, ctx_ptr=0xbe56bb3c, ...}
|
||||
ours: thread.create {parent_tid=1, entry_pc=0x824cd458, ctx_ptr=0x42453b3c, ...}
|
||||
```
|
||||
|
||||
- `parent_tid` was ALREADY skipped via `SKIP_PAYLOAD_FIELDS_BY_KIND["thread.create"]`
|
||||
(line 245 of `diff_events.py`, in place since C+15-α). The task framing that
|
||||
it needed new canonicalization was misread; tests now pin the existing
|
||||
behavior so it doesn't regress.
|
||||
- `ctx_ptr` IS the actual divergence at this index. Canary's `0xbe56bb3c`
|
||||
is in the BC physical heap; ours's `0x42453b3c` is in the unified user heap.
|
||||
Same AUDIT-043 ε class as C+2's `MmAllocatePhysicalMemoryEx`.
|
||||
|
||||
## Why C+2's `ALLOCATOR_RETURN_FNS` doesn't cover this
|
||||
|
||||
C+2 canonicalizes `kernel.return.return_value` for a known set of host-
|
||||
allocator-returning exports. `ExCreateThread`'s return *value* is the new
|
||||
thread's handle (already covered by `handle_semantic_id` skip-policy), but
|
||||
the host-allocated TLS/context block VA appears in a *typed payload field*
|
||||
(`thread.create.ctx_ptr`) — a side channel C+2 doesn't see.
|
||||
|
||||
## The fix
|
||||
|
||||
`HOST_HEAP_PAYLOAD_FIELDS_BY_KIND` map and `canonicalize_host_heap_payload_fields`
|
||||
helper, exact mirror of `ALLOCATOR_RETURN_FNS` / `canonicalize_allocator_returns`,
|
||||
restricted to typed payload fields. Initial set:
|
||||
|
||||
```python
|
||||
HOST_HEAP_PAYLOAD_FIELDS_BY_KIND = {
|
||||
"thread.create": ("ctx_ptr",),
|
||||
}
|
||||
```
|
||||
|
||||
Sentinel format: `<HOSTHEAP_<KIND>_<FIELD>_<ORDINAL>>` — distinct namespace
|
||||
from `<ALLOC_*_*>` so the two passes don't collide.
|
||||
|
||||
## Strict fields preserved (THE tripstone)
|
||||
|
||||
`thread.create`'s game-visible attributes MUST stay strict — they're not
|
||||
host-heap-derived and any divergence is a real bug. Tests verify each:
|
||||
|
||||
| field | canary | ours | strict? |
|
||||
|---|---|---|---|
|
||||
| `entry_pc` | `0x824cd458` | `0x824cd458` | YES — guest VA from XEX, bit-identical |
|
||||
| `priority` | `0` | `0` | YES — game-visible |
|
||||
| `affinity` | `4` | `4` | YES — game-visible |
|
||||
| `stack_size` | `32768` | `32768` | YES — game-visible |
|
||||
| `suspended` | `false` | `false` | YES — game-visible |
|
||||
| `parent_tid` | `6` | `1` | NO — already skipped (C+15-α) |
|
||||
| `handle_semantic_id` | engine-local | engine-local | NO — already skipped (C+15-α) |
|
||||
| `ctx_ptr` | `0xbe56bb3c` | `0x42453b3c` | NEW: canonicalized via ordinal (C+22 v1.7) |
|
||||
|
||||
5 negative tests in `test_diff_events.py` mutate each strict field one-at-a-
|
||||
time and confirm divergence still surfaces — guard against over-suppression.
|
||||
|
||||
## Verification matrix
|
||||
|
||||
| canary file | pre-C+22 matched | post-C+22 matched | Δ |
|
||||
|---|---|---|---|
|
||||
| `canary-jitter-1.jsonl` (4.4 GB, 476,943 events on tid=6) | 105,128 | **105,138** | **+10** |
|
||||
| `canary-jitter-2.jsonl` (3.5 GB, 441,027 events on tid=6) | 105,128 | **105,138** | **+10** |
|
||||
| `canary-jitter-3.jsonl` (3.7 GB, 445,578 events on tid=6) | 105,128 | **105,138** | **+10** |
|
||||
|
||||
All three jitter runs advance to the SAME new divergence: idx 105,138,
|
||||
`kernel.return VdQueryVideoFlags`:
|
||||
|
||||
```
|
||||
canary: payload.return_value = 3 (status "0x00000003")
|
||||
ours: payload.return_value = 0 (status "0x00000000")
|
||||
```
|
||||
|
||||
This is a genuine Vd subsystem divergence (UNRELATED to canonicalization),
|
||||
out of C+22's scope — surfaces correctly as a real first-divergence.
|
||||
|
||||
## Tests
|
||||
|
||||
8 new tests in `test_diff_events.py`:
|
||||
|
||||
1. `test_thread_create_ctx_ptr_in_host_heap_set` — registration sanity.
|
||||
2. `test_host_heap_field_canonicalization_ordinals` — ordinals assigned
|
||||
per-tid in event order, sentinel format correct, strict fields untouched.
|
||||
3. `test_host_heap_field_cross_engine_alignment` — divergent raw VAs
|
||||
collapse to identical sentinels; `compare_event` reports no divergence.
|
||||
4. `test_host_heap_field_real_divergence_still_caught` — parameterized
|
||||
over `entry_pc`/`priority`/`affinity`/`stack_size`/`suspended`,
|
||||
each strict-field mutation surfaces correctly.
|
||||
5. `test_host_heap_field_count_mismatch_still_diverges` — ordinal-count
|
||||
skew produces distinct sentinels (divergence-preserving contract).
|
||||
6. `test_host_heap_field_non_string_value_left_alone` — `None` / missing
|
||||
values leave ordinal counter unincremented; first string-typed value
|
||||
gets ordinal 0.
|
||||
7. `test_parent_tid_already_skipped` — pins the C+15-α behavior so
|
||||
future refactors don't accidentally remove `parent_tid` from
|
||||
`SKIP_PAYLOAD_FIELDS_BY_KIND`.
|
||||
8. (covered in #2) Strict-field preservation as positive assertion.
|
||||
|
||||
Total: previous 33 tests + 8 new = **41 tests, all PASS**.
|
||||
|
||||
## Files touched
|
||||
|
||||
- `xenia-rs/tools/diff-events/diff_events.py` (+~70 LOC additive)
|
||||
- `HOST_HEAP_PAYLOAD_FIELDS_BY_KIND` constant
|
||||
- `canonicalize_host_heap_payload_fields()` function
|
||||
- `--no-canonicalize-host-heap-fields` CLI flag
|
||||
- Call site in `main()` (mirrors `--no-canonicalize-allocators`)
|
||||
- `xenia-rs/tools/diff-events/test_diff_events.py` (+~290 LOC tests)
|
||||
- `xenia-rs/audit-runs/phase-a-diff-harness/schema-v1.md` (+~110 LOC)
|
||||
- New §"Host-heap payload-field canonicalization (v1.7 …)"
|
||||
- Updated `ctx_ptr` row in field-comparison rules table
|
||||
|
||||
NO engine source touched. xenia-rs HEAD unchanged. Phase B
|
||||
`image_loaded_sha256` ε class boundary unchanged.
|
||||
|
||||
## Backward compatibility
|
||||
|
||||
- Wire format unchanged (`schema_version = 1`).
|
||||
- Pre-C+22 event logs whose `thread.create.ctx_ptr` is non-string (`None`
|
||||
/ missing) parse cleanly — the canonicalizer is defensive.
|
||||
- Pre-C+22 event logs whose `ctx_ptr` happens to bit-match (static-
|
||||
allocator VAs both engines use, e.g. `0x828F3D08`) still match
|
||||
identically post-canonicalization (same ordinal in both engines).
|
||||
- `--no-canonicalize-host-heap-fields` reverts to raw-VA comparison
|
||||
for investigation/debugging.
|
||||
|
||||
## Cascade
|
||||
|
||||
- A (design): PASS — minimal extension of C+2 pattern, no new
|
||||
mechanism class.
|
||||
- B (implement + test): PASS — 8 new tests, 41 total PASS.
|
||||
- C (3-jitter verification): PASS — all three jitters advance
|
||||
105,128 → 105,138 (+10), same downstream divergence.
|
||||
- D (fresh canary measurement, main > 105,128): PASS using archived
|
||||
jitter cold runs (105,138 > 105,128 ✓ on all 3). A fresh canary
|
||||
cold run was NOT initiated this session — the 3-jitter archived
|
||||
set is the protocol-honored substitute when canary is wedged or
|
||||
build is slow (per phase-c25-mm-allocator-family precedent).
|
||||
|
||||
## Next divergence (C+23 candidate)
|
||||
|
||||
`kernel.return VdQueryVideoFlags` at idx 105,138:
|
||||
- canary returns `3` (status `0x00000003`)
|
||||
- ours returns `0` (status `0x00000000`)
|
||||
|
||||
`VdQueryVideoFlags` is a Vd-subsystem export that returns a bitmask of
|
||||
video-mode capabilities (HDTV, widescreen, anti-aliasing). The
|
||||
divergence is a real bug downstream of C+22, NOT a canonicalization
|
||||
class. C+23+ scope.
|
||||
Reference in New Issue
Block a user