Skip to content

Commit 7efeb77

Browse files
committed
docs: triage mobile feedback and close phase 1b
1 parent 6821529 commit 7efeb77

3 files changed

Lines changed: 212 additions & 11 deletions

File tree

adr/research/SPIKE-mobile-web-compatibility-20260812.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,12 +291,12 @@ Five of eight checks fail clearly on phone:
291291

292292
| ID | Priority | Evidence | Finding | Impact | Direction, not specification |
293293
|---|---|---|---|---|---|
294-
| MOB-010 | P1 | Physical iPhone + WebKit-confirmed; bottom behavior passed, top correction awaiting retest | Roots follow the observed visual viewport and the primary composers consume shared reactive bounds. Compact coarse-pointer Plan now uses the actual document scroller, propagates that viewport through navigation/selection consumers, and allows the document to continue behind Safari's collapsing bottom controls; the physical iPhone pass confirmed the bottom controls dismiss and the former cutoff is gone. That pass exposed the matching top-edge issue: the 48 px Plannotator header remained `position: sticky; top: 0`, so it was partly obscured and Safari preserved an opaque extension instead of the softer page-under-chrome treatment. WebKit explains that this solid extension is deliberately applied when fixed/sticky content borders an obscured viewport edge ([WebKit #301756](https://bugs.webkit.org/show_bug.cgi?id=301756#c2)). Compact touch Plan now lets the app header scroll in normal flow and disables both duplicate sticky Plan action treatments; desktop keeps all incumbent sticky behavior. | Bottom document reachability now matches ordinary Safari sites. The top correction must still prove that both Safari bars contract normally, the Plan is not clipped, and no sticky product chrome recreates the opaque extension. Code Review remains a separate phase because its multi-panel workspace cannot inherit Plan's reading-page composition unchanged. | Retest upward/downward page scrolling with attention to the shrinking top address bar and content visible beneath it, then repeat composer/keyboard/rotation checks before passing 1B. |
294+
| MOB-010 | P1 | Physical iPhone + WebKit-confirmed; Checkpoint 1B passed | Roots follow the observed visual viewport and the primary composers consume shared reactive bounds. Compact coarse-pointer Plan uses the actual document scroller, propagates that viewport through navigation/selection consumers, and allows the document to continue behind Safari's collapsing controls. The compact touch header now scrolls in normal flow and both duplicate sticky Plan action treatments are disabled; desktop keeps all incumbent sticky behavior. The final physical pass confirmed that both Safari chrome regions contract normally, the prior bottom cutoff is gone, the top is no longer obscured by a sticky application edge, and the artifact remains visible beneath the browser's translucent controls. This matches WebKit's documented distinction between body scrolling and nested scrolling ([WebKit #240861](https://bugs.webkit.org/show_bug.cgi?id=240861)) and its solid extension around fixed/sticky edge content ([WebKit #301756](https://bugs.webkit.org/show_bug.cgi?id=301756#c2)). | The Plan reading surface now behaves like an ordinary Mobile Safari page instead of a fixed desktop application viewport. Code Review remains a separate phase because its multi-panel workspace cannot inherit Plan's reading-page composition unchanged. | Preserve the document-scroll/sticky-edge contract during later Plan work; apply an independently designed mobile workspace contract to Code Review. |
295295
| MOB-011 | P1 | Measured platform risk, Medium; primary fix implemented, physical gate pending | `data-pn-mobile-editable` now makes the primary Plan and Code Review authoring inputs compute to 16 px on compact/coarse surfaces without enlarging desktop labels or diff text. Deferred search, Settings, Ask AI, prompts, and source editing remain inventoried. | The primary Safari focus-zoom trigger is removed; unconverted secondary authoring inputs can still destabilize their later flows. | Verify no focus zoom on iPhone/iPad, then adopt the same marker as each deferred surface is implemented. |
296296
| MOB-012 | P2 | Source-confirmed platform risk, Medium; shared contract implemented, physical gate pending | Entry viewports now opt into `viewport-fit=cover`; CSS-owned safe-area variables protect the application stage and the primary portaled comment overlays. Historical secondary fixed panels remain inventoried for their owning phases. | Converted primary paths have one inset owner; unconverted secondary chrome can still overlap landscape notches or the home indicator. | Verify the primary overlays on notched iPhone/iPad hardware, then migrate later bottom-edge surfaces without double-counting root insets. |
297297
| MOB-013 | P2 | Observed + source-confirmed, High | `useIsMobile()` is `<768`; exactly 768 px is desktop. Plan also defaults the right panel open at `window.innerWidth >= 768`. | iPad portrait receives a 288 px empty rail and a squeezed document. | Base composition on available artifact width and input capability, not a single phone/desktop cutoff. |
298298
| MOB-014 | P2 | Source-confirmed, High | Settings is a centered desktop dialog; at 320 px its tab nav is 286 px wide with 585 px scroll content and its identity input is 13 px. | Settings are technically reachable but clipped/discoverability- and zoom-prone. | Treat settings as a mobile route/sheet with explicit section navigation and 16 px inputs. |
299-
| MOB-031 | P1 | Physical iPhone, High; Checkpoint 1B implemented, physical rerun pending | The primary Plan and Code Review composers now use the visible viewport, 16 px compact/coarse editables, non-forcing touch focus, reachable dismiss/submit controls, and draft recovery. Responsive browser checks passed down to 320×568 and a 390×500 keyboard-sized viewport. | The original phone failure is addressed in implementation, but Mobile Safari software-keyboard, safe-area, rotation, and background/return behavior are not proven by Chromium. | Repeat the full comment journey over Tailscale on iPhone and iPad; physical evidence wins over the responsive preflight. |
299+
| MOB-031 | P1 | Physical iPhone, High; Checkpoint 1B accepted | The primary Plan and Code Review composers use the visible viewport, 16 px compact/coarse editables, non-forcing touch focus, reachable dismiss/submit controls, and draft recovery. Responsive browser checks passed down to 320×568 and a 390×500 keyboard-sized viewport. The physical iPhone pass confirmed legible Plan input, intentional keyboard opening, no Safari focus zoom, successful save, and stable browser-chrome behavior; the user accepted the remaining previously exercised input behaviors without requesting a redundant rerun. | The primary phone composition contract is accepted. A separate physical iPad matrix and secondary authoring surfaces remain unproven and keep their own inventory entries. | Carry the shared editable/viewport contract into each later authoring surface and complete the iPad pass during 1C/final Phase 1 validation. |
300300

301301
### Hierarchy and noise issues
302302

Lines changed: 185 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,185 @@
1+
# Synthesis: Mobile Feedback Triage and Phase Sequence
2+
3+
Date: 2026-08-12
4+
Status: Phase 1B accepted; Phase 1C scoped for implementation review
5+
Source dossier: [`SPIKE-mobile-web-compatibility-20260812.md`](./SPIKE-mobile-web-compatibility-20260812.md)
6+
Foundation spec: [`mobile-platform-foundation-phase1-20260812.md`](../specs/mobile-platform-foundation-phase1-20260812.md)
7+
8+
## Decision
9+
10+
The accumulated physical-device review is sufficient. Do not ask the reviewer
11+
to repeat the Phase 1B composer checklist. The Safari stage failure was the
12+
blocking defect, and the final iPhone pass confirmed its correction.
13+
14+
Work now proceeds in this order:
15+
16+
1. **Phase 1C — shared touch and dialog contract.** Finish the small,
17+
capability-gated foundation without rearranging either product surface.
18+
2. **Phase 2A — mobile Code Review shell and arrival.** Replace the minified
19+
desktop composition with one primary phone surface and transient secondary
20+
navigation/context.
21+
3. **Phase 2B — mobile Plan shell and navigation.** Reduce persistent Plan
22+
chrome, restore the blocked folder/multi-file path, and stabilize edit and
23+
completion controls.
24+
4. **Phase 3 — touch selection and annotation semantics.** Prototype and
25+
validate multi-block Plan selection and multi-line Pierre selection as
26+
dedicated interactions.
27+
28+
This order is not a ranking of product importance alone. It separates shared
29+
mechanical safety from information architecture, then separates layout from
30+
the harder selection semantics. That keeps every review gate understandable
31+
and prevents a phone workaround from mutating desktop preferences.
32+
33+
## Closed or already moving in parallel
34+
35+
| Area | Disposition | Evidence / constraint |
36+
|---|---|---|
37+
| Tailscale installation and HTTPS Serve | Working | Physical iPhone sessions opened through the tailnet and returned real Plan and Review feedback. |
38+
| Mobile Safari page stage | Closed in 1B | Body scrolling and non-sticky compact Plan chrome now allow both Safari control regions to collapse; the user passed the result. |
39+
| Primary comment composition | Closed in 1B | 16 px authoring text, deliberate touch focus, visible-viewport bounds, draft recovery, and explicit Save are implemented. |
40+
| Release / first-use noise | Parallel stack already implemented | The release promo became a compact Grid/Clean decision; Vim, Ask AI, and analysis-layer startup announcements no longer mount. Features remain in Settings and their real surfaces. |
41+
| New-user Code Review panel default | Merged independently | `origin/main` includes the Tree-first change. Mobile presentation must not overwrite that desktop-first product default. |
42+
| Guided Review intro | Preserve | The reviewer found the initial Guide explanation useful. Guide is a strong candidate for mobile comprehension, not noise to remove. |
43+
| Edit Code to Suggest | Preserve | The tested dialog was acceptable; suggestion editing is not pulled into the next layout phase. |
44+
| All Files | Preserve and learn from | It was the cleanest Code Review presentation observed on the phone. |
45+
46+
## Triage matrix
47+
48+
`Now` means the next implementation checkpoint. `Next` is the first structural
49+
surface phase. `Later` means deliberately deferred, not forgotten.
50+
51+
| Owner | Findings | Severity | Why grouped here | Disposition |
52+
|---|---|---:|---|---|
53+
| Closed in Phase 1B | MOB-010, MOB-031 | P1 | Safari page-stage and primary composer defects passed the physical iPhone gate. They remain regression contracts, not open design work. | **Closed / protect** |
54+
| Phase 1C: shared touch/dialog | MOB-005, shared portion of MOB-012, shared dialog portion of MOB-014/MOB-030/MOB-032 | P1 | Undersized shared controls and unbounded shared dialogs are mechanical platform defects. Fixing the primitives first gives later layouts safe components without deciding their IA. | **Now** |
55+
| Phase 2A: Review shell/arrival | MOB-002, MOB-003, MOB-017, MOB-020, MOB-021, MOB-030, MOB-032, MOB-033 | P1 | These are one failure: desktop workspace regions remain simultaneous on a phone. Fixing panels separately would preserve the wrong composition. | **Next** |
56+
| Phase 2B: Plan shell/navigation | MOB-001, MOB-004, MOB-013, MOB-015, MOB-016, MOB-018, MOB-019, MOB-028 | P0/P1 | Plan reading now works, but navigation, editing completion, auxiliary arrival state, and persistent annotation chrome still fail or dominate. Folder navigation is the only current P0. | **After 2A** |
57+
| Phase 3A: Plan touch selection | MOB-008, MOB-009, MOB-029 | P1 | Pinpoint proves tap targeting can work, but ordinary native selection conflicts with Safari and multi-block intent has no interaction model. This needs prototypes, not CSS. | **Later, prototype first** |
58+
| Phase 3B: Review touch selection | MOB-006, MOB-007 | P1 | Single-line selection works; extending a range does not. Pierre rendering and line mapping are regression-sensitive and need their own guarded physical-device gate. | **Later, Pierre-guarded** |
59+
| Surface hardening | MOB-011 secondary inputs, MOB-014 Settings, MOB-022 HTML, MOB-024 diagnostics | P2 | These are real but should adopt the shared contract within their owning surfaces rather than expanding the first structural phase. | **Later** |
60+
| Delivery/performance/trust | MOB-023, MOB-025, MOB-026, MOB-027 | P1/P2 | Payload, tailnet trust, hook handoff, and reconnect behavior are cross-cutting delivery work, not layout work. They can be researched in parallel without changing current mobile IA. | **Independent track** |
61+
62+
## Immediate next implementation: Phase 1C
63+
64+
### Outcome
65+
66+
Shared buttons and shared dialog close controls are physically safe to touch,
67+
shared dialogs remain reachable inside the visible Safari viewport, and fine-
68+
pointer desktop geometry is unchanged.
69+
70+
### In scope
71+
72+
- Introduce the shared `--pn-touch-target` token and
73+
`data-pn-touch-target` marker.
74+
- Apply coarse-pointer 44×44 minimum hit regions to the two incumbent shared
75+
button primitives and the shared dialog close control.
76+
- Bound the shared dialog primitive to the visible viewport and safe-area
77+
contract established in 1A/1B.
78+
- Gate hover-only effects to hover-capable fine pointers in touched primitives.
79+
- Provide immediate, restrained press feedback and a reduced-motion path.
80+
- Convert only representative shared dialogs needed to prove the contract.
81+
- Verify iPhone and iPad geometry, including hybrid iPad touch plus pointer.
82+
83+
### Explicitly out of scope
84+
85+
- No mass expansion of every hand-authored Plan or Review toolbar control.
86+
- No Plan toolstrip redesign, bottom action bar, or mobile navigation.
87+
- No Code Review panel, Dockview, header, Guide, or diff composition change.
88+
- No Split/Unified preference write based on viewport.
89+
- No Pierre, `DiffViewer`, line-selection, or suggestion-editing changes.
90+
- No new sheet system or visual language.
91+
92+
### Implementation seam
93+
94+
The expected source boundary remains:
95+
96+
- `packages/ui/theme.css`
97+
- `packages/ui/components/ui/button.tsx`
98+
- `packages/ui/components/core/button.tsx`
99+
- `packages/ui/components/ui/dialog.tsx`
100+
- focused component and geometry tests
101+
102+
If a correct 44 px target breaks a dense hand-authored row, record it for its
103+
surface phase rather than introducing an undocumented compact exception.
104+
105+
### Gate for the next joint review
106+
107+
The checkpoint is ready for review when:
108+
109+
- representative button and dialog-close hit boxes measure at least 44×44 on
110+
a coarse pointer and do not overlap;
111+
- a shared dialog at 320×568, 390×844, and keyboard-reduced height keeps its
112+
close control and primary action reachable;
113+
- press feedback appears on touch-down without leaving sticky hover styling;
114+
- reduced-motion and hardware-keyboard dismissal remain functional;
115+
- iPad portrait/landscape and a touch-plus-trackpad path remain usable;
116+
- desktop screenshots and computed geometry show no layout change under a
117+
fine pointer;
118+
- production Plan and Review builds, focused tests, and typecheck pass.
119+
120+
The reviewer should expect a short physical-device check of representative
121+
controls and one shared dialog—not another end-to-end Plan or Code Review
122+
critique.
123+
124+
## Phase 2A preview: mobile Code Review shell and arrival
125+
126+
Phase 2A is the first structural redesign. Its job is to make the review
127+
artifact, not the desktop workspace, own the phone viewport.
128+
129+
### Fixed principles
130+
131+
- One primary full-width surface at a time on phone.
132+
- Tree remains the best new-user desktop default and is never overwritten by a
133+
mobile presentation decision.
134+
- File navigation, PR context, annotations, AI, and agents become transient
135+
phone surfaces instead of flex siblings that squeeze the diff.
136+
- Empty PR sections do not render structure merely to announce absence.
137+
- The phone header exposes location, navigation, and one contextual action;
138+
desktop-only controls move behind progressive disclosure.
139+
- A phone-friendly Unified presentation may be a session/device override, but
140+
it must not rewrite the user's desktop Split preference.
141+
- Guide and All Files are the two strongest observed mobile starting points.
142+
The entry decision should be made through working prototypes and physical
143+
review, not assumed from responsive screenshots.
144+
145+
### Phase 2A review gate
146+
147+
Before implementation is accepted, the reviewer will compare at least two
148+
working phone compositions using the same GitHub PR:
149+
150+
1. artifact-first All Files / Unified arrival;
151+
2. Guide-first arrival with a direct route to the raw diff.
152+
153+
The chosen composition must preserve desktop behavior, make file/PR context
154+
reachable without narrowing the artifact, keep the destination decision fully
155+
visible, and support a complete single-line comment and approve/send journey.
156+
Multi-line touch selection is explicitly evaluated in Phase 3, not used as a
157+
gate for the shell.
158+
159+
## Why selection is not bundled into layout
160+
161+
The user's Plan feedback established that Pinpoint is currently the only
162+
reliable touch path. A tap opens its contextual toolbar; Comment then opens the
163+
composer. Ordinary Select taps do nothing, native drag selection invokes the
164+
iOS Copy / Find Selection menu, and neither Plan nor Code Review offers a
165+
credible way to accumulate several logical targets.
166+
167+
This is not a hit-box bug. It is an unresolved gesture and state model. The
168+
selection phase must prototype explicit accumulation, visible range state,
169+
cancel/undo, scroll coexistence, and assistive-technology behavior. Review
170+
selection must additionally preserve Pierre's line mapping and desktop mouse
171+
range selection. Treating it as incidental work inside a layout PR would make
172+
both changes harder to review and easier to regress.
173+
174+
## Desktop preservation contract
175+
176+
Every phase keeps these invariants:
177+
178+
- mobile presentation state is ephemeral or device/session-scoped;
179+
- desktop Tree/Split/panel preferences are never rewritten by phone width;
180+
- fine-pointer geometry and keyboard shortcuts remain incumbent unless the
181+
phase explicitly names a desktop defect;
182+
- shared changes are capability-gated and tested in a strict
183+
`@plannotator/ui` consumer;
184+
- no existing working surface is deleted until physical and desktop parity is
185+
confirmed.

0 commit comments

Comments
 (0)