fix(rectification): narrate exhausted-probe adopt instead of keep-collecting
Independent Staging Quality Gate / validate (push) Successful in 10m33s
Independent Staging Quality Gate / publish (push) Successful in 1m55s

When leftover probes cannot split adjacent minutes, skip frameless follow-ups and let a no-tool agent explain the stop. Distinguish-card "no" no longer closes a whole evidence domain.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-04 14:22:13 +08:00
parent cfa824994e
commit 0aaa0d702e
18 changed files with 1757 additions and 51 deletions
+34
View File
@@ -7999,3 +7999,37 @@
- 相关记录:BUG-516
- 复发自:无
- 修复版本:待发布
## BUG-519 | 探针池耗尽出采用卡时旁白说「继续往下收」,并被无 frame 的 nakshatra 绕过采用早退
- 状态:resolved
- 首次发现:2026-09-04
- 最近更新:2026-09-04
- 影响面:`frontend/src/lib/rectification-agentic/v9/method-followup.ts``decision-from-dossier.ts``answer-choice.ts``server-focus.ts``user-copy.ts``adopt-narration.ts``adopt-narration-agent.ts``/api/rectification/agent`
- 用户现象:采集题答「没有」后,助手说「我按现有材料继续往下收」,同一轮却弹出采用卡;composer 没有下一问,采用原因不明。
- 触发条件:区分探针已答完,receipt 仍带 nakshatra 探针与 `window_scan.d*_candidates_differ=true`,决策已是 `offer_provisional_range` / `adopt_representative` / `ready_to_adopt`
- 根因:`buildMethodFollowupPlan` 的 nakshatra 分支只看「有没有探针」,不看决策层是否已丢弃;无 `choice_frame``distinguish_candidates` 被放进 `deferred_followup``isRemainingDiscriminatorFollowup``source=nakshatra_boundary` 就当成剩余区分题,BUG-472 的采用早退被绕过。随后 `persistableFocusDomain("appearance")` 原样返回领域名,DB check 不含该值,写焦点失败,旁白落到 `hostNarrationFallback`
- 修复:`rectificationFollowupCatalog` 只在 `inspectDiscriminatorProbes` 选中 nakshatra 时传入;无 frame 的 nakshatra followup 丢进 `dropped_probes``not_renderable`)。`deferred_followup` 不再收无 frame 的 distinguish。`isRemainingDiscriminatorFollowup` 对无 frame 的 distinguish 返回 false。`persistableFocusDomain` 对非白名单领域返回 `null`;无 frame 的 appearance distinguish 直接 `skipped` 且零次 RPC。采用卡首次打开时由无工具旁白 Agent 写 2–4 句,校验失败/超时走模板,模板在 BUG-503 的 `stopReasonPrefix` 之后补「分不开 A 和 B」。
- 验证:`frontend/tests/rectification-adopt-narration-20260904.test.ts`live five-evidence fixture 补 nakshatra 与 `window_scan` 后原断言仍过;`rectification-server-focus``appearance/horary/nakshatra → null`
- 防复发:采用早退只留在 `shouldSkipFollowupPersist`。不得为 `collect:appearance` 放宽 DB check。旁白 Agent 说出的每个 `HH:MM`、四位年份、以及去掉这两类之后剩下的整数(含相对支持度)必须能在 `AdoptDeliveryFacts` 里找到,否则整段丢弃。Agent 调用与意图分类器相同,不计费。
- 相关记录:BUG-440、BUG-444、BUG-463、BUG-472、BUG-503、BUG-520
- 复发自:BUG-472
- 修复版本:待发布
- 编号说明:任务书撰写时最大号为 BUG-515。同步 `cfa82499` 后 staging 已占用 BUG-516518,本条落在 BUG-519。
## BUG-520 | 区分题答「明确没有发生」被当成整条领域拒答
- 状态:resolved
- 首次发现:2026-09-04
- 最近更新:2026-09-04
- 影响面:`frontend/src/lib/rectification-agentic/v9/method-followup.ts` `declinedDomains``answer-choice.ts` `dossierWithClosedFocus`
- 用户现象:带年份的事业/搬家区分卡选 C「明确没有发生」后,同领域后续有年份探针不再出现;D10/D4 观察分支也会被跳过。本案因探针池已空,结局没被改写。
- 触发条件:`focusStatusForAnswer` 把区分题的「没有」写成 `declined``v_declined_skipped` 投影带 `target_domain` 但不参与计分身份;`declinedDomains` 把任意 declined 焦点的领域当成拒答。
- 根因:BUG-440 为 D12 同领域卡把「答 C declined 计分」写成领域覆盖。对有年份的 `distinguish_candidates`,C 只是这一题的计分答案,不是「这条线以后都别问」。
- 修复:`declinedDomains` 只把 `intent === "collect_method_evidence"`(缺 intent 的旧行仍按采集)算成领域拒答;`distinguish_candidates` 的 declined 不计覆盖。`dossierWithClosedFocus` 追加行带 `intent``focusStatusForAnswer` 仍返回 `declined`,以保留 DB 状态与不确定度计数。
- 验证:`rectification-collect-stall`「denying the dated family collect declines relatives」原断言不变;`rectification-adopt-narration-20260904` 锁 career distinguish declined 不覆盖 `d10_career`,且有年份事业探针仍可被选中;本案 family collect 与 family collect + career/relocation distinguish 两种 declined 输入决策与旁白相同。
- 防复发:领域拒答只看采集题 intent。不得把区分题的 C 当成整域 skipped_by_policy。
- 相关记录:BUG-440、BUG-519
- 复发自:无
- 修复版本:待发布
- 编号说明:与 BUG-519 同批;任务书原写 BUG-517,因编号冲突改为 BUG-520。