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