Repository navigation
feat(mobile): show scheduled sessions across the list, detail, and glanceables - #6691
Conversation
…-session-state-glanceables-2241/s4)
…ing (kwf app-scheduled-session-state-glanceables-2241/s1)
…ping or crashing, relay `scheduledAt` (kwf app-scheduled-session-state-glanceables-2241/s2)
…t wake; push schema (kwf app-scheduled-session-state-glanceables-2241/s3)
…y keys (kwf app-scheduled-session-state-glanceables-2241/s5)
…its wake time (kwf app-scheduled-session-state-glanceables-2241/s6)
…d (kwf app-scheduled-session-state-glanceables-2241/s7)
… wake time (kwf app-scheduled-session-state-glanceables-2241/s8)
…duled + the wake time (kwf app-scheduled-session-state-glanceables-2241/s9)
…ies scheduled + the wake time (kwf app-scheduled-session-state-glanceables-2241/s10)
…f app-scheduled-session-state-glanceables-2241/s11)
…at (kwf app-scheduled-session-state-glanceables-2241/ux1)
… s (kwf app-scheduled-session-state-glanceables-2241/ux2)
Code Review SummaryStatus: No Issues Found | Recommendation: Merge Executive SummaryIncremental review of the null- Files Reviewed (6 files)
Incremental scopeSince Previous Review Summaries (3 snapshots, latest commit d28259f)Current summary above is authoritative. Previous snapshots are kept for context only. Previous review (commit d28259f)Status: No Issues Found | Recommendation: Merge Files Reviewed (2 files)
Incremental review since Previous review (commit d381575)Status: No Issues Found | Recommendation: Merge Executive SummaryIncremental review of the commits since Files Reviewed (2 changed since previous review)
Incremental review: the merge from Previous review (commit 4a8263b)Status: No Issues Found | Recommendation: Merge Executive SummaryReviewed the scheduled-session status feature end to end (166 files: SDK schemas/normalizer/service-state, session-ingest validation and Durable Object, web active-sessions/glanceable snapshot, notifications push data, and the mobile list/detail/glanceable surfaces plus 87 locale catalogs) and found no high-confidence defects. Files Reviewed (166 files)
Reviewed by deepseek-v4.1-flash · Input: 0 · Output: 0 · Cached: 0 Review guidance: REVIEW.md from base branch |
…sion-state-glanceables-2241 # Conflicts: # apps/mobile/src/components/agents/session-list-helpers.test.ts # apps/mobile/src/i18n/catalog-parity.test.ts
…sion-state-glanceables-2241
…sion-state-glanceables-2241
…sion-state-glanceables-2241 # Conflicts: # apps/mobile/src/components/agents/remote-session-row.tsx # apps/mobile/src/i18n/catalog-parity.test.ts
…sion-state-glanceables-2241
eshurakov
left a comment
There was a problem hiding this comment.
Warning — version skew on the glanceable push payload.
packages/notifications/src/push-data.ts:138 extends newestResultKind from a closed 3-value enum to include 'scheduled' in the active_agents_glanceable payload. Mobile parses this strictly (apps/mobile/src/lib/notifications.ts, parseNotificationData → safeParse, returning null on failure and dropping the payload), and the send gate for this payload type is per-type, not per-field. So an already-shipped client that understands active_agents_glanceable but predates 'scheduled' will fail to parse and silently drop the glanceable update whenever a scheduled session is the newest result kind. Making scheduled/scheduledAt defaulted does not help — the failing token is the enum value itself. Consider a tolerant read (.catch()/default) or gating the new value until clients catch up.
Warning — scheduledAt null handling differs across ingest paths.
services/session-ingest/src/types/user-connection-protocol.ts:54 declares scheduledAt: z.string().optional(), which rejects an explicit null, while the parallel HTTP ingest item in services/session-ingest/src/types/session-sync.ts:74 uses z.string().nullable().optional() and accepts it. A CLI that serializes a missing wake time as null in the heartbeat has its session update rejected.
…sion-state-glanceables-2241 # Conflicts: # apps/mobile/src/i18n/catalog-parity.test.ts
A CLI that serializes the absent wake time as an explicit null failed CLIOutboundMessageSchema, so the whole heartbeat was dropped and the session never reached sessions.list. The heartbeat field now reads a non-string value as absent, matching the tolerant HTTP ingest item in session-sync.ts.
The activeSessionSchema row and the scheduled session status now read a non-string wake time as absent instead of failing the parse, matching the session-ingest heartbeat contract.
|
Verdict: warning 2 is fixed and pushed. Warning 1 is real and still open; it needs a version gate that this PR cannot pin. Warning 2 — an explicit
Warning 1 —
|
…sion-state-glanceables-2241 # Conflicts: # apps/mobile/src/i18n/catalog-parity.test.ts
…sion-state-glanceables-2241 # Conflicts: # apps/mobile/src/i18n/catalog-parity.test.ts
Changelog for users
scheduledwherever it appears, instead ofidle.Scheduled.Changelog for maintainers
GlanceableStatusKindandGlanceableCountKindaddscheduled, ranked between running and idle;glanceableStatusKindmaps an unrecognized status to running, never idle.scheduled(default 0) andscheduledAt(default null), so payloads and persisted snapshots from before this change still parse.scheduledAtrides heartbeat rows, v2 rows, and both status-updated payload shapes;scheduledwith noscheduledAtis representable end to end.isStartableGlanceableWorknow includes scheduled, so a scheduled-only scope raises the iOS Live Activity and push-to-start, and the widget no longer offersNew agentfor it.resolveSessionConnectionDisplayreports scheduled only over an up transport; connecting, reconnecting, and lost still win.timeAgonow formats a future instant forward (in 2 hours); check any caller that passes a future timestamp.E2E proof
Owner request
[p14] ux-check: iOS Live Activity (phone banner/expanded) and the iOS medium Home Screen widget show the scheduled row with a wake time. — Platform: android (emulator-5604) — iOS Live Activity and the iOS widget are not placeable on this android-only host, so the android glanceables stand in: the app-posted ongoing notification body text="1 Working, 2 Scheduled wakes in 2 hours" (p14-shade-read.xml, still p14-shade.png) and the home-screen Active Agents widget content-desc="1 Working, 2 Scheduled, Open agents" (p14-widget.txt, still p14-widget.png), both agreeing with the same-run Agents list's 2 SCHEDULED rows incl. 'SCHEDULED · 4:26 AM' (p14-list.log); scheduled state seeded by the live fake-CLI heartbeat fixture…
[e5] scheduled state survives an app reload — android (emulator-5604): after a cold launch the Agents list still shows 'Greeting, Scheduled, ... and 9:00 AM' / 'SCHEDULED · 9:00 AM'; SCENE e5 OK in e5-coldopen.log, still e5.png.
[e7] Session detail: the Connection row reads Scheduled; needs:seed the scheduled live session and open its detail (state session-open) — Platform: android (emulator-5554). The declared state session-open is a harness gap on this device (state.sh exits rc=2 with 'could not obtain a session id for 'session-open'' in e7-state-attempt.log) even with a live session, so per the scenario's own seed instruction I seeded the scheduled live session with a temporary CLI heartbeat stub (stub-shard7-sched.js; e7-inject.log 'SEND status scheduled scheduledAt 2026-09-24T00:32:48.505Z') and drove from the list; e7-scene.log has 'SCENE e7 OK' with 'session-context-sheet-connection' and 'Scheduled' (same-moment e7-detail.txt/e7-detail.png).…
[p1] Session list (Agents tab) shows a scheduled session as SCHEDULED with its wake time; needs:seed a live session whose status is
scheduledand whosescheduledAtis a near-future ISO-8601 timestamp — Re-ran replay-p1.json OK; digest line 'android.widget.TextView SCHEDULED · 2:10 AM' beside the no-wake row 'android.widget.TextView SCHEDULED'; state seeded by the stub CLI heartbeat (p1-sched-stub.log); android emulator-5554; screenshot p1.png.[e4] Empty: with no scheduled session the list shows no SCHEDULED row (start state has only running/idle sessions) — android emulator-5554; e4-behavior.log carries 'SCENE e4 OK' and its digest lists only 'Untitled session, Idle, kwf/app-scheduled-session-state-glanceables-2241, CLOUD, and 1 minute ago' with no SCHEDULED row (e4.png, e4-home.png); run on the worktree-scoped empty account e2e-empty-app-scheduled-session-state-glanceables-2241@example.com with one idle session seeded via needs-input.sh because the default account's signed-in-home carried other shards' live scheduled stub rows (e4-scene.log shows 'SCHEDULED · 12:01 AM'), then signed back in as the default account; the parked 'absent SCHEDULED'…
[p14] ux-check: iOS Live Activity (phone banner/expanded) and the iOS medium Home Screen widget show the scheduled row with a wake time.
[e11] Android widget shows Scheduled and the wake time; needs:seed the scheduled live session, then inspect the placed ActiveAgents widget still — Android/emulator-5604. Live scheduled session seeded over the session-ingest CLI websocket; the ActiveAgents widget was placed on the launcher (fixture) and its hierarchy reads
content-desc="1 Working, 2 Scheduled, 1 Idle, Open agents", agreeing with its source the worker's/api/sessions/activecounts{"idle": 1, "scheduled": 2, "busy": 1}(e11-count-source.log); the app Home glanceable readse11 scheduled wake … SCHEDULED · 9:00 AM(e11-scene-run.log). The widget renders to a bitmap, so its wake-time text is judged from the capture e11-widget-final.png by the visual reviewer. No UX…[e14] ux-check: glanceable shows the scheduled row with a wake time — android (emulator-5604); iOS Live Activity / iOS medium widget are not on this host, so proved the android glanceables: app-posted ongoing notification 'Active agents / 1 Working, 1 Scheduled wakes in 12 hours, 1 Idle' (e14-shade-read.xml, still e14-shade.png) and home-screen Active Agents widget content-desc '1 Working, 1 Scheduled, 1 Idle, Open agents' (e14-widget.txt, still e14-widget.png); counts agree with the Agents-list source in the same run (e5-coldopen.log).
[e19] ux-check: Relaunch the app (or go offline and back) and confirm the scheduled row still reads scheduled with its wake time. — android emulator-5554: after a cold relaunch the Agents list still shows both scheduled rows (e19-after.log: 'android.widget.TextView SCHEDULED tappable [805,565][957,602]' and 'android.widget.Button Scheduled stored row 2241, Scheduled, and CLI tappable [0,691][1080,851]'; e19-scheduled-rows.log: 'ses_sched_stored_2241|scheduled|Scheduled stored row 2241'), so the status survives the reload (screenshots e19-before-list.png, e19.png); the wake-time variant was not exercisable because no fixture in this build emits scheduledAt (CLI 7.7.5 has no scheduled support, needs-input.sh rejects…
[e13] ux-check: Session detail: opening the context sheet for a scheduled session shows the Connection row reading
Scheduled. — android emulator-5554; e13-context.txt (hierarchy of the context sheet, still e13-context.png) carries text="CONNECTION" and text="Scheduled" for the scheduled CLI session ses_schedE13StoredRow224100000, seeded with status='scheduled' and driven live by a heartbeat stub (the mechanism another shard used for its list rows; the e2e index has no scheduled-session fixture); the list digest e13-scene.log shows 'e13 scheduled detail, Scheduled, kwf/app-scheduled-session-state-glanceables-2241, CLOUD, and 9:00 AM' and the detail loaded its empty state (e13-detail.png, e13-list.png); the scene call…[e18] ux-check: After the scheduled session wakes and runs, the list row shows the running glyph, the detail Connection reads
Connected, and the widget/notification drop the scheduled count and wake. — Platform: android (emulator-5606). Same temporary CLI stub, same row ses_schedE13StoredRow224100000 (e18-stub.log flips 'SEND status scheduled scheduledAt 2026-09-24T00:01:44.459Z' to 'SEND status busy scheduledAt -'). Before: list row 'e13 scheduled detail, Scheduled, ... and 12:01 AM' with 'SCHEDULED · 12:01 AM' (e18-before.txt), session context sheet read 'CONNECTION' / 'Scheduled' (e18-detail-scheduled.txt), widget '1 Scheduled, Open agents' (e18-widget-before.txt), notification '1 Scheduled wakes in 2 hours' (e18-shade-before.txt). After: the same row reads 'e13 scheduled detail…[e13] ux-check: Session detail: opening the context sheet for a scheduled session shows the Connection row reading
Scheduled.[e9] platform:ios iOS widget shows Scheduled and the wake time; needs:seed the scheduled live session, then inspect the placed ActiveAgents widget still — Platform: android (emulator-5606) — this host is android-only so the iOS widget family is not placeable and the Android glanceables are the surfaces under test. Placed 'Active Agents' widget on the launcher read content-desc="1 Needs input, 1 Scheduled, Open agents" and the same run's Kilo ongoing notification read text="1 Needs input, 1 Scheduled wakes in 2 hours" (e9-widget-live.txt, e9-shade-live.xml) while the Agents list showed the source row (e9-list.log: 'e18 wake session, Scheduled, kwf/app-scheduled-session-state-glanceables-2241, CLOUD, and 11:57 PM' with 'SCHEDULED · 11:57 PM'), so…
[e5] scheduled state survives an app reload
[e4] Empty: with no scheduled session the list shows no SCHEDULED row (start state has only running/idle sessions)
[e16] ux-check: Android widget (large/stack and short/row sizes) and the Android ongoing notification show the scheduled count with the wake time. — Platform: android (emulator-5554). The 'Active Agents' widget on the launcher reads '1 Scheduled, Open agents' (e16-widget.txt, still e16-widget.png), agreeing with its source /api/sessions/active 'counts={"scheduled": 1}' (e16-count-source.log) and the same-run stub heartbeat (e16-inject.log); the Kilo ongoing notification reads '1 Scheduled wakes in 2 hours' (e16-shade.txt, still e16-shade.png). The launcher's widget picker offers one size (2x1), so the large/stack vs short/row split has no separate Android placement here and the widget body is an image (rn_widget_image_light) whose drawn…
[e8] platform:ios iOS Live Activity shows Scheduled and the wake time; needs:seed the scheduled live session so the activity raises, then inspect the Lock Screen / Notification Center still — Android/emulator-5604 (host is android-only; the iOS Live Activity has no android surface, so the app's own Android ongoing notification is the android glanceable). state.sh signed-in-home reported STATE HIT; replay-e8.json reported SCENE e8 OK with the Home LIVE NOW row
e13 scheduled detail, Scheduled, kwf/app-scheduled-session-state-glanceables-2241, CLOUDand eyebrowSCHEDULED(e8-scene-run.log); the shade dump shows the app's own ongoing notification1 Scheduled wakes in 12 hours, 1 Idle(e8-shade.txt, e8-shade.png), agreeing with that same run's Home list (one scheduled, one idle).…[e19] ux-check: Relaunch the app (or go offline and back) and confirm the scheduled row still reads scheduled with its wake time.
[e17] ux-check: Unknown status renders running, never idle, no crash — Android/emulator-5604. A session reporting the out-of-vocabulary wire status
teleportedwas created by the verification stub stub-cli-states-2241.js (temporary stub in the evidence dir, reused from shard 3; it opens a CLI connection on the session-ingest websocket because needs-input.sh set rejects unknown statuses and its ingest POST returns HTTP 500, obstacle needs-input-arbitrary-status). The Agents live list rendersS3 teleported status, Working, kwf/app-scheduled-session-state-glanceables-2241, and CLOUD— the running state, never idle, with no crash (e17-list.xml, e17-list.png). The…[e14] ux-check: glanceable shows the scheduled row with a wake time
[e16] ux-check: Android widget (large/stack and short/row sizes) and the Android ongoing notification show the scheduled count with the wake time.
[e4] Empty: with no scheduled session the list shows no SCHEDULED row (start state has only running/idle sessions)
[e12] ux-check: scheduled session row — android emulator-5606; live Agents list from stub-cli-states-2241.js shows 'Scheduled wake, ... SCHEDULED · 11:24 PM' with the wake time and no relative-time meta, and 'S3 scheduled no time, Scheduled, ...' with 'SCHEDULED' and no time and no 'Invalid Date' in e12.log; no user-outcome UX-DEFECT observed (captures e12.png left for the visual reviewer).
[e10] Android ongoing notification shows Scheduled and the wake time; needs:seed the scheduled live session, then inspect the notification shade still — The notification shade dump (e10.txt, still e10.png) carries the app's 'Active agents' notification with body '3 Scheduled wakes in 46 minutes, 1 Idle', and the app's list in the same run shows 3 rows badged 'SCHEDULED' (e10-list.log), so the count matches its source; proved via the fake-CLI scheduled fixture plus a foreground refresh since Android has no local FCM push.
[e18] ux-check: After the scheduled session wakes and runs, the list row shows the running glyph, the detail Connection reads
Connected, and the widget/notification drop the scheduled count and wake.[e18] ux-check: After the scheduled session wakes and runs, the list row shows the running glyph, the detail Connection reads
Connected, and the widget/notification drop the scheduled count and wake.[e18] ux-check: After the scheduled session wakes and runs, the list row shows the running glyph, the detail Connection reads
Connected, and the widget/notification drop the scheduled count and wake.[e15] ux-check: iOS small and large Home Screen widgets show
Scheduledand the wake time (per the request that every glanceable carries the wake). — Platform: android (emulator-5606) — this host is android-only, so the iOS small/large widget families are not placeable and the Android home-screen widget is the glanceable under test. The 'Active Agents' widget is on the launcher (2x1, the only size this launcher offers) and its label reads '1 Working, 1 Scheduled, 1 Idle, Open agents' (e15-widget-home.txt), i.e. the scheduled row is rendered; the same run's Android glanceable body carries the wake: the ongoing notification reads '1 Working, 1 Scheduled wakes in 12 hours, 1 Idle' (e15-shade.txt). Captures e15-widget-home.png and…[e18] ux-check: After the scheduled session wakes and runs, the list row shows the running glyph, the detail Connection reads
Connected, and the widget/notification drop the scheduled count and wake.[e18] ux-check: After the scheduled session wakes and runs, the list row shows the running glyph, the detail Connection reads
Connected, and the widget/notification drop the scheduled count and wake.[e3] An unrecognized status (teleported) never renders as Idle — android emulator-5606; live Agents list from stub-cli-states-2241.js shows 'S3 teleported status, Working, kwf/app-scheduled-session-state-glanceables-2241, and CLOUD' (unknown status rendered as running, no 'Idle' in that row) while a real idle row still shows 'Idle' in e3.log; no user-outcome UX-DEFECT observed (captures e3.png left for the visual reviewer).
[e15] ux-check: iOS small and large Home Screen widgets show
Scheduledand the wake time (per the request that every glanceable carries the wake).[e17] ux-check: Unknown status renders running, never idle, no crash
[e13] ux-check: Session detail: opening the context sheet for a scheduled session shows the Connection row reading
Scheduled.[e18] ux-check: After the scheduled session wakes and runs, the list row shows the running glyph, the detail Connection reads
Connected, and the widget/notification drop the scheduled count and wake.[p11] Android widget shows Scheduled and the wake time; needs:seed the scheduled live session, then inspect the placed ActiveAgents widget still — Platform: android (emulator-5604). Start state signed-in-home; the placed Active Agents widget hierarchy p11-widget.txt reads
1 Working, 4 Scheduled, Open agents, agreeing with the live list it counts in p11-scene.log, which holdsSCENE p11 OKwith rowse2 scheduled no time, Scheduled,e11 scheduled wake, Scheduled,S3 scheduled no time, Scheduled,S3 scheduled wake, ScheduledandS3 teleported status, Working; p11-scene.log also shows the scheduled row with its wake (e11 scheduled wake, Scheduled...9:00,SCHEDULED ·). The compact cell draws the wake into the widget…[p4] Empty: with no scheduled session the list shows no SCHEDULED row (start state has only running/idle sessions) — android emulator-5554; p4-behavior.log carries 'SCENE p4 OK' with the Agents-list digest 'Untitled session, Idle, kwf/app-scheduled-session-state-glanceables-2241, CLOUD, and 3 minutes ago' and 0 SCHEDULED eyebrow nodes (raw p4-list.longrun.log, hierarchy p4-list.txt, capture p4-list.png); run on the worktree-scoped empty account e2e-empty-app-scheduled-session-state-glanceables-2241@example.com with one idle session seeded via needs-input.sh because the default account's list holds other shards' live Scheduled rows, then signed back in as the default account; no UX-DEFECT observed in the…
[p2] Session list shows scheduled with NO time when the payload omits
scheduledAt; needs:seed a live session whose status isscheduledand which carries noscheduledAt— Platform: android (emulator-5604). Start state signed-in-home (STATE HIT signed-in-home, state-run.log); a stub CLI heartbeat (stub-shard2-scheduled.js,OPEN stub-shard2-...in stub-shard2.log) seeded a scheduled session with no scheduledAt and one with a 09:00Z wake; p2-scene.log holdsSCENE p2 OKwith the rowe2 scheduled no time, Scheduledand eyebrowSCHEDULED(no time), besidee11 scheduled wake, ScheduledwithSCHEDULED ·and9:00; no UX defect on the Agents list (capture p2.png for the visual reviewer).[p15] ux-check: glanceable widget shows
Scheduledand the wake time — Android Active Agents widgetcontent-desc="1 Working, 4 Scheduled, Open agents"(p15-widget.txt) beside the same-run Agents list's 4 SCHEDULED rows incl.SCHEDULED · 4:26 AMandSCHEDULED · 9:00 AM(p15-list.txt) - counts agree, scheduled not rendered as idle; widget wake-time pixels are judged by the visual reviewer from p15-widget.png; platform android.[p11] Android widget shows Scheduled and the wake time; needs:seed the scheduled live session, then inspect the placed ActiveAgents widget still
[p16] ux-check: Android widget (large/stack and short/row sizes) and the Android ongoing notification show the scheduled count with the wake time. — Platform: android (emulator-5554). The Active Agents widget on the launcher reads '1 Working, 1 Scheduled, 1 Idle, Open agents' (p16-widget.txt, still p16-widget.png), agreeing with the same-run app live list 'P7 scheduled wake' / 'SCHEDULED · 5:02 AM' plus one Working and one Idle row (p16-source.txt) fed by the same-run stub heartbeat (p7-inject2.log); the Kilo ongoing notification reads '1 Scheduled wakes in 2 hours, 1 Idle' (p16-shade.txt, still p16-shade.png). The launcher's picker offers one size (WidgetCell '2 wide by 1 high'), so the large/stack branch has no separate Android…
[p16] ux-check: Android widget (large/stack and short/row sizes) and the Android ongoing notification show the scheduled count with the wake time.
[p12] ux-check: Session list: a scheduled session's row shows the Clock glyph and
SCHEDULED · <wake time>(no idle ring, no relative-time meta); a scheduled session with noscheduledAtshows… — android emulator-5606; same fake-CLI stub seeds status=scheduled with and without scheduledAt; p12-scene.log prints 'SCENE p12 OK' and the digest shows 'android.widget.TextView SCHEDULED · 4:26 AM' on row 'S3 scheduled wake' and 'android.widget.TextView SCHEDULED' (no time) on row 'S3 scheduled no time', with no 'Invalid Date' in the digest; the diff adds formatScheduledWake (session-list-helpers.ts) for this eyebrow. Clock glyph/idle-ring/relative-meta are visual and belong to the visual reviewer; p12.png captured. No functional UX defect.[p4] Empty: with no scheduled session the list shows no SCHEDULED row (start state has only running/idle sessions)
[p3] An unrecognized status (needs:seed a live session whose status is
teleported) never renders as Idle — android emulator-5606; fake-CLI heartbeat stub (stub-cli-states-2241.js in $OUT, the only fixture for this wire state) seeds status=teleported; p3-scene.log prints 'SCENE p3 OK' and the digest row 'android.widget.Button S3 teleported status, Working, kwf/app-scheduled-session-state-glanceables-2241, and CLOUD' with no 'Idle' text in the digest; stub source p3p12-stub.log 'OPEN'. No functional UX defect (no missing feedback/lost work/broken recovery); p3.png captured for the visual reviewer.[p10] Android ongoing notification shows Scheduled and the wake time; needs:seed the scheduled live session, then inspect the notification shade still — Re-ran replay-p10.json OK, then shade dump p10.txt shows the app ongoing notification 'text="1 Working, 3 Scheduled wakes in 41 minutes"' (soonest wake = the stub's 02:10 wake, +41 min at capture); android emulator-5554; screenshot p10.png.
[p17] ux-check: Unknown status: a session reporting a status outside the vocabulary renders the running state in the list and widget, never idle, with no crash. — android emulator-5604: live Agents list (p17-list.txt) shows the teleported-status row as 'Working' beside a real 'Idle' row, and the home-screen widget reads '1 Working, 1 Scheduled, 1 Idle' (p17-widget.txt) agreeing with its source the worker's active-session list (p17-count-source.log: ses_stub_p17_teleported teleported), so the unknown status is the widget's Working, never idle, with no crash; state seeded by fake-CLI heartbeat stub stub-p17-teleported.js because the e2e index lists no unknown-status fixture; no UX-DEFECT.
Follow-ups (not changed here)
Open findings (not fixed here)
Scheduledand the wake time (per the request that every glanceable carries the wake).