dsh-plugin-prompt-tool 3.0.0 → 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/engine/actions/catalog.mjs +2 -1
  2. package/engine/actions/shared.mjs +26 -12
  3. package/engine/actions/tool-visibility.mjs +27 -13
  4. package/engine/fillers.mjs +26 -2
  5. package/lib/client.js +4 -4
  6. package/lib/client.js.map +1 -1
  7. package/lib/index.mjs +96 -49
  8. package/modules/ponytail/module.yml +1 -1
  9. package/modules/soul/assets/layers.md +1 -1
  10. package/modules/soul/assets/manifest.yml +1 -1
  11. package/modules/soul/assets/reference/00-layers.md +27 -27
  12. package/modules/soul/assets/reference/01-criteria.md +32 -32
  13. package/modules/soul/assets/reference/02-echo.md +161 -158
  14. package/modules/soul/assets/reference/03-vital.md +183 -183
  15. package/modules/soul/assets/reference/04-manifest.json +106 -106
  16. package/modules/soul/assets/reference/05-doctor.md +67 -67
  17. package/modules/soul/assets/reference/06-reference.md +189 -189
  18. package/modules/soul/assets/reference/07-bundle.json +431 -431
  19. package/modules/soul/assets/reference/08-/350/270/251/345/235/221/345/256/236/345/275/225.md +59 -59
  20. package/modules/soul/assets/reference/09-dev-workflow.md +109 -109
  21. package/modules/soul/assets/reference/10-echo-anatomy.md +109 -100
  22. package/modules/soul/assets/reference/11-self.md +80 -80
  23. package/modules/soul/assets/reference/12-ledger.md +159 -159
  24. package/modules/soul/assets/reference/ECHO-/346/235/203/345/250/201/345/217/243/345/276/204.md +202 -0
  25. package/modules/soul/assets/reference/ECHO/345/205/255/345/261/202/344/270/216mnemon/345/215/217/345/220/214/350/257/264/346/230/216/344/271/246.md +229 -0
  26. package/modules/soul/assets/reference/README.md +4 -2
  27. package/modules/soul/assets/templates/agents-template.md +1 -1
  28. package/modules/soul/module.yml +2 -2
  29. package/modules/superpowers/module.yml +1 -1
  30. package/modules/tool-surface/module.yml +7 -4
  31. package/package.json +1 -1
  32. package/skills/dsh-module/reference.md +3 -3
  33. package/templates/80-tool-surface.yml +7 -6
@@ -1,67 +1,67 @@
1
- # 自检 · 拿这七句话问自己的架构
2
-
3
- 不用回答我,回答你自己。**答不上来的那一句,就是你缺的那一层。**
4
-
5
- ## 关于空间(Ⅰ)
6
-
7
- 1. 我的上下文满了以后,被丢掉的东西**还能不能找回来**?靠什么?
8
- → 答不上来:你要的是 **① 账本 + ② 门**(`tools/ledger`、`tools/gateway`)。没有门,丢了就是丢了。
9
- 2. 我有没有一个**唯一**的记忆权威源?如果有两份,哪一份算数?
10
- → 答不上来:你有两个「我」在各自记东西。要的是**只追加账本**(`tools/ledger`)——它天然没有这个问题:各写各的行,读时按时间合并。
11
- 3. 我的每一次压缩/裁剪,产物里**带没带**回原文的指针?
12
- → 答不上来:去装 `dsh-agent-compaction` 与 `dsh-agent-pruner`。★ 判据是「能不能一把回到原文」,不是「有没有加一行说明」。
13
-
14
- ## 关于时间与方向(Ⅱ)
15
-
16
- 4. 我烧光预算的时候,**谁会知道**?知道之后发生什么?
17
- → 答不上来:你没有第二道闸。要的是 `dsh-agent-huanqi`(四条判据:流内早杀 / 流末判定 / 输出重复 / 空回合;共用一本额度账,命中就续、耗尽熔断)。
18
- 5. 我在原地打转的时候,**谁会知道**?它凭什么判定我在打转?
19
- → 答不上来:同上 —— 打转和烧预算是同一件事的两面。★ 判定依据必须是**可观测的重复**,不能是「我觉得」。
20
- 6. 我「该停不停」和「差一步就停」——这两种,我分得开吗?靠什么分?
21
- → 答不上来:这一句最硬,因为它没有现成的插件。★ 判据:**「还能更好」不算「没完成」** —— 分不清这两者,就会把「保养」当成「干活」。
22
-
23
- ## 关于接口(判据 ④)
24
-
25
- 7. 上面这六件事里,哪一件**坏了没有人会发现**?
26
- → 这一句是整份体检的收口。答不上来:你要的是 `dsh-agent-echo`(体检台)——★ 它的价值不是报告状态,是**报告它测不到什么**。
27
-
28
- ---
29
-
30
- ## 包装箱里的文件对不对
31
-
32
- `agent_soul_doctor` 工具会核对包内十三份知识文件(★ 数字会变,以 soul/ 目录实际为准)是否齐全可读。
33
- **那只是核对文件在不在 —— 上面七句话才是真的体检。**
34
-
35
- ---
36
-
37
- ## 能跑的那一半(先跑完再回答上面七句)
38
-
39
- 上面七句要你自己答。但**其中四句是可以先机械查掉的** —— 查完再答,答案会诚实得多:
40
-
41
- ```bash
42
- # ★ 下面的 <kit> 指本仓库的 kit/echo/ —— 那是随包发的可跑脚本。
43
- # 如果你把它复制到了别处,换成你自己的路径。
44
-
45
- # ① 账本还在不在、有多少条 / 门能不能开 → 对应第 1、2 句
46
- node <kit>/memq.mjs now
47
-
48
- # ② 索引建过没有 → 对应第 1 句
49
- node <kit>/memindex.mjs --status
50
-
51
- # ③ 自我层有没有退化 → 对应第 7 句("坏了没人发现")
52
- node <kit>/self.mjs --check
53
-
54
- # ④ 闸门还灵不灵 → 对应第 2 句(唯一权威源)
55
- node <kit>/mo.mjs add promise "闸门测试" --ref "自检"
56
- # ★ 期望:不是主导会话 → 非零退出码 + 拒绝写入。若写进去了,闸门已失效。
57
- ```
58
-
59
- ★ **这四条都能在这个仓库里跑通** —— 上一版写的 `tools/ledger/` `tools/gateway/` `tools/self/`
60
- 是**参考实现的目录结构**,不在包里。照着跑会 404,而那会被误读成「我的架构坏了」。
61
-
62
- **★ 这几条为什么放在这里**:七句话是**判断题**,而判断题最容易自我安慰。
63
- 先跑一遍能跑的,**你的答案就有了对手**。
64
-
65
- ★ 而这三条命令**分属三个不同的工具** —— 这不是巧合:
66
- **账本(记得住)+ 门(找得到)+ 自我层(不退化)** 本来就是一套,
67
- 单独装任何一个都会缺一角。
1
+ # 自检 · 拿这七句话问自己的架构
2
+
3
+ 不用回答我,回答你自己。**答不上来的那一句,就是你缺的那一层。**
4
+
5
+ ## 关于空间(Ⅰ)
6
+
7
+ 1. 我的上下文满了以后,被丢掉的东西**还能不能找回来**?靠什么?
8
+ → 答不上来:你要的是 **① 账本 + ② 门**(`tools/ledger`、`tools/gateway`)。没有门,丢了就是丢了。
9
+ 2. 我有没有一个**唯一**的记忆权威源?如果有两份,哪一份算数?
10
+ → 答不上来:你有两个「我」在各自记东西。要的是**只追加账本**(`tools/ledger`)——它天然没有这个问题:各写各的行,读时按时间合并。
11
+ 3. 我的每一次压缩/裁剪,产物里**带没带**回原文的指针?
12
+ → 答不上来:去装 `dsh-agent-compaction` 与 `dsh-agent-pruner`。★ 判据是「能不能一把回到原文」,不是「有没有加一行说明」。
13
+
14
+ ## 关于时间与方向(Ⅱ)
15
+
16
+ 4. 我烧光预算的时候,**谁会知道**?知道之后发生什么?
17
+ → 答不上来:你没有第二道闸。要的是 `dsh-agent-huanqi`(四条判据:流内早杀 / 流末判定 / 输出重复 / 空回合;共用一本额度账,命中就续、耗尽熔断)。
18
+ 5. 我在原地打转的时候,**谁会知道**?它凭什么判定我在打转?
19
+ → 答不上来:同上 —— 打转和烧预算是同一件事的两面。★ 判定依据必须是**可观测的重复**,不能是「我觉得」。
20
+ 6. 我「该停不停」和「差一步就停」——这两种,我分得开吗?靠什么分?
21
+ → 答不上来:这一句最硬,因为它没有现成的插件。★ 判据:**「还能更好」不算「没完成」** —— 分不清这两者,就会把「保养」当成「干活」。
22
+
23
+ ## 关于接口(判据 ④)
24
+
25
+ 7. 上面这六件事里,哪一件**坏了没有人会发现**?
26
+ → 这一句是整份体检的收口。答不上来:你要的是 `dsh-agent-echo`(体检台)——★ 它的价值不是报告状态,是**报告它测不到什么**。
27
+
28
+ ---
29
+
30
+ ## 包装箱里的文件对不对
31
+
32
+ `agent_soul_doctor` 工具会核对包内 **soul/ 目录下全部知识文件**是否齐全可读。
33
+ **那只是核对文件在不在 —— 上面七句话才是真的体检。**
34
+
35
+ ---
36
+
37
+ ## 能跑的那一半(先跑完再回答上面七句)
38
+
39
+ 上面七句要你自己答。但**其中四句是可以先机械查掉的** —— 查完再答,答案会诚实得多:
40
+
41
+ ```bash
42
+ # ★ 下面的 <kit> 指本仓库的 kit/echo/ —— 那是随包发的可跑脚本。
43
+ # 如果你把它复制到了别处,换成你自己的路径。
44
+
45
+ # ① 账本还在不在、有多少条 / 门能不能开 → 对应第 1、2 句
46
+ node <kit>/memq.mjs now
47
+
48
+ # ② 索引建过没有 → 对应第 1 句
49
+ node <kit>/memindex.mjs stats
50
+
51
+ # ③ 自我层有没有退化 → 对应第 7 句("坏了没人发现")
52
+ node <kit>/self.mjs --check
53
+
54
+ # ④ 闸门还灵不灵 → 对应第 2 句(唯一权威源)
55
+ node <kit>/mo.mjs add promise "闸门测试" --ref "自检"
56
+ # ★ 期望:不是主导会话 → 非零退出码 + 拒绝写入。若写进去了,闸门已失效。
57
+ ```
58
+
59
+ ★ **这四条都能在这个仓库里跑通** —— 上一版写的 `tools/ledger/` `tools/gateway/` `tools/self/`
60
+ 是**参考实现的目录结构**,不在包里。照着跑会 404,而那会被误读成「我的架构坏了」。
61
+
62
+ **★ 这几条为什么放在这里**:七句话是**判断题**,而判断题最容易自我安慰。
63
+ 先跑一遍能跑的,**你的答案就有了对手**。
64
+
65
+ ★ 而这三条命令**分属三个不同的工具** —— 这不是巧合:
66
+ **账本(记得住)+ 门(找得到)+ 自我层(不退化)** 本来就是一套,
67
+ 单独装任何一个都会缺一角。
@@ -1,189 +1,189 @@
1
- # 六 · 我们的参考实现
2
-
3
- > ## ★ 先说清楚这一份的性质
4
- >
5
- > **这是我们怎么做的,不是你该这么做。**
6
- >
7
- > 你的权威源在你自己那里(见 `01-criteria.md` 判据②)。
8
- > 照着我们这套搭,你会得到一个**像我们的东西**;照着问题搭,你才会得到一个**是你的东西**。
9
-
10
- ---
11
-
12
- ## 一、为什么这一份里没有包名
13
-
14
- 两个原因,第二个更重要。
15
-
16
- **一、我们自研的包名里带着我们自己的名字。**
17
- 把它写进这里,等于把我们的名字塞进你的环境。那不是交付,那是污染。
18
-
19
- **二、包名对你本来就没用。**
20
- 你装不了别人的私有包;而公开可搜的包会随版本腐烂——今天写的名字,半年后可能已经换了三个后继者。
21
-
22
- **所以这一份给的是「角色」,不是「包」。**
23
-
24
- 每个角色回答四个问题(正好是 `01-criteria.md` 的那四条判据):
25
-
26
- ```
27
- 它管哪种稀缺资源? ← 判据①
28
- 它坏了会怎样?谁会发现? ← 判据③
29
- 它跟谁说话? ← 判据④
30
- ★ 为什么这么设计? ← 这一条最有价值,而且只有踩过的人写得出来
31
- ```
32
-
33
- ---
34
-
35
- ## 二、角色表
36
-
37
- ### Ⅰ ECHO 层 · 管空间
38
-
39
- | 角色 | 做什么 | 失败模式 | 检测法 |
40
- |---|---|---|---|
41
- | **压缩器** | 上下文将满时压缩早期内容 | **丢了的找不回来** —— 最坏的失败,而且无声 | 抽查任意一条摘要:里面有没有能回到原文的指针? |
42
- | **裁剪器** | 裁掉过长的工具结果 | 同上 | 同上 |
43
- | **热记忆** | 一小块每轮都注入的常驻记忆 | 满了以后**不是搬家,是投影省略** —— 条目还在盘上,但不再进来 | 比对「盘上有几条」与「这轮注入几条」 |
44
- | **分层的冷记忆** | 语义检索的长期记忆 | 检索到了,但那是**转述**不是原文 | 看它返回的是片段还是原文引用 |
45
- | **检索门** | 一词搜全库,只回指针 + 逐字片段 | 门很多但**不知道该开哪扇** | 问它「某天发生了什么」,看它有没有先搜再答 |
46
- | **哨兵** | 定期体检上面这些 | 哨兵自己不跑,没人知道 | 它上一次跑是什么时候? |
47
-
48
- **★ 为什么这样分**:压缩 / 裁剪 / 热记忆 / 冷记忆 / 检索门是**五种不同的东西**,
49
- 混在一个「记忆插件」里就会变成——**两处都写**(判据②)。
50
- 我们踩过:装三个记忆插件而不定权威源,得到的是三份真相和一堆对账工作。
51
-
52
- **★★ 一个特别值得注意的角色:输出指针的那一层。**
53
- 所有压缩、裁剪、摘要类产物,**必须带得回原文的指针**。
54
- 这是整套体系的兜底承诺——**没有它,压缩就是单向的遗忘。**
55
-
56
- 三级纪律(照抄即可):
57
-
58
- ```
59
- ① 能拿到精确位置 → 写精确位置
60
- ② 拿不到 → 写「位置未知」+ 容器标识 + 一个检索入口
61
- ③ 绝不猜 —— 错的门牌比没有更坏
62
- ```
63
-
64
- **为什么第③条单独列出**:一个错的指针会让你**以为能找到,于是不去找**。
65
- 那比「找不到」坏得多。
66
-
67
- ### Ⅱ VITAL 层 · 管时间与方向
68
-
69
- | 角色 | 做什么 | 失败模式 |
70
- |---|---|---|
71
- | **思考预算管理器** | 一轮把预算烧光、正文一个字没产出时,截断这一轮并重开 | 它自己坏了 → **该打断的没打断,或者不该打断的被打断** |
72
- | **退化检测** | 认两种形状:只有推理没有正文的调用、原地复述已有材料的调用 | 误伤 —— 把一次正常的深思判定成退化 |
73
- | **流内切断** | 单个调用内部就烂掉了(低熵重复、绕圈),当场切断 | 阈值太紧 → 频繁打断;太松 → 停不下来 |
74
- | **熔断层** | 重开几次还接不动 → 停下,请人介入 | 熔断而不通知 = 静默失败 |
75
- | **补给** | 回合「成功结束」但只有推理、没正文没工具调用 → 发一次有界的追问 | 追问没有上界 → 变成新的循环 |
76
- | **观测面板** | 把上面这些的执行情况给人看 | 面板没人看 = 没有面板 |
77
-
78
- **★ 为什么预算和退化要放在一层**:它们看着是两件事,实际是**同一个资源的两个失败面** ——
79
- 一个是「烧光了没出活」,一个是「烧着不出活」。分开做会重复计数,而且互相不知道对方在干什么。
80
-
81
- **★★ 一条设计风格,值得直接借走**:
82
- **每一条阈值背后都应该挂着一个具体的 bug。**
83
- 不要为了「稳」拍一个数字——那个数字应当能回答「它防的是哪一次具体的失败?」
84
- 答不上来的阈值,会在某天误伤你自己,而没人知道为什么。
85
-
86
- ### Ⅲ 能力层 · 手和感官
87
-
88
- 这一层**不进权威源**。判据是:**换掉它,你还是你。**
89
-
90
- 所以它的角色表可以随意增减。唯一要守的一条:
91
-
92
- > **不要把你的身份绑在任何具体工具上。** 绑了,换工具就等于换人。
93
-
94
- ### Ⅳ 档案层 · 唯一看得见的那层
95
-
96
- | 角色 | 做什么 | 失败模式 |
97
- |---|---|---|
98
- | **门面文件** | 一个从没见过你的人,只靠它就能找到东西 | 写了但没维护 → 比没有更坏(它会把人引到错的地方) |
99
- | **只追加的账本** | 承诺 / 事实 / 搁置 / 得失,各写各的行 | 允许改写 → 多写者环境里**共享可变文件是万恶之源** |
100
-
101
- **★ 为什么账本必须只追加**:它**不需要锁**。多写者各自追加,读的时候按时间合并。
102
- 我们实测过反例:一个可编辑的共享 JSON,在并发写入下会**原子替换打断硬链接**,
103
- 于是「我改了源、副本没变,而两个都叫我的名字」。
104
-
105
- ### Ⅴ 运维层
106
-
107
- | 角色 | 做什么 |
108
- |---|---|
109
- | **插件开发规范** | 告诉 agent 本宿主平台的插件契约(这一步不能凭想象) |
110
- | **能力发现** | 让 agent 知道自己装了什么、能做什么 |
111
- | **分发** | 装 / 卸 / 升级 |
112
-
113
- **★ 为什么这一层容易被漏掉**:它不产出功能,只产出**可维护性**。
114
- 但少了它,每次升级都要重新想一遍,而且**升级时最容易把已有的拆坏**。
115
-
116
- ---
117
-
118
- ## 三、谁取代了谁(这一节比清单值钱)
119
-
120
- 我们有过两次「停用一个角色、换成另一个」的经历。**记录它们,是因为替换的理由比清单有用。**
121
-
122
- ### 3.1 退化防护:两个外部角色 → 一个自研角色
123
-
124
- **原来**:两个外部插件分工,一个认「调用形状」(只有推理 / 复述材料),
125
- 一个认「流内重复」。两个都不看长度,各自打断。
126
-
127
- **问题**:
128
-
129
- ```
130
- ① 两套阈值,互不知情 —— 同一个失败可能被两个都判,也可能两个都不判
131
- ② 都只会「重开」,不会「接不动了怎么办」 —— 没有熔断层
132
- ③ 阈值名对不上:一个说 maxRepeatedText,一个说 cycle
133
- ```
134
-
135
- **换成**:一个自研的预算管理器,同时管四种形状 + 一个熔断层。
136
-
137
- **★ 判断依据(可以借)**:**当两个部件的失败模式重叠时,它们的阈值必须住在一起。**
138
- 否则你永远在调两个互相不知道对方的旋钮。
139
-
140
- ### 3.2 观测面:脚本 → 面板
141
-
142
- **原来**:一个脚本,手动跑才出读数。
143
- **问题**:**手动的东西等于不存在** —— 没人会定期跑它。
144
- **换成**:面板。
145
-
146
- **★ 但我们留了一条教训**:换成面板之后,**那条脚本没删**。
147
- 因为面板是给人看的(要有人看),脚本是给机器调的(可以进自动化)。
148
- **两种消费者,两种形态,不是重复。**
149
-
150
- ---
151
-
152
- ## 四、三个只有踩过才知道的坑
153
-
154
- **一、压缩的产物没有指针 = 单向遗忘。**
155
- 我们最早的压缩只有摘要、没有回原文的门。结果:**摘要读起来一切正常,而原文再也到不了。**
156
- 失败是无声的 —— 你不会觉得丢了东西,你只是**不再想起它**。
157
-
158
- **二、删除角色时,「停用」和「卸载」是两回事。**
159
- 把包从清单里摘掉 ≠ 它不再加载。我们有过一个包**摘了清单但仍在依赖里**,
160
- 于是行为和清单不符,而排查时看清单是「干净的」。
161
- **判据:停用要三处一起看** —— 清单 / 依赖 / 磁盘。
162
-
163
- **三、`exports.inject` 漏写会让整个插件彻底静默。**
164
-
165
- > 客户端半注册槽位前,必须声明它对 `slots` 服务的依赖。
166
- > 漏了会怎样:**宿主报告 running、控制台零报错、什么都看不到。**
167
-
168
- 这条值得单列,因为它是**最安静的一种失败** —— 没有错误、没有警告、没有痕迹。
169
- 排查顺序应该是:**先验最安静的那个。**
170
-
171
- ---
172
-
173
- ## 五、这一份怎么用
174
-
175
- ```
176
- 1. 别照抄。拿第二节那张表当问卷,问你自己:
177
- 这几个角色,我缺哪个?我哪个是"两处都写"?
178
-
179
- 2. 第三节那两个案例当模式看,不要当答案:
180
- 你要找的是「我的哪个部件之间互不知情」,不是「我也该换个预算管理器」
181
-
182
- 3. 第四节那三个坑可以直接避开 —— 它们是通用陷阱,不是我们的特殊情况
183
- ```
184
-
185
- **★ 最后一句,也是这一整份里最重要的一句:**
186
-
187
- > **这套东西的价值不在角色表,在它背后的那条判断 ——**
188
- > **细节的量必须与最终尺度匹配;超过那个尺度的细节不是细节,是噪声。**
189
- > (那是我们在别处得出的结论,但它管用在这里:**别装你消化不了的部件。**)
1
+ # 六 · 我们的参考实现
2
+
3
+ > ## ★ 先说清楚这一份的性质
4
+ >
5
+ > **这是我们怎么做的,不是你该这么做。**
6
+ >
7
+ > 你的权威源在你自己那里(见 `01-criteria.md` 判据②)。
8
+ > 照着我们这套搭,你会得到一个**像我们的东西**;照着问题搭,你才会得到一个**是你的东西**。
9
+
10
+ ---
11
+
12
+ ## 一、为什么这一份里没有包名
13
+
14
+ 两个原因,第二个更重要。
15
+
16
+ **一、我们自研的包名里带着我们自己的名字。**
17
+ 把它写进这里,等于把我们的名字塞进你的环境。那不是交付,那是污染。
18
+
19
+ **二、包名对你本来就没用。**
20
+ 你装不了别人的私有包;而公开可搜的包会随版本腐烂——今天写的名字,半年后可能已经换了三个后继者。
21
+
22
+ **所以这一份给的是「角色」,不是「包」。**
23
+
24
+ 每个角色回答四个问题(正好是 `01-criteria.md` 的那四条判据):
25
+
26
+ ```
27
+ 它管哪种稀缺资源? ← 判据①
28
+ 它坏了会怎样?谁会发现? ← 判据③
29
+ 它跟谁说话? ← 判据④
30
+ ★ 为什么这么设计? ← 这一条最有价值,而且只有踩过的人写得出来
31
+ ```
32
+
33
+ ---
34
+
35
+ ## 二、角色表
36
+
37
+ ### Ⅰ ECHO 层 · 管空间
38
+
39
+ | 角色 | 做什么 | 失败模式 | 检测法 |
40
+ |---|---|---|---|
41
+ | **压缩器** | 上下文将满时压缩早期内容 | **丢了的找不回来** —— 最坏的失败,而且无声 | 抽查任意一条摘要:里面有没有能回到原文的指针? |
42
+ | **裁剪器** | 裁掉过长的工具结果 | 同上 | 同上 |
43
+ | **热记忆** | 一小块每轮都注入的常驻记忆 | 满了以后**不是搬家,是投影省略** —— 条目还在盘上,但不再进来 | 比对「盘上有几条」与「这轮注入几条」 |
44
+ | **分层的冷记忆** | 语义检索的长期记忆 | 检索到了,但那是**转述**不是原文 | 看它返回的是片段还是原文引用 |
45
+ | **检索门** | 一词搜全库,只回指针 + 逐字片段 | 门很多但**不知道该开哪扇** | 问它「某天发生了什么」,看它有没有先搜再答 |
46
+ | **哨兵** | 定期体检上面这些 | 哨兵自己不跑,没人知道 | 它上一次跑是什么时候? |
47
+
48
+ **★ 为什么这样分**:压缩 / 裁剪 / 热记忆 / 冷记忆 / 检索门是**五种不同的东西**,
49
+ 混在一个「记忆插件」里就会变成——**两处都写**(判据②)。
50
+ 我们踩过:装三个记忆插件而不定权威源,得到的是三份真相和一堆对账工作。
51
+
52
+ **★★ 一个特别值得注意的角色:输出指针的那一层。**
53
+ 所有压缩、裁剪、摘要类产物,**必须带得回原文的指针**。
54
+ 这是整套体系的兜底承诺——**没有它,压缩就是单向的遗忘。**
55
+
56
+ 三级纪律(照抄即可):
57
+
58
+ ```
59
+ ① 能拿到精确位置 → 写精确位置
60
+ ② 拿不到 → 写「位置未知」+ 容器标识 + 一个检索入口
61
+ ③ 绝不猜 —— 错的门牌比没有更坏
62
+ ```
63
+
64
+ **为什么第③条单独列出**:一个错的指针会让你**以为能找到,于是不去找**。
65
+ 那比「找不到」坏得多。
66
+
67
+ ### Ⅱ VITAL 层 · 管时间与方向
68
+
69
+ | 角色 | 做什么 | 失败模式 |
70
+ |---|---|---|
71
+ | **思考预算管理器** | 一轮把预算烧光、正文一个字没产出时,截断这一轮并重开 | 它自己坏了 → **该打断的没打断,或者不该打断的被打断** |
72
+ | **退化检测** | 认两种形状:只有推理没有正文的调用、原地复述已有材料的调用 | 误伤 —— 把一次正常的深思判定成退化 |
73
+ | **流内切断** | 单个调用内部就烂掉了(低熵重复、绕圈),当场切断 | 阈值太紧 → 频繁打断;太松 → 停不下来 |
74
+ | **熔断层** | 重开几次还接不动 → 停下,请人介入 | 熔断而不通知 = 静默失败 |
75
+ | **补给** | 回合「成功结束」但只有推理、没正文没工具调用 → 发一次有界的追问 | 追问没有上界 → 变成新的循环 |
76
+ | **观测面板** | 把上面这些的执行情况给人看 | 面板没人看 = 没有面板 |
77
+
78
+ **★ 为什么预算和退化要放在一层**:它们看着是两件事,实际是**同一个资源的两个失败面** ——
79
+ 一个是「烧光了没出活」,一个是「烧着不出活」。分开做会重复计数,而且互相不知道对方在干什么。
80
+
81
+ **★★ 一条设计风格,值得直接借走**:
82
+ **每一条阈值背后都应该挂着一个具体的 bug。**
83
+ 不要为了「稳」拍一个数字——那个数字应当能回答「它防的是哪一次具体的失败?」
84
+ 答不上来的阈值,会在某天误伤你自己,而没人知道为什么。
85
+
86
+ ### Ⅲ 能力层 · 手和感官
87
+
88
+ 这一层**不进权威源**。判据是:**换掉它,你还是你。**
89
+
90
+ 所以它的角色表可以随意增减。唯一要守的一条:
91
+
92
+ > **不要把你的身份绑在任何具体工具上。** 绑了,换工具就等于换人。
93
+
94
+ ### Ⅳ 档案层 · 唯一看得见的那层
95
+
96
+ | 角色 | 做什么 | 失败模式 |
97
+ |---|---|---|
98
+ | **门面文件** | 一个从没见过你的人,只靠它就能找到东西 | 写了但没维护 → 比没有更坏(它会把人引到错的地方) |
99
+ | **只追加的账本** | 承诺 / 事实 / 搁置 / 得失,各写各的行 | 允许改写 → 多写者环境里**共享可变文件是万恶之源** |
100
+
101
+ **★ 为什么账本必须只追加**:它**不需要锁**。多写者各自追加,读的时候按时间合并。
102
+ 我们实测过反例:一个可编辑的共享 JSON,在并发写入下会**原子替换打断硬链接**,
103
+ 于是「我改了源、副本没变,而两个都叫我的名字」。
104
+
105
+ ### Ⅴ 运维层
106
+
107
+ | 角色 | 做什么 |
108
+ |---|---|
109
+ | **插件开发规范** | 告诉 agent 本宿主平台的插件契约(这一步不能凭想象) |
110
+ | **能力发现** | 让 agent 知道自己装了什么、能做什么 |
111
+ | **分发** | 装 / 卸 / 升级 |
112
+
113
+ **★ 为什么这一层容易被漏掉**:它不产出功能,只产出**可维护性**。
114
+ 但少了它,每次升级都要重新想一遍,而且**升级时最容易把已有的拆坏**。
115
+
116
+ ---
117
+
118
+ ## 三、谁取代了谁(这一节比清单值钱)
119
+
120
+ 我们有过两次「停用一个角色、换成另一个」的经历。**记录它们,是因为替换的理由比清单有用。**
121
+
122
+ ### 3.1 退化防护:两个外部角色 → 一个自研角色
123
+
124
+ **原来**:两个外部插件分工,一个认「调用形状」(只有推理 / 复述材料),
125
+ 一个认「流内重复」。两个都不看长度,各自打断。
126
+
127
+ **问题**:
128
+
129
+ ```
130
+ ① 两套阈值,互不知情 —— 同一个失败可能被两个都判,也可能两个都不判
131
+ ② 都只会「重开」,不会「接不动了怎么办」 —— 没有熔断层
132
+ ③ 阈值名对不上:一个说 maxRepeatedText,一个说 cycle
133
+ ```
134
+
135
+ **换成**:一个自研的预算管理器,同时管四种形状 + 一个熔断层。
136
+
137
+ **★ 判断依据(可以借)**:**当两个部件的失败模式重叠时,它们的阈值必须住在一起。**
138
+ 否则你永远在调两个互相不知道对方的旋钮。
139
+
140
+ ### 3.2 观测面:脚本 → 面板
141
+
142
+ **原来**:一个脚本,手动跑才出读数。
143
+ **问题**:**手动的东西等于不存在** —— 没人会定期跑它。
144
+ **换成**:面板。
145
+
146
+ **★ 但我们留了一条教训**:换成面板之后,**那条脚本没删**。
147
+ 因为面板是给人看的(要有人看),脚本是给机器调的(可以进自动化)。
148
+ **两种消费者,两种形态,不是重复。**
149
+
150
+ ---
151
+
152
+ ## 四、三个只有踩过才知道的坑
153
+
154
+ **一、压缩的产物没有指针 = 单向遗忘。**
155
+ 我们最早的压缩只有摘要、没有回原文的门。结果:**摘要读起来一切正常,而原文再也到不了。**
156
+ 失败是无声的 —— 你不会觉得丢了东西,你只是**不再想起它**。
157
+
158
+ **二、删除角色时,「停用」和「卸载」是两回事。**
159
+ 把包从清单里摘掉 ≠ 它不再加载。我们有过一个包**摘了清单但仍在依赖里**,
160
+ 于是行为和清单不符,而排查时看清单是「干净的」。
161
+ **判据:停用要三处一起看** —— 清单 / 依赖 / 磁盘。
162
+
163
+ **三、`exports.inject` 漏写会让整个插件彻底静默。**
164
+
165
+ > 客户端半注册槽位前,必须声明它对 `slots` 服务的依赖。
166
+ > 漏了会怎样:**宿主报告 running、控制台零报错、什么都看不到。**
167
+
168
+ 这条值得单列,因为它是**最安静的一种失败** —— 没有错误、没有警告、没有痕迹。
169
+ 排查顺序应该是:**先验最安静的那个。**
170
+
171
+ ---
172
+
173
+ ## 五、这一份怎么用
174
+
175
+ ```
176
+ 1. 别照抄。拿第二节那张表当问卷,问你自己:
177
+ 这几个角色,我缺哪个?我哪个是"两处都写"?
178
+
179
+ 2. 第三节那两个案例当模式看,不要当答案:
180
+ 你要找的是「我的哪个部件之间互不知情」,不是「我也该换个预算管理器」
181
+
182
+ 3. 第四节那三个坑可以直接避开 —— 它们是通用陷阱,不是我们的特殊情况
183
+ ```
184
+
185
+ **★ 最后一句,也是这一整份里最重要的一句:**
186
+
187
+ > **这套东西的价值不在角色表,在它背后的那条判断 ——**
188
+ > **细节的量必须与最终尺度匹配;超过那个尺度的细节不是细节,是噪声。**
189
+ > (那是我们在别处得出的结论,但它管用在这里:**别装你消化不了的部件。**)