前言¶
在 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