fix(rectification): stop re-asking covered domains after adopt (BUG-590, BUG-591)
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:
@@ -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-focus;agent-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`)
|
||||
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
# PROGRESS · 已覆盖领域再采集(2026-09-08)
|
||||
|
||||
工作树:`.worktrees/rectification-covered-domain-recollect-20260908`
|
||||
分支:`codex/rectification-covered-domain-recollect-20260908`
|
||||
任务书:`docs/tasks/TASK-rectification-covered-domain-recollect-20260908.md`
|
||||
基线:`origin/staging` @ `43fd8875`
|
||||
|
||||
本单状态:**待验收**。本提交交付到 staging。
|
||||
|
||||
未改:采用门、确认门、`MIN_SEPARATION_LEAD`、`_relative_support`、`minute_step=1`、`SCORE_DELTA`、四选项合同、Skill 版本(仍 10.0.15)。
|
||||
|
||||
## 做了什么
|
||||
|
||||
- **决策 1** `method-followup.ts` 职业覆盖后的 yearless→采集:遍历全部 `yearlessDiscriminators`,跳过拒答、`hasConfirmedDomain`(含 `health`/`health_pressure`)和已问过 `collect:<domain>:*` 的领域。全部跳过则 `next` 保持空。
|
||||
- **决策 2** `shouldSkipFollowupPersist`:`canAdopt` 且(`nextAction === "ready_to_adopt"` 或 `sessionOutcome === "adopt_representative"`)且 `stopReason === "probe_pool_exhausted"` 时,`isRemainingEvidenceCollect` 只有该领域没有确认事件且未拒答才算剩余采集;否则跳过持久化、`terminalNote`。
|
||||
- **决策 3** `persistCollectFocus` 撞 `focus_idempotency_conflict`:仅 `collect_retry === true` 才 `:next`,否则 `duplicate_focus`。`persistFocusAfterChoice` 不再为 `duplicate_focus` 读 dossier 重试。
|
||||
- **决策 4** `holdoutFollowupFor` 的 occupied 归并 `health` / `health_pressure`。
|
||||
|
||||
## 三栏(被触碰断言)
|
||||
|
||||
| 用例 | 原值 | 新值 | 理由 |
|
||||
| --- | --- | --- | --- |
|
||||
| 事故形状 yearless→采集 | `next_followup.domain = finance`(取 yearless[0]=D11) | `null` | 决策 1,财务已覆盖 |
|
||||
| 同形状但迁居未覆盖 | finance | relocation | 守卫只跳过已覆盖领域 |
|
||||
| idle persist 事故形状 | 财务采集焦点 / `:next` | `terminalNote: true`,0 次 set-focus | 决策 1+2 |
|
||||
| 非 retry 采集撞 id | 任何撞 id 都 `:next` | `duplicate_focus`,RPC 一次 | 决策 3 |
|
||||
| `collect_retry` 撞 id | `:next` | 仍 `:next` | 保留 BUG-462 retry |
|
||||
| holdout 账本 `health` + oos `health_pressure` | `health_pressure` | `null` | 决策 4 |
|
||||
|
||||
## 测试
|
||||
|
||||
- `frontend` `./node_modules/.bin/tsc --noEmit`:exit 0
|
||||
- `npm run lint`:0 error(仓库既有 warning 未清)
|
||||
- 任务书指定 TS 切片(`tests/rectification-*.test.ts` + `agent-voice-copy-contract.test.ts`,排除 database):**1006 passed / 0 failed**
|
||||
- Docker `database-rectification-*.test.ts`:本机未跑,记 blocked
|
||||
- `block_scan` 壁钟(BUG-570 P2):既有缺口,本单不声称全量 Python 门通过
|
||||
- 浏览器七领域真人走查:无登录态,记环境缺口,见 `docs/testing/rectification-scenarios-20260907.md` §6
|
||||
|
||||
## 偏离
|
||||
|
||||
1. 任务书写 `nextAction === "adopt_representative"`。实现同时认 `ready_to_adopt` 与 `sessionOutcome === "adopt_representative"`,因为公开 nextAction 是前者。
|
||||
2. 验收形状扩在 `rectification-occupation-coverage-exit.test.ts`,没有新建文件。
|
||||
3. idle 夹具按解析后账本算 `evidenceLedgerFingerprint`,避免 RPC `summary` 与内存账本对不上把快照判成过期、决策掉回 `collect_evidence`。
|
||||
4. `rectification-eight-method.test.ts`:yearless D24 在 CLASSIC_COVERAGE 已有学业时,不再锁「再问一遍学业」;改为收未覆盖的财务。
|
||||
@@ -75,7 +75,7 @@
|
||||
| `TASK-rectification-duplicate-narration-20260907.md` | `PROGRESS-rectification-duplicate-narration-20260907.md` | 每轮采集旁白说两遍 + 题干在正文与问题块各一次:`step-answer` 的 set-focus 例外(BUG-533)放行了 set-focus 前后两个 step 的正文并拼接;`detachCollectSpokenAssistantText` 只剥逐字后缀,模型写进正文的问句没有代码守卫(BUG-488 防线只在提示词) | 已验收通过 | `9d1c08ca`(BUG-584~585) |
|
||||
| `TASK-rectification-other-collect-fallback-20260908.md` | `PROGRESS-rectification-other-collect-fallback-20260908.md` | 七领域问完落到「也可以再说一件」、职业题从未出现、不自动出卡:`USER_COLLECT_QUESTION.other` 仍有三条活路(职业焦点 `target_domain` 压成 other 后被 active-focus 承接 followup 重建;set-focus 两次无效兜底查表;无领域采集归 other),`collect:other:*` 焦点挂着让 `persistNextInterviewIfIdle` 的出卡路径永远不跑 | 已验收通过(触发链仍 investigating,BUG-586 mitigated) | `9aec5029`(BUG-586) |
|
||||
| `TASK-rectification-probe-replay-loss-20260908.md` | `PROGRESS-rectification-probe-replay-loss-20260908.md` | **P0** 收敛不了的直接原因:答完 5 道题范围收到 8 分钟,之后每补一件经历触发的重算换了候选集,`buildInferenceState` 找不到已答题定义(引擎与对照包按 asked keys 排除、状态 probes 不携带、分盘 key 内嵌分钟列表)→ `rounds:[]`、posterior=prior,交付回到 29 分钟;证据轮旁白不报范围变化;交付卡闪现待证实 | 已验收通过(真实 Case 范围收到 2 分钟;BUG-589 闪现 investigating) | `df182c16`(BUG-587~589) |
|
||||
| `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 同义 | 待执行 | `codex/rectification-covered-domain-recollect-20260908`(BUG-590~591) |
|
||||
| `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 同义 | 待验收 | `codex/rectification-covered-domain-recollect-20260908`(BUG-590~591) |
|
||||
| `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) |
|
||||
|
||||
|
||||
@@ -101,6 +101,7 @@
|
||||
- 七领域问完后下一问是「你平时主要做什么工作?」,或已经可以交付时直接出区间卡
|
||||
- 不得出现补问兜底句「也可以再说一件你记得大概时间的事」
|
||||
- 职业答过、又没有剩余采集时,必须出现区间交付卡,不能只剩停止按钮
|
||||
- 职业也问完、决策已是采用后,下一步必须是区间交付卡,不得再出任何已答领域的采集题(例如已经答过的财务)
|
||||
|
||||
## 7. 每轮助手气泡只有一段旁白,题干只在问题块出现一次
|
||||
|
||||
|
||||
Reference in New Issue
Block a user