fix(rectification): re-ask superseded collect ids instead of fake delivery (BUG-644/645)

A superseded collect row still occupied the unique question id, so the last
"没有" skipped the unasked domain and spoke delivery copy while can_adopt stayed false.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-10 21:03:12 +08:00
co-authored by Cursor
parent d40f2032fc
commit a3a51c32c2
11 changed files with 621 additions and 79 deletions
+32
View File
@@ -9956,3 +9956,35 @@
- 相关记录:BUG-593
- 复发自:无
- 修复版本:待发布
## BUG-644 | 被顶替的采集题号永久占位,落库撞号后当成已问过并断流
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`persistCollectFocus`、`persistExhaustionCollect`、`set_v10_conversation_focus`
- 用户现象:同一轮里分两次记下两件经历后,再答完各领域采集题,最后一条线回「没有」,助手改口说「这次给出的范围…」,下面是「没有拿到下一个问题。」感情采集题从未出现过。
- 触发条件:一轮里 `record-evidence-batch` 被调两次,第一次落下的采集焦点被第二次顶替成 `superseded`;之后计划层仍要问那个领域。
- 根因:RPC 把旧焦点改成 `superseded` 而不删行,`unique (case_id, question_id)` 仍占着原题号。计划层看不到 superseded,`collect_retry` 为 false,`persistCollectFocus` 撞号直接 `duplicate_focus`。`persistExhaustionCollect` 把 `duplicate_focus` 当成「这题已经问过并关掉了」,跳过口语采集走进交付旁白。
- 修复:采集题撞号一律试 `:next` / `:next2` / `:next3`;`collect_retry` 只换重问文案。`duplicate_focus` 与其它落库失败一样返回采集口语或中间态范围句,并在 `rectification_exhaustion_collect` 日志写下 `persist_status` 与题号。点选探针题号不加后缀。
- 验证:`frontend/tests/rectification-superseded-focus.test.ts`、`frontend/tests/rectification-server-focus.test.ts`。
- 防复发:采集题撞号不得因 `collect_retry` 为 false 就放弃换号;`duplicate_focus` 不得落到 adopt 分支。
- 相关记录:BUG-462、BUG-520、BUG-525、BUG-559、BUG-626、BUG-627、BUG-633、BUG-645
- 复发自:BUG-462、BUG-626(题号唯一约束叠上顶替不删行)
- 修复版本:待发布
## BUG-645 | 出口旁白说「这次给出的范围」却没有卡、公开 can_adopt 为 false
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`persistExhaustionCollect`、`persistNextInterviewAfterChoice`、`POST /api/rectification/agent` 非收敛区间分支、`deliveryNarrationAllowed`
- 用户现象:助手正文是交付三句(「这次给出的范围…代表性候选」),公开 `can_adopt=false`、没有对照卡,下面是「没有拿到下一个问题。」
- 触发条件:内部 `decision.canAdopt` 为真,但 `session_outcome=collect_evidence`,公开 `can_adopt` 仍为 false;穷尽采集落库失败后走进 adopt 旁白。
- 根因:交付旁白只看内部 `canAdopt`。公开 `can_adopt` 只在采用结果态为真,采集期即使内部可采纳也不出卡。
- 修复:新增 `deliveryNarrationAllowed`:必须 `publicCanAdopt` 为真,或 `selection_allowed` 且下一动作为 `offer_provisional_range`。三处调用在不允许时改用中间态范围句加当前采集题。
- 验证:`frontend/tests/rectification-superseded-focus.test.ts`、`frontend/tests/agent-voice-copy-contract.test.ts`、`frontend/tests/rectification-delivery-report-facts.test.ts`、`frontend/tests/rectification-exhaustion-exit-20260906.test.ts`。
- 防复发:`can_adopt=false` 时源码合同禁止交付句路径;公开不能采用时不得输出「这次给出的范围」。
- 相关记录:BUG-644、BUG-626、BUG-627
- 复发自:无
- 修复版本:待发布