Skip to content

fix(mobile): correct session title, discussion empty state, and narrow consent layouts - #6514

Merged
iscekic merged 3 commits into
mainfrom
kwf/explorer-10-visual-defects-on-android-the-primary-button-ce5027-78b8
Sep 23, 2026
Merged

iscekic merged 3 commits into
mainfrom
kwf/explorer-10-visual-defects-on-android-the-primary-button-ce5027-78b8

Conversation

@iscekic

@iscekic iscekic commented Sep 22, 2026 •

Copy link
Copy Markdown
Collaborator

Changelog for users

  • Long session titles now render in full across the header's two title lines, breaking at word boundaries instead of clipping mid-word.
  • A freshly created session shows the short "Session" label instead of its internal New session - <timestamp> placeholder.
  • A discussion whose comments are all hidden by blocked or muted authors shows the "No discussion yet" empty state instead of a blank body.
  • The device sign-in consent card stacks its identity block on narrow screens, keeping the account name, email, and Sign out inside the card.
  • Rename fields accept titles up to 200 characters, matching the server, so a long title is no longer silently cut to 50.

Changelog for maintainers

  • displaySessionTitle (shared through the SDK's isDefaultSessionTitle) treats blank and ISO-placeholder titles as untitled; SESSION_TITLE_MAX_LENGTH (200) mirrors the server rename cap.
  • The session header uses the two title lines reserveTitleSpace already holds; the previous one-line clamp is removed.
  • PrReviewDiscussionList takes an optional emptyState and renders it when the blocked/muted filter empties the loaded page; the load-more and retry footer stay mounted.
  • The discussion tab hands the list the same EmptyState it renders for an empty discussion; the copy stays on one surface.
  • The device-auth identity row stacks below sm and Sign out self-aligns; check the app-mode card at phone width.
  • Sign-out confirmation moved into useDestructiveConfirm (iOS native alert, Android in-app dialog); profile behavior is unchanged.
  • Navigation literals now cast to expo-router's typed Href, and the case-guard allowlist drops a duplicate passkey entry; both are type- and test-only.
  • Review hint: the risky area is placeholder normalization and the 200-character cap matching the server's rename schema.

E2E proof

Owner request

Explorer finding: 10 visual defects on android: The primary 'بدء الجلسة' button is clipp; The prompt field renders overlapping, su; The session title in the header wraps mi (+7 more)

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

Evidence (from the device runs):

--- Finding 1 of 10: new-task-kb-up-rtl-arabic: The primary 'بدء الجلسة' button is clipped by the keyboard toolbar drawn across its lower half.
Flow: new-task-kb-up-rtl-arabic
Found on revision: f2181ae
Repro:

  1. set this state first: session question; credits 24; uimode day; battery 90 charging; reviews 3; relaunch; the device in light mode
  2. open the app on emulator-5602
  3. reach new-task-kb-up-rtl-arabic
  4. the capture shows the defect named below
    Observed: The primary 'بدء الجلسة' button is clipped by the keyboard toolbar drawn across its lower half.
    Expected: the screen renders without this defect

--- Finding 2 of 10: new-task-ready: The prompt field renders overlapping, superimposed copies of the task text instead of one clean paragraph, so lines are drawn over each other and are unreadable.
Flow: new-task-ready
Found on revision: 59ef790
Repro:

  1. open the app on emulator-5602
  2. reach the screen the capture names (new-task-ready)
  3. the capture shows the defect named below
    Observed: The prompt field renders overlapping, superimposed copies of the task text instead of one clean paragraph, so lines are drawn over each other and are unreadable.
    Expected: the screen renders without this defect

--- Finding 3 of 10: new-task-started: The session title in the header wraps mid-word and truncates to "Moving-ave / rage empt…".
Flow: new-task-started
Found on revision: fd04ca1
Repro:

  1. set this state first: account e2e-mobile-cloud-android@example.com, $10 credits, 3 Code Reviewer pull requests, one top-level busy session (ses_f488ff9c9ffefhXjlZMDy7Ix8y), display 720x1600, day mode, font 1.0, portrait, event-service down.
  2. open the app on emulator-5554
  3. reach the screen the capture names (new-task-started)
  4. the capture shows the defect named below
    Observed: The session title in the header wraps mid-word and truncates to "Moving-ave / rage empt…".
    Expected: the screen renders without this defect

--- Finding 4 of 10: new-task: The primary "Start session" button at the bottom of the New session screen is cut off by the bottom bar — only the top of the green button and half of its label are visible, so the main action cannot be fully seen or comfortably tapped.
Flow: new-task
Found on revision: fb5e67d
Repro:

  1. set this state first: size 720x1280; credits 25; reviews 5; org; uimode night; battery 20 discharging; rotate portrait; relaunch; deeplink kiloapp://home; size reset; the device in dark mode
  2. open the app on emulator-5554
  3. reach new-task
  4. the capture shows the defect named below
    Observed: The primary "Start session" button at the bottom of the New session screen is cut off by the bottom bar — only the top of the green button and half of its label are visible, so the main action cannot be fully seen or comfortably tapped.
    Expected: the screen renders without this defect

--- Finding 5 of 10: new-task-typed: The task input wraps mid-word, leaving "Keep t" ending one line and "he change…" starting the next with the caret stranded inside the broken word.
Flow: new-task-typed
Found on revision: fd04ca1
Repro:

  1. set this state first: the setup failed: -code t=1789796890 login.sh: phase=app-settle t=1789796932 login.sh: verify-code failed and the app is not signed in as e2e-empty-1789796648@example.com login.sh: failed with exit 1 (phase=app-settle)
  2. open the app on emulator-5554
  3. reach the screen the capture names (new-task-typed)
  4. the capture shows the defect named below
    Observed: The task input wraps mid-word, leaving "Keep t" ending one line and "he change…" starting the next with the caret stranded inside the broken word.
    Expected: the screen renders without this defect

--- Finding 6 of 10: oauth-consent-small: At narrow width the consent card's identity row wraps and the account name/email disappears while 'Signed in as' and 'Sign out' jam against the avatar, and the permission list is crushed into a thin column, so the content no longer fits its card.
Flow: oauth-consent-small
Found on revision: f2181ae
Repro:

  1. set this state first: resume; uimode night; relaunch; rotate landscape; rotate portrait; deeplink kiloapp://home; size 460x1000; size reset; the device in dark mode
  2. open the app on emulator-5554
  3. reach oauth-consent-small
  4. the capture shows the defect named below
    Observed: At narrow width the consent card's identity row wraps and the account name/email disappears while 'Signed in as' and 'Sign out' jam against the avatar, and the permission list is crushed into a thin column, so the content no longer fits its card.
    Expected: the screen renders without this defect

--- Finding 7 of 10: pr-detail: The header repo label wraps onto two lines ("KILO-ORG /" then "CLOUD") here while every other PR screen shows it on one line.
Flow: pr-detail
Found on revision: 59ef790
Repro:

  1. set this state first: account e2e-mobile-cloud-android@example.com with $25 credits, a second organization, 4 Code Reviewer pull requests, app UI in Arabic (persisted from a prior run), system day mode, display density 560, portrait, dev build.
  2. open the app on emulator-5602
  3. reach the screen the capture names (pr-detail)
  4. the capture shows the defect named below
    Observed: The header repo label wraps onto two lines ("KILO-ORG /" then "CLOUD") here while every other PR screen shows it on one line.
    Expected: the screen renders without this defect

--- Finding 8 of 10: pr-detail: The primary "Submit review" button in the header is clipped by the right screen edge, cutting off its label.
Flow: pr-detail
Found on revision: 25e16c1
Repro:

  1. set this state first: account e2e-mobile-cloud-android@example.com signed in, $10 credits, 5 Code Reviewer pull requests, a second organization to switch to, font scale 2, battery 55% discharging, device portrait.
  2. open the app on emulator-5554
  3. reach the screen the capture names (pr-detail)
  4. the capture shows the defect named below
    Observed: The primary "Submit review" button in the header is clipped by the right screen edge, cutting off its label.
    Expected: the screen renders without this defect

--- Finding 9 of 10: pr-discussion: The Discussion tab shows a large blank content region with no loading indicator and no empty-state message even though the tab is labelled 5, leaving only the pinned Comment button.
Flow: pr-discussion
Found on revision: 59ef790
Repro:

  1. set this state first: account e2e-mobile-cloud-android@example.com signed in, $10 credits, 6 Code Reviewer pull requests, a second organization to switch to, day mode, display density 320, battery 90% charging, portrait, app cold-started via the Expo dev launcher.; the device in light mode
  2. open the app on emulator-5554
  3. reach the screen the capture names (pr-discussion)
  4. the capture shows the defect named below
    Observed: The Discussion tab shows a large blank content region with no loading indicator and no empty-state message even though the tab is labelled 5, leaving only the pinned Comment button.
    Expected: the screen renders without this defect

--- Finding 10 of 10: pr-empty: The primary "Submit review" button in the header is clipped by the right screen edge, cutting off its label.
Flow: pr-empty
Found on revision: 25e16c1
Repro:

  1. set this state first: account e2e-mobile-cloud-android@example.com signed in, $10 credits, 5 Code Reviewer pull requests, a second organization to switch to, font scale 2, battery 55% discharging, device portrait.
  2. open the app on emulator-5554
  3. reach the screen the capture names (pr-empty)
  4. the capture shows the defect named below
    Observed: The primary "Submit review" button in the header is clipped by the right screen edge, cutting off its label.
    Expected: the screen renders without this defect

Production record (automatic, 2026-09-21):

Production record for ses_f488ff9c9ffefhXjlZMDy7Ix8y

Axiom, last 72 h

No line carries this term in: vercel, cloudflare-logpush, supabase-production.

The session row, read replica

No row in cli_sessions_v2 carries ses_f488ff9c9ffefhXjlZMDy7Ix8y.

Log archives, R2 kilocode-sessions

NOT READ: R2 keys are indexed by the agent id, not the session id; take the agent_* from the worker logs above and query that.

Sentry, last 72h

No Sentry issue carries this term.

[e1] Explorer finding: 10 visual defects on android: The primary 'بدء الجلسة' button is clipp; The prompt field renders overlapping, su; The session title in the header wraps mi (+7 more) — android emulator-5554: the shipped 2-step replay MISSed from Home (scripted-e1.log), so the parked steps were edited to navigate and re-run — 'SCENE e1 OK' in e1-live-scene.log, and the same-run digest e1-detail.log shows the header label 'android.widget.TextView KILO-ORG/CLOUD tappable [111,88][577,125]' on one line with 'android.widget.Button Submit review tappable [728,95][1043,189]' and its label 'android.widget.TextView Submit review tappable [806,119][1016,165]' inside the 1080x2400 screen (findings 7/8/10 clean at default font/zoom; visual capture e1-detail.png); also proved on this…

[e1] Explorer finding: 10 visual defects on android: The primary 'بدء الجلسة' button is clipp; The prompt field renders overlapping, su; The session title in the header wraps mi (+7 more) — e2e-mobile-app/e1-detail.png

[e1] Explorer finding: 10 visual defects on android: The primary 'بدء الجلسة' button is clipp; The prompt field renders overlapping, su; The session title in the header wraps mi (+7 more)

[e1] Explorer finding: 10 visual defects on android: The primary 'بدء الجلسة' button is clipp; The prompt field renders overlapping, su; The session title in the header wraps mi (+7 more) — e2e-mobile-app/e1-detail.png

Open findings (not fixed here)

  • e1: Explorer finding: 10 visual defects on android: The primary 'بدء الجلسة' button is clipp; The prompt field renders overlapping, su; The session title in the header wraps mi (+7 more)
  • apps/mobile/src/app/(app)/(tabs)/_layout.tsx
  • apps/mobile/src/app/(app)/agent-chat/[session-id].mounted.test.tsx
  • apps/mobile/src/app/(app)/agent-chat/[session-id].tsx
  • apps/mobile/src/app/(app)/index.tsx
  • [e1] Explorer finding: 10 visual defects on android: The primary 'بدء الجلسة' button is clipp; The prompt field renders overlapping, su; The session title in the header wraps mi (+7 more)
  • [e1] Explorer finding: 10 visual defects on android: The primary 'بدء الجلسة' button is clipp; The prompt field renders overlapping, su; The session title in the header wraps mi (+7 more): proof audit: the capture does not show the claim (e1-finding3-session.png, e1-signout-confirm-android.png): Hea
  • not fully verified: some optional checks did not run

@iscekic
iscekic marked this pull request as draft September 22, 2026 00:28
Comment thread packages/cloud-agent-sdk/src/index.ts
@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

This commit reworks mobile session-title/rename display, the PR discussion filtered-empty state, the narrow device-auth consent layout, Expo Router Href typing, and the SDK runtime re-export. No new defects were found in the changed lines, and the previous WARNING (SDK runtime re-export backed by a devDependency) is resolved: @kilocode/session-ingest-contracts moved to dependencies in packages/cloud-agent-sdk/package.json, the lockfile importer moved with it, and packages/cloud-agent-sdk/src/index-runtime-deps.test.ts now guards the invariant.

Files Reviewed (24 files)
  • apps/mobile/src/app/(app)/agent-chat/[session-id].mounted.test.tsx
  • apps/mobile/src/app/(app)/agent-chat/[session-id].tsx
  • apps/mobile/src/app/(app)/index.tsx
  • apps/mobile/src/app/_layout.tsx
  • apps/mobile/src/components/agents/exit-remote-session-with-feedback.ts
  • apps/mobile/src/components/agents/remote-session-row.tsx
  • 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-queue.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.ts
  • apps/mobile/src/components/agents/session-row.tsx
  • apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.mounted.test.tsx
  • apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.tsx
  • apps/mobile/src/components/pr-review/pr-review-discussion-tab.test.tsx
  • apps/mobile/src/components/pr-review/pr-review-discussion-tab.tsx
  • apps/mobile/src/components/screen-header.mounted.test.tsx
  • apps/mobile/src/components/ui/segmented-control.tsx
  • apps/web/src/app/device-auth/DeviceAuthClient.tsx
  • apps/web/src/app/device-auth/device-auth-identity-row.test.ts
  • packages/cloud-agent-sdk/package.json
  • packages/cloud-agent-sdk/src/index-runtime-deps.test.ts
  • packages/cloud-agent-sdk/src/index.ts
  • pnpm-lock.yaml

Verified in the changed lines: displaySessionTitle delegates to sessionDisplayTitle, which trims and drops only strict New session - <ISO> / Child session - <ISO> placeholders via the anchored DEFAULT_SESSION_TITLE_PATTERN; SESSION_TITLE_MAX_LENGTH = 200 matches the server RenameSessionInputSchema (z.string().trim().min(1).max(200) at apps/web/src/routers/cli-sessions-v2-router.ts:687) and is applied to all three session rename modals; the PrReviewDiscussionList filtered-empty early return sits after every hook, keeps the load-more / retry footer mounted, and the tab now owns one emptyState node for both surfaces; every new as Href cast has Href in scope; the device-auth identity row stacks below sm and self-aligns Sign out. No new listeners, subscriptions, effects, or timers were added, so no memory-leak surface is introduced.

Previous Review Summary (commit 8ef6ed1)

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

Previous review (commit 8ef6ed1)

Status: 1 Issue Found | Recommendation: Address before merge

Overview

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

WARNING

File Line Issue
packages/cloud-agent-sdk/src/index.ts 203 Runtime re-export of isDefaultSessionTitle from @kilocode/session-ingest-contracts, which is only a devDependency of the SDK package
Files Reviewed (28 files)
  • apps/mobile/src/app/(app)/(tabs)/_layout.tsx
  • apps/mobile/src/app/(app)/agent-chat/[session-id].mounted.test.tsx
  • apps/mobile/src/app/(app)/agent-chat/[session-id].tsx
  • apps/mobile/src/app/(app)/index.tsx
  • apps/mobile/src/app/_layout.tsx
  • apps/mobile/src/components/agents/exit-remote-session-with-feedback.ts
  • apps/mobile/src/components/agents/new-session-configure-form.test.ts
  • apps/mobile/src/components/agents/remote-session-row.tsx
  • 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-queue.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.test.ts
  • apps/mobile/src/components/agents/session-detail-rename-state.ts
  • apps/mobile/src/components/agents/session-list-header-actions.mounted.test.tsx
  • apps/mobile/src/components/agents/session-list-header-actions.tsx
  • apps/mobile/src/components/agents/session-row.tsx
  • apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.mounted.test.tsx
  • apps/mobile/src/components/pr-review/discussion/pr-review-discussion-list.tsx
  • apps/mobile/src/components/pr-review/pr-review-discussion-tab.test.tsx
  • apps/mobile/src/components/pr-review/pr-review-discussion-tab.tsx
  • apps/mobile/src/components/profile-screen.signout.mounted.test.tsx
  • apps/mobile/src/components/profile-screen.tsx
  • apps/mobile/src/components/screen-header.mounted.test.tsx
  • apps/mobile/src/components/use-destructive-confirm.tsx
  • apps/mobile/src/lib/case-guard.test.ts
  • apps/web/src/app/device-auth/DeviceAuthClient.tsx
  • apps/web/src/app/device-auth/device-auth-identity-row.test.ts
  • packages/cloud-agent-sdk/src/index.ts - 1 issue

Verified and correct in the changed lines: displaySessionTitle normalizes only strict New session - <ISO> / Child session - <ISO> placeholders (DEFAULT_SESSION_TITLE_PATTERN is anchored, so real titles are untouched); SESSION_TITLE_MAX_LENGTH = 200 matches RenameSessionInputSchema (z.string().trim().min(1).max(200)); the PrReviewDiscussionList filtered-empty early return sits after every hook and keeps the load-more / retry footer; removing titleNumberOfLines={1} yields ScreenHeader's documented 2-line default that reserveTitleSpace already reserves; useDestructiveConfirm preserves the iOS native alert and Android in-app dialog paths; the dropped case-guard allowlist entry is now redundant because lib/auth/passkey-client.ts has no bare case call; all new Href casts have Href in scope. No new listeners, subscriptions, or effects were added, so no memory-leak surface is introduced.

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 added a commit that referenced this pull request Sep 22, 2026
@iscekic
iscekic force-pushed the kwf/explorer-10-visual-defects-on-android-the-primary-button-ce5027-78b8 branch from 536373d to eed7910 Compare September 22, 2026 04:36
@iscekic
iscekic force-pushed the kwf/explorer-10-visual-defects-on-android-the-primary-button-ce5027-78b8 branch from 47cc5d6 to 0720610 Compare September 23, 2026 05:54
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 06:26
@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: new-task-kb-up-rtl-arabic.png is no longer on the host that took it, so no publish can carry 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 removed the human-ready The PR is ready for human review. label Sep 23, 2026
@iscekic
iscekic marked this pull request as draft September 23, 2026 07:20
@iscekic
iscekic marked this pull request as ready for review September 23, 2026 07:31
@iscekic iscekic added the human-ready The PR is ready for human review. label Sep 23, 2026
@iscekic
iscekic merged commit 16e5e64 into main Sep 23, 2026
30 checks passed
@iscekic
iscekic deleted the kwf/explorer-10-visual-defects-on-android-the-primary-button-ce5027-78b8 branch September 23, 2026 12:36
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