fix(mobile): subagent needs-input, transcript blanking, review transcript truncation, sheet flash - #5646
Conversation
The review spectator rows and the session log cut assistant text, commands, and errors at fixed lengths. Both renderers wrap text, so the cuts only hid content.
FlashList draws 250 dp ahead by default. Transcript rows are tall and parse markdown on mount, so a fast fling showed blank space. Raise the draw distance to 1000 dp and give the transcript list item types so a time marker is not recycled into a message bubble.
A react-native Modal paints its container white, and Android unmounts the children before the slide-out ends. Set backdropColor to the theme background on every opaque Modal and add an oxlint rule that requires transparent or backdropColor on each Modal.
A subagent permission or question arrives on the child session row. The session list emits root rows only, so the raise was dropped. Hoist the child's needs-input status onto its root in the DO aggregate and in the mobile heartbeat filter.
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryHoisted child attention now arrives and clears via root Files Reviewed (6 files)
Previous Review Summaries (3 snapshots, latest commit 6ee4bd6)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit 6ee4bd6)Status: 1 Issue Found | Recommendation: Address before merge Fix these issues in Kilo Cloud Executive Summary
Overview
Issue Details (click to expand)WARNING
Files Reviewed (3 files)
Previous review (commit c28c2fe)Status: 1 Issue Found | Recommendation: Address before merge Fix these issues in Kilo Cloud Executive SummaryHoisting a subagent Overview
Issue Details (click to expand)WARNING
Files Reviewed (23 files)
Previous review (commit f2cc8c9)Status: 1 Issue Found | Recommendation: Address before merge Fix these issues in Kilo Cloud Executive SummaryHoisting a subagent Overview
Issue Details (click to expand)WARNING
Files Reviewed (18 files)
Reviewed by grok-4.6 · Input: 120.1K · Output: 20K · Cached: 1.1M Review guidance: REVIEW.md from base branch |
The stream replays the whole event log on connect and the spectator committed one render per event. Batch the rows once per tick. Clear the error on reconnect, which the SDK reports separately from the first connect. Synthetic events share eventId 0, so do not key them; a shared key collapsed them into one row.
The heartbeat merge keeps attention sticky, so a hoisted permission stayed on the root after the child resolved. When a heartbeat lists the root's children and none waits for input, the live status wins. Move the root selection into its own module to keep the file under the line limit.
…event Clients keep a needs-input status sticky until an explicit session.status.updated names the session, so a hoist that only lives in the aggregate got stuck on the root. The DO now diffs the hoisted status between heartbeats and broadcasts session.status.updated on the root when a child raise appears, settles, or leaves the heartbeat. The mobile heartbeat hoist is removed; the DO owns it.
Summary
Mobile defects from the W8-B pass.
UserConnectionDO.aggregateSessions, and broadcastsession.status.updatedon the root when a child raise appears, settles, or leaves the heartbeat, so clients' sticky attention sets and clears on the explicit event. Not a.kilo/special case; any subagent prompt had the same gap.drawDistanceto 1000 dp and give the transcript list item types so a time marker is not recycled into a message bubble. Platform-symmetric; no Android-only code. TheremoveClippedSubviewsworkaround for KILO-APP-25 is untouched.eventId: 0; they are no longer keyed, so they stop collapsing into one row.Modalpaints its container white, and Android unmounts children before the slide-out ends. SetbackdropColor={colors.background}on every opaque Modal. New oxlint rulern-modal-backdrop/require-backdropfails on any<Modal>withouttransparentorbackdropColor.Not done: rendering the review transcript with the session conversation components. Live events can be folded into
StoredMessagewith existing SDK helpers, but history needs a new field or procedure (getReviewStreamInfohas nocliSessionId) and a spectator rewrite. Separate PR.Checks
pnpm format && pnpm typecheck && pnpm lint && pnpm check:unused && pnpm testinapps/mobile: greenpnpm vitest run src/dos/UserConnectionDO.test.ts+pnpm typecheckinservices/session-ingest: greenpnpm typecheckinapps/web: greenE2E (local stack, iOS 17 Pro simulator + Pixel 9 API 35 emulator, dark theme)
paged-historysession, baseline vs this branch: no blank frames in either run on the simulator. The blanking does not reproduce there;drawDistanceis a plain prefetch change.