📄 一句话概括
两次补丁真跑:实验 A 证明顶层补丁下不去预设内部(两条 not found);实验 B 把 Subagent 的实现从 spawn 换成 fork,实质只改 1 行。
📝 本节和前面几节的关系
7.3 的前三节都是道理,这一节动手。方法还是那套:补丁做加减法、dump 做对比(4.8 留下的方法)。
一、实验设计
- 环境:
dsh 0.2.0-rc.2,--profile web,基准配置树 1259 行。 - 手法:写一个小 YAML 补丁,跑
--patch ./xxx.yml --dump-config,再与基准逐行 diff。
这样拿到的不是【应该怎样】,而是它真的怎样。
说明一点:本节两次实验做的是配置层的对照——把两条路的差别在配置里抓出来。 真跑一次任务的对照需要在本地配上 Provider 之后自己动手(怎么配见 2.3)。
二、实验 A:去改预设内部的东西
补丁里写三条:ptc-runtime 停用、tool-presentation 改 mode、delegation 改 isolate。
- 只有第一条生效:配置树 1259 → 1260 行。
- 后两条各打印一行
patch: entry "xxx" not found,警告后跳过。
结论:补丁能看到的只有顶层;预设内部是另一层,够不着。
三、实验 B:换一份实现
把 tool-subagent 的 config 整体写成 provider: fork / toolName: subagent / backgroundMode: continuable。
- 实跑 diff=4 行,其中 2 行是出处注释。
- 实质变化只有
provider: spawn→fork这一行,0 警告。
结论:换实现只动一个字段,接口名(toolName)不动。
四、两次实验放在一起看
- 改得到的(顶层能力)改一行就生效。
- 改不到的(预设内部)只给一行警告。
一个能改、一个明说不能改——边界是可检验的,不是靠猜的。
五、动手 Demo:动手实验——两次补丁真跑
两次实验的结果摆在一张表里:
rows = [("A", "ptc-runtime 停用", "成功: +1 行 -> 1260"),
("A", "tool-presentation 改 mode", "not found: 警告跳过"),
("A", "delegation 改 isolate", "not found: 警告跳过"),
("B", "tool-subagent 换 provider", "成功: 实质 1 行 / 0 警告")]
for a, b, c in rows:
print(" %s %-26s %s" % (a, b, c))
实跑输出:
--------------------------------------------------------------------
动手实验——两次补丁真跑
--------------------------------------------------------------------
实验 A:从顶层补丁里去改【预设内部】的东西。
实验 B:把 Subagent 的实现从 spawn 换成 fork,接口名不变。
实验 补丁内容 实跑结果
------------------------------------------------------------------
A ptc-runtime 停用 成功:+1 行,树变 1260 行
A tool-presentation 改 mode 找不到:只警告并跳过
A delegation 改 isolate 找不到:只警告并跳过
B tool-subagent 换 provider 成功:实质改 1 行 / 0 警告
------------------------------------------------------------------
实验 A 的 stderr 原文:
patch: entry "tool-presentation" not found
patch: entry "delegation" not found
结论两条:①顶层补丁下不去预设内部;
②换实现只动配置里的一个字段,接口名(toolName)不动。
A 的结论:顶层补丁下不去预设内部——分层不是口号。 B 的结论:换实现只改一个字段,接口名不动。 两次实验都是 0 成本可复现:写个 YAML,dump 一跑,diff 一看。
30 秒实验
- 把实验 A 的三条补丁抄一遍,猜哪条会生效,再跑一次验证。
- 写一个自己的补丁,把某个顶层能力停用,看 diff 有几行。
- 想想为什么 not found 只警告不报错。
常见误区
- 错误:补丁写哪儿都能生效。——纠正:补丁的作用面是分层的——顶层补丁改不到预设内部。
- 错误:not found 是报错,说明补丁坏了。——纠正:只警告并跳过——这是容错设计,不是失败。
- 错误:换实现要改一堆配置。——纠正:实质只改 1 行——接口名与后台模式都不用动。
自测三问(点开对答案)
1. 实验 A 的 diff 是多少? —— 配置树 **1259 → 1260 行**,并打印两条 `not found` 警告。 2. 实验 B 实质改了几行? —— **1 行**(provider 由 spawn 改成 fork),diff 共 4 行含 2 行注释。 3. 两次实验合起来说明什么? —— **改得到的改一行就生效,改不到的明说找不到**——边界可检验。- ☐ 下一节(7.3.5 PTC 什么时候反而不划算)
相关笔记
- 动手实验:同一 Tool,不同执行规则 —— 同一套实验方法
- 注册也有生命周期 —— 补丁语义的出处
- 用 Session 调试 Agent:先找证据,再判断是不是模型问题 —— 先看实跑,再下判断
- 🐳 DeepSeek Harness · 索引