boardx / boardx/workspacex

工具执行期间流式正文反复出现又消失——用户以为出错了

Open
#3,389 9 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
0
Forks
0
Avg merge
1h 7m
Merged PRs (30d)
969

Description

## 人类实测(2026-09-11,devapp)

> 在 tools 的执行的过程中出现,streaming 过来到客户端的内容,会有波动,**出来又消失了,然后继续出来新的内容,然后又消失**,作为用户会很困惑。

即:工具执行期间,助手正文在客户端**反复出现又被抹掉**,不是单调增长。

## 为什么这条重要

用户判断「系统是不是在正常工作」靠的就是**正文在稳定增长**。内容忽有忽无,比完全不显示更糟——用户会以为出错了、以为自己看错了、或者反复刷新。这与本仓一族问题同源:**用户分不清系统状态**(#3186 / #3212 ② / #3302 / #3311 / #3320 / #3372)。

## 首要嫌疑(写成可证伪形式,**请先验证再动手,不要照抄**)

**假说 A —— 正文有两个来源,重读状态把在途流式文本抹掉了。**
已知事实(今天另一条线在 #3316 的诊断中确认):**工具事件是从线程状态重建的(`extractToolCallEvents`),SSE 帧只是「去重读状态」的触发器**。若正文也走同一条重建路径,则每次重读拿到的快照**尚未包含在途增量** ⇒ 已显示的文本被抹掉 ⇒ 下一个增量再补回来 ⇒ 反复闪烁。
- 若成立 ⇒ 抹掉的时刻应与状态重读/工具事件到达的时刻**一一对应**;且抹掉后重新长出的内容**与之前重复**。
- 若不成立(抹掉与重读无时间相关性,或抹掉后内容不重复)⇒ A 被推翻。

**假说 B —— 组件 key 变动导致重挂载。** 本仓栽过同型:Next 动态段 page 级挂载每次切换都重挂载;#3302 的审批组件挂载门一变就卸载、本地 state 清零。
- 若成立 ⇒ DOM 上那个正文节点的身份(identity)在闪烁时刻发生变化,而不只是内容变化。

**假说 C —— 多个流并发写同一个正文缓冲**(例如 skill 活动流与主正文流互相覆盖)。
- 若成立 ⇒ 闪烁只在有并发工具/技能活动时出现,纯文本轮次不出现。

**判别方法**:三个假说的区分点是**「抹掉的时刻与什么相关」**和**「抹掉后长出的内容是否与之前重复」**。请在**真实链路**上逐帧取证(记录代理 / MutationObserver / 逐帧 DOM 快照),不要从代码结构推断。

## 判据要求(本任务最容易做错的地方)

- **断言必须落在「正文的可见文本长度随时间单调不减」**上——这正是本仓已有的一条判据形态:`copilotkit-v2-stream-frame-timing.spec.ts:77` 的「assistant 正文的 DOM 文本长度随时间逐步增长,不是一次性跳变」。**注意那条 spec 今天在 `chat-read` 车道上是红的**(run 34500470766),**先确认它红的是不是同一件事**——若是,本 issue 就是它的根因,别重复造判据。
- **不能只判「最终文本正确」**——闪烁过程结束后最终态往往是对的,那种断言在本缺陷下**无法被证伪**。必须判**过程**。
- **三步反证**:造出缺陷形状(让一次重读覆盖在途文本)→ 断言变红并贴真实输出 → 撤掉 → 恢复绿。**只贴绿不算数**(本仓已九次「全绿但空转」)。

## 纪律提醒

本仓头号病是「同一事实声明在两处」(已**十二例**),而「流式正文 vs 落库正文」**正是被记录过的其中一例**。若查明是 A,修法应收敛成单一权威来源,**不要在重读那侧加特判去躲开在途文本**。

Contributor guide

No contributing guide indexed for this repository

Research direction

Start by running copilotkit-v2-stream-frame-timing.spec.ts:77 in the chat-read lane and confirm whether its failure matches this issue. Then capture the real streaming path with an agent, MutationObserver, or frame-by-frame DOM snapshots while tools run, correlating text removal with state rereads, DOM identity changes, and concurrent streams. Done means a reproducible regression test proves visible assistant text never decreases during streaming and passes after the underlying cause is fixed.

Written by the indexing model from the issue text.

Assessment

Tech stack
typescript
Domain
frontend, testing-qa
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.