fix(rectification): stop re-asking covered domains after adopt (BUG-590, BUG-591)
Independent Staging Quality Gate / validate (push) Successful in 11m33s
Independent Staging Quality Gate / publish (push) Successful in 7m49s

Yearless-to-collect now skips domains already confirmed, declined, or asked; adopt-exhausted turns skip leftover collect persist. Collect focus collisions only retry with :next when collect_retry is set.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-08 12:27:40 +08:00
co-authored by Cursor
parent 43fd8875ce
commit 7ca6ade244
11 changed files with 613 additions and 36 deletions
+32
View File
@@ -9142,3 +9142,35 @@
- 复发自:无
- 修复版本:待提交(守卫已加,现象仍 investigating
## BUG-590 | 范围已收到 2 分钟、决策已是采用,却再问答过的财务采集题
- 状态:resolved
- 首次发现:2026-09-08
- 最近更新:2026-09-08
- 影响面:`method-followup.ts` 职业覆盖后的 yearless→采集分支、`shouldSkipFollowupPersist``holdoutFollowupFor`
- 用户现象:范围已经收到大约 2 分钟,决策已是采用,输入框上方却再问一遍已经答过的财务采集题,区间交付卡出不来。
- 触发条件:七个带年月领域和职业都覆盖或拒答;yearless 目录里还有无年份分盘对照(本例 D11 财务);闲置路径带着 `contrastPacket` 持久化下一问;财务账本已有带年月确认事件且该领域采集焦点已 `resolved`
- 根因:职业覆盖后的 yearless→采集分支只取 `yearlessDiscriminators[0]`,只跳过拒答,不看该领域是否已有带年月事件、是否已经问过 `collect:<domain>:*`。财务已覆盖仍被改写成 dated collect。`shouldSkipFollowupPersist` 只要 `isRemainingEvidenceCollect` 为真就不跳过,采用被这道题挡住。holdout 的 `occupied` 不认 `health` / `health_pressure` 同义,答过健康后仍可能再问健康线。
- 修复:遍历全部 yearless 对照,跳过拒答、已确认(含健康同义)和已问过采集的领域,全部跳过则不再派采集。采用且 `probe_pool_exhausted` 时,剩余采集只计「该领域没有确认事件且未拒答」的题,否则跳过持久化并写 `terminalNote`。holdout `occupied``health``health_pressure` 归并。不动采用门、确认门、Skill 版本(仍 10.0.15)。
- 验证:`frontend/tests/rectification-occupation-coverage-exit.test.ts` 事故形状:yearless→采集 `next_followup === null`;迁居未覆盖仍问迁居;idle persist `terminalNote: true` 且 0 次 set-focusagent-run 闸门轮与 `canShowRectificationSelectionCards`holdout 健康同义。`frontend/tests/rectification-server-focus.test.ts` 见 BUG-591。`frontend` `tsc --noEmit` 0;指定 TS 切片 1006/0。
- 防复发:yearless→采集不得只取第一道分盘题。已覆盖或已问过的领域不得再派 dated collect。采用穷尽时不得把已覆盖领域的采集当剩余采集挡住出卡。holdout occupied 必须与 `hasConfirmedHealth` 同口径。`USER_COLLECT_QUESTION.other` 不得回潮。
- 相关记录:BUG-586、BUG-587、BUG-591
- 复发自:BUG-586(同一「职业覆盖后多问一题」现象,不同分支);BUG-587(收敛成功后才暴露)
- 修复版本:待提交(`codex/rectification-covered-domain-recollect-20260908`
## BUG-591 | 非 retry 采集焦点撞 id 时无条件加 `:next` 再插一次
- 状态:resolved
- 首次发现:2026-09-08
- 最近更新:2026-09-08
- 影响面:`server-focus.ts::persistCollectFocus``persistFocusAfterChoice`
- 用户现象:财务采集题已经问过并关闭,下一轮仍以 `collect:finance:collect_method_evidence:next` 落库,题干与已答财务题相同。
- 触发条件:计划层再次派出同一领域的非 `collect_retry` 采集题;`set_agentic_rectification_conversation_focus``focus_idempotency_conflict`
- 根因:`75fc456d`BUG-462 附带)在撞 id 时一律改 `${questionId}:next` 再插,原本给穷尽采集撞开场题号用。BUG-586 删掉 other 穷尽采集后,这条路径只剩副作用:已覆盖领域只要被计划层重复派出,就能以 `:next` 落地。
- 修复:撞 id 时仅 `followup.collect_retry === true` 才用 `:next`;否则返回 `duplicate_focus`、不插入。`persistFocusAfterChoice``duplicate_focus` 当已处理、不再读 dossier 重试。
- 验证:`frontend/tests/rectification-server-focus.test.ts`:非 retry 冲突 `status: "duplicate_focus"` 且 RPC 一次;`collect_retry: true` 仍以 `:next` 落地。
- 防复发:非 retry 采集撞 id 不得再加 `:next`。retry 采集仍须能以 `:next` 落地。
- 相关记录:BUG-462、BUG-586、BUG-590
- 复发自:BUG-462`:next` 重试本为穷尽采集撞开场题号)
- 修复版本:待提交(`codex/rectification-covered-domain-recollect-20260908`