fix(voice): speak first, then keep Level 2 skeleton and boundary semantics

Natal answers were opening on parameter tables, and rectification turns were one-sentence legal copy. Centralize user-facing strings, keep representative-minute and question-slot red lines, and stop duplicating the opening collect prompt as a second assistant message.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Jesse_Chen
2026-09-02 02:27:50 +08:00
co-authored by Cursor
parent 8617eb565c
commit ed9497e76a
35 changed files with 652 additions and 118 deletions
+16
View File
@@ -7166,3 +7166,19 @@
- 相关记录:BUG-464、BUG-465
- 复发自:无
- 修复版本:待发布
## BUG-467 | opening 轮把采集题干再写成第二条助手消息
- 状态:resolved
- 首次发现:2026-09-01
- 最近更新:2026-09-01
- 影响面:POST `/api/rectification/agent` opening 成功出口、`finalizeSuccessfulTurnExit`、口述采集当前问题槽
- 用户现象:开场模型正文已经自然引导用户说一件事,紧接着又出现一条服务端采集题干,两条语义重复、语气断裂。
- 触发条件:新 Case `action=opening`,本轮已有非空 assistant 正文,且 focus 为 collect 类。
- 根因:BUG-460 为了让题干进历史,对所有成功推进轮都把 `current_question.prompt` 追加成独立 assistant 消息。opening 的模型正文本身已承担引导,再追加就变成双重提问。
- 修复:focus 仍照常持久化。仅当 `action === opening`、focus 为 collect、且本轮已有非空 assistant 正文时,不再把题干写成第二条 turn 消息。判定只看 action / kind / intent / 正文是否非空,不读正文内容。
- 验证:`shouldPersistFocusPromptTurn` 矩阵;既有 server-focus / question-ownership / 非终态出口闸测试保持;`agent-voice-copy-contract.test.ts`
- 防复发:不得用正文字符串判断“是否已问过”。非 opening 轮仍把服务端题干写入历史。
- 相关记录:BUG-456、BUG-460、BUG-461
- 复发自:BUG-460
- 修复版本:待发布