@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,219 @@
1
+ # Continuity 4.11.36 — 新实例交接
2
+
3
+ > 给下一个实例。你接手的是当前 session 的目录、规则和词表,不是另一个
4
+ > session 的记忆。先读这份,再读当前 session 的 `rules.md` / `habits.md`。
5
+
6
+ ## 1. 版本与边界
7
+
8
+ ```text
9
+ dsh-continuity 4.11.36
10
+ 安全模式:pointersOnly;peer 保留
11
+ 不包含:额外的提示词分类、自动标注或工作线注入。
12
+ ```
13
+
14
+ 它做:
15
+
16
+ ```text
17
+ band 压缩 + [gist] 指针
18
+ 每个 session 自己的 B 索引
19
+ 每个 session 自己的 A/C/K
20
+ 每个 session 自己的 rules/habits
21
+ recall(A/B/C/K + 字面)
22
+ 右侧面板 + peer_message
23
+ ```
24
+
25
+ ## 2. 每个 session 自己的全套
26
+
27
+ ```text
28
+ ~/.dsh/continuity/sessions/<sessionId>/
29
+ bc-index.jsonl
30
+ audit-state.json
31
+ expand-hint.jsonl
32
+ concepts.md
33
+ cmap.md
34
+ keywords.md
35
+ aliases.md
36
+ rules.md
37
+ habits.md
38
+ rebuild.md
39
+ ```
40
+
41
+ 新 session:
42
+
43
+ ```text
44
+ A/C/K = 空
45
+ rules.md <- 插件 templates/rules.md
46
+ habits.md <- 插件 templates/habits.md
47
+ ```
48
+
49
+ 不继承另一个 session 的 A/C/K 或 rules/habits。
50
+
51
+ persona 只是身份/启用开关:
52
+
53
+ ```text
54
+ session-persona.json:
55
+ <sessionId> -> continuity | <pid>
56
+ default -> continuity
57
+
58
+ personas/<pid>/persona.json:
59
+ {"enabled": true}
60
+ ```
61
+
62
+ `continuity` 没文件也默认启用;disabled persona 会被 pre-step 跳过,面板
63
+ 返回 `persona-disabled`。
64
+
65
+ ## 3. 当前文件
66
+
67
+ ```text
68
+ sessions/<id>/bc-index.jsonl
69
+ sessions/<id>/audit-state.json
70
+ sessions/<id>/expand-hint.jsonl
71
+ sessions/<id>/concepts.md
72
+ sessions/<id>/cmap.md
73
+ sessions/<id>/keywords.md
74
+ sessions/<id>/aliases.md
75
+ sessions/<id>/rules.md
76
+ sessions/<id>/habits.md
77
+ sessions/<id>/dropped-ranges.json
78
+
79
+ ~/.dsh/continuity/
80
+ session-persona.json
81
+ personas/<pid>/persona.json
82
+ folds.json
83
+ passes.jsonl
84
+ context-log.jsonl
85
+ ```
86
+
87
+ ## 4. 检索
88
+
89
+ ```text
90
+ recall()
91
+ recall({ query: "跑团", recent: true })
92
+ recall({ query: "A标签" }) // 当前 session 的 topic
93
+ recall({ query: "A标签:workflow" }) // 当前 session 的 workflow
94
+ recall({ query: "A标签:跑团叙事" }) // 任意 A 概念
95
+ recall({ query: "B标签" })
96
+ recall({ query: "C标签" })
97
+ recall({ query: "K标签" })
98
+ ```
99
+
100
+ - 索引和 A/C/K 只读当前 session。
101
+ - `via`:`A | B | C | K | live`。
102
+ - 候选不是事实,必须打开 turn/seq。
103
+
104
+ ## 5. 注入前缀
105
+
106
+ ```text
107
+ [continuity:boot] 引导
108
+ [continuity:audit] 审计
109
+ [continuity:fold] 折叠回执
110
+ ```
111
+
112
+ `[追忆]` 是 recall 的 tool result,不是 user 通道注入。
113
+
114
+ ## 6. 压缩与回执
115
+
116
+ ```text
117
+ high 0.60W 触发
118
+ low 0.40W 目标
119
+ protect 0.30W
120
+ 一次 pass 折一个最老连续区
121
+ budget 是上限,不是必然排干
122
+ ```
123
+
124
+ 可达下限:
125
+
126
+ ```text
127
+ floor(T) = (protect * W + baseline(T)) / W
128
+ ```
129
+
130
+ baseline 会变;当前值看最新 `context-log.jsonl`,历史 pass 用
131
+ `passes.jsonl` 的 `afterBaselineTokens`。不要把 52.7% 当固定值。
132
+
133
+ ## 7. 标签版本
134
+
135
+ ```text
136
+ v2(新轮):
137
+ genericTopic / topicScore / topicConfidence / genericWorkflow
138
+ labelVersion: 2
139
+ generic = topic ∪ workflow
140
+
141
+ v1(旧轮):
142
+ labelVersion: 1
143
+ 无 topicScore,不伪造
144
+ ```
145
+
146
+ `topicConfidence` 的 0.4/0.5 只是展示标签,不是写入阈值。
147
+
148
+ ## 8. 启动自检
149
+
150
+ ```text
151
+ 1. 当前 session 的 persona enabled
152
+ 2. sessions/<id>/bc-index.jsonl 存在
153
+ 3. bc.json?sessionId=<id> 返回 available
154
+ 4. A标签 -> 当前 session 自己的 topic
155
+ 5. C/K 查询只命中当前 session 自己的表
156
+ 6. 另一 session 的目录不被本 session 修改
157
+ 7. 没有新增 gate-errors
158
+ ```
159
+
160
+ ## 9. 规则层级
161
+
162
+ ```text
163
+ AGENTS.md 用户所有;实例不改
164
+ sessions/<id>/rules.md 当前 session 硬规则;可改
165
+ sessions/<id>/habits.md 当前 session 软偏好;可改
166
+ sessions/<id>/concepts.md|cmap.md|keywords.md|aliases.md 当前 session 数据
167
+ ```
168
+
169
+ `rules.md` 只能规定当前 session 的这些文件;不能授权改插件或别的 session。
170
+
171
+ ## 10. 保护
172
+
173
+ ```text
174
+ 不改 live profile 的 dsh-continuity 安装目录
175
+ 不改 cordis.patch.yml / package.json / lockfile / tgz
176
+ ```
177
+
178
+ 插件变更只能走:
179
+
180
+ ```text
181
+ 独立副本 -> 测试 -> 备份 -> 替换 -> 重启 -> 验证
182
+ ```
183
+
184
+ 工具层有 best-effort 路径守卫:session 只能碰自己的 `sessions/<id>/`。
185
+ 它不是 OS 安全边界;强隔离需要 ACL/容器。
186
+
187
+ ## 11. 常见故障
188
+
189
+ ```text
190
+ 没有 tab
191
+ -> personas/<pid>/persona.json 是否 enabled
192
+ -> bc.json 是否 persona-disabled
193
+
194
+ A标签 是 0
195
+ -> sessions/<id>/concepts.md 是否存在/为空
196
+ -> 第 4 列 kind 是否存在
197
+
198
+ recall 空
199
+ -> sessions/<id>/bc-index.jsonl 是否存在
200
+ -> C/K 是否在当前 session 目录
201
+
202
+ rules 没更新
203
+ -> 是否改的是当前 session 的 rules.md,而不是旧的全局文件
204
+
205
+ 另一 session 被改
206
+ -> 工具层守卫只能挡常规工具;检查 ACL
207
+ ```
208
+
209
+ ## 12. 原则
210
+
211
+ ```text
212
+ 每个 session 自己的全套。
213
+ 候选不是事实。
214
+ [gist] 不是原文。
215
+ A 默认只看 topic。
216
+ pass 回执 append-only。
217
+ 可达下限由 protect + baseline 现算。
218
+ 工具守卫不是 OS 安全边界。
219
+ ```
package/docs/README.md ADDED
@@ -0,0 +1,37 @@
1
+ # 文档索引
2
+
3
+ 现行文档:
4
+
5
+ ```text
6
+ SESSION-LAYOUT.md 权威路径、角色、权限(中文)
7
+ ARCHITECTURE.md 当前架构(英文技术附录)
8
+ NEW-INSTANCE-HANDOFF.md 新实例交接(英文技术附录)
9
+ ```
10
+
11
+ 经典说明书在包根/`guides/`:
12
+
13
+ ```text
14
+ 00-READ-FIRST.md
15
+ 01-INSTALL.md
16
+ 02-TABLES.md
17
+ 03-AUDIT.md
18
+ 04-REBUILD.md
19
+ 05-FIRST-RUN.md
20
+ ```
21
+
22
+ 历史/设计档案(保留来源;路径和行为可能属于旧版本):
23
+
24
+ ```text
25
+ API-NOTES.md
26
+ CACHE.md
27
+ CONDUCT.md
28
+ CREATOR-HANDOFF.md
29
+ EXPERIMENT.md
30
+ FACET-MVP-REPORT.md
31
+ GUIDE-0.4.66.md
32
+ GUIDE.md
33
+ MECHANISM.md
34
+ ```
35
+
36
+ 现行行为以 `SESSION-LAYOUT.md` 和 `ARCHITECTURE.md` 为准。
37
+ 历史文件不是操作说明。
@@ -0,0 +1,151 @@
1
+ # Session 布局与权限 — 4.9.102
2
+
3
+ 这是本包路径/权限的权威文档。若其他文档与它冲突,以本文为准。
4
+
5
+ ## 1. 一个 session,一套完整记忆
6
+
7
+ ```text
8
+ ~/.dsh/continuity/sessions/<sessionId>/
9
+ bc-index.jsonl B 指针索引,只属于这个 session
10
+ bc-index-state.json 索引游标
11
+ audit-state.json 审计游标
12
+ expand-hint.jsonl 待注入审计提示
13
+ concepts.md A: 名字 | 描述词 | 覆盖 | kind
14
+ cmap.md C: 用户词 -> 概念
15
+ keywords.md K: 精确名
16
+ aliases.md 别名
17
+ rules.md 硬规则,从 templates/rules.md 起
18
+ habits.md 软偏好,从 templates/habits.md 起
19
+ rebuild.md 本地重建说明
20
+ turns.jsonl 可选,relabel 用
21
+ dropped-ranges.json 本 session 的合并覆盖(只属于本 session)
22
+ ```
23
+
24
+ 以上全部是 session-local。任何 session 都不读另一个 session 的 A/C/K、
25
+ rules、habits、index、审计、提示或 dropped-ranges。
26
+
27
+ 新 session:
28
+
29
+ ```text
30
+ A/C/K 空
31
+ rules.md <- templates/rules.md
32
+ habits.md <- templates/habits.md
33
+ rebuild.md <- 空壳
34
+ index <- 第一次 pre-step
35
+ ```
36
+
37
+ ## 2. 共享文件
38
+
39
+ ```text
40
+ ~/.dsh/continuity/
41
+ session-persona.json sessionId -> 身份
42
+ personas/<pid>/persona.json {"enabled": true|false}
43
+ folds.json 全局折叠历史
44
+ passes.jsonl 全局 pass 回执
45
+ context-log.jsonl 上下文测量
46
+ handoff-pending.json 交接标记
47
+ ```
48
+
49
+ `session-persona.json` 只解析身份,不选择词表路径。
50
+ `persona.json` 只是启用开关。
51
+
52
+ `personas/<pid>/concepts.md|cmap.md|keywords.md|aliases.md` 是**弃用归档**,
53
+ 不是读取路径。
54
+
55
+ ## 3. 权限
56
+
57
+ ### 内部引擎
58
+
59
+ continuity preset 挂载的引擎可以读写:
60
+
61
+ ```text
62
+ 自己的 session 目录(含 dropped-ranges.json)
63
+ folds.json / passes.jsonl / context-log.jsonl
64
+ ```
65
+
66
+ 这是宿主代码,不是模型工具。
67
+
68
+ ### 模型工具
69
+
70
+ 普通工具调用可以碰:
71
+
72
+ ```text
73
+ workspace 文件
74
+ 自己的 sessions/<sessionId>/ 目录
75
+ ```
76
+
77
+ 不能碰:
78
+
79
+ ```text
80
+ 另一个 session 的 sessions/<other>/
81
+ personas/
82
+ session-persona.json
83
+ folds.json / passes.jsonl
84
+ continuity 根目录的 rules.md / habits.md
85
+ ```
86
+
87
+ 守卫在 `src/session-guard.mjs`。它只检查带路径的参数,不扫描完整消息/文件
88
+ 正文;`send_message`、`peer_message`、`present` 不受影响。
89
+
90
+ 守卫是 **best effort**,不是 OS ACL。任意有完整文件权限的代码可以绕过;
91
+ 强隔离需要 OS ACL/容器。
92
+
93
+ ### 禁用的 persona
94
+
95
+ 禁用的 persona:
96
+
97
+ ```text
98
+ 面板:persona-disabled
99
+ pre-step:跳过
100
+ 普通 workspace 工具:仍可用
101
+ continuity 路径:拒绝
102
+ ```
103
+
104
+ ## 4. Preset
105
+
106
+ | session | 自己的一套 | 原生工具 |
107
+ |---|---|---|
108
+ | continuity preset | A/B/C/K/rules/habits/index | `recall`、`session_log`、band 引擎 |
109
+ | standard preset | A/B/C/K/rules/habits/index | 没有原生 recall/session_log;原生 compaction-basic 80% |
110
+ | 禁用 persona | 不启用 | 只有 workspace 工具 |
111
+
112
+ standard session 仍有面板和自己的文件,但没有 continuity band 引擎和原生
113
+ recall/session_log。
114
+
115
+ preset 在第一个 turn 后固定。`agentPresets.select` 对已启动 session 返回
116
+ `agent-preset/locked`。改 session header 不是受支持的迁移路径。
117
+
118
+ ## 5. 不变量
119
+
120
+ ```text
121
+ 一个 session 拥有完整一套。
122
+ 不继承词表/规则/习惯。
123
+ 任何 session 不得修改另一个 session 的 continuity 文件。
124
+ `personas/` 已弃用。
125
+ 全局 folds/passes 归引擎,不由模型编辑。
126
+ 候选不是事实;必须打开 turn/seq。
127
+ [gist] 是重建,不是原文。
128
+ ```
129
+
130
+ ## 维护者访问(operator)
131
+
132
+ 默认没有跨 session 访问。需要人工维护另一个 session 时,在
133
+ `~/.dsh/continuity/operator-sessions.json` 写一个显式 session id 数组:
134
+
135
+ ```json
136
+ ["session-..."]
137
+ ```
138
+
139
+ `session-guard` 只对这份清单里的 session 放行;清单为空或不存在时,仍按
140
+ persona + 本 session 的规则拦截。这个文件是维护入口,不是日常权限。
141
+ ## 根级身份/诊断文件
142
+
143
+ `read` 工具可以读取这三个根级文件(只读):
144
+
145
+ ```text
146
+ ~/.dsh/continuity/session-persona.json
147
+ ~/.dsh/continuity/operator-sessions.json
148
+ ~/.dsh/continuity/context-log.jsonl
149
+ ```
150
+
151
+ 写入仍被拦;shell 命令里的路径也仍被拦。用 `read`,不要用 `Get-Content`。
@@ -0,0 +1,249 @@
1
+ # History map 的既定行为
2
+
3
+ > 2026-11-06。适用于 `dsh-continuity` 的 active history-map。
4
+ >
5
+ > 这不是“可调度摘要”:它必须自动进 surface。否则它跟一份文件没有区别。
6
+
7
+ ## 1. 位置
8
+
9
+ ```text
10
+ system/message
11
+ [continuity:history-map] ← system 之后第一条
12
+ ...
13
+ retained original tail
14
+ ```
15
+
16
+ `ensureHistoryMap` 用:
17
+
18
+ ```text
19
+ surfaceOp: { op:'replace', startSeq, endSeq }
20
+ sourceEventSeqs: [...] // 顶层字段,不在 surfaceOp 里
21
+ ```
22
+
23
+ 把最前面的一段替换成 map。
24
+
25
+ 不是 append 到尾部。
26
+ append 只能加在末尾,不能构成“摘要 + 原文”的顺序。
27
+
28
+ ## 2. 刷新条件
29
+
30
+ ```text
31
+ hash 不变 + carrier 在 surface -> 不动
32
+ hash 变(新 fold / excerpt 规则变)-> replace front 单节点刷新
33
+ carrier 不在 surface(被折叠/清除)-> 重新注入
34
+ ```
35
+
36
+ `history-map-probe.json` 每次 `ensureHistoryMap` 写一次,字段:
37
+
38
+ ```text
39
+ at / sessionId / nodeCount / frontSeq / frontIsCarrier
40
+ mapPath / mapPathExists / indexRecords / builtChars
41
+ range / reason / error / carrierSeq
42
+ startSeq / endSeq / seqCount / seqFirst / seqLast
43
+ ```
44
+
45
+ 常见 `reason`:
46
+
47
+ ```text
48
+ returned-front-carrier front 已是 map,hash 未变
49
+ updated-front-carrier front 已是 map,hash 变了并刷新
50
+ returned-no-index summaries/index.json 不存在
51
+ returned-no-range 找不到可替换区间(兜底应只换 front)
52
+ returned-dedup 进程内 bootstrap 记录命中(仅同进程热路径,非持久状态)
53
+ ok 首次 front replace 成功
54
+ error 读 index / build / replace 抛错
55
+ ```
56
+
57
+ `returned-dedup` 不能当作“已注入”的持久证据:进程重启后 Map 清空,它会重新走 front replace。
58
+
59
+ ### 模式
60
+
61
+ ```text
62
+ ~/.dsh/continuity/history-map-mode
63
+ off 完全不动作(默认)
64
+ observe 只写 probe,不注入 / 不 replace / 不 stub
65
+ auto 注入 + 自刷新(实验档)
66
+ ```
67
+
68
+ 默认 `off`:native checkpoint 是唯一小抄,fold 必写,位置由 native 保证。
69
+ history-map 不再作为默认中间层;`auto` 只保留为实验档。
70
+
71
+ `auto` 下 front 已是 `compact-checkpoint` 时 no-op,不再用 map 替换 native summary。
72
+ `observe` 下 `oldestRange` 不跳过 map,便于观察 native fold 是否把旧 map 折入。
73
+
74
+ ## 3. 显隐
75
+
76
+ ```text
77
+ surface 上:1 条 active map + 若干 map-stub
78
+ raw 里:历史 map / stub 事件都保留
79
+ ```
80
+
81
+ `map-stub` 用独立 marker:
82
+
83
+ ```text
84
+ [continuity:map-stub] (superseded)
85
+ ```
86
+
87
+ 原因:stub 也以 `[continuity:history-map]` 开头的话,会被 `findHistoryMapCarriers` 当成 carrier,
88
+ 导致每轮都误判 extras、重复注入。
89
+
90
+ stub 的 replace 也必须带顶层:
91
+
92
+ ```text
93
+ sourceEventSeqs: [seq]
94
+ ```
95
+
96
+ ## 4. cap 取舍
97
+
98
+ 顺序:
99
+
100
+ ```text
101
+ 位置
102
+ -> 最新区间(新 -> 旧)
103
+ -> 上次索引之后的 fold
104
+ -> 长期结构
105
+ -> 取原文
106
+ ```
107
+
108
+ 规则:
109
+
110
+ ```text
111
+ 单个区间 excerpt 上限:6,000 字(总 cap 内的分配,不是每段都保证 6,000)
112
+ 同一区间多条 record:toSeq 降序,再按正文长度降序;最多取 2 条并均分 excerpt
113
+ 超 cap:先丢最老区间,保最新区间
114
+ 长期结构最后才丢
115
+ ```
116
+
117
+ 当前 0b 实测:
118
+
119
+ ```text
120
+ 总长 12,587 字 ≈ 3,147 tokens(cap 4k)
121
+ 最近区间 83294-84075 6,012 字
122
+ 80911-81009 被 cap 丢掉(预期)
123
+ ```
124
+
125
+ ## 5. 信息边界
126
+
127
+ ```text
128
+ map 是索引,不是原文。
129
+ 细节以 raw / session_log 为准。
130
+ ```
131
+
132
+ `front replace` 会真的从 **surface** 移除旧文本。
133
+ raw 仍在 session log;这不是删除原文。
134
+
135
+ 既定代价:
136
+
137
+ ```text
138
+ surface 上的摘要可能比 raw 短;
139
+ map 替换 native checkpoint 后,surface 不再有那份 checkpoint 原文;
140
+ 需要原文时按 seq 回 session_log 取。
141
+ ```
142
+
143
+ 不要因为“surface 摘要比 raw 短”把它当成新 bug。
144
+
145
+ ## 6. bootstrap replace 与 archive
146
+
147
+ 成功 front replace 后,engine 写:
148
+
149
+ ```text
150
+ sessions/<id>/summaries/bootstrap-ranges.json
151
+ ```
152
+
153
+ summary-index 构建时读取这个侧车,把 bootstrap replace 的区间并入 coverage,
154
+ 避免重建 index 时把这段误判成 pending window。
155
+
156
+ 可核对的分叉信号:
157
+
158
+ ```text
159
+ pendingWindows 变大 = 分叉开始
160
+ 现在 pending 仍 0,所以尚未分叉
161
+ ```
162
+
163
+ 两个语义边界:
164
+
165
+ ```text
166
+ 1 boot 段是 covered-without-summary
167
+ 并入 coverage 后 pendingWindows 会被结构性压到 0,
168
+ 即使那段没有可读摘要文本。
169
+ pending 0 不等于“都有摘要”,只等于“有 surface 替代”。
170
+
171
+ 2 boot 段没有 release 语义
172
+ 如果 front map 被折叠/删除,sidecar 记录仍在,coverage 仍宣称覆盖。
173
+ 记录带 carrierSeq,但当前扫描不校验 carrier 是否还存在。
174
+ 以后要加:carrier 不在 surface 时把该段标 stale,不并入 coverage。
175
+ ```
176
+
177
+ 侧车形状:
178
+
179
+ ```text
180
+ { version:1, ranges:[{ fromSeq, toSeq, tokens, carrierSeq, at }] }
181
+ ```
182
+
183
+ ## 7. pending window 生成器
184
+
185
+ 当 `pendingWindows > 0`,可以显式生成抽取式 window summary:
186
+
187
+ ```bash
188
+ node bin/summary-index.mjs --raw <session.v4.jsonl.zstd> --session-dir <dir> \
189
+ --extract-pending --apply
190
+ ```
191
+
192
+ 行为:
193
+
194
+ ```text
195
+ 1 先建 base index,列出 pending
196
+ 2 对每个 pending 生成 300-800 tokens 的抽取式摘要
197
+ 3 写 summaries/windows/<from>-<to>.json
198
+ 4 用 windowRanges + windowRecords 重建 index
199
+ pending 归零;window 以 kind:'window-extractive'、quality:'extractive' 进入 records
200
+ ```
201
+
202
+ 抽取式内容是 fallback,不是 LLM 摘要;结构保留用户/助手/工具和 raw seq 指针。
203
+
204
+ 过滤掉的注入前缀:
205
+
206
+ ```text
207
+ [continuity:* / 追忆 / 抽取 / 工作线 / 标签 / 规则 / 规矩 / 习惯 / 技能 / 归位 / 候选 / 存? / 闸 / 回正 / 学习 / 记忆 / 创 / peer]
208
+ <system-reminder>
209
+ Current runtime context
210
+ Time sampled while preparing
211
+ ```
212
+
213
+ 2026-11-06 live 0b 第一次 apply 混入 `[规则]`(实际是 peer `[创]` 正文引用),已回滚;
214
+ 最终版本把 peer 保留为独立角色:
215
+
216
+ ```text
217
+ window-84076-88063
218
+ kind window-extractive / quality extractive
219
+ 2,205 字 / 552 tokens
220
+ ## 用户 只留真实用户
221
+ ## 同伴 [创] 内容,标 (peer) seq ...
222
+ ## 助手 只抽有正文的 assistant/message
223
+ standalone [规则] line = false
224
+ records 159 / pending 0 / windows 1
225
+ map preview 87FDA63E / 11,772 字 / 2,943 tokens
226
+ backup: backups/summary-index-window-20261106/index.json.before-assistant-sampling
227
+ ```
228
+
229
+ peer 内容不再过滤,也不会被归进「用户」。
230
+ assistant 采样只收 `textOf(event)` 非空的节点,避免 479 条里只抽到空段。
231
+
232
+ ## 8. 已知未完成
233
+
234
+ ```text
235
+ 1 window 生成器目前是抽取式 fallback,不是 LLM 摘要
236
+ 2 band / protect 未改;protect 仍是 0.20
237
+ ```
238
+
239
+ snapshot/summary 事件已按 `session.seq` 增量缓存;首轮全量,后续只读新增 seq。
240
+
241
+ ## 9. 修改前检查
242
+
243
+ ```text
244
+ 1 sourceEventSeqs 必须在 append options 顶层
245
+ 2 replace 端点用 surface 顺序,不要 min/max 归一化
246
+ 3 stub 必须带顶层 sourceEventSeqs
247
+ 4 cap 顺序不能反过来
248
+ 5 改完先看 history-map-probe.json 的 reason
249
+ ```