🐳 第四章 从Skill、Tool到Hook
📄 一句话概括

实测:用补丁把沙箱改成只读、审批改成 ask,183 条工具插件行一行没动,改的只有 6 行规则——顺手撞出【补丁的 config 是整体替换】这条。

📝 本节和前面几节的关系

4.5、4.6 讲的是规则该怎么设计,这一节把它们真的换一遍——用的还是 4.1.2 那套【补丁做加减法、dump 做对比】的方法。

一、实验设计

写一份补丁,只动两个地方:

然后带补丁 dump 配置树,和基线做 diff——看工具变了没有、规则变了没有。

二、实测结果:工具一行没动

diff 出来只有 6 行左右的变化,全在规则那两段:

工具那 183 条注册项一条都没动。这就是【同一 Tool,不同执行规则】的实物——能力清单不变,规矩可以整批换。

三、顺手撞出来的坑

我改 mode 时没写 workspaceRoot,结果 diff 里它整行消失了。

原因:补丁的 config 是整体替换,不是深合并(4.2.1 抄过这句话,这里是实测印证)。

教训很实用:改一个字段,要把这一整段配置写全——不然就等于静默删掉了别的字段。

四、这个实验的用法

五、动手 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 秒实验

  1. 复现这个实验,把 diff 的两处改动贴出来。
  2. 故意只写 mode 不写 workspaceRoot,确认那一行真的会消失。
  3. 换一条规则试试:把 timeout 改小,看它出现在配置树的哪一段。

常见误区

  1. 错误:换规则一定要改工具。——纠正:规则是独立插件——183 条工具行一行不动。
  2. 错误:补丁会和我写的字段深合并。——纠正:整体替换;漏写 workspaceRoot,它就真的没了。
  3. 错误:这种实验只能看看,没法带到日常。——纠正:临时收紧权限、批量对照轨迹都是它的日常用法。
自测三问(点开对答案) 1. 这个实验改了什么、没改什么? —— 改了 6 行规则(sandbox mode、approval policy);**183 条工具注册项一行没动**。 2. `workspaceRoot` 为什么消失了? —— 因为**补丁的 config 是整体替换不是深合并**——没写的字段等于被删掉。 3. 这个实验方法可以怎么用? —— 临时收紧权限、批量对照两种规则的轨迹、**用配置树验证自己对规则位置的理解**。

相关笔记