📄 一句话概括
插件可以动态挂卸(第 5 章的正题),但必须挂在明确的作用域里——边界不是限制动态,而是让动态敢用。
📝 本节和前面几节的关系
3.2.1 讲了作用域是什么,这一节讲为什么非要它不可:没有边界的动态组合,会出三种事故。
一、动态组合之前,先回答【挂在哪】
第 5 章会讲 Cordis 让插件动态组合——但【动态】两个字有个前提:每次挂卸都要指明作用域。
- 挂到会话平面:跟着这次会话生灭。
- 挂到宿主平面:进程一直在,它就在。
同一个插件,挂不同平面,命运完全不同——这不是实现细节,是设计核心。
二、口诀的正式版
1.2 的口诀——【会话内的进预设,跨会话的留宿主】——现在可以给出正式版:
- 生命周期跟会话一样的,挂会话平面:工具、人格、提示段、会话中途装的插件。
- 生命周期比会话长的,挂宿主平面:注册表、沙箱配置、模型路由、持久化。
判断标准只有一条:它该活多久?——跟会话同寿,还是跨会话存在。
三、没有边界的三种事故
- 泄漏:该挂会话的挂到宿主——会话 A 的状态漏进会话 B,【互不干扰】承诺破产。
- 残留:会话结束了,挂在错误位置的能力还在——下一次会话撞见上次的状态。
- 失控:作用域不清,权限边界就不清——想收回一个能力,都不知道收哪里。
对照 2.2(工作区)会发现同一个思路:先划边界,再谈能力。
四、边界让【动态】敢用
为什么边界是动态的前提?卸载要卸得干净,前提是知道它挂在哪、活到几时。
生命周期明确,卸载才是干净的,才敢在会话中途装卸插件;反过来,如果挂卸的位置说不清,【动态组合】就变成【动态添乱】——没人敢用。
所以本节标题说得直白:动态组合必须有边界。
五、动手 Demo:挂错平面的三种事故
三种挂错的方式,配上生活比喻:
cases = [
("该挂会话的挂到宿主", "会话 A 的状态漏进会话 B"),
("该挂宿主的挂到会话", "每个会话复制一份,还不一致"),
("会话结束后还想接着用", "引用的作用域已经销毁"),
]
for a, b in cases:
print(" %-16s -> %s" % (a, b))
print()
print("判断标准只有一条:它该活多久?")
实跑输出:
--------------------------------------------------------------------
挂错平面的三种事故
--------------------------------------------------------------------
动态组合之前,先要回答【挂在哪】。挂错了会怎样:
挂法 后果 生活比喻
-------------------------------------------------------------------------------
该挂会话的挂到宿主 会话 A 的状态漏进会话 B 两个客人共用一间卧室
该挂宿主的挂到会话 每个会话复制一份,还不一致 每个房间自带一套水电表
会话结束后还想接着用 引用的作用域已经销毁 退了房还想用房卡开门
-------------------------------------------------------------------------------
算一笔账:一件 10 KB 的会话级状态,100 个会话用一天——
挂对(会话平面) 用时挂上、结束销毁,常驻 0
挂错(宿主平面) 常驻 100 份的写入点,还互相覆盖
容量是小事,隔离才是大事:挂错平面,【两个会话互不干扰】这条承诺就破了。
所以边界不是限制动态,而是让动态敢用。
三种事故的共同根因是同一个:生命周期与作用域不匹配。 算例那笔账的重点不在省内存,在隔离——挂错平面,两个会话互不干扰的承诺就破了。 【先划边界再谈能力】这思路在 2.2 的工作区上出现过一次,这是第二次。
30 秒实验
- 给这两个东西判断挂哪层:一个会话中途装的翻译插件/全局的 API 密钥配置。
- 说说【残留】事故具体怎么发生——用【房间】的比喻走一遍。
- 回看 1.2 的口诀,现在你能说出它的判断标准了吗?
常见误区
- 错误:作用域是性能优化,不影响正确性。——纠正:挂错平面先破的是隔离性,状态泄漏比浪费内存严重得多。
- 错误:动态组合就是想挂哪挂哪。——纠正:每次挂卸都必须指明作用域;没有边界的动态是添乱。
- 错误:会话结束后插件会自动进宿主平面继续服务。——纠正:作用域销毁就是销毁,没有自动搬家这回事。
自测三问(点开对答案)
1. 判断挂哪个平面的唯一标准是什么? —— **它该活多久**:跟会话同寿的挂会话平面,跨会话的挂宿主平面。 2. 没有边界的动态组合会出哪三种事故? —— 泄漏(状态跨会话)、残留(会话结束能力还在)、失控(权限收不回来)。 3. 为什么说边界是动态的前提? —— 卸载干净的前提是知道挂在哪、活到几时;**生命周期明确才敢中途装卸**。- ☐ 下一节(3.3 Standard:能力基线)
相关笔记
- Scope Context:会话级能力从哪里来 —— 上一篇讲作用域是什么,这一篇讲为什么非要它
- 为什么这不只是【多加几个 Tool】 —— 接缝与边界一脉相承
- 命名空间、模块、软件包-将相关的类集中在一起 —— 命名空间就是作用域思想的老前辈
- 🐳 DeepSeek Harness · 索引