The selected option carries a check and 已选择, and a card whose tap is
being recorded shows one inline-spinner row 正在记录… (the timeline row's
shape, not a new vocabulary). Before any candidate exists the board's clock
shows the profile's declared birth minute with two lines of copy, the peek
reads 当前盘面 · 填报 HH:MM, and the column narrows until a result arrives.
The snapshot API has no declared-time house table, so none is invented.
BUG-482, BUG-483
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
Natal answers were opening on parameter tables, and rectification turns were one-sentence legal copy. Centralize user-facing strings, keep representative-minute and question-slot red lines, and stop duplicating the opening collect prompt as a second assistant message.
Co-authored-by: Cursor <cursoragent@cursor.com>
Put the compact board trigger in the chat header, keep the sheet above the composer on iOS, and align onboarding messages with the intake card on the session column.
Co-authored-by: Cursor <cursoragent@cursor.com>
BUG-330: the compact board sat in the same layer as the composer, so peek copy overlapped the sheet title. Overlay only below 768px; desktop stays a side column.
Co-authored-by: Cursor <cursoragent@cursor.com>
Use the quiet overlay scrollbar on chat and the house board, replace the blocking mobile dialog with a bottom sheet, and emit agent deltas before billing so users can read progress and stop a run.
Co-authored-by: Cursor <cursoragent@cursor.com>
eslint-plugin-react-hooks forbids updating ref.current in render, which failed staging lint after the compact rectification board landed.
Co-authored-by: Cursor <cursoragent@cursor.com>
The board was live data sitting under chat, so each new event looked like nothing changed. Keep candidate cards in the transcript and group 换升 by minute for the side panel.
Co-authored-by: Cursor <cursoragent@cursor.com>