Skip to content

fix(mobile): start the guided-tour body under the header and add a back control - #6191

Merged
iscekic merged 1 commit into
mainfrom
kwf/guided-tour-ux-7b2e
Sep 18, 2026
Merged

iscekic merged 1 commit into
mainfrom
kwf/guided-tour-ux-7b2e

Conversation

@iscekic

@iscekic iscekic commented Sep 15, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • The guided tour's first screen starts its content directly under the header, removing the tall empty band above the sparkle.
  • The computer step now shows a back control in the header.
  • The back control returns to the choice without ending the tour or recording a decision.
  • Android's hardware Back on the computer step returns to the choice instead of ending the tour.

Changelog for maintainers

  • Both tour steps now render their body in a top-aligned ScrollView; the removed CenteredState centring produced the empty band.
  • ForkStep keeps its gap-8 spacing; TourRemoteStep keeps its centred column and 240px reserved slot, so no state swap moves the header.
  • A new toFork callback returns to the choice; the header shows its back control only on the computer step and calls it.
  • The mounted tests assert the new container classes, and a shared helper proves going back records nothing and navigates nowhere.
  • The hardware-Back handler branches on the current step: the computer step returns to the fork, the fork still records and dismisses.
  • The handler now depends on the current step and re-subscribes on each change; the focus effect still releases it on blur.
  • The Cloud Agent and detected-computer cards already opened New session with the target preselected; this change leaves that path and its tests intact.
  • Review hint: start with the layout classes on both steps and the path-dependent BackHandler branch.

E2E proof

[e2] Walk the tour: Profile -> Tutorial -> fork, then fork -> Your computer -> back control -> fork -> Your computer -> Android hardware Back -> fork. — android emulator-5606: scripted scene OK ('SCENE e2 OK'); final digest shows the fork restored after hardware Back with QUICK TOUR header, 'Where would you like to run Kilo?', both cards and 'Skip tour'; the scene asserted the step's empty state ('No computer connected yet', 'Check again'), the 'Go back' control, and both returns to the choice. Visual layout (empty band/spacing) is the visual reviewer's on scripted-shard2.mp4/e2.png.

Walk the tour: Profile -> Tutorial -> fork, then fork -> Your computer -> back control -> fork -> Your computer -> Android hardware Back -> fork. — e2.png

[e11] ux-check: Re-enter 'Your computer' and press Android hardware Back: it returns to the choice instead of dismissing the tour, matching the visible control. — Android emulator-5604 (state.sh STATE HIT signed-in-home, e11-state.log): the replay e11.replay.json ('{"back":true}' preceded by the computer-step asserts '{"assert":"Start your first remote session","wait":12},{"assert":"Go back","wait":8}' and followed by '{"assert":"Where would you like to run Kilo?","wait":10},{"assert":"Skip tour","wait":8}') passed - e11-scene.log records 'SCENE e11 OK' and its post-run digest still shows the tour fork ('android.view.View Where would you like to run Kilo? tappable [147,476][933,550]', 'android.widget.TextView Skip tour tappable [473,2255][606,2301]')…

ux-check: Re-enter 'Your computer' and press Android hardware Back: it returns to the choice instead of dismissing the tour, matching the visible control. — e11-fork.png

Recording of the verified flow (waits trimmed)

scripted-shard4.mp4.trim.mp4

[e11] ux-check: Re-enter 'Your computer' and press Android hardware Back: it returns to the choice instead of dismissing the tour, matching the visible control. — Android emulator-5604 (state.sh STATE HIT signed-in-home, e11-state.log): the replay e11.replay.json ('{"back":true}' preceded by the computer-step asserts '{"assert":"Start your first remote session","wait":12},{"assert":"Go back","wait":8}' and followed by '{"assert":"Where would you like to run Kilo?","wait":10},{"assert":"Skip tour","wait":8}') passed - e11-scene.log records 'SCENE e11 OK' and its post-run digest still shows the tour fork ('android.view.View Where would you like to run Kilo? tappable [147,476][933,550]', 'android.widget.TextView Skip tour tappable [473,2255][606,2301]')…

[e11] ux-check: Re-enter 'Your computer' and press Android hardware Back: it returns to the choice instead of dismissing the tour, matching the visible control. — prior/e11-remote.png

[e11] ux-check: Re-enter 'Your computer' and press Android hardware Back: it returns to the choice instead of dismissing the tour, matching the visible control. — Android emulator-5604 (state.sh STATE HIT signed-in-home, e11-state.log): the replay e11.replay.json ('{"back":true}' preceded by the computer-step asserts '{"assert":"Start your first remote session","wait":12},{"assert":"Go back","wait":8}' and followed by '{"assert":"Where would you like to run Kilo?","wait":10},{"assert":"Skip tour","wait":8}') passed - e11-scene.log records 'SCENE e11 OK' and its post-run digest still shows the tour fork ('android.view.View Where would you like to run Kilo? tappable [147,476][933,550]', 'android.widget.TextView Skip tour tappable [473,2255][606,2301]')…

[e11] ux-check: Re-enter 'Your computer' and press Android hardware Back: it returns to the choice instead of dismissing the tour, matching the visible control. — prior/e11-fork.png

[e2] Walk the tour: Profile -> Tutorial -> fork, then fork -> Your computer -> back control -> fork -> Your computer -> Android hardware Back -> fork. — android emulator-5606: scripted scene OK ('SCENE e2 OK'); final digest shows the fork restored after hardware Back with QUICK TOUR header, 'Where would you like to run Kilo?', both cards and 'Skip tour'; the scene asserted the step's empty state ('No computer connected yet', 'Check again'), the 'Go back' control, and both returns to the choice. Visual layout (empty band/spacing) is the visual reviewer's on scripted-shard2.mp4/e2.png.

[e2] Walk the tour: Profile -> Tutorial -> fork, then fork -> Your computer -> back control -> fork -> Your computer -> Android hardware Back -> fork. — e2e-mobile-app/e2.png

[e10] ux-check: header back control returns to the choice without dismissing or recording — android emulator-5606: live one-call scene ('SCENE e10 OK') from signed-in-home; tapping the header 'Go back' on the computer step returned to the fork with both cards and 'Skip tour' still present, the tour still standing (a recorded decision replaces the tour) and no tour row anywhere in the DB, so nothing was recorded nor dismissed; captures e10-tour-back.mp4/e10.png/e10-frame-*.png left for the visual reviewer.

[e10] ux-check: header back control returns to the choice without dismissing or recording — prior/e10.png

[e7] ux-check: guided tour opens from Profile → Tutorial with the 'Quick tour' eyebrow and the fork body directly beneath it, and the computer step's back control returns to the fork — SCENE e7 OK (e7-scene.log:1): the run asserted the fork ('Where would you like to run Kilo?', both cards, 'Skip tour'), tapped 'Your computer' and asserted 'Go back', returned by the header control ('Where would you like to run Kilo?' again) and by Android hardware Back, ending on the fork with 'QUICK TOUR tappable [37,149][1045,186]' directly above 'Where would you like to run Kilo?'; the header-to-icon spacing and the sparkle icon are captures in e7.png for the visual reviewer.

[e7] ux-check: guided tour opens from Profile → Tutorial with the 'Quick tour' eyebrow and the fork body directly beneath it, and the computer step's back control returns to the fork — prior/e7.png

E2E proof — log excerpts

[e1] First open on a fresh account, cold start (needs:seed: an account with no s -> pass :: android: tour on screen with android.widget.TextView QUICK TOUR tappable [37,149][1045,186], android.view.View Where would you like to run Kilo? tappable [147,476][933,550], android.widget.TextView Cloud Agent tappable [223,718][911,774], and android.widget.TextView Your computer tappable [223,959][911,1015] (e1-ok.log).
[e3] ux-check: Tap 'Your computer'. A back control (chevron, ~44px target, label -> pass :: android: android.widget.Button Go back tappable [0,149][101,250] with android.view.View Start your first remote session tappable [178,554][903,628] and android.widget.TextView Connect your computer, then choose it below to start a new session. tappable [56,637][1025,749] (e3-ok.log).
[e2] Instance hand-off (android) -> pass :: Replayed from signed-in-home with the worktree kilo remote relay up: e2step3-scene.log shows the single detected row 'android.widget.TextView Computer connected tappable [169,1023][911,1069]' and 'SCENE e2 OK' in e2-scene.log shows the hand-off landing on New session with 'android.widget.Button Run on: kwf-guided-tour-ux-7b2e.europe-west4-a.c.kilocode.internal · guided-tour-ux-7b2e tappable [37,921][909,1037]' and no Cloud Agent row or Skip tour node (slot bottom is 'android.widget.Button Start session tappable [37,1412][1043,1528]').
[e4] ux-check: computer step skeleton/empty/error/list swap keeps the header sti -> pass :: The header is frozen at 'android.view.View Start your first remote session tappable [178,554][903,628]' in the loading digest (e4loading-digest3.txt, only Skip tour besides the header), the empty digest ('android.widget.TextView No computer connected yet tappable [279,895][800,960]', e4empty-step.txt), the error digest ('android.widget.TextView Network error. Please try again. tappable [308,1154][772,1200]', e4cold-run.log) and the list digest ('android.widget.TextView Computer connected tappable [169,1023][911,1069]', e2step3-scene.log) — no shift, no blanking, and no second loading indicator; skeleton/loading was held by stalling nextjs against a cold query cache because the e2e index offe
/home/igor_kilocode_ai/.local/share/kwf/sections/guided-tour-ux-7b2e/e2e-mobile-app/e1-ok.log
SCENE e1 OK
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.TextView QUICK TOUR tappable [37,149][1045,186]
android.view.View Where would you like to run Kilo? tappable [147,476][933,550]
android.widget.TextView Pick where Kilo runs for your first session. tappable [191,559][888,615]
android.widget.RadioButton Cloud Agent, Run Kilo in a sandboxed cloud environment with nothing to install. tappable [55,688][1025,901]
android.widget.TextView Cloud Agent tappable [223,718][911,774]
android.widget.TextView Run Kilo in a sandboxed cloud environment with nothing to install. tappable [223,778][911,870]
android.widget.RadioButton Your computer, Run Kilo on your own machine through the `kilo remote` CLI. tappable [55,929][1025,1142]
android.widget.TextView Your computer tappable [223,959][911,1015]
android.widget.TextView Run Kilo on your own machine through the `kilo remote` CLI. tappable [223,1019][911,1111]
android.widget.Button Skip tour tappable [55,2221][1025,2336]
android.widget.TextView Skip tour tappable [473,2255][606,2301]
/home/igor_kilocode_ai/.local/share/kwf/sections/guided-tour-ux-7b2e/e2e-mobile-app/e3-ok.log
SCENE e3 OK
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,149][101,250]
android.widget.TextView QUICK TOUR tappable [111,179][1044,216]
android.view.View Start your first remote session tappable [178,554][903,628]
android.widget.TextView Connect your computer, then choose it below to start a new session. tappable [56,637][1025,749]
android.widget.TextView No computer connected yet tappable [279,895][800,960]
android.widget.TextView Run `kilo remote` on your computer to connect it. tappable [178,969][901,1015]
android.widget.TextView Run `kilo remote` on your computer, or `/remote` in a running CLI session, to control a local kilo process. tappable [55,1051][1024,1189]
android.widget.Button Check again tappable [410,1227][670,1342]
android.widget.TextView Check again tappable [449,1261][631,1307]
android.widget.Button Skip tour tappable [55,2221][1025,2336]
android.widget.TextView Skip tour tappable [473,2255][606,2301]
/home/igor_kilocode_ai/.local/share/kwf/sections/guided-tour-ux-7b2e/e2e-mobile-app/e2-scene.log
SCENE e2 OK
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,149][101,250]
android.view.View New session tappable [111,167][1044,232]
android.widget.EditText What would you like to work on? tappable [58,336][1024,567]
android.widget.Button Add attachment tappable [58,572][140,655]
android.widget.Button Paste from clipboard tappable [150,572][232,655]
android.widget.Button Start voice input tappable [931,567][1023,659]
android.widget.Button Mode: Code tappable [68,707][301,780]
android.widget.TextView Code tappable [146,720][223,766]
android.widget.Button Auto Efficient tappable [319,707][623,780]
android.widget.TextView Auto Efficient tappable [347,721][546,767]
android.widget.TextView Run on tappable [37,857][1045,903]
android.widget.Button Run on: kwf-guided-tour-ux-7b2e.europe-west4-a.c.kilocode.internal · guided-tour-ux-7b2e tappable [37,921][909,1037]
android.widget.TextView kwf-guided-tour-ux-7b2e.europe-west4-a.c.kilocode.internal · guided-tour-ux-7b2e tappable [67,951][844,1007]
android.widget.Button Refresh tappable [928,921][1043,1037]
android.widget.TextView Folder tappable [37,1084][1045,1130]
android.widget.Button Folder: guided-tour-ux-7b2e tappable [37,1148][1043,1264]
android.widget.TextView guided-tour-ux-7b2e tappable [67,1178][978,1234]
android.widget.TextView Run `kilo remote` on your computer, or `/remote` in a running CLI session, to control a local kilo process. tappable [36,1282][1044,1356]
android.widget.Button Start session tappable [37,1412][1043,1528]
android.widget.TextView Start session tappable [442,1446][638,1492]
/home/igor_kilocode_ai/.local/share/kwf/sections/guided-tour-ux-7b2e/e2e-mobile-app/e2step3-scene.log
SCENE e2step3 MISS screen 'Tutorial' at capture
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,149][101,250]
android.widget.TextView QUICK TOUR tappable [111,179][1044,216]
android.view.View Start your first remote session tappable [178,554][903,628]
android.widget.TextView Connect your computer, then choose it below to start a new session. tappable [56,637][1025,749]
android.widget.Button kwf-guided-tour-ux-7b2e.europe-west4-a.c.kilocode.internal tappable [55,881][1025,1099]
android.widget.TextView kwf-guided-tour-ux-7b2e.europe-west4-a.c.kilocode.internal tappable [169,911][911,1023]
android.widget.TextView Computer connected tappable [169,1023][911,1069]
android.widget.TextView Run `kilo remote` on your computer, or `/remote` in a running CLI session, to control a local kilo process. tappable [55,1218][1025,1356]
android.widget.Button Skip tour tappable [55,2221][1025,2336]
android.widget.TextView Skip tour tappable [473,2255][606,2301]
/home/igor_kilocode_ai/.local/share/kwf/sections/guided-tour-ux-7b2e/e2e-mobile-app/e4loading-digest3.txt
hierarchy: /tmp/kilo-hierarchy.65iWwK
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,149][101,250]
android.widget.TextView QUICK TOUR tappable [111,179][1044,216]
android.view.View Start your first remote session tappable [178,554][903,628]
android.widget.TextView Connect your computer, then choose it below to start a new session. tappable [56,637][1025,749]
android.widget.Button Skip tour tappable [55,2221][1025,2336]
android.widget.TextView Skip tour tappable [473,2255][606,2301]
/home/igor_kilocode_ai/.local/share/kwf/sections/guided-tour-ux-7b2e/e2e-mobile-app/e4empty-step.txt
hierarchy: /tmp/kilo-hierarchy.FN0v2y
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,149][101,250]
android.widget.TextView QUICK TOUR tappable [111,179][1044,216]
android.view.View Start your first remote session tappable [178,554][903,628]
android.widget.TextView Connect your computer, then choose it below to start a new session. tappable [56,637][1025,749]
android.widget.TextView No computer connected yet tappable [279,895][800,960]
android.widget.TextView Run `kilo remote` on your computer to connect it. tappable [178,969][901,1015]
android.widget.TextView Run `kilo remote` on your computer, or `/remote` in a running CLI session, to control a local kilo process. tappable [55,1051][1024,1189]
android.widget.Button Check again tappable [410,1227][670,1342]
android.widget.TextView Check again tappable [449,1261][631,1307]
android.widget.Button Skip tour tappable [55,2221][1025,2336]
android.widget.TextView Skip tour tappable [473,2255][606,2301]
/home/igor_kilocode_ai/.local/share/kwf/sections/guided-tour-ux-7b2e/e2e-mobile-app/e4cold-run.log
SCENE e4cold MISS screen '/Home, tab, 1 of [0-9]+/' at capture
android.widget.LinearLayout com.kilocode.kiloapp:id/action_bar_root tappable [0,0][1080,2400]
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,149][101,250]
android.widget.TextView QUICK TOUR tappable [111,179][1044,216]
android.view.View Start your first remote session tappable [178,554][903,628]
android.widget.TextView Connect your computer, then choose it below to start a new session. tappable [56,637][1025,749]
android.view.View Something went wrong tappable [323,1080][756,1145]
android.widget.TextView Network error. Please try again. tappable [308,1154][772,1200]
android.widget.Button Retry tappable [461,1237][619,1353]
android.widget.TextView Retry tappable [500,1271][579,1317]
android.widget.Button Skip tour tappable [55,2221][1025,2336]
android.widget.TextView Skip tour tappable [473,2255][606,2301]
Owner request

Surface: the mobile app (apps/mobile).

The guided tour's first screen has three UX defects. The owner's screenshot
shows it: the label "BRZA TURA" sits at the top left under the status bar,
then a tall empty band, then a centered sparkle icon, the title "Gde zelis da
pokrenes Kilo?", its subtitle, the two cards "Cloud Agent" and "Tvoj racunar",
and "Preskoci turu" at the bottom.

  1. The header has empty space at the top. The content must start under the
    header instead of after an empty band.
  2. Tapping "Your computer" leaves no way back. Add a back control to that
    step, so the user returns to the choice.
  3. Tapping "Cloud Agent", or an instance, must NAVIGATE to the new session
    page with the matching option pre-selected. Today it stays in the sheet.

Verify live on a device: walk the tour, show the header with no empty band,
tap "Your computer" and come back, then tap "Cloud Agent" and show the new
session page opens with cloud agent already selected. Do the same for an
instance. Capture each step.

The bar is best-in-class UX. A change that works but feels worse than
the rest of the app is not done: the states, the spacing, the motion and
the wording match what the app already does well.

[e13] ux-check: on the computer step with a connected kilo remote instance, tapping that instance row opens the new-session page with that computer's Run-on target already selected — From the declared state (state-signed-in-home.txt: 'Home, tab, 1 of 3') the replay walked Profile → Tutorial → Your computer, asserted the connected row, tapped it, and the end digest shows 'New session' (e13-scene.log:19) with 'Run on: kwf-guided-tour-ux-7b2e.europe-west4-a.c.kilocode.internal · guided-tour-ux-7b2e' (e13-scene.log:29) while the tour's Skip bar is not among the listed controls; the harness's single MISS was the capture-time screen-anchor re-check (e13-scene.log:15) because my anchor did not cover the New session end state, so e13.replay.json now uses '/HOME|Home, tab, 1 of…

[e13] ux-check: on the computer step with a connected kilo remote instance, tapping that instance row opens the new-session page with that computer's Run-on target already selected — e13.png

[e11] ux-check: Re-enter 'Your computer' and press Android hardware Back: it returns to the choice instead of dismissing the tour, matching the visible control. — Android emulator-5604 (state.sh STATE HIT signed-in-home, e11-state.log): the replay e11.replay.json ('{"back":true}' preceded by the computer-step asserts '{"assert":"Start your first remote session","wait":12},{"assert":"Go back","wait":8}' and followed by '{"assert":"Where would you like to run Kilo?","wait":10},{"assert":"Skip tour","wait":8}') passed - e11-scene.log records 'SCENE e11 OK' and its post-run digest still shows the tour fork ('android.view.View Where would you like to run Kilo? tappable [147,476][933,550]', 'android.widget.TextView Skip tour tappable [473,2255][606,2301]')…

[e11] ux-check: Re-enter 'Your computer' and press Android hardware Back: it returns to the choice instead of dismissing the tour, matching the visible control. — e11.png

Follow-ups (not changed here)

  • not proved live: Cloud hand-off: from the replayed tour fork, tapping Cloud Agent NAVIGATES to the New session page (New session) with Run on: Cloud Agent preselected and the tour gone (Skip tour absent) — capture the new-session still; expected android (the scenario anchor covers both the declared start, Home, and the deliberate hand-off end, New session, so the capture re-assert cannot misfire) (no capture cited it)
  • not proved live: Computer step, loading into content (needs:fault: the instances request is held, then released; the verifier records the settle): the reserved slot shows the placeholder rows with Start your first remote session and the back control already in place, then the detected list or empty state fills the same slot — the header and the back control must not move when it settles; expected android (no capture cited it)
  • not proved live: Computer step, retryable failure (needs:fault: the activeSessions.listInstances request fails, e.g. the web service serving it stalled or the device offline): the step keeps Start your first remote session, shows Network error. Please try again. with a Retry control, and the header back control still returns to the fork — no dead end; expected android (no capture cited it)
  • not proved live: First open on a fresh account, cold start (needs:seed: an account with no stored tour decision): the tour auto-opens with Quick tour in the header and the sparkle, Where would you like to run Kilo?, its subtitle and both path cards starting directly under the header — the still must show no empty band between the header and the card block; expected android (no capture cited it)
  • not proved live: Instance hand-off (needs:seed: exactly one computer connected through kilo remote, e12-style relay, so the step lists one detected row): replay the tour, tap Your computer, the detected row shows Computer connected, tapping the row navigates to New session with that computer preselected — Run on: Cloud Agent is absent and Skip tour is gone; expected android (no capture cited it)
  • not proved live: ux-check: On the computer step with a connected kilo remote instance, tap that instance row: the new-session page opens with that computer's Run-on target already selected. (no capture cited it)
  • not proved live: ux-check: On the fork tap 'Cloud Agent': the tour is dismissed and the new-session page opens with the Run-on target already set to Cloud Agent. (no capture cited it)
  • not proved live: ux-check: On the fork, confirm both cards 'Cloud Agent' and 'Your computer' and the 'Skip tour' action are fully visible with no content overlapping the action bar. (no capture cited it)
  • not proved live: ux-check: Open the guided tour on a device (fresh account or Profile → Tutorial). The 'Quick tour' eyebrow sits at the top-left and the sparkle icon + 'Where would you like to run Kilo?' block begins directly beneath it with only the standard header-to-body gap: no tall empty band between the eyebrow and the icon. (no capture cited it)
  • not proved live: ux-check: Tap 'Your computer'. A back control (chevron, ~44px target, label 'Go back') is visible in the header, and the step body (server icon, title, body) begins under the header. (no capture cited it)
  • not proved live: ux-check: Tap the header back control: the screen returns to the choice (both cards visible), the tour is not dismissed, no decision is recorded, and 'Skip tour' is still available. (no capture cited it)
  • not proved live: ux-check: While on the computer step, watch the skeleton → empty/error/list swap: the header above the reserved slot does not move or blank, and no second loading indicator appears. (no capture cited it)

Open findings (not fixed here)

  • the '## E2E proof' section links a file path, which 404s on GitHub

@iscekic
iscekic marked this pull request as draft September 15, 2026 22:59
Comment thread apps/mobile/src/components/tour/tour-screen.mounted.test.tsx
@kilo-code-bot

kilo-code-bot Bot commented Sep 15, 2026

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The follow-up commit 2fbe61f resolves the only previous finding: @/components/centered-state is now mocked to a host string, so the fork-body absence check can fail if CenteredState is reintroduced into the shell.

Files Reviewed (1 file)
  • apps/mobile/src/components/tour/tour-screen.mounted.test.tsx - no issues (previous SUGGESTION resolved)

Notes

  • Incremental scope: tour-screen.mounted.test.tsx only (4 added lines); the other three files are unchanged since 196f02f and were not re-analyzed.
  • Verified the new vi.mock resolves to a real module (apps/mobile/src/components/centered-state.tsx), matches the pattern used by tour-remote-step.mounted.test.tsx, and that TourScreen renders CenteredState through no other unmocked path, so the assertion at line 236 is now a genuine regression guard rather than an unconditional pass.
  • No new issues in the changed lines; no inline comments posted.
Previous Review Summary (commit 196f02f)

Current summary above is authoritative. Previous snapshots are kept for context only.

Previous review (commit 196f02f)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

The tour layout rewrite and the path-dependent BackHandler/header-back wiring are correct; the only finding is a test assertion that can never fail.

Overview

Severity Count
CRITICAL 0
WARNING 0
SUGGESTION 1
Issue Details (click to expand)

SUGGESTION

File Line Issue
apps/mobile/src/components/tour/tour-screen.mounted.test.tsx 232 findAllByType('CenteredState') is tautological in this suite: the component is neither imported nor mocked
Files Reviewed (4 files)
  • apps/mobile/src/components/tour/tour-screen.tsx - no issues
  • apps/mobile/src/components/tour/tour-remote-step.tsx - no issues
  • apps/mobile/src/components/tour/tour-screen.mounted.test.tsx - 1 suggestion
  • apps/mobile/src/components/tour/tour-remote-step.mounted.test.tsx - no issues

Notes

  • Verified: toFork records nothing (no recordCompleted/stackSafeReplace/router.back), showBackButton={path === 'remote'} keeps the fork header back-free, and Android hardware Back branches on the current step. The useFocusEffect callback depends on path, so the BackHandler subscription is removed (subscription.remove()) and re-added on each step change - no leaked listener.
  • The CenteredState -> top-aligned ScrollView swap preserves spacing (gap-8/gap-6, px-6, reserved min-h-[240px] slot) and the error branch still uses QueryError placement="top", so no nested same-axis scroll views are introduced.
  • Not checked in this run: the live-device claims in the PR description, and the follow-up items the PR itself lists as unproven.

Fix these issues in Kilo Cloud


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

Review guidance: REVIEW.md from base branch main

@iscekic
iscekic force-pushed the kwf/guided-tour-ux-7b2e branch from 196f02f to 2fbe61f Compare September 15, 2026 23:21
@iscekic
iscekic marked this pull request as ready for review September 15, 2026 23:32
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 15, 2026
@iscekic iscekic self-assigned this Sep 15, 2026
@iscekic
iscekic added this pull request to stack #6230 September 16, 2026 13:41
@iscekic
iscekic merged commit 117cc09 into main Sep 18, 2026
29 checks passed
@iscekic
iscekic deleted the kwf/guided-tour-ux-7b2e branch September 18, 2026 00:00
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.

3 participants