fix(rectification): simplify delivery card and guard double turns (BUG-595, BUG-596)
Independent Staging Quality Gate / validate (push) Successful in 25m9s
Independent Staging Quality Gate / publish (push) Successful in 37m19s

Make the range card row-select, drop the composer 先这样 control and adopt status bar, keep delivery copy to three sentences with a folded verification report, and skip a second no-message agent run after a terminal delivery turn.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-08 19:56:48 +08:00
parent 6368ebba0f
commit 7e3b6cdc7a
60 changed files with 1561 additions and 1105 deletions
+32
View File
@@ -9222,3 +9222,35 @@
- 复发自:BUG-587(任务书决策 2 定错;重放定义已在,结论层把新分钟放生)
- 修复版本:待发布(`codex/rectification-new-minute-inherit-20260908`
## BUG-595 | 交付面四个按钮、输入框「先这样」和采用状态条把界面撑乱
- 状态:resolved
- 首次发现:2026-09-08
- 最近更新:2026-09-08
- 影响面:`rectification-range-delivery.tsx``rectification-agentic-chat.tsx``user-copy.ts``divergence-panel.ts`、Skill 10.0.17
- 用户现象:区间卡下面四个动作(分歧两列、「都不像」「说不好」、「按这个范围用」「再补一件经历」);输入框上方一直挂「先这样,先看当前范围」;采用后另有一条状态条。交付正文是长篇八法 markdown,表格在气泡里摊成纯文本。
- 触发条件:访谈收口出区间交付卡;采用代表性分钟。
- 根因:`TASK-rectification-range-delivery-card-20260907.md` 把交付对象做成「两个动作 + 分歧面板」,DESIGN 又在口述采集上方放先这样。产品决定推翻该设计。
- 修复:卡片改为按候选分钟逐行点选采用。删分歧列、四个按钮、composer「先这样」、composer-meta、采用状态条。交付正文三句;八法报告进默认收起的「查看验证报告」。没有核对题时 `postAdoptVerifyDone` 改成「已采用 HH:MM,新建对话即按这个时间排盘。」Skill 10.0.17。
- 验证:`frontend/tests/rectification-range-delivery-20260907.test.ts` 行选 DOM`frontend/tests/rectification-delivery-ui-simplify-20260908.test.ts` 三句旁白、折叠块、composer-wrap 无先这样/状态条。任务书 TS 切片 1039/1039。
- 防复发:交付卡 `button` 数必须等于候选行数;composer-wrap 不得再出现 `CHOICE_STOP_LABEL``rectification-adopt-status`
- 相关记录:BUG-544、BUG-545、BUG-558、BUG-583
- 复发自:无
- 修复版本:待发布(`codex/rectification-delivery-ui-simplify-20260908`
## BUG-596 | 交付轮连续写出两条助手消息
- 状态:mitigated(触发链仍 `investigating`
- 首次发现:2026-09-08
- 最近更新:2026-09-08
- 影响面:`persistNextInterviewIfIdle``persistExhaustionGateTurn``runV9AgentTurn``finalizeSuccessfulTurnExit`、客户端 `send("opening")``regenerate`
- 用户现象:职业答完后出现两条助手消息。第一条已写摘要;第二条又把完整八法报告写一遍。中间没有用户输入。
- 触发条件:出牌/穷尽路径 `persistNextInterviewIfIdle` 返回 `terminalNote` 后,同一 Case 在无用户消息时再跑一轮 agent。
- 根因:未知。已在四条路上打 `rectification_delivery_turn` 日志。`runV9AgentTurn``latestResult.resultId` 未变的 60 秒窗口内,对无用户消息的第二次运行返回 `already_delivered`,不计费、不写 turn。agent-run 与 turn-exit 对齐:已有 `askedTurnId` 时不再 `persistExhaustionGateTurn`
- 修复:日志 + `already_delivered` 守卫。
- 验证:`frontend/tests/rectification-delivery-ui-simplify-20260908.test.ts` mock 两次连续无消息运行,第二次 `already_delivered`。任务书 TS 切片 1039/1039。
- 防复发:交付后无用户消息不得再开一轮计费 turn。
- 相关记录:BUG-462、BUG-565
- 复发自:无
- 修复版本:待发布(`codex/rectification-delivery-ui-simplify-20260908`
@@ -0,0 +1,51 @@
# PROGRESS · 生时校正交付面精简(2026-09-08)
工作树:`.worktrees/rectification-delivery-ui-simplify-20260908`
分支:`codex/rectification-delivery-ui-simplify-20260908`
任务书:`docs/tasks/TASK-rectification-delivery-ui-simplify-20260908.md`
基线:`origin/staging` @ `6368ebba`
本单状态:**待验收**。代码在执行分支,尚未 push。
未改:采用 RPC、确认门、各道门槛、`page.tsx`。Skill 从 10.0.16 升到 **10.0.17**
## 做了什么
- **决策 1** 区间卡改成按候选分钟逐行点选。代表分钟第一、标「排盘用」,右侧只写与代表分钟不同的 D9/D10。删分歧两列、「都不像」「说不好」「按这个范围用」「再补一件经历」。
- **决策 2** 输入框上方不再有「先这样」。停止只留选择题卡和生成中「停止回答」。删 `rectification-composer-meta`
- **决策 3** 删采用状态条。没有核对题时旁白改为「已采用 HH:MM,新建对话即按这个时间排盘。」
- **决策 4** 交付正文三句。八法报告在默认收起的「查看验证报告」。Skill 10.0.17。
- **决策 5** 四条路打 `rectification_delivery_turn` 日志;同一 Case 同一 `resultId` 60 秒内第二次无用户消息 agent 运行返回 `already_delivered`。有 `askedTurnId` 时不再 `persistExhaustionGateTurn`
## 三栏(被触碰断言)
| 用例 | 原值 | 新值 | 理由 |
| --- | --- | --- | --- |
| 交付卡按钮 | 「按这个范围用 / 再补一件经历」+ 分歧列 | `button` 数 = 候选行数,点行 `onAccept` | BUG-595 决策 1 |
| composer-wrap | `CHOICE_STOP_LABEL` + composer-meta | 无先这样、无 composer-meta | BUG-595 决策 2 |
| 采用后状态条 | `rectification-adopt-status` + 改选 | 行内已采用;无状态条 | BUG-595 决策 3 |
| 无核对题旁白 | `postAdoptVerifyDone` 原句 | `已采用 HH:MM,新建对话即按这个时间排盘。` | BUG-595 决策 3 |
| 交付正文 | 八法报告进气泡 | 三句;报告在折叠块 | BUG-595 决策 4 |
| Skill | 10.0.16 | 10.0.17 | 任务书 |
| 连续无消息 agent | 第二条仍计费写 turn | `already_delivered` | BUG-596 |
| 跳过最后一道核对题 | remaining=0 误走短句 | 有过 reverse_verify 焦点则保留原 `postAdoptVerifyDone` | BUG-595 决策 3 |
## 测试
- `frontend` `./node_modules/.bin/tsc --noEmit`exit 0
- `npm run lint`0 errors / 106 warnings(仓库基线 warning,无新 error
- 任务书指定 TS 切片:1039 tests / 1039 pass / 0 fail
- 新文件 `frontend/tests/rectification-delivery-ui-simplify-20260908.test.ts`
- `next build`Turbopack 默认):worktree `frontend/node_modules` 是指向主仓的 symlinkTurbopack 报 `points out of the filesystem root`。用 `next build --webpack` 代替:`/` 仍是 `○` Static。Next 16.3 webpack 输出不再打印 First Load gzip。
- Docker `database-rectification-*.test.ts`:本机未跑,记 blocked
- 浏览器真人走查:无登录态,见 `docs/testing/rectification-scenarios-20260907.md` §5
Skill 10.0.17 SHA256`f77b06de392feaa7c23e64beb05a90bcc0734db73747eb7915cba338b8eff1e6`。live 树与 `versions/10.0.17` 字节一致。
## 偏离
1. BUG-596 触发链仍 investigating;守卫按任务书落地,日志已加。
2. 本机主仓停在 `codex/minute-rectification-p0` 且有脏文件,未 checkout/reset。本单在独立 worktree 基于 `origin/staging` 做。
3. 预检系统 Python 缺 swisseph/pytest;项目 `.venv` 预检 `pass_with_remote_blocked`。不把预检失败写成云端未同步。
4. `.venv` 是指向主仓的 symlink,不提交。
5. 默认 `next build`Turbopack)在 worktree symlink `node_modules` 上失败;验收数字来自 `next build --webpack`
+1 -1
View File
@@ -79,7 +79,7 @@
| `TASK-rectification-same-year-probe-dedupe-20260908.md` | `PROGRESS-rectification-same-year-probe-dedupe-20260908.md` | 答完「2023 年 5 月前后」又问「2023 年前后」(BUG-559 复发):点选不重跑引擎,同一份 probes 里同域同年两题并存;TS 侧 `existenceProbeAsked` 只降权不排除,`inspectDiscriminatorProbes` 连领域+年份规则都没有。决策:同域同年硬排除、相邻年维持降权 | 已验收通过(真实环境未再出同年题) | `8ae17a26`BUG-592 |
| `TASK-rectification-delivery-report-facts-20260908.md` | `PROGRESS-rectification-delivery-report-facts-20260908.md` | 交付轮验证报告写「宽度 29 分钟」「主限偏向 05:06 / 分盘大运偏向 04:59」「04:53 D10 升狮子座」,与卡片(04:51–04:53)矛盾:`skill_verification_report` 用引擎推断前的 width / dasha_agreement,分盘星座让模型自算 | 已验收通过(Skill 10.0.16 | `06e44104`BUG-593 |
| `TASK-rectification-new-minute-inherit-20260908.md` | `PROGRESS-rectification-new-minute-inherit-20260908.md` | 5 题答完范围 13 分钟,补迁居事件后回弹到 28 分钟:重算换入的新分钟在携带题的 supports/conflicts 里没名字,一律中性、零冲突存活(BUG-587 决策 2 定错,本单推翻:按分盘星座 / 连续分钟段推结论);batch 内重算不触发 BUG-588 范围句 | 已验收通过(真实环境范围不再回弹) | `be711043`BUG-594 |
| `TASK-rectification-delivery-ui-simplify-20260908.md` | `PROGRESS-rectification-delivery-ui-simplify-20260908.md` | 产品决定:时间卡按候选分钟逐行直接点选采用(删分歧两列 + 都不像/说不好/按这个范围用/再补一件经历)、删输入框上方「先这样」按钮、删采用后状态条、交付正文收成三句 + 八法报告折叠块(Skill 10.0.17)、交付轮两条助手消息守卫(investigating | 待执行 | `codex/rectification-delivery-ui-simplify-20260908`BUG-595596 |
| `TASK-rectification-delivery-ui-simplify-20260908.md` | `PROGRESS-rectification-delivery-ui-simplify-20260908.md` | 产品决定:时间卡按候选分钟逐行直接点选采用(删分歧两列 + 都不像/说不好/按这个范围用/再补一件经历)、删输入框上方「先这样」按钮、删采用后状态条、交付正文收成三句 + 八法报告折叠块(Skill 10.0.17)、交付轮两条助手消息守卫(investigating | 待验收 | `codex/rectification-delivery-ui-simplify-20260908`BUG-595596 |
| `TASK-api-not-configured-mislabel-20260904.md` | `PROGRESS-api-not-configured-mislabel-20260904.md` | 16 处路由把数据库瞬断(部署切换窗口)兜底翻译成 503「服务尚未配置」;改为仅配置错误用该文案,其余 `service_unavailable`,收敛为共享 helper | 已验收 | `5483649b`(BUG-542);2 条子进程测试留 CI Node 22 复核 |
| `TASK-rectification-ux-20260902.md` | `PROGRESS-rectification-ux-20260903.md` | 会话面空白假死与交互摩擦 | 已验收 | `d159f08e`(09-03 在新基线重做后合入,BUG-505509 |
@@ -84,11 +84,12 @@
期望:
- 交付轮只见一张卡:范围、代表分钟、稳定/敏感主题、边界句
- 若有分歧面板,每列只有 1~3 行,且都是没问过的 D9 / D10 / 月宿层
- 不见「相对支持度」「当前推荐」「采用此时间」
- 点「按这个范围用」成功,设置页出生时间状态变为已采用
- 点「再补一件经历」卡片收起,输入框上方出现「第 1 步·收集经历」和「请继续说下一件…」,服务端范围不变
- 交付轮只见一张卡:范围、对照了 N 件经历、每个候选分钟一行(代表分钟第一、标「排盘用」)、底部边界句
- 点一行即采用;已采用行显示「已采用」,其它行仍可点改选
- 卡片下方「查看验证报告」默认收起,打开后是真正的表格
- 助手正文只有三句(范围与代表分钟、经历与吻合率、边界句),不含「方法1」或 Technique Audit
- 不见「相对支持度」「当前推荐」「采用此时间」「按这个范围用」「再补一件经历」「都不像」「说不好」
- 输入框上方没有「先这样,先看当前范围」,也没有采用后状态条
## 6. 七领域问完后下一问必须是职业题或直接出区间卡
@@ -148,7 +149,8 @@
期望:
- 助手正文里的不可分宽度等于卡片范围(含两端分钟数),不是引擎刚算出来的半小时跨度
- 助手正文只有三句,不含八法表格
- 折叠块「查看验证报告」里的不可分宽度等于卡片范围(含两端分钟数),不是引擎刚算出来的半小时跨度
- 双轨若写出偏向分钟,必须落在卡片范围内,不得点名已经被答题淘汰的分钟
-正文写某候选的 D9 / D10 上升,必须与卡片/报告表 `sign_by_candidate` 一致,不得按换升时刻自行推算成下一座
-报告写某候选的 D9 / D10 上升,必须与 `sign_by_candidate` 一致,不得按换升时刻自行推算成下一座