feat: show the working indicator in ChatPane (member DMs, split panes) - #7731
Conversation
First Principles Review (Fable 5) — ✅ PASSPremise-level review of All evidence is in. Both sibling transcript hosts carry their own signal (SideChat has three pulsing dots at First-Principles-Verdict: PASS Reuse at cause level: the pane hosts the page's existing ChatFooter unchanged, and every rider is the repo's established capture/test convention. What this change shipsIntent: make a running turn visible inside ChatPane hosts (member DMs, split panes) between tool steps — an ADDITION.
No duplication: grep [FIRST-PRINCIPLES-REVIEWED] b824395 |
Design Review (Fable 5) — ✅ PASSDesign-level review of Design-Verdict: PASS Straight reuse of the page's existing loader through its prop seam, fed by the pane's own slot state — the right shape, minimal surface. Suggestions
[DESIGN-REVIEWED] b824395 |
UX Review (Fable 5) — ✅ PASSUX-level review of The diff is a small parity change: UX-Verdict: PASS Straight parity port of the existing working indicator to panes — same component, same placement, per-slot state wired correctly, both themes verified. [UX-REVIEWED] b824395 |
Opus 4.8 Review — ✅ no blocking findingsReviewed Verdict parsed from the review's SHA-scoped output markers for commit False positive or not applicable? A repository writer can comment: |
GPT 5.6 Review — ✅ no blocking findingsGPT 5.6 completed its review of This comment is updated in place on each push. Review detailsNo findings. False positive or not applicable? A repository writer can comment: |
f15ebe3 to
5c463d8
Compare
A running turn in a ChatPane host — a Crew Members DM thread, a split pane — was invisible between tool steps: the pane renders streamed text and tool rows but nothing during the gaps, so a working member looked stalled. The full chat page already solves this with ChatFooter's ghost-pose carousel (theme-swappable via themeBranding loader / loaderIcons). Host that same footer in ChatPane, inside the scroll container after the last message, driven by the pane's own per-slot stream state (selectSlotStreamState): running shows the carousel, active text streaming yields to the inline caret, idle renders nothing. No new visual vocabulary, no new state, and themes' loader overrides apply in panes for free. Adds an isolated capture entry (capture/chatpane-loader.html) seeding the warm-slot path through the same reducers the WS drives, plus a state-asserted capture script and committed evidence.
5c463d8 to
b824395
Compare
|
Disposition — GPT advisory finding (ChatPane.tsx:725, head 5c463d8): FIXED in b824395. The pane's footer now unions the stream-state signal with the slots-broadcast one — |
Problem / Motivation
A running turn inside a ChatPane host — a Crew Members DM thread, a split pane in the session grid — is invisible between tool steps. The pane renders streamed text and tool rows, but during the gaps (thinking, tool execution, post-tool pauses) nothing on screen moves: a hard-working member looks stalled, and users cannot tell "working" from "dead".
Why it matters
The Crew Members page is the accountability surface for autonomous member activity; "is it doing anything right now" is the page's core question. The full chat page already answers it with the ghost-pose loading carousel — panes answering it with silence is an inconsistency users notice immediately after meeting the animation on the main page.
What changed (motivation → approach → change)
Goal: the same working signal in panes as on the chat page — without inventing a second visual vocabulary.
Approach: reuse, don't rebuild.
ChatFooter(the 4-slot ghost-pose carousel, theme-swappable viathemeBrandingloader/loaderIcons) is self-contained and driven entirely by props, so ChatPane can host it directly.ChatPane.tsx: renderChatFooterinside the scroll container after the last message, fed from the pane's own per-slot stream state (selectSlotStreamState) —runningshows the carousel,stopping/compactingshow their existing states, active text streaming yields to the inline caret (ChatFooter's own algebra), idle renders nothing. Stop/regenerate chrome stays page-level.capture/chatpane-loader.html+capture/chatpane-loader.tsx(real ChatPane, warm-slot seeding through the samesseChatMessage/hydrateSlotMessagesreducers the WS drives) and a state-asserted capture scriptscripts/capture-chatpane-loader.mjs.Tests
ChatPane.workingLoader.test.tsxpins the wiring (ChatFooter's own suite covers its visibility algebra):tool_running→ footer + carousel render in the paneidle→ no footer at allManual verification
recorded from b824395 · feat/chatpane-ghost-loader · vite dev serving branch source, isolated capture entry
capture/chatpane-loader.htmlwith route-stubbed/apifixtures, state asserted before every frame · no live gatewayStills: 01-running-dark · 02-idle-dark · 03-running-light
Gates:
tsc -bclean, eslint clean, full frontend suite 27431 passed, full 19-check i18n suite PASS.no linked issue: gap identified during the Crew Members animation design review with the maintainer in-session; no tracking issue exists.