终态已到达后补写不能覆盖它

**流式协议里"权威终态"(`turn.completed`)到达后,尾部的 EOF / 传输错误 / 迟到分片都不能把状态改回进行中或失败 —— 否则用户看到"已完成的回答被截断成半截 + 卡住"。判据:状态收敛点要前移到终态事件,而不是等流自然读完。**

缺陷形态

Agent 已完成 → 数据库已存完整回复 → Langfuse trace 完整 → HTTP 200
→ 但读 SSE 尾部/EOF 时发生 transport error
→ 旧代码进入 catch,用"不完整的流式内容 + failed 状态"覆盖已收到的完成态
→ Web 显示半截内容或像卡住

关键认知:HTTP 200 只代表响应头成功,不保证 SSE body 能读完。

第二个变体:terminal 到了但 store.status 仍在等 trailing result / EOF 才转 idle → 正文已经出现,停止按钮却一直保留。修法同样是把结算点前移到 turn.completed,并对已收到终态后的错误做 lifecycle reconciliation(保留 completed,不让 catch 覆盖)。

相关