# PROGRESS · 生时校正消息清理(2026-10-01,BUG-1135~1137) 任务书:`TASK-rectification-message-cleanup-20261001.md`。执行:Claude fork 子代理。分支 `codex/rectification-message-cleanup-20261001`,基线 `origin/staging` @ `437dcecb`。未推送。 ## 环境 Linux,Node 22.14(`/exec-daemon/node`),Python 3.13。`frontend/node_modules` 由主检出 `cp -al` 硬链(同一 lockfile;Turbopack 不接受软链),未跑 `npm ci`。无 Docker(DB 套件跳过 / 环境失败,同基线)。基线 `next build` 首次因本机内存紧张类型检查中断,单独重跑通过(`/` Static),gzip 以重跑产物为准。 ## 交付 | T | 内容 | 提交 | | --- | --- | --- | | T1 一屏一题干(BUG-1135) | GET `attachQuestionsToTurns` 与客户端 `placePersistedQuestion` 让活焦点替换「superseded 且无答案」的死焦点;挂题时复用 `stripQuestionSentences` 剥正文题干;死题 / 被替换的未答题在消息上不画任何东西(当前焦点 busy / 只读时保留题干);Case 另有活题时死题不再判 unavailable;复制文本跳过死题 | `9ec908d3` | | T3 结算后无回执(BUG-1137) | 校正消息结算后 `timeline=[]`、无分盘说明句;写作中照旧;普通对话不变 | `6e11a8f0` | | T2 复述变短(BUG-1136) | 批次有入账条目时证据轮正文 = 服务器复述(≤2 件列出,>2 件「记下了 N 件事。」);快照每条助手回复带 `recorded_evidence`(证据账本,排除 rejected / superseded);>2 件时消息内 `
` 收起清单;两套 Agent 提示删逐条复述;中文日期标签直接接事件 | `b8dac9c1` | | T4 记录 | BUG-1135~1137、BUG-917 修订注、CHANGELOG、DESIGN、VOICE、真机清单、本进度、README | 本提交 | ## 复现与修复证据 - 形状 B(同题重新出题):`C · a superseded focus with the same stem on the latest message…`、`C · client guard: a message still carrying a dead focus…`——修复前 0 个可点选项(死题只剩题干 + 「没有拿到下一个问题」),修复后题干 1 次、4 个可点选项。 - 形状 A(正文残留题干):`C · a stem left in the body of the message that receives the persisted question shows once`——修复前题干 2 次,修复后 1 次。 - T3:`a settled rectification reply renders no step receipt` 在改动前红(临时回退组件验证),改后绿。 - 「1.」来源:步骤列表是 `
    `,收起后仍在 DOM;按纯文本复制时浏览器为有序列表项补序号(屏幕上 `list-style: none` 不显示)。**推断,未在浏览器复现**;回执结算后不再渲染,该来源消失。 ## T2 一次 12 件的结果 服务端:12 条入账 → 正文与落库都是「记下了 12 件事。」(`rectification-v9-agent.test.ts` 新测试)。前端:正文一行,其下收起的「看记下的 12 件」,展开 12 个 `
  1. `(如「2000年虚构事件1」),默认不展开;2 件时正文直接列出、无清单。 ## 既有断言改动(原值 / 新值 / 原因) | 文件 | 原值 | 新值 | 原因 | | --- | --- | --- | --- | | `rectification-timeline-adapter.test.ts` | `/timeline: rectificationTimelineRows/` | `/timeline: settled \? \[\] : rectificationTimelineRows/` | BUG-1137 结算后不派生步骤 | | `rectification-opening-plain-20260926.test.tsx` | turn 以「已完成 2 步」开头;两条步骤名各 1 次 | turn 以开场正文开头;无「已完成」;步骤名 0 次 | BUG-1137 | | `agent-voice-copy-contract.test.ts` | `/证据轮正文只写一句复述/`、「记下了:2016 年 9 月入学、2020 年 6 月毕业」为好例 | `/证据轮的复述由服务器写/`、该句为坏例 | BUG-1136 | | `rectification-v9-agent.test.ts` | `/证据轮正文只写一句复述/`;`answerText`/落库 `/^记下了:2016 年 9 月入学、2020 年 6 月毕业。/` | `/证据轮的复述由服务器写/`;整句等于服务器复述 | BUG-1136 | | `rectification-agentic-entry.test.ts` | `/证据轮正文只写一句复述/` | `/证据轮的复述由服务器写/` | BUG-1136 | | `rectification-adopt-flow-20260902.test.ts` | `/必须先用一句话承接用户本轮给出的事实(年份\+事件)/` | `/证据轮的复述由服务器写:「记下了 N 件事」/` | BUG-1136 | | `rectification-host-fallback.test.ts` | 「2016年9月 入学、2020年6月 毕业」「2018年7月 入职」 | 无空格 | 中文日期标签直接接事件 | | `rectification-grounding-20260927.test.ts`、`rectification-unwritten-evidence.test.ts`、`rectification-v9-stream.test.ts` | 同上四处带空格 | 无空格 | 同上 | ## 门禁(基线 `437dcecb` vs 最终) | 项 | 基线 | 最终 | | --- | --- | --- | | tsc | 0 | 0 | | lint | 0 error / 126 warning | 0 error / 126 warning | | npm test | 4809 / pass 4744 / fail 24 / cancel 0 / skip 41 | 4820 / pass 4755 / fail 24 / cancel 0 / skip 41;失败清单逐名一致;基线名 0 丢失,新增 11 | | `/` | Static | Static | | 首屏 gzip | JS 555,325 / CSS 68,764 | JS 555,587(+0.05%)/ CSS 68,813(+0.07%) | | 快速门 | — | Python 1036 passed / 1 skipped / 0 failed;npm 步同 24 条环境失败 | ## 缺口 - 「1.」来源为推断,未在浏览器复现。 - 真机清单 `docs/testing/rectification-message-cleanup-20261001.md` 未执行。 - 无 Docker:本单不改库,DB 套件未跑。 - Skill 未 bump(只改系统提示与服务端文案)。 ## Claude 独立验收(2026-10-01,变基到 `origin/staging` @ `209352eb`) | 检查 | 基线 | 本分支 | | --- | --- | --- | | tsc / lint | 0 / 0 error、126 warning | 0 / 0 error、126 warning | | npm test | 4831 / fail 24 | 4842 / fail 24;失败清单逐名相同,基线名 0 丢失,新增 11 | | 按 `deploy/railway-web.Dockerfile` COPY 清单构建(ERR-113) | — | exit 0 | | `/` / 首屏 gzip | Static / JS 555,360、CSS 68,764 | Static / JS 555,622(+0.05%)、CSS 68,813(+0.07%) | | 快速门 | — | Python 1036 passed / 1 skipped / 0 failed;npm 步同 24 条环境失败 | 变基时 BUG 历史按「本分支在前」解冲突把 1135~1137 排到了 1132 之前,已手工挪回编号顺序;状态板重复行已去重。结论:通过。缺口:真机清单 `docs/testing/rectification-message-cleanup-20261001.md`。