fix(rectification): collect dated events, then distinguish with conflict probes

Empty ledgers stay in natural-language collection. After the first dated
event, dasha conflict probes reverse-infer 前事 and block offer until
answered. Unique-minute confirmation stays closed at a representative
time; adopt reverse-verifies remaining probes. Records BUG-348–351.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-08-22 10:36:12 +08:00
parent 92558ee61d
commit 9873ba420a
41 changed files with 2371 additions and 310 deletions
+64
View File
@@ -5259,3 +5259,67 @@
- 复发自:BUG-346(打开思维链通道但明确不落盘)
- 修复版本:59559d4b
## BUG-348 | 生时纠正一进场就出 A/B/C/D,比纯提问更慢
- 状态:resolved
- 首次发现:2026-08-22
- 最近更新:2026-08-22
- 影响面:staging 生时纠正开场、`method_followup_plan``rectification-choice-card`、Skill `jyotish-birth-time-rectification@10.0.11`、decision receipt `discriminating_event_probes`
- 用户现象:账本还没有任何已确认证据时,开场就出现 A/B/C/D 点选卡(学业 vs 工作)。用户点 A 之后仍没有具体年份事件,下一问又变成“2016 年前后,更像哪一件?”——A/B 是认真关系 vs 职责加重,或“时间大致对得上 vs 略偏”。比之前直接问一件带年份的经历更慢,也无法筛时间。
- 触发条件:新建或恢复空账本生时纠正会话;不确定范围约半小时,例如 04:45–05:15。有账本后候选仍分不开时继续出冲突排序卡。
- 根因:conversation-strategy 把“降低回忆负担”写成开场就从候选簇差异生成点选卡。`buildMethodFollowupPlan` 对空账本的 `dasha_events` 以及后续方法覆盖一律挂 `choice_frame`;系统提示强制把 A/B 写成两套盘前事。区分阶段用 `lifePeriodLabel()` 把别的事件年份贴到当前主题,并让用户给冲突排序,而不是收集可评分生平。评分链路已有 `_score_event`,但没有逆运算把两套代表分钟的年差/激活差写成可问题干。
- 修复:收集阶段用自然语言问一件带大概年份的经历,`choice_frame` 为 null,界面不出点选卡。候选已经分不开时,服务器生成 `discriminating_event_probes`(锁定年份和事件家族,不写死题干)。Agent 把题干和 A/B/C/D 写成自然语言;A/B 是同一件事的吻合程度。新 Case 绑定 Skill 10.0.11;已有 10.0.10 Case 保持原绑定,但服务器不再给空账本发点选框,也不再问两套盘哪个更像。
- 验证:`tests/test_rectification_event_probes.py` 锁定高考性质追问、年龄带退路、D4 激活差问搬家、大运起年只差几天不得写成新年、缺 Narayana 不得声称 dasha 年;`frontend/tests/rectification-choice-card.test.ts` 锁定空账本无卡、探针题干不含“更像哪一件”、跨主题不复用年份;`frontend/tests/rectification-eight-method.test.ts` 锁定方法覆盖用自然语言、分盘差异仍出 A/B/C/D。
- 防复发:空账本或 `collect_method_evidence` 不得挂 `choice_frame`。区分卡不得写“更像哪一件 / 两套盘 / 可能性”。年份必须来自探针或同主题账本/年龄带,禁止跨主题 `lifePeriodLabel`。不得把已哈希的 10.0.10 改包;未提交的 10.0.11 可折进同包。已有 10.0.10 Case 继续可解析。
- 相关记录:BUG-020、BUG-337
- 复发自:BUG-020(语言问答被包装成高阻力卡片;后来又把开场改成强制 A/B/C/D)
- 修复版本:待提交
## BUG-349 | 唯一分钟确认门被 holdout 吊着,会话没有收口
- 状态:resolved
- 首次发现:2026-08-22
- 最近更新:2026-08-22
- 影响面:确认门投影、`session_outcome`、采用卡文案、Skill `jyotish-birth-time-rectification@10.0.11`、decision receipt `unique_minute_path`
- 用户现象:采用代表性时间之后,界面和 Agent 仍说“还不能确认唯一分钟”,像下一步还要等 VedAstro / 公开 holdout / 宽度 ≤ 5 分钟。holdout 当前是 1/20 `not_ready`,确认门永远打不开,访谈没有终点。
- 触发条件:生时纠正已经可以出示或采用代表性时间;密封 holdout 为 `not_ready`
- 根因:确认门三层 blocker 是诚实的 fail-closed,但产品把 `confirmation_allowed=false` 写成待完成的下一步,而不是本会话的终点。`candidate_accepted` 还写着“可进入确认门”。
- 修复:不放开 `confirmation_allowed``confirmation_gate.unique_minute_path=closed_at_representative` 时,本会话以代表性时间收口;不得调用 confirm,不得把唯一分钟确认当下一步。文案从“还不能确认”改为“本会话以代表性时间收口,不确认唯一分钟”。折进未提交的 Skill 10.0.11,不改已哈希的 10.0.10。
- 验证:`frontend/tests/rectification-confirmation-gate.test.ts` 锁定 holdout `not_ready``unique_minute_path=closed_at_representative``confirmation_allowed=false``tests/test_rectification_confirmation_and.py` 锁定 14 分钟并列簇提出门开、确认门关、路径为收口。
- 防复发:不得把 `confirmation_allowed` 改成 true 来假装收口。holdout 未达标时不得把确认写成下一步。不得为把不可分区间问到 5 分钟以内而继续 A/B/C/D。
- 相关记录:BUG-303、BUG-318、BUG-348
- 复发自:BUG-318(确认门与密封 holdout 对齐后,产品仍把确认当未完成步骤)
- 修复版本:待提交
## BUG-350 | 采用代表性时间后没有按该分钟核对前事,也无法改选
- 状态:resolved
- 首次发现:2026-08-22
- 最近更新:2026-08-22
- 影响面:`method_followup_plan` 采用后路由、`next_user_action`、生时纠正候选卡、Skill `jyotish-birth-time-rectification@10.0.11`
- 用户现象:用户采用一个代表性时间后,会话直接请看盘;盘外核对也不计分、不改候选。没有用该分钟去核几件还没提过的前事,对不上也不能改选其他冲突时间。
- 触发条件:生时纠正已经采用代表性时间;decision receipt 仍有 `discriminating_event_probes`(大运年界/同年激活差或年龄带退路)。
- 根因:`buildMethodFollowupPlan({ accepted: true })` 把下一问清空,只挂不计分的 `oos_blind``buildNextUserAction` 在 adopted 后一律 `start_consultation`。候选卡又要求 `!selectedTime`,采用后改选入口消失。
- 修复:采用后最多核两件剩余探针前事(跳过已确认/已拒绝领域和 `known_event_quality`),`next_followup.method_id=reverse_verify` 且计分。A 写入账本并重算;C 关闭该问;对不上或核对结束后可改选。不打开唯一分钟确认门。折进未提交的 Skill 10.0.11。
- 验证:`frontend/tests/rectification-eight-method.test.ts` 锁定采用后 `verify_adopted_time` 与无剩余探针时 `start_consultation``frontend/tests/rectification-choice-card.test.ts` 锁定核对卡计分且不是盘外核对;`frontend/tests/rectification-agentic-entry.test.ts` 锁定有点选卡时先核前事、否则在已 offer 过的会话里显示改选。
- 防复发:采用后不得把不计分盘外核对当默认下一步。`showSelectionCards` 不得因 `selectedTime` 永久藏改选;有前事点选卡时不得同时出示时间卡。不得把 `confirmation_allowed` 改成 true。
- 相关记录:BUG-120、BUG-348、BUG-349
- 复发自:BUG-120(采用后无法改选;后来又把采用后的核对做成不计分盘外问句)
- 修复版本:待提交
## BUG-351 | 候选时间冲突时反推前事被方法轮询和出牌 defer 挡住
- 状态:resolved
- 首次发现:2026-08-22
- 最近更新:2026-08-22
- 影响面:`method_followup_plan``isOfferBlockingFollowup`、Skill `jyotish-birth-time-rectification@10.0.11`
- 用户现象:账本已有带年份经历、两套代表分钟已经分不开时,Agent 仍继续问下一条感情/事业,或直接请采用代表性时间。不会按冲突分钟反问「某年前后有没有搬家/入职」,答案也无法先筛窗。
- 触发条件:生时纠正已有至少一件可评分事件;decision receipt 含 `dasha_boundary``dasha_activation` 探针;方法覆盖尚未齐,或 `propose_allowed` 已开。
- 根因:第一件带日期事件之后下一问固定走感情 → 事业 → 家人 → 职业。精度阶段/分盘差异问句不挡出牌,`session_outcome=adopt_representative` 时把它们放进 `deferred_followup`。探针年份锁在 choice_frame 里,但问句轮不到。
- 修复:已有带日期事件且仍有大运冲突探针时,`source=event_probe` 先问该年前事并挡住出牌。A 写入并重算以筛窗。年龄带探针不插队。空账本仍只自然语言收集。不打开唯一分钟确认门。折进未提交的 Skill 10.0.11。
- 验证:`frontend/tests/rectification-eight-method.test.ts` 锁定教育事件 + 事业激活探针先问 2018 年入职且 `session_outcome` 保持收集;年龄带探针不插在感情收集前。
- 防复发:大运冲突探针在采用前必须挡住出牌。不得在空账本挂 `choice_frame`。不得把 `confirmation_allowed` 改成 true。
- 相关记录:BUG-348、BUG-350
- 复发自:BUG-348(收集后再区分;区分问句被方法轮询和出牌 defer 排到采用之后)
- 修复版本:待提交