fix(web): phone swipe regressions since train #1026 #1046

Closed
kayg wants to merge 0 commits from fix/phone-swipe-regressions into dev
Owner

Two phone specs failed on chromium-390 and webkit-390 on dev 1b971419f: swipe-guard.spec.ts:112 and swipe-rows.spec.ts:437.

Cause

Not one of #1029, #909, #1025 or #1033. Both specs fail the same way on 4906cdb11 (the train #1026 dev head), 3 of 3 runs on each project, and the first-parent merges before it were unbuildable or skipped in bisect. They were not on the train's failure list because the result depends on where the fixture row lands.

The specs drag a row diagonally down (30, 40) and expect the page to keep the move. A drag down that starts in the top third of an unscrolled page is pull-to-search (composer/pull.svelte.ts: starts above innerHeight / 3, claims a down move that is not mostly sideways, and calls preventDefault). Probe on chromium-390: with 3 notes the fixture row's centre is at y 289 (just under the 281 line, spec passes), with 5 or 7 notes in the server (what the server holds after earlier specs in the same run) it is at y 223 (in the zone, spec fails). Same app code, no change in the rows' swipe logic: the row correctly stays at rest in every case.

Fix (tests only)

The row's own claim is not weakened: the row must stay at rest for every case, and the page keeps up and across moves everywhere. Only the downward diagonals, when the row sits in pull-to-search's zone, no longer assert "not prevented", because the pull is the page's own gesture there. The specs now also check the upward mirrors ((8,-40), (24,-17), (30,-40)), which are never pull territory, so the "scroll is the page's" check is stronger where it can be checked.

Gates (compute02, head 062b9256c)

  • swipe-guard + swipe-rows, --repeat-each=3: see comment.
  • Swipe/list/phone group, cross-cutting set (preload, lazy-ui, lazy-offline, glass, glass-roots, shortcuts), all four projects: see comment.
  • Bundle gate: built head and 1b971419f, bundle-size.mjs --json byte-identical (test-only change).

🤖 Generated with Claude Code

Two phone specs failed on chromium-390 and webkit-390 on dev 1b971419f: `swipe-guard.spec.ts:112` and `swipe-rows.spec.ts:437`. ## Cause Not one of #1029, #909, #1025 or #1033. Both specs fail the same way on 4906cdb11 (the train #1026 dev head), 3 of 3 runs on each project, and the first-parent merges before it were unbuildable or skipped in bisect. They were not on the train's failure list because the result depends on where the fixture row lands. The specs drag a row diagonally down (30, 40) and expect the page to keep the move. A drag down that starts in the top third of an unscrolled page is **pull-to-search** (`composer/pull.svelte.ts`: starts above `innerHeight / 3`, claims a down move that is not mostly sideways, and calls `preventDefault`). Probe on chromium-390: with 3 notes the fixture row's centre is at y 289 (just under the 281 line, spec passes), with 5 or 7 notes in the server (what the server holds after earlier specs in the same run) it is at y 223 (in the zone, spec fails). Same app code, no change in the rows' swipe logic: the row correctly stays at rest in every case. ## Fix (tests only) The row's own claim is not weakened: the row must stay at rest for every case, and the page keeps up and across moves everywhere. Only the downward diagonals, when the row sits in pull-to-search's zone, no longer assert "not prevented", because the pull is the page's own gesture there. The specs now also check the upward mirrors (`(8,-40)`, `(24,-17)`, `(30,-40)`), which are never pull territory, so the "scroll is the page's" check is stronger where it can be checked. ## Gates (compute02, head 062b9256c) - `swipe-guard` + `swipe-rows`, `--repeat-each=3`: see comment. - Swipe/list/phone group, cross-cutting set (preload, lazy-ui, lazy-offline, glass, glass-roots, shortcuts), all four projects: see comment. - Bundle gate: built head and 1b971419f, `bundle-size.mjs --json` byte-identical (test-only change). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
test(web): a downward diagonal from the top third is pull-to-search's; the row only has to stay at rest, and the upward mirror is checked always
Some checks are pending
CI / server (pull_request) Waiting to run
CI / rust (pull_request) Waiting to run
CI / web (pull_request) Waiting to run
Markdown extraction contract / markdown-native-contract (pull_request) Waiting to run
Markdown extraction contract / markdown-editor-contract (pull_request) Waiting to run
062b9256c5
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Author
Owner

Gate results (compute02, head 062b9256c, via ~/bin/slot, --workers=1)

Check Result
Confirm on 1b971419f, swipe-guard:112 + swipe-rows:437, chromium-390 and webkit-390, 3x both specs fail on every repeat, both projects
Same on 4906cdb11 (train head), 3x same: both specs fail on every repeat. Not a regression from #1029/#909/#1025/#1033
After the fix: swipe-guard + swipe-rows, repeat-each=3 chromium-1440 72 pass; chromium-390 89 pass + 1 fail; webkit-390 84 pass + 3 fail; webkit-1440 70 pass + 2 fail. Every failure is swipe-rows:627 "keeps its colour", not the two target specs
swipe-rows:627 on dev (1b971419f) vs head dev: chromium-390 24/24, webkit-390 24/24 and 48/48. head: chromium-390 24/24, webkit-390 23/24 and 48/48. It failed only while other jobs shared the host (load avg 20-35). A colour-swatch timing flake; I could not tie it to this change, which touches only the diagonal asserts in two specs
Swipe/list/phone group (16 files) + preload, lazy-ui, lazy-offline, glass, glass-roots, shortcuts, one project at a time chromium-390 335 passed, chromium-1440 81, webkit-390 333, webkit-1440 80; 0 failed
Same files, 4 projects in parallel extra failures in phone-bars, touch-select, contacts-list, glass-roots, preload:51, swipe-rows:216/226; all passed when rerun alone, so load-related
Bundle gate bundle-size.mjs --json of head vs 1b971419f is byte-identical (tests only)

Not run: perf VMs (no app code changed).

## Gate results (compute02, head 062b9256c, via `~/bin/slot`, `--workers=1`) | Check | Result | |---|---| | Confirm on 1b971419f, `swipe-guard:112` + `swipe-rows:437`, chromium-390 and webkit-390, 3x | both specs fail on every repeat, both projects | | Same on 4906cdb11 (train head), 3x | same: both specs fail on every repeat. Not a regression from #1029/#909/#1025/#1033 | | After the fix: `swipe-guard` + `swipe-rows`, repeat-each=3 | chromium-1440 72 pass; chromium-390 89 pass + 1 fail; webkit-390 84 pass + 3 fail; webkit-1440 70 pass + 2 fail. Every failure is `swipe-rows:627` "keeps its colour", not the two target specs | | `swipe-rows:627` on dev (1b971419f) vs head | dev: chromium-390 24/24, webkit-390 24/24 and 48/48. head: chromium-390 24/24, webkit-390 23/24 and 48/48. It failed only while other jobs shared the host (load avg 20-35). A colour-swatch timing flake; I could not tie it to this change, which touches only the diagonal asserts in two specs | | Swipe/list/phone group (16 files) + preload, lazy-ui, lazy-offline, glass, glass-roots, shortcuts, one project at a time | chromium-390 335 passed, chromium-1440 81, webkit-390 333, webkit-1440 80; 0 failed | | Same files, 4 projects in parallel | extra failures in phone-bars, touch-select, contacts-list, glass-roots, preload:51, swipe-rows:216/226; all passed when rerun alone, so load-related | | Bundle gate | `bundle-size.mjs --json` of head vs 1b971419f is byte-identical (tests only) | Not run: perf VMs (no app code changed).
Author
Owner

Merged into dev; closing.

Merged into dev; closing.
kayg closed this pull request 2026-11-10 16:02:19 +00:00
Some checks are pending
CI / server (pull_request) Waiting to run
CI / rust (pull_request) Waiting to run
CI / web (pull_request) Waiting to run
Markdown extraction contract / markdown-native-contract (pull_request) Waiting to run
Markdown extraction contract / markdown-editor-contract (pull_request) Waiting to run

Pull request closed

Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
kayg/calternal!1046
No description provided.