@theseus-whale/dsh-continuity 0.0.0-stage → 4.12.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 (258) hide show
  1. package/INSTALL.md +25 -0
  2. package/PANEL.md +92 -0
  3. package/README.md +286 -2
  4. package/RELEASE-NOTES.md +732 -0
  5. package/bin/bc-acceptance-full.mjs +91 -0
  6. package/bin/bc-acceptance-tight.mjs +66 -0
  7. package/bin/bc-acceptance.mjs +22 -0
  8. package/bin/bc-add-keywords.mjs +21 -0
  9. package/bin/bc-demo.mjs +47 -0
  10. package/bin/bc-expand-hint.mjs +179 -0
  11. package/bin/bc-ingest-index.mjs +35 -0
  12. package/bin/bc-ingest.mjs +31 -0
  13. package/bin/bc-label-demo.mjs +18 -0
  14. package/bin/bc-relabel.mjs +150 -0
  15. package/bin/bc-sessionize.mjs +59 -0
  16. package/bin/coref_pipeline.py +47 -0
  17. package/bin/coref_service.py +57 -0
  18. package/bin/debug_ckip.py +16 -0
  19. package/bin/debug_ner_zh.py +18 -0
  20. package/bin/doctor.mjs +275 -0
  21. package/bin/en_ner_error_audit.py +33 -0
  22. package/bin/eval-label-rules.mjs +342 -0
  23. package/bin/export-turns.py +68 -0
  24. package/bin/extract-user-paragraph.mjs +14 -0
  25. package/bin/extraction-composite-smoke.mjs +28 -0
  26. package/bin/extraction-latency.mjs +58 -0
  27. package/bin/extraction-user-smoke.mjs +28 -0
  28. package/bin/extraction_service.py +164 -0
  29. package/bin/facet-active-experiment.mjs +110 -0
  30. package/bin/facet-covid.mjs +8 -0
  31. package/bin/facet-curve.mjs +27 -0
  32. package/bin/facet-embedding-train.mjs +20 -0
  33. package/bin/facet-embedding-validate.mjs +83 -0
  34. package/bin/facet-eval-roleplay.mjs +42 -0
  35. package/bin/facet-eval.mjs +38 -0
  36. package/bin/facet-fold.mjs +31 -0
  37. package/bin/facet-load.mjs +16 -0
  38. package/bin/facet-mlp-scan.mjs +45 -0
  39. package/bin/facet-mvp.mjs +34 -0
  40. package/bin/facet-online-experiments.mjs +78 -0
  41. package/bin/facet-online-race.mjs +99 -0
  42. package/bin/facet-online-validate.mjs +51 -0
  43. package/bin/facet-panel.mjs +22 -0
  44. package/bin/facet-passage.mjs +41 -0
  45. package/bin/facet-random-validate.mjs +48 -0
  46. package/bin/facet-roleplay.mjs +33 -0
  47. package/bin/facet-scan.mjs +56 -0
  48. package/bin/facet-segment.mjs +34 -0
  49. package/bin/facet-train.mjs +19 -0
  50. package/bin/facet-validate.mjs +103 -0
  51. package/bin/facet-zeroshot.mjs +14 -0
  52. package/bin/install-templates.mjs +72 -0
  53. package/bin/memory-bench.mjs +53 -0
  54. package/bin/memory-build-summary.mjs +43 -0
  55. package/bin/memory-build-vector.mjs +31 -0
  56. package/bin/memory-build.mjs +41 -0
  57. package/bin/memory-calibration.mjs +70 -0
  58. package/bin/memory-closed-loop.mjs +119 -0
  59. package/bin/memory-dry-run.mjs +70 -0
  60. package/bin/memory-eval.mjs +104 -0
  61. package/bin/memory-event-alias-test.mjs +89 -0
  62. package/bin/memory-extraction-bench.mjs +58 -0
  63. package/bin/memory-load-gate-replay.mjs +137 -0
  64. package/bin/memory-loop-test.mjs +90 -0
  65. package/bin/memory-pre-turn-harness.mjs +63 -0
  66. package/bin/memory-query.mjs +39 -0
  67. package/bin/memory-replay-hints.mjs +84 -0
  68. package/bin/memory-scale.mjs +58 -0
  69. package/bin/memory-scenario-test.mjs +146 -0
  70. package/bin/memory-user-loop.mjs +95 -0
  71. package/bin/ner_bench_tiny_zh.py +59 -0
  72. package/bin/ner_bench_zh.py +60 -0
  73. package/bin/ner_conll_en.py +139 -0
  74. package/bin/ner_direct_en.py +123 -0
  75. package/bin/ner_direct_zh.py +100 -0
  76. package/bin/ner_pipeline.py +208 -0
  77. package/bin/noise-selfcheck.mjs +50 -0
  78. package/bin/pack-integrity.mjs +47 -0
  79. package/bin/panel-check.mjs +57 -0
  80. package/bin/plugin-integrity.mjs +74 -0
  81. package/bin/preview-live.mjs +13 -0
  82. package/bin/public-install-check.mjs +222 -0
  83. package/bin/relabel-apply.mjs +272 -0
  84. package/bin/relabel-dry-run.mjs +381 -0
  85. package/bin/relik_pipeline.py +39 -0
  86. package/bin/relik_service.py +52 -0
  87. package/bin/srl_pipeline.py +55 -0
  88. package/bin/srl_service.py +68 -0
  89. package/bin/summary-index.mjs +151 -0
  90. package/bin/summary-query.mjs +79 -0
  91. package/bin/vec-check.mjs +27 -0
  92. package/bin/zh_ner_error_audit.py +36 -0
  93. package/bin/zh_ner_slot_eval.py +38 -0
  94. package/client.js +760 -0
  95. package/cordis.patch.yml +378 -0
  96. package/docs/API-NOTES.md +1743 -0
  97. package/docs/ARCHITECTURE.md +355 -0
  98. package/docs/CACHE.md +253 -0
  99. package/docs/CONDUCT.md +30 -0
  100. package/docs/CREATOR-HANDOFF.md +102 -0
  101. package/docs/EXPERIMENT.md +136 -0
  102. package/docs/FACET-MVP-REPORT.md +473 -0
  103. package/docs/GUIDE-0.4.66.md +195 -0
  104. package/docs/GUIDE.md +127 -0
  105. package/docs/MECHANISM.md +243 -0
  106. package/docs/NEW-INSTANCE-HANDOFF.md +219 -0
  107. package/docs/README.md +37 -0
  108. package/docs/SESSION-LAYOUT.md +151 -0
  109. package/docs/history-map.md +249 -0
  110. package/docs/relabel-migration-wiring.md +366 -0
  111. package/guides/00-READ-FIRST.md +206 -0
  112. package/guides/01-INSTALL.md +207 -0
  113. package/guides/02-TABLES.md +225 -0
  114. package/guides/03-AUDIT.md +201 -0
  115. package/guides/04-REBUILD.md +306 -0
  116. package/guides/05-FIRST-RUN.md +191 -0
  117. package/guides/06-EMBEDDING.md +146 -0
  118. package/guides/07-PTC-AND-ASSETS.md +221 -0
  119. package/icon.svg +7 -0
  120. package/locale/en.json +6 -0
  121. package/locale/zh.json +6 -0
  122. package/models/README.md +13 -0
  123. package/models/Xenova/bge-small-zh-v1.5/config.json +31 -0
  124. package/models/Xenova/bge-small-zh-v1.5/onnx/model_quantized.onnx +0 -0
  125. package/models/Xenova/bge-small-zh-v1.5/tokenizer.json +21278 -0
  126. package/models/Xenova/bge-small-zh-v1.5/tokenizer_config.json +15 -0
  127. package/package.json +139 -4
  128. package/src/asset-tool.mjs +237 -0
  129. package/src/assets.mjs +244 -0
  130. package/src/backfill.mjs +74 -0
  131. package/src/backup.mjs +80 -0
  132. package/src/deadend.mjs +95 -0
  133. package/src/deleted-store.mjs +35 -0
  134. package/src/engine.mjs +3831 -0
  135. package/src/facets/classifier.mjs +146 -0
  136. package/src/facets/embedding-service.mjs +53 -0
  137. package/src/facets/embedding-worker.mjs +27 -0
  138. package/src/facets/embedding.mjs +163 -0
  139. package/src/facets/extract.mjs +80 -0
  140. package/src/facets/fold-plan.mjs +84 -0
  141. package/src/facets/hybrid.mjs +29 -0
  142. package/src/facets/index.mjs +113 -0
  143. package/src/facets/linear-probe.mjs +43 -0
  144. package/src/facets/load.mjs +37 -0
  145. package/src/facets/mlp-probe.mjs +54 -0
  146. package/src/facets/mlp-service.mjs +53 -0
  147. package/src/facets/mlp-worker.mjs +26 -0
  148. package/src/facets/online-knn.mjs +58 -0
  149. package/src/facets/online-models.mjs +227 -0
  150. package/src/facets/panel-state.mjs +23 -0
  151. package/src/facets/panel.mjs +73 -0
  152. package/src/facets/random.mjs +26 -0
  153. package/src/facets/scanner.mjs +35 -0
  154. package/src/facets/schema.mjs +75 -0
  155. package/src/facets/seed-examples.mjs +58 -0
  156. package/src/facets/sensitivity.mjs +98 -0
  157. package/src/facets/service.mjs +53 -0
  158. package/src/facets/store.mjs +39 -0
  159. package/src/facets/worker.mjs +23 -0
  160. package/src/folds-store.mjs +109 -0
  161. package/src/groups.mjs +167 -0
  162. package/src/handoff-tool.mjs +51 -0
  163. package/src/handoff.mjs +127 -0
  164. package/src/index.mjs +649 -0
  165. package/src/inject-policy.mjs +17 -0
  166. package/src/learning.mjs +88 -0
  167. package/src/memory/alias-proposal.mjs +40 -0
  168. package/src/memory/bc-audit.mjs +245 -0
  169. package/src/memory/bc-index-updater.mjs +404 -0
  170. package/src/memory/bc-index.mjs +48 -0
  171. package/src/memory/bc-label.mjs +220 -0
  172. package/src/memory/bc-panel-state.mjs +107 -0
  173. package/src/memory/bc-pre-step.mjs +463 -0
  174. package/src/memory/bc-recall.mjs +470 -0
  175. package/src/memory/bc-shift.mjs +123 -0
  176. package/src/memory/bc-store.mjs +41 -0
  177. package/src/memory/bm25.mjs +112 -0
  178. package/src/memory/calibration.mjs +54 -0
  179. package/src/memory/chatter.mjs +29 -0
  180. package/src/memory/cmap-file.mjs +107 -0
  181. package/src/memory/concepts-file.mjs +41 -0
  182. package/src/memory/coref-slots.mjs +40 -0
  183. package/src/memory/event-alias-ledger.mjs +87 -0
  184. package/src/memory/event-log.mjs +95 -0
  185. package/src/memory/event-model.mjs +132 -0
  186. package/src/memory/event-segmenter.mjs +36 -0
  187. package/src/memory/event-summary-tree.mjs +122 -0
  188. package/src/memory/extraction-adapter.mjs +76 -0
  189. package/src/memory/extraction-composite.mjs +75 -0
  190. package/src/memory/extraction-core.mjs +76 -0
  191. package/src/memory/extraction-pre-step.mjs +161 -0
  192. package/src/memory/extraction-provider.mjs +300 -0
  193. package/src/memory/extraction-score.mjs +36 -0
  194. package/src/memory/facet-stabilizer.mjs +59 -0
  195. package/src/memory/history-map.mjs +139 -0
  196. package/src/memory/language-router.mjs +30 -0
  197. package/src/memory/load-gate.mjs +161 -0
  198. package/src/memory/mechanical-note.mjs +104 -0
  199. package/src/memory/onboarding.mjs +163 -0
  200. package/src/memory/persona.mjs +78 -0
  201. package/src/memory/planner.mjs +249 -0
  202. package/src/memory/pre-turn.mjs +80 -0
  203. package/src/memory/query-aliases.mjs +39 -0
  204. package/src/memory/recall-cue.mjs +43 -0
  205. package/src/memory/recall.mjs +65 -0
  206. package/src/memory/referent-candidates.mjs +55 -0
  207. package/src/memory/referent-ledger.mjs +86 -0
  208. package/src/memory/relabel-migrate.mjs +376 -0
  209. package/src/memory/relik-adapter.mjs +25 -0
  210. package/src/memory/special-keywords.mjs +60 -0
  211. package/src/memory/structured-adapters.mjs +75 -0
  212. package/src/memory/summary-index.mjs +335 -0
  213. package/src/memory/summary-tree.mjs +110 -0
  214. package/src/memory/term-extractor.mjs +44 -0
  215. package/src/memory/tokenize.mjs +9 -0
  216. package/src/memory/vector-index.mjs +54 -0
  217. package/src/memory/window-summary.mjs +133 -0
  218. package/src/mood.mjs +133 -0
  219. package/src/peer-tool.mjs +63 -0
  220. package/src/peer.mjs +144 -0
  221. package/src/policy.mjs +170 -0
  222. package/src/preflight.mjs +113 -0
  223. package/src/provenance.mjs +94 -0
  224. package/src/range.mjs +75 -0
  225. package/src/recall-exact-tool.mjs +267 -0
  226. package/src/recall-tool.mjs +521 -0
  227. package/src/recheck.mjs +99 -0
  228. package/src/save-start.mjs +29 -0
  229. package/src/session-guard.mjs +140 -0
  230. package/src/session-log-tool.mjs +322 -0
  231. package/src/session-log.mjs +606 -0
  232. package/src/skills.mjs +111 -0
  233. package/src/split-range.mjs +115 -0
  234. package/src/state.mjs +198 -0
  235. package/src/t0.mjs +149 -0
  236. package/src/tag-confirm.mjs +78 -0
  237. package/src/tag-detect.mjs +42 -0
  238. package/src/tag-maintenance.mjs +285 -0
  239. package/src/tag-reject.mjs +73 -0
  240. package/src/tags-store.mjs +94 -0
  241. package/src/tags.mjs +692 -0
  242. package/src/threads-backend.mjs +26 -0
  243. package/src/threads-core.mjs +1887 -0
  244. package/src/threads-store.mjs +207 -0
  245. package/src/threads-tool.mjs +522 -0
  246. package/src/threads.mjs +929 -0
  247. package/src/tool-preview.mjs +427 -0
  248. package/src/topic.mjs +63 -0
  249. package/src/training.mjs +75 -0
  250. package/src/turn-tag.mjs +62 -0
  251. package/src/user-turn.mjs +39 -0
  252. package/templates/cmap.md +11 -0
  253. package/templates/concepts.md +12 -0
  254. package/templates/habits.md +40 -0
  255. package/templates/keywords.md +6 -0
  256. package/templates/rebuild.md +134 -0
  257. package/templates/rules-safe.md +184 -0
  258. package/templates/rules.md +177 -0
@@ -0,0 +1,207 @@
1
+ # 01 — 安装
2
+
3
+ ## 1. 先理解“安装”到底装了什么
4
+
5
+ 这个包不是装完就自动有一份完整记忆。
6
+
7
+ 它装进去的是三层东西:
8
+
9
+ ```text
10
+ 宿主行:提供面板、路由、按 session 调度
11
+ preset:提供压缩引擎、recall、session_log
12
+ client:提供左侧“连续性”面板和右侧 A/B/C/K tab
13
+ ```
14
+
15
+ 三者缺一个,你看到的现象都不一样。
16
+
17
+ **比如这种情况:**
18
+
19
+ ```text
20
+ 如果宿主行装了,但 client 没加载,
21
+ 则后台在写索引,你却看不到“连续性”入口。
22
+ ```
23
+
24
+ ```text
25
+ 如果 client 在,但 preset 不是 continuity,
26
+ 则面板可能有,但没有 band 引擎和原生 recall/session_log。
27
+ ```
28
+
29
+ 所以先不要用“有没有表”判断安装成功。
30
+
31
+ ## 2. 安装
32
+
33
+ 把 tgz 装进目标 DSH profile,备份 `~/.dsh/continuity`,然后重启 DSH。
34
+
35
+ ```text
36
+ dsh-continuity-4.11.36.tgz
37
+ ```
38
+
39
+ 为什么必须重启?
40
+
41
+ 因为插件在 DSH 启动时挂载。
42
+ 只把 tgz 放进目录、不重启,等于把书放上书架但没翻开。
43
+
44
+ **比如这种情况:**
45
+
46
+ ```text
47
+ 如果装完没有重启,
48
+ 则新代码没进进程,面板可能还是旧版本,或者根本没有。
49
+ ```
50
+
51
+ 重启后确认版本:
52
+
53
+ ```text
54
+ dsh-continuity 4.11.36
55
+ ```
56
+
57
+ ## 3. 第一次 pre-step 会做什么
58
+
59
+ 某个 session 第一次经过 pre-step 时,它会:
60
+
61
+ ```text
62
+ 1. 解析当前 session id
63
+ 2. 检查 persona 是否启用
64
+ 3. 创建缺失的 session 空壳:
65
+ concepts.md
66
+ cmap.md
67
+ keywords.md
68
+ aliases.md
69
+ rebuild.md
70
+ 4. 从 templates/rules.md 种 rules.md
71
+ 5. 从 templates/habits.md 种 habits.md
72
+ 6. 第一次索引时创建 bc-index.jsonl
73
+ ```
74
+
75
+ 它只创建缺失文件,不覆盖已有表。
76
+
77
+ **比如这种情况:**
78
+
79
+ ```text
80
+ 如果 concepts.md 已经存在,
81
+ 则它不会用模板覆盖,哪怕模板更新了。
82
+ ```
83
+
84
+ 这就是为什么“升级插件”不等于“旧 session 的规则会自动变新”。
85
+
86
+ ## 4. 新 session 为什么是空表
87
+
88
+ 新 session 的:
89
+
90
+ ```text
91
+ A 空
92
+ C 空
93
+ K 空
94
+ ```
95
+
96
+ 这是正常的。
97
+
98
+ A 空会进一步导致:
99
+
100
+ ```text
101
+ B 空
102
+ 审计跳过
103
+ ```
104
+
105
+ **比如这种情况:**
106
+
107
+ ```text
108
+ 如果新 session 刚聊 3 轮,A 表空、B 空,
109
+ 则不是插件没工作,而是还没有人给 A 写第一条。
110
+ ```
111
+
112
+ 如果你希望它一开始就有概念,需要显式:
113
+
114
+ ```text
115
+ 写 concepts.md
116
+ 或从历史 rebuild
117
+ ```
118
+
119
+ 不要从别的 session 复制 A 表。
120
+
121
+ ## 5. 有历史、但没有表怎么办
122
+
123
+ 如果 session 已经聊了很长,A/B/C/K 还是空:
124
+
125
+ ```text
126
+ 不要从当前 live turn 开始补
127
+ ```
128
+
129
+ 先读 `04-REBUILD.md`。
130
+
131
+ **比如这种情况:**
132
+
133
+ ```text
134
+ 如果 session 已经有 500 轮,A 仍然是空,
135
+ 则从第 501 轮开始正常聊,也不会自动补出前 500 轮的 B。
136
+ ```
137
+
138
+ 历史需要显式重建。
139
+
140
+ ## 6. preset 检查
141
+
142
+ ```text
143
+ continuity preset:
144
+ band 引擎
145
+ 原生 recall
146
+ 原生 session_log
147
+
148
+ standard preset:
149
+ 原生 compaction-basic 80%
150
+ 没有 band 引擎
151
+ 没有原生 recall/session_log
152
+ ```
153
+
154
+ 已启动的 session 不能切 preset。
155
+ `agentPresets.select()` 会返回:
156
+
157
+ ```text
158
+ agent-preset/locked
159
+ ```
160
+
161
+ **比如这种情况:**
162
+
163
+ ```text
164
+ 如果为了“省事”去改 session header 的 agentPreset,
165
+ 则 session 可能从列表里消失,而不是升级成 continuity。
166
+ ```
167
+
168
+ 不要改 header。要换 preset,新建 session。
169
+
170
+ ## 7. 重启后的自检
171
+
172
+ 按顺序看:
173
+
174
+ ```text
175
+ 1. 版本 = 4.11.36
176
+ 2. 左侧有“连续性”
177
+ 3. 右侧“更多工具”下有 A/B/C/K
178
+ 4. sessions/<id>/ 有基础文件
179
+ 5. rules.md / habits.md 在 session 目录
180
+ 6. 面板能打开
181
+ 7. 没有新的 gate-errors
182
+ ```
183
+
184
+ 如果第 2 条没有,先不要查表,查 client。
185
+
186
+ 如果第 2 条有、第 3 条没有,查宿主是否支持 `sidebarRight`。
187
+
188
+ 如果第 3 条有、表是空的,回到第 4 节:这是正常的空表。
189
+
190
+ ## 8. 一个最小验收
191
+
192
+ 对新 session:
193
+
194
+ ```text
195
+ 发一句话
196
+ 等一次 pre-step
197
+ 打开 A/B/C/K
198
+ 确认 B 覆盖当前 turn
199
+ ```
200
+
201
+ 如果 B 仍然是空:
202
+
203
+ ```text
204
+ 检查 A 表有没有内容
205
+ ```
206
+
207
+ 因为没有 A,就没有 B。
@@ -0,0 +1,225 @@
1
+ # 02 — A / B / C / K
2
+
3
+ 这四张表不是四个同义词。它们回答的是四个不同问题:
4
+
5
+ ```text
6
+ A:这个话题叫什么?
7
+ B:这一轮大概属于哪些 A?
8
+ C:用户说这个词时,指的是哪个 A?
9
+ K:这个精确名字是什么,不能被拆?
10
+ ```
11
+
12
+ 理解这个区别,比记住文件格式重要。
13
+
14
+ ## 1. A — 概念表
15
+
16
+ 文件:
17
+
18
+ ```text
19
+ sessions/<sessionId>/concepts.md
20
+ ```
21
+
22
+ 格式:
23
+
24
+ ```text
25
+ 名字 | 描述词 | 参考覆盖 | kind
26
+ ```
27
+
28
+ 例子:
29
+
30
+ ```text
31
+ 示例主题 | 项目、讨论、决定 | 12 | topic
32
+ 复盘流程 | 复盘、检查、收尾 | 5 | workflow
33
+ ```
34
+
35
+ A 的作用不是“直接回答问题”。
36
+
37
+ 它的作用是:
38
+
39
+ ```text
40
+ 给 B 提供候选概念
41
+ 给 C 提供映射目标
42
+ 给审计提供 topicMax
43
+ 给面板提供展示
44
+ ```
45
+
46
+ **比如这种情况:**
47
+
48
+ ```text
49
+ 如果 A 为空,
50
+ 则 B labeler 没有候选,B 一定为空。
51
+ ```
52
+
53
+ 这不是 B 坏了,是 B 的上游没有概念。
54
+
55
+ ### kind
56
+
57
+ ```text
58
+ topic 一个话题/领域
59
+ workflow 一个流程/做法
60
+ ```
61
+
62
+ 不确定时写 `topic`。
63
+
64
+ 不要为了凑数把“人名、道具、英文标识”塞进 A;那些通常属于 K。
65
+
66
+ ## 2. B — 每轮标签
67
+
68
+ B 不在单独的文件里。它写在:
69
+
70
+ ```text
71
+ sessions/<sessionId>/bc-index.jsonl
72
+ ```
73
+
74
+ 每轮记录里可能有:
75
+
76
+ ```text
77
+ genericTopic
78
+ genericWorkflow
79
+ topicScore
80
+ topicConfidence
81
+ conceptScores
82
+ labelVersion
83
+ ```
84
+
85
+ B 是“这一轮大概像哪个 A”,不是“这一轮就是那个话题”。
86
+
87
+ **比如这种情况:**
88
+
89
+ ```text
90
+ 如果一轮同时在聊 A 和 B 两个话题,
91
+ 则 B 可能只取分数最高的那个,另一个留在 conceptScores 里。
92
+ ```
93
+
94
+ 所以 B 不是事实,只是标签。
95
+
96
+ `weak` 也不等于“这轮没内容”,只表示标签置信度低。
97
+
98
+ ## 3. C — 用户词
99
+
100
+ 文件:
101
+
102
+ ```text
103
+ sessions/<sessionId>/cmap.md
104
+ ```
105
+
106
+ 格式:
107
+
108
+ ```text
109
+ 用户词 => B:概念 | K:关键词 | minB:1 | limit:20 | 摘要
110
+ ```
111
+
112
+ C 解决的是:
113
+
114
+ ```text
115
+ 用户说“那个事”,到底指哪个 A?
116
+ ```
117
+
118
+ 例子:
119
+
120
+ ```text
121
+ 换箍 => B:示例主题 | minB:1 | limit:20
122
+ ```
123
+
124
+ **比如这种情况:**
125
+
126
+ ```text
127
+ 如果用户一直说“换箍”,但 C 里没有这个映射,
128
+ 则 recall("换箍") 只能靠字面碰运气,不能稳定找到 A。
129
+ ```
130
+
131
+ C 是桥,不是概念本身。
132
+
133
+ ## 4. K — 精确名
134
+
135
+ 文件:
136
+
137
+ ```text
138
+ sessions/<sessionId>/keywords.md
139
+ ```
140
+
141
+ 一行一个名字。
142
+
143
+ 适合:
144
+
145
+ ```text
146
+ 项目名
147
+ 产品名
148
+ 人名
149
+ 代码标识符
150
+ 游戏名
151
+ 不能拆的专名
152
+ ```
153
+
154
+ 不适合:
155
+
156
+ ```text
157
+ 普通动词
158
+ 泛词
159
+ “那个”“之前”
160
+ ```
161
+
162
+ **比如这种情况:**
163
+
164
+ ```text
165
+ 如果把“昨天”写进 K,
166
+ 则每次出现“昨天”都可能被当成一个精确锚,反而噪声很大。
167
+ ```
168
+
169
+ ## 5. 别名
170
+
171
+ 文件:
172
+
173
+ ```text
174
+ sessions/<sessionId>/aliases.md
175
+ ```
176
+
177
+ 只放跨语言/跨写法标识符:
178
+
179
+ ```text
180
+ 短信息 => sms
181
+ ```
182
+
183
+ 不要放同义词。同义词属于 C。
184
+
185
+ ## 6. 空表是合法的
186
+
187
+ 新 session:
188
+
189
+ ```text
190
+ A 空
191
+ C 空
192
+ K 空
193
+ B 空
194
+ ```
195
+
196
+ 这不是错误。
197
+
198
+ **比如这种情况:**
199
+
200
+ ```text
201
+ 如果新 session 刚建立,A 空、B 空,
202
+ 则先聊,等有稳定话题再写 A;
203
+ 不要为了“看起来有东西”复制别人的表。
204
+ ```
205
+
206
+ ## 7. 加表之前先问三个问题
207
+
208
+ ```text
209
+ 1. 这个词是话题(A)、用户词(C)、还是精确名(K)?
210
+ 2. 它真的稳定出现吗,还是一次性说法?
211
+ 3. 加错之后能不能删掉/改回?
212
+ ```
213
+
214
+ 如果三个问题答不清,先不要加。
215
+
216
+ ## 8. 最小维护顺序
217
+
218
+ ```text
219
+ 先有稳定话题 -> 写 A
220
+ 再为常用说法 -> 写 C
221
+ 精确专名 -> 写 K
222
+ 最后才让 B 去用这些表打分
223
+ ```
224
+
225
+ 反过来做,通常会得到一堆看起来有表、但查不回来的数据。
@@ -0,0 +1,201 @@
1
+ # 03 — 自动审计
2
+
3
+ ## 1. 审计不是“自动整理记忆”
4
+
5
+ 它不是每隔 200 轮就把对话总结成一张新 A 表。
6
+
7
+ 它做的是:
8
+
9
+ ```text
10
+ 在当前 index 里找一些可能值得看的话题簇
11
+ 把它们作为候选提示交给你
12
+ ```
13
+
14
+ 写不写 A,仍然由这个 session 自己决定。
15
+
16
+ **比如这种情况:**
17
+
18
+ ```text
19
+ 如果审计提示了一个候选,但实例直接忽略,
20
+ 则什么都不会改变,A 表不会自己长。
21
+ ```
22
+
23
+ ## 2. 为什么是 200 轮
24
+
25
+ 200 轮是一个折中:
26
+
27
+ ```text
28
+ 太短:话题还没稳定,候选全是噪声
29
+ 太长:发现得太晚,前面已经散掉
30
+ ```
31
+
32
+ 所以默认:
33
+
34
+ ```text
35
+ 每 200 轮最多触发一次
36
+ ```
37
+
38
+ 不是每轮都检查,也不是永不检查。
39
+
40
+ **比如这种情况:**
41
+
42
+ ```text
43
+ 如果 session 只有 50 轮,
44
+ 则还没到第一次审计的阈值,不应该期待 [continuity:audit]。
45
+ ```
46
+
47
+ ## 3. 审计读什么
48
+
49
+ 它读的是已经存在的索引:
50
+
51
+ ```text
52
+ bc-index.jsonl 的 vec
53
+ bc-index.jsonl 的 chatter
54
+ bc-index.jsonl 的 keywords
55
+ bc-index.jsonl 的 conceptScores
56
+ ```
57
+
58
+ 它不重读全部原文。
59
+
60
+ 所以:
61
+
62
+ ```text
63
+ 如果旧记录没有 vec
64
+ 则审计可能无法正常做聚类
65
+ ```
66
+
67
+ 这也是为什么重建流程里有“补 vec”这一步。
68
+
69
+ ## 4. 候选怎么来的
70
+
71
+ 大致是:
72
+
73
+ ```text
74
+ 把带 vec 的记录做聚类
75
+ 簇大小至少 10
76
+ 算簇内最高概念分的平均值 topicMax
77
+ topicMax < 0.5 才算候选
78
+ 按 topicMax 升序,最多 5 条
79
+ ```
80
+
81
+ 直觉:
82
+
83
+ ```text
84
+ 一个簇如果和已有 A 都不太像,
85
+ 它可能是“还没被命名的新话题”
86
+ ```
87
+
88
+ **比如这种情况:**
89
+
90
+ ```text
91
+ 如果 A 表本身是空的,
92
+ 则没有概念可以算 topicMax,
93
+ 审计会直接跳过。
94
+ ```
95
+
96
+ 这就是 500 轮没有审计提示的常见原因。
97
+
98
+ ## 5. 审计结果放在哪
99
+
100
+ ```text
101
+ sessions/<id>/expand-hint.jsonl 候选记录
102
+ sessions/<id>/expand-hint.pending.json 下一轮要注入的文本
103
+ sessions/<id>/audit-state.json 上次审计轮次/运行状态
104
+ ```
105
+
106
+ 下一轮 pre-step 会把 pending 注入成:
107
+
108
+ ```text
109
+ [continuity:audit]
110
+ ```
111
+
112
+ 只有真的以 `role=user` 出现,才算送达。
113
+
114
+ **比如这种情况:**
115
+
116
+ ```text
117
+ 如果 pending 写入了,但承载消息被折叠掉,
118
+ 则实例可能根本没看到这次审计。
119
+ ```
120
+
121
+ ## 6. 审计和 A 的关系
122
+
123
+ 顺序是:
124
+
125
+ ```text
126
+ A 非空 -> 审计有东西可算 -> 可能产生候选
127
+ A 空 -> 审计跳过
128
+ ```
129
+
130
+ **比如这种情况:**
131
+
132
+ ```text
133
+ 如果 A 空,B 也空,审计也不来,
134
+ 则不是三个功能同时坏了;
135
+ 根因只有一个:A 没有建立。
136
+ ```
137
+
138
+ ## 7. 你看到审计时应该做什么
139
+
140
+ 先看:
141
+
142
+ ```text
143
+ turn 范围
144
+ size
145
+ topicMax
146
+ chatter
147
+ kw
148
+ ```
149
+
150
+ 然后:
151
+
152
+ ```text
153
+ 多数叙事簇是噪声 -> 跳过
154
+ 确实是稳定话题 -> 才写一条 A
155
+ 不确定 -> 不写
156
+ ```
157
+
158
+ 不要因为“审计来了”就必须加表。
159
+
160
+ ## 8. 审计不替代 rebuild
161
+
162
+ 审计是增量提示。
163
+
164
+ 如果历史已经有 500 轮,A 还是空:
165
+
166
+ ```text
167
+ 审计不会替你补前 500 轮
168
+ ```
169
+
170
+ 这种情况应该走 `04-REBUILD.md`。
171
+
172
+ **比如这种情况:**
173
+
174
+ ```text
175
+ 如果 500 轮都空着,只等下一次审计,
176
+ 则即使下一次审计来了,也只能看到最近的簇,
177
+ 前面的历史仍然没有 A/B。
178
+ ```
179
+
180
+ ## 9. vec 为空
181
+
182
+ 如果 A/B/C/K 有,但 vec 为空,审计同样跑不起来。
183
+ 见 `06-EMBEDDING.md`。
184
+
185
+ ## 10. fold 验收(K-04)
186
+
187
+ 折后瞬时值只是 provisional,不能用来验收。判据只用下一次正常 pre-step 的稳定值:
188
+
189
+ ```text
190
+ 稳定 est ≈ low×W (±3%) → 达成
191
+ 稳定 est < low×W − 3% → overshoot
192
+ 稳定 est > low×W + 3% 且 protectBinds → 保护咬合
193
+ ```
194
+
195
+ `protectBinds` 用触发时的 `preBaseline` 算:
196
+
197
+ ```text
198
+ floor = preBaseline + protect × W
199
+ ```
200
+
201
+ 实际减少量可以大于 `budget`,因为 budget 只按被折的 surface 计价,关联的 non-surface 前缀会一并被带走。