fix(desktop): retire prepend mode on every reader wheel (#2913)

## Summary

- retire Virtua prepend reconciliation on every ordinary reader wheel
event, including events suppressed from its separate wheel-timing
heuristic
- keep Ctrl+wheel browser zoom excluded from reader ownership
- arm the Ctrl+wheel prepend probe before pagination begins so it cannot
miss the commit
- preserve ESM/CJS patch parity and update the patch lock hash

## Why main was red

PR #2855 added the reader-wheel retirement action after Virtua's
existing suppression guard. Once the first event set that guard, later
events in the same wheel burst returned before retiring prepend mode. A
late ResizeObserver correction could then pull the viewport backward by
20–40px. The same test had failed twice on #2855 but passed its final
retry, so the PR job appeared green; the merge commit lost all three
retries.

The separate Ctrl+wheel failure was a test race: its MutationObserver
was registered after the request had already been triggered and could
miss the prepend commit.

## Validation

- desktop full unit suite: 3,515 passed
- pre-push desktop check: passed
- `git diff --check`: passed
- CI is the E2E verification; no local E2E was run

Fixes the main-branch failure in CI run 30180099007.

Signed-off-by: Wes <wesbillman@users.noreply.github.com>
Co-authored-by: Carl <c7ebe626f000404285d3686e1dc74cc07cc60a9754a150041ba132e14bd3e2ec@buzz.block.builderlab.xyz>
This commit is contained in:
Wes
2026-07-25 17:22:15 -07:00
committed by GitHub
co-authored by Carl
parent 25e7864b35
commit 07d0265cfc
4 changed files with 49 additions and 33 deletions
@@ -21,7 +21,17 @@ test("reader wheel retires Virtua shift mode without publishing scroll end", ()
.filter(Boolean),
);
assert.deepEqual(addedActionBodies, [["I = 0;"], ["w = 0;"]]);
assert.match(patch, /\+\s+e\.q\(9\);/);
assert.match(patch, /\+\s+e\.B\(9\);/);
assert.match(
patch,
/if \(!e\.M\(\) \|\| t\.ctrlKey\) return;\n\+\s+e\.q\(9\);\n\+\s+if \(f\) return;/,
);
assert.match(
patch,
/if \(!e\.M\(\) \|\| t\.ctrlKey\) return;\n\+\s+e\.B\(9\);\n\+\s+if \(c\) return;/,
);
assert.doesNotMatch(
patch,
/\+\s+if \((?:f|c) \|\| !e\.M\(\) \|\| t\.ctrlKey\) return;/,
);
assert.doesNotMatch(patch, /\+\s+e\.(?:q|B)\(2\);/);
});