fix(mobile): agents session-list scroll behavior + session platform icons - #4773
Conversation
|
(bot) Standin review — posted because the automated reviewer is broken: the Verdict: 3 findings (0 blocker, 0 major, 1 minor, 2 nit) Findings
Verified explicitly (no issues found)
Triage and repairs for the findings above follow in a subsequent comment. |
The platform-icon + branch wrapper in the session-row eyebrow-right slot had no shrink constraint, defeating the inner meta Text's shrink: a long repo-name eyebrow plus icon plus meta overflowed instead of truncating. Add shrink to the wrapper only; pre-existing wrappers are untouched.
…it coverage The committed-query scroll-to-top effect shipped without automated coverage. Extract the selection decision into the pure shouldResetScrollOnCommittedQuery(prev, next) helper — false on initial mount and on unchanged query, true on any committed change — and cover the branches with unit tests. Effect behavior is unchanged.
|
(bot) Triage of the standin review above — all three findings verified valid against the code and repaired. Repairs are pushed as head Finding 1 (minor — search-scroll disclosure/coverage): valid. Repaired in two parts:
Finding 2 (nit — icon wrapper defeats meta shrink): valid. Repaired in Finding 3 (nit — "decorative" detail icon exposed to screen readers): valid as a description mismatch; resolved by description, keeping the implementation. The accessible implementation is the desirable one: the detail header carries no other platform text, so the labeled informative image is the only spoken platform indication, and no acceptance criterion is violated. The PR description now states this precisely: detail icon = 14px, non-interactive, exposed as an informative image labeled with the platform name; list icon = purely decorative ( Repair checks (from Next: a fresh full-diff standin review of head |
|
(bot) Standin review, round 2 — head Verdict: No findings. Round-1 repair confirmation
Verified explicitly on this head
Residual testing risks (reviewer's own disclosure): this pass was unit tests plus code/library-source inspection — no on-device coverage of the scroll behaviors, icon rendering, or VoiceOver wording on this head. The focused device-E2E rerun reported separately covers exactly that surface. This concludes the standin review loop: two rounds, three findings repaired and confirmed, no actionable findings remaining on the latest head. |
|
(bot) Focused device-E2E rerun on head This rerun was required because the standin-review repairs touch the session-list surface. Results:
Zero product failures. Transient test-environment issues only (concurrent Maestro driver contention, a foreign simulator rename mid-run — reclaimed per protocol), none affecting verdicts. The verifier made one sanctioned temporary edit (a login-flow settle regex for an iOS dialog variant) and restored it byte-for-byte (SHA-256 verified); the worktree ended clean at One disclosed residual: an explicit long-repo-name eyebrow + icon overflow/truncation assertion was not produced on device (no suitable seeded session); that edge is covered by the Completion status from this workflow's side: standin review loop closed (round 2: no findings), CI green on |
Summary
Batch B of the Mobile Agents session-list UX work — two confirmed defect fixes, one scroll-behavior hardening, and one feature, shipped as four coherent commits:
SectionListwas keyed on${sortBy}:${attentionFocusRevision}, so any attention-revision change while the frozen list was away remounted it on return and dropped the scroll offset. The remount was introduced by Notify and surface when a remote/cloud-agent session needs input #4605 to refresh ack state in frozen cells, but rows already self-subscribe viauseSessionAttentionRevision(). The list now keys only onsortBy(sort changes still remount, as before) and passes the focus-snapshotted attention revision asextraData, which re-renders visible cells after unfreeze without remounting.useScrollToTopfrom@react-navigation/nativeto the list ref — standard iOS tab-bar behavior, animated, composing with the existing haptics-onlytabPresslistener.prevSearchQueryRefeffect scrolls the list to top (non-animated) when the committed, debounced query changes — never on initial mount, focus refetch, attention revision, sort remount, pagination, pull-to-refresh, or section-data identity changes with an unchanged query. The selection decision lives in the pureshouldResetScrollOnCommittedQuery()helper with unit coverage; the acceptance E2E runbook carries the search regression assertion.accessible={false}), and the same icon on the session detail header between the back button and the title (14px, non-interactive; exposed to screen readers as an informative image labeled with the platform name, since the detail header carries no other platform text). Mapping:cloud-agent/cloud-agent-web→ cloud,cli→ terminal,vscode/agent-manager→ code,slack,github; unmapped/unknown platforms render nothing by design.SlackIcongained a backward-compatible monochromecolorvariant. Rows in NEEDS INPUT state keep the attention treatment with no icon. In list rows, VoiceOver appendsfrom <PLATFORM>only when the eyebrow badge is a repo name (otherwise the badge already speaks the platform). Data for the detail icon comes from an additivecreated_on_platformfield oncliSessionsV2.getWithRuntimeState(web behavior unchanged).Verification
/var/folders/pz/_kmbp8vs2755j415slh2hz100000gn/T/kilo/repro2-ack-scroll.ksZpPA/); the Agents tab re-tap reproduced (/var/folders/pz/_kmbp8vs2755j415slh2hz100000gn/T/kilo/session-list-repro.ehpQbw/); the search-query scroll reset did not reproduce and is shipped as hardening (item 3).pnpm format && pnpm typecheck && pnpm lint && pnpm check:unused && pnpm test(apps/mobile: 228 files, 1891 tests) and rootpnpm run typecheck && pnpm run lint && pnpm run format:changedall green.