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
羽毛球分组比赛记分
小程序二维码

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

小夜