@remnic/core 1.1.12 → 1.1.14

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 (1324) hide show
  1. package/dist/access-cli.d.ts +2 -1
  2. package/dist/access-cli.js +263 -82
  3. package/dist/access-cli.js.map +1 -1
  4. package/dist/access-http.d.ts +26 -60
  5. package/dist/access-http.js +43 -29
  6. package/dist/access-mcp.d.ts +24 -6
  7. package/dist/access-mcp.js +35 -28
  8. package/dist/access-schema.d.ts +9 -6
  9. package/dist/access-schema.js +7 -5
  10. package/dist/access-service-DcCDmNYC.d.ts +1542 -0
  11. package/dist/access-service.d.ts +25 -7
  12. package/dist/access-service.js +33 -26
  13. package/dist/active-memory-bridge.js +2 -2
  14. package/dist/active-recall.js +11 -3
  15. package/dist/active-recall.js.map +1 -1
  16. package/dist/adapters/claude-code.d.ts +24 -0
  17. package/dist/adapters/claude-code.js +9 -0
  18. package/dist/adapters/codex.d.ts +25 -0
  19. package/dist/adapters/codex.js +9 -0
  20. package/dist/adapters/hermes.d.ts +35 -0
  21. package/dist/adapters/hermes.js +9 -0
  22. package/dist/adapters/index.d.ts +6 -0
  23. package/dist/adapters/index.js +26 -0
  24. package/dist/adapters/registry.d.ts +20 -0
  25. package/dist/adapters/registry.js +13 -0
  26. package/dist/adapters/replit.d.ts +28 -0
  27. package/dist/adapters/replit.js +9 -0
  28. package/dist/adapters/types.d.ts +43 -0
  29. package/dist/adapters/types.js +8 -0
  30. package/dist/bootstrap.d.ts +20 -5
  31. package/dist/boxes.d.ts +7 -0
  32. package/dist/boxes.js +1 -1
  33. package/dist/briefing.d.ts +5 -3
  34. package/dist/briefing.js +9 -6
  35. package/dist/buffer-surprise-report.js +1 -1
  36. package/dist/buffer.d.ts +18 -4
  37. package/dist/buffer.js +1 -1
  38. package/dist/calibration.js +4 -4
  39. package/dist/capsule-cli.d.ts +4 -4
  40. package/dist/capsule-cli.js +1 -1
  41. package/dist/capsule-crypto-5CYAGVC5.js +18 -0
  42. package/dist/capsule-merge-4MGKE7C5.js +189 -0
  43. package/dist/causal-behavior.d.ts +8 -28
  44. package/dist/causal-behavior.js +6 -3
  45. package/dist/causal-behavior.js.map +1 -1
  46. package/dist/causal-chain.js +3 -2
  47. package/dist/causal-consolidation.d.ts +1 -1
  48. package/dist/causal-consolidation.js +24 -13
  49. package/dist/causal-consolidation.js.map +1 -1
  50. package/dist/causal-retrieval.js +3 -3
  51. package/dist/causal-trajectory.js +1 -1
  52. package/dist/chunk-25MQ7IHJ.js +427 -0
  53. package/dist/chunk-25MQ7IHJ.js.map +1 -0
  54. package/dist/chunk-2F2W355T.js +256 -0
  55. package/dist/chunk-2F2W355T.js.map +1 -0
  56. package/dist/chunk-2KI4QFHU.js +228 -0
  57. package/dist/chunk-2KI4QFHU.js.map +1 -0
  58. package/dist/chunk-2PRQG7PV.js +86 -0
  59. package/dist/chunk-2PRQG7PV.js.map +1 -0
  60. package/dist/chunk-2QR3XXIC.js +2272 -0
  61. package/dist/chunk-2QR3XXIC.js.map +1 -0
  62. package/dist/chunk-2WWLHTZY.js +121 -0
  63. package/dist/chunk-326G7DJK.js +2185 -0
  64. package/dist/chunk-326G7DJK.js.map +1 -0
  65. package/dist/chunk-34DQE4KF.js +174 -0
  66. package/dist/chunk-34DQE4KF.js.map +1 -0
  67. package/dist/chunk-3APJ5EVB.js +601 -0
  68. package/dist/chunk-3APJ5EVB.js.map +1 -0
  69. package/dist/chunk-3HPAPHUK.js +51 -0
  70. package/dist/chunk-3HPAPHUK.js.map +1 -0
  71. package/dist/chunk-3JXBXXM2.js +69 -0
  72. package/dist/chunk-3JXBXXM2.js.map +1 -0
  73. package/dist/chunk-3KW65B36.js +681 -0
  74. package/dist/chunk-3KW65B36.js.map +1 -0
  75. package/dist/chunk-3UXOZBHV.js +20 -0
  76. package/dist/chunk-3UXOZBHV.js.map +1 -0
  77. package/dist/chunk-3VAL7ZL2.js +266 -0
  78. package/dist/chunk-3VAL7ZL2.js.map +1 -0
  79. package/dist/chunk-3Y4P7RXM.js +31 -0
  80. package/dist/chunk-3Y4P7RXM.js.map +1 -0
  81. package/dist/chunk-47VWKCAF.js +273 -0
  82. package/dist/chunk-47VWKCAF.js.map +1 -0
  83. package/dist/chunk-4CRG46BG.js +271 -0
  84. package/dist/chunk-5375UYTQ.js +914 -0
  85. package/dist/chunk-5375UYTQ.js.map +1 -0
  86. package/dist/chunk-56K5QLHX.js +506 -0
  87. package/dist/chunk-56K5QLHX.js.map +1 -0
  88. package/dist/chunk-5RGLBDQF.js +596 -0
  89. package/dist/chunk-5RGLBDQF.js.map +1 -0
  90. package/dist/chunk-5UZXUTVO.js +9 -0
  91. package/dist/chunk-5UZXUTVO.js.map +1 -0
  92. package/dist/chunk-65PG43EQ.js +105 -0
  93. package/dist/chunk-65PG43EQ.js.map +1 -0
  94. package/dist/chunk-66DHUKLO.js +57 -0
  95. package/dist/chunk-66DHUKLO.js.map +1 -0
  96. package/dist/chunk-6FC5EGNV.js +46 -0
  97. package/dist/chunk-6FC5EGNV.js.map +1 -0
  98. package/dist/chunk-6H2TESSP.js +62 -0
  99. package/dist/chunk-6H2TESSP.js.map +1 -0
  100. package/dist/chunk-6LVVDPJ4.js +32 -0
  101. package/dist/chunk-6LVVDPJ4.js.map +1 -0
  102. package/dist/chunk-6RVI47ZR.js +159 -0
  103. package/dist/chunk-6RVI47ZR.js.map +1 -0
  104. package/dist/chunk-7AAT6G4Q.js +5117 -0
  105. package/dist/chunk-7AAT6G4Q.js.map +1 -0
  106. package/dist/chunk-7DTASS5T.js +29 -0
  107. package/dist/chunk-7DTASS5T.js.map +1 -0
  108. package/dist/chunk-7IASACLB.js +596 -0
  109. package/dist/chunk-7MNMYOFP.js +32 -0
  110. package/dist/chunk-7MNMYOFP.js.map +1 -0
  111. package/dist/chunk-7N4KAIGN.js +133 -0
  112. package/dist/chunk-7N4KAIGN.js.map +1 -0
  113. package/dist/chunk-7OZ53EXP.js +101 -0
  114. package/dist/chunk-7OZ53EXP.js.map +1 -0
  115. package/dist/chunk-7XYTQGCC.js +134 -0
  116. package/dist/chunk-7XYTQGCC.js.map +1 -0
  117. package/dist/chunk-A2XUIMJ3.js +341 -0
  118. package/dist/chunk-A2XUIMJ3.js.map +1 -0
  119. package/dist/chunk-AGZQD76C.js +201 -0
  120. package/dist/chunk-AGZQD76C.js.map +1 -0
  121. package/dist/chunk-APO3DCMU.js +361 -0
  122. package/dist/chunk-APO3DCMU.js.map +1 -0
  123. package/dist/chunk-BFBF3XEF.js +283 -0
  124. package/dist/chunk-BFBF3XEF.js.map +1 -0
  125. package/dist/chunk-BJ3KMYTB.js +1974 -0
  126. package/dist/chunk-BJ3KMYTB.js.map +1 -0
  127. package/dist/chunk-CHEL3SKB.js +6758 -0
  128. package/dist/chunk-CHEL3SKB.js.map +1 -0
  129. package/dist/chunk-CQZRLNMV.js +1491 -0
  130. package/dist/chunk-CQZRLNMV.js.map +1 -0
  131. package/dist/chunk-D46YSIYX.js +892 -0
  132. package/dist/chunk-D46YSIYX.js.map +1 -0
  133. package/dist/chunk-DINWEURR.js +648 -0
  134. package/dist/chunk-DINWEURR.js.map +1 -0
  135. package/dist/chunk-DK5LDEQM.js +530 -0
  136. package/dist/chunk-DK5LDEQM.js.map +1 -0
  137. package/dist/chunk-DOM4GKSW.js +34 -0
  138. package/dist/chunk-DOM4GKSW.js.map +1 -0
  139. package/dist/chunk-EDTHC6UD.js +1075 -0
  140. package/dist/chunk-EFJ3MQ4V.js +721 -0
  141. package/dist/chunk-EHRTFRWW.js +89 -0
  142. package/dist/chunk-EHRTFRWW.js.map +1 -0
  143. package/dist/chunk-FAJ7FZYM.js +11 -0
  144. package/dist/chunk-FAJ7FZYM.js.map +1 -0
  145. package/dist/chunk-FBYESMQ2.js +570 -0
  146. package/dist/chunk-FDU6HUUL.js +147 -0
  147. package/dist/chunk-FF4KLI5W.js +99 -0
  148. package/dist/chunk-FF4KLI5W.js.map +1 -0
  149. package/dist/chunk-FIT6DMX6.js +310 -0
  150. package/dist/chunk-FIT6DMX6.js.map +1 -0
  151. package/dist/chunk-FJ43PRLT.js +272 -0
  152. package/dist/chunk-FJ43PRLT.js.map +1 -0
  153. package/dist/chunk-FKFMOY3N.js +32 -0
  154. package/dist/chunk-FKFMOY3N.js.map +1 -0
  155. package/dist/chunk-FLTNHQK6.js +262 -0
  156. package/dist/chunk-FLTNHQK6.js.map +1 -0
  157. package/dist/chunk-GA454ALV.js +12436 -0
  158. package/dist/chunk-GA454ALV.js.map +1 -0
  159. package/dist/chunk-GGKRUQOO.js +228 -0
  160. package/dist/chunk-GIF42EW3.js +63 -0
  161. package/dist/chunk-GIF42EW3.js.map +1 -0
  162. package/dist/chunk-GL6I6MEQ.js +647 -0
  163. package/dist/chunk-H3ME6L6D.js +709 -0
  164. package/dist/chunk-H3ME6L6D.js.map +1 -0
  165. package/dist/chunk-HHLLAQGZ.js +1 -0
  166. package/dist/chunk-HXXBL2KD.js +2040 -0
  167. package/dist/chunk-I5V2VDIW.js +219 -0
  168. package/dist/chunk-I5V2VDIW.js.map +1 -0
  169. package/dist/chunk-I6K5FBRQ.js +35 -0
  170. package/dist/chunk-I6K5FBRQ.js.map +1 -0
  171. package/dist/chunk-ICRIXAP2.js +121 -0
  172. package/dist/chunk-ICRIXAP2.js.map +1 -0
  173. package/dist/chunk-J4EB7DNW.js +11 -0
  174. package/dist/chunk-J4EB7DNW.js.map +1 -0
  175. package/dist/chunk-JLFA7DQG.js +62 -0
  176. package/dist/chunk-JLFA7DQG.js.map +1 -0
  177. package/dist/chunk-KJTKLXTH.js +9 -0
  178. package/dist/chunk-KJTKLXTH.js.map +1 -0
  179. package/dist/chunk-KLAO5DGL.js +917 -0
  180. package/dist/chunk-KLAO5DGL.js.map +1 -0
  181. package/dist/chunk-KNKUID7G.js +183 -0
  182. package/dist/chunk-KOSORCJG.js +624 -0
  183. package/dist/chunk-KOSORCJG.js.map +1 -0
  184. package/dist/chunk-KUJVMMZQ.js +1262 -0
  185. package/dist/chunk-KUJVMMZQ.js.map +1 -0
  186. package/dist/chunk-LCR46JY5.js +123 -0
  187. package/dist/chunk-LCR46JY5.js.map +1 -0
  188. package/dist/chunk-LLQ2LLWF.js +148 -0
  189. package/dist/chunk-LLQ2LLWF.js.map +1 -0
  190. package/dist/chunk-LPMVBPA3.js +236 -0
  191. package/dist/chunk-LT3NLYSI.js +50 -0
  192. package/dist/chunk-LT3NLYSI.js.map +1 -0
  193. package/dist/chunk-LUDTDZLK.js +287 -0
  194. package/dist/chunk-LUDTDZLK.js.map +1 -0
  195. package/dist/chunk-M23FSH32.js +3963 -0
  196. package/dist/chunk-M23FSH32.js.map +1 -0
  197. package/dist/chunk-MC26UJIM.js +118 -0
  198. package/dist/chunk-ME6ESPZU.js +119 -0
  199. package/dist/chunk-ME6ESPZU.js.map +1 -0
  200. package/dist/chunk-MGKYQQYF.js +272 -0
  201. package/dist/chunk-MJFNCJXV.js +66 -0
  202. package/dist/chunk-MJFNCJXV.js.map +1 -0
  203. package/dist/chunk-MSWG7JI6.js +237 -0
  204. package/dist/chunk-MSWG7JI6.js.map +1 -0
  205. package/dist/chunk-MT25YHYH.js +141 -0
  206. package/dist/chunk-MT25YHYH.js.map +1 -0
  207. package/dist/chunk-MT4HVDUZ.js +53 -0
  208. package/dist/chunk-MY6TPVXW.js +219 -0
  209. package/dist/chunk-N2D6GXBM.js +267 -0
  210. package/dist/chunk-N2D6GXBM.js.map +1 -0
  211. package/dist/chunk-NJ3MJQZX.js +46 -0
  212. package/dist/chunk-NJ3MJQZX.js.map +1 -0
  213. package/dist/chunk-NMZY542O.js +335 -0
  214. package/dist/chunk-NMZY542O.js.map +1 -0
  215. package/dist/chunk-NNVTUXEB.js +23 -0
  216. package/dist/chunk-NZL6GGQE.js +375 -0
  217. package/dist/chunk-NZL6GGQE.js.map +1 -0
  218. package/dist/chunk-P4NEIHUT.js +108 -0
  219. package/dist/chunk-P7FMDTKL.js +103 -0
  220. package/dist/chunk-P7FMDTKL.js.map +1 -0
  221. package/dist/chunk-PHK3HARR.js +32 -0
  222. package/dist/chunk-PHK3HARR.js.map +1 -0
  223. package/dist/chunk-PIRJPV5T.js +98 -0
  224. package/dist/chunk-PIRJPV5T.js.map +1 -0
  225. package/dist/chunk-PK7H5L6Y.js +159 -0
  226. package/dist/chunk-PK7H5L6Y.js.map +1 -0
  227. package/dist/chunk-PR5FBTFU.js +233 -0
  228. package/dist/chunk-PR5FBTFU.js.map +1 -0
  229. package/dist/chunk-PU63GXWS.js +174 -0
  230. package/dist/chunk-PU63GXWS.js.map +1 -0
  231. package/dist/chunk-PZIAX57I.js +124 -0
  232. package/dist/chunk-PZIAX57I.js.map +1 -0
  233. package/dist/chunk-Q7P4WJDP.js +26 -0
  234. package/dist/chunk-Q7P4WJDP.js.map +1 -0
  235. package/dist/chunk-QQUAB63I.js +63 -0
  236. package/dist/chunk-QQUAB63I.js.map +1 -0
  237. package/dist/chunk-QRNI5JBH.js +18 -0
  238. package/dist/chunk-RHY3HH7P.js +601 -0
  239. package/dist/chunk-RHY3HH7P.js.map +1 -0
  240. package/dist/chunk-RRF5UOBJ.js +91 -0
  241. package/dist/chunk-RXDLTSWT.js +124 -0
  242. package/dist/chunk-RXDLTSWT.js.map +1 -0
  243. package/dist/chunk-RYED3SPJ.js +42 -0
  244. package/dist/chunk-RYED3SPJ.js.map +1 -0
  245. package/dist/chunk-S7KDBTWT.js +106 -0
  246. package/dist/chunk-S7KDBTWT.js.map +1 -0
  247. package/dist/chunk-SEDEKFYQ.js +1 -0
  248. package/dist/chunk-TECVW3JP.js +36 -0
  249. package/dist/chunk-TECVW3JP.js.map +1 -0
  250. package/dist/chunk-TFO23QT4.js +88 -0
  251. package/dist/chunk-TFO23QT4.js.map +1 -0
  252. package/dist/chunk-TK4UEOSK.js +76 -0
  253. package/dist/chunk-TK4UEOSK.js.map +1 -0
  254. package/dist/chunk-TKWGAOLV.js +122 -0
  255. package/dist/chunk-TKWGAOLV.js.map +1 -0
  256. package/dist/chunk-TMM4S4IJ.js +597 -0
  257. package/dist/chunk-TMM4S4IJ.js.map +1 -0
  258. package/dist/chunk-TMQLARTH.js +188 -0
  259. package/dist/chunk-TMQLARTH.js.map +1 -0
  260. package/dist/chunk-TPDBFYEG.js +130 -0
  261. package/dist/chunk-TPDBFYEG.js.map +1 -0
  262. package/dist/chunk-TPMQ3G6Z.js +145 -0
  263. package/dist/chunk-TPMQ3G6Z.js.map +1 -0
  264. package/dist/chunk-TZOLIGIG.js +61 -0
  265. package/dist/chunk-TZOLIGIG.js.map +1 -0
  266. package/dist/chunk-U3PN77QT.js +113 -0
  267. package/dist/chunk-U3WSW6PZ.js +277 -0
  268. package/dist/chunk-U4SCL7B7.js +640 -0
  269. package/dist/chunk-U4SCL7B7.js.map +1 -0
  270. package/dist/chunk-UWK5OXUJ.js +156 -0
  271. package/dist/chunk-UWK5OXUJ.js.map +1 -0
  272. package/dist/chunk-UWVJF25J.js +74 -0
  273. package/dist/chunk-UXHQAFNA.js +1317 -0
  274. package/dist/chunk-UXHQAFNA.js.map +1 -0
  275. package/dist/chunk-V5OCT34X.js +1 -0
  276. package/dist/chunk-VLXA6PI2.js +304 -0
  277. package/dist/chunk-VLXA6PI2.js.map +1 -0
  278. package/dist/chunk-VNO6ZJ35.js +500 -0
  279. package/dist/chunk-VNO6ZJ35.js.map +1 -0
  280. package/dist/chunk-VW676BEI.js +827 -0
  281. package/dist/chunk-VW676BEI.js.map +1 -0
  282. package/dist/chunk-W3LR522O.js +2296 -0
  283. package/dist/chunk-W4L6CZKA.js +96 -0
  284. package/dist/chunk-W4L6CZKA.js.map +1 -0
  285. package/dist/chunk-W4RVMTHR.js +372 -0
  286. package/dist/chunk-W4RVMTHR.js.map +1 -0
  287. package/dist/chunk-WEHSQBFR.js +188 -0
  288. package/dist/chunk-WEHSQBFR.js.map +1 -0
  289. package/dist/chunk-WELDCG6C.js +380 -0
  290. package/dist/chunk-WELDCG6C.js.map +1 -0
  291. package/dist/chunk-WZYKANL3.js +2800 -0
  292. package/dist/chunk-WZYKANL3.js.map +1 -0
  293. package/dist/chunk-XIG5PDM7.js +48 -0
  294. package/dist/chunk-XJNBEDFE.js +193 -0
  295. package/dist/chunk-XJNBEDFE.js.map +1 -0
  296. package/dist/chunk-XVVIG67A.js +291 -0
  297. package/dist/chunk-XVVIG67A.js.map +1 -0
  298. package/dist/chunk-XVZ7B3HG.js +135 -0
  299. package/dist/chunk-YBPYIAA5.js +73 -0
  300. package/dist/chunk-YBPYIAA5.js.map +1 -0
  301. package/dist/chunk-Z734BLO3.js +21 -0
  302. package/dist/chunk-Z734BLO3.js.map +1 -0
  303. package/dist/chunk-ZKSK55RC.js +269 -0
  304. package/dist/chunk-ZKSK55RC.js.map +1 -0
  305. package/dist/chunk-ZTFCYYEZ.js +69 -0
  306. package/dist/chunk-ZTFCYYEZ.js.map +1 -0
  307. package/dist/chunk-ZY2MNJR6.js +329 -0
  308. package/dist/chunk-ZY2MNJR6.js.map +1 -0
  309. package/dist/cli-D3VpkVwB.d.ts +1136 -0
  310. package/dist/cli.d.ts +39 -10
  311. package/dist/cli.js +108 -49
  312. package/dist/commitment-ledger.js +1 -1
  313. package/dist/compat/checks.d.ts +5 -0
  314. package/dist/compat/checks.js +11 -0
  315. package/dist/compat/checks.js.map +1 -0
  316. package/dist/compat/types.d.ts +30 -0
  317. package/dist/compat/types.js +1 -0
  318. package/dist/compat/types.js.map +1 -0
  319. package/dist/compounding/engine.d.ts +221 -0
  320. package/dist/compounding/engine.js +32 -0
  321. package/dist/compounding/engine.js.map +1 -0
  322. package/dist/compounding/preference-consolidator.d.ts +92 -0
  323. package/dist/compounding/preference-consolidator.js +553 -0
  324. package/dist/compounding/preference-consolidator.js.map +1 -0
  325. package/dist/config.d.ts +4 -2
  326. package/dist/config.js +9 -4
  327. package/dist/conflict-policy-DyJ2wd-h.d.ts +4 -0
  328. package/dist/connectors/codex-materialize-runner.d.ts +64 -0
  329. package/dist/connectors/codex-materialize-runner.js +33 -0
  330. package/dist/connectors/codex-materialize-runner.js.map +1 -0
  331. package/dist/connectors/codex-materialize.d.ts +195 -0
  332. package/dist/connectors/codex-materialize.js +38 -0
  333. package/dist/connectors/codex-materialize.js.map +1 -0
  334. package/dist/connectors/index.d.ts +444 -0
  335. package/dist/connectors/index.js +115 -0
  336. package/dist/connectors/index.js.map +1 -0
  337. package/dist/connectors-cli-CwbyjGR7.d.ts +257 -0
  338. package/dist/connectors-cli.d.ts +1 -1
  339. package/dist/consolidation-provenance-check.d.ts +3 -1
  340. package/dist/consolidation-undo.d.ts +3 -1
  341. package/dist/contradiction/index.d.ts +258 -0
  342. package/dist/contradiction/index.js +43 -0
  343. package/dist/contradiction/index.js.map +1 -0
  344. package/dist/contradiction-review-ATP4S6IC.js +30 -0
  345. package/dist/contradiction-review-ATP4S6IC.js.map +1 -0
  346. package/dist/contradiction-scan-5A4IDZV5.js +13 -0
  347. package/dist/contradiction-scan-5A4IDZV5.js.map +1 -0
  348. package/dist/conversation-index/backend.d.ts +97 -0
  349. package/dist/conversation-index/backend.js +13 -0
  350. package/dist/conversation-index/backend.js.map +1 -0
  351. package/dist/conversation-index/chunker.d.ts +16 -0
  352. package/dist/conversation-index/chunker.js +8 -0
  353. package/dist/conversation-index/chunker.js.map +1 -0
  354. package/dist/conversation-index/cleanup.d.ts +11 -0
  355. package/dist/conversation-index/cleanup.js +9 -0
  356. package/dist/conversation-index/cleanup.js.map +1 -0
  357. package/dist/conversation-index/faiss-adapter.d.ts +6 -0
  358. package/dist/conversation-index/faiss-adapter.js +16 -0
  359. package/dist/conversation-index/faiss-adapter.js.map +1 -0
  360. package/dist/conversation-index/indexer.d.ts +23 -0
  361. package/dist/conversation-index/indexer.js +15 -0
  362. package/dist/conversation-index/indexer.js.map +1 -0
  363. package/dist/conversation-index/search.d.ts +6 -0
  364. package/dist/conversation-index/search.js +11 -0
  365. package/dist/conversation-index/search.js.map +1 -0
  366. package/dist/embedding-fallback.js +2 -2
  367. package/dist/enrichment/index.d.ts +163 -0
  368. package/dist/enrichment/index.js +18 -0
  369. package/dist/enrichment/index.js.map +1 -0
  370. package/dist/entity-retrieval.d.ts +4 -2
  371. package/dist/entity-retrieval.js +8 -5
  372. package/dist/evals.js +1 -1
  373. package/dist/explicit-capture.d.ts +20 -5
  374. package/dist/explicit-capture.js +2 -2
  375. package/dist/extraction-judge-training.js +1 -1
  376. package/dist/extraction.js +8 -8
  377. package/dist/faiss-adapter-CzPghc4C.d.ts +70 -0
  378. package/dist/fallback-llm.d.ts +2 -0
  379. package/dist/fallback-llm.js +4 -4
  380. package/dist/graph-edge-decay-5DI5GUNL.js +207 -0
  381. package/dist/index.d.ts +66 -711
  382. package/dist/index.js +556 -2680
  383. package/dist/index.js.map +1 -1
  384. package/dist/lcm/archive.d.ts +89 -0
  385. package/dist/lcm/archive.js +12 -0
  386. package/dist/lcm/archive.js.map +1 -0
  387. package/dist/lcm/dag.d.ts +48 -0
  388. package/dist/lcm/dag.js +8 -0
  389. package/dist/lcm/dag.js.map +1 -0
  390. package/dist/lcm/engine.d.ts +116 -0
  391. package/dist/lcm/engine.js +20 -0
  392. package/dist/lcm/engine.js.map +1 -0
  393. package/dist/lcm/index.d.ts +12 -0
  394. package/dist/lcm/index.js +44 -0
  395. package/dist/lcm/index.js.map +1 -0
  396. package/dist/lcm/queue.d.ts +62 -0
  397. package/dist/lcm/queue.js +8 -0
  398. package/dist/lcm/queue.js.map +1 -0
  399. package/dist/lcm/recall.d.ts +20 -0
  400. package/dist/lcm/recall.js +8 -0
  401. package/dist/lcm/recall.js.map +1 -0
  402. package/dist/lcm/schema.d.ts +16 -0
  403. package/dist/lcm/schema.js +14 -0
  404. package/dist/lcm/schema.js.map +1 -0
  405. package/dist/lcm/summarizer.d.ts +38 -0
  406. package/dist/lcm/summarizer.js +12 -0
  407. package/dist/lcm/summarizer.js.map +1 -0
  408. package/dist/lcm/tools.d.ts +29 -0
  409. package/dist/lcm/tools.js +8 -0
  410. package/dist/lcm/tools.js.map +1 -0
  411. package/dist/live-connectors-runner.js +5 -5
  412. package/dist/local-llm.js +3 -3
  413. package/dist/maintenance/archive-observations.d.ts +18 -0
  414. package/dist/maintenance/archive-observations.js +8 -0
  415. package/dist/maintenance/archive-observations.js.map +1 -0
  416. package/dist/maintenance/backup-stamp.d.ts +3 -0
  417. package/dist/maintenance/backup-stamp.js +8 -0
  418. package/dist/maintenance/backup-stamp.js.map +1 -0
  419. package/dist/maintenance/memory-governance-cron.d.ts +85 -0
  420. package/dist/maintenance/memory-governance-cron.js +22 -0
  421. package/dist/maintenance/memory-governance-cron.js.map +1 -0
  422. package/dist/maintenance/memory-governance.d.ts +137 -0
  423. package/dist/maintenance/memory-governance.js +40 -0
  424. package/dist/maintenance/memory-governance.js.map +1 -0
  425. package/dist/maintenance/migrate-observations.d.ts +18 -0
  426. package/dist/maintenance/migrate-observations.js +9 -0
  427. package/dist/maintenance/migrate-observations.js.map +1 -0
  428. package/dist/maintenance/observation-ledger-utils.d.ts +10 -0
  429. package/dist/maintenance/observation-ledger-utils.js +10 -0
  430. package/dist/maintenance/observation-ledger-utils.js.map +1 -0
  431. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +15 -0
  432. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +28 -0
  433. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js.map +1 -0
  434. package/dist/maintenance/rebuild-memory-projection.d.ts +77 -0
  435. package/dist/maintenance/rebuild-memory-projection.js +35 -0
  436. package/dist/maintenance/rebuild-memory-projection.js.map +1 -0
  437. package/dist/maintenance/rebuild-observations.d.ts +17 -0
  438. package/dist/maintenance/rebuild-observations.js +9 -0
  439. package/dist/maintenance/rebuild-observations.js.map +1 -0
  440. package/dist/mcp-memory-inspector-app.d.ts +24 -6
  441. package/dist/memory-projection-store.d.ts +108 -3
  442. package/dist/memory-projection-store.js +2 -1
  443. package/dist/memory-worth-outcomes.d.ts +4 -2
  444. package/dist/migrate/from-engram.d.ts +24 -0
  445. package/dist/migrate/from-engram.js +12 -0
  446. package/dist/migrate/from-engram.js.map +1 -0
  447. package/dist/namespaces/migrate.d.ts +50 -0
  448. package/dist/namespaces/migrate.js +50 -0
  449. package/dist/namespaces/migrate.js.map +1 -0
  450. package/dist/namespaces/principal.d.ts +17 -0
  451. package/dist/namespaces/principal.js +16 -0
  452. package/dist/namespaces/principal.js.map +1 -0
  453. package/dist/namespaces/search.d.ts +46 -0
  454. package/dist/namespaces/search.js +28 -0
  455. package/dist/namespaces/search.js.map +1 -0
  456. package/dist/namespaces/storage.d.ts +32 -0
  457. package/dist/namespaces/storage.js +28 -0
  458. package/dist/namespaces/storage.js.map +1 -0
  459. package/dist/network/tailscale.d.ts +41 -0
  460. package/dist/network/tailscale.js +9 -0
  461. package/dist/network/tailscale.js.map +1 -0
  462. package/dist/network/webdav.d.ts +39 -0
  463. package/dist/network/webdav.js +10 -0
  464. package/dist/network/webdav.js.map +1 -0
  465. package/dist/objective-state-writers.js +2 -2
  466. package/dist/operator-toolkit.d.ts +4 -2
  467. package/dist/operator-toolkit.js +32 -14
  468. package/dist/opik-exporter.js +2 -2
  469. package/dist/opik-exporter.js.map +1 -1
  470. package/dist/orchestrator-DuWl9Hwx.d.ts +1244 -0
  471. package/dist/orchestrator.d.ts +22 -7
  472. package/dist/orchestrator.js +79 -44
  473. package/dist/path-MR5JPYOP.js +9 -0
  474. package/dist/path-MR5JPYOP.js.map +1 -0
  475. package/dist/qmd-recall-cache.d.ts +1 -1
  476. package/dist/qmd.d.ts +102 -3
  477. package/dist/qmd.js +23 -5
  478. package/dist/recall-explain-renderer.js +3 -3
  479. package/dist/recall-xray-cli.js +4 -4
  480. package/dist/recall-xray-renderer.js +3 -3
  481. package/dist/recall-xray.js +2 -2
  482. package/dist/replay/normalizers/chatgpt.d.ts +6 -0
  483. package/dist/replay/normalizers/chatgpt.js +11 -0
  484. package/dist/replay/normalizers/chatgpt.js.map +1 -0
  485. package/dist/replay/normalizers/claude.d.ts +6 -0
  486. package/dist/replay/normalizers/claude.js +11 -0
  487. package/dist/replay/normalizers/claude.js.map +1 -0
  488. package/dist/replay/normalizers/openclaw.d.ts +6 -0
  489. package/dist/replay/normalizers/openclaw.js +11 -0
  490. package/dist/replay/normalizers/openclaw.js.map +1 -0
  491. package/dist/replay/normalizers/shared.d.ts +16 -0
  492. package/dist/replay/normalizers/shared.js +14 -0
  493. package/dist/replay/normalizers/shared.js.map +1 -0
  494. package/dist/replay/runner.d.ts +35 -0
  495. package/dist/replay/runner.js +16 -0
  496. package/dist/replay/runner.js.map +1 -0
  497. package/dist/replay/types.d.ts +57 -0
  498. package/dist/replay/types.js +19 -0
  499. package/dist/replay/types.js.map +1 -0
  500. package/dist/resolution-B7FNQSSP.js +12 -0
  501. package/dist/resolution-B7FNQSSP.js.map +1 -0
  502. package/dist/resolve-provider-secret.js +2 -2
  503. package/dist/resume-bundles.js +8 -6
  504. package/dist/retrieval-agents.d.ts +1 -1
  505. package/dist/routing/engine.d.ts +35 -0
  506. package/dist/routing/engine.js +16 -0
  507. package/dist/routing/engine.js.map +1 -0
  508. package/dist/routing/store.d.ts +27 -0
  509. package/dist/routing/store.js +10 -0
  510. package/dist/routing/store.js.map +1 -0
  511. package/dist/runtime/better-sqlite.d.ts +8 -0
  512. package/dist/runtime/better-sqlite.js +10 -0
  513. package/dist/runtime/better-sqlite.js.map +1 -0
  514. package/dist/runtime/child-process.d.ts +32 -0
  515. package/dist/runtime/child-process.js +10 -0
  516. package/dist/runtime/child-process.js.map +1 -0
  517. package/dist/runtime/env.d.ts +5 -0
  518. package/dist/runtime/env.js +12 -0
  519. package/dist/runtime/env.js.map +1 -0
  520. package/dist/schemas.d.ts +22 -22
  521. package/dist/sdk-compat.js +1 -1
  522. package/dist/search/document-scanner.d.ts +22 -0
  523. package/dist/search/document-scanner.js +8 -0
  524. package/dist/search/document-scanner.js.map +1 -0
  525. package/dist/search/embed-helper.d.ts +35 -0
  526. package/dist/search/embed-helper.js +9 -0
  527. package/dist/search/embed-helper.js.map +1 -0
  528. package/dist/search/factory.d.ts +32 -0
  529. package/dist/search/factory.js +29 -0
  530. package/dist/search/factory.js.map +1 -0
  531. package/dist/search/index.d.ts +15 -0
  532. package/dist/search/index.js +50 -0
  533. package/dist/search/index.js.map +1 -0
  534. package/dist/search/lancedb-backend.d.ts +51 -0
  535. package/dist/search/lancedb-backend.js +10 -0
  536. package/dist/search/lancedb-backend.js.map +1 -0
  537. package/dist/search/meilisearch-backend.d.ts +48 -0
  538. package/dist/search/meilisearch-backend.js +10 -0
  539. package/dist/search/meilisearch-backend.js.map +1 -0
  540. package/dist/search/noop-backend.d.ts +26 -0
  541. package/dist/search/noop-backend.js +8 -0
  542. package/dist/search/noop-backend.js.map +1 -0
  543. package/dist/search/orama-backend.d.ts +53 -0
  544. package/dist/search/orama-backend.js +10 -0
  545. package/dist/search/orama-backend.js.map +1 -0
  546. package/dist/search/port.d.ts +61 -0
  547. package/dist/search/port.js +1 -0
  548. package/dist/search/port.js.map +1 -0
  549. package/dist/search/remote-backend.d.ts +39 -0
  550. package/dist/search/remote-backend.js +9 -0
  551. package/dist/search/remote-backend.js.map +1 -0
  552. package/dist/secure-store/index.d.ts +890 -0
  553. package/dist/secure-store/index.js +156 -0
  554. package/dist/secure-store/index.js.map +1 -0
  555. package/dist/semantic-VwGI14Ok.d.ts +69 -0
  556. package/dist/semantic-consolidation-4HkHWgeI.d.ts +180 -0
  557. package/dist/semantic-consolidation.d.ts +2 -2
  558. package/dist/semantic-consolidation.js +13 -6
  559. package/dist/semantic-rule-promotion.js +8 -5
  560. package/dist/semantic-rule-verifier.js +8 -5
  561. package/dist/shared-context/manager.d.ts +131 -0
  562. package/dist/shared-context/manager.js +15 -0
  563. package/dist/shared-context/manager.js.map +1 -0
  564. package/dist/skills-registry.js +13 -1
  565. package/dist/skills-registry.js.map +1 -1
  566. package/dist/state-store-VZU2IA53.js +16 -0
  567. package/dist/state-store-VZU2IA53.js.map +1 -0
  568. package/dist/storage-paths.d.ts +9 -0
  569. package/dist/storage-paths.js +20 -0
  570. package/dist/storage-paths.js.map +1 -0
  571. package/dist/storage.d.ts +3 -1
  572. package/dist/storage.js +7 -4
  573. package/dist/summarizer.d.ts +5 -0
  574. package/dist/summarizer.js +9 -8
  575. package/dist/summary-snapshot.js +2 -1
  576. package/dist/surfaces/dreams.d.ts +16 -0
  577. package/dist/surfaces/dreams.js +282 -0
  578. package/dist/surfaces/dreams.js.map +1 -0
  579. package/dist/surfaces/heartbeat.d.ts +17 -0
  580. package/dist/surfaces/heartbeat.js +265 -0
  581. package/dist/surfaces/heartbeat.js.map +1 -0
  582. package/dist/temporal-supersession.d.ts +3 -1
  583. package/dist/threading.d.ts +5 -0
  584. package/dist/threading.js +2 -1
  585. package/dist/tier-migration.d.ts +4 -2
  586. package/dist/tokens.js +2 -2
  587. package/dist/transcript.d.ts +15 -1
  588. package/dist/transcript.js +2 -1
  589. package/dist/transfer/autodetect.d.ts +4 -0
  590. package/dist/transfer/autodetect.js +15 -0
  591. package/dist/transfer/autodetect.js.map +1 -0
  592. package/dist/transfer/backup.d.ts +21 -0
  593. package/dist/transfer/backup.js +17 -0
  594. package/dist/transfer/backup.js.map +1 -0
  595. package/dist/transfer/capsule-export.d.ts +113 -0
  596. package/dist/transfer/capsule-export.js +19 -0
  597. package/dist/transfer/capsule-export.js.map +1 -0
  598. package/dist/transfer/capsule-import.d.ts +124 -0
  599. package/dist/transfer/capsule-import.js +16 -0
  600. package/dist/transfer/capsule-import.js.map +1 -0
  601. package/dist/transfer/constants.d.ts +13 -0
  602. package/dist/transfer/constants.js +12 -0
  603. package/dist/transfer/constants.js.map +1 -0
  604. package/dist/transfer/export-json.d.ts +11 -0
  605. package/dist/transfer/export-json.js +11 -0
  606. package/dist/transfer/export-json.js.map +1 -0
  607. package/dist/transfer/export-md.d.ts +10 -0
  608. package/dist/transfer/export-md.js +13 -0
  609. package/dist/transfer/export-md.js.map +1 -0
  610. package/dist/transfer/export-sqlite.d.ts +9 -0
  611. package/dist/transfer/export-sqlite.js +12 -0
  612. package/dist/transfer/export-sqlite.js.map +1 -0
  613. package/dist/transfer/fs-utils.d.ts +61 -0
  614. package/dist/transfer/fs-utils.js +40 -0
  615. package/dist/transfer/fs-utils.js.map +1 -0
  616. package/dist/transfer/import-json.d.ts +16 -0
  617. package/dist/transfer/import-json.js +13 -0
  618. package/dist/transfer/import-json.js.map +1 -0
  619. package/dist/transfer/import-md.d.ts +14 -0
  620. package/dist/transfer/import-md.js +11 -0
  621. package/dist/transfer/import-md.js.map +1 -0
  622. package/dist/transfer/import-sqlite.d.ts +14 -0
  623. package/dist/transfer/import-sqlite.js +12 -0
  624. package/dist/transfer/import-sqlite.js.map +1 -0
  625. package/dist/transfer/sqlite-schema.d.ts +4 -0
  626. package/dist/transfer/sqlite-schema.js +10 -0
  627. package/dist/transfer/sqlite-schema.js.map +1 -0
  628. package/dist/transfer/types.d.ts +916 -0
  629. package/dist/transfer/types.js +30 -0
  630. package/dist/transfer/types.js.map +1 -0
  631. package/dist/types.d.ts +28 -1
  632. package/dist/types.js +1 -1
  633. package/dist/verified-recall.js +9 -6
  634. package/dist/work/board.d.ts +43 -0
  635. package/dist/work/board.js +14 -0
  636. package/dist/work/board.js.map +1 -0
  637. package/dist/work/boundary.d.ts +8 -0
  638. package/dist/work/boundary.js +14 -0
  639. package/dist/work/boundary.js.map +1 -0
  640. package/dist/work/storage.d.ts +39 -0
  641. package/dist/work/storage.js +11 -0
  642. package/dist/work/storage.js.map +1 -0
  643. package/dist/work/types.d.ts +75 -0
  644. package/dist/work/types.js +1 -0
  645. package/dist/work/types.js.map +1 -0
  646. package/package.json +2767 -6
  647. package/scripts/faiss_index.py +816 -0
  648. package/scripts/faiss_requirements.txt +3 -0
  649. package/skills/remnic-entities/SKILL.md +51 -0
  650. package/skills/remnic-memory-workflow/SKILL.md +61 -0
  651. package/skills/remnic-recall/SKILL.md +51 -0
  652. package/skills/remnic-remember/SKILL.md +56 -0
  653. package/skills/remnic-search/SKILL.md +51 -0
  654. package/skills/remnic-status/SKILL.md +51 -0
  655. package/src/abort-error.test.ts +49 -0
  656. package/src/abort-error.ts +46 -0
  657. package/src/abstraction-nodes.ts +162 -0
  658. package/src/access-audit.test.ts +178 -0
  659. package/src/access-audit.ts +125 -0
  660. package/src/access-cli.test.ts +439 -0
  661. package/src/access-cli.ts +438 -0
  662. package/src/access-http.test.ts +225 -0
  663. package/src/access-http.ts +1899 -0
  664. package/src/access-idempotency.ts +232 -0
  665. package/src/access-mcp.test.ts +568 -0
  666. package/src/access-mcp.ts +3056 -0
  667. package/src/access-schema-pi.test.ts +60 -0
  668. package/src/access-schema.ts +522 -0
  669. package/src/access-service-namespace.test.ts +123 -0
  670. package/src/access-service.ts +5629 -0
  671. package/src/action-confidence.test.ts +206 -0
  672. package/src/action-confidence.ts +466 -0
  673. package/src/active-memory-bridge.test.ts +285 -0
  674. package/src/active-memory-bridge.ts +217 -0
  675. package/src/active-recall.test.ts +484 -0
  676. package/src/active-recall.ts +459 -0
  677. package/src/adapters/claude-code.ts +56 -0
  678. package/src/adapters/codex.ts +57 -0
  679. package/src/adapters/hermes.ts +64 -0
  680. package/src/adapters/index.ts +6 -0
  681. package/src/adapters/registry.ts +41 -0
  682. package/src/adapters/replit.ts +55 -0
  683. package/src/adapters/types.ts +51 -0
  684. package/src/behavior-learner.ts +144 -0
  685. package/src/behavior-signals.ts +73 -0
  686. package/src/binary-lifecycle/backend.ts +117 -0
  687. package/src/binary-lifecycle/index.ts +35 -0
  688. package/src/binary-lifecycle/manifest.ts +79 -0
  689. package/src/binary-lifecycle/pipeline.ts +352 -0
  690. package/src/binary-lifecycle/scanner.ts +89 -0
  691. package/src/binary-lifecycle/types.ts +89 -0
  692. package/src/bootstrap.ts +178 -0
  693. package/src/boxes.ts +521 -0
  694. package/src/briefing.test.ts +1535 -0
  695. package/src/briefing.ts +1382 -0
  696. package/src/buffer-session.test.ts +443 -0
  697. package/src/buffer-surprise-report.ts +176 -0
  698. package/src/buffer-surprise-telemetry.test.ts +606 -0
  699. package/src/buffer-surprise-trigger.test.ts +766 -0
  700. package/src/buffer-surprise.test.ts +339 -0
  701. package/src/buffer-surprise.ts +203 -0
  702. package/src/buffer.ts +900 -0
  703. package/src/bulk-import/cli-command.test.ts +204 -0
  704. package/src/bulk-import/index.ts +34 -0
  705. package/src/bulk-import/pipeline.test.ts +445 -0
  706. package/src/bulk-import/pipeline.ts +178 -0
  707. package/src/bulk-import/registry.test.ts +151 -0
  708. package/src/bulk-import/registry.ts +72 -0
  709. package/src/bulk-import/types.test.ts +272 -0
  710. package/src/bulk-import/types.ts +145 -0
  711. package/src/calibration.ts +394 -0
  712. package/src/capsule-cli.test.ts +398 -0
  713. package/src/capsule-cli.ts +565 -0
  714. package/src/causal-behavior.ts +308 -0
  715. package/src/causal-chain.ts +419 -0
  716. package/src/causal-consolidation.ts +370 -0
  717. package/src/causal-retrieval.ts +286 -0
  718. package/src/causal-trajectory-graph.ts +60 -0
  719. package/src/causal-trajectory.ts +303 -0
  720. package/src/chunking.ts +220 -0
  721. package/src/citations.ts +232 -0
  722. package/src/cli.ts +9403 -0
  723. package/src/codex-cli-fallback.ts +162 -0
  724. package/src/codex-thread-key.ts +1 -0
  725. package/src/coding/access-coding-context.test.ts +197 -0
  726. package/src/coding/coding-branch-scope.test.ts +281 -0
  727. package/src/coding/coding-namespace.test.ts +360 -0
  728. package/src/coding/coding-namespace.ts +412 -0
  729. package/src/coding/coding-orchestrator.test.ts +249 -0
  730. package/src/coding/git-context.test.ts +507 -0
  731. package/src/coding/git-context.ts +336 -0
  732. package/src/coding/mcp-set-coding-context.test.ts +174 -0
  733. package/src/coding/review-context.test.ts +316 -0
  734. package/src/coding/review-context.ts +349 -0
  735. package/src/coding/wire-coding-context.test.ts +468 -0
  736. package/src/commitment-ledger.test.ts +78 -0
  737. package/src/commitment-ledger.ts +337 -0
  738. package/src/compat/checks.test.ts +206 -0
  739. package/src/compat/checks.ts +716 -0
  740. package/src/compat/types.ts +33 -0
  741. package/src/compounding/engine.ts +1686 -0
  742. package/src/compounding/preference-consolidator.ts +778 -0
  743. package/src/compression-optimizer.ts +312 -0
  744. package/src/config.test.ts +930 -0
  745. package/src/config.ts +3807 -0
  746. package/src/connectors/codex/instructions.md +160 -0
  747. package/src/connectors/codex/resources/namespace-cheatsheet.md +48 -0
  748. package/src/connectors/codex-marketplace.ts +500 -0
  749. package/src/connectors/codex-materialize-runner.ts +212 -0
  750. package/src/connectors/codex-materialize.ts +983 -0
  751. package/src/connectors/coerce.ts +62 -0
  752. package/src/connectors/index.test.ts +1570 -0
  753. package/src/connectors/index.ts +3222 -0
  754. package/src/connectors/live/framework.ts +164 -0
  755. package/src/connectors/live/github.test.ts +1218 -0
  756. package/src/connectors/live/github.ts +1068 -0
  757. package/src/connectors/live/gmail.test.ts +1706 -0
  758. package/src/connectors/live/gmail.ts +1293 -0
  759. package/src/connectors/live/google-drive.test.ts +696 -0
  760. package/src/connectors/live/google-drive.ts +724 -0
  761. package/src/connectors/live/index.ts +101 -0
  762. package/src/connectors/live/live-connectors.test.ts +689 -0
  763. package/src/connectors/live/notion.test.ts +1109 -0
  764. package/src/connectors/live/notion.ts +978 -0
  765. package/src/connectors/live/registry.ts +103 -0
  766. package/src/connectors/live/state-store.ts +399 -0
  767. package/src/connectors/live/transient-errors.ts +150 -0
  768. package/src/connectors/weclone-installer.test.ts +850 -0
  769. package/src/connectors-cli.ts +513 -0
  770. package/src/console/state.test.ts +224 -0
  771. package/src/console/state.ts +514 -0
  772. package/src/console/trace.test.ts +813 -0
  773. package/src/console/trace.ts +603 -0
  774. package/src/console/tui.test.ts +582 -0
  775. package/src/console/tui.ts +508 -0
  776. package/src/consolidation-operator.ts +182 -0
  777. package/src/consolidation-provenance-check.ts +551 -0
  778. package/src/consolidation-undo.ts +718 -0
  779. package/src/contradiction/contradiction-judge.test.ts +189 -0
  780. package/src/contradiction/contradiction-judge.ts +333 -0
  781. package/src/contradiction/contradiction-review.ts +574 -0
  782. package/src/contradiction/contradiction-scan.ts +504 -0
  783. package/src/contradiction/contradiction.test.ts +2230 -0
  784. package/src/contradiction/index.ts +37 -0
  785. package/src/contradiction/resolution.ts +383 -0
  786. package/src/conversation-index/backend.ts +323 -0
  787. package/src/conversation-index/chunker.ts +47 -0
  788. package/src/conversation-index/cleanup.ts +53 -0
  789. package/src/conversation-index/faiss-adapter.ts +384 -0
  790. package/src/conversation-index/indexer.test.ts +164 -0
  791. package/src/conversation-index/indexer.ts +192 -0
  792. package/src/conversation-index/search.ts +37 -0
  793. package/src/cross-namespace-budget.test.ts +275 -0
  794. package/src/cross-namespace-budget.ts +365 -0
  795. package/src/cue-anchors.ts +163 -0
  796. package/src/curation/index.ts +544 -0
  797. package/src/dashboard-runtime.ts +337 -0
  798. package/src/day-summary.ts +122 -0
  799. package/src/dedup/index.ts +330 -0
  800. package/src/dedup/semantic.test.ts +1577 -0
  801. package/src/dedup/semantic.ts +148 -0
  802. package/src/delinearize.ts +193 -0
  803. package/src/direct-answer-wiring.test.ts +473 -0
  804. package/src/direct-answer-wiring.ts +180 -0
  805. package/src/direct-answer.test.ts +484 -0
  806. package/src/direct-answer.ts +273 -0
  807. package/src/embedding-fallback.ts +565 -0
  808. package/src/enrichment/audit.ts +89 -0
  809. package/src/enrichment/index.ts +27 -0
  810. package/src/enrichment/pipeline.ts +197 -0
  811. package/src/enrichment/provider-registry.ts +85 -0
  812. package/src/enrichment/types.ts +100 -0
  813. package/src/enrichment/web-search-provider.ts +63 -0
  814. package/src/entity-retrieval.ts +774 -0
  815. package/src/entity-schema.ts +239 -0
  816. package/src/evals.ts +1312 -0
  817. package/src/event-order-recall.test.ts +4164 -0
  818. package/src/event-order-recall.ts +2802 -0
  819. package/src/evidence-pack.test.ts +89 -0
  820. package/src/evidence-pack.ts +388 -0
  821. package/src/explicit-capture.ts +530 -0
  822. package/src/explicit-cue-recall.test.ts +3019 -0
  823. package/src/explicit-cue-recall.ts +5545 -0
  824. package/src/extraction-judge-telemetry.ts +234 -0
  825. package/src/extraction-judge-training.ts +221 -0
  826. package/src/extraction-judge.ts +846 -0
  827. package/src/extraction-timeout.test.ts +265 -0
  828. package/src/extraction.ts +2719 -0
  829. package/src/fallback-llm.test.ts +1060 -0
  830. package/src/fallback-llm.ts +918 -0
  831. package/src/focused-list-recall.test.ts +734 -0
  832. package/src/focused-list-recall.ts +1160 -0
  833. package/src/graph-dashboard-diff.ts +35 -0
  834. package/src/graph-dashboard-key.ts +5 -0
  835. package/src/graph-dashboard-parser.ts +104 -0
  836. package/src/graph-edge-reinforcement.ts +192 -0
  837. package/src/graph-events.ts +151 -0
  838. package/src/graph-recall.test.ts +164 -0
  839. package/src/graph-recall.ts +189 -0
  840. package/src/graph-retrieval.test.ts +809 -0
  841. package/src/graph-retrieval.ts +823 -0
  842. package/src/graph-snapshot.ts +329 -0
  843. package/src/graph.ts +813 -0
  844. package/src/harmonic-retrieval.ts +223 -0
  845. package/src/himem.ts +154 -0
  846. package/src/hygiene.ts +87 -0
  847. package/src/identity-continuity.ts +333 -0
  848. package/src/importance.ts +328 -0
  849. package/src/importers/base.test.ts +294 -0
  850. package/src/importers/base.ts +436 -0
  851. package/src/importers/index.ts +21 -0
  852. package/src/index.ts +1204 -0
  853. package/src/intent.ts +154 -0
  854. package/src/json-extract.ts +85 -0
  855. package/src/json-store.ts +42 -0
  856. package/src/lcm/archive.ts +617 -0
  857. package/src/lcm/dag.ts +199 -0
  858. package/src/lcm/engine.ts +645 -0
  859. package/src/lcm/index.ts +7 -0
  860. package/src/lcm/queue.test.ts +178 -0
  861. package/src/lcm/queue.ts +200 -0
  862. package/src/lcm/recall.ts +117 -0
  863. package/src/lcm/schema.ts +154 -0
  864. package/src/lcm/summarizer.ts +235 -0
  865. package/src/lcm/tools.ts +191 -0
  866. package/src/lcm-engine.test.ts +660 -0
  867. package/src/legacy-hook-compat.test.ts +20 -0
  868. package/src/legacy-hook-compat.ts +45 -0
  869. package/src/lifecycle.ts +289 -0
  870. package/src/live-connectors-runner.ts +385 -0
  871. package/src/local-llm-qos.test.ts +303 -0
  872. package/src/local-llm-thinking.test.ts +292 -0
  873. package/src/local-llm.ts +1464 -0
  874. package/src/logger.ts +49 -0
  875. package/src/maintenance/archive-observations.ts +147 -0
  876. package/src/maintenance/backup-stamp.ts +3 -0
  877. package/src/maintenance/dreams-ledger.ts +516 -0
  878. package/src/maintenance/first-start-migration.ts +362 -0
  879. package/src/maintenance/forget.test.ts +206 -0
  880. package/src/maintenance/forget.ts +126 -0
  881. package/src/maintenance/graph-edge-decay.test.ts +409 -0
  882. package/src/maintenance/graph-edge-decay.ts +394 -0
  883. package/src/maintenance/memory-governance-cron.ts +447 -0
  884. package/src/maintenance/memory-governance.ts +1039 -0
  885. package/src/maintenance/migrate-observations.ts +216 -0
  886. package/src/maintenance/observation-ledger-utils.ts +54 -0
  887. package/src/maintenance/pattern-reinforcement.test.ts +875 -0
  888. package/src/maintenance/pattern-reinforcement.ts +369 -0
  889. package/src/maintenance/purge.ts +334 -0
  890. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +78 -0
  891. package/src/maintenance/rebuild-memory-projection.ts +1234 -0
  892. package/src/maintenance/rebuild-observations.ts +178 -0
  893. package/src/maintenance/tier-stats.test.ts +378 -0
  894. package/src/maintenance/tier-stats.ts +222 -0
  895. package/src/mcp-memory-inspector-app.ts +421 -0
  896. package/src/memory-action-policy.ts +80 -0
  897. package/src/memory-cache.ts +208 -0
  898. package/src/memory-extension/claude-code-publisher.ts +51 -0
  899. package/src/memory-extension/codex-publisher.ts +149 -0
  900. package/src/memory-extension/hermes-publisher.ts +51 -0
  901. package/src/memory-extension/index.ts +100 -0
  902. package/src/memory-extension/shared-instructions.ts +133 -0
  903. package/src/memory-extension/types.ts +86 -0
  904. package/src/memory-extension-host/host-discovery.ts +276 -0
  905. package/src/memory-extension-host/index.ts +14 -0
  906. package/src/memory-extension-host/render-extensions-block.ts +73 -0
  907. package/src/memory-extension-host/types.ts +21 -0
  908. package/src/memory-lifecycle-ledger-utils.ts +116 -0
  909. package/src/memory-projection-format.ts +11 -0
  910. package/src/memory-projection-store.ts +951 -0
  911. package/src/memory-provenance.test.ts +196 -0
  912. package/src/memory-provenance.ts +484 -0
  913. package/src/memory-worth-bench.test.ts +71 -0
  914. package/src/memory-worth-bench.ts +265 -0
  915. package/src/memory-worth-filter.test.ts +209 -0
  916. package/src/memory-worth-filter.ts +204 -0
  917. package/src/memory-worth-frontmatter.test.ts +311 -0
  918. package/src/memory-worth-outcomes.test.ts +316 -0
  919. package/src/memory-worth-outcomes.ts +286 -0
  920. package/src/memory-worth.test.ts +317 -0
  921. package/src/memory-worth.ts +215 -0
  922. package/src/message-parts/index.ts +806 -0
  923. package/src/message-parts/message-parts.test.ts +421 -0
  924. package/src/migrate/from-engram.ts +789 -0
  925. package/src/model-registry.ts +313 -0
  926. package/src/models-json.ts +76 -0
  927. package/src/namespaces/migrate.ts +187 -0
  928. package/src/namespaces/path.ts +25 -0
  929. package/src/namespaces/principal.test.ts +195 -0
  930. package/src/namespaces/principal.ts +86 -0
  931. package/src/namespaces/search.test.ts +105 -0
  932. package/src/namespaces/search.ts +233 -0
  933. package/src/namespaces/storage.ts +74 -0
  934. package/src/native-knowledge.ts +1823 -0
  935. package/src/negative.ts +72 -0
  936. package/src/network/tailscale.ts +179 -0
  937. package/src/network/webdav.ts +385 -0
  938. package/src/objective-state-writers.ts +951 -0
  939. package/src/objective-state.ts +320 -0
  940. package/src/onboarding/index.ts +529 -0
  941. package/src/openai-chat-compat.ts +56 -0
  942. package/src/operator-toolkit.ts +2132 -0
  943. package/src/opik-exporter.test.ts +72 -0
  944. package/src/opik-exporter.ts +587 -0
  945. package/src/orchestrator-extraction-queue.test.ts +197 -0
  946. package/src/orchestrator-flush.test.ts +1171 -0
  947. package/src/orchestrator-pattern-reinforcement.test.ts +128 -0
  948. package/src/orchestrator-source-attribution.test.ts +701 -0
  949. package/src/orchestrator.ts +16368 -0
  950. package/src/page-versioning.ts +450 -0
  951. package/src/patterns-cli.ts +574 -0
  952. package/src/peers/index.ts +54 -0
  953. package/src/peers/migrate-from-identity-anchor.test.ts +291 -0
  954. package/src/peers/migrate-from-identity-anchor.ts +350 -0
  955. package/src/peers/peers.test.ts +419 -0
  956. package/src/peers/profile-reasoner.ts +694 -0
  957. package/src/peers/storage.ts +1350 -0
  958. package/src/peers/types.ts +138 -0
  959. package/src/plugin-id.ts +84 -0
  960. package/src/policy-runtime.ts +209 -0
  961. package/src/procedural/procedure-miner.ts +150 -0
  962. package/src/procedural/procedure-recall.ts +93 -0
  963. package/src/procedural/procedure-stats.ts +213 -0
  964. package/src/procedural/procedure-types.ts +132 -0
  965. package/src/procedural/reinforcement-core.test.ts +132 -0
  966. package/src/procedural/reinforcement-core.ts +73 -0
  967. package/src/profiling.test.ts +263 -0
  968. package/src/profiling.ts +435 -0
  969. package/src/projection/index.ts +398 -0
  970. package/src/qmd-recall-cache.test.ts +138 -0
  971. package/src/qmd-recall-cache.ts +111 -0
  972. package/src/qmd.test.ts +258 -0
  973. package/src/qmd.ts +2614 -0
  974. package/src/reasoning-trace-recall.ts +201 -0
  975. package/src/reasoning-trace-types.ts +235 -0
  976. package/src/recall-audit-anomaly.test.ts +246 -0
  977. package/src/recall-audit-anomaly.ts +297 -0
  978. package/src/recall-audit.test.ts +51 -0
  979. package/src/recall-audit.ts +72 -0
  980. package/src/recall-budget-config.test.ts +87 -0
  981. package/src/recall-disclosure-escalation.test.ts +196 -0
  982. package/src/recall-disclosure-escalation.ts +158 -0
  983. package/src/recall-disclosure-shaping.test.ts +146 -0
  984. package/src/recall-disclosure.test.ts +214 -0
  985. package/src/recall-explain-renderer.test.ts +140 -0
  986. package/src/recall-explain-renderer.ts +356 -0
  987. package/src/recall-mmr.test.ts +808 -0
  988. package/src/recall-mmr.ts +607 -0
  989. package/src/recall-qos.test.ts +85 -0
  990. package/src/recall-qos.ts +82 -0
  991. package/src/recall-query-policy.ts +221 -0
  992. package/src/recall-state.test.ts +233 -0
  993. package/src/recall-state.ts +456 -0
  994. package/src/recall-tag-filter.ts +143 -0
  995. package/src/recall-tokenization.ts +35 -0
  996. package/src/recall-xray-cli.test.ts +118 -0
  997. package/src/recall-xray-cli.ts +100 -0
  998. package/src/recall-xray-disclosure-telemetry.test.ts +183 -0
  999. package/src/recall-xray-renderer.test.ts +539 -0
  1000. package/src/recall-xray-renderer.ts +487 -0
  1001. package/src/recall-xray.test.ts +503 -0
  1002. package/src/recall-xray.ts +621 -0
  1003. package/src/reconstruct.ts +41 -0
  1004. package/src/release-changelog.ts +35 -0
  1005. package/src/relevance.ts +67 -0
  1006. package/src/replay/normalizers/chatgpt.ts +133 -0
  1007. package/src/replay/normalizers/claude.ts +102 -0
  1008. package/src/replay/normalizers/openclaw.ts +119 -0
  1009. package/src/replay/normalizers/shared.ts +69 -0
  1010. package/src/replay/runner.ts +197 -0
  1011. package/src/replay/types.ts +143 -0
  1012. package/src/rerank.test.ts +48 -0
  1013. package/src/rerank.ts +176 -0
  1014. package/src/resolve-auth-token.test.ts +226 -0
  1015. package/src/resolve-auth-token.ts +151 -0
  1016. package/src/resolve-provider-secret.test.ts +187 -0
  1017. package/src/resolve-provider-secret.ts +410 -0
  1018. package/src/response-guidance-recall.test.ts +3952 -0
  1019. package/src/response-guidance-recall.ts +4431 -0
  1020. package/src/resume-bundles.ts +415 -0
  1021. package/src/retrieval-agents.ts +623 -0
  1022. package/src/retrieval-tiers.ts +25 -0
  1023. package/src/retrieval.ts +104 -0
  1024. package/src/review/index.test.ts +201 -0
  1025. package/src/review/index.ts +536 -0
  1026. package/src/routing/engine.ts +162 -0
  1027. package/src/routing/store.ts +321 -0
  1028. package/src/runtime/better-sqlite.test.ts +32 -0
  1029. package/src/runtime/better-sqlite.ts +76 -0
  1030. package/src/runtime/child-process.ts +67 -0
  1031. package/src/runtime/env.ts +48 -0
  1032. package/src/sanitize.ts +58 -0
  1033. package/src/schemas.ts +449 -0
  1034. package/src/sdk-compat.ts +87 -0
  1035. package/src/search/document-scanner.ts +96 -0
  1036. package/src/search/embed-helper.ts +142 -0
  1037. package/src/search/factory.ts +189 -0
  1038. package/src/search/index.ts +10 -0
  1039. package/src/search/lancedb-backend.ts +342 -0
  1040. package/src/search/meilisearch-backend.ts +232 -0
  1041. package/src/search/noop-backend.ts +57 -0
  1042. package/src/search/orama-backend.ts +358 -0
  1043. package/src/search/port.ts +86 -0
  1044. package/src/search/remote-backend.ts +124 -0
  1045. package/src/secure-store/cipher.ts +271 -0
  1046. package/src/secure-store/cli-handlers.ts +355 -0
  1047. package/src/secure-store/cli-renderer.ts +131 -0
  1048. package/src/secure-store/header.ts +373 -0
  1049. package/src/secure-store/index.ts +137 -0
  1050. package/src/secure-store/kdf.ts +263 -0
  1051. package/src/secure-store/keyring.ts +106 -0
  1052. package/src/secure-store/metadata.ts +394 -0
  1053. package/src/secure-store/passphrase-reader.ts +252 -0
  1054. package/src/secure-store/secure-fs.ts +571 -0
  1055. package/src/secure-store/secure-store.test.ts +755 -0
  1056. package/src/semantic-chunking.ts +545 -0
  1057. package/src/semantic-consolidation.test.ts +182 -0
  1058. package/src/semantic-consolidation.ts +432 -0
  1059. package/src/semantic-rule-promotion.ts +183 -0
  1060. package/src/semantic-rule-verifier.ts +160 -0
  1061. package/src/session-integrity.ts +569 -0
  1062. package/src/session-observer-bands.ts +11 -0
  1063. package/src/session-observer-state.ts +346 -0
  1064. package/src/session-toggles.test.ts +96 -0
  1065. package/src/session-toggles.ts +159 -0
  1066. package/src/shared-context/manager.ts +810 -0
  1067. package/src/signal.ts +84 -0
  1068. package/src/skills-registry.test.ts +277 -0
  1069. package/src/skills-registry.ts +120 -0
  1070. package/src/source-attribution-roundtrip.test.ts +215 -0
  1071. package/src/source-attribution.test.ts +1425 -0
  1072. package/src/source-attribution.ts +639 -0
  1073. package/src/spaces/index.ts +627 -0
  1074. package/src/storage-paths.ts +117 -0
  1075. package/src/storage.ts +6657 -0
  1076. package/src/store-contract.ts +55 -0
  1077. package/src/summarizer.ts +844 -0
  1078. package/src/summary-snapshot.test.ts +681 -0
  1079. package/src/summary-snapshot.ts +238 -0
  1080. package/src/surfaces/dreams.test.ts +394 -0
  1081. package/src/surfaces/dreams.ts +346 -0
  1082. package/src/surfaces/heartbeat.test.ts +415 -0
  1083. package/src/surfaces/heartbeat.ts +325 -0
  1084. package/src/sync/index.ts +308 -0
  1085. package/src/targeted-fact-recall.test.ts +1694 -0
  1086. package/src/targeted-fact-recall.ts +2905 -0
  1087. package/src/taxonomy/default-taxonomy.ts +87 -0
  1088. package/src/taxonomy/index.ts +26 -0
  1089. package/src/taxonomy/resolver-doc-generator.ts +57 -0
  1090. package/src/taxonomy/resolver.ts +184 -0
  1091. package/src/taxonomy/taxonomy-loader.ts +186 -0
  1092. package/src/taxonomy/types.ts +48 -0
  1093. package/src/telemetry-transcript.ts +70 -0
  1094. package/src/temporal-index.ts +890 -0
  1095. package/src/temporal-supersession.test.ts +2703 -0
  1096. package/src/temporal-supersession.ts +493 -0
  1097. package/src/temporal-validity.test.ts +448 -0
  1098. package/src/temporal-validity.ts +123 -0
  1099. package/src/threading.ts +395 -0
  1100. package/src/tier-migration.ts +124 -0
  1101. package/src/tier-routing.ts +102 -0
  1102. package/src/tmt.ts +462 -0
  1103. package/src/tokens.test.ts +178 -0
  1104. package/src/tokens.ts +279 -0
  1105. package/src/topics.ts +147 -0
  1106. package/src/training-export/cli-date-validation.test.ts +258 -0
  1107. package/src/training-export/converter.test.ts +452 -0
  1108. package/src/training-export/converter.ts +319 -0
  1109. package/src/training-export/date-parse.ts +117 -0
  1110. package/src/training-export/index.ts +26 -0
  1111. package/src/training-export/registry.test.ts +85 -0
  1112. package/src/training-export/registry.ts +57 -0
  1113. package/src/training-export/types.ts +31 -0
  1114. package/src/transcript.ts +1179 -0
  1115. package/src/transfer/autodetect.ts +30 -0
  1116. package/src/transfer/backup.ts +138 -0
  1117. package/src/transfer/capsule-crypto.ts +485 -0
  1118. package/src/transfer/capsule-encrypt.test.ts +690 -0
  1119. package/src/transfer/capsule-export.ts +543 -0
  1120. package/src/transfer/capsule-fork.ts +375 -0
  1121. package/src/transfer/capsule-import.ts +564 -0
  1122. package/src/transfer/capsule-merge.ts +433 -0
  1123. package/src/transfer/conflict-policy.ts +16 -0
  1124. package/src/transfer/constants.ts +13 -0
  1125. package/src/transfer/exclusions.ts +37 -0
  1126. package/src/transfer/export-json.ts +65 -0
  1127. package/src/transfer/export-md.ts +59 -0
  1128. package/src/transfer/export-sqlite.ts +52 -0
  1129. package/src/transfer/fs-utils.ts +269 -0
  1130. package/src/transfer/import-json.ts +108 -0
  1131. package/src/transfer/import-md.ts +84 -0
  1132. package/src/transfer/import-sqlite.ts +100 -0
  1133. package/src/transfer/integrity.ts +71 -0
  1134. package/src/transfer/sqlite-schema.ts +16 -0
  1135. package/src/transfer/types.ts +297 -0
  1136. package/src/trust-zones.ts +1186 -0
  1137. package/src/types.ts +3074 -0
  1138. package/src/user-model.test.ts +124 -0
  1139. package/src/user-model.ts +162 -0
  1140. package/src/utility-learner.ts +353 -0
  1141. package/src/utility-runtime.ts +88 -0
  1142. package/src/utility-telemetry.ts +215 -0
  1143. package/src/utils/category-dir.ts +44 -0
  1144. package/src/utils/errno.ts +6 -0
  1145. package/src/utils/iso-timestamp.test.ts +37 -0
  1146. package/src/utils/iso-timestamp.ts +164 -0
  1147. package/src/utils/path.ts +26 -0
  1148. package/src/verified-recall.ts +138 -0
  1149. package/src/version-utils.test.ts +10 -0
  1150. package/src/version-utils.ts +9 -0
  1151. package/src/whitespace.ts +10 -0
  1152. package/src/work/board.ts +359 -0
  1153. package/src/work/boundary.ts +107 -0
  1154. package/src/work/storage.ts +436 -0
  1155. package/src/work/types.ts +82 -0
  1156. package/src/work-product-ledger.ts +265 -0
  1157. package/dist/access-service-DDjzFALq.d.ts +0 -2088
  1158. package/dist/capsule-crypto-SJS5VVAP.js +0 -18
  1159. package/dist/capsule-export-7QNCBZOQ.js +0 -17
  1160. package/dist/capsule-import-EPBHD2EN.js +0 -16
  1161. package/dist/capsule-merge-DI7PNQ2H.js +0 -189
  1162. package/dist/chunk-23ZZK64Y.js +0 -26
  1163. package/dist/chunk-23ZZK64Y.js.map +0 -1
  1164. package/dist/chunk-242S3I2A.js +0 -647
  1165. package/dist/chunk-2LGMW3DJ.js +0 -111
  1166. package/dist/chunk-3B6KIRBH.js +0 -5213
  1167. package/dist/chunk-3B6KIRBH.js.map +0 -1
  1168. package/dist/chunk-457A4P3L.js +0 -119
  1169. package/dist/chunk-457A4P3L.js.map +0 -1
  1170. package/dist/chunk-4IS4SXIQ.js +0 -2040
  1171. package/dist/chunk-4YM32CRU.js +0 -721
  1172. package/dist/chunk-6TBWYBJ3.js +0 -236
  1173. package/dist/chunk-74EMIVE4.js +0 -329
  1174. package/dist/chunk-74EMIVE4.js.map +0 -1
  1175. package/dist/chunk-767ODGE6.js +0 -183
  1176. package/dist/chunk-7V22HTMD.js +0 -623
  1177. package/dist/chunk-7V22HTMD.js.map +0 -1
  1178. package/dist/chunk-7ZM3BFKK.js +0 -9705
  1179. package/dist/chunk-7ZM3BFKK.js.map +0 -1
  1180. package/dist/chunk-AQJNPMOA.js +0 -643
  1181. package/dist/chunk-AQJNPMOA.js.map +0 -1
  1182. package/dist/chunk-ASAITVLA.js +0 -64
  1183. package/dist/chunk-ASAITVLA.js.map +0 -1
  1184. package/dist/chunk-BBE34QBJ.js +0 -275
  1185. package/dist/chunk-BBE34QBJ.js.map +0 -1
  1186. package/dist/chunk-BZSQEPRW.js +0 -14710
  1187. package/dist/chunk-BZSQEPRW.js.map +0 -1
  1188. package/dist/chunk-CPKTBRS2.js +0 -891
  1189. package/dist/chunk-CPKTBRS2.js.map +0 -1
  1190. package/dist/chunk-D4GAOFF6.js +0 -562
  1191. package/dist/chunk-D4GAOFF6.js.map +0 -1
  1192. package/dist/chunk-D54LZC5L.js +0 -147
  1193. package/dist/chunk-DF3RVK3X.js +0 -119
  1194. package/dist/chunk-DF3RVK3X.js.map +0 -1
  1195. package/dist/chunk-DZZPC36E.js +0 -1451
  1196. package/dist/chunk-DZZPC36E.js.map +0 -1
  1197. package/dist/chunk-E2UCDP5S.js +0 -570
  1198. package/dist/chunk-E6K4NIEU.js +0 -747
  1199. package/dist/chunk-E6K4NIEU.js.map +0 -1
  1200. package/dist/chunk-EEQLFRUM.js +0 -89
  1201. package/dist/chunk-ETOW6ACV.js +0 -158
  1202. package/dist/chunk-ETOW6ACV.js.map +0 -1
  1203. package/dist/chunk-FMEBPEAO.js +0 -347
  1204. package/dist/chunk-FMEBPEAO.js.map +0 -1
  1205. package/dist/chunk-FQDPCE3I.js +0 -1837
  1206. package/dist/chunk-FQDPCE3I.js.map +0 -1
  1207. package/dist/chunk-FYIYMQ5N.js +0 -221
  1208. package/dist/chunk-FYIYMQ5N.js.map +0 -1
  1209. package/dist/chunk-G2WADRQ3.js +0 -219
  1210. package/dist/chunk-G4SK7DSQ.js +0 -121
  1211. package/dist/chunk-GVPWB7EY.js +0 -390
  1212. package/dist/chunk-GVPWB7EY.js.map +0 -1
  1213. package/dist/chunk-HELQZFZO.js +0 -1075
  1214. package/dist/chunk-HL5LRPNA.js +0 -1914
  1215. package/dist/chunk-HL5LRPNA.js.map +0 -1
  1216. package/dist/chunk-HQZVVSVB.js +0 -147
  1217. package/dist/chunk-HQZVVSVB.js.map +0 -1
  1218. package/dist/chunk-HY3L4WKC.js +0 -2195
  1219. package/dist/chunk-HY3L4WKC.js.map +0 -1
  1220. package/dist/chunk-IB3BFHGN.js +0 -228
  1221. package/dist/chunk-IXEJRKCZ.js +0 -18
  1222. package/dist/chunk-JBMSGZEQ.js +0 -441
  1223. package/dist/chunk-JBMSGZEQ.js.map +0 -1
  1224. package/dist/chunk-JESOB2HO.js +0 -108
  1225. package/dist/chunk-JKDVIE52.js +0 -272
  1226. package/dist/chunk-JRNQ3RNA.js +0 -284
  1227. package/dist/chunk-JRNQ3RNA.js.map +0 -1
  1228. package/dist/chunk-K6WK37A6.js +0 -865
  1229. package/dist/chunk-K6WK37A6.js.map +0 -1
  1230. package/dist/chunk-MARWOCVP.js +0 -48
  1231. package/dist/chunk-MNU6ZBWT.js +0 -4454
  1232. package/dist/chunk-MNU6ZBWT.js.map +0 -1
  1233. package/dist/chunk-N5AKDXAI.js +0 -74
  1234. package/dist/chunk-OA3L7BFR.js +0 -183
  1235. package/dist/chunk-OA3L7BFR.js.map +0 -1
  1236. package/dist/chunk-OR64ZGRZ.js +0 -23
  1237. package/dist/chunk-P77UEOU2.js +0 -1521
  1238. package/dist/chunk-P77UEOU2.js.map +0 -1
  1239. package/dist/chunk-PH4C2U43.js +0 -239
  1240. package/dist/chunk-PH4C2U43.js.map +0 -1
  1241. package/dist/chunk-RVPLBATS.js +0 -1586
  1242. package/dist/chunk-RVPLBATS.js.map +0 -1
  1243. package/dist/chunk-U5JMRGKX.js +0 -340
  1244. package/dist/chunk-U5JMRGKX.js.map +0 -1
  1245. package/dist/chunk-URB2WSKZ.js +0 -350
  1246. package/dist/chunk-URB2WSKZ.js.map +0 -1
  1247. package/dist/chunk-UVMUAWVT.js +0 -596
  1248. package/dist/chunk-WEJG4TB5.js +0 -118
  1249. package/dist/chunk-X7HPGUVG.js +0 -271
  1250. package/dist/chunk-XAMBKFQS.js +0 -2777
  1251. package/dist/chunk-XAMBKFQS.js.map +0 -1
  1252. package/dist/chunk-XJKFSSDW.js +0 -726
  1253. package/dist/chunk-XJKFSSDW.js.map +0 -1
  1254. package/dist/chunk-XMHBH5H6.js +0 -283
  1255. package/dist/chunk-XMHBH5H6.js.map +0 -1
  1256. package/dist/chunk-XMVFHBHT.js +0 -277
  1257. package/dist/chunk-Y3VMVTYX.js +0 -53
  1258. package/dist/chunk-YNB73F22.js +0 -137
  1259. package/dist/chunk-YNB73F22.js.map +0 -1
  1260. package/dist/chunk-Z2E7VW55.js +0 -335
  1261. package/dist/chunk-Z2E7VW55.js.map +0 -1
  1262. package/dist/chunk-ZG7PTKBK.js +0 -2296
  1263. package/dist/chunk-ZNQN6ZTA.js +0 -135
  1264. package/dist/chunk-ZVTKDVVM.js +0 -827
  1265. package/dist/chunk-ZVTKDVVM.js.map +0 -1
  1266. package/dist/cli-BR8KpIU0.d.ts +0 -1259
  1267. package/dist/codex-materialize-CQlLTzke.d.ts +0 -139
  1268. package/dist/connectors-cli-DFGtY2DB.d.ts +0 -257
  1269. package/dist/contradiction-review-5LTTVDQV.js +0 -22
  1270. package/dist/contradiction-scan-QTXAMBUA.js +0 -414
  1271. package/dist/contradiction-scan-QTXAMBUA.js.map +0 -1
  1272. package/dist/engine-35M5BKQ7.js +0 -28
  1273. package/dist/fs-utils-IRVUFB6G.js +0 -30
  1274. package/dist/graph-edge-decay-PWB63GRE.js +0 -207
  1275. package/dist/memory-governance-IMPQZXFC.js +0 -37
  1276. package/dist/memory-projection-store-CY8TU40w.d.ts +0 -222
  1277. package/dist/orchestrator-DDMPqU6R.d.ts +0 -1792
  1278. package/dist/path-RMTY5Y5A.js +0 -9
  1279. package/dist/port-B6VEDIkC.d.ts +0 -53
  1280. package/dist/resolution-YGIBORXI.js +0 -101
  1281. package/dist/resolution-YGIBORXI.js.map +0 -1
  1282. package/dist/secure-store-4R2GSO7S.js +0 -156
  1283. package/dist/semantic-consolidation-ByBXb-sf.d.ts +0 -180
  1284. package/dist/state-store-3EH7HYIN.js +0 -16
  1285. package/dist/types-V3FJ26TF.js +0 -30
  1286. /package/dist/{capsule-crypto-SJS5VVAP.js.map → adapters/claude-code.js.map} +0 -0
  1287. /package/dist/{capsule-export-7QNCBZOQ.js.map → adapters/codex.js.map} +0 -0
  1288. /package/dist/{capsule-import-EPBHD2EN.js.map → adapters/hermes.js.map} +0 -0
  1289. /package/dist/{contradiction-review-5LTTVDQV.js.map → adapters/index.js.map} +0 -0
  1290. /package/dist/{engine-35M5BKQ7.js.map → adapters/registry.js.map} +0 -0
  1291. /package/dist/{fs-utils-IRVUFB6G.js.map → adapters/replit.js.map} +0 -0
  1292. /package/dist/{memory-governance-IMPQZXFC.js.map → adapters/types.js.map} +0 -0
  1293. /package/dist/{path-RMTY5Y5A.js.map → capsule-crypto-5CYAGVC5.js.map} +0 -0
  1294. /package/dist/{capsule-merge-DI7PNQ2H.js.map → capsule-merge-4MGKE7C5.js.map} +0 -0
  1295. /package/dist/{chunk-G4SK7DSQ.js.map → chunk-2WWLHTZY.js.map} +0 -0
  1296. /package/dist/{chunk-X7HPGUVG.js.map → chunk-4CRG46BG.js.map} +0 -0
  1297. /package/dist/{chunk-UVMUAWVT.js.map → chunk-7IASACLB.js.map} +0 -0
  1298. /package/dist/{chunk-HELQZFZO.js.map → chunk-EDTHC6UD.js.map} +0 -0
  1299. /package/dist/{chunk-4YM32CRU.js.map → chunk-EFJ3MQ4V.js.map} +0 -0
  1300. /package/dist/{chunk-E2UCDP5S.js.map → chunk-FBYESMQ2.js.map} +0 -0
  1301. /package/dist/{chunk-D54LZC5L.js.map → chunk-FDU6HUUL.js.map} +0 -0
  1302. /package/dist/{chunk-IB3BFHGN.js.map → chunk-GGKRUQOO.js.map} +0 -0
  1303. /package/dist/{chunk-242S3I2A.js.map → chunk-GL6I6MEQ.js.map} +0 -0
  1304. /package/dist/{secure-store-4R2GSO7S.js.map → chunk-HHLLAQGZ.js.map} +0 -0
  1305. /package/dist/{chunk-4IS4SXIQ.js.map → chunk-HXXBL2KD.js.map} +0 -0
  1306. /package/dist/{chunk-767ODGE6.js.map → chunk-KNKUID7G.js.map} +0 -0
  1307. /package/dist/{chunk-6TBWYBJ3.js.map → chunk-LPMVBPA3.js.map} +0 -0
  1308. /package/dist/{chunk-WEJG4TB5.js.map → chunk-MC26UJIM.js.map} +0 -0
  1309. /package/dist/{chunk-JKDVIE52.js.map → chunk-MGKYQQYF.js.map} +0 -0
  1310. /package/dist/{chunk-Y3VMVTYX.js.map → chunk-MT4HVDUZ.js.map} +0 -0
  1311. /package/dist/{chunk-G2WADRQ3.js.map → chunk-MY6TPVXW.js.map} +0 -0
  1312. /package/dist/{chunk-OR64ZGRZ.js.map → chunk-NNVTUXEB.js.map} +0 -0
  1313. /package/dist/{chunk-JESOB2HO.js.map → chunk-P4NEIHUT.js.map} +0 -0
  1314. /package/dist/{chunk-IXEJRKCZ.js.map → chunk-QRNI5JBH.js.map} +0 -0
  1315. /package/dist/{chunk-EEQLFRUM.js.map → chunk-RRF5UOBJ.js.map} +0 -0
  1316. /package/dist/{state-store-3EH7HYIN.js.map → chunk-SEDEKFYQ.js.map} +0 -0
  1317. /package/dist/{chunk-2LGMW3DJ.js.map → chunk-U3PN77QT.js.map} +0 -0
  1318. /package/dist/{chunk-XMVFHBHT.js.map → chunk-U3WSW6PZ.js.map} +0 -0
  1319. /package/dist/{chunk-N5AKDXAI.js.map → chunk-UWVJF25J.js.map} +0 -0
  1320. /package/dist/{types-V3FJ26TF.js.map → chunk-V5OCT34X.js.map} +0 -0
  1321. /package/dist/{chunk-ZG7PTKBK.js.map → chunk-W3LR522O.js.map} +0 -0
  1322. /package/dist/{chunk-MARWOCVP.js.map → chunk-XIG5PDM7.js.map} +0 -0
  1323. /package/dist/{chunk-ZNQN6ZTA.js.map → chunk-XVZ7B3HG.js.map} +0 -0
  1324. /package/dist/{graph-edge-decay-PWB63GRE.js.map → graph-edge-decay-5DI5GUNL.js.map} +0 -0
@@ -0,0 +1,875 @@
1
+ /**
2
+ * Unit tests for the pattern-reinforcement maintenance job
3
+ * (issue #687 PR 2/4).
4
+ *
5
+ * Uses an in-memory storage stub so tests focus on clustering /
6
+ * supersession / idempotency behavior without booting a full
7
+ * StorageManager. Storage round-trip for the new frontmatter fields is
8
+ * covered separately in `storage.test.ts`-style coverage that
9
+ * exercises `serializeFrontmatter` + `parseFrontmatter`.
10
+ */
11
+
12
+ import assert from "node:assert/strict";
13
+ import os from "node:os";
14
+ import path from "node:path";
15
+ import test from "node:test";
16
+ import { mkdtemp, rm } from "node:fs/promises";
17
+
18
+ import {
19
+ patternReinforcementKey,
20
+ runPatternReinforcement,
21
+ type PatternReinforcementStorage,
22
+ } from "./pattern-reinforcement.js";
23
+ import { StorageManager } from "../storage.js";
24
+ import type { MemoryFile, MemoryFrontmatter } from "../types.js";
25
+
26
+ interface StubWriteCall {
27
+ memoryId: string;
28
+ patch: Partial<MemoryFrontmatter>;
29
+ }
30
+
31
+ function makeMemory(overrides: Partial<MemoryFrontmatter> & { content?: string } = {}): MemoryFile {
32
+ const { content, ...fmOverrides } = overrides;
33
+ const id = fmOverrides.id ?? "m-default";
34
+ return {
35
+ path: `/tmp/mem/${id}.md`,
36
+ content: content ?? "synthetic body",
37
+ frontmatter: {
38
+ id,
39
+ category: "preference",
40
+ created: "2026-01-01T00:00:00.000Z",
41
+ updated: "2026-01-01T00:00:00.000Z",
42
+ source: "test",
43
+ confidence: 0.9,
44
+ confidenceTier: "high",
45
+ tags: [],
46
+ ...fmOverrides,
47
+ } as MemoryFrontmatter,
48
+ };
49
+ }
50
+
51
+ function makeStorageStub(memories: MemoryFile[]): {
52
+ stub: PatternReinforcementStorage;
53
+ writes: StubWriteCall[];
54
+ } {
55
+ const writes: StubWriteCall[] = [];
56
+ // Mutate the in-memory list so re-runs see the previous patch
57
+ // (mirrors real on-disk semantics needed by the idempotency test).
58
+ const stub: PatternReinforcementStorage = {
59
+ readAllMemories: async () => memories,
60
+ writeMemoryFrontmatter: async (memory, patch) => {
61
+ writes.push({ memoryId: memory.frontmatter.id, patch });
62
+ memory.frontmatter = { ...memory.frontmatter, ...patch };
63
+ return true;
64
+ },
65
+ };
66
+ return { stub, writes };
67
+ }
68
+
69
+ const FROZEN_NOW = new Date("2026-04-25T12:00:00.000Z");
70
+ const frozenNow = () => FROZEN_NOW;
71
+
72
+ test("patternReinforcementKey lowercases, collapses whitespace, truncates to 200 chars", () => {
73
+ assert.equal(patternReinforcementKey(" Hello WORLD "), "hello world");
74
+ const long = "x".repeat(300);
75
+ assert.equal(patternReinforcementKey(long).length, 200);
76
+ assert.equal(
77
+ patternReinforcementKey("Mixed\nCase\tWith\r\nLines"),
78
+ "mixed case with lines",
79
+ );
80
+ });
81
+
82
+ test("runPatternReinforcement: clusters duplicates, marks canonical + supersedes older", async () => {
83
+ // 5 duplicates with the same normalized content across different
84
+ // sessions/timestamps + 1 unique memory that should remain
85
+ // untouched.
86
+ const dupContent = "I prefer dark mode for all editors.";
87
+ const dups = [
88
+ makeMemory({ id: "m-1", content: dupContent, created: "2026-01-01T00:00:00Z", updated: "2026-01-01T00:00:00Z" }),
89
+ makeMemory({ id: "m-2", content: dupContent, created: "2026-02-01T00:00:00Z", updated: "2026-02-01T00:00:00Z" }),
90
+ makeMemory({ id: "m-3", content: dupContent, created: "2026-03-01T00:00:00Z", updated: "2026-03-01T00:00:00Z" }),
91
+ makeMemory({ id: "m-4", content: dupContent, created: "2026-04-01T00:00:00Z", updated: "2026-04-01T00:00:00Z" }),
92
+ makeMemory({ id: "m-5", content: dupContent, created: "2026-04-15T00:00:00Z", updated: "2026-04-15T00:00:00Z" }),
93
+ ];
94
+ const unique = makeMemory({
95
+ id: "m-unique",
96
+ content: "Completely different preference about tabs vs spaces.",
97
+ created: "2026-03-10T00:00:00Z",
98
+ updated: "2026-03-10T00:00:00Z",
99
+ });
100
+ const { stub, writes } = makeStorageStub([...dups, unique]);
101
+
102
+ const result = await runPatternReinforcement(stub, {
103
+ categories: ["preference", "fact", "decision"],
104
+ minCount: 3,
105
+ now: frozenNow,
106
+ });
107
+
108
+ assert.equal(result.clustersFound, 1);
109
+ assert.equal(result.canonicalsUpdated, 1);
110
+ assert.equal(result.duplicatesSuperseded, 4);
111
+ assert.equal(result.clusters.length, 1);
112
+
113
+ const cluster = result.clusters[0];
114
+ // Most-recent member wins.
115
+ assert.equal(cluster.canonicalId, "m-5");
116
+ assert.equal(cluster.count, 5);
117
+ assert.deepEqual(cluster.sourceIds, ["m-1", "m-2", "m-3", "m-4", "m-5"]);
118
+ assert.deepEqual(cluster.supersededIds.slice().sort(), ["m-1", "m-2", "m-3", "m-4"]);
119
+
120
+ // Canonical was patched with reinforcement metadata.
121
+ const canonicalWrite = writes.find((w) => w.memoryId === "m-5");
122
+ assert.ok(canonicalWrite);
123
+ assert.equal(canonicalWrite!.patch.reinforcement_count, 5);
124
+ assert.equal(canonicalWrite!.patch.last_reinforced_at, FROZEN_NOW.toISOString());
125
+ assert.equal(canonicalWrite!.patch.derived_via, "pattern-reinforcement");
126
+ assert.deepEqual(canonicalWrite!.patch.derived_from, ["m-1", "m-2", "m-3", "m-4", "m-5"]);
127
+
128
+ // Each duplicate was marked superseded with supersededBy set.
129
+ for (const id of ["m-1", "m-2", "m-3", "m-4"]) {
130
+ const w = writes.find((w) => w.memoryId === id);
131
+ assert.ok(w, `expected supersede write for ${id}`);
132
+ assert.equal(w!.patch.status, "superseded");
133
+ assert.equal(w!.patch.supersededBy, "m-5");
134
+ assert.equal(w!.patch.supersededAt, FROZEN_NOW.toISOString());
135
+ }
136
+
137
+ // Unique memory was NOT touched.
138
+ assert.ok(!writes.some((w) => w.memoryId === "m-unique"));
139
+ });
140
+
141
+ test("runPatternReinforcement: idempotent re-run does not double-bump reinforcement_count", async () => {
142
+ const dupContent = "Same content, repeated";
143
+ const memories = [
144
+ makeMemory({ id: "m-a", content: dupContent, updated: "2026-01-01T00:00:00Z" }),
145
+ makeMemory({ id: "m-b", content: dupContent, updated: "2026-02-01T00:00:00Z" }),
146
+ makeMemory({ id: "m-c", content: dupContent, updated: "2026-03-01T00:00:00Z" }),
147
+ ];
148
+ const { stub, writes } = makeStorageStub(memories);
149
+
150
+ const first = await runPatternReinforcement(stub, {
151
+ categories: ["preference"],
152
+ minCount: 3,
153
+ now: frozenNow,
154
+ });
155
+ assert.equal(first.canonicalsUpdated, 1);
156
+ assert.equal(first.duplicatesSuperseded, 2);
157
+ assert.equal(first.clusters[0]?.reinforcementBumped, true);
158
+
159
+ // Second run on the same corpus. After the first run, the older
160
+ // members are `superseded` — but the cluster STILL counts them
161
+ // toward the threshold (Codex P1 fix), so the cluster is found
162
+ // again with size 3 and no new active duplicates remain. Because
163
+ // `reinforcement_count` is already 3, the bump-only-on-change
164
+ // guard keeps the run a no-op write-wise.
165
+ const writesBefore = writes.length;
166
+ const second = await runPatternReinforcement(stub, {
167
+ categories: ["preference"],
168
+ minCount: 3,
169
+ now: frozenNow,
170
+ });
171
+ assert.equal(second.clustersFound, 1);
172
+ assert.equal(second.canonicalsUpdated, 0);
173
+ assert.equal(second.duplicatesSuperseded, 0);
174
+ assert.equal(second.clusters[0]?.reinforcementBumped, false);
175
+ // No additional writes.
176
+ assert.equal(writes.length, writesBefore);
177
+ });
178
+
179
+ test("runPatternReinforcement: established canonical grows when a single new duplicate arrives (Codex P1)", async () => {
180
+ // Models the exact post-first-run scenario the Codex review flagged:
181
+ // canonical + 2 already-superseded members + 1 brand-new active
182
+ // duplicate. The new duplicate must be absorbed and the count
183
+ // bumped to 4, even though the active sub-cluster size is only 2.
184
+ const dupContent = "established pattern";
185
+ const memories = [
186
+ makeMemory({
187
+ id: "m-old1",
188
+ content: dupContent,
189
+ updated: "2026-01-01T00:00:00Z",
190
+ status: "superseded",
191
+ supersededBy: "m-canon",
192
+ }),
193
+ makeMemory({
194
+ id: "m-old2",
195
+ content: dupContent,
196
+ updated: "2026-02-01T00:00:00Z",
197
+ status: "superseded",
198
+ supersededBy: "m-canon",
199
+ }),
200
+ makeMemory({
201
+ id: "m-canon",
202
+ content: dupContent,
203
+ updated: "2026-03-01T00:00:00Z",
204
+ reinforcement_count: 3,
205
+ last_reinforced_at: "2026-03-01T00:00:00.000Z",
206
+ derived_via: "pattern-reinforcement",
207
+ derived_from: ["m-canon", "m-old1", "m-old2"],
208
+ }),
209
+ // A brand-new active duplicate from a later session.
210
+ makeMemory({
211
+ id: "m-new",
212
+ content: dupContent,
213
+ updated: "2026-04-15T00:00:00Z",
214
+ }),
215
+ ];
216
+ const { stub, writes } = makeStorageStub(memories);
217
+
218
+ const result = await runPatternReinforcement(stub, {
219
+ categories: ["preference"],
220
+ minCount: 3,
221
+ now: frozenNow,
222
+ });
223
+
224
+ assert.equal(result.clustersFound, 1);
225
+ assert.equal(result.canonicalsUpdated, 1);
226
+ assert.equal(result.duplicatesSuperseded, 1);
227
+ assert.equal(result.clusters[0]?.count, 4);
228
+ assert.equal(result.clusters[0]?.reinforcementBumped, true);
229
+ // The most-recent active member becomes the new canonical.
230
+ assert.equal(result.clusters[0]?.canonicalId, "m-new");
231
+ // Source-ids include every member of the historical cluster.
232
+ assert.deepEqual(
233
+ result.clusters[0]?.sourceIds.slice().sort(),
234
+ ["m-canon", "m-new", "m-old1", "m-old2"],
235
+ );
236
+ // The new active member was patched as canonical with count=4.
237
+ const canonicalWrite = writes.find((w) => w.memoryId === "m-new");
238
+ assert.ok(canonicalWrite);
239
+ assert.equal(canonicalWrite!.patch.reinforcement_count, 4);
240
+ // The previous canonical (still active before the run) was
241
+ // superseded.
242
+ const oldCanonWrite = writes.find((w) => w.memoryId === "m-canon");
243
+ assert.ok(oldCanonWrite);
244
+ assert.equal(oldCanonWrite!.patch.status, "superseded");
245
+ assert.equal(oldCanonWrite!.patch.supersededBy, "m-new");
246
+ });
247
+
248
+ test("runPatternReinforcement: re-run with existing reinforcement_count does not bump when count unchanged", async () => {
249
+ // Simulate a corpus where the canonical was previously reinforced
250
+ // at count=3 and a later run sees the same cluster of 3 active
251
+ // memories. (Edge case: status filter would normally have shrunk
252
+ // the active set to 1, but if upstream policy un-supersedes some,
253
+ // the bump-only-on-change guard still holds.)
254
+ const dupContent = "stable cluster";
255
+ const memories = [
256
+ makeMemory({
257
+ id: "m-x",
258
+ content: dupContent,
259
+ updated: "2026-01-01T00:00:00Z",
260
+ }),
261
+ makeMemory({
262
+ id: "m-y",
263
+ content: dupContent,
264
+ updated: "2026-02-01T00:00:00Z",
265
+ }),
266
+ makeMemory({
267
+ id: "m-z",
268
+ content: dupContent,
269
+ updated: "2026-03-01T00:00:00Z",
270
+ reinforcement_count: 3,
271
+ last_reinforced_at: "2026-03-01T00:00:00.000Z",
272
+ derived_via: "pattern-reinforcement",
273
+ derived_from: ["m-x", "m-y", "m-z"],
274
+ }),
275
+ ];
276
+ const { stub, writes } = makeStorageStub(memories);
277
+
278
+ const result = await runPatternReinforcement(stub, {
279
+ categories: ["preference"],
280
+ minCount: 3,
281
+ now: frozenNow,
282
+ });
283
+
284
+ assert.equal(result.clustersFound, 1);
285
+ // Reinforcement count is identical (3), so we MUST NOT bump.
286
+ assert.equal(result.canonicalsUpdated, 0);
287
+ assert.equal(result.clusters[0]?.reinforcementBumped, false);
288
+ // No write to the canonical for reinforcement; supersede writes
289
+ // for the older two ARE expected since they were still active.
290
+ const canonicalWrites = writes.filter((w) => w.memoryId === "m-z");
291
+ assert.equal(canonicalWrites.length, 0);
292
+ });
293
+
294
+ test("runPatternReinforcement: respects minCount threshold", async () => {
295
+ const dupContent = "pair of duplicates";
296
+ const memories = [
297
+ makeMemory({ id: "m-1", content: dupContent, updated: "2026-01-01T00:00:00Z" }),
298
+ makeMemory({ id: "m-2", content: dupContent, updated: "2026-02-01T00:00:00Z" }),
299
+ ];
300
+ const { stub, writes } = makeStorageStub(memories);
301
+
302
+ const result = await runPatternReinforcement(stub, {
303
+ categories: ["preference"],
304
+ minCount: 3,
305
+ now: frozenNow,
306
+ });
307
+
308
+ assert.equal(result.clustersFound, 0);
309
+ assert.equal(writes.length, 0);
310
+ });
311
+
312
+ test("runPatternReinforcement: skips out-of-scope categories", async () => {
313
+ const dupContent = "procedural duplicate";
314
+ const memories = [
315
+ makeMemory({ id: "p-1", category: "procedure" as MemoryFrontmatter["category"], content: dupContent, updated: "2026-01-01T00:00:00Z" }),
316
+ makeMemory({ id: "p-2", category: "procedure" as MemoryFrontmatter["category"], content: dupContent, updated: "2026-02-01T00:00:00Z" }),
317
+ makeMemory({ id: "p-3", category: "procedure" as MemoryFrontmatter["category"], content: dupContent, updated: "2026-03-01T00:00:00Z" }),
318
+ ];
319
+ const { stub, writes } = makeStorageStub(memories);
320
+
321
+ const result = await runPatternReinforcement(stub, {
322
+ categories: ["preference", "fact", "decision"],
323
+ minCount: 3,
324
+ now: frozenNow,
325
+ });
326
+
327
+ assert.equal(result.clustersFound, 0);
328
+ assert.equal(writes.length, 0);
329
+ });
330
+
331
+ test("runPatternReinforcement: counts both active and already-superseded members; only writes to active duplicates", async () => {
332
+ const dupContent = "mixed status cluster";
333
+ const memories = [
334
+ makeMemory({
335
+ id: "m-old1",
336
+ content: dupContent,
337
+ updated: "2026-01-01T00:00:00Z",
338
+ status: "superseded",
339
+ supersededBy: "m-prior",
340
+ }),
341
+ makeMemory({
342
+ id: "m-old2",
343
+ content: dupContent,
344
+ updated: "2026-02-01T00:00:00Z",
345
+ status: "superseded",
346
+ supersededBy: "m-prior",
347
+ }),
348
+ makeMemory({
349
+ id: "m-new1",
350
+ content: dupContent,
351
+ updated: "2026-03-01T00:00:00Z",
352
+ }),
353
+ makeMemory({
354
+ id: "m-new2",
355
+ content: dupContent,
356
+ updated: "2026-04-01T00:00:00Z",
357
+ }),
358
+ makeMemory({
359
+ id: "m-new3",
360
+ content: dupContent,
361
+ updated: "2026-04-15T00:00:00Z",
362
+ }),
363
+ ];
364
+ const { stub, writes } = makeStorageStub(memories);
365
+
366
+ const result = await runPatternReinforcement(stub, {
367
+ categories: ["preference"],
368
+ minCount: 3,
369
+ now: frozenNow,
370
+ });
371
+
372
+ // All 5 cluster members count toward the threshold (Codex P1).
373
+ assert.equal(result.clustersFound, 1);
374
+ assert.equal(result.clusters[0]?.canonicalId, "m-new3");
375
+ assert.equal(result.clusters[0]?.count, 5);
376
+ // sourceIds includes every member, active and superseded.
377
+ assert.deepEqual(result.clusters[0]?.sourceIds.slice().sort(), [
378
+ "m-new1",
379
+ "m-new2",
380
+ "m-new3",
381
+ "m-old1",
382
+ "m-old2",
383
+ ]);
384
+ // Only the active duplicates were newly superseded — pre-existing
385
+ // superseded memories are not re-touched.
386
+ assert.deepEqual(
387
+ result.clusters[0]?.supersededIds.slice().sort(),
388
+ ["m-new1", "m-new2"],
389
+ );
390
+ // Already-superseded memories are NOT written to.
391
+ assert.ok(!writes.some((w) => w.memoryId === "m-old1"));
392
+ assert.ok(!writes.some((w) => w.memoryId === "m-old2"));
393
+ });
394
+
395
+ test("runPatternReinforcement: empty categories short-circuits with no work", async () => {
396
+ const memories = [
397
+ makeMemory({ id: "m-1", content: "anything", updated: "2026-01-01T00:00:00Z" }),
398
+ makeMemory({ id: "m-2", content: "anything", updated: "2026-02-01T00:00:00Z" }),
399
+ makeMemory({ id: "m-3", content: "anything", updated: "2026-03-01T00:00:00Z" }),
400
+ ];
401
+ const { stub, writes } = makeStorageStub(memories);
402
+
403
+ const result = await runPatternReinforcement(stub, {
404
+ categories: [],
405
+ minCount: 3,
406
+ now: frozenNow,
407
+ });
408
+ assert.equal(result.clustersFound, 0);
409
+ assert.equal(writes.length, 0);
410
+ });
411
+
412
+ test("frontmatter round-trip preserves reinforcement_count + last_reinforced_at + derived_via=pattern-reinforcement", async () => {
413
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-pr-roundtrip-"));
414
+ try {
415
+ const storage = new StorageManager(dir);
416
+ await storage.ensureDirectories();
417
+ const written = await storage.writeMemory(
418
+ "fact",
419
+ "Pattern-reinforcement round-trip body",
420
+ { confidence: 0.9, tags: ["test"] },
421
+ );
422
+ assert.ok(written, "writeMemory must succeed");
423
+ const id = written!;
424
+
425
+ const all1 = await storage.readAllMemories();
426
+ const target = all1.find((m) => m.frontmatter.id === id);
427
+ assert.ok(target, "freshly-written memory must be visible");
428
+
429
+ const ok = await storage.writeMemoryFrontmatter(target!, {
430
+ reinforcement_count: 5,
431
+ last_reinforced_at: "2026-04-25T12:00:00.000Z",
432
+ derived_from: ["m-a", "m-b", "m-c", "m-d", "m-e"],
433
+ derived_via: "pattern-reinforcement",
434
+ });
435
+ assert.ok(ok);
436
+
437
+ // Force a fresh read off disk.
438
+ storage.invalidateAllMemoriesCacheForDir();
439
+ const all2 = await storage.readAllMemories();
440
+ const reread = all2.find((m) => m.frontmatter.id === id);
441
+ assert.ok(reread, "memory must still be readable after patch");
442
+ assert.equal(reread!.frontmatter.reinforcement_count, 5);
443
+ assert.equal(reread!.frontmatter.last_reinforced_at, "2026-04-25T12:00:00.000Z");
444
+ assert.equal(reread!.frontmatter.derived_via, "pattern-reinforcement");
445
+ assert.deepEqual(
446
+ reread!.frontmatter.derived_from,
447
+ ["m-a", "m-b", "m-c", "m-d", "m-e"],
448
+ );
449
+ } finally {
450
+ await rm(dir, { recursive: true, force: true });
451
+ }
452
+ });
453
+
454
+ test("storage rejects non-positive or non-integer reinforcement_count on write", async () => {
455
+ const dir = await mkdtemp(path.join(os.tmpdir(), "remnic-pr-validate-"));
456
+ try {
457
+ const storage = new StorageManager(dir);
458
+ await storage.ensureDirectories();
459
+ const id = await storage.writeMemory("fact", "Body for validation test.", {
460
+ confidence: 0.9,
461
+ tags: [],
462
+ });
463
+ assert.ok(id);
464
+
465
+ await assert.rejects(
466
+ () => storage.updateMemoryFrontmatter(id!, { reinforcement_count: 0 }),
467
+ /reinforcement_count/,
468
+ );
469
+ await assert.rejects(
470
+ () => storage.updateMemoryFrontmatter(id!, { reinforcement_count: -1 }),
471
+ /reinforcement_count/,
472
+ );
473
+ await assert.rejects(
474
+ () => storage.updateMemoryFrontmatter(id!, { reinforcement_count: 1.5 }),
475
+ /reinforcement_count/,
476
+ );
477
+ } finally {
478
+ await rm(dir, { recursive: true, force: true });
479
+ }
480
+ });
481
+
482
+ // ─── PR #730 Codex P2: instant-based timestamp comparison ────────────────────
483
+
484
+ test("runPatternReinforcement: pickCanonical compares timestamps as instants, not strings", async () => {
485
+ // The newer memory (in real time) uses a `+02:00` offset that is
486
+ // lexicographically smaller than the older memory's `Z` suffix. A
487
+ // string-compare would mis-pick the older entry as canonical.
488
+ // Both refer to the same instant viewed from different offsets:
489
+ // newer: 2026-04-26T12:00:00+02:00 → 2026-04-26T10:00:00Z
490
+ // older: 2026-04-26T09:00:00Z → 2026-04-26T09:00:00Z
491
+ // So the `+02:00`-tagged memory IS newer in instant space.
492
+ const dupContent = "Pattern reinforcement timestamp test.";
493
+ const memories = [
494
+ makeMemory({
495
+ id: "m-older-z",
496
+ content: dupContent,
497
+ created: "2026-04-26T09:00:00Z",
498
+ updated: "2026-04-26T09:00:00Z",
499
+ }),
500
+ makeMemory({
501
+ id: "m-newer-offset",
502
+ content: dupContent,
503
+ created: "2026-04-26T12:00:00+02:00",
504
+ updated: "2026-04-26T12:00:00+02:00",
505
+ }),
506
+ ];
507
+ const { stub, writes } = makeStorageStub(memories);
508
+
509
+ const result = await runPatternReinforcement(stub, {
510
+ categories: ["preference"],
511
+ minCount: 2,
512
+ now: frozenNow,
513
+ });
514
+
515
+ assert.equal(result.clustersFound, 1);
516
+ assert.equal(result.clusters[0].canonicalId, "m-newer-offset");
517
+ // The OLDER (Z-suffix) memory must be the one superseded.
518
+ assert.deepEqual(result.clusters[0].supersededIds, ["m-older-z"]);
519
+ // The supersede write targets the older memory.
520
+ const supersedeWrite = writes.find((w) => w.patch.status === "superseded");
521
+ assert.ok(supersedeWrite);
522
+ assert.equal(supersedeWrite.memoryId, "m-older-z");
523
+ });
524
+
525
+ // ─── PR #730 Codex P2: cluster keys partition by category ────────────────────
526
+
527
+ test("runPatternReinforcement: identical text in different categories is NOT cross-superseded", async () => {
528
+ // Same text in both `preference` and `decision`. Without category
529
+ // partitioning the two would collide into one cluster of size 2 and
530
+ // one of them would be superseded — silently erasing a category-
531
+ // specific memory.
532
+ const text = "Strict no-bundle policy for optional packages.";
533
+ const memories = [
534
+ makeMemory({
535
+ id: "m-pref-1",
536
+ category: "preference",
537
+ content: text,
538
+ created: "2026-04-25T10:00:00Z",
539
+ updated: "2026-04-25T10:00:00Z",
540
+ }),
541
+ makeMemory({
542
+ id: "m-pref-2",
543
+ category: "preference",
544
+ content: text,
545
+ created: "2026-04-26T10:00:00Z",
546
+ updated: "2026-04-26T10:00:00Z",
547
+ }),
548
+ makeMemory({
549
+ id: "m-decision",
550
+ category: "decision",
551
+ content: text,
552
+ created: "2026-04-26T11:00:00Z",
553
+ updated: "2026-04-26T11:00:00Z",
554
+ }),
555
+ ];
556
+ const { stub, writes } = makeStorageStub(memories);
557
+
558
+ const result = await runPatternReinforcement(stub, {
559
+ categories: ["preference", "decision"],
560
+ minCount: 2,
561
+ now: frozenNow,
562
+ });
563
+
564
+ // Only the preference cluster (2 members) qualifies — the decision
565
+ // entry is alone in its category bucket.
566
+ assert.equal(result.clustersFound, 1);
567
+ assert.equal(result.clusters[0].canonicalId, "m-pref-2");
568
+ assert.deepEqual(result.clusters[0].supersededIds, ["m-pref-1"]);
569
+ // Crucially: the decision-category memory was NOT touched.
570
+ const decisionWrites = writes.filter((w) => w.memoryId === "m-decision");
571
+ assert.equal(
572
+ decisionWrites.length,
573
+ 0,
574
+ `decision-category memory must not be touched; got ${JSON.stringify(decisionWrites)}`,
575
+ );
576
+ });
577
+
578
+ // ─── PR #730 Codex P2: timestamp comparison handles mixed precision/format ────
579
+
580
+ test("runPatternReinforcement: pickCanonical compares ms-precision against second-precision correctly", async () => {
581
+ // Same-instant memories with different ISO precision: a pure
582
+ // string-compare would order `2026-04-26T10:00:00Z` BEFORE
583
+ // `2026-04-26T10:00:00.000Z` (shorter sort first), but both encode
584
+ // the same instant. The newer timestamp must still win.
585
+ const dupContent = "Mixed precision timestamps.";
586
+ const memories = [
587
+ makeMemory({
588
+ id: "m-second-precision",
589
+ content: dupContent,
590
+ created: "2026-04-25T09:00:00Z",
591
+ updated: "2026-04-25T09:00:00Z",
592
+ }),
593
+ makeMemory({
594
+ id: "m-ms-precision",
595
+ content: dupContent,
596
+ created: "2026-04-26T09:00:00.500Z",
597
+ updated: "2026-04-26T09:00:00.500Z",
598
+ }),
599
+ ];
600
+ const { stub } = makeStorageStub(memories);
601
+
602
+ const result = await runPatternReinforcement(stub, {
603
+ categories: ["preference"],
604
+ minCount: 2,
605
+ now: frozenNow,
606
+ });
607
+
608
+ assert.equal(result.clustersFound, 1);
609
+ // The ms-precision memory is genuinely newer (next day); confirm
610
+ // instant comparison preserves that across precision differences.
611
+ assert.equal(result.clusters[0].canonicalId, "m-ms-precision");
612
+ });
613
+
614
+ // ─── PR #730 Codex P2: refresh canonical when membership changes ─────────────
615
+
616
+ test("runPatternReinforcement: refreshes canonical provenance when cluster membership rotates (Codex P2)", async () => {
617
+ // Models a stable canonical whose provenance was set with one
618
+ // member set, then a different member set arrives in a later run
619
+ // (same total size, different identities). The canonical's
620
+ // `derived_from` must be refreshed even though
621
+ // `reinforcement_count` is unchanged — otherwise the on-disk
622
+ // provenance silently drifts away from the actual contributors.
623
+ const dupContent = "membership rotation";
624
+ const memories = [
625
+ // Canonical sits at count=3 with stale provenance pointing at
626
+ // members that no longer all exist (m-stale was archived
627
+ // out-of-band; we simulate that by omitting it from the corpus).
628
+ // The canonical remains the most-recent active member.
629
+ makeMemory({
630
+ id: "m-canon",
631
+ content: dupContent,
632
+ updated: "2026-05-01T00:00:00Z",
633
+ reinforcement_count: 3,
634
+ last_reinforced_at: "2026-03-01T00:00:00.000Z",
635
+ derived_via: "pattern-reinforcement",
636
+ derived_from: ["m-canon", "m-stale", "m-old-superseded"],
637
+ }),
638
+ // A still-active older duplicate that was always part of the
639
+ // cluster but never made canonical.
640
+ makeMemory({
641
+ id: "m-old-superseded",
642
+ content: dupContent,
643
+ updated: "2026-02-01T00:00:00Z",
644
+ status: "superseded",
645
+ supersededBy: "m-canon",
646
+ }),
647
+ // A new active duplicate from a later session, but still older
648
+ // than the canonical so the canonical does NOT pivot.
649
+ makeMemory({
650
+ id: "m-new-active",
651
+ content: dupContent,
652
+ updated: "2026-04-15T00:00:00Z",
653
+ }),
654
+ ];
655
+ const { stub, writes } = makeStorageStub(memories);
656
+
657
+ const result = await runPatternReinforcement(stub, {
658
+ categories: ["preference"],
659
+ minCount: 3,
660
+ now: frozenNow,
661
+ });
662
+
663
+ assert.equal(result.clustersFound, 1);
664
+ // Cluster size unchanged (3) but membership differs.
665
+ assert.equal(result.clusters[0]?.count, 3);
666
+ // The reinforcement counter did NOT bump (still 3) — the canonical
667
+ // was refreshed purely because membership changed.
668
+ assert.equal(result.clusters[0]?.reinforcementBumped, false);
669
+ assert.equal(result.canonicalsUpdated, 1);
670
+ // Canonical did NOT pivot — m-canon is still the most-recent
671
+ // active member.
672
+ assert.equal(result.clusters[0]?.canonicalId, "m-canon");
673
+ // The freshly-written canonical's `derived_from` reflects the
674
+ // current cluster membership only — no stale ID.
675
+ const canonicalWrite = writes.find(
676
+ (w) => w.memoryId === "m-canon" && w.patch.derived_via === "pattern-reinforcement",
677
+ );
678
+ assert.ok(
679
+ canonicalWrite,
680
+ "canonical must be patched even when reinforcement_count is unchanged",
681
+ );
682
+ assert.deepEqual(
683
+ [...(canonicalWrite!.patch.derived_from ?? [])].sort(),
684
+ ["m-canon", "m-new-active", "m-old-superseded"],
685
+ );
686
+ // On a provenance-only refresh (count unchanged), `last_reinforced_at`
687
+ // is preserved from the existing value — it must NOT be re-stamped to
688
+ // the current run time, keeping the field monotonic (PR #730, Codex P2).
689
+ assert.equal(canonicalWrite!.patch.last_reinforced_at, "2026-03-01T00:00:00.000Z");
690
+ // Similarly, `reinforcement_count` is carried forward unchanged.
691
+ assert.equal(canonicalWrite!.patch.reinforcement_count, 3);
692
+ });
693
+
694
+ test("runPatternReinforcement: canonical growth still refreshes provenance and bumps count", async () => {
695
+ // Existing canonical at count=3 with provenance. Two new
696
+ // duplicates arrive. Cluster size grows to 5; provenance must
697
+ // expand to include them.
698
+ const dupContent = "growing cluster";
699
+ const memories = [
700
+ makeMemory({
701
+ id: "m-old1",
702
+ content: dupContent,
703
+ updated: "2026-01-01T00:00:00Z",
704
+ status: "superseded",
705
+ supersededBy: "m-canon",
706
+ }),
707
+ makeMemory({
708
+ id: "m-old2",
709
+ content: dupContent,
710
+ updated: "2026-02-01T00:00:00Z",
711
+ status: "superseded",
712
+ supersededBy: "m-canon",
713
+ }),
714
+ makeMemory({
715
+ id: "m-canon",
716
+ content: dupContent,
717
+ updated: "2026-03-01T00:00:00Z",
718
+ reinforcement_count: 3,
719
+ last_reinforced_at: "2026-03-01T00:00:00.000Z",
720
+ derived_via: "pattern-reinforcement",
721
+ derived_from: ["m-canon", "m-old1", "m-old2"],
722
+ }),
723
+ makeMemory({
724
+ id: "m-new1",
725
+ content: dupContent,
726
+ updated: "2026-04-10T00:00:00Z",
727
+ }),
728
+ makeMemory({
729
+ id: "m-new2",
730
+ content: dupContent,
731
+ updated: "2026-04-20T00:00:00Z",
732
+ }),
733
+ ];
734
+ const { stub, writes } = makeStorageStub(memories);
735
+
736
+ const result = await runPatternReinforcement(stub, {
737
+ categories: ["preference"],
738
+ minCount: 3,
739
+ now: frozenNow,
740
+ });
741
+ assert.equal(result.clusters[0]?.count, 5);
742
+ assert.equal(result.clusters[0]?.reinforcementBumped, true);
743
+ const canonicalWrite = writes.find(
744
+ (w) => w.memoryId === "m-new2" && w.patch.derived_via === "pattern-reinforcement",
745
+ );
746
+ assert.ok(canonicalWrite);
747
+ assert.equal(canonicalWrite!.patch.reinforcement_count, 5);
748
+ assert.deepEqual(
749
+ [...(canonicalWrite!.patch.derived_from ?? [])].sort(),
750
+ ["m-canon", "m-new1", "m-new2", "m-old1", "m-old2"],
751
+ );
752
+ });
753
+
754
+ // ─── PR #730 thread fixes ─────────────────────────────────────────────────────
755
+
756
+ test("runPatternReinforcement: cluster count metric matches filtered sourceIds length (PR #730 Thread 1)", async () => {
757
+ // When some cluster members lack a valid string ID (e.g. id is undefined
758
+ // or empty), the raw `cluster.length` diverges from `sourceIds.length`.
759
+ // The telemetry `count` field and `reinforcement_count` on disk must both
760
+ // reflect the filtered valid-ID set — not the unfiltered cluster array.
761
+ const dupContent = "cluster count alignment test";
762
+ const memories = [
763
+ makeMemory({ id: "m-1", content: dupContent, updated: "2026-01-01T00:00:00Z" }),
764
+ makeMemory({ id: "m-2", content: dupContent, updated: "2026-02-01T00:00:00Z" }),
765
+ makeMemory({ id: "m-3", content: dupContent, updated: "2026-03-01T00:00:00Z" }),
766
+ // A member whose ID is explicitly undefined — it must still be eligible
767
+ // (has valid category/status) but must NOT appear in sourceIds.
768
+ {
769
+ path: "/tmp/mem/no-id.md",
770
+ content: dupContent,
771
+ frontmatter: {
772
+ id: undefined as unknown as string,
773
+ category: "preference" as MemoryFrontmatter["category"],
774
+ created: "2026-04-01T00:00:00Z",
775
+ updated: "2026-04-01T00:00:00Z",
776
+ source: "test",
777
+ confidence: 0.9,
778
+ confidenceTier: "high" as MemoryFrontmatter["confidenceTier"],
779
+ tags: [],
780
+ } as MemoryFrontmatter,
781
+ } as MemoryFile,
782
+ ];
783
+ const { stub } = makeStorageStub(memories);
784
+
785
+ const result = await runPatternReinforcement(stub, {
786
+ categories: ["preference"],
787
+ minCount: 3,
788
+ now: frozenNow,
789
+ });
790
+
791
+ assert.equal(result.clustersFound, 1);
792
+ const cluster = result.clusters[0];
793
+ assert.ok(cluster);
794
+ // sourceIds excludes the id-less member — only 3 valid IDs.
795
+ assert.deepEqual(cluster.sourceIds.slice().sort(), ["m-1", "m-2", "m-3"]);
796
+ // count must align with sourceIds.length, NOT the raw cluster array
797
+ // length (which would be 4).
798
+ assert.equal(cluster.count, cluster.sourceIds.length);
799
+ assert.equal(cluster.count, 3);
800
+ });
801
+
802
+ test("runPatternReinforcement: provenance-only refresh preserves reinforcement_count + last_reinforced_at (PR #730 Thread 2)", async () => {
803
+ // Models the scenario where cluster membership rotates (one member
804
+ // archived externally, a new duplicate arrived) but the total count
805
+ // stays the same. On this provenance-only refresh the canonical's
806
+ // `reinforcement_count` and `last_reinforced_at` must be carried
807
+ // forward unchanged — only `derived_from` (and `derived_via`) should
808
+ // be updated. Previously the code wrote `last_reinforced_at: nowIso`
809
+ // unconditionally, resetting the field on every provenance refresh
810
+ // (PR #730 review, Codex P2).
811
+ const dupContent = "provenance monotonic test";
812
+ const EXISTING_REINFORCED_AT = "2026-01-15T08:00:00.000Z";
813
+ const EXISTING_COUNT = 3;
814
+ const memories = [
815
+ makeMemory({
816
+ id: "m-canon",
817
+ content: dupContent,
818
+ updated: "2026-04-01T00:00:00Z",
819
+ reinforcement_count: EXISTING_COUNT,
820
+ last_reinforced_at: EXISTING_REINFORCED_AT,
821
+ derived_via: "pattern-reinforcement",
822
+ // Stale provenance: includes m-gone (no longer in corpus).
823
+ derived_from: ["m-canon", "m-gone", "m-old"],
824
+ }),
825
+ // m-gone has been archived out-of-band — omitted from corpus.
826
+ makeMemory({
827
+ id: "m-old",
828
+ content: dupContent,
829
+ updated: "2026-02-01T00:00:00Z",
830
+ status: "superseded",
831
+ supersededBy: "m-canon",
832
+ }),
833
+ // m-new arrived in this run — same total cluster size (3), different
834
+ // membership.
835
+ makeMemory({
836
+ id: "m-new",
837
+ content: dupContent,
838
+ updated: "2026-03-10T00:00:00Z",
839
+ }),
840
+ ];
841
+ const { stub, writes } = makeStorageStub(memories);
842
+
843
+ const result = await runPatternReinforcement(stub, {
844
+ categories: ["preference"],
845
+ minCount: 3,
846
+ now: frozenNow,
847
+ });
848
+
849
+ assert.equal(result.clustersFound, 1);
850
+ assert.equal(result.canonicalsUpdated, 1);
851
+ // Count unchanged — bumped must be false.
852
+ assert.equal(result.clusters[0]?.reinforcementBumped, false);
853
+
854
+ const canonicalWrite = writes.find((w) => w.memoryId === "m-canon");
855
+ assert.ok(canonicalWrite, "canonical must be patched for membership change");
856
+
857
+ // The provenance fields must be updated to reflect the new membership.
858
+ assert.deepEqual(
859
+ [...(canonicalWrite!.patch.derived_from ?? [])].sort(),
860
+ ["m-canon", "m-new", "m-old"],
861
+ );
862
+
863
+ // CRITICAL: `reinforcement_count` and `last_reinforced_at` must be
864
+ // preserved from the existing values — not reset to nowIso / newCount.
865
+ assert.equal(
866
+ canonicalWrite!.patch.reinforcement_count,
867
+ EXISTING_COUNT,
868
+ "reinforcement_count must not change on provenance-only refresh",
869
+ );
870
+ assert.equal(
871
+ canonicalWrite!.patch.last_reinforced_at,
872
+ EXISTING_REINFORCED_AT,
873
+ "last_reinforced_at must not be re-stamped on provenance-only refresh",
874
+ );
875
+ });