DeepSeek Harness: duplicate list_agents, stuck subagents

TroubleshootingPublished 2026-10-17Author: DeepSeek Plugin Market
DeepSeek HarnessAgent Teamssubagentinterrupt_agentlist_agentswait_agentprofile patch
DeepSeek Harness Agent Teams swaps in roster-addressed subagent tools, so anonymous subagents can't be stopped and root patches leave duplicate list_agents.

DeepSeek Harness (DSH)'s Agent Teams is a "change the addressing" experimental capability: it replaces the native subagent control-class tools with versions that address by roster name (tool-subagent-control, tool-subagent-list-agents, tool-subagent, and tool-subagent-fork are all replaced). So once Team is mounted, the anonymous subagent you dispatch directly with subagent in the session falls into a blind spot — it is not in the roster, interrupt_agent and send_message report active teammate "<id>" not found, list_agents returns only the lead, and a runaway subagent cannot be reclaimed. More troublesome is the second form: the Team patch acts on the root layer by id only, while each preset declares a copy with the same id inside a nested plugins: section that the patch cannot reach, so two list_agents coexist in the same scope and wait_agent forever returns noProgress: no-active-peer (#9764, #9523).

DSH plugin: the parent agent cannot stop the subagents it dispatched

The one-line conclusion: the tool is not broken, the "addressing system changed" — the control-class tools are provided by the Team build, the Team build addresses by roster name, and the anonymous subagent you produced by direct delegation was never in the roster, so its session id finds nothing. The symptom trio (#9764):

  1. interrupt_agent reports active teammate "<id>" not found;
  2. send_message reports the same line;
  3. list_agents returns only the lead, without the subagent you just dispatched.

DSH plugin criterion: compare parameter names, no source reading needed

The easiest way to prove it to yourself is to look at the parameter-name convention. The two implementations use different target-addressing parameters — one uses agent_id, the other uses target (the roster name). Per community source review, this difference comes from the patch's four-line change and the Team build's re-convention of parameter names, and the error originates in the team module's roster.ts (#9764).

  1. Do one comparison call: call interrupt_agent with the documented parameter name; if it is judged "missing required parameter" or "target does not exist", try again with the other parameter name.
  2. Look at the target shape it returns: the Team build expects a name in the roster, not a session/agent id; if all you have is an id, you can basically conclude the Team build is mounted (#9764).
  3. Confirm whether the subagent tool description is misleading: the thread notes that under the Team profile the subagent tool's description does not match its actual behavior — it still claims the returned id can be used with send_message, but in practice it does not hold (#9764).

DSH plugin three ways to handle it

  1. Switch uniformly to the Team way of doing things (recommended, smallest change):
spawn_teammate  →  create a member into the roster
list_agents     →  get the name in the roster
interrupt_agent(target: <roster name>)  →  terminate the specified member

The key point is to address by roster name throughout, never mixing in ids (#9764).

  1. Do not mount agent-team-profile: if the team way of working is not a real need for you, dropping it immediately restores the native delegation addressing (#9764).
  2. Add a prompt constraint for delegation: in the dispatch prompt, require the subagent to "write its conclusion to disk before finishing", so that even if it is briefly unreclaimable its results are not lost — this also works for "subagent terminates abnormally and its output cannot be read back" (#9764). A subagent that "cannot be reclaimed or whose output cannot be read back" has its own family of diagnostics and lifecycle troubleshooting — see DeepSeek Harness subagents: product-error, stale entries.

DSH plugin list_agents name conflict: the root-layer patch cannot reach the preset layer

The one-line conclusion: the Team patch acts on the root layer by id only, while each preset declares a copy with the same id inside a nested plugins: section; the patch structurally cannot reach the preset layer, so the root copy is replaced while the preset copy remains, two list_agents appear in the same scope, and wait_agent has no way to tell "who is running". The symptom is wait_agent forever returning noProgress: no-active-peer (59 idle spins measured in a single session in the thread) (#9523).

DSH plugin mechanism: addressing recurses only within its own group

Per mutual confirmation between the reporter and the community: the patch's id-addressing implementation recurses only over sibling groups, while the preset declares its config one level deeper in plugins:, so the root-layer replacement hits another line; more insidiously — this miss is silent, with no "patch did not match" error (#9523).

DSH plugin four steps to confirm and handle

  1. Confirm the criterion: wait_agent repeatedly returns noProgress: no-active-peer, while list_agents looks like "there are two of them" (duplicate names or inconsistent behavior) (#9523).
  2. Handling one (temporary, runtime): install the community plugin @argszero/cordis-plugin-team-delegation-guard to add a guard before delegation (#9523):
bash
npm i @argszero/cordis-plugin-team-delegation-guard
  1. Handling two (structural, choose one of three): the thread gives three patch-branch directions — A add a teams condition per line (replace only when needed); B rename to decouple (let the two tools use different names, sidestepping the name clash entirely); C change only the wording (write the tool description accurately, so at least it is not misleading) (#9523).
  2. Verify: after handling, confirm there is only one list_agents in the same scope, and that wait_agent can observe a peer (no longer forever no-active-peer) (#9523).

DSH plugin troubleshooting notes

This family has only one main troubleshooting thread: first confirm "which set of tools is currently in effect", then decide how to address — far faster than reading the source. Seven points:

  1. The parameter name is the identity marker: the difference between agent_id and target immediately tells you which set is mounted (#9764).
  2. list_agents returning only the lead is a strong signal: it means the anonymous subagent is not in the roster (#9764).
  3. Do not trust the tool description's self-claim: under the Team profile, subagent's description does not match its behavior (#9764).
  4. Removing the Team profile is the fastest certain solution, if the team way of working is not a real need (#9764).
  5. A patch miss is silent: symptoms like no-active-peer are often "the patch hit another line", not a logic bug (#9523).
  6. Same-named tools shadow each other's behavior: when two implementations coexist, parameter conventions and return structures may both differ, so troubleshooting must defer to "the one actually in effect" (#9523).
  7. State the fix status honestly: the addressing replacement and the patch's inability to reach the preset layer are both unfixed in the version discussed (0.2.0-rc.2); the community plugin is a runtime guard that will not change your profile structure, and no official fix has been announced.

Capabilities like Agent Teams, which "swap tools and swap addressing", most need a clear view of "which plugins and config lines are actually mounted". Instead of typing commands everywhere to infer it, use a visual marketplace like DSH Plugin Hub: the installed list carries source markers and install/uninstall history and system logs sit in one panel, so you first pin down "what exactly is mounted in this environment".

Installed Plugins

Source: Discussion #9764, Discussion #9523.

FAQ

In DeepSeek Harness, a subagent dispatched with the subagent tool gets active teammate not found from both interrupt_agent and send_message. Why?

In DeepSeek Harness, this error means the addressing system changed: once a profile carries Agent Teams, the control-class tools are provided by the Team build, and the Team build addresses targets by their name in the team roster; the anonymous subagent you dispatched directly in the session was never in the roster, so its session id finds nothing. The criterion is that list_agents returns only the lead and not the subagent you just dispatched.

In DeepSeek Harness, after enabling Agent Teams two list_agents appear in the same session and wait_agent keeps saying no-active-peer. Is my config wrong?

Most likely this is not a DeepSeek Harness config-syntax problem but a patch that cannot reach where it should. The Team patch acts on the root layer only, while each preset declares a copy with the same id inside a nested plugins: section, so the patch structurally cannot reach the preset layer; the root copy gets replaced while the preset copy stays, and two same-named tools coexist. The tell is wait_agent repeatedly returning noProgress: no-active-peer.

In DeepSeek Harness, how do I quickly use parameter names to tell whether a given subagent tool is the Agent Teams build or the ordinary one?

In DeepSeek Harness, parameter names are the most direct tell: the two implementations use different parameter conventions, for example one addresses the target with agent_id and the other with target (the roster name). If you pass arguments using the documented parameter name and it is judged invalid, or conversely the documented name does not exist at all, the other implementation is the one currently mounted. This comparison needs no source reading and one call is enough to see it.

In DeepSeek Harness, without touching the profile structure, can Agent Teams and direct subagent delegation coexist peacefully?

In DeepSeek Harness, you can avoid mounting the Agent Teams profile and use only the native subagent tools, or you can switch uniformly to roster addressing the Team way — first create members with spawn_teammate, then get names with list_agents, and finally terminate with interrupt_agent using the target parameter. At runtime a community plugin can add a guard before delegation, but it only warns and blocks; it will not change your profile structure for you.

In DeepSeek Harness with Agent Teams mounted, why can't the parent agent reclaim a runaway subagent it dispatched?

In DeepSeek Harness, two reasons compound: the control-class tools are replaced by the roster-addressed build, and anonymous subagents are not in the roster; and from the team's viewpoint the parent is not the manager of every subagent, it only knows roster members. So 'a runaway subagent cannot be reclaimed' is structural under this combination, and the workaround is to unify the delegation style first, then decide whether to mount Team.

Related Terms

Agent Teams
Agent Teams is a set of experimental capabilities and accompanying profiles in DeepSeek Harness that organize multiple agents as a 'team': members are created into a roster first, then address and collaborate with each other by roster name. It replaces the native subagent control-class tools, so its addressing differs from native delegation.— https://github.com/deepseek-ai/deepseek-harness/discussions/9764
roster
The roster is the member list that Agent Teams keeps, and members are addressed by their roster name. Anonymous subagents produced by direct delegation are never written into the roster, so roster-addressed tools cannot find them, which is the direct cause of 'the parent agent cannot stop the subagents it dispatched'.— https://github.com/deepseek-ai/deepseek-harness/discussions/9764
profile patch id addressing
A profile patch locates the config line to replace by id, but it only searches recursively inside its own group. Because presets declare a copy with the same id inside a nested plugins section, the root-layer patch structurally cannot reach the preset layer, producing the situation where it 'looks applied but actually replaced only one copy'.— https://github.com/deepseek-ai/deepseek-harness/discussions/9523
wait_agent
wait_agent is the tool that waits for a collaborating agent to finish or make progress, finding its target by roster name or agent identifier. When two implementations coexist in the same scope and the target was never registered in the roster, it keeps returning noProgress: no-active-peer, which looks like 'there is no active peer at all'.— https://github.com/deepseek-ai/deepseek-harness/discussions/9523

Sources