docs(rectification): record the surface redo — BUG-505..509, DESIGN.md rectification surface, walkthrough section 8

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JUei7K13cYxLHE3Axe4A45
This commit is contained in:
Jesse_Chen
2026-09-03 07:06:38 +00:00
parent 3c33e59814
commit 99a91a97f4
7 changed files with 369 additions and 1 deletions
+79
View File
@@ -7777,3 +7777,82 @@
- 复发自:无
- 修复版本:待发布
## BUG-505 | 生时校正面进入时先闪普通对话、再空白、再整面重挂;问题槽用「等待服务端更新」裸文案
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-03
- 影响面:`use-rectification-surface``use-session-management``page.tsx`(面板 key、prepare 阶段)、`rectification-agentic-chat``starter-home``sidebar-session-row`
- 用户现象:点首页卡片没有任何反馈;从侧栏进已有校正会话先闪一帧普通对话、再是一块空白面板、记录到了再整面重挂;新建校正第一轮结束时画面闪一下、滚动归零;恢复会话后快照没回来前问题区空着;答完题后 composer 上方是「当前没有可回答的问题,正在等待服务端更新。」之类没有动作、没有时限的文案。
- 触发条件:任何进入校正面的路径(卡片、侧栏、深链/刷新);任何一轮结束到下一题到达之间。
- 根因:`selectSession``setActiveSessionId` 再 open`rectificationSurfaceOpen` 在 open 返回前为 false;面板 key 带 `rectificationTurns.length > 0 ? "ready" : "loading"`,turns 到达即重挂;面板挂载后自拉快照;问题缺口只有裸文案。
- 修复:`/cases/open` 后用 `hydrateRectificationCase` 一次读取 turns + 快照(与 `BOOTSTRAP_PREPARE_TIMEOUT_MS` 同一 4 秒上限)再切会话、写 URL;`selectSession` 对未打开的校正会话不先切;启动时选中的校正会话在 prepare 阶段完成 hydration 再揭幕;key 只剩 session/Case 绑定,后到 turns 经渲染期 prop 调整只填空 transcript;卸载中止流与快照读取。入口卡片脚注静态「正在打开…」、侧栏行「打开中」,不转圈。缺口改为 `rectificationQuestionGapState``preparing`(时间线 live 行「正在准备下一个问题…」+ 2s 定时重拉 ≤2 次)→ `unavailable`(「没有拿到下一个问题。」+ 44px「重新加载」);hydration 超时也走同一缺口。
- 验证:`rectification-surface-contract`(一次揭幕、无重挂、prepare 阶段 hydration、静态入口反馈、缺口四态、无「等待服务端更新」);`rectification-surface-state`hydration 超时/失败、缺口纯函数、turn 解析);`rectification-agentic-entry` / `rectification-question-in-message` / `rectification-spoken-collect` 的旧锁按红线改注。
- 防复发:面板一个会话只挂载一次,turns 与快照都是 prop/state 更新;任何等待必须是时间线 live 行或带动作的状态,不得出现「等待服务端更新」类文案;揭幕后不得出现非生成中的 spinner。
- 相关记录:BUG-479(首页两阶段揭幕)、BUG-473(校正面接入共享时间线)
- 复发自:无
- 修复版本:待发布
## BUG-506 | 选择题点击后有空帧并闪下一题卡片;采用候选只有按钮变灰
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-03
- 影响面:`rectification-agentic-chat``send``submitStructuredChoice``acceptCandidate`
- 用户现象:点完选项,「正在记录本次选择…」那行消失一帧,下一题卡片闪现又消失,再出现「正在处理…」;点「采用此时间」只看到按钮变灰,页面其它部分静止好几秒。
- 触发条件:选择题 `willContinue`;采用候选。
- 根因:`willContinue` 分支删掉 thinking 行、置 `choiceContinuationPending``finally setPending(false)`,下一次 effect 才 `send("read_only")` 再追加新行;中间那一帧 `busy=false` 且快照刚装进新 `choiceCard`。采用流程不追加任何 live 行。
- 修复:`send(action, text, continuation)`continuation 复用已有 live 行并跳过 busy 守卫;选择与采用在同一个 async 链里 `await send("read_only", …, { reuseAssistantRenderKey })``busy` 全程为 true;采用点击即追加「正在采用 HH:MM…」行;`choiceContinuationPending` 与 effect 删除。
- 验证:`rectification-surface-contract`「一条 live 行贯穿」;`rectification-agentic-entry` / `rectification-answer-choice` 的旧锁按红线改注。
- 防复发:后续轮不得经 effect 中转;一条链里 `busy` 不得掉回 false。
- 相关记录:BUG-505
- 复发自:无
- 修复版本:待发布
## BUG-507 | 记录为空的已有校正会话进入后永远空白
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-03
- 影响面:`rectification-agentic-chat``rectification-surface-state`
- 用户现象:某个开场当时失败/未持久化的校正会话,从侧栏再进来什么都不显示,composer 可用但不知道先说什么。
- 触发条件:`initialTurns=[]` 且服务端对 resumed case 一律 `should_start_opening=false`
- 根因:面板只在 `shouldStartOpening` 时自动开场,空 turns 无任何 CTA。
- 修复:`rectificationConversationState``empty` → 「这段校正还没有开始。」+「开始提问」(`send("opening")``openingStarted` 守卫;服务端幂等抑制重复 opening,不改服务端)。
- 验证:`rectification-surface-state` 会话态纯函数;`rectification-surface-contract` 空态源码锁。
- 防复发:无 turns 且不自动开场时必须给起点。
- 相关记录:BUG-505
- 复发自:无
- 修复版本:待发布
## BUG-508 | 选择题选中无确认感、记录中只有沙漏光标
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-03
- 影响面:`rectification-choice-card`
- 用户现象:点了选项只看到底色变化,卡里没有进度,不知道有没有点上。
- 触发条件:任何选择题点击。
- 根因:`is-pending` 只改 `cursor: wait`;选中项无对勾。
- 修复:选中项加 `Check` + 「已选择」;pending 时卡顶一行 `InlineSpinner` + shimmer「正在记录…」(与时间线 live 行同形)。`35688015` 已把选中态收进按钮、`d9404976` 已内嵌进消息,本轮只补差额;用户选择的回显由内嵌卡的 `answer_option` 承担(刷新前后一致),不再另加用户气泡。
- 验证:`rectification-surface-contract`
- 防复发:卡内等待只能是时间线 live 行同形。
- 相关记录:BUG-506
- 复发自:无
- 修复版本:待发布
## BUG-509 | 校正盘面首态是一整块空面板
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-03
- 影响面:`rectification-board``rectification-board-model``page.tsx``globals.css`
- 用户现象:桌面端右侧 18–22.5rem 的面板第一阶段只有一句「补充经历后…」,移动端 peek 同样;用户明明填过出生时间。
- 触发条件:`candidateResult` 为空。
- 根因:首态不用 profile 的填报时间。
- 修复:`declaredTime``page.tsx` 从 profile 派生(`reportedTime || time`,须为 `H:MM`)传入;头部时钟位显示填报时间,正文「填报出生时间 HH:MM」+「回答几个问题后…」;peek「填报 HH:MM」;`is-board-empty` 收窄到 `minmax(16rem, 18rem)`。快照 API 不提供填报时间的宫位表,不造数据。
- 验证:`rectification-surface-state` 板文案纯函数;`rectification-surface-contract`
- 防复发:首态必须显示已知的填报时间;不得为填报时间伪造宫位表。
- 相关记录:BUG-505
- 复发自:无
- 修复版本:待发布