fix(rectification): keep choice stems visible and align overlay adopt with the engine
Independent Staging Quality Gate / validate (push) Successful in 7m44s
Independent Staging Quality Gate / publish (push) Successful in 1m48s

Walkthrough polish: fail-closed empty D9 prompts, stop asserting the next question is on screen, vary same-domain collect copy, switch to reverse-verify after adopt, and let coverage route interview without blocking can_adopt.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-02 13:10:03 +08:00
parent bd79689f66
commit aab3ad4b84
22 changed files with 1019 additions and 82 deletions
+78
View File
@@ -7378,3 +7378,81 @@
- 相关记录:BUG-464(消息按需加载引入的首屏消息等待,流式轮已把当前会话消息前移到揭幕前)、BUG-470effect 内 setState 规则)
- 复发自:无
- 修复版本:待发布
## BUG-480 | 第一道 D9 选择卡只有 A-D、没有题干
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-02
- 影响面:`persistServerOwnedFocus``persistPlanFocus``finalizeSuccessfulTurnExit`、选择题 `choice_frame.prompt`
- 用户现象:走查第一道 D9 相处方式卡只有 A–D,题干不在卡片上,也不在 turn 历史里。后续点选题走 answer_choice 路径则正常。
- 触发条件:message/agent 路径首次为 `distinguish_candidates` 建 focus`serverOwnedChoiceCopy` 因空 prompt/period 返回 null,或 turn-exit 只在 idle 新建 focus 时写题干 turn。
- 根因:copy 为 null 时仍可能留下不可渲染 choiceagent `persistPlanFocus` 没有 spoken collect 回退;turn-exit 在 agent 已建 focus 时跳过题干持久化。
- 修复:copy 为 null 的区分题 fail-closed,回退为 `spokenCollectFallbackFollowup`,不建空题干 choice。agent 路径同样回退。turn-exit 只要当前问题有 prompt 就按既有结构规则写题干 turn。D9 `varga_style` 优先接上探针问句。不改 Python 引擎,不 bump Skill。
- 验证:`rectification-walkthrough-polish` D9 不变量与 unwired 回退;`rectification-server-focus``agent-voice-copy-contract`。未做登录后的真实页面点选。
- 防复发:任何可渲染 `choice_card` 必须有非空 prompt;不得再把空 prompt 的 choice focus 当成功创建。agent 与 idle 创建链都要走同一 fail-closed。
- 相关记录:BUG-460、BUG-461、BUG-469、BUG-471
- 复发自:BUG-471(可见 legend 修好后,空 prompt 创建链仍会丢题干)
- 修复版本:待发布
## BUG-481 | 正文说「界面上有下一问」时问题槽还是空的
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-02
- 影响面:`agentic-rectification` 指令、`VOICE.md`、流结束后 `loadCaseSnapshot`
- 用户现象:助手说界面上已有下一问,用户当下看不到题干。题干 turn 在流结束后的 turn-exit 才写入。
- 触发条件:Agent 正文断言界面当前状态;前端在 `done` 后才刷新 case 快照。
- 根因:指令允许「过渡到界面上的下一步」;模型把尚未刷新的槽位说成已经出现。
- 修复:指令改为中性过渡(「接下来我们继续」),明确禁止断言界面当前状态。时序沿用已有 `await loadCaseSnapshot()`,不新增 `question.ready` 事件。
- 验证:`agent-voice-copy-contract``rectification-walkthrough-polish` 指令合同。未做登录后的真实页面点选。
- 防复发:正文不得写「界面上有/出现了下一问」。题干真源仍是服务端问题槽。
- 相关记录:BUG-441、BUG-449、BUG-471
- 复发自:BUG-471(直播看不到题干时,模型仍被要求过渡到「界面上的下一步」)
- 修复版本:待发布
## BUG-482 | 同域采集问句逐字复读
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-02
- 影响面:`USER_COLLECT_QUESTION_RETRY``spokenFollowupForUser``buildMethodFollowupPlan`
- 用户现象:「感情这边,还记得哪年认真在一起、分开,或结婚吗?」在历史里逐字出现两次。第一次用工作事件回答后重问正确,但措辞完全一样。
- 触发条件:该域 collect focus 已关闭且未被拒答,覆盖仍未完成,下一问再次采集同一域。
- 根因:采集 copy 每域只有一句;没有用结构化「已问过」状态切换第二措辞。
- 修复:每域增加 retry 变体。`closedCollectFocuses` 里该域 collect 已建立且 status 不是 declined 时设 `collect_retry`。不做正文字符串匹配。
- 验证:`rectification-walkthrough-polish` 同域 retry`agent-voice-copy-contract` 可见文案词表。未做登录后的真实页面点选。
- 防复发:同域重问必须换第二措辞;判定只用 focus 结构化状态,不读正文。
- 相关记录:BUG-028、BUG-087
- 修复版本:待发布
## BUG-483 | 采用后仍挂着采用前的采集题,没有切入前事核对
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-02
- 影响面:`persistNextInterviewIfIdle`、accept 路由、`.rectification-question-slot` 渲染位置
- 用户现象:采用 04:53 成功后,当前问题仍是采用前的财务采集,显示在候选卡下方、脱离对话流。预期是最多两件前事核对。
- 触发条件:accept RPC 成功,active focus 仍是 collectidle 见任何 activeFocus 就直接返回。
- 根因:`buildMethodFollowupPlan` 在 accepted 时会出 reverse_verify,但 idle 被旧 collect 挡住;accept 成功后也不替换 focus。问题槽是消息列表的兄弟节点。
- 修复:`accepted_time` 存在且当前 focus 不是 reverse_verify/oos 时,先 skipped 关闭再 persist 下一问。accept 成功后调用同一 idle。问题槽改到最新一条消息内、候选卡之后。GET 不作为主变更路径。
- 验证:`rectification-walkthrough-polish` 采用后不变量;`rectification-eight-method` reverse_verify`rectification-spoken-collect` 槽位合同。未做登录后的真实页面点选。
- 防复发:`accepted_time` 非空时 `current_question` 不得仍是采用前 collect。问题槽必须留在对话流内。
- 相关记录:BUG-117、BUG-120
- 修复版本:待发布
## BUG-484 | overlay `can_adopt` 与引擎出牌/采用不一致
- 状态:resolved
- 首次发现:2026-09-02
- 最近更新:2026-09-02
- 影响面:`deliveryCapability`、GET overlay `can_adopt`、offer/accept 可执行性
- 用户现象:职业从未被问,overlay 判 `can_adopt:false`,但 offer 工具与引擎 `accept_allowed=true` 仍出牌且采用成功。
- 触发条件:blocking coverage 未齐(含 occupation 路由缺口),引擎 ceiling 已放行采用。
- 根因:`deliveryCapability``methodCoverageAll` 和训练门绑进 `locallySelectable`。BUG-472 已把 occupation 移出 blocking 集合,其余 coverage 仍挡 overlay 采用。
- 修复:方案 1(对齐引擎)。coverage 从采用门移除,只保留为问询路由优先级。训练门 3/2、`keep_collecting` 证据下限、引擎 ceiling、确认门不变。`canAdopt` 为真且 nextAction 已是出牌/采用时,仍持久化 `deferred_followup` 里的剩余区分题与未覆盖 blocking collect;点选回执不得用采用口播覆盖已写入的下一题题干。职业/财务/已覆盖层的耗尽采集在出牌态仍跳过。不 bump Skill 10.0.14;「职业挡出牌」的 skill 文本偏差记在本条,下次 skill 版本再改。
- 验证:`rectification-walkthrough-polish` overlay 与引擎对齐;`rectification-occupation-coverage-exit``rectification-decide-next-action``rectification-range-offer-deadend``rectification-answer-choice` 点选后仍持久化下一张带年区分卡与家人采集;`rectification-decision-authority` 非终态出口仍等待家人采集写入。`./node_modules/.bin/tsc --noEmit` 与四组测试见当轮记录。未做登录后的真实页面点选。
- 防复发:overlay `can_adopt` 必须与 offer/accept 实际可执行性一致。不得把 coverage 重新写回采用门。不得放宽确认门。不得因为 `canAdopt` 就跳过剩余区分题或未覆盖的 dasha/D9/D10/家人采集。点选回执在下一题已写入时不得改写成采用口播。
- 相关记录:BUG-453、BUG-463、BUG-472
- 复发自:BUG-472occupation 移出 blocking 后,deliveryCapability 仍用 coverageComplete 挡采用)
- 修复版本:待发布