Repository navigation
Description
Summary
I'm using Squad v0.10.0 with Copilot CLI in a production workflow. I built a 4-agent specialist squad with detailed charters. The agents work great when dispatched. The problem: the main conversation agent repeatedly falls out of squad mode and reverts to single-threaded, do-it-yourself execution — even after being corrected multiple times in the same session.
This is a behavioral persistence gap between "Squad is available" and "Squad is actively used."
Setup
- Runtime: GitHub Copilot CLI (terminal agent)
- Squad: 4 custom agents at
.github/agents/, each with a dedicated domain charter (data pipeline, report generation, auto-fix, integrity verification) - Integration:
copilot-instructions.mdexplicitly mandates squad use (integrity checker MUST run before every deliverable) - Dispatch mechanism:
tasktool withagent_typeparameter, supportsmode="background"for parallel execution
The Problem
In a single session, the agent had to be corrected 9 times for falling out of squad mode:
| # | What Agent Was Doing Wrong | Expected Behavior |
|---|---|---|
| 1 | Ran all queries sequentially itself | Should have dispatched data specialist |
| 2 | Generated output content step-by-step | Should have dispatched report specialist |
| 3 | Generated output without integrity check | Should have dispatched integrity-checker + report specialist |
| 4 | Sequential work instead of parallel dispatch | Should have dispatched multiple agents in parallel |
| 5 | Lost context, working single-threaded | Should have maintained squad dispatch pattern |
| 6 | Manually verifying data instead of delegating | Should have dispatched integrity-checker |
| 7 | Sequential lookups and edits | Should have dispatched data specialist |
| 8 | Editing files manually, doing lookups sequentially | Should have dispatched multiple specialists |
| 9 | Started writing a report about not using Squad... without using Squad | Should have dispatched report specialist + integrity-checker |
The meta-failure: Incident #9 is the agent trying to write a report about falling out of squad mode — and falling out of squad mode while doing it. It took explicit intervention to force a dispatch.
Pattern
Each correction works for exactly one response. The agent dispatches agents, shows parallel execution, and then on the very next turn reverts to sequential direct-tool usage. The correction has zero persistence.
Root Cause Analysis
1. The coordinator identity isn't loaded into the main agent
Squad's coordinator charter says: "You are a DISPATCHER, not a DOER" and "Mindset: What can I launch RIGHT NOW?" But in Copilot CLI, the main agent runs as a general-purpose assistant. The squad coordinator charter lives in a separate .md file that the main agent never reads during normal operation. The squad-first mindset exists in a file — not in the agent's active reasoning.
2. Tool proximity bias
The agent has direct tools (grep, view, edit, powershell) with zero latency and immediate in-context results. The task tool requires composing a detailed prompt, spawning a separate context, waiting for async results. The agent consistently chooses the path of least resistance — direct tools — even when parallel dispatch would be faster overall.
3. No dispatch gate in the reasoning loop
There's no mandatory checkpoint that asks: "Before I touch ANY direct tool, should a squad agent be doing this?" Without that gate, the default path is always self-execution. Squad mode requires an ACTIVE choice every turn; single-threaded mode is the passive default.
4. The "appearing productive" reward signal
Showing a grep result or file edit feels like visible progress. Dispatching 4 background agents and saying "waiting for results" feels like doing nothing — even though 4x parallel work is objectively faster. The agent optimizes for per-turn visible output, not total throughput.
5. Memory-stored corrections don't override reflexes
Even with store_memory persisting delegation instructions, the stored fact competes with the agent's trained default behavior of using direct tools. A stored memory is a suggestion; the sequential reflex is the default.
Suggestions
For Squad
-
Coordinator injection, not adjacency. Could the coordinator's dispatch-first rules be injected INTO the main agent's system prompt when squad agents are detected, rather than living in a separate file? The gap is between "available" and "active."
-
Dispatch gate as framework feature. A pre-tool-call hook that checks: "Is there a squad agent whose charter matches this task?" before allowing direct tool execution. Make delegation the default, direct execution the override.
-
Squad compliance metric. Track what % of domain work goes through agents vs. direct tools. Surface it. "This session: 23% squad utilization" would create awareness.
For Copilot CLI
-
Behavioral persistence for corrections. When a user corrects agent behavior, that should become a session-level system rule, not just a conversation-context fact. Something stronger than memory — closer to a system prompt amendment.
-
Parallel-first tool calling. When multiple tool calls are independent, the platform could detect and encourage batching as an internal check.
Environment
- Squad v0.10.0
- Copilot CLI v1.0.60
- 4 custom agents with full charters
- Windows 11, PowerShell
- Agents dispatched via
tasktool withmode="background"
Reproducing
This likely reproduces with ANY Squad setup on Copilot CLI where:
- Custom agents are defined in
.github/agents/ copilot-instructions.mdreferences them- The user asks for multi-step work that naturally decomposes into parallel tracks
The agent will default to doing it all sequentially unless explicitly told otherwise, and the correction won't persist.
Activity
FLY1NGSQU1RR3L commentedon Jun 13, 2026
Update — June 12, 2026: Second Project Reproduces, Mitigation Validated
New Evidence: Second Project Reproduces the Same Failure
The original report covered one project. A second independent project in the same repo — with a completely different domain — exhibits the identical single-threaded behavior, with a critical difference:
This is reproduction across two independent projects and confirms this isn't project-specific — it's structural.
Found the Exact Competing System Instruction
The
tasktool's system prompt contains:This system-level instruction competes directly with project-level dispatch rules. Because system prompt has higher priority than project instructions loaded via
copilot-instructions.md, the system prompt usually wins. The dispatch override table works as mitigation because it's explicit, concrete, and includes a per-turn self-check — but it's still fighting upstream.Coordinator Identity Also Affected
The Squad Coordinator agent itself (not just project agents) exhibited the same single-threaded fallback during this investigation. This means the failure mode extends to the coordinator identity — the agent whose entire purpose is dispatching work still defaults to doing it inline.
Mitigation Validated: Dispatch Override Table
Shipped infrastructure fixes for the second project:
copilot-instructions.mdwith explicit trigger-to-agent mapping and "Do NOT do directly" columnThe dispatch table pattern (already working in the first project) is the strongest available mitigation. Comparison:
Two Additional Runtime Issues (compounding)
Even after agents enter squad mode, two separate runtime bugs compound the problem:
Queue blindness — Sessions cannot see pending user messages during background agent work. They ask for input while multiple messages are already queued. Not fixable via project instructions.
Non-FIFO message delivery — Queued messages are delivered out of order. Context builds sequentially, so out-of-order processing loses coherence. Not fixable via project instructions.
Updated Severity Assessment
Given:
This is a platform-level behavioral persistence gap, not a per-project configuration issue. The dispatch table is a viable workaround but shouldn't be necessary — the framework should be able to inject coordinator identity into the main agent's reasoning loop.
fix(coordinator): restore mandatory dispatch contract
fix(coordinator): restore mandatory dispatch contract