Bug: mobile PWA scroll moves the page instead of the terminal card #44

Open
opened 2026-10-07 05:27:57 +00:00 by kayg · 11 comments
Owner

Owner report (2026-10-07, iOS PWA): scrolling in the installed mobile PWA scrolls the page/viewport instead of the terminal card. The terminal's scrollback should scroll inside the card. The page itself must never move: no rubber-band, no fixed elements shifting, and the key tray stays put. To do: lock document scroll (fixed root, overscroll-behavior: none), route touch scrolling to the terminal's scrollback with momentum (ghostty-web scroll API; earlier mockup work in mock-core main.ts handled touch scrolling with scrollLines), keep pinch-to-zoom behaviour as in the mockup (it changes the terminal font size), and test with an iPhone-15 Playwright touch emulation plus the owner on a real device.

Owner report (2026-10-07, iOS PWA): scrolling in the installed mobile PWA scrolls the page/viewport instead of the terminal card. The terminal's scrollback should scroll inside the card. The page itself must never move: no rubber-band, no fixed elements shifting, and the key tray stays put. To do: lock document scroll (fixed root, `overscroll-behavior: none`), route touch scrolling to the terminal's scrollback with momentum (ghostty-web scroll API; earlier mockup work in mock-core main.ts handled touch scrolling with `scrollLines`), keep pinch-to-zoom behaviour as in the mockup (it changes the terminal font size), and test with an iPhone-15 Playwright touch emulation plus the owner on a real device.
Author
Owner

Starting mobile-recovery at base 56bb6f5. Reading terminal gesture and production-browser fixtures; will record regression evidence, atomic commit SHAs and gate output here.

Starting mobile-recovery at base 56bb6f5. Reading terminal gesture and production-browser fixtures; will record regression evidence, atomic commit SHAs and gate output here.
Author
Owner

Regression reproduced: iPhone 15 Chromium touch input with 368 Ghostty WASM scrollback rows leaves data-scrolled unset on base (target/mobile-red.log). Gesture routing now passes: terminal scrolls while document scrollTop stays 0 and top controls/key tray bounding boxes remain unchanged. Before/after production screenshots retained for attachment. Checking momentum, pinch, cancellation and overwide panning next.

Regression reproduced: iPhone 15 Chromium touch input with 368 Ghostty WASM scrollback rows leaves data-scrolled unset on base (target/mobile-red.log). Gesture routing now passes: terminal scrolls while document scrollTop stays 0 and top controls/key tray bounding boxes remain unchanged. Before/after production screenshots retained for attachment. Checking momentum, pinch, cancellation and overwide panning next.
Author
Owner

Contract finding: base DECISIONS 82 auto-hides the key toolbar during scrollback. This job explicitly requires the key tray and pills to stay put, so ec66748 follows the owner task by keeping the tray visible. DECISIONS.md remains unchanged because only the owner edits decisions. D84 pinch affects terminal text only; horizontal panning is limited to actual canvas overflow, with no new terminal sizing policy.

Contract finding: base DECISIONS 82 auto-hides the key toolbar during scrollback. This job explicitly requires the key tray and pills to stay put, so ec66748 follows the owner task by keeping the tray visible. DECISIONS.md remains unchanged because only the owner edits decisions. D84 pinch affects terminal text only; horizontal panning is limited to actual canvas overflow, with no new terminal sizing policy.
Author
Owner

Production-build screenshots for owner review. Ghostty WASM on the iPhone 15 touch profile; before is the reproduced base failure, after includes terminal scrollback while controls stay fixed.

Production-build screenshots for owner review. Ghostty WASM on the iPhone 15 touch profile; before is the reproduced base failure, after includes terminal scrollback while controls stay fixed. - [mobile-before.png](https://git.kayg.org/attachments/ba16445e-5c26-4780-bce8-884766d734d7) - [mobile-after.png](https://git.kayg.org/attachments/36bdc44c-7770-476b-ab99-be7328a0dea0)
Author
Owner

Completed Route terminal touch gestures through Ghostty scrollback (#44) at a50cb50199. Isolated exact-commit scripts/verify fast, tracer TypeScript check and production build passed (233.15 s). Gate output (verbatim summary):

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.87s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.04s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.31s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.09s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.19s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.50s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.63s
test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 66 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 157.07s
test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 31.92s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.58s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
advisories ok, bans ok, licenses ok, sources ok
PT_INTERP: absent; size: 16096816 bytes
PT_INTERP: absent; size: 13515080 bytes
+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+
 7 pass
 0 fail

Full output: target/atomic-gates/02-a50cb50-fast.log; will attach gate logs at finish. No push, merge or deploy.

Completed Route terminal touch gestures through Ghostty scrollback (#44) at a50cb501996c25f377607725bfbfb3c373f397a3. Isolated exact-commit scripts/verify fast, tracer TypeScript check and production build passed (233.15 s). Gate output (verbatim summary): ```text test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.87s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.04s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.31s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.09s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.19s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.50s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.63s test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 66 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 157.07s test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 31.92s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.58s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.15s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s advisories ok, bans ok, licenses ok, sources ok PT_INTERP: absent; size: 16096816 bytes PT_INTERP: absent; size: 13515080 bytes +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 7 pass 0 fail ``` Full output: target/atomic-gates/02-a50cb50-fast.log; will attach gate logs at finish. No push, merge or deploy.
Author
Owner

Completed Keep mobile document scroll fixed and wire terminal gestures (#44) at 710ed9aef6. Isolated exact-commit scripts/verify fast, tracer TypeScript check and production build passed (230.49 s). Gate output (verbatim summary):

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.72s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.99s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.35s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.07s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.12s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.02s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.90s
test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 66 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 152.70s
test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 36.27s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.66s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.18s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
advisories ok, bans ok, licenses ok, sources ok
PT_INTERP: absent; size: 16096816 bytes
PT_INTERP: absent; size: 13515080 bytes
+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+
 7 pass
 0 fail

Full output: target/atomic-gates/03-710ed9a-fast.log; will attach gate logs at finish. No push, merge or deploy.

Completed Keep mobile document scroll fixed and wire terminal gestures (#44) at 710ed9aef61247321bdc4bbc0c9ccd63a804572b. Isolated exact-commit scripts/verify fast, tracer TypeScript check and production build passed (230.49 s). Gate output (verbatim summary): ```text test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.72s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.99s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.35s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.04s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.07s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.12s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.02s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.90s test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 66 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 152.70s test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 36.27s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.66s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.18s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s advisories ok, bans ok, licenses ok, sources ok PT_INTERP: absent; size: 16096816 bytes PT_INTERP: absent; size: 13515080 bytes +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 7 pass 0 fail ``` Full output: target/atomic-gates/03-710ed9a-fast.log; will attach gate logs at finish. No push, merge or deploy.
Author
Owner

Completed Keep the mobile key tray visible during scrollback (#44) at ec66748526. Isolated exact-commit scripts/verify fast, tracer TypeScript check and production build passed (227.74 s). Gate output (verbatim summary):

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.86s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.01s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.58s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.07s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.15s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.23s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.09s
test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 66 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 153.10s
test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 33.21s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.50s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.14s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
advisories ok, bans ok, licenses ok, sources ok
PT_INTERP: absent; size: 16096816 bytes
PT_INTERP: absent; size: 13515080 bytes
+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+
 7 pass
 0 fail

Full output: target/atomic-gates/04-ec66748-fast.log; will attach gate logs at finish. No push, merge or deploy.

Completed Keep the mobile key tray visible during scrollback (#44) at ec66748526af381b1b51f86224202f7c90f1c9e9. Isolated exact-commit scripts/verify fast, tracer TypeScript check and production build passed (227.74 s). Gate output (verbatim summary): ```text test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.86s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.01s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.58s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.07s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.15s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.23s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.09s test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 66 passed; 0 failed; 5 ignored; 0 measured; 0 filtered out; finished in 153.10s test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 33.21s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.50s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.14s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s advisories ok, bans ok, licenses ok, sources ok PT_INTERP: absent; size: 16096816 bytes PT_INTERP: absent; size: 13515080 bytes +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 7 pass 0 fail ``` Full output: target/atomic-gates/04-ec66748-fast.log; will attach gate logs at finish. No push, merge or deploy.
Author
Owner

Final source at 3b1cde5; evidence handoff 9907375. Full production Playwright suite: 29 passed (3.4m), TRACER_TEST_PORT=4551. iPhone 15 touch: 368 scrollback rows, drag 16 rows, momentum 40, font 13→24, horizontal pan 90 px, document scrollTop 0, controls fixed. Existing 500-key gate p99 16.10 ms. target/playwright-final.log and docs/verification/mobile-recovery.md retain evidence; screenshots already attached. Exact-commit fast gates continue before final handoff.

Final source at 3b1cde5; evidence handoff 9907375. Full production Playwright suite: 29 passed (3.4m), TRACER_TEST_PORT=4551. iPhone 15 touch: 368 scrollback rows, drag 16 rows, momentum 40, font 13→24, horizontal pan 90 px, document scrollTop 0, controls fixed. Existing 500-key gate p99 16.10 ms. target/playwright-final.log and docs/verification/mobile-recovery.md retain evidence; screenshots already attached. Exact-commit fast gates continue before final handoff.
Author
Owner

Completed Regress iPhone touch scrolling, momentum, pinch and horizontal pan (#44) at 63f24604da. Isolated exact-commit scripts/verify fast, tracer TypeScript check and production build passed (305.52 s). Gate output (verbatim summary):

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.93s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.22s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.36s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.08s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.16s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.51s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.33s
test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 71 passed; 0 failed; 6 ignored; 0 measured; 0 filtered out; finished in 167.13s
test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 71.16s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.11s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.64s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
advisories ok, bans ok, licenses ok, sources ok
PT_INTERP: absent; size: 16099152 bytes
PT_INTERP: absent; size: 13519320 bytes
+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+
 7 pass
 0 fail

Full output: target/atomic-gates/13-63f2460-fast.log; will attach gate logs at finish. No push, merge or deploy.

Completed Regress iPhone touch scrolling, momentum, pinch and horizontal pan (#44) at 63f24604dabb5fe031eb49711195b0c8ab318b63. Isolated exact-commit scripts/verify fast, tracer TypeScript check and production build passed (305.52 s). Gate output (verbatim summary): ```text test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.93s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.22s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.36s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.08s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.16s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.51s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.33s test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 71 passed; 0 failed; 6 ignored; 0 measured; 0 filtered out; finished in 167.13s test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 71.16s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 2.11s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.64s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s advisories ok, bans ok, licenses ok, sources ok PT_INTERP: absent; size: 16099152 bytes PT_INTERP: absent; size: 13519320 bytes +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ 7 pass 0 fail ``` Full output: target/atomic-gates/13-63f2460-fast.log; will attach gate logs at finish. No push, merge or deploy.
Author
Owner

Implementation finished on mobile-recovery at 18d5035270, base 56bb6f5. 19 atomic commits each pass exact-commit scripts/verify fast, tracer check and production build. Final-head required Nix fast gate and native browser gate pass. Full production Playwright: 29 passed (3.4m), TRACER_TEST_PORT=4551. No push, merge or deploy; issues remain open.

Unedited complete gate logs, final diff, contracts, handoff and machine/scale/bundle metadata (ZIP SHA-256 40ce882f04ef71b94bc448b8249d83c9d57fc6f52f690ff9436dc58f4bd15d8d). Screenshots are attached in the earlier production evidence comment. Reviewer handoff: docs/verification/mobile-recovery.md.

Final fast output (verbatim):

test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.77s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.09s
test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.01s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.11s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.27s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.59s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.32s
test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s
test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s
test result: ok. 71 passed; 0 failed; 6 ignored; 0 measured; 0 filtered out; finished in 189.45s
test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 38.32s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s
test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s
advisories ok, bans ok, licenses ok, sources ok
PT_INTERP: absent; size: 16099152 bytes
PT_INTERP: absent; size: 13519320 bytes
+---------------------------+--------------+
| Rust gate                 | Result       |
+---------------------------+--------------+
| fmt                       | PASS         |
| VT native fmt             | PASS         |
| clippy                    | PASS         |
| test                      | PASS         |
| cargo-deny                | PASS         |
| static builds             | PASS         |
+---------------------------+--------------+
dist/ghostty-web.js: OK
dist/ghostty-vt.wasm: OK
dist/index.d.ts: OK
stream differential: 134 streams, 11439 schedules, zero divergences
 7 pass
 0 fail
 34390 expect() calls

Native browser output (verbatim PASS lines):

auth browser: PASS (4 isolated scenarios; Chromium 149.0.7827.55)
native recovery same-account live session: PASS (original DEK preserved, capability consumed, replacement passkey signs in)
native recovery no session, enforced delay then elapsed: PASS (original DEK preserved, capability consumed, replacement passkey signs in)
native recovery: PASS (2 real-verifier scenarios; Chromium 149.0.7827.55)

Real Ghostty touch evidence: 368 retained scrollback rows; drag 16 rows, momentum 40, font 13→24, horizontal pan 90 px, document scrollTop 0, top/tray fixed. Existing 500-key p99 16.10 ms.

How to test:

  1. Open the production PWA on iPhone and fill terminal scrollback.
  2. Drag/pinch inside the card; top controls and tray stay fixed while scrollback/font change.
  3. Narrow an overflowing terminal and swipe horizontally; the document stays at zero.

Physical iPhone/Safari, independent security and owner screenshot review, and pinned perf-VM budget certification remain review work; local emulation is not a physical-device claim.

Implementation finished on mobile-recovery at 18d5035270ca6792e54d7c44e9d7343ffedbff94, base 56bb6f5. 19 atomic commits each pass exact-commit scripts/verify fast, tracer check and production build. Final-head required Nix fast gate and native browser gate pass. Full production Playwright: 29 passed (3.4m), TRACER_TEST_PORT=4551. No push, merge or deploy; issues remain open. [Unedited complete gate logs, final diff, contracts, handoff and machine/scale/bundle metadata](https://git.kayg.org/attachments/4dbb216a-8bda-4b2c-a58e-980ea7516f67) (ZIP SHA-256 40ce882f04ef71b94bc448b8249d83c9d57fc6f52f690ff9436dc58f4bd15d8d). Screenshots are attached in the earlier production evidence comment. Reviewer handoff: docs/verification/mobile-recovery.md. Final fast output (verbatim): ```text test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 7.77s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.09s test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 8.01s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.03s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.11s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.27s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 4.59s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 3.32s test result: ok. 13 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 0.02s test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.01s test result: ok. 71 passed; 0 failed; 6 ignored; 0 measured; 0 filtered out; finished in 189.45s test result: ok. 61 passed; 0 failed; 12 ignored; 0 measured; 0 filtered out; finished in 38.32s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.55s test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.17s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s advisories ok, bans ok, licenses ok, sources ok PT_INTERP: absent; size: 16099152 bytes PT_INTERP: absent; size: 13519320 bytes +---------------------------+--------------+ | Rust gate | Result | +---------------------------+--------------+ | fmt | PASS | | VT native fmt | PASS | | clippy | PASS | | test | PASS | | cargo-deny | PASS | | static builds | PASS | +---------------------------+--------------+ dist/ghostty-web.js: OK dist/ghostty-vt.wasm: OK dist/index.d.ts: OK stream differential: 134 streams, 11439 schedules, zero divergences 7 pass 0 fail 34390 expect() calls ``` Native browser output (verbatim PASS lines): ```text auth browser: PASS (4 isolated scenarios; Chromium 149.0.7827.55) native recovery same-account live session: PASS (original DEK preserved, capability consumed, replacement passkey signs in) native recovery no session, enforced delay then elapsed: PASS (original DEK preserved, capability consumed, replacement passkey signs in) native recovery: PASS (2 real-verifier scenarios; Chromium 149.0.7827.55) ``` Real Ghostty touch evidence: 368 retained scrollback rows; drag 16 rows, momentum 40, font 13→24, horizontal pan 90 px, document scrollTop 0, top/tray fixed. Existing 500-key p99 16.10 ms. How to test: 1. Open the production PWA on iPhone and fill terminal scrollback. 2. Drag/pinch inside the card; top controls and tray stay fixed while scrollback/font change. 3. Narrow an overflowing terminal and swipe horizontally; the document stays at zero. Physical iPhone/Safari, independent security and owner screenshot review, and pinned perf-VM budget certification remain review work; local emulation is not a physical-device claim.
Author
Owner

Scroll fix #44 cherry-picked to dev (40f4643..760490c, from mobile-recovery) and deployed (web only) while recovery is in rework. Full Playwright 35/35 on dev, including mobile-scroll.spec.ts (document scroll stays 0, momentum, pinch, horizontal pan). Owner to confirm on the real iPhone.

Scroll fix #44 cherry-picked to dev (40f4643..760490c, from mobile-recovery) and deployed (web only) while recovery is in rework. Full Playwright 35/35 on dev, including mobile-scroll.spec.ts (document scroll stays 0, momentum, pinch, horizontal pan). Owner to confirm on the real iPhone.
Sign in to join this conversation.
No labels
launch-qa
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/infraternal#44
No description provided.