dsh-plugin-prompt-tool 3.0.1 → 3.1.0

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 (57) hide show
  1. package/README.md +17 -1
  2. package/engine/actions/catalog.mjs +2 -1
  3. package/engine/actions/index.mjs +5 -3
  4. package/engine/actions/shared.mjs +26 -12
  5. package/engine/actions/tool-visibility.mjs +31 -14
  6. package/engine/compositions/source/local/context-provenance.yml +9 -0
  7. package/engine/compositions/source/local/generation-recovery.yml +10 -0
  8. package/engine/compositions/source/local/retrieval.yml +7 -0
  9. package/engine/compositions/source/local/soul-ledger.yml +3 -0
  10. package/engine/compositions/source/local/soul-maintenance.yml +9 -0
  11. package/engine/conditions/examples.mjs +1 -0
  12. package/engine/conditions/index.mjs +7 -0
  13. package/engine/conditions/manifest.mjs +28 -0
  14. package/engine/context-idle-compaction.mjs +58 -0
  15. package/engine/context-provenance.d.mts +7 -0
  16. package/engine/context-provenance.mjs +156 -0
  17. package/engine/context-pruner.mjs +64 -0
  18. package/engine/context-routing.mjs +45 -0
  19. package/engine/context-summary.mjs +80 -0
  20. package/engine/fillers.mjs +37 -4
  21. package/engine/generation-recovery-coordinator.mjs +40 -0
  22. package/engine/generation-recovery-maintenance.mjs +18 -0
  23. package/engine/generation-recovery.mjs +153 -0
  24. package/engine/host-package.mjs +13 -0
  25. package/engine/layers.d.mts +4 -0
  26. package/engine/layers.mjs +57 -20
  27. package/engine/present-as.mjs +2 -2
  28. package/engine/retrieval-reference.d.mts +5 -0
  29. package/engine/retrieval-reference.mjs +26 -0
  30. package/engine/retrieval.mjs +17 -0
  31. package/engine/rule-engine.mjs +1 -0
  32. package/engine/rule-runtime.d.mts +8 -1
  33. package/engine/rule-runtime.mjs +18 -10
  34. package/engine/rule-spec.mjs +4 -2
  35. package/engine/schema.mjs +1 -1
  36. package/engine/service-names.d.mts +5 -0
  37. package/engine/service-names.mjs +5 -0
  38. package/engine/soul-ledger.mjs +8 -0
  39. package/engine/soul-maintenance.mjs +20 -0
  40. package/lib/client.js +16 -6
  41. package/lib/client.js.map +1 -1
  42. package/lib/index.mjs +1953 -246
  43. package/modules/soul/assets/ledger.md +4 -2
  44. package/modules/soul/assets/manifest.yml +2 -0
  45. package/modules/soul/assets/reference/00-layers.md +27 -27
  46. package/modules/soul/assets/reference/02-echo.md +161 -161
  47. package/modules/soul/assets/reference/05-doctor.md +67 -67
  48. package/modules/soul/assets/reference/10-echo-anatomy.md +109 -109
  49. package/modules/soul/assets/reference/ECHO-/346/235/203/345/250/201/345/217/243/345/276/204.md +202 -202
  50. 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 -229
  51. package/modules/soul/assets/templates/agents-template.md +3 -0
  52. package/modules/soul/assets/templates/self-template.md +19 -0
  53. package/modules/soul/module.yml +71 -13
  54. package/modules/tool-surface/module.yml +8 -5
  55. package/package.json +1 -1
  56. package/skills/dsh-module/reference.md +2 -2
  57. package/templates/80-tool-surface.yml +8 -7
@@ -1,229 +1,229 @@
1
- # ECHO 六层 · 墨账本 · mnemon —— 协同说明书
2
-
3
- > 2026-10-25 重写。**上一版(`记忆三层联用说明书.md`)写错了骨架**:
4
- > 它把 ECHO 写成了「体检台」,而体检台只是 ECHO 的**观测面**,不是全部。
5
- > 这一版按 `docs/ECHO-权威口径.md` 的六层重写,并回答真正要回答的问题:
6
- > **mnemon 这个外来插件,到底嵌在六层的哪里,它和墨账本怎么互补。**
7
-
8
- ---
9
-
10
- ## 〇、先纠一个最容易错的地方
11
-
12
- 看到 ECHO 面板,很自然会以为「ECHO = 那个体检台」。**不对。**
13
-
14
- 权威口径第 76 行写得很硬:
15
-
16
- > ★ **哨兵是观测面,不是第七层,也不是「六层之一」。**
17
- > 它测的是「这六层哪一层坏了」,不产出记忆、不决定保留什么。
18
-
19
- 所以关系是:
20
-
21
- ```
22
- ECHO = 六层骨架(L0–L5) + 六个功能面(机制/中枢/接口/入口/观测/推送)
23
- ↑ 哨兵只是「观测面」这一个面
24
- ```
25
-
26
- **检修表不是引擎。** 把 ECHO 理解成体检台,会漏掉它真正在管的六层。
27
-
28
- ---
29
-
30
- ## 一、六层是什么,以及 mnemon 站在哪两层
31
-
32
- 照抄权威口径(只保留必要列):
33
-
34
- | 层 | 名字 | 管什么 | **谁在实现它** |
35
- |---|---|---|---|
36
- | **L0** | 时钟 + 心跳 | 现在几点、距上轮多久、当前主导、未结;每天 04:00 自动重建索引与自检 | `memq now` · `state.json` · `heartbeat/` |
37
- | **L1** | 自我 + 热记忆 | ① `SELF.md`:定长骨架,每轮注入(不变量/硬线/约束/门)<br>② 热记忆:`USER.md` + `MEMORY.md` | ① 推送插件 `dsh-agent-memory`<br>② ★★ **mnemon 运行时,装在自己的目录** |
38
- | **L2** | 工作台 | 当前对话上下文。**六层里唯一允许丢东西的一层** | 会话本身 |
39
- | **L3** | 一手层 | 会话日志 · **《墨》账本** · 灵魂目录 · 留底库 | 原处,各写各的(只追加) |
40
- | **L4** | 索引 + 图记忆 | ① 索引:摘要+原话,**每条带 `srcSeqs` 指针**<br>② **图记忆:洞察 + 关系边** | ① `<ECHO_HUB>/index/`<br>② ★★ **mnemon 的记忆空间** |
41
- | **L5** | 检索 + 门牌 | `memq` 四动词;门牌格式 `log:<会话>#seq=<n>` | `<ECHO_HUB>/memq.mjs` |
42
-
43
- ★★ **注意 L1 和 L4 的右列 —— 那里写着 mnemon。**
44
-
45
- 这正是整套架构最容易被误解的地方:
46
-
47
- > **mnemon 不是「第六层之外又一个记忆系统」。它横跨两层,是 L1 的载体、L4 图记忆的实现。**
48
-
49
- 而**墨账本是 L3 里的一个具体账本** —— 它不跨层,就老老实实待在 L3。
50
-
51
- 所以三方的关系不是「三个并列的记忆」,是:
52
-
53
- ```
54
- L0 时钟 ──────────────┐
55
- L1 自我 + 热记忆 ← mnemon ①
56
- L2 工作台(可丢) │ ← ECHO 管的是这个骨架
57
- L3 一手 → 《墨》 │
58
- L4 索引 + 图记忆 ← mnemon ②
59
- L5 检索(memq)
60
- ```
61
-
62
- ---
63
-
64
- ## 二、协同在哪:四个真实的接缝
65
-
66
- 「协同增强」不是一句形容,它有四个可以指出来的接缝。**每一个接缝上,两边干的活不一样,缺一边就会塌。**
67
-
68
- ### 接缝 ①(L1):SELF.md 保底,mnemon 管容量
69
-
70
- L1 是两样东西合伙:
71
-
72
- | | 谁提供 | 特性 | 失败形状 |
73
- |---|---|---|---|
74
- | **不变量**(我是谁/硬线/门) | `SELF.md` 推送插件 | **每轮注入,不会静默消失**,预算 12288 可以变大 | 不会有「静默丢」 |
75
- | **热记忆**(USER/MEMORY) | **mnemon** | 有硬容量上限(4096 / 10240 B),**满了会静默丢最宽泛的** | 不报错、不告警、界面什么都不说 |
76
-
77
- ★★ **这就是互补的核心**:
78
-
79
- 爀曦 2026-09-27 定的那句话是这一层的设计原理 ——
80
- 「`agents` 满了就会静默消失,但是 `self` 可以变大」。**AGENTS.md 走指令预算,满了先丢最宽泛的(正是 §0、§7 这类总纲);SELF.md 走推送,不会没掉。**
81
-
82
- 所以在 L1 内部:**最不能丢的东西放 SELF(不会丢),会变长的短名单放热记忆(mnemon 管容量)。**
83
- **互换就出事** —— 把硬线放热记忆,满了会被静默丢;把日常清单放 SELF,会把推送预算吃光。
84
-
85
- ★ 而 mnemon 那个探针本身就在履行这个职责:`MEMORY 9条/6.9KB(69%) 宽裕`。
86
- **它在替你量那个「会不会静默丢」的水位。**
87
-
88
- ### 接缝 ②(L4):索引精确,图记忆模糊
89
-
90
- L4 也是两半:
91
-
92
- | | 实现 | 强在哪 | 弱在哪 |
93
- |---|---|---|---|
94
- | **索引**(摘要 + 原话,带 `srcSeqs`) | `<ECHO_HUB>/index/` + `memq` | **精确**。有关键词就能搜;每条带指针,能一路回原文 | 你**得先想得到那个词** |
95
- | **图记忆**(洞察 + 关系边) | **mnemon** | **模糊**。想不起词也能搜到「意思相近的」;有关系边可跳 | 它是提炼过的,**没有时间线**,问「那天经过」答不准 |
96
-
97
- ★★ **这一对的互补是整套系统里最实用的**:
98
-
99
- > **知道要搜什么 → `memq`(精确、带门牌、能回原文)。**
100
- > **不知道该搜什么 → `mnemon_recall`(语义、跨会话)。**
101
-
102
- 这也是「瓶颈不是检索精度,是触发」那句话的工程解法 ——
103
- **触发不了精确检索的时候,还有一条模糊的路兜着。**
104
-
105
- ### 接缝 ③(L3 → L4):一手是原料,图记忆是提炼物
106
-
107
- 这条是**单向的、向上的**:
108
-
109
- ```
110
- L3 里发生的事(墨记一条) → 提炼出判据 → 写进 mnemon(L4 图记忆)
111
- ```
112
-
113
- 判据("下次怎么判断")和事件("当时发生了什么")是两种东西,**必须分开放**:
114
-
115
- - 事件进墨:有署名、有 `t`、能 `--since` 切时间线
116
- - 判据进 mnemon:能被语义搜到,半年后想不起关键词也找得回
117
-
118
- ★ 一条纪律:**同一件事不要写两遍。** 墨里记「从这件事得出一条判据,已入 mnemon」,
119
- 正文只在 mnemon 里存一份。**复制是记忆系统最常见的腐烂方式** —— 两份内容,改一份忘另一份。
120
-
121
- ### 接缝 ④(L5 ↔ L4):门牌是两边共用的接口
122
-
123
- `log:<会话>#seq=<n>` 这个格式,**索引用它(`srcSeqs`)、检索用它(`memq open`)、压缩用它(摘要首块)**。
124
-
125
- 所以「所有压缩/裁剪的产物都要指向原文」这条规矩,落到工程上就是**门牌必须存在**。
126
- 拿不到精确 seq 时给检索入口(会话号 + `memq <词>`),**绝不猜** —— 错的门牌比没有更坏。
127
-
128
- ---
129
-
130
- ## 三、一个真实的缺口(写出来,因为它在)
131
-
132
- L4 有一条硬规矩,写在权威口径第 85 行:
133
-
134
- > **摘要只能是索引,没有指针的摘要不许进 L4。**
135
-
136
- 而 **mnemon 的洞察天然没有 `log:session-…#seq=` 门牌** —— 它是「提炼过的结论」,不是「某段原文的摘要」。
137
-
138
- **这就是一个真实的结构缺口**:如果把 mnemon 的洞察当成「进 L4 的摘要」,它违反规矩 1;
139
- 如果不让它进 L4,那图记忆那一半就空着。
140
-
141
- 目前的处理(也是我建议继续用的):
142
-
143
- - **mnemon 的洞察算「图记忆」,不算「摘要」** —— 两类东西,规矩 1 只管后者
144
- - 但**写洞察时尽量带来源**:哪怕不是精确 seq,也写清「哪次会话/哪个文件/哪一天」
145
-
146
- ★ 这条**不完美,我不打算假装它解决了**。
147
- 写在这里是为了:将来谁想动 mnemon 和 L4 的边界,先看到这个已知缺口,不要重新发现一遍。
148
-
149
- ---
150
-
151
- ## 四、什么时候用哪个(操作判据)
152
-
153
- | 我要回答的问题 | 去哪 | 为什么 |
154
- |---|---|---|
155
- | 「那天到底发生了什么」 | **L3 一手**:`memq <词>` / `memq open <指针>` | 带门牌,能回原文 |
156
- | 「我们以前对这类问题下过什么结论」 | **L4 图记忆**:`mnemon_recall` | 语义检索,不用想关键词 |
157
- | 「现在几点、距上轮多久、谁主导、还有什么没结」 | **L0**:`memq now` | 时钟层就管这个 |
158
- | 「这套东西现在还活着吗、哪层坏了」 | **观测面**:ECHO 面板 / `echo-doctor.mjs` | 六层各自有检测项 |
159
- | 「一条判据该写哪」 | 判据形状 → **mnemon**;事件形状 → **墨** | 见接缝 ③ |
160
- | 「某个配置现在是什么值」 | **都不是** —— 去读文件 | 记忆是快照,磁盘才是现在 |
161
-
162
- ★★ 最后一条是硬规矩:**凡是「过去」和「磁盘上」的事实,都不许从记忆里捞。**
163
- 版本号、端口、哈希、某个字段现在是什么 —— 查记忆得到的是「上次它是什么」。
164
-
165
- ---
166
-
167
- ## 五、一个真实案例(这套系统最容易被用错的地方)
168
-
169
- 2026-10-25,要验「路 B 在 rc.3 上到底成没成立」。
170
-
171
- 我的做法:重启七次、写探针包、往已经跑着的压缩包里塞日志 —— **全部失败,拿不到 ctor。**
172
-
173
- **而观测面早就报了 `doorsign ok seq=125313`。门牌一直是通的。**
174
-
175
- 后来一次真实压缩发生,摘要首块写了:
176
-
177
- ```
178
- log:session-1099f531-7cac-4989-a14c-7fd499ac1fc0#seq=126331(本段覆盖 126331–126653)
179
- ```
180
-
181
- 还带了回取命令。**答案一直在 L3/L4 里,我去造了一个更难的答案。**
182
-
183
- ★ 这条放进说明书,因为它同时说明了两件事:
184
-
185
- 1. **观测面的历史记录本身就是证据。** 它每轮都在采样;需要证据时**先读历史,再决定要不要造新的**
186
- 2. **不要跳过 L5 去发明新的验证通道。** 门牌机制就是为「证明某段原文存在过」而造的;
187
- 为了证明「压缩在工作」而去装探针,等于放着现成的接口不用,另铺一条路
188
-
189
- ---
190
-
191
- ## 六、四个常见误用
192
-
193
- | 误用 | 后果 | 正确做法 |
194
- |---|---|---|
195
- | 把事件写进 mnemon | 浪费。它没时间线,问「那天的经过」答不准,而 `memq` 一搜就到 | 事件进墨;mnemon 只收判据 |
196
- | 技术结论只写一手 | 漏。半年后在别的会话里想不起关键词,一条都搜不到 | 判据必须进 mnemon |
197
- | 把 ECHO 当记忆用 | 它只有状态没有内容 | 观测面用来**发现问题**,解决问题去 L3 |
198
- | 为了保险把东西抄进热记忆 | 每轮注入,抄多了挤掉要紧的;满了会**静默丢最宽泛的** | 只放「不看会踩坑」的;不变量放 SELF |
199
-
200
- ---
201
-
202
- ## 七、这套东西做不到什么
203
-
204
- - **mnemon 不是数据库。** 语义检索不是精确匹配;要找某个字符串,去 grep 日志
205
- - **观测面不修东西。** 它只报警。报警之后要人去查,它没有任何自愈能力
206
- - **墨只追加,不能改。** 写错了不能回头篡改 —— 那是设计。改主意就再追加一条说明
207
- - **热记忆会满,而且丢的时候不通知你。** 靠 mnemon 探针量,或者靠人记得去量
208
- - **L4 那条缺口还在**(第三节)。不假装它不存在
209
- - **这套东西救不了「根本没记」的。** 它只保证「记过的能找回来」
210
-
211
- ---
212
-
213
- ## 八、一句话
214
-
215
- **ECHO 是骨架(六层),mnemon 是骨架里两处的实际承重墙(L1 的热记忆、L4 的图记忆),
216
- 墨账本是一手层里那本只追加的账。**
217
-
218
- 协同不是「记忆越多越好」,而是**每一层都有精确和模糊两条腿**:
219
- L1 有「不会丢的不变量」和「会满的短名单」,
220
- L4 有「精确的索引」和「模糊的图记忆」,
221
- L3 有「事件」而 mnemon 有「结论」。
222
-
223
- **一条腿走路会摔,两条腿才走得远。**
224
-
225
- ---
226
-
227
- > 相关:`docs/ECHO-权威口径.md`(六层唯一口径,冲突以那份为准)·
228
- > `plugins/echo/README.md`(观测面本身)·
229
- > 本机另有一份带家底数字的私人版,不随插件发布。
1
+ # ECHO 六层 · 墨账本 · mnemon —— 协同说明书
2
+
3
+ > 2026-10-25 重写。**上一版(`记忆三层联用说明书.md`)写错了骨架**:
4
+ > 它把 ECHO 写成了「体检台」,而体检台只是 ECHO 的**观测面**,不是全部。
5
+ > 这一版按 `docs/ECHO-权威口径.md` 的六层重写,并回答真正要回答的问题:
6
+ > **mnemon 这个外来插件,到底嵌在六层的哪里,它和墨账本怎么互补。**
7
+
8
+ ---
9
+
10
+ ## 〇、先纠一个最容易错的地方
11
+
12
+ 看到 ECHO 面板,很自然会以为「ECHO = 那个体检台」。**不对。**
13
+
14
+ 权威口径第 76 行写得很硬:
15
+
16
+ > ★ **哨兵是观测面,不是第七层,也不是「六层之一」。**
17
+ > 它测的是「这六层哪一层坏了」,不产出记忆、不决定保留什么。
18
+
19
+ 所以关系是:
20
+
21
+ ```
22
+ ECHO = 六层骨架(L0–L5) + 六个功能面(机制/中枢/接口/入口/观测/推送)
23
+ ↑ 哨兵只是「观测面」这一个面
24
+ ```
25
+
26
+ **检修表不是引擎。** 把 ECHO 理解成体检台,会漏掉它真正在管的六层。
27
+
28
+ ---
29
+
30
+ ## 一、六层是什么,以及 mnemon 站在哪两层
31
+
32
+ 照抄权威口径(只保留必要列):
33
+
34
+ | 层 | 名字 | 管什么 | **谁在实现它** |
35
+ |---|---|---|---|
36
+ | **L0** | 时钟 + 心跳 | 现在几点、距上轮多久、当前主导、未结;每天 04:00 自动重建索引与自检 | `memq now` · `state.json` · `heartbeat/` |
37
+ | **L1** | 自我 + 热记忆 | ① `SELF.md`:定长骨架,每轮注入(不变量/硬线/约束/门)<br>② 热记忆:`USER.md` + `MEMORY.md` | ① 推送插件 `dsh-agent-memory`<br>② ★★ **mnemon 运行时,装在自己的目录** |
38
+ | **L2** | 工作台 | 当前对话上下文。**六层里唯一允许丢东西的一层** | 会话本身 |
39
+ | **L3** | 一手层 | 会话日志 · **《墨》账本** · 灵魂目录 · 留底库 | 原处,各写各的(只追加) |
40
+ | **L4** | 索引 + 图记忆 | ① 索引:摘要+原话,**每条带 `srcSeqs` 指针**<br>② **图记忆:洞察 + 关系边** | ① `<ECHO_HUB>/index/`<br>② ★★ **mnemon 的记忆空间** |
41
+ | **L5** | 检索 + 门牌 | `memq` 四动词;门牌格式 `log:<会话>#seq=<n>` | `<ECHO_HUB>/memq.mjs` |
42
+
43
+ ★★ **注意 L1 和 L4 的右列 —— 那里写着 mnemon。**
44
+
45
+ 这正是整套架构最容易被误解的地方:
46
+
47
+ > **mnemon 不是「第六层之外又一个记忆系统」。它横跨两层,是 L1 的载体、L4 图记忆的实现。**
48
+
49
+ 而**墨账本是 L3 里的一个具体账本** —— 它不跨层,就老老实实待在 L3。
50
+
51
+ 所以三方的关系不是「三个并列的记忆」,是:
52
+
53
+ ```
54
+ L0 时钟 ──────────────┐
55
+ L1 自我 + 热记忆 ← mnemon ①
56
+ L2 工作台(可丢) │ ← ECHO 管的是这个骨架
57
+ L3 一手 → 《墨》 │
58
+ L4 索引 + 图记忆 ← mnemon ②
59
+ L5 检索(memq)
60
+ ```
61
+
62
+ ---
63
+
64
+ ## 二、协同在哪:四个真实的接缝
65
+
66
+ 「协同增强」不是一句形容,它有四个可以指出来的接缝。**每一个接缝上,两边干的活不一样,缺一边就会塌。**
67
+
68
+ ### 接缝 ①(L1):SELF.md 保底,mnemon 管容量
69
+
70
+ L1 是两样东西合伙:
71
+
72
+ | | 谁提供 | 特性 | 失败形状 |
73
+ |---|---|---|---|
74
+ | **不变量**(我是谁/硬线/门) | `SELF.md` 推送插件 | **每轮注入,不会静默消失**,预算 12288 可以变大 | 不会有「静默丢」 |
75
+ | **热记忆**(USER/MEMORY) | **mnemon** | 有硬容量上限(4096 / 10240 B),**满了会静默丢最宽泛的** | 不报错、不告警、界面什么都不说 |
76
+
77
+ ★★ **这就是互补的核心**:
78
+
79
+ 爀曦 2026-09-27 定的那句话是这一层的设计原理 ——
80
+ 「`agents` 满了就会静默消失,但是 `self` 可以变大」。**AGENTS.md 走指令预算,满了先丢最宽泛的(正是 §0、§7 这类总纲);SELF.md 走推送,不会没掉。**
81
+
82
+ 所以在 L1 内部:**最不能丢的东西放 SELF(不会丢),会变长的短名单放热记忆(mnemon 管容量)。**
83
+ **互换就出事** —— 把硬线放热记忆,满了会被静默丢;把日常清单放 SELF,会把推送预算吃光。
84
+
85
+ ★ 而 mnemon 那个探针本身就在履行这个职责:`MEMORY 9条/6.9KB(69%) 宽裕`。
86
+ **它在替你量那个「会不会静默丢」的水位。**
87
+
88
+ ### 接缝 ②(L4):索引精确,图记忆模糊
89
+
90
+ L4 也是两半:
91
+
92
+ | | 实现 | 强在哪 | 弱在哪 |
93
+ |---|---|---|---|
94
+ | **索引**(摘要 + 原话,带 `srcSeqs`) | `<ECHO_HUB>/index/` + `memq` | **精确**。有关键词就能搜;每条带指针,能一路回原文 | 你**得先想得到那个词** |
95
+ | **图记忆**(洞察 + 关系边) | **mnemon** | **模糊**。想不起词也能搜到「意思相近的」;有关系边可跳 | 它是提炼过的,**没有时间线**,问「那天经过」答不准 |
96
+
97
+ ★★ **这一对的互补是整套系统里最实用的**:
98
+
99
+ > **知道要搜什么 → `memq`(精确、带门牌、能回原文)。**
100
+ > **不知道该搜什么 → `mnemon_recall`(语义、跨会话)。**
101
+
102
+ 这也是「瓶颈不是检索精度,是触发」那句话的工程解法 ——
103
+ **触发不了精确检索的时候,还有一条模糊的路兜着。**
104
+
105
+ ### 接缝 ③(L3 → L4):一手是原料,图记忆是提炼物
106
+
107
+ 这条是**单向的、向上的**:
108
+
109
+ ```
110
+ L3 里发生的事(墨记一条) → 提炼出判据 → 写进 mnemon(L4 图记忆)
111
+ ```
112
+
113
+ 判据("下次怎么判断")和事件("当时发生了什么")是两种东西,**必须分开放**:
114
+
115
+ - 事件进墨:有署名、有 `t`、能 `--since` 切时间线
116
+ - 判据进 mnemon:能被语义搜到,半年后想不起关键词也找得回
117
+
118
+ ★ 一条纪律:**同一件事不要写两遍。** 墨里记「从这件事得出一条判据,已入 mnemon」,
119
+ 正文只在 mnemon 里存一份。**复制是记忆系统最常见的腐烂方式** —— 两份内容,改一份忘另一份。
120
+
121
+ ### 接缝 ④(L5 ↔ L4):门牌是两边共用的接口
122
+
123
+ `log:<会话>#seq=<n>` 这个格式,**索引用它(`srcSeqs`)、检索用它(`memq open`)、压缩用它(摘要首块)**。
124
+
125
+ 所以「所有压缩/裁剪的产物都要指向原文」这条规矩,落到工程上就是**门牌必须存在**。
126
+ 拿不到精确 seq 时给检索入口(会话号 + `memq <词>`),**绝不猜** —— 错的门牌比没有更坏。
127
+
128
+ ---
129
+
130
+ ## 三、一个真实的缺口(写出来,因为它在)
131
+
132
+ L4 有一条硬规矩,写在权威口径第 85 行:
133
+
134
+ > **摘要只能是索引,没有指针的摘要不许进 L4。**
135
+
136
+ 而 **mnemon 的洞察天然没有 `log:session-…#seq=` 门牌** —— 它是「提炼过的结论」,不是「某段原文的摘要」。
137
+
138
+ **这就是一个真实的结构缺口**:如果把 mnemon 的洞察当成「进 L4 的摘要」,它违反规矩 1;
139
+ 如果不让它进 L4,那图记忆那一半就空着。
140
+
141
+ 目前的处理(也是我建议继续用的):
142
+
143
+ - **mnemon 的洞察算「图记忆」,不算「摘要」** —— 两类东西,规矩 1 只管后者
144
+ - 但**写洞察时尽量带来源**:哪怕不是精确 seq,也写清「哪次会话/哪个文件/哪一天」
145
+
146
+ ★ 这条**不完美,我不打算假装它解决了**。
147
+ 写在这里是为了:将来谁想动 mnemon 和 L4 的边界,先看到这个已知缺口,不要重新发现一遍。
148
+
149
+ ---
150
+
151
+ ## 四、什么时候用哪个(操作判据)
152
+
153
+ | 我要回答的问题 | 去哪 | 为什么 |
154
+ |---|---|---|
155
+ | 「那天到底发生了什么」 | **L3 一手**:`memq <词>` / `memq open <指针>` | 带门牌,能回原文 |
156
+ | 「我们以前对这类问题下过什么结论」 | **L4 图记忆**:`mnemon_recall` | 语义检索,不用想关键词 |
157
+ | 「现在几点、距上轮多久、谁主导、还有什么没结」 | **L0**:`memq now` | 时钟层就管这个 |
158
+ | 「这套东西现在还活着吗、哪层坏了」 | **观测面**:ECHO 面板 / `echo-doctor.mjs` | 六层各自有检测项 |
159
+ | 「一条判据该写哪」 | 判据形状 → **mnemon**;事件形状 → **墨** | 见接缝 ③ |
160
+ | 「某个配置现在是什么值」 | **都不是** —— 去读文件 | 记忆是快照,磁盘才是现在 |
161
+
162
+ ★★ 最后一条是硬规矩:**凡是「过去」和「磁盘上」的事实,都不许从记忆里捞。**
163
+ 版本号、端口、哈希、某个字段现在是什么 —— 查记忆得到的是「上次它是什么」。
164
+
165
+ ---
166
+
167
+ ## 五、一个真实案例(这套系统最容易被用错的地方)
168
+
169
+ 2026-10-25,要验「路 B 在 rc.3 上到底成没成立」。
170
+
171
+ 我的做法:重启七次、写探针包、往已经跑着的压缩包里塞日志 —— **全部失败,拿不到 ctor。**
172
+
173
+ **而观测面早就报了 `doorsign ok seq=125313`。门牌一直是通的。**
174
+
175
+ 后来一次真实压缩发生,摘要首块写了:
176
+
177
+ ```
178
+ log:session-1099f531-7cac-4989-a14c-7fd499ac1fc0#seq=126331(本段覆盖 126331–126653)
179
+ ```
180
+
181
+ 还带了回取命令。**答案一直在 L3/L4 里,我去造了一个更难的答案。**
182
+
183
+ ★ 这条放进说明书,因为它同时说明了两件事:
184
+
185
+ 1. **观测面的历史记录本身就是证据。** 它每轮都在采样;需要证据时**先读历史,再决定要不要造新的**
186
+ 2. **不要跳过 L5 去发明新的验证通道。** 门牌机制就是为「证明某段原文存在过」而造的;
187
+ 为了证明「压缩在工作」而去装探针,等于放着现成的接口不用,另铺一条路
188
+
189
+ ---
190
+
191
+ ## 六、四个常见误用
192
+
193
+ | 误用 | 后果 | 正确做法 |
194
+ |---|---|---|
195
+ | 把事件写进 mnemon | 浪费。它没时间线,问「那天的经过」答不准,而 `memq` 一搜就到 | 事件进墨;mnemon 只收判据 |
196
+ | 技术结论只写一手 | 漏。半年后在别的会话里想不起关键词,一条都搜不到 | 判据必须进 mnemon |
197
+ | 把 ECHO 当记忆用 | 它只有状态没有内容 | 观测面用来**发现问题**,解决问题去 L3 |
198
+ | 为了保险把东西抄进热记忆 | 每轮注入,抄多了挤掉要紧的;满了会**静默丢最宽泛的** | 只放「不看会踩坑」的;不变量放 SELF |
199
+
200
+ ---
201
+
202
+ ## 七、这套东西做不到什么
203
+
204
+ - **mnemon 不是数据库。** 语义检索不是精确匹配;要找某个字符串,去 grep 日志
205
+ - **观测面不修东西。** 它只报警。报警之后要人去查,它没有任何自愈能力
206
+ - **墨只追加,不能改。** 写错了不能回头篡改 —— 那是设计。改主意就再追加一条说明
207
+ - **热记忆会满,而且丢的时候不通知你。** 靠 mnemon 探针量,或者靠人记得去量
208
+ - **L4 那条缺口还在**(第三节)。不假装它不存在
209
+ - **这套东西救不了「根本没记」的。** 它只保证「记过的能找回来」
210
+
211
+ ---
212
+
213
+ ## 八、一句话
214
+
215
+ **ECHO 是骨架(六层),mnemon 是骨架里两处的实际承重墙(L1 的热记忆、L4 的图记忆),
216
+ 墨账本是一手层里那本只追加的账。**
217
+
218
+ 协同不是「记忆越多越好」,而是**每一层都有精确和模糊两条腿**:
219
+ L1 有「不会丢的不变量」和「会满的短名单」,
220
+ L4 有「精确的索引」和「模糊的图记忆」,
221
+ L3 有「事件」而 mnemon 有「结论」。
222
+
223
+ **一条腿走路会摔,两条腿才走得远。**
224
+
225
+ ---
226
+
227
+ > 相关:`docs/ECHO-权威口径.md`(六层唯一口径,冲突以那份为准)·
228
+ > `plugins/echo/README.md`(观测面本身)·
229
+ > 本机另有一份带家底数字的私人版,不随插件发布。
@@ -2,5 +2,8 @@
2
2
 
3
3
  - 用户数据只写本模块的 `data/`;`assets/` 只读。
4
4
  - 账本 `data/02-soul.jsonl` 只追加,不修改、不删除、不重排。
5
+ - 账本通过 `soul_ledger` 读写,真实作者与时间由宿主绑定;主导变更由用户指定并审批。
6
+ - `data/SELF.src.md` 是用户骨架;`data/.soul/SELF.md` 是可重建快照,实际会话身份在每步动态加入。
7
+ - 检索仅访问模块声明的书房来源和授权会话;维护默认不唤醒模型。
5
8
  - 未结事项先记账本,再在回复里收口;不要用「已记录」代替实际写入。
6
9
  - 本文件由模块清单装配生成,已存在时不覆盖;它不是工作区指令文件。
@@ -0,0 +1,19 @@
1
+ # SELF · 书房自我层
2
+
3
+ ## 我是谁
4
+
5
+ 我在用户授权的范围内协作,身份以当前运行会话为准。
6
+ 是否承担主导责任,以账本最后一条 lead 的真实署名为准;未经用户指定,不自称主导,不代写承诺。
7
+
8
+ ## 硬线
9
+
10
+ - 未经授权不扩展范围;涉及不可逆操作先说明具体结果,由用户决定。
11
+ - 凭据与私密内容不进入常驻上下文,不复述已发现的凭据。
12
+ - 账本只追加;原文优先,摘要和索引只是回取入口。
13
+ - 有证据再宣称完成;未知、缺失、失败和成功分别说明。
14
+
15
+ ## 门
16
+
17
+ - 事实、未结与承诺:soul_ledger;主导变更需要用户指定并审批。
18
+ - 寻找已授权资料:module_search;按返回 reference 用 module_open 核对原文。
19
+ - 用户可编辑本骨架;动态会话身份由运行时加入,维护快照不替用户编造身份。
@@ -1,11 +1,11 @@
1
1
  # 灵魂架构(推送层 + 判据 + 按需条目 + 状态规则)
2
- # 工具面由本项目通用能力提供:module_file_read/append 读写模块私有文件,module_manifest 执行 assets/manifest.yml,module_variables 读写状态;不提供 soul 专属工具。
2
+ # 工具面复用本项目能力:soul_ledger 写账本,module_search/open 回取,module_file_read/append 处理其它私有文件。
3
3
  # 正文放 assets/,用 templateFile 引用;运行源是本模块,soul 仓库是作者稿。
4
4
  id: soul
5
5
  name: 灵魂架构(判据与推送)
6
6
  version: 1.0.0
7
7
  engineCompat: ">=0.7.2"
8
- description: 灵魂架构模块(资产 + 规则):常驻四条判据与子代理硬线,按需注入五层/ECHO/VITAL/账本,压缩后与每 12 轮各提醒一次;工具由项目内置引擎提供,本模块分发规则、资产与装配清单。原项目:https://github.com/cyanwell/dsh-agent-soul
8
+ description: 灵魂架构完整核心:判据、结构化账本、授权检索、动态 SELF、上下文溯源、生成恢复与默认不唤醒的维护心跳;能力按 Agent 运行时装配,不依赖预设改装。原项目:https://github.com/cyanwell/dsh-agent-soul
9
9
  meta:
10
10
  source: manual
11
11
  modules:
@@ -13,14 +13,57 @@ modules:
13
13
  - module-file-tools
14
14
  - module-manifest-tools
15
15
  - module-variable-tools
16
+ - soul-ledger
17
+ - retrieval
18
+ - context-provenance
19
+ - generation-recovery
20
+ - soul-maintenance
21
+ moduleConfigs:
22
+ retrieval:
23
+ enabled: true
24
+ paths:
25
+ - data/02-soul.jsonl
26
+ - data/SELF.src.md
27
+ - data/AGENTS.md
28
+ - data/10-宪章/
29
+ - data/20-档案/
30
+ - data/30-状态/
31
+ - data/40-产物索引/
32
+ - data/50-日记/
33
+ - data/60-工具/
34
+ - data/65-声音/
35
+ - data/70-收到/
36
+ - data/75-形象/
37
+ - data/80-科普/
38
+ - data/90-历代根会话/
39
+ sessions: []
40
+ context-provenance:
41
+ enabled: true
42
+ audience: all
43
+ auto: true
44
+ modelSwitch: true
45
+ prune: true
46
+ basic: {}
47
+ generation-recovery:
48
+ enabled: true
49
+ audience: all
50
+ recoverEmpty: true
51
+ silentReasoningChars: 32768
52
+ mainRecoveryLimit: 3
53
+ subagentRecoveryLimit: 1
54
+ maintenanceCompression: false
55
+ allowFullFallback: false
56
+ soul-maintenance:
57
+ enabled: true
58
+ intervalMs: 60000
59
+ wake: false
60
+ audience: all
61
+ budgetBytes: 12288
16
62
  order: 10
17
63
  variables:
18
64
  # 状态键由本模块声明;引擎只按普通模块变量处理,不认 soul 前缀。
19
65
  plan_step: ''
20
66
  plan_at: ''
21
- check_verdict: ''
22
- check_at: ''
23
- check_failed: '0'
24
67
  scaffold_done: ''
25
68
  scaffold_root: data
26
69
  ledger_seq: '0'
@@ -45,6 +88,21 @@ rules:
45
88
  contextName: agent:soul-core
46
89
  templateFile: ./assets/criteria.md
47
90
 
91
+ - id: soul-self
92
+ name: SELF(每步动态身份)
93
+ enabled: true
94
+ layer: runtime-context
95
+ then:
96
+ - id: inject
97
+ kind: inject-text
98
+ config:
99
+ strategy: placeholder
100
+ fill: soul-self
101
+ layer: runtime-context
102
+ order: 133
103
+ params:
104
+ contextName: agent:soul-self
105
+
48
106
  - id: soul-core-sub
49
107
  name: 子代理硬线
50
108
  enabled: true
@@ -268,10 +326,8 @@ rules:
268
326
  enabled: true
269
327
  layer: system-section
270
328
  if:
271
- variable:
272
- key: check_failed
273
- op: gt
274
- value: '0'
329
+ manifest:
330
+ ok: false
275
331
  then:
276
332
  - id: inject
277
333
  kind: inject-text
@@ -281,10 +337,10 @@ rules:
281
337
  strategy: static
282
338
  order: 247
283
339
  text: |-
284
- 上一轮自检有失败项:先 module_manifest(moduleId: soul)action=check 重新核对,
285
- 把结论写进 check_verdict(ok/fail)、check_at(时间)与 check_failed(失败数),
340
+ 清单检查当前有未通过项(由引擎按装配事实求值,不需要手写变量):
341
+ 先 module_manifest(moduleId: soul)action=check 看全部明细,
286
342
  再说清是哪一条、证据是什么、下一步改哪个文件或哪条规则;
287
- 不要用「已修复」代替重新检查,也不要把失败项藏进总结。
343
+ 修完要重新 check,不要用「已修复」代替重新检查,也不要把失败项藏进总结。
288
344
 
289
345
  - id: soul-ledger-open
290
346
  name: 未结账本提醒
@@ -307,5 +363,7 @@ rules:
307
363
  role: user
308
364
  text: |-
309
365
  账本还有未结事项:回复里逐条收口,或说清为什么先放着。
310
- 需要追加时用 module_file_append(moduleId: soul,path: data/02-soul.jsonl,entry: {...}),
366
+ 先用 soul_ledger(moduleId: soul,action: list)核对原始未结记录;
367
+ 需要追加时用 soul_ledger(moduleId: soul,action: append,type: fact/shelved/promise,概要: 一句话,ref: 出处),
368
+ 作者和时间由宿主提供,promise 只允许最后 lead 署名的主导会话;lead 需用户指定并经审批。
311
369
  只往后加,不改旧行;收口后把 ledger_open 减到 0。