Repository navigation
fix(server): queue Copilot follow-ups without killing background agents - #26715
Conversation
Steering a GitHub Copilot ACP turn sent session/cancel and a new prompt, and cancelling a Copilot prompt also kills the background agents it started. Copilot now advertises no interrupt-restart steering, and a steer aimed at a live run whose provider can neither steer nor restart waits in the queue until that turn ends. Explicit restarts are unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ApprovabilityVerdict: Needs Human Approval Macroscope's review found this PR requires human approval — Copilot follow-ups will queue instead of interrupting and restarting active work, preserving background agents but delaying redirection. This changes existing delivery behavior and requires a human decision on that product-default tradeoff. No code changes detected at You can add or adjust custom eligibility rules. Learn more. |
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
|
No actionable comments were generated in the recent review.
|
| Layer / File(s) | Summary |
|---|---|
Copilot turn capabilities packages/provider-acp-registry/src/server/adapter.ts, apps/server/src/orchestration-v2/Adapters/AcpRegistryAdapterV2.test.ts |
The adapter disables interrupt-and-restart steering for Copilot. Tests check Copilot and Gemini turn capabilities. |
Active-run dispatch policy apps/server/src/orchestration-v2/CommandPolicy.ts, apps/server/src/orchestration-v2/CommandPolicy.test.ts |
Shared helpers identify active runs and resolve provider turn capabilities. When an active run supports neither steering mode and queued messages are supported, dispatch queues the message. Tests cover queueing, restart behavior, and a missing explicit target. |
Queued follow-up execution apps/server/src/orchestration-v2/SteeringCompletion.integration.test.ts |
The integration test verifies that a follow-up stays queued during the active turn, does not steer or interrupt it, and starts as a new turn after the current turn completes. |
Priority:
Estimated code review effort: 3 (Moderate) | ~20 minutes
Change: Bug fix · Severity of issue fixed: Low
Possibly related issues
- Issue 26695 describes Copilot background agents being cancelled when a follow-up uses interrupt-and-restart steering. This change disables that steering capability for Copilot and queues follow-ups when the provider cannot steer.
Possibly related PRs
- pingdotgg/t3code#25749: Both changes adjust message dispatch and queued follow-up behavior based on whether a provider turn is running.
- pingdotgg/t3code#22802: Both changes define delivery behavior for messages sent during active work.
- pingdotgg/t3code#25035: Both changes address steer-versus-queue behavior for messages that cannot be steered.
Suggested labels: bugfix
Suggested reviewers: t3dotgg, juliusmarminge
Merge Risk: 
Minimal · up to e3135
-
No merge-blocking regression was identified in the queued follow-up change.
Pre-merge checks: 
4
-
Full details: Linked Issues check
-
Explanation
Issue [
#26695] requires Copilot follow-ups to reach Copilot without cancelling native background agents.packages/provider-acp-registry/src/server/adapter.tsidentifies registry and local Copilot commands and disables interrupt-and-restart steering.apps/server/src/orchestration-v2/CommandPolicy.tsqueues active-run messages when the provider supports queued messages but supports neither safe steering method. The added integration test verifies that the follow-up remains queued, does not interrupt the current turn, and starts after completion. The capability and policy tests cover Copilot identification and automatic and explicit dispatch resolution.
Full details: Out of Scope Changes check
-
Explanation
The changed source, policy logic, and regression tests directly support issue [
#26695]. The Copilot capability change prevents destructive cancellation. The dispatch change selects the existing durable queue. The tests verify the required behavior and preserve provider-specific capability behavior. No unrelated product, client, protocol, or UI changes appear in the reviewed scope.
Full details: Description check
-
Explanation
The pull request description covers the problem, expected behavior, implementation changes, scope, linked issue, verification steps, observed results, platform limitations, and agent disclosure. The scope section does not include an explicit maintainer approval comment, but it links the triaged issue and clearly explains why the focused bug fix stays within scope.
-
Finishing Touches
-
📝 Generate docstrings
-
- Commit to this branch
- Create a new PR
🧪 Generate unit tests (beta)
-
- Commit to this branch
- Create a new PR
-
- Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Comment @coderabbitai help to get the list of available commands.
…ts (pingdotgg#26715) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
**v0.1.5** · 25 changes from 5 contributors ## Highlights Turn a No project thread into a project. Use Claude and GPT models and thinking controls with Antigravity. Customize thread details, including usage limits. Switch all your installations between Stable and Nightly in one step. ## Fixes - New threads avoid providers that just hit usage limits (#26234) - Guest links no longer expose file diffs (#26538) - Claude edits open as diffs, not raw JSON (#26529) - Fixed a desktop security vulnerability in Brotli decompression (#26348) - Undo notices no longer cover threads (#26874) - Antigravity file reads no longer show unrelated errors (#26910) - T3 starts on fresh Ubuntu servers without libatomic (#26912) - Update everything no longer unnecessarily waits for npm (#26917) - Antigravity file reads no longer keep spinning (#26928) - Copilot follow-ups no longer kill background agents (#26715) <details> <summary>Full changelog</summary> ## What's Changed * fix(server,cursor,opencode): refresh provider usage when a turn hits its usage limit by @maria-rcks in pingdotgg/t3code#26234 * fix(web): keep tool groups collapsed after a usage-limit pause by @shivamhwp in pingdotgg/t3code#24937 * fix(mobile): photo-library PNGs no longer fail after resizing by @shivamhwp in pingdotgg/t3code#26522 * fix(server): guest links no longer return file diffs by @nexxeln in pingdotgg/t3code#26538 * fix(claude): Open diff shows Claude edits as a diff instead of raw JSON by @nexxeln in pingdotgg/t3code#26529 * chore: vouch nexxeln by @t3dotgg in pingdotgg/t3code#26812 * feat(web): Labs toggle keeps 5h, weekly, and context limits in view by @t3dotgg in pingdotgg/t3code#26859 * fix(desktop): bump Electron to 44.10.0 for the Node.js Brotli fix (CVE-2026-111497) by @nabettu in pingdotgg/t3code#26348 * chore: make agent mistakes fail early by @t3dotgg in pingdotgg/t3code#26167 * feat(marketing): hero shows four agents running at once by @t3dotgg in pingdotgg/t3code#26875 * fix(web): undo notice moves to the sidebar footer so it never covers a thread by @t3dotgg in pingdotgg/t3code#26874 * feat: turn a No project thread into a project by @t3dotgg in pingdotgg/t3code#26767 * feat(antigravity): Claude and GPT models, thinking levels, and diff edits by @t3dotgg in pingdotgg/t3code#26876 * feat(web): choose what the thread details card shows by @t3dotgg in pingdotgg/t3code#26904 * feat(updates): switch your whole fleet between Stable and Nightly in one step by @t3dotgg in pingdotgg/t3code#26288 * fix(antigravity): file reads no longer show unrelated errors by @t3dotgg in pingdotgg/t3code#26910 * feat(release): release notes and the update popover open with a short note by @t3dotgg in pingdotgg/t3code#26893 * fix(cli): t3 starts on a fresh Ubuntu server without libatomic by @t3dotgg in pingdotgg/t3code#26912 * fix(web): update everything no longer waits on npm for service hosts by @t3dotgg in pingdotgg/t3code#26917 * test(web): pin the npm wait floor for update everything by @t3dotgg in pingdotgg/t3code#26921 * fix(antigravity): served reads stop spinning and duplicate model names are labeled by @t3dotgg in pingdotgg/t3code#26928 * fix(server): queue Copilot follow-ups without killing background agents by @shivamhwp in pingdotgg/t3code#26715 * fix(web): Antigravity effort no longer shows a speedometer in the composer by @t3dotgg in pingdotgg/t3code#26929 * fix(release): Linux CLI archives build on runners without package docs by @t3dotgg in pingdotgg/t3code#26932 **Full Changelog**: pingdotgg/t3code@v0.1.4...v0.1.5 </details> Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.5
**v0.1.5-nightly.20261029.3877** · 10 changes from 2 contributors ## Highlights Switch your servers and desktop apps between Stable and Nightly together. Release notes now open with a concise summary. ## Fixes - Antigravity file reads no longer show unrelated errors (#26910) - T3 starts on fresh Ubuntu servers without libatomic (#26912) - Update everything no longer skips background-service hosts (#26917) - Antigravity file reads no longer spin until completion (#26928) - Duplicate Antigravity model names are distinguishable (#26928) - Copilot follow-ups no longer kill background agents (#26715) <details> <summary>Full changelog</summary> ## What's Changed * feat(updates): switch your whole fleet between Stable and Nightly in one step by @t3dotgg in pingdotgg/t3code#26288 * fix(antigravity): file reads no longer show unrelated errors by @t3dotgg in pingdotgg/t3code#26910 * feat(release): release notes and the update popover open with a short note by @t3dotgg in pingdotgg/t3code#26893 * fix(cli): t3 starts on a fresh Ubuntu server without libatomic by @t3dotgg in pingdotgg/t3code#26912 * fix(web): update everything no longer waits on npm for service hosts by @t3dotgg in pingdotgg/t3code#26917 * test(web): pin the npm wait floor for update everything by @t3dotgg in pingdotgg/t3code#26921 * fix(antigravity): served reads stop spinning and duplicate model names are labeled by @t3dotgg in pingdotgg/t3code#26928 * fix(server): queue Copilot follow-ups without killing background agents by @shivamhwp in pingdotgg/t3code#26715 * fix(web): Antigravity effort no longer shows a speedometer in the composer by @t3dotgg in pingdotgg/t3code#26929 * fix(release): Linux CLI archives build on runners without package docs by @t3dotgg in pingdotgg/t3code#26932 **Full Changelog**: pingdotgg/t3code@v0.1.5-nightly.20261029.3873...v0.1.5-nightly.20261029.3877 </details> Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.5-nightly.20261029.3877
Steering a Copilot thread interrupts its prompt and kills its native background agents. This change queues Copilot follow-ups until the current prompt finishes, so background work survives and the follow-up runs afterward.
Copilot's ACP adapter now reports that interrupt-and-restart steering is unsupported. The server uses the existing durable queue when a provider supports queueing but cannot steer safely. Other ACP providers keep their current capabilities. Stop remains available. Explicit Restart through
t3_thread_sendnow reports unsupported for Copilot because the existing restart policy uses the same capability; use Stop followed by a new message when cancellation is intended.The reporter was on macOS. The Copilot capability override in
makeAcpRegistryAdapterV2and the queue decision inresolveMessageDispatchIntenthave no OS-specific branch. The orchestrator applies this decision before provider effects run, so the corex composer verification exercises the same cancellation prevention on macOS. Web, desktop and mobile send throughEnvironmentCommands.startThreadTurnandCommandPolicy.resolveMessageDispatchIntent; their queue views usederiveThreadQueueWorkflowStatefrompackages/client-runtime/src/state/threadWorkflows.ts.Closes #26695
Client evidence
Captured in the real web client on corex with isolated development state and official Copilot CLI 1.0.105 over ACP. Before: main
7632c3dc7039953cc50282e1bc339e1bf11f2ffc. After: this PR's heade313525eccea0fe85d8dad6a80563835032c2787. Both usedgpt-6-luna; Copilot also routed the native child to Luna. A transparent ACP proxy recorded protocol milestones without changing the messages. The source servers ran withvp run dev --home-dir <isolated-home> --no-seed, and the web clients used the same-origin Vite proxy.The reporter's prompt was sent through the composer:
While the background shell was running, the composer sent: "After the background agent completes, reply FOLLOWUP_DONE."
Before, the follow-up cut off the current attempt. Copilot cancelled its background agent 18 seconds into the 90-second shell command. The earlier completed turn above it is a separate attempt without a follow-up. Copilot later restarted background work to answer the follow-up; the original child was cancelled.
After, the follow-up stays queued below the running background agent instead of interrupting it.
The background shell then finishes with
BG_DONE, and the queued follow-up completes withFOLLOWUP_DONE.The ACP transcript confirms what the client shows. Times are UTC on 2026-10-29.
The fixed run recorded zero
session/canceland abort events. Both prompts completed successfully.Verification
The branch was updated with main
3748c5c241a2740f2e0856e2c2a3f9d8ee7ff8e9in merge commitfdfe353eb0723d53d6772b9f7ad79d08432cc531. All five files in this fix are identical toe313525eccea0fe85d8dad6a80563835032c2787, so the client captures and local command output still cover the unchanged fix.The client captures and runtime transcript above cover head
e313525eccea0fe85d8dad6a80563835032c2787. No new setting, UI, contract or protocol change is included.The following commands ran on corex against that committed head. Each PNG renders the full captured text log, including the full SHA, command, timestamps, result and exit code.
Recorded results:
The focused suites cover Copilot capability identification, explicit and automatic dispatch resolution, and queued delivery without interruption. The neighboring suites cover automatic delivery, thread launch, provider switches, OpenCode dispatch and dispatch limits.
vp run check:changed origin/mainvalidated its existing passing result for unchanged inputs and exited 0. Its output explicitly reports cache reuse, with successful format, lint, both knip passes, GraphQL generation, typechecking of 10 affected packages and the three touched test files.CI output for this head passed Check, Test, all eight server shards, Test Web, and Build and Typecheck. Independent GPT-6.1 Sol review found no blocking correctness findings; its request to disclose the explicit Restart limitation is addressed above.
Implemented by Opus 5.5 with Claude Code. Investigated, tested and reviewed by GPT-6.1 Sol with Codex.