fix(rectification): deliver range cards on tied first place instead of falling back to collect (BUG-680/681/682)
Independent Staging Quality Gate / validate (push) Successful in 17m18s
Independent Staging Quality Gate / publish (push) Successful in 13m52s

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:
jesse-ux
2026-09-14 15:41:04 +08:00
parent e59ef9fbfd
commit d5a8db0a4e
16 changed files with 644 additions and 9 deletions
+48
View File
@@ -10580,3 +10580,51 @@
- 相关记录:BUG-678、BUG-635、BUG-677
- 复发自:BUG-678DESIGN 与合同测试分叉)
- 修复版本:待发布
## 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` 仍为 truePOST 第二次 `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-674POST 与 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
- 复发自:无
- 修复版本:待发布