@jjh32456/dsh-longlive 1.6.7 → 1.8.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 (289) hide show
  1. package/CHANGELOG.md +70 -1508
  2. package/LICENSE +1 -1
  3. package/QUICKSTART.md +34 -13
  4. package/README.en.md +18 -7
  5. package/README.md +34 -9
  6. package/SPEC.md +5 -5
  7. package/cordis.patch.yml +23 -9
  8. package/docs/ANSWER-GUARD.md +92 -0
  9. package/docs/ARCHITECTURE.md +4 -3
  10. package/docs/AUTO-RECALL-WIRING.md +1 -1
  11. package/docs/AUTO-RECALL.md +15 -9
  12. package/docs/CONFIG.md +168 -35
  13. package/docs/ERRORS.md +17 -5
  14. package/docs/FAQ.md +7 -7
  15. package/docs/FEATURES.md +96 -28
  16. package/docs/MIGRATION-1.6.0.md +2 -2
  17. package/docs/OPERATIONS.md +6 -6
  18. package/docs/PANEL-INTEGRATION.md +6 -0
  19. package/docs/PRIVACY.md +88 -0
  20. package/docs/QUICKSTART.md +5 -5
  21. package/docs/README.en.md +4 -2
  22. package/docs/RESIDENT-WATCHER.md +1 -1
  23. package/docs/SESSION-WATCH.md +6 -6
  24. package/docs/TROUBLESHOOTING.md +4 -4
  25. package/package.json +47 -117
  26. package/runbook.md +2 -2
  27. package/scripts/backfill-auto-cards.mjs +98 -0
  28. package/scripts/install-surgery-task.ps1 +5 -2
  29. package/scripts/lib/session-watch-fixture.mjs +1 -1
  30. package/scripts/longlive-doctor.mjs +6 -0
  31. package/scripts/migrate-180.mjs +163 -0
  32. package/scripts/recall-index-build.mjs +128 -0
  33. package/scripts/session-watch-drill.mjs +1 -1
  34. package/scripts/surgery-run.cmd +1 -1
  35. package/scripts/unattended-surgery.ps1 +5 -2
  36. package/scripts/verify-card-anchors.mjs +138 -0
  37. package/src/actions/audit.js +125 -0
  38. package/src/actions/evidence.js +122 -0
  39. package/src/actions/fs.js +162 -0
  40. package/src/activity/index.js +760 -0
  41. package/src/activity/model.js +351 -0
  42. package/src/activity/store.js +644 -0
  43. package/src/activity/thinking.js +176 -0
  44. package/src/adapters/constants.js +11 -0
  45. package/src/adapters/engram/data/aliases.json +51 -0
  46. package/src/adapters/engram/data/policy.json +8 -0
  47. package/src/adapters/engram/data/routing-rules.json +546 -0
  48. package/src/adapters/engram/index.js +235 -0
  49. package/src/adapters/registry.js +315 -0
  50. package/src/answer/audit.js +193 -0
  51. package/src/answer/evidence.js +30 -0
  52. package/src/answer/guard.js +1370 -0
  53. package/src/answer/index.js +1067 -0
  54. package/src/answer/query.js +111 -0
  55. package/src/answer/second-hop.mjs +101 -0
  56. package/src/auto-truncate.js +1 -1
  57. package/src/config.js +171 -47
  58. package/src/deps.js +6 -4
  59. package/src/features.js +182 -6
  60. package/src/heartbeat.js +156 -23
  61. package/src/identity/handover.js +52 -1
  62. package/src/identity/index.js +13 -5
  63. package/src/identity/inject-position.js +2 -2
  64. package/src/index.js +97 -7
  65. package/src/lifecycle/gap-clocks.js +328 -0
  66. package/src/lifecycle/index.js +269 -0
  67. package/src/live.js +22 -2
  68. package/src/memory/activity-capture.js +229 -0
  69. package/src/memory/anchors.js +194 -0
  70. package/src/memory/audit-records.js +222 -0
  71. package/src/memory/auto-cards.js +401 -0
  72. package/src/memory/capture.js +442 -0
  73. package/src/memory/card-anchors.js +203 -0
  74. package/src/memory/conflicts.js +106 -0
  75. package/src/memory/decay.js +311 -0
  76. package/src/memory/distill.js +471 -0
  77. package/src/memory/event-index.js +917 -0
  78. package/src/memory/evidence-chain.js +295 -0
  79. package/src/memory/evidence.js +145 -0
  80. package/src/memory/filter-runner.js +1 -1
  81. package/src/memory/filter.js +5 -1
  82. package/src/memory/forget-v2.js +410 -0
  83. package/src/memory/forget.js +71 -0
  84. package/src/memory/frames-activation.js +247 -0
  85. package/src/memory/fts-query.js +174 -0
  86. package/src/memory/governance.js +604 -0
  87. package/src/memory/index.js +1 -0
  88. package/src/memory/l2-gate.js +169 -0
  89. package/src/memory/lock.js +121 -0
  90. package/src/memory/migrate.js +139 -0
  91. package/src/memory/recall-v2.js +223 -0
  92. package/src/memory/recall.js +65 -2
  93. package/src/memory/records.js +425 -0
  94. package/src/memory/retention.js +128 -0
  95. package/src/memory/review.js +124 -0
  96. package/src/memory/trust.js +88 -0
  97. package/src/memory/version-chain.js +264 -0
  98. package/src/memory/wal.js +137 -0
  99. package/src/memory/working-frame.js +516 -0
  100. package/src/metrics/classify.mjs +5 -3
  101. package/src/metrics/index.mjs +21 -1
  102. package/src/metrics/prestep-latency.mjs +300 -0
  103. package/src/metrics/store.mjs +25 -0
  104. package/src/policy-profile.js +18 -3
  105. package/src/recall/anaphora.mjs +87 -0
  106. package/src/recall/cards.mjs +7 -0
  107. package/src/recall/embedding.mjs +8 -8
  108. package/src/recall/entities.mjs +112 -0
  109. package/src/recall/index.js +235 -19
  110. package/src/recall/inject-order.mjs +10 -8
  111. package/src/recall/privacy.mjs +105 -16
  112. package/src/recall/recall-core.mjs +116 -10
  113. package/src/recall/shared-visibility.js +302 -0
  114. package/src/recall/time-normalizer.mjs +196 -0
  115. package/src/role/activation.js +191 -0
  116. package/src/role/attention.js +318 -0
  117. package/src/role/base.js +36 -0
  118. package/src/role/channels.js +423 -0
  119. package/src/role/index.js +425 -0
  120. package/src/role/interfaces.js +115 -0
  121. package/src/role/personality.js +370 -0
  122. package/src/role/readers.js +151 -0
  123. package/src/role/relationships.js +477 -0
  124. package/src/role/store.js +202 -0
  125. package/src/role/writeprotect.js +373 -0
  126. package/src/router/aliases.json +176 -25
  127. package/src/router/background/agent-runner.mjs +1 -1
  128. package/src/router/background/anchor.mjs +1 -1
  129. package/src/router/background/audit.mjs +2 -2
  130. package/src/router/background/budget-ledger.mjs +2 -2
  131. package/src/router/background/host-sim.mjs +1 -1
  132. package/src/router/background/memory.mjs +4 -4
  133. package/src/router/background/queue.mjs +1 -1
  134. package/src/router/background/retry.mjs +1 -1
  135. package/src/router/background/router.mjs +1 -1
  136. package/src/router/background/stream.mjs +1 -1
  137. package/src/router/background/tool-policy.mjs +1 -1
  138. package/src/router/design-headings.json +5 -5
  139. package/src/router/face/config.mjs +1 -1
  140. package/src/router/face/identity.mjs +3 -3
  141. package/src/router/judge.mjs +8 -7
  142. package/src/router/policies/generic.json +21 -4
  143. package/src/router/route.js +109 -22
  144. package/src/router/router.mjs +10 -6
  145. package/src/router/routing-rules.json +260 -445
  146. package/src/router/run-sim.mjs +8 -8
  147. package/src/router/runtime.js +23 -12
  148. package/src/router/service/board.mjs +95 -15
  149. package/src/router/service/config.mjs +5 -5
  150. package/src/router/service/context.mjs +1 -1
  151. package/src/router/service/hint.mjs +14 -0
  152. package/src/router/service/queue.mjs +1 -1
  153. package/src/router/service/service.mjs +27 -11
  154. package/src/router/shadow.mjs +4 -3
  155. package/src/surgery-recovery.js +2 -2
  156. package/src/tool-output.js +2 -2
  157. package/src/tools.js +39 -7
  158. package/src/truncate-visible.js +2 -2
  159. package/src/ui/actions.js +1312 -0
  160. package/src/ui/panel-api.js +367 -0
  161. package/src/ui/panel-auth.js +251 -0
  162. package/src/ui/panel-integrity.js +243 -0
  163. package/src/ui/routes-readonly.js +695 -0
  164. package/src/ui/routes.js +3 -0
  165. package/docs/DEV.md +0 -279
  166. package/docs/PRESENCE-BUS-WIRING.md +0 -491
  167. package/docs/PRESENCE-BUS.md +0 -694
  168. package/docs/SURGERY.md +0 -186
  169. package/scripts/mark-core-cards.mjs +0 -289
  170. package/scripts/pack.mjs +0 -392
  171. package/scripts/router-proposals.mjs +0 -386
  172. package/src/router/fixtures/M1.json +0 -16
  173. package/src/router/fixtures/M2.json +0 -16
  174. package/src/router/fixtures/M3.json +0 -20
  175. package/src/router/fixtures/M4.json +0 -20
  176. package/src/router/fixtures/M5.json +0 -45
  177. package/src/router/fixtures/M6.json +0 -53
  178. package/src/router/fixtures/M7.json +0 -46
  179. package/src/router/fixtures/S1.json +0 -20
  180. package/src/router/fixtures/S2.json +0 -23
  181. package/src/router/fixtures/S3.json +0 -20
  182. package/src/router/fixtures/S4.json +0 -34
  183. package/src/router/fixtures/S5.json +0 -43
  184. package/src/router/fixtures/S6.json +0 -47
  185. package/src/router/fixtures/T1.json +0 -23
  186. package/src/router/fixtures/T2.json +0 -16
  187. package/src/router/fixtures/T3.json +0 -19
  188. package/src/router/fixtures/T4.json +0 -16
  189. package/src/router/fixtures/X1.json +0 -17
  190. package/src/router/fixtures/X2.json +0 -20
  191. package/src/router/gen-design-headings.mjs +0 -107
  192. package/src/router/policies/owner-rulings-2026-11-03.json +0 -62
  193. package/test/auto-recall.test.mjs +0 -474
  194. package/test/auto-truncate.test.mjs +0 -931
  195. package/test/autobind.test.mjs +0 -385
  196. package/test/bus.test.mjs +0 -1572
  197. package/test/cli-guard.test.mjs +0 -198
  198. package/test/conclusion.test.mjs +0 -408
  199. package/test/config-schema.test.mjs +0 -204
  200. package/test/d6-output.test.mjs +0 -194
  201. package/test/d6.test.mjs +0 -395
  202. package/test/deps.test.mjs +0 -342
  203. package/test/doctor-setup.test.mjs +0 -297
  204. package/test/embedding-recall.test.mjs +0 -347
  205. package/test/feature-flags.test.mjs +0 -568
  206. package/test/filter-shadow.test.mjs +0 -170
  207. package/test/fixtures/baseline-0.8.0-registration.json +0 -556
  208. package/test/fixtures/d6-header-tools.json +0 -1
  209. package/test/fixtures/lock-child.mjs +0 -67
  210. package/test/fixtures/pre-step-container.mjs +0 -100
  211. package/test/fixtures/privacy-memory/topics/pii-unmarked.md +0 -9
  212. package/test/fixtures/privacy-memory/topics/secret-local-only.md +0 -11
  213. package/test/fixtures/profile-session-longlive-config.json +0 -20
  214. package/test/fixtures/proposal-cas-child.mjs +0 -66
  215. package/test/host-engine-status.test.mjs +0 -307
  216. package/test/hot-truncate.test.mjs +0 -1349
  217. package/test/identity-card-marker.test.mjs +0 -307
  218. package/test/identity-router/run.mjs +0 -721
  219. package/test/integration-pre-step.test.mjs +0 -553
  220. package/test/live.test.mjs +0 -1020
  221. package/test/maintenance-schedule.test.mjs +0 -538
  222. package/test/memory.test.mjs +0 -2828
  223. package/test/metrics.test.mjs +0 -478
  224. package/test/orchestrator.test.mjs +0 -266
  225. package/test/p1_probe.mjs +0 -97
  226. package/test/packaging.test.mjs +0 -182
  227. package/test/portability.test.mjs +0 -343
  228. package/test/rc4-regressions.test.mjs +0 -562
  229. package/test/rc5-regressions.test.mjs +0 -197
  230. package/test/rc6-chinese.test.mjs +0 -394
  231. package/test/router-1100/apply-off.test.mjs +0 -175
  232. package/test/router-1100/budget-reconcile.test.mjs +0 -215
  233. package/test/router-1100/config-context.test.mjs +0 -211
  234. package/test/router-1100/helpers.mjs +0 -129
  235. package/test/router-1100/hint-envelope.test.mjs +0 -150
  236. package/test/router-1100/lock-crossproc.test.mjs +0 -206
  237. package/test/router-1100/proposal-cas-crossproc.test.mjs +0 -184
  238. package/test/router-1100/router-apply.test.mjs +0 -372
  239. package/test/router-1100/router-fixb.test.mjs +0 -602
  240. package/test/router-1100/router-proposals.test.mjs +0 -405
  241. package/test/router-1100/router-queue-lease-wal.test.mjs +0 -355
  242. package/test/router-1100/router-security-cr.test.mjs +0 -333
  243. package/test/router-1100/service-lifecycle.test.mjs +0 -220
  244. package/test/router-1100/tools-contract.test.mjs +0 -164
  245. package/test/router-1100/turn-reflect-tick.test.mjs +0 -89
  246. package/test/router-1100/v6-contract.test.mjs +0 -158
  247. package/test/router-1100/v6b-contract.test.mjs +0 -293
  248. package/test/router-1100/v6c-contract.test.mjs +0 -249
  249. package/test/router-1100/wal-rotation.test.mjs +0 -375
  250. package/test/router-1100/wp1-config.test.mjs +0 -170
  251. package/test/router-1100/wp1-default-off.test.mjs +0 -77
  252. package/test/router-1100/wp1-model-status.test.mjs +0 -90
  253. package/test/router-1100/wp1-status.test.mjs +0 -220
  254. package/test/router-1100/wp1-tools.test.mjs +0 -146
  255. package/test/router-1100/wp5-cli.test.mjs +0 -240
  256. package/test/router-1100/wp5-model-auto.test.mjs +0 -418
  257. package/test/router-1100/wp6-merge.test.mjs +0 -386
  258. package/test/router-1100/wp6-wake.test.mjs +0 -502
  259. package/test/router-background/audit.test.mjs +0 -37
  260. package/test/router-background/budget-ledger.test.mjs +0 -330
  261. package/test/router-background/cross-process.test.mjs +0 -222
  262. package/test/router-background/fixtures/cross-child.mjs +0 -85
  263. package/test/router-background/fixtures/real-shapes.mjs +0 -239
  264. package/test/router-background/router.test.mjs +0 -1044
  265. package/test/router-background/stream-retry.test.mjs +0 -358
  266. package/test/router-background/tool-agent.test.mjs +0 -384
  267. package/test/router-face/bridge.test.mjs +0 -169
  268. package/test/router-face/face.test.mjs +0 -316
  269. package/test/router-failclosed.test.mjs +0 -466
  270. package/test/router-identity.test.mjs +0 -384
  271. package/test/router-l1-l2.contract.test.mjs +0 -1075
  272. package/test/router-memory-tools.test.mjs +0 -262
  273. package/test/router-policy.test.mjs +0 -225
  274. package/test/router-runtime.test.mjs +0 -438
  275. package/test/router-shadow.test.mjs +0 -287
  276. package/test/router.test.mjs +0 -903
  277. package/test/run-rc.mjs +0 -299
  278. package/test/run.mjs +0 -2469
  279. package/test/safety-defaults.test.mjs +0 -179
  280. package/test/seeded-load.test.mjs +0 -436
  281. package/test/session-original.test.mjs +0 -338
  282. package/test/surgery-recovery.test.mjs +0 -936
  283. package/test/t7_drive.mjs +0 -151
  284. package/test/tool-output.test.mjs +0 -393
  285. package/test/tool-schema.test.mjs +0 -177
  286. package/test/tools_contract.test.mjs +0 -716
  287. package/test/truncate-visible.test.mjs +0 -1150
  288. package/test/ui-flags.test.mjs +0 -477
  289. package/test/v4-hardening.test.mjs +0 -427
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 阿恒、听澜
3
+ Copyright (c) 2026 longlive contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/QUICKSTART.md CHANGED
@@ -1,4 +1,4 @@
1
- # QUICKSTART — 五步跑通(1.6.5)
1
+ # QUICKSTART — 五步跑通(1.8.0)
2
2
 
3
3
  目标:在一台新机器上,5 步内让 `@jjh32456/dsh-longlive` 装好、能用、能回滚、能卸干净。
4
4
  完整背景见 [README.md](README.md),逐码排错见 [docs/ERRORS.md](docs/ERRORS.md),
@@ -42,7 +42,7 @@ $DSH = '<DSH 安装目录>\resources\runtime\cli\bin\dsh.cmd'
42
42
  先把包放到固定目录,核对 sha256,再装进一个**新 profile**:
43
43
 
44
44
  ```powershell
45
- $TGZ = 'C:\path\to\jjh32456-dsh-longlive-1.6.5.tgz'
45
+ $TGZ = '<path-to>\jjh32456-dsh-longlive-1.8.0.tgz'
46
46
  Get-FileHash -Algorithm SHA256 $TGZ # 对照同目录的 .tgz.sha256
47
47
 
48
48
  $LLPROFILE = 'fresh0723b'
@@ -54,7 +54,7 @@ $LLPROFILE = 'fresh0723b'
54
54
  & $DSH plugin --profile $LLPROFILE list --depth 0
55
55
  ```
56
56
 
57
- `list` 应出现 `@jjh32456/dsh-longlive@1.6.5`。`dsh plugin --profile <新名字> add` 自己也会初始化
57
+ `list` 应出现 `@jjh32456/dsh-longlive@1.8.0`。`dsh plugin --profile <新名字> add` 自己也会初始化
58
58
  profile,但那样只带 `@deepseek-ai/dsh-base`;要网页 UI 和与本文一致的验证,先用
59
59
  `--from-default-profile web` 建模板 profile。
60
60
 
@@ -67,11 +67,11 @@ profile,但那样只带 `@deepseek-ai/dsh-base`;要网页 UI 和与本文一
67
67
  ```powershell
68
68
  Set-Location <仓库根目录>
69
69
  & $NODE test\run.mjs
70
- & $NODE scripts\pack.mjs --expect-version 1.6.5
71
- # 产物:dist\jjh32456-dsh-longlive-1.6.5.tgz(+ .sha256)
70
+ # 仓库内开发脚本(npm 包不含)\n& $NODE scripts\pack.mjs --expect-version 1.8.0
71
+ # 产物:dist\jjh32456-dsh-longlive-1.8.0.tgz(+ .sha256)
72
72
  ```
73
73
 
74
- `pack.mjs` 只负责打包,不跑测试;`--expect-version` 会在版本不匹配时拒绝出包。
74
+ `pack.mjs`(仓库内开发脚本,npm 包不含)只负责打包,不跑测试;`--expect-version` 会在版本不匹配时拒绝出包。
75
75
  发布前还要跑带真机 T7 的发布闸门(见 [runbook.md](runbook.md) §1.7)。
76
76
 
77
77
  ### 1C. 在会话里用 plugin_manager
@@ -79,13 +79,13 @@ Set-Location <仓库根目录>
79
79
  宿主正在跑、且当前 profile 就是目标 profile 时:
80
80
 
81
81
  ```
82
- plugin_manager action=install_bundle target="file:C:/path/to/jjh32456-dsh-longlive-1.6.5.tgz"
82
+ plugin_manager action=install_bundle target="file:<path-to>/jjh32456-dsh-longlive-1.8.0.tgz"
83
83
  ```
84
84
 
85
85
  目标必须是**绝对路径**,且需要上面说的权限。装完按宿主提示重载(或重启该 profile)。
86
86
 
87
87
  > 不要用 `npm install` 当安装方式:本包未发布到 npm registry;`file:` 必须指向刚打出来的
88
- > **1.6.4 tgz**,指向旧版 tgz 会装回旧行为。
88
+ > **1.8.0 tgz**,指向旧版 tgz 会装回旧行为。
89
89
 
90
90
  ### 1D. 装完第一件事:可选依赖自检与 `--setup`
91
91
 
@@ -182,7 +182,7 @@ R1 的判断依据默认只加载**通用策略**(`src/router/policies/generic
182
182
  config:
183
183
  memoryRoot: <memory-root>
184
184
  routerPolicyProfile: generic # 默认;不写等价于它
185
- # routerPolicyProfile: owner-rulings-2026-11-03 # 仓库自带示例家规(J8 六条裁决)
185
+ # routerPolicyProfile: <profile-name> # 可选:自定义规则 profile
186
186
  ```
187
187
 
188
188
  三条硬规则:
@@ -231,7 +231,7 @@ dsh: warning: 1 entry did not activate
231
231
  session-longlive (dsh-session-longlive): Error: cannot get property "version" without inject
232
232
  ```
233
233
 
234
- 说明跑的是 0.7.3 的旧代码(19 个工具都不会注册);升级到 1.6.4,或按第 4 步回滚到 0.6.0。
234
+ 说明跑的是 0.7.3 的旧代码(19 个工具都不会注册);升级到 1.8.0,或按第 4 步回滚到 0.6.0。
235
235
 
236
236
  > **新 profile 要启动两次再下结论。** 新建 profile 的第一次启动会做一次准备性加载,
237
237
  > 可能不进入 Cordis runtime,从而掩盖这个错误;第二次启动才是稳定状态。两次 stderr 都干净才算过。
@@ -274,7 +274,7 @@ Copy-Item "<session-dir>\session.v4.jsonl.zstd.bak-YYYYMMDD" "<session-dir>\sess
274
274
  回滚**插件版本**:
275
275
 
276
276
  ```powershell
277
- $OLD = 'C:\path\to\dsh-session-longlive-0.6.0.tgz'
277
+ $OLD = '<path-to>\dsh-session-longlive-0.6.0.tgz'
278
278
  Get-FileHash -Algorithm SHA256 $OLD
279
279
  & $DSH plugin --profile $LLPROFILE add "file:$OLD"
280
280
  & $DSH plugin --profile $LLPROFILE list --depth 0 # 应显示 @0.6.0
@@ -326,17 +326,38 @@ Remove-Item -Recurse -Force $profileDir
326
326
 
327
327
  ---
328
328
 
329
+ ## 1.8.0 身份与隐私(第一次用先看这条)
330
+
331
+ - **默认中性身份**:1.8.0 不内置人名/角色;想用你自己的身份,在记忆根下新建
332
+ `<memoryRoot>/IDENTITY.md`(默认 `%USERPROFILE%\.dsh\longlive-memory\IDENTITY.md`,按 `memoryRoot` 走),
333
+ 写短一点、别放敏感信息;不建就用中性默认,不会自动创建或改写。
334
+ - **蒸馏 who 默认空**:写入/蒸馏不会再带入内置个人称呼,who 需要你在自己的配置里显式注入。
335
+ - **共享大脑活动流默认开启(1.8.0 起)**:写侧(turn/end 记活动)+ 实时注入(只注入其他会话新增,≤5 条 / 整条 ≤300 字);数据只在本机 `memoryRoot`、不上传。不想开就设 `sharedBrain.activity.enabled: false` 后重启(回到 1.6.8 默认)。
336
+ - **共享大脑 thinking 默认开启(1.8.0 起,摘要级)**:只注入其他会话的**摘要**,不写原文、不进日志,`local_only` 内容不写不注入;不想要设 `sharedBrain.thinkingInjection.enabled: false` 后重启(细节见 [docs/CONFIG.md](docs/CONFIG.md))。
337
+ - **发布包隐私门**:打包时仓库内脚本 `scripts/scan-abs-paths.mjs`(npm 包不含)扫绝对路径/个人目录名,blocker=0 才发版;
338
+ 包内不含记忆库、会话日志、本机路径(说明见 [docs/PRIVACY.md](docs/PRIVACY.md))。
339
+ - **可移植**:node 走 `process.execPath`,不依赖 PATH;干净 `DSH_HOME` 可 install/运行(Gate-4)。
340
+
341
+ ### 创建自己的身份(可选,3 行)
342
+
343
+ 在 `<memoryRoot>/IDENTITY.md` 写三行即可(不建就用中性默认,不会出现任何具体名字):
344
+
345
+ ```markdown
346
+ 名字:<你的名字>
347
+ 称呼:<你希望被怎么称呼>
348
+ 规则 / 说话方式:<可选,一句>
349
+ ```
329
350
  ## 排错速查
330
351
 
331
352
  | 现象 | 大概率原因 | 处理 |
332
353
  | --- | --- | --- |
333
- | `dsh: warning: 1 entry did not activate` + `cannot get property "version" without inject` | 0.7.3 的激活回归 | 升级到 1.6.4,或回滚 0.6.0(第 4 步) |
354
+ | `dsh: warning: 1 entry did not activate` + `cannot get property "version" without inject` | 0.7.3 的激活回归 | 升级到 1.6.8,或回滚 0.6.0(第 4 步) |
334
355
  | `--dump-config` 里两条同 id 的 `session-longlive` | 在 profile 层照抄了 `- insert:` | 改成 `- id: session-longlive` + `config:`(第 2 步) |
335
356
  | `E_MEMORY_ROOT_MISSING` | 显式 `memoryRoot` 目录不存在 | 先建目录,或改用默认根(第 2 步) |
336
357
  | `plugin_manager` 安装/卸载被自动拒绝 | 缺少 danger-full-access 或审批 | 用 CLI,或对本次调用批准(第 0 步) |
337
358
  | `node` 不是内部或外部命令 | 干净机器 PATH 没有 Node | 用 `$NODE`(第 0 步) |
338
359
  | 起会话报 `MISSING_CREDENTIAL` / `ACCOUNT_SIGN_IN_REQUIRED` | 新 profile 没有模型凭据 | 用 3A/3B 验证;这是环境问题,不是插件 |
339
- | 设置页找不到「久视 · 功能开关」 | 1.6.0 起才有设置页伴侣;旧宿主或没有 webServer 的 profile 不注册路由 | 确认装的是 1.6.4 且宿主 Web GUI 可用;没有路由时直接改 `cordis.patch.yml` |
360
+ | 设置页找不到「久视 · 功能开关」 | 1.6.0 起才有设置页伴侣;旧宿主或没有 webServer 的 profile 不注册路由 | 确认装的是 1.8.0 且宿主 Web GUI 可用;没有路由时直接改 `cordis.patch.yml` |
340
361
 
341
362
  出问题先看 [docs/ERRORS.md](docs/ERRORS.md);Windows 专属部分(PowerShell 探测、`request` 模式、
342
363
  `Stop-Process` 硬杀关闭)在非 Windows 上会降级而不是崩溃。
package/README.en.md CHANGED
@@ -1,19 +1,20 @@
1
- # @jjh32456/dsh-longlive (Longlive)
1
+ # @jjh32456/dsh-longlive (Longlive)
2
2
 
3
3
  A DeepSeek Harness plugin that keeps a long session healthy: **inspect it, back it up, and shrink it safely** before the context window fills up. No standalone UI; no network requests or telemetry in the default configuration (Router / RouterFace / embedding call the provider you configure, only after you enable them).
4
4
  ## What you get
5
5
 
6
- - **22 tools** for session health/backup/compaction/truncation, on-demand original-text fetch, memory cards, workers (fan-out is unavailable until `workers.enabled: true`), and the live-session registry.
6
+ - **22 tools** for session health/backup/compaction/truncation, on-demand original-text fetch, memory cards, workers (fan-out is on by default since 1.8.0; set `workers.enabled: false` to disable), and the live-session registry.
7
7
  - A memory store at `<DSH home>/longlive-memory` (on Windows: `%USERPROFILE%\.dsh\longlive-memory`), created on first start.
8
- - Optional: the separate read-only panel `@jjh32456/dsh-longlive-panel@0.2.5` adds a sidebar named **潜望镜 (Periscope)**. The plugin itself ships no UI.
9
- - Optional and **off by default**: `d2.enabled` trims oversized tool output (the full text is archived), `d6.enabled` freezes a per-task tool allowlist and registers `tool_search`. See [docs/FEATURES.md](docs/FEATURES.md) and [docs/CONFIG.md](docs/CONFIG.md) for enabling, budget and rollback.
8
+ - Optional: the separate read-only panel `@jjh32456/dsh-longlive-panel@1.8.0` adds a sidebar named **潜望镜 (Periscope)**. The plugin itself ships no UI.
9
+ - **On by default since 1.8.0** (write side + real-time injection; added in 1.6.8): `sharedBrain.activity` writes activity rows from events (throttled to one row per key per 10 s, plus a conclusion row per turn/end) to `.longlive/board/activity.jsonl` and injects only unseen rows from other sessions (max 5 rows / 300 chars, zero tokens when nothing is new). It is independent of `presenceBus`; opt out with `sharedBrain.activity.enabled: false` and restart. All data stays in the local memoryRoot and is never uploaded.
10
+ - **On by default since 1.8.0** (set `false` to disable): `d2.enabled` trims oversized tool output (the full text is archived), `d6.enabled` freezes a per-task tool allowlist and registers `tool_search`. See [docs/FEATURES.md](docs/FEATURES.md) and [docs/CONFIG.md](docs/CONFIG.md) for enabling, budget and rollback.
10
11
 
11
12
  ## Install (3 commands)
12
13
 
13
14
  ```powershell
14
15
  $DSH = '<DSH install>\resources\runtime\cli\bin\dsh.cmd'
15
16
  $NODE = '<DSH install>\resources\runtime\primary-runtime\dependencies\node\bin\node.exe'
16
- & $DSH plugin --profile desktop add "file:C:/path/jjh32456-dsh-longlive-1.6.5.tgz"
17
+ & $DSH plugin --profile desktop add "file:<path>/jjh32456-dsh-longlive-1.8.0.tgz"
17
18
  & $DSH plugin --profile desktop list --depth 0
18
19
  & $NODE "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\@jjh32456\dsh-longlive\scripts\longlive-doctor.mjs" --profile desktop
19
20
  ```
@@ -24,7 +25,7 @@ Fully quit and restart the host afterwards. Install from the local tgz with `plu
24
25
 
25
26
  ## First run
26
27
 
27
- 1. Opt into observation: `autoTruncate` is off by default in 1.6.0, so set `enabled: true` and `mode: "log"`, then watch `<memoryRoot>/.longlive/logs/auto-truncate.log`; entries appear only after the threshold (default 300000) is exceeded.
28
+ 1. Watch it: `autoTruncate` is on by default since 1.8.0; set `mode: "log"` and watch `<memoryRoot>/.longlive/logs/auto-truncate.log`; entries appear only after the threshold (default 300000) is exceeded.
28
29
  2. Switch to `mode: "dryrun"` with `tokensThreshold: 5000`, `minTurns: 2`, and watch one planned cut (`"action":"dryrun-planned"`).
29
30
  3. Switch to `mode: "request"`, wait for `auto-truncate.request.json`, then run `scripts/auto-truncate-run.ps1` **only when you are not using the app** (it closes and reopens the host).
30
31
  4. Restore production values: `tokensThreshold: 300000`, `minTurns: 12`, `cooldownMinutes: 60`, `keepTurns: 12`, `keepTokens: 80000`.
@@ -36,8 +37,18 @@ Fully quit and restart the host afterwards. Install from the local tgz with `plu
36
37
  - [FAQ.md](docs/FAQ.md) — 401/404, power loss, uninstall, moving machines.
37
38
  - [README.md](README.md) — full Chinese introduction.
38
39
 
40
+ ## Privacy & identity (1.8.0)
41
+
42
+ - Built-in identity is **neutral by default** in 1.8.0: no personal names or roles ship in the release. Define your own identity in `<memoryRoot>/IDENTITY.md`; when absent, a neutral default is used. Distillation's `who` defaults to empty and is injected only from your configuration.
43
+ - Shared-brain activity is **on by default since 1.8.0**: it writes and injects only inside your local memoryRoot and uploads nothing; opt out with `sharedBrain.activity.enabled: false` and restart.
44
+ - Shared-brain thinking is **on by default since 1.8.0, summary-level**: it injects summaries from other sessions only (no raw text, no logs), and reuses the privacy gate (`local_only` content is never written or injected); set `sharedBrain.thinkingInjection.enabled: false` to disable.
45
+ - The release package carries no memory store, session logs or machine paths; packaging runs an absolute-path/privacy scan and **0 blockers is a release gate**.
46
+ - Details: [docs/PRIVACY.md](docs/PRIVACY.md).
47
+
39
48
  ## Boundaries
40
49
 
41
50
  - It never rewrites memory prose or deletes sessions/cards. `memory_reinforce` updates frontmatter counters and appends a use note; prose is byte-verified unchanged. `memory_forget` archives by default.
42
- - Backup, both truncations, and forget default to `dryRun` and need their confirm word; `session_compact` is controlled by `dryRun` only. Auto-truncation defaults to `log`; the router guard defaults to `off`.
51
+ - Backup, both truncations, and forget default to `dryRun` and need their confirm word; `session_compact` is controlled by `dryRun` only. Auto-truncation, router features and other plugin features default to on in 1.8.0 (explicit `false` disables); the confidence gate (`answerGuard.gate`) and a few safety/gray switches default to off.
43
52
  - `request` mode (close/cut/verify/restart) is Windows-only; on Linux/macOS use `log` or `dryrun`.
53
+ - **Portability**: node is resolved through `process.execPath`, no absolute machine paths are baked in, and a clean `DSH_HOME` can install and run the package (Gate-4).
54
+ - **Quality gate**: Gate-3 uses the human-mechanism-calibrated criteria `GATE3-CRITERIA-V2` (v2.1, sha256 `40A2C62D2CD07DA1D36C6B9211427A9496A0BD525F4E0862ED21AE94BA318D6D`, (criteria file archived with release evidence, not shipped)); the old criteria remain as a dual-caliber comparison.
package/README.md CHANGED
@@ -1,10 +1,18 @@
1
- # @jjh32456/dsh-longlive(久视)
1
+ # @jjh32456/dsh-longlive(久视)
2
2
 
3
3
  > 1.6.0 起包名由 `dsh-session-longlive` 改为 `dsh-longlive`;1.6.4 起发布名改为 scoped 包
4
4
  > `@jjh32456/dsh-longlive`(npm 包名),显示名仍是「久视」(英文 Longlive);
5
5
  > 1.6.3 在 1.6.0 基线上新增**热截断**(cut-only 压缩引擎,见下文「版本与边界」),这一项是 1.5.0
6
6
  > 没有的能力;1.6.4 把热截断默认值收到 **300k 触发 / 保留 4 轮**,并修复 D6 重启后首轮冻结
7
7
  > (G3)与可移植性收口。升级步骤见 [docs/MIGRATION-1.6.0.md](docs/MIGRATION-1.6.0.md)。
8
+ >
9
+ > 1.6.8 在 1.6.7 之上并入**共享大脑活动流**(`sharedBrain.activity`,1.6.8 时默认关闭、1.8.0 起默认开启,与
10
+ > `presenceBus` 解耦,见 [docs/FEATURES.md](docs/FEATURES.md))与共享板状态诚实性修复
11
+ > (running 计数、焦点新鲜度、turn 状态、开机卡时效);热截断行为不变。
12
+ >
13
+ > **1.8.0**:有据才答的注入修复 + 来源闸(信心闸默认关)、**插件功能默认开启**(共享大脑活动流/thinking/presenceBus/autoRecall/identityCard/autoMaintenance/D2/D6/router/workers/embedding/autoTruncate 等,显式 `false` 可关;安全/灰度项仍默认关)、**身份默认中性**(身份由你的 `IDENTITY.md` 定义,
14
+ > 见 [docs/PRIVACY.md](docs/PRIVACY.md))、可移植性加固。质量门改用 Gate-3 V2
15
+ > 人类机制校准版,见 (判据文件随发布证据归档,不随发布包)。
8
16
 
9
17
  **一句话**:一个大脑,多双手脚——把「我」从会话里搬出来,让人格与记忆长久化。
10
18
 
@@ -45,7 +53,7 @@ longlive 的做法,是把「我」从会话里搬出来,做成一个**共享
45
53
 
46
54
  ## 自动截断:会话长了怎么办
47
55
 
48
- 一个会话聊久了,上下文会越来越长:模型变慢、成本上升,最早说过的话被挤出可见窗口。自动截断就是给单个会话减负的部件——**默认关闭**;开启后它盯着会话大小,超过你设的阈值(默认 30 万 token)就动手:
56
+ 一个会话聊久了,上下文会越来越长:模型变慢、成本上升,最早说过的话被挤出可见窗口。自动截断就是给单个会话减负的部件——**1.8.0 起默认开启**(显式 `autoTruncate.enabled: false` 关闭);开启时它盯着会话大小,超过你设的阈值(默认 30 万 token)就动手:
49
57
 
50
58
  - 先体检,再把整份会话文件备份一份;
51
59
  - 然后收缩:要么只删不可见的历史事件(可见对话尽量一字不变),要么按轮次和预算只保留最近几轮,把更早的部分折叠压缩;
@@ -58,10 +66,18 @@ longlive 的做法,是把「我」从会话里搬出来,做成一个**共享
58
66
 
59
67
  - **不改写记忆正文**。`memory_reinforce` 只改卡片头部的计数、日期,并追加一行使用记录,正文逐字节校验不变;`memory_forget` 只归档,不删文件。
60
68
  - **默认配置不联网、不上传**。源码里没有网络请求,没有遥测;截断、备份、检索都在本机完成。但打开 `routerEnabled` / `routerFace.enabled` / 语义召回(embedding)后,插件会通过宿主调用你配置的模型 API——这是你显式开启后的行为。
61
- - **不替你做决定**。备份、两个截断、遗忘默认 `dryRun: true`,真要写必须给对应的 `confirm` 词;`session_compact` 只受 `dryRun` 控制(没有 confirm 词)。自动截断默认关闭;路由判定默认关闭;`worker_*` 扇出默认关闭(需 `workers.enabled: true`)。
69
+ - **不替你做决定**。备份、两个截断、遗忘默认 `dryRun: true`,真要写必须给对应的 `confirm` 词;`session_compact` 只受 `dryRun` 控制(没有 confirm 词)。自动截断、路由判定、`worker_*` 扇出在 1.8.0 起默认开启(显式 `false` 可关);`answerGuard.gate`、`routerApplyEnabled`、`routerRuntime` 等安全/灰度项仍默认关。
62
70
  - **默认不自动杀进程**。插件本体不关应用;只有你手动运行 `auto-truncate-run.ps1`,或装了看门并切到 request 模式时,它才会关宿主、剪完再打开。
63
71
  - **不修已经损坏的会话**,也不恢复你手动删掉的消息。
64
72
 
73
+ ## 隐私与身份(1.8.0)
74
+
75
+ - **默认中性身份**:1.8.0 起发布包与内置提示不含具体人名/角色;身份由你在记忆根下的 `IDENTITY.md` 定义(不建文件时使用中性默认)。蒸馏的 who 字段默认空,由你显式配置注入。
76
+ - **发布包隐私扫描**:打包时扫绝对路径/个人目录名等 blocker,计数必须为 0 才允许发版(发版门);包内不含记忆库、会话日志或本机路径。
77
+ - **共享大脑活动流默认开启(1.8.0 起,写侧 + 实时注入)**:数据只在本机 `memoryRoot`、不上传;不想要就设 `sharedBrain.activity.enabled: false` 后重启(回到 1.6.8 默认行为)。
78
+ - **共享大脑 thinking 默认开启(1.8.0 起,摘要级)**:只注入其他会话的**摘要**,不写原文、不进日志;写入/注入前复用隐私门(`local_only` 不写不注入);不想要设 `sharedBrain.thinkingInjection.enabled: false` 后重启。
79
+ - 细节与操作步骤见 [docs/PRIVACY.md](docs/PRIVACY.md)。
80
+
65
81
  ## 装之前
66
82
 
67
83
  - **不用另装 Node**:DSH 自带运行时,`package.json` 要求 Node **>= 20.0.0**;下面用 `$NODE` 指向它。
@@ -81,7 +97,7 @@ $NODE = '<DSH 安装目录>\resources\runtime\primary-runtime\dependencies\node\
81
97
 
82
98
  ```powershell
83
99
  # 1. 安装本地 tgz(用 plugin add,不要用 npm install)
84
- & $DSH plugin --profile desktop add "file:C:/path/jjh32456-dsh-longlive-1.6.5.tgz"
100
+ & $DSH plugin --profile desktop add "file:<path>/jjh32456-dsh-longlive-1.8.0.tgz"
85
101
 
86
102
  # 2. 确认版本
87
103
  & $DSH plugin --profile desktop list --depth 0
@@ -101,16 +117,16 @@ $NODE = '<DSH 安装目录>\resources\runtime\primary-runtime\dependencies\node\
101
117
  - 记忆:`session_wake`、`memory_index`、`memory_consolidate`、`memory_reinforce`、`memory_forget`、`memory_procedure`、`memory_recall`
102
118
  - 协作:`worker_spawn`、`worker_status`、`worker_kill`、`lease_acquire`、`lease_release`
103
119
  - 活体巡检:`session_live_update`、`session_live_list`、`session_live_get`、`session_live_prune`
104
- - **Router 1.1.0 默认关闭**:`routerEnabled` 不写或写 `false` 时,上面仍是 22 个工具、不建
120
+ - **Router 1.1.0 默认开启(1.8.0 起)**:`routerEnabled` 不写或给 `true` 时起后台服务(上面仍是 22 个工具);写 `false` 关闭、不建
105
121
  `.longlive/router/`、不起定时器。显式打开后先多 4 个 `router_*`(22→26);再开
106
122
  `routerProposalEnabled` 多 3 个(26→29)。开关与默认值见 [docs/FEATURES.md](docs/FEATURES.md)
107
123
  和 [docs/CONFIG.md](docs/CONFIG.md),建议先只开 `routerEnabled` 观察。
108
- - **D2/D6 默认关闭**:`d2.enabled` 打开工具输出裁剪(超长结果落盘、正文只留头尾),
124
+ - **D2/D6 默认开启(1.8.0 起,显式 `false` 可关)**:`d2.enabled` 做工具输出裁剪(超长结果落盘、正文只留头尾),
109
125
  `d6.enabled` 打开工具面裁剪(默认仍是 22 个工具,打开后多一个 `tool_search` 用来找回
110
126
  被裁掉的工具)。打开方式、预算与回退见 [docs/FEATURES.md](docs/FEATURES.md) 和
111
127
  [docs/CONFIG.md](docs/CONFIG.md)。
112
128
  - 默认记忆目录:`%USERPROFILE%\.dsh\longlive-memory`(首次启动自动创建)。
113
- - **没有自带界面**。另装可选的只读面板 `@jjh32456/dsh-longlive-panel@0.2.5` 后,侧栏才会出现「潜望镜」,里面有七个页签:六层视图、截断记录、过滤器决策、影子记录、常驻 Router、本轮想起(另有「使用说明」)。面板是独立可选包,不装就没有这个侧栏。
129
+ - **没有自带界面**。另装可选的只读面板 `@jjh32456/dsh-longlive-panel@1.8.0` 后,侧栏才会出现「潜望镜」,里面有七个页签:六层视图、截断记录、过滤器决策、影子记录、常驻 Router、本轮想起(另有「使用说明」)。面板是独立可选包,不装就没有这个侧栏。
114
130
 
115
131
  ## 第一次使用
116
132
 
@@ -125,12 +141,21 @@ $NODE = '<DSH 安装目录>\resources\runtime\primary-runtime\dependencies\node\
125
141
  | [FAQ.md](docs/FAQ.md) | 装完没反应、401/404、断电、卸载、换电脑 |
126
142
  | [README.en.md](README.en.md) | 给英文读者的一页版 |
127
143
 
128
- 开发、打包与回滚细节见 [docs/DEV.md](docs/DEV.md)。
144
+ 开发、打包与回滚细节见 [docs/DEV.md](https://github.com/jjh32456/dsh-longlive/blob/main/docs/DEV.md)(仓库内文档,npm 包不含)。
129
145
 
130
146
  ## 版本与边界
131
147
 
132
- - 本套文档对应 **1.6.5** 的本地 tgz(1.6.0 起包名由 `dsh-session-longlive` 改为 `dsh-longlive`;
148
+ - 本套文档对应 **1.8.0** 的本地 tgz(1.6.0 起包名由 `dsh-session-longlive` 改为 `dsh-longlive`;
133
149
  1.6.4 起发布名改为 scoped 包 `@jjh32456/dsh-longlive`)。
150
+ **1.8.0 变更**:有据才答注入修复 + 来源闸(默认关闭的信心闸、证据投递修复,见
151
+ [docs/ANSWER-GUARD.md](docs/ANSWER-GUARD.md))、共享大脑 thinking(默认开启,仅摘要)、
152
+ 身份默认中性([docs/PRIVACY.md](docs/PRIVACY.md))、可移植加固(node 走 `process.execPath`、
153
+ 无绝对机器路径、干净 `DSH_HOME` 可 install/运行,Gate-4)。
154
+ **质量门**:Gate-3 采用人类机制校准版 `GATE3-CRITERIA-V2`(v2.1,sha256
155
+ `40A2C62D2CD07DA1D36C6B9211427A9496A0BD525F4E0862ED21AE94BA318D6D`,文件
156
+ (判据文件随发布证据归档,不随发布包));旧口径保留为双口径对照。
157
+ **共享大脑活动流**:`sharedBrain.activity`(1.8.0 起默认开启,写侧 + 实时注入;事件级活动写入 +
158
+ 只注入其他会话新增、整条 ≤300 字;写盘跨进程锁、失败静默),与热截断互不影响。
134
159
  **1.6.3 起新增热截断**:一个不调 LLM 的 cut-only 压缩引擎,通过 bundle patch 关掉宿主 stock
135
160
  `compaction-basic` 行并插入 `compaction-hot-truncate`;只切「已完成、且早于保留窗口(默认 4 轮 /
136
161
  8000 token)」的整轮,切前先把原文归档到 `<memoryRoot>/.longlive/hot-truncate/`,再用一条覆盖率指针
package/SPEC.md CHANGED
@@ -1,11 +1,11 @@
1
- # 插件规格:@jjh32456/dsh-longlive(久视)
1
+ # 插件规格:@jjh32456/dsh-longlive(久视)
2
2
 
3
3
  > 命名(2026-11-06 改):发布包名 **@jjh32456/dsh-longlive**(1.6.4 起 scoped 发布名;
4
4
  > 1.6.0–1.6.3 为 `dsh-longlive`),显示名「久视」(英文 Longlive)。原名
5
5
  > `dsh-session-longlive`(2026-10-30 定),1.6.0 起迁移;拼写是 longlive,不是 longevity。
6
6
  >
7
- > 当前版本:**1.6.5**(1.6.0 改名基座 + 1.6.3 热截断 + 1.6.4 的 300k 触发 / 保留 4 轮与
8
- > 可移植性收口;D2/D6 默认关闭;安装包 `dist/jjh32456-dsh-longlive-1.6.5.tgz`)。
7
+ > 当前版本:**1.8.0**(1.6.0 改名基座 + 1.6.3 热截断 + 1.6.4 的 300k 触发 / 保留 4 轮 + 1.6.7 热截断加固 + 1.8.0 有据才答/默认全开 +
8
+ > 1.8.0 共享大脑活动流与共享板状态诚实性;D2/D6 等插件功能 1.8.0 起默认开启(显式 false 关闭);安装包 `jjh32456-dsh-longlive-1.8.0.tgz`)。
9
9
 
10
10
  ## 零、安全性承诺(2026-10-30 要求:不能出错,出错就死了)
11
11
 
@@ -150,7 +150,7 @@ DSH 的 compaction 从不删事件:它追加一条 `compaction/summary` 和一
150
150
 
151
151
  ## 九、记忆层与可移植性说明(0.4.0 / 0.7.4 → 0.8.0)
152
152
 
153
- > 0.4.0 建立了记忆层;0.7.4 修了 0.7.3 的宿主版本探测激活回归,并补齐 Node 引擎声明;0.7.7 把归档卡的路径抽取改成线性扫描(见 CHANGELOG 0.7.7)。本节以 0.8.0 的行为为准。0.8.0-rc.1 新增程序性记忆并补齐 consolidate 情绪标记/去重与 forget 归档;0.8.0-rc.2 把 R1 主脑决策层补齐并进包——契约 `decisions[] / needsHuman`、J0–J8 判官、override 审计、14 条 fixtures 与 `--check / --explain / run-sim` 双跑(见 CHANGELOG 0.8.0-rc.2);0.8.0-rc.3 把 J8 六条裁决编码进 R1——休息/本地备忘/删记忆/改旧结论/含糊指令/改画像各一条规则与夹具,新增 J9 身份同意判官与 `E_IDENTITY_CONSENT_REQUIRED` / `E_SELF_CONSENT`(见 CHANGELOG 0.8.0-rc.3);0.8.0-rc.4 把策略拆成「通用默认 + 可选家规」——`src/router/policies/generic.json` 与 `src/policy-profile.js` 加载器、配置项 `routerPolicyProfile`、`E_ROUTE_PROFILE_UNKNOWN` / `E_ROUTE_POLICY_INVALID`(见 CHANGELOG 0.8.0-rc.4);0.8.0-rc.6 把 consolidate 的 A 组提取修复移植进包——`scope` 路由词表与 IDF 覆盖率打分、`contentTokens()` 分词、结论句路由、强制原文 `quote`、排期/低覆盖弃权,以及 `paragraphUnits()` 的 `startLine` 与 opt-in entry 切分(F6 默认关闭,见 CHANGELOG 0.8.0-rc.6);0.8.0-rc.7 把 R1 运行时影子接缝接进插件——`routerRuntime: off|shadow|on`(默认 off)、`src/router/runtime.js` 适配器、`src/tools.js` 的 `execute` 包裹与 `ctx.tools.guard`、`src/index.js` 构造注入,`on` 只拒绝高风险写入(见 CHANGELOG 0.8.0-rc.7);0.8.0-rc.8 增加可选 peer `@kenz1117/dsh-engram`、`src/deps.js` 启动自检与 `scripts/longlive-doctor.mjs`(只读 / `--json` / `--apply`),缺包只警告、不阻塞加载(见 CHANGELOG 0.8.0-rc.8);0.8.0-rc.9 把安装入口改成 `--setup` 向导——先打印缺失包/版本约束/目标 profile/确切命令/重启提示,输入大写 `YES` 才逐个执行 `dsh plugin add`,取消零副作用;新增 `--yes` 无人值守、`<DSH home>/longlive-doctor-audit.log` 审计行(consent/result/exitCode)与启动时一行 `--setup` 指引(见 CHANGELOG 0.8.0-rc.9)。
153
+ > 0.4.0 建立了记忆层;0.7.4 修了 0.7.3 的宿主版本探测激活回归,并补齐 Node 引擎声明;0.7.7 把归档卡的路径抽取改成线性扫描(见 CHANGELOG 0.7.7)。本节以 0.8.0 的行为为准。0.8.0-rc.1 新增程序性记忆并补齐 consolidate 情绪标记/去重与 forget 归档;0.8.0-rc.2 把 R1 主脑决策层补齐并进包——契约 `decisions[] / needsHuman`、决策判官、override 审计、14 条 fixtures 与 `--check / --explain / run-sim` 双跑(见 CHANGELOG 0.8.0-rc.2);0.8.0-rc.3 把 六条判定编码进 R1——休息/本地备忘/删记忆/改旧结论/含糊指令/改画像各一条规则与夹具,新增 身份同意判官与 `E_IDENTITY_CONSENT_REQUIRED` / `E_SELF_CONSENT`(见 CHANGELOG 0.8.0-rc.3);0.8.0-rc.4 把策略拆成「通用默认 + 可选家规」——`src/router/policies/generic.json` 与 `src/policy-profile.js` 加载器、配置项 `routerPolicyProfile`、`E_ROUTE_PROFILE_UNKNOWN` / `E_ROUTE_POLICY_INVALID`(见 CHANGELOG 0.8.0-rc.4);0.8.0-rc.6 把 consolidate 的 A 组提取修复移植进包——`scope` 路由词表与 IDF 覆盖率打分、`contentTokens()` 分词、结论句路由、强制原文 `quote`、排期/低覆盖弃权,以及 `paragraphUnits()` 的 `startLine` 与 opt-in entry 切分(F6 默认关闭,见 CHANGELOG 0.8.0-rc.6);0.8.0-rc.7 把 R1 运行时影子接缝接进插件——`routerRuntime: off|shadow|on`(默认 off)、`src/router/runtime.js` 适配器、`src/tools.js` 的 `execute` 包裹与 `ctx.tools.guard`、`src/index.js` 构造注入,`on` 只拒绝高风险写入(见 CHANGELOG 0.8.0-rc.7);0.8.0-rc.8 增加可选 peer `@kenz1117/dsh-engram`、`src/deps.js` 启动自检与 `scripts/longlive-doctor.mjs`(只读 / `--json` / `--apply`),缺包只警告、不阻塞加载(见 CHANGELOG 0.8.0-rc.8);0.8.0-rc.9 把安装入口改成 `--setup` 向导——先打印缺失包/版本约束/目标 profile/确切命令/重启提示,输入大写 `YES` 才逐个执行 `dsh plugin add`,取消零副作用;新增 `--yes` 无人值守、`<DSH home>/longlive-doctor-audit.log` 审计行(consent/result/exitCode)与启动时一行 `--setup` 指引(见 CHANGELOG 0.8.0-rc.9)。
154
154
  > 逐码排错见 `docs/ERRORS.md`;安装/回滚/卸载见 `QUICKSTART.md`。
155
155
 
156
156
  ### 9.1 配置与边界
@@ -200,5 +200,5 @@ src/memory/
200
200
 
201
201
  `test/memory.test.mjs` 提供 6 个用例,挂在 `test/run.mjs` 的 P6 之前:M1 索引 dry-run/完整性/幂等/人工内容保留;M2 巩固只读;M3 加固 +1/封顶/备份/正文逐字节一致;M4 遗忘 dry-run 零写入、confirm 门、记忆切片行数=移动数;M5 六条越界路径全部 `E_PATH_OUTSIDE_ROOT`;M6 严格模式下 `memoryRoot` 未配置时四个工具全部 `E_MEMORY_ROOT_UNSET`(默认根行为由 `PORT1`–`PORT3` 覆盖)。`test/portability.test.mjs` 另提供 PORT1–PORT5:默认根创建、优先级链、严格/缺失语义、宿主版本区间、随包代码与脚本零本机路径(PORT5 递归扫描 `src/**`(按 `files` 白名单)、`scripts/`、`test/`,并扫描根目录随包文件与 `docs/ERRORS.md`;其余 `docs/` 不在扫描清单内,其中标注「本机示例」的示例路径不算违规)。`TOOLS` 注册数为 22。
202
202
 
203
- 打包:`node scripts/pack.mjs` 产出 `dist/jjh32456-dsh-longlive-<version>.tgz`;是否发布到 npm registry 由维护者决定
203
+ 打包(仓库内开发脚本,npm 包不含):`node scripts/pack.mjs` 产出 `dist/jjh32456-dsh-longlive-<version>.tgz`;是否发布到 npm registry 由维护者决定
204
204
  (当前 registry 上查无此包,安装请用本地 tarball,见 `QUICKSTART.md`)。
package/cordis.patch.yml CHANGED
@@ -1,13 +1,13 @@
1
- # Defaults are intentionally complete: the plugin works with this file as-is.
1
+ # Defaults are intentionally complete: the plugin works with this file as-is.
2
2
  # The memory root defaults to <DSH home>/longlive-memory (created on first use)
3
3
  # and can be overridden here, or by DSH_LONGLIVE_MEMORY_ROOT / legacy DSH_MEM.
4
4
  # Uncomment and edit only if you want a specific location:
5
- # memoryRoot: D:/dsh-memory
5
+ # memoryRoot: <memory-root>
6
6
  # Router policy defaults to the generic profile (no personal house rules).
7
7
  # Override with a name from src/router/policies/<name>.json:
8
8
  # routerPolicyProfile: owner-rulings-2026-11-03
9
9
  #
10
- # 0.9.0-rc.1 opt-in features are all disabled here. Enabling one never enables
10
+ # 1.8.0 product default: features are all enabled here. Explicit false opts out; enabling one never enables
11
11
  # another. When several are on, message order is [user, boot, runtime, auto]:
12
12
  # boot is the identity open card (agent/pre-step, prepend:true) and auto is
13
13
  # recall (agent/pre-step, prepend:false). TurnNavigator / firstUserText locates
@@ -52,13 +52,13 @@
52
52
  # but every worker_spawn/worker_status/worker_kill call returns
53
53
  # "unavailable" until this is true.
54
54
  workers:
55
- enabled: false
55
+ enabled: true
56
56
  # 1.6.0 release default: automatic visible truncation is OFF in the
57
- # plugin code as well as here (enabled:false / mode:dryrun). To opt in,
57
+ # plugin code as well as here (enabled:true / mode:dryrun). To opt out,
58
58
  # set enabled:true and pick mode log|dryrun|request; request mode also
59
59
  # needs the out-of-app runner/watchdog to act.
60
60
  autoTruncate:
61
- enabled: false
61
+ enabled: true
62
62
  mode: dryrun
63
63
  # 1.2.0: passive observers are ON by default so the panel shows live
64
64
  # data out of the box. Both are fail-open and never call an LLM.
@@ -69,13 +69,27 @@
69
69
  filterEnabled: true
70
70
  shadowEnabled: true
71
71
  autoRecall:
72
- enabled: false
72
+ enabled: true
73
73
  topK: 3
74
74
  budgetTokens: 2000
75
75
  everyNTurns: 6
76
76
  identityCard:
77
- enabled: false
77
+ enabled: true
78
78
  path: '<memoryRoot>/STATE.md'
79
79
  presenceBus:
80
- enabled: false
80
+ enabled: true
81
81
  pollMs: 3000
82
+ # 1.6.8: shared-brain activity stream (event-level writes, merged from the
83
+ # 1.6.1-rc.1 batch). On by default in 1.8.0; independent of presenceBus. When on,
84
+ # activity events append rows to <memoryRoot>/.longlive/board/activity.jsonl
85
+ # and agent/pre-step injects only rows newer than this session's lastSeenSeq. On by default in 1.8.0.
86
+ sharedBrain:
87
+ activity:
88
+ enabled: true
89
+ injectMaxChars: 300
90
+ maxItems: 5
91
+ # 1.6.9: memory/recall/forget v2 panel API (M2-F 16 read-only routes +
92
+ # M2-G 16 actions + HMAC audit + panel integrity). On by default; when
93
+ # off, NO route is registered and no v2 file is created (behaviour = 1.6.8). On by default in 1.8.0.
94
+ memoryV2:
95
+ enabled: true
@@ -0,0 +1,92 @@
1
+ # ANSWER-GUARD(有据才答)· 1.8.0
2
+
3
+ 本文件说明 1.8.0 合并进 longlive 的有据才答层(answer-guard)的来源、开关、接线、评测入口与打包边界。
4
+
5
+ ## 1. 来源与版本
6
+
7
+ - 上游:`<answer-guard-repo>`(answer-guard 1.6.5-rc.1;冻结见 `eval/gate3/frozen-fix-2/FROZEN-MANIFEST.json`)。
8
+ - 1.8.0 合并:`src/answer/` 六类文件(语义拆分,实现单源在 `guard.js`):
9
+ - `guard.js` ← 上游 `core.mjs`(规则/证据检索/数字与轮号检测/审计行计算,纯函数单源);
10
+ - `evidence.js` ← 证据注入面(`retrieveEvidence` / `renderEvidencePacket` / 无证据标记等语义导出,转发 `guard.js`);
11
+ - `second-hop.mjs` ← B4 证据包字段覆盖不足时的第二跳补读(最多 1 跳);
12
+ - `audit.js` ← 上游 `store.js`(生成后审计落盘/轮转/读回)+ 审计纯函数转发;
13
+ - `query.js` ← 上游 `tool.js`(只读工具 `answer_audit`);
14
+ - `index.js` ← 上游 `index.js`(`registerAnswerGuard`:pre-step 证据注入、systemPrompt 规则 section、session/event turn/end 审计、只读面板路由)。
15
+ - 历史修复随合并带入:`HISTORY_CUE_RE` 的「上一次/上回/上上轮」族 + 审计上下文尾部保留/显式截断(`contextTruncated` 可机读)。
16
+ - 1.8.0 新增:**M1 信心闸(审计级)**、**M1.5 文本层硬规则**、**R1 检索断链修复**(见 §2、§3)。
17
+
18
+ ## 2. 开关(1.8.0 默认 ON)
19
+
20
+ - `answerGuard.enabled` 默认 `true`(`src/config.js` schema;`resolveActivationSwitches` 的 `answerGuardEnabled` 为运行期统一门)。
21
+ - 独立 kill switch:`answerGuard.enabled: false`,或环境变量 `DSH_LONGLIVE_DISABLE_ANSWER_GUARD=1`。
22
+ - 关闭时行为:零 hook、零系统提示 section、零审计 IO(`registerAnswerGuard` 不注册,`src/index.js` 不创建 `answer_audit` 工具)。
23
+ - 其他子开关(默认值):`audit=true`、`auditMaxBytes=2 MiB`、`auditContextChars=40000`、`systemPromptSection=true`、`injectRule=true`、`panel=true`、`maxEvidenceTurns=3`、`evidenceMinScore=1.8`、`evidenceMaxChars=4000`、`maxHistoryTurns=80`。
24
+ - **信心闸(M1)默认关闭**:`answerGuard.gate.enabled=false`;这不是 answer-guard 总开关,关闭时审计与注入仍按 1.8.0 原行为运行,系统提示逐字节不变。
25
+
26
+ ### 2.1 信心闸(M1 / M1.5)配置
27
+
28
+ | 键 | 默认值 | 说明 |
29
+ |---|---|---|
30
+ | `answerGuard.gate.enabled` | `false` | M1 灰度开关。只有 `true` 时 `auditTurn` 才做三态判定并写 `gate` 字段;默认关=保持 1.8.0 现状。 |
31
+ | `answerGuard.gate.minCoverage` | `0.6` | 有事实断言的句子中,带轮号引用或 `【推断】` 标注的最低比例。低于此值判 `degraded`。 |
32
+ | `answerGuard.gate.requireReadable` | `true` | 草稿引用的轮号必须在本轮证据包轮次内且 excerpt 非空;不可回读时判 `abstain`。 |
33
+ | `answerGuard.gate.conflictPolicy` | `degrade` | 证据冲突策略:`degrade`(降级,默认)或 `abstain`(弃答)。 |
34
+
35
+ - 开启方式(profile 的插件 config,YAML 示例):
36
+
37
+ ```yaml
38
+ - id: session-longlive
39
+ config:
40
+ answerGuard:
41
+ enabled: true # 1.8.0 默认已是 true;显式保留便于审计
42
+ gate:
43
+ enabled: true # M1 信心闸灰度开关(默认 false)
44
+ minCoverage: 0.6
45
+ requireReadable: true
46
+ conflictPolicy: degrade
47
+ ```
48
+
49
+ - `gate` 目前**只有配置开关,没有独立环境变量**;整个 answer-guard 的 kill switch 仍是 `DSH_LONGLIVE_DISABLE_ANSWER_GUARD=1`(或 `answerGuard.enabled=false`)。
50
+ - M1 是**审计级**:`auditTurn` 产出三态 `gate.mode`(`answer`/`degraded`/`abstain`)、`gate.reasons`、`gate.signals`、`gate.assertions`,并写入审计行 `gateVersion=1`;不直接改写助手正文。开启后若模型应弃答却输出事实断言,记 `GATE_ABSTAIN_VIOLATION`;应降级但首句没有「不确定」标注,记 `GATE_DEGRADED_MISSING`。
51
+ - M1.5 是**文本层硬规则**:`gate.enabled=true` 时,系统提示追加 `GATE_RULE_TEXT`(无证据不许作答、只用白名单轮号、每个事实句带引用、数字必须能在 excerpt 找到、未标注推断=幻觉等);`gate.enabled=false` 时只注入原 `RULE_TEXT`,不改变既有行为。
52
+ - 回退:把 `answerGuard.gate.enabled` 改回 `false`(或删除 `gate` 块)即可一键回到 M1 之前的现状,无需卸载/重启以外的其他操作。
53
+
54
+ ## 3. 检索断链修复(R1)
55
+
56
+ - `evidenceMaxChars` 默认值 **1200 → 4000**:证据包总预算扩大,避免主证据被截掉。
57
+ - `renderEvidencePacket` 的助手 excerpt 窗口 **300 → 800**:答案点落在第 300–800 字区间时不再「注入了但看不到答案」。
58
+ - `HISTORY_CUE_RE` 新增 **「当时 / 那时 / 那次 / 当天」**:这些说法现在也触发历史检索与轮号引用规则;`HISTORY_CLAIM_RE` 同步覆盖对应的历史断言。
59
+ - 检索层仍只读、fail-open;证据不足/通道读不到时不会伪装成「零命中」逼模型弃答(沿用 1.8.0 原语义)。
60
+ - 相关评测:`test/answer-history-cue.test.mjs` 覆盖 cue 触发;`test/answer-evidence-context.test.mjs` 覆盖证据上下文/数字可回读边界。
61
+
62
+ ## 4. 接线位置
63
+
64
+ - `src/index.js`:`registerFeatures(...)` 之后,按 `resolveActivationSwitches().answerGuardEnabled` 调用 `registerAnswerGuard(ctx, config, { memoryRoot, home, now, knownTools })`;同时把 `createAnswerTools(memoryRoot)` 作为 `answerTools` 传给 `registerTools`(基线 22 工具 + `answer_audit`)。
65
+ - `agent/pre-step`(最外层,`prepend:true`):历史类问题先检索会话历史,注入证据包(`EVIDENCE_MARK`)或无证据标记(`NO_EVIDENCE_MARK`)。
66
+ - `ctx.systemPrompt.section`:静态短规则(order 9500);宿主无该能力时用隐藏消息兜底(`injectRule`);gate 开启时追加 M1.5 硬规则。
67
+ - `session/event`:逐轮收集助手正文/tool calls/工具结果,`turn/end` 写生成后审计(含 gate 字段)。
68
+ - 审计文件:`<memoryRoot>/.longlive/answer-audit/audit.jsonl`(一行一轮,只追加;超 `auditMaxBytes` 轮转到同目录 `audit.1.jsonl`;坏行只计数不抛)。
69
+ - 面板:`GET /api/longlive/answer-audit` 与 `answer_audit` 工具同源(只读)。
70
+ - 所有路径 fail-open:注册/注入/审计失败只 warn,pre-step 永远返回原 decision;gate 判定异常只置空 `gate`,不改原 flags。
71
+
72
+ ## 5. 评测入口(dev-only,不随包发布)
73
+
74
+ - 仓库内评测脚本(**npm 包不含**):`scripts/answer-eval/run-eval.mjs`:100 题确定性评测(**不调模型/不用 VM**,只跑证据层与检测器),支持 `--json --fixture <fixture-100.jsonl> --out <dir>`。
75
+ - 仓库内评测脚本(**npm 包不含**):`scripts/answer-eval/score-real.mjs` / `score-extras.mjs`:真实模型 run 的评分/聚合(Gate-3/5 用;输入需 `--run/--audit/--plan`)。
76
+ - fixture:`test/fixtures/answer-guard/fixture-100.jsonl`(dev-only,不进 npm 包)。
77
+ - 关键测试:`test/answer-guard.test.mjs`、`test/answer-history-cue.test.mjs`、`test/answer-evidence-context.test.mjs`;gate 的 dev-only 回归以 M1 合入测试为准(不进入 npm 包)。
78
+
79
+ ## 6. 打包边界
80
+
81
+ - npm `files` 白名单包含 `src/answer/*.js`、显式的 `src/answer/second-hop.mjs` 与 `docs/ANSWER-GUARD.md`。
82
+ - `scripts/answer-eval/`、`test/fixtures/answer-guard/`、`eval/` 均不进入 npm 包(dev-only),避免评测数据/私有路径进包。
83
+ - src 内无本机私有绝对路径;memoryRoot/路径均运行时解析(`process.execPath` 仅用于测试脚本 spawn,非硬编码路径)。
84
+ - 发布前用只读 `tar -tf <tgz>` 核对包内 answer 文件齐全;不要在文档任务里执行 `npm pack`(打包归 release-check)。
85
+
86
+ ## 7. 验证命令
87
+
88
+ ```powershell
89
+ $NODE = "<node-exe>" # PATH 中的 node,或本机 Node 绝对路径(不随包)
90
+ $NODE --test test/answer-guard.test.mjs test/answer-history-cue.test.mjs test/answer-evidence-context.test.mjs
91
+ # 仓库内评测脚本(npm 包不含)\n$NODE scripts/answer-eval/run-eval.mjs --json --fixture test/fixtures/answer-guard/fixture-100.jsonl --out $env:TEMP\answer-eval-out
92
+ ```
@@ -1,4 +1,4 @@
1
- # ARCHITECTURE.md — 结构、边界与数据流(1.5.0,≤150 行)
1
+ # ARCHITECTURE.md — 结构、边界与数据流(1.8.0,≤150 行)
2
2
 
3
3
  读者:要知道"谁在什么时候写哪个文件、为什么不能都在宿主里做"的运维/排障人员。
4
4
 
@@ -58,7 +58,7 @@
58
58
  | 压缩分析 | `src/compaction.js` | `shadowedEvents` / `stillStored` / `reclaimed`(磁盘回读才算) | 宿主内(只读) |
59
59
  | live 保护 | `src/live-target.js` | 三路判定"会话是否还在跑";`SESSION_IS_RUNNING`(工具层只 import 其中的 id 辅助函数,不做三路探测) | 宿主内(仅 id 判定)+ CLI |
60
60
  | live 注册表 | `src/live.js` | 行读写、effectiveState、prune | 宿主内 |
61
- | 心跳 | `src/heartbeat.js` | turn 事件 + 15s 定时刷新已绑定行;`0` 关闭 | 宿主内 |
61
+ | 心跳 | `src/heartbeat.js` | turn 边界状态机维护 state/turn + 15s 定时/tool touch 刷新已绑定行;`0` 只关定时与 touch | 宿主内 |
62
62
  | 记忆存储 | `src/memory/*.js` | 卡片、索引、巩固、遗忘、程序卡、检索 | 宿主内 |
63
63
  | 路径解析 | `src/memory/paths.js` | memoryRoot 五级优先、越界检查、严格模式 | 宿主内 |
64
64
  | R1 运行时 | `src/router/runtime.js` | off/shadow/on;只拦 4 个 memory 工具;fail-closed | 宿主内 |
@@ -66,7 +66,8 @@
66
66
  | runner | `scripts/auto-truncate-run.ps1` | 校验→关应用→切→验证→重启;退出码 0/2/3/4/5/6 | **宿主外** |
67
67
  | CLI | `scripts/truncate-cli.mjs` | 无工具层的最小切口;自带 live 拒绝 | **宿主外** |
68
68
  | doctor | `scripts/longlive-doctor.mjs` | 可选依赖/版本/安装计划;默认只读 | **宿主外** |
69
- | 面板 | `@jjh32456/dsh-longlive-panel@0.2.5` | 六层视图/截断记录/过滤器决策(未并入,显示样例)/影子记录/常驻 Router,只读 | 独立可选插件 |
69
+ | 面板 | `@jjh32456/dsh-longlive-panel@1.8.0` | 六层视图/截断记录/过滤器决策(未并入,显示样例)/影子记录/常驻 Router,只读 | 独立可选插件 |
70
+ | 共享大脑活动流 | `src/activity/*`(`sharedBrain.activity`,1.8.0 起默认开启) | 事件级写活动行(同 key ≤1 条/10s;turn/end 写结论行)到 `.longlive/board/activity.jsonl`;agent/pre-step 只注入其他会话的增量(判重/蒸馏/500 条窗口);与 `presenceBus` 解耦 | 宿主内(只写记忆根) |
70
71
  | 校验器 | `<tools-dir>\ops\tools\verify-truncation.mjs`(本机示例,不在包内) | V1–V7 结构验收;不写不修 | **宿主外** |
71
72
 
72
73
  ---
@@ -49,7 +49,7 @@ fixture 见 `test/fixtures/pre-step-container.mjs`:`PreStepBus.waterfall()`
49
49
 
50
50
  `assertInjectionSource()` 会拒绝任何别的形状。宿主据此把消息投影为 **context
51
51
  节点**,`isVisibleChatNode()` 返回 false:聊天里看不到,但 `deriveMessages` 仍
52
- 含正文。审计入口是**潜望镜**面板,不是聊天气泡。这也是“回忆不可见”的实现基础。
52
+ 含正文。审计入口是**潜望镜**面板(1.8.0:`GET /api/longlive-panel/v2/state` 返回 27 条路由 / 18 个动作;「本轮想起」读 `.longlive/recall-log.jsonl`),不是聊天气泡。这也是“回忆不可见”的实现基础。
53
53
 
54
54
  ## 顺序合并
55
55
 
@@ -1,6 +1,6 @@
1
1
  # 自动想起(auto-recall)
2
2
 
3
- 0.9.0-rc.1 把 auto-recall 作为**默认关闭**的可选能力收进主包。打开后,它在本轮
3
+ 0.9.0-rc.1 把 auto-recall 作为可选能力收进主包。**1.8.0 起默认开启**(未显式给则 `true`,仅字面 `false` 关闭);开启时它在本轮
4
4
  `agent/pre-step` 的 waterfall 末端读取 memoryRoot 下的卡片,挑与当前用户消息
5
5
  最相关的几段,作为一条合成 user 消息并入本轮上下文。
6
6
 
@@ -15,12 +15,12 @@ config:
15
15
  everyNTurns: 6
16
16
  ```
17
17
 
18
- 默认值:`enabled: false`、`topK: 3`、`budgetTokens: 2000`、`everyNTurns: 6`。
19
- `enabled: false` 时与 0.8.0 完全一致。
18
+ 默认值:`enabled: true`(1.8.0 起)、`topK: 3`、`budgetTokens: 2000`、`everyNTurns: 6`。
19
+ 显式 `enabled: false` 时零注入,行为与无此能力时一致。
20
20
 
21
- ## 语义召回(embedding,默认关闭)
21
+ ## 语义召回(embedding,1.8.0 起默认开启;模型缺失静默退关键词)
22
22
 
23
- 在关键词之外,可以再挂一个**本地**向量召回。它和 `autoRecall` 是两个独立的开关:
23
+ 在关键词之外,可以再挂一个**本地**向量召回(1.8.0 起默认开;模型缺失时静默走关键词)。它和 `autoRecall` 是两个独立的开关:
24
24
  `embedding.enabled` 只决定“有没有向量”,`autoRecall.enabled` 决定“要不要自动注入”。
25
25
 
26
26
  ```yaml
@@ -67,6 +67,12 @@ config:
67
67
  - 隐私过滤先过 gate(`DSH_PRIVACY_GATE` 指向的外部 gate 或本地 PII 规则),
68
68
  命中私密片段就不注入。
69
69
 
70
+ ### 卡片层与链接(1.8.0)
71
+
72
+ - **AutoCard**:每个 EventRecord 一条派生索引卡(`.longlive/index/cards.jsonl`,`eventId` 幂等),带 `anchor {sessionId,turn,seqStart,seqEnd,digest}`;逐行 HMAC 签名,`anchor.digest` 用 `turnDigest` 与 L0 校活,注入时带 `[原文 sessionId#turn]`。
73
+ - **精卡 sidecar 回链**:`.longlive/index/card-anchors.jsonl` 记录人工 `topics/` 卡到源文件的锚点;`legacy:true` = 无可用锚点,**不计入「已链接」**(本机基线 25 张 → linked 7 / legacy 18)。
74
+ - **自动蒸馏/自动结论**:`autoConclusion` 1.8.0 起默认开启(显式 `false` 关闭);蒸馏/遗忘口径见 `M2D-FORGETTING.md`,签名与信任边界见 `CONFIG.md` §1.11b。
75
+
70
76
  ## 什么时候想、什么时候安静
71
77
 
72
78
  - 只在 `payload.step === 1` 触发;同一轮后续 step 不重复注入。
@@ -114,10 +120,10 @@ id 的字典序。
114
120
 
115
121
  ## 测试
116
122
 
117
- - `test/auto-recall.test.mjs`
118
- - `test/embedding-recall.test.mjs`(tokenizer / 增量缓存 / 融合 / recall-log)
119
- - `test/integration-pre-step.test.mjs`
123
+ - 仓库测试(npm 包不含):`test/auto-recall.test.mjs`
124
+ - 仓库测试(npm 包不含):`test/embedding-recall.test.mjs`(tokenizer / 增量缓存 / 融合 / recall-log)
125
+ - 仓库测试(npm 包不含):`test/integration-pre-step.test.mjs`
120
126
  - `test/v4-hardening.test.mjs`
121
- - `test/feature-flags.test.mjs`(默认关闭与单开关隔离)
127
+ - `test/feature-flags.test.mjs`(默认值与单开关隔离)
122
128
 
123
129
  统一入口:`node test/run-rc.mjs`。