前言¶
在 DSH 里让模型直接改仓库,常见做法是单会话里写代码、跑测试、自行宣布完成。问题在于:同一智能体既产出变更又评判结果,工具权限往往与宿主一致,失败路径也缺少统一收敛。下面介绍 Host 插件 DACW(Defensive Agent Coding Workflow):把「写代码」「跑测试」「做审查」拆成不同角色,并在机器侧全部停在 NEED_HUMAN,由人决定是否合入。
这是什么¶
DACW 是 DSH Host 插件,npm 包名 @stmcw1/dacw,维护者为 stmcw1,在 SkillHub 目录中归类为工作流。一句话定位:写手按增量协议产出 JSON 变更集 → 确定性运行机执行项目自带测试 → 独立审查者输出结构化裁决 → 人工闸门;dacw_run 在指定工作区内完成上述循环,绝不自动合入。
项目主页:SkillHub 目录页,源码与说明:GitHub stmcw1/DACW。当前资料中的版本为 v1.1.0,许可证 MIT,构建要求 Node ≥ 22.13。
核心功能¶
三权分立与输出协议¶
- 写手只产出 JSON 变更集(输出协议 v2:相对基线的增量,未提及文件逐字节保留)。
- 协调器做路径校验、合并基线并将工作区重置为合并集。
- 确定性运行机只执行白名单命令(如
npm/pnpm/yarn/npx/node/python/python3/pytest/cargo/go),带环境变量白名单、超时强杀与输出截断。 - 审查者只输出精确 JSON 裁决;解析失败按 REJECTED 处理,PASS 但含可疑字样也会进入人工闸门。
测试在审查之前执行——运行机是第一次执行写手产出代码的环节;审查与人工终审属于侦探性控制,不是执行前的安全屏障(详见仓库 SAFETY.md)。
子代理零工具隔离¶
写手与审查者运行在 persona-only preset 上;插件在 agent/created 阶段用 ctx.tools.restrict({ allow: [] }) 剥除全部继承工具并校验可见工具为 0。隔离失败则拒绝创建子代理。这不是代码执行的安全边界,而是职责分离的一部分。
工作区与 fail-closed¶
- 仅在用户指定的专用目录内读写与重置;接受空目录或本插件写入的合法
.dacw-workspace标记;拒绝系统根、用户主目录、DSH_HOME/profile 等路径。 - 所有失败与异常路径收敛到
NEED_HUMAN;工作流失败时工具抛出错误,不会把失败伪装成普通成功结果。 - 状态文件含任务、文件摘要、测试输出与审查文本,默认 SHA-256 校验(防意外损坏,不防同账号本地重算)。
沙箱与模型¶
sandbox.mode默认host:测试在宿主用户权限下运行,执行隔离默认关闭。可配置auto(Docker 可用则容器化,不可用时交互询问是否降级;拒绝或无法确认则 fail-closed)或docker(强制容器,Docker 不可用则拒绝)。writerModel/reviewerModel可继承父会话、指定provider/model,或通过 DSH 模型目录解析;解析失败 fail-closed。
宿主能力要求:DSH ≥ 0.2.1-rc.5(资料中标注的当前实测版本),需支持 agentPresets 与 subagents(ctx.subagents / agentPresets)。DACW 依赖 DSH 官方的 dsh-persona、dsh-subagent-spawn-in-process,不依赖第三方社区插件。
安装与启用¶
前置:在具备 DSH 插件管理器的环境中,本地构建并打包(勿用目录路径安装,以免绕过 files 白名单)。
node build.mjs
node selftest.mjs
npm pack --pack-destination ../dacw-pack
在 DSH 插件管理器中执行 install_bundle,target 填 tarball 的绝对路径并加 file: 前缀,例如:
file:/absolute/path/to/stmcw1-dacw-1.0.2.tgz
(示例路径来自 README;实际文件名以 npm pack 产出为准,如 @stmcw1/dacw-1.1.0.tgz。)
安装后向 profile 插入 Host 行 dacw(bundle 包名 @stmcw1/dacw)。升级流程:改代码 → node build.mjs → npm pack → remove_bundle → 对同一 tarball 再 install_bundle → 重启 Harness。
典型用法¶
模型调用 dacw_run 工具:
| 参数 | 必填 | 说明 |
|---|---|---|
task |
是 | 需求描述(自然语言) |
workspace |
否 | 专用工作区;省略则用配置或会话工作目录 |
task_id |
否 | 审计记录文件名后缀;省略自动生成 |
成功时 status 恒为 NEED_HUMAN,并返回 workspace、files、round、models(写手/审查者实际模型)、logs、elapsed_ms、task_id、rollback_available 等字段。
可选沙箱片段(覆盖 cordis.patch.yml 中的 config):
config:
sandbox:
mode: host
image: ''
memoryMb: 1024
cpus: 1
pidsLimit: 256
tmpfsMb: 128
writerModel: deepseek-account/deepseek-flash
reviewerModel: inherit
高影响操作 dacw_rollback 需人类交互确认;宿主无交互能力时需设置环境变量 DACW_ROLLBACK_TOKEN(非空),否则拒绝。git 工作区仅返回回滚指令,不代为执行 git。
适用场景与注意¶
适合:希望在 DSH 内把「AI 写码 + 自动测 + 独立审」固定成可审计流水线,且始终保留人工合入的开发者;实验性预览,接口与行为可能变化。
务必注意:
- 插件与测试命令以当前 DSH 宿主进程的用户权限运行;默认
host模式下写手产出的代码(含package.json的 test 脚本)可在宿主全权限下执行。安装与启用前请阅读源码、SAFETY.md与 MIT 许可证,并在专用或最小权限环境中使用。 - 被测项目依赖需人工预装;容器模式需自行
docker pull对应镜像。 - SkillHub 为社区插件目录站点,与 DeepSeek / 幻方无官方从属关系;DACW 为社区维护项目(GitHub 星标数请以仓库页为准)。
结尾¶
DACW 把防御性智能体编程收成一条可配置流水线:机器侧只写到 NEED_HUMAN,合入权在人。进一步了解架构与交互式说明可打开 dacw-workflow.html。
- 目录页:https://www.skillhub.cn/plugins/stmcw1/DACW
- GitHub:https://github.com/stmcw1/DACW