fix(rectification): host-fallback empty evidence turns and choice range narration (BUG-633, BUG-634)

Evidence turns that already recorded a batch no longer fail the whole run when the model emits no text; unchanged ranges now name which clock spans lead or lag, and the timeline no longer says 收窄.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-10 11:57:07 +08:00
co-authored by Cursor
parent 31f2a722aa
commit 0263658477
28 changed files with 817 additions and 49 deletions
+32
View File
@@ -9795,3 +9795,35 @@
- 相关记录:BUG-614、BUG-623
- 复发自:BUG-614(对照集合仍被 9 截断)
- 修复版本:待发布
## BUG-633 | 证据轮模型无正文被判整轮失败,下一问已落库却只剩「没有拿到下一个问题」
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`agent-run.ts` `streamAttempt` 收尾、`host-fallback.ts``rectification-agentic-chat.tsx` 失败刷新、`rectificationQuestionGapState`
- 用户现象:补完带年月经历后,助手气泡下面直接是「没有拿到下一个问题。」和「本轮没有生成可展示的回复,状态已记录。」输入框写着「请回答上面的问题…」,上面没有问题。刷新无效。
- 触发条件:证据轮 `rectification-record-evidence-batch` 已 completed,下一问焦点已落库,模型以 `stop` / `length` / `max_steps` 结束且没有可展示正文。
- 根因:`empty_stream` 不在可重试集合(`fe87a9ec` 为避免重放证据而移出)。失败路径不结算、不写主持人正文、客户端 `run.failed` 后不刷新快照。问题只挂在 settled 助手消息上,失败轮没有助手行,缺口走 `preparing``unavailable`
- 修复:batch 已完成且无正文时用工具返回的事件复述写成「记下了:…。」,`finalizeTurn("completed")`phases 含 `answer.host_fallback`,公开 receipt `answer_origin=host_fallback``empty_stream` 仍不进 `RETRYABLE_ERROR_CODES`;仅当本 attempt 没有任何公开写工具(batch / set-focus / compare)完成时才 retryable 一次。失败也 `loadCaseSnapshot`;快照有 `current_question``question_source=focus` 时渲染主持人问题行。
- 验证:`frontend/tests/rectification-v9-stream.test.ts``rectification-host-fallback.test.ts``rectification-agentic-entry.test.ts``rectification-surface-state.test.ts``rectification-spoken-collect.test.ts`
- 防复发:有写工具完成不得重试 empty_streamBUG-186);兜底正文只能来自 batch 返回;问题行 `focus_id` 只能来自 `current_question`
- 相关记录:BUG-186、BUG-359、BUG-558、BUG-627
- 复发自:无
- 修复版本:待发布
## BUG-634 | 答题旁白只会说「范围没变」,时间线写死「还在收窄」
- 状态:resolved
- 首次发现:2026-09-10
- 最近更新:2026-09-10
- 影响面:`composeChoiceNarration``explainScoreMovement``RectificationReadonlyRange`
- 用户现象:多道选择题答完,每次都是「已记录,范围没变。」顶部一直「目前范围 X–Y,还在收窄」,看不出分数有没有动、选择题是不是已经问完。
- 触发条件:答题后可信区间宽度不变(落后峰值不足淘汰阈值),或带年月区分题已经问完。
- 根因:旁白只用 `explainRangeChange``explainScoreMovement` 算得出领先/落后却没说出来。时间线「还在收窄」是写死的,不看快照里还有没有带年月探针。
- 修复:范围不变且 deltas 非零时旁白补「04:5204:53 领先,05:0805:12 落后」;全零只说「已记录,范围没变。」范围变了仍不讲领先落后(BUG-606)。时间线在 `discriminate_candidates` 且没有带年月探针时写「选择题已问完,再补带年月的经历才会变」,否则「还在核对」,不写「收窄」。
- 验证:`frontend/tests/rectification-answer-choice.test.ts``rectification-surface-state.test.ts``agent-voice-copy-contract.test.ts`
- 防复发:静态用户文案词表禁止「还在收窄」;聊天源码合同禁止写死该句;范围变了的旁白不得带领先/落后。
- 相关记录:BUG-593、BUG-606、BUG-629
- 复发自:无
- 修复版本:待发布
@@ -0,0 +1,40 @@
# PROGRESS · 证据轮无正文被判失败;答题旁白与时间线无进度(2026-09-10)
工作树:`.worktrees/rectification-evidence-turn-empty-answer-20260910`
分支:`codex/rectification-evidence-turn-empty-answer-20260910`
任务书:`docs/tasks/TASK-rectification-evidence-turn-empty-answer-20260910.md`
基线:任务书写 `719ff55a`;开工接到 `origin/staging` @ `31f2a722`。BUG-626/627、BUG-628 有任务书但无人领取,按任务书串行说明先做本单。
## 开工回执
- 编号 **BUG-633** / **BUG-634**(当时最大已发布号是 632)。
- 顺序:主持人兜底 → 零写工具才重试 empty_stream → 失败也刷新快照并渲染已落库问题 → 范围不变旁白补领先/落后 → 时间线去掉「还在收窄」→ 记录。
## 已完成
- **BUG-633**`record-evidence-batch` 已 completed 且无正文时,用 batch 返回的 `accepted_recaps` 写成「记下了:…。」,`answer.host_fallback` + `answer_origin=host_fallback`,正常结算。`empty_stream` 不进 `RETRYABLE_ERROR_CODES`;仅零公开写工具时 retryable 一次。失败路径同样 `loadCaseSnapshot``questionPersisted` 渲染主持人问题行。迁移 `20260910010000_rectification_host_fallback_phase.sql` 放行该 phase。每个 attempt 收尾打一条 `RectificationRunDiagnostic` JSON 日志,不落库。
- **BUG-634**:范围不变且 deltas 非零 →「已记录,范围没变;04:5204:53 领先,05:0805:12 落后。」全零 →「已记录,范围没变。」范围变了仍不讲领先落后。时间线:`discriminate_candidates` 且无带年月探针 →「选择题已问完,再补带年月的经历才会变」;否则「还在核对」。
- 记录:BUG-633/634、CHANGELOG、走查第 8 条、本文件。Skill 版本不变。
## 验收命令(实测)
工作树 `codex/rectification-evidence-turn-empty-answer-20260910`,相对 `origin/staging` @ `31f2a722`
| 命令 | 结果 |
| --- | --- |
| `frontend` `./node_modules/.bin/tsc --noEmit` | **0 error** |
| `frontend` `npm run lint` | **0 error** / 108 warning(既有) |
| `frontend` `tsx --test``tests/rectification-*.test.ts` + `agent-voice-copy-contract.test.ts`(排除 database | **1102/1102 pass** |
| `git diff --check` | 干净 |
## 环境缺口
- 无登录态、无 Chrome`docs/testing/rectification-scenarios-20260907.md` 第 8 节真人走查未做。
- 未跑完整前端套件 / `next build`
- 迁移 `20260910010000_rectification_host_fallback_phase.sql``Migrate Staging Database` 后部署;未应用时 `answer.host_fallback` 内存 phases 仍在,落库会被 SQL allowlist 拒绝(`persistCommittedPhase` 非 strict)。
## 未做
- 本提交先落 BUG-633/634。未推的 BUG-626/627`e396c883`)按任务书「决策 5 叠在本单客户端改动上」随后 cherry-pick。
- 未领取、未实现 BUG-628。
- 未提升 `main`。Skill 未升版。
+1 -1
View File
@@ -94,7 +94,7 @@
| `TASK-rectification-domain-alias-audit-20260909.md` | `PROGRESS-rectification-domain-alias-audit-20260909.md` | 领域命名审计:健康线 `health`(账本/焦点)与 `health_pressure`(计划/引擎)在十处比较里六处未归并(holdout declined、reverse-verify、conflict probes、probeYearAlreadyCovered、引擎 oos_blind_prompts / _event_years / volunteered);职业线焦点存为 `other` 只靠 questionId 兜底。其余六领域三层同名无问题。决策:TS/Python 各一个归并函数 + 源码合同禁字面量比较 | 待执行 | `codex/rectification-domain-alias-audit-20260909`BUG-628 |
| `TASK-rectification-yearless-probe-downgrade-20260909.md` | `PROGRESS-rectification-yearless-probe-downgrade-20260909.md` | 产品拍板:无年月性格题(D9/D10 风格、月宿边界)降级为平局裁决——带年月题问完且候选仍分不开才问,分值减半(±1)、不计淘汰,报告标「参考」;三列卡性格描述不动;新增离线命中率测量脚本 + 导出 SQL(有出生证用户,聚合);Skill 10.0.21 | 已验收通过 | `fef54b6e`BUG-629Skill 10.0.21 |
| `TASK-rectification-followups-20260909.md` | `PROGRESS-rectification-followups-20260909.md` | 验收补漏:申报时段拦截只看钟点样式,带钟点的经历(『20:00 左右分手』『3 点到 5 点被车撞』)会被吞(BUG-631);by_time 只算引擎前 9 个候选,一小时窗 17 个候选时卡片列写『还没对照』(BUG-632) | 待验收 | `codex/rectification-followups-20260909`BUG-631632 |
| `TASK-rectification-evidence-turn-empty-answer-20260910.md` | `PROGRESS-rectification-evidence-turn-empty-answer-20260910.md` | 证据轮模型无正文被判整轮失败:证据、评分、下一问都已落库却只剩『没有拿到下一个问题』(BUG-633);答题旁白只说『范围没变』、时间线写死『还在收窄』(BUG-634) | 待执行 |
| `TASK-rectification-evidence-turn-empty-answer-20260910.md` | `PROGRESS-rectification-evidence-turn-empty-answer-20260910.md` | 证据轮模型无正文被判整轮失败:证据、评分、下一问都已落库却只剩『没有拿到下一个问题』(BUG-633);答题旁白只说『范围没变』、时间线写死『还在收窄』(BUG-634) | 待验收 |
### 聊天主链路与首页
@@ -187,3 +187,13 @@
- 交付后展开验证报告,「D9 / D10 类型对照」和「月宿边界」状态是 `reference`,说明是性格自评、只作排序参考、不参与淘汰
- 三列对照卡上的性格句子仍按类型表展示,不改写
## 8. 证据轮模型没写正文时必须出现「记下了」和下一问
资料与开场同第 0 条。虚构经历说到搬家或入职一件带年月的事。
期望:
- 助手正文出现「记下了」加这件事的复述,不得只剩「没有拿到下一个问题」
- 下一问可见(气泡里或主持人问题行),输入框在问题可见时才写「请回答上面的问题…」
- 点选题范围没变时应能看到领先或落后;全零才只说「范围没变」
- 顶部时间线不得写「还在收窄」