# Phase C+21 cold-vs-cold result (2026-05-14) ## Matched-prefix table (vs C+19/C+20 baseline) | chain | C+19 | C+20 | C+21 (jitter-1) | C+21 (jitter-2) | C+21 (jitter-3) | C+21 (fresh c21) | |--------------------------------|---------|---------|-----------------|-----------------|-----------------|------------------| | canary tid=6 → ours tid=1 main | 104,606 | 104,606 | **104,607** | **104,607** | **104,607** | **104,607** | | canary tid=4 → ours tid=11 | 11 | 11 | 11 | 11 | 11 | 11 | | canary tid=7 → ours tid=2 | 32 | 32 | 32 | 32 | 32 | 32 | | canary tid=12 → ours tid=7 | 3 | 3 | 3 | 3 | 3 | 3 | | canary tid=14 → ours tid=9 | 41 | 41 | 41 | 41 | 41 | 41 | | canary tid=15 → ours tid=10 | 16 | 16 | 16 | 16 | 16 | 16 | Main chain ADVANCED +1 vs C+19/C+20 baseline (104,606 → 104,607). The +1 is unmasking the next real downstream divergence; the C+20 wait.begin jitter event at 104,606 is now transparent. CRITICALLY: all 4 canary cold samples now agree at 104,607 — reading-error #32 jitter cloud is fully absorbed at the diff layer. ## Floating-event absorption counts | run | floating_create (c/o) | floating_wait (c/o) | |--------------------|-----------------------|---------------------| | jitter-1 | 0 / 1 (tid=15→10) | 1 / 0 (tid=6→1) | | jitter-2 | 0 / 1 | 0 / 0 | | jitter-3 | 1 / 0 + 0 / 1 | 3 / 0 (tid=6→1) | | fresh c21 | 0 / 1 | 0 / 0 | `floating_create` reflects C+18 absorption — observed in tid=15→10 (the original D-NEW-3 case, still firing 1 ours-side handle.create absorb). `floating_wait` is new in C+21 and varies with canary's host-scheduler contention pattern. Sister chains see no wait.begin absorption (their waits are per-thread, not shared- global — strict matching preserved). ## Cold-stable invariants - **ours cold digest**: bit-stable across 3 runs of `xrs-verify-c19` (50M instr, 39290 imports, 0 unimpl). No engine source change. - **Phase B image hash**: unchanged (no engine source change). - **Schema version**: still `1` (wire format unchanged — C+21 is diff-tool-only). ## Reading-error class #32 — diff-tool counter-measure landed Pre-C+21, matched-prefix in canary cold-vs-cold could vary by 1+ indices across canary samples (jitter-1 contended → matched=104,606 strict-fail; jitter-2 fast-path → matched=104,607 naturally; jitter-3 shifted → matched=104,603 strict-fail). Post-C+21, all samples yield matched=104,607 — the metric is now stable across canary's contention jitter. ## Outcome C+21 LANDED. Main matched-prefix 104,606 → 104,607 (+1) and deterministic across canary cold samples. Reading-error class #32 mitigated at the diff-tool layer. The next real divergence at 104,607 is an actual structural difference (canary enters another CS while ours leaves one) — handed off to C+22. ## Next target C+22 = the new divergence at tid=6→1 idx=104,607 (canary `import.call RtlEnterCriticalSection` vs ours `import.call RtlLeaveCriticalSection`). Initial framing: appears to be a CS-acquire-vs-release ordering difference in the post-fast- path RtlEnterCriticalSection sequence. Investigation will start with a static read of canary's vs ours's RtlEnter and RtlLeave control flow at this guest PC range. Alternative: tackle D-NEW-2 (`KeWaitForSingleObject` `timeout_ns` sign/scale asymmetry on tid=12→7 idx=3) — small ε-class encoding fix, independent of scheduler determinism. Recommended path depends on cost estimate; the C+22 framing scope can pick either.