write-approval-guard:把 DSH 写盘与敏感读变成人工审批

前言

在 DeepSeek Harness(DSH)里跑智能体时,模型可以调用 write、edit、Shell 等工具改工作区、读配置、甚至执行破坏性命令。沙箱能限制「出工作区」,但挡不住工作区内的误改,也挡不住 .env、密钥文件被悄悄读走。若只靠事后回滚,成本高且难以审计。

write-approval-guard(写操作审批守卫)由 SilverCrossing 维护,挂在 tools/pre-execute 上:对登记过的原生工具与 dsh-safety-toolkit 的 safe_* 系列做判定,在真正执行前弹出审批;高危操作强制两次确认,敏感路径读取同样要先点批准。它与管「工作区之外」的 outside-access-guard 是正交的两层,可同时安装,同一调用只会弹一次窗(先响应的插件定调)。

下面介绍插件定位、判定规则、配置方式与使用时的边界。

这是什么

插件仓库:SilverCrossing/write-approval-guard。当前 package 版本为 0.3.11,MIT 许可证,要求 DSH >= 0.2.0。社区目录页:skillhub.cn/plugins/SilverCrossing/write-approval-guard(SkillHub 为独立插件社区,与 DeepSeek / 幻方无官方从属关系;目录页可「发送给 DeepSeek Harness 安装」,详细说明以 GitHub README 为准)。

一句话:把「写文件」和「读敏感配置」变成必须经过人的动作——工作区内的写也要审批,破坏性或系统级操作要两次确认。

三类判定与确认次数

判定 触发条件 确认次数
写操作 write / edit 任意路径;命令行可能写盘 1 次
高危 磁盘/格式化、递归或通配删除、系统配置或系统目录、权限/所有权等 2 次
敏感读取 读取 .env、.config、密钥、凭据、浏览器会话等 1 次(可配置为 double)

高危的两次确认流程是:先单独的 approval.request(第 1/2 次,不执行操作)→ 强制等待 confirmGapMs(默认 2000 毫秒)→ 常规审批(第 2/2 次,高危文案在这一层)。两次都批准才执行;批准结果是 allowed-once,没有「本会话永久放行」。

除命令启发式外,写入 shell 启动脚本、git hooks、.vscode/tasks.json、AGENTS.md、.dsh-prompts/**、.env* 等「配置与行为文件」会升为高危(两次确认);写 .env 因此比单次敏感写更严。

核心功能

工具覆盖

判定按工具名映射参数里的路径或命令文本。已覆盖包括:原生 write / edit / read / read_image / grep / glob / pwsh / bash / shell,以及 dsh-safety-toolkit 的 safe_write、safe_edit、safe_rollback、multi_edit、test_runner 等。未在表中的工具(例如 MCP 的 write_file、其他插件注册的写工具)默认不拦截;若需 fail-closed,可设 unknownTools: ask 并对无害工具填 ignoreTools。

Shell 检查是启发式,不是系统级隔离;编码命令、脚本内部写盘等仍可能绕过。插件以当前 DSH 进程权限运行,安装前宜自行审阅源码与许可证。

降级模式 gateWrites: risky

默认 gateWrites: all 时,普通写入每次都要点。长任务里容易变成「确认噪声」。设为 risky 后,普通 write / edit 与多数命令行写会放行,仍保留敏感文件读写、系统路径写入、磁盘格式化、递归删除、权限修改等的审批或两次确认。代价是普通写不再有人把关,需配合快照或 dsh-safety-toolkit 备份。

子代理 fail closed

子代理(subagent、workflow 里的 agent())没有绑定审批答复者,其写操作与高危调用会立即拒绝(不弹窗、不等待),模型侧文案类似 the user rejected tool "…"。委派写任务会失败;需要落地修改时,应由带 UI 的父会话代跑。

斜杠命令与日志

人可在会话中使用(模型无法调用):

/write-guard status   # 当前模式与规则数量
/write-guard on       # 启用
/write-guard off      # 临时关闭(仅内存,重启恢复配置)

开启 log: true 时,判定写入 $DSH_HOME/logs/write-approval-guard/YYYY-MM-DD.log(JSONL),默认保留 7 天。

与 outside-access-guard 联动

两者都在 tools/pre-execute,瀑布只保留第一个非 allow 决策。常见 profile 顺序为 outside-access-guard → … → write-approval-guard:工作区外访问由 outside 层负责;工作区内写与敏感读由本插件负责。不要为改文案而随意调换顺序——可能降低工作区外私钥等场景的确认强度(详见 README「与 outside-access-guard 的联动」)。

安装与启用

README 给出的本地路径安装与卸载示例(将 profile 名 desktop 换成你实际使用的 profile):

dsh plugin --profile desktop add /absolute/path/to/write-approval-guard
dsh plugin --profile desktop remove write-approval-guard

插件为纯 Host、零依赖、无 install 脚本。给他人使用时,README 建议用 Git 快照(git+https://…#<40 位 commit>)或 npm 版本安装,使运行副本落在 profile 的 node_modules,避免会话工作区内的模型改写插件源码。

在 DSH 配置 patch 中启用并调整行为,例如:

- id: write-approval-guard
  config:
    mode: enforce                  # enforce | off
    log: true
    confirmGapMs: 2000
    onReject: call                 # call | turn
    unknownTools: allow            # allow | ask
    gateWrites: all                # all | risky
    highRiskConfirmations: double  # double | single
    gateShell: true
    shellMode: conservative        # conservative | lenient | off

更完整的字段(sensitivePaths、exemptPaths、ignoreTools、extraConfigPaths 等)见 README「配置」一节。插件未导出 Config schema,配置需写在 patch 里。

典型用法

严格未知工具 + 放行只读插件

- id: write-approval-guard
  config:
    unknownTools: ask
    ignoreTools: [web_search, web_fetch, todo_write, schedule_list, job_list, present, skill]

新装只读插件若开始弹窗,需把工具名追加进 ignoreTools。

拒绝后停止整轮

onReject: turn 时,拒绝某次审批会协作式停止当前轮(agent.cancel()),保留已输出流式文本,不杀进程;适合「一次误点就不要模型继续改下去」的场景。

安装后手工冒烟

README 建议顺序(需人工点击):

  1. write 工作区内新文件 → 应弹 1 次;
  2. read .env → 应弹 1 次;
  3. pwsh -Command "Remove-Item -Recurse .\build" → 先「第 1/2 次」,批准后再「第 2/2 次」;
  4. /write-guard off 后重试 → 不再弹。

仓库内可用 node test/*.test.mjs 跑判定与装配单元测试(见 README「验证」)。

适用场景与注意

适合:本地或桌面 profile 下长期开 agent、希望每次改盘与读密钥前有人确认;与 outside-access-guard、dsh-safety-toolkit 组成「外访 + 写入 + 备份」组合。

务必知晓:

  • 未登记写工具不会被本插件拦截;装「替换原生 write」或 MCP 写文件类能力前,应确认对方是否自带审批。
  • 工作区外的写仍受沙箱约束;本插件批准不等于能越界写入。
  • .env.example 等也会按文件名匹配敏感规则。
  • 插件源码若留在会话工作区内,模型理论上可改插件本身;分发时用 git/npm 安装到 profile 外副本更稳妥。

结尾

write-approval-guard 在工具执行前把写操作与敏感读拉回到人工确认,并用两次确认压住格式化、递归删除、改 shell 配置等不可逆行为。它不是内核级沙箱,但对 DSH 默认工具链是实用的一层。

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

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

Xiaoye