Skip to content

fix(mobile): plain-language Run on copy and human-readable session titles - #6590

Merged
iscekic merged 4 commits into
mainfrom
kwf/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc
Sep 23, 2026
Merged

iscekic merged 4 commits into
mainfrom
kwf/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc

Conversation

@iscekic

@iscekic iscekic commented Sep 22, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • The "Run on" helper tells users to start Kilo on their computer and leave it running, without CLI commands or backticks.
  • A session the user has not renamed shows the human-readable "Session" label instead of a raw ISO timestamp.
  • A real session name still shows unchanged.

Changelog for maintainers

  • The mobile header treats a generated title (New session - <ISO> or Child session - <ISO>) as absent, so it falls back to the localized label instead of the CLI storage key.
  • Normalization runs on the server title, the cached fallback title, and incoming v2 session.updated titles, so a placeholder can neither reach the header nor clear an in-flight rename.
  • The matcher mirrors the CLI's DEFAULT_SESSION_TITLE_PATTERN and stays local to mobile to avoid a new expo install dependency.
  • Review the regex first: it drops only the exact ISO-millisecond shape, so titles such as "New session - weekly review" or a trailing suffix survive.
  • The command instructions stay in the two keys that need them (the empty instance picker and the remote tour), so a user with no computer still sees a concrete next action.
  • The Run on helper catalog string must name no command or CLI jargon and carry no authoring backticks; tests pin its exact wording.
  • Tests cover a real title unchanged, a placeholder title dropped, and a placeholder session.updated ignored.

E2E proof

needs:seed placeholder-title session (the state bank has no such state): prove the header falls back instead of showing 'New session - <ISO>'. — e2-placeholder-title.png

signed-in-home -> New coding task (repo-picker flow): the Run on helper sentence reads in plain language — no kilo remote, /remote, 'CLI session' or 'local kilo process' on screen. — e3.png

[e6] ux-check: Open the Run on picker with no computer connected: the empty state still shows the 'kilo remote' instruction, so a user who wants to connect a computer still has a concrete next action. — Fixture: no-computer state created by signing in as the worktree-scoped empty account e2e-empty-@example.com (login.sh), since the default account has this worktree's remotes/terminals registered; on android emulator-5604 the Run on picker empty state shows "No CLI instances connected" and "Run kilo remote in a project on your computer, or update Kilo CLI if one is already running." (e6-empty-state.log lines 46-47), i.e. the instruction naming the command survives the plain-copy change and gives a concrete next action, with a Refresh retry beside it; no functional UX defect on the visited…

ux-check: Open the Run on picker with no computer connected: the empty state still shows the 'kilo remote' instruction, so a user who wants to connect a computer still has a concrete next action. — e6.png

[e5] ux-check: no CLI jargon on the Run on screen (android emulator-5554) — SCENE e5 OK on android emulator-5554; in the /agent-chat/new tree (e5-scene.xml) the strings 'kilo remote', '/remote', 'CLI session', 'local kilo process' each occur 0 times while the row 'Run on: Cloud Agent' and the sentence 'To run on your computer, start Kilo there and leave it running.' both render (e5.png captured for the visual reviewer); no UX defect seen on this screen.

[e5] ux-check: no CLI jargon on the Run on screen (android emulator-5554) — prior/e5.png

[e6] ux-check: Open the Run on picker with no computer connected: the empty state still shows the 'kilo remote' instruction, so a user who wants to connect a computer still has a concrete next action.

[e6] ux-check: Open the Run on picker with no computer connected: the empty state still shows the 'kilo remote' instruction, so a user who wants to connect a computer still has a concrete next action. — prior/e6.png

[e7] ux-check: session header fallback label for a generated placeholder title — android emulator-5554: restored state session-open (STATE HIT session-open), whose last-opened session is the fixture row ses_f357b9329ffb1K6adZMBTQTnA6 with stored title 'New session - 2026-09-22T02:05:22.778Z' (e7-db.log), created with db.sh; the scene digest in scripted-e7.log shows the fallback label on one line — 'android.widget.Button Rename session: Session tappable [111,84][714,277]' and 'android.view.View Session tappable [111,147][714,212]' — which is agentChat.session.title='Session' (apps/mobile/src/i18n/locales/en.json:2087), and grep of scripted-e7.log for…

[e7] ux-check: session header fallback label for a generated placeholder title — prior/e7.png

[e1] needs:seed placeholder-title session — header falls back instead of rendering 'New session - ' — android emulator-5554: seeded the row with db.sh — e1-db.log line 'ses_f35582999ffeQcDXta94FsaJca|New session - 2026-09-22T02:05:22.778Z' — then session.sh enter, force-stop and reopen; live scene digest e1-scene.log shows the fallback header 'android.view.View Session tappable [111,147][883,212]' and 'SCENE e1 OK', so the raw ISO title is normalized away; still e1.png / e1-placeholder.png for the visual reviewer; no UX-DEFECT on the session screen.

[e1] needs:seed placeholder-title session — header falls back instead of rendering 'New session - <ISO>' — e2e-mobile-app/e1-placeholder.png

[e1] needs:seed placeholder-title session — header falls back instead of rendering 'New session - '

[e1] needs:seed placeholder-title session — header falls back instead of rendering 'New session - <ISO>' — e2e-mobile-app/e1.png

[e10] ux-check: session header loading skeleton to loaded title (android emulator-5554) — On android emulator-5554 the header title node is text="Session" bounds="[111,147][728,212]" while nextjs is stalled (loading, e10-skeleton.txt) and text="Session" bounds="[111,147][714,212]" loaded (e10-loaded.txt) — same top 147 and same height 65, with the composer fixed at [926,2188][1052,2314] and 'Go back' at [0,130][101,231] in both, so nothing below the header reflows; the session's DB title is the generated key 'New session - 2026-09-22T02:05:22.778Z' (e10-db.log) yet no raw ISO title appears in either digest (0 matches), i.e. the fallback name renders; loading/loaded screenshots…

[e10] ux-check: session header loading skeleton to loaded title (android emulator-5554) — prior/e10-loaded.png

E2E proof — log excerpts

[e1] needs:seed placeholder-title session — header falls back instead of renderi -> pass :: android emulator-5554: seeded the row with db.sh — e1-db.log line 'ses_f35582999ffeQcDXta94FsaJca|New session - 2026-09-22T02:05:22.778Z' — then session.sh enter, force-stop and reopen; live scene digest e1-scene.log shows the fallback header 'android.view.View Session tappable [111,147][883,212]' and 'SCENE e1 OK', so the raw ISO title is normalized away; still e1.png / e1-placeholder.png for the visual reviewer; no UX-DEFECT on the session screen.
[e2] needs:seed placeholder-title session (replay of the audit-rejected scenario -> pass :: android emulator-5554: re-ran the parked scene live on the seeded placeholder session; e2-scene.log carries 'SCENE e2 OK' and the fallback header 'android.view.View Session tappable [111,147][883,212]', with the absent-ISO step passing; still e2.png for the visual reviewer; no UX-DEFECT.
[e3] repo-picker Run on helper sentence is plain copy (owner finding 1) -> pass :: android emulator-5554: from state signed-in-home (STATE HIT signed-in-home), tapped 'New coding task'; e3-scene.log carries 'SCENE e3 OK' and 'android.widget.TextView To run on your computer, start Kilo there and leave it running. tappable [36,991][1044,1028]', and the absent steps for 'kilo remote', 'CLI session' and 'local kilo process' pass; still e3.png for the visual reviewer; no UX-DEFECT.
[e2] ux-check: Open a session whose stored title is 'New session - 2026-09-22T02 -> pass :: jev read the digest: pass (confidence 0.88)
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc/e2e-mobile-app/e1-scene.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.Button Go back tappable [0,130][101,231]
android.widget.Button Rename session: Session tappable [111,84][883,277]
android.view.View Session tappable [111,147][883,212]
android.widget.Button Tap to view context details. tappable [910,123][1044,238]
android.widget.ScrollView centered-state tappable [0,286][1080,2164]
android.view.ViewGroup centered-state-content tappable [0,1057][1080,1343]
android.widget.TextView No messages yet tappable [377,1222][702,1287]
android.widget.TextView Send a message below to get started. tappable [262,1296][818,1342]
android.widget.Button Add attachment tappable [28,2214][101,2288]
android.widget.EditText Message tappable [126,2191][800,2311]
android.widget.Button Start voice input tappable [835,2205][926,2297]
android.widget.Button Send message [926,2188][1052,2314]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc/e2e-mobile-app/e1-db.log
ses_f35582999ffeQcDXta94FsaJca|New session - 2026-09-22T02:05:22.778Z
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc/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,130][101,231]
android.widget.Button Rename session: Session tappable [111,84][883,277]
android.view.View Session tappable [111,147][883,212]
android.widget.Button Tap to view context details. tappable [910,123][1044,238]
android.widget.ScrollView centered-state tappable [0,286][1080,2164]
android.view.ViewGroup centered-state-content tappable [0,1057][1080,1343]
android.widget.TextView No messages yet tappable [377,1222][702,1287]
android.widget.TextView Send a message below to get started. tappable [262,1296][818,1342]
android.widget.Button Add attachment tappable [28,2214][101,2288]
android.widget.EditText Message tappable [126,2191][800,2311]
android.widget.Button Start voice input tappable [835,2205][926,2297]
android.widget.Button Send message [926,2188][1052,2314]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc/e2e-mobile-app/e3-scene.log
android.widget.Button Run on: Cloud Agent tappable [37,856][909,972]
android.widget.TextView Cloud Agent tappable [67,886][844,942]
android.widget.Button Refresh tappable [928,856][1043,972]
android.widget.TextView To run on your computer, start Kilo there and leave it running. tappable [36,991][1044,1028]
android.widget.TextView Repository tappable [37,1074][1045,1120]
android.widget.Button Repository: Select repository tappable [37,1138][1043,1254]
android.widget.TextView Select repository tappable [67,1168][978,1224]
android.widget.Button Connect GitLab tappable [76,1321][1004,1367]
android.widget.TextView Connect GitLab tappable [76,1321][944,1367]
android.widget.TextView Connect GitLab in your browser, then return here to pick a repository. tappable [76,1395][1004,1487]
android.widget.Button Open GitLab tappable [76,1515][870,1630]
android.widget.TextView Open GitLab tappable [175,1549][768,1595]
android.widget.Button Refresh repositories tappable [888,1515][1004,1630]
android.widget.TextView Changes tappable [37,1716][1045,1762]
android.view.View Changes tappable [37,1780][1043,1899]
android.widget.RadioButton Leave changes tappable [46,1789][540,1890]
android.widget.TextView Leave changes tappable [192,1816][393,1862]
android.widget.RadioButton Commit and push tappable [540,1789][1034,1890]
android.widget.TextView Commit and push tappable [668,1816][905,1862]
android.widget.TextView Environment tappable [37,1945][1045,1991]
android.widget.TextView busy tappable [37,2009][1045,2053]
android.widget.TextView   tappable [37,2062][1043,2106]
android.widget.Button Start session [37,2185][1043,2300]
android.widget.TextView Start session tappable [442,2219][638,2265]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc/e2e-mobile-app/scripted-e2.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,130][101,231]
android.widget.Button Rename session: Greeting tappable [111,84][714,277]
android.view.View Greeting tappable [111,147][714,212]
android.widget.Button Context 10,945 of 1,310,720 tokens, 1% used, cost 0.39 cents. Tap to view context details. tappable [741,123][1043,238]
android.widget.TextView 1% tappable [863,162][900,199]
android.widget.TextView $0.0039 tappable [909,162][1013,199]
android.widget.TextView 7:43 PM tappable [476,1712][604,1751]
android.view.ViewGroup say hello, User message tappable [0,1770][1080,1908]
android.widget.TextView say hello tappable [847,1807][1011,1870]
android.widget.Button Preparation complete tappable [40,1929][1042,2030]
android.widget.TextView Preparation complete tappable [188,1956][506,2002]
android.view.ViewGroup Hello, Assistant message tappable [0,2051][1080,2143]
android.widget.TextView Hello tappable [37,2065][1045,2128]
android.widget.Button Add attachment tappable [28,2214][101,2288]
android.widget.EditText Message tappable [126,2191][800,2311]
android.widget.Button Start voice input tappable [835,2205][926,2297]
android.widget.Button Send message [926,2188][1052,2314]
Owner request

Surface: mobile-app

Explorer finding: 2 visual defects on android: The "Run on" helper sentence exposes CLI; 22.778Z", wrapped across two lines inste

The user-agent explorer found these 2 while using the app like a user. They are one kind of defect on one platform, so they are ONE item: the pull request must fix and prove every one of them.
One must-run scenario per finding: the plan needs 2 musts, one for each finding below.
The explorer never edits product code.

Evidence (from the device runs):

--- Finding 1 of 2: repo-picker: The "Run on" helper sentence exposes CLI jargon and backticked commands (kilo remote, /remote, "CLI session", "local kilo process") on a mobile screen.
Flow: repo-picker
Found on revision: f2181ae
Repro:

  1. set this state first: reviews 3; battery 33 discharging; credits 20; uimode day; relaunch
  2. open the app on emulator-5602
  3. reach repo-picker
  4. the capture shows the defect named below
    Observed: The "Run on" helper sentence exposes CLI jargon and backticked commands (kilo remote, /remote, "CLI session", "local kilo process") on a mobile screen.
    Expected: the screen renders without this defect

--- Finding 2 of 2: session-starting: The session header shows a raw ISO timestamp, "New session - 2026-09-22T02:05:22.778Z", wrapped across two lines instead of a human-readable session name.
Flow: session-starting
Found on revision: f2181ae
Repro:

  1. set this state first: reviews 3; battery 33 discharging; credits 20; uimode day; relaunch
  2. open the app on emulator-5602
  3. reach session-starting
  4. the capture shows the defect named below
    Observed: The session header shows a raw ISO timestamp, "New session - 2026-09-22T02:05:22.778Z", wrapped across two lines instead of a human-readable session name.
    Expected: the screen renders without this defect

[f1] owner finding 1: repo-picker Run on helper copy — Not in the shard must-run list though the owner request demands proof of this finding; proved live: new-session screen renders only the plain sentence 'To run on your computer, start Kilo there and leave it running.' (f1-runon-digest.txt line 18), no CLI jargon or backticks. Screenshot f1-runon.png for the visual reviewer.

[f1] owner finding 1: repo-picker Run on helper copy — f1-runon.png

[e10] ux-check: session header loading skeleton to loaded title (android emulator-5554) — On android emulator-5554 the header title node is text="Session" bounds="[111,147][728,212]" while nextjs is stalled (loading, e10-skeleton.txt) and text="Session" bounds="[111,147][714,212]" loaded (e10-loaded.txt) — same top 147 and same height 65, with the composer fixed at [926,2188][1052,2314] and 'Go back' at [0,130][101,231] in both, so nothing below the header reflows; the session's DB title is the generated key 'New session - 2026-09-22T02:05:22.778Z' (e10-db.log) yet no raw ISO title appears in either digest (0 matches), i.e. the fallback name renders; loading/loaded screenshots…

[e10] ux-check: session header loading skeleton to loaded title (android emulator-5554) — e10-skeleton.png

[e8] ux-check: session with real stored title — Header node 'Rename session: Fix the session header' (e8-realtitle-digest.txt line 5) shows the exact real title, unchanged. Screenshot e8-realtitle.png for the visual reviewer.

[e8] ux-check: session with real stored title — e8-realtitle.png

[e4] ux-check: New coding task (repo-picker) helper sentence under Run on — Android emulator-5606: digest lines 14-18 show the Run on selector ('Run on: Cloud Agent') directly above the exact TextView 'To run on your computer, start Kilo there and leave it running.' with no CLI term or backtick; screenshot e4/e4.png; no UX defect in the digest.

[e4] ux-check: New coding task (repo-picker) helper sentence under Run on — e4.png

[e9] ux-check: rename an unrenamed session keeps the new header name — Android emulator-5606: one script call asserted the header 'Rename session: Session' (fallback, not the ISO) before, 'Rename session: e9 rename proof' after save and again after 30 s with the ISO placeholder and the fallback label absent (SCENE e9 OK; steps in e9.replay.json; pre-rename digest line in e9-rename-before.log); the server persisted the name (e9-title-db.log); screenshots e9pre/e9.png and e9full/e9.png.

[e9] ux-check: rename an unrenamed session keeps the new header name — e9.png

Follow-ups (not changed here)

  • not proved live: session-open: the open session's header shows a human-readable name and never a raw ISO timestamp, wrapped or not. (no capture cited it)
  • not proved live: ux-check: On Android, open the New coding task (repo-picker) screen: the helper sentence under the Run on selector reads exactly 'To run on your computer, start Kilo there and leave it running.' on screen. (no capture cited it)
  • not proved live: ux-check: On that same screen, none of the strings 'kilo remote', '/remote', 'CLI session', or 'local kilo process' appear anywhere on screen. (no capture cited it)
  • not proved live: ux-check: Open a session whose stored title is 'New session - 2026-09-22T02:05:22.778Z': the session header shows the fallback label (Session) on one line, and no 'YYYY-MM-DDTHH:' timestamp text appears anywhere on the session screen, wrapped or not. (no capture cited it)
  • not proved live: ux-check: Open a session whose stored title is a real name (e.g. 'Fix the session header'): the header shows that exact name, unchanged. (no capture cited it)
  • not proved live: ux-check: Rename an unrenamed session: after saving, the header keeps the new name and never reverts to the ISO placeholder or the fallback label. (no capture cited it)
  • not proved live: ux-check: Watch the session header from the loading skeleton to the loaded title: the header/title box keeps the same height and position (no content jump or reflow below it). (no capture cited it)

Open findings (not fixed here)

  • not proved live: repo-picker.png is no longer on the host that took it, so no publish can carry it
  • not proved live: session-starting.png is no longer on the host that took it, so no publish can carry it

e2

@kilo-code-bot

kilo-code-bot Bot commented Sep 22, 2026 •

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

The follow-up commit removes the duplicated normalizeSessionTitle helper and its test, and points both session-header call sites at the shared sessionDisplayTitle / isDefaultSessionTitle contract; the incremental changes are correct and the previous suggestion is resolved.

Files Reviewed (4 files)
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/lib/session-display-title.test.ts
  • apps/mobile/src/lib/session-title.test.ts (deleted)
  • apps/mobile/src/lib/session-title.ts (deleted)
Previous Review Summaries (2 snapshots, latest commit efb5805)

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

Previous review (commit efb5805)

Status: 1 Issues Found | Recommendation: Address before merge

One maintainability issue: a new mobile helper re-implements an existing title-normalization helper and the shared placeholder pattern.

Overview

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

SUGGESTION

File Line Issue
apps/mobile/src/lib/session-title.ts 19 normalizeSessionTitle duplicates sessionDisplayTitle and the shared DEFAULT_SESSION_TITLE_PATTERN; reuse the existing helper.
Files Reviewed (10 files)
  • apps/mobile/src/components/agents/new-session-configure-form.test.ts
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.ts
  • apps/mobile/src/i18n/locales/en.json
  • apps/mobile/src/i18n/plain-copy.test.ts
  • apps/mobile/src/i18n/plain-text-copy.test.ts
  • apps/mobile/src/lib/session-title.test.ts
  • apps/mobile/src/lib/session-title.ts - 1 suggestion

Fix these issues in Kilo Cloud

Previous review (commit 1b78f7c)

Status: No Issues Found | Recommendation: Merge

Files Reviewed (9 files)
  • apps/mobile/src/components/agents/new-session-configure-form.test.ts
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.ts
  • apps/mobile/src/i18n/locales/en.json
  • apps/mobile/src/i18n/plain-copy.test.ts
  • apps/mobile/src/lib/session-title.test.ts
  • apps/mobile/src/lib/session-title.ts

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

Review guidance: REVIEW.md from base branch main

@iscekic
iscekic marked this pull request as draft September 22, 2026 20:26
@iscekic
iscekic force-pushed the kwf/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc branch from 54c9ba9 to efb5805 Compare September 23, 2026 01:04
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 01:26
Comment thread apps/mobile/src/lib/session-title.ts Outdated
@iscekic
iscekic marked this pull request as draft September 23, 2026 01:38
@iscekic
iscekic force-pushed the kwf/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc branch from efb5805 to 3698cb1 Compare September 23, 2026 02:07
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 02:22
@iscekic

iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: session-open: the open session's header shows a human-readable name and never a raw ISO timestamp, wrapped or not. (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 23, 2026
@iscekic iscekic self-assigned this Sep 23, 2026
@iscekic
iscekic merged commit 47d7ee2 into main Sep 23, 2026
28 checks passed
@iscekic
iscekic deleted the kwf/explorer-2-visual-defects-on-android-the-run-on-helper-se-4ea1b-33fc branch September 23, 2026 15:01
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