Conversation
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryIncremental pass over the four PR files that changed since the previous review: the header-title path now passes Files Reviewed (4 files changed since the previous review)
The remaining nine PR files are byte-identical to the previous reviewed revision ( 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 SummaryThe 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 Files Reviewed (13 files)
Previous review (commit ea7c4f5)Status: No Issues Found | Recommendation: Merge Executive SummaryThe rebased revision is clean: the previously reported duplicate Files Reviewed (101 files)
Previous review (commit e8e2378)Status: 1 Issue Found | Recommendation: Address before merge Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (104 files)
Fix these issues in Kilo Cloud Previous review (commit f95a35e)Status: 1 Issue Found | Recommendation: Address before merge Executive SummaryMobile session-title and PR-review changes are behaviorally sound: the placeholder-title helper matches web's Overview
Issue Details (click to expand)SUGGESTION
Files Reviewed (105 files)
Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0 Review guidance: REVIEW.md from base branch |
02b8e04 to
e8e2378
Compare
cea178a to
ea7c4f5
Compare
|
kilo-review — independent audit of the published diff. Status: 1 Issues
|
|
bot: Accepted. Pushed e69ad7d (kwf What changed:
|
4b235b2 to
9efb197
Compare
|
This description names a scenario the proof did not capture:
A repeated proof run rebuilds the same evidence, so no proof run is dispatched for a named gap. Merging with this gap open is your decision. |
9efb197 to
741d3b1
Compare
…letter-spaced-al-3582e-c290
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.
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.
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)
…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.
…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 -->
Changelog for users
New session - <timestamp>now shows a readable name in the list, the header, the spoken label, and the rename prompt.Changelog for maintainers
eyebrowprop is gone andprReview.entry.eyebrowis removed from every catalog; the title and the field caption/placeholder remain.default · not loadedis 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.sessionDisplayTitlehelper treats the exactNew session - <ISO instant>andChild 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.isDefaultSessionTitlethrough a new@kilocode/session-ingest-contractsmobile dependency, so mobile and web agree on what the placeholder is; real titles likeNew session - implementation planpass through.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 asession.updated.E2E proof
[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…
[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…
[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"…
[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…
[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…
[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…
E2E proof — log excerpts
/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/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/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/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/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/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/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/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/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/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/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/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/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.txtOwner request
[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.
[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.
[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.
[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…
[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…
[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…Follow-ups (not changed here)
Open findings (not fixed here)