github / github/copilot-cli

Parent's text-only final message not rendered when a background subagent's turn boundary lands inside the parent turn (1.0.84-8)

オープン
#4,856 コメント 0 件 リアクション 0 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

triage
主要言語
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)

  1. Start a long-running background task (any model).
  2. While it runs, ask the parent a question whose answer is a text-only reply (no tool calls).
  3. 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.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. 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

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。