dsh-agent-policy:核对 Agent 策略声明与代码是否一致

前言

在 DeepSeek Harness(DSH)里做带工具的 Agent 时,常见做法是单独维护一份策略文件:写清楚是否出网、允许哪些工具、哪些操作要人工确认。代码迭代后,声明和实现很容易脱节——policy.yml 里写着「不出网」,仓库里却仍有 fetch 调外网;注释里写着「需人工确认」,同文件里却直接执行高风险动作。

单靠人工翻文件很难系统核对。dsh-agent-policy 做的是静态比对:把策略声明和项目代码摆在一起,列出「声明说 A、代码里是 B」的事实,不拦截运行时、也不替你做合规认证。下面介绍它是什么、查什么、怎么装怎么用。

这是什么

维护者为 feely0208,npm 包名为 @deepwhale-cn/dsh-agent-policy(GitHub:feely0208/dsh-agent-policy),在 DSH 插件目录中归类为 admin-security。一句话:说好不干的事干了没,干了的有没有说。

它是静态分析工具,不是运行时拦截器,也不是只看「权限是否过宽」的扫描器(后者更接近同系列的 dsh-agent-scope)。分界可以记成:

agent-scope   = 单看【权限本身】宽不宽(通配符、根目录、无限制出网)
agent-policy  = 看【声明】与【实现】是否一致

同一个 allow: "*",两边都可能提到;agent-scope 关心「权限太宽」,agent-policy 关心「你以为自己在声明白名单,声明里却写了允许一切」这类不一致。

核心功能:五条规则

插件对项目根目录做核对,命中时会给出文件路径、行号、该行内容及对应规则编号。README 中列出的规则如下。

规则 查什么 级别
POLICY-EGRESS-PROMISE 策略里写了「不出网」,同一项目里却有网络调用 高
POLICY-CONFIRM-MISSING 代码里写着「需人工确认」,同一文件里却直接执行高风险动作 高
POLICY-WILDCARD-ALLOW 策略里把权限写成通配符(如 allow: "*"、tools: ["*"]、permissions: all) 高
POLICY-DECL-EMPTY 策略声明里的工具清单为空(tools: [] / tools: null) 中
POLICY-NO-DECLARATION 有 Agent 相关代码却找不到任何策略声明文件 中

策略声明通常来自 policy.yml、agent.yml 或项目中的权限配置;具体解析逻辑以插件源码与 dsh-agent-policy --list-rules 输出为准。

POLICY-NO-DECLARATION 仅在项目里出现 Agent 特征(如 openai、anthropic、@deepseek-ai、tool_call、tool_use、AgentExecutor 等)时才会适用;纯普通小工具不会因此被误报。若结果里该规则为 notApplicable,表示当前仓库未检测到 Agent 代码。

判据在 README 中引用了 OWASP Top 10 for LLM Applications 2025(LLM06 Excessive Agency)、CIS Controls v8 Control 6、NIST AI RMF 1.0 与 NIST SP 800-53 Rev.5 AC-6 等,供对照阅读,插件本身不下「安全 / 不安全」的结论。

安装与启用

在已安装 DSH 的环境中,按官方 README 执行:

dsh plugin --profile web add @deepwhale-cn/dsh-agent-policy

package.json 要求 Node.js >=18,DSH 引擎 >=0.1.0-rc.6 <0.3.0。许可证为 MIT。插件以当前 DSH 进程权限读取你指定的项目目录,安装前建议自行查看 GitHub 仓库 源码与许可证。

典型用法

安装后使用命令行 dsh-agent-policy(由插件 bin 提供)。

先对本地 Agent 项目做一次核对,把 /path/to/your-agent 换成实际根目录:

dsh-agent-policy --root /path/to/your-agent

不熟悉输出格式时,可跑内置演示(一个「策略说不准出网、代码却在往外发」的示例项目):

dsh-agent-policy --demo

查看内置规则与依据说明:

dsh-agent-policy --list-rules

需要报告落盘或接入 CI 时:

dsh-agent-policy --root . --html
dsh-agent-policy --root . --json

有高级别(high)命中时,进程退出码为 1,便于在 CI 里作为卡口。

README 中的对比例子:policy.yml 里 outbound.allow: false 并注明不出网,而 src/sync.js 里对 Slack Webhook 调用 fetch。报告会类似:

POLICY-EGRESS-PROMISE  src/sync.js:9
  策略里写明了不准出网,同一个项目里却有网络调用

这里的诉求不是判定「出网一定有罪」,而是让声明与实现二选一或同时对齐,避免出事时策略文件与真实行为对不上。

仓库内还提供 bash tests/run.sh 做双向验证,包含应失败、应通过、以及「有 Agent 代码但无策略文件」等 fixture,便于理解规则边界。

适用场景与注意

适合:已有或计划维护 policy.yml / agent.yml 等策略文件的 Agent 项目;希望在合入前或 CI 里自动发现「声明与代码拧巴」的团队。

不适合当作:运行时权限网关、单独的最小权限审计(请配合 dsh-agent-scope 等同系列插件)、或合规过审结论。

DSH 社区插件目录(如 SkillHub 上的 feely0208/dsh-agent-policy)由社区维护,与 DeepSeek / 幻方无官方从属关系;生态理念是「一切皆插件」,可按需从目录页选用。

同作者「深鲸网安守护」系列中,dsh-agent-policy 归类在「AI 与 Agent 治理」,与 Agent 权限、MCP 安全等插件可配套使用;每个插件只做一件事,策略核对解决的是声明与实现一致性这一条链路上的环节。

结尾

dsh-agent-policy 把策略文件和代码静态对照,用五条规则列出不一致点,支持终端、HTML 与 JSON 输出,并可用退出码挂 CI。需要安装命令、规则列表与示例时,以 GitHub README 为准;在目录站浏览元信息可打开 SkillHub 插件页。

羽毛球分组比赛记分
小程序二维码

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

Xiaoye