Skip to content

feat(mobile): collapse the session goal and move connection status into the context sheet - #6265

Merged
iscekic merged 2 commits into
mainfrom
kwf/two-improvements-to-the-session-page-when-4757
Sep 18, 2026
Merged

iscekic merged 2 commits into
mainfrom
kwf/two-improvements-to-the-session-page-when-4757

Conversation

@iscekic

@iscekic iscekic commented Sep 17, 2026 •

Copy link
Copy Markdown
Collaborator

Changelog for users

  • The goal block now sits closer to the session header, and the header's own spacing is unchanged.
  • A chevron on the right of the goal block collapses it to the goal icon and status, and expands it back.
  • The chevron points down while expanded and up while collapsed, and rotates between the two states.
  • The collapsed or expanded goal state is kept when the session is left and reopened.
  • The connection row with the WiFi icon no longer appears under the session header.
  • The context details sheet always shows the connection status: Connected, Connecting…, Reconnecting…, or Connection lost with a Retry action.
  • Retry returns the connection row to Connected when the connection recovers.
  • The goal block animates its height instead of snapping, and the composer stays on screen in both states.

Changelog for maintainers

  • The page-level connection indicator is deleted; the context details sheet is now the only surface showing the connection status, and it renders that row in every state.
  • resolveSessionConnectionDisplay maps the transport, the app-wide user-web leg, reconnect exhaustion, and an ever-connected latch to connected/connecting/reconnecting/lost; the app-wide leg is consulted only for a none transport.
  • The sheet takes connectionDisplay and onRetryConnection: Retry re-runs the metadata refresh when the transcript is cached, and otherwise retries the socket.
  • Goal disclosure state is a module-scope, session-keyed in-memory store; absence means expanded, so it survives leaving and reopening a session but not an app restart.
  • DisclosureChevron and DisclosureLayout are extracted from the security-agent collapsible section: 180° collapsed, 0° expanded, 200 ms, and instant under reduced motion.
  • The goal row's top padding drops from py-2 to pt-0.5 pb-2, the action pressable stretches across the row, and the chevron stays its sibling because a nested pressable disappears from assistive technology.
  • SESSION_HEADER_HEIGHT stays 92, so the composer height cap is unchanged after the indicator row is removed; review the connection-display wiring and retry routing first, then the goal row's layout and accessibility.
  • Every locale catalog gains sessionConnection.label, goal.collapse, and goal.expand; Connected reuses the existing common.connected.

E2E proof

empty state, run last because it clears the goal: tapping the goal row still opens the goal action sheet (the new carat did not steal the row's action), removing the goal leaves no row, no disclosure… — e3.png

goal disclosure, expanded -> collapsed -> expanded: seed an active goal by sending '/goal Ship the release notes' from the composer (needs:seed; the command needs a session whose catalog advertises… — e1.png

[e3] ux-check: Chevron affordance: expanded the chevron points down and collapsed it points up; the transition rotates rather than swapping icons, and under system Reduce Motion the toggle is instant with… — (android emulator-5606) The scripted replay returned 'SCENE e3 OK' covering collapse, leave, re-enter and expand-back, its final digest showing the re-expanded row 'android.widget.Button Collapse goal tappable [988,310][1043,365]' (e3-live-scene.log), and the state moves are corroborated by the digests: after collapsing, 'android.widget.Button Active goal tappable [37,310][970,394]' with 'android.widget.Button Expand goal tappable [988,310][1043,365]' and the composer still at 'android.widget.Button Send message [926,2187][1052,2313]' (e3-collapse-live.log), the collapsed state persisted…

ux-check: Chevron affordance: expanded the chevron points down and collapsed it points up; the transition rotates rather than swapping icons, and under system Reduce Motion the toggle is instant with… — e3-collapse.png

ux-check: Collapsed tap target: tapping anywhere within the visible collapsed row above or below the status line (outside the chevron) opens the goal actions sheet; only the chevron toggles the… — e9-expanded-again.png

ux-check: No jank: toggling collapse/expand animates the block's height instead of snapping, the transcript does not jump or blank, and the composer stays fully on screen. — e7-expanded.png

[e4] ux-check: Expanded goal block sits closer to the session header, header spacing unchanged, icon/status/objective/reason legible — android emulator-5554, live remote-CLI session with an active goal: e4-scene.log shows the expanded block ('android.widget.Button Active goal. Goal: Ship the release notes tappable [37,365][970,450]', 'android.widget.TextView Active goal tappable [92,365][970,402]', 'android.widget.TextView Ship the release notes tappable [92,402][970,448]', chevron 'android.widget.Button Collapse goal tappable [988,365][1043,420]') while the header is identical to the pre-goal digest in after-remote-digest.log ('android.widget.Button Go back tappable [0,163][101,264]', 'android.widget.Button Rename session…

[e4] ux-check: Expanded goal block sits closer to the session header, header spacing unchanged, icon/status/objective/reason legible — prior/e4.png

[e1] ux-check: Expanded goal block sits closer to the session header, header spacing unchanged, icon/status/objective legible — Live scene digest out/e1-live2.log (SCENE goalexpanded2 OK, android) shows the expanded goal block: android.widget.Button Active goal. Goal: Ship the release notes tappable [37,310][970,394], android.widget.TextView Ship the release notes tappable [92,347][970,393], android.widget.Button Collapse goal tappable [988,310][1043,365], with the header carrying only android.widget.Button Context 17,867 of 1,310,720 tokens, 1% used, cost 0.11 cents. Tap to view context details. tappable [741,156][1043,271] and no connection row; the amendment's sheet state is proven in out/ctxsid.log by…

[e1] ux-check: Expanded goal block sits closer to the session header, header spacing unchanged, icon/status/objective legible — e2e-mobile-app/goalexpanded2.png

[e1] ux-check: Expanded goal block sits closer to the header, header spacing unchanged, icon/status/objective legible — out/e1-run2.log prints "SCENE e1 OK" with the header unchanged at "android.widget.Button Rename session: Greeting tappable [111,149][714,278]" and the goal row directly beneath it at "android.widget.Button Active goal. Goal: Ship the release notes tappable [37,310][970,394]" with the carat "android.widget.Button Collapse goal tappable [988,310][1043,365]", against the same session's earlier digest out/e6-goal-set-scene.log (2026-09-16 23:39) where those identical header bounds carried the goal at "android.widget.Button Active goal. Goal: Ship the release notes tappable [37,365][970,450]"; the…

[e1] ux-check: Expanded goal block sits closer to the header, header spacing unchanged, icon/status/objective legible — prior/goalheader.png

[e1] ux-check: Expanded goal block sits closer to the header, header spacing unchanged, icon/status/objective legible

[e1] ux-check: Expanded goal block sits closer to the header, header spacing unchanged, icon/status/objective legible — prior/goalexpand.png

[e3] ux-check: Chevron affordance: expanded the chevron points down and collapsed it points up; the transition rotates rather than swapping icons, and under system Reduce Motion the toggle is instant with…

[e3] ux-check: Chevron affordance: expanded the chevron points down and collapsed it points up; the transition rotates rather than swapping icons, and under system Reduce Motion the toggle is instant with… — prior/connsheet.png

E2E proof — log excerpts

[e1] ux-check: Expanded goal block sits closer to the session header, header spa -> pass :: Live scene digest out/e1-live2.log (SCENE goalexpanded2 OK, android) shows the expanded goal block: `android.widget.Button Active goal. Goal: Ship the release notes tappable [37,310][970,394]`, `android.widget.TextView Ship the release notes tappable [92,347][970,393]`, `android.widget.Button Collapse goal tappable [988,310][1043,365]`, with the header carrying only `android.widget.Button Context 17,867 of 1,310,720 tokens, 1% used, cost 0.11 cents. Tap to view context details. tappable [741,156][1043,271]` and no connection row; the amendment's sheet state is proven in out/ctxsid.log by `android.widget.TextView CONNECTION tappable [55,502][237,539]` beside `android.widget.TextView Connected
/home/igor_kilocode_ai/.local/share/kwf/sections/two-improvements-to-the-session-page-when-4757/e2e-mobile-app/e1-live2.log
android.widget.Button Collapse goal tappable [988,310][1043,365]
android.view.ViewGroup Continue working toward this session goal:, Ship the release notes, Use the existing conversation and take the next useful step. Proceed autonomously with safe, reversible decis
android.widget.TextView Use the existing conversation and take the next useful step. Proceed autonomously with safe, reversible decisions instead of asking clarification questions. The question tool i
android.view.ViewGroup Assistant message tappable [0,1187][1080,1511]
android.widget.Button Thought tappable [40,1199][1042,1273]
android.widget.TextView THOUGHT tappable [68,1217][206,1254]
android.widget.Button Show git status and recent commits tool, running tappable [40,1296][1042,1385]
android.widget.TextView Show git status and recent commits tappable [138,1318][669,1364]
android.widget.Button Show branches and recent diff stat tool, running tappable [40,1409][1042,1498]
android.widget.TextView Show branches and recent diff stat tappable [138,1431][652,1477]
android.widget.TextView Permission required (1 of 2) tappable [76,1580][1004,1626]
android.widget.TextView The agent is waiting for permission. While this request is open, your message to the agent is paused. tappable [76,1635][1004,1709]
android.widget.TextView Allow Bash? tappable [76,1776][1004,1822]
android.widget.TextView Applies to: tappable [95,1868][986,1905]
android.widget.TextView • git status tappable [95,1914][986,1951]
android.widget.TextView • git log --oneline -15 tappable [95,1960][986,1997]
android.widget.TextView command: git status && git log --oneline -15 tappable [77,2044][1005,2081]
android.widget.TextView description: Show git status and recent commits tappable [77,2090][1005,2127]
/home/igor_kilocode_ai/.local/share/kwf/sections/two-improvements-to-the-session-page-when-4757/e2e-mobile-app/ctxsid.log
android.widget.TextView 1% tappable [503,884][577,958]
android.widget.TextView USED tappable [55,1018][1025,1055]
android.widget.TextView 17,803 of 1,310,720 tokens tappable [55,1064][1025,1120]
android.widget.TextView REMAINING tappable [55,1157][1025,1194]
android.widget.TextView 1,292,917 tokens (99%) tappable [55,1203][1025,1259]
android.widget.TextView MODEL tappable [55,1296][1025,1333]
android.widget.TextView DeepSeek V4 Flash 0731 tappable [55,1342][1025,1398]
android.widget.TextView PROVIDER tappable [55,1435][1025,1472]
android.widget.TextView Kilo tappable [55,1481][1025,1537]
android.widget.TextView SESSION tappable [55,1574][1025,1611]
android.widget.TextView Greeting tappable [55,1620][1025,1676]
android.widget.Button COPY SESSION ID, ses_f531af5d9ffeg4z4cftJlOadGF tappable [55,1713][1025,1796]
android.widget.TextView COPY SESSION ID tappable [55,1713][291,1750]
android.widget.TextView ses_f531af5d9ffeg4z4cftJlOadGF tappable [55,1759][1025,1796]
android.widget.TextView TOTAL COST tappable [55,1833][1025,1870]
android.widget.TextView $0.01 tappable [55,1879][1025,1935]
android.widget.TextView Usage reflects the latest completed assistant response. tappable [55,1971][1025,2008]
android.widget.TextView Token usage tappable [55,2083][1025,2129]
android.widget.TextView Input tappable [55,2166][131,2212]
android.widget.TextView 15,625 tappable [922,2166][1024,2212]
android.widget.TextView Output tappable [55,2240][155,2286]
android.widget.TextView 2 tappable [1005,2240][1024,2286]
android.widget.TextView Reasoning tappable [55,2313][211,2337]
android.widget.TextView 0 tappable [1005,2313][1024,2337]
/home/igor_kilocode_ai/.local/share/kwf/sections/two-improvements-to-the-session-page-when-4757/e2e-mobile-app/e1-goalset.log
android.widget.FrameLayout android:id/content tappable [0,0][1080,2400]
android.widget.Button Go back tappable [0,163][101,264]
android.widget.Button Rename session: Greeting tappable [111,149][714,278]
android.view.View Greeting tappable [111,180][714,245]
android.widget.Button Context 11,006 of 1,310,720 tokens, 1% used, cost 0.4 cents. Tap to view context details. tappable [741,156][1043,271]
android.widget.TextView 1% tappable [863,195][900,232]
android.widget.TextView $0.0040 tappable [909,195][1013,232]
android.widget.TextView 5:09 AM tappable [476,1537][604,1576]
android.view.ViewGroup say hello, User message tappable [0,1595][1080,1733]
android.widget.TextView say hello tappable [847,1632][1011,1695]
android.widget.Button Preparation complete tappable [40,1754][1042,1855]
android.widget.TextView Preparation complete tappable [188,1781][506,1827]
android.view.ViewGroup Hello!, Assistant message tappable [0,1876][1080,1968]
android.widget.TextView Hello! tappable [37,1890][1045,1953]
android.widget.Button Mode: Code tappable [28,2013][261,2087]
android.widget.TextView Code tappable [106,2026][183,2072]
android.widget.Button DeepSeek V4 Flash 0731 tappable [279,2013][753,2087]
android.widget.TextView DeepSeek V4 Flash 0731 tappable [307,2027][675,2073]
android.widget.Button Paste from clipboard tappable [979,2013][1052,2087]
android.widget.TextView Please upgrade your CLI to use this command. tappable [0,2109][1080,2146]
android.widget.Button Add attachment tappable [28,2214][101,2288]
android.widget.EditText /goal Ship the release notes tappable [126,2191][800,2311]
android.widget.Button Start voice input tappable [835,2205][926,2297]
android.widget.Button Send message tappable [926,2188][1052,2314]
/home/igor_kilocode_ai/.local/share/kwf/sections/two-improvements-to-the-session-page-when-4757/e2e-mobile-app/e1-cli-goal.log

> code · deepseek/deepseek-v4-flash-0731

⚙ board_read Shared agent board
! permission requested: bash (git status, git log --oneline -15); auto-rejecting
✗ git status && git log --oneline -15 failed
Error: The user rejected permission to use this specific tool call.
Error: run ended with an auto-rejected permission; pass --auto for autonomous use
Owner request

Surface: the mobile app (apps/mobile).

Improvements to the session page when a session has an ACTIVE goal, plus one
change to where the session's connection status is shown.

  1. The vertical space between the session header and the goal block is too
    large. Reduce the margin/padding between them so the goal sits closer to the
    header. Keep the header's own spacing, and keep the goal block readable.

  2. Add a disclosure control (an arrow / carat) on the right of the goal block.
    Tapping it collapses the goal to one subtle row that keeps the goal icon and
    the goal status; tapping it again expands the goal back to its full block.

  3. Remove the "reconnecting" indicator that sits under the session header with
    a WiFi icon. The connection status must not live as its own row under the
    header. Instead the context details sheet must ALWAYS show the connection
    status, so the user can read the connection state from there at any time.

Requirements:

  • The carat reads as an affordance: it points down when the goal is expanded
    and up when it is collapsed, and it rotates with the state.
  • The collapsed goal row is legible and quiet: the goal icon and the goal
    status, and nothing else.
  • The collapsed or expanded goal state survives leaving the session and
    reopening it.
  • The context details sheet always shows the connection status: "Connected"
    while the session's connection is up, "Connecting..." before it first comes
    up, "Reconnecting..." after a live connection drops and is retrying, and
    "Connection lost" with a Retry action when reconnects are exhausted; the
    Retry recovers the connection and the row returns to "Connected".
  • No jank: the goal block animates its height instead of snapping, the
    connection status moving into the sheet does not jump the page layout, and
    the composer never jumps off screen.
  • Every visible string comes from the app's translation catalogue. Add no
    hardcoded copy.
  • The change is visible, so the PR proof needs a screenshot of BOTH goal states
    (expanded and collapsed) beside the log excerpt, plus the session header
    without the reconnecting row and the context details sheet carrying the
    connection status.

[e10] ux-check: Localization — chevron screen-reader label announces the localized collapse/expand copy in a non-English locale, no raw key or English copy — android emulator-5554 with the app's per-app locale set to de-DE ('Locales for com.kilocode.kiloapp for user 0 are [de-DE]' in e10-locale.log): in a live session with an active goal, e10b-scene.log holds 'SCENE e10b OK' with 'android.widget.Button Ziel einklappen tappable [988,365][1043,420]' and 'android.widget.Button Aktives Ziel. Ziel: Ship the release notes tappable [37,365][970,450]' — the same chevron element (Button at [988,365][1043,420]) that announced 'android.widget.Button Collapse goal tappable [988,365][1043,420]' in the English build (e4-scene.log) — and after collapsing…

[e10] ux-check: Localization — chevron screen-reader label announces the localized collapse/expand copy in a non-English locale, no raw key or English copy — e10.png

[e11] ux-check: PR proof for both goal states — android/emulator-5604, one ordered run: expanded block shows the full goal ('android.widget.TextView Ship the release notes tappable [92,402][970,448]' plus 'android.widget.Button Collapse goal tappable [988,365][1043,420]'), capture e11-expanded.png; after 'tap Collapse goal' the scene reported SCENE e11 OK and the collapsed block shows 'android.widget.Button Active goal tappable [37,365][970,450]' with 'android.widget.Button Expand goal tappable [988,365][1043,420]' and the digest after the capture still reads Expand goal, capture e11-collapsed.png (scene capture e11.png). Both screenshots…

[e11] ux-check: PR proof for both goal states — e11-expanded.png

[e11] ux-check: PR proof for both goal states

[e11] ux-check: PR proof for both goal states — e11.png

[e7] ux-check: No jank: toggling collapse/expand animates the block's height instead of snapping, the transcript does not jump or blank, and the composer stays fully on screen. — Android (emulator-5554): SCENE e7 OK (e7-live.log:2) with collapsed -> expanded -> collapsed in one session - the block's row is 157px tall expanded (e1-run1.log:9) and 85px collapsed with the same status text and no objective (e7-live.log:10-12), the transcript below it stays rendered (e7-live.log:13-18) and the composer stays fully on screen after every toggle (e7-live.log:19-22), so the block moves its height instead of the content blanking; stills captured for the visual reviewer as e7-collapsed.png and e7-expanded.png (the smoothness of the height animation and the carat rotation are the…

[e7] ux-check: No jank: toggling collapse/expand animates the block's height instead of snapping, the transcript does not jump or blank, and the composer stays fully on screen. — e7-collapsed.png

[e9] ux-check: Collapsed tap target: tapping anywhere within the visible collapsed row above or below the status line (outside the chevron) opens the goal actions sheet; only the chevron toggles the… — android/emulator-5606: collapsed row in e9-collapsed-digest.log ('android.widget.Button Active goal tappable [37,365][970,450]', status text ending at y 402, chevron 'Expand goal tappable [988,365][1043,420]'); tap at (500,430) in that row region opened the goal actions sheet ('android.widget.Button Remove goal tappable [0,2043][1080,2190]') while the disclosure stayed collapsed, and only the chevron toggled it (e9-expanded-again.log: 'Active goal. Goal: Ship the release notes', 'Collapse goal'); captures e9-collapsed.png / e9-row-tap-sheet.png / e9-expanded-again.png for the visual reviewer…

[e9] ux-check: Collapsed tap target: tapping anywhere within the visible collapsed row above or below the status line (outside the chevron) opens the goal actions sheet; only the chevron toggles the… — e9-row-tap-sheet.png

[e5] ux-check: Collapsed goal row — android/emulator-5604: after tapping Collapse goal (SCENE e5 OK, rc=0) the goal row carries only the status — e5-scene.log: 'android.widget.Button Active goal tappable [37,365][970,450]' and 'android.widget.TextView Active goal tappable [92,365][970,402]' — with no objective or reason node in the row (the expanded row's label 'Goal: Ship the release notes' is absent; this goal carries no reason even when expanded, see e11-states.log line 'android.widget.TextView Ship the release notes tappable [92,402][970,448]' as the row's last line); the disclosure sits on the right of the row…

[e5] ux-check: Collapsed goal row — e5.png

[e11] ux-check: PR proof for both goal states

[e11] ux-check: PR proof for both goal states — e11-collapsed.png

[e9] ux-check: Collapsed tap target: tapping anywhere within the visible collapsed row above or below the status line (outside the chevron) opens the goal actions sheet; only the chevron toggles the…

[e9] ux-check: Collapsed tap target: tapping anywhere within the visible collapsed row above or below the status line (outside the chevron) opens the goal actions sheet; only the chevron toggles the… — e9-collapsed.png

[p1] goal disclosure, expanded -> collapsed -> expanded: seed an active goal by sending '/goal Ship the release notes' from the composer (needs:seed; the command needs a session whose catalog advertises… — Declared start state restored (p1-state-run.log: STATE HIT session-open) and the harvested replay ran live on emulator-5604: p1-replay.log holds SCENE p1 OK, with the collapsed block showing only the icon+status row (android.widget.Button Expand goal tappable [988,310][1043,365], p1-collapsed.log, whose goal block is just android.widget.Button Active goal tappable [37,310][970,394]) and the re-expanded block android.widget.Button Collapse goal tappable [988,310][1043,365] carrying the objective android.widget.TextView Ship the release notes tappable [92,347][970,393]…

[p1] goal disclosure, expanded -> collapsed -> expanded: seed an active goal by sending '/goal Ship the release notes' from the composer (needs:seed; the command needs a session whose catalog advertises… — conn-reconnect.png

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status — Expanded goal row reads 'android.widget.Button Active goal. Goal: Ship the release notes tappable [37,310][970,394]' with 'android.widget.Button Collapse goal tappable [988,310][1043,365]', and after that tap the row reads 'android.widget.Button Active goal tappable [37,310][970,394]' with 'android.widget.Button Expand goal tappable [988,310][1043,365]', re-expanding restoring the objective (e5e6-rest.log); the header digest goes from 'android.widget.Button Context 17,803 of 1,310,720 tokens, 1% used, cost 1 cent. Tap to view context details. tappable [773,156][1043,271]' straight to the goal…

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status — e6-header-reconnecting.png

[p4] ux-check: No jank: toggling collapse/expand animates the block's height instead of snapping, the transcript does not jump or blank, and the composer stays fully on screen. — (android emulator-5606) Re-ran because the diff rewrites the goal block and the disclosure primitives; the edited parked list started from the expanded state and returned 'SCENE p4 OK' for collapse, 'Expand goal', the objective dropped from the collapsed row (row label reduced to 'android.widget.Button Active goal tappable [37,310][970,394]' in e3-collapse-live.log) and expand-back, with the composer in place in both states ('android.widget.Button Send message [926,2187][1052,2313]' and the unchanged transcript group at [0,415] in p4-live-scene.log); height animation versus snapping is motion…

[p4] ux-check: No jank: toggling collapse/expand animates the block's height instead of snapping, the transcript does not jump or blank, and the composer stays fully on screen. — p4.png

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status — e6-hdr-connected.png

[owner-amendment-s4] Context details sheet always shows the connection status; the session header carries no reconnecting row — android emulator-5554: the sheet renders a dedicated connection row (android.view.ViewGroup session-context-sheet-connection tappable [0,526][1080,600], android.widget.TextView CONNECTION tappable [55,539][237,576], android.widget.TextView Connected tappable [865,535][1025,581]), and directly below the header's Context button sits the collapsed goal row, not a connection row (android.widget.Button Expand goal tappable [988,310][1043,365]); captures amendment-goal-collapsed.png, amendment-goal-expanded.png and amendment-ctxsheet.png are left for the visual reviewer. No UX-DEFECT…

[owner-amendment-s4] Context details sheet always shows the connection status; the session header carries no reconnecting row — amendment-goal-expanded.png

[owner-amendment-s4] Context details sheet always shows the connection status; the session header carries no reconnecting row

[owner-amendment-s4] Context details sheet always shows the connection status; the session header carries no reconnecting row — amendment-goal-collapsed.png

[p6] ux-check: Localization of the chevron's screen-reader label — With the German per-app locale applied first (Locales for com.kilocode.kiloapp for user 0 are [de-DE], p6-locale.log) the harvested replay ran live and p6-script.log holds SCENE p6 OK: the chevron announces the localized label android.widget.Button Ziel einklappen tappable [988,310][1043,365], the goal status is android.widget.TextView Aktives Ziel tappable [92,310][970,347] and the expanded block reads android.widget.Button Aktives Ziel. Ziel: Ship the release notes tappable [37,310][970,394], with the replay's absent-checks for the raw key 'agentChat.goal' and the English…

[p6] ux-check: Localization of the chevron's screen-reader label — p6.png

[owner-amendment-s4] Context details sheet always shows the connection status; the session header carries no reconnecting row

[owner-amendment-s4] Context details sheet always shows the connection status; the session header carries no reconnecting row — amendment-ctxsheet.png

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status — e5-goal-collapsed.png

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status — e5-goal-expanded.png

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status

[e5] ux-check: PR proof - expanded and collapsed goal block, session header without the reconnecting row, context details sheet carrying the connection status — e5-sheet-connected.png

[e1] ux-check: Expanded goal block sits closer to the header, header spacing unchanged, icon/status/objective legible — out/e1-run2.log prints "SCENE e1 OK" with the header unchanged at "android.widget.Button Rename session: Greeting tappable [111,149][714,278]" and the goal row directly beneath it at "android.widget.Button Active goal. Goal: Ship the release notes tappable [37,310][970,394]" with the carat "android.widget.Button Collapse goal tappable [988,310][1043,365]", against the same session's earlier digest out/e6-goal-set-scene.log (2026-09-16 23:39) where those identical header bounds carried the goal at "android.widget.Button Active goal. Goal: Ship the release notes tappable [37,365][970,450]"; the…

[e1] ux-check: Expanded goal block sits closer to the header, header spacing unchanged, icon/status/objective legible — sheetproof.png

[e1] ux-check: Expanded goal block sits closer to the header, header spacing unchanged, icon/status/objective legible

[e1] ux-check: Expanded goal block sits closer to the header, header spacing unchanged, icon/status/objective legible — goaltoggle.png

Follow-ups (not changed here)

Comment thread apps/mobile/src/components/agents/session-detail-content.tsx Outdated
Comment thread apps/mobile/src/components/agents/session-goal-collapse.ts
Comment thread apps/mobile/src/components/agents/session-goal-section.tsx Outdated
@kilo-code-bot

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

Copy link
Copy Markdown
Contributor

Code Review Summary

Status: No Issues Found | Recommendation: Merge

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

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

Previous review (commit 6f9b2c0)

Status: 1 Issue Found | Recommendation: Address before merge

Executive Summary

A cached session's first load now reads "Reconnecting…" instead of "Connecting…" because the connection latch is set from the raw transport even while a pending metadata refresh overrides the displayed state; the rest of the changed code (goal disclosure, context-sheet connection row, deleted page-level indicator) is sound.

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/agents/session-detail-content.tsx 1315 Cached-metadata refresh latches "ever connected", flipping the sheet copy to "Reconnecting…" on a first load
Files Reviewed (10 files)
  • apps/mobile/src/app/(app)/agent-chat/[session-id].tsx
  • apps/mobile/src/components/agents/chat-composer-input-height.ts
  • apps/mobile/src/components/agents/session-connection-indicator-state.ts
  • apps/mobile/src/components/agents/session-connection-indicator.tsx (deleted)
  • apps/mobile/src/components/agents/session-context-sheet.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx - 1 issue
  • apps/mobile/src/components/agents/session-goal-collapse.ts
  • apps/mobile/src/components/agents/session-goal-section.tsx
  • apps/mobile/src/components/security-agent/collapsible-section.tsx
  • apps/mobile/src/lib/auth/session-scoped-state.ts
  • apps/mobile/src/i18n/locales/*.json - 87 catalogs, mechanical key additions

Fix these issues in Kilo Cloud

Previous review (commit cbb3a42)

Status: No Issues Found | Recommendation: Merge

Executive Summary

Incremental review of the follow-up commit (cbb3a427d): the goal wrapper's LinearTransition is now gated on useMotionPolicy().reducedMotion, mirroring the disclosure's existing reducedMotion ? undefined : LinearTransition.duration(...) pattern, with a focused test asserting the prop is dropped under reduced motion. No new correctness, security, or memory-safety issues were found in the changed lines.

Files Reviewed (2 files)
  • apps/mobile/src/components/agents/session-detail-content.tsx
  • apps/mobile/src/components/agents/session-detail-content.test.ts

Previous review (commit 8442279)

Status: No Issues Found | Recommendation: Merge

Executive Summary

All three prior findings are fixed on the current HEAD (8442279): the ever-connected latch now consults the app-wide user-web leg only for a none transport, the goal-disclosure store gained a sign-out clear wired into clearSessionScopedState, and the stale connection-slot comment is corrected; the added tests cover the two behavior fixes.

Files Reviewed (7 files)
  • 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-goal-collapse.ts
  • apps/mobile/src/components/agents/session-goal-collapse.test.ts
  • apps/mobile/src/components/agents/session-goal-section.tsx
  • apps/mobile/src/lib/auth/session-scoped-state.ts
  • apps/mobile/src/lib/auth/session-scoped-state.test.ts

Previous review (commit f8e822c)

Status: 3 Issues Found | Recommendation: Address before merge

Executive Summary

A remote/cloud-agent session whose own transport is down while the app-wide socket is up can report "Reconnecting…" on its first connection because the ever-connected latch consults the app-wide user-web leg; two low-severity follow-ups cover an unbounded module-level goal-disclosure map and a stale comment.

Overview

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

WARNING

File Line Issue
apps/mobile/src/components/agents/session-detail-content.tsx 1308 Ever-connected latch consults the app-wide user-web leg for remote/cloud-agent transports

SUGGESTION

File Line Issue
apps/mobile/src/components/agents/session-goal-collapse.ts 14 collapsedBySession is never evicted and has no clear hook for sign-out
apps/mobile/src/components/agents/session-goal-section.tsx 41 Comment references the connection slot this PR removes
Files Reviewed (105 files)
  • apps/mobile/src/app/(app)/agent-chat/[session-id].tsx
  • apps/mobile/src/app/(app)/agent-chat/[session-id].mounted.test.tsx
  • apps/mobile/src/components/agents/chat-composer-input-height.ts
  • apps/mobile/src/components/agents/session-connection-indicator-state.ts
  • apps/mobile/src/components/agents/session-connection-indicator-state.test.ts
  • apps/mobile/src/components/agents/session-connection-indicator.tsx (deleted)
  • apps/mobile/src/components/agents/session-connection-indicator.mounted.test.tsx (deleted)
  • apps/mobile/src/components/agents/session-context-sheet.tsx
  • apps/mobile/src/components/agents/session-context-sheet.mounted.test.tsx
  • apps/mobile/src/components/agents/session-detail-content.tsx - 1 issue
  • 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-goal-collapse.ts - 1 issue
  • apps/mobile/src/components/agents/session-goal-collapse.test.ts
  • apps/mobile/src/components/agents/session-goal-section.tsx - 1 issue
  • apps/mobile/src/components/agents/session-goal-section.mounted.test.tsx
  • apps/mobile/src/components/security-agent/collapsible-section.tsx
  • apps/mobile/src/components/security-agent/collapsible-section.mounted.test.tsx
  • apps/mobile/src/i18n/locales/*.json - 87 catalogs, mechanical key additions (all verified present, non-empty, invariant-clean)

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 17, 2026 09:03
iscekic added a commit that referenced this pull request Sep 17, 2026
@iscekic
iscekic force-pushed the kwf/two-improvements-to-the-session-page-when-4757 branch from b0e0ccc to 8442279 Compare September 17, 2026 09:33
@iscekic
iscekic marked this pull request as ready for review September 17, 2026 09:42
@iscekic

iscekic commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator Author

kilo-review — independent audit of the published diff.

Status: 1 Issues

File Line Issue
apps/mobile/src/components/agents/session-detail-content.tsx 1796 The goal wrapper's ungated layout={LinearTransition.duration(150)} still animates the height change when toggling collapse under system Reduce Motion, so the toggle is not instant as the e3 scenario claims.

@iscekic
iscekic marked this pull request as draft September 17, 2026 10:13
iscekic added a commit that referenced this pull request Sep 17, 2026
@iscekic
iscekic force-pushed the kwf/two-improvements-to-the-session-page-when-4757 branch from 8442279 to cbb3a42 Compare September 17, 2026 10:33
@iscekic

iscekic commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator Author

bot: Accepted. Pushed cbb3a42 (kwf kwf-fix-review-7103).

What changed:

  • The page-level connection indicator is deleted; the context details sheet is now the only surface showing the connection status, and it renders that row in every state.
  • resolveSessionConnectionDisplay maps the transport, the app-wide user-web leg, reconnect exhaustion, and an ever-connected latch to connected/connecting/reconnecting/lost; the app-wide leg is consulted only for a none transport.
  • The sheet takes connectionDisplay and onRetryConnection: Retry re-runs the metadata refresh when the transcript is cached, and otherwise retries the socket.
  • Goal disclosure state is a module-scope, session-keyed in-memory store; absence means expanded, so it survives leaving and reopening a session but not an app restart.
  • apps/mobile/src/components/agents/session-detail-content.tsx:1796 — accepted: the goal wrapper's layout={LinearTransition.duration(150)} was unconditional, so the collapse still animated under Reduce Motion; the wrapper now reads the app motion policy and drops the transition when reduced motion is on, and the test asserts the prop is absent in that state.
  • The goal row's top padding drops from py-2 to pt-0.5 pb-2, the action pressable stretches across the row, and the chevron stays its sibling because a nested pressable disappears from assistive technology.
  • SESSION_HEADER_HEIGHT stays 92, so the composer height cap is unchanged after the indicator row is removed; review the motion-policy gate and the goal row's layout and accessibility first.
  • Every locale catalog gains sessionConnection.label, goal.collapse, and goal.expand; Connected reuses the existing common.connected.

@iscekic
iscekic marked this pull request as ready for review September 17, 2026 10:43
@iscekic

iscekic commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: persistence across leaving and reopening the session: the scripted part collapses the goal and leaves with the header back control; the verifier then re-enters the same session in the same app process with 'e2e/session.sh enter $SID' (a deep link, no app relaunch), asserts the row is still collapsed ('Expand goal' visible, 'Goal: Ship the release notes' absent), taps 'Expand goal' and asserts the objective returns, then captures the collapsed-row still for the PR. Append this scene after e1 in the same run. (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 added a commit that referenced this pull request Sep 17, 2026
@iscekic
iscekic force-pushed the kwf/two-improvements-to-the-session-page-when-4757 branch from cbb3a42 to 6f9b2c0 Compare September 17, 2026 14:50
Comment thread apps/mobile/src/components/agents/session-detail-content.tsx Outdated
@iscekic
iscekic marked this pull request as draft September 17, 2026 14:59
iscekic added a commit that referenced this pull request Sep 17, 2026
@iscekic
iscekic force-pushed the kwf/two-improvements-to-the-session-page-when-4757 branch from d7e9b8b to 1ff8faa Compare September 17, 2026 15:50
@iscekic
iscekic force-pushed the kwf/two-improvements-to-the-session-page-when-4757 branch from 1ff8faa to 31f950c Compare September 17, 2026 16:30
@iscekic
iscekic marked this pull request as ready for review September 17, 2026 16:50
@iscekic

iscekic commented Sep 17, 2026

Copy link
Copy Markdown
Collaborator Author

This description names a scenario the proof did not capture:

  • not proved live: persistence across leaving and reopening the session: the scripted part collapses the goal and leaves with the header back control; the verifier then re-enters the same session in the same app process with 'e2e/session.sh enter $SID' (a deep link, no app relaunch), asserts the row is still collapsed ('Expand goal' visible, 'Goal: Ship the release notes' absent), taps 'Expand goal' and asserts the objective returns, then captures the collapsed-row still for the PR. Append this scene after e1 in the same run. (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 17, 2026
@iscekic iscekic self-assigned this Sep 17, 2026
@iscekic
iscekic merged commit e655e81 into main Sep 18, 2026
28 checks passed
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