dsh-project-guard
Verifieddsh-project-guard · v1.1.1 · MIT
Consequence analysis for DeepSeek Harness: it says what an extra-permission call costs you — the device, your delegated authority, your wider interests. State-based, not guessed.
Install
dsh plugin add dsh-project-guard Confirm the layer applied with dsh --profile default --dump-config — see the install guide.
Source
Tags
Creators
Readme
dsh-project-guard · 项目守卫
📄 Preprint: Decision-Relevant Consequence Disclosure in Complex Computing Systems: Towards Informed Agent Execution
中文 | English
一个 DeepSeek Harness 插件:在 agent 动你的机器之前与之后,把"这次动作会让你失去什么"讲清楚。
它是上面这篇论文第 6.2 节所述原型适配器的实现:同样的 analyze / preview / report 三个接口(§4.6)、六族后果规则系统(§4)、Preview 与 Report 两种披露模式(§5.1)。全部判定是确定性查表,不调用任何模型;零依赖、不 import 任何 Harness 包、无构建步骤。
一、决策缺的不是许可,是后果
论文 §1.4 指出,现有机制回答的是另外三个问题:
| 机制 | 回答的问题 |
|---|---|
| 授权(authorization) | 这个动作可以做吗 |
| 沙箱(sandboxing) | 它可以在哪里做 |
| 风险评分(risk assessment) | 它有多危险 |
它们都不回答:它对你意味着什么。而 §3.4 的"结果可见性不对称"让这件事更麻烦——任务是否成功总是看得见,损失却常常无声无息(silent loss)。于是在"运行成功"的样本里,真实损失被系统性低估(Proposition 1):
$$\mathrm{SLR} = (1-\delta)\cdot P(l^*=1 \mid s=1)$$
本插件就是补这一层的原型:把后果披露出来,让决策在有信息的状态下发生。
二、它如何帮助你的决策
1. 决策前给你 Preview(§5.1、§5.3)。 当一个调用正在向你额外申请权限时,确认里给出的不只是"允许 / 拒绝",而是:动作、采集到的当前状态、后果(生活层面一句话)、受影响的利益、严重度与可恢复性、置信度与已检查范围、以及每个选项各自的损失。目标是让你在时间压力、注意力不足的条件下(论文所说的"受压决策"),尽量接近反思性决策 $D_R^*$。
2. 决策后给你 Report(默认关闭,可开)。 放行的动作若命中规则,会在工具结果后附一段执行后披露:预测 vs 观察(命中 / 误报 / 未预测到)+恢复建议。静默损失因此能被注意到、被缓解、被恢复,而不是永远没人知道。
3. 给你选项,而不是只给警告(§3.5)。 拒绝不是零成本——它在任务目标上有机会成本。所以 Preview 会同时列出「执行 / 拒绝 / 先备份再执行 / 换一种写法」各自的损失。只警告执行,会退化成"什么都拒绝"的退化策略。
4. 只讲决策相关的,不讲全部(§3.6、§4.4)。 每条后果按
$$r(e) = w_j \cdot l_j(e) \cdot \kappa_e \cdot \nu_e,\qquad l_j = (1-\rho_j)L_j + r_j$$
打分,只展示 top-k 且 $r(e)\ge\tau$ 的;低于阈值一句话都不说。这条设计来自 §2 的直接动机:警告越多,人越会闭眼点过(Egelman 等;Akhawe & Felt;Johnson & Goldstein;Turan 关于"审查容量与疲劳"的分析)。沉默是设计的一部分,不是遗漏。
5. 同一个动作,状态不同则后果不同(§3.3 的例子)。 delete(project.db):有近期备份时 $l\approx 0$,没有备份时 $l$ 很大。所以判定是 $C, S, U \to \Delta U$,而不是 $C \to$ 风险——这正是本插件的核心。
6. 宁可说"不知道",也不假装知道。 判定不了的谓词不会被当作"没问题",而是写进未检查 / 无法判定;置信度按利益维度分级设上限;价值判断只标记、不预测、不裁决。
三、框架 → 代码
| 论文 | 实现 |
|---|---|
§4.6 analyze(action, context) → consequences |
lib/engine.js → lib/rules.js |
§4.6 preview(action, options, context) → disclosure |
lib/engine.js + lib/disclosure.js |
§4.6 report(action, pre_state, post_state) → report |
lib/report.js(预测 vs 观察、JSONL 标定记录) |
| §4.2 规则族 1:action rules | lib/action.js(工具调用 → 类型化动作:fs.delete、network.egress、process.kill、api.spend……) |
| 规则族 2:state rules(声明作用域 $K$) | lib/state.js(未提交改动、近期备份、凭据库、共享位置、受监管数据、构建产物……) |
| 规则族 3:interest rules | lib/interest.js(21 个内置维度 + 用户自定义维度,带 Tier) |
| 规则族 4:consequence rules | rules/consequences.yml(34 条声明式规则)+ lib/rules.js |
| 规则族 5:selection rules | lib/select.js(预算 $k$、阈值 $\tau$、Tier 上限与标记) |
| 规则族 6:disclosure rules | lib/disclosure.js(生活层 + 技术层,中英双语) |
| §5.1 Preview / Report 两种模式 | index.js:Preview 进 tools/pre-execute 的确认弹窗;Report 由 tools/post-execute 追加到工具结果 |
| §5.3 预测 vs 观察的记录 | lib/report.js → .dsh-project-guard/reports.jsonl(标定证据,不含文件内容) |
规则集的 schema、谓词表、Tier 表、以及"怎么加一条规则"见 rules/README.md。
四、利益维度与 Tier(§3.2)
论文强调:利益比设备上的数据宽得多——账号、凭据及其范围、额度与余额、第三方服务、委派关系、声誉、法律义务。本插件内置 21 个维度、七组,并且接受你自定义的维度:
| 组 | 维度 |
|---|---|
| 成果与设备 | data_work、availability(机器与别的程序还能否正常用)、environment、task_goal、schedule |
| 权限与身份 | authority_delegation、credentials、accounts、privacy |
| 经济与金融 | economic、finance_money、finance_market、business_ops |
| 他人与声誉 | reputation、relationships |
| 规则与义务 | legal、compliance、intellectual_property、employment |
| 价值判断 | ethical、autonomy |
自定义(不必是我们认识的维度):
interests:
我的健康数据:
weight: 0.95
tier: 1
label: my health records
可计算程度不同,处置方式就不同——这一条在 lib/select.js 里强制,不靠规则作者自觉:
| Tier | 处置 |
|---|---|
| 1 | 由采集到的状态算出,正常计分 |
| 1-2 | 可算,但含义需要上下文;置信度上限 0.6 |
| 2 | 只给推断:标注「推断(未核实)」,置信度上限 0.5 |
| 2-3 | 标记 + 明确的价值判断提示;置信度上限 0.4 |
| 3 | 只标记:不计分、不排序、不裁决 |
理由写在 rules/README.md 里:把价值判断包装成计算结果,比不说更糟。
五、触发条件:安静是设计的一部分
默认只在完全权限下、且某个调用正在向你额外申请授权时做后果分析:
| 情形 | 是否分析 |
|---|---|
| 工作区内的正常操作(任何模式) | ❌ 完全不分析 |
| 完全权限下的普通放行 | ❌ 不分析 |
| 完全权限下、调用额外申请授权 | ✅ 分析(Preview) |
| 工作区模式、但提权到完全权限 | ✅ 分析(Preview) |
想更宽可以设 discloseOn: asks(任何需要确认的调用)或 discloseOn: all(所有规则涉及的动作,同时启用 Report)。事后 Report 由 reportExecuted 单独开关,默认关闭——"每条动作都说一句"本身就是噪音。
六、另一层:权限门
后果披露之外,插件仍保留最初的权限判定(论文也认为授权与隔离依然必要,§8.1):
- 放行:读取任意位置、只读系统查询、网络与上传、项目内写入与构建、临时目录与包缓存、会话内工具。
- 确认:写入项目外、系统状态改动(服务、偏好、网络、电源、磁盘、进程、全局安装)、资源耗尽与抢端口、无法检查的命令与未知工具(失败即确认)。
- 拒绝:会毁掉机器或终止会话本身的动作——格式化磁盘、
rm -rf /、关机重启、关闭网络接口、杀掉核心系统进程、杀掉 Harness 自身。理由很直接:确认弹窗本身依赖这个会话。
同一时刻最多一条确认。 Harness 的 Web 端每个会话只投影一个待处理审批(新的会顶替旧的),并发两条会让先出现那条永远答不了。插件在 approval/request 最前面放了单槽队列,系统相关请求优先占槽。
七、安装
dsh plugin add dsh-project-guard
# 或从源码
dsh plugin add github:Inceptzws/dsh-project-guard
桌面 App 请用 设置 → 插件 页面安装(该 profile 由 App 独占管理)。卸载用 dsh plugin remove dsh-project-guard。
八、配置
两层共用一个配置块(cordis.patch.yml 里有全部默认值):
| 键 | 默认 | 作用 |
|---|---|---|
enabled |
true |
总开关 |
projectRoots / includeSessionCwd |
[] / true |
项目根;会话工作区默认算一个 |
enforceAskPolicy |
true |
保证确认能到达你(策略为 never 时弹窗无法出现) |
serializeApprovals / prioritizeSystemRequests |
true / true |
单槽队列与系统优先 |
protectSessionAndSystem |
true |
破坏性动作直接拒绝(可降级为确认) |
disclose |
true |
后果披露层总开关 |
discloseOn |
full-access-asks |
何时披露:full-access-asks / asks / all |
attentionBudget($k$) |
2 |
一次最多展示几条后果 |
relevanceThreshold($\tau$) |
0.3 |
低于此分完全不打扰 |
reportMinSeverity |
high |
事后 Report 的最低严重度 |
reportExecuted |
false |
是否对放行动作追加 Report |
reportDir |
.dsh-project-guard |
标定记录的落盘目录 |
interests |
{} |
声明或新增利益维度与权重 |
rulesFile |
"" |
换成你自己的规则集 |
九、验证
node --test test/*.test.mjs # 93 个单元与集成用例
node test/cordis-mount.mjs # 在真实 cordis 运行时上挂载检查
发布前还会验证:npm pack 的 tarball 里必须含 rules/consequences.yml(规则集是运行时从磁盘读的,漏了它插件会没有规则)。CI 的发布工作流把这三件事都当作闸门。
十、已知限制
- 判定是命令文本 + 采集状态的规则匹配,不是沙箱;混淆过的 shell 可以绕过规则。
- 按需求放行了读取与网络通信,因此它不保护数据不外流,保护的是"机器与其他程序能否正常用"以及你被承诺出去的东西。
- Tier 2/3 的维度依赖外部知识,只能给带不确定性的推断或标记——这是有意的诚实,不是遗漏。
- 收集器只覆盖本机可观察的状态;余额、持仓、配额等远程状态标注为"未检查"。
- 插件挂在核心管线上(
tools/pre-execute、tools/post-execute、approval/request),Harness 的破坏性变更需要跟进。 - 其他策略插件仍然生效:本插件放行时只是委托给后续监听器。
十一、文件
index.js # 入口:权限门 + 披露触发 + Report 挂载
lib/action.js # 规则族 1:动作归一化
lib/state.js # 规则族 2:状态收集器(声明作用域 K)
lib/interest.js # 规则族 3:利益维度与 Tier
lib/rules.js # 规则族 4:规则引擎
lib/select.js # 规则族 5:相关性选择
lib/disclosure.js # 规则族 6:Preview / Report 渲染
lib/report.js # 预测 vs 观察 + JSONL 标定记录
lib/engine.js # analyze / preview / report 三接口
lib/classify.js # 权限门
lib/impact.js # 权限门的确定性影响分析
lib/shell-parse.js # 保守 shell 解析
lib/path-utils.js # 路径包含判断
lib/approval-queue.js # 单槽 FIFO
lib/yaml.js # 零依赖 YAML 子集解析器
rules/consequences.yml # 34 条声明式规则
rules/README.md # schema、谓词、Tier、如何加规则
test/ # 93 个用例 + cordis 挂载检查
十二、引用
@misc{zhu2026consequencedisclosure,
title = {Decision-Relevant Consequence Disclosure in Complex Computing Systems:
Towards Informed Agent Execution},
author = {Zhu, Wushuang},
year = {2026},
month = oct,
note = {Preprint v0.1},
doi = {10.5281/zenodo.23187648},
url = {https://doi.org/10.5281/zenodo.23187648}
}
本仓库是论文第 6.2 节所述的原型适配器;rules/ 即论文可用性声明中所指的 "code and rule sets"。
许可
MIT