fix(rectification): three-column candidate compare card (BUG-597, BUG-598)
Independent Staging Quality Gate / validate (push) Successful in 14m8s
Independent Staging Quality Gate / publish (push) Successful in 10m21s

Replace the minute-row delivery card with up to three compare columns so users can pick the time that fits, and apply the adult-year floor on inspect fallbacks.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-09 00:12:20 +08:00
co-authored by Cursor
parent a9125e3d3b
commit a43a6db884
51 changed files with 1458 additions and 259 deletions
+36 -4
View File
@@ -9233,10 +9233,10 @@
- 根因:`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
- 防复发:composer-wrap 不得再出现 `CHOICE_STOP_LABEL``rectification-adopt-status`逐行点选卡已被 BUG-597 的三列对照取代,不得把「一行一个分钟」或「排盘用」标签加回去。
- 相关记录:BUG-544、BUG-545、BUG-558、BUG-583、BUG-597
- 复发自:无
- 修复版本:待发布(`codex/rectification-delivery-ui-simplify-20260908`
- 修复版本:`7e3b6cdc`
## BUG-596 | 交付轮连续写出两条助手消息
@@ -9252,5 +9252,37 @@
- 防复发:交付后无用户消息不得再开一轮计费 turn。
- 相关记录:BUG-462、BUG-565
- 复发自:无
- 修复版本:待发布(`codex/rectification-delivery-ui-simplify-20260908`
- 修复版本:`7e3b6cdc`
## BUG-597 | 交付卡逐行点选看不出候选差别,又像直接给了一个时间
- 状态:resolved
- 首次发现:2026-09-08
- 最近更新:2026-09-08
- 影响面:`rectification-range-delivery.tsx``divergence-panel.ts``refinement_packet.py``event_probes.py``user-copy.ts`、Skill 10.0.18
- 用户现象:区间卡每个候选分钟一行。与代表分钟 D9/D10 相同的行右侧是空的;代表分钟预先标成「排盘用」,用户觉得是直接出一个时间,而不是在几个分钟里对照后选择。
- 触发条件:访谈收口出区间交付卡;范围内有两个以上候选分钟。
- 根因:BUG-595 把交付做成「点一行即采用」,右侧只写与代表分钟的分盘差异。产品决定改成并排对照:每列写该分钟自己的相对可能性、性格处事、经历吻合和未来一年窗口。
- 修复:卡片改成一行至多三列,按后验概率排序、按精确 HH:MM 去重。每列由服务端写相对可能性、D9/D10/月宿性格处事、经历强/中/弱计数与最不吻合一件(年-月+领域)、往后 12 个月 1–2 个窗或固定句「未来一年没有明显的窗口」。按钮「更像这个」走现有 accept RPC,选择不计分。同一次 compare 增加 `event_dasha_ledger_by_time``prospective_windows_by_time`。不预标「排盘用」。Skill 只改 `references/candidate-comparison.md`bump 10.0.18。
- 验证:`frontend/tests/rectification-range-delivery-20260907.test.ts` 三列 DOM、「更像这个」、无「排盘用」;`frontend/tests/rectification-delivery-ui-simplify-20260908.test.ts` 三句旁白仍不含「排盘用」;`frontend/tests/agent-voice-copy-contract.test.ts` 锁新文案;`tests/test_rectification_v5_services.py::test_compare_returns_ledger_and_windows_by_candidate_time` 三分钟各一份 ledger/窗口。
- 防复发:交付卡必须是列对照而不是逐行空差异;列文案必须来自服务端类型表与 ledger/窗口映射,不得让模型写。超过三列时必须出现「还有 N 个分钟可能性更低,已并入范围」。没有窗口时必须写固定句,不得空白。
- 相关记录:BUG-595、BUG-583、BUG-568
- 复发自:BUG-595(逐行卡上线后用户看不出为何要选另一分钟)
- 修复版本:待发布
## BUG-598 | 点选题成年下限只在 followup 生效,inspect 回退会漏掉
- 状态:resolved
- 首次发现:2026-09-08
- 最近更新:2026-09-08
- 影响面:`inspectDiscriminatorProbes``adult-floor.ts``decideAfterInferenceChange``answer-choice.ts`
- 用户现象:已经按年龄下限滤掉的迁居等点选题,在答完上一题后的 inspect 回退路径里又出现。
- 触发条件:`decideAfterInferenceChange``matched ?? inspected.selected``method-followup` 已按 `DOMAIN_AGE_LO` 过滤,但 inspect 没有出生日期。
- 根因:`probeBelowAdultFloor` 只在 `method-followup.ts` 三处生效。`inspectDiscriminatorProbes` 不接收 `birthDate`,回退选中的探针可以低于成年下限。
- 修复:抽出共享 `adult-floor.ts``inspectDiscriminatorProbes` 接收 `birthDate`,低于下限写入 `dropped_probes(reason="below_adult_floor")``decideAfterInferenceChange` 与答题持久化从出生快照传入该日期。采集题「没有」按钮本单不做,等产品决定。
- 验证:`frontend/tests/rectification-candidate-contrast-packet.test.ts`:出生日期 2000-01-01 时 2015 迁居题被丢掉;1996-01-01 时保留。按年份计算:2015 低于下限当且仅当出生年 > 19971997 年生在 2015 年满 18 岁,不越线。
- 防复发:inspect 与 followup 必须共用同一套成年下限。点选回退不得在没有 `birthDate` 时把已过滤的领域年再选出来。
- 相关记录:BUG-597
- 复发自:无
- 修复版本:待发布
@@ -0,0 +1,56 @@
# PROGRESS · 生时校正交付卡三列对照(2026-09-08)
工作树:`.worktrees/rectification-candidate-compare-columns-20260908`
分支:`codex/rectification-candidate-compare-columns-20260908`
任务书:`docs/tasks/TASK-rectification-candidate-compare-columns-20260908.md`
基线:`origin/staging` @ `a9125e3d`(任务书已在该提交)
本单状态:**待验收**。代码在执行分支,尚未 commit / push。
未改:采用 RPC、确认门、各道门槛、`minute_step``_relative_support``page.tsx`。Skill 从 10.0.17 升到 **10.0.18**(只改 `references/candidate-comparison.md` 的卡片描述)。采集题「没有」按钮未做,等产品答复。
主仓仍停在 `codex/minute-rectification-p0` 且有脏文件,未 checkout / reset。本单在独立 worktree 基于 `origin/staging` 做。
## 做了什么
- **决策 1** 区间卡改成一行至多三列。按 `inference_state.candidates` 后验概率排序,精确 HH:MM 去重,最多三列。超过三列末尾写「还有 N 个分钟可能性更低,已并入范围」。不预标「排盘用」。
- **决策 2** 每列五段全由服务端算好:时间 + 相对可能性;D9/D10 类型表全文 + 月宿边界 traits;经历强/中/弱计数与最不吻合一件(年-月+领域,不写摘要);往后 12 个月 1–2 窗或「未来一年没有明显的窗口」;「更像这个」走现有 accept RPC,选择不计分。
- **决策 3** 卡底边界句与收起的「查看验证报告」保留。交付正文仍三句,不再写代表分钟「排盘用」。
- **决策 4** compare 同一次返回 `event_dasha_ledger_by_time``prospective_windows_by_time`(HH:MM 键,≤3 分钟),与代表分钟 ledger 并存;耗时写入 `column_compare_ms`
- **BUG-598** `inspectDiscriminatorProbes` 接收 `birthDate`,与 followup 共用 `adult-floor.ts`。inspect 回退不再漏过成年下限。
- **P2「没有」按钮** 跳过,等产品。
## 三栏(被触碰断言)
| 用例 | 原值 | 新值 | 理由 |
| --- | --- | --- | --- |
| 交付卡形态 | 每个候选分钟一行,点行采用 | 至多三列,「更像这个」采用 | BUG-597 决策 1 |
| 「排盘用」 | 代表分钟预标 | 不预标 | BUG-597 决策 1 |
| 列文案 | 只写与代表分钟不同的 D9/D10 | 三列写全 D9/D10/月宿 + 经历计数 + 未来窗 | BUG-597 决策 2 |
| 引擎 compare | 只有代表分钟 ledger | 另有 by_time ledger 与 windows | BUG-597 决策 4 |
| Skill | 10.0.17 | 10.0.18 | 任务书 |
| inspect 成年下限 | 仅 followup 过滤 | inspect 同样 `below_adult_floor` | BUG-598 |
| 采集「没有」按钮 | 无 | 仍无 | 等产品 |
## 测试
- `frontend` `./node_modules/.bin/tsc --noEmit`exit 0
- `npm run lint`0 errors / 108 warnings(仓库基线 warning,无新 error
- 任务书指定 TS 切片:1040 tests / 1040 pass / 0 fail
- `tests/test_rectification_v5_services.py`35 passed
- Docker `database-rectification-*.test.ts`:本机未跑,记 blocked
- 浏览器真人走查:无登录态,记 blocked
Skill 10.0.18 SHA256`ad209a7824d7eb65f35efd7d6245e9a3752a8b32972de0fbafb751691e86a1ad`。live `SKILL.md` + `references/``versions/10.0.18` 字节一致。
## 偏离
1. **不按 `cluster_range` 合并不同分钟。** 任务书写「同簇合并取代表」。04:53 与 04:59 若同簇会被合成一列,正好把本单要对照的差别藏掉。实现按精确 HH:MM 去重。
2. 引擎 `column_times``candidate_decisions` 前 3 个唯一分钟(引擎分序)并保证代表分钟在列里。卡片列按后验排序。后验前三若与引擎前三不一致,缺的分钟回退代表 ledger / 空窗口句。
3. `prospective_windows_for_time` 用该分钟月曜起的未来 12 个月 Vimshottari 起始月,领域目前标 `career`;没有 static context / 月曜则空列表,卡片写固定句。
4. 采集题「没有」按钮未做。
5. BUG-598 真实 Case 出生年:本工作树没有该 Case 档案,不能用出生资料核对。按年份公式:2015 年迁居题越线当且仅当出生年 > 1997。≤1997 年生在 2015 年已满 18 岁,不越线。
6. 本机主仓停在 `codex/minute-rectification-p0` 且有脏文件,未动。
7. 预检系统 Python 缺 swisseph/pytest;不把预检失败写成云端未同步。
8. `.venv``frontend/node_modules` 是指向主仓的 symlink,不提交。
9. 浏览器真人走查:本会话无登录态,记 blocked。见 `docs/testing/rectification-scenarios-20260907.md` §5。
+1 -1
View File
@@ -80,7 +80,7 @@
| `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) | 已验收通过(逐行卡随后被三列方案取代) | `7e3b6cdc`BUG-595596Skill 10.0.17 |
| `TASK-rectification-candidate-compare-columns-20260908.md` | `PROGRESS-rectification-candidate-compare-columns-20260908.md` | 产品决定交付卡改一行三列:每列相对可能性、D9/D10/月宿性格处事、经历对照计数、往后 12 个月事件窗、「更像这个」即采用;引擎按候选分钟各算 ledger 与窗口;顺带 BUG-598 点选题成年下限在 inspect 回退路径缺失(需核对)、采集题「没有」按钮(产品可否决);Skill 10.0.18 | 待执行 | `codex/rectification-candidate-compare-columns-20260908`BUG-597598 |
| `TASK-rectification-candidate-compare-columns-20260908.md` | `PROGRESS-rectification-candidate-compare-columns-20260908.md` | 产品决定交付卡改一行三列:每列相对可能性、D9/D10/月宿性格处事、经历对照计数、往后 12 个月事件窗、「更像这个」即采用;引擎按候选分钟各算 ledger 与窗口;顺带 BUG-598 点选题成年下限在 inspect 回退路径缺失(需核对)、采集题「没有」按钮(产品可否决);Skill 10.0.18 | 待验收 | `codex/rectification-candidate-compare-columns-20260908`BUG-597598 |
| `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,10 +84,10 @@
期望:
- 交付轮只见一张卡:范围、对照了 N 件经历、每个候选分钟一行(代表分钟第一、标「排盘用」)、底部边界句
-一行即采用;已采用显示「已采用」,其它仍可点改选
- 交付轮只见一张卡:范围、对照了 N 件经历、至多三列并排(相对可能性、性格处事、经历对照、往后 12 个月、「更像这个」)、底部边界句
-「更像这个」即采用;已采用列按钮显示「已采用」,其它仍可点改选
- 卡片下方「查看验证报告」默认收起,打开后是真正的表格
- 助手正文只有三句(范围与代表分钟、经历与吻合率、边界句),不含「方法1」或 Technique Audit
- 助手正文只有三句(范围、经历与吻合率、边界句),不含「排盘用」「方法1」或 Technique Audit
- 不见「相对支持度」「当前推荐」「采用此时间」「按这个范围用」「再补一件经历」「都不像」「说不好」
- 输入框上方没有「先这样,先看当前范围」,也没有采用后状态条