DACW:写手、运行机、审查者与人工闸门的防御性编程工作流

前言

在 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 写码 + 自动测 + 独立审」固定成可审计流水线,且始终保留人工合入的开发者;实验性预览,接口与行为可能变化。

务必注意:

  1. 插件与测试命令以当前 DSH 宿主进程的用户权限运行;默认 host 模式下写手产出的代码(含 package.json 的 test 脚本)可在宿主全权限下执行。安装与启用前请阅读源码、SAFETY.md 与 MIT 许可证,并在专用或最小权限环境中使用。
  2. 被测项目依赖需人工预装;容器模式需自行 docker pull 对应镜像。
  3. SkillHub 为社区插件目录站点,与 DeepSeek / 幻方无官方从属关系;DACW 为社区维护项目(GitHub 星标数请以仓库页为准)。

结尾

DACW 把防御性智能体编程收成一条可配置流水线:机器侧只写到 NEED_HUMAN,合入权在人。进一步了解架构与交互式说明可打开 dacw-workflow.html。

  • 目录页:https://www.skillhub.cn/plugins/stmcw1/DACW
  • GitHub:https://github.com/stmcw1/DACW
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜