@remnic/core 10.0.12 → 10.0.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 (560) hide show
  1. package/dist/access-admin-ops-surface.js +97 -95
  2. package/dist/access-authorization-probe.js +98 -96
  3. package/dist/access-boundary.js +97 -95
  4. package/dist/access-cli.js +201 -198
  5. package/dist/access-cli.js.map +1 -1
  6. package/dist/access-extraction-force-flush.js +97 -95
  7. package/dist/access-http-briefing.js +98 -96
  8. package/dist/access-http-query.js +99 -97
  9. package/dist/access-http.js +121 -119
  10. package/dist/access-idempotency.js +3 -2
  11. package/dist/access-identity-continuity-surface.js +97 -95
  12. package/dist/access-lcm-surface.js +97 -95
  13. package/dist/access-mcp.js +110 -108
  14. package/dist/access-memory-search-fanout.js +3 -3
  15. package/dist/access-namespace-preflight.js +97 -95
  16. package/dist/access-observe-write-category.js +18 -18
  17. package/dist/access-observe-write-surface.js +97 -95
  18. package/dist/access-offline-manifest.js +21 -20
  19. package/dist/access-operations-batch.js +101 -99
  20. package/dist/access-operations.js +108 -106
  21. package/dist/access-recall-concurrency.js +97 -95
  22. package/dist/access-recall-diagnostics.js +5 -5
  23. package/dist/access-recall-response.js +97 -95
  24. package/dist/access-recall-surface.js +97 -95
  25. package/dist/access-schema.d.ts +2 -2
  26. package/dist/access-schema.js +12 -12
  27. package/dist/access-service.js +97 -95
  28. package/dist/access-surface-catalog.js +99 -97
  29. package/dist/access-surface-catalog.js.map +1 -1
  30. package/dist/active-memory-bridge.js +3 -3
  31. package/dist/active-recall.js +42 -40
  32. package/dist/active-recall.js.map +1 -1
  33. package/dist/adapters/index.js +4 -4
  34. package/dist/adapters/registry.js +2 -2
  35. package/dist/{auto-sync-WSJAOLOP.js → auto-sync-7WWAKW6F.js} +12 -12
  36. package/dist/briefing.js +31 -29
  37. package/dist/buffer.js +17 -17
  38. package/dist/calibration.d.ts +20 -0
  39. package/dist/calibration.d.ts.map +1 -1
  40. package/dist/calibration.js +60 -13
  41. package/dist/calibration.js.map +1 -1
  42. package/dist/capabilities.d.ts +3 -2
  43. package/dist/capabilities.d.ts.map +1 -1
  44. package/dist/capabilities.js +1 -1
  45. package/dist/{capsule-merge-M4HETD27.js → capsule-merge-LGYURS3C.js} +6 -5
  46. package/dist/{capsule-merge-M4HETD27.js.map → capsule-merge-LGYURS3C.js.map} +1 -1
  47. package/dist/capture-write-lock-backoff.d.ts +50 -0
  48. package/dist/capture-write-lock-backoff.d.ts.map +1 -0
  49. package/dist/capture-write-lock-backoff.js +30 -0
  50. package/dist/capture-write-lock.d.ts +6 -0
  51. package/dist/capture-write-lock.d.ts.map +1 -0
  52. package/dist/capture-write-lock.js +15 -0
  53. package/dist/causal-behavior.js +2 -2
  54. package/dist/causal-chain.js +2 -2
  55. package/dist/causal-consolidation.js +34 -32
  56. package/dist/causal-consolidation.js.map +1 -1
  57. package/dist/causal-retrieval.js +2 -2
  58. package/dist/causal-trajectory-graph.js +7 -6
  59. package/dist/causal-trajectory-graph.js.map +1 -1
  60. package/dist/causal-trajectory.js +1 -1
  61. package/dist/{chunk-RNPJ4GQA.js → chunk-22W2XWGH.js} +6 -6
  62. package/dist/{chunk-AV2OQF2O.js → chunk-3F3HA3R2.js} +2 -2
  63. package/dist/{chunk-QZZPUREO.js → chunk-3GYSZHMT.js} +3 -3
  64. package/dist/{chunk-QWWMS4AE.js → chunk-3MO4LWYU.js} +1 -1
  65. package/dist/chunk-3MO4LWYU.js.map +1 -0
  66. package/dist/{chunk-XYOT5GQU.js → chunk-3NF4QUNZ.js} +3 -3
  67. package/dist/{chunk-AL6EHLB5.js → chunk-3X3PNU3T.js} +2 -2
  68. package/dist/{chunk-BTJ6CAIA.js → chunk-4IYIGN53.js} +10 -10
  69. package/dist/{chunk-OM3RWZQK.js → chunk-4KY5GSMB.js} +2 -2
  70. package/dist/{chunk-4N2MFNTG.js → chunk-4OSG5Y6M.js} +2 -2
  71. package/dist/{chunk-EEDI3OXB.js → chunk-4Q26RNSR.js} +2 -2
  72. package/dist/{chunk-EHRE7ZG3.js → chunk-5B5WYAHQ.js} +2 -2
  73. package/dist/{chunk-WCGJK4NQ.js → chunk-5FNZ3G6X.js} +10 -10
  74. package/dist/{chunk-Y6DZ33PA.js → chunk-5GX5457J.js} +4 -4
  75. package/dist/{chunk-OFCHT2TN.js → chunk-5LRV557D.js} +2 -2
  76. package/dist/{chunk-VAOC6GHN.js → chunk-5PHOU5QI.js} +2 -2
  77. package/dist/{chunk-WL7N5VGG.js → chunk-5TJEOU6Y.js} +2 -2
  78. package/dist/{chunk-A2L3P2IY.js → chunk-5WCJLQTM.js} +2 -2
  79. package/dist/{chunk-MZBWIJJN.js → chunk-63B2IZYE.js} +19 -19
  80. package/dist/{chunk-DGRMWDQY.js → chunk-66BCOVW2.js} +7 -7
  81. package/dist/chunk-6EDW54SQ.js +298 -0
  82. package/dist/chunk-6EDW54SQ.js.map +1 -0
  83. package/dist/{chunk-P2S6P7X6.js → chunk-6LG7BWKW.js} +2 -2
  84. package/dist/chunk-77R7BQZ2.js +152 -0
  85. package/dist/chunk-77R7BQZ2.js.map +1 -0
  86. package/dist/{chunk-4G2YCKLT.js → chunk-7G5NTS7F.js} +2 -2
  87. package/dist/{chunk-IPLYGWQF.js → chunk-7LCGFUMB.js} +6 -6
  88. package/dist/{chunk-KYY4EACB.js → chunk-7Z3DLNSD.js} +2 -2
  89. package/dist/{chunk-LNH76ZJX.js → chunk-AIYXVWUH.js} +27 -2
  90. package/dist/{chunk-LNH76ZJX.js.map → chunk-AIYXVWUH.js.map} +1 -1
  91. package/dist/{chunk-7SUWY37K.js → chunk-B665A6BO.js} +2 -2
  92. package/dist/{chunk-AEGNDL24.js → chunk-BVRZSI7Q.js} +2 -2
  93. package/dist/{chunk-2EMROIXS.js → chunk-C5LWPYS3.js} +2 -1
  94. package/dist/{chunk-2EMROIXS.js.map → chunk-C5LWPYS3.js.map} +1 -1
  95. package/dist/{chunk-KJOGIRMF.js → chunk-CB6ANA2I.js} +2 -2
  96. package/dist/{chunk-5JMI26Q7.js → chunk-CBH2Z4UA.js} +2 -2
  97. package/dist/{chunk-YRH3C2OJ.js → chunk-CIIHIAJ2.js} +13 -5
  98. package/dist/chunk-CIIHIAJ2.js.map +1 -0
  99. package/dist/{chunk-W4RLOZOG.js → chunk-CJRENHVZ.js} +4 -4
  100. package/dist/{chunk-LOFVW6JA.js → chunk-CLWBFR7Q.js} +6 -6
  101. package/dist/{chunk-375ARKRS.js → chunk-D5SSBCYY.js} +70 -59
  102. package/dist/chunk-D5SSBCYY.js.map +1 -0
  103. package/dist/{chunk-KI6UOSNR.js → chunk-DEY7B77Y.js} +2 -2
  104. package/dist/chunk-DEY7B77Y.js.map +1 -0
  105. package/dist/{chunk-6VAHJ2F6.js → chunk-DMDWFQMR.js} +2 -2
  106. package/dist/{chunk-MO25AN7J.js → chunk-DPR2WTN3.js} +22 -22
  107. package/dist/{chunk-JXSYWTFK.js → chunk-DYJHGJZ4.js} +2 -2
  108. package/dist/{chunk-5X4ZJESN.js → chunk-EH4BQ7LT.js} +3 -3
  109. package/dist/chunk-EHHQJTAU.js +131 -0
  110. package/dist/chunk-EHHQJTAU.js.map +1 -0
  111. package/dist/{chunk-JXWTPOMJ.js → chunk-EPJDSQHF.js} +2 -2
  112. package/dist/{chunk-OEIA4IHU.js → chunk-ESG6ITGP.js} +2 -2
  113. package/dist/{chunk-7XI2UJHL.js → chunk-ETZUIRCI.js} +4 -4
  114. package/dist/{chunk-PPIASWWR.js → chunk-EU534WGS.js} +2 -2
  115. package/dist/{chunk-XLIK2VDE.js → chunk-EU6IRUCY.js} +7 -5
  116. package/dist/{chunk-XLIK2VDE.js.map → chunk-EU6IRUCY.js.map} +1 -1
  117. package/dist/{chunk-J7MDPTX7.js → chunk-EUAIYYYR.js} +190 -44
  118. package/dist/chunk-EUAIYYYR.js.map +1 -0
  119. package/dist/{chunk-E6KXJSMA.js → chunk-EUCYTCFP.js} +3 -3
  120. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  121. package/dist/{chunk-6OAXWYE3.js → chunk-FFOVKNQV.js} +2 -2
  122. package/dist/{chunk-2KRNPFPK.js → chunk-FLI6DEIU.js} +2 -2
  123. package/dist/{chunk-4G4B3Z2B.js → chunk-FP4JYE66.js} +2 -2
  124. package/dist/{chunk-PDVWGGX4.js → chunk-FSIMZNBC.js} +2 -2
  125. package/dist/{chunk-OAIWPB2I.js → chunk-FT4UQYOV.js} +2 -2
  126. package/dist/{chunk-D5UPBXZM.js → chunk-FUFAXVBA.js} +4 -4
  127. package/dist/{chunk-GKOML66M.js → chunk-G2OYFTUD.js} +5 -5
  128. package/dist/{chunk-XTN54NML.js → chunk-G3T6YMBO.js} +4 -4
  129. package/dist/{chunk-KWVI52ER.js → chunk-GELS5Z5Z.js} +4 -4
  130. package/dist/{chunk-J6FFBORM.js → chunk-GH7AOMJD.js} +2 -2
  131. package/dist/{chunk-TCYLCPC6.js → chunk-GKJJNO7C.js} +3 -3
  132. package/dist/{chunk-N75Q5ZSP.js → chunk-GMXWTJNU.js} +2 -2
  133. package/dist/{chunk-B657ZGDH.js → chunk-HQSK2INQ.js} +2 -2
  134. package/dist/{chunk-SQA2MM2F.js → chunk-I7S55EOB.js} +2 -2
  135. package/dist/{chunk-CAUNCRLQ.js → chunk-J7JWFZHI.js} +108 -108
  136. package/dist/{chunk-NQMG2W5L.js → chunk-JDZFIR2S.js} +2 -2
  137. package/dist/{chunk-O52WWLKU.js → chunk-JIHMUOOS.js} +5 -5
  138. package/dist/{chunk-YYO447A7.js → chunk-JNIVZNIB.js} +41 -253
  139. package/dist/chunk-JNIVZNIB.js.map +1 -0
  140. package/dist/{chunk-VUQDJ3JB.js → chunk-JPTPS4OB.js} +6 -6
  141. package/dist/{chunk-WXFKXCOQ.js → chunk-JQ7XU625.js} +10 -10
  142. package/dist/{chunk-3I3U6FFT.js → chunk-K7BN34IA.js} +2 -2
  143. package/dist/{chunk-7OAIOE5P.js → chunk-KH2LKDX7.js} +2 -2
  144. package/dist/{chunk-VDXTXVFZ.js → chunk-KR6ZKECI.js} +5 -5
  145. package/dist/{chunk-MK552I5J.js → chunk-L5DAHSEZ.js} +4 -4
  146. package/dist/{chunk-XQIHFXYP.js → chunk-LCKVXX5F.js} +2 -2
  147. package/dist/{chunk-ZI7LMSNI.js → chunk-LLHZZOIB.js} +2 -2
  148. package/dist/{chunk-E57LYSHI.js → chunk-LZACDIM2.js} +2 -2
  149. package/dist/{chunk-QAIKLICT.js → chunk-M7KGIW5F.js} +2 -2
  150. package/dist/{chunk-55ZVZBX4.js → chunk-MATDGSJ7.js} +4 -4
  151. package/dist/{chunk-3NFN4Y4P.js → chunk-MGCKZWAE.js} +5 -5
  152. package/dist/{chunk-YS7SA4HD.js → chunk-ML7ZJAKJ.js} +4 -4
  153. package/dist/{chunk-YDH2FSDI.js → chunk-N45NEBOD.js} +2 -2
  154. package/dist/{chunk-7UX44C4N.js → chunk-N4C7QKOG.js} +3 -3
  155. package/dist/{chunk-YYNHJF3N.js → chunk-N7KYEVLK.js} +2 -2
  156. package/dist/{chunk-HT2C4EXO.js → chunk-NIRQGDYC.js} +4 -4
  157. package/dist/{chunk-DXHVD4DS.js → chunk-NW2E4CI2.js} +3 -3
  158. package/dist/{chunk-BFIZXFUG.js → chunk-NWIT3U2N.js} +2 -2
  159. package/dist/{chunk-4NDWE44P.js → chunk-NZFFGO5O.js} +2 -2
  160. package/dist/{chunk-MB5EJ2CT.js → chunk-O2IPAX26.js} +10 -10
  161. package/dist/{chunk-UOA2VQ7C.js → chunk-O4SGYW7H.js} +2 -2
  162. package/dist/{chunk-SSAXGPXY.js → chunk-OP6N4H6A.js} +2 -2
  163. package/dist/{chunk-ZSJGYC3C.js → chunk-OQJKY3Z5.js} +2 -2
  164. package/dist/{chunk-OFEHITAZ.js → chunk-OXNTOHL6.js} +2 -2
  165. package/dist/{chunk-CDWFWOSZ.js → chunk-P4JED3ZL.js} +2 -2
  166. package/dist/{chunk-FQD2KPQH.js → chunk-P55FACBG.js} +2 -2
  167. package/dist/{chunk-KX36OCGK.js → chunk-P5NQN4JE.js} +3 -3
  168. package/dist/{chunk-3ZCRHW7U.js → chunk-P7TOIOT7.js} +2 -2
  169. package/dist/{chunk-BD5QEP3T.js → chunk-PAZ35RJ4.js} +45 -32
  170. package/dist/chunk-PAZ35RJ4.js.map +1 -0
  171. package/dist/chunk-PGRZ3FYC.js +34 -0
  172. package/dist/chunk-PGRZ3FYC.js.map +1 -0
  173. package/dist/{chunk-PBVNVKYN.js → chunk-PIN5OPBA.js} +2 -2
  174. package/dist/{chunk-O6YDGTH4.js → chunk-PZHQWFR3.js} +3 -3
  175. package/dist/{chunk-SVDU4OHO.js → chunk-Q35L7TYB.js} +2 -2
  176. package/dist/{chunk-SOJ3IQD3.js → chunk-QODKDRSP.js} +6 -6
  177. package/dist/{chunk-VJGDQA3D.js → chunk-QOZJCSFO.js} +3 -3
  178. package/dist/{chunk-6T42L5FI.js → chunk-QS3OLP5I.js} +2 -2
  179. package/dist/{chunk-PAAJWQH5.js → chunk-QUMKDRCF.js} +2 -2
  180. package/dist/{chunk-4TP3MJ3D.js → chunk-QX6JN3O4.js} +7 -7
  181. package/dist/{chunk-KZEMFD6E.js → chunk-R2H4ZFBJ.js} +3 -3
  182. package/dist/{chunk-N6UMXWBA.js → chunk-RTKV5XHL.js} +4 -4
  183. package/dist/{chunk-ZQ3WU6JO.js → chunk-RXFCU3CY.js} +2 -2
  184. package/dist/{chunk-BOOFTFFE.js → chunk-S2I7DL5Q.js} +1 -1
  185. package/dist/{chunk-2NCBDGND.js → chunk-SA6GMZJY.js} +3 -3
  186. package/dist/{chunk-2AFHZTPI.js → chunk-SIIRTDJ4.js} +3 -3
  187. package/dist/{chunk-WH4QXVKU.js → chunk-SS3IS2JR.js} +3 -3
  188. package/dist/{chunk-VFTK5WKI.js → chunk-STBX5X6B.js} +2 -2
  189. package/dist/{chunk-WVHRNAXL.js → chunk-SWWHIJUJ.js} +2 -2
  190. package/dist/{chunk-WADSXS4K.js → chunk-SX4QDWXK.js} +2 -2
  191. package/dist/{chunk-2U4BM3TW.js → chunk-TITG2NBS.js} +2 -2
  192. package/dist/{chunk-A5ZYP4K5.js → chunk-TNRCDMQT.js} +2 -2
  193. package/dist/{chunk-LZKOVXMX.js → chunk-TRMJ6BYC.js} +2 -2
  194. package/dist/{chunk-VA2HNBGQ.js → chunk-TZNDKTX5.js} +69 -69
  195. package/dist/{chunk-OFDIGTC2.js → chunk-UMTCNEVQ.js} +17 -17
  196. package/dist/{chunk-L3G5CGL5.js → chunk-UQDG3YLN.js} +68 -24
  197. package/dist/chunk-UQDG3YLN.js.map +1 -0
  198. package/dist/{chunk-AAM66QCP.js → chunk-UZRSI6NX.js} +2 -2
  199. package/dist/{chunk-2CXQZXWM.js → chunk-V4MB5ONM.js} +6 -6
  200. package/dist/{chunk-5BUCKFRE.js → chunk-VOKHZRHW.js} +2 -2
  201. package/dist/{chunk-CYEK6Z3P.js → chunk-VW6VIJOS.js} +2 -2
  202. package/dist/{chunk-I2M4ZVDD.js → chunk-W47S5TIH.js} +9 -9
  203. package/dist/{chunk-CBP4HWCL.js → chunk-W5MCEVUS.js} +3 -3
  204. package/dist/{chunk-E5H4TM4Y.js → chunk-WC3V7HHP.js} +3 -3
  205. package/dist/{chunk-WCTL3PVM.js → chunk-WLMZ2L5P.js} +2 -2
  206. package/dist/{chunk-SQ2O52SU.js → chunk-WSGPFRBH.js} +10 -10
  207. package/dist/{chunk-BH44JOLA.js → chunk-WVADKFWV.js} +3 -3
  208. package/dist/{chunk-JVNEXW6X.js → chunk-XISROV24.js} +2 -2
  209. package/dist/{chunk-FZVROZKC.js → chunk-XVZA6VXC.js} +4 -4
  210. package/dist/{chunk-56GJLXBA.js → chunk-Y4NKEXQT.js} +4 -4
  211. package/dist/{chunk-EKKAHJ4B.js → chunk-YE36AJL7.js} +4 -4
  212. package/dist/chunk-YET735EZ.js +99 -0
  213. package/dist/chunk-YET735EZ.js.map +1 -0
  214. package/dist/{chunk-OGWEWJRH.js → chunk-YFMBHQRG.js} +2 -2
  215. package/dist/{chunk-JLIGUFPF.js → chunk-YN2DQ2D6.js} +2 -2
  216. package/dist/{chunk-RBJQYMMT.js → chunk-YRULQW5J.js} +4 -4
  217. package/dist/{chunk-UCJINCZT.js → chunk-YUZRI3QU.js} +2 -2
  218. package/dist/{chunk-QUNDYIYZ.js → chunk-YYEOR4XN.js} +3 -3
  219. package/dist/{chunk-O5MW6CQL.js → chunk-ZJVMUBYF.js} +2 -2
  220. package/dist/{chunk-VBJD4RSJ.js → chunk-ZSH2NRDV.js} +2 -2
  221. package/dist/{chunk-BX4WDBTE.js → chunk-ZV65I6ME.js} +78 -78
  222. package/dist/cli.js +150 -148
  223. package/dist/coding/export-okf-codegraph.js +31 -29
  224. package/dist/coding/export-okf-codegraph.js.map +1 -1
  225. package/dist/coding/pre-action-gate.js +2 -2
  226. package/dist/compounding/engine.d.ts +15 -11
  227. package/dist/compounding/engine.d.ts.map +1 -1
  228. package/dist/compounding/engine.js +34 -32
  229. package/dist/compounding/iso-week.d.ts +2 -0
  230. package/dist/compounding/iso-week.d.ts.map +1 -1
  231. package/dist/compounding/weekly-scheduler.d.ts +81 -0
  232. package/dist/compounding/weekly-scheduler.d.ts.map +1 -0
  233. package/dist/compounding/weekly-synthesis-queue.d.ts +9 -0
  234. package/dist/compounding/weekly-synthesis-queue.d.ts.map +1 -0
  235. package/dist/config.js +42 -40
  236. package/dist/connectors/codex-materialize-runner.js +31 -29
  237. package/dist/connectors/index.js +32 -30
  238. package/dist/console/trace.d.ts +5 -14
  239. package/dist/console/trace.d.ts.map +1 -1
  240. package/dist/consolidation-provenance-check.js +7 -6
  241. package/dist/consolidation-undo.js +5 -4
  242. package/dist/consolidation-undo.js.map +1 -1
  243. package/dist/contradiction/index.js +9 -8
  244. package/dist/{contradiction-scan-GGRTVB7C.js → contradiction-scan-P7KXB5R4.js} +3 -3
  245. package/dist/converge-config.d.ts +2 -0
  246. package/dist/converge-config.d.ts.map +1 -1
  247. package/dist/converge-config.js +7 -3
  248. package/dist/convergence-refresh.js +33 -31
  249. package/dist/corpus-watermark.js +33 -31
  250. package/dist/dashboard-runtime.js +2 -2
  251. package/dist/day-summary.js +2 -2
  252. package/dist/deep-recall-http-glue.js +13 -13
  253. package/dist/deep-recall.js +2 -2
  254. package/dist/embedding-fallback.js +6 -5
  255. package/dist/embedding-generation-lock.js +4 -3
  256. package/dist/entity-retrieval.js +32 -30
  257. package/dist/explicit-capture.js +12 -9
  258. package/dist/external-wiki-access.js +98 -96
  259. package/dist/extraction-judge.js +3 -3
  260. package/dist/extraction-normalization.js +3 -3
  261. package/dist/extraction-prompt.js +2 -2
  262. package/dist/extraction-quote-grounding.d.ts +67 -0
  263. package/dist/extraction-quote-grounding.d.ts.map +1 -0
  264. package/dist/extraction-quote-grounding.js +27 -0
  265. package/dist/extraction-quote-grounding.js.map +1 -0
  266. package/dist/extraction-source-grounding-helpers.d.ts +8 -0
  267. package/dist/extraction-source-grounding-helpers.d.ts.map +1 -1
  268. package/dist/extraction-source-grounding-helpers.js +11 -1
  269. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  270. package/dist/extraction-source-grounding-rules.d.ts.map +1 -1
  271. package/dist/extraction-source-grounding-rules.js +3 -2
  272. package/dist/extraction-source-grounding.d.ts +1 -1
  273. package/dist/extraction-source-grounding.d.ts.map +1 -1
  274. package/dist/extraction-source-grounding.js +4 -3
  275. package/dist/extraction-span-materialize.js +2 -2
  276. package/dist/extraction.js +50 -47
  277. package/dist/{first-start-migration-OM3PHMZO.js → first-start-migration-6A5BJPDW.js} +5 -5
  278. package/dist/{forget-OHAJ6PSU.js → forget-GXBWFKRC.js} +5 -4
  279. package/dist/{forget-OHAJ6PSU.js.map → forget-GXBWFKRC.js.map} +1 -1
  280. package/dist/{graph-edge-decay-CZ3SYLM4.js → graph-edge-decay-BYPZVJT4.js} +10 -9
  281. package/dist/graph-edge-decay-BYPZVJT4.js.map +1 -0
  282. package/dist/graph-jsonl.js +8 -7
  283. package/dist/graph-snapshot.js +8 -7
  284. package/dist/graph-write-lock.js +4 -3
  285. package/dist/graph.js +9 -8
  286. package/dist/harmonic-retrieval.js +31 -29
  287. package/dist/http-retry.js +2 -1
  288. package/dist/http-retry.js.map +1 -1
  289. package/dist/index.d.ts +1 -1
  290. package/dist/index.d.ts.map +1 -1
  291. package/dist/index.js +241 -236
  292. package/dist/lcm/engine.js +4 -4
  293. package/dist/lcm/index.js +12 -12
  294. package/dist/local-llm.js +2 -2
  295. package/dist/location/index.js +34 -32
  296. package/dist/maintenance/memory-governance.js +31 -29
  297. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +31 -29
  298. package/dist/maintenance/rebuild-memory-projection-runner.js +33 -31
  299. package/dist/maintenance/rebuild-memory-projection.js +32 -30
  300. package/dist/memory-browse-operations.js +98 -96
  301. package/dist/memory-browse.js +7 -7
  302. package/dist/memory-subject.js +5 -4
  303. package/dist/namespaces/migrate.js +32 -30
  304. package/dist/namespaces/principal.js +2 -2
  305. package/dist/namespaces/search.js +10 -10
  306. package/dist/namespaces/storage.js +31 -29
  307. package/dist/offline-sync-changeset-generations.js +7 -6
  308. package/dist/offline-sync-embedding-generation.js +6 -5
  309. package/dist/offline-sync-impression-drain.js +8 -8
  310. package/dist/offline-sync-snapshot-stream.js +9 -9
  311. package/dist/offline-sync.js +10 -10
  312. package/dist/operator-doctor-corpus.js +34 -32
  313. package/dist/operator-toolkit.js +59 -57
  314. package/dist/orchestration/compression-guideline-coordinator.js +2 -2
  315. package/dist/orchestration/maintenance.d.ts +2 -0
  316. package/dist/orchestration/maintenance.d.ts.map +1 -1
  317. package/dist/orchestration/maintenance.js +49 -43
  318. package/dist/orchestrator.js +203 -200
  319. package/dist/page-versioning.js +5 -4
  320. package/dist/qmd-daemon-session.js +2 -2
  321. package/dist/qmd.js +4 -4
  322. package/dist/recall-explain-renderer.js +3 -3
  323. package/dist/recall-navigate-access.js +2 -2
  324. package/dist/recall-navigate-disclosure.js +2 -2
  325. package/dist/recall-navigate.js +2 -2
  326. package/dist/recall-navigation-operations.js +98 -96
  327. package/dist/recall-navigation.js +97 -95
  328. package/dist/recall-state-view-admission.js +7 -7
  329. package/dist/recall-state.js +4 -3
  330. package/dist/recall-why-service.js +11 -11
  331. package/dist/recall-why.js +3 -3
  332. package/dist/recall-xray-cli.js +4 -4
  333. package/dist/recall-xray-renderer.js +3 -3
  334. package/dist/recall-xray.js +2 -2
  335. package/dist/reconcile/cursor.js +4 -2
  336. package/dist/reconcile/cursor.js.map +1 -1
  337. package/dist/reconcile/manifest.js +9 -6
  338. package/dist/reconcile/plan.js +4 -2
  339. package/dist/rerank-outcome.js +2 -2
  340. package/dist/{resolution-E4GLHLY6.js → resolution-7AY36LGJ.js} +10 -9
  341. package/dist/resolution-7AY36LGJ.js.map +1 -0
  342. package/dist/resume-bundles.js +43 -41
  343. package/dist/salvage-envelope.js +7 -6
  344. package/dist/search/embed-helper.js +2 -2
  345. package/dist/search/factory.js +9 -9
  346. package/dist/search/index.js +15 -15
  347. package/dist/semantic-consolidation.js +36 -34
  348. package/dist/semantic-rule-promotion.js +31 -29
  349. package/dist/semantic-rule-verifier.js +31 -29
  350. package/dist/shared-context/manager.js +2 -2
  351. package/dist/source-agent-qualifier.js +43 -40
  352. package/dist/standup/build.js +31 -29
  353. package/dist/storage/content-hash-index.d.ts +10 -0
  354. package/dist/storage/content-hash-index.d.ts.map +1 -1
  355. package/dist/storage/tombstone-blocked-capture-index.d.ts +3 -0
  356. package/dist/storage/tombstone-blocked-capture-index.d.ts.map +1 -1
  357. package/dist/storage/tombstone-blocked-capture-mutation.d.ts +23 -3
  358. package/dist/storage/tombstone-blocked-capture-mutation.d.ts.map +1 -1
  359. package/dist/storage.d.ts +6 -0
  360. package/dist/storage.d.ts.map +1 -1
  361. package/dist/storage.js +32 -30
  362. package/dist/subject-config.js +6 -5
  363. package/dist/summarizer.js +6 -6
  364. package/dist/summary-snapshot.js +4 -3
  365. package/dist/support-passport/index.js +100 -98
  366. package/dist/{tier-stats-M2FMMD2N.js → tier-stats-RQM76XYY.js} +2 -2
  367. package/dist/{trace-LXXCMZJA.js → trace-QBQVS5BC.js} +5 -21
  368. package/dist/trace-QBQVS5BC.js.map +1 -0
  369. package/dist/transfer/autodetect.js +1 -1
  370. package/dist/transfer/backup.js +1 -1
  371. package/dist/transfer/capsule-export.js +3 -3
  372. package/dist/transfer/capsule-import.js +7 -6
  373. package/dist/transfer/export-okf.js +31 -29
  374. package/dist/types.d.ts +9 -0
  375. package/dist/types.d.ts.map +1 -1
  376. package/dist/types.js +1 -1
  377. package/dist/utils/serialize-mutations.js +3 -2
  378. package/dist/utils/sleep.d.ts +6 -0
  379. package/dist/utils/sleep.d.ts.map +1 -1
  380. package/dist/verified-recall.js +31 -29
  381. package/dist/who-knows-cli.js +32 -30
  382. package/dist/who-knows.js +31 -29
  383. package/dist/write-envelope.js +6 -5
  384. package/package.json +22 -2
  385. package/src/calibration.test.ts +80 -1
  386. package/src/calibration.ts +77 -8
  387. package/src/capabilities.test.ts +1 -0
  388. package/src/capabilities.ts +4 -4
  389. package/src/capture-write-lock-backoff.test.ts +534 -0
  390. package/src/capture-write-lock-backoff.ts +140 -0
  391. package/src/capture-write-lock.ts +8 -0
  392. package/src/compounding/engine.ts +32 -31
  393. package/src/compounding/iso-week.ts +16 -0
  394. package/src/compounding/weekly-scheduler.test.ts +426 -0
  395. package/src/compounding/weekly-scheduler.ts +231 -0
  396. package/src/compounding/weekly-synthesis-queue.ts +23 -0
  397. package/src/console/trace.ts +5 -36
  398. package/src/converge-config.ts +80 -1
  399. package/src/extraction-quote-grounding.test.ts +546 -0
  400. package/src/extraction-quote-grounding.ts +232 -0
  401. package/src/extraction-source-grounding-helpers.ts +35 -0
  402. package/src/extraction-source-grounding-rules.ts +90 -65
  403. package/src/extraction-source-grounding.ts +11 -2
  404. package/src/index.ts +1 -1
  405. package/src/orchestration/maintenance.ts +6 -2
  406. package/src/providers/codex-subscription.test.ts +15 -3
  407. package/src/storage/content-hash-index.ts +10 -0
  408. package/src/storage/tombstone-blocked-capture-index.ts +8 -1
  409. package/src/storage/tombstone-blocked-capture-mutation.ts +133 -43
  410. package/src/storage.ts +13 -0
  411. package/src/types.ts +9 -0
  412. package/src/utils/sleep.ts +28 -0
  413. package/dist/chunk-375ARKRS.js.map +0 -1
  414. package/dist/chunk-6MINUTGJ.js +0 -64
  415. package/dist/chunk-6MINUTGJ.js.map +0 -1
  416. package/dist/chunk-7LEQREP2.js +0 -9
  417. package/dist/chunk-7LEQREP2.js.map +0 -1
  418. package/dist/chunk-BD5QEP3T.js.map +0 -1
  419. package/dist/chunk-J7MDPTX7.js.map +0 -1
  420. package/dist/chunk-KI6UOSNR.js.map +0 -1
  421. package/dist/chunk-L3G5CGL5.js.map +0 -1
  422. package/dist/chunk-QWWMS4AE.js.map +0 -1
  423. package/dist/chunk-YRH3C2OJ.js.map +0 -1
  424. package/dist/chunk-YYO447A7.js.map +0 -1
  425. package/dist/trace-LXXCMZJA.js.map +0 -1
  426. /package/dist/{auto-sync-WSJAOLOP.js.map → auto-sync-7WWAKW6F.js.map} +0 -0
  427. /package/dist/{contradiction-scan-GGRTVB7C.js.map → capture-write-lock-backoff.js.map} +0 -0
  428. /package/dist/{graph-edge-decay-CZ3SYLM4.js.map → capture-write-lock.js.map} +0 -0
  429. /package/dist/{chunk-RNPJ4GQA.js.map → chunk-22W2XWGH.js.map} +0 -0
  430. /package/dist/{chunk-AV2OQF2O.js.map → chunk-3F3HA3R2.js.map} +0 -0
  431. /package/dist/{chunk-QZZPUREO.js.map → chunk-3GYSZHMT.js.map} +0 -0
  432. /package/dist/{chunk-XYOT5GQU.js.map → chunk-3NF4QUNZ.js.map} +0 -0
  433. /package/dist/{chunk-AL6EHLB5.js.map → chunk-3X3PNU3T.js.map} +0 -0
  434. /package/dist/{chunk-BTJ6CAIA.js.map → chunk-4IYIGN53.js.map} +0 -0
  435. /package/dist/{chunk-OM3RWZQK.js.map → chunk-4KY5GSMB.js.map} +0 -0
  436. /package/dist/{chunk-4N2MFNTG.js.map → chunk-4OSG5Y6M.js.map} +0 -0
  437. /package/dist/{chunk-EEDI3OXB.js.map → chunk-4Q26RNSR.js.map} +0 -0
  438. /package/dist/{chunk-EHRE7ZG3.js.map → chunk-5B5WYAHQ.js.map} +0 -0
  439. /package/dist/{chunk-WCGJK4NQ.js.map → chunk-5FNZ3G6X.js.map} +0 -0
  440. /package/dist/{chunk-Y6DZ33PA.js.map → chunk-5GX5457J.js.map} +0 -0
  441. /package/dist/{chunk-OFCHT2TN.js.map → chunk-5LRV557D.js.map} +0 -0
  442. /package/dist/{chunk-VAOC6GHN.js.map → chunk-5PHOU5QI.js.map} +0 -0
  443. /package/dist/{chunk-WL7N5VGG.js.map → chunk-5TJEOU6Y.js.map} +0 -0
  444. /package/dist/{chunk-A2L3P2IY.js.map → chunk-5WCJLQTM.js.map} +0 -0
  445. /package/dist/{chunk-MZBWIJJN.js.map → chunk-63B2IZYE.js.map} +0 -0
  446. /package/dist/{chunk-DGRMWDQY.js.map → chunk-66BCOVW2.js.map} +0 -0
  447. /package/dist/{chunk-P2S6P7X6.js.map → chunk-6LG7BWKW.js.map} +0 -0
  448. /package/dist/{chunk-4G2YCKLT.js.map → chunk-7G5NTS7F.js.map} +0 -0
  449. /package/dist/{chunk-IPLYGWQF.js.map → chunk-7LCGFUMB.js.map} +0 -0
  450. /package/dist/{chunk-KYY4EACB.js.map → chunk-7Z3DLNSD.js.map} +0 -0
  451. /package/dist/{chunk-7SUWY37K.js.map → chunk-B665A6BO.js.map} +0 -0
  452. /package/dist/{chunk-AEGNDL24.js.map → chunk-BVRZSI7Q.js.map} +0 -0
  453. /package/dist/{chunk-KJOGIRMF.js.map → chunk-CB6ANA2I.js.map} +0 -0
  454. /package/dist/{chunk-5JMI26Q7.js.map → chunk-CBH2Z4UA.js.map} +0 -0
  455. /package/dist/{chunk-W4RLOZOG.js.map → chunk-CJRENHVZ.js.map} +0 -0
  456. /package/dist/{chunk-LOFVW6JA.js.map → chunk-CLWBFR7Q.js.map} +0 -0
  457. /package/dist/{chunk-6VAHJ2F6.js.map → chunk-DMDWFQMR.js.map} +0 -0
  458. /package/dist/{chunk-MO25AN7J.js.map → chunk-DPR2WTN3.js.map} +0 -0
  459. /package/dist/{chunk-JXSYWTFK.js.map → chunk-DYJHGJZ4.js.map} +0 -0
  460. /package/dist/{chunk-5X4ZJESN.js.map → chunk-EH4BQ7LT.js.map} +0 -0
  461. /package/dist/{chunk-JXWTPOMJ.js.map → chunk-EPJDSQHF.js.map} +0 -0
  462. /package/dist/{chunk-OEIA4IHU.js.map → chunk-ESG6ITGP.js.map} +0 -0
  463. /package/dist/{chunk-7XI2UJHL.js.map → chunk-ETZUIRCI.js.map} +0 -0
  464. /package/dist/{chunk-PPIASWWR.js.map → chunk-EU534WGS.js.map} +0 -0
  465. /package/dist/{chunk-E6KXJSMA.js.map → chunk-EUCYTCFP.js.map} +0 -0
  466. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  467. /package/dist/{chunk-6OAXWYE3.js.map → chunk-FFOVKNQV.js.map} +0 -0
  468. /package/dist/{chunk-2KRNPFPK.js.map → chunk-FLI6DEIU.js.map} +0 -0
  469. /package/dist/{chunk-4G4B3Z2B.js.map → chunk-FP4JYE66.js.map} +0 -0
  470. /package/dist/{chunk-PDVWGGX4.js.map → chunk-FSIMZNBC.js.map} +0 -0
  471. /package/dist/{chunk-OAIWPB2I.js.map → chunk-FT4UQYOV.js.map} +0 -0
  472. /package/dist/{chunk-D5UPBXZM.js.map → chunk-FUFAXVBA.js.map} +0 -0
  473. /package/dist/{chunk-GKOML66M.js.map → chunk-G2OYFTUD.js.map} +0 -0
  474. /package/dist/{chunk-XTN54NML.js.map → chunk-G3T6YMBO.js.map} +0 -0
  475. /package/dist/{chunk-KWVI52ER.js.map → chunk-GELS5Z5Z.js.map} +0 -0
  476. /package/dist/{chunk-J6FFBORM.js.map → chunk-GH7AOMJD.js.map} +0 -0
  477. /package/dist/{chunk-TCYLCPC6.js.map → chunk-GKJJNO7C.js.map} +0 -0
  478. /package/dist/{chunk-N75Q5ZSP.js.map → chunk-GMXWTJNU.js.map} +0 -0
  479. /package/dist/{chunk-B657ZGDH.js.map → chunk-HQSK2INQ.js.map} +0 -0
  480. /package/dist/{chunk-SQA2MM2F.js.map → chunk-I7S55EOB.js.map} +0 -0
  481. /package/dist/{chunk-CAUNCRLQ.js.map → chunk-J7JWFZHI.js.map} +0 -0
  482. /package/dist/{chunk-NQMG2W5L.js.map → chunk-JDZFIR2S.js.map} +0 -0
  483. /package/dist/{chunk-O52WWLKU.js.map → chunk-JIHMUOOS.js.map} +0 -0
  484. /package/dist/{chunk-VUQDJ3JB.js.map → chunk-JPTPS4OB.js.map} +0 -0
  485. /package/dist/{chunk-WXFKXCOQ.js.map → chunk-JQ7XU625.js.map} +0 -0
  486. /package/dist/{chunk-3I3U6FFT.js.map → chunk-K7BN34IA.js.map} +0 -0
  487. /package/dist/{chunk-7OAIOE5P.js.map → chunk-KH2LKDX7.js.map} +0 -0
  488. /package/dist/{chunk-VDXTXVFZ.js.map → chunk-KR6ZKECI.js.map} +0 -0
  489. /package/dist/{chunk-MK552I5J.js.map → chunk-L5DAHSEZ.js.map} +0 -0
  490. /package/dist/{chunk-XQIHFXYP.js.map → chunk-LCKVXX5F.js.map} +0 -0
  491. /package/dist/{chunk-ZI7LMSNI.js.map → chunk-LLHZZOIB.js.map} +0 -0
  492. /package/dist/{chunk-E57LYSHI.js.map → chunk-LZACDIM2.js.map} +0 -0
  493. /package/dist/{chunk-QAIKLICT.js.map → chunk-M7KGIW5F.js.map} +0 -0
  494. /package/dist/{chunk-55ZVZBX4.js.map → chunk-MATDGSJ7.js.map} +0 -0
  495. /package/dist/{chunk-3NFN4Y4P.js.map → chunk-MGCKZWAE.js.map} +0 -0
  496. /package/dist/{chunk-YS7SA4HD.js.map → chunk-ML7ZJAKJ.js.map} +0 -0
  497. /package/dist/{chunk-YDH2FSDI.js.map → chunk-N45NEBOD.js.map} +0 -0
  498. /package/dist/{chunk-7UX44C4N.js.map → chunk-N4C7QKOG.js.map} +0 -0
  499. /package/dist/{chunk-YYNHJF3N.js.map → chunk-N7KYEVLK.js.map} +0 -0
  500. /package/dist/{chunk-HT2C4EXO.js.map → chunk-NIRQGDYC.js.map} +0 -0
  501. /package/dist/{chunk-DXHVD4DS.js.map → chunk-NW2E4CI2.js.map} +0 -0
  502. /package/dist/{chunk-BFIZXFUG.js.map → chunk-NWIT3U2N.js.map} +0 -0
  503. /package/dist/{chunk-4NDWE44P.js.map → chunk-NZFFGO5O.js.map} +0 -0
  504. /package/dist/{chunk-MB5EJ2CT.js.map → chunk-O2IPAX26.js.map} +0 -0
  505. /package/dist/{chunk-UOA2VQ7C.js.map → chunk-O4SGYW7H.js.map} +0 -0
  506. /package/dist/{chunk-SSAXGPXY.js.map → chunk-OP6N4H6A.js.map} +0 -0
  507. /package/dist/{chunk-ZSJGYC3C.js.map → chunk-OQJKY3Z5.js.map} +0 -0
  508. /package/dist/{chunk-OFEHITAZ.js.map → chunk-OXNTOHL6.js.map} +0 -0
  509. /package/dist/{chunk-CDWFWOSZ.js.map → chunk-P4JED3ZL.js.map} +0 -0
  510. /package/dist/{chunk-FQD2KPQH.js.map → chunk-P55FACBG.js.map} +0 -0
  511. /package/dist/{chunk-KX36OCGK.js.map → chunk-P5NQN4JE.js.map} +0 -0
  512. /package/dist/{chunk-3ZCRHW7U.js.map → chunk-P7TOIOT7.js.map} +0 -0
  513. /package/dist/{chunk-PBVNVKYN.js.map → chunk-PIN5OPBA.js.map} +0 -0
  514. /package/dist/{chunk-O6YDGTH4.js.map → chunk-PZHQWFR3.js.map} +0 -0
  515. /package/dist/{chunk-SVDU4OHO.js.map → chunk-Q35L7TYB.js.map} +0 -0
  516. /package/dist/{chunk-SOJ3IQD3.js.map → chunk-QODKDRSP.js.map} +0 -0
  517. /package/dist/{chunk-VJGDQA3D.js.map → chunk-QOZJCSFO.js.map} +0 -0
  518. /package/dist/{chunk-6T42L5FI.js.map → chunk-QS3OLP5I.js.map} +0 -0
  519. /package/dist/{chunk-PAAJWQH5.js.map → chunk-QUMKDRCF.js.map} +0 -0
  520. /package/dist/{chunk-4TP3MJ3D.js.map → chunk-QX6JN3O4.js.map} +0 -0
  521. /package/dist/{chunk-KZEMFD6E.js.map → chunk-R2H4ZFBJ.js.map} +0 -0
  522. /package/dist/{chunk-N6UMXWBA.js.map → chunk-RTKV5XHL.js.map} +0 -0
  523. /package/dist/{chunk-ZQ3WU6JO.js.map → chunk-RXFCU3CY.js.map} +0 -0
  524. /package/dist/{chunk-BOOFTFFE.js.map → chunk-S2I7DL5Q.js.map} +0 -0
  525. /package/dist/{chunk-2NCBDGND.js.map → chunk-SA6GMZJY.js.map} +0 -0
  526. /package/dist/{chunk-2AFHZTPI.js.map → chunk-SIIRTDJ4.js.map} +0 -0
  527. /package/dist/{chunk-WH4QXVKU.js.map → chunk-SS3IS2JR.js.map} +0 -0
  528. /package/dist/{chunk-VFTK5WKI.js.map → chunk-STBX5X6B.js.map} +0 -0
  529. /package/dist/{chunk-WVHRNAXL.js.map → chunk-SWWHIJUJ.js.map} +0 -0
  530. /package/dist/{chunk-WADSXS4K.js.map → chunk-SX4QDWXK.js.map} +0 -0
  531. /package/dist/{chunk-2U4BM3TW.js.map → chunk-TITG2NBS.js.map} +0 -0
  532. /package/dist/{chunk-A5ZYP4K5.js.map → chunk-TNRCDMQT.js.map} +0 -0
  533. /package/dist/{chunk-LZKOVXMX.js.map → chunk-TRMJ6BYC.js.map} +0 -0
  534. /package/dist/{chunk-VA2HNBGQ.js.map → chunk-TZNDKTX5.js.map} +0 -0
  535. /package/dist/{chunk-OFDIGTC2.js.map → chunk-UMTCNEVQ.js.map} +0 -0
  536. /package/dist/{chunk-AAM66QCP.js.map → chunk-UZRSI6NX.js.map} +0 -0
  537. /package/dist/{chunk-2CXQZXWM.js.map → chunk-V4MB5ONM.js.map} +0 -0
  538. /package/dist/{chunk-5BUCKFRE.js.map → chunk-VOKHZRHW.js.map} +0 -0
  539. /package/dist/{chunk-CYEK6Z3P.js.map → chunk-VW6VIJOS.js.map} +0 -0
  540. /package/dist/{chunk-I2M4ZVDD.js.map → chunk-W47S5TIH.js.map} +0 -0
  541. /package/dist/{chunk-CBP4HWCL.js.map → chunk-W5MCEVUS.js.map} +0 -0
  542. /package/dist/{chunk-E5H4TM4Y.js.map → chunk-WC3V7HHP.js.map} +0 -0
  543. /package/dist/{chunk-WCTL3PVM.js.map → chunk-WLMZ2L5P.js.map} +0 -0
  544. /package/dist/{chunk-SQ2O52SU.js.map → chunk-WSGPFRBH.js.map} +0 -0
  545. /package/dist/{chunk-BH44JOLA.js.map → chunk-WVADKFWV.js.map} +0 -0
  546. /package/dist/{chunk-JVNEXW6X.js.map → chunk-XISROV24.js.map} +0 -0
  547. /package/dist/{chunk-FZVROZKC.js.map → chunk-XVZA6VXC.js.map} +0 -0
  548. /package/dist/{chunk-56GJLXBA.js.map → chunk-Y4NKEXQT.js.map} +0 -0
  549. /package/dist/{chunk-EKKAHJ4B.js.map → chunk-YE36AJL7.js.map} +0 -0
  550. /package/dist/{chunk-OGWEWJRH.js.map → chunk-YFMBHQRG.js.map} +0 -0
  551. /package/dist/{chunk-JLIGUFPF.js.map → chunk-YN2DQ2D6.js.map} +0 -0
  552. /package/dist/{chunk-RBJQYMMT.js.map → chunk-YRULQW5J.js.map} +0 -0
  553. /package/dist/{chunk-UCJINCZT.js.map → chunk-YUZRI3QU.js.map} +0 -0
  554. /package/dist/{chunk-QUNDYIYZ.js.map → chunk-YYEOR4XN.js.map} +0 -0
  555. /package/dist/{chunk-O5MW6CQL.js.map → chunk-ZJVMUBYF.js.map} +0 -0
  556. /package/dist/{chunk-VBJD4RSJ.js.map → chunk-ZSH2NRDV.js.map} +0 -0
  557. /package/dist/{chunk-BX4WDBTE.js.map → chunk-ZV65I6ME.js.map} +0 -0
  558. /package/dist/{resolution-E4GLHLY6.js.map → contradiction-scan-P7KXB5R4.js.map} +0 -0
  559. /package/dist/{first-start-migration-OM3PHMZO.js.map → first-start-migration-6A5BJPDW.js.map} +0 -0
  560. /package/dist/{tier-stats-M2FMMD2N.js.map → tier-stats-RQM76XYY.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/storage/content-hash-index.ts"],"sourcesContent":["// Content-hash dedup index for facts, extracted from storage.ts (issue #1909 /\n// PR #2016 write-hot-paths). Self-contained: cross-process locked reconcile /\n// rebuild saves plus the deferred durable-retry machinery. storage.ts imports\n// these back and re-exports the class + companion types that were previously\n// part of its public API.\nimport { mkdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { computeContentHash, normalizeContent } from \"../content-hash.js\";\nimport { log } from \"../logger.js\";\nimport { SecureStoreLockedError, readMaybeEncryptedFile, writeMaybeEncryptedFile } from \"../secure-store/secure-fs.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\nimport { withHeldFileLock } from \"../utils/serialize-mutations.js\";\n\n/**\n * Stale threshold (ms) for the per-file advisory lock guarding a fact-hash\n * index merge-save (issue #1909 review round 7). The critical section is a\n * single read+atomic-rewrite of one index file (≤ a few MB), so a holder older\n * than this is treated as crashed. Generous to tolerate slow/encrypted disks\n * without breaking a legitimately in-progress publish.\n */\nconst CONTENT_HASH_INDEX_LOCK_STALE_MS = 30_000;\n/** Version marker for the normalized Unicode hash index format. */\nconst CONTENT_HASH_INDEX_FORMAT_HEADER = \"# remnic-content-hash-index:v2\";\n\nfunction parseHashIndex(raw: string): { versioned: boolean; hashes: Set<string> } {\n const lines = raw\n .split(\"\\n\")\n .map((line) => line.trim())\n .filter((line) => line.length > 0);\n if (lines[0] !== CONTENT_HASH_INDEX_FORMAT_HEADER) {\n return { versioned: false, hashes: new Set() };\n }\n return { versioned: true, hashes: new Set(lines.slice(1)) };\n}\n\nfunction serializeHashIndex(hashes: Set<string>): string {\n return `${CONTENT_HASH_INDEX_FORMAT_HEADER}\\n${[...hashes].join(\"\\n\")}\\n`;\n}\n\n/**\n * Durable-retry policy for a deferred content-hash reconcile save whose\n * cross-process lock acquire timed out (issue #1909 / PR #2016). When the lock\n * is contended past `withHeldFileLock`'s bounded wait, the added hashes are held\n * only in this process's memory; relying on \"some later batch save\" is not\n * durable (the run may be the last before idle/shutdown), and a long-lived peer\n * that already built its authoritative in-memory index will not see the write.\n * So we schedule a bounded, exponentially-backed-off background retry that keeps\n * re-attempting the locked publish until it lands. Bounded because the durable\n * fact `.md` is already on disk and a process restart rebuilds the index from\n * the corpus regardless — exhausting retries degrades to that rebuild safety\n * net, never to data loss or a fatal append failure.\n */\nconst CONTENT_HASH_INDEX_RETRY_MAX_ATTEMPTS = 5;\n/** Base backoff (ms) before the first deferred reconcile-save retry; doubles each attempt. */\nconst CONTENT_HASH_INDEX_RETRY_BASE_MS = 500;\n/** Ceiling (ms) for the exponential reconcile-save retry backoff. */\nexport const CONTENT_HASH_INDEX_RETRY_MAX_DELAY_MS = 5_000;\n\n/**\n * Tuning for {@link ContentHashIndex} cross-process lock waits and the\n * deferred reconcile-save durable retry (issue #1909 / PR #2016). All optional;\n * production uses the module defaults. Tests inject small values so the\n * lock-timeout + retry path is exercised deterministically without real\n * multi-second waits.\n */\nexport interface ContentHashIndexLockOptions {\n /** Bounded wait to acquire the per-file advisory lock; passed to `withHeldFileLock` (default 5000ms). */\n readonly maxWaitMs?: number;\n /** Poll interval while waiting for a busy lock (default 50ms). */\n readonly pollMs?: number;\n /** Base backoff before the first deferred-save retry (default 500ms). */\n readonly retryBaseMs?: number;\n /** Max deferred-save retries before falling back to the corpus-rebuild safety net (default 5). */\n readonly retryMaxAttempts?: number;\n}\n\n/**\n * Thrown when the fact-hash index cannot be made authoritative — the\n * cross-process rebuild lock could not be acquired within the bounded retry\n * budget (PR #2016). Callers that require an authoritative dedup answer surface\n * this instead of silently trusting a stale loaded snapshot.\n */\nexport class FactHashIndexNotAuthoritativeError extends Error {\n constructor(stateDir: string) {\n super(\n `fact-hash index is not authoritative: the cross-process rebuild lock for ${stateDir} could not be acquired within the bounded retry budget`\n );\n this.name = \"FactHashIndexNotAuthoritativeError\";\n }\n}\n\ntype DiskFingerprint = {\n mtimeMs: number;\n size: number;\n dev: number;\n ino: number;\n ctimeMs: number;\n birthtimeMs: number;\n};\nexport interface ContentHashPathEntry {\n readonly path: string;\n readonly contentHash: string;\n}\n\n/**\n * Content-hash dedup index for facts.\n * Normalizes content (lowercase, strip punctuation, collapse whitespace),\n * computes SHA-256, and stores hashes in a line-delimited file.\n * Prevents writing semantically identical facts.\n */\nexport class ContentHashIndex {\n private hashes: Set<string> = new Set();\n /**\n * Fact-ONLY hash partition (issue #2474). `hashes` above is category-blind\n * (every write category registers there); this subset carries only\n * `category === \"fact\"` hashes so fact-only membership checks\n * (`hasFact*`) can never be satisfied by an unrelated decision/preference\n * sharing the same normalized body. In-memory only — never serialized to\n * fact-hashes.txt; `clear()` drops it and every authoritative rebuild\n * repopulates it via `addFactByHash`. Subset invariant: `factHashes ⊆\n * hashes` — `addFact*` registers in both, and the removal sites that drop\n * a shared hash also drop the partition entry (removal stays caller-paired\n * because shared-index removal is category-blind: archiving a non-fact\n * must not evict an active fact's fact-only membership).\n */\n private factHashes: Set<string> = new Set();\n private dirty = false;\n /** True when load() found the pre-Unicode, markerless on-disk format. */\n private formatMigrationRequired = false;\n /**\n * Hashes explicitly removed since the last successful save (issue #1909 review\n * round 8 thread 3). Tracked separately so `saveMergingWithDisk` can be\n * removal-AWARE: under the file lock it reads the latest on-disk set, DROPS\n * these, then unions our additions — so a removal batch cannot resurrect a\n * hash (union alone would) and cannot clobber a concurrent extraction's\n * appended hash (blind overwrite would). Consumed + cleared by every save.\n */\n private removed: Set<string> = new Set();\n /**\n * Hashes added by THIS instance since the last successful save (issue #1909\n * review round 9 finding 3). Tracked separately from the loaded snapshot so a\n * reconciling save publishes `(on-disk \\ removed) ∪ added` — it re-applies only\n * OUR additions, never the stale loaded entries. Without this, seeding the\n * merge from `this.hashes` (loaded ∪ added) would resurrect a hash a peer\n * removed on disk while this instance held a stale snapshot.\n */\n private added: Set<string> = new Set();\n private readonly filePath: string;\n private readonly secureStoreKeyProvider: () => Buffer | null;\n private readonly secureStoreWriteKeyProvider: () => Buffer | null;\n private readonly memoryDir: string;\n private readonly lockOptions: ContentHashIndexLockOptions;\n /**\n * Deferred reconcile-save durable-retry state (issue #1909 / PR #2016). At\n * most ONE retry is ever armed (`reconcileRetryTimer` is the reentrancy guard)\n * so successive timed-out saves cannot stack duplicate/parallel retries.\n * `reconcileRetryBarrier` resolves when the chain settles (published or gave\n * up) — awaited by tests and any caller wanting the eventual result.\n */\n private reconcileRetryTimer: NodeJS.Timeout | null = null;\n private reconcileRetryAttempts = 0;\n private reconcileRetryBarrier: Promise<void> | null = null;\n private reconcileRetryResolve: (() => void) | null = null;\n /**\n * On-disk fingerprint captured at the last point THIS instance's in-memory\n * set matched disk — after `load()`, `save()`, or a reconcile publish. A peer\n * process that advances the durable index changes its file generation even\n * when byte size and mtime collide, so the freshness check remains safe\n * without an O(file-size) read on the hot path.\n */\n private lastSyncedFingerprint: DiskFingerprint | null = null;\n constructor(\n stateDir: string,\n secureStoreKeyProvider: () => Buffer | null = () => null,\n secureStoreWriteKeyProvider: () => Buffer | null = secureStoreKeyProvider,\n memoryDir: string = path.dirname(stateDir),\n lockOptions: ContentHashIndexLockOptions = {}\n ) {\n this.filePath = path.join(stateDir, \"fact-hashes.txt\");\n this.secureStoreKeyProvider = secureStoreKeyProvider;\n this.secureStoreWriteKeyProvider = secureStoreWriteKeyProvider;\n this.memoryDir = memoryDir;\n this.lockOptions = lockOptions;\n }\n /** Whether a caller with an authoritative corpus must rebuild this legacy index. */\n get requiresFormatMigration(): boolean {\n return this.formatMigrationRequired;\n }\n\n /** Load existing hashes from disk. Safe to call multiple times. */\n async load(): Promise<void> {\n try {\n const raw = await readMaybeEncryptedFile(this.filePath, this.secureStoreKeyProvider(), this.memoryDir);\n const parsed = parseHashIndex(raw);\n this.formatMigrationRequired = !parsed.versioned;\n if (!parsed.versioned) {\n // Hashes from the pre-NFC format are unsafe after normalization changes.\n // Ignore them until an authoritative corpus rebuild publishes v2.\n this.hashes.clear();\n log.warn(`content-hash index: ignored legacy unversioned index at ${this.filePath}`);\n } else {\n for (const hash of parsed.hashes) this.hashes.add(hash);\n }\n log.debug(`content-hash index: loaded ${this.hashes.size} hashes`);\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n log.debug(\"content-hash index: no existing index — starting fresh\");\n }\n // The loaded set now reflects the on-disk file — baseline the fingerprint so\n // a later peer write is detectable (PR #2016 review).\n await this.captureSyncedFingerprint();\n }\n\n /** Cheap `stat` of the durable index file; null when it does not exist yet. */\n private async statIndexFile(): Promise<DiskFingerprint | null> {\n try {\n const s = await stat(this.filePath);\n return {\n mtimeMs: s.mtimeMs,\n size: s.size,\n dev: s.dev,\n ino: s.ino,\n ctimeMs: s.ctimeMs,\n birthtimeMs: s.birthtimeMs,\n };\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return null;\n throw err;\n }\n }\n\n /** Record the current on-disk fingerprint as this instance's synced baseline. */\n private async captureSyncedFingerprint(): Promise<void> {\n try {\n this.lastSyncedFingerprint = await this.statIndexFile();\n } catch (err) {\n // A stat failure other than ENOENT leaves no baseline; the next freshness\n // check reports non-current and the caller confirms against the corpus.\n this.lastSyncedFingerprint = null;\n log.debug(`content-hash index: could not fingerprint ${this.filePath}: ${err}`);\n }\n }\n\n /**\n * True when the durable index file is unchanged since this instance last\n * synced it (load / save / reconcile). False when a peer advanced it, when\n * the file appeared or vanished, or when freshness cannot be established\n * (stat error) — the caller then treats the in-memory snapshot as\n * non-authoritative and confirms a dedup miss against the durable corpus.\n * The stat includes file identity and generation metadata so same-size,\n * same-mtime atomic replacements are detected without reading the file body.\n */\n async isDiskFingerprintCurrent(): Promise<boolean> {\n let current: DiskFingerprint | null;\n try {\n current = await this.statIndexFile();\n } catch {\n return false;\n }\n const last = this.lastSyncedFingerprint;\n if (last === null || current === null) {\n return last === null && current === null;\n }\n return (\n current.mtimeMs === last.mtimeMs &&\n current.size === last.size &&\n current.dev === last.dev &&\n current.ino === last.ino &&\n current.ctimeMs === last.ctimeMs &&\n current.birthtimeMs === last.birthtimeMs\n );\n }\n\n /** Check if content already exists in the index. */\n has(content: string): boolean {\n return this.hashes.has(ContentHashIndex.computeHash(content));\n }\n\n /** Add content hash to the index. */\n add(content: string): void {\n const hash = ContentHashIndex.computeHash(content);\n // A re-add supersedes a pending removal of the same hash (round 8 thread 3).\n this.removed.delete(hash);\n // Record OUR durable delta even when the local snapshot already holds the\n // hash (PR #2016 thread SD-nG): local membership can be STALE — a peer\n // removed this hash on disk while this instance kept it in memory. Skipping\n // `added`/`dirty` on that path let the reconciling save compute\n // (on-disk \\ removed) ∪ added and silently drop the reintroduced hash, so\n // the peer never saw it again. Set semantics keep this idempotent (no\n // duplicate entries) and the `removed.delete` above preserves remove/add\n // ordering.\n this.hashes.add(hash);\n this.added.add(hash);\n this.dirty = true;\n }\n\n get size(): number {\n return this.hashes.size;\n }\n\n /** Clear all loaded hashes so the next save rewrites the index from scratch. */\n clear(): void {\n if (this.hashes.size > 0) {\n this.hashes.clear();\n }\n // The fact-only partition is rebuilt with the shared set on every\n // authoritative corpus rebuild, so it clears here too (issue #2474).\n this.factHashes.clear();\n // A full clear is always paired with a plain overwrite save() (rebuild);\n // pending per-hash add/remove deltas are subsumed by writing the rebuilt set.\n // Cancel any armed deferred-reconcile retry (PR #2016) so it cannot fire in\n // the clear→rebuild→save window and union the pre-clear on-disk rows back.\n this.added.clear();\n this.removed.clear();\n this.cancelReconcileRetry();\n this.dirty = true;\n }\n\n /** Persist index to disk if changed (plain whole-file overwrite). */\n async save(): Promise<void> {\n if (!this.dirty) return;\n await mkdir(path.dirname(this.filePath), { recursive: true });\n // Snapshot the deltas + overwrite body THIS save publishes BEFORE the write\n // yields the event loop. `writeMaybeEncryptedFile` materializes `serialized`\n // eagerly, then the disk await lets a concurrent same-process add()/remove()\n // land a late delta (PR #2016 thread PRRT_kwDORJXyws6SEBri). Clearing the\n // LIVE added/removed sets afterward — as the previous unconditional\n // clear()+`dirty = false` did — would drop that late hash from the index AND\n // leave no retry, so peers never see it until a corpus rebuild. Consume only\n // what we published; late deltas stay pending. Mirrors saveMergingWithDisk.\n const publishedAdded = new Set<string>(this.added);\n const publishedRemoved = new Set<string>(this.removed);\n const serialized = serializeHashIndex(this.hashes);\n await writeMaybeEncryptedFile(this.filePath, serialized, this.secureStoreWriteKeyProvider(), {}, this.memoryDir);\n this.formatMigrationRequired = false;\n // Consume ONLY the deltas this overwrite published; anything that arrived\n // during the awaits above remains pending for the next save.\n for (const h of publishedAdded) this.added.delete(h);\n for (const h of publishedRemoved) this.removed.delete(h);\n // Honest dirty state: true iff late deltas remain unpersisted.\n this.dirty = this.added.size > 0 || this.removed.size > 0;\n // This overwrite is now the on-disk state — re-baseline the freshness\n // fingerprint so our own write is not later mistaken for a peer's (PR #2016).\n await this.captureSyncedFingerprint();\n if (this.dirty) {\n // Late deltas landed mid-save: arm a bounded durable retry so they reach\n // disk even without a further batch save — never a silent in-memory-only\n // hash. The locked reconcile republishes only OUR delta onto the overwrite.\n this.scheduleReconcileRetry();\n } else {\n // Clean overwrite supersedes any pending deferred reconcile work.\n this.cancelReconcileRetry();\n }\n log.debug(`content-hash index: saved ${this.hashes.size} hashes`);\n }\n\n /**\n * Persist the index by RECONCILING with the latest on-disk state under a\n * cross-process lock (issue #1909). Used by the extraction-persist batch save\n * for BOTH append and removal batches, so appends and removals to the same\n * index serialize against each other:\n * final = (on-disk \\ this.removed) ∪ this.added\n * Note it re-applies only OUR local additions (`added`), NOT the loaded\n * snapshot (review round 9 finding 3): seeding from `this.hashes` would\n * resurrect a hash a peer removed on disk while we held a stale snapshot. This\n * preserves a concurrent writer's appended hashes (a blind overwrite would\n * drop them), never resurrects a removed hash, and never loses our additions.\n *\n * Hardening:\n * - Dirty short-circuit (round 7 finding 3): when this instance neither added\n * nor removed anything this run, skip the O(file) read+rewrite entirely.\n * - Cross-process lock (round 7 finding 2): serialize the read→reconcile→write\n * window on a per-file advisory lock. If the lock is NOT acquired (timeout),\n * do NOT publish (round 9 finding 2): keep `dirty` set AND schedule a bounded\n * durable background retry (PR #2016) that keeps re-attempting the locked\n * publish until the deferred additions land — never an unlocked write that\n * could clobber a peer, and never a silent \"batch save complete\" that leaves\n * the addition in this process's memory only.\n */\n async saveMergingWithDisk(): Promise<void> {\n if (!this.dirty) return;\n // The advisory lock file lives beside the index — ensure the dir exists\n // before acquiring it (the index dir may not exist on a first write).\n await mkdir(path.dirname(this.filePath), { recursive: true });\n const publish = async (): Promise<void> => {\n // Snapshot the deltas this publish is responsible for. The read+rewrite\n // below yields the event loop, so a concurrent add()/remove() can land\n // new deltas while we await disk (PR #2016 thread SD7Tj). Consuming the\n // LIVE sets afterward would drop those late deltas AND clear `dirty`,\n // stranding them in no save at all. We consume only what we published;\n // anything that arrived meanwhile stays pending for the next save.\n const publishedAdded = new Set<string>(this.added);\n const publishedRemoved = new Set<string>(this.removed);\n const merged = new Set<string>(publishedAdded);\n try {\n const raw = await readMaybeEncryptedFile(this.filePath, this.secureStoreKeyProvider(), this.memoryDir);\n const parsed = parseHashIndex(raw);\n if (parsed.versioned) {\n for (const hash of parsed.hashes) {\n // Keep prior/concurrent on-disk hashes EXCEPT the ones we removed.\n if (!publishedRemoved.has(hash)) merged.add(hash);\n }\n } else {\n // Do not carry hashes from the pre-NFC format into a v2 write.\n log.warn(`content-hash index: discarded legacy unversioned entries from ${this.filePath}`);\n }\n } catch (err) {\n if (err instanceof SecureStoreLockedError) throw err;\n if (!isErrnoCode(err, \"ENOENT\")) throw err;\n // ENOENT → no on-disk index yet; write our additions as-is.\n }\n await mkdir(path.dirname(this.filePath), { recursive: true });\n await writeMaybeEncryptedFile(\n this.filePath,\n serializeHashIndex(merged),\n this.secureStoreWriteKeyProvider(),\n {},\n this.memoryDir\n );\n this.formatMigrationRequired = false;\n // Consume ONLY the deltas we just published; deltas that arrived during\n // the awaits above remain pending.\n for (const h of publishedAdded) this.added.delete(h);\n for (const h of publishedRemoved) this.removed.delete(h);\n // Fold any still-pending deltas onto the reconciled set so the in-memory\n // view stays consistent with what the next save will publish.\n for (const h of this.added) merged.add(h);\n for (const h of this.removed) merged.delete(h);\n this.hashes = merged;\n // Honest dirty state: true iff late deltas remain to be persisted. A\n // subsequent batch save or the shutdown flush drains them.\n this.dirty = this.added.size > 0 || this.removed.size > 0;\n // The reconciled set is now the on-disk state — re-baseline the freshness\n // fingerprint (captured under the held lock) so our own publish is not\n // later mistaken for a peer's advance (PR #2016 review).\n await this.captureSyncedFingerprint();\n };\n await withHeldFileLock(\n `${this.filePath}.lock`,\n {\n staleMs: CONTENT_HASH_INDEX_LOCK_STALE_MS,\n ...(this.lockOptions.maxWaitMs !== undefined ? { maxWaitMs: this.lockOptions.maxWaitMs } : {}),\n ...(this.lockOptions.pollMs !== undefined ? { pollMs: this.lockOptions.pollMs } : {}),\n },\n async (acquired) => {\n if (!acquired) {\n // Never publish unlocked (round 9 finding 2): keep dirty AND schedule a\n // durable background retry (PR #2016). Relying on an unguaranteed later\n // batch save silently left the addition in this process's memory only;\n // the retry keeps re-attempting the locked publish until the addition\n // lands on disk.\n log.warn(\n `content-hash index: lock not acquired for ${this.filePath}; deferring reconcile save (dirty retained, scheduling durable retry)`\n );\n this.scheduleReconcileRetry();\n return;\n }\n await publish();\n if (this.dirty) {\n // A concurrent add()/remove() landed during publish's disk awaits, so\n // deltas remain unpersisted (PR #2016 thread SD7Tj). Arm a bounded\n // durable retry so they reach disk even if no further batch save comes\n // — never leave a settled barrier over pending work.\n this.scheduleReconcileRetry();\n } else {\n // Published cleanly: any pending deferred retry is now satisfied.\n this.cancelReconcileRetry();\n }\n }\n );\n log.debug(`content-hash index: reconcile-saved ${this.hashes.size} hashes`);\n }\n\n /**\n * Rebuild-and-publish the index from an authoritative source (the durable\n * corpus) under the SAME per-file cross-process lock the reconciling\n * append/removal saves (`saveMergingWithDisk`) use (issue #1909 / PR #2016).\n * The `populate` callback runs WHILE the lock is held and MUST repopulate this\n * index from the corpus (`clear()` then `addByHash(...)` for every corpus\n * hash); the rebuilt set is then published with a plain overwrite that is now\n * serialized against every locked writer.\n *\n * This closes the finding where the previous unlocked clear→scan→save() could\n * overwrite a peer's newer lock-merged or deferred additions: a locked writer\n * that committed BEFORE the rebuild acquired the lock has its memory `.md` on\n * disk and is re-scanned; one that commits AFTER the rebuild releases\n * reconciles its additions on top of the freshly-published set. No union with\n * the raw on-disk file is performed, so the rebuild keeps its\n * garbage-collection property (orphaned hashes for deleted memories drop).\n *\n * Lock-acquisition failure is explicit and non-destructive: `populate` is NOT\n * run and nothing is written (never an unlocked overwrite). Returns true when\n * the rebuild was published under the lock, false when the lock timed out —\n * the caller keeps the index non-authoritative and retries on next use. Uses\n * the same non-reentrant file lock as the reconcile path, so it can never\n * deadlock with the deferred reconcile-retry: a concurrent locked writer (or a\n * fired retry) simply yields `acquired=false` after the bounded wait.\n */\n async rebuildUnderLock(populate: () => Promise<void>): Promise<boolean> {\n // The advisory lock file lives beside the index — ensure the dir exists\n // before acquiring it (the index dir may not exist on a first rebuild).\n await mkdir(path.dirname(this.filePath), { recursive: true });\n let published = false;\n await withHeldFileLock(\n `${this.filePath}.lock`,\n {\n staleMs: CONTENT_HASH_INDEX_LOCK_STALE_MS,\n ...(this.lockOptions.maxWaitMs !== undefined ? { maxWaitMs: this.lockOptions.maxWaitMs } : {}),\n ...(this.lockOptions.pollMs !== undefined ? { pollMs: this.lockOptions.pollMs } : {}),\n },\n async (acquired) => {\n if (!acquired) {\n // Never publish unlocked: a concurrent locked writer holds the lock,\n // so overwriting now could clobber its addition. Leave the index as-is\n // and let the caller retry the authoritative rebuild on next use.\n log.warn(\n `content-hash index: lock not acquired for ${this.filePath}; deferring authoritative rebuild (index left non-authoritative, retried on next use)`\n );\n return;\n }\n await populate();\n // Publish under the held lock. save() takes no lock (no re-entrancy) and\n // is a full overwrite that supersedes any pending add/remove deltas.\n await this.save();\n published = true;\n }\n );\n return published;\n }\n\n /**\n * True while a background durable reconcile-save retry is armed (PR #2016).\n * Test/introspection hook.\n */\n get hasPendingReconcileRetry(): boolean {\n return this.reconcileRetryTimer !== null;\n }\n\n /** True while this index has in-memory changes not yet published to disk. */\n get hasPendingChanges(): boolean {\n return this.dirty;\n }\n\n /**\n * Resolve once any armed background reconcile-save retry chain has settled —\n * either it published the deferred additions, or it exhausted its bounded\n * attempts and fell back to the corpus-rebuild safety net. Resolves\n * immediately when nothing is armed. Lets a caller (or a test) await the\n * eventual durability outcome of a lock-timed-out save.\n */\n async whenReconcileRetrySettled(): Promise<void> {\n await (this.reconcileRetryBarrier ?? Promise.resolve());\n }\n\n /**\n * Drive any deferred lock-timeout reconcile save to completion INLINE at a\n * lifecycle boundary (PR #2016 finding 3). The background retry timer is\n * `unref`'d so it never keeps a long-lived daemon alive — but a short-lived\n * writer (a one-shot CLI) can exit before it fires, leaving a durable fact\n * `.md` whose hash never reached `fact-hashes.txt` for peers that already\n * built their in-memory index. `orchestrator.destroy()` calls this so the\n * addition publishes before the process exits; long-lived hosts only reach it\n * at their own shutdown, so their in-flight retries keep running in the\n * background until then. Bounded by the same attempt ceiling as the background\n * retry; a permanently contended lock falls back to the corpus-rebuild-on-\n * restart safety net (the fact `.md` is already durable). No deadlock: each\n * attempt is the same non-reentrant, bounded-wait file lock.\n */\n async flushReconcileRetry(): Promise<void> {\n if (!this.dirty) return;\n const maxAttempts = this.lockOptions.retryMaxAttempts ?? CONTENT_HASH_INDEX_RETRY_MAX_ATTEMPTS;\n const baseMs = this.lockOptions.retryBaseMs ?? CONTENT_HASH_INDEX_RETRY_BASE_MS;\n for (let attempt = 0; this.dirty && attempt < maxAttempts; attempt += 1) {\n // Cancel the unref'd background timer — we drive the locked publish inline.\n if (this.reconcileRetryTimer) {\n clearTimeout(this.reconcileRetryTimer);\n this.reconcileRetryTimer = null;\n }\n await this.saveMergingWithDisk();\n if (!this.dirty) break;\n if (attempt < maxAttempts - 1) {\n const wait = Math.min(baseMs * 2 ** attempt, CONTENT_HASH_INDEX_RETRY_MAX_DELAY_MS);\n await new Promise<void>((resolve) => setTimeout(resolve, wait));\n }\n }\n // Clear any timer the final saveMergingWithDisk armed and settle the barrier\n // so awaiters unblock — the bounded inline drain has done its best.\n if (this.reconcileRetryTimer) {\n clearTimeout(this.reconcileRetryTimer);\n this.reconcileRetryTimer = null;\n }\n this.reconcileRetryAttempts = 0;\n this.settleReconcileRetry();\n }\n\n /**\n * Schedule ONE bounded, exponentially-backed-off background retry of the\n * deferred reconcile save (PR #2016). Reentrant-safe: an already-armed timer\n * short-circuits, so successive timed-out saves never stack duplicate retries.\n * When attempts are exhausted the chain settles without publishing — the\n * durable fact `.md` is on disk and a process restart rebuilds the index from\n * the corpus, so this degrades to that safety net, never a fatal failure.\n */\n private scheduleReconcileRetry(): void {\n if (this.reconcileRetryTimer) return; // one retry in flight — no duplicate/reentrant retries\n const maxAttempts = this.lockOptions.retryMaxAttempts ?? CONTENT_HASH_INDEX_RETRY_MAX_ATTEMPTS;\n if (this.reconcileRetryAttempts >= maxAttempts) {\n log.warn(\n `content-hash index: exhausted ${maxAttempts} deferred reconcile-save retries for ${this.filePath}; ` +\n `${this.added.size} addition(s) remain dirty in-memory (a process restart rebuilds the index from the durable corpus)`\n );\n this.reconcileRetryAttempts = 0;\n this.settleReconcileRetry();\n return;\n }\n if (!this.reconcileRetryBarrier) {\n this.reconcileRetryBarrier = new Promise<void>((resolve) => {\n this.reconcileRetryResolve = resolve;\n });\n }\n const attempt = this.reconcileRetryAttempts + 1;\n const baseMs = this.lockOptions.retryBaseMs ?? CONTENT_HASH_INDEX_RETRY_BASE_MS;\n const delay = Math.min(baseMs * 2 ** (attempt - 1), CONTENT_HASH_INDEX_RETRY_MAX_DELAY_MS);\n this.reconcileRetryTimer = setTimeout(() => {\n this.reconcileRetryTimer = null;\n this.reconcileRetryAttempts = attempt;\n void this.saveMergingWithDisk()\n .catch((err) => {\n // A publish-time I/O/encryption error (not a lock timeout) is best-effort:\n // log and let the corpus-rebuild safety net cover it rather than loop.\n log.warn(`content-hash index: deferred reconcile-save retry failed for ${this.filePath}: ${err}`);\n })\n .finally(() => {\n // If the attempt neither published (dirty cleared → cancelReconcileRetry)\n // nor re-armed a further retry, the chain has ended — settle the barrier.\n if (this.dirty && !this.reconcileRetryTimer) this.settleReconcileRetry();\n });\n }, delay);\n this.reconcileRetryTimer.unref?.();\n }\n\n /** Cancel any armed reconcile-save retry and settle the barrier (a publish landed). */\n private cancelReconcileRetry(): void {\n if (this.reconcileRetryTimer) {\n clearTimeout(this.reconcileRetryTimer);\n this.reconcileRetryTimer = null;\n }\n this.reconcileRetryAttempts = 0;\n this.settleReconcileRetry();\n }\n\n /** Resolve and clear the retry barrier if one is outstanding. */\n private settleReconcileRetry(): void {\n const resolve = this.reconcileRetryResolve;\n this.reconcileRetryBarrier = null;\n this.reconcileRetryResolve = null;\n resolve?.();\n }\n\n /** Remove a hash from the index (used when archiving/deleting). */\n remove(content: string): void {\n const hash = ContentHashIndex.computeHash(content);\n // Record the removal (round 8 thread 3) even when the hash is not in our\n // in-memory set — a reconciling save must still drop it from the latest\n // on-disk state. A removal supersedes a pending add. Always mark dirty.\n this.added.delete(hash);\n this.removed.add(hash);\n this.hashes.delete(hash);\n this.dirty = true;\n }\n\n /**\n * Remove a pre-computed SHA-256 hash directly from the index without\n * re-hashing. Use this when the caller already holds the stored hash\n * (e.g. `memory.frontmatter.contentHash`) to avoid the double-hash bug\n * where `remove(hash)` would compute `hash(hash)` and never match the\n * entry.\n */\n removeByHash(hash: string): void {\n this.added.delete(hash);\n this.removed.add(hash);\n this.hashes.delete(hash);\n this.dirty = true;\n }\n\n /**\n * Add a pre-computed SHA-256 hash directly to the index without re-hashing.\n * Use this when the caller already holds the stored hash\n * (e.g. `memory.frontmatter.contentHash`) so that the index records the raw\n * content hash rather than re-hashing the citation-annotated body.\n *\n * @internal Only called from `StorageManager.ensureFactHashIndexAuthoritative`.\n * Not part of the public API — prefer `add(content)` for external callers.\n */\n addByHash(hash: string): void {\n // A re-add supersedes a pending removal of the same hash.\n this.removed.delete(hash);\n // Record OUR durable delta even when the local snapshot already holds the\n // hash (PR #2016 thread PRRT_kwDORJXyws6SEHve). Outside a rebuild\n // (StorageManager.addActiveFactContentHash on reactivation) local\n // membership can be STALE: a peer removed this hash on disk while this\n // instance kept it in memory. Skipping added/dirty on that path let the\n // reconciling save compute (on-disk \\ removed) ∪ added and silently drop\n // the reintroduced hash, so the peer never saw it again. Set semantics keep\n // this idempotent (no duplicate entries) and the removed.delete above\n // preserves remove/add ordering. Mirrors add().\n this.hashes.add(hash);\n this.added.add(hash);\n this.dirty = true;\n }\n\n // ── Fact-only partition (issue #2474) ─────────────────────────────────\n // Folded here from StorageManager's parallel `factOnlyHashes` set, which had\n // to be kept in lockstep by hand on every add/remove/rebuild site. The\n // partition lives on the index instance, so every path that mutates the\n // shared set and needs fact-only truth mutates it in the same breath.\n\n /** Register fact content in BOTH the shared index and the fact-only partition. */\n addFact(content: string): void {\n this.addFactByHash(ContentHashIndex.computeHash(content));\n }\n\n /** Register a pre-computed fact hash in both the shared index and the fact-only partition. */\n addFactByHash(hash: string): void {\n this.addByHash(hash);\n this.factHashes.add(hash);\n }\n\n /** Fact-ONLY membership: has this content been registered as a fact? */\n hasFact(content: string): boolean {\n return this.factHashes.has(ContentHashIndex.computeHash(content));\n }\n\n /** Fact-ONLY membership for a pre-computed SHA-256 hash. */\n hasFactByHash(hash: string): boolean {\n return this.factHashes.has(hash);\n }\n\n /**\n * Drop fact-only partition membership WITHOUT touching the shared index.\n * The shared removal stays caller-owned: a shared hash is dropped only when\n * no other active memory holds it, while fact-only membership follows the\n * fact's own lifecycle (supersede/archive/promotion).\n */\n removeFactByHash(hash: string): void {\n this.factHashes.delete(hash);\n }\n\n /**\n * Resolve a pre-computed semantic hash to one deterministic corpus path.\n *\n * This lookup is separate from durable hash membership: `this.hashes` stays\n * one hash per line and `has(content)` keeps its existing raw-content contract.\n * Reconciliation supplies short-lived manifest rows where hash and path coexist.\n */\n static resolvePathByHash(hash: string, entries: Iterable<ContentHashPathEntry>): string | undefined {\n const canonicalHash = hash.toLowerCase();\n if (!/^[a-f0-9]{64}$/.test(canonicalHash)) return undefined;\n let canonicalPath: string | undefined;\n for (const entry of entries) {\n if (entry.contentHash.toLowerCase() !== canonicalHash || entry.path.length === 0) continue;\n if (canonicalPath === undefined || entry.path < canonicalPath) canonicalPath = entry.path;\n }\n return canonicalPath;\n }\n\n /** Normalize content (delegates to content-hash.ts for a single source of truth). */\n static normalizeContent(content: string): string {\n return normalizeContent(content);\n }\n\n /** Compute SHA-256 hash (delegates to content-hash.ts for a single source of truth). */\n static computeHash(content: string): string {\n return computeContentHash(content);\n }\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/compounding/engine.ts","../src/compounding/iso-week.ts","../src/compounding/weekly-evidence.ts"],"sourcesContent":["import { createHash } from \"node:crypto\";\nimport { mkdir, readFile, readdir, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { isoWeekId } from \"./iso-week.js\";\nimport { log } from \"../logger.js\";\nimport { composeSalvagedEnvelope } from \"../salvage-envelope.js\";\nimport { sanitizeMemoryContent } from \"../sanitize.js\";\nimport { StorageManager } from \"../storage.js\";\nimport type { ContinuityIncidentRecord, PluginConfig } from \"../types.js\";\nimport { migrateLegacyFeedbackInbox, resolveFeedbackInboxPath, type SharedFeedbackEntry } from \"../shared-context/manager.js\";\nimport { parseContinuityImprovementLoops } from \"../identity-continuity.js\";\nimport { resolveQmdCapabilities, type QmdConfigProjection, resolveConsolidationCapabilities } from \"../capabilities.js\";\nimport { resolveConversationContextCapabilities } from \"../capabilities.js\";\nimport {\n actionEventsVisibleInStore, capWeeklyPatternDetails,\n buildActionFailurePatterns,\n defaultNamespaceRecallPrefix,\n provenanceVisibleInStoreRecall,\n visibleRubricEntries,\n readFeedbackEntriesForWeekFile,\n readWeeklyActionEvents,\n forgottenCorrectionPatterns, readWeeklyCorrections,\n type FeedbackEntryWithProvenance,\n type WeeklyActionEvent,\n type WeeklyCorrectionEvidence,\n} from \"./weekly-evidence.js\";\n\ntype MistakesFile = {\n version?: number;\n updatedAt: string;\n patterns: string[];\n registry?: MistakeRegistryEntry[];\n};\n\ntype PatternWithProvenance = {\n pattern: string;\n provenance: string[];\n};\n\ntype ActionOutcomeCounts = {\n applied: number;\n skipped: number;\n failed: number;\n};\n\ntype ActionOutcomeSummary = {\n action: string;\n counts: ActionOutcomeCounts;\n total: number;\n weightedScore: number;\n provenance: string[];\n};\n\ntype PromotionCandidate = {\n id: string;\n sourceType: \"action-outcome\" | \"mistake-pattern\" | \"rubric\" | \"causal-pattern\";\n subject: string;\n category: \"principle\" | \"rule\" | \"preference\";\n content: string;\n score: number;\n rationale: string;\n outcome: ActionOutcomeCounts | null;\n provenance: string[];\n agent: string | null;\n workflow: string | null;\n};\n\ntype CompoundingEntrySeverity = \"low\" | \"medium\" | \"high\";\n\ntype EvidenceWindow = {\n start: string | null;\n end: string | null;\n};\n\ntype MistakeRegistryEntry = {\n id: string;\n pattern: string;\n category: \"feedback\" | \"action\" | \"correction\";\n status: \"active\" | \"retired\";\n agent: string | null;\n workflow: string | null;\n tags: string[];\n severity: CompoundingEntrySeverity | null;\n confidence: number | null;\n outcome: string | null;\n provenance: string[];\n firstSeenAt: string;\n lastSeenAt: string;\n recurrenceCount: number;\n lastWeekId: string;\n evidenceWindow: EvidenceWindow;\n mergedFromIds?: string[];\n retiredAt?: string | null;\n};\n\ntype RubricSnapshotEntry = {\n id: string;\n kind: \"agent\" | \"workflow\";\n subject: string;\n observations: string[];\n tags: string[];\n provenance: string[];\n observationEntries?: Array<{\n note: string;\n provenance: string[];\n }>;\n updatedAt: string;\n};\n\ntype RubricSnapshot = {\n updatedAt: string;\n agents: RubricSnapshotEntry[];\n workflows: RubricSnapshotEntry[];\n};\n\ntype WeeklyCompoundingArtifact = {\n version: number;\n generatedAt: string;\n weekId: string;\n feedback: {\n count: number;\n byDecision: Record<\"approved\" | \"approved_with_feedback\" | \"rejected\", number>;\n entries: Array<{\n agent: string;\n workflow: string | null;\n decision: SharedFeedbackEntry[\"decision\"];\n reason: string;\n learning: string | null;\n outcome: string | null;\n severity: CompoundingEntrySeverity | null;\n confidence: number | null;\n tags: string[];\n provenance: string;\n evidenceWindow: EvidenceWindow;\n }>;\n };\n mistakes: {\n count: number;\n patterns: string[];\n registry: MistakeRegistryEntry[];\n };\n rubrics: RubricSnapshot;\n outcomes: ActionOutcomeSummary[];\n promotionCandidates: PromotionCandidate[];\n continuity: { monthId: string; weeklyPath: string | null; monthlyPath: string | null };\n};\n\nexport interface CompoundingPromotionReport {\n enabled: boolean;\n dryRun: boolean;\n weekId: string;\n promoted: Array<{\n id: string;\n candidateId: string;\n category: \"principle\" | \"rule\" | \"preference\";\n content: string;\n confidence: number;\n tags: string[];\n lineage: string[];\n }>;\n skipped: Array<{\n weekId: string;\n candidateId?: string;\n reason: \"disabled\" | \"weekly-artifact-missing\" | \"candidate-not-found\" | \"duplicate-guidance\";\n existingMemoryId?: string;\n }>;\n /**\n * Promotions the #1579 tombstone chokepoint downgraded to pending_review (no\n * active copy). Reported distinctly so callers never treat a blocked write as\n * a successfully promoted active memory (#1645).\n */\n tombstoneBlocked: Array<{\n id: string;\n candidateId: string;\n category: \"principle\" | \"rule\" | \"preference\";\n content: string;\n }>;\n}\n\nconst COMPOUNDING_VERSION = 2;\nconst RETIREMENT_WINDOW_WEEKS = 8;\n\nfunction stableSlug(value: string): string {\n return value\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n .slice(0, 80) || \"item\";\n}\n\nfunction tokenizeRecallQuery(text: string): string[] {\n const seen = new Set<string>();\n const out: string[] = [];\n for (const token of text\n .toLowerCase()\n .replace(/[^a-z0-9\\s]+/g, \" \")\n .split(/\\s+/)\n .map((part) => part.trim())\n .filter((part) => part.length >= 3)) {\n if (seen.has(token)) continue;\n seen.add(token);\n out.push(token);\n }\n return out;\n}\n\nfunction weekIdToIndex(weekId: string): number {\n const match = weekId.match(/^(\\d{4})-W(\\d{2})$/);\n if (!match) return Number.POSITIVE_INFINITY;\n const year = Number(match[1]);\n const week = Number(match[2]);\n if (!Number.isInteger(year) || !Number.isInteger(week) || week < 1 || week > 53) {\n return Number.POSITIVE_INFINITY;\n }\n const jan4 = new Date(Date.UTC(year, 0, 4));\n const jan4Day = jan4.getUTCDay() || 7;\n const isoWeekOneStart = new Date(jan4);\n isoWeekOneStart.setUTCDate(jan4.getUTCDate() - (jan4Day - 1));\n const targetWeekStart = new Date(isoWeekOneStart);\n targetWeekStart.setUTCDate(isoWeekOneStart.getUTCDate() + ((week - 1) * 7));\n return Math.floor(targetWeekStart.getTime() / (7 * 24 * 60 * 60 * 1000));\n}\n\nfunction normalizeConfidence(value: unknown): number | null {\n if (typeof value !== \"number\" || !Number.isFinite(value)) return null;\n const clamped = Math.max(0, Math.min(1, value));\n return Number(clamped.toFixed(3));\n}\n\nfunction normalizeTags(tags: string[] | undefined): string[] {\n if (!Array.isArray(tags)) return [];\n return [...new Set(tags.map((tag) => String(tag).trim()).filter((tag) => tag.length > 0))].sort();\n}\n\nfunction normalizeEvidenceWindow(start?: string, end?: string): EvidenceWindow {\n const safeStart = typeof start === \"string\" && start.trim().length > 0 ? start : null;\n const safeEnd = typeof end === \"string\" && end.trim().length > 0 ? end : null;\n return { start: safeStart, end: safeEnd };\n}\n\nfunction mergeEvidenceWindows(current: EvidenceWindow, next: EvidenceWindow): EvidenceWindow {\n return {\n start: current.start === null ? next.start : next.start === null ? current.start : current.start <= next.start ? current.start : next.start,\n end: current.end === null ? next.end : next.end === null ? current.end : current.end >= next.end ? current.end : next.end,\n };\n}\n\nfunction stableMistakeId(\n category: \"feedback\" | \"action\" | \"correction\",\n pattern: string,\n agent: string | null,\n workflow: string | null,\n): string {\n return [\n category,\n agent ? stableSlug(agent) : \"global\",\n workflow ? stableSlug(workflow) : \"default\",\n stableSlug(pattern).slice(0, 48),\n ].join(\":\");\n}\n\nfunction stableRubricId(kind: \"agent\" | \"workflow\", subject: string): string {\n return `${kind}:${stableSlug(subject)}`;\n}\n\nfunction stablePromotionCandidateId(\n sourceType: PromotionCandidate[\"sourceType\"],\n subject: string,\n content: string,\n): string {\n const digest = createHash(\"sha256\")\n .update(`${sourceType}\\u0000${subject}\\u0000${content}`)\n .digest(\"hex\")\n .slice(0, 12);\n return `${sourceType}:${digest}`;\n}\n\nfunction rubricArtifactFileName(\n entry: Pick<RubricSnapshotEntry, \"kind\" | \"subject\">,\n slugCollisions: ReadonlyMap<string, number>,\n): string {\n const slug = stableSlug(entry.subject);\n if ((slugCollisions.get(slug) ?? 0) <= 1) return `${slug}.md`;\n const suffix = createHash(\"sha256\").update(`${entry.kind}:${entry.subject}`).digest(\"hex\").slice(0, 8);\n return `${slug}-${suffix}.md`;\n}\n\nfunction inferLegacyMistakeScope(pattern: string): { agent: string | null; workflow: string | null } {\n const separatorIndex = pattern.indexOf(\":\");\n if (separatorIndex <= 0) return { agent: null, workflow: null };\n const subject = pattern.slice(0, separatorIndex).trim();\n return {\n agent: subject.length > 0 ? subject : null,\n workflow: null,\n };\n}\n\nfunction inferLegacyMistakeMetadata(pattern: string): {\n category: \"feedback\" | \"action\" | \"correction\";\n agent: string | null;\n workflow: string | null;\n} {\n if (pattern.startsWith(\"memory-action/\")) {\n return {\n category: \"action\",\n agent: null,\n workflow: \"memory-actions\",\n };\n }\n if (pattern.startsWith(\"correction:\")) {\n return {\n category: \"correction\",\n agent: null,\n workflow: \"corrections\",\n };\n }\n const scope = inferLegacyMistakeScope(pattern);\n return {\n category: \"feedback\",\n agent: scope.agent,\n workflow: scope.workflow,\n };\n}\n\nfunction normalizePromotionWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction stripTrailingPromotionPunctuation(value: string): string {\n // Linear trailing-punctuation strip (no `/[,:;]+$/` — CodeQL flags that as a\n // polynomial-backtracking ReDoS on long runs of ',;:'). Walk back once, O(n).\n let end = value.length;\n while (end > 0) {\n const ch = value[end - 1];\n if (ch === \",\" || ch === \":\" || ch === \";\") end--;\n else break;\n }\n return value.slice(0, end).trim();\n}\n\nfunction extractExplicitIfThenRule(value: string): string | null {\n const normalized = normalizePromotionWhitespace(value);\n const match = normalized.match(/^if\\b([\\s\\S]+?)\\bthen\\b([\\s\\S]+?)(?:[.!?])?$/i);\n if (!match) return null;\n const condition = stripTrailingPromotionPunctuation(normalizePromotionWhitespace(match[1] ?? \"\"));\n const outcome = stripTrailingPromotionPunctuation(normalizePromotionWhitespace(match[2] ?? \"\"));\n if (condition.length === 0 || outcome.length === 0) return null;\n return `IF ${condition} THEN ${outcome}.`;\n}\n\nfunction normalizePromotedGuidanceContent(value: string): string {\n const explicitRule = extractExplicitIfThenRule(value);\n if (explicitRule) return explicitRule;\n const normalized = normalizePromotionWhitespace(value);\n if (normalized.length === 0) return normalized;\n return /[.!?]$/.test(normalized) ? normalized : `${normalized}.`;\n}\n\nfunction canonicalPromotionContentKey(value: string): string {\n return normalizePromotedGuidanceContent(value).toLowerCase();\n}\n\nfunction lessonContentFromPattern(pattern: string, agent: string | null): string {\n if (!agent) return normalizePromotionWhitespace(pattern);\n const prefix = `${agent}:`;\n if (!pattern.startsWith(prefix)) return normalizePromotionWhitespace(pattern);\n const withoutPrefix = pattern.slice(prefix.length).trim();\n return withoutPrefix.length > 0 ? normalizePromotionWhitespace(withoutPrefix) : normalizePromotionWhitespace(pattern);\n}\n\nfunction promotionCategoryForContent(content: string): \"principle\" | \"rule\" {\n return extractExplicitIfThenRule(content) ? \"rule\" : \"principle\";\n}\n\nfunction clampPromotionScore(value: number): number {\n if (!Number.isFinite(value)) return 0.65;\n return Number(Math.max(0.65, Math.min(0.98, value)).toFixed(3));\n}\n\nexport type TierMigrationCycleTrigger = \"extraction\" | \"maintenance\";\nexport interface TierMigrationCycleBudget {\n limit: number;\n scanLimit: number;\n minIntervalMs: number;\n}\n\nexport function defaultTierMigrationCycleBudget(\n config: QmdConfigProjection,\n trigger: TierMigrationCycleTrigger,\n): TierMigrationCycleBudget {\n if (trigger === \"extraction\") {\n const limit = 12;\n return {\n limit,\n scanLimit: limit * 4,\n minIntervalMs: 60_000,\n };\n }\n const limit = resolveQmdCapabilities(config).qmdTierAutoBackfill ? 200 : 50;\n return {\n limit,\n scanLimit: limit * 4,\n minIntervalMs: resolveQmdCapabilities(config).qmdTierAutoBackfill ? 120_000 : 300_000,\n };\n}\n\nfunction isoMonthId(d: Date): string {\n return `${d.getUTCFullYear()}-${String(d.getUTCMonth() + 1).padStart(2, \"0\")}`;\n}\n\nfunction monthIdFromIsoWeek(weekId: string): string {\n const match = weekId.match(/^(\\d{4})-W(\\d{2})$/);\n if (!match) return isoMonthId(new Date());\n const year = Number(match[1]);\n const week = Number(match[2]);\n const jan4 = new Date(Date.UTC(year, 0, 4));\n const jan4Day = jan4.getUTCDay() || 7;\n const isoWeekOneMonday = new Date(jan4);\n isoWeekOneMonday.setUTCDate(jan4.getUTCDate() - (jan4Day - 1));\n const monday = new Date(isoWeekOneMonday);\n monday.setUTCDate(isoWeekOneMonday.getUTCDate() + (week - 1) * 7);\n return isoMonthId(monday);\n}\n\nfunction cadenceStaleWindowMs(cadence: \"daily\" | \"weekly\" | \"monthly\" | \"quarterly\"): number {\n switch (cadence) {\n case \"daily\":\n return 2 * 24 * 60 * 60 * 1000;\n case \"weekly\":\n return 10 * 24 * 60 * 60 * 1000;\n case \"monthly\":\n return 45 * 24 * 60 * 60 * 1000;\n case \"quarterly\":\n return 120 * 24 * 60 * 60 * 1000;\n default:\n return 45 * 24 * 60 * 60 * 1000;\n }\n}\n\nexport class CompoundingEngine {\n private readonly weeklyDir: string;\n private readonly rubricsDir: string;\n private readonly rubricsIndexPath: string;\n private readonly rubricsAgentsDir: string;\n private readonly rubricsWorkflowsDir: string;\n private readonly rubricsPath: string;\n private readonly mistakesPath: string;\n private readonly feedbackInboxPath: string;\n private readonly identityAuditWeeklyDir: string;\n private readonly identityAuditMonthlyDir: string;\n\n constructor(\n private readonly config: PluginConfig,\n private readonly storage: StorageManager = new StorageManager(config.memoryDir),\n ) {\n this.weeklyDir = path.join(config.memoryDir, \"compounding\", \"weekly\");\n this.rubricsDir = path.join(config.memoryDir, \"compounding\", \"rubrics\");\n this.rubricsIndexPath = path.join(this.rubricsDir, \"index.json\");\n this.rubricsAgentsDir = path.join(this.rubricsDir, \"agents\");\n this.rubricsWorkflowsDir = path.join(this.rubricsDir, \"workflows\");\n this.rubricsPath = path.join(config.memoryDir, \"compounding\", \"rubrics.md\");\n this.mistakesPath = path.join(config.memoryDir, \"compounding\", \"mistakes.json\");\n this.feedbackInboxPath = resolveFeedbackInboxPath(config);\n this.identityAuditWeeklyDir = path.join(config.memoryDir, \"identity\", \"audits\", \"weekly\");\n this.identityAuditMonthlyDir = path.join(config.memoryDir, \"identity\", \"audits\", \"monthly\");\n }\n\n async ensureDirs(): Promise<void> {\n await mkdir(this.weeklyDir, { recursive: true });\n await mkdir(path.dirname(this.mistakesPath), { recursive: true });\n await mkdir(path.dirname(this.rubricsPath), { recursive: true });\n await mkdir(this.rubricsDir, { recursive: true });\n await mkdir(this.rubricsAgentsDir, { recursive: true });\n await mkdir(this.rubricsWorkflowsDir, { recursive: true });\n }\n\n async synthesizeWeekly(opts?: {\n weekId?: string;\n }): Promise<{\n weekId: string;\n reportPath: string;\n reportJsonPath: string;\n mistakesCount: number;\n rubricsPath: string;\n rubricsIndexPath: string;\n promotionCandidateCount: number;\n }> {\n await this.ensureDirs();\n const weekId = opts?.weekId ?? isoWeekId(new Date());\n\n try {\n await migrateLegacyFeedbackInbox(this.config);\n } catch (error) {\n log.warn(`[compounding] legacy feedback inbox migration failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n }\n const entries = await readFeedbackEntriesForWeekFile(this.feedbackInboxPath, weekId);\n const actionEvents = await readWeeklyActionEvents({\n storage: this.storage,\n memoryDir: this.config.memoryDir,\n weekId,\n });\n const defaultPrefix = await defaultNamespaceRecallPrefix(this.config);\n const corrections = await readWeeklyCorrections({\n storage: this.storage,\n memoryDir: this.config.memoryDir,\n weekId, defaultNamespacePrefix: defaultPrefix,\n });\n const actionPatterns = buildActionFailurePatterns(actionEvents);\n const outcomeSummary = this.buildActionOutcomeSummary(actionEvents);\n const storeOutcomeSummary = this.buildActionOutcomeSummary(actionEventsVisibleInStore(actionEvents, defaultPrefix));\n const previousMistakes = await this.readMistakes();\n const priorRegistry = previousMistakes?.registry ?? [];\n const forgottenPatterns = await forgottenCorrectionPatterns(this.storage, this.config.memoryDir, priorRegistry, defaultPrefix);\n const mistakes = this.buildMistakes(entries, actionPatterns, corrections, weekId, priorRegistry, defaultPrefix, forgottenPatterns);\n const rubrics = this.buildRubricSnapshot(entries, storeOutcomeSummary, corrections);\n let promotionCandidates = resolveConsolidationCapabilities(this.config).compoundingSemantic\n ? this.derivePromotionCandidates(storeOutcomeSummary, mistakes.registry, rubrics, defaultPrefix)\n : [];\n if (resolveConversationContextCapabilities(this.config).cmcConsolidation) {\n try {\n const { deriveCausalPromotionCandidates, materializeAfterCausalConsolidation } = await import(\"../causal-consolidation.js\");\n const causalCandidates = await deriveCausalPromotionCandidates({\n memoryDir: this.config.memoryDir,\n causalTrajectoryStoreDir: this.config.causalTrajectoryStoreDir,\n gatewayConfig: this.config.gatewayConfig,\n gatewayAgentId: this.config.modelSource === \"gateway\" ? (this.config.gatewayAgentId || undefined) : undefined,\n modelChain: this.config.modelSource === \"gateway\" ? this.config.taskModelChain : undefined,\n workspaceDir: this.config.workspaceDir,\n pluginConfig: this.config,\n config: {\n minRecurrence: this.config.cmcConsolidationMinRecurrence,\n minSessions: this.config.cmcConsolidationMinSessions,\n successThreshold: this.config.cmcConsolidationSuccessThreshold,\n },\n });\n if (causalCandidates.length > 0) {\n promotionCandidates = [...promotionCandidates, ...causalCandidates];\n }\n // #378: fire the Codex materialize post-hook so\n // `codexMaterializeOnConsolidation` actually has a runtime effect\n // when the causal consolidation path runs. The helper silently no-ops\n // when the feature flag or the per-trigger toggle is off, when the\n // sentinel is missing, or when nothing has changed since the previous\n // run. Wrapped in its own try/catch so a failed materialize never\n // aborts weekly synthesis.\n try {\n await materializeAfterCausalConsolidation({\n config: this.config,\n memoryDir: this.config.memoryDir,\n });\n } catch (materializeError) {\n log.warn(\n `[cmc] Codex materialize post-hook failed (non-fatal): ${\n materializeError instanceof Error ? materializeError.message : String(materializeError)\n }`,\n );\n }\n } catch (error) {\n log.warn(`[cmc] causal consolidation in synthesizeWeekly failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n // PEDC: Run calibration consolidation during weekly synthesis\n if (resolveConsolidationCapabilities(this.config).calibration) {\n try {\n const { calibrationConsolidationInput, runCalibrationConsolidation } = await import(\"../calibration.js\");\n const calRules = await runCalibrationConsolidation(calibrationConsolidationInput(this.config));\n log.debug(`[calibration] weekly synthesis produced ${calRules.length} calibration rule(s)`);\n } catch (error) {\n log.warn(`[calibration] weekly consolidation failed (non-fatal): ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n const continuity = resolveConsolidationCapabilities(this.config).continuityAudit\n ? await this.readContinuityAuditReferences(weekId)\n : { monthId: monthIdFromIsoWeek(weekId), weeklyPath: null, monthlyPath: null };\n\n // Write weekly report (always, even if empty: \"day-one outcomes\").\n const reportPath = path.join(this.weeklyDir, `${weekId}.md`);\n const md = this.formatWeeklyReport(weekId, entries, mistakes.patterns, mistakes.details, continuity, outcomeSummary, promotionCandidates);\n await writeFile(reportPath, md, \"utf-8\");\n\n const reportJsonPath = path.join(this.weeklyDir, `${weekId}.json`);\n const weeklyArtifact: WeeklyCompoundingArtifact = {\n version: COMPOUNDING_VERSION,\n generatedAt: mistakes.updatedAt,\n weekId,\n feedback: {\n count: entries.length,\n byDecision: {\n approved: entries.filter((wrapped) => wrapped.entry.decision === \"approved\").length,\n approved_with_feedback: entries.filter((wrapped) => wrapped.entry.decision === \"approved_with_feedback\").length,\n rejected: entries.filter((wrapped) => wrapped.entry.decision === \"rejected\").length,\n },\n entries: entries.map((wrapped) => ({\n agent: wrapped.entry.agent,\n workflow: wrapped.entry.workflow ?? null,\n decision: wrapped.entry.decision,\n reason: wrapped.entry.reason,\n learning: wrapped.entry.learning?.trim() || null,\n outcome: wrapped.entry.outcome?.trim() || null,\n severity: wrapped.entry.severity ?? null,\n confidence: normalizeConfidence(wrapped.entry.confidence),\n tags: normalizeTags(wrapped.entry.tags),\n provenance: `${path.basename(wrapped.sourcePath)}:L${wrapped.sourceLine}#${wrapped.entryId}`,\n evidenceWindow: normalizeEvidenceWindow(wrapped.entry.evidenceWindowStart, wrapped.entry.evidenceWindowEnd),\n })),\n },\n mistakes: {\n count: mistakes.patterns.length,\n patterns: mistakes.patterns,\n registry: mistakes.registry,\n },\n rubrics,\n outcomes: outcomeSummary,\n promotionCandidates,\n continuity,\n };\n await writeFile(reportJsonPath, JSON.stringify(weeklyArtifact, null, 2) + \"\\n\", \"utf-8\");\n\n // Write stable rubric artifact.\n const rubricsMarkdown = this.formatRubrics(storeOutcomeSummary, rubrics);\n await writeFile(this.rubricsPath, rubricsMarkdown, \"utf-8\");\n await writeFile(this.rubricsIndexPath, JSON.stringify(rubrics, null, 2) + \"\\n\", \"utf-8\");\n await this.syncRubricArtifacts(rubrics);\n\n // Update mistakes.json (always).\n await writeFile(\n this.mistakesPath,\n JSON.stringify({\n version: COMPOUNDING_VERSION,\n updatedAt: mistakes.updatedAt,\n patterns: mistakes.patterns,\n registry: mistakes.registry,\n }, null, 2) + \"\\n\",\n \"utf-8\",\n );\n\n log.info(\n `compounding: wrote weekly=${reportPath} weeklyJson=${reportJsonPath} rubrics=${this.rubricsPath} rubricsIndex=${this.rubricsIndexPath} mistakes=${this.mistakesPath}`,\n );\n return {\n weekId,\n reportPath,\n reportJsonPath,\n rubricsPath: this.rubricsPath,\n rubricsIndexPath: this.rubricsIndexPath,\n mistakesCount: mistakes.patterns.length,\n promotionCandidateCount: promotionCandidates.length,\n };\n }\n\n async promoteCandidate(opts: {\n weekId: string;\n candidateId: string;\n dryRun?: boolean;\n storage?: StorageManager;\n }): Promise<CompoundingPromotionReport> {\n const report: CompoundingPromotionReport = {\n enabled: resolveConsolidationCapabilities(this.config).compounding === true && resolveConsolidationCapabilities(this.config).compoundingSemantic === true,\n dryRun: opts.dryRun === true,\n weekId: opts.weekId,\n promoted: [],\n skipped: [],\n tombstoneBlocked: [],\n };\n if (!report.enabled) {\n report.skipped.push({ weekId: opts.weekId, candidateId: opts.candidateId, reason: \"disabled\" });\n return report;\n }\n\n const artifact = await this.readWeeklyArtifact(opts.weekId);\n if (!artifact) {\n report.skipped.push({ weekId: opts.weekId, candidateId: opts.candidateId, reason: \"weekly-artifact-missing\" });\n return report;\n }\n\n const candidate = artifact.promotionCandidates.find((entry) => entry.id === opts.candidateId);\n if (!candidate) {\n report.skipped.push({ weekId: opts.weekId, candidateId: opts.candidateId, reason: \"candidate-not-found\" });\n return report;\n }\n\n const content = normalizePromotedGuidanceContent(candidate.content);\n const persistedContent = sanitizeMemoryContent(content).text;\n const storage = opts.storage ?? new StorageManager(this.config.memoryDir);\n const existing = (await storage.readAllMemories()).find((memory) =>\n memory.frontmatter.category === candidate.category &&\n memory.frontmatter.status !== \"archived\" &&\n memory.frontmatter.status !== \"forgotten\" &&\n canonicalPromotionContentKey(memory.content) === canonicalPromotionContentKey(persistedContent)\n );\n if (existing) {\n report.skipped.push({\n weekId: opts.weekId,\n candidateId: opts.candidateId,\n reason: \"duplicate-guidance\",\n existingMemoryId: existing.frontmatter.id,\n });\n return report;\n }\n\n const tags = [\n \"compounding\",\n \"compounding-promotion\",\n `compounding-source-${candidate.sourceType}`,\n ...(candidate.agent ? [`agent:${stableSlug(candidate.agent)}`] : []),\n ...(candidate.workflow ? [`workflow:${stableSlug(candidate.workflow)}`] : []),\n ];\n const uniqueTags = [...new Set(tags)];\n const lineage = [`compounding:${opts.weekId}:${opts.candidateId}`];\n const confidence = clampPromotionScore(candidate.score);\n\n if (opts.dryRun === true) {\n report.promoted.push({\n id: `dry-run:${opts.weekId}:${opts.candidateId}`,\n candidateId: opts.candidateId,\n category: candidate.category,\n content: persistedContent,\n confidence,\n tags: uniqueTags,\n lineage,\n });\n return report;\n }\n\n // Sealed-envelope write (issue #1989 PR4): synthesized machine data.\n const promotionInput = { content: persistedContent, category: candidate.category, confidence, tags: uniqueTags };\n const { id, tombstoneBlocked } = await storage.writeSealedMemory(\n composeSalvagedEnvelope(\"compounding-promotion\", promotionInput, { source: \"compounding-promotion\" }),\n { lineage, memoryKind: \"note\" },\n );\n // #1645: a tombstone-blocked promotion lands pending_review (no active\n // copy) — divert it to the tombstoneBlocked list so the report never\n // claims a blocked write as a successfully promoted active memory.\n if (tombstoneBlocked) {\n report.tombstoneBlocked.push({\n id,\n candidateId: opts.candidateId,\n category: candidate.category,\n content: persistedContent,\n });\n return report;\n }\n report.promoted.push({\n id,\n candidateId: opts.candidateId,\n category: candidate.category,\n content: persistedContent,\n confidence,\n tags: uniqueTags,\n lineage,\n });\n return report;\n }\n\n async synthesizeContinuityAudit(opts?: {\n period?: \"weekly\" | \"monthly\";\n key?: string;\n }): Promise<{ period: \"weekly\" | \"monthly\"; key: string; reportPath: string }> {\n const period = opts?.period === \"monthly\" ? \"monthly\" : \"weekly\";\n const key = opts?.key?.trim() || (period === \"weekly\" ? isoWeekId(new Date()) : isoMonthId(new Date()));\n const nowIso = new Date().toISOString();\n const [identityAnchor, improvementLoopsRaw, openIncidents, closedIncidents, mistakes] = await Promise.all([\n this.readOptionalIdentityAnchorForAudit(),\n this.readOptionalImprovementLoopsForAudit(),\n this.readContinuityIncidentsForAudit(200, \"open\"),\n this.readContinuityIncidentsForAudit(200, \"closed\"),\n this.readMistakes(),\n ]);\n const anchorPresent = (identityAnchor ?? \"\").trim().length > 0;\n const improvementLoops = improvementLoopsRaw ? parseContinuityImprovementLoops(improvementLoopsRaw) : [];\n const activeLoops = improvementLoops.filter((loop) => loop.status === \"active\");\n const staleActiveLoops = activeLoops.filter((loop) => {\n const reviewedAt = Date.parse(loop.lastReviewed);\n if (!Number.isFinite(reviewedAt)) return true;\n return Date.now() - reviewedAt > cadenceStaleWindowMs(loop.cadence);\n });\n const hardeningCandidates: string[] = [];\n if (!anchorPresent) {\n hardeningCandidates.push(\"Create/update identity anchor baseline and verify recovery injection path.\");\n }\n if (openIncidents.length > 0) {\n hardeningCandidates.push(\n `Close or downgrade ${openIncidents.length} open continuity incident${openIncidents.length === 1 ? \"\" : \"s\"}.`,\n );\n }\n if (improvementLoops.length === 0) {\n hardeningCandidates.push(\"Initialize continuity improvement-loops register with cadence and kill conditions.\");\n } else if (staleActiveLoops.length > 0) {\n hardeningCandidates.push(\n `Review stale active continuity loop${staleActiveLoops.length === 1 ? \"\" : \"s\"}: ${staleActiveLoops\n .slice(0, 3)\n .map((loop) => loop.id)\n .join(\", \")}.`,\n );\n }\n if ((mistakes?.patterns.length ?? 0) > 0) {\n hardeningCandidates.push(\"Review latest compounding mistakes and convert one pattern into preventive continuity rule.\");\n }\n const nextAction = hardeningCandidates[0] ?? \"No critical drift detected; keep weekly/monthly continuity audit cadence.\";\n\n const lines: string[] = [\n `# Continuity Audit — ${period} ${key}`,\n \"\",\n `Generated: ${nowIso}`,\n `Scope: ${period}`,\n \"\",\n \"## Signal Summary\",\n `- Identity anchor present: ${anchorPresent ? \"yes\" : \"no\"}`,\n `- Improvement loops tracked: ${improvementLoops.length}`,\n `- Active improvement loops: ${activeLoops.length}`,\n `- Stale active loops: ${staleActiveLoops.length}`,\n `- Open incidents: ${openIncidents.length}`,\n `- Closed incidents: ${closedIncidents.length}`,\n `- Compounding mistake patterns: ${mistakes?.patterns.length ?? 0}`,\n \"\",\n \"## Drift Checks\",\n `- Identity anchor drift: ${anchorPresent ? \"pass\" : \"needs attention\"}`,\n `- Incident backlog: ${openIncidents.length === 0 ? \"pass\" : \"needs attention\"}`,\n `- Improvement-loop coverage: ${improvementLoops.length > 0 ? \"pass\" : \"needs attention\"}`,\n `- Improvement-loop freshness: ${staleActiveLoops.length === 0 ? \"pass\" : \"needs attention\"}`,\n \"\",\n \"## Stale Rule Detection\",\n `- Open incidents older than closure window: ${openIncidents.length > 0 ? \"possible\" : \"none detected\"}`,\n `- Stale active continuity loops: ${staleActiveLoops.length > 0 ? staleActiveLoops.map((l) => l.id).join(\", \") : \"none detected\"}`,\n `- Preventive rule coverage on closed incidents: ${\n closedIncidents.some((i) => (i.preventiveRule ?? \"\").trim().length > 0) ? \"present\" : \"not detected\"\n }`,\n \"\",\n \"## Next Hardening Action\",\n `- ${nextAction}`,\n \"\",\n \"## Open Incident IDs\",\n ...(openIncidents.length > 0 ? openIncidents.slice(0, 20).map((i) => `- ${i.id}`) : [\"- (none)\"]),\n \"\",\n ];\n\n const reportPath = await this.storage.writeIdentityAudit(period, key, lines.join(\"\\n\"));\n return { period, key, reportPath };\n }\n\n async readMistakes(): Promise<MistakesFile | null> {\n try {\n const raw = await readFile(this.mistakesPath, \"utf-8\");\n const parsed = JSON.parse(raw) as MistakesFile;\n if (!parsed || !Array.isArray(parsed.patterns)) return null;\n if (!Array.isArray(parsed.registry)) {\n const updatedAt = typeof parsed.updatedAt === \"string\" && parsed.updatedAt.length > 0\n ? parsed.updatedAt\n : new Date(0).toISOString();\n parsed.registry = parsed.patterns.map((pattern) => {\n const metadata = inferLegacyMistakeMetadata(pattern);\n return {\n id: stableMistakeId(metadata.category, pattern, metadata.agent, metadata.workflow),\n pattern,\n category: metadata.category,\n status: \"active\",\n agent: metadata.agent,\n workflow: metadata.workflow,\n tags: [],\n severity: null,\n confidence: null,\n outcome: null,\n provenance: [],\n firstSeenAt: updatedAt,\n lastSeenAt: updatedAt,\n recurrenceCount: 1,\n lastWeekId: isoWeekId(new Date(updatedAt)),\n evidenceWindow: { start: null, end: null },\n };\n });\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n async readRubrics(): Promise<RubricSnapshot | null> {\n try {\n const raw = await readFile(this.rubricsIndexPath, \"utf-8\");\n const parsed = JSON.parse(raw) as RubricSnapshot;\n if (!parsed || !Array.isArray(parsed.agents) || !Array.isArray(parsed.workflows)) return null;\n parsed.agents = parsed.agents.map((entry) => this.normalizeRubricEntry(entry));\n parsed.workflows = parsed.workflows.map((entry) => this.normalizeRubricEntry(entry));\n return parsed;\n } catch {\n return null;\n }\n }\n\n async readWeeklyArtifact(weekId: string): Promise<WeeklyCompoundingArtifact | null> {\n try {\n const raw = await readFile(path.join(this.weeklyDir, `${weekId}.json`), \"utf-8\");\n const parsed = JSON.parse(raw) as WeeklyCompoundingArtifact;\n if (\n !parsed ||\n parsed.weekId !== weekId ||\n !Array.isArray(parsed.promotionCandidates)\n ) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n }\n\n async buildRecallSection(\n query: string,\n opts?: { maxPatterns?: number; maxRubrics?: number },\n ): Promise<string | null> {\n const [mistakes, rubrics] = await Promise.all([\n this.readMistakes(),\n this.readRubrics(),\n ]);\n const maxPatterns = Math.max(0, Math.floor(opts?.maxPatterns ?? 40));\n const maxRubrics = Math.max(0, Math.floor(opts?.maxRubrics ?? 4));\n const queryTokens = tokenizeRecallQuery(query);\n const defaultPrefix = await defaultNamespaceRecallPrefix(this.config);\n\n const activePatterns = (mistakes?.registry ?? [])\n .filter((entry) => entry.status === \"active\" && provenanceVisibleInStoreRecall(entry.provenance, defaultPrefix))\n .sort((a, b) =>\n b.recurrenceCount - a.recurrenceCount ||\n b.lastSeenAt.localeCompare(a.lastSeenAt) ||\n a.pattern.localeCompare(b.pattern),\n );\n const topPatterns = activePatterns.slice(0, maxPatterns);\n\n const allRubrics = visibleRubricEntries(\n [...(rubrics?.workflows ?? []), ...(rubrics?.agents ?? [])],\n (entry) => this.getRubricObservationEntries(entry),\n defaultPrefix,\n );\n const scoredRubrics = allRubrics\n .map((entry) => ({\n entry,\n score: this.scoreRubricForQuery(entry, queryTokens),\n }))\n .sort((a, b) =>\n b.score - a.score ||\n b.entry.observations.length - a.entry.observations.length ||\n a.entry.subject.localeCompare(b.entry.subject),\n );\n const topRubrics = scoredRubrics\n .filter((item) => item.score > 0 || queryTokens.length === 0)\n .slice(0, maxRubrics)\n .map((item) => item.entry);\n\n if (topPatterns.length === 0 && topRubrics.length === 0) return null;\n\n const lines: string[] = [\n \"## Institutional Learning (Compounded)\",\n \"\",\n ];\n\n if (topPatterns.length > 0) {\n lines.push(\"Avoid repeating these patterns:\");\n for (const entry of topPatterns) {\n const scope = entry.workflow ?? entry.agent ?? null;\n const metadata = [`recurrence=${entry.recurrenceCount}`];\n if (scope) metadata.push(`scope=${scope}`);\n lines.push(`- ${entry.pattern} _(${metadata.join(\", \")})_`);\n }\n lines.push(\"\");\n }\n\n if (topRubrics.length > 0) {\n lines.push(\"Active rubrics:\");\n for (const rubric of topRubrics) {\n const notes = rubric.observations.slice(0, 2).join(\"; \");\n lines.push(`- ${rubric.kind} ${rubric.subject}: ${notes}`);\n }\n }\n\n return lines.join(\"\\n\");\n }\n\n tierMigrationCycleBudget(trigger: TierMigrationCycleTrigger): TierMigrationCycleBudget {\n return defaultTierMigrationCycleBudget(this.config, trigger);\n }\n\n private buildActionOutcomeSummary(events: WeeklyActionEvent[]): ActionOutcomeSummary[] {\n const byAction = new Map<string, { counts: ActionOutcomeCounts; provenance: Set<string> }>();\n for (const event of events) {\n const key = event.action;\n const acc = byAction.get(key) ?? {\n counts: { applied: 0, skipped: 0, failed: 0 },\n provenance: new Set<string>(),\n };\n if (event.outcome === \"applied\") acc.counts.applied += 1;\n else if (event.outcome === \"skipped\") acc.counts.skipped += 1;\n else acc.counts.failed += 1;\n acc.provenance.add(`${event.ledgerLabel}:L${event.line}`);\n byAction.set(key, acc);\n }\n\n const out: ActionOutcomeSummary[] = [];\n for (const [action, data] of byAction.entries()) {\n const total = data.counts.applied + data.counts.skipped + data.counts.failed;\n if (total <= 0) continue;\n // Conservative weighting: reward applied, penalize skipped/failed.\n const weightedScore = Number((((data.counts.applied * 1) - (data.counts.skipped * 0.5) - (data.counts.failed * 1.5)) / total).toFixed(3));\n out.push({\n action,\n counts: data.counts,\n total,\n weightedScore,\n provenance: [...data.provenance].sort().slice(0, 8),\n });\n }\n out.sort((a, b) => b.total - a.total || b.weightedScore - a.weightedScore || a.action.localeCompare(b.action));\n return out;\n }\n\n private derivePromotionCandidates(\n summary: ActionOutcomeSummary[],\n mistakes: MistakeRegistryEntry[],\n rubrics: RubricSnapshot,\n defaultNamespacePrefix: string | null = null,\n ): PromotionCandidate[] {\n const deduped = new Map<string, PromotionCandidate>();\n const upsert = (candidate: PromotionCandidate) => {\n const key = `${candidate.category}:${canonicalPromotionContentKey(candidate.content)}`;\n const existing = deduped.get(key);\n if (!existing) {\n deduped.set(key, candidate);\n return;\n }\n const mergedProvenance = [...new Set([...existing.provenance, ...candidate.provenance])];\n if (candidate.score > existing.score) {\n deduped.set(key, {\n ...candidate,\n provenance: mergedProvenance,\n });\n return;\n }\n existing.provenance = mergedProvenance;\n };\n\n for (const item of summary) {\n if (item.total < 3) continue;\n if (item.weightedScore < 0.3) continue;\n const content = normalizePromotedGuidanceContent(\n `Prefer ${item.action} when the same workflow recurs; this week's outcomes were applied=${item.counts.applied}, skipped=${item.counts.skipped}, failed=${item.counts.failed}.`,\n );\n upsert({\n id: stablePromotionCandidateId(\"action-outcome\", item.action, content),\n sourceType: \"action-outcome\",\n subject: item.action,\n category: promotionCategoryForContent(content),\n content,\n score: item.weightedScore,\n rationale: \"High applied ratio with low failure/skips in weekly outcome telemetry.\",\n outcome: item.counts,\n provenance: item.provenance,\n agent: null,\n workflow: \"memory-actions\",\n });\n }\n\n for (const entry of mistakes) {\n if (entry.status !== \"active\") continue;\n if (!provenanceVisibleInStoreRecall(entry.provenance, defaultNamespacePrefix)) continue;\n if (entry.recurrenceCount < 2) continue;\n const content = normalizePromotedGuidanceContent(lessonContentFromPattern(entry.pattern, entry.agent));\n if (content.length === 0) continue;\n const confidence = entry.confidence ?? 0.75;\n const score = Number(Math.min(0.97, 0.45 + Math.min(entry.recurrenceCount, 6) * 0.08 + confidence * 0.15).toFixed(3));\n upsert({\n id: stablePromotionCandidateId(\"mistake-pattern\", entry.id, content),\n sourceType: \"mistake-pattern\",\n subject: entry.pattern,\n category: promotionCategoryForContent(content),\n content,\n score,\n rationale: `Recurring lesson still active after ${entry.recurrenceCount} confirmations in the mistake registry.`,\n outcome: null,\n provenance: entry.provenance.length > 0 ? entry.provenance : [`mistakes.json#${entry.id}`],\n agent: entry.agent,\n workflow: entry.workflow,\n });\n }\n\n for (const rubric of [...rubrics.workflows, ...rubrics.agents]) {\n for (const observation of this.getRubricObservationEntries(rubric)) {\n if (this.isSyntheticOutcomeRubricObservation(observation.note)) continue;\n if (!provenanceVisibleInStoreRecall(observation.provenance, defaultNamespacePrefix)) continue;\n const evidenceCount = observation.provenance.length;\n if (evidenceCount < 2) continue;\n const content = normalizePromotedGuidanceContent(observation.note);\n if (content.length === 0) continue;\n const score = Number(Math.min(0.95, 0.5 + Math.min(evidenceCount, 5) * 0.08).toFixed(3));\n upsert({\n id: stablePromotionCandidateId(\"rubric\", `${rubric.id}:${observation.note}`, content),\n sourceType: \"rubric\",\n subject: `${rubric.kind}:${rubric.subject}`,\n category: promotionCategoryForContent(content),\n content,\n score,\n rationale: `Rubric guidance repeated across ${evidenceCount} supporting observations.`,\n outcome: null,\n provenance: observation.provenance,\n agent: rubric.kind === \"agent\" ? rubric.subject : null,\n workflow: rubric.kind === \"workflow\" ? rubric.subject : null,\n });\n }\n }\n\n return [...deduped.values()]\n .sort((a, b) => b.score - a.score || a.subject.localeCompare(b.subject))\n .slice(0, 10);\n }\n\n private buildMistakes(\n entries: FeedbackEntryWithProvenance[],\n actionPatterns: Array<{ pattern: string; provenance: string }>,\n corrections: WeeklyCorrectionEvidence[],\n weekId: string,\n previousRegistry: MistakeRegistryEntry[] = [], defaultNamespacePrefix: string | null = null, forgottenPatterns: ReadonlySet<string> = new Set(),\n ): MistakesFile & { details: PatternWithProvenance[]; registry: MistakeRegistryEntry[] } {\n const patterns: PatternWithProvenance[] = [];\n const evidenceByPattern = new Map<string, {\n category: \"feedback\" | \"action\" | \"correction\";\n agent: string | null;\n workflow: string | null;\n tags: Set<string>;\n severity: CompoundingEntrySeverity | null;\n confidence: number | null;\n outcome: string | null;\n timestamps: string[];\n evidenceWindow: EvidenceWindow;\n }>();\n\n for (const wrapped of entries) {\n const e = wrapped.entry;\n const pattern = e.learning && e.learning.trim().length > 0\n ? `${e.agent}: ${e.learning.trim()}`\n : e.decision === \"rejected\"\n ? `${e.agent}: ${e.reason.trim()}`.slice(0, 240)\n : null;\n if (!pattern) continue;\n const provenance = [`${path.basename(wrapped.sourcePath)}:L${wrapped.sourceLine}#${wrapped.entryId}`];\n patterns.push({ pattern, provenance });\n\n const previous = evidenceByPattern.get(pattern) ?? {\n category: \"feedback\" as const,\n agent: e.agent,\n workflow: e.workflow ?? null,\n tags: new Set<string>(),\n severity: e.severity ?? null,\n confidence: normalizeConfidence(e.confidence),\n outcome: e.outcome?.trim() || null,\n timestamps: [],\n evidenceWindow: normalizeEvidenceWindow(e.evidenceWindowStart, e.evidenceWindowEnd),\n };\n for (const tag of normalizeTags(e.tags)) previous.tags.add(tag);\n previous.timestamps.push(e.date);\n if (previous.workflow === null && e.workflow) previous.workflow = e.workflow;\n if (previous.severity === null && e.severity) previous.severity = e.severity;\n if (previous.confidence === null) previous.confidence = normalizeConfidence(e.confidence);\n if (previous.outcome === null && e.outcome) previous.outcome = e.outcome.trim();\n const nextEvidenceWindow = normalizeEvidenceWindow(e.evidenceWindowStart, e.evidenceWindowEnd);\n previous.evidenceWindow = mergeEvidenceWindows(previous.evidenceWindow, nextEvidenceWindow);\n evidenceByPattern.set(pattern, previous);\n }\n\n for (const correction of corrections) {\n patterns.push({ pattern: correction.pattern, provenance: [correction.provenance] });\n const visible = provenanceVisibleInStoreRecall([correction.provenance], defaultNamespacePrefix);\n const prev = evidenceByPattern.get(correction.pattern) ?? {\n category: \"correction\" as const,\n agent: visible ? correction.source : null,\n workflow: visible ? (correction.entityRef ?? \"corrections\") : \"corrections\",\n tags: new Set<string>(),\n severity: null,\n confidence: visible ? correction.confidence : null,\n outcome: null,\n timestamps: [],\n evidenceWindow: { start: correction.created, end: correction.created },\n };\n if (visible) for (const tag of correction.tags) prev.tags.add(tag);\n prev.timestamps.push(correction.created);\n if (visible && prev.agent === null && correction.source) prev.agent = correction.source;\n if (visible && correction.entityRef && prev.workflow === \"corrections\") prev.workflow = correction.entityRef;\n if (visible && prev.confidence === null) prev.confidence = correction.confidence;\n prev.evidenceWindow = mergeEvidenceWindows(prev.evidenceWindow, {\n start: correction.created,\n end: correction.created,\n });\n evidenceByPattern.set(correction.pattern, prev);\n }\n\n for (const item of actionPatterns) {\n patterns.push({ pattern: item.pattern, provenance: [item.provenance] });\n const previous = evidenceByPattern.get(item.pattern) ?? {\n category: \"action\" as const,\n agent: null,\n workflow: \"memory-actions\",\n tags: new Set<string>(),\n severity: \"medium\" as CompoundingEntrySeverity,\n confidence: null,\n outcome: null,\n timestamps: [],\n evidenceWindow: { start: null, end: null },\n };\n evidenceByPattern.set(item.pattern, previous);\n }\n\n const byPattern = new Map<string, Set<string>>();\n for (const item of patterns) {\n const existing = byPattern.get(item.pattern) ?? new Set<string>();\n for (const provenance of item.provenance) existing.add(provenance);\n byPattern.set(item.pattern, existing);\n }\n\n const details = capWeeklyPatternDetails(\n [...byPattern.entries()].map(([pattern, provenance]) => ({ pattern, provenance: [...provenance].sort() })),\n (pattern) => evidenceByPattern.get(pattern)?.category, defaultNamespacePrefix);\n const previousById = new Map(previousRegistry.map((entry) => [entry.id, entry]));\n const previousByPattern = new Map(previousRegistry.map((entry) => [entry.pattern, entry]));\n const registry: MistakeRegistryEntry[] = details.map((detail) => {\n const evidence = evidenceByPattern.get(detail.pattern);\n const id = stableMistakeId(\n evidence?.category ?? \"feedback\",\n detail.pattern,\n evidence?.agent ?? null,\n evidence?.workflow ?? null,\n );\n const previous = previousById.get(id) ?? previousByPattern.get(detail.pattern);\n const timestamps = (evidence?.timestamps ?? []).filter((value) => typeof value === \"string\" && value.length > 0).sort();\n const firstSeenAt = previous?.firstSeenAt ?? timestamps[0] ?? new Date().toISOString();\n const lastSeenAt = timestamps[timestamps.length - 1] ?? previous?.lastSeenAt ?? firstSeenAt;\n return {\n id,\n pattern: detail.pattern,\n category: evidence?.category ?? \"feedback\",\n status: \"active\" as const,\n agent: evidence?.agent ?? null,\n workflow: evidence?.workflow ?? null,\n tags: evidence ? [...evidence.tags].sort() : [],\n severity: evidence?.severity ?? null,\n confidence: evidence?.confidence ?? null,\n outcome: evidence?.outcome ?? null,\n provenance: detail.provenance,\n firstSeenAt,\n lastSeenAt,\n recurrenceCount: previous?.lastWeekId === weekId ? previous.recurrenceCount : (previous?.recurrenceCount ?? 0) + 1,\n lastWeekId: weekId,\n evidenceWindow: evidence?.evidenceWindow ?? { start: null, end: null },\n retiredAt: null,\n } satisfies MistakeRegistryEntry;\n });\n\n const seenIds = new Set(registry.map((entry) => entry.id));\n const seenPatterns = new Set(registry.map((entry) => entry.pattern));\n for (const previous of previousRegistry) {\n if (seenIds.has(previous.id) || seenPatterns.has(previous.pattern)) continue;\n const staleWeeks = weekIdToIndex(weekId) - weekIdToIndex(previous.lastWeekId);\n registry.push({\n ...previous,\n status: forgottenPatterns.has(previous.pattern) || staleWeeks >= RETIREMENT_WINDOW_WEEKS ? \"retired\" : previous.status,\n retiredAt: forgottenPatterns.has(previous.pattern) || staleWeeks >= RETIREMENT_WINDOW_WEEKS\n ? previous.retiredAt ?? new Date().toISOString()\n : previous.retiredAt ?? null,\n });\n }\n\n registry.sort((a, b) =>\n Number(b.status === \"active\") - Number(a.status === \"active\") ||\n b.recurrenceCount - a.recurrenceCount ||\n b.lastSeenAt.localeCompare(a.lastSeenAt) ||\n a.pattern.localeCompare(b.pattern),\n );\n\n return {\n version: COMPOUNDING_VERSION,\n updatedAt: new Date().toISOString(),\n patterns: details.map((d) => d.pattern),\n details,\n registry,\n };\n }\n\n private formatWeeklyReport(\n weekId: string,\n entries: FeedbackEntryWithProvenance[],\n patterns: string[],\n patternDetails: PatternWithProvenance[],\n continuity: { monthId: string; weeklyPath: string | null; monthlyPath: string | null },\n outcomeSummary: ActionOutcomeSummary[],\n promotionCandidates: PromotionCandidate[],\n ): string {\n const byAgent = new Map<string, FeedbackEntryWithProvenance[]>();\n for (const wrapped of entries) {\n const list = byAgent.get(wrapped.entry.agent) ?? [];\n list.push(wrapped);\n byAgent.set(wrapped.entry.agent, list);\n }\n\n const lines: string[] = [\n `# Weekly Compounding — ${weekId}`,\n \"\",\n \"This file is generated by Engram's compounding engine (v5.0).\",\n \"\",\n \"## Summary\",\n `- Feedback entries: ${entries.length}`,\n `- Mistake patterns: ${patterns.length}`,\n \"\",\n \"## By Agent\",\n ];\n\n if (byAgent.size === 0) {\n lines.push(\"- (none)\");\n } else {\n for (const [agent, list] of Array.from(byAgent.entries()).sort((a, b) => a[0].localeCompare(b[0]))) {\n const approved = list.filter((e) => e.entry.decision === \"approved\").length;\n const awf = list.filter((e) => e.entry.decision === \"approved_with_feedback\").length;\n const rejected = list.filter((e) => e.entry.decision === \"rejected\").length;\n lines.push(`### ${agent}`);\n lines.push(`- approved: ${approved}`);\n lines.push(`- approved_with_feedback: ${awf}`);\n lines.push(`- rejected: ${rejected}`);\n const provenance = list\n .slice(0, 3)\n .map((e) => `${path.basename(e.sourcePath)}:L${e.sourceLine}#${e.entryId}`);\n if (provenance.length > 0) {\n lines.push(`- provenance: ${provenance.join(\", \")}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"## Patterns (Avoid / Prefer)\");\n if (patterns.length === 0) {\n lines.push(\"- (none yet)\");\n } else {\n const detailMap = new Map(patternDetails.map((d) => [d.pattern, d.provenance]));\n for (const p of patterns.slice(0, 100)) {\n const provenance = detailMap.get(p) ?? [];\n if (provenance.length > 0) {\n lines.push(`- ${p} _(source: ${provenance.join(\", \")})_`);\n } else {\n lines.push(`- ${p}`);\n }\n }\n }\n lines.push(\"\");\n\n lines.push(\"## Outcome Weighting\");\n if (outcomeSummary.length === 0) {\n lines.push(\"- (no action outcomes recorded this week)\");\n } else {\n for (const item of outcomeSummary.slice(0, 20)) {\n lines.push(\n `- ${item.action}: applied=${item.counts.applied}, skipped=${item.counts.skipped}, failed=${item.counts.failed}, weight=${item.weightedScore} _(source: ${item.provenance.join(\", \")})_`,\n );\n }\n }\n lines.push(\"\");\n\n if (resolveConsolidationCapabilities(this.config).compoundingSemantic) {\n lines.push(\"## Promotion Candidates (Advisory)\");\n if (promotionCandidates.length === 0) {\n lines.push(\"- (no advisory promotion candidates this week)\");\n } else {\n for (const candidate of promotionCandidates) {\n const outcomeSummaryText = candidate.outcome\n ? ` outcomes[a=${candidate.outcome.applied}, s=${candidate.outcome.skipped}, f=${candidate.outcome.failed}]`\n : \"\";\n lines.push(\n `- [${candidate.sourceType}] ${candidate.subject} -> ${candidate.content} (category=${candidate.category}, score=${candidate.score}, id=${candidate.id}): ${candidate.rationale}${outcomeSummaryText} _(source: ${candidate.provenance.join(\", \")})_`,\n );\n }\n }\n lines.push(\"\");\n lines.push(\"_Advisory only: no automatic promotion write is performed by this report. Use `compounding_promote_candidate` or `openclaw engram compounding-promote` to persist one manually._\");\n lines.push(\"\");\n }\n\n if (resolveConsolidationCapabilities(this.config).continuityAudit) {\n lines.push(\"## Continuity Audits\");\n if (continuity.weeklyPath) {\n lines.push(`- weekly: ${continuity.weeklyPath}`);\n } else {\n lines.push(`- weekly: (missing for ${weekId})`);\n }\n if (continuity.monthlyPath) {\n lines.push(`- monthly: ${continuity.monthlyPath}`);\n } else {\n lines.push(`- monthly: (missing for ${continuity.monthId})`);\n }\n lines.push(\"\");\n }\n\n return lines.join(\"\\n\");\n }\n\n private buildRubricSnapshot(\n entries: FeedbackEntryWithProvenance[],\n outcomeSummary: ActionOutcomeSummary[],\n corrections: WeeklyCorrectionEvidence[] = [],\n ): RubricSnapshot {\n const updatedAt = new Date().toISOString();\n const byAgent = new Map<string, RubricSnapshotEntry>();\n const byWorkflow = new Map<string, RubricSnapshotEntry>();\n\n for (const wrapped of entries) {\n const note = ((wrapped.entry.learning && wrapped.entry.learning.trim().length > 0)\n ? wrapped.entry.learning\n : wrapped.entry.decision === \"rejected\"\n ? wrapped.entry.reason\n : \"\").trim();\n if (!note) continue;\n const provenance = `${path.basename(wrapped.sourcePath)}:L${wrapped.sourceLine}#${wrapped.entryId}`;\n const agentEntry = byAgent.get(wrapped.entry.agent) ?? {\n id: stableRubricId(\"agent\", wrapped.entry.agent),\n kind: \"agent\" as const,\n subject: wrapped.entry.agent,\n observations: [],\n tags: [],\n provenance: [],\n observationEntries: [],\n updatedAt,\n };\n this.addRubricObservation(agentEntry, note, provenance);\n agentEntry.tags = normalizeTags([...agentEntry.tags, ...normalizeTags(wrapped.entry.tags)]);\n byAgent.set(wrapped.entry.agent, agentEntry);\n\n const workflow = wrapped.entry.workflow?.trim();\n if (!workflow) continue;\n const workflowEntry = byWorkflow.get(workflow) ?? {\n id: stableRubricId(\"workflow\", workflow),\n kind: \"workflow\" as const,\n subject: workflow,\n observations: [],\n tags: [],\n provenance: [],\n observationEntries: [],\n updatedAt,\n };\n this.addRubricObservation(workflowEntry, note, provenance);\n workflowEntry.tags = normalizeTags([...workflowEntry.tags, ...normalizeTags(wrapped.entry.tags)]);\n byWorkflow.set(workflow, workflowEntry);\n }\n\n for (const correction of corrections) {\n if (correction.source) {\n const agentEntry = byAgent.get(correction.source) ?? {\n id: stableRubricId(\"agent\", correction.source),\n kind: \"agent\" as const,\n subject: correction.source,\n observations: [],\n tags: [],\n provenance: [],\n observationEntries: [],\n updatedAt,\n };\n this.addRubricObservation(agentEntry, correction.note, correction.provenance);\n agentEntry.tags = normalizeTags([...agentEntry.tags, ...correction.tags]);\n byAgent.set(correction.source, agentEntry);\n }\n const workflow = correction.entityRef ?? \"corrections\";\n const workflowEntry = byWorkflow.get(workflow) ?? {\n id: stableRubricId(\"workflow\", workflow),\n kind: \"workflow\" as const,\n subject: workflow,\n observations: [],\n tags: [],\n provenance: [],\n observationEntries: [],\n updatedAt,\n };\n this.addRubricObservation(workflowEntry, correction.note, correction.provenance);\n workflowEntry.tags = normalizeTags([...workflowEntry.tags, ...correction.tags]);\n byWorkflow.set(workflow, workflowEntry);\n }\n\n for (const item of outcomeSummary) {\n const workflowEntry = byWorkflow.get(item.action) ?? {\n id: stableRubricId(\"workflow\", item.action),\n kind: \"workflow\" as const,\n subject: item.action,\n observations: [],\n tags: [],\n provenance: [],\n observationEntries: [],\n updatedAt,\n };\n this.addRubricObservation(\n workflowEntry,\n `Outcome weight=${item.weightedScore} (applied=${item.counts.applied}, skipped=${item.counts.skipped}, failed=${item.counts.failed})`,\n ...item.provenance,\n );\n byWorkflow.set(item.action, workflowEntry);\n }\n\n return {\n updatedAt,\n agents: [...byAgent.values()].sort((a, b) => a.subject.localeCompare(b.subject)),\n workflows: [...byWorkflow.values()].sort((a, b) => a.subject.localeCompare(b.subject)),\n };\n }\n\n private formatRubrics(outcomeSummary: ActionOutcomeSummary[], snapshot: RubricSnapshot): string {\n const lines: string[] = [\n \"# Compounding Rubrics\",\n \"\",\n `Generated: ${snapshot.updatedAt}`,\n \"\",\n \"Stable, deterministic rubric snapshot generated from weekly feedback, correction memories, and action outcomes.\",\n \"\",\n ];\n\n lines.push(\"## Agent Rubrics\");\n if (snapshot.agents.length === 0) {\n lines.push(\"- (none yet)\");\n } else {\n for (const rubric of snapshot.agents) {\n lines.push(`### ${rubric.subject}`);\n const observations = this.getRubricObservationEntries(rubric).slice(0, 8);\n if (observations.length === 0) {\n lines.push(\"- No rubric deltas this week.\");\n } else {\n for (const observation of observations) {\n const provenance = observation.provenance.join(\", \");\n lines.push(`- ${observation.note}${provenance ? ` _(source: ${provenance})_` : \"\"}`);\n }\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"## Workflow Rubrics\");\n if (snapshot.workflows.length === 0) {\n lines.push(\"- (none yet)\");\n } else {\n for (const rubric of snapshot.workflows) {\n lines.push(`### ${rubric.subject}`);\n for (const observation of this.getRubricObservationEntries(rubric).slice(0, 8)) {\n const provenance = observation.provenance.join(\", \");\n lines.push(`- ${observation.note}${provenance ? ` _(source: ${provenance})_` : \"\"}`);\n }\n lines.push(\"\");\n }\n }\n\n lines.push(\"## Action Outcome Signals\");\n if (outcomeSummary.length === 0) {\n lines.push(\"- (none yet)\");\n } else {\n for (const item of outcomeSummary.slice(0, 20)) {\n lines.push(\n `- ${item.action}: weight=${item.weightedScore} (applied=${item.counts.applied}, skipped=${item.counts.skipped}, failed=${item.counts.failed})`,\n );\n }\n }\n lines.push(\"\");\n return lines.join(\"\\n\");\n }\n\n private async syncRubricArtifacts(snapshot: RubricSnapshot): Promise<void> {\n await this.replaceRubricDirectory(this.rubricsAgentsDir, snapshot.agents);\n await this.replaceRubricDirectory(this.rubricsWorkflowsDir, snapshot.workflows);\n }\n\n private async replaceRubricDirectory(dir: string, entries: RubricSnapshotEntry[]): Promise<void> {\n await mkdir(dir, { recursive: true });\n try {\n const names = await readdir(dir);\n await Promise.all(\n names.filter((name) => name.endsWith(\".md\")).map((name) => unlink(path.join(dir, name)).catch(() => undefined)),\n );\n } catch {\n // fail-open\n }\n\n const slugCollisions = new Map<string, number>();\n for (const entry of entries) {\n const slug = stableSlug(entry.subject);\n slugCollisions.set(slug, (slugCollisions.get(slug) ?? 0) + 1);\n }\n\n await Promise.all(entries.map(async (entry) => {\n const observationEntries = this.getRubricObservationEntries(entry);\n const body = [\n `# ${entry.kind === \"agent\" ? \"Agent\" : \"Workflow\"} Rubric — ${entry.subject}`,\n \"\",\n `Updated: ${entry.updatedAt}`,\n \"\",\n \"## Observations\",\n ...(observationEntries.length > 0\n ? observationEntries.map((item) => `- ${item.note}`)\n : [\"- (none yet)\"]),\n \"\",\n \"## Provenance\",\n ...(entry.provenance.length > 0 ? entry.provenance.map((item) => `- ${item}`) : [\"- (none yet)\"]),\n \"\",\n ].join(\"\\n\");\n const fileName = rubricArtifactFileName(entry, slugCollisions);\n await writeFile(path.join(dir, fileName), body, \"utf-8\");\n }));\n }\n\n private scoreRubricForQuery(entry: RubricSnapshotEntry, queryTokens: string[]): number {\n if (queryTokens.length === 0) return entry.observations.length;\n const haystack = [entry.subject, ...entry.observations, ...entry.tags].join(\" \").toLowerCase();\n let score = 0;\n for (const token of queryTokens) {\n if (haystack.includes(token)) score += 2;\n if (entry.subject.toLowerCase().includes(token)) score += 2;\n }\n if (score === 0) return 0;\n return score + Math.min(entry.observations.length, 3);\n }\n\n private normalizeRubricEntry(entry: RubricSnapshotEntry): RubricSnapshotEntry {\n const normalizedEntries = this.getRubricObservationEntries(entry);\n return {\n ...entry,\n observations: normalizedEntries.map((item) => item.note),\n provenance: [...new Set(normalizedEntries.flatMap((item) => item.provenance))],\n observationEntries: normalizedEntries,\n };\n }\n\n private getRubricObservationEntries(entry: RubricSnapshotEntry): Array<{ note: string; provenance: string[] }> {\n if (Array.isArray(entry.observationEntries) && entry.observationEntries.length > 0) {\n return entry.observationEntries.map((item) => ({\n note: item.note,\n provenance: [...new Set(item.provenance)].sort(),\n }));\n }\n\n return entry.observations.map((note, index) => ({\n note,\n provenance: entry.provenance[index] ? [entry.provenance[index]] : (entry.provenance[0] ? [entry.provenance[0]] : []),\n }));\n }\n\n private isSyntheticOutcomeRubricObservation(note: string): boolean {\n return note.trimStart().startsWith(\"Outcome weight=\");\n }\n\n private addRubricObservation(entry: RubricSnapshotEntry, note: string, ...provenance: string[]): void {\n const normalized = this.normalizeRubricEntry(entry);\n const existing = normalized.observationEntries?.find((item) => item.note === note);\n if (existing) {\n existing.provenance = [...new Set([...existing.provenance, ...provenance])].sort();\n } else {\n normalized.observationEntries?.push({\n note,\n provenance: [...new Set(provenance)].sort(),\n });\n }\n entry.observationEntries = normalized.observationEntries;\n entry.observations = normalized.observationEntries?.map((item) => item.note) ?? [];\n entry.provenance = [...new Set((normalized.observationEntries ?? []).flatMap((item) => item.provenance))];\n }\n\n private async readOptionalIdentityAnchorForAudit(): Promise<string | null> {\n try {\n return await this.storage.readIdentityAnchor();\n } catch {\n return null;\n }\n }\n\n private async readOptionalImprovementLoopsForAudit(): Promise<string | null> {\n try {\n return await this.storage.readIdentityImprovementLoops();\n } catch {\n return null;\n }\n }\n\n private async readContinuityIncidentsForAudit(\n limit: number,\n state: \"open\" | \"closed\",\n ): Promise<ContinuityIncidentRecord[]> {\n try {\n return await this.storage.readContinuityIncidents(limit, state);\n } catch {\n return [];\n }\n }\n\n private async readOptionalIdentityAuditForReference(\n period: \"weekly\" | \"monthly\",\n key: string,\n ): Promise<string | null> {\n try {\n return await this.storage.readIdentityAudit(period, key);\n } catch {\n return null;\n }\n }\n\n private async readContinuityAuditReferences(weekId: string): Promise<{\n weekId: string;\n monthId: string;\n weeklyPath: string | null;\n monthlyPath: string | null;\n }> {\n const monthId = monthIdFromIsoWeek(weekId);\n const weeklyPath = path.join(this.identityAuditWeeklyDir, `${weekId}.md`);\n const monthlyPath = path.join(this.identityAuditMonthlyDir, `${monthId}.md`);\n const [weeklyAudit, monthlyAudit] = await Promise.all([\n this.readOptionalIdentityAuditForReference(\"weekly\", weekId),\n this.readOptionalIdentityAuditForReference(\"monthly\", monthId),\n ]);\n const weeklyExists = (weeklyAudit ?? \"\").trim().length > 0;\n const monthlyExists = (monthlyAudit ?? \"\").trim().length > 0;\n return {\n weekId,\n monthId,\n weeklyPath: weeklyExists ? weeklyPath : null,\n monthlyPath: monthlyExists ? monthlyPath : null,\n };\n }\n}\n","/**\n * UTC ISO-8601 week ids (`YYYY-Www`) shared by compounding reports and the\n * daemon weekly run. Week boundaries follow the Thursday rule: the week\n * belongs to the year that contains its Thursday.\n */\n\nconst DAY_MS = 86_400_000;\nconst WEEK_MS = 7 * DAY_MS;\n\n/** ISO week id for `d`, evaluated in UTC. */\nexport function isoWeekId(d: Date): string {\n // ISO week based on Thursday.\n const dt = new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));\n const day = dt.getUTCDay() || 7;\n dt.setUTCDate(dt.getUTCDate() + 4 - day);\n const yearStart = new Date(Date.UTC(dt.getUTCFullYear(), 0, 1));\n const week = Math.ceil(((dt.getTime() - yearStart.getTime()) / 86400000 + 1) / 7);\n const yyyy = dt.getUTCFullYear();\n return `${yyyy}-W${String(week).padStart(2, \"0\")}`;\n}\n\n/** The ISO week that ended before the week containing `d`. */\nexport function previousIsoWeekId(d: Date): string {\n const dt = new Date(d.getTime());\n dt.setUTCDate(dt.getUTCDate() - 7);\n return isoWeekId(dt);\n}\n\n/**\n * Milliseconds until the next Monday 00:00 UTC. Exactly on a Monday boundary\n * the next run is one week out, so a tick that fires on the boundary does not\n * schedule a zero-delay follow-up.\n */\nexport function msUntilNextIsoWeek(d: Date): number {\n const utcMidnight = Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());\n const day = new Date(utcMidnight).getUTCDay() || 7;\n const daysFromMonday = day - 1;\n const thisMonday = utcMidnight - daysFromMonday * DAY_MS;\n const nextMonday = thisMonday + WEEK_MS;\n const delta = nextMonday - d.getTime();\n if (delta <= 0) return WEEK_MS;\n return delta;\n}\n\n/** True for the `YYYY-Www` ids this module produces (week 01 through 53). */\nexport function isIsoWeekId(weekId: string): boolean {\n if (weekId.length !== 8 || weekId[4] !== \"-\" || weekId[5] !== \"W\") return false;\n const year = weekId.slice(0, 4);\n const week = weekId.slice(6);\n for (let i = 0; i < year.length; i += 1) {\n const code = year.charCodeAt(i);\n if (code < 48 || code > 57) return false;\n }\n for (let i = 0; i < week.length; i += 1) {\n const code = week.charCodeAt(i);\n if (code < 48 || code > 57) return false;\n }\n const weekNum = Number(week);\n return weekNum >= 1 && weekNum <= 53;\n}\n","/**\n * Week-scoped inputs for compounding synthesis.\n *\n * Corrections, namespace action ledgers, and the feedback inbox are read here\n * so CompoundingEngine stays inside its line ceiling. Scans are bounded:\n * correction files outside the ISO week are skipped before they are read.\n * Parsing stops after WEEKLY_CORRECTION_READ_LIMIT accepted corrections or\n * WEEKLY_CORRECTION_SCAN_LIMIT opened files, whichever comes first. Visible\n * store candidates are opened before other namespaces, so a foreign store\n * cannot fill the accepted cap and hide an older default-store correction.\n */\n\nimport type { Stats } from \"node:fs\";\nimport { lstat, readFile, readdir, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { log } from \"../logger.js\";\nimport { namespaceIdentityFromToken } from \"../namespaces/identity.js\";\nimport { resolveDefaultNamespaceRoot } from \"../namespaces/storage.js\";\nimport { isSafeRouteNamespace } from \"../routing/engine.js\";\nimport { secureStoreDir } from \"../secure-store/header.js\";\nimport * as keyring from \"../secure-store/keyring.js\";\nimport { readMaybeEncryptedFile } from \"../secure-store/secure-fs.js\";\nimport { type SharedFeedbackEntry, SharedFeedbackEntrySchema } from \"../shared-context/manager.js\";\nimport { readRawMemoryDocument } from \"../storage/memory-frontmatter-metadata.js\";\nimport { readMaybeEncryptedLines } from \"../storage/secure-line-reader.js\";\nimport type { MemoryActionEvent, MemoryFile, PluginConfig } from \"../types.js\";\nimport { isErrnoCode } from \"../utils/errno.js\";\nimport { assertPathInsideRoot } from \"../utils/path-containment.js\";\nimport { isIsoWeekId, isoWeekId } from \"./iso-week.js\";\n\nconst DAY_MS = 86_400_000;\n\n/** Accepted in-week corrections kept per synthesis. */\nexport const WEEKLY_CORRECTION_READ_LIMIT = 500;\n\n/** Opened in-week correction files per synthesis, including ones policy rejects. */\nexport const WEEKLY_CORRECTION_SCAN_LIMIT = 2000;\n\n/** Skip a correction file whose on-disk size exceeds this, before parsing. */\nexport const CORRECTION_FILE_BYTE_LIMIT = 256 * 1024;\n\nconst CORRECTION_NOTE_LIMIT = 240;\n\nexport type FeedbackEntryWithProvenance = {\n entry: SharedFeedbackEntry;\n sourceLine: number;\n sourcePath: string;\n entryId: string;\n};\n\nexport type WeeklyActionEvent = {\n line: number;\n action: string;\n outcome: \"applied\" | \"skipped\" | \"failed\";\n policyDecision: \"deny\" | \"defer\" | null;\n namespace: string;\n reason: string | null;\n /** Stable ledger label recorded in outcome provenance. */\n ledgerLabel: string;\n actionId: string | null;\n};\n\nexport type WeeklyCorrectionEvidence = {\n id: string;\n namespace: string;\n pattern: string;\n note: string;\n created: string;\n source: string | null;\n entityRef: string | null;\n confidence: number | null;\n tags: string[];\n provenance: string;\n};\n\nexport type WeeklyEvidenceStorage = {\n readMemoryByPath(filePath: string): Promise<MemoryFile | null>;\n readMemoryActionEventRows(limit: number): Promise<Array<{ line: number; event: MemoryActionEvent }>>;\n};\n\ntype CorrectionCandidate = {\n filePath: string;\n sortMs: number;\n namespace: string;\n};\n\ntype NamespaceDir = {\n dirName: string;\n namespace: string;\n root: string;\n};\n\n/** Monday 00:00 UTC of an ISO week id, or null when `weekId` is not one this module emits. */\nexport function isoWeekStartMs(weekId: string): number | null {\n if (!isIsoWeekId(weekId)) return null;\n const year = Number(weekId.slice(0, 4));\n const week = Number(weekId.slice(6));\n const jan4 = Date.UTC(year, 0, 4);\n const jan4Day = new Date(jan4).getUTCDay() || 7;\n const start = jan4 - (jan4Day - 1) * DAY_MS + (week - 1) * 7 * DAY_MS;\n if (isoWeekId(new Date(start)) !== weekId) return null;\n return start;\n}\n\nexport async function readFeedbackEntriesForWeekFile(\n inboxPath: string,\n weekId: string\n): Promise<FeedbackEntryWithProvenance[]> {\n // Includes entries whose date falls in the ISO week.\n const out: FeedbackEntryWithProvenance[] = [];\n try {\n const raw = await readFile(inboxPath, \"utf-8\");\n const lines = raw.split(\"\\n\");\n for (let idx = 0; idx < lines.length; idx += 1) {\n const line = lines[idx];\n if (!line.trim()) continue;\n try {\n const obj = JSON.parse(line);\n const parsed = SharedFeedbackEntrySchema.safeParse(obj);\n if (!parsed.success) continue;\n const d = new Date(parsed.data.date);\n if (!Number.isFinite(d.getTime())) continue;\n if (isoWeekId(d) !== weekId) continue;\n const sourceLine = idx + 1;\n out.push({\n entry: parsed.data,\n sourceLine,\n sourcePath: inboxPath,\n entryId: `${parsed.data.agent}-${parsed.data.date}-${sourceLine}`.replace(/[^a-zA-Z0-9._:-]/g, \"_\"),\n });\n } catch {\n // ignore a malformed line\n }\n }\n } catch {\n // missing feedback is normal\n }\n return out;\n}\n\nexport function buildActionFailurePatterns(\n events: WeeklyActionEvent[]\n): Array<{ pattern: string; provenance: string }> {\n const out: Array<{ pattern: string; provenance: string }> = [];\n for (const event of events) {\n const failed = event.outcome === \"failed\" || event.outcome === \"skipped\";\n if (!failed && event.policyDecision === null) continue;\n const suffix = event.reason && event.reason.trim().length > 0 ? ` - ${event.reason.trim().slice(0, 140)}` : \"\";\n out.push({\n pattern: `memory-action/${event.namespace}: ${event.action} ${event.outcome}${event.policyDecision ? `/${event.policyDecision}` : \"\"}${suffix}`,\n provenance: `${event.ledgerLabel}:*`,\n });\n }\n return out;\n}\n\nexport async function readWeeklyActionEvents(input: {\n storage: WeeklyEvidenceStorage;\n memoryDir: string;\n weekId: string;\n}): Promise<WeeklyActionEvent[]> {\n const seenActionIds = new Set<string>();\n const out: WeeklyActionEvent[] = [];\n const rootRows = await input.storage.readMemoryActionEventRows(Number.MAX_SAFE_INTEGER);\n for (const row of rootRows) {\n pushActionEvent(out, seenActionIds, row.line, row.event, \"default\", \"memory-actions.jsonl\", input.weekId);\n }\n\n const rootReal = await realpath(input.memoryDir);\n const namespaces = await listNamespaceStorageDirs(input.memoryDir, rootReal);\n const key = keyring.getKey(secureStoreDir(input.memoryDir));\n for (const ns of namespaces) {\n const filePath = path.join(ns.root, \"state\", \"memory-actions.jsonl\");\n const label = `namespaces/${ns.dirName}/state/memory-actions.jsonl`;\n let entryStat: Stats;\n try {\n entryStat = await lstat(filePath);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) continue;\n throw err;\n }\n if (entryStat.isSymbolicLink() || !entryStat.isFile()) continue;\n const fileReal = await realpath(filePath);\n assertPathInsideRoot(rootReal, fileReal, filePath);\n try {\n let lineNumber = 0;\n for await (const row of readMaybeEncryptedLines(\n filePath,\n () => readMaybeEncryptedFile(filePath, key, input.memoryDir),\n )) {\n lineNumber += 1;\n const line = row.trim();\n if (line.length === 0) continue;\n const event = parseMemoryActionEventLine(line);\n if (!event) continue;\n pushActionEvent(out, seenActionIds, lineNumber, event, ns.namespace, label, input.weekId);\n }\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) continue;\n throw err;\n }\n }\n return out;\n}\n\nexport async function readWeeklyCorrections(input: {\n storage: WeeklyEvidenceStorage;\n memoryDir: string;\n weekId: string;\n /** Flat root stays visible when this is null. A routed default store passes its `namespaces/<dir>/` prefix. */\n defaultNamespacePrefix?: string | null;\n}): Promise<WeeklyCorrectionEvidence[]> {\n const weekStartMs = isoWeekStartMs(input.weekId);\n if (weekStartMs === null) return [];\n const rootReal = await realpath(input.memoryDir);\n const candidates: CorrectionCandidate[] = [];\n await collectCorrectionCandidates(candidates, input.memoryDir, \"default\", input.weekId, weekStartMs, rootReal);\n const namespaces = await listNamespaceStorageDirs(input.memoryDir, rootReal);\n for (const ns of namespaces) {\n await collectCorrectionCandidates(candidates, ns.root, ns.namespace, input.weekId, weekStartMs, rootReal);\n }\n candidates.sort((a, b) => b.sortMs - a.sortMs || a.filePath.localeCompare(b.filePath));\n const ordered = preferVisibleCorrectionCandidates(\n candidates,\n input.memoryDir,\n input.defaultNamespacePrefix ?? null,\n );\n const out: WeeklyCorrectionEvidence[] = [];\n let scanned = 0;\n for (const candidate of ordered) {\n if (out.length >= WEEKLY_CORRECTION_READ_LIMIT || scanned >= WEEKLY_CORRECTION_SCAN_LIMIT) break;\n scanned += 1;\n const evidence = await readCorrectionCandidate(input.storage, input.memoryDir, input.weekId, candidate);\n if (evidence) out.push(evidence);\n }\n if (scanned < candidates.length) {\n log.warn(\n `weekly synthesis kept ${out.length} accepted corrections after scanning ${scanned} of ${candidates.length} in-week candidates`\n );\n }\n return out;\n}\n\n/** Newest-first within the visible store, then newest-first everywhere else. */\nfunction preferVisibleCorrectionCandidates(\n candidates: readonly CorrectionCandidate[],\n memoryDir: string,\n defaultNamespacePrefix: string | null,\n): CorrectionCandidate[] {\n const visible: CorrectionCandidate[] = [];\n const foreign: CorrectionCandidate[] = [];\n for (const candidate of candidates) {\n const relative = path.relative(memoryDir, candidate.filePath).split(path.sep).join(\"/\");\n if (provenanceVisibleInStoreRecall([relative], defaultNamespacePrefix)) visible.push(candidate);\n else foreign.push(candidate);\n }\n return visible.concat(foreign);\n}\n\nfunction parseMemoryActionEventLine(line: string): MemoryActionEvent | null {\n let parsed: Partial<MemoryActionEvent> & { recordKind?: unknown };\n try {\n parsed = JSON.parse(line) as Partial<MemoryActionEvent> & { recordKind?: unknown };\n } catch {\n return null;\n }\n if (parsed.recordKind !== undefined) return null;\n const outcome = parsed.outcome === \"applied\" || parsed.outcome === \"skipped\" || parsed.outcome === \"failed\"\n ? parsed.outcome\n : null;\n const timestamp = parsed.timestamp;\n const action = parsed.action;\n if (typeof timestamp !== \"string\" || typeof action !== \"string\" || outcome === null) return null;\n return { ...parsed, timestamp, action, outcome };\n}\n\nfunction pushActionEvent(\n out: WeeklyActionEvent[],\n seenActionIds: Set<string>,\n line: number,\n event: MemoryActionEvent,\n fallbackNamespace: string,\n ledgerLabel: string,\n weekId: string\n): void {\n const ts = new Date(event.timestamp);\n if (!Number.isFinite(ts.getTime()) || isoWeekId(ts) !== weekId) return;\n const actionId = typeof event.actionId === \"string\" && event.actionId.length > 0 ? event.actionId : null;\n if (actionId) {\n if (seenActionIds.has(actionId)) return;\n seenActionIds.add(actionId);\n }\n out.push({\n line,\n action: event.action,\n outcome: event.outcome,\n policyDecision: event.policyDecision === \"deny\" || event.policyDecision === \"defer\" ? event.policyDecision : null,\n namespace: typeof event.namespace === \"string\" && event.namespace.length > 0 ? event.namespace : fallbackNamespace,\n reason: typeof event.reason === \"string\" ? event.reason : null,\n ledgerLabel,\n actionId,\n });\n}\n\nasync function listNamespaceStorageDirs(memoryDir: string, rootReal: string): Promise<NamespaceDir[]> {\n const nsRoot = path.join(memoryDir, \"namespaces\");\n let rootStat: Stats;\n try {\n rootStat = await lstat(nsRoot);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return [];\n throw err;\n }\n // A symlinked namespaces directory can point outside the store. Reject the\n // whole tree rather than following it.\n if (rootStat.isSymbolicLink() || !rootStat.isDirectory()) return [];\n const nsReal = await realpath(nsRoot);\n assertPathInsideRoot(rootReal, nsReal, nsRoot);\n const names = await readdir(nsRoot);\n const out: NamespaceDir[] = [];\n for (const dirName of names) {\n const namespace = namespaceFromDirName(dirName);\n if (!namespace) continue;\n const root = path.join(nsRoot, dirName);\n let entryStat: Stats;\n try {\n entryStat = await lstat(root);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) continue;\n throw err;\n }\n if (entryStat.isSymbolicLink() || !entryStat.isDirectory()) continue;\n const dirReal = await realpath(root);\n assertPathInsideRoot(rootReal, dirReal, root);\n out.push({ dirName, namespace, root });\n }\n out.sort((a, b) => a.dirName.localeCompare(b.dirName));\n return out;\n}\n\nfunction namespaceFromDirName(dirName: string): string | null {\n if (dirName.length === 0 || dirName.includes(\"/\") || dirName.includes(\"\\\\\") || dirName.includes(\"..\")) {\n return null;\n }\n if (dirName.startsWith(\"ns-\")) {\n const decoded = namespaceIdentityFromToken(dirName);\n if (decoded === null) return null;\n // `ns-default` is the empty identity. It is the migrated default store,\n // not a foreign namespace.\n if (decoded.length === 0) return \"default\";\n return isSafeRouteNamespace(decoded) ? decoded : null;\n }\n return isSafeRouteNamespace(dirName) ? dirName : null;\n}\n\nasync function collectCorrectionCandidates(\n candidates: CorrectionCandidate[],\n storageRoot: string,\n namespace: string,\n weekId: string,\n weekStartMs: number,\n rootReal: string\n): Promise<void> {\n await collectCorrectionDir(\n candidates,\n path.join(storageRoot, \"corrections\"),\n namespace,\n weekId,\n weekStartMs,\n rootReal\n );\n const factsDir = path.join(storageRoot, \"facts\");\n const dayNames = await readContainedDirNames(factsDir, rootReal);\n if (!dayNames) return;\n for (const dayName of dayNames) {\n if (!utcDayDirInWeek(dayName, weekId)) continue;\n await collectCorrectionDir(candidates, path.join(factsDir, dayName), namespace, weekId, weekStartMs, rootReal);\n }\n}\n\nasync function collectCorrectionDir(\n candidates: CorrectionCandidate[],\n dir: string,\n namespace: string,\n weekId: string,\n weekStartMs: number,\n rootReal: string\n): Promise<void> {\n const names = await readContainedDirNames(dir, rootReal);\n if (!names) return;\n for (const name of names) {\n if (!name.startsWith(\"correction-\") || !name.endsWith(\".md\")) continue;\n // A timestamped name outside this week is historical. Skip it before\n // lstat or realpath so a large corrections directory stays inside the\n // weekly budget.\n const filenameMs = correctionFilenameTimestampMs(name);\n if (filenameMs !== null && isoWeekId(new Date(filenameMs)) !== weekId) continue;\n const filePath = path.join(dir, name);\n let entryStat: Stats;\n try {\n entryStat = await lstat(filePath);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) continue;\n throw err;\n }\n if (entryStat.isSymbolicLink() || !entryStat.isFile()) continue;\n if (entryStat.size > CORRECTION_FILE_BYTE_LIMIT) continue;\n const fileReal = await realpath(filePath);\n assertPathInsideRoot(rootReal, fileReal, filePath);\n if (filenameMs !== null) {\n candidates.push({ filePath, sortMs: filenameMs, namespace });\n continue;\n }\n if (entryStat.mtimeMs < weekStartMs) continue;\n candidates.push({ filePath, sortMs: entryStat.mtimeMs, namespace });\n }\n}\n\nasync function readContainedDirNames(dir: string, rootReal: string): Promise<string[] | null> {\n let entryStat: Stats;\n try {\n entryStat = await lstat(dir);\n } catch (err) {\n if (isErrnoCode(err, \"ENOENT\")) return null;\n throw err;\n }\n if (entryStat.isSymbolicLink() || !entryStat.isDirectory()) return null;\n const dirReal = await realpath(dir);\n assertPathInsideRoot(rootReal, dirReal, dir);\n return readdir(dir);\n}\n\nfunction utcDayDirInWeek(name: string, weekId: string): boolean {\n if (name.length !== 10 || name[4] !== \"-\" || name[7] !== \"-\") return false;\n for (let i = 0; i < name.length; i += 1) {\n if (i === 4 || i === 7) continue;\n const code = name.charCodeAt(i);\n if (code < 48 || code > 57) return false;\n }\n const year = Number(name.slice(0, 4));\n const month = Number(name.slice(5, 7));\n const day = Number(name.slice(8, 10));\n if (month < 1 || month > 12 || day < 1 || day > 31) return false;\n const stamp = new Date(Date.UTC(year, month - 1, day));\n if (stamp.getUTCFullYear() !== year || stamp.getUTCMonth() !== month - 1 || stamp.getUTCDate() !== day) {\n return false;\n }\n return isoWeekId(stamp) === weekId;\n}\n\nfunction correctionFilenameTimestampMs(fileName: string): number | null {\n const prefix = \"correction-\";\n if (!fileName.startsWith(prefix) || !fileName.endsWith(\".md\")) return null;\n const rest = fileName.slice(prefix.length, fileName.length - 3);\n let i = 0;\n while (i < rest.length) {\n const code = rest.charCodeAt(i);\n if (code < 48 || code > 57) break;\n i += 1;\n }\n if (i < 10) return null;\n if (i < rest.length && rest[i] !== \"-\") return null;\n const ms = Number(rest.slice(0, i));\n if (!Number.isSafeInteger(ms)) return null;\n return ms;\n}\n\nasync function readCorrectionCandidate(\n storage: WeeklyEvidenceStorage,\n memoryDir: string,\n weekId: string,\n candidate: CorrectionCandidate\n): Promise<WeeklyCorrectionEvidence | null> {\n const memory = await storage.readMemoryByPath(candidate.filePath);\n if (!memory) return null;\n const raw = readRawMemoryDocument(memory);\n if (!raw) return null;\n if (rawFrontmatterScalar(raw, \"category\") !== \"correction\") return null;\n // Missing status is the writer default (`active`). Any other explicit\n // status, including forgotten, stays out of compounding so a forget is\n // not copied back into recall or promotion.\n const status = rawFrontmatterScalar(raw, \"status\");\n if (status && status !== \"active\") return null;\n const created = rawFrontmatterScalar(raw, \"created\");\n if (!created) return null;\n const createdDate = new Date(created);\n if (!Number.isFinite(createdDate.getTime()) || isoWeekId(createdDate) !== weekId) return null;\n const note = collapseWhitespace(memory.content).slice(0, CORRECTION_NOTE_LIMIT);\n if (note.length === 0) return null;\n const rawSource = rawFrontmatterScalar(raw, \"source\");\n const source = rawSource && rawSource !== \"unknown\" ? rawSource : null;\n const entityRef =\n typeof memory.frontmatter.entityRef === \"string\" && memory.frontmatter.entityRef.length > 0\n ? memory.frontmatter.entityRef\n : null;\n const confidence = rawConfidence(raw);\n const tags = Array.isArray(memory.frontmatter.tags)\n ? memory.frontmatter.tags.filter((tag) => typeof tag === \"string\" && tag.length > 0)\n : [];\n const id =\n typeof memory.frontmatter.id === \"string\" && memory.frontmatter.id.length > 0\n ? memory.frontmatter.id\n : path.basename(candidate.filePath, \".md\");\n return {\n id,\n namespace: candidate.namespace,\n pattern: `correction: ${note}`,\n note,\n created,\n source,\n entityRef,\n confidence,\n tags,\n provenance: path.relative(memoryDir, candidate.filePath).split(path.sep).join(\"/\"),\n };\n}\n\n/**\n * Relative `namespaces/` prefix for the routed default store, or null when\n * that store is still the flat memory root. Recall and promotion treat this\n * prefix as the caller's own store.\n */\nexport async function defaultNamespaceRecallPrefix(config: PluginConfig): Promise<string | null> {\n const root = await resolveDefaultNamespaceRoot(config);\n const rel = path.relative(path.resolve(config.memoryDir), path.resolve(root));\n if (rel === \"\" || rel === \".\" || rel.startsWith(\"..\") || path.isAbsolute(rel)) return null;\n const posix = rel.split(path.sep).join(\"/\");\n if (!posix.startsWith(\"namespaces/\")) return null;\n return `${posix}/`;\n}\n\n/**\n * Store recall and promotion keep the flat root and the routed default\n * namespace. Other `namespaces/` provenance stays on the weekly report.\n */\nexport function visibleRubricEntries<T extends {\n observations: string[];\n provenance: string[];\n observationEntries?: Array<{ note: string; provenance: string[] }>;\n}>(\n entries: T[],\n observationsFor: (entry: T) => Array<{ note: string; provenance: string[] }>,\n defaultNamespacePrefix: string | null,\n): T[] {\n return entries.flatMap((entry) => {\n const visible = observationsFor(entry).filter((item) =>\n provenanceVisibleInStoreRecall(item.provenance, defaultNamespacePrefix),\n );\n if (visible.length === 0) return [];\n return [{\n ...entry,\n observations: visible.map((item) => item.note),\n provenance: [...new Set(visible.flatMap((item) => item.provenance))],\n observationEntries: visible,\n }];\n });\n}\n\n/**\n * The mistake registry keeps 500 patterns. Store-visible action failures stay\n * ahead of correction text, and every visible pattern stays ahead of another\n * namespace, so a full correction week cannot drop the caller's own outcomes.\n */\nexport function capWeeklyPatternDetails<T extends { pattern: string; provenance: readonly string[] }>(\n details: readonly T[],\n categoryFor: (pattern: string) => string | undefined,\n defaultNamespacePrefix: string | null,\n limit = 500,\n): T[] {\n const visibleActions: T[] = [];\n const visibleOther: T[] = [];\n const foreign: T[] = [];\n for (const detail of details) {\n if (!provenanceVisibleInStoreRecall(detail.provenance, defaultNamespacePrefix)) {\n foreign.push(detail);\n continue;\n }\n if (categoryFor(detail.pattern) === \"action\") visibleActions.push(detail);\n else visibleOther.push(detail);\n }\n return [...visibleActions, ...visibleOther, ...foreign].slice(0, limit);\n}\n\n/**\n * Active correction mistakes whose visible source files are all missing or\n * non-active. The next synthesis retires those registry entries immediately.\n * Every active correction entry is checked. The weekly pattern cap and the\n * retirement window already bound how many of those entries exist.\n */\nexport async function forgottenCorrectionPatterns(\n storage: WeeklyEvidenceStorage,\n memoryDir: string,\n registry: ReadonlyArray<{ category?: string; status?: string; pattern: string; provenance?: readonly string[] }>,\n defaultNamespacePrefix: string | null,\n): Promise<Set<string>> {\n const out = new Set<string>();\n for (const entry of registry) {\n if (entry.category !== \"correction\" || entry.status !== \"active\") continue;\n const visible = (entry.provenance ?? []).filter((item) =>\n provenanceVisibleInStoreRecall([item], defaultNamespacePrefix),\n );\n if (visible.length === 0) continue;\n let stillActive = false;\n for (const rel of visible) {\n if (rel.includes(\"..\") || path.isAbsolute(rel)) {\n stillActive = true;\n break;\n }\n let memory: MemoryFile | null;\n try {\n memory = await storage.readMemoryByPath(path.join(memoryDir, rel));\n } catch {\n stillActive = true;\n break;\n }\n if (!memory) {\n // readMemoryByPath returns null for a missing file and for a read\n // or decrypt failure. Only a confirmed absence can retire the lesson.\n const sourcePath = path.join(memoryDir, rel);\n try {\n await lstat(sourcePath);\n stillActive = true;\n break;\n } catch (err) {\n if (!isErrnoCode(err, \"ENOENT\")) {\n stillActive = true;\n break;\n }\n }\n continue;\n }\n const raw = readRawMemoryDocument(memory);\n const status = raw ? rawFrontmatterScalar(raw, \"status\") : undefined;\n if (!status || status === \"active\") {\n stillActive = true;\n break;\n }\n }\n if (!stillActive) out.add(entry.pattern);\n }\n return out;\n}\n\nexport function provenanceVisibleInStoreRecall(\n provenance: readonly string[],\n defaultNamespacePrefix: string | null = null,\n): boolean {\n return provenance.length === 0 || provenance.some((item) => {\n if (!item.startsWith(\"namespaces/\")) return true;\n return defaultNamespacePrefix !== null && item.startsWith(defaultNamespacePrefix);\n });\n}\n\n/** Ledger rows that belong to the flat root or the routed default namespace. */\nexport function actionEventsVisibleInStore<T extends { ledgerLabel: string; line: number }>(\n events: readonly T[],\n defaultNamespacePrefix: string | null,\n): T[] {\n return events.filter((event) =>\n provenanceVisibleInStoreRecall([`${event.ledgerLabel}:L${event.line}`], defaultNamespacePrefix),\n );\n}\n\nfunction collapseWhitespace(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nfunction rawConfidence(raw: string): number | null {\n const text = rawFrontmatterScalar(raw, \"confidence\");\n if (!text) return null;\n const value = Number(text);\n if (!Number.isFinite(value)) return null;\n return Math.max(0, Math.min(1, value));\n}\n\n/** Top-level frontmatter scalar. Missing keys stay missing — parser defaults are not used. */\nfunction rawFrontmatterScalar(raw: string, key: string): string | undefined {\n const newline = raw.startsWith(\"---\\r\\n\") ? 5 : raw.startsWith(\"---\\n\") ? 4 : -1;\n if (newline < 0) return undefined;\n const headerEnd = raw.indexOf(\"\\n---\", newline);\n if (headerEnd < 0) return undefined;\n const block = raw.slice(newline, headerEnd);\n const prefix = `${key}:`;\n for (const line of block.split(\"\\n\")) {\n const normalized = line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n if (normalized.startsWith(\" \") || normalized.startsWith(\"\\t\")) continue;\n if (!normalized.startsWith(prefix)) continue;\n let value = normalized.slice(prefix.length).trim();\n if (value.length >= 2) {\n const quote = value[0];\n if ((quote === '\"' || quote === \"'\") && value.endsWith(quote)) {\n value = value.slice(1, -1);\n }\n }\n return value.length > 0 ? value : undefined;\n }\n return undefined;\n}\n"],"mappings":"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","names":["readFile","readdir","path","DAY_MS","limit","path","readFile","readdir"]}