Parent's text-only final message not rendered when a background subagent's turn boundary lands inside the parent turn (1.0.84-8)
まだ誰も着手していません。
- 主要言語
- Shell
- スター
- 11.2k
- フォーク
- 1.9k
- 平均マージ
- 14時間 16分
- マージ済み PR(30日)
- 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 にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、再現された events.jsonl シーケンスと session-history ストア周辺のイベント処理を調査し、background-subagent の境界をまたいで現在のターンがどのように追跡されているかに注目します。background task と text-only parent reply を使って、タイミングに依存するケースを再現します。完了条件は、subagent のターン境界が正しくスコープされたまま、parent の assistant.message がレンダリングされることです。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- shell
- 領域
- cli
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 活発
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 45/100