dsh-root-planner-preset
一个面向 DeepSeek Harness(DSH)的 agent 预设:把「读书」和「决策」分开。
根 agent 的上下文只装任务分析、规划与决策;文件阅读、信息查询交给子代理,子代理只回摘要。而创建、修改、删除文件只能由根 agent 执行——子代理连工具都没有。
一句话:让整棵树里只有一个 agent 有手,其余都只有眼睛。
安装步骤 | 维护者文档
它解决什么问题
用 coding agent 干长任务,上下文很快被原始文件内容塞满,于是忘了目标、丢了计划、开始重复劳动。常见对策是「让 agent 多派子代理」,但光靠提示词约束不住——子代理照样会顺手改文件,任务也会被无限往下转派。
这个预设把两件事做成了结构约束,而不是靠自觉:
| 要求 | 机制 | 强度 |
|---|
| 子代理不能创建/修改/删除文件 | 两个委派工具上的 toolFilter.allow 白名单,不含 write、edit、ops_replace | 结构性:工具不存在,调不到 |
| 子代理没有 shell 可绕过 | 同一白名单,不含 ops_bash、pwsh | 结构性 |
| 任务不会被无限转派 | 运行时深度上限(subagent.maxDepth) | 结构性:超过上限直接抛 SubagentDepthError |
| 根 agent 独揽所有修改 | 人设规则(白名单只作用于子级) | 提示词级 |
| 根 agent 默认委派阅读 | 人设规则 | 提示词级 |
白名单是 allow 而非 deny:将来某个插件新增的工具,对子代理默认不可见。
工作方式
根 agent (depth 0) ← 只有它有 write / edit / shell
├── 子代理 (depth 1) ← 只读;可以再派一层
│ └── 孙代理 (depth 2) ← 只读;叶子
└── 子代理 (depth 1)
- 根 agent:先立计划(目标、成功判据、约束、任务清单),把阅读/搜索/定位默认派出去,自己只在「单个已知文件、一小段范围、或核实子代理的某个断言」时才亲自读。
- 子代理:只读、只定位、只总结。发现需要改文件时不动手,而是回报精确的改动方案——目标路径、位置(file:line)、当前内容、建议替换、理由。
- 根 agent 收到方案后决策,然后亲自落盘。
子代理怎么知道自己是子代理?DSH 会在每个子代理的提示词里强制插入一句 You are a delegated subagent: …,运行时注入、无法移除,而预设人设没有 {{role}} 这类变量可用。所以人设里写的是一条判定指令:读自己的提示词里有没有那句话。这让人设只需要一份,父与子读到的是同一份文本,因此不会出现「父以为子被这么约束、子其实没读到」的漂移。
快速开始
dsh plugin --profile web add github:XiaoOu2024/dsh-root-planner-preset
装完必须再做一步:设置 → 子智能体 → 深度上限 = 2。(这是 Host 的 subagent 设置节,全局生效、不属于 bundle;设成 0 会禁掉全部委派,设计就废了。)
然后开新会话,在预设选择器里选 Root Planner。完整步骤与故障排查见 INSTALL.md。
适合 / 不适合
适合:需要跨很多文件调研的长任务、逆向分析、代码审查,以及任何「读得多、改得少」或「改动必须被仔细决策」的工作。
不适合:
- 只想快速改一个文件——多一层委派是纯粹的开销;
- 需要子代理并行写代码——这是本预设故意禁止的,请改用
standard 预设;
- 环境缺少 DSH 的工具基础(见 INSTALL.md 的前置条件)。
仓库内容
| 文件 | 说明 |
|---|
cordis.patch.yml | 预设声明(由脚本生成,不要手改) |
persona.txt | 人设正文,要改就改这个 |
build-patch.mjs | 从 persona.txt 生成 cordis.patch.yml |
verify-patch.mjs | 校验补丁结构、工具白名单,并断言人设逐字节一致 |
verify-depth-override.mjs | 校验深度覆盖是否落到合成配置 |
lib-yaml.mjs | 从本地 DSH 安装里解析 YAML,因此本包零依赖 |
docs/DEVELOPMENT.md | 维护者文档:设计取舍、机制细节、已验证/未验证边界 |
已验证 / 未验证
已验证:补丁可被 loader 解析;解析出的人设与 persona.txt 逐字节相同;两个委派工具的白名单排除了所有写入入口、且只包含本机实际注册的工具名;干净检出后校验通过(.gitattributes 已钉死 LF,否则 Windows 克隆会破坏逐字节校验);深度覆盖已落到合成配置。
未验证:尚未在 root-planner 预设下真正派出过一个子代理。 白名单里的工具名是按作者环境的实际工具清单交叉核对出来的,不是运行时实测。若你的环境缺少其中某个全局工具名,子代理创建会失败并报 tools.restrict() names unknown global tool …。详见 INSTALL.md 的故障排查。
许可
MIT