Skip to content

Agent reverts to single-threaded execution despite Squad infrastructure — behavioral persistence gap #1231

Open

Description

@FLY1NGSQU1RR3L

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.md explicitly mandates squad use (integrity checker MUST run before every deliverable)
  • Dispatch mechanism: task tool with agent_type parameter, supports mode="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

  1. 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."

  2. 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.

  3. 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

  1. 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.

  2. 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 task tool with mode="background"

Reproducing

This likely reproduces with ANY Squad setup on Copilot CLI where:

  1. Custom agents are defined in .github/agents/
  2. copilot-instructions.md references them
  3. 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

  1. FLY1NGSQU1RR3L commented on Jun 13, 2026

    @FLY1NGSQU1RR3L
    Author

    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:

    • Project A had all dispatch infrastructure (override table, 4 custom agents, prohibitive column). It eventually self-corrected after repeated prompting.
    • Project B had zero dispatch infrastructure. No override table, no custom agents, and actively anti-dispatch language in its instructions that reinforced the system prompt's existing bias. It could never self-correct because there was nothing to dispatch to and nothing telling it to try.

    This is reproduction across two independent projects and confirms this isn't project-specific — it's structural.

    Found the Exact Competing System Instruction

    The task tool's system prompt contains:

    "Do NOT delegate to a sub-agent when you can accomplish the task in 2–5 direct tool calls."

    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:

    • Created 4 custom agent definitions
    • Added dispatch override table at the TOP of copilot-instructions.md with explicit trigger-to-agent mapping and "Do NOT do directly" column
    • Rewrote anti-dispatch language to dispatch-compatible framing

    The dispatch table pattern (already working in the first project) is the strongest available mitigation. Comparison:

    Component Project A (working) Project B (before fix)
    Dispatch override table ✅ Present ❌ Absent
    Custom agent definitions ✅ 4 agents ❌ Zero
    "Do NOT do directly" column ✅ Explicit ❌ None
    Runtime override language ✅ Present ❌ Absent
    Anti-dispatch language ❌ None ✅ Actively discourages delegation

    Two Additional Runtime Issues (compounding)

    Even after agents enter squad mode, two separate runtime bugs compound the problem:

    1. 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.

    2. 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:

    • Reproduced across 2 independent projects
    • Coordinator identity itself exhibits the same failure
    • System prompt priority conflict is structural
    • 0% autonomous self-correction rate persists across 10+ incidents

    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.

  2. added 2 commits that reference this issue on Oct 14, 2026
    320fd3e
    c114e5f
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    triagedIssue has been triagedwave:2-soonWave 2 — next 2-4 weeks

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions