fix(rectification): deliver range cards on tied first place instead of falling back to collect (BUG-680/681/682)
Refresh persist failures no longer count as attempts. tied_first completes with a range before stillNeedNarrowing. Delivery narration and cards share DELIVERY_OUTCOMES. The question gap gets a delivered terminal so the unavailable copy does not appear after a range is given.
This commit is contained in:
@@ -10580,3 +10580,51 @@
|
||||
- 相关记录:BUG-678、BUG-635、BUG-677
|
||||
- 复发自:BUG-678(DESIGN 与合同测试分叉)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-680 | 刷新尝试落库失败仍按已尝试推进,POST 交付 GET 回采集
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-14
|
||||
- 最近更新:2026-09-14
|
||||
- 影响面:`refreshDatedDiscriminatorPoolIfNeeded`、`persistRefreshAttempt`、`decideRectification`、`shouldSkipFollowupPersist`
|
||||
- 用户现象:跳过最后一道定向补事题后,助手播出完整交付结论,刷新后没有交付卡、没有下一题,时间轴写「再说一件带年月的事就能继续」,并印出「没有拿到下一个问题。」
|
||||
- 触发条件:前两名 posterior 并列(如 16/16),`stop_reason=tied_first`;本轮选择题刚推进 revision,刷新尝试用旧 revision 写库撞版本冲突。
|
||||
- 根因:`persistRefreshAttempt` 失败时返回值被丢弃,`attemptRecorded` 仍为 true,POST 第二次 `decideFromDossier` 把 `refreshExhausted` 当成真并交付;GET 读库没有这条 attempt,`stillNeedNarrowing` 为真,把 `tied_first` 压回 `collect_evidence`。并列到顶本是终局,被「还有收窄手段」无条件压过。
|
||||
- 修复:落库失败时 `attemptRecorded=false`,不把内存态写进 dossier,并打 `rectification_refresh_attempt_persist_failed`。`tied_first` 在 `stillNeedNarrowing` / coverageBlocks 之前直接 `completeWithRange`。idle persist 在 `tied_first` 且 outcome 属于交付集合时跳过下一问。不放宽 `can_adopt`。
|
||||
- 验证:`frontend/tests/rectification-delivery-vs-collect-20260914.test.ts`:persist 抛错后 attemptRecorded=false;同一份并列 dossier 上 `persistNextInterviewIfIdle` 与 `decideFromDossier` 都交付。
|
||||
- 防复发:任何「是否已尝试/已耗尽」的标志,落库失败时一律按未完成处理。POST 与 GET 对同一状态的决策必须一致,并由对拍测试守着。不得靠内存 overlay 播交付。
|
||||
- 相关记录:BUG-674、BUG-681、BUG-682
|
||||
- 复发自:BUG-674(POST 与 GET 对同一状态判定不一致)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-681 | 交付话术能说、交付卡不能画
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-14
|
||||
- 最近更新:2026-09-14
|
||||
- 影响面:`DELIVERY_OUTCOMES`、`deliveryNarrationAllowed`、`canShowRectificationSelectionCards`、`canShowRectificationReadonlyRange`
|
||||
- 用户现象:正文已经念完「现在给的范围是…代表分钟为…」,界面没有区间交付卡。
|
||||
- 触发条件:`session_outcome` 为 `completed_with_range` 或 `provisional_range`;`can_adopt` 为假。
|
||||
- 根因:卡片闸门用 `ADOPT_OUTCOMES` 且要求 `canAdopt`。这两种正常收尾不在采用集合里。话术闸门认 `offer_provisional_range` / 公开采用,于是能说不能画。
|
||||
- 修复:新增 `DELIVERY_OUTCOMES` = 采用集合 ∪ `{completed_with_range, provisional_range}`。卡片闸门用它,不把 `can_adopt` 提权。交付 outcome 且 `selection_allowed` 时出卡、不出「再说一件」范围行。
|
||||
- 验证:`rectification-delivery-vs-collect-20260914.test.ts`、`rectification-candidate-result.test.ts` 表驱动:话术为真则卡为真。
|
||||
- 防复发:不得新增第二套交付卡。话术与卡必须由同一判据驱动。
|
||||
- 相关记录:BUG-680、BUG-590
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-682 | 已交付无题时缺口状态机兜底成「没有拿到下一个问题」
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-14
|
||||
- 最近更新:2026-09-14
|
||||
- 影响面:`rectificationQuestionGapState`、`interviewDeliveredGap`、`rectification-agentic-chat.tsx`
|
||||
- 用户现象:没有题、没有卡时印出「没有拿到下一个问题。」并出现「接着问」。
|
||||
- 触发条件:`current_question === null` 且 `session_outcome=collect_evidence`、`stop_reason=tied_first`(或已交付 outcome);不是 collect_waiting 的那几个不足理由。
|
||||
- 根因:缺口状态机没有「已交付 / 没有更多可问」终态,重试耗尽后落到 `unavailable`。
|
||||
- 修复:新增 `delivered`:无题且 outcome 属于交付集合,或 `stop_reason` 为 `tied_first` / `user_uncertainty_too_high`。该状态显示出口说明,禁止「没有拿到下一个问题」。普通题没取到仍是 `unavailable`。
|
||||
- 验证:`rectification-delivery-vs-collect-20260914.test.ts`、`rectification-surface-state.test.ts`。
|
||||
- 防复发:已交付无题不得再走修复入口文案。不得把 `delivered` 误伤真正缺题的 `unavailable`。
|
||||
- 相关记录:BUG-680、BUG-681
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
Reference in New Issue
Block a user