fix(rectification): keep tied-first from delivering while probes remain (BUG-683/684)
tied_first is only terminal when there is no dated probe and targeted collect is exhausted. An unnarrowed opening window cannot announce adopt. Delivered dead choice cards take the delivered gap instead of the repair copy.
This commit is contained in:
@@ -10628,3 +10628,36 @@
|
||||
- 相关记录:BUG-680、BUG-681
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-683 | 并列早退在还有探针可问时就把第二题判成可采用
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-14
|
||||
- 最近更新:2026-09-14
|
||||
- 影响面:`decideRectification` 的 `tied_first` 早退、`completeWithRange` 未收窄窗口的采用闸门
|
||||
- 用户现象:新建校正只答两轮采集,助手已经在问第三道带年月区分题,界面却宣布可采用、代表分钟,可信区间仍是开局窗口(如 04:45–05:15)。
|
||||
- 触发条件:前两名(或前三名)分数完全并列;`stop_reason=tied_first`;仍有带年月探针或定向补事未问完。
|
||||
- 根因:复发自 BUG-680 的修复。上一单 D2 写的是把 `tied_first` 提到 `!separation.sufficient` 分支里、`stillNeedNarrowing` 之前;实现把它放到了 `coverageBlocks` 之前、整个不足分支之外,连「还有探针」和「方法覆盖未达标」都绕过。配套测试传入 `discriminatorProbe: null`,实现却没有这个守卫,测试与实现语义不一致,所以回归没被拦住。并列在采集早期只是分数还没拉开,不是「无论如何都问不下去」。
|
||||
- 修复:`tied_first` 早退必须同时 `probe === null` 且 `targetedCollectExhausted !== false`。`refreshExhausted` 不参与该判断。交付时若 `credible_range` 等于开局 `case.candidateRange`,`can_adopt` 为假,`session_outcome` 只允许 `completed_with_range` / `provisional_range`,不得宣布代表分钟可采用。
|
||||
- 验证:`frontend/tests/rectification-tied-first-fix-20260914.test.ts`;`rectification-delivery-vs-collect-20260914.test.ts` 成对用例(有探针不交付 / 无探针且定向补事问完才交付)。
|
||||
- 防复发:`tied_first` 交付测试必须成对——有带年月探针时不交付,无探针且定向补事问完时才交付。不得把开局窗口原样宣布为可采用。不得为了让并列局面收尾而放宽 `can_adopt`。
|
||||
- 相关记录:BUG-680、BUG-681、BUG-682、BUG-674
|
||||
- 复发自:BUG-680(修复实现比任务书更宽,测试用空探针锁的是「没有探针才交付」,实现无此守卫)
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-684 | 交付态下死卡仍把缺口打成「没有拿到下一个问题」
|
||||
|
||||
- 状态:investigating
|
||||
- 首次发现:2026-09-14
|
||||
- 最近更新:2026-09-14
|
||||
- 影响面:`interviewDeliveredGap`、`rectificationQuestionGapState`、`rectification-agentic-chat.tsx`
|
||||
- 用户现象:决策已是 `complete_with_range` / `tied_first`,屏幕上仍有一道没有可点选项的题,并印「没有拿到下一个问题。」+「接着问」。
|
||||
- 触发条件:交付 outcome 或 `stop_reason=tied_first`,同时 `current_question` 非空且 `interviewChoiceCardUnavailable` 为真。
|
||||
- 根因:待取证。已确认 `interviewDeliveredGap` 原先要求 `questionMissing === true`,有题时 `delivered` 不触发,死卡走 `questionLoadFailed` → `unavailable`。写入路径尚未钉死。
|
||||
- 修复:本轮只做兜底与取证。`questionMissing || deadChoice` 时允许进入 `delivered`;死卡且处于交付态打 `rectification_delivered_state_dead_choice`(`session_outcome`、`stop_reason`、`question_id`、`has_choice_card`)。非交付态死卡仍 `unavailable`,不误伤 BUG-671。
|
||||
- 验证:`frontend/tests/rectification-tied-first-fix-20260914.test.ts` 锁定交付+死卡 → `delivered`,采集+死卡 → `unavailable`。
|
||||
- 防复发:交付态不得再出现「没有拿到下一个问题」。根因确认前不得把本条标为 resolved。
|
||||
- 相关记录:BUG-682、BUG-674、BUG-671、BUG-683
|
||||
- 复发自:BUG-682(`delivered` 终态要求无题,死卡把会话钉在问题态)
|
||||
- 修复版本:待发布
|
||||
- 证据缺口:同一会话 GET 的 `current_question`、`choice_card`、`question_source`,以及最后一条助手 turn 的 `offer_result_id`。缺这四项之前不得臆断写入路径。
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
# 进度 · 并列早退把第二题就判成可采用(2026-09-14)
|
||||
|
||||
## 范围
|
||||
|
||||
- 分支:`codex/rectification-tied-first-fix-20260914`(基于 `origin/staging` @ `e42a62df`)
|
||||
- 任务单:`docs/tasks/TASK-rectification-tied-first-premature-delivery-fix-20260914.md`
|
||||
- BUG-683 resolved;BUG-684 investigating(兜底 + 日志,缺四项 GET 证据)
|
||||
- 任务 1/2/3 均做完,没有走让步
|
||||
|
||||
## 完成
|
||||
|
||||
- T1:`tied_first` 早退加 `!probe && targetedCollectExhausted !== false`。有带年月探针时走判别;定向补事未问完时继续采集。`refreshExhausted` 不参与。
|
||||
- T2:`case.candidateRange` 传入决策。交付时区间等于开局窗口则 `can_adopt=false`,`session_outcome` 只给 `completed_with_range` / `provisional_range`。收窄过的维持原行为。
|
||||
- T3:`interviewDeliveredGap` 把 `questionMissing || deadChoice` 视为可进入 `delivered`;交付态死卡打 `rectification_delivered_state_dead_choice`。非交付死卡仍 `unavailable`。
|
||||
- T4:BUG_HISTORY、CHANGELOG、DESIGN、真机清单。
|
||||
|
||||
## 断言三栏(既有用例)
|
||||
|
||||
| 位置 | 原值 | 新值 | 原因 |
|
||||
| --- | --- | --- | --- |
|
||||
| `rectification-delivery-vs-collect-20260914.test.ts` 并列交付 | `targetedCollectExhausted: false` 仍 `complete_with_range` | `targetedCollectExhausted: true` 才交付 | BUG-683:并列不是「还有题也结束」 |
|
||||
|
||||
## 验收数字
|
||||
|
||||
- `./node_modules/.bin/tsc --noEmit`:0 错
|
||||
- `npm run lint`:0 error / 120 warning(既有,未顺手改)
|
||||
- 定向:`rectification-tied-first-fix-20260914.test.ts` 7/7;`rectification-delivery-vs-collect-20260914.test.ts` 6/6;convergence-budget 14/14;surface-state、decide-next-action、decision-authority、probe-pool-exhausted、candidate-result、targeted-card-live 合计 79/79
|
||||
- 全量 `npm test`:3003 / pass 2836 / fail 153 / skip 14。失败条数与上一轮 Windows 基线 153 一致;本轮多 7 条新测全部通过。153 条是 CRLF、Skill SHA、Docker/DB、无 symlink 权限,不是本单回归。Linux 门禁基线仍是任务书写的 27 条缺口。
|
||||
- `next build`:本机 Turbopack 拒跨 worktree 的 `node_modules` junction。未在本树 `npm ci`。Linux 门禁会在树内安装后构建。未测 `/` Static 与首屏 gzip。
|
||||
- 浏览器级验收:本环境无 staging 登录态,条目写在 `docs/testing/rectification-delivery-vs-collect-20260914.md`。
|
||||
@@ -184,7 +184,7 @@
|
||||
|
||||
| `TASK-rectification-targeted-card-dead-20260913.md` | `PROGRESS-rectification-targeted-card-dead-20260913.md` | **P0**:定向补事卡在快照投影里拿不到 `choice_card`(承接焦点分支不重建 `choice_frame`),卡片看得见点不动、流程停在采集等待态;模型还会把定向题改写成口述题(BUG-669~671)。先于 tie-break 修复单执行 | 待验收 | `codex/rectification-targeted-card-dead-20260913` |
|
||||
|
||||
| `TASK-rectification-tied-first-premature-delivery-fix-20260914.md` | `PROGRESS-rectification-tied-first-fix-20260914.md` | **P0 回归修复单**:BUG-680 的 `tied_first` 早退被实现到 `coverageBlocks` 之前且无 `probe` 守卫 → 新案子答两题、区间还是整个开局窗口就宣布 `can_adopt`/代表分钟(BUG-683);交付态下仍出现死卡致 `delivered` 终态不触发、印「没有拿到下一个问题」(BUG-684 investigating) | 待执行 | `codex/rectification-tied-first-fix-20260914` |
|
||||
| `TASK-rectification-tied-first-premature-delivery-fix-20260914.md` | `PROGRESS-rectification-tied-first-fix-20260914.md` | **P0 回归修复单**:BUG-680 的 `tied_first` 早退被实现到 `coverageBlocks` 之前且无 `probe` 守卫 → 新案子答两题、区间还是整个开局窗口就宣布 `can_adopt`/代表分钟(BUG-683);交付态下仍出现死卡致 `delivered` 终态不触发、印「没有拿到下一个问题」(BUG-684 investigating) | 待验收 | `codex/rectification-tied-first-fix-20260914` |
|
||||
|
||||
| `TASK-rectification-delivery-vs-collect-split-20260914.md` | `PROGRESS-rectification-delivery-vs-collect-20260914.md` | **P0**:并列到顶(tied_first)时 POST 播了交付结论、GET 又算回 collect_evidence——刷新尝试落库失败仍回报「已尝试」+ `stillNeedNarrowing` 压过 exhausted(BUG-680);交付话术闸门与交付卡闸门不一致,`completed_with_range`/`provisional_range` 能说不能画(BUG-681);缺口状态机没有终态,兜底印「没有拿到下一个问题」(BUG-682) | 待验收 | `codex/rectification-delivery-vs-collect-20260914` |
|
||||
|
||||
|
||||
@@ -14,3 +14,10 @@
|
||||
|
||||
- [ ] 没有下一题时,不再出现「没有拿到下一个问题。」和「接着问」。
|
||||
- [ ] 可以改选或继续在输入框补经历,文案不是报错口吻。
|
||||
|
||||
## BUG-683 / 684(并列早退回归)
|
||||
|
||||
新建一次校正,只答两轮采集(例如上学 / 毕业,实习 / 离职)。
|
||||
|
||||
- [ ] 答完两题后不得出现「可采用」或推荐的代表分钟;范围应仍在收窄中,并继续出带年月区分题或定向补事。
|
||||
- [ ] 若助手已经给出区间、界面却还挂着一张画不出选项的题,不得印「没有拿到下一个问题。」+「接着问」。
|
||||
|
||||
Reference in New Issue
Block a user