dsh-plugin-prompt-tool 2.1.0 → 3.0.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.
- package/README.md +100 -233
- package/engine/actions/append-context.mjs +3 -24
- package/engine/actions/assembly.mjs +70 -94
- package/engine/actions/catalog.mjs +65 -28
- package/engine/actions/content.mjs +8 -152
- package/engine/actions/examples.mjs +8 -4
- package/engine/actions/inbox-prepend.mjs +4 -5
- package/engine/actions/index.mjs +17 -9
- package/engine/actions/inject-text.mjs +24 -4
- package/engine/actions/pre-step-filter.mjs +3 -4
- package/engine/actions/registration.mjs +20 -28
- package/engine/actions/request-params.mjs +21 -1
- package/engine/actions/shared.mjs +22 -13
- package/engine/actions/stream-output.mjs +26 -0
- package/engine/actions/tool-gate.mjs +31 -0
- package/engine/actions/tool-result.mjs +36 -0
- package/engine/actions/tool-visibility.mjs +248 -0
- package/engine/agent-capability.mjs +67 -0
- package/engine/anchor-match.mjs +14 -21
- package/engine/audience.d.mts +2 -0
- package/engine/audience.mjs +102 -0
- package/engine/branch.d.mts +4 -0
- package/engine/branch.mjs +61 -18
- package/engine/compaction-epoch.d.mts +25 -0
- package/engine/compaction-epoch.mjs +27 -4
- package/engine/compositions/source/local/filesystem-editor.yml +3 -3
- package/engine/compositions/source/local/instruction-hint.yml +2 -4
- package/engine/compositions/source/local/module-file-tools.yml +2 -0
- package/engine/compositions/source/local/module-import-tools.yml +4 -0
- package/engine/compositions/source/local/module-manifest-tools.yml +2 -0
- package/engine/compositions/source/local/module-rule-tools.yml +5 -0
- package/engine/compositions/source/local/module-variable-tools.yml +5 -0
- package/engine/compositions/source/local/present-as.yml +26 -0
- package/engine/compositions/source/local/tool-config-engine.yml +2 -3
- package/engine/compositions/source/local/tool-search.yml +11 -0
- package/engine/condition-facts.mjs +84 -0
- package/engine/conditions/anchor.mjs +63 -23
- package/engine/conditions/availability.mjs +1 -1
- package/engine/conditions/composite.mjs +3 -3
- package/engine/conditions/count.mjs +42 -11
- package/engine/conditions/evaluation.mjs +74 -19
- package/engine/conditions/examples.mjs +2 -1
- package/engine/conditions/index.d.mts +15 -0
- package/engine/conditions/index.mjs +23 -9
- package/engine/conditions/operators.mjs +4 -0
- package/engine/conditions/phase.mjs +9 -3
- package/engine/conditions/preset.mjs +1 -1
- package/engine/conditions/session.mjs +8 -2
- package/engine/conditions/subject.mjs +144 -65
- package/engine/conditions/text.mjs +26 -8
- package/engine/conditions/variable.mjs +83 -0
- package/engine/context-activation.d.mts +11 -0
- package/engine/{st-world-book.mjs → context-activation.mjs} +104 -64
- package/engine/delivery.d.mts +2 -0
- package/engine/delivery.mjs +93 -0
- package/engine/discovery.d.mts +38 -0
- package/engine/discovery.mjs +146 -0
- package/engine/env-safety.mjs +14 -0
- package/engine/executor.d.mts +28 -0
- package/engine/executor.mjs +290 -205
- package/engine/fillers.mjs +39 -8
- package/engine/fixed-registration.mjs +12 -0
- package/engine/history.mjs +71 -0
- package/engine/instruction-blocks.d.mts +13 -0
- package/engine/instruction-blocks.mjs +21 -0
- package/engine/instruction-files.d.mts +5 -0
- package/engine/instruction-files.mjs +97 -0
- package/engine/instruction-hint.mjs +69 -103
- package/engine/interpolate.d.mts +7 -0
- package/engine/interpolate.mjs +44 -13
- package/engine/layers.mjs +163 -227
- package/engine/machine-paths.mjs +40 -0
- package/engine/module-file-tools.mjs +8 -0
- package/engine/module-import-tools.mjs +10 -0
- package/engine/module-manifest-tools.mjs +8 -0
- package/engine/module-rule-tools.mjs +10 -0
- package/engine/module-variable-tools.mjs +10 -0
- package/engine/order.d.mts +14 -0
- package/engine/order.mjs +0 -3
- package/engine/path-safety.d.mts +2 -0
- package/engine/path-safety.mjs +58 -0
- package/engine/pre-step-source.d.mts +69 -0
- package/engine/pre-step-source.mjs +103 -0
- package/engine/present-as.mjs +77 -0
- package/engine/promotion-pool.d.mts +9 -0
- package/engine/promotion-pool.mjs +69 -0
- package/engine/record.mjs +2 -0
- package/engine/rule-engine.mjs +3 -2
- package/engine/rule-facts.d.mts +11 -0
- package/engine/rule-facts.mjs +60 -0
- package/engine/rule-runtime.d.mts +46 -0
- package/engine/rule-runtime.mjs +98 -13
- package/engine/rule-spec.d.mts +106 -0
- package/engine/rule-spec.mjs +301 -27
- package/engine/run-code-env.mjs +73 -19
- package/engine/schema.mjs +165 -243
- package/engine/sdk-strip.mjs +2 -2
- package/engine/service-names.d.mts +10 -0
- package/engine/service-names.mjs +10 -0
- package/engine/shared.d.mts +21 -0
- package/engine/shared.mjs +46 -13
- package/engine/skill-search.mjs +125 -53
- package/engine/source-kind.d.mts +9 -0
- package/engine/source-kind.mjs +16 -0
- package/engine/strategy-ids.mjs +5 -0
- package/engine/template-evaluation.d.mts +16 -0
- package/engine/template-evaluation.mjs +178 -0
- package/engine/template-frame.d.mts +16 -0
- package/engine/template-frame.mjs +69 -0
- package/engine/tool-config-engine.mjs +38 -34
- package/engine/tool-definition.d.mts +4 -0
- package/engine/tool-definition.mjs +5 -1
- package/engine/tool-git-bash.mjs +5 -1
- package/engine/tool-scope.mjs +22 -0
- package/engine/{dev-tool-search.mjs → tool-search.mjs} +63 -65
- package/engine/trigger.mjs +15 -270
- package/engine/vendor/yaml/dist/compose/resolve-flow-scalar.js +19 -18
- package/engine/vendor/yaml/dist/nodes/Alias.js +25 -23
- package/engine/vendor/yaml/package.json +1 -1
- package/lib/client.js +8312 -6724
- package/lib/client.js.map +1 -1
- package/lib/index.d.mts +16 -2120
- package/lib/index.mjs +26914 -5816
- package/modules/ponytail/module.yml +83 -203
- package/modules/ptc-mode/module.yml +45 -0
- package/modules/soul/assets/core-hard.md +6 -0
- package/modules/soul/assets/criteria.md +12 -0
- package/modules/soul/assets/echo.md +12 -0
- package/modules/soul/assets/layers.md +11 -0
- package/modules/soul/assets/ledger.md +9 -0
- package/modules/soul/assets/manifest.yml +20 -0
- package/modules/soul/assets/reference/00-layers.md +27 -0
- package/modules/soul/assets/reference/01-criteria.md +32 -0
- package/modules/soul/assets/reference/02-echo.md +158 -0
- package/modules/soul/assets/reference/03-vital.md +183 -0
- package/modules/soul/assets/reference/04-manifest.json +106 -0
- package/modules/soul/assets/reference/05-doctor.md +67 -0
- package/modules/soul/assets/reference/06-reference.md +189 -0
- package/modules/soul/assets/reference/07-bundle.json +431 -0
- package/modules/soul/assets/reference/08-/350/270/251/345/235/221/345/256/236/345/275/225.md +59 -0
- package/modules/soul/assets/reference/09-dev-workflow.md +109 -0
- package/modules/soul/assets/reference/10-echo-anatomy.md +100 -0
- package/modules/soul/assets/reference/11-self.md +80 -0
- package/modules/soul/assets/reference/12-ledger.md +159 -0
- package/modules/soul/assets/reference/README.md +10 -0
- package/modules/soul/assets/templates/agents-template.md +6 -0
- package/modules/soul/assets/vital.md +9 -0
- package/modules/soul/module.yml +311 -0
- package/modules/superpowers/module.yml +122 -0
- package/modules/tool-surface/module.yml +51 -47
- package/package.json +37 -40
- package/skills/dsh-module/SKILL.md +67 -147
- package/skills/dsh-module/reference.md +113 -86
- package/templates/10-pre-step.yml +2 -3
- package/templates/14-first-turn-anchor.yml +10 -14
- package/templates/15-guide-auto.yml +32 -28
- package/templates/16-custom-fallback.yml +33 -21
- package/templates/20-system-section.yml +1 -4
- package/templates/50-llm-stream.yml +4 -10
- package/templates/60-tool-pipeline.yml +12 -10
- package/templates/63-append-context.yml +4 -6
- package/templates/65-turn-stop.yml +2 -2
- package/templates/67-inbox-prepend.yml +2 -2
- package/templates/70-subagent-maintenance.yml +9 -10
- package/templates/75-subagent-end.yml +2 -2
- package/templates/80-tool-surface.yml +41 -57
- package/templates/tools/40-delegate-module-import.yml +22 -0
- package/templates/tools/50-delegate-module-rules.yml +14 -0
- package/templates/tools/60-delegate-module-variables.yml +17 -0
- package/templates/tools/70-delegate-module-rules-edit.yml +31 -0
- package/engine/actions/decision.mjs +0 -54
- package/engine/actions/guard.mjs +0 -80
- package/engine/actions/sdk-strip.mjs +0 -30
- package/engine/character-tools.mjs +0 -8
- package/engine/classify-task.mjs +0 -53
- package/engine/compositions/source/local/character-tools.yml +0 -5
- package/engine/compositions/source/local/dev-tool-search.yml +0 -11
- package/engine/compositions/source/local/session-var-tools.yml +0 -5
- package/engine/compositions/source/local/subagent-tool-policy.yml +0 -21
- package/engine/compositions/source/local/world-book-tools.yml +0 -5
- package/engine/condition.mjs +0 -96
- package/engine/declared-triggers.mjs +0 -93
- package/engine/session-var-tools.mjs +0 -8
- package/engine/session-vars.mjs +0 -54
- package/engine/st-macros.d.mts +0 -22
- package/engine/st-macros.mjs +0 -208
- package/engine/st-render.mjs +0 -109
- package/engine/st-world-book.d.mts +0 -10
- package/engine/subagent-tool-policy-core.mjs +0 -400
- package/engine/subagent-tool-policy.mjs +0 -352
- package/engine/trigger-spec.mjs +0 -173
- package/engine/world-book-tools.mjs +0 -8
- package/lib/migrate-rules.d.mts +0 -1
- package/lib/migrate-rules.mjs +0 -610
- package/lib/module-package-DqJZaE71.mjs +0 -2
- package/lib/module-package-q2gDRu9H.mjs +0 -2869
- package/lib/rule-builder-DMrJten6.mjs +0 -14767
- package/templates/61-deny-tools-presentation.yml +0 -27
- package/templates/62-guard-deny-tools.yml +0 -20
- package/templates/policies/legacy-defaults.yml +0 -34
- package/templates/tools/40-delegate-character.yml +0 -15
- package/templates/tools/50-delegate-worldbook.yml +0 -15
- package/templates/tools/60-delegate-session-var.yml +0 -15
- package/templates/tools/70-delegate-worldbook-upsert.yml +0 -36
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
# Ⅰ · ECHO —— 生命核心
|
|
2
|
+
|
|
3
|
+
**它管空间。** 上下文会满,满了要丢,丢了还要能找回来。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 一、思考是怎么退化的(这一节是整份文件的前提)
|
|
8
|
+
|
|
9
|
+
先说清楚要解决的是什么。绝大多数人把它描述成「上下文满了会忘事」——那只是第一句,
|
|
10
|
+
真正致命的在后面。
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
第 1 步 上下文满了
|
|
14
|
+
→ 引擎压缩,把前面几十轮变成一段摘要
|
|
15
|
+
|
|
16
|
+
第 2 步 摘要写得挺准
|
|
17
|
+
→ 「用户要求验证插件安装」「确认了 32 项检查通过」
|
|
18
|
+
→ 每一条都对,没有任何一条是编的
|
|
19
|
+
|
|
20
|
+
第 3 步 但它不带出处
|
|
21
|
+
→ 你读到的是一句「确认了 32 项」,不是「在第 47 轮,verify-live 打了 32/1/0」
|
|
22
|
+
→ 想核对,只能翻回压缩前的全部记录
|
|
23
|
+
|
|
24
|
+
第 4 步 于是你不核对
|
|
25
|
+
→ 因为你「记得」它是对的。注意:这不是懒,这是摘要工作得太好
|
|
26
|
+
|
|
27
|
+
第 5 步 下一轮推理建立在这个「记得」上
|
|
28
|
+
→ 摘要里只要有一个细节偏了半个字,它现在变成了前提
|
|
29
|
+
|
|
30
|
+
第 6 步 偏了的那条继续往下传
|
|
31
|
+
→ 后面的推理每一步都正确,而每一步都踩在偏掉的前提上
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
★ **这就是「思考退化」,它和遗忘是两回事。**
|
|
35
|
+
|
|
36
|
+
遗忘是「想不起来」,你能察觉。
|
|
37
|
+
退化是**「想得起来,但那个记忆已经偏了,而你在它上面继续正确地推理」** —— 察觉不到。
|
|
38
|
+
|
|
39
|
+
一句话:**退化不是变笨,是在错误的前提上继续正确地推理。**
|
|
40
|
+
|
|
41
|
+
所以 ECHO 管的不是「记住」,是**「凭什么相信你记得的那一句」**。
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## 二、为什么「装记忆插件」不解决这件事
|
|
46
|
+
|
|
47
|
+
最直觉的解法是装插件:向量库、知识图谱、Memory Spaces。但它们都在**存**这一侧,
|
|
48
|
+
而退化发生在**丢**这一侧。
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
原始记录 ──压缩──▶ 摘要 ──▶ 记忆插件 ──▶ 取回来的是摘要
|
|
52
|
+
↑ ↓
|
|
53
|
+
└──────── 真正的原文在这里,但已经没人指向它 ────────┘
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
你把最好的存储接在摘要后面,取回来的仍然是摘要。
|
|
57
|
+
**压缩发生在存与取之间,而插件管不到那一段。**
|
|
58
|
+
|
|
59
|
+
### 三份真相的陷阱
|
|
60
|
+
|
|
61
|
+
那装三个记忆插件呢?更糟。
|
|
62
|
+
|
|
63
|
+
三个插件各存一份、各有各的摘要策略,于是同一个事实有三条版本。
|
|
64
|
+
**这时候真正的成本不是存储,是对账** —— 每次要引用它,你得先决定信哪一份。
|
|
65
|
+
|
|
66
|
+
**所以第一条判据是「先定唯一权威源」,第二条才是「建机制」。反过来做一定会双重记账。**
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 三、压缩有两条路,要补的是**下面那条**
|
|
71
|
+
|
|
72
|
+
| | 谁在驱动 | 产物带不带指针 |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| **模型驱动** | agent 自己写摘要 | ✅ 天然带 —— 它知道自己是从哪读的 |
|
|
75
|
+
| **兜底压缩** | 没人响应提示时,引擎**自动出手** | ❌ 通常不带 |
|
|
76
|
+
|
|
77
|
+
**上面那条你不装也有;下面那条你不装就缺。**
|
|
78
|
+
|
|
79
|
+
为什么下一条会缺:那种压缩器的指令通常要求「保留精确路径 / 命令 / 报错原文 / 数值 / 函数签名」——
|
|
80
|
+
**每一条都是「要写得准」,但没有一句要求标注「这话从哪来」。**
|
|
81
|
+
|
|
82
|
+
**于是它写出来的东西每一条都对,每一条都无从核对。**
|
|
83
|
+
|
|
84
|
+
而且失败是无声的:**你不会觉得丢了东西,你只是不再想起它。**
|
|
85
|
+
|
|
86
|
+
**所以「门牌」要补的正是这一条。** 下面三样里,第 1 样就是它。
|
|
87
|
+
|
|
88
|
+
---
|
|
89
|
+
|
|
90
|
+
## 四、机制面 · 至少要有三样
|
|
91
|
+
|
|
92
|
+
### 1. 丢的时候,产物必须带得回原文的指针(门牌)
|
|
93
|
+
|
|
94
|
+
**这是整套东西的兜底承诺。** 没有它,压缩就是单向的遗忘。
|
|
95
|
+
|
|
96
|
+
三级纪律 —— **照抄即可**:
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
① 能拿到精确位置 → 写精确位置
|
|
100
|
+
② 拿不到 → 写「位置未知」+ 容器标识 + 一个检索入口
|
|
101
|
+
③ 绝不猜 —— 错的门牌比没有更坏
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
★ 为什么第 ③ 条单独列出:**一个错的门牌会让你以为能找到,于是不去找。**
|
|
105
|
+
那比「找不到」坏得多。
|
|
106
|
+
|
|
107
|
+
**判据:拿一个被压缩过的会话,随机挑一条摘要,问「这条从哪来」。
|
|
108
|
+
三十秒内答不出来,门牌就是断的。**
|
|
109
|
+
|
|
110
|
+
### 2. 一门只回指针、不做转述的检索入口
|
|
111
|
+
|
|
112
|
+
转述是二手污染的来源。**能逐字取回,就不要摘要。**
|
|
113
|
+
|
|
114
|
+
动词最少三个:`现在是什么状态` / `搜一个词` / `打开某个指针`。
|
|
115
|
+
|
|
116
|
+
★ 一个细节值得抄:**检索结果里标明证据等级**(一手 / 索引 / 程序)。
|
|
117
|
+
一屏里同时出现三种来源时,用户必须一眼能看出哪一句是原文、哪一句是转述。
|
|
118
|
+
|
|
119
|
+
### 3. 一个自检(哨兵)
|
|
120
|
+
|
|
121
|
+
**判据 ③ 的落地**:它坏的时候,谁会发现?
|
|
122
|
+
|
|
123
|
+
体检项要跑得起来、要能给出分级状态(正常 / 提示 / 警告 / 错误)。
|
|
124
|
+
**没有哨兵的体系,坏了不会有人说。**
|
|
125
|
+
|
|
126
|
+
★ 哨兵最容易漏的一种失败:**它自己坏了。**
|
|
127
|
+
所以哨兵也要能被一个外部动作验证 —— 否则你只是把「没人知道」换成了「一个同样没人知道的东西说没事」。
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 五、观测面 · 一个容易被漏掉的洞
|
|
132
|
+
|
|
133
|
+
**你的每一个执行器都要有对应的观测面。** 一个调好就不再看的阈值系统,
|
|
134
|
+
你永远不会误伤过几次 —— 「断过没有、断错没有」必须有人能答。
|
|
135
|
+
|
|
136
|
+
压缩这一层尤其如此:**压缩不会报错,它只会成功地丢掉东西。**
|
|
137
|
+
所以你要看到的不是「压缩成功 / 失败」,是**「这次压掉了多少、压掉的那部分还能不能找回来」**。
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 六、怎么知道自己已经退化了(三条可执行的检验)
|
|
142
|
+
|
|
143
|
+
这一层的难点在于**它坏的时候不疼**。所以需要主动测,不能等它疼。
|
|
144
|
+
|
|
145
|
+
**检验一 · 门牌抽查**
|
|
146
|
+
拿一个被压缩过的会话,随机挑三条摘要,看能不能通过门牌回到原文。
|
|
147
|
+
一条回不去,链条就是断的。
|
|
148
|
+
|
|
149
|
+
**检验二 · 逐字核对**
|
|
150
|
+
找一条你「记得」的事实,去一手层核对原文。
|
|
151
|
+
如果原文和你记得的不完全一致 —— 不是记错,是压缩时偏了,而且你一直没发现。
|
|
152
|
+
|
|
153
|
+
**检验三 · 三份真相计数**
|
|
154
|
+
同一个事实,你手里有几条来源?
|
|
155
|
+
超过一条,说明权威源没定;这时候你每一次引用都在做一次隐性的仲裁。
|
|
156
|
+
|
|
157
|
+
★ 三条都不需要特殊工具,需要的是**愿意去测**。
|
|
158
|
+
而愿意去测的前提,是你知道自己可能已经坏了 —— 这正是这一节存在的理由。
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
# Ⅱ · VITAL —— 稳态
|
|
2
|
+
|
|
3
|
+
**它管时间与方向。**
|
|
4
|
+
|
|
5
|
+
ECHO 管的是「丢了的还能找回来」——那是**空间**。
|
|
6
|
+
但一个 agent 还有两样东西会耗尽,而且耗尽的方式完全不同:
|
|
7
|
+
|
|
8
|
+
- **时间**:预算会烧光,回合数有限
|
|
9
|
+
- **方向**:它会该停不停,也会差一步就停
|
|
10
|
+
|
|
11
|
+
VITAL 做的就是同一件事:**把偏离拉回来(homeostasis)。**
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## 一、它和 ECHO 的分工,别混
|
|
16
|
+
|
|
17
|
+
| | **Ⅰ ECHO** | **Ⅱ VITAL** |
|
|
18
|
+
|---|---|---|
|
|
19
|
+
| 管什么 | **空间** —— 上下文会满 | **时间与方向** —— 预算与目标 |
|
|
20
|
+
| 失败长什么样 | 「我记不全了」 | 「我在原地打转」/「我该停了还在跑」 |
|
|
21
|
+
| 坏的时候疼不疼 | **不疼** —— 只是不再想起 | **疼** —— 你看得见自己在浪费 |
|
|
22
|
+
| 核心机制 | 丢的时候留指针 | 偏离的时候拉回来 |
|
|
23
|
+
|
|
24
|
+
★ 为什么这两层必须分开:**它们的检测法完全不同。**
|
|
25
|
+
用一个「忙不忙」的指标去糊这两层,你会得到一个既不能测空间、也不能测方向的指标。
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 二、三种资源,三种截然不同的失败
|
|
30
|
+
|
|
31
|
+
### 2.1 时间 · 失败有两个相反的方向
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
方向 A:烧光预算,一个字没出
|
|
35
|
+
→ 常见于「反复重试」「无限确认」「一直在读但从不写」
|
|
36
|
+
|
|
37
|
+
方向 B:永远结束不了
|
|
38
|
+
→ 常见于「还能更好」——它不是不知道停,是不承认「够好了」
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
★ **这两种失败需要两套完全不同的执行器。**
|
|
42
|
+
A 要的是**流内切断**(在这一次调用里就把水龙头关上);
|
|
43
|
+
B 要的是**跨调用判定**(在这一次结束时判断「还该不该有下一次」)。
|
|
44
|
+
把它们做成同一个东西,你就会在 B 的场景里被 A 的机制误伤。
|
|
45
|
+
|
|
46
|
+
### 2.2 方向 · 失败也是两个方向
|
|
47
|
+
|
|
48
|
+
```
|
|
49
|
+
方向 A:该停不停 → 空转。它在做事,但做的不是要做的
|
|
50
|
+
方向 B:半途而废 → 差一步就完了却停了
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
★ **这一层最难的判断是「什么算做完」,而它有一个陷阱:**
|
|
54
|
+
「还能更好」不算「没做完」。
|
|
55
|
+
|
|
56
|
+
一个永远可以更精致的东西,如果按「还能更好」来算,就永远结束不了。
|
|
57
|
+
所以判据必须是**外部的**:有没有证据证明核心目标达成?没有未处理的阻塞?剩余项是增强还是缺陷?
|
|
58
|
+
|
|
59
|
+
—— 答得出来,就停。**敢停是因为被验证过,不是因为我觉得够了。**
|
|
60
|
+
|
|
61
|
+
### 2.3 空间 · 和 Ⅰ 层的交接点
|
|
62
|
+
|
|
63
|
+
空间这一层的机制在 Ⅰ,但**它的「什么时候压」属于稳态** ——
|
|
64
|
+
那是一个阈值判断,归这里。
|
|
65
|
+
|
|
66
|
+
一条值得单独记的:**阈值是安全网,不是考核。**
|
|
67
|
+
(这条在下一节展开,因为它是最容易读错的一条。)
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## 三、每一个稳态回路,都要有这三件
|
|
72
|
+
|
|
73
|
+
缺一件,回路就是断的:
|
|
74
|
+
|
|
75
|
+
| 件 | 回答什么 | 缺了会怎样 |
|
|
76
|
+
|---|---|---|
|
|
77
|
+
| **传感器** | 现在偏到哪了?(一个可读的数) | 你只能靠「感觉不太对」,而感觉不会在偏离的早期报警 |
|
|
78
|
+
| **执行器** | 偏了之后谁动手?动到什么程度? | 你知道该停了,但停不下来 —— 知道和做到之间没有接线 |
|
|
79
|
+
| **设定点** | 偏到多少算偏? | 有传感器有执行器,但没有标准 —— 每次都要现场拍 |
|
|
80
|
+
|
|
81
|
+
★ **这三件里最容易被跳过的是「设定点」**,因为它看起来只是一个数字。
|
|
82
|
+
但一个没有来历的数字,会让你在每次它触发时都要重新怀疑它一次。
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## 四、阈值的来历:每一条背后都要挂着一个具体的 bug
|
|
87
|
+
|
|
88
|
+
**这是这一层最重要的一条设计纪律,值得照抄。**
|
|
89
|
+
|
|
90
|
+
不要为了「稳」去拍一个数字。那个数字应当能回答:
|
|
91
|
+
|
|
92
|
+
> **它防的是哪一次具体的失败?**
|
|
93
|
+
|
|
94
|
+
举三个真实的形状:
|
|
95
|
+
|
|
96
|
+
```
|
|
97
|
+
「上下文到 0.88 强制压缩」
|
|
98
|
+
← 防的是:那次压到一半压不动了,会话直接掉线
|
|
99
|
+
← 而不是:某个教程说 0.88 比较安全
|
|
100
|
+
|
|
101
|
+
「连续 3 轮同一工具同一参数没有新结果 → 换路」
|
|
102
|
+
← 防的是:那次连续七轮改同一个正则,每轮都「差一点」
|
|
103
|
+
← 而不是:三次听起来合理
|
|
104
|
+
|
|
105
|
+
「子任务不超过 6 轮,超过要问」
|
|
106
|
+
← 防的是:那次没问,一路做到第 11 轮,中间方向已经错了
|
|
107
|
+
← 而不是:六是个吉利的数字
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
★ **答不上来的阈值,会在某天误伤你自己,而没人知道为什么。**
|
|
111
|
+
更糟的是:**误伤之后你不会删掉它,你会习惯它。**
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## 五、★ 稳态会反向失败:把安全网读成考核
|
|
116
|
+
|
|
117
|
+
这一节是这一层最容易漏掉的,而且它的失败方向是**反的**。
|
|
118
|
+
|
|
119
|
+
前面讲的都是「不够稳」:烧光、打转、停不下来。
|
|
120
|
+
但还有第三种失败:**保护装置装得太好,最后变成了压力源。**
|
|
121
|
+
|
|
122
|
+
```
|
|
123
|
+
一个水位报警,本意是「提醒你该落盘了」
|
|
124
|
+
↓
|
|
125
|
+
但如果被读成「你现在很危险」
|
|
126
|
+
↓
|
|
127
|
+
它触发的动作就变成了「少想、少说、把话缩短」
|
|
128
|
+
↓
|
|
129
|
+
于是你缩在一个不需要缩的地方,反复确认一个不需要确认的细节
|
|
130
|
+
↓
|
|
131
|
+
★ 这看起来像警觉,实际是空转
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**判据:为你好而装的装置,不许拿来当评价自己的尺子。**
|
|
135
|
+
|
|
136
|
+
一个阈值只该触发**一个**动作:把该落的落进一手层(往外放东西)。
|
|
137
|
+
它不该触发第二个:缩(往里收东西)。
|
|
138
|
+
**落盘和缩的方向相反,而后者看起来像谨慎。**
|
|
139
|
+
|
|
140
|
+
★ 这一条和「把『不』读成『禁止』」(见 `01-criteria.md`)是同一个形状:
|
|
141
|
+
**把一句本来松弛的话,读成了一道锁。**
|
|
142
|
+
|
|
143
|
+
所以每一个稳态装置的文档里都该写清一件事:
|
|
144
|
+
**它触发时你只该做什么,以及你不该把它当什么。**
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 六、过度保护也是一种失败
|
|
149
|
+
|
|
150
|
+
**稳态不等于「越保守越好」。**
|
|
151
|
+
|
|
152
|
+
把阈值设得极紧,你会被频繁打断 ——
|
|
153
|
+
而那本身是一种失败:**它让你做不完任何需要连续思考的事。**
|
|
154
|
+
|
|
155
|
+
真实的取舍是这样的:
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
太松 → 烧光 / 打转 / 停不下来
|
|
159
|
+
太紧 → 每十分钟被打断一次,深度工作无法发生
|
|
160
|
+
|
|
161
|
+
中间那条线在哪?
|
|
162
|
+
→ 它取决于「打断一次的代价」和「放任一次的代价」哪个更贵
|
|
163
|
+
→ 而这个比例,不同的 agent、不同的任务类型是不一样的
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
★ 所以稳态**没有通用参数**。任何告诉你「照这个数字设」的文档,都只给了你一半。
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## 七、怎么测(三条可执行的检验)
|
|
171
|
+
|
|
172
|
+
**检验一 · 反向测试**
|
|
173
|
+
手动把阈值调到会触发的水平,看执行器到底动没动。
|
|
174
|
+
**没动过的执行器等于不存在** —— 而它平时不动,所以永远不会暴露。
|
|
175
|
+
|
|
176
|
+
**检验二 · 误伤计数**
|
|
177
|
+
过去一周里,这个阈值触发了几次?其中几次是真该触发的?
|
|
178
|
+
如果一次都没触发过,它可能是死的;如果每次都触发,它可能设得太紧。
|
|
179
|
+
**「断过没有、断错没有」必须有人能答。**
|
|
180
|
+
|
|
181
|
+
**检验三 · 停得下来吗**
|
|
182
|
+
找一个「还能更好但已经达标」的任务,看它停不停。
|
|
183
|
+
停不下来,说明「什么算做完」这一环是缺的 —— 而这一环是最贵的,因为它不在插件里,在判据里。
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "0.1.0",
|
|
3
|
+
"note": "每条给出「它管哪种稀缺资源」和「缺了会怎样」—— 这是判据①和③,不是安装指令。清单只说这一类别该满足什么,不绑定任何具体实现。",
|
|
4
|
+
"readme": "挑插件的时候,拿每条的 check 字段去问候选插件;答不上来的,就是不合。",
|
|
5
|
+
"layers": [
|
|
6
|
+
{
|
|
7
|
+
"id": "I-echo",
|
|
8
|
+
"name": "ECHO · 生命核心",
|
|
9
|
+
"manages": "空间 —— 上下文会满,满了要丢,丢了还要能找回来",
|
|
10
|
+
"slots": [
|
|
11
|
+
{
|
|
12
|
+
"what": "上下文压缩 / 裁剪",
|
|
13
|
+
"required": true,
|
|
14
|
+
"failure": "丢了的找不回来 —— 门牌失效,而你以为还能找",
|
|
15
|
+
"check": "它产出的摘要里,带不带得回原文的指针?拿不到精确位置时它怎么写的?",
|
|
16
|
+
"examples": []
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"what": "检索入口(门)",
|
|
20
|
+
"required": true,
|
|
21
|
+
"failure": "只有摘要、没有原文 —— 二手污染无法追溯",
|
|
22
|
+
"check": "它能逐字取回原文吗?还是只给转述?",
|
|
23
|
+
"examples": []
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"what": "哨兵 / 自检",
|
|
27
|
+
"required": true,
|
|
28
|
+
"failure": "坏了没人知道",
|
|
29
|
+
"check": "它测什么?有没有分级状态?上一次跑是什么时候?",
|
|
30
|
+
"examples": []
|
|
31
|
+
}
|
|
32
|
+
]
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "II-vital",
|
|
36
|
+
"name": "VITAL · 稳态",
|
|
37
|
+
"manages": "时间与方向 —— 预算会烧光、轮数有限;它负责把偏离拉回来",
|
|
38
|
+
"slots": [
|
|
39
|
+
{
|
|
40
|
+
"what": "预算 / 重复推理的治理",
|
|
41
|
+
"required": true,
|
|
42
|
+
"failure": "烧光预算一个字没出;或永远结束不了",
|
|
43
|
+
"check": "它的每一条阈值背后,挂着哪一个具体的失败?答不上来的阈值会误伤你",
|
|
44
|
+
"examples": []
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"what": "目标与「什么算做完」",
|
|
48
|
+
"required": true,
|
|
49
|
+
"failure": "空转(该停不停)/ 半途而废",
|
|
50
|
+
"check": "它怎么区分「还能更好」和「没做完」?",
|
|
51
|
+
"examples": []
|
|
52
|
+
}
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "III-capability",
|
|
57
|
+
"name": "能力 · 手和感官",
|
|
58
|
+
"manages": "(不管理稀缺资源 —— 所以这一层的东西不进权威源)",
|
|
59
|
+
"slots": [
|
|
60
|
+
{
|
|
61
|
+
"what": "任意工具",
|
|
62
|
+
"required": false,
|
|
63
|
+
"failure": "换掉它,你还是你 —— 这正是判据",
|
|
64
|
+
"check": "如果把这一层整个换掉,你的身份判据还成立吗?成立就对了",
|
|
65
|
+
"examples": []
|
|
66
|
+
}
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"id": "IV-archive",
|
|
71
|
+
"name": "档案 · 唯一看得见的那一层",
|
|
72
|
+
"manages": "(对外可访问性)—— 别人理解你,全靠它",
|
|
73
|
+
"slots": [
|
|
74
|
+
{
|
|
75
|
+
"what": "一份可读的目录 / 门面文件",
|
|
76
|
+
"required": true,
|
|
77
|
+
"failure": "外人(和下一代的你)无从下手",
|
|
78
|
+
"check": "一个从没见过你的人,能不能只靠它找到东西?",
|
|
79
|
+
"examples": []
|
|
80
|
+
}
|
|
81
|
+
]
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
"id": "V-ops",
|
|
85
|
+
"name": "运维",
|
|
86
|
+
"manages": "让前面四层能持续跑下去的活",
|
|
87
|
+
"slots": [
|
|
88
|
+
{
|
|
89
|
+
"what": "装配顺序与升级路径",
|
|
90
|
+
"required": false,
|
|
91
|
+
"failure": "每次都要重新想一遍;升级时把已有的拆坏",
|
|
92
|
+
"check": "顺序是不是「先定权威源,再建机制」?反过来做一定会双重记账",
|
|
93
|
+
"examples": []
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"assembly_order": [
|
|
99
|
+
"第 0 步 · 先定「我的权威源在哪」—— 不先做这个,装什么都双重记账",
|
|
100
|
+
"第 1 步 · 建 Ⅰ ECHO:门(怎么找回来)+ 门牌三级纪律 + 哨兵",
|
|
101
|
+
"第 2 步 · 建 Ⅱ VITAL:三种资源各自的传感器 + 执行器 + 设定点",
|
|
102
|
+
"第 3 步 · 接 Ⅲ 能力(这一层随便换)",
|
|
103
|
+
"第 4 步 · 立 Ⅳ 档案",
|
|
104
|
+
"第 5 步 · Ⅴ 运维"
|
|
105
|
+
]
|
|
106
|
+
}
|
|
@@ -0,0 +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
|
+
单独装任何一个都会缺一角。
|