Repository navigation
fix(mobile): keep tab screen content reachable above the tab bar - #8079
Conversation
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit Assumptions: Verification is static; I did not run the mobile mounted suites. Files Reviewed (4 files)
Targeted current-code checks: Previous Review Summaries (7 snapshots, latest commit 92879f5)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 92879f5)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit Assumptions: Files Reviewed (1 file)
Targeted current-code checks: Previous review (commit 7656f56)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit Files Reviewed (2 files)
Previous review (commit f8bb5b1)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit Files Reviewed (12 files)
Previous review (commit fe3cb72)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit Files Reviewed (2 files)
Previous review (commit 69ad12a)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit only adds a documented Files Reviewed (1 file)
Previous review (commit 646d891)Status: No Issues Found | Recommendation: Merge Executive SummaryThe incremental commit adds a Files Reviewed (1 file)
Previous review (commit 8dd833b)Status: 1 Issue Found | Recommendation: Address before merge Overview
Issue Details (click to expand)CRITICAL
Files Reviewed (1 file)
Reviewed by deepseek-flash-latest · Input: 75.8K · Output: 8.7K · Cached: 1M Review guidance: REVIEW.md from base branch |
|
bot: Android verification on this VM against the local dev stack, owned fake account, analytics off. Environment variables inline form after the fix: the Cancel/Save buttons sit fully above the tab bar in portrait and landscape. In landscape the buttons' bottom edge measures y≈865 against the tab bar's top at y≈961. Home in landscape at large display size scrolls its full content; at scroll end the last row clears the bar. The two reported Home findings and the Agents empty-state finding did not reproduce on this build; details in the PR body. |
|
bot: Added the missing Up Next observation: with a seeded to-do item, Home in landscape renders the Up Next heading and its row; one scroll brings both fully above the tab bar (heading bottom y≈875, row y≈708–764, bar top y≈961). At rest the heading clears the bar; the row below it scrolls up normally. |
|
bot: Android verification of the profile agents tab screen on this VM, against the local dev stack: owned fake account, optional analytics off, six fixture agents on a test profile.
This is the surface where the earlier report placed the action under the bar and had the tap land on another tab. |
The proposal list now ends with the shared tab bar clearance, matching the review list and the other list screens, so the last proposal scrolls clear of the bar in both orientations.
|
bot: Review memory list verification on this VM's Android emulator, against the local dev stack: owned fake account, optional analytics off, 20 seeded proposal rows.
The two captures show the end of the list in landscape and portrait after the change. |
|
bot: Two more surfaces exercised on this VM's Android emulator against the local dev stack, same owned fake account.
|
…bar-clearance # Conflicts: # apps/mobile/src/components/profiles/profile-commands-screen.tsx
The passkeys screen scrolls its body above a footer that already reserves the tab bar, so in a phone held sideways the body band is shorter than the empty state's icon bubble plus its copy: only the key icon rendered and the title and hint started below the fold. The screen now renders the compact empty state there, and a compact top-pinned state drops the fixed top air.
|
bot: Android emulator against the local dev stack, signed in with an owned test account (optional analytics off), Profile → Preferences → Account → Passkeys with no stored passkeys, then rotated to landscape at
Density was reset and the device returned to portrait afterwards. The account is a locally seeded test user on this VM; no production data is shown. |











Summary
ScrollView, so their content could sit behind the absolute bottom tab bar; the inline add/edit form's Cancel/Save buttons ended up under the bar with only a sliver above it.TabScreenScrollView, the shared tab-screen scroller whose viewport ends at the tab bar's top edge, matching the Profile overview and the documented rule inapps/mobile/AGENTS.md("UseTabScreenScrollViewfor scrolling screens under the absolute tab bar").automaticallyAdjustKeyboardInsets,keyboardShouldPersistTaps) is preserved on every migrated screen;TabScreenScrollViewsupports both.ScrollViewinside the sheet.useTabBarBottomPadding), the same way the sibling review list does, so the last proposal scrolls clear of the bar.Investigation notes
main:TabScreenScrollView, whose frame margin already ends the viewport at the tab bar's top edge (components/tab-screen.tsx).EmptyState/CenteredStatewith the screen'sStateSurfaceInsetsband and a compact presentation decision for short bands.wm density 560):wm density 560the state's content is taller than the space above the bar: its centered form overlaps the bar at rest and the state scrolls, so both actions become fully visible and tappable after one swipe. The reported "content does not scroll" behavior did not reproduce at either size.main— the Home tab-bar clipping, the Agents empty-state clipping (both actions render above the bar at default density and the state scrolls at large display size), and the Home no-scroll finding; the confirmed variables-screen defect is fixed here.Verification
pnpm dev:start mobile, Metro, Postgres), owned fake account via the app's email-code sign-in, optional analytics off.wm density 560(reset afterwards): full content reachable by scroll, last row clear of the bar at scroll end. With a seeded to-do item the Up Next section heading and its row render and scroll fully above the tab bar (heading bottom y≈875, row y≈708–764, bar top y≈961). Atwm density 560the New coding task action sits in the scroll content rather than pinned: when scrolled into view its bounds are y653–807 against a bar top of y807 and it moves up with further scrolling, so it is never held under the bar; the EXPLORE cards below it end at y751. Agents exercised in landscape at default density: empty-state actions fully above the bar.wm density 560(reset afterwards) the action was y463–617 against a bar top of y807 and the tap opened the same sheet.wm density 560in landscape (reset afterwards): at rest the centered form spans y596–996 against a bar top of y807, and the state scrolls; after one swipe New session sits at y540–663 and Session history at y700–752, both above the bar, and tapping Session history opened the history screen.pnpm typecheck,pnpm lint,pnpm check:unused,pnpm format:checkpass inapps/mobile;@kilocode/harness-sdkand@kilocode/trpcbuilt first.pnpm --filter kilo-app run testis 1207 files, 18063 tests, all passing. The new passkeys landscape suite covers the portrait, phone-landscape and tablet-landscape presentations.mainis merged in. The single conflicting file (the commands screen) keeps the newer save-on-exit header and back handler frommaintogether with the shared scroller, and its new save-on-exit suite mocks the scroller the same way its sibling suites do.wm density 560(reset afterwards), rotated with the screen open: before the change, with no scroll applied, the title was clipped at the body's bottom edge (its accessibility bounds ended at y=560, the body viewport's edge) and the hint started at y=598, below it; only the key icon was painted, and the copy appeared only after a scroll. After the change the title occupies y≈347–433 and the hint y≈445–507 inside the body, above the footer Add control at y≈597 and the tab bar at y≈807, with no scroll. Portrait keeps the full stack (icon bubble at y≈625–709, title y≈802–888, hint y≈900–1023), and landscape at default density keeps the copy visible at y≈261–381.Proxy answers
The owner's proxy gave these answers in the owner's place.
Answer: Fix all four in one PR (Recommended)
Confidence: 0.80 · Precedent: Fix the root cause and the class of the issue on every affected surface: session 7f3470e0ba6f, "fix class of issue preventing progress"
wm density(display size) instead?Answer: wm density via adb (Recommended)
Confidence: 0.90 · Precedent: Never change simulator font scaling: session ad6a3f589364, "never mess with simulator font scaling, always use the default"
Answer: Ship confirmed fixes, document non-repro (Recommended)
Confidence: 0.80 · Precedent: If a defect does not reproduce, ship the reasonable fix and close the task: session 9dc66123e7f3, owner chose "Merge fix(mobile): polish quick chat composer edge and session list loading rows #7613 and close this"
Answer: Call-site fix over shared surgery (Recommended)
Confidence: 0.60 · Precedent: Fix the root cause and the class of the issue: session 00eb2a1d3e4b, "if anything repeats the same mistake over and over again, fix the class". The root cause is the caller that breaks the contract. Also move any other tab screens that use a plain ScrollView onto TabScreenScrollView.
Answer: Reproduce, fix only if real (Recommended)
Confidence: 0.80 · Precedent: Fix the root cause and the class on every affected surface; also, if you saw a gap, fix it.