mirror of
https://github.com/deepseek-ai/deepseek-harness
synced 2026-08-15 21:04:50 +00:00
A restriction was compiled against the global tool layer alone: only global-layer tools were tested against `admits()`, and every chain-layer tool was overlaid unfiltered afterward. That read the exempt set as "the global layer" when what it means is "what this scope registers itself" — two descriptions of the same set only while every model-facing tool sat in the host composition. Moving those rows onto the agent plane separated them. A preset's tools are an ANCESTOR contribution to a joined agent, so a subagent's `toolFilter` stopped constraining anything it was given; and with the global layer empty `restrict()` rejected every name it received as unknown, failing the child outright. With the same tools in the global layer the filter still admits and applies normally, which is what makes this a regression of the move rather than a standing limitation. `view()` now filters everything a scope inherits — the global layer and every ancestor layer on its chain — and exempts only the layer the scope owns. That exemption is load-bearing rather than incidental: the delegation runtime registers a child's `report` and structured-output tools into the child's own layer, and a filter naming the capabilities the child may use must not strip the machinery it answers through. Tool order, and with it prefix-cache reuse, is unchanged: inherited names keep their global-then- ancestor position and own-layer names still come last. The diagnostic said "unknown global tool" while listing what is really the inherited surface; it now names the surface it checks and says why an own-layer name is not restrictable. Fixes #2185
subagent/ — subagent capability family
English | 中文
This family lets an agent delegate work to child agents. Multiple named providers may coexist in one context.
| Package | Role | ctx key |
|---|---|---|
subagent/ |
Defines provider registration, delegation, and continuation | ctx.subagents |
subagent-inprocess/ |
Provides the shared in-process run driver | — |
subagent-spawn/ |
Starts a fresh in-process child | registers on ctx.subagents |
subagent-fork/ |
Starts an in-process child from the parent's completed history | registers on ctx.subagents |
subagent-acp/ |
Starts an out-of-process child over ACP | registers on ctx.subagents |
subagent-codex/ |
Starts a real Codex app-server child | registers on ctx.subagents |
subagent-claude-code/ |
Starts a real Claude Code child through the official Claude Agent SDK | registers on ctx.subagents |
subagent-dsh-sdk/ |
Starts an out-of-process Harness child through the TypeScript SDK | registers on ctx.subagents |
tool-subagent/ |
Exposes delegation to the model | registers on ctx.tools |
tool-subagent-control/ |
Exposes child messaging and listing to the model | registers on ctx.tools |
tool-subagent-report/ |
Provides the child-to-parent report channel | registers in child scopes |
See the decisions for the capability family, continuable children, and control tools.
The subsystem reference — start requests, results, live runs, the provider contract, continuable background children — is docs/subsystems/subagent.md; design rationale in the subagent capability seam, continuable background subagents, and merged subagent control service Agent Notes.