Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017eEAG8HD3mm8gsKXgk8uU8
6.3 KiB
6.3 KiB
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),验收未另跑。