fix(rectification): inherit answered-probe outcomes onto new minutes (BUG-594)
Rescored candidate sets were widening because new minutes stayed neutral. Derive support/conflict from varga signs and dasha segments, and announce range changes from facts rather than tool names. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
+26
-10
@@ -9106,7 +9106,7 @@
|
||||
- 修复:已答题的定义随状态携带(`carried: true`),重放按候选分钟,新分钟落中性。分盘 `semantic_key` 改为星座分区,例如 `varga.d9.天秤座|天蝎座|射手座`,不再内嵌 `HH:MM`。`candidate_split_hash` 仍按当前候选集计算。
|
||||
- 验证:`frontend/tests/rectification-probe-replay-loss-20260908.test.ts`(连续两次重算仍 5 轮、未变分钟 delta 不变、新分钟 delta 0);指定 TS 切片 1000/0;`tsc --noEmit` 0。
|
||||
- 防复发:候选集变化后 `answered_probes` 对应的题目定义必须仍在 `state.probes`。新生成的分盘 `semantic_key` 不得匹配 `\d\d:\d\d`。`nextProbe` 不得把携带题再问一遍。
|
||||
- 相关记录:BUG-559、BUG-581、BUG-588、BUG-589
|
||||
- 相关记录:BUG-559、BUG-581、BUG-588、BUG-589、BUG-594
|
||||
- 复发自:BUG-559(去重删生成侧定义);BUG-581(停止路径已修,证据路径未修)
|
||||
- 修复版本:待提交(`codex/rectification-probe-replay-loss-20260908`)
|
||||
|
||||
@@ -9116,15 +9116,15 @@
|
||||
- 首次发现:2026-09-08
|
||||
- 最近更新:2026-09-08
|
||||
- 影响面:`runV9AgentTurn` 证据/比较轮结算、`withRangeChangedAfterEvidence`
|
||||
- 用户现象:范围从 8 分钟变回 29 分钟时,三轮证据旁白只说「记下了」,用户要到交付卡才看见变宽。
|
||||
- 触发条件:本轮调用了 `rectification-compare-candidates`,compare 前后 `credible_range` 不同。
|
||||
- 根因:点选题由服务端写「范围从 X 收到 Y」;证据轮旁白是模型写的,服务端不补范围句。
|
||||
- 修复:结算时先按 BUG-585 剪问句,再比较本轮 compare 前后的 `credible_range`。变了就把「范围从 A–B 变为 C–D。」接到正文末尾;没变不写。
|
||||
- 验证:`frontend/tests/rectification-probe-replay-loss-20260908.test.ts`;`frontend/tests/agent-voice-copy-contract.test.ts` 收录新句并锁 `agent-run` 先剪后接。
|
||||
- 防复发:证据轮只要跑过 compare 且范围变了,落库 `assistant_message` 必须含范围句。不得靠提示词让模型自己报。
|
||||
- 相关记录:BUG-585、BUG-587、BUG-569
|
||||
- 复发自:无
|
||||
- 修复版本:待提交(`codex/rectification-probe-replay-loss-20260908`)
|
||||
- 用户现象:范围从 8 分钟变回 29 分钟时,三轮证据旁白只说「记下了」,用户要到交付卡才看见变宽。后续复发:补经历走 `rectification-record-evidence-batch` 内部重算,旁白仍只说「接下来我们继续」,没有范围句。
|
||||
- 触发条件:本轮 `credible_range` 变了。最初只在 `toolsUsed` 含 `rectification-compare-candidates` 时接句;batch 内 compare 不进该集合。
|
||||
- 根因:点选题由服务端写「范围从 X 收到 Y」;证据轮旁白是模型写的。第一次修复按工具名触发,batch 路径没有 compare 工具名。
|
||||
- 修复:结算时先按 BUG-585 剪问句,再比较本轮开始时与结算时的 `credible_range`。变了就把「范围从 A–B 变为 C–D。」接到正文末尾;没变不写。不再看 `toolsUsed`。
|
||||
- 验证:`frontend/tests/rectification-probe-replay-loss-20260908.test.ts` 锁结算段不按 compare 工具名触发,batch 形状 04:47–04:59 → 04:47–05:14 仍接范围句;`frontend/tests/agent-voice-copy-contract.test.ts` 收录新句并锁先剪后接。
|
||||
- 防复发:范围句看 `credible_range` 事实,不看本轮点了哪个工具。变了必须写进落库 `assistant_message`。不得靠提示词让模型自己报。
|
||||
- 相关记录:BUG-585、BUG-587、BUG-569、BUG-594
|
||||
- 复发自:无;后续复发见本条 batch 路径(随 BUG-594 同修)
|
||||
- 修复版本:`df182c16`;batch 路径随 BUG-594 同修
|
||||
|
||||
## BUG-589 | 交付/选择卡在最后一题出现前可能闪现
|
||||
|
||||
@@ -9206,3 +9206,19 @@
|
||||
- 复发自:BUG-290(宽度字段进投影后未随推断层更新);BUG-568(区间读盘,交付正文仍用开工跨度)
|
||||
- 修复版本:`06e44104`
|
||||
|
||||
## BUG-594 | 重算后新分钟不继承已答题结论,范围从 13 分钟回弹到 28 分钟
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-08
|
||||
- 最近更新:2026-09-08
|
||||
- 影响面:`apply-probe-outcome.ts::directionFor`、`buildInferenceState` 携带题重放、`window_scan.transitions`、证据轮范围句
|
||||
- 用户现象:5 道点选题把范围收到 04:47–04:59 后,再补迁居经历,交付卡变成 04:47–05:14。新进候选的 05:14 在已答题上全是中性、零冲突,把右端拉宽。
|
||||
- 触发条件:引擎重算换入不在旧 `supports/conflicts` 里的分钟;已答题按 BUG-587 携带重放。
|
||||
- 根因:BUG-587 任务书决策 2 规定新分钟一律 `neutral`、不做邻近插值。`directionFor` 按候选 id 查成员,查不到就记 0。分盘题本可按换升星座判定,大运/激活题的 outcome 本是连续分钟段,结论可以确定推出。
|
||||
- 修复:推翻该中性决策。分盘风格题用 `signFromTransitions` 按已答星座判 support/conflict,缺 transitions 则仍中性。其余题:新分钟落在某 outcome 集合最小与最大分钟之间、且两侧最近旧分钟同属该集合时继承该集合,否则中性。携带题写入 `outcome_by_minute`。`buildCaseInferenceState` 把 `window_scan.transitions` 传进核心层。范围句改看 `credible_range` 事实(见 BUG-588 batch 路径)。淘汰阈值、`SCORE_DELTA`、四选项合同、Skill 版本不动。
|
||||
- 验证:`frontend/tests/rectification-probe-replay-loss-20260908.test.ts` BUG-594 (a)–(d):05:14 重放后 `strong_conflict_count ≥ 3` 且 `eliminated`,范围仍 04:47–04:59;两集合之间的分钟保持中性;无 transitions 时分盘题保持中性;连续换入被覆盖的新分钟不把范围拉宽。
|
||||
- 防复发:新分钟不得只因不在旧名单里就零冲突存活。分盘题必须能用换升星座继承;大运/激活题必须能用连续分钟段继承。不得再用「不做插值」挡住可确定推出的结论。
|
||||
- 相关记录:BUG-587、BUG-588
|
||||
- 复发自:BUG-587(任务书决策 2 定错;重放定义已在,结论层把新分钟放生)
|
||||
- 修复版本:待发布(`codex/rectification-new-minute-inherit-20260908`)
|
||||
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
# PROGRESS · 重算后新分钟继承已答题结论(2026-09-08)
|
||||
|
||||
工作树:`.worktrees/rectification-new-minute-inherit-20260908`
|
||||
分支:`codex/rectification-new-minute-inherit-20260908`
|
||||
任务书:`docs/tasks/TASK-rectification-new-minute-inherit-20260908.md`
|
||||
基线:`origin/staging` @ `6aba672c`(含修复单 `56067fda` 与 BUG-592/593 验收 `6aba672c`;代码头仍是 `6a687085`)
|
||||
|
||||
本单状态:**待验收**。未 commit、未 push。
|
||||
|
||||
未改:淘汰阈值 `STRONG_CONFLICT_ELIMINATION_COUNT = 3`、`SCORE_DELTA`、四选项合同、采用门、确认门、Skill 版本(仍 10.0.16)。
|
||||
|
||||
## 做了什么
|
||||
|
||||
- **决策 1** `directionFor` 对新分钟按题目语义推结论,不再一律中性。
|
||||
- 分盘风格题(`choice_kind = varga_style` 且 `semantic_key` 以 `varga.<layer>.` 开头):`signFromTransitions` 取该分钟该层上升,对照 `style_options[].sign` 与已答 `answer_class` 判 support/conflict。没有 transitions 或该层无星座 → 中性。
|
||||
- 大运/激活/事件质量题:新分钟落在某 outcome 集合最小与最大分钟之间、且两侧最近旧分钟同属该集合 → 继承;否则中性。
|
||||
- 携带题写入 `outcome_by_minute`;`rounds.score_deltas` 对新分钟可非 0。
|
||||
- **决策 2** `signFromTransitions` 下沉到 `core/sign-from-transitions.ts`。`buildCaseInferenceState` / `score-persist` 把 `window_scan.transitions` 传进核心层。`divergence-panel.ts` 改为引用核心函数,再用 D9/D10 类型表收口星座名。
|
||||
- **决策 3** `agent-run` 范围句比较本轮开始时与结算时的 `credible_range`,不再看 `toolsUsed.has("rectification-compare-candidates")`。batch 内重算也会接 `withRangeChangedAfterEvidence`。
|
||||
- **决策 4** 记录 BUG-594(关联 BUG-587 决策 2 定错)、BUG-588 batch 路径补记、CHANGELOG、手测脚本第 8 条。
|
||||
|
||||
## 三栏(被触碰断言)
|
||||
|
||||
| 用例 | 原值 | 新值 | 理由 |
|
||||
| --- | --- | --- | --- |
|
||||
| 换入 05:14(D9 射手、D10 狮子,2024.04 支持段、2023.05 反对段) | `strong_conflict_count = 0`、活着、范围到 05:14 | `≥ 3`、`eliminated`、范围仍 04:47–04:59 | 决策 1 |
|
||||
| 新分钟夹在两个 outcome 集合之间 | 中性(碰巧) | 仍中性 | 决策 1 的「两侧同属」条件 |
|
||||
| 分盘题无 transitions | 中性 | 仍中性,不报错 | 决策 1 退化 |
|
||||
| 证据轮 batch 内范围 04:47–04:59 → 04:47–05:14 | 无范围句(没有 compare 工具名) | 旁白末尾接范围句 | 决策 3 |
|
||||
| BUG-587 旧夹具里的 04:59 | 新分钟 delta 0 | 落在 04:57–05:13 冲突段内,继承 conflict | 推翻决策 2 后的正确结果 |
|
||||
|
||||
## 测试
|
||||
|
||||
- `frontend` `./node_modules/.bin/tsc --noEmit`:exit 0
|
||||
- 本单改动文件 ReadLints:0 error
|
||||
- `tests/rectification-probe-replay-loss-20260908.test.ts`:10/10
|
||||
- `tests/rectification-varga-style-weight.test.ts` + `agent-voice-copy-contract.test.ts` 与上一文件合计 31/0
|
||||
- 任务书指定 TS 切片(`tests/rectification-*.test.ts` + `agent-voice-copy-contract.test.ts`,排除 database):**1021 passed / 0 failed**
|
||||
- `exp_case_head.py` 合成 7 事件序列:仓库无此脚本;4.1 (d) 用事故形状的合成 6 题 + 三次换分钟回放代替
|
||||
- 浏览器真人走查:本轮未跑,见 `docs/testing/rectification-scenarios-20260907.md` §8
|
||||
|
||||
## 偏离
|
||||
|
||||
1. 任务书基线写 `6a687085`。本 worktree 跟 `origin/staging` 尖端 `6aba672c`(多了修复单文档与 592/593 验收记录,无额外代码差)。
|
||||
2. 4.1 (d) 没有 `scripts/exp_case_head.py`,用同文件内的事故形状合成序列。
|
||||
3. 4.2 的「落库 assistant_message」用源码锁 + `withRangeChangedAfterEvidence` 合同,没有起一整轮 mock agent 写库。
|
||||
4. `signFromTransitions` 的类型表收口仍留在 `divergence-panel.ts`,核心层只返回原始星座名,避免 core 依赖 v9。
|
||||
@@ -78,7 +78,7 @@
|
||||
| `TASK-rectification-covered-domain-recollect-20260908.md` | `PROGRESS-rectification-covered-domain-recollect-20260908.md` | 范围已收到 2 分钟、决策已是采用,却再问答过的财务题:职业覆盖后的 yearless→采集分支(L2224)不看领域是否已覆盖;`shouldSkipFollowupPersist` 把它当剩余采集挡住出卡;`persistCollectFocus` 撞 id 无条件 `:next` 再插;holdout `occupied` 不认 health/health_pressure 同义 | 已验收通过 | `7ca6ade2`(BUG-590~591) |
|
||||
| `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 范围句 | 待执行 | `codex/rectification-new-minute-inherit-20260908`(BUG-594) |
|
||||
| `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 范围句 | 待验收 | `codex/rectification-new-minute-inherit-20260908`(BUG-594) |
|
||||
| `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-505~509) |
|
||||
|
||||
|
||||
@@ -123,9 +123,10 @@
|
||||
|
||||
期望:
|
||||
|
||||
- 补经历后的范围宽度不得超过答题后宽度加上新增的分钟数
|
||||
- 若范围变了,证据轮旁白必须出现「范围从 … 变为 …」
|
||||
- 不得出现:只说「记下了」,交付时范围弹回大约半小时,候选分数跟没答过题一样
|
||||
- 补经历后,已答对照题必须按分盘星座或连续分钟段给新分钟打上 support/conflict;不得只因新分钟不在旧名单里就零冲突存活
|
||||
- 补经历后的范围宽度不得超过答题后宽度加上「任何已答题都盖不到」的新分钟数;事故形状应保持约 13 分钟,不得弹回约半小时
|
||||
- 若范围变了,证据轮旁白必须出现「范围从 … 变为 …」,包括 batch 内重算、工具集合里没有 compare 的那一轮
|
||||
- 不得出现:只说「记下了」或「接下来我们继续」,交付时范围弹回大约半小时,候选分数跟没答过题一样
|
||||
|
||||
## 9. 同领域同年份的点选题只出一次
|
||||
|
||||
|
||||
Reference in New Issue
Block a user