Skip to content

fix(mobile): keep Filter sessions sheet actions visible in short windows - #6460

Merged
iscekic merged 2 commits into
mainfrom
kwf/explorer-agents-filter-the-filter-sessions-sheet-header-s-043cb-f21d
Sep 21, 2026
Merged

iscekic merged 2 commits into
mainfrom
kwf/explorer-agents-filter-the-filter-sessions-sheet-header-s-043cb-f21d

Conversation

@iscekic

@iscekic iscekic commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • The Filter sessions sheet keeps its Cancel and Apply controls visible in short or landscape windows.
  • The option list scrolls inside the sheet instead of pushing the action row off screen.
  • The sheet is centered and inset from the device edges, including safe areas.

Changelog for maintainers

  • The sheet card now caps its height at the window minus safe-area insets and a 24px edge margin per side.
  • Root cause: Yoga resolves vertical percentage padding against the parent's width, so the removed pt-[20%] pushed the pinned action row past the bottom of short landscape windows.
  • The wrapper changed from top-aligned pt-[20%] to centered content with explicit paddingTop/paddingBottom inset padding.
  • The option ScrollView gains shrink, so it scrolls within the capped card while the header and action row stay fixed.
  • The action row is not inside the scroll view; the new test asserts the option list contains zero buttons and the sheet contains exactly two.
  • Mounted modal tests now mock useWindowDimensions and useSafeAreaInsets, and cover both the window cap and the inset-reserved cap.
  • The session-history mounted test stubs react-native-safe-area-context because its modal importOriginal pulls in that package's untranspiled src/ entry.
  • Review focus: the cap arithmetic windowHeight - insets.top - insets.bottom - SHEET_EDGE_MARGIN * 2 and the Math.max(0, …) floor.

E2E proof

[e2] ux-check: Open the sheet when there are few options (empty project section): the short card renders its Cancel/Apply row at the card's bottom edge with no clipped content and no vertical jump. — android emulator-5554, landscape 2400x1080 (short window); SCENE e2 OK. Digest: sheet card 'Filter sessions' [55,215][2345,865]; option rows PLATFORM CLI [101,400][2299,492] and PROJECT Kilo-Org/cloud [101,575][2299,667]; 'Cancel' [1933,703][2114,818] and 'Apply' [2141,703][2299,818] both sit below the last option row and inside the card bottom (818 < 865) and window bottom (865 < 1080), so the action row is present and unclipped. Two consecutive opens report identical bounds (e2-scene.log lines 45-58 and 59-72), i.e. no vertical shift between opens; the motion/appearance judgement belongs to…

ux-check: Open the sheet when there are few options (empty project section): the short card renders its Cancel/Apply row at the card's bottom edge with no clipped content and no vertical jump. — e2.png

[e4] ux-check: scroll the open Filter sessions sheet to its last platform/project row; every option reachable and selectable, list scrolls independently, Cancel/Apply row stays pinned — android emulator-5554: p4bottom-scene.xml shows the list scrolled to its end with the last project row text="acme/widgets" bounds="[202,686][2272,732]" and the PROJECT header shown, while the action row kept the exact top-of-list bounds Cancel [1972,827][2074,873] / Apply [2177,827][2261,873] (p4top-scene.xml) - pinned through the scroll; the last row is selectable (e4-row-selected.txt: content-desc="acme/widgets" checkable="true" checked="true") and applying it filtered the list to text="WIDGETS" with content-desc="Filter sessions, 1" (p4applied-scene.xml). The scripted e4 scene could not…

[e4] ux-check: scroll the open Filter sessions sheet to its last platform/project row; every option reachable and selectable, list scrolls independently, Cancel/Apply row stays pinned — prior/p4applied.png

[e4] ux-check: scroll the open Filter sessions sheet to its last platform/project row; every option reachable and selectable, list scrolls independently, Cancel/Apply row stays pinned

[e4] ux-check: scroll the open Filter sessions sheet to its last platform/project row; every option reachable and selectable, list scrolls independently, Cancel/Apply row stays pinned — prior/p4bottom.png

[e1] [landscape short window] Filter sessions sheet bounded in landscape (android) — android, landscape 2400x1080: e1-scene.log line 1 'SCENE e1 OK'; its digest shows window [0,0][2400,1080] with PLATFORM [101,405][2299,442], Cancel [1933,653][2114,768] and Apply [2141,653][2299,768] all inside it, and the scripted Cancel closed the sheet (absent Apply) before it was reopened; the still for the visual reviewer is e1.png (sheet open in landscape) — no UX-DEFECT on the sheet or the Agents list.

[e1] [landscape short window] Filter sessions sheet bounded in landscape (android) — scripted-shard1/e1.png

[e2] ux-check: Open the sheet when there are few options (empty project section): the short card renders its Cancel/Apply row at the card's bottom edge with no clipped content and no vertical jump.

[e2] ux-check: Open the sheet when there are few options (empty project section): the short card renders its Cancel/Apply row at the card's bottom edge with no clipped content and no vertical jump. — e2e-mobile-app/e2.png

[e8] ux-check: rotate the device while the sheet is open; the sheet re-fits the window with no option or button clipped and the action row still visible — android emulator-5554: in landscape probe8L-scene.xml shows only Cloud..GitHub with GitHub clipped at bounds="[202,738][2272,756]"; after rotating to portrait with the sheet still open, e8-portrait-snapshot.txt lists all seven platform options (Cloud, Extension, CLI, Slack, GitHub, Linear, Other), the PROJECT rows and CheckBox "acme/widgets" [checked], plus Button "Cancel" and Button "Apply" - no option or button clipped, action row visible; e8-portrait-sheet.png is the same moment at 1080x2400. The rotation is an OS action with no scene step and appium re-orients to landscape per session…

[e8] ux-check: rotate the device while the sheet is open; the sheet re-fits the window with no option or button clipped and the action row still visible — prior/e8-portrait-sheet.png

[e2] Filter sessions sheet: Apply commits, count announced, reopened sheet checked — android emulator-5604 portrait (STATE HIT signed-in-home, sim-tool rotate portrait); the account has no 'Extension' platform (e2-sheet-open.txt lists only content-desc="CLI" and content-desc="Kilo-Org/cloud"), so per the runbook the parked step was edited to the sheet's own CLI row: SCENE e2 OK (e2-scene.log), the closed sheet's filter button carried content-desc="Filter sessions, 1" (e2-filtered.txt) proving the confirm commits, and the reopened portrait content-height card [55,908][1025,1557] showed content-desc="CLI" checkable="true" checked="true" with Cancel [652,1430][754,1476] and…

[e2] Filter sessions sheet: Apply commits, count announced, reopened sheet checked — prior/e2-sheet-open.png

E2E proof — log excerpts

[e2] ux-check: Open the sheet when there are few options (empty project section) -> pass :: android emulator-5554, landscape 2400x1080 (short window); SCENE e2 OK. Digest: sheet card 'Filter sessions' [55,215][2345,865]; option rows PLATFORM CLI [101,400][2299,492] and PROJECT Kilo-Org/cloud [101,575][2299,667]; 'Cancel' [1933,703][2114,818] and 'Apply' [2141,703][2299,818] both sit below the last option row and inside the card bottom (818 < 865) and window bottom (865 < 1080), so the action row is present and unclipped. Two consecutive opens report identical bounds (e2-scene.log lines 45-58 and 59-72), i.e. no vertical shift between opens; the motion/appearance judgement belongs to the visual reviewer. Capture for the visual reviewer: e2.png. Observed option set had one platform a
[e1] ux-check: In the repro state (short landscape window), open the Filter sess -> pass :: jev read the digest: pass (confidence 1.00)
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-agents-filter-the-filter-sessions-sheet-header-s-043cb-f21d/e2e-mobile-app/e2-sheet-short.log
SCENE e2 OK
android.widget.FrameLayout android:id/content tappable [0,0][2400,1080]
android.view.ViewGroup Filter sessions tappable [55,215][2345,865]
android.view.View Filter sessions tappable [100,260][2298,316]
android.widget.TextView PLATFORM tappable [101,354][2299,391]
android.widget.CheckBox CLI tappable [101,400][2299,492]
android.widget.TextView CLI tappable [202,422][2272,468]
android.widget.TextView PROJECT tappable [101,529][2299,566]
android.widget.CheckBox Kilo-Org/cloud tappable [101,575][2299,667]
android.widget.TextView Kilo-Org/cloud tappable [202,597][2272,643]
android.widget.Button Cancel tappable [1933,703][2114,818]
android.widget.TextView Cancel tappable [1972,737][2074,783]
android.widget.Button Apply tappable [2141,703][2299,818]
android.widget.TextView Apply tappable [2177,737][2261,783]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-agents-filter-the-filter-sessions-sheet-header-s-043cb-f21d/e2e-mobile-app/e2-scene.log
android.widget.TextView PLATFORM tappable [101,354][2299,391]
android.widget.CheckBox CLI tappable [101,400][2299,492]
android.widget.TextView CLI tappable [202,422][2272,468]
android.widget.TextView PROJECT tappable [101,529][2299,566]
android.widget.CheckBox Kilo-Org/cloud tappable [101,575][2299,667]
android.widget.TextView Kilo-Org/cloud tappable [202,597][2272,643]
android.widget.Button Cancel tappable [1933,703][2114,818]
android.widget.TextView Cancel tappable [1972,737][2074,783]
android.widget.Button Apply tappable [2141,703][2299,818]
android.widget.TextView Apply tappable [2177,737][2261,783]
SCENE e2 OK
android.widget.FrameLayout android:id/content tappable [0,0][2400,1080]
android.view.ViewGroup Filter sessions tappable [55,215][2345,865]
android.view.View Filter sessions tappable [100,260][2298,316]
android.widget.TextView PLATFORM tappable [101,354][2299,391]
android.widget.CheckBox CLI tappable [101,400][2299,492]
android.widget.TextView CLI tappable [202,422][2272,468]
android.widget.TextView PROJECT tappable [101,529][2299,566]
android.widget.CheckBox Kilo-Org/cloud tappable [101,575][2299,667]
android.widget.TextView Kilo-Org/cloud tappable [202,597][2272,643]
android.widget.Button Cancel tappable [1933,703][2114,818]
android.widget.TextView Cancel tappable [1972,737][2074,783]
android.widget.Button Apply tappable [2141,703][2299,818]
android.widget.TextView Apply tappable [2177,737][2261,783]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-agents-filter-the-filter-sessions-sheet-header-s-043cb-f21d/e2e-mobile-app/scripted-e1.log
SCENE e1 OK
android.widget.FrameLayout android:id/content tappable [0,0][2400,1080]
android.view.ViewGroup Filter sessions tappable [55,215][2345,865]
android.view.View Filter sessions tappable [100,260][2298,316]
android.widget.TextView PLATFORM tappable [101,354][2299,391]
android.widget.CheckBox CLI tappable [101,400][2299,492]
android.widget.TextView CLI tappable [202,422][2272,468]
android.widget.TextView PROJECT tappable [101,529][2299,566]
android.widget.CheckBox Kilo-Org/cloud tappable [101,575][2299,667]
android.widget.TextView Kilo-Org/cloud tappable [202,597][2272,643]
android.widget.Button Cancel tappable [1933,703][2114,818]
android.widget.TextView Cancel tappable [1972,737][2074,783]
android.widget.Button Apply tappable [2141,703][2299,818]
android.widget.TextView Apply tappable [2177,737][2261,783]
Owner request

Explorer finding: agents-filter: The Filter sessions sheet header shows only its centered title, with no visible Cancel or Apply control even though the sheet requires a way to confirm or dismiss the filters.

The user-agent explorer found this while using the app like a user.
One finding per item; the explorer never edits product code.

Flow: agents-filter
Found on revision: f2181ae

Repro:

  1. set this state first: credits 30; reviews 5; org; density 560; uimode day; battery 18 discharging; relaunch; the device in light mode
  2. open the app on emulator-5602
  3. reach agents-filter
  4. the capture shows the defect named below

Observed: The Filter sessions sheet header shows only its centered title, with no visible Cancel or Apply control even though the sheet requires a way to confirm or dismiss the filters.
Expected: the screen renders without this defect

Evidence (from the device run):

[e6] ux-check: sheet action row sits above the bottom inset — android emulator-5604 portrait with gesture bar; opened sheet SCENE e6 OK renders the action row inside the card (Filter sessions card [55,908][1025,1557]) with Cancel [613,1396][794,1511] and Apply [821,1396][979,1511] inside the content frame [0,0][1080,2400] and 684px above the app's bottom tab bar [0,2195][360,2337] (e6-list.txt), so neither the status bar nor the navigation/gesture area can overlap it and the row is hittable (Apply at those exact bounds committed in e2, e2-scene.log SCENE e2 OK); no UX-DEFECT observed (no layout shift, duplicate spinner, or missing state); pixel…

[e6] ux-check: sheet action row sits above the bottom inset — e6.png

[e4] ux-check: scroll the open Filter sessions sheet to its last platform/project row; every option reachable and selectable, list scrolls independently, Cancel/Apply row stays pinned — android emulator-5554: p4bottom-scene.xml shows the list scrolled to its end with the last project row text="acme/widgets" bounds="[202,686][2272,732]" and the PROJECT header shown, while the action row kept the exact top-of-list bounds Cancel [1972,827][2074,873] / Apply [2177,827][2261,873] (p4top-scene.xml) - pinned through the scroll; the last row is selectable (e4-row-selected.txt: content-desc="acme/widgets" checkable="true" checked="true") and applying it filtered the list to text="WIDGETS" with content-desc="Filter sessions, 1" (p4applied-scene.xml). The scripted e4 scene could not…

[e4] ux-check: scroll the open Filter sessions sheet to its last platform/project row; every option reachable and selectable, list scrolls independently, Cancel/Apply row stays pinned — p4top.png

Follow-ups (not changed here)

  • not proved live: [landscape short window] Rotate the emulator to landscape FIRST with $KILO_WORKFLOW/v2/bin/sim-tool.sh --device <serial> --platform android rotate landscape, then restore start state signed-in-home (its tab-bar assert holds in landscape). Reach the Agents tab and open the Filter sessions sheet: the sheet's PLATFORM list AND its Cancel/Apply row are both inside the window (on the unfixed tree the action row sits ~350dp below the bottom edge), and Cancel closes the sheet without applying. The scene ends with the sheet open, so its still shows the bounded sheet in landscape — that still is the required visual evidence for this fix. (no capture cited it)
  • not proved live: [portrait] Rotate back to portrait ($KILO_WORKFLOW/v2/bin/sim-tool.sh --device <serial> --platform android rotate portrait), then restore start state signed-in-home. On the Agents tab, open the Filter sessions sheet, tap the sheet's own 'Extension' platform row, then Apply: the sheet closes and the filter button now announces the applied count ('Filter sessions, 1'), proving the confirm control is reachable and commits. Reopen the sheet so the still shows the portrait content-height sheet with the selection checked and Cancel/Apply visible. (no capture cited it)
  • not proved live: ux-check: In that open sheet, scroll the option list to its last platform/project row: every option is reachable and selectable, the list scrolls independently, and the Cancel/Apply row stays pinned and visible the whole time. (no capture cited it)
  • not proved live: ux-check: In the repro state (short landscape window), open the Filter sessions sheet: both Cancel and Apply are fully visible inside the sheet without scrolling any list, and the sheet is not clipped by the bottom edge. (no capture cited it)
  • not proved live: ux-check: Open the sheet on a device with home indicator/gesture bar: the action row sits above the bottom inset and is not obstructed by the system bar or the status bar at the top. (no capture cited it)
  • not proved live: ux-check: Rotate the device while the sheet is open: the sheet re-fits the window with no option or button clipped and the action row still visible. (no capture cited it)
  • not proved live: ux-check: Tap Apply after changing a checkbox: the sheet dismisses and the agent session list reflects the new filter; tap Cancel/backdrop after changing a checkbox: the sheet dismisses and the list is unchanged. (no capture cited it)

Open findings (not fixed here)

  • not proved live: agents-filter.png is no longer on the host that took it, so no publish can carry it

e1

Explorer finding: agents-filter: The Filter sessions sheet header shows only its centered title, with no visible Cancel or Apply control even though the sheet requires a way to confirm or dismiss the filters.

The user-agent explorer found this while using the app like a user.
One finding per item; the explorer never edits product code.

Flow: agents-filter
Found on revision: f2181ae

Repro:
1. set this state first: credits 30; reviews 5; org; density 560; uimode day; battery 18 discharging; relaunch; the device in light mode
2. open the app on emulator-5602
3. reach agents-filter
4. the capture shows the defect named below

Observed: The Filter sessions sheet header shows only its centered title, with no visible Cancel or Apply control even though the sheet requires a way to confirm or dismiss the filters.
Expected: the screen renders without this defect

Evidence (from the device run):
- ~/.local/share/kwf/findings/explorer-agents-filter-the-filter-sessions-sheet-header-s-043cb615/agents-filter.png
@kilo-code-bot

kilo-code-bot Bot commented Sep 21, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

Reviewed the mobile Filter sessions sheet fix (window/safe-area height cap, centered inset padding, shrink-scrolling option list) and its accompanying tests; no defects found in the changed lines.

Files Reviewed (3 files)
  • apps/mobile/src/components/agents/platform-filter-modal.tsx
  • apps/mobile/src/components/agents/platform-filter-modal.mounted.test.tsx
  • apps/mobile/src/components/agents/session-history-screen.mounted.test.tsx

Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0

Review guidance: REVIEW.md from base branch main

@iscekic

iscekic commented Sep 21, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: [landscape short window] Rotate the emulator to landscape FIRST with $KILO_WORKFLOW/v2/bin/sim-tool.sh --device <serial> --platform android rotate landscape, then restore start state signed-in-home (its tab-bar assert holds in landscape). Reach the Agents tab and open the Filter sessions sheet: the sheet's PLATFORM list AND its Cancel/Apply row are both inside the window (on the unfixed tree the action row sits ~350dp below the bottom edge), and Cancel closes the sheet without applying. The scene ends with the sheet open, so its still shows the bounded sheet in landscape — that still is the required visual evidence for this fix. (no capture cited it)

A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision.

@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 21, 2026
@iscekic iscekic self-assigned this Sep 21, 2026

@eshurakov eshurakov left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved after a shallow triage pass. No blocking findings.

@iscekic
iscekic merged commit 441445b into main Sep 21, 2026
28 checks passed
@iscekic
iscekic deleted the kwf/explorer-agents-filter-the-filter-sessions-sheet-header-s-043cb-f21d branch September 21, 2026 19:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

human-ready The PR is ready for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants