📄 一句话概括
设计一种新能力,先定四件事:能力 id、对外提供什么、谁来提供实现、谁使用——四件事说完,接缝在哪就清楚了。
📝 本节和前面几节的关系
8.1 把需求写清了,这一节把需求里的【一种能力】展开成四个可落笔的字段。
一、四件事,一句话一件
- 能力 id:它在配置里叫什么(
review)。 - 对外提供什么:别人拿它干什么(只读看代码 + 出一份报告)。
- 谁来提供实现:落在哪个包(本课复用已有件,不写新包)。
- 谁使用:被谁调用(会话里的模型,经预设装配)。
四句都是短句,但少一句就写不出配置。
二、这三个名字对应三个角色
1.3 讲过同一能力的三个角色:定义 / 提供方 / 使用方。
- 定义=能力 id:契约的名字。
- 提供方=实现包的 provider:具体怎么干。
- 使用方=装配它的组合:谁在拿它干活。
三个角色分开,才是【可替换】能成立的前提——换掉提供方,定义与使用方都不用动。
三、实测:一个能力两个名字
配置树里最典型的一对:ptc-runtime 这个 id,背后的包叫 dsh-ptc-runtime-node(7.3.1)。
能力是 id,实现是包——包名后缀 -node 就是那根可以换的线。
同一种情形在 7.4.1 也出现过:四个 subagent provider,共用同一个包名,靠 provider 字段分流。
四、先定四件事的好处
- 写配置时不用犹疑,四个字段挨个填。
- 换实现时知道哪一个是【接口】、哪一个是【实现】。
- 别人读你的配置时,也能一眼分出哪层是哪层。
四件事是设计动作,不是文档动作——写在纸上是为了写对配置。
五、动手 Demo:设计一种新能力,先定四件事
以【代码审查】为例,四件事一句话一件:
cap = {"id": "review", "provides": "只读审查 + 报告",
"provider": "复用已有件", "consumer": "会话里的模型"}
for k, v in cap.items():
print(" %-9s %s" % (k, v))
实跑输出:
--------------------------------------------------------------------
设计一种新能力,先定四件事
--------------------------------------------------------------------
以【代码审查】为例,四件事一句话一件:
要定的事 问自己 本例的答案
----------------------------------------------------------------
能力 id 它叫什么名字 review(配置里的 id)
对外提供什么 别人拿它干什么 只读看代码 + 出一份审查报告
谁提供实现 落在哪个包 本课复用已有件,不写新包
谁使用 被谁调用 会话里的模型,经预设装配
----------------------------------------------------------------
4.2.2 讲过【一个包挂多个入口】——**四件事定完,接缝在哪就清楚了**:
对外提供什么是契约,谁提供实现是那根可以换的线。
四件事定完,接缝在哪就清楚了:对外提供什么是契约,谁提供实现是那根可以换的线。 本课不写新包——设计一种能力不等于写一个包,复用已有件也是一种设计。 id 与包名分开,才有 7.3.1 那种【换实现不改名字】的自由。
30 秒实验
- 把【代码审查】换成一个你熟悉的能力,照样填四个字段。
- 在配置树里找一对【id 与包名不一样】的例子,说出哪根线可以换。
- 想想四个字段里,哪一个最容易写漏——一般是【使用方】。
常见误区
- 错误:设计能力就是写一个插件包。——纠正:设计能力是先定契约——本课的第五套预设只用了已有件,一行代码都没写。
- 错误:能力 id 随便起,反正内部用。——纠正:id 是要被人读的——它是契约的名字,将来换实现时,别的地方引用的就是这个 id。
- 错误:提供方和使用方是一回事。——纠正:一个是给,一个是拿——混在一起,就等于把接口和实现焊死(5.7 的 Effect/Coeffect 也是这对方向)。
自测三问(点开对答案)
1. 设计一种新能力先定哪四件事? —— **能力 id、对外提供什么、谁来提供实现、谁使用**。 2. 为什么 id 和包名要分开? —— 因为**能力是契约、实现是可换的线**——换掉实现,能力名一个字都不用改(7.3.1 的 `ptc-runtime` 就是例子)。 3. 设计能力一定要写新包吗? —— 不必——**复用已有件也是一种设计**,关键是四件事说清、接缝放对层。- ☐ 下一节(8.2.2 把可替换点放在正确的层)
相关笔记
- 把可替换点放在正确的层 —— 接缝定好,还得放对地方
- 代码执行能力与具体实现分离 —— 能力 id 与实现包分开的实证
- 同一种 Subagent 能力,可以有不同的实现 —— 一个包名四种实现
- 🐳 DeepSeek Harness · 索引