diff --git a/docs/BUG_HISTORY.md b/docs/BUG_HISTORY.md index b41e426e..c532b44d 100644 --- a/docs/BUG_HISTORY.md +++ b/docs/BUG_HISTORY.md @@ -1398,3 +1398,18 @@ - 防复发:只要首轮已向用户展示生时校正状态,可见文案必须同时呈现结构化候选边界;不得只在隐藏状态中保存范围,也不得为了润色首问重新引入模型调用。 - 相关记录:BUG-055、BUG-067、BUG-072 - 修复版本:待提交(本地可测) + +## BUG-075 | 生时校正强制每轮提问并阻碍开放叙事 + +- 状态:resolved +- 首次发现:2026-07-26 +- 最近更新:2026-07-26 +- 影响面:生时校正 Narrative Agent、非评分轮续接、确定性首轮、聊天消息完成态 +- 用户现象:用户叙述一段或多段人生经历后,Agent 会机械追加问题、反复继承上一轮追问,并在普通资料交流结束后显示“回答已完成”,整体表现像问卷收集器而不是能理解人生轨迹的校时助手。 +- 触发条件:非最终轮模型只做自然回应但同时返回结构化追问,或本轮没有生成新追问却沿用上一轮 `evidenceRequest`;所有 settled Assistant 消息都会渲染统一完成标签。 +- 根因:Narrative Prompt 强制每个非最终回复恰好以一个问题结束;服务端 repair 会把隐藏的 `evidenceRequest.prompt` 自动追加到正文;非评分轮会自动生成缺失信息追问并继承旧 `evidenceRequest`;通用消息组件把 settled 状态映射成“回答已完成”。 +- 修复:允许用户一次叙述一件或多件经历并自由连续表达,问题改为 Agent 可选行为;删除自动补问和已评分事件的聊天限制,普通自然回复使用 `evidenceRequest: null`;首轮只开放邀请叙述,非评分轮不再自动规划或继承问题,仅在明确的结构化纠正承接中保留必要状态;settled 消息不再渲染活动状态。事件抽取、保存、技术评分、候选收敛和分钟确认安全门保持不变。 +- 验证:Narrative Agent、Orchestrator 与聊天布局聚焦测试 101/101 通过;目标 ESLint 无错误或警告;Next.js 16 Webpack 生产构建与 `git diff --check` 通过。 +- 防复发:代码不得要求每轮必须提问,也不得把隐藏 prompt 自动拼接到 Agent 正文;没有可见短答问题时 `evidenceRequest` 应为 null,用户叙述节奏由 Agent 与用户共同决定,代码只维护记录、抽取、评分、收敛与确认边界。 +- 相关记录:BUG-070、BUG-072、BUG-074 +- 修复版本:待提交(本地可测) diff --git a/frontend/src/components/agent-activity-status.tsx b/frontend/src/components/agent-activity-status.tsx index 0c1c422a..11d9b03e 100644 --- a/frontend/src/components/agent-activity-status.tsx +++ b/frontend/src/components/agent-activity-status.tsx @@ -1,4 +1,3 @@ -import { CircleCheck } from "lucide-react"; import { ThinkingOrb, type OrbState } from "thinking-orbs"; const labels = { @@ -8,10 +7,9 @@ const labels = { listening: "正在聆听…", composing: "正在组织回答…", shaping: "正在生成结果…", - completed: "回答已完成", -} as const satisfies Record; +} as const satisfies Record; -export type AgentActivityState = OrbState | "completed"; +export type AgentActivityState = OrbState; export function AgentActivityStatus({ state, @@ -21,10 +19,8 @@ export function AgentActivityStatus({ label?: string; }>) { return ( -
- {state === "completed" - ?