Parent's text-only final message not rendered when a background subagent's turn boundary lands inside the parent turn (1.0.84-8)
还没有人认领这个 Issue。
- 主要语言
- Shell
- 星标
- 11.2k
- 派生
- 1.9k
- 平均合并
- 14 小时 16 分钟
- 30 天内合并 PR
- 6
描述
Summary
In interactive mode, a text-only final assistant message (no tool calls, no reasoning block) was emitted by the model, persisted to the session's events.jsonl and to the session-history store, and never painted in the terminal. The user saw the turn end with no response and asked again. The message is fully present in ~/.copilot/session-state/<id>/events.jsonl as assistant.message with content (1,768 chars), toolRequests: [], rte: true.
What is unusual about the turn: a background subagent (started earlier via task in background mode) was mid-flight, and its assistant.turn_end / assistant.turn_start events fired inside the parent's turn, immediately before the parent's final message. Those subagent turn-boundary events carry no parentToolCallId, so from the event stream they are indistinguishable from the parent's own turn boundaries. The parent's final message was on the parent's turnId (10); the UI had just seen turn_start for the subagent's turnId (70).
This looks related to but distinct from #4735 / #4450 (text before a tool call folded into "Thought for…") — here there was no tool call and no reasoning; the message was the entire turn. It is also distinct from #4533 (full UI freeze) — the UI kept working; only this one message was lost.
Version
GitHub Copilot CLI 1.0.84-8 (auto-updated; ~/.copilot/pkg/darwin-arm64/ holds 1.0.84-4 … 1.0.84-8), macOS arm64, Ghostty, model claude-fable-5.1, background subagent model gpt-5.5.
Event sequence (from events.jsonl, hook events omitted)
idx | time | type | parentToolCallId | turnId | content-len
23315 | 17:13:55.160 | user.message | - | 10 | 95
23318 | 17:13:57.104 | tool.execution_complete | toolu_01Va… | 68 | - <- background subagent
23319 | 17:13:57.274 | assistant.turn_end | - | 68 | - <- subagent turn, NO parentToolCallId
23320 | 17:13:57.277 | assistant.turn_start | - | 69 | - <- subagent turn, NO parentToolCallId
23322 | 17:13:59.512 | model.model_call_success | - | | <- parent's model call
23327 | 17:14:00.901 | assistant.message | toolu_01Va… | 69 | 0 <- subagent (encryptedContent only)
23332 | 17:14:02.952 | assistant.turn_end | - | 69 | -
23333 | 17:14:02.952 | assistant.turn_start | - | 70 | -
23334 | 17:14:06.708 | assistant.message | toolu_01Va… | 70 | 0
23338 | 17:14:52.206 | assistant.message | - | 10 | 1768 <- PARENT's final text; never rendered
23339 | 17:14:52.223 | assistant.turn_end | - | 10 | -
Other text-only final messages earlier in the same session, with subagent turns also interleaved, did render — so this is order/timing-sensitive, consistent with the timeline tracking "current turn" from the most recent assistant.turn_start and discarding a message whose turnId doesn't match.
Expected
A parent assistant.message with content and no tool requests renders as a chat message regardless of subagent turn-boundary events interleaved in the stream. Subagent assistant.turn_start/turn_end events should carry parentToolCallId (as the subagent's assistant.message and tool.execution_* events already do), so the timeline can scope them.
Impact
The user asked the same question three times because the answer was never shown; the assistant, reading its own persisted history, believed it had answered. This is a trust problem: the transcript and the screen disagree.
Reproduction (probabilistic)
- Start a long-running background
task(any model). - While it runs, ask the parent a question whose answer is a text-only reply (no tool calls).
- Repeat until the parent's reply lands within ~1s after a subagent turn boundary. In my session it hit on the third text-only reply during an active background agent.
Happy to share the sanitized events.jsonl slice privately.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先检查复现的 events.jsonl 序列和 session-history 存储周围的事件处理,重点关注当前轮次如何跨越 background-subagent 边界进行跟踪。使用 background task 和 text-only parent reply 复现这个对时序敏感的情况。完成标准是 parent 的 assistant.message 被渲染,同时 subagent 的轮次边界仍保持正确的作用域。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- shell
- 领域
- cli
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 活跃
- 描述清晰度
- 基本清楚
- 新手友好度
- 45/100