Conversation
Explorer finding: a control is too small to tap reliably The user-agent explorer found this while using the app like a user. One finding per item; the explorer never edits product code. Flow: accessibility Found on revision: 5327758 Repro: 1. set this state first: the device in light mode 2. open the app on emulator-5554 3. reach the screen named agents-filtered-cli, agents-list, agents-search-empty 4. the capture shows the defect named below Observed: controls below 28dp on a side: agents-filtered-cli: 1 small control(s): تصفية الجلسات, 1 (30x30px) agents-list: 1 small control(s): تصفية الجلسات (30x30px) agents-search-empty: 2 small control(s): تصفية الجلسات (30x30px); مسح البحث (24x24px) agents-search-readme: 2 small control(s): تصفية الجلسات (30x30px); مسح البحث (24x24px) Expected: every control is at least 28dp on a side Evidence (from the device run): - ~/.local/share/kwf/findings/explorer-a-control-is-too-small-to-tap-reliably-f87d434d/agents-filtered-cli.png - ~/.local/share/kwf/findings/explorer-a-control-is-too-small-to-tap-reliably-f87d434d/agents-list.png - ~/.local/share/kwf/findings/explorer-a-control-is-too-small-to-tap-reliably-f87d434d/agents-search-empty.png - ~/.local/share/kwf/findings/explorer-a-control-is-too-small-to-tap-reliably-f87d434d/agents-search-readme.png
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Files Reviewed (5 files)
Verified: Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0 Review guidance: REVIEW.md from base branch |
|
This description names a scenario the proof did not capture:
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. |
|
Closing as a duplicate of #6395. This PR and ten others came from the same explorer finding, #6395 is kept because it is the broadest of the group (14 files of the 34 the group touches). Any screen still below the tap-target bar after #6395 merges will be found again by the same scan, and will now arrive as one finding: the intake refuses a finding whose slug already has an open PR or a live section (kwf 07c842fd). |
|
Reopened — I closed this in error. I closed it as a duplicate of #6395 on the grounds that eleven PRs shared one explorer finding. That was right about the finding and wrong about this PR: it is not a subset of #6395. It changes files #6395 does not touch, so closing it discarded real work rather than removing a copy. Checked properly: of the ten I closed, only #6365 and #6363 are true subsets of #6395. The other eight, including this one, each fix a screen or a helper the keeper leaves alone. What remains true: these PRs overlap on Apologies for the churn. |
|
Closing so this defect has one PR instead of nine. All nine came from the same explorer finding, #6395 is kept as the broadest (14 files). I reopened this PR earlier today after closing it, because it is not a subset of #6395 and I did not want to pretend otherwise. The work it carries is not being dropped: the six source files across this group that #6395 does not touch are now one queued item,
One change through the shared helper is a better answer than nine screen-by-screen edits that conflict. Cause, now fixed: each finding was dispatched the moment it was found. The explorer pools findings for an hour and dispatches one item per defect (kwf d25ae7de), and the intake refuses a slug that already has open work (kwf 07c842fd). |
Changelog for users
Changelog for maintainers
hitSlopwidens the touch region but never the reported accessibility node, so each control now sizes its own box.apps/mobile/src/lib/a11y/tap-target.tsexportsMIN_TAP_TARGET_DP(28),TOUCH_TARGET_DP(44),MIN_TAP_TARGET_CLASS, andhitSlopPerSide.MIN_TAP_TARGET_CLASSholds literal NativeWind classes so the class scanner still sees them.session-filter-button.tsxwraps the icon in a fixed 20dp slot and pins the count badge inside it, so centering the icon in the 28dp box keeps the badge on the corner.session-list-search-header.tsxapplies the same box to the clear-search button, withhitSlopPerSide(28)= 8 per side (44dp total).E2E proof
[e1] Agents tab with one filter applied (agents-filtered-cli), confirm the filter control still measures at least 28dp per side and its count badge still sits on the icon's top-right corner. — android emulator-5554: SCENE e1 OK (e1-scene.log, 'android.widget.Button Filter sessions, 1 tappable [949,186][1022,260]') after Filter sessions > CLI > Apply from the needs-input fixture state, with the parked anchor corrected to the live tab label 'Agents, 1 needs input, tab, 2 of 3'; the full dump (e1-final.txt) shows the control's own node [949,186][1022,260] = 73x74px for the declared 28dp min box (28dp = 73.5px; the 20dp icon renders 53x52px), up from the finding's 30x30px, and the badge node resource-id 'session-filter-badge' [998,186][1015,221] overhangs the sliders icon…
[e1] Light mode on emulator-5554, open the Agents tab (agents-list), dump the UI and confirm the filter control (accessibility label 'Filter sessions' / 'تصفية الجلسات') has bounds of at least 28dp on… — android/emulator-5554; light mode set by $KILO_WORKFLOW/e2e/device-state.sh emulator-5554 android (exit 0), locale en-US so the label is 'Filter sessions'. SCENE digest e1.txt: 'content-desc="Filter sessions" resource-id="agents-open-filters" ... bounds="[949,186][1022,260]"' = 73x74px; at the emulator's 420dpi (density 420/160=2.625, confirmed by the 20dp icon node at 52.5px and 16dp X at 42px) the 28dp min box is 73.5px, reported as 73px by integer bounds (same MIN_TAP_TARGET_CLASS measures 74x74px on the clear-search control, e1-corroborate.log). Tapping opened the picker: e1-picker.txt…
[e1] Light mode on emulator-5554, open the Agents tab (agents-list), dump the UI and confirm the filter control (accessibility label 'Filter sessions' / 'تصفية الجلسات') has bounds of at least 28dp on… — e2e-mobile-app/e1-picker.png (capture not retained)
[e3] Agents tab with one filter applied (agents-filtered-cli), confirm the filter control still measures at least 28dp per side and its count badge still sits on the icon's top-right corner. — android/emulator-5554. Fixture: $KILO_WORKFLOW/e2e/needs-input.sh e2e-mobile-explorer-a-control-is-too-small-to-tap-reliably-f87d434d-9a87-android@example.com new -> ses_f445ce699ffehPttPGVtk48HFG, then set ... question; filter CLI applied via the picker. SCENE digest e3.txt: filter control 'content-desc="Filter sessions, 1" resource-id="agents-open-filters" ... bounds="[949,186][1022,260]"' (73x74px = 28dp box) and badge 'resource-id="session-filter-badge" ... bounds="[998,186][1015,221]"' inside wrapper 'ViewGroup bounds="[987,186][1022,222]"', which overlaps the icon 'SvgView…
[e3] Agents tab with one filter applied (agents-filtered-cli), confirm the filter control still measures at least 28dp per side and its count badge still sits on the icon's top-right corner. — e2e-mobile-app/e3.png (capture not retained)
[e2] Agents tab clear-search tap target (android emulator-5604) — android emulator-5604, app in Arabic so the control label is 'مسح البحث'. Bounds [97,320][171,393] = 74x73px = 28.19x27.81dp at the device's 420dpi density (e2-bounds.log; e2-search-empty.digest:8); width exceeds 28dp and the 27.81dp height is the sub-pixel rounding of the 28dp layout minimum (28dp=73.5px -> frame 73px), which the finding's tap-target threshold for this density accepts; the filter node is also 74x73px in the same digest. Tapping the X cleared the query: 'مسح البحث' is absent from e2-search-cleared.xml and the session row is back at [0,605][1080,765] ('60-message pagination…
[e2] Agents tab clear-search tap target (android emulator-5604) — e2e-mobile-app/e2-search-cleared.png (capture not retained)
[e2] Agents tab clear-search tap target (android emulator-5604)
[e2] Agents tab clear-search tap target (android emulator-5604) — e2e-mobile-app/agents-search-readme.png (capture not retained)
E2E proof — log excerpts
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-a-control-is-too-small-to-tap-reliably-f87d434d-9a87/e2e-cli/e2-scene.log/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-a-control-is-too-small-to-tap-reliably-f87d434d-9a87/e2e-cli/e2-clear.log/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-a-control-is-too-small-to-tap-reliably-f87d434d-9a87/e2e-cli/e2-density.logRan on android; the request asked for android.
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-a-control-is-too-small-to-tap-reliably-f87d434d-9a87/e2e-mobile-app/e1-scene.log/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-a-control-is-too-small-to-tap-reliably-f87d434d-9a87/e2e-mobile-app/e1-final.txtOwner request
[e1] Agents tab with one filter applied (agents-filtered-cli), confirm the filter control still measures at least 28dp per side and its count badge still sits on the icon's top-right corner. — android emulator-5554: SCENE e1 OK (e1-scene.log, 'android.widget.Button Filter sessions, 1 tappable [949,186][1022,260]') after Filter sessions > CLI > Apply from the needs-input fixture state, with the parked anchor corrected to the live tab label 'Agents, 1 needs input, tab, 2 of 3'; the full dump (e1-final.txt) shows the control's own node [949,186][1022,260] = 73x74px for the declared 28dp min box (28dp = 73.5px; the 20dp icon renders 53x52px), up from the finding's 30x30px, and the badge node resource-id 'session-filter-badge' [998,186][1015,221] overhangs the sliders icon…
[e2] Agents tab clear-search tap target (android emulator-5604) — android emulator-5604, app in Arabic so the control label is 'مسح البحث'. Bounds [97,320][171,393] = 74x73px = 28.19x27.81dp at the device's 420dpi density (e2-bounds.log; e2-search-empty.digest:8); width exceeds 28dp and the 27.81dp height is the sub-pixel rounding of the 28dp layout minimum (28dp=73.5px -> frame 73px), which the finding's tap-target threshold for this density accepts; the filter node is also 74x73px in the same digest. Tapping the X cleared the query: 'مسح البحث' is absent from e2-search-cleared.xml and the session row is back at [0,605][1080,765] ('60-message pagination…
Open findings (not fixed here)