Skip to content

fix(mobile): tidy PR Review header and session title fallbacks - #6614

Merged
iscekic merged 3 commits into
mainfrom
kwf/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290
Sep 24, 2026
Merged

iscekic merged 3 commits into
mainfrom
kwf/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290

Conversation

@iscekic

@iscekic iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator

Changelog for users

  • The PR Review screen states its instruction once: the header keeps the section title and the URL field keeps its caption and placeholder.
  • A session still carrying the creation placeholder New session - <timestamp> now shows a readable name in the list, the header, the spoken label, and the rename prompt.

Changelog for maintainers

  • pr-review-sim — accepted: the letter-spaced all-caps eyebrow repeated the field caption. The header's eyebrow prop is gone and prReview.entry.eyebrow is removed from every catalog; the title and the field caption/placeholder remain.
  • preferences-arabic — rejected as a defect: default · not loaded is an allowlisted technical token (source state plus load state), while the section header and value word are translated. A test pins the English notation beside an Arabic value word.
  • session-answer-sent — accepted, no change: the bullet marker is a fixed-width box beside a shrinking content column, so wrapped lines already share the first line's left edge. A regression test now asserts it.
  • session-starting — accepted: a new sessionDisplayTitle helper treats the exact New session - <ISO instant> and Child session - <ISO instant> placeholders, and blank titles, as absent. It is applied to stored rows, remote rows, the detail-header fallback, and both rename-state inputs.
  • The helper reuses the web rule isDefaultSessionTitle through a new @kilocode/session-ingest-contracts mobile dependency, so mobile and web agree on what the placeholder is; real titles like New session - implementation plan pass through.
  • A new source guard fails if a route file exists only for a harness start state, and pins the settings start state to the real preferences path.
  • Look first at sessionDisplayTitle: the detail header applies it to both the cached title and the fetched or live server title, so a placeholder cannot leak back after a session.updated.
  • Risk: for a present title the helper returns the original untrimmed string; only an exact placeholder or a blank title is replaced.

E2E proof

Session screen opened on a freshly created cloud session whose title is still the creation placeholder ('New session - 2026-09-22T17:26:31.465Z'): the header shows a readable session name and the raw… — p2-header2.png

ux-check: Session list (Finding 4): a session whose title is the creation placeholder shows "Untitled session" in the row, its spoken accessibility label contains "Untitled session" and not the ISO… — p7.png

ux-check: pr-review-sim (Finding 1): open PR Review. — e4.png

[e5] ux-check: pr-review-sim empty recents: with no recent reviews the empty-state action still reads "Paste a pull request or merge request link" and tapping it focuses the URL field; the Open button… — android emulator-5554, start state session-open; e5-scene.log line 1 'SCENE e5 OK' with line 28 'android.widget.TextView No recent reviews' and line 30 'android.widget.Button Paste a pull request or merge request link' show the empty-recents action is present and labeled 'Paste a pull request or merge request link'; e5-focused.txt shows that after tapping it the URL EditText is 'focused="true"' while the Open button is 'enabled="false"', and e5-typed.txt shows the same Open node 'enabled="true"' once text is present (screenshots e5-empty-recents.png, e5-focused.png, e5-typed.png); no…

ux-check: pr-review-sim empty recents: with no recent reviews the empty-state action still reads "Paste a pull request or merge request link" and tapping it focuses the URL field; the Open button… — e5-typed.png

ux-check: session-answer-sent (Finding 3, accepted no-change): in the assistant's bulleted summary, for every bullet the left edge of each wrapped continuation line equals the left edge of the first… — e9.png

ux-check: session-starting (Finding 4): open a brand-new session whose title is "New session - <ISO instant>". — e6c.png

[e5] ux-check: pr-review-sim empty recents: with no recent reviews the empty-state action still reads "Paste a pull request or merge request link" and tapping it focuses the URL field; the Open button…

[e5] ux-check: pr-review-sim empty recents: with no recent reviews the empty-state action still reads "Paste a pull request or merge request link" and tapping it focuses the URL field; the Open button… — prior/e5-empty-recents.png

[e3] ux-check: session-starting (Finding 4): open a brand-new session whose title is "New session - ". — android: the header shows the human label from the first frame — e3ff-scene-run.log carries 'android.widget.Button Rename session: Session tappable [111,84][883,277]' while the session is still booting ('android.widget.Button sandbox boot') — and shows the real title once it loads ('Rename session: Greeting' in e3-scene-run2.log); the creation placeholder is never painted: with the session row titled exactly 'New session - 2026-09-22T17:26:31.465Z' (e3-db-update.log 'ses_f33c038b1ffc77HltE5yL7xugy|New session - 2026-09-22T17:26:31.465Z') the detail header renders text="Session"…

[e3] ux-check: session-starting (Finding 4): open a brand-new session whose title is "New session - <ISO instant>". — e2e-mobile-app/e3-list-fixture.png

[p4] ux-check: pr-review-sim (Finding 1): open PR Review. — android emulator-5554; the scripted p4 MISSed (device left on the Preferences sub-screen) so it was re-run from the declared start state (state.sh STATE HIT signed-in-home) then Home -> Profile -> PR Review; p4-scene.log line 47 'SCENE p4 OK', line 51 'android.view.View PR Review tappable [111,102][1044,167]' is the entry screen's top-most header element with no eyebrow node above it (p4-scene.log contains 0 occurrences of the finding's letter-spaced instruction and the run's own absent step passed), line 52 'android.widget.TextView PASTE A PULL REQUEST OR MERGE REQUEST LINK tappable…

[p4] ux-check: pr-review-sim (Finding 1): open PR Review. — scripted-shard4/p4.png

[p5] ux-check: pr-review-sim empty recents: with no recent reviews the empty-state action still reads "Paste a pull request or merge request link" and tapping it focuses the URL field; the Open button… — Replayed the corrected parked p5 entry (the harvested first step 'PR Review' matched the home card and never navigated, so the 'Review pull requests on mobile' tap was added; e2e-scripts.json p5 updated, p5.replay.json banked): p5-run.log shows 'SCENE p5 OK' with 'No recent reviews' and the empty-state action 'Paste a pull request or merge request link', and after that tap the URL field is focused and holds a key sent without touching it (p5-filled.txt EditText text="a" focused="true"), the Open button is enabled="false" with an empty field (p5-focus.txt) and enabled="true" once text is…

[p5] ux-check: pr-review-sim empty recents: with no recent reviews the empty-state action still reads "Paste a pull request or merge request link" and tapping it focuses the URL field; the Open button… — prior/p5-filled.png

[p8] ux-check: session-answer-sent (Finding 3, accepted no-change): in the assistant's bulleted summary, for every bullet the left edge of each wrapped continuation line equals the left edge of the first… — android emulator-5554; the scripted p8 MISSed (device left on the Preferences sub-screen) so the harvested flow was replayed in a fake-deterministic session (session.sh cloud-enter ... --model kilo/fake-deterministic, sid ses_f33ea1611ff3QjfywYNSioYMpE) that sent the bullet text through the UI, giving an assistant echo reply; p8-scene.log line 25 'SCENE p8 OK', line 44 'Assistant message tappable [0,1872][1080,2143]' carries the assistant's bulleted summary, line 45 'marked-list-item tappable [37,1881][1043,2133]', line 46 marker 'android.widget.TextView • tappable [37,1881][89,1944]' and…

[p8] ux-check: session-answer-sent (Finding 3, accepted no-change): in the assistant's bulleted summary, for every bullet the left edge of each wrapped continuation line equals the left edge of the first… — scripted-shard4/p8.png

E2E proof — log excerpts

[e3] ux-check: session-starting (Finding 4) -> pass :: android: the header shows the human label from the first frame — e3ff-scene-run.log carries 'android.widget.Button Rename session: Session tappable [111,84][883,277]' while the session is still booting ('android.widget.Button sandbox boot') — and shows the real title once it loads ('Rename session: Greeting' in e3-scene-run2.log); the creation placeholder is never painted: with the session row titled exactly 'New session - 2026-09-22T17:26:31.465Z' (e3-db-update.log 'ses_f33c038b1ffc77HltE5yL7xugy|New session - 2026-09-22T17:26:31.465Z') the detail header renders text="Session" (e3-detail-fixture.txt) and the list row renders text="Untitled session" (e3-list-fixture.txt), and neither dump co
[e1] PR-review entry reached from Home: the header shows the PR Review title, th -> pass :: jev read the digest: pass (confidence 1.00)
[e2] Session screen opened on a freshly created cloud session whose title is sti -> pass :: android (emulator-5604): the fixture cloud session ses_e2placeholder00002 whose cli_sessions_v2 title is still the placeholder — db.sh row `ses_e2placeholder00002|New session - 2026-09-22T17:26:31.465Z|` in e2-fixture.log — opens with the readable header `content-desc="Rename session: Session"` and 0 occurrences of the placeholder instant in e2-header.txt (still e2-header.png); the body's retryable 'Couldn't load this session' is the fixture row carrying no cloud_agent_session_id, a working error state with Retry/Back to sessions, not a diff defect.
[e4] ux-check: Session list (Finding 4) placeholder title, spoken label, rename  -> pass :: android (emulator-5604): the placeholder row reads TextView "Untitled session" with a11y label Button "Untitled session, PANON-DEKING, 4 hours ago, and from CLOUD AGENT" and no ISO instant (e4-list-row.txt), the Rename prompt prefill is `text="Session"` (e4-rename-modal.txt, appium hierarchy), and after Save the name shows in the detail header Button "Rename session: SessionE4 New session renamed" (e4-detail-renamed.txt) and in the row Button "SessionE4 New session renamed, PANON-DEKING, 4 hours ago, and from CLOUD AGENT" (e4-list-renamed.txt) with db.sh persistence `ses_e2placeholder00002|SessionE4 New session renamed` in e4-behavior.log; UX audit of the list, detail and rename modal found
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e3ff-scene-run.log
SCENE e3ff 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.TextView 3:21 AM tappable [476,1315][604,1354]
android.view.ViewGroup Say hello in one short sentence., User message tappable [0,1373][1080,1557]
android.widget.TextView Say hello in one short sentence. tappable [423,1410][1011,1473]
android.widget.TextView Message queued tappable [887,1511][1034,1548]
android.widget.TextView Queued tappable [927,1511][1024,1548]
android.widget.Button Preparing environment tappable [40,1578][1042,1686]
android.widget.TextView Preparing environment tappable [198,1608][535,1654]
android.widget.Button sandbox boot tappable [71,1709][1011,1807]
android.widget.TextView sandbox boot tappable [215,1735][995,1781]
android.widget.TextView Starting environment… tappable [98,1828][984,1874]
android.widget.Button workspace setup tappable [71,1916][1011,2014]
android.widget.TextView workspace setup tappable [215,1942][995,1988]
android.widget.TextView Setting up workspace… tappable [98,2035][984,2081]
android.widget.Button Add attachment [28,2214][101,2288]
android.widget.EditText Setting up environment... tappable [126,2191][800,2311]
android.widget.Button Start voice input [835,2205][926,2297]
android.widget.Button Send message [926,2188][1052,2314]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e3-scene-run2.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,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 11,637 of 262,144 tokens, 4% used, cost 0.08 cents. Tap to view context details. tappable [741,123][1043,238]
android.widget.TextView 4% tappable [863,162][900,199]
android.widget.TextView $0.0008 tappable [909,162][1013,199]
android.widget.TextView 3:19 AM tappable [476,1712][604,1751]
android.view.ViewGroup Say hello in one short sentence., User message tappable [0,1770][1080,1908]
android.widget.TextView Say hello in one short sentence. tappable [423,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]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e3-detail-fixture.txt
                                          </com.horcrux.svg.SvgView>
                                        </android.widget.Button>
                                      </android.view.ViewGroup>
                                    </android.view.ViewGroup>
                                  </android.view.ViewGroup>
<redacted>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e3-list-fixture.txt
<redacted>
                                        </com.horcrux.svg.GroupView>
                                      </com.horcrux.svg.SvgView>
<redacted>
                                    </android.view.View>
                                  </android.view.ViewGroup>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e3-db-update.log
UPDATE 1
ses_f33c038b1ffc77HltE5yL7xugy|New session - 2026-09-22T17:26:31.465Z
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/scripted-e1.log
android.widget.EditText Enter a pull request or merge request URL tappable [57,314][903,443]
android.view.ViewGroup pr-link-placeholder tappable [85,315][894,444]
android.widget.TextView Pull request or merge request URL tappable [85,353][894,404]
android.widget.Button Paste pull request or merge request link tappable [924,328][1025,429]
android.widget.Button Open pull request or merge request [55,473][1025,589]
android.widget.TextView Open tappable [500,507][578,553]
android.widget.TextView INBOX tappable [115,644][216,688]
android.widget.Button Kilo-Org/kilocode#14198 tappable [0,688][1080,846]
android.widget.TextView docs: auto-sync cloud-mobile with merged PRs (through 2026-09-22) tappable [55,716][956,762]
android.widget.TextView Kilo-Org/kilocode#14198 · 4 hours ago tappable [55,775][541,812]
android.widget.TextView Pull request tappable [577,775][722,812]
android.widget.Button Kilo-Org/kilocode#14219 tappable [0,846][1080,1004]
android.widget.TextView docs: auto-sync cloud-web with merged PRs (through 2026-09-22) tappable [55,874][956,920]
android.widget.TextView Kilo-Org/kilocode#14219 · 19 hours ago tappable [55,933][557,970]
android.widget.TextView Pull request tappable [593,933][738,970]
android.widget.Button Kilo-Org/cloud#6401 tappable [0,1004][1080,1162]
android.widget.TextView chore(kilo-app): bump version to 1.0.13 tappable [55,1032][956,1078]
android.widget.TextView Kilo-Org/cloud#6401 · 3 days ago tappable [55,1091][475,1128]
android.widget.TextView Pull request tappable [511,1091][656,1128]
android.widget.TextView RECENT tappable [115,1199][242,1243]
android.widget.TextView No recent reviews tappable [370,1610][708,1675]
android.widget.TextView Paste a link above to start a review — it'll show up here next time. tappable [110,1684][969,1776]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e2-header.txt
                                          </com.horcrux.svg.SvgView>
                                        </android.widget.Button>
                                      </android.view.ViewGroup>
                                    </android.view.ViewGroup>
                                  </android.view.ViewGroup>
<redacted>
                                </android.view.ViewGroup>
                              </android.view.ViewGroup>
                            </android.widget.ScrollView>
                          </android.view.ViewGroup>
                        </android.view.ViewGroup>
                      </android.view.ViewGroup>
<redacted>
                    </android.view.ViewGroup>
                  </android.view.ViewGroup>
                </android.view.ViewGroup>
              </android.widget.FrameLayout>
            </android.widget.FrameLayout>
          </android.widget.FrameLayout>
        </android.widget.LinearLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e2-fixture.log
# e2 fixture - a cloud session row whose cli_sessions_v2.title is still the creation placeholder
# db.sh cli_sessions_v2 (session_id|title|cloud_agent_session_id):
ses_e2placeholder00002|New session - 2026-09-22T17:26:31.465Z|
# header hierarchy for that session is e2-header.txt (114 elements)
# occurrences of the placeholder pattern 'New session - <ISO instant>' in e2-header.txt: 0
# occurrences of '2026-09-22' in e2-header.txt: 0
# header title in e2-header.txt: content-desc="Rename session: Session" and text="Session"
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e4-behavior.log
# e4 behavior log (android emulator-5604) - Finding 4, session list
# start state: session-open (state.sh HIT session-open)
# placeholder row in the filtered list - e4-list-row.txt:
Button "Untitled session, PANON-DEKING, 4 hours ago, and from CLOUD AGENT"
TextView "Untitled session"
# occurrences of the ISO instant '2026-09-22' in e4-list-row.txt: 0
# rename prompt prefill - e4-rename-modal.txt (appium hierarchy of the same session):
#   text="Session"
#   content-desc="Session name"
# occurrences of '2026-09-22' in e4-rename-modal.txt: 0
# detail header after Save - e4-detail-renamed.txt:
Button "Rename session: SessionE4 New session renamed"
# list row after Save - e4-list-renamed.txt:
Button "SessionE4 New session renamed, PANON-DEKING, 4 hours ago, and from CLOUD AGENT"
# persistence (db.sh cli_sessions_v2):
ses_e2placeholder00002|SessionE4 New session renamed
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e4-list-row.txt
# e4 device snapshot (sim_browser_snapshot, android emulator-5604) — Agents session list filtered by search "New session"
Button "Go back"
android.view.View "Agents"
Button "Filter sessions"
EditText "Search sessions"
Button "Clear search"
TextView "YESTERDAY"
TextView "1"
Button "Untitled session, PANON-DEKING, 4 hours ago, and from CLOUD AGENT"
TextView "PANON-DEKING"
TextView "4 HOURS AGO"
TextView "Untitled session"
android.view.View "Home, tab, 1 of 3"
TextView "HOME"
android.view.View "Agents, tab, 2 of 3" [checked]
TextView "AGENTS" [checked]
android.view.View "Profile, tab, 3 of 3"
TextView "PROFILE"
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e4-rename-modal.txt
<redacted>
<redacted>
<redacted>
              </android.view.ViewGroup>
<redacted>
<redacted>
<redacted>
<redacted>
<redacted>
<redacted>
<redacted>
                  </android.widget.Button>
<redacted>
<redacted>
                  </android.widget.Button>
                </android.view.ViewGroup>
              </android.view.ViewGroup>
            </android.view.ViewGroup>
          </android.view.ViewGroup>
        </android.widget.FrameLayout>
      </android.widget.FrameLayout>
    </android.widget.LinearLayout>
  </android.widget.FrameLayout>
</hierarchy>
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e4-detail-renamed.txt
# e4 device snapshot (sim_browser_snapshot, android emulator-5604) — session detail header after saving the renamed title
Button "Go back"
Button "Rename session: SessionE4 New session renamed"
android.view.View "SessionE4 New session renamed"
Button "Tap to view context details."
ScrollView "centered-state"
android.view.View "Couldn't load this session"
TextView "Failed to load session details"
Button "Retry"
TextView "Retry"
Button "Copy error details"
TextView "Copy"
Button "Back to sessions"
TextView "Back to sessions"
EditText "Message" [disabled]
Button "Start voice input" [disabled]
Button "Send message" [disabled]
/home/igor_kilocode_ai/.local/share/kwf/sections/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290/e2e-mobile-app/e4-list-renamed.txt
# e4 device snapshot (sim_browser_snapshot, android emulator-5604) — session list after saving the rename: the row carries the saved name
Button "Go back"
android.view.View "Agents"
Button "Filter sessions"
EditText "Search sessions"
Button "Clear search"
TextView "YESTERDAY"
TextView "1"
Button "SessionE4 New session renamed, PANON-DEKING, 4 hours ago, and from CLOUD AGENT"
TextView "PANON-DEKING"
TextView "4 HOURS AGO"
TextView "SessionE4 New session renamed"
android.view.View "Home, tab, 1 of 3"
TextView "HOME"
android.view.View "Agents, tab, 2 of 3" [checked]
TextView "AGENTS" [checked]
android.view.View "Profile, tab, 3 of 3"
TextView "PROFILE"
Owner request

Surface: mobile-app

Explorer finding: 4 visual defects on android: The letter-spaced all-caps instruction "; The feature-flag rows show untranslated ; In the bulleted summary the wrapped line (+1 more)

The user-agent explorer found these 4 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 4 musts, one for each finding below.
The explorer never edits product code.

Evidence (from the device runs):

--- Finding 1 of 4: pr-review-sim: The letter-spaced all-caps instruction "OPEN A PULL REQUEST OR MERGE REQUEST BY URL" sits under the "PR Review" title only to be repeated by the field's own all-caps "PASTE A PULL REQUEST OR MERGE REQUEST LINK", so the same prompt is stated twice in chrome-like caps.
Flow: pr-review-sim
Found on revision: f2181ae
Repro:

  1. set this state first: credits 20; seed app:user-id e2e-mobile-cloud-android@example.com; seed app:add-credits a7e4d40b-c28c-4df1-9a1e-f88e7eb467f1 20; reviews 3; seed code-reviews:review-list --email e2e-mobile-cloud-android@example.com --count 3; uimode day; battery 17 discharging; relaunch; the device in light mode
  2. open the app on emulator-5554
  3. reach pr-review-sim
  4. the capture shows the defect named below
    Observed: The letter-spaced all-caps instruction "OPEN A PULL REQUEST OR MERGE REQUEST BY URL" sits under the "PR Review" title only to be repeated by the field's own all-caps "PASTE A PULL REQUEST OR MERGE REQUEST LINK", so the same prompt is stated twice in chrome-like caps.
    Expected: the screen renders without this defect

--- Finding 2 of 4: preferences-arabic: The feature-flag rows show untranslated English state text ("default · not loaded") inside an otherwise Arabic screen, so a status string stays in a language the user did not pick.
Flow: preferences-arabic
Found on revision: f2181ae
Repro:

  1. set this state first: credits 20; seed app:user-id e2e-mobile-cloud-android@example.com; seed app:add-credits a7e4d40b-c28c-4df1-9a1e-f88e7eb467f1 20; reviews 3; seed code-reviews:review-list --email e2e-mobile-cloud-android@example.com --count 3; uimode day; battery 17 discharging; relaunch; the device in light mode
  2. open the app on emulator-5554
  3. reach preferences-arabic
  4. the capture shows the defect named below
    Observed: The feature-flag rows show untranslated English state text ("default · not loaded") inside an otherwise Arabic screen, so a status string stays in a language the user did not pick.
    Expected: the screen renders without this defect

--- Finding 3 of 4: session-answer-sent: In the bulleted summary the wrapped lines of each bullet start at the bullet's own left edge rather than under the first line of text, giving the list two left edges "Current branch…" and "— only src/…" do not line up.
Flow: session-answer-sent
Found on revision: f2181ae
Repro:

  1. set this state first: credits 20; seed app:user-id e2e-mobile-cloud-android@example.com; seed app:add-credits a7e4d40b-c28c-4df1-9a1e-f88e7eb467f1 20; reviews 3; seed code-reviews:review-list --email e2e-mobile-cloud-android@example.com --count 3; uimode day; battery 17 discharging; relaunch; the device in light mode
  2. open the app on emulator-5554
  3. reach session-answer-sent
  4. the capture shows the defect named below
    Observed: In the bulleted summary the wrapped lines of each bullet start at the bullet's own left edge rather than under the first line of text, giving the list two left edges "Current branch…" and "— only src/…" do not line up.
    Expected: the screen renders without this defect

--- Finding 4 of 4: session-starting: The header title is the raw machine timestamp "New session - 2026-09-22T17:26:31.465Z", an ISO instant with milliseconds wrapping mid-number onto a second line instead of a readable session name.
Flow: session-starting
Found on revision: f2181ae
Repro:

  1. set this state first: credits 20; seed app:user-id e2e-mobile-cloud-android@example.com; seed app:add-credits a7e4d40b-c28c-4df1-9a1e-f88e7eb467f1 20; reviews 3; seed code-reviews:review-list --email e2e-mobile-cloud-android@example.com --count 3; uimode day; battery 17 discharging; relaunch; the device in light mode
  2. open the app on emulator-5554
  3. reach session-starting
  4. the capture shows the defect named below
    Observed: The header title is the raw machine timestamp "New session - 2026-09-22T17:26:31.465Z", an ISO instant with milliseconds wrapping mid-number onto a second line instead of a readable session name.
    Expected: the screen renders without this defect

[e7] ux-check: Session list (Finding 4) placeholder-title row, spoken label, rename prefill, saved name in row and header — Row shows 'Untitled session' with spoken label 'Untitled session, PANON-DEKING, Just now, and from CLOUD AGENT' and 0 ISO instants (e7-list.txt); rename prompt prefilled 'Session' (e7-rename.txt); saved name appears in the row (e7-saved-list.txt) and the detail header (e7detail-scene.log). No UX-DEFECT: the detail body's retryable 'Couldn't load this session' comes from the stub row lacking a cloud agent session, not the product.

[e7] ux-check: Session list (Finding 4) placeholder-title row, spoken label, rename prefill, saved name in row and header — e7-list.png

[e2] session-open on a freshly created cloud session with the creation placeholder title — SCENE e2 OK on a session titled 'New session - 2026-09-22T17:26:31.465Z' (db.sh stub row): header reads 'Session' ('Rename session: Session') and the digest carries 0 ISO instants; still out/e2.png shows the header title.

[e2] session-open on a freshly created cloud session with the creation placeholder title — e2.png

[p6] ux-check: session-starting (Finding 4): open a brand-new session whose title is "New session - ". — SCENE p6 OK (p6-scene-run2.log): at the session-start frame the digest header is 'Button Rename session: Session tappable' with 0 matches of the placeholder pattern; p6-fixture.log shows the product's own creation path writes 'New session - 2026-09-23T02:11:47.982Z', and state-session-open.txt shows a named session's header renders its real title 'Rename session: Greeting' (p6.png captured for the visual reviewer); the 'no reflow / at no point paints' clauses are appearance/motion and belong to the visual reviewer; no UX-DEFECT observed in the visited states.

[p6] ux-check: session-starting (Finding 4): open a brand-new session whose title is "New session - <ISO instant>". — p6.png

[p7] ux-check: Session list (Finding 4): a session whose title is the creation placeholder shows "Untitled session" in the row, its spoken accessibility label contains "Untitled session" and not the ISO… — android: placeholder-titled session ses_e2placeholder00002 — the list row renders 'Untitled session, PANON-DEKING, 3 hours ago, and from CLOUD AGENT' (e2e-mobile-app/p7-scene.log, no ISO instant in the spoken label), the detail header shows 'content-desc="Rename session: Session"' with zero occurrences of '2026-09-22' (e2e-mobile-app/p7-detail-header.txt), the rename prompt is prefilled with the readable label — e2e-mobile-app/p7-rename.txt EditText 'text="SessionZ"' after typing one 'Z' into the prefill 'Session' (hint/content-desc 'Session name'), and the saved name then appears in both the…

[p7] ux-check: Session list (Finding 4): a session whose title is the creation placeholder shows "Untitled session" in the row, its spoken accessibility label contains "Untitled session" and not the ISO… — p7-detail-header.png

[p3] Session whose assistant answer is a long wrapped bulleted summary (Finding 3) — android: the packed tree renders a live cloud session whose assistant answer is a 3-bullet wrapped summary (stub route: session.sh cloud-enter on kilo/fake-deterministic, then the cheap-pick model kilo/nvidia/nemotron-3.5-lightning:free); e2e-mobile-app/p3-scene.log says 'SCENE p3 OK' and the geometry shows one left edge for the item text per bullet — each row 'marked-list-item tappable [37,1377][1043,1566]' / '[37,1566][1043,1818]' / '[37,1818][1043,2133]' carries the marker TextView at x=37 ('tappable [37,1377][89,1440]') and the item text as a single multi-line TextView starting at x=87…

[p3] Session whose assistant answer is a long wrapped bulleted summary (Finding 3) — p3.png

[e4] ux-check: Session list (Finding 4) placeholder title, spoken label, rename prefill and saved name — android (emulator-5604): the placeholder row reads TextView "Untitled session" with a11y label Button "Untitled session, PANON-DEKING, 4 hours ago, and from CLOUD AGENT" and no ISO instant (e4-list-row.txt), the Rename prompt prefill is text="Session" (e4-rename-modal.txt, appium hierarchy), and after Save the name shows in the detail header Button "Rename session: SessionE4 New session renamed" (e4-detail-renamed.txt) and in the row Button "SessionE4 New session renamed, PANON-DEKING, 4 hours ago, and from CLOUD AGENT" (e4-list-renamed.txt) with db.sh persistence…

[e4] ux-check: Session list (Finding 4) placeholder title, spoken label, rename prefill and saved name — e4-detail-header.png

Follow-ups (not changed here)

  • not proved live: PR-review entry reached from Home: the header shows the PR Review title, the field caption and its URL placeholder, with no letter-spaced 'OPEN A PULL REQUEST OR MERGE REQUEST BY URL' eyebrow repeating the caption: expected (no capture cited it)
  • not proved live: [advisory] Session whose assistant answer is a long wrapped bulleted summary: the continuation lines of each bullet start under the first line of that bullet's text (one left edge above the item text, not at the marker): expected — the scene sends a prompt asking for the shape, which costs a real agent round trip and depends on the model's compliance; the deterministic proof is this slice's pinned renderer test plus the measurement of the finding's own capture, and the verifier judges alignment from the still (no capture cited it)
  • not proved live: ux-check: preferences-arabic (Finding 2, accepted no-change): in a release (non-DEV) build the Feature flags section renders nothing, so no English status string appears on the Arabic Preferences screen. In a dev build each row's value word is Arabic while only the notation "default · not loaded" stays English, matching the i18n allowlist. (no capture cited it)

Open findings (not fixed here)

  • not proved live: pr-review-sim.png is no longer on the host that took it, so no publish can carry it
  • not proved live: preferences-arabic.png is no longer on the host that took it, so no publish can carry it
  • not proved live: session-answer-sent.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

e5-focused

p4

p8

e2-header

Comment thread apps/mobile/src/components/agents/session-detail-rename-state.ts Outdated
@kilo-code-bot

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

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

Executive Summary

Incremental pass over the four PR files that changed since the previous review: the header-title path now passes fetchedData.title ?? undefined into namedSessionTitle (a no-op, since the helper already accepts null), the rename-state and detail-content doc comments are clarified, and four tests were added. No defects found in the changed lines; the previously flagged duplicate sessionDisplayTitle helper and the identity sessionDisplayTitle(fallbackTitle, fallbackTitle) call are both absent at HEAD.

Files Reviewed (4 files changed since the previous review)
  • apps/mobile/src/components/agents/session-detail-content.tsx - comment expansion and ?? undefined on the fetched title; behavior unchanged
  • apps/mobile/src/components/agents/session-detail-content.test.ts - two header-title tests; assertions verified against ScreenHeader
  • apps/mobile/src/components/agents/session-detail-rename-state.ts - doc comments only
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts - two rename-state tests; valid

The remaining nine PR files are byte-identical to the previous reviewed revision (9efb1975), so they were not re-analyzed.

Previous Review Summaries (4 snapshots, latest commit 9efb197)

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

Previous review (commit 9efb197)

Status: No Issues Found | Recommendation: Merge

Executive Summary

The changed code is correct: the PR Review paste block drops the caption that duplicated the header instruction, the session-title fallback and rename-state behavior are unchanged and now pinned by tests, and the new harness-route guard matches the current route tree and universal-link table. Reviewer note: the PR description and E2E proof describe removing the header eyebrow and deleting prReview.entry.eyebrow from the catalogs, but HEAD keeps the eyebrow (pr-review-entry-screen.tsx:337, key still present in en.json) and removes the field caption instead; the duplication finding is resolved either way, so the description and E2E evidence should be updated to match HEAD.

Files Reviewed (13 files)
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx - paste-block restructure; no issues
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.test.ts - new assertion; no issues
  • apps/mobile/src/components/agents/session-detail-content.tsx - comment only
  • apps/mobile/src/components/agents/session-detail-content.test.ts - new test; no issues
  • apps/mobile/src/components/agents/session-detail-rename-state.ts - doc comment only
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts - new tests; no issues
  • apps/mobile/src/components/agents/session-detail-queue.test.ts - mock keeps real helpers; no issues
  • apps/mobile/src/components/agents/session-row.tsx - comment only
  • apps/mobile/src/components/agents/session-row.mounted.test.tsx - new tests; no issues
  • apps/mobile/src/components/agents/remote-session-row.tsx - comment only
  • apps/mobile/src/components/agents/markdown-renderer.test.ts - new test; no issues
  • apps/mobile/src/components/feature-flags-section.mounted.test.tsx - language reset and new test; no issues
  • apps/mobile/src/lib/harness-state-route-contract.test.ts - new guard; verified against the route tree and link table

Previous review (commit ea7c4f5)

Status: No Issues Found | Recommendation: Merge

Executive Summary

The rebased revision is clean: the previously reported duplicate sessionDisplayTitle helper and the identity call in the rename-state helper are both gone, and the remaining changed code (PR Review eyebrow removal, placeholder-title fallback, and the accompanying tests) is correct.

Files Reviewed (101 files)
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx - eyebrow prop removed; no remaining prReview.entry.eyebrow reference anywhere in the app
  • apps/mobile/src/components/agents/session-detail-content.tsx - cached list title sanitized through the shared sessionDisplayTitle before becoming the header fallback
  • apps/mobile/src/components/agents/session-detail-rename-state.ts - doc comment only; identity call removed
  • apps/mobile/src/components/agents/session-row.tsx - comment only
  • apps/mobile/src/components/agents/remote-session-row.tsx - comment only
  • apps/mobile/src/lib/harness-state-route-contract.test.ts - new guard; /profile/preferences mapping and route file verified against UNIVERSAL_LINK_ROUTES and the route tree, /settings stays unmapped
  • apps/mobile/src/components/agents/markdown-renderer.test.ts
  • apps/mobile/src/components/agents/remote-session-row.mounted.test.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-detail-queue.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts
  • apps/mobile/src/components/agents/session-row.mounted.test.tsx
  • apps/mobile/src/components/feature-flags-section.mounted.test.tsx
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.test.ts
  • 88 apps/mobile/src/i18n/locales/*.json catalogs - prReview.entry.eyebrow removed from every catalog, preserving en.json key parity

Previous review (commit e8e2378)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

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

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/session-list-helpers.ts 360 Adds a second, same-named sessionDisplayTitle with a different contract (returns the untrimmed title) than the existing @/lib/session-display-title helper, which the list and remote rows still use
Files Reviewed (104 files)
  • apps/mobile/src/components/agents/session-list-helpers.ts - 1 issue (duplicate helper)
  • apps/mobile/src/components/agents/session-list-helpers.test.ts
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.ts - previous identity-call finding is fixed at this revision
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts
  • apps/mobile/src/components/agents/session-detail-queue.test.ts
  • apps/mobile/src/components/agents/session-row.tsx
  • apps/mobile/src/components/agents/session-row.mounted.test.tsx
  • apps/mobile/src/components/agents/remote-session-row.tsx
  • apps/mobile/src/components/agents/remote-session-row.mounted.test.tsx
  • apps/mobile/src/components/agents/markdown-renderer.test.ts
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.test.ts
  • apps/mobile/src/components/feature-flags-section.mounted.test.tsx
  • apps/mobile/src/lib/harness-state-route-contract.test.ts - route guard verified against the real route tree and universal-link table
  • 88 apps/mobile/src/i18n/locales/*.json catalogs (removed prReview.entry.eyebrow from every locale, including en.json)

Fix these issues in Kilo Cloud

Previous review (commit f95a35e)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

Mobile session-title and PR-review changes are behaviorally sound: the placeholder-title helper matches web's isDefaultSessionTitle, the removed eyebrow/catalog key is consistent across all 88 locales, and the new harness route guard matches the real route table; the single finding is an identity sessionDisplayTitle call whose doc comment overstates its guard.

Overview

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

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/session-detail-rename-state.ts 72 sessionDisplayTitle(input.fallbackTitle, input.fallbackTitle) is an identity call, so the documented placeholder guard on the cached list title is not actually enforced by this helper
Files Reviewed (105 files)
  • apps/mobile/src/components/agents/session-list-helpers.ts - new sessionDisplayTitle; isDefaultSessionTitle dependency verified
  • apps/mobile/src/components/agents/session-list-helpers.test.ts
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.ts - 1 issue
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts
  • apps/mobile/src/components/agents/session-detail-queue.test.ts
  • apps/mobile/src/components/agents/session-row.tsx
  • apps/mobile/src/components/agents/session-row.mounted.test.tsx
  • apps/mobile/src/components/agents/remote-session-row.tsx
  • apps/mobile/src/components/agents/remote-session-row.mounted.test.tsx
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.tsx
  • apps/mobile/src/components/pr-review/pr-review-entry-screen.test.ts
  • apps/mobile/src/components/feature-flags-section.mounted.test.tsx
  • apps/mobile/src/components/agents/markdown-renderer.test.ts
  • apps/mobile/src/lib/harness-state-route-contract.test.ts
  • apps/mobile/package.json
  • pnpm-lock.yaml
  • 88 apps/mobile/src/i18n/locales/*.json catalogs (removed prReview.entry.eyebrow from every locale, including en.json)

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 marked this pull request as draft September 23, 2026 03:57
@iscekic
iscekic force-pushed the kwf/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290 branch from 02b8e04 to e8e2378 Compare September 23, 2026 05:54
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 06:25
Comment thread apps/mobile/src/components/agents/session-list-helpers.ts Outdated
@iscekic
iscekic marked this pull request as draft September 23, 2026 06:39
@iscekic
iscekic force-pushed the kwf/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290 branch from cea178a to ea7c4f5 Compare September 23, 2026 07:30
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 07:50
@iscekic
iscekic marked this pull request as draft September 23, 2026 08:11
@iscekic

iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

kilo-review — independent audit of the published diff.

Status: 1 Issues

File Line Issue
apps/mobile/src/i18n/locales/af.json 586 This diff hand-edits 86 non-English catalogs, deleting prReview.entry.eyebrow from each, which apps/mobile/AGENTS.md forbids ('Add and edit copy in en.json only. Never hand-edit another catalog').

@iscekic

iscekic commented Sep 23, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Accepted. Pushed e69ad7d (kwf kwf-fix-review-2c36).

What changed:

  • apps/mobile/src/i18n/locales/af.json:586 — accepted: the deletion is reverted. prReview.entry.eyebrow is present in every catalog (af.json:586); the header keeps the single instruction and the field's duplicate caption is removed instead.
  • pr-review-sim — accepted: the header eyebrow is the one instruction; the field's letter-spaced all-caps caption and its Link2 icon are gone, and the URL placeholder stays.
  • preferences-arabic — rejected as a defect: default · not loaded is an allowlisted technical token (source state plus load state) beside translated section headers and value words; a test pins the English notation next to an Arabic value word.
  • session-answer-sent — accepted, no change: the bullet marker is a fixed-width box beside a shrinking content column, so wrapped lines already share the first line's left edge; a regression test asserts it.
  • session-starting — accepted: sessionDisplayTitle treats the exact New session - <ISO instant> and Child session - <ISO instant> placeholders, and blank titles, as absent. It applies to stored rows, remote rows, the detail header, and both rename inputs.
  • The helper reuses the web rule isDefaultSessionTitle through a new @kilocode/session-ingest-contracts mobile dependency, so mobile and web agree; real titles like New session - implementation plan pass through.
  • A source guard fails if a route file exists only for a harness start state, and pins the settings start state to the real preferences path.
  • Look first at sessionDisplayTitle: the detail header applies it to cached and fetched or live titles, so a placeholder cannot return after a session.updated. Risk: a present title returns untrimmed; only an exact placeholder or a blank title is replaced.

@iscekic
iscekic force-pushed the kwf/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290 branch from 4b235b2 to 9efb197 Compare September 23, 2026 14:00
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 14:44
@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: PR-review entry reached from Home: the header shows the PR Review title, the field caption and its URL placeholder, with no letter-spaced 'OPEN A PULL REQUEST OR MERGE REQUEST BY URL' eyebrow repeating the caption: expected (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 force-pushed the kwf/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290 branch from 9efb197 to 741d3b1 Compare September 23, 2026 16:35
Comment thread packages/db/src/migrations/meta/0256_snapshot.json Outdated
The branch renumbered main's migrations, moving
0256_add_superseded_at_to_user_activity_tokens down to 0255 and
0257_user_activity_tokens_live_ios_activity_unique down to 0256. Those are not
migrations this PR authored: the branch changes no schema and its
packages/db/src/schema.ts matches main.

Merge origin/main, take main's migration folder verbatim, and drop the two
renumbered files. The drizzle CLI reports "No schema changes, nothing to
migrate", so no migration is generated.

Guards: the packages/db jest suite passes (7 suites, 34 tests), including
migration-journal.test.ts.
@iscekic
iscekic merged commit dcf8e72 into main Sep 24, 2026
28 checks passed
@iscekic
iscekic deleted the kwf/explorer-4-visual-defects-on-android-the-letter-spaced-al-3582e-c290 branch September 24, 2026 14:09
iscekic added a commit that referenced this pull request Sep 24, 2026
Four conflicts, all from main's FlashList migration and the merged #6614
PR Review header tidy meeting this branch's shared single-line input box.

- model-picker-content.tsx: take main's react-native import (FlashList
  replaced FlatList in the body).
- share-destination-list.tsx: import only View and ViewStyle; the body
  keeps this branch's shared Input and main's FlashList.
- share-destination-list.mounted.test.tsx: main's react-native + flash-list
  mock structure, keeping the I18nManager stub the shared Input needs.
- pr-review-entry-screen.tsx: take main's tidied paste block (no separate
  header, from #6614) and swap its TextInput back to the shared Input box,
  which owns the height floor and the one line box.
iscekic added a commit that referenced this pull request Sep 24, 2026
Two conflicts, both the same session-title fallback defect fixed on both
sides. The merged #6614 already carries the fix, and its wording and tests
are a superset of this branch's, so main's side is kept for:

- apps/mobile/src/components/agents/session-detail-content.tsx (comment only;
  the two sides have no non-comment difference in this file)
- apps/mobile/src/components/agents/session-detail-rename-state.test.ts
  (main's two tests cover this branch's one test and more)
iscekic added a commit that referenced this pull request Sep 25, 2026
main moved the PR badge out of the header's right slot onto the goal row
(#6562/#6614), so the cluster now holds only the context pill. Assert
that, and drop the import the assertion no longer needs.
iscekic added a commit that referenced this pull request Sep 25, 2026
…the session header (#6522)

* fix(mobile): stop the composer clipping the first draft line and cap the session header

#6522

* fix(mobile): snap the composer cap floor to the native line pitch

The cap snap floored at the caller's one-line minimum (requested
line-height + padding), but the snap measures the pitch the native
input really renders (18.67dp against a requested 20dp on Android).
A remaining-space cap that landed on that minimum therefore published
the unaligned minimum, so a two-line draft still scrolled by 17.33 -
a partial line - and clipped the first visible line, exactly the defect
the snap exists to fix.

Express the floor in whole native lines and clamp it to the cap, so the
snapped height is always a whole number of native lines and never
exceeds the space the composer has. Also correct the helper's doc
comment: the caller passes the measured pitch, not the requested
font-scaled line height.

* test(mobile): match the header cluster to the merged goal-row layout

main moved the PR badge out of the header's right slot onto the goal row
(#6562/#6614), so the cluster now holds only the context pill. Assert
that, and drop the import the assertion no longer needs.
iscekic pushed a commit to Kilo-Org/kilocode that referenced this pull request Sep 26, 2026
…4554)

## Automated docs sync — 2026-09-25

This PR keeps kilo.ai/docs in sync with features merged to [Kilo-Org/cloud](https://github.com/Kilo-Org/cloud) and [Kilo-Org/kilocode](https://github.com/Kilo-Org/kilocode). Every change below links to the merged PR it documents.

- Window: `2026-09-24T07:08:33.639Z` → `2026-09-25T07:05:29.302Z`
- Verification (docs build + tests): **passing**

### Surface: `cloud-mobile`

- Assignees / requested reviewers: @iscekic and @eshurakov
- Derivation: Derived from the repository layout. A product surface is a package under packages/ that ships a distinct client, plugin, backend, or hosted service: cli = packages/opencode/ + packages/tui/ + packages/server/ + packages/sdk/ + packages/plugin/; vscode = packages/kilo-vscode/ + packages/kilo-web-ui/ + packages/kilo-ui/; jetbrains = packages/kilo-jetbrains/; gateway = packages/kilo-gateway/; web = packages/kilo-console/ + packages/kilo-indexing/ + packages/kilo-memory/ + packages/kilo-sandbox/. Docs route from the IA tree packages/kilo-docs/pages/ plus docs/jetbrains-vscode-settings-parity.md: each surface lists the pages sections that document it, and the per-platform pages under packages/kilo-docs/pages/code-with-ai/platforms/ map to the matching extension surface (the vscode/ directory to vscode, jetbrains.md to jetbrains). A doc path belongs to the surface with the longest matching prefix; a path that matches none of those prefixes falls to `other` (the explicit other prefixes are listed under other.docs). The cloud surfaces are derived the same way from the Kilo-Org/cloud layout: cloud-mobile = apps/mobile/, cloud-web = apps/web/, cloud-extension = apps/extension/, and cloud-agent = the cloud-agent packages under packages/ (packages/cloud-agent-sdk/ + packages/cloud-agent-profile/). A cloud source names its repository while a bare string still means this repository. The pages under packages/kilo-docs/pages/collaborate/ document the cloud web app (app.kilo.ai: teams dashboard, billing, SSO, adoption dashboard), so they route to cloud-web. No page under packages/kilo-docs/pages/ documents the browser side-panel extension yet, so cloud-extension lists no docs prefix.
- Map: `.github/docs-sync/surfaces.json`
- Surface map: `cli`, `vscode`, `jetbrains`, `gateway`, `web`, `cloud-mobile`, `cloud-web`, `cloud-extension`, `cloud-agent`, `other`
- Source prefixes: `apps/mobile/` (Kilo-Org/cloud)
- Doc prefixes: `packages/kilo-docs/pages/code-with-ai/platforms/mobile.md`
- Paths that fall to `other`: `packages/kilo-docs/pages/community/`, `packages/kilo-docs/pages/kiloclaw/`, `packages/kilo-docs/pages/contributing/`, `packages/kilo-docs/LEARNINGS.md`, `docs/`
- Reviewers are ranked from `Kilo-Org/cloud`; the workflow needs a token with `contents: read` on that repository (repository secret `CROSS_REPO_ACCESS_TOKEN`, exposed to the upsert step as `CLOUD_REPO_TOKEN`).
- How the two were computed: Reviewers for `cloud-mobile` are ranked from `Kilo-Org/cloud` git history over `apps/mobile/` (a commit 180 days old counts half as much, half-life 180 days). Bots (author type "Bot" or a login matching /\[bot\]$/i) and people without admin, write, or maintain permission are excluded.

### Changes

<!-- docs-sync:changes:start -->
| Docs change | Source |
| --- | --- |
| updated pages/code-with-ai/platforms/mobile.md | [Kilo-Org/cloud#6386](Kilo-Org/cloud#6386) |
| updated pages/ai-providers/openai-chatgpt-plus-pro.md | [Kilo-Org/cloud#6702](Kilo-Org/cloud#6702) |
| updated pages/code-with-ai/platforms/cloud-agent.md | [Kilo-Org/cloud#6683](Kilo-Org/cloud#6683) |
| updated pages/getting-started/byok.md | [Kilo-Org/cloud#6692](Kilo-Org/cloud#6692) |
<!-- docs-sync:changes:end -->

### Pending — will retry

<!-- docs-sync:pending:start -->
_None._
<!-- docs-sync:pending:end -->

### Considered, no docs change needed

<!-- docs-sync:skipped:start -->
| PR | Reason |
| --- | --- |
| [Kilo-Org/cloud#6658](Kilo-Org/cloud#6658) | Internal sandbox lifecycle fix with no user-visible workflow or setting. |
| [Kilo-Org/cloud#6673](Kilo-Org/cloud#6673) | Internal container CA trust plumbing, no user-facing behavior. |
| [Kilo-Org/cloud#6672](Kilo-Org/cloud#6672) | Internal sandbox launch/recovery fix with no documented workflow change. |
| [Kilo-Org/cloud#6660](Kilo-Org/cloud#6660) | Internal cloud-agent queue delivery fix; no new command, setting, or workflow for users. |
| [Kilo-Org/cloud#6226](Kilo-Org/cloud#6226) | Internal gateway alias-routing change, not user-visible. |
| [#14490](#14490) | Tool-call animation and streaming UI polish; users do not need to learn a new workflow. |
| [#14530](#14530) | Bug fix restoring intended worktree-pool behavior, no doc change needed. |
| [#14529](#14529) | Bug fix restoring tab/panel state across project switches. |
| [#14531](#14531) | Reconnect recovery bug fix, restores already-documented behavior. |
| [#14532](#14532) | Bug fix keeping session tab title in sync on rename. |
| [Kilo-Org/cloud#6088](Kilo-Org/cloud#6088) | Removes internal/admin model-experiment surfaces, not public product docs. |
| [Kilo-Org/cloud#6682](Kilo-Org/cloud#6682) | Internal control-socket reconnect race fix, no user-facing change. |
| [#14534](#14534) | Transcript re-render performance bug fix. |
| [#14535](#14535) | Bug fix preserving the loaded browser page across context switches. |
| [Kilo-Org/cloud#6684](Kilo-Org/cloud#6684) | Reverted by Kilo-Org/cloud#6685. |
| [Kilo-Org/cloud#6678](Kilo-Org/cloud#6678) | Dead-code constant removal, no user-visible effect. |
| [Kilo-Org/cloud#6687](Kilo-Org/cloud#6687) | Removes internal model-experiment maintenance and retains tables, no user-facing change. |
| [#14515](#14515) | JetBrains plugin unload crash fix, no documented behavior change. |
| [#14520](#14520) | JetBrains transcript/list rendering performance work. |
| [Kilo-Org/cloud#6614](Kilo-Org/cloud#6614) | Mobile PR Review header and session title bug fix, no doc change needed. |
| [Kilo-Org/cloud#6625](Kilo-Org/cloud#6625) | Internal mobile secure-store error-handling refactor. |
| [Kilo-Org/cloud#6624](Kilo-Org/cloud#6624) | Mobile auth bug fix that stops a retry loop; restores expected sign-in behavior with no new setting or workflow. |
| [#14310](#14310) | Contributor/CI fix making the kilo-v2 checkout installable; not user-visible product behavior. |
| [Kilo-Org/cloud#6611](Kilo-Org/cloud#6611) | Mobile notification-tap fix that selects the session's organization; restores correct behavior rather than adding a learnable feature. |
| [Kilo-Org/cloud#6644](Kilo-Org/cloud#6644) | Mobile sign-in layout/alignment polish; no change to what a user must do. |
| [Kilo-Org/cloud#6601](Kilo-Org/cloud#6601) | Mobile layout fix keeping empty states clear of the tab bar; purely visual. |
| [#14543](#14543) | CI/release infrastructure adding Windows binary code signing; no public docs impact. |
| [Kilo-Org/cloud#6616](Kilo-Org/cloud#6616) | Mobile visual defect fixes and a session-title fallback; no new user workflow or setting. |
| [Kilo-Org/cloud#6630](Kilo-Org/cloud#6630) | Reports an edge-case partial worktree restore; failure-path plumbing with no new user-facing workflow, target setting, or config. |
| [Kilo-Org/cloud#6699](Kilo-Org/cloud#6699) | Cloud Agent e2e stabilization plus internal idle-sandbox capacity handling; not user-visible. |
| [#14545](#14545) | Automated JetBrains release/changelog PR; underlying user-facing changes are triaged from their own PRs. |
| [Kilo-Org/cloud#6708](Kilo-Org/cloud#6708) | Internal AI-gateway request-logging policy change in the admin panel; no existing public docs surface and no change to how users run Kilo Code. |
| [#14533](#14533) | Documentation already shipped with the merged PR. The experimental.task_model_selection flag is gone from the current source, and pages/code-with-ai/agents/model-selection.md, pages/code-with-ai/agents/context-mentions.md, and pages/getting-started/settings/index.md already describe per-task selection as default-on with no stale experiment references. |
| [#14510](#14510) | Documentation already shipped with the merged PR. Marketplace companion-skill support is present in the current source (packages/opencode/src/kilocode/marketplace/companions.ts and installer), and pages/customize/marketplace.md already documents installing, publishing, and removing MCP servers with companion skills. |
<!-- docs-sync:skipped:end -->

---

(bot) Generated by the docs-sync workflow. Humans review and merge; while this PR stays open, the next daily run appends new changes here. Branch: `docs/auto-sync-2026-09-25`.
<!-- docs-sync: processed-through 2026-09-25T07:05:29.302Z -->
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