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)

Aperta
#4,856 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

triage
Lingua principale
Shell
Stelle
11.2k
Fork
1.9k
Merge medio
14h 16m
PR unite (30g)
6

Descrizione

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.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia ispezionando la gestione degli eventi attorno alla sequenza events.jsonl riprodotta e allo store session-history, concentrandoti su come viene tracciato il turno corrente attraverso i confini di background-subagent. Riproduci il caso sensibile alla temporizzazione con una background task e una text-only parent reply. È completato quando l’assistant.message del parent viene renderizzato, mentre i confini del turno del subagent rimangono correttamente delimitati.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
shell
Ambito
cli
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Attiva
Chiarezza
Abbastanza chiara
Idoneità per principianti
45/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.