Files
Jyotisha/docs/tasks/PROGRESS-rectification-in-chat-step1-20261006.md
T
Jesse_ChenandClaude Opus 5.5 11333460fa
Independent Staging Quality Gate / validate (push) Successful in 12m39s
Independent Staging Quality Gate / publish (push) Successful in 3m33s
docs(tasks): Claude acceptance of rectification-in-chat step 1; note one missing three-column comment
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
2026-10-07 13:05:04 +08:00

6.3 KiB
Raw Blame History

PROGRESS:生时校正并入对话 · 第一步 — 2026-10-07

产品 2026-10-07 要求直接执行。实现:Claude fork 子代理;分支 codex/rectification-in-chat-step1-20261006(基线 origin/staging 328f919d,代码同 6ec8efd5)。未推送。BUG-1247~1251 均为 fixed-pending-verify。

实现(按任务书)

项 做法
T1 / P3 / C1 删首页「生时校正」pill、rectificationEntryHint、rectificationEntryLabels / resolveRectificationEntryAction;删 isRectificationHandoffQuestion 与发送路径里的交接分支、pendingConsultationQuestion 展示与传参。page.tsx 1357 → 1337 行,useState / useRef 数不变;新增一个 onStartRectification 动作
T2 / C2 / C3 RECTIFICATION_OFFER_RULE 只定义在 consultation-thinking-plan.ts,进首轮、追问与申报时段指令。工具 offer-birth-time-rectification(本命与申报时段两种 agent 都有):只记录本轮提议;能否出卡由服务端 decideRectificationOffer 决定(本人、产品开关、无进行中 case、feature_pricing 价格);会话里已提议过且非用户主动要求时拒绝。提议随回答经 complete_consultation_response 存进 messages,run.completed 事件带给浏览器
T3 / C4 打开接口带 sourceSessionId 时把该会话最新一张提议卡绑定到 case;GET /api/rectification/cases/[caseId]/source 在本人最近 20 条咨询里找来源;与校正水合并行读取
T4 / C5 / C6 / C8 POST …/source 由服务端读 accepted_time 判断是否改了时间,追加一次分隔消息、提议卡标 returned;浏览器重读来源会话并切过去。校正面「回到刚才的对话」按钮;verified_idle 或 case 终态时,本视图内做过操作的 case 2.5 s 后自动返回(历史打开的不跳)。分隔线、「按校正前的时间」小字、「按新时间重新看」(走普通 onFollowUp,点了才发)。C8 文案在 BUG-1258 已改为「之后的对话都按这个时间来看」,本单保持
T5 / C7 模型历史跳过分隔消息;改时间前的助手回答与早于改时间的会话摘要前缀「(以下回答按校正前的出生时间,不要沿用其中的盘面判断)」
T6 DESIGN.md、VOICE.md、CONTEXT.md(来源对话、提议卡)、CHANGELOG、BUG-1247~1251、本记录、真机清单 docs/testing/rectification-in-chat-step1-20261006.md

数据库:不改表、不加迁移。关联存在咨询会话自己的 messages JSON 里(rectificationOffer / rectificationReturn),写入用调用者自己的客户端(messages 是本人可更新列,20260715030000 起即有授权)。

偏离与原因

  • 任务书 C4 说「刷新后仍在(服务端存)」:来源不单独存,读时在本人最近 20 条咨询里找绑定了该 case 的提议卡(绑定会写该会话,所以它在最近更新里)。代价:若用户之后在 20 条以上别的对话里聊过,再打开这次校正时找不到来源(只是没有返回按钮,不报错)。
  • 来源对话的消息改写是读后整写,没有乐观锁:本地 Postgres 兼容层取回的 updated_at 精度不一定能做等值比较。并发风险只在用户同时在来源对话里提问时出现(此时人在校正面)。
  • 提议工具成功后的说明,经模型实测改为「正文最后一段必须有一句提到卡片」(原写法 2/2 没提,改后 3/3 提到)。
  • 首页卡片专用的 RECTIFICATION_OPENING_LABEL 一并删除(侧栏行的打开中文案是另一个常量,不变)。

验证(Linux + Node 22.14)

项 基线 6ec8efd5 本分支
tsc --noEmit — 0 错
npm run lint 0 error / 126 warning 0 error / 125 warning
npm test 4973 项 / fail 24 4987 项 / fail 24;失败名单逐条一致(均为无 Docker 的数据库 / 部署类);测试名逐条比对,无消失,新增 14 条
next build / ○ Static,首屏 gzip 567,201 B / ○ Static,568,343 B(+0.20%)
Python 快速门 — py_compile / JSON / 审计 / pytest(329.7 s)通过;其中 npm test 一步因上述 24 条环境失败而红,与基线相同

断言改动 14 个前端测试文件 + tests/test_daily_and_rectification_entrypoints.py,每处写原值 / 新值 / 原因。

模型实测(DeepSeek deepseek-flash,公开名人 golden 盘,脚本在会话临时目录、不入库):只是不认同解释 2/2 不调用提议工具;「过去的事对不上 + 时间是估的」2/2 调用;家人档案 2/2 调用后被服务端拒、一句话说明;已提议后再说不准 2/2 被拒且不再推;成功后正文提到卡片 3/3。

环境缺口

  • 无 Docker:来源绑定 / 返回的真实库读写(chat_sessions.messages 读改写、maybeSingle、order + limit)未真查;只用了本地 Postgres 兼容层已实现的写法。部署后按真机清单第 4–8 步验。
  • 无登录态浏览器:卡片、返回、自动返回、按钮不点不发均为渲染与源码合同测试,真机清单 11 步待产品。

Claude 独立验收(2026-10-07)

项 结果
tsc / lint 0 错 / 0 error(125 warning)
npm test 4987 项 fail 24,失败名单与 6ec8efd5 逐条一致
build / ○ Static;首屏 gzip 567,201 → 568,343 B(+0.20%)
Python test_daily_and_rectification_entrypoints.py、隐私标记通过
page.tsx 1357 → 1337 行,未增长
数据库写权限 复核迁移:authenticated 有 update (title, theme, messages, updated_at)(20260715030000),本地 Postgres 兼容层 set local role authenticated 后直接 update public.chat_sessions,写来源对话消息可行;agentic_rectification_chat_sessions_case_guard 只在改 agentic_rectification_case_id 时触发,不拦
断言三栏 抽查 16 个改动文件;consultation-workflow-contract.test.ts 漏写,验收时补上

接受的风险(不阻塞上线,第二步一并处理):来源靠扫描本人最近 20 条咨询找提议卡;来源对话消息读改写无乐观锁(用户校正时同时在来源对话发问才会冲突);C2 判断的模型证据来自实现方的 DeepSeek 实测(4 场景各 2 次 + 卡片提示 3/3),验收未另跑。