fix(rectification): hang spoken year follow-ups and drop engine representative from model tables (BUG-678/676)
Spoken collect without askedTurnId now hangs on the last assistant message, remaining-candidate copy uses credible_range, and engine representativeTime no longer keeps eliminated minutes in model house tables.
This commit is contained in:
+25
-9
@@ -10519,17 +10519,17 @@
|
||||
|
||||
## BUG-676 | 代表时间取到被淘汰候选
|
||||
|
||||
- 状态:investigating
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-14
|
||||
- 最近更新:2026-09-14
|
||||
- 影响面:`evaluateCandidateSeparation`、`rankActive`、decision receipt `representative_time` / `last_inference_round`
|
||||
- 用户现象:同一轮 receipt 里 `representative_time` 落在 `eliminated_ids` 中(例如 05:14),界面范围是 04:48–05:07,也不含该分钟。
|
||||
- 触发条件:本轮有淘汰名单,对外代表时间与 `winner_id` / 范围不一致。
|
||||
- 根因:未知。已确认 `evaluateCandidateSeparation` 按 score 取 `ranked[0]`,`evaluateConvergence` 先滤 `status === eliminated` 再按后验排序。尚未拿到同一份 `inference_state.candidates`(id / time / status / probability / posterior_score)与 `credible_range`,不能断定是 status 没写回、后验没重算,还是两套分数不是同一份。
|
||||
- 修复:本轮只加不变量告警 `rectification_representative_time_inconsistent`(代表时间在 eliminated 内或落在 credible_range 外)。不改排序。
|
||||
- 验证:`frontend/tests/rectification-unstampable-probe-20260914.test.ts` 两条告警路径。
|
||||
- 防复发:代表时间必须不在本轮 `eliminated_ids` 内,且落在 `credible_range` 内。根因确认后另立修复单,不得为了「数字看起来对」顺手改排序。
|
||||
- 相关记录:BUG-442
|
||||
- 影响面:`evaluateCandidateSeparation`、`rankActive`、decision receipt `representative_time` / `last_inference_round`、`slimDecisionReceipt`
|
||||
- 用户现象:同一轮 receipt 里引擎 `representative_time` 落在 `eliminated_ids` 中(例如 05:14),界面范围是 04:48–05:07,也不含该分钟。
|
||||
- 触发条件:本轮有淘汰名单,引擎代表时间与前端推理第一名 / 范围不一致。
|
||||
- 根因:引擎与前端是两套代表时间,未对账。Python 引擎按自身事件拟合排整张网格,不吃前端累积问答,把 05:14 写进结果行;`overlayPublicDecision` 在 `fromInference` 时用推理值覆盖,**界面从未显示过 05:14**。真实副作用是 `case-receipt-projection` 把 `latestResult.representativeTime`(引擎值)算进活跃时间集合,已被淘汰分钟的 `house_tables_by_time` 仍送给模型。
|
||||
- 修复:活跃时间集合去掉引擎 `representativeTime`,只保留推理活跃候选、`inference.representative_time`、用户已采用的 `selectedTime`。不改排序。上一轮的不变量告警 `rectification_representative_time_inconsistent` 保留。
|
||||
- 验证:`frontend/tests/rectification-spoken-orphan-20260914.test.ts`(淘汰分钟不进 `house_tables_by_time`;`selectedTime` 仍保留);告警路径仍由 `rectification-unstampable-probe-20260914.test.ts` 覆盖。
|
||||
- 防复发:引擎代表时间不得进入模型上下文的活跃宫位表,也不得显示给用户,不得反过来覆盖前端推理值。
|
||||
- 相关记录:BUG-442、BUG-678
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
@@ -10548,3 +10548,19 @@
|
||||
- 相关记录:BUG-149、BUG-364
|
||||
- 复发自:无
|
||||
- 修复版本:待发布
|
||||
|
||||
## BUG-678 | 口述题没有 askedTurnId 时仍是无头像裸行
|
||||
|
||||
- 状态:resolved
|
||||
- 首次发现:2026-09-14
|
||||
- 最近更新:2026-09-14
|
||||
- 影响面:`attachQuestionsToTurns`、`focusSpokenPrompt`、`rectificationQuestionGapState` / `persisted_question`
|
||||
- 用户现象:定向补事答「有过这件事」之后,助手气泡只有「记下了。」,时间轴「目前范围」下面一行没有头像的裸题「大概哪年几月?」。
|
||||
- 触发条件:年份追问焦点 `collect:targeted:<domain>:year`、`kind = collect_spoken`、`askedTurnId = null`、`status = active`;上一轮挂回规则只覆盖选择题。
|
||||
- 根因:BUG-675 把 `attachQuestionsToTurns` 的 hanging 限定成 `turnQuestionKind(focus) === "choice"`。口述题没有卡可画,但同样需要头像与消息位置;短题干「大概哪年几月?」只有 7 字,`focusSpokenPrompt` 的 8 字下限会让挂回后的 `turnQuestionFromFocus` 仍返回空。
|
||||
- 修复:无 `askedTurnId` 的活动焦点一律可挂到最后一条尚无题的助手消息;采集 schema 允许短于 8 字的题干。`persisted_question` 纯文本块只留给一条助手消息都没有的兜底。年份追问仍是口述,不做点选卡。
|
||||
- 验证:`frontend/tests/rectification-spoken-orphan-20260914.test.ts`;`rectification-collect-prompt.test.ts` 补口述挂回。
|
||||
- 防复发:挂回规则不得再按 `choice` 排除口述题。不得把年份追问改成点选卡来绕过渲染。不得新增第二套问题组件。
|
||||
- 相关记录:BUG-675、BUG-673、BUG-671
|
||||
- 复发自:BUG-675(同一块兜底只修了选择题)
|
||||
- 修复版本:待发布
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
# 进度 · 口述题孤儿裸行与引擎代表时间(2026-09-14)
|
||||
|
||||
## 范围
|
||||
|
||||
- 分支:`codex/rectification-spoken-orphan-20260914`(基于 `origin/staging` @ `a5acd535`)
|
||||
- 任务单:`docs/tasks/TASK-rectification-spoken-orphan-and-engine-representative-20260914.md`
|
||||
- BUG-678 resolved;BUG-676 从 investigating 收敛为 resolved
|
||||
- 任务 1/2/3 均做完,没有走让步
|
||||
|
||||
## 完成
|
||||
|
||||
- T1:`attachQuestionsToTurns` 对无 `askedTurnId` 的活动焦点一律挂回最后一条尚无题的助手消息;`focusSpokenPrompt` 允许采集 schema 短于 8 字(「大概哪年几月?」)。`persisted_question` 只留给没有助手消息可挂的兜底。
|
||||
- T2:`remainingCandidatesLine` 优先用 `credible_range`,缺失才退回活跃候选首尾。`targetedCollectPool` / `rangeNarrowHint` / `targetedCollectFollowup` / catalog 同步传入。`remainingSplitTimes` 的排序/去重用途未改。
|
||||
- T3:`slimDecisionReceipt` 活跃时间集合去掉 `latestResult.representativeTime`;保留推理活跃候选、`inference.representative_time`、用户已采用的 `selectedTime`。不改排序。
|
||||
- T4:BUG-678 新增;BUG-676 根因更正为两套代表时间未对账,并写明界面从未显示 05:14。CHANGELOG、真机清单、DESIGN 范围口径。
|
||||
|
||||
## 验收数字
|
||||
|
||||
- `./node_modules/.bin/tsc --noEmit`:0 错
|
||||
- `npm run lint`:0 error(120 warning,与基线同类,无新增 error)
|
||||
- 相关单测 46/46:`rectification-spoken-orphan-20260914.test.ts` 3/3,加上 collect-prompt / collection-question-pool / case-receipt-projection / unstampable-probe / surface-state
|
||||
- `npm test`:2989 tests,2822 pass / 153 fail / 14 skip。比上一轮 Windows 基线(2985 / 2818 / 153 / 14)多 4 条全绿用例;失败清单仍是 Caddy/CRLF、Docker、bash、workflow YAML、Skill SHA、page.tsx 源码正则,没有新的校正产品失败
|
||||
- `next build`:本工作树 `frontend/node_modules` 是 junction,Turbopack 拒绝软链;`--webpack` 编译与 tsc 通过,收集 page data 时因本机 Skill 10.0.26 SHA 与 registry 不一致失败(环境问题,未改 skill 包)。`/` 是否仍 `○ Static` 需在有真实 `node_modules` 且 skill 哈希匹配的树上复核
|
||||
@@ -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-spoken-orphan-and-engine-representative-20260914.md` | `PROGRESS-rectification-spoken-orphan-20260914.md` | **P0**:口述题(定向补事年份追问)没有 `askedTurnId` 时仍是无头像裸行——BUG-675 的挂回规则只覆盖选择题(BUG-678);同屏两个范围口径(旁白用活跃候选首尾、时间轴用 credible_range);引擎 `representative_time` 把已淘汰分钟的宫位表带进模型上下文(BUG-676 收敛为 resolved) | 待执行 | `codex/rectification-spoken-orphan-20260914` |
|
||||
| `TASK-rectification-spoken-orphan-and-engine-representative-20260914.md` | `PROGRESS-rectification-spoken-orphan-20260914.md` | **P0**:口述题(定向补事年份追问)没有 `askedTurnId` 时仍是无头像裸行——BUG-675 的挂回规则只覆盖选择题(BUG-678);同屏两个范围口径(旁白用活跃候选首尾、时间轴用 credible_range);引擎 `representative_time` 把已淘汰分钟的宫位表带进模型上下文(BUG-676 收敛为 resolved) | 待验收 | `codex/rectification-spoken-orphan-20260914` |
|
||||
|
||||
| `TASK-rectification-unstampable-probe-and-naked-card-20260914.md` | `PROGRESS-rectification-unstampable-probe-20260914.md` | **P0**:探针池空后判别题盖不上 probe → 焦点写不进 → 题干被念进正文、同一题反复问且答了不算数(BUG-674,推翻前一单 D3);快照已有 `choice_card` 但 `persisted_question` 仍只画一行裸题(BUG-675);同一轮 receipt 里 `representative_time` 取到 `eliminated_ids` 里的候选(BUG-676,investigating) | 待验收 | `codex/rectification-unstampable-probe-20260914` |
|
||||
|
||||
|
||||
@@ -0,0 +1,21 @@
|
||||
# 口述题挂回、同屏范围、引擎代表时间:真机清单(2026-09-14)
|
||||
|
||||
分支 `codex/rectification-spoken-orphan-20260914`。本环境无 staging 登录态。
|
||||
|
||||
## BUG-678
|
||||
|
||||
进入当时那个校正会话,或再走一遍「定向补事答 A(有过这件事)」。
|
||||
|
||||
- [ ] 答 A 之后出现「大概哪年几月?」,带头像,在助手消息里,不在时间轴下面一行裸题。
|
||||
- [ ] 输入框提示指向上面的问题,而不是时间轴下方再出一块无头像题干。
|
||||
- [ ] 年份追问仍是口述,没有被做成 A/B/C/D 点选卡。
|
||||
|
||||
## 同屏范围口径
|
||||
|
||||
- [ ] 助手旁白「现在还剩 HH:MM–HH:MM 里 N 个候选」与时间轴「目前范围 HH:MM–HH:MM」起止分钟完全一致。
|
||||
- [ ] 候选个数仍是还活着的分钟数,不是区间宽度。
|
||||
|
||||
## BUG-676
|
||||
|
||||
- [ ] 界面代表分钟仍是前端推理第一名,不会突然变成已被淘汰的分钟。
|
||||
- [ ] 打开当时那轮送给模型的 receipt(脱敏):`house_tables_by_time` 不含已淘汰的引擎代表分钟。
|
||||
Reference in New Issue
Block a user