📄 一句话概括
实测:用补丁把沙箱改成只读、审批改成 ask,183 条工具插件行一行没动,改的只有 6 行规则——顺手撞出【补丁的 config 是整体替换】这条。
📝 本节和前面几节的关系
4.5、4.6 讲的是规则该怎么设计,这一节把它们真的换一遍——用的还是 4.1.2 那套【补丁做加减法、dump 做对比】的方法。
一、实验设计
写一份补丁,只动两个地方:
sandbox-policy的mode改成read-only;approval的policy改成ask。
然后带补丁 dump 配置树,和基线做 diff——看工具变了没有、规则变了没有。
二、实测结果:工具一行没动
diff 出来只有 6 行左右的变化,全在规则那两段:
mode从动态表达式(读环境变量)变成写死的read-only;policy从表达式变成写死的ask。
工具那 183 条注册项一条都没动。这就是【同一 Tool,不同执行规则】的实物——能力清单不变,规矩可以整批换。
三、顺手撞出来的坑
我改 mode 时没写 workspaceRoot,结果 diff 里它整行消失了。
原因:补丁的 config 是整体替换,不是深合并(4.2.1 抄过这句话,这里是实测印证)。
教训很实用:改一个字段,要把这一整段配置写全——不然就等于静默删掉了别的字段。
四、这个实验的用法
- 临时收紧:想拿只读模式跑一遍危险任务,加一层补丁就行。
- 批量对照:同一批工具,两种规则各跑一次,比轨迹差异(2.4.3 的方法在这里复用)。
- 验证理解:把规则改到你认为的位置,再 dump 看它出现在哪段——配置树会告诉你理解对不对。
五、动手 Demo:动手实验——同一 Tool,不同执行规则
真跑原文:补丁 + diff 结果:
cat > exp_readonly.yml <<'EOF'
- id: sandbox-policy
config:
mode: read-only
- id: approval
config:
policy: ask
EOF
dsh --profile web --patch ./exp_readonly.yml --dump-config > patched.txt
diff baseline.txt patched.txt
实跑输出:
--------------------------------------------------------------------
动手实验——同一 Tool,不同执行规则
--------------------------------------------------------------------
写一份改规则的补丁(工具一件没动):
- id: sandbox-policy
config:
mode: read-only
- id: approval
config:
policy: ask
和基线配置树做 diff,改动就这几行:
----------------------------------------------------------------------
130,131c131,132
< mode: !!js process.env.DSH_PERMISSION_MODE ?? 'workspace-write'
< workspaceRoot: !!js process.cwd()
---
> mode: read-only
143,145c145,146
< policy: !!js >- ... 'danger-full-access' ? 'never' : 'ask'
---
> policy: ask
----------------------------------------------------------------------
同一份工具清单(183 条插件行)一行没动,改的只有规则。
顺便踩到一个真实细节:我改 mode 的时候没写 workspaceRoot,
结果它整行消失了——【patch 的 config 是整体替换,不是深合并】。
这是 schema 里写明的一句话,实测印证。
diff 里那两处 > 就是规则被换成写死值的样子;工具那 183 行没有任何变化。
workspaceRoot 整行消失那一处,是整体替换语义的实证——改一段就要写全一段。
实验方法闭环了:补丁做加减法、dump 做对比(4.1.2 一次、这里一次)。
30 秒实验
- 复现这个实验,把 diff 的两处改动贴出来。
- 故意只写
mode不写workspaceRoot,确认那一行真的会消失。 - 换一条规则试试:把 timeout 改小,看它出现在配置树的哪一段。
常见误区
- 错误:换规则一定要改工具。——纠正:规则是独立插件——183 条工具行一行不动。
- 错误:补丁会和我写的字段深合并。——纠正:整体替换;漏写
workspaceRoot,它就真的没了。 - 错误:这种实验只能看看,没法带到日常。——纠正:临时收紧权限、批量对照轨迹都是它的日常用法。
自测三问(点开对答案)
1. 这个实验改了什么、没改什么? —— 改了 6 行规则(sandbox mode、approval policy);**183 条工具注册项一行没动**。 2. `workspaceRoot` 为什么消失了? —— 因为**补丁的 config 是整体替换不是深合并**——没写的字段等于被删掉。 3. 这个实验方法可以怎么用? —— 临时收紧权限、批量对照两种规则的轨迹、**用配置树验证自己对规则位置的理解**。- ☐ 下一节(4.8 本章小结)
相关笔记
- 动手实验:删除 Skill,观察能力是否还在 —— 同一套实验方法的前一次
- 注册也有生命周期 —— 整体替换这条就是从那儿抄来的
- 比较同一任务的执行轨迹 —— 换规则之后可以再比一次轨迹
- 🐳 DeepSeek Harness · 索引