---
owner: @SivanCola
backup: @esengine
status: active
reviewed: 2026-10-17
---
ACP · DSH subagent-acp · Reasonix website
DeepSeek Harness (dsh) can delegate a task to any Agent Client Protocol agent through its subagent-acp provider. Reasonix speaks ACP with reasonix acp, so a Harness agent can hand work to Reasonix as a subagent with no code on either side, only configuration.
Verified against dsh 0.2.1-rc.2 and @deepseek-ai/dsh-subagent-acp 0.2.1-rc.2, with a real DeepSeek model in the Reasonix child.
- Reasonix MUST be installed on the machine that runs
dsh, and its model provider MUST be set up there: runreasonix setuponce. reasonixMUST be reachable by the command you configure (an absolute path is the safest).- The provider key MUST live in Reasonix's own home (
<Reasonix home>/.env, see CONFIG_PATHS). Reasonix does not read provider keys from environment variables, so theenvblock of the Harness row cannot supply one. - The provider package version MUST equal the
dshversion (dsh --version). Name it exactly: thelatesttag points at an old0.0.1-rc.1andnextmay resolve to an older pre-release, anddshrefuses both as incompatible.
- Install the provider into the Harness profile you use:
dsh plugin --profile <profile> add @deepseek-ai/dsh-subagent-acp@<dsh version>- Add two rows to that profile's
cordis.patch.yml(or$DSH_HOME/cordis.patch.yml):
- insert:
- id: subagent-acp
name: '@deepseek-ai/dsh-subagent-acp'
config:
providerName: reasonix
command: reasonix
args: ['acp']
permission: reject
- id: tool-subagent-reasonix
name: '@deepseek-ai/dsh-tool-subagent'
config:
provider: reasonix
toolName: reasonix
maxDepth: provider-managed- Start
dsh. The model now has areasonixtool that takes aprompt, a shortdescriptionand an optionalcwd.
maxDepth: provider-managed is required: the provider cannot enforce a depth cap in the child, and dsh refuses to load the tool row without it.
The same two rows ship as a Harness bundle in this repository, integrations/dsh-plugin, so steps 1 and 2 can be one command. It is not on npm; pnpm installs the subdirectory through its path: selector (see pnpm package sources):
dsh plugin --profile <profile> add github:esengine/DeepSeek-Reasonix#path:/integrations/dsh-pluginThe bundle pins @deepseek-ai/dsh-subagent-acp and dsh to the same version (0.2.1-rc.2 today) and uses permission: reject. Change the policy in your own cordis.patch.yml, never in the package.
An installed plugin starts off. Open its page in the DSH Web UI and turn its switch on.
- The switch and both components (the provider and the
reasonixtool) must read Running. - Turning the switch on in a running
dsh webis enough: the next new session has thereasonixtool (observed ondsh0.2.1-rc.2, 2026-10-18). Restartdshonly if it is still missing. - While it is off the model has no
reasonixtool and may runreasonix -pin its own shell instead. - That looks like a delegation and is not one: there is no subagent, no
reasonixtool call, and no permission policy applies.
DSH ships an optional "Custom plugin markets" feature with no default index; a user adds index URLs themselves. This repository publishes one:
- In the DSH Web UI open Plugins, select More beside Experimental plugins and switch on Custom plugin markets.
- In the Discover tab add this index URL:
https://raw.githubusercontent.com/esengine/DeepSeek-Reasonix/studio/integrations/dsh-plugin/market-index.json
- Select "Reasonix subagent" and install. The entry page shows the author, the website, the source repository and the exact pinned commit.
The index entry pins a commit, so it is re-pinned whenever the package changes (see the Studio release runbook).
| Key | Where | Meaning |
|---|---|---|
command, args |
subagent-acp |
What dsh spawns for every run. ['acp', '--model', '<name>'] selects the child model; ['acp', '--preset', 'delivery'] selects the execution setting. |
cwd |
subagent-acp |
Child workspace. Omitted: the delegating session's working directory. |
permission |
subagent-acp |
reject (default) or allow. See the next section. |
env |
subagent-acp |
Extra child environment, layered over a credential-scrubbed copy of the parent's. Use it for REASONIX_HOME when the child should use a different home. |
maxDepth |
tool-subagent |
MUST be provider-managed. |
dsh never shows the child's permission cards to a person. The permission key answers every session/request_permission automatically:
| Policy | Effect on Reasonix |
|---|---|
reject |
dsh answers cancelled. Reasonix treats it as a refusal: the tool call fails with "blocked by permission policy", the model is told the call was declined, and the turn goes on. Writes and shell commands that need approval do not run. |
allow |
dsh selects the first allow_once or allow_always option of every request. Every approval card Reasonix raises is accepted without a person looking at it. |
Choosing allow MUST be a deliberate decision to let the Harness agent, and whoever steers it, run whatever Reasonix's tools can do in that workspace. It answers approval cards only; Reasonix's sandbox is configured separately in Reasonix.
- Use
rejectfor read-only research and review tasks. - Use
allowonly for a task you would approve wholesale, in a workspace you can discard or restore, and setcwdto that workspace.
| Event | Parent receives |
|---|---|
| Child answers | The child's final message text, as the closing message of a finished background subagent. |
| Child turn pauses as unverified (files written, no verification command ran) | The same final text, ending in a host-written [paused] Not verified, … line. The turn itself ends normally. |
| Child turn fails (model endpoint down, provider refusal) | A failed subagent with category transport. dsh does not put the child's error message into the parent model's view. |
| Parent cancels | The child is sent session/cancel, the turn ends as cancelled, and the process is reaped. |
- One fresh
reasonix acpprocess per delegation; nothing from the parent conversation crosses, only the prompt text and the workspace path. - The child accepts no follow-up messages.
- Only message text crosses back. The child's reasoning, tool traffic and plans stay in its own session.
dshadvertises no filesystem or terminal client capability, so Reasonix reads and writes the workspace directly.- The child pays for its own context; its tokens do not enter the parent conversation.
- An install without credentials fails
session/newwith the ACP "Authentication required" error (-32000), whichdshreports as a failed start.