@remnic/core 9.69.22 → 9.69.24

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 (772) hide show
  1. package/dist/abstraction-nodes.js +3 -2
  2. package/dist/access-admin-ops-surface.d.ts +14 -12
  3. package/dist/access-admin-ops-surface.js +94 -91
  4. package/dist/access-authorization-probe.d.ts +14 -12
  5. package/dist/access-authorization-probe.js +95 -92
  6. package/dist/access-boundary.d.ts +14 -12
  7. package/dist/access-boundary.js +94 -91
  8. package/dist/access-citation-namespace.js +3 -3
  9. package/dist/access-cli.js +200 -195
  10. package/dist/access-cli.js.map +1 -1
  11. package/dist/access-coding-context-resolution.d.ts +2 -1
  12. package/dist/access-extraction-force-flush.d.ts +14 -12
  13. package/dist/access-extraction-force-flush.js +94 -91
  14. package/dist/access-health-types.d.ts +2 -1
  15. package/dist/access-http-briefing.d.ts +156 -0
  16. package/dist/access-http-briefing.js +233 -0
  17. package/dist/access-http-lcm-compaction.d.ts +14 -12
  18. package/dist/access-http-lifecycle-flush.d.ts +14 -12
  19. package/dist/access-http-offline-stream.d.ts +14 -12
  20. package/dist/access-http-query.d.ts +3 -2
  21. package/dist/access-http-query.js +96 -93
  22. package/dist/access-http.d.ts +15 -13
  23. package/dist/access-http.js +119 -114
  24. package/dist/access-identity-continuity-surface.d.ts +12 -10
  25. package/dist/access-identity-continuity-surface.js +94 -91
  26. package/dist/access-lcm-surface.d.ts +14 -12
  27. package/dist/access-lcm-surface.js +94 -91
  28. package/dist/access-mcp.d.ts +14 -12
  29. package/dist/access-mcp.js +105 -101
  30. package/dist/access-memory-search-fanout.d.ts +3 -2
  31. package/dist/{access-namespace-preflight-BMHhxoL9.d.ts → access-namespace-preflight-BsvmyENS.d.ts} +1 -1
  32. package/dist/access-namespace-preflight.d.ts +4 -3
  33. package/dist/access-namespace-preflight.js +94 -91
  34. package/dist/access-observe-transcript.d.ts +12 -10
  35. package/dist/access-observe-write-surface.d.ts +14 -12
  36. package/dist/access-observe-write-surface.js +94 -91
  37. package/dist/access-offline-manifest.d.ts +12 -10
  38. package/dist/access-offline-manifest.js +15 -15
  39. package/dist/access-operations-batch.js +99 -95
  40. package/dist/access-operations.d.ts +14 -12
  41. package/dist/access-operations.js +104 -100
  42. package/dist/access-recall-concurrency.d.ts +14 -12
  43. package/dist/access-recall-concurrency.js +94 -91
  44. package/dist/access-recall-response.d.ts +14 -12
  45. package/dist/access-recall-response.js +94 -91
  46. package/dist/access-recall-surface.d.ts +14 -12
  47. package/dist/access-recall-surface.js +94 -91
  48. package/dist/access-schema.js +8 -7
  49. package/dist/{access-service-BlsNXFwx.d.ts → access-service-DWdY9Mlk.d.ts} +7 -7
  50. package/dist/access-service-helpers.d.ts +14 -12
  51. package/dist/access-service.d.ts +14 -12
  52. package/dist/access-service.js +94 -91
  53. package/dist/access-surface-catalog.d.ts +14 -12
  54. package/dist/access-surface-catalog.js +97 -93
  55. package/dist/access-surface-catalog.js.map +1 -1
  56. package/dist/access-wearables-meetings-surface.d.ts +4 -3
  57. package/dist/action-confidence.d.ts +2 -1
  58. package/dist/active-memory-bridge.d.ts +2 -1
  59. package/dist/active-recall.d.ts +2 -1
  60. package/dist/active-recall.js +16 -13
  61. package/dist/active-recall.js.map +1 -1
  62. package/dist/adapters/index.js +7 -7
  63. package/dist/adapters/registry.js +3 -3
  64. package/dist/ambient-provenance.d.ts +2 -1
  65. package/dist/artifact-search.d.ts +2 -1
  66. package/dist/{auto-sync-GRUJFD2F.js → auto-sync-WNGG2GC2.js} +9 -9
  67. package/dist/behavior-learner.d.ts +2 -1
  68. package/dist/behavior-signals.d.ts +2 -1
  69. package/dist/bootstrap.d.ts +12 -10
  70. package/dist/briefing-window.d.ts +3 -2
  71. package/dist/briefing.d.ts +3 -2
  72. package/dist/briefing.js +36 -36
  73. package/dist/buffer-surprise-report.d.ts +2 -1
  74. package/dist/buffer-turn-helpers.d.ts +2 -1
  75. package/dist/buffer.d.ts +3 -2
  76. package/dist/buffer.js +13 -13
  77. package/dist/bulk-import/index.d.ts +4 -3
  78. package/dist/calibration.d.ts +2 -1
  79. package/dist/calibration.js +2 -1
  80. package/dist/calibration.js.map +1 -1
  81. package/dist/capabilities.d.ts +2 -1
  82. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  83. package/dist/{capsule-merge-SEHERWWP.js → capsule-merge-IPG4IOFP.js} +5 -5
  84. package/dist/{catalog-C1qHsGew.d.ts → catalog-CDZLyiXL.d.ts} +1 -1
  85. package/dist/causal-behavior.d.ts +2 -1
  86. package/dist/causal-behavior.js +4 -3
  87. package/dist/causal-behavior.js.map +1 -1
  88. package/dist/causal-chain.js +4 -3
  89. package/dist/causal-consolidation.d.ts +2 -1
  90. package/dist/causal-consolidation.js +42 -42
  91. package/dist/causal-retrieval.js +4 -3
  92. package/dist/causal-retrieval.js.map +1 -1
  93. package/dist/causal-trajectory-graph.d.ts +5 -2
  94. package/dist/causal-trajectory-graph.js +6 -2
  95. package/dist/causal-trajectory-graph.js.map +1 -1
  96. package/dist/causal-trajectory.js +3 -2
  97. package/dist/{chunk-KTVSPFCQ.js → chunk-22FVR2KE.js} +2 -2
  98. package/dist/{chunk-7Y5V3LAP.js → chunk-27QVNSQ3.js} +2 -2
  99. package/dist/{chunk-R7LY4YKF.js → chunk-2EKJDQZB.js} +2 -2
  100. package/dist/{chunk-FCATYKQA.js → chunk-2IOHTUP3.js} +263 -13
  101. package/dist/chunk-2IOHTUP3.js.map +1 -0
  102. package/dist/{chunk-HOUST5UX.js → chunk-2ITE4C2Z.js} +2 -2
  103. package/dist/{chunk-JOYC4RYC.js → chunk-2JVJ7UHC.js} +2 -2
  104. package/dist/{chunk-X2NFFBTO.js → chunk-2L5FSNPC.js} +7 -7
  105. package/dist/{chunk-DUAJKRR2.js → chunk-2SGLMP2E.js} +2 -2
  106. package/dist/{chunk-6FUMA6AA.js → chunk-2Z4GS5E6.js} +2 -2
  107. package/dist/{chunk-G6MXN2G5.js → chunk-37KUQPX4.js} +6 -6
  108. package/dist/{chunk-DDQQY2E3.js → chunk-3BTFBQLO.js} +7 -7
  109. package/dist/chunk-3BTFBQLO.js.map +1 -0
  110. package/dist/{chunk-UR6PBX2J.js → chunk-3K7V3HE6.js} +35 -60
  111. package/dist/chunk-3K7V3HE6.js.map +1 -0
  112. package/dist/{chunk-WKAXBXVA.js → chunk-3QQTXYZ6.js} +2 -2
  113. package/dist/{chunk-DJUKBGAD.js → chunk-46EST7JO.js} +5 -5
  114. package/dist/chunk-46EST7JO.js.map +1 -0
  115. package/dist/{chunk-4ZWCQJNM.js → chunk-46WM6JX2.js} +5 -5
  116. package/dist/{chunk-CASWJ2HM.js → chunk-46ZPIGWI.js} +3 -3
  117. package/dist/{chunk-HTIIXNJQ.js → chunk-4FIH6MPS.js} +6 -3
  118. package/dist/chunk-4FIH6MPS.js.map +1 -0
  119. package/dist/{chunk-MCA2X4WH.js → chunk-4IHBN6WU.js} +2 -2
  120. package/dist/{chunk-W7IGLX4G.js → chunk-4O6WRBGE.js} +7 -7
  121. package/dist/chunk-4O6WRBGE.js.map +1 -0
  122. package/dist/{chunk-FB7LAJQM.js → chunk-4TKJGOCJ.js} +2 -2
  123. package/dist/{chunk-H7BZBSP6.js → chunk-52II7PB6.js} +4 -4
  124. package/dist/{chunk-N4Y5T6VD.js → chunk-54WHLA65.js} +4 -4
  125. package/dist/chunk-56Y6EKZN.js +24 -0
  126. package/dist/chunk-56Y6EKZN.js.map +1 -0
  127. package/dist/{chunk-YVLENSNS.js → chunk-5ATKSPEQ.js} +2 -2
  128. package/dist/{chunk-OLT3YTDH.js → chunk-5FAGCOZD.js} +37 -24
  129. package/dist/chunk-5FAGCOZD.js.map +1 -0
  130. package/dist/{chunk-ZVZHG7AI.js → chunk-5UBH37SL.js} +3 -3
  131. package/dist/{chunk-N3WZU76A.js → chunk-66OJSCI6.js} +2 -2
  132. package/dist/{chunk-D35XLYQ7.js → chunk-6CVNSDCZ.js} +11 -11
  133. package/dist/{chunk-KA2HZCMG.js → chunk-6NXSYYGP.js} +2 -2
  134. package/dist/{chunk-2HIJHXB3.js → chunk-6WHJ2EAB.js} +2 -2
  135. package/dist/{chunk-ZZM476NV.js → chunk-6XL73HQ4.js} +4 -4
  136. package/dist/{chunk-EJ5RKUXW.js → chunk-AQ7SYDVO.js} +2 -2
  137. package/dist/{chunk-2Z3DG5CQ.js → chunk-B3O3IRZN.js} +2 -2
  138. package/dist/{chunk-P77QX3ID.js → chunk-B6O2YLUR.js} +21 -20
  139. package/dist/chunk-B6O2YLUR.js.map +1 -0
  140. package/dist/{chunk-RACZB5HT.js → chunk-BD7JTBYP.js} +4 -4
  141. package/dist/{chunk-I762GW7V.js → chunk-BLJWYCNO.js} +5 -5
  142. package/dist/{chunk-ACPCA4NO.js → chunk-BMWN7B3Y.js} +6 -6
  143. package/dist/chunk-BMWN7B3Y.js.map +1 -0
  144. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  145. package/dist/{chunk-KK66P5GQ.js → chunk-C553ZTLF.js} +46 -48
  146. package/dist/chunk-C553ZTLF.js.map +1 -0
  147. package/dist/{chunk-GCASGYIO.js → chunk-C7HJ3NEI.js} +2 -2
  148. package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
  149. package/dist/{chunk-WVGXCBOC.js → chunk-D5F7TKMH.js} +2 -2
  150. package/dist/chunk-DGS34QSY.js +141 -0
  151. package/dist/chunk-DGS34QSY.js.map +1 -0
  152. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  153. package/dist/{chunk-2OXIPF3A.js → chunk-DZD3WGCD.js} +4 -4
  154. package/dist/{chunk-UMEOXLIZ.js → chunk-E2P7TZTF.js} +5 -5
  155. package/dist/{chunk-6FC3IZ26.js → chunk-EBA5DA77.js} +2 -2
  156. package/dist/{chunk-N7JK2RKG.js → chunk-EOQ6FSQP.js} +2 -2
  157. package/dist/chunk-EUT2WCWS.js +54 -0
  158. package/dist/chunk-EUT2WCWS.js.map +1 -0
  159. package/dist/{chunk-YNDLCWXS.js → chunk-EZ25VE3G.js} +4 -4
  160. package/dist/{chunk-XDMI5VKE.js → chunk-FVOP3NT7.js} +2 -2
  161. package/dist/{chunk-NRLELHAY.js → chunk-G7NYVKD6.js} +2 -2
  162. package/dist/{chunk-B3W7GWQB.js → chunk-GHTSNGBZ.js} +2 -2
  163. package/dist/chunk-GKCXTSFF.js +17 -0
  164. package/dist/chunk-GKCXTSFF.js.map +1 -0
  165. package/dist/{chunk-LUDBXTBJ.js → chunk-H272ZPQ3.js} +5 -5
  166. package/dist/{chunk-SN4JXNLL.js → chunk-H3TKENU4.js} +2 -2
  167. package/dist/{chunk-4HYNMLT6.js → chunk-H4SEGIZY.js} +2 -2
  168. package/dist/{chunk-ACZN5ZXD.js → chunk-H54VWRPS.js} +13 -13
  169. package/dist/{chunk-HTP6XRUI.js → chunk-HM7RHKS4.js} +2 -2
  170. package/dist/{chunk-Z3SQEEB6.js → chunk-HWLIMQE2.js} +2 -2
  171. package/dist/{chunk-NQFCLAYT.js → chunk-ICKJ52PE.js} +99 -322
  172. package/dist/chunk-ICKJ52PE.js.map +1 -0
  173. package/dist/{chunk-2QSZNTDO.js → chunk-JBPKEARU.js} +7 -7
  174. package/dist/{chunk-DK6GMO6D.js → chunk-JEC4DVM3.js} +16 -16
  175. package/dist/chunk-JEC4DVM3.js.map +1 -0
  176. package/dist/{chunk-ET2CNMLD.js → chunk-JN72EPOE.js} +2 -2
  177. package/dist/{chunk-U62OK7BB.js → chunk-JPKK466T.js} +188 -21
  178. package/dist/chunk-JPKK466T.js.map +1 -0
  179. package/dist/{chunk-JCCWJHOP.js → chunk-JYZSRNR7.js} +2 -2
  180. package/dist/{chunk-7D6HXODY.js → chunk-K7724CH2.js} +2 -2
  181. package/dist/{chunk-X33MJFD2.js → chunk-KAXCYM66.js} +3 -3
  182. package/dist/{chunk-7RRUHJPG.js → chunk-KB2G2I6Q.js} +3 -3
  183. package/dist/{chunk-ZXBTTMGZ.js → chunk-KEF46KL2.js} +5 -5
  184. package/dist/{chunk-5UZXUTVO.js → chunk-KNA3BXXL.js} +6 -2
  185. package/dist/chunk-KNA3BXXL.js.map +1 -0
  186. package/dist/{chunk-UWTDARPF.js → chunk-KTWG7CNY.js} +6 -6
  187. package/dist/{chunk-XQYTSZW3.js → chunk-L7Z57SID.js} +6 -6
  188. package/dist/{chunk-JMAG7WZ7.js → chunk-LO4UKPKX.js} +3 -3
  189. package/dist/{chunk-LDWIPYJ6.js → chunk-LS2FHUML.js} +3 -3
  190. package/dist/{chunk-GDB4J2H3.js → chunk-MPC7TYTZ.js} +2 -2
  191. package/dist/{chunk-2GF27PGH.js → chunk-MRPOZBJC.js} +3 -3
  192. package/dist/{chunk-BR3OOQZQ.js → chunk-MWN6QEI2.js} +2 -2
  193. package/dist/{chunk-NZGO2GKL.js → chunk-MY5EDR46.js} +4 -4
  194. package/dist/{chunk-LCMUZDBZ.js → chunk-N3ZOP7KC.js} +3 -3
  195. package/dist/{chunk-TVW4C7PV.js → chunk-NB3LRY4T.js} +6 -6
  196. package/dist/{chunk-QJCWK2A7.js → chunk-ND6IQGSZ.js} +2 -2
  197. package/dist/{chunk-NOB2T2FC.js → chunk-NHLLKEKK.js} +2 -2
  198. package/dist/{chunk-7GSSHAXC.js → chunk-NLYVH66G.js} +6 -6
  199. package/dist/chunk-NLYVH66G.js.map +1 -0
  200. package/dist/{chunk-EJIWBTVM.js → chunk-O6ZNNVSP.js} +2 -2
  201. package/dist/{chunk-AG46P24C.js → chunk-OB3XMWX5.js} +4 -4
  202. package/dist/{chunk-NYRB7BKY.js → chunk-OEYZXDQI.js} +6 -6
  203. package/dist/chunk-OEYZXDQI.js.map +1 -0
  204. package/dist/{chunk-46QMN7I7.js → chunk-PAZY2ZKP.js} +6 -6
  205. package/dist/{chunk-EF4JUM55.js → chunk-PX4UMA5Z.js} +2 -2
  206. package/dist/chunk-QLK3SL7Q.js +242 -0
  207. package/dist/chunk-QLK3SL7Q.js.map +1 -0
  208. package/dist/{chunk-GGYDJJBO.js → chunk-QOOBICJF.js} +5 -5
  209. package/dist/chunk-QOOBICJF.js.map +1 -0
  210. package/dist/{chunk-NNZFPYYX.js → chunk-R7QY5ZVB.js} +2 -2
  211. package/dist/{chunk-RO2X2EYM.js → chunk-R7RTXEYG.js} +2 -2
  212. package/dist/{chunk-3LJPSRAN.js → chunk-RBCQVOVJ.js} +3 -3
  213. package/dist/{chunk-N4F7ZSSG.js → chunk-RC5DXXWC.js} +2 -2
  214. package/dist/{chunk-VLAQV4HT.js → chunk-RJYJ7KR7.js} +1636 -611
  215. package/dist/chunk-RJYJ7KR7.js.map +1 -0
  216. package/dist/{chunk-5CF2R4NS.js → chunk-RKBLRTNT.js} +2 -2
  217. package/dist/{chunk-5QZR2RA3.js → chunk-ROBHL3GL.js} +2 -2
  218. package/dist/{chunk-D5ZNOKR7.js → chunk-S7T2TY65.js} +3 -3
  219. package/dist/{chunk-C2JCVZWX.js → chunk-SCXURCVT.js} +25 -13
  220. package/dist/chunk-SCXURCVT.js.map +1 -0
  221. package/dist/{chunk-3LADWWMA.js → chunk-SJDQ5RSN.js} +3 -3
  222. package/dist/{chunk-45XVII3J.js → chunk-SMWTZLHE.js} +99 -89
  223. package/dist/{chunk-45XVII3J.js.map → chunk-SMWTZLHE.js.map} +1 -1
  224. package/dist/{chunk-XOQGUGJL.js → chunk-SO7SV523.js} +1 -1
  225. package/dist/{chunk-XOQGUGJL.js.map → chunk-SO7SV523.js.map} +1 -1
  226. package/dist/{chunk-CHWUICVY.js → chunk-SV4Z2S67.js} +4 -4
  227. package/dist/{chunk-JHP45LO5.js → chunk-SVXJLDDC.js} +9 -7
  228. package/dist/{chunk-JHP45LO5.js.map → chunk-SVXJLDDC.js.map} +1 -1
  229. package/dist/{chunk-SEF4IOFE.js → chunk-SWIKABKI.js} +2 -2
  230. package/dist/{chunk-JRRQ747T.js → chunk-TBXAY2SS.js} +13 -13
  231. package/dist/{chunk-J6A3CX5N.js → chunk-TG3FAM2S.js} +33 -8
  232. package/dist/{chunk-J6A3CX5N.js.map → chunk-TG3FAM2S.js.map} +1 -1
  233. package/dist/{chunk-XZBXINXZ.js → chunk-TNSCIPBQ.js} +4 -4
  234. package/dist/{chunk-S37NN23M.js → chunk-TVEONGBU.js} +2 -2
  235. package/dist/{chunk-5RPMTFB6.js → chunk-TWF35IC6.js} +3 -3
  236. package/dist/{chunk-BZTJEILZ.js → chunk-U6N5IBVY.js} +2 -2
  237. package/dist/{chunk-7TUB6JWA.js → chunk-UCKYTA2T.js} +3 -3
  238. package/dist/{chunk-PPOT6SPR.js → chunk-UNNPNBR2.js} +11 -11
  239. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  240. package/dist/{chunk-J2R275FN.js → chunk-VVX5PZFS.js} +4 -4
  241. package/dist/{chunk-ME35HVDJ.js → chunk-VYCOJKSX.js} +2 -2
  242. package/dist/{chunk-F5UWQ4LX.js → chunk-W24T5YMW.js} +2 -2
  243. package/dist/{chunk-HDQUQBPW.js → chunk-W3K3HITK.js} +2 -2
  244. package/dist/{chunk-GDASG7NC.js → chunk-W4F3C7N7.js} +2 -2
  245. package/dist/{chunk-LFK623SF.js → chunk-WJHGDE7X.js} +5 -5
  246. package/dist/{chunk-DP4EBV7C.js → chunk-WMLEPWMO.js} +16 -16
  247. package/dist/chunk-WMLEPWMO.js.map +1 -0
  248. package/dist/{chunk-3Q6RD76J.js → chunk-WQZZDN5M.js} +5 -5
  249. package/dist/{chunk-ZJWDWPX6.js → chunk-X5K5TAQZ.js} +4 -4
  250. package/dist/{chunk-ZL3XX5LW.js → chunk-XM24CDZX.js} +3 -3
  251. package/dist/{chunk-JTWZKNUH.js → chunk-XOVKXJEP.js} +3 -3
  252. package/dist/{chunk-OGTKQ5MJ.js → chunk-XSGUMQQQ.js} +62 -50
  253. package/dist/chunk-XSGUMQQQ.js.map +1 -0
  254. package/dist/{chunk-X5YYSAZX.js → chunk-XUE46UYW.js} +3 -3
  255. package/dist/{chunk-DJORULH3.js → chunk-YRLHEEQT.js} +2 -2
  256. package/dist/{chunk-TA7UZZMW.js → chunk-Z3O53WZR.js} +2 -2
  257. package/dist/{chunk-4LG4CPOC.js → chunk-Z6COGHHN.js} +2 -2
  258. package/dist/{chunk-RE3H6Y2X.js → chunk-ZIW5JVRM.js} +2 -2
  259. package/dist/{cli-BNtvR-nU.d.ts → cli-DD0P-lu8.d.ts} +6 -6
  260. package/dist/cli.d.ts +16 -14
  261. package/dist/cli.js +154 -149
  262. package/dist/coding/export-okf-codegraph.d.ts +2 -1
  263. package/dist/coding/export-okf-codegraph.js +37 -37
  264. package/dist/coding/pre-action-gate.d.ts +2 -1
  265. package/dist/coding/pre-action-gate.js +4 -3
  266. package/dist/commitment-ledger.js +3 -2
  267. package/dist/compounding/engine.d.ts +3 -2
  268. package/dist/compounding/engine.js +37 -37
  269. package/dist/compounding/preference-consolidator.d.ts +2 -1
  270. package/dist/compression-optimizer.d.ts +2 -1
  271. package/dist/config.d.ts +2 -1
  272. package/dist/config.js +16 -13
  273. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  274. package/dist/connectors/codex-materialize-runner.js +38 -38
  275. package/dist/connectors/codex-materialize.d.ts +2 -1
  276. package/dist/connectors/codex-materialize.js +4 -4
  277. package/dist/connectors/index.d.ts +2 -1
  278. package/dist/connectors/index.js +38 -38
  279. package/dist/consolidation-provenance-check.d.ts +3 -2
  280. package/dist/consolidation-provenance-check.js +4 -4
  281. package/dist/consolidation-undo.d.ts +3 -2
  282. package/dist/consolidation-undo.js +3 -3
  283. package/dist/contradiction/index.d.ts +4 -3
  284. package/dist/contradiction/index.js +9 -9
  285. package/dist/converge-config.d.ts +2 -1
  286. package/dist/convergence-refresh.d.ts +3 -2
  287. package/dist/convergence-refresh.js +38 -38
  288. package/dist/conversation-index/backend.d.ts +2 -1
  289. package/dist/conversation-index/chunker.d.ts +2 -1
  290. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  291. package/dist/conversation-index/indexer.d.ts +2 -1
  292. package/dist/conversation-index/search.d.ts +2 -1
  293. package/dist/corpus-watermark.d.ts +2 -1
  294. package/dist/corpus-watermark.js +38 -38
  295. package/dist/cross-lingual-recall.d.ts +2 -1
  296. package/dist/cue-anchors.js +4 -3
  297. package/dist/dashboard-runtime.js +2 -2
  298. package/dist/day-summary.d.ts +2 -1
  299. package/dist/deep-recall-http-glue.d.ts +14 -12
  300. package/dist/deep-recall-http-glue.js +9 -8
  301. package/dist/deep-recall-mcp-tools.d.ts +14 -12
  302. package/dist/deep-recall-policy-llm.d.ts +2 -1
  303. package/dist/deep-recall-seeds.d.ts +2 -1
  304. package/dist/deep-recall.js +2 -2
  305. package/dist/delinearize.d.ts +2 -1
  306. package/dist/dependency-propagation-config.d.ts +2 -1
  307. package/dist/{dependency-propagation-delivery-DjpUlhLi.d.ts → dependency-propagation-delivery-CQPCu0o5.d.ts} +1 -1
  308. package/dist/direct-answer-wiring.d.ts +2 -1
  309. package/dist/direct-answer.d.ts +2 -1
  310. package/dist/embedding-fallback.d.ts +2 -1
  311. package/dist/enrichment/index.d.ts +2 -1
  312. package/dist/entity-origin-fields.d.ts +2 -1
  313. package/dist/entity-retrieval.d.ts +3 -2
  314. package/dist/entity-retrieval.js +36 -36
  315. package/dist/entity-schema.d.ts +2 -1
  316. package/dist/episodic-context.d.ts +2 -1
  317. package/dist/eval-trajectory-contracts.d.ts +2 -1
  318. package/dist/eval-trajectory-store.d.ts +2 -1
  319. package/dist/eval-trajectory-store.js +4 -3
  320. package/dist/eval-trajectory.d.ts +2 -1
  321. package/dist/eval-trajectory.js +4 -3
  322. package/dist/evals.js +3 -2
  323. package/dist/event-order-recall.js +2 -2
  324. package/dist/explicit-capture.d.ts +12 -10
  325. package/dist/explicit-capture.js +10 -10
  326. package/dist/external-wiki-access.d.ts +14 -12
  327. package/dist/external-wiki-access.js +95 -92
  328. package/dist/external-wiki-collection-registration.d.ts +2 -1
  329. package/dist/external-wiki-collection.d.ts +2 -1
  330. package/dist/external-wiki-mcp-tools.d.ts +14 -12
  331. package/dist/extraction-error-classification.d.ts +2 -1
  332. package/dist/extraction-faithfulness.d.ts +2 -1
  333. package/dist/extraction-judge-telemetry.d.ts +2 -1
  334. package/dist/extraction-judge-training.d.ts +2 -1
  335. package/dist/extraction-judge.d.ts +2 -1
  336. package/dist/extraction-liveness.d.ts +2 -1
  337. package/dist/extraction-normalization.d.ts +2 -1
  338. package/dist/extraction-prompt.d.ts +2 -1
  339. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  340. package/dist/extraction-source-grounding.d.ts +2 -1
  341. package/dist/extraction.d.ts +2 -1
  342. package/dist/extraction.js +43 -43
  343. package/dist/fallback-llm.d.ts +2 -1
  344. package/dist/{first-start-migration-KHIMCBIC.js → first-start-migration-RC345GPL.js} +6 -5
  345. package/dist/{first-start-migration-KHIMCBIC.js.map → first-start-migration-RC345GPL.js.map} +1 -1
  346. package/dist/{forget-2AE4MDK3.js → forget-SZ2BXDGF.js} +3 -3
  347. package/dist/{graph-444E-DrF.d.ts → graph-DRkl22KE.d.ts} +10 -12
  348. package/dist/graph-append-error.d.ts +40 -0
  349. package/dist/graph-append-error.js +8 -0
  350. package/dist/graph-dashboard-diff.d.ts +5 -2
  351. package/dist/graph-dashboard-key.d.ts +5 -2
  352. package/dist/graph-dashboard-parser.d.ts +5 -2
  353. package/dist/{graph-edge-decay-DGTBFALQ.js → graph-edge-decay-MKIRZ762.js} +10 -4
  354. package/dist/graph-edge-decay-MKIRZ762.js.map +1 -0
  355. package/dist/graph-edge-reinforcement.d.ts +5 -2
  356. package/dist/graph-jsonl.d.ts +82 -0
  357. package/dist/graph-jsonl.js +23 -0
  358. package/dist/graph-jsonl.js.map +1 -0
  359. package/dist/graph-path-reconstruction.d.ts +5 -2
  360. package/dist/graph-path-scoring.d.ts +5 -2
  361. package/dist/graph-snapshot.d.ts +5 -2
  362. package/dist/graph-snapshot.js +7 -3
  363. package/dist/graph-write-lock.d.ts +84 -0
  364. package/dist/graph-write-lock.js +15 -0
  365. package/dist/graph-write-lock.js.map +1 -0
  366. package/dist/graph.d.ts +5 -2
  367. package/dist/graph.js +10 -3
  368. package/dist/harmonic-construction.js +5 -4
  369. package/dist/harmonic-retrieval.js +5 -4
  370. package/dist/importance.d.ts +2 -1
  371. package/dist/importers/index.d.ts +2 -1
  372. package/dist/in-flight-reads.d.ts +2 -1
  373. package/dist/{index-CsUrdMyL.d.ts → index-C9VXenR8.d.ts} +2 -2
  374. package/dist/index.d.ts +39 -25
  375. package/dist/index.js +291 -284
  376. package/dist/intent.d.ts +2 -1
  377. package/dist/json-store.js +2 -1
  378. package/dist/lcm/engine.d.ts +2 -1
  379. package/dist/lcm/engine.js +3 -3
  380. package/dist/lcm/index.d.ts +2 -1
  381. package/dist/lcm/index.js +6 -6
  382. package/dist/lcm/tools.d.ts +2 -1
  383. package/dist/lifecycle.d.ts +2 -1
  384. package/dist/live-connectors-runner.d.ts +2 -1
  385. package/dist/live-connectors-runner.js +3 -2
  386. package/dist/local-llm.d.ts +2 -1
  387. package/dist/local-model-endpoint.d.ts +2 -1
  388. package/dist/location/index.d.ts +4 -3
  389. package/dist/location/index.js +39 -39
  390. package/dist/maintenance/memory-governance.d.ts +2 -1
  391. package/dist/maintenance/memory-governance.js +36 -36
  392. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +3 -2
  393. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +36 -36
  394. package/dist/maintenance/rebuild-memory-projection.d.ts +3 -2
  395. package/dist/maintenance/rebuild-memory-projection.js +37 -37
  396. package/dist/{maintenance-D1GRGLTE.d.ts → maintenance-C14sorKa.d.ts} +3 -3
  397. package/dist/mcp-memory-inspector-app.d.ts +14 -12
  398. package/dist/memory-action-policy.d.ts +2 -1
  399. package/dist/memory-cache.d.ts +2 -1
  400. package/dist/memory-controller.d.ts +2 -1
  401. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  402. package/dist/memory-projection-mutations.js +3 -3
  403. package/dist/memory-projection-store.d.ts +2 -1
  404. package/dist/memory-provenance.d.ts +2 -1
  405. package/dist/memory-snapshot.d.ts +2 -1
  406. package/dist/memory-subject-cli.d.ts +14 -12
  407. package/dist/memory-subject.d.ts +14 -12
  408. package/dist/memory-subject.js +5 -5
  409. package/dist/memory-worth-outcomes.d.ts +3 -2
  410. package/dist/models-json.d.ts +2 -1
  411. package/dist/namespaces/migrate.d.ts +4 -3
  412. package/dist/namespaces/migrate.js +37 -37
  413. package/dist/namespaces/principal.d.ts +2 -1
  414. package/dist/namespaces/search.d.ts +2 -1
  415. package/dist/namespaces/search.js +11 -11
  416. package/dist/namespaces/storage.d.ts +4 -3
  417. package/dist/namespaces/storage.js +36 -36
  418. package/dist/native-knowledge.d.ts +2 -1
  419. package/dist/objective-state-writers.js +4 -3
  420. package/dist/objective-state.js +3 -2
  421. package/dist/offline-sync-file-io.js +4 -3
  422. package/dist/offline-sync-impression-drain.d.ts +2 -1
  423. package/dist/offline-sync-impression-drain.js +7 -7
  424. package/dist/offline-sync.js +5 -4
  425. package/dist/operator-doctor-corpus.d.ts +2 -1
  426. package/dist/operator-doctor-corpus.js +39 -39
  427. package/dist/operator-doctor-replica.d.ts +2 -1
  428. package/dist/operator-toolkit.d.ts +6 -4
  429. package/dist/operator-toolkit.js +61 -58
  430. package/dist/orchestration/compression-guideline-coordinator.d.ts +3 -2
  431. package/dist/orchestration/maintenance.d.ts +5 -4
  432. package/dist/orchestration/maintenance.js +46 -46
  433. package/dist/{orchestrator-DeqaPGT5.d.ts → orchestrator-DgyvFfPR.d.ts} +9 -9
  434. package/dist/orchestrator.d.ts +12 -10
  435. package/dist/orchestrator.js +201 -196
  436. package/dist/page-versioning.d.ts +73 -4
  437. package/dist/page-versioning.js +11 -3
  438. package/dist/patterns-cli.d.ts +2 -1
  439. package/dist/{pipeline-umUzU0D1.d.ts → pipeline-DRUwHb1X.d.ts} +1 -1
  440. package/dist/policy-runtime.d.ts +2 -1
  441. package/dist/proactive-contention.d.ts +2 -1
  442. package/dist/provenance.d.ts +2 -1
  443. package/dist/{public-http-Bevrjll9.d.ts → public-http-C4i8Opxc.d.ts} +1 -1
  444. package/dist/{purge-OP6BEDFY.js → purge-TZKRE6ZQ.js} +5 -5
  445. package/dist/purge-TZKRE6ZQ.js.map +1 -0
  446. package/dist/{qmd-BasT78PP.d.ts → qmd-BVWlg1YS.d.ts} +1 -1
  447. package/dist/qmd-preflight.d.ts +3 -2
  448. package/dist/qmd-recall-cache.d.ts +2 -1
  449. package/dist/qmd.d.ts +3 -2
  450. package/dist/qmd.js +4 -4
  451. package/dist/recall-concurrency-config.d.ts +2 -1
  452. package/dist/recall-disclosure-escalation.d.ts +2 -1
  453. package/dist/recall-explain-renderer.d.ts +2 -1
  454. package/dist/recall-explain-renderer.js +3 -3
  455. package/dist/recall-memory-map.d.ts +2 -1
  456. package/dist/recall-navigate-access.d.ts +2 -1
  457. package/dist/recall-navigate-access.js +2 -2
  458. package/dist/recall-navigate-disclosure.d.ts +2 -1
  459. package/dist/recall-navigate-disclosure.js +1 -1
  460. package/dist/recall-navigate.d.ts +2 -1
  461. package/dist/recall-navigate.js +2 -2
  462. package/dist/recall-planner-llm.d.ts +2 -1
  463. package/dist/recall-state.d.ts +2 -1
  464. package/dist/recall-state.js +3 -3
  465. package/dist/recall-tag-filter.d.ts +2 -1
  466. package/dist/recall-timings.d.ts +2 -1
  467. package/dist/recall-xray-cli.d.ts +2 -1
  468. package/dist/recall-xray-cli.js +4 -4
  469. package/dist/recall-xray-renderer.d.ts +2 -1
  470. package/dist/recall-xray-renderer.js +3 -3
  471. package/dist/recall-xray.d.ts +2 -1
  472. package/dist/recall-xray.js +2 -2
  473. package/dist/reconcile/cursor.d.ts +2 -1
  474. package/dist/reconcile/manifest.d.ts +2 -1
  475. package/dist/reconcile/manifest.js +7 -7
  476. package/dist/reconcile/plan.d.ts +2 -1
  477. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  478. package/dist/replay/normalizers/claude.d.ts +2 -1
  479. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  480. package/dist/replay/normalizers/shared.d.ts +2 -1
  481. package/dist/replay/runner.d.ts +2 -1
  482. package/dist/replay/types.d.ts +2 -1
  483. package/dist/replica-divergence.d.ts +2 -1
  484. package/dist/replica-peers-config.d.ts +2 -1
  485. package/dist/{resolution-4DLI3IOR.js → resolution-VKATP2HT.js} +10 -10
  486. package/dist/resolution-VKATP2HT.js.map +1 -0
  487. package/dist/resolve-auth-token.d.ts +2 -1
  488. package/dist/resume-bundles.js +21 -18
  489. package/dist/retrieval-agents.d.ts +3 -2
  490. package/dist/retrieval-tiers.d.ts +2 -1
  491. package/dist/routing/engine.d.ts +2 -1
  492. package/dist/routing/store.d.ts +2 -1
  493. package/dist/salvage-envelope.d.ts +2 -1
  494. package/dist/salvage-envelope.js +7 -7
  495. package/dist/{scope-profiles-DXYzyOXW.d.ts → scope-profiles-Vl00B1KU.d.ts} +1 -1
  496. package/dist/search/document-scanner.js +3 -3
  497. package/dist/search/embed-helper.d.ts +2 -1
  498. package/dist/search/factory.d.ts +2 -1
  499. package/dist/search/factory.js +10 -10
  500. package/dist/search/index.d.ts +2 -1
  501. package/dist/search/index.js +16 -16
  502. package/dist/search/lancedb-backend.d.ts +2 -1
  503. package/dist/search/lancedb-backend.js +4 -4
  504. package/dist/search/meilisearch-backend.d.ts +2 -1
  505. package/dist/search/meilisearch-backend.js +4 -4
  506. package/dist/search/noop-backend.d.ts +2 -1
  507. package/dist/search/orama-backend.d.ts +2 -1
  508. package/dist/search/orama-backend.js +4 -4
  509. package/dist/search/port.d.ts +2 -1
  510. package/dist/search/remote-backend.d.ts +2 -1
  511. package/dist/secure-store/index.js +3 -3
  512. package/dist/{semantic-consolidation-CqDeaY0U.d.ts → semantic-consolidation-BC9-GFuT.d.ts} +1 -1
  513. package/dist/semantic-consolidation.d.ts +3 -2
  514. package/dist/semantic-consolidation.js +39 -39
  515. package/dist/semantic-merge-config.d.ts +17 -0
  516. package/dist/semantic-merge-config.js +1 -0
  517. package/dist/semantic-merge-config.js.map +1 -0
  518. package/dist/semantic-rule-promotion.js +36 -36
  519. package/dist/semantic-rule-verifier.d.ts +2 -1
  520. package/dist/semantic-rule-verifier.js +36 -36
  521. package/dist/{service-BKD-DVYZ.d.ts → service-BOy6dHfc.d.ts} +2 -2
  522. package/dist/session-observer-bands.d.ts +2 -1
  523. package/dist/session-observer-state.d.ts +2 -1
  524. package/dist/shared-context/manager.d.ts +2 -1
  525. package/dist/signal.d.ts +2 -1
  526. package/dist/source-agent-qualifier.d.ts +2 -1
  527. package/dist/source-agent-qualifier.js +42 -42
  528. package/dist/source-attribution.d.ts +18 -6
  529. package/dist/source-attribution.js +3 -1
  530. package/dist/standup/build.js +36 -36
  531. package/dist/{storage-BcFd1lN_.d.ts → storage-BLJRnFi6.d.ts} +15 -8
  532. package/dist/storage.d.ts +3 -2
  533. package/dist/storage.js +35 -35
  534. package/dist/subject-config.d.ts +2 -1
  535. package/dist/subject-config.js +6 -6
  536. package/dist/summarizer.d.ts +2 -1
  537. package/dist/summary-snapshot.d.ts +2 -1
  538. package/dist/support-passport/index.d.ts +17 -15
  539. package/dist/support-passport/index.js +97 -94
  540. package/dist/temporal-supersession.d.ts +3 -2
  541. package/dist/temporal-timeline-recall.d.ts +2 -1
  542. package/dist/temporal-validity.d.ts +2 -1
  543. package/dist/threading.d.ts +2 -1
  544. package/dist/tier-migration.d.ts +3 -2
  545. package/dist/tier-routing.d.ts +2 -1
  546. package/dist/{tier-stats-2TOW3QNL.js → tier-stats-KA6OZX2C.js} +6 -5
  547. package/dist/{tier-stats-2TOW3QNL.js.map → tier-stats-KA6OZX2C.js.map} +1 -1
  548. package/dist/topics.d.ts +2 -1
  549. package/dist/transcript.d.ts +2 -1
  550. package/dist/transfer/backup.js +2 -2
  551. package/dist/transfer/capsule-export.js +2 -2
  552. package/dist/transfer/capsule-import.js +6 -6
  553. package/dist/transfer/export-okf.d.ts +2 -1
  554. package/dist/transfer/export-okf.js +37 -37
  555. package/dist/trust-score-stage.d.ts +2 -1
  556. package/dist/trust-score.d.ts +2 -1
  557. package/dist/trust-zones.js +3 -2
  558. package/dist/{types-BRg3tMyp.d.ts → types-YY-eKKU7.d.ts} +3 -0
  559. package/dist/types.d.ts +2 -1
  560. package/dist/types.js +1 -1
  561. package/dist/utility-learner.js +4 -3
  562. package/dist/utility-runtime.d.ts +2 -1
  563. package/dist/utility-runtime.js +5 -4
  564. package/dist/utility-telemetry.js +3 -2
  565. package/dist/verified-recall.js +36 -36
  566. package/dist/who-knows-cli.d.ts +14 -12
  567. package/dist/who-knows-cli.js +37 -37
  568. package/dist/who-knows.d.ts +14 -12
  569. package/dist/who-knows.js +36 -36
  570. package/dist/work/board.js +3 -3
  571. package/dist/work/storage.js +2 -2
  572. package/dist/work-product-ledger.js +3 -2
  573. package/dist/write-envelope.d.ts +2 -1
  574. package/dist/write-envelope.js +6 -6
  575. package/package.json +2 -2
  576. package/src/abstraction-nodes.ts +1 -4
  577. package/src/access-http-briefing.ts +35 -0
  578. package/src/access-http.test.ts +76 -0
  579. package/src/access-http.ts +20 -23
  580. package/src/access-surface-catalog.test.ts +9 -0
  581. package/src/access-surface-catalog.ts +1 -0
  582. package/src/binary-lifecycle/backend.ts +2 -1
  583. package/src/config.ts +2 -0
  584. package/src/connectors/live/github.ts +10 -17
  585. package/src/connectors/live/gmail.ts +8 -19
  586. package/src/connectors/live/google-drive.ts +6 -13
  587. package/src/connectors/live/notion.ts +11 -21
  588. package/src/cue-anchors.ts +1 -6
  589. package/src/dedup/connector-scope.ts +39 -0
  590. package/src/dedup/merge-content.test.ts +21 -0
  591. package/src/dedup/merge-content.ts +21 -7
  592. package/src/dedup/merge-judge.ts +146 -0
  593. package/src/dedup/merge.test.ts +3542 -0
  594. package/src/dedup/merge.ts +384 -0
  595. package/src/dedup/novelty-gate.ts +12 -10
  596. package/src/dedup/semantic.ts +7 -9
  597. package/src/graph-append-error.ts +28 -0
  598. package/src/graph-jsonl.ts +267 -0
  599. package/src/graph-write-lock.test.ts +228 -0
  600. package/src/graph-write-lock.ts +132 -0
  601. package/src/graph.ts +49 -45
  602. package/src/harmonic-construction.test.ts +329 -0
  603. package/src/json-store.ts +17 -20
  604. package/src/live-connectors-runner.ts +2 -1
  605. package/src/location/store.ts +1 -4
  606. package/src/maintenance/graph-edge-decay.ts +24 -13
  607. package/src/maintenance/purge.ts +2 -5
  608. package/src/maintenance/rebuild-memory-lifecycle-ledger.ts +3 -6
  609. package/src/maintenance/rebuild-memory-projection.ts +2 -5
  610. package/src/namespaces/catalog.ts +1 -9
  611. package/src/offline-sync-file-io.test.ts +39 -0
  612. package/src/offline-sync-file-io.ts +3 -7
  613. package/src/orchestration/contradiction-localization.integration.test.ts +35 -0
  614. package/src/orchestration/extraction-anchor-snapshot.ts +6 -1
  615. package/src/orchestration/extraction-persist-deps.ts +2 -1
  616. package/src/orchestration/extraction-persist-profile-promotion.test.ts +456 -0
  617. package/src/orchestration/extraction-persist-promotion.test.ts +534 -0
  618. package/src/orchestration/extraction-persist-promotion.ts +387 -1
  619. package/src/orchestration/extraction-persist.ts +95 -94
  620. package/src/orchestration/harmonic-construction-persist.test.ts +69 -0
  621. package/src/orchestration/harmonic-construction-persist.ts +55 -0
  622. package/src/orchestration/persistence-index.ts +35 -7
  623. package/src/orchestration/semantic-merge-commit-effects.ts +354 -0
  624. package/src/orchestration/semantic-merge-persist.ts +1095 -0
  625. package/src/orchestration/semantic-merge-promotion-payload.ts +161 -0
  626. package/src/orchestrator.ts +2 -2
  627. package/src/page-versioning.ts +396 -22
  628. package/src/procedural/procedure-miner.ts +1 -9
  629. package/src/search/document-scanner.ts +3 -6
  630. package/src/semantic-merge-config.ts +16 -0
  631. package/src/semantic-rule-promotion.ts +1 -4
  632. package/src/source-attribution-roundtrip.test.ts +21 -0
  633. package/src/source-attribution.ts +57 -17
  634. package/src/storage-contract/versioning.test.ts +500 -1
  635. package/src/storage.ts +30 -30
  636. package/src/testing/subjects/graph-edge-decay.test.ts +163 -0
  637. package/src/testing/subjects/semantic-merge-lifecycle.test.ts +1175 -0
  638. package/src/types.ts +2 -0
  639. package/src/utils/errno.test.ts +31 -0
  640. package/src/utils/errno.ts +5 -0
  641. package/src/wearables/index.ts +1 -0
  642. package/src/wearables/registry.ts +23 -0
  643. package/dist/chunk-5UZXUTVO.js.map +0 -1
  644. package/dist/chunk-7GSSHAXC.js.map +0 -1
  645. package/dist/chunk-ACPCA4NO.js.map +0 -1
  646. package/dist/chunk-C2JCVZWX.js.map +0 -1
  647. package/dist/chunk-DDQQY2E3.js.map +0 -1
  648. package/dist/chunk-DJUKBGAD.js.map +0 -1
  649. package/dist/chunk-DK6GMO6D.js.map +0 -1
  650. package/dist/chunk-DP4EBV7C.js.map +0 -1
  651. package/dist/chunk-FCATYKQA.js.map +0 -1
  652. package/dist/chunk-GGYDJJBO.js.map +0 -1
  653. package/dist/chunk-HTIIXNJQ.js.map +0 -1
  654. package/dist/chunk-KK66P5GQ.js.map +0 -1
  655. package/dist/chunk-NQFCLAYT.js.map +0 -1
  656. package/dist/chunk-NYRB7BKY.js.map +0 -1
  657. package/dist/chunk-OGTKQ5MJ.js.map +0 -1
  658. package/dist/chunk-OLT3YTDH.js.map +0 -1
  659. package/dist/chunk-P77QX3ID.js.map +0 -1
  660. package/dist/chunk-U62OK7BB.js.map +0 -1
  661. package/dist/chunk-UR6PBX2J.js.map +0 -1
  662. package/dist/chunk-VLAQV4HT.js.map +0 -1
  663. package/dist/chunk-W7IGLX4G.js.map +0 -1
  664. package/dist/purge-OP6BEDFY.js.map +0 -1
  665. /package/dist/{capsule-crypto-7FJQINUR.js.map → access-http-briefing.js.map} +0 -0
  666. /package/dist/{auto-sync-GRUJFD2F.js.map → auto-sync-WNGG2GC2.js.map} +0 -0
  667. /package/dist/{graph-edge-decay-DGTBFALQ.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  668. /package/dist/{capsule-merge-SEHERWWP.js.map → capsule-merge-IPG4IOFP.js.map} +0 -0
  669. /package/dist/{chunk-KTVSPFCQ.js.map → chunk-22FVR2KE.js.map} +0 -0
  670. /package/dist/{chunk-7Y5V3LAP.js.map → chunk-27QVNSQ3.js.map} +0 -0
  671. /package/dist/{chunk-R7LY4YKF.js.map → chunk-2EKJDQZB.js.map} +0 -0
  672. /package/dist/{chunk-HOUST5UX.js.map → chunk-2ITE4C2Z.js.map} +0 -0
  673. /package/dist/{chunk-JOYC4RYC.js.map → chunk-2JVJ7UHC.js.map} +0 -0
  674. /package/dist/{chunk-X2NFFBTO.js.map → chunk-2L5FSNPC.js.map} +0 -0
  675. /package/dist/{chunk-DUAJKRR2.js.map → chunk-2SGLMP2E.js.map} +0 -0
  676. /package/dist/{chunk-6FUMA6AA.js.map → chunk-2Z4GS5E6.js.map} +0 -0
  677. /package/dist/{chunk-G6MXN2G5.js.map → chunk-37KUQPX4.js.map} +0 -0
  678. /package/dist/{chunk-WKAXBXVA.js.map → chunk-3QQTXYZ6.js.map} +0 -0
  679. /package/dist/{chunk-4ZWCQJNM.js.map → chunk-46WM6JX2.js.map} +0 -0
  680. /package/dist/{chunk-CASWJ2HM.js.map → chunk-46ZPIGWI.js.map} +0 -0
  681. /package/dist/{chunk-MCA2X4WH.js.map → chunk-4IHBN6WU.js.map} +0 -0
  682. /package/dist/{chunk-FB7LAJQM.js.map → chunk-4TKJGOCJ.js.map} +0 -0
  683. /package/dist/{chunk-H7BZBSP6.js.map → chunk-52II7PB6.js.map} +0 -0
  684. /package/dist/{chunk-N4Y5T6VD.js.map → chunk-54WHLA65.js.map} +0 -0
  685. /package/dist/{chunk-YVLENSNS.js.map → chunk-5ATKSPEQ.js.map} +0 -0
  686. /package/dist/{chunk-ZVZHG7AI.js.map → chunk-5UBH37SL.js.map} +0 -0
  687. /package/dist/{chunk-N3WZU76A.js.map → chunk-66OJSCI6.js.map} +0 -0
  688. /package/dist/{chunk-D35XLYQ7.js.map → chunk-6CVNSDCZ.js.map} +0 -0
  689. /package/dist/{chunk-KA2HZCMG.js.map → chunk-6NXSYYGP.js.map} +0 -0
  690. /package/dist/{chunk-2HIJHXB3.js.map → chunk-6WHJ2EAB.js.map} +0 -0
  691. /package/dist/{chunk-ZZM476NV.js.map → chunk-6XL73HQ4.js.map} +0 -0
  692. /package/dist/{chunk-EJ5RKUXW.js.map → chunk-AQ7SYDVO.js.map} +0 -0
  693. /package/dist/{chunk-2Z3DG5CQ.js.map → chunk-B3O3IRZN.js.map} +0 -0
  694. /package/dist/{chunk-RACZB5HT.js.map → chunk-BD7JTBYP.js.map} +0 -0
  695. /package/dist/{chunk-I762GW7V.js.map → chunk-BLJWYCNO.js.map} +0 -0
  696. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  697. /package/dist/{chunk-GCASGYIO.js.map → chunk-C7HJ3NEI.js.map} +0 -0
  698. /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
  699. /package/dist/{chunk-WVGXCBOC.js.map → chunk-D5F7TKMH.js.map} +0 -0
  700. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  701. /package/dist/{chunk-2OXIPF3A.js.map → chunk-DZD3WGCD.js.map} +0 -0
  702. /package/dist/{chunk-UMEOXLIZ.js.map → chunk-E2P7TZTF.js.map} +0 -0
  703. /package/dist/{chunk-6FC3IZ26.js.map → chunk-EBA5DA77.js.map} +0 -0
  704. /package/dist/{chunk-N7JK2RKG.js.map → chunk-EOQ6FSQP.js.map} +0 -0
  705. /package/dist/{chunk-YNDLCWXS.js.map → chunk-EZ25VE3G.js.map} +0 -0
  706. /package/dist/{chunk-XDMI5VKE.js.map → chunk-FVOP3NT7.js.map} +0 -0
  707. /package/dist/{chunk-NRLELHAY.js.map → chunk-G7NYVKD6.js.map} +0 -0
  708. /package/dist/{chunk-B3W7GWQB.js.map → chunk-GHTSNGBZ.js.map} +0 -0
  709. /package/dist/{chunk-LUDBXTBJ.js.map → chunk-H272ZPQ3.js.map} +0 -0
  710. /package/dist/{chunk-SN4JXNLL.js.map → chunk-H3TKENU4.js.map} +0 -0
  711. /package/dist/{chunk-4HYNMLT6.js.map → chunk-H4SEGIZY.js.map} +0 -0
  712. /package/dist/{chunk-ACZN5ZXD.js.map → chunk-H54VWRPS.js.map} +0 -0
  713. /package/dist/{chunk-HTP6XRUI.js.map → chunk-HM7RHKS4.js.map} +0 -0
  714. /package/dist/{chunk-Z3SQEEB6.js.map → chunk-HWLIMQE2.js.map} +0 -0
  715. /package/dist/{chunk-2QSZNTDO.js.map → chunk-JBPKEARU.js.map} +0 -0
  716. /package/dist/{chunk-ET2CNMLD.js.map → chunk-JN72EPOE.js.map} +0 -0
  717. /package/dist/{chunk-JCCWJHOP.js.map → chunk-JYZSRNR7.js.map} +0 -0
  718. /package/dist/{chunk-7D6HXODY.js.map → chunk-K7724CH2.js.map} +0 -0
  719. /package/dist/{chunk-X33MJFD2.js.map → chunk-KAXCYM66.js.map} +0 -0
  720. /package/dist/{chunk-7RRUHJPG.js.map → chunk-KB2G2I6Q.js.map} +0 -0
  721. /package/dist/{chunk-ZXBTTMGZ.js.map → chunk-KEF46KL2.js.map} +0 -0
  722. /package/dist/{chunk-UWTDARPF.js.map → chunk-KTWG7CNY.js.map} +0 -0
  723. /package/dist/{chunk-XQYTSZW3.js.map → chunk-L7Z57SID.js.map} +0 -0
  724. /package/dist/{chunk-JMAG7WZ7.js.map → chunk-LO4UKPKX.js.map} +0 -0
  725. /package/dist/{chunk-LDWIPYJ6.js.map → chunk-LS2FHUML.js.map} +0 -0
  726. /package/dist/{chunk-GDB4J2H3.js.map → chunk-MPC7TYTZ.js.map} +0 -0
  727. /package/dist/{chunk-2GF27PGH.js.map → chunk-MRPOZBJC.js.map} +0 -0
  728. /package/dist/{chunk-BR3OOQZQ.js.map → chunk-MWN6QEI2.js.map} +0 -0
  729. /package/dist/{chunk-NZGO2GKL.js.map → chunk-MY5EDR46.js.map} +0 -0
  730. /package/dist/{chunk-LCMUZDBZ.js.map → chunk-N3ZOP7KC.js.map} +0 -0
  731. /package/dist/{chunk-TVW4C7PV.js.map → chunk-NB3LRY4T.js.map} +0 -0
  732. /package/dist/{chunk-QJCWK2A7.js.map → chunk-ND6IQGSZ.js.map} +0 -0
  733. /package/dist/{chunk-NOB2T2FC.js.map → chunk-NHLLKEKK.js.map} +0 -0
  734. /package/dist/{chunk-EJIWBTVM.js.map → chunk-O6ZNNVSP.js.map} +0 -0
  735. /package/dist/{chunk-AG46P24C.js.map → chunk-OB3XMWX5.js.map} +0 -0
  736. /package/dist/{chunk-46QMN7I7.js.map → chunk-PAZY2ZKP.js.map} +0 -0
  737. /package/dist/{chunk-EF4JUM55.js.map → chunk-PX4UMA5Z.js.map} +0 -0
  738. /package/dist/{chunk-NNZFPYYX.js.map → chunk-R7QY5ZVB.js.map} +0 -0
  739. /package/dist/{chunk-RO2X2EYM.js.map → chunk-R7RTXEYG.js.map} +0 -0
  740. /package/dist/{chunk-3LJPSRAN.js.map → chunk-RBCQVOVJ.js.map} +0 -0
  741. /package/dist/{chunk-N4F7ZSSG.js.map → chunk-RC5DXXWC.js.map} +0 -0
  742. /package/dist/{chunk-5CF2R4NS.js.map → chunk-RKBLRTNT.js.map} +0 -0
  743. /package/dist/{chunk-5QZR2RA3.js.map → chunk-ROBHL3GL.js.map} +0 -0
  744. /package/dist/{chunk-D5ZNOKR7.js.map → chunk-S7T2TY65.js.map} +0 -0
  745. /package/dist/{chunk-3LADWWMA.js.map → chunk-SJDQ5RSN.js.map} +0 -0
  746. /package/dist/{chunk-CHWUICVY.js.map → chunk-SV4Z2S67.js.map} +0 -0
  747. /package/dist/{chunk-SEF4IOFE.js.map → chunk-SWIKABKI.js.map} +0 -0
  748. /package/dist/{chunk-JRRQ747T.js.map → chunk-TBXAY2SS.js.map} +0 -0
  749. /package/dist/{chunk-XZBXINXZ.js.map → chunk-TNSCIPBQ.js.map} +0 -0
  750. /package/dist/{chunk-S37NN23M.js.map → chunk-TVEONGBU.js.map} +0 -0
  751. /package/dist/{chunk-5RPMTFB6.js.map → chunk-TWF35IC6.js.map} +0 -0
  752. /package/dist/{chunk-BZTJEILZ.js.map → chunk-U6N5IBVY.js.map} +0 -0
  753. /package/dist/{chunk-7TUB6JWA.js.map → chunk-UCKYTA2T.js.map} +0 -0
  754. /package/dist/{chunk-PPOT6SPR.js.map → chunk-UNNPNBR2.js.map} +0 -0
  755. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  756. /package/dist/{chunk-J2R275FN.js.map → chunk-VVX5PZFS.js.map} +0 -0
  757. /package/dist/{chunk-ME35HVDJ.js.map → chunk-VYCOJKSX.js.map} +0 -0
  758. /package/dist/{chunk-F5UWQ4LX.js.map → chunk-W24T5YMW.js.map} +0 -0
  759. /package/dist/{chunk-HDQUQBPW.js.map → chunk-W3K3HITK.js.map} +0 -0
  760. /package/dist/{chunk-GDASG7NC.js.map → chunk-W4F3C7N7.js.map} +0 -0
  761. /package/dist/{chunk-LFK623SF.js.map → chunk-WJHGDE7X.js.map} +0 -0
  762. /package/dist/{chunk-3Q6RD76J.js.map → chunk-WQZZDN5M.js.map} +0 -0
  763. /package/dist/{chunk-ZJWDWPX6.js.map → chunk-X5K5TAQZ.js.map} +0 -0
  764. /package/dist/{chunk-ZL3XX5LW.js.map → chunk-XM24CDZX.js.map} +0 -0
  765. /package/dist/{chunk-JTWZKNUH.js.map → chunk-XOVKXJEP.js.map} +0 -0
  766. /package/dist/{chunk-X5YYSAZX.js.map → chunk-XUE46UYW.js.map} +0 -0
  767. /package/dist/{chunk-DJORULH3.js.map → chunk-YRLHEEQT.js.map} +0 -0
  768. /package/dist/{chunk-TA7UZZMW.js.map → chunk-Z3O53WZR.js.map} +0 -0
  769. /package/dist/{chunk-4LG4CPOC.js.map → chunk-Z6COGHHN.js.map} +0 -0
  770. /package/dist/{chunk-RE3H6Y2X.js.map → chunk-ZIW5JVRM.js.map} +0 -0
  771. /package/dist/{forget-2AE4MDK3.js.map → forget-SZ2BXDGF.js.map} +0 -0
  772. /package/dist/{resolution-4DLI3IOR.js.map → graph-append-error.js.map} +0 -0
@@ -74,7 +74,7 @@ import {
74
74
  } from "../behavior-signals.js";
75
75
  import { buildProcedurePersistBody } from "../procedural/procedure-types.js";
76
76
  import { stripAttributesSuffix } from "../structured-attributes.js";
77
- import { evaluateSubjectGuard, isSharedPromotionTarget, resolveWriteSubject } from "../memory-subject.js";
77
+ import { resolveWriteSubject } from "../memory-subject.js";
78
78
  import { LocalLlmClient } from "../local-llm.js";
79
79
  import type { ExtractionEngine } from "../extraction.js";
80
80
  import {
@@ -102,9 +102,13 @@ import type {
102
102
  MemoryCategory,
103
103
  } from "../types.js";
104
104
  import {
105
+ createBatchPromotedCopyProbe,
105
106
  flushDeferredFactHashOnFailure,
107
+ makeSubjectGuardAllows,
106
108
  profileAutoPromotionAllows,
107
109
  readActiveMemoriesBothTiers,
110
+ promotionWithholdsToolScope,
111
+ promoteAndReconcileMergedTarget,
108
112
  shouldPromoteToShared,
109
113
  } from "./extraction-persist-promotion.js";
110
114
  import type { ExtractionPersistDeps } from "./extraction-persist-deps.js";
@@ -116,7 +120,10 @@ import {
116
120
  resolvePersistedMemoryRelativePath,
117
121
  } from "../orchestrator.js";
118
122
  import type { HarmonicConstructionInput } from "../harmonic-construction.js";
119
- import { persistConstructedHarmonicRecords } from "./harmonic-construction-persist.js";
123
+ import { enqueueMergedTargetForHarmonicConstruction, persistConstructedHarmonicRecords } from "./harmonic-construction-persist.js";
124
+ import { applySemanticMergeAtPersist, runMergedTargetPostEffects, writeMergedVerbatimArtifact } from "./semantic-merge-persist.js";
125
+ import { buildMergedTargetPromotionPayload } from "./semantic-merge-promotion-payload.js";
126
+ import { persistMergedTargetThreadEpisode } from "./semantic-merge-commit-effects.js";
120
127
  import { ExtractionAnchorSnapshot } from "./extraction-anchor-snapshot.js";
121
128
 
122
129
  export class ExtractionPersistCoordinator {
@@ -173,6 +180,7 @@ export class ExtractionPersistCoordinator {
173
180
  >();
174
181
  const harmonicSourceInsertedAtBase = Date.now();
175
182
  let harmonicSourceOrder = 0;
183
+ const promotedCopyProbe = createBatchPromotedCopyProbe(this.deps.config, this.deps.getStorageRouter, scopeProfileWritePlan); // #2330 finding F: one promoted-copy scan per namespace per batch
176
184
 
177
185
  // Canonicalize stored content for dedup comparison: strip citations
178
186
  // (using the same template), sanitize, then normalize whitespace.
@@ -269,7 +277,7 @@ export class ExtractionPersistCoordinator {
269
277
  memoryPathById.set(id, relPath);
270
278
  }
271
279
  };
272
- let dedupedCount = 0;
280
+ let dedupedCount = 0, semanticMergedCount = 0;
273
281
  // Counter for facts skipped by the importance write-gate (issue #372).
274
282
  let importanceGatedCount = 0;
275
283
  // UUI2: short-circuit semantic dedup after first backend-unavailable signal
@@ -343,17 +351,7 @@ export class ExtractionPersistCoordinator {
343
351
  const sourceConnector = sourceContext?.sourceConnector; const origin = classifyExtractionOrigin(sourceContext);
344
352
  // Subject guard (issue #2372): the ONE gate shared by every extraction-side
345
353
  // promotion path so behavior matches the spaces surface (§27).
346
- const subjectGuardAllows = (subject: MemorySubject | undefined, target: string, label: string): boolean => {
347
- const decision = evaluateSubjectGuard({
348
- subject,
349
- sharedTarget: isSharedPromotionTarget(target),
350
- mode: this.deps.config.subjectGuard,
351
- });
352
- if (decision.action !== "allow") {
353
- log.warn(`subject-guard(${decision.action}) ${label}: ${decision.reason}`);
354
- }
355
- return decision.action !== "reject";
356
- };
354
+ const subjectGuardAllows = makeSubjectGuardAllows(this.deps.config);
357
355
  const promoteMemoryToProfileTargets = async (options: {
358
356
  sourceStorage: StorageManager;
359
357
  category: string;
@@ -374,6 +372,8 @@ export class ExtractionPersistCoordinator {
374
372
  observedAt?: string;
375
373
  eventTimeSource?: "extracted" | "assumed";
376
374
  source: string;
375
+ /** Origin override: the COMMITTED target's retained origin (merged-target promotion). */
376
+ origin?: string;
377
377
  sources?: ProvenanceSource[];
378
378
  provenance?: "verified" | "unverified" | "none";
379
379
  toolScoped?: true;
@@ -382,12 +382,12 @@ export class ExtractionPersistCoordinator {
382
382
  HarmonicConstructionInput["persistedFacts"][number],
383
383
  "memoryId"
384
384
  >;
385
- }): Promise<void> => {
385
+ }): Promise<string[]> => {
386
386
  if (
387
387
  !scopeProfileWritePlan ||
388
388
  !profileAutoPromotionAllows(scopeProfileWritePlan, options.category, options.confidence)
389
389
  )
390
- return;
390
+ return [];
391
391
  const autoTargets = new Set(scopeProfileWritePlan.profile.autoPromote.targets);
392
392
  const targets = scopeProfileWritePlan.promotionTargets.filter(
393
393
  (target) =>
@@ -396,13 +396,14 @@ export class ExtractionPersistCoordinator {
396
396
  target.authorized &&
397
397
  target.namespace,
398
398
  );
399
- if (targets.length === 0) return;
399
+ if (targets.length === 0) return [];
400
400
  const rawContent =
401
401
  citationEnabled && hasCitationForTemplate(options.content, citationTemplate)
402
402
  ? stripCitationForTemplate(options.content, citationTemplate)
403
403
  : options.content;
404
404
  const citedContent = applyInlineCitation(rawContent);
405
405
  const sanitizedBase = sanitizeMemoryContent(rawContent);
406
+ const writtenCopyIds: string[] = [];
406
407
  for (const target of targets) {
407
408
  if (!target.namespace) continue;
408
409
  try {
@@ -417,7 +418,7 @@ export class ExtractionPersistCoordinator {
417
418
  {
418
419
  content: citedContent,
419
420
  category: options.category as MemoryCategory,
420
- origin, confidence: options.confidence,
421
+ origin: options.origin ?? origin, confidence: options.confidence,
421
422
  tags: withReservedMarkerTag(options.tags, `${target.target}-promotion`),
422
423
  entityRef: options.entityRef,
423
424
  structuredAttributes: options.structuredAttributes,
@@ -531,9 +532,9 @@ export class ExtractionPersistCoordinator {
531
532
  );
532
533
  }
533
534
  }
534
- // #1645 TV6: a tombstone-blocked promotion is pending_review (no
535
- // active copy) — skip catalog/index/behavior like postWriteGuard.
535
+ // #1645 TV6: tombstone-blocked = pending_review; skip catalog/index/behavior.
536
536
  if (!targetPromotion.tombstoneBlocked) {
537
+ writtenCopyIds.push(promotedId);
537
538
  trackPersistedId(targetStorage, promotedId, {
538
539
  includeReturnedIds: false,
539
540
  category: options.category as MemoryCategory,
@@ -558,6 +559,7 @@ export class ExtractionPersistCoordinator {
558
559
  );
559
560
  }
560
561
  }
562
+ return writtenCopyIds;
561
563
  };
562
564
  const promoteMemoryToShared = async (options: {
563
565
  sourceStorage: StorageManager;
@@ -580,7 +582,10 @@ export class ExtractionPersistCoordinator {
580
582
  observedAt?: string;
581
583
  eventTimeSource?: "extracted" | "assumed";
582
584
  source: string;
585
+ origin?: string;
583
586
  sourceConnector?: string;
587
+ /** Committed-record tool-scope marker — see {@link promotionWithholdsToolScope}. */
588
+ toolScoped?: true;
584
589
  procedureSteps?: ReadonlyArray<{ toolCall?: { kind?: string } }>;
585
590
  /** Claim-level provenance spans (issue #1575 PR 2). */
586
591
  sources?: ProvenanceSource[];
@@ -590,13 +595,16 @@ export class ExtractionPersistCoordinator {
590
595
  HarmonicConstructionInput["persistedFacts"][number],
591
596
  "memoryId"
592
597
  >;
593
- }): Promise<void> => {
594
- const toolScoped = withholdToolScopedFromSharedNamespace(options);
595
- await promoteMemoryToProfileTargets({
596
- ...options,
597
- ...(toolScoped ? { toolScoped: true as const } : {}),
598
- });
599
- if (lifecycleCaps.extractionScopeClassification && toolScoped) return;
598
+ }): Promise<string | undefined> => {
599
+ const toolScoped = promotionWithholdsToolScope(options);
600
+ // P1-A (#2330 N+8): every exit returns the LAST copy id written, profile copies included.
601
+ let promotedCopyId = (
602
+ await promoteMemoryToProfileTargets({
603
+ ...options,
604
+ ...(toolScoped ? { toolScoped: true as const } : {}),
605
+ })
606
+ ).at(-1);
607
+ if (lifecycleCaps.extractionScopeClassification && toolScoped) return promotedCopyId;
600
608
  if (
601
609
  !shouldPromoteToShared(
602
610
  this.deps.config,
@@ -608,20 +616,17 @@ export class ExtractionPersistCoordinator {
608
616
  options.confidence,
609
617
  )
610
618
  )
611
- return;
612
- if (!subjectGuardAllows(options.subject, "serverShared", "shared promotion")) return;
619
+ return promotedCopyId;
620
+ if (!subjectGuardAllows(options.subject, "serverShared", "shared promotion"))
621
+ return promotedCopyId;
613
622
  try {
614
623
  const sharedStorage = await this.deps.getStorageRouter().storageFor(
615
624
  this.deps.config.sharedNamespace,
616
625
  );
617
- // Dedup gate: canonicalize content before hashing. Strip any
618
- // pre-existing citation FIRST (applyInlineCitation appends a
619
- // timestamped marker, so hashing cited content defeats dedup and
620
- // call sites may pass already-cited content), then sanitize the base
621
- // and build the attribute-enriched body with normalizeAttributePairs
622
- // — the same canonicalization writeMemory applies — so the hash
623
- // lookup uses the exact body writeMemory stores (#369/#401, #402
624
- // round-6 fixes; PRRT_kwDORJXyws56VHZc / VHth).
626
+ // Dedup gate: strip any pre-existing citation, sanitize, and build
627
+ // the attribute-enriched body with normalizeAttributePairs the
628
+ // same canonicalization writeMemory applies so the hash lookup
629
+ // uses the exact body writeMemory stores (#369/#401, #402 round-6).
625
630
  const rawContent =
626
631
  citationEnabled &&
627
632
  hasCitationForTemplate(options.content, citationTemplate)
@@ -629,15 +634,13 @@ export class ExtractionPersistCoordinator {
629
634
  : options.content;
630
635
  const citedContent = applyInlineCitation(rawContent);
631
636
  const sanitizedBase = sanitizeMemoryContent(rawContent);
632
- // Compose BEFORE the dedup gate (#2014 round 2): salvage mode may drop
633
- // or clamp attributes, and the dedup hash, contentHashSource, and
634
- // supersession keys below must all describe the SURVIVING fields that
635
- // writeSealedMemory actually persists — never the raw extractor map.
637
+ // Compose BEFORE the dedup gate (#2014 round 2): the dedup hash, contentHashSource, and
638
+ // supersession keys must describe the SURVIVING fields writeSealedMemory persists.
636
639
  const sharedPromotionEnvelope = composeSalvagedExtractionEnvelope(
637
640
  {
638
641
  content: citedContent,
639
642
  category: options.category as MemoryCategory,
640
- origin, confidence: options.confidence,
643
+ origin: options.origin ?? origin, confidence: options.confidence,
641
644
  tags: withReservedMarkerTag(options.tags, "shared-promotion"),
642
645
  entityRef: options.entityRef,
643
646
  structuredAttributes: options.structuredAttributes,
@@ -658,12 +661,8 @@ export class ExtractionPersistCoordinator {
658
661
  options.category === "fact" &&
659
662
  (await sharedStorage.hasFactContentHash(dedupContent))
660
663
  ) {
661
- // Connector identity gate: only backfill temporal bounds onto a
662
- // same-connector fact. Different connectors with identical content
663
- // must not cross-patch each other's temporal fields (codex finding:
664
- // temporal backfill occurred before connector mismatch check).
665
- // Fail-open: on scan error backfill proceeds (preserving prior
666
- // best-effort behaviour).
664
+ // Connector identity gate: backfill bounds only onto a same-connector fact (no cross-patch).
665
+ // Fail-open: on scan error backfill proceeds (prior best-effort behaviour).
667
666
  let sharedSameConnector = true;
668
667
  if (options.invalidAt || options.validAt) {
669
668
  try {
@@ -816,7 +815,7 @@ export class ExtractionPersistCoordinator {
816
815
  if (hashDedupSupersession.supersededIds.length > 0) {
817
816
  }
818
817
  // Active matching fact exists — normal short-circuit is safe.
819
- return;
818
+ return promotedCopyId;
820
819
  }
821
820
  // No active same-entity shared fact found with this content hash.
822
821
  // This can happen when the previously-written shared fact has since
@@ -843,7 +842,7 @@ export class ExtractionPersistCoordinator {
843
842
  // A matching active shared fact was confirmed — skip the write to
844
843
  // avoid duplicating content that is already present. The existing
845
844
  // fact remains active and the supersession failure is logged above.
846
- return;
845
+ return promotedCopyId;
847
846
  }
848
847
  // Lookup did not complete or no candidate was found — we cannot
849
848
  // confirm a duplicate. Fall through to the write + post-write
@@ -877,7 +876,7 @@ export class ExtractionPersistCoordinator {
877
876
  skipSharedPromotion = false;
878
877
  }
879
878
  if (skipSharedPromotion) {
880
- return;
879
+ return promotedCopyId;
881
880
  }
882
881
  // No same-connector active shared fact — fall through to write.
883
882
  }
@@ -962,10 +961,13 @@ export class ExtractionPersistCoordinator {
962
961
  }),
963
962
  );
964
963
  }
964
+ promotedCopyId = promotedId; // feeds the merged-target reconciliation (round N+7 B)
965
+ return promotedId;
965
966
  } catch (err) {
966
967
  log.warn(
967
968
  `persistExtraction: shared promotion failed open for ${options.sourceMemoryId}: ${err}`,
968
969
  );
970
+ return promotedCopyId; // P1-A: profile copies written pre-failure still reconcile
969
971
  }
970
972
  };
971
973
  // #1707 thread 1 — backfill temporal bounds onto promotion copies when the
@@ -2306,11 +2308,7 @@ export class ExtractionPersistCoordinator {
2306
2308
  );
2307
2309
  }
2308
2310
  } finally {
2309
- // The parent memory is durable once writeMemory returns `parentId`.
2310
- // Touch immediately around the chunk-write loop so a later chunk
2311
- // failure still surfaces the partially durable parent/chunk files to
2312
- // catalog-driven `writtenSince` maintenance. The final touch below
2313
- // still refreshes `lastWriteAt` after later durable writes on success.
2311
+ // #1522: the catalog write touch lives in the storage chokepoint.
2314
2312
  }
2315
2313
 
2316
2314
  if (routedRuleId) {
@@ -2503,11 +2501,7 @@ export class ExtractionPersistCoordinator {
2503
2501
  }
2504
2502
  }
2505
2503
  } finally {
2506
- // Catalog touch (issue #1499): refresh AFTER later chunked
2507
- // source-namespace durable mutations — temporal supersession, shared
2508
- // promotion, optional artifact writes, and graph-edge writes — so
2509
- // `lastWriteAt` cannot precede later file changes on successful
2510
- // completion. Use the KNOWN routed name, not a dir-decoded guess.
2504
+ // #1522: the catalog write touch lives in the storage chokepoint.
2511
2505
  }
2512
2506
  trackBehaviorSignals(
2513
2507
  targetStorage,
@@ -2545,35 +2539,49 @@ export class ExtractionPersistCoordinator {
2545
2539
  ? classifyMemoryKind(fact.content, fact.tags ?? [], writeCategory)
2546
2540
  : undefined;
2547
2541
 
2548
- // Normal write (no chunking)
2549
- // Compute the cited content once so that writeMemory and writeArtifact
2550
- // (when verbatim artifacts are enabled) share the same citation timestamp.
2551
- // Calling applyInlineCitation twice on the same raw content would produce
2552
- // two different timestamps, creating duplicate citations with divergent
2553
- // provenance metadata on the memory and artifact copies of the same fact.
2554
- // Pass the RAW (pre-citation) fact as `contentHashSource` so the
2555
- // fact-content hash index records the hash of the canonical fact text
2556
- // rather than the citation-annotated variant. When inline attribution is
2557
- // enabled, `applyInlineCitation` appends a timestamp-bearing marker, so
2558
- // hashing the persisted body would produce a different hash on every
2559
- // write and defeat cross-session dedup (see `findDuplicateExplicitCapture`
2560
- // in explicit-capture.ts which calls `hasFactContentHash(candidate.content)`
2561
- // on raw content).
2562
- const rawPersistBody =
2563
- writeCategory === "procedure"
2564
- ? buildProcedurePersistBody(fact.content, fact.procedureSteps)
2565
- : fact.content;
2542
+ // Normal write (no chunking). Cite once so memory and artifact copies share one timestamp; hash the RAW pre-citation text. Merge-on-write (#2330): a judge-approved in-band match updates in place; uncarryable metadata, promoted copies, backend outage, and a novelty-add decision bypass to this write.
2543
+ const rawPersistBody = writeCategory === "procedure" ? buildProcedurePersistBody(fact.content, fact.procedureSteps) : fact.content;
2566
2544
  const citedFactContent = applyInlineCitation(rawPersistBody);
2545
+ const semanticMerge = await applySemanticMergeAtPersist(this.deps, {
2546
+ storage: targetStorage, content: fact.content, category: writeCategory, sources: fact.sources, sourceConnector: extractionSourceConnector,
2547
+ incomingMetadata: { tags: [...fact.tags, ...injectionScreenTags], entityRef: fact.entityRef, structuredAttributes: fact.structuredAttributes, validAt: biTemporal ? biTemporal.validFrom : sourceContext?.validAt, biTemporal: biTemporal !== undefined, importanceScore: importance.score, confidence: fact.confidence, provenanceStrength: fact.provenance, toolScoped: factToolScoped, subject: factSubject, origin, faithfulness: faithfulnessFm, memoryKind }, skip: contradictionDetected || faithfulnessEnforceStatus === "pending_review" || batchBackendUnavailable || novelty.decision === "add",
2548
+ incomingLinks: links.length > 0 ? links : undefined, incomingCitedContent: citedFactContent,
2549
+ targetHasPromotedCopies: (targetId) => promotedCopyProbe.check(targetStorage, targetId),
2550
+ });
2551
+ if (semanticMerge.action === "created" && semanticMerge.reason === "backend_unavailable") batchBackendUnavailable = true; // arms the batch short circuit for the remaining facts
2552
+ if (semanticMerge.action === "merged") {
2553
+ semanticMergedCount++;
2554
+ await anchorSnapshots.replace(targetStorage, semanticMerge.targetId, writeCategory, memoryPathById);
2555
+ // D + final round (A/B) + N+7 (A/B) + N+18 (B): with no promoted copies the create path's promotion must still run — fail-open, the merge stands — and its payload derives SOLELY from the re-read committed record (no field reads the incoming extraction; the null cases — replaced mid-flight, retired, degraded merge, or the isolated fail-open reread failure — are documented on buildMergedTargetPromotionPayload). After the current copy lands, any concurrently promoted PRE-merge copy is superseded. Promotion eligibility gates on the committed record's tier — the downgraded min(incoming, target) confidence where a lower incoming fact merged in.
2556
+ const mergedPromotion = await buildMergedTargetPromotionPayload(targetStorage, semanticMerge);
2557
+ // Round N+10 (A): promotion AND reconciliation — including the no-promotion path, where a below-threshold downgrade or a degraded merge writes no replacement copy but a concurrently published PRE-merge copy must still retire. See promoteAndReconcileMergedTarget.
2558
+ await promoteAndReconcileMergedTarget({ promote: (payload) => promoteMemoryToShared({ sourceStorage: targetStorage, ...payload }), config: this.deps.config, getStorageRouter: this.deps.getStorageRouter, scopeProfileWritePlan, sourceStorage: targetStorage, sourceMemoryId: semanticMerge.targetId, mergedPromotion, normalize: normalizeStoredHashSource, onReconciled: () => promotedCopyProbe.invalidate() });
2559
+ // Round N+7 (D): the merged body joins the INTERNAL temporal/tag index refresh (id-keyed, incremental); the PUBLIC persistedIds return stays new-fragment only. Round N+11 (B): the target is also persisted into the thread's DURABLE episode set via the same appendEpisodeIds path the create path uses — the batch-local adjacency list is not durable, so without this the target leaves the thread at the next extraction.
2560
+ trackPersistedId(targetStorage, semanticMerge.targetId, { includeReturnedIds: false });
2561
+ await persistMergedTargetThreadEpisode(this.deps.getThreading(), threadIdForExtraction, semanticMerge.targetId);
2562
+ // Finding B (round N+3): enqueue the surviving target so the end-of-batch harmonic pass covers the committed merged claims.
2563
+ if (harmonicConstructionEnabled) {
2564
+ enqueueMergedTargetForHarmonicConstruction(harmonicFactsByStorage, targetStorage, harmonicFact, semanticMerge.targetId, semanticMerge.mergedContent, new Date(harmonicSourceInsertedAtBase + harmonicSourceOrder++).toISOString());
2565
+ }
2566
+ // Round N+5 (A+B): create-path parity — the create path's graph-edge build and
2567
+ // behavior-signal ledger entry must also observe a committed merge.
2568
+ trackBehaviorSignals(targetStorage, await runMergedTargetPostEffects(this.deps, targetStorage, semanticMerge, {
2569
+ category: writeCategory, incomingContent: fact.content, incomingConfidence: fact.confidence,
2570
+ namespace: this.deps.storageDirNamespace(targetStorage.dir), graphCaps,
2571
+ graphContext: await ensureGraphContext(targetStorage),
2572
+ threadIdForEdge: threadIdForExtraction ?? undefined, threadEpisodeIdsForGraph,
2573
+ }));
2574
+ // Round N+17 (B): artifact write LAST; the helper isolates its own failure.
2575
+ await writeMergedVerbatimArtifact(this.deps, targetStorage, semanticMerge.targetId, { category: writeCategory, citedContent: citedFactContent, confidence: fact.confidence, tags: fact.tags, intent: inferredIntent ?? undefined, sourceConnector: extractionSourceConnector, origin, toolScoped: factToolScoped });
2576
+ continue;
2577
+ }
2567
2578
  const factWriteEnvelope = composeSalvagedExtractionEnvelope(
2568
2579
  {
2569
2580
  content: citedFactContent,
2570
2581
  category: writeCategory,
2571
2582
  origin, confidence: fact.confidence,
2572
2583
  tags: [...fact.tags, ...injectionScreenTags],
2573
- entityRef:
2574
- typeof (fact as any).entityRef === "string"
2575
- ? (fact as any).entityRef
2576
- : undefined,
2584
+ entityRef: typeof fact.entityRef === "string" ? fact.entityRef : undefined,
2577
2585
  structuredAttributes: fact.structuredAttributes,
2578
2586
  validAt: biTemporal ? biTemporal.validFrom : sourceContext?.validAt,
2579
2587
  ...(extractionSourceConnector ? { sourceConnector: extractionSourceConnector } : {}),
@@ -2691,7 +2699,7 @@ export class ExtractionPersistCoordinator {
2691
2699
  }
2692
2700
  // Faithfulness gate (#1576, chatgpt P2): skip promotion for a
2693
2701
  // pending_review fact so no active shared/profile copy bypasses the gate.
2694
- if (!postWriteGuard) await promoteMemoryToShared({
2702
+ if (!postWriteGuard) { await promoteMemoryToShared({
2695
2703
  sourceStorage: targetStorage,
2696
2704
  category: writeCategory,
2697
2705
  content: fact.content,
@@ -2723,7 +2731,7 @@ export class ExtractionPersistCoordinator {
2723
2731
  ...(fact.sources && fact.sources.length > 0 ? { sources: fact.sources } : {}),
2724
2732
  ...(fact.provenance ? { provenance: fact.provenance } : {}),
2725
2733
  harmonicFact,
2726
- });
2734
+ }); promotedCopyProbe.invalidate(); }
2727
2735
  // v8.2: graph edge building (fail-open). #1576: skip pending_review facts.
2728
2736
  if (graphCaps.multiGraphMemory && !postWriteGuard) {
2729
2737
  try {
@@ -2812,13 +2820,6 @@ export class ExtractionPersistCoordinator {
2812
2820
  // .md never outlives a missing shared fact-hash index entry.
2813
2821
  await flushDeferredFactHashOnFailure(() => this.deps.saveContentHashIndexes(), factDedupEnabled);
2814
2822
  throw err;
2815
- } finally {
2816
- // Catalog touch (issue #1499): record AFTER every synchronous
2817
- // source-namespace mutation in the non-chunked path: writeMemory,
2818
- // temporal supersession, graph edges, and optional verbatim artifacts.
2819
- // The `finally` preserves the write touch when post-write indexing or
2820
- // promotion fails after the canonical memory is already durable. Use the
2821
- // KNOWN routed name, not a dir-decoded guess (NCQI0).
2822
2823
  }
2823
2824
  }
2824
2825
 
@@ -2985,7 +2986,7 @@ export class ExtractionPersistCoordinator {
2985
2986
  );
2986
2987
  }
2987
2988
 
2988
- const dedupSuffix = dedupedCount > 0 ? ` (${dedupedCount} deduped)` : "";
2989
+ const dedupSuffix = `${dedupedCount > 0 ? ` (${dedupedCount} deduped)` : ""}${semanticMergedCount > 0 ? ` (${semanticMergedCount} merged)` : ""}`;
2989
2990
  const gatedSuffix =
2990
2991
  importanceGatedCount > 0 ? ` (${importanceGatedCount} gated)` : "";
2991
2992
  const judgeSuffix =
@@ -2993,7 +2994,7 @@ export class ExtractionPersistCoordinator {
2993
2994
  const redactionSuffix =
2994
2995
  redactionGatedCount > 0 ? ` (${redactionGatedCount} redacted)` : "";
2995
2996
  log.info(
2996
- `persisted: ${facts.length - dedupedCount - importanceGatedCount - judgeGatedCount - redactionGatedCount} facts${dedupSuffix}${gatedSuffix}${judgeSuffix}${redactionSuffix}, ${entities.length} entities, ${questions.length} questions, ${profileUpdates.length} profile updates`,
2997
+ `persisted: ${facts.length - dedupedCount - importanceGatedCount - judgeGatedCount - redactionGatedCount - semanticMergedCount} facts${dedupSuffix}${gatedSuffix}${judgeSuffix}${redactionSuffix}, ${entities.length} entities, ${questions.length} questions, ${profileUpdates.length} profile updates`,
2997
2998
  );
2998
2999
  if (harmonicConstructionEnabled && harmonicFactsByStorage.size > 0) {
2999
3000
  await persistConstructedHarmonicRecords({
@@ -0,0 +1,69 @@
1
+ import assert from "node:assert/strict";
2
+ import { test } from "node:test";
3
+ import type { StorageManager } from "../index.js";
4
+ import { deriveHarmonicRecords, type HarmonicConstructionInput } from "../harmonic-construction.js";
5
+ import { enqueueMergedTargetForHarmonicConstruction } from "./harmonic-construction-persist.js";
6
+
7
+ const storage = { dir: "/tmp/remnic-harmonic-coalesce" } as StorageManager;
8
+
9
+ function fact(cueAnchors: NonNullable<HarmonicConstructionInput["persistedFacts"][number]["cueAnchors"]>) {
10
+ return {
11
+ content: "placeholder — replaced by the committed body",
12
+ category: "fact",
13
+ tags: [],
14
+ cueAnchors,
15
+ };
16
+ }
17
+
18
+ test("two merges into one target coalesce to one harmonic entry: final body, unioned anchors (round N+9 C)", () => {
19
+ const map = new Map<string, {
20
+ storage: StorageManager;
21
+ facts: HarmonicConstructionInput["persistedFacts"];
22
+ }>();
23
+ enqueueMergedTargetForHarmonicConstruction(
24
+ map,
25
+ storage,
26
+ fact([{ type: "tool", value: "atlas release workflow" }]),
27
+ "merge-target",
28
+ "first cumulative body",
29
+ "2026-08-22T10:00:00.000Z",
30
+ );
31
+ enqueueMergedTargetForHarmonicConstruction(
32
+ map,
33
+ storage,
34
+ fact([{ type: "entity", value: "Atlas PostgreSQL" }]),
35
+ "merge-target",
36
+ "second cumulative body",
37
+ "2026-08-22T11:00:00.000Z",
38
+ );
39
+ const facts = map.get(storage.dir)!.facts;
40
+ assert.equal(facts.length, 1, "one entry per target id, not one per merge");
41
+ assert.equal(facts[0]!.content, "second cumulative body", "the FINAL committed body wins");
42
+ assert.equal(facts[0]!.insertedAt, "2026-08-22T11:00:00.000Z");
43
+ assert.deepEqual(
44
+ facts[0]!.cueAnchors?.map((anchor) => anchor.value),
45
+ ["atlas release workflow", "Atlas PostgreSQL"],
46
+ "cue anchors UNION across merges",
47
+ );
48
+ // End-to-end contract: the derived episode holds exactly one body per
49
+ // target (the final committed one) and anchors from BOTH merges survive.
50
+ const records = deriveHarmonicRecords({
51
+ sessionKey: "session-coalesce",
52
+ recordedAt: "2026-08-22T11:00:00.000Z",
53
+ persistedFacts: facts,
54
+ entityMentions: [],
55
+ });
56
+ const episode = records.nodes.find((node) => node.kind === "episode");
57
+ assert.ok(episode);
58
+ assert.equal(
59
+ (episode.summary.match(/cumulative body/g) ?? []).length,
60
+ 1,
61
+ "the episode summary consumes ONE cumulative snapshot, not both",
62
+ );
63
+ assert.ok(episode.summary.includes("second"), "the snapshot is the FINAL committed body");
64
+ const anchorValues = records.anchors.map((anchor) => anchor.anchorValue);
65
+ assert.ok(
66
+ anchorValues.includes("atlas release workflow") && anchorValues.includes("Atlas PostgreSQL"),
67
+ "anchors from both merges reach the persisted anchor set",
68
+ );
69
+ });
@@ -7,6 +7,7 @@ import {
7
7
  persistHarmonicRecords,
8
8
  } from "../harmonic-construction.js";
9
9
  import { log } from "../logger.js";
10
+ import type { StorageManager } from "../index.js";
10
11
  import type { ExtractionResult } from "../types.js";
11
12
 
12
13
  export interface HarmonicPersistenceEntry {
@@ -36,6 +37,60 @@ export function filterHarmonicEntityMentions(
36
37
  });
37
38
  }
38
39
 
40
+ /**
41
+ * Finding B (round N+3, PR #2771): a successful merge-on-write commits new
42
+ * claims into an EXISTING target id. `persistedIds` stays new-fragment only
43
+ * by contract and cue anchors ride only through the per-fact harmonic
44
+ * entry, so without this enqueue a merge-only extraction emits no episode,
45
+ * abstraction node, or cue anchors for the committed claims. Enqueue the
46
+ * surviving target — with the COMMITTED merged body as content — into the
47
+ * same batch map the create path feeds, so the end-of-batch
48
+ * {@link persistConstructedHarmonicRecords} pass covers it.
49
+ *
50
+ * Round N+9 (C): two facts merging into the SAME target in one batch enqueue
51
+ * twice under one `memoryId`. `deriveHarmonicRecords` dedupes only
52
+ * `sourceMemoryIds` — `persistedFacts` keeps both entries, so the episode
53
+ * summary concatenated both cumulative snapshots and the inserted-at
54
+ * metadata overwrote its duplicate key. Coalesce instead: the entry for a
55
+ * repeated target is REPLACED by the latest committed body (each merge's
56
+ * body is cumulative, so the latest carries every claim) while the cue
57
+ * anchors UNION across merges — anchors are deduped by id downstream, but
58
+ * the union keeps the earlier merge's anchors alive when the later incoming
59
+ * fact carried none.
60
+ */
61
+ export function enqueueMergedTargetForHarmonicConstruction(
62
+ entries: Map<
63
+ string,
64
+ { storage: StorageManager; facts: HarmonicConstructionInput["persistedFacts"] }
65
+ >,
66
+ storage: StorageManager,
67
+ fact: Omit<
68
+ HarmonicConstructionInput["persistedFacts"][number],
69
+ "memoryId" | "insertedAt"
70
+ >,
71
+ memoryId: string,
72
+ content: string,
73
+ insertedAt: string,
74
+ ): void {
75
+ const entry = entries.get(storage.dir) ?? { storage, facts: [] };
76
+ const prior = entry.facts.findIndex((existing) => existing.memoryId === memoryId);
77
+ if (prior !== -1) {
78
+ entry.facts[prior] = {
79
+ ...fact,
80
+ content,
81
+ memoryId,
82
+ insertedAt,
83
+ cueAnchors: [
84
+ ...(entry.facts[prior]!.cueAnchors ?? []),
85
+ ...(fact.cueAnchors ?? []),
86
+ ],
87
+ };
88
+ } else {
89
+ entry.facts.push({ ...fact, content, memoryId, insertedAt });
90
+ }
91
+ entries.set(storage.dir, entry);
92
+ }
93
+
39
94
  export async function persistConstructedHarmonicRecords(options: {
40
95
  entries: Iterable<HarmonicPersistenceEntry>;
41
96
  baseStorageDir: string;
@@ -18,7 +18,7 @@ import path from "node:path";
18
18
  import { type GraphConstructionCapabilitySet, resolveCapabilities, resolveGraphConstructionCapabilities, resolveIndexingCapabilities, resolveMemoryLifecycleCapabilities, resolveNamespaceCapabilities, resolveRecallEnhancementCapabilities } from "../capabilities.js";
19
19
  import type { SemanticDedupHit } from "../dedup/semantic.js";
20
20
  import { EmbeddingFallback } from "../embedding-fallback.js";
21
- import { GraphIndex } from "../graph.js";
21
+ import { GraphIndex, type GraphEdge } from "../graph.js";
22
22
  import { ContentHashIndex, StorageManager } from "../index.js";
23
23
  import { log } from "../logger.js";
24
24
  import { isActiveMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
@@ -335,7 +335,21 @@ export class PersistenceIndexCoordinator {
335
335
  ): Promise<void> {
336
336
  if (!resolveMemoryLifecycleCapabilities(this.deps.config).embeddingFallback) return;
337
337
  if (!(await this.deps.embeddingFallback.isAvailable())) return;
338
- const memory = await storage.getMemoryById(memoryId);
338
+ // #2330 round N+10 (B): getMemoryById is HOT-tier only, so a semantic
339
+ // merge's surviving target living under cold/ resolved to null and the
340
+ // embedding fallback kept serving the pre-merge text. Fall back to the
341
+ // same cold-aware id lookup the merge path used
342
+ // (getMemoryByIdIncludingArchived, PR #2771 N+9 B parity for the temporal
343
+ // refresh); retired records stay out via the active-status gate.
344
+ let memory = await storage.getMemoryById(memoryId);
345
+ if (!memory) {
346
+ const coldAware = await storage
347
+ .getMemoryByIdIncludingArchived(memoryId)
348
+ .catch(() => null);
349
+ if (coldAware && isActiveMemoryStatus(coldAware.frontmatter.status)) {
350
+ memory = coldAware;
351
+ }
352
+ }
339
353
  if (!memory) return;
340
354
  await this.deps.embeddingFallback.indexFile(
341
355
  memoryId,
@@ -361,7 +375,7 @@ export class PersistenceIndexCoordinator {
361
375
  threadEpisodeIdsForGraph: string[] | undefined,
362
376
  fallbackCausalPredecessor: string | undefined,
363
377
  graphCaps: GraphConstructionCapabilitySet = resolveGraphConstructionCapabilities(this.deps.config),
364
- ): Promise<void> {
378
+ ): Promise<GraphEdge[]> {
365
379
  // Entity siblings: other memories sharing the same entityRef
366
380
  const entitySiblings: string[] = [];
367
381
  if (entityRef) {
@@ -405,7 +419,7 @@ export class PersistenceIndexCoordinator {
405
419
  }
406
420
  const causalPredecessor =
407
421
  recentInThread[recentInThread.length - 1] ?? fallbackCausalPredecessor;
408
- await this.deps.graphIndexFor(storage).onMemoryWritten({
422
+ return await this.deps.graphIndexFor(storage).onMemoryWritten({
409
423
  memoryPath: memoryRelPath,
410
424
  entityRef,
411
425
  content: factContent,
@@ -467,12 +481,26 @@ export class PersistenceIndexCoordinator {
467
481
  : await storage.readAllMemories();
468
482
 
469
483
  // Bootstrap: index only active (non-archived, non-superseded) memories.
470
- // Incremental: index only the newly persisted IDs.
484
+ // Incremental: index only the newly persisted IDs. `readAllMemories`
485
+ // is HOT-tier only, so an id that lives under `cold/` (e.g. a semantic
486
+ // merge's surviving target — PR #2771 round N+9 B) is missing from the
487
+ // pool and the index keeps serving the pre-merge row. Fetch each
488
+ // missing id through the same cold-aware lookup the merge path used
489
+ // (`getMemoryByIdIncludingArchived`) instead of scanning the whole
490
+ // cold tier per batch.
471
491
  const pool = needsFullRebuild
472
492
  ? allMemories.filter((m) => isActiveMemoryStatus(m.frontmatter.status))
473
- : (() => {
493
+ : await (async () => {
474
494
  const idSet = new Set(persistedIds);
475
- return allMemories.filter((m) => idSet.has(m.frontmatter.id));
495
+ const hot = allMemories.filter((m) => idSet.has(m.frontmatter.id));
496
+ for (const id of persistedIds) {
497
+ if (hot.some((m) => m.frontmatter.id === id)) continue;
498
+ const cold = await storage
499
+ .getMemoryByIdIncludingArchived(id)
500
+ .catch(() => null);
501
+ if (cold) hot.push(cold);
502
+ }
503
+ return hot;
476
504
  })();
477
505
 
478
506
  const entries: Array<{