dsh-web
zhu1090093659/dsh-webDeepSeek Harness(DSH)Web 插件聚合生态包 · 一切皆插件,创意工坊分发(dsh-market.com)
Constrained subagent roster for DeepSeek Harness: one tool per role, each pinning a child system prompt, a capability allow-list, and a model tier. Bulk work vs team work by tool shape. 子代理名册:按角色约束系统提示词/能力范围/模型档位。
A constrained subagent roster for DeepSeek Harness. Every role has a pinned system prompt, a pinned capability range, and a pinned model tier — and bulk work and team work are reached through tools of different shapes.
DSH's built-in subagent tool gives a child the parent's identity and the parent's whole toolset.
Real delegation therefore fails in three predictable ways:
This plugin turns all three from prompt requests into structural constraints:
| Constraint | Mechanism | Effect |
|---|---|---|
| System prompt | each delegation puts the role persona on the request; it becomes the child's persona-prefix section | identity is decided by the role, never by the parent |
| Capability | the request's toolFilter.allow | a reviewer has no write tool at all — it cannot edit even if asked |
| Model | the request's agentOptions | bulk runs cheap, review runs adequate, team runs strongest |
| Depth | maxDepth: 1 and a filter that never grants subagent* | a role child is a leaf; no recursive fan-out |
All 20 roles: role reference (中文).
# from GitHub (source is the artifact; no build authorization needed)
dsh plugin --profile <your-profile> add github:<owner>/dsh-plugin-subagent-roster
# or from a local checkout
dsh plugin --profile <your-profile> add /path/to/dsh-plugin-subagent-roster
The bundle applies one plugin row. The parent agent gains one delegate tool whose role enum
is the whole roster, so it pays for one schema instead of twenty. dsh --profile <name> --dump-config should show the subagent-roster row.
While a profile runs, the plugin serves a loopback page:
http://127.0.0.1:4317/
Add or delete roles, change a role's position, temperament, tier or capability range, and edit the persona — the child's system prompt — directly. Saving applies immediately, no restart: the page replaces the delegation tool registration and the routing section, and rolls back to the previous roster if the new one fails to mount.
Roles live in $DSH_HOME/subagent-roster/roles.json, seeded from the shipped twenty on first start.
The file is a normal document: editing it by hand is supported.
pagePort setting; 0 disables the page.127.0.0.1: it grants the same file authority a local shell
already has. Do not expose it on another interface.Measured: letting the parent model decide whether to delegate is unreliable on free models (see test report §3). So the decision moves to the entry point — drive it by item count:
node bin/roster-fanout.mjs \
--profile <your-profile> \
--role batch-exact \
--items-file items.json \
--contract 'one JSON object {"text": <the item>}' \
--expect-json \
--concurrency 3 \
--out results.jsonl
tool_result event, never from the parent's paraphrase--expect-json validates the contract; a child that errors, returns nothing, or returns invalid
JSON fails the itemThe contract is enforced by
--expect-json, and the contract text is delivered inside the child's task (outside it, the child never sees it). Measured 8/8 compliant on the cheapest bulk-tier model. A failed check is a failed item, never prose passed off as success.
The repository ships a format: 1 index for the DSH plugin market, validated with the official
@deepseek-ai/dsh-plugin-market-index validator. Subscribe to it directly:
https://121212165.github.io/dsh-plugin-subagent-roster/market/index.json
Plugins → Discover → Add index source, paste the URL (turn on “Custom plugin market” under “Experimental plugins” first).
The index lists one version from a commit-pinned git source (24f55f2), so the source shown in
the confirmation dialog is exactly what installs, and it cannot drift with a branch.
The repo also carries the dsh-plugin topic, so topic-scraping aggregators (awesome-dsh-plugin and
friends) pick it up on their next crawl.
Every model id in the composition resolves from the environment, so one package serves several deployments:
| Variable | Purpose |
|---|---|
ROSTER_PROVIDER | provider route shared by all four tiers |
ROSTER_BATCH_MODEL / ROSTER_BUILD_MODEL / ROSTER_REVIEW_MODEL / ROSTER_TEAM_MODEL | model id per tier |
ROSTER_BATCH_MAX_TOKENS and friends | output ceiling per tier |
Any single row can also be overridden by id in a profile's cordis.patch.yml.
| Field | Default | Meaning |
|---|---|---|
mode | advisory | advisory warns; strict refuses to load a self-contradicting roster |
provider | deepseek-official | provider the tiers resolve against |
allowedModels | [] | when non-empty, any tier resolving outside this list is a violation |
routingGuidance | true | register the bulk-vs-team routing section into the parent prompt |
npm test # 18 unit tests, zero model calls
node bench/run.mjs --repeat 1 # real runs against a local OpenAI-compatible gateway
Bench verdicts come from the gateway's request log, not from answer text: which persona the child actually ran with, whether its model equals the tier model, whether its tool count equals the role's grant, and whether negative cases really left the workspace untouched.
>=0.2.0-rc.2 <0.3.0>=22.18This project acknowledges and links the LINUX DO community.
MIT