@remnic/core 9.69.38 → 9.69.40

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 (656) hide show
  1. package/dist/access-admin-ops-surface.d.ts +16 -14
  2. package/dist/access-admin-ops-surface.js +39 -39
  3. package/dist/access-authorization-probe.d.ts +16 -14
  4. package/dist/access-authorization-probe.js +40 -40
  5. package/dist/access-boundary.d.ts +16 -14
  6. package/dist/access-boundary.js +39 -39
  7. package/dist/access-cli.js +107 -105
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +1 -1
  10. package/dist/access-extraction-force-flush.d.ts +16 -14
  11. package/dist/access-extraction-force-flush.js +39 -39
  12. package/dist/access-health-types.d.ts +1 -1
  13. package/dist/access-http-briefing.d.ts +16 -14
  14. package/dist/access-http-briefing.js +40 -40
  15. package/dist/access-http-lcm-compaction.d.ts +16 -14
  16. package/dist/access-http-lifecycle-flush.d.ts +16 -14
  17. package/dist/access-http-offline-stream.d.ts +16 -14
  18. package/dist/access-http-query.d.ts +2 -2
  19. package/dist/access-http-query.js +41 -41
  20. package/dist/access-http.d.ts +17 -15
  21. package/dist/access-http.js +58 -58
  22. package/dist/access-identity-continuity-surface.d.ts +13 -12
  23. package/dist/access-identity-continuity-surface.js +39 -39
  24. package/dist/access-lcm-surface.d.ts +16 -14
  25. package/dist/access-lcm-surface.js +39 -39
  26. package/dist/access-mcp.d.ts +16 -14
  27. package/dist/access-mcp.js +47 -47
  28. package/dist/access-memory-search-fanout.d.ts +2 -2
  29. package/dist/{access-namespace-preflight-DY4z6L5X.d.ts → access-namespace-preflight-CKBumJ8W.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +3 -3
  31. package/dist/access-namespace-preflight.js +39 -39
  32. package/dist/access-observe-transcript.d.ts +13 -12
  33. package/dist/access-observe-write-category.d.ts +1 -1
  34. package/dist/access-observe-write-category.js +2 -2
  35. package/dist/access-observe-write-surface.d.ts +16 -14
  36. package/dist/access-observe-write-surface.js +39 -39
  37. package/dist/access-offline-manifest.d.ts +37 -13
  38. package/dist/access-offline-manifest.js +7 -3
  39. package/dist/access-operations-batch.js +41 -41
  40. package/dist/access-operations.d.ts +16 -14
  41. package/dist/access-operations.js +46 -46
  42. package/dist/access-recall-concurrency.d.ts +16 -14
  43. package/dist/access-recall-concurrency.js +39 -39
  44. package/dist/access-recall-response.d.ts +16 -14
  45. package/dist/access-recall-response.js +39 -39
  46. package/dist/access-recall-surface.d.ts +16 -14
  47. package/dist/access-recall-surface.js +39 -39
  48. package/dist/access-schema.d.ts +5 -3
  49. package/dist/access-schema.js +1 -1
  50. package/dist/{access-service-gBcdRUHY.d.ts → access-service-DJ3qogNt.d.ts} +8 -8
  51. package/dist/access-service-helpers.d.ts +16 -14
  52. package/dist/access-service.d.ts +16 -14
  53. package/dist/access-service.js +39 -39
  54. package/dist/access-surface-catalog.d.ts +16 -14
  55. package/dist/access-surface-catalog.js +41 -41
  56. package/dist/access-wearables-meetings-surface.d.ts +6 -5
  57. package/dist/action-confidence.d.ts +1 -1
  58. package/dist/active-memory-bridge.d.ts +1 -1
  59. package/dist/active-recall.d.ts +1 -1
  60. package/dist/active-recall.js +6 -5
  61. package/dist/active-recall.js.map +1 -1
  62. package/dist/activity/digest.d.ts +1 -1
  63. package/dist/adapters/index.js +4 -4
  64. package/dist/adapters/registry.js +2 -2
  65. package/dist/ambient-provenance.d.ts +1 -1
  66. package/dist/artifact-search.d.ts +1 -1
  67. package/dist/{auto-sync-RP4C6ZPF.js → auto-sync-D6BAPIJV.js} +5 -5
  68. package/dist/background-generation-config.d.ts +1 -1
  69. package/dist/background-generation-config.js +3 -1
  70. package/dist/background-generation.d.ts +1 -1
  71. package/dist/behavior-learner.d.ts +1 -1
  72. package/dist/behavior-signals.d.ts +1 -1
  73. package/dist/bootstrap.d.ts +13 -12
  74. package/dist/briefing-window.d.ts +2 -2
  75. package/dist/briefing.d.ts +2 -2
  76. package/dist/briefing.js +16 -16
  77. package/dist/buffer-surprise-report.d.ts +1 -1
  78. package/dist/buffer-turn-helpers.d.ts +1 -1
  79. package/dist/buffer.d.ts +2 -2
  80. package/dist/buffer.js +5 -5
  81. package/dist/bulk-import/index.d.ts +3 -3
  82. package/dist/calibration.d.ts +3 -2
  83. package/dist/calibration.js +2 -2
  84. package/dist/capabilities.d.ts +1 -1
  85. package/dist/{catalog-CW87xGx8.d.ts → catalog-BHXkBVhg.d.ts} +1 -1
  86. package/dist/causal-behavior.d.ts +1 -1
  87. package/dist/causal-consolidation.d.ts +1 -1
  88. package/dist/causal-consolidation.js +20 -19
  89. package/dist/causal-consolidation.js.map +1 -1
  90. package/dist/causal-trajectory-graph.d.ts +1 -1
  91. package/dist/{chunk-B36GUU6T.js → chunk-23HFXQ5J.js} +36 -3
  92. package/dist/chunk-23HFXQ5J.js.map +1 -0
  93. package/dist/{chunk-YFTNZMGR.js → chunk-27NO2KVB.js} +31 -8
  94. package/dist/chunk-27NO2KVB.js.map +1 -0
  95. package/dist/{chunk-T32B72QX.js → chunk-2SKMZUOW.js} +2 -2
  96. package/dist/{chunk-VHOSM5G4.js → chunk-2SNCQHJZ.js} +2 -2
  97. package/dist/{chunk-VV4ZVUE6.js → chunk-3QEVOQF5.js} +2 -2
  98. package/dist/{chunk-3N3PBBEH.js → chunk-3XPN7AVY.js} +2 -2
  99. package/dist/{chunk-XN6XT6GR.js → chunk-46Z3VGWF.js} +2 -2
  100. package/dist/{chunk-2PTNJTBE.js → chunk-4CMXI55L.js} +2 -2
  101. package/dist/{chunk-2MT4ADLQ.js → chunk-5LYSEZOF.js} +18 -9
  102. package/dist/chunk-5LYSEZOF.js.map +1 -0
  103. package/dist/{chunk-XWLLFKHM.js → chunk-62HFZNCJ.js} +19 -12
  104. package/dist/chunk-62HFZNCJ.js.map +1 -0
  105. package/dist/{chunk-VELCIWJZ.js → chunk-6L2II3KS.js} +22 -11
  106. package/dist/chunk-6L2II3KS.js.map +1 -0
  107. package/dist/{chunk-A6CKMIPK.js → chunk-7D6SER6A.js} +8 -8
  108. package/dist/{chunk-4B3HBIFX.js → chunk-7Z54NXVS.js} +2 -2
  109. package/dist/{chunk-X2NFFBTO.js → chunk-A7GQBJP5.js} +4 -4
  110. package/dist/{chunk-ACY4ZPF7.js → chunk-AEOOGXMQ.js} +10 -5
  111. package/dist/chunk-AEOOGXMQ.js.map +1 -0
  112. package/dist/{chunk-NWMUSKED.js → chunk-BGRTZOJB.js} +3 -3
  113. package/dist/{chunk-ZEGL7YCC.js → chunk-BXIJSPCL.js} +2 -2
  114. package/dist/{chunk-MLWMR2GE.js → chunk-BYQX4IOG.js} +2 -2
  115. package/dist/{chunk-ULDBGA5W.js → chunk-C5R73BON.js} +2 -2
  116. package/dist/{chunk-BD7JTBYP.js → chunk-D7MAYFQP.js} +2 -2
  117. package/dist/{chunk-V6G2PSXA.js → chunk-DAZANIYU.js} +251 -297
  118. package/dist/chunk-DAZANIYU.js.map +1 -0
  119. package/dist/{chunk-BRZWWUCJ.js → chunk-DFVSJFHK.js} +2 -2
  120. package/dist/{chunk-DPMTLJCT.js → chunk-ES5BUPYB.js} +2 -2
  121. package/dist/{chunk-MVAQ2WM3.js → chunk-G2XZFGYN.js} +6 -2
  122. package/dist/chunk-G2XZFGYN.js.map +1 -0
  123. package/dist/{chunk-TNSCIPBQ.js → chunk-G6NQ3L4T.js} +2 -2
  124. package/dist/{chunk-5N4MZLEH.js → chunk-GO5LOHCD.js} +2 -2
  125. package/dist/{chunk-AECJY3GJ.js → chunk-GSSDHAYH.js} +2 -2
  126. package/dist/{chunk-JA2QJOAX.js → chunk-HJUP3K6L.js} +2 -2
  127. package/dist/{chunk-ZKZFFWLV.js → chunk-ICNJ6J46.js} +2 -2
  128. package/dist/{chunk-6EHM2AV7.js → chunk-IMBQFHRV.js} +2 -2
  129. package/dist/{chunk-6PRY6CLC.js → chunk-IOPIGX7Y.js} +1 -1
  130. package/dist/{chunk-TRHBQVVO.js → chunk-IS2IDFJP.js} +14 -14
  131. package/dist/{chunk-R4VAUNNC.js → chunk-J4WGTN2N.js} +2 -2
  132. package/dist/{chunk-JPOX2AJB.js → chunk-J7FVMLBR.js} +2 -2
  133. package/dist/{chunk-BYZKLEWG.js → chunk-JAJIMTFB.js} +6 -6
  134. package/dist/{chunk-OKO57IXB.js → chunk-JOP7W24J.js} +11 -11
  135. package/dist/{chunk-YUW66UAH.js → chunk-JUDT33RX.js} +2 -2
  136. package/dist/{chunk-QHT7MOUF.js → chunk-K4A6UVPB.js} +22 -11
  137. package/dist/chunk-K4A6UVPB.js.map +1 -0
  138. package/dist/{chunk-UQNYPK7G.js → chunk-K4JKAXMO.js} +2 -2
  139. package/dist/{chunk-BV4ZKIZH.js → chunk-K75A5XWU.js} +3 -2
  140. package/dist/{chunk-3CBI2ZSA.js → chunk-KG2OOAFF.js} +20 -12
  141. package/dist/chunk-KG2OOAFF.js.map +1 -0
  142. package/dist/{chunk-M6HBPLBA.js → chunk-KOTG3RXE.js} +2 -2
  143. package/dist/{chunk-CWTCMZGE.js → chunk-KTOXQMW3.js} +119 -3
  144. package/dist/chunk-KTOXQMW3.js.map +1 -0
  145. package/dist/{chunk-OB3XMWX5.js → chunk-KVO2BTA4.js} +2 -2
  146. package/dist/{chunk-CBFYCDYO.js → chunk-KY236SP5.js} +3 -3
  147. package/dist/{chunk-4BCHFSC7.js → chunk-LFVZD5EC.js} +3 -3
  148. package/dist/{chunk-GGAXFTNH.js → chunk-LKFVVN7R.js} +2 -2
  149. package/dist/{chunk-IYKZJVL5.js → chunk-MDIEES23.js} +1 -1
  150. package/dist/chunk-MDIEES23.js.map +1 -0
  151. package/dist/{chunk-4RX5O34R.js → chunk-MJC7UKH7.js} +2 -2
  152. package/dist/{chunk-7S53BPTU.js → chunk-MVG3KXON.js} +69 -22
  153. package/dist/chunk-MVG3KXON.js.map +1 -0
  154. package/dist/chunk-NETQXOPY.js +221 -0
  155. package/dist/chunk-NETQXOPY.js.map +1 -0
  156. package/dist/{chunk-UZZ7SQT3.js → chunk-NVVZPBKI.js} +2 -2
  157. package/dist/{chunk-BLDBT6HZ.js → chunk-PJRKLB4Z.js} +18 -2
  158. package/dist/chunk-PJRKLB4Z.js.map +1 -0
  159. package/dist/{chunk-TTSJ7WUC.js → chunk-PKUJNICO.js} +2 -2
  160. package/dist/{chunk-QMWKENNK.js → chunk-Q4AUIFUA.js} +4 -4
  161. package/dist/{chunk-G43PMSME.js → chunk-QE6YVNP5.js} +7 -7
  162. package/dist/{chunk-WKDFJXW5.js → chunk-QM2SPLKQ.js} +1 -1
  163. package/dist/chunk-QM2SPLKQ.js.map +1 -0
  164. package/dist/{chunk-GT4ZHOKT.js → chunk-QPVNK2VE.js} +2 -2
  165. package/dist/{chunk-K5DA5TRG.js → chunk-QS5Q5RBV.js} +2 -2
  166. package/dist/{chunk-BX4EOMKT.js → chunk-RDLPFM7I.js} +2 -2
  167. package/dist/{chunk-EY5JAWZC.js → chunk-RJQAP333.js} +2 -2
  168. package/dist/{chunk-5AERZWJD.js → chunk-RLU2Y5GV.js} +4 -4
  169. package/dist/chunk-RLU2Y5GV.js.map +1 -0
  170. package/dist/{chunk-2OGTN37H.js → chunk-ROEFLU37.js} +4 -4
  171. package/dist/{chunk-62QIQEUC.js → chunk-SFHLQPBF.js} +25 -25
  172. package/dist/chunk-SK7D34OL.js +68 -0
  173. package/dist/chunk-SK7D34OL.js.map +1 -0
  174. package/dist/{chunk-HVS7TH2Y.js → chunk-SUEOG2S4.js} +2 -2
  175. package/dist/{chunk-74AHCL56.js → chunk-TEMKBSV6.js} +2 -2
  176. package/dist/{chunk-LQNRVPTV.js → chunk-THTF2W7M.js} +151 -118
  177. package/dist/chunk-THTF2W7M.js.map +1 -0
  178. package/dist/{chunk-KDFDXEXZ.js → chunk-TO36VPZI.js} +2 -2
  179. package/dist/{chunk-BJEJUOGM.js → chunk-TZ44E732.js} +44 -6
  180. package/dist/chunk-TZ44E732.js.map +1 -0
  181. package/dist/{chunk-JXN77SGO.js → chunk-U2VDCFXW.js} +1 -1
  182. package/dist/chunk-U2VDCFXW.js.map +1 -0
  183. package/dist/{chunk-3OYSIVOO.js → chunk-UZ6JYPJ6.js} +611 -289
  184. package/dist/chunk-UZ6JYPJ6.js.map +1 -0
  185. package/dist/{chunk-M3MYMWXG.js → chunk-V2ZA4YWE.js} +2 -2
  186. package/dist/{chunk-UIOIDW3L.js → chunk-VHKXRYQN.js} +2 -2
  187. package/dist/{chunk-GAS7KYC7.js → chunk-VKWFNPBH.js} +2 -2
  188. package/dist/{chunk-6H2G7RFT.js → chunk-VNQRRUNS.js} +11 -10
  189. package/dist/chunk-VNQRRUNS.js.map +1 -0
  190. package/dist/{chunk-XGRXQR6T.js → chunk-VQWBUPSJ.js} +2 -2
  191. package/dist/{chunk-TUKGXQ5T.js → chunk-VQYWKCDR.js} +2 -2
  192. package/dist/{chunk-PPQEP4OH.js → chunk-W23JARAQ.js} +2 -2
  193. package/dist/{chunk-YQNNHLCG.js → chunk-WPGR3RW4.js} +2 -2
  194. package/dist/{chunk-474DL7UB.js → chunk-WZYHPAG5.js} +3 -3
  195. package/dist/{chunk-5HYUUFMQ.js → chunk-XCPNH2MG.js} +259 -10
  196. package/dist/chunk-XCPNH2MG.js.map +1 -0
  197. package/dist/{chunk-GQQVEH6V.js → chunk-XM46Y66S.js} +2 -2
  198. package/dist/{chunk-JNSENHV5.js → chunk-YRIFXXMI.js} +3 -3
  199. package/dist/{chunk-TRLOFIQC.js → chunk-YTK5MVNF.js} +2 -2
  200. package/dist/{chunk-VMNCZ627.js → chunk-YTZN2UZO.js} +2 -2
  201. package/dist/chunk-Z4GUX2M6.js +94 -0
  202. package/dist/chunk-Z4GUX2M6.js.map +1 -0
  203. package/dist/{chunk-6ZMNTRU3.js → chunk-ZAEPD4C2.js} +2 -2
  204. package/dist/{chunk-KQW3YGEN.js → chunk-ZRMMXWYI.js} +2 -2
  205. package/dist/{chunk-P4ZAEYKG.js → chunk-ZX3AYNNV.js} +6 -3
  206. package/dist/chunk-ZX3AYNNV.js.map +1 -0
  207. package/dist/{chunk-MCRVQ5YQ.js → chunk-ZZCR2QYL.js} +2 -2
  208. package/dist/{cli-BNg-TAlz.d.ts → cli-BWri5-am.d.ts} +5 -5
  209. package/dist/cli.d.ts +18 -16
  210. package/dist/cli.js +80 -79
  211. package/dist/coding/export-okf-codegraph.d.ts +1 -1
  212. package/dist/coding/export-okf-codegraph.js +15 -15
  213. package/dist/coding/pre-action-gate.d.ts +1 -1
  214. package/dist/compounding/engine.d.ts +2 -2
  215. package/dist/compounding/engine.js +16 -16
  216. package/dist/compounding/preference-consolidator.d.ts +1 -1
  217. package/dist/compression-optimizer.d.ts +1 -1
  218. package/dist/config.d.ts +1 -1
  219. package/dist/config.js +6 -5
  220. package/dist/connectors/codex-materialize-runner.d.ts +1 -1
  221. package/dist/connectors/codex-materialize-runner.js +16 -16
  222. package/dist/connectors/codex-materialize.d.ts +1 -1
  223. package/dist/connectors/index.d.ts +1 -1
  224. package/dist/connectors/index.js +16 -16
  225. package/dist/consolidation-provenance-check.d.ts +2 -2
  226. package/dist/consolidation-undo.d.ts +2 -2
  227. package/dist/contradiction/index.d.ts +6 -5
  228. package/dist/converge-config.d.ts +1 -1
  229. package/dist/convergence-refresh.d.ts +2 -2
  230. package/dist/convergence-refresh.js +18 -18
  231. package/dist/conversation-index/backend.d.ts +1 -1
  232. package/dist/conversation-index/chunker.d.ts +1 -1
  233. package/dist/conversation-index/faiss-adapter.d.ts +1 -1
  234. package/dist/conversation-index/indexer.d.ts +1 -1
  235. package/dist/conversation-index/search.d.ts +1 -1
  236. package/dist/corpus-watermark.d.ts +1 -1
  237. package/dist/corpus-watermark.js +18 -18
  238. package/dist/cross-lingual-recall.d.ts +1 -1
  239. package/dist/day-summary.d.ts +1 -1
  240. package/dist/deep-recall-http-glue.d.ts +16 -14
  241. package/dist/deep-recall-http-glue.js +2 -2
  242. package/dist/deep-recall-mcp-tools.d.ts +16 -14
  243. package/dist/deep-recall-policy-llm.d.ts +4 -3
  244. package/dist/deep-recall-policy-llm.js +3 -3
  245. package/dist/deep-recall-seeds.d.ts +1 -1
  246. package/dist/delinearize.d.ts +1 -1
  247. package/dist/dependency-propagation-config.d.ts +1 -1
  248. package/dist/{dependency-propagation-delivery-Cq1ekOwV.d.ts → dependency-propagation-delivery-ueZlKTQB.d.ts} +1 -1
  249. package/dist/direct-answer-wiring.d.ts +1 -1
  250. package/dist/direct-answer.d.ts +1 -1
  251. package/dist/embedding-fallback.d.ts +1 -1
  252. package/dist/enrichment/index.d.ts +1 -1
  253. package/dist/entity-origin-fields.d.ts +1 -1
  254. package/dist/entity-retrieval.d.ts +2 -2
  255. package/dist/entity-retrieval.js +16 -16
  256. package/dist/entity-schema.d.ts +1 -1
  257. package/dist/episodic-context.d.ts +1 -1
  258. package/dist/eval-trajectory-contracts.d.ts +1 -1
  259. package/dist/eval-trajectory-store.d.ts +1 -1
  260. package/dist/eval-trajectory.d.ts +1 -1
  261. package/dist/explicit-capture.d.ts +13 -12
  262. package/dist/external-wiki-access.d.ts +16 -14
  263. package/dist/external-wiki-access.js +40 -40
  264. package/dist/external-wiki-collection-registration.d.ts +1 -1
  265. package/dist/external-wiki-collection.d.ts +1 -1
  266. package/dist/external-wiki-mcp-tools.d.ts +16 -14
  267. package/dist/extraction-error-classification.d.ts +14 -3
  268. package/dist/extraction-error-classification.js +5 -3
  269. package/dist/extraction-faithfulness.d.ts +4 -3
  270. package/dist/extraction-faithfulness.js +3 -3
  271. package/dist/extraction-judge-telemetry.d.ts +4 -3
  272. package/dist/extraction-judge-training.d.ts +4 -3
  273. package/dist/extraction-judge.d.ts +4 -3
  274. package/dist/extraction-judge.js +3 -3
  275. package/dist/extraction-liveness.d.ts +1 -1
  276. package/dist/extraction-normalization.d.ts +1 -1
  277. package/dist/extraction-prompt.d.ts +1 -1
  278. package/dist/extraction-source-grounding-rules.d.ts +1 -1
  279. package/dist/extraction-source-grounding.d.ts +1 -1
  280. package/dist/extraction-span-config.d.ts +1 -1
  281. package/dist/extraction-span-materialize.d.ts +1 -1
  282. package/dist/extraction.d.ts +4 -4
  283. package/dist/extraction.js +26 -24
  284. package/dist/fallback-llm-codex-subscription.d.ts +52 -7
  285. package/dist/fallback-llm-codex-subscription.js +17 -1
  286. package/dist/fallback-llm.d.ts +25 -28
  287. package/dist/fallback-llm.js +4 -3
  288. package/dist/{generic-recall-paths-BcySh_f9.d.ts → generic-recall-paths-CpyVmA88.d.ts} +1 -1
  289. package/dist/graph-append-error.d.ts +1 -1
  290. package/dist/graph-dashboard-diff.d.ts +1 -1
  291. package/dist/graph-dashboard-key.d.ts +1 -1
  292. package/dist/graph-dashboard-parser.d.ts +1 -1
  293. package/dist/graph-edge-reinforcement.d.ts +1 -1
  294. package/dist/graph-jsonl.d.ts +1 -1
  295. package/dist/graph-path-reconstruction.d.ts +1 -1
  296. package/dist/graph-path-scoring.d.ts +1 -1
  297. package/dist/graph-snapshot.d.ts +1 -1
  298. package/dist/graph.d.ts +1 -1
  299. package/dist/harmonic-retrieval.js +1 -1
  300. package/dist/importance.d.ts +1 -1
  301. package/dist/importers/index.d.ts +1 -1
  302. package/dist/importers/test-utils.d.ts +1 -1
  303. package/dist/in-flight-reads.d.ts +1 -1
  304. package/dist/{index-DWOb4wz9.d.ts → index-BvUA4S7M.d.ts} +3 -3
  305. package/dist/index.d.ts +80 -40
  306. package/dist/index.js +140 -115
  307. package/dist/intent.d.ts +1 -1
  308. package/dist/lcm/engine.d.ts +1 -1
  309. package/dist/lcm/engine.js +2 -2
  310. package/dist/lcm/index.d.ts +1 -1
  311. package/dist/lcm/index.js +7 -7
  312. package/dist/lcm/tools.d.ts +1 -1
  313. package/dist/lifecycle.d.ts +1 -1
  314. package/dist/live-connectors-runner.d.ts +1 -1
  315. package/dist/local-llm-BsJGulur.d.ts +247 -0
  316. package/dist/local-llm-config.d.ts +4 -1
  317. package/dist/local-llm-config.js +4 -2
  318. package/dist/local-llm-helpers.d.ts +18 -69
  319. package/dist/local-llm-helpers.js +1 -1
  320. package/dist/local-llm.d.ts +3 -170
  321. package/dist/local-llm.js +2 -2
  322. package/dist/local-model-endpoint.d.ts +1 -1
  323. package/dist/location/index.d.ts +3 -3
  324. package/dist/location/index.js +18 -18
  325. package/dist/maintenance/memory-governance.d.ts +1 -1
  326. package/dist/maintenance/memory-governance.js +16 -16
  327. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +2 -2
  328. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -16
  329. package/dist/maintenance/rebuild-memory-projection.d.ts +2 -2
  330. package/dist/maintenance/rebuild-memory-projection.js +17 -17
  331. package/dist/{maintenance-CW9wCzMP.d.ts → maintenance-CYubtIRr.d.ts} +9 -3
  332. package/dist/mcp-memory-inspector-app.d.ts +16 -14
  333. package/dist/memory-action-policy.d.ts +1 -1
  334. package/dist/memory-cache.d.ts +1 -1
  335. package/dist/memory-controller.d.ts +1 -1
  336. package/dist/memory-lifecycle-ledger-utils.d.ts +1 -1
  337. package/dist/memory-projection-store.d.ts +1 -1
  338. package/dist/memory-provenance.d.ts +1 -1
  339. package/dist/memory-snapshot.d.ts +1 -1
  340. package/dist/memory-subject-cli.d.ts +16 -14
  341. package/dist/memory-subject.d.ts +16 -14
  342. package/dist/memory-worth-outcomes.d.ts +2 -2
  343. package/dist/models-json.d.ts +1 -1
  344. package/dist/namespaces/migrate.d.ts +3 -3
  345. package/dist/namespaces/migrate.js +17 -17
  346. package/dist/namespaces/principal.d.ts +1 -1
  347. package/dist/namespaces/search.d.ts +12 -1
  348. package/dist/namespaces/search.js +9 -9
  349. package/dist/namespaces/storage.d.ts +3 -3
  350. package/dist/namespaces/storage.js +16 -16
  351. package/dist/native-knowledge.d.ts +1 -1
  352. package/dist/offline-sync-impression-drain.d.ts +1 -1
  353. package/dist/operator-doctor-corpus.d.ts +1 -1
  354. package/dist/operator-doctor-corpus.js +19 -19
  355. package/dist/operator-doctor-replica.d.ts +1 -1
  356. package/dist/operator-toolkit.d.ts +3 -3
  357. package/dist/operator-toolkit.js +30 -29
  358. package/dist/orchestration/compression-guideline-coordinator.d.ts +2 -2
  359. package/dist/orchestration/maintenance.d.ts +4 -4
  360. package/dist/orchestration/maintenance.js +27 -27
  361. package/dist/{orchestrator-DocO0_hw.d.ts → orchestrator-BWDRJ_0d.d.ts} +37 -13
  362. package/dist/orchestrator.d.ts +13 -12
  363. package/dist/orchestrator.js +110 -106
  364. package/dist/patterns-cli.d.ts +1 -1
  365. package/dist/{pipeline-CiYcqqhl.d.ts → pipeline-7JMn2yMH.d.ts} +1 -1
  366. package/dist/policy-runtime.d.ts +1 -1
  367. package/dist/proactive-contention.d.ts +2 -2
  368. package/dist/provenance.d.ts +1 -1
  369. package/dist/{public-http-C0FoTiL_.d.ts → public-http-CJWs3mo9.d.ts} +1 -1
  370. package/dist/{qmd-qXD4vatU.d.ts → qmd-CxCH9G9m.d.ts} +2 -2
  371. package/dist/qmd-preflight.d.ts +2 -2
  372. package/dist/qmd-recall-cache.d.ts +1 -1
  373. package/dist/qmd.d.ts +2 -2
  374. package/dist/qmd.js +2 -2
  375. package/dist/recall-concurrency-config.d.ts +1 -1
  376. package/dist/recall-disclosure-escalation.d.ts +1 -1
  377. package/dist/recall-explain-renderer.d.ts +1 -1
  378. package/dist/recall-explain-renderer.js +3 -3
  379. package/dist/recall-memory-map.d.ts +1 -1
  380. package/dist/recall-navigate-access.d.ts +1 -1
  381. package/dist/recall-navigate-access.js +2 -2
  382. package/dist/recall-navigate-disclosure.d.ts +1 -1
  383. package/dist/recall-navigate-disclosure.js +1 -1
  384. package/dist/recall-navigate.d.ts +1 -1
  385. package/dist/recall-navigate.js +2 -2
  386. package/dist/recall-planner-llm.d.ts +3 -2
  387. package/dist/recall-planner-llm.js +4 -3
  388. package/dist/recall-planner-llm.js.map +1 -1
  389. package/dist/recall-state-view-admission.d.ts +13 -3
  390. package/dist/recall-state-view-admission.js +8 -8
  391. package/dist/recall-state-view-anchors.d.ts +85 -0
  392. package/dist/recall-state-view-anchors.js +21 -0
  393. package/dist/recall-state-view-anchors.js.map +1 -0
  394. package/dist/recall-state-view-inject.js +2 -2
  395. package/dist/recall-state-view-render.js +2 -2
  396. package/dist/recall-state-view-widen.js +2 -2
  397. package/dist/recall-state-view-wire.js +3 -3
  398. package/dist/recall-state-view.d.ts +38 -1
  399. package/dist/recall-state-view.js +11 -3
  400. package/dist/recall-state.d.ts +1 -1
  401. package/dist/recall-tag-filter.d.ts +1 -1
  402. package/dist/recall-timings.d.ts +1 -1
  403. package/dist/recall-xray-cli.d.ts +1 -1
  404. package/dist/recall-xray-cli.js +4 -4
  405. package/dist/recall-xray-renderer.d.ts +1 -1
  406. package/dist/recall-xray-renderer.js +3 -3
  407. package/dist/recall-xray.d.ts +1 -1
  408. package/dist/recall-xray.js +2 -2
  409. package/dist/reconcile/cursor.d.ts +1 -1
  410. package/dist/reconcile/manifest.d.ts +1 -1
  411. package/dist/reconcile/plan.d.ts +1 -1
  412. package/dist/replay/normalizers/chatgpt.d.ts +1 -1
  413. package/dist/replay/normalizers/claude.d.ts +1 -1
  414. package/dist/replay/normalizers/openclaw.d.ts +1 -1
  415. package/dist/replay/normalizers/shared.d.ts +1 -1
  416. package/dist/replay/runner.d.ts +1 -1
  417. package/dist/replay/types.d.ts +1 -1
  418. package/dist/replica-divergence.d.ts +1 -1
  419. package/dist/replica-peers-config.d.ts +1 -1
  420. package/dist/resolve-auth-token.d.ts +1 -1
  421. package/dist/resume-bundles.js +7 -6
  422. package/dist/retrieval-agents.d.ts +2 -2
  423. package/dist/retrieval-tiers.d.ts +1 -1
  424. package/dist/routing/engine.d.ts +1 -1
  425. package/dist/routing/store.d.ts +1 -1
  426. package/dist/salvage-envelope.d.ts +1 -1
  427. package/dist/{scope-profiles-BT9rqC3w.d.ts → scope-profiles-BGAUqhBR.d.ts} +1 -1
  428. package/dist/search/embed-helper.d.ts +1 -1
  429. package/dist/search/factory.d.ts +1 -1
  430. package/dist/search/factory.js +8 -8
  431. package/dist/search/index.d.ts +1 -1
  432. package/dist/search/index.js +12 -12
  433. package/dist/search/lancedb-backend.d.ts +1 -1
  434. package/dist/search/lancedb-backend.js +2 -2
  435. package/dist/search/meilisearch-backend.d.ts +1 -1
  436. package/dist/search/meilisearch-backend.js +2 -2
  437. package/dist/search/noop-backend.d.ts +1 -1
  438. package/dist/search/orama-backend.d.ts +1 -1
  439. package/dist/search/orama-backend.js +2 -2
  440. package/dist/search/port.d.ts +2 -2
  441. package/dist/search/port.js +1 -1
  442. package/dist/search/remote-backend.d.ts +1 -1
  443. package/dist/search/remote-backend.js +2 -2
  444. package/dist/{semantic-consolidation-CmZi7thY.d.ts → semantic-consolidation-CCeRD9pV.d.ts} +1 -1
  445. package/dist/semantic-consolidation.d.ts +2 -2
  446. package/dist/semantic-consolidation.js +17 -17
  447. package/dist/semantic-rule-promotion.js +16 -16
  448. package/dist/semantic-rule-verifier.d.ts +1 -1
  449. package/dist/semantic-rule-verifier.js +16 -16
  450. package/dist/{service-CLkA7AQB.d.ts → service-BwpzRduk.d.ts} +2 -2
  451. package/dist/session-observer-bands.d.ts +1 -1
  452. package/dist/session-observer-state.d.ts +1 -1
  453. package/dist/shared-context/manager.d.ts +1 -1
  454. package/dist/signal.d.ts +1 -1
  455. package/dist/source-agent-qualifier.d.ts +1 -1
  456. package/dist/source-agent-qualifier.js +19 -19
  457. package/dist/standup/build.js +16 -16
  458. package/dist/{storage-wvX01lht.d.ts → storage-BprAGBG0.d.ts} +2 -1
  459. package/dist/storage.d.ts +2 -2
  460. package/dist/storage.js +15 -15
  461. package/dist/subject-config.d.ts +1 -1
  462. package/dist/summarizer.d.ts +1 -1
  463. package/dist/summarizer.js +5 -5
  464. package/dist/summary-snapshot.d.ts +1 -1
  465. package/dist/support-passport/index.d.ts +18 -17
  466. package/dist/support-passport/index.js +42 -42
  467. package/dist/task-llm-config.d.ts +16 -0
  468. package/dist/task-llm-config.js +12 -0
  469. package/dist/task-llm-config.js.map +1 -0
  470. package/dist/temporal-supersession.d.ts +2 -2
  471. package/dist/temporal-timeline-recall.d.ts +1 -1
  472. package/dist/temporal-validity.d.ts +1 -1
  473. package/dist/threading.d.ts +1 -1
  474. package/dist/tier-migration.d.ts +2 -2
  475. package/dist/tier-routing.d.ts +1 -1
  476. package/dist/topics.d.ts +1 -1
  477. package/dist/transcript.d.ts +1 -1
  478. package/dist/transfer/export-okf.d.ts +1 -1
  479. package/dist/transfer/export-okf.js +16 -16
  480. package/dist/trust-score-stage.d.ts +1 -1
  481. package/dist/trust-score.d.ts +1 -1
  482. package/dist/{types-Cyr32ABj.d.ts → types-nJV23pa3.d.ts} +1 -1
  483. package/dist/types.d.ts +1 -1
  484. package/dist/types.js +1 -1
  485. package/dist/utility-runtime.d.ts +1 -1
  486. package/dist/verified-recall.js +16 -16
  487. package/dist/who-knows-cli.d.ts +16 -14
  488. package/dist/who-knows-cli.js +17 -17
  489. package/dist/who-knows.d.ts +16 -14
  490. package/dist/who-knows.js +16 -16
  491. package/dist/write-envelope.d.ts +1 -1
  492. package/package.json +2 -2
  493. package/src/access-category-alias.test.ts +93 -0
  494. package/src/access-offline-manifest.ts +52 -2
  495. package/src/access-schema.ts +9 -4
  496. package/src/activity/config.test.ts +61 -0
  497. package/src/activity/config.ts +40 -1
  498. package/src/activity/timeline/analysis-provider.ts +8 -2
  499. package/src/activity/timeline/analysis-run.test.ts +82 -0
  500. package/src/activity/timeline/publish-cli.test.ts +30 -0
  501. package/src/activity/timeline/publish-cli.ts +7 -0
  502. package/src/activity/timeline/query.ts +8 -1
  503. package/src/activity/timeline/regenerate.test.ts +82 -2
  504. package/src/activity/timeline/regenerate.ts +7 -1
  505. package/src/activity/vault-frontmatter.test.ts +99 -1
  506. package/src/activity/vault-frontmatter.ts +131 -0
  507. package/src/activity/vault-publish.ts +6 -0
  508. package/src/activity/vault-publisher.test.ts +172 -0
  509. package/src/activity/vault-publisher.ts +69 -15
  510. package/src/activity/vault-region.test.ts +7 -2
  511. package/src/activity/vault-region.ts +7 -3
  512. package/src/background-generation-config.ts +32 -6
  513. package/src/background-generation.test.ts +10 -1
  514. package/src/cli/timeline-publish-commands.ts +9 -0
  515. package/src/config.test.ts +170 -43
  516. package/src/config.ts +17 -5
  517. package/src/extraction-error-classification.ts +36 -1
  518. package/src/extraction-timeout.test.ts +110 -1
  519. package/src/extraction.test.ts +19 -1
  520. package/src/extraction.ts +23 -21
  521. package/src/fallback-llm-codex-subscription.ts +193 -7
  522. package/src/fallback-llm-parse-failure.test.ts +156 -0
  523. package/src/fallback-llm.test.ts +58 -0
  524. package/src/fallback-llm.ts +187 -186
  525. package/src/index.ts +1 -0
  526. package/src/local-llm-config.ts +11 -10
  527. package/src/local-llm-headers-timeout.test.ts +30 -0
  528. package/src/local-llm-helpers.ts +28 -0
  529. package/src/local-llm.ts +8 -19
  530. package/src/namespaces/search.test.ts +51 -1
  531. package/src/namespaces/search.ts +48 -3
  532. package/src/orchestration/extraction-persist-promotion.test.ts +228 -2
  533. package/src/orchestration/extraction-persist-promotion.ts +17 -14
  534. package/src/orchestration/orchestrator-helpers.test.ts +104 -0
  535. package/src/orchestration/orchestrator-init.ts +366 -106
  536. package/src/orchestration/recall-internal.ts +85 -74
  537. package/src/orchestration/recall-rerank-coordinator.ts +41 -4
  538. package/src/orchestration/recall-search-pipeline.ts +25 -18
  539. package/src/orchestration/recall-state-view-pipeline.test.ts +89 -0
  540. package/src/orchestration/semantic-merge-promotion-payload.ts +62 -6
  541. package/src/orchestration/startup-collection-checks.ts +85 -0
  542. package/src/orchestrator-flush.test.ts +7 -0
  543. package/src/orchestrator-init.test.ts +1539 -0
  544. package/src/orchestrator.ts +7 -0
  545. package/src/qmd.ts +21 -10
  546. package/src/recall-rerank-coordinator.test.ts +153 -0
  547. package/src/recall-state-view-admission.ts +11 -1
  548. package/src/recall-state-view-anchors.ts +163 -0
  549. package/src/recall-state-view-cron-intent.test.ts +268 -0
  550. package/src/recall-state-view-widen.test.ts +14 -5
  551. package/src/recall-state-view-widen.ts +29 -8
  552. package/src/recall-state-view-zero-diff.test.ts +30 -0
  553. package/src/recall-state-view.test.ts +161 -0
  554. package/src/recall-state-view.ts +211 -37
  555. package/src/reconcile-identity-cache.test.ts +82 -1
  556. package/src/search/port.ts +1 -1
  557. package/src/storage/cas-revision-store.test.ts +4 -0
  558. package/src/storage/cas-revision-store.ts +104 -12
  559. package/src/storage-frontmatter-cas.test.ts +19 -17
  560. package/src/summarizer.ts +5 -1
  561. package/src/task-llm-config.test.ts +124 -0
  562. package/src/task-llm-config.ts +88 -0
  563. package/src/testing/subjects/startup-discovery-lifecycle.test.ts +273 -0
  564. package/src/trust-score-recall-paths.test.ts +1 -1
  565. package/src/types.ts +1 -0
  566. package/dist/chunk-255PC37A.js +0 -120
  567. package/dist/chunk-255PC37A.js.map +0 -1
  568. package/dist/chunk-2MT4ADLQ.js.map +0 -1
  569. package/dist/chunk-3CBI2ZSA.js.map +0 -1
  570. package/dist/chunk-3OYSIVOO.js.map +0 -1
  571. package/dist/chunk-5AERZWJD.js.map +0 -1
  572. package/dist/chunk-5HYUUFMQ.js.map +0 -1
  573. package/dist/chunk-6H2G7RFT.js.map +0 -1
  574. package/dist/chunk-7S53BPTU.js.map +0 -1
  575. package/dist/chunk-ACY4ZPF7.js.map +0 -1
  576. package/dist/chunk-B36GUU6T.js.map +0 -1
  577. package/dist/chunk-BJEJUOGM.js.map +0 -1
  578. package/dist/chunk-BLDBT6HZ.js.map +0 -1
  579. package/dist/chunk-CWTCMZGE.js.map +0 -1
  580. package/dist/chunk-IYKZJVL5.js.map +0 -1
  581. package/dist/chunk-JXN77SGO.js.map +0 -1
  582. package/dist/chunk-LQNRVPTV.js.map +0 -1
  583. package/dist/chunk-MVAQ2WM3.js.map +0 -1
  584. package/dist/chunk-P4ZAEYKG.js.map +0 -1
  585. package/dist/chunk-QHT7MOUF.js.map +0 -1
  586. package/dist/chunk-V6G2PSXA.js.map +0 -1
  587. package/dist/chunk-VELCIWJZ.js.map +0 -1
  588. package/dist/chunk-WKDFJXW5.js.map +0 -1
  589. package/dist/chunk-XWLLFKHM.js.map +0 -1
  590. package/dist/chunk-YFTNZMGR.js.map +0 -1
  591. /package/dist/{auto-sync-RP4C6ZPF.js.map → auto-sync-D6BAPIJV.js.map} +0 -0
  592. /package/dist/{chunk-T32B72QX.js.map → chunk-2SKMZUOW.js.map} +0 -0
  593. /package/dist/{chunk-VHOSM5G4.js.map → chunk-2SNCQHJZ.js.map} +0 -0
  594. /package/dist/{chunk-VV4ZVUE6.js.map → chunk-3QEVOQF5.js.map} +0 -0
  595. /package/dist/{chunk-3N3PBBEH.js.map → chunk-3XPN7AVY.js.map} +0 -0
  596. /package/dist/{chunk-XN6XT6GR.js.map → chunk-46Z3VGWF.js.map} +0 -0
  597. /package/dist/{chunk-2PTNJTBE.js.map → chunk-4CMXI55L.js.map} +0 -0
  598. /package/dist/{chunk-A6CKMIPK.js.map → chunk-7D6SER6A.js.map} +0 -0
  599. /package/dist/{chunk-4B3HBIFX.js.map → chunk-7Z54NXVS.js.map} +0 -0
  600. /package/dist/{chunk-X2NFFBTO.js.map → chunk-A7GQBJP5.js.map} +0 -0
  601. /package/dist/{chunk-NWMUSKED.js.map → chunk-BGRTZOJB.js.map} +0 -0
  602. /package/dist/{chunk-ZEGL7YCC.js.map → chunk-BXIJSPCL.js.map} +0 -0
  603. /package/dist/{chunk-MLWMR2GE.js.map → chunk-BYQX4IOG.js.map} +0 -0
  604. /package/dist/{chunk-ULDBGA5W.js.map → chunk-C5R73BON.js.map} +0 -0
  605. /package/dist/{chunk-BD7JTBYP.js.map → chunk-D7MAYFQP.js.map} +0 -0
  606. /package/dist/{chunk-BRZWWUCJ.js.map → chunk-DFVSJFHK.js.map} +0 -0
  607. /package/dist/{chunk-DPMTLJCT.js.map → chunk-ES5BUPYB.js.map} +0 -0
  608. /package/dist/{chunk-TNSCIPBQ.js.map → chunk-G6NQ3L4T.js.map} +0 -0
  609. /package/dist/{chunk-5N4MZLEH.js.map → chunk-GO5LOHCD.js.map} +0 -0
  610. /package/dist/{chunk-AECJY3GJ.js.map → chunk-GSSDHAYH.js.map} +0 -0
  611. /package/dist/{chunk-JA2QJOAX.js.map → chunk-HJUP3K6L.js.map} +0 -0
  612. /package/dist/{chunk-ZKZFFWLV.js.map → chunk-ICNJ6J46.js.map} +0 -0
  613. /package/dist/{chunk-6EHM2AV7.js.map → chunk-IMBQFHRV.js.map} +0 -0
  614. /package/dist/{chunk-6PRY6CLC.js.map → chunk-IOPIGX7Y.js.map} +0 -0
  615. /package/dist/{chunk-TRHBQVVO.js.map → chunk-IS2IDFJP.js.map} +0 -0
  616. /package/dist/{chunk-R4VAUNNC.js.map → chunk-J4WGTN2N.js.map} +0 -0
  617. /package/dist/{chunk-JPOX2AJB.js.map → chunk-J7FVMLBR.js.map} +0 -0
  618. /package/dist/{chunk-BYZKLEWG.js.map → chunk-JAJIMTFB.js.map} +0 -0
  619. /package/dist/{chunk-OKO57IXB.js.map → chunk-JOP7W24J.js.map} +0 -0
  620. /package/dist/{chunk-YUW66UAH.js.map → chunk-JUDT33RX.js.map} +0 -0
  621. /package/dist/{chunk-UQNYPK7G.js.map → chunk-K4JKAXMO.js.map} +0 -0
  622. /package/dist/{chunk-BV4ZKIZH.js.map → chunk-K75A5XWU.js.map} +0 -0
  623. /package/dist/{chunk-M6HBPLBA.js.map → chunk-KOTG3RXE.js.map} +0 -0
  624. /package/dist/{chunk-OB3XMWX5.js.map → chunk-KVO2BTA4.js.map} +0 -0
  625. /package/dist/{chunk-CBFYCDYO.js.map → chunk-KY236SP5.js.map} +0 -0
  626. /package/dist/{chunk-4BCHFSC7.js.map → chunk-LFVZD5EC.js.map} +0 -0
  627. /package/dist/{chunk-GGAXFTNH.js.map → chunk-LKFVVN7R.js.map} +0 -0
  628. /package/dist/{chunk-4RX5O34R.js.map → chunk-MJC7UKH7.js.map} +0 -0
  629. /package/dist/{chunk-UZZ7SQT3.js.map → chunk-NVVZPBKI.js.map} +0 -0
  630. /package/dist/{chunk-TTSJ7WUC.js.map → chunk-PKUJNICO.js.map} +0 -0
  631. /package/dist/{chunk-QMWKENNK.js.map → chunk-Q4AUIFUA.js.map} +0 -0
  632. /package/dist/{chunk-G43PMSME.js.map → chunk-QE6YVNP5.js.map} +0 -0
  633. /package/dist/{chunk-GT4ZHOKT.js.map → chunk-QPVNK2VE.js.map} +0 -0
  634. /package/dist/{chunk-K5DA5TRG.js.map → chunk-QS5Q5RBV.js.map} +0 -0
  635. /package/dist/{chunk-BX4EOMKT.js.map → chunk-RDLPFM7I.js.map} +0 -0
  636. /package/dist/{chunk-EY5JAWZC.js.map → chunk-RJQAP333.js.map} +0 -0
  637. /package/dist/{chunk-2OGTN37H.js.map → chunk-ROEFLU37.js.map} +0 -0
  638. /package/dist/{chunk-62QIQEUC.js.map → chunk-SFHLQPBF.js.map} +0 -0
  639. /package/dist/{chunk-HVS7TH2Y.js.map → chunk-SUEOG2S4.js.map} +0 -0
  640. /package/dist/{chunk-74AHCL56.js.map → chunk-TEMKBSV6.js.map} +0 -0
  641. /package/dist/{chunk-KDFDXEXZ.js.map → chunk-TO36VPZI.js.map} +0 -0
  642. /package/dist/{chunk-M3MYMWXG.js.map → chunk-V2ZA4YWE.js.map} +0 -0
  643. /package/dist/{chunk-UIOIDW3L.js.map → chunk-VHKXRYQN.js.map} +0 -0
  644. /package/dist/{chunk-GAS7KYC7.js.map → chunk-VKWFNPBH.js.map} +0 -0
  645. /package/dist/{chunk-XGRXQR6T.js.map → chunk-VQWBUPSJ.js.map} +0 -0
  646. /package/dist/{chunk-TUKGXQ5T.js.map → chunk-VQYWKCDR.js.map} +0 -0
  647. /package/dist/{chunk-PPQEP4OH.js.map → chunk-W23JARAQ.js.map} +0 -0
  648. /package/dist/{chunk-YQNNHLCG.js.map → chunk-WPGR3RW4.js.map} +0 -0
  649. /package/dist/{chunk-474DL7UB.js.map → chunk-WZYHPAG5.js.map} +0 -0
  650. /package/dist/{chunk-GQQVEH6V.js.map → chunk-XM46Y66S.js.map} +0 -0
  651. /package/dist/{chunk-JNSENHV5.js.map → chunk-YRIFXXMI.js.map} +0 -0
  652. /package/dist/{chunk-TRLOFIQC.js.map → chunk-YTK5MVNF.js.map} +0 -0
  653. /package/dist/{chunk-VMNCZ627.js.map → chunk-YTZN2UZO.js.map} +0 -0
  654. /package/dist/{chunk-6ZMNTRU3.js.map → chunk-ZAEPD4C2.js.map} +0 -0
  655. /package/dist/{chunk-KQW3YGEN.js.map → chunk-ZRMMXWYI.js.map} +0 -0
  656. /package/dist/{chunk-MCRVQ5YQ.js.map → chunk-ZZCR2QYL.js.map} +0 -0
@@ -98,7 +98,8 @@ import {
98
98
  type RecallInvocationOptions,
99
99
  } from "../orchestrator.js";
100
100
  import { isGenericRecallExcludedPath } from "./generic-recall-paths.js";
101
- import { filterRecentScanMemoriesForStateView, indexStateViewAnnotatedResults, resolveRecallStateViewActive } from "../recall-state-view-admission.js";
101
+ import { filterRecentScanMemories } from "../recall-state-view-anchors.js";
102
+ import { indexStateViewAnnotatedResults, resolveRecallStateViewActive } from "../recall-state-view-admission.js";
102
103
  import type { RecallSectionBuckets } from "./recall-section-coordinator.js";
103
104
  import {
104
105
  reconcileRecallResultPartition,
@@ -242,8 +243,11 @@ export class RecallInternalCoordinator {
242
243
  this.deps.effectiveCronRecallInstructionHeavyTokenCap(),
243
244
  cronConversationRecallMode: this.deps.config.cronConversationRecallMode,
244
245
  });
246
+ // #1952 state views: config flag OR per-call override, gated on change intent; computed once for all branches.
245
247
  const retrievalQuery = queryPolicy.retrievalQuery || prompt;
246
- const stateViewActive = resolveRecallStateViewActive(options, this.deps.config, retrievalQuery);
248
+ const stateViewActive = resolveRecallStateViewActive(options, this.deps.config, prompt);
249
+ const stateViewPacketActive =
250
+ stateViewActive === true && !(typeof asOfMs === "number" && Number.isFinite(asOfMs));
247
251
  const retrievalQueryHash = createHash("sha256")
248
252
  .update(retrievalQuery)
249
253
  .digest("hex");
@@ -3996,17 +4000,19 @@ export class RecallInternalCoordinator {
3996
4000
  recallResultLimit,
3997
4001
  retrievalQuery,
3998
4002
  caps,
4003
+ stateViewPacketActive,
3999
4004
  )
4000
4005
  : null;
4001
4006
  memoryResults = hotQmdPartition
4002
4007
  ? [...hotQmdPartition.appliedResults]
4003
- : this.deps.diversifyAndLimitRecallResults(
4008
+ : this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4004
4009
  "memories",
4005
4010
  memoryResults,
4006
4011
  recallResultLimit,
4007
4012
  retrievalQuery,
4008
4013
  caps,
4009
- );
4014
+ stateViewPacketActive,
4015
+ ).appliedResults;
4010
4016
  // E-Mem-inspired memory reconstruction: fill gaps for referenced entities
4011
4017
  if (resolveRecallEnhancementCapabilities(this.deps.config).memoryReconstruction && memoryResults.length > 0) {
4012
4018
  try {
@@ -4120,27 +4126,8 @@ export class RecallInternalCoordinator {
4120
4126
  },
4121
4127
  [] as QmdSearchResult[],
4122
4128
  );
4123
- const embeddingPartition =
4124
- options.xrayCapture === true
4125
- ? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4126
- "memories",
4127
- scoped,
4128
- recallResultLimit,
4129
- retrievalQuery,
4130
- caps,
4131
- )
4132
- : null;
4133
- scoped =
4134
- embeddingPartition?.appliedResults ??
4135
- this.deps.diversifyAndLimitRecallResults(
4136
- "memories",
4137
- scoped,
4138
- recallResultLimit,
4139
- retrievalQuery,
4140
- caps,
4141
- );
4142
- // Issue #1577 — apply TrustScore on the embedding-fallback path so the
4143
- // feature gate is consistent across ALL recall paths (rule 41 parity).
4129
+ // Issue #1577 — trust filter before packet cap (AGENTS.md order).
4130
+ // Feature gate is consistent across ALL recall paths (rule 41 parity).
4144
4131
  {
4145
4132
  // Deadline-bound (issue #1905). This branch has no preloaded
4146
4133
  // frontmatter map (boost ran without one), so pass undefined and let
@@ -4173,6 +4160,27 @@ export class RecallInternalCoordinator {
4173
4160
  success: !trustFellBack,
4174
4161
  });
4175
4162
  }
4163
+ const embeddingPartition =
4164
+ options.xrayCapture === true
4165
+ ? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4166
+ "memories",
4167
+ scoped,
4168
+ recallResultLimit,
4169
+ retrievalQuery,
4170
+ caps,
4171
+ stateViewPacketActive,
4172
+ )
4173
+ : null;
4174
+ scoped =
4175
+ embeddingPartition?.appliedResults ??
4176
+ this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4177
+ "memories",
4178
+ scoped,
4179
+ recallResultLimit,
4180
+ retrievalQuery,
4181
+ caps,
4182
+ stateViewPacketActive,
4183
+ ).appliedResults;
4176
4184
  if (scoped.length > 0) {
4177
4185
  if (shouldPersistGraphSnapshot) {
4178
4186
  graphSnapshotFinalResults = this.deps.buildGraphRecallRankedResults(
@@ -4338,27 +4346,8 @@ export class RecallInternalCoordinator {
4338
4346
  },
4339
4347
  [] as QmdSearchResult[],
4340
4348
  );
4341
- const embeddingPartition =
4342
- options.xrayCapture === true
4343
- ? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4344
- "memories",
4345
- scoped,
4346
- recallResultLimit,
4347
- retrievalQuery,
4348
- caps,
4349
- )
4350
- : null;
4351
- scoped =
4352
- embeddingPartition?.appliedResults ??
4353
- this.deps.diversifyAndLimitRecallResults(
4354
- "memories",
4355
- scoped,
4356
- recallResultLimit,
4357
- retrievalQuery,
4358
- caps,
4359
- );
4360
- // Issue #1577 — apply TrustScore on the embedding-fallback path so the
4361
- // feature gate is consistent across ALL recall paths (rule 41 parity).
4349
+ // Issue #1577 — trust filter before packet cap (AGENTS.md order).
4350
+ // Feature gate is consistent across ALL recall paths (rule 41 parity).
4362
4351
  {
4363
4352
  // Deadline-bound (issue #1905); no preloaded map on this branch.
4364
4353
  const trustT0 = Date.now();
@@ -4388,6 +4377,27 @@ export class RecallInternalCoordinator {
4388
4377
  success: !trustFellBack,
4389
4378
  });
4390
4379
  }
4380
+ const embeddingPartition =
4381
+ options.xrayCapture === true
4382
+ ? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4383
+ "memories",
4384
+ scoped,
4385
+ recallResultLimit,
4386
+ retrievalQuery,
4387
+ caps,
4388
+ stateViewPacketActive,
4389
+ )
4390
+ : null;
4391
+ scoped =
4392
+ embeddingPartition?.appliedResults ??
4393
+ this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4394
+ "memories",
4395
+ scoped,
4396
+ recallResultLimit,
4397
+ retrievalQuery,
4398
+ caps,
4399
+ stateViewPacketActive,
4400
+ ).appliedResults;
4391
4401
  if (scoped.length > 0) {
4392
4402
  if (shouldPersistGraphSnapshot) {
4393
4403
  graphSnapshotFinalResults = this.deps.buildGraphRecallRankedResults(
@@ -4427,16 +4437,15 @@ export class RecallInternalCoordinator {
4427
4437
  [] as MemoryFile[],
4428
4438
  );
4429
4439
  if (memories.length > 0) {
4430
- const activeMemories = filterRecentScanMemoriesForStateView(
4431
- memories,
4432
- this.deps.config,
4433
- {
4440
+ const activeMemories = filterRecentScanMemories(memories, {
4441
+ stateViewActive, asOfMs,
4442
+ namespaceOf: (p) => this.deps.namespaceFromPath(p),
4443
+ isExcluded: (p) => isGenericRecallExcludedPath(p, this.deps.config),
4444
+ supersessionOptions: {
4434
4445
  enabled: lifecycleCaps.temporalSupersession,
4435
4446
  includeInRecall: this.deps.config.temporalSupersessionIncludeInRecall,
4436
4447
  },
4437
- stateViewActive,
4438
- asOfMs,
4439
- );
4448
+ });
4440
4449
  // Convert to QmdSearchResult with recency baseline, then boost so
4441
4450
  // temporal/tag boosts match the QMD path. Cap AFTER boosting, and
4442
4451
  // pass a pre-populated memoryByPath to skip redundant disk reads.
@@ -4541,27 +4550,8 @@ export class RecallInternalCoordinator {
4541
4550
  },
4542
4551
  [] as QmdSearchResult[],
4543
4552
  );
4544
- const recentPartition =
4545
- options.xrayCapture === true
4546
- ? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4547
- "memories",
4548
- recent,
4549
- recallResultLimit,
4550
- retrievalQuery,
4551
- caps,
4552
- )
4553
- : null;
4554
- recent =
4555
- recentPartition?.appliedResults ??
4556
- this.deps.diversifyAndLimitRecallResults(
4557
- "memories",
4558
- recent,
4559
- recallResultLimit,
4560
- retrievalQuery,
4561
- caps,
4562
- );
4563
- // Issue #1577 — apply TrustScore on the recent-scan path so the
4564
- // feature gate is consistent across ALL recall paths (rule 41).
4553
+ // Issue #1577 — trust filter before packet cap (AGENTS.md order).
4554
+ // Feature gate is consistent across ALL recall paths (rule 41).
4565
4555
  {
4566
4556
  // Deadline-bound (issue #1905). The recent-scan branch already
4567
4557
  // loaded every candidate's MemoryFile (queryAwareScopedMemories),
@@ -4597,6 +4587,27 @@ export class RecallInternalCoordinator {
4597
4587
  success: !trustFellBack,
4598
4588
  });
4599
4589
  }
4590
+ const recentPartition =
4591
+ options.xrayCapture === true
4592
+ ? this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4593
+ "memories",
4594
+ recent,
4595
+ recallResultLimit,
4596
+ retrievalQuery,
4597
+ caps,
4598
+ stateViewPacketActive,
4599
+ )
4600
+ : null;
4601
+ recent =
4602
+ recentPartition?.appliedResults ??
4603
+ this.deps.recallRerankCoordinator.diversifyRecallResultsWithHeadroom(
4604
+ "memories",
4605
+ recent,
4606
+ recallResultLimit,
4607
+ retrievalQuery,
4608
+ caps,
4609
+ stateViewPacketActive,
4610
+ ).appliedResults;
4600
4611
  if (recent.length > 0) {
4601
4612
  if (shouldPersistGraphSnapshot) {
4602
4613
  graphSnapshotFinalResults = this.deps.buildGraphRecallRankedResults(
@@ -39,6 +39,7 @@ import type { TrustSignals } from "../trust-score.js";
39
39
  import { reorderRecallResultsWithMmr } from "../recall-mmr.js";
40
40
  import { applyReasoningTraceBoost } from "../reasoning-trace-recall.js";
41
41
  import { memoryMapKey } from "../recall-memory-map.js";
42
+ import { capStateViewPackets, reconcileStateViewPairs } from "../recall-state-view.js";
42
43
 
43
44
  export interface RecallResultPartition {
44
45
  appliedResults: QmdSearchResult[];
@@ -621,12 +622,28 @@ export class RecallRerankCoordinator {
621
622
  limit: number,
622
623
  retrievalQuery?: string,
623
624
  caps: CapabilitySet = resolveCapabilities(this.getConfig()),
625
+ /**
626
+ * #2859 — state-view packet semantics. When true, superseded rows are
627
+ * reconciled against their successors BEFORE MMR (orphan removal can
628
+ * never underfill), and the cap counts complete evidence packets: a
629
+ * predecessor admitted alongside its successor consumes ONE slot and
630
+ * the slice never splits the pair at the boundary. Absent/false keeps
631
+ * the legacy slice byte-identical.
632
+ */
633
+ stateViewActive?: boolean,
624
634
  ): RecallResultPartition {
625
635
  const safeLimit =
626
636
  typeof limit === "number" && Number.isFinite(limit)
627
637
  ? Math.max(0, Math.floor(limit))
628
638
  : 0;
629
- const candidates = Array.isArray(results) ? results : [];
639
+ // #2859: reconcile pairs before the user cap/MMR so orphan removal
640
+ // happens pre-truncation, never post-cap.
641
+ const candidates =
642
+ stateViewActive === true && Array.isArray(results)
643
+ ? reconcileStateViewPairs(results)
644
+ : Array.isArray(results)
645
+ ? results
646
+ : [];
630
647
  let orderedPool: QmdSearchResult[] | undefined;
631
648
  const resolveOrderedPool = (): QmdSearchResult[] => {
632
649
  if (orderedPool) return orderedPool;
@@ -640,15 +657,32 @@ export class RecallRerankCoordinator {
640
657
  orderedPool = this.applyMmrToQmdResults(sectionId, boosted, caps);
641
658
  return orderedPool;
642
659
  };
660
+ let appliedCache: QmdSearchResult[] | undefined;
661
+ const resolveApplied = (): QmdSearchResult[] => {
662
+ if (appliedCache) return appliedCache;
663
+ if (safeLimit === 0 || candidates.length === 0) {
664
+ appliedCache = [];
665
+ return appliedCache;
666
+ }
667
+ const ordered = resolveOrderedPool();
668
+ // #2859: the cap counts complete evidence packets, not rows.
669
+ appliedCache =
670
+ stateViewActive === true ? capStateViewPackets(ordered, safeLimit) : ordered.slice(0, safeLimit);
671
+ return appliedCache;
672
+ };
643
673
 
644
674
  return {
645
675
  get appliedResults(): QmdSearchResult[] {
646
- if (safeLimit === 0 || candidates.length === 0) return [];
647
- return resolveOrderedPool().slice(0, safeLimit);
676
+ return resolveApplied().slice();
648
677
  },
649
678
  get headroomResults(): QmdSearchResult[] {
650
679
  if (candidates.length === 0) return [];
651
- return resolveOrderedPool().slice(safeLimit);
680
+ const ordered = resolveOrderedPool();
681
+ if (stateViewActive === true) {
682
+ const applied = new Set(resolveApplied());
683
+ return ordered.filter((row) => !applied.has(row));
684
+ }
685
+ return ordered.slice(safeLimit);
652
686
  },
653
687
  };
654
688
  }
@@ -659,6 +693,8 @@ export class RecallRerankCoordinator {
659
693
  limit: number,
660
694
  retrievalQuery?: string,
661
695
  caps: CapabilitySet = resolveCapabilities(this.getConfig()),
696
+ /** #2859 — see diversifyRecallResultsWithHeadroom. */
697
+ stateViewActive?: boolean,
662
698
  ): QmdSearchResult[] {
663
699
  return this.diversifyRecallResultsWithHeadroom(
664
700
  sectionId,
@@ -666,6 +702,7 @@ export class RecallRerankCoordinator {
666
702
  limit,
667
703
  retrievalQuery,
668
704
  caps,
705
+ stateViewActive,
669
706
  ).appliedResults;
670
707
  }
671
708
 
@@ -45,6 +45,7 @@ import {
45
45
  } from "./recall-search-prefilter.js";
46
46
  import { shouldFilterSupersededFromRecall } from "../temporal-supersession.js";
47
47
  import { isValidAsOf, isValidityExpiredNow } from "../temporal-validity.js";
48
+ import { StateViewAnchorTracker, stateViewPacketActive } from "../recall-state-view-anchors.js";
48
49
  import type { TrustStageResultItem } from "../trust-score-stage.js";
49
50
  import type { MemoryFile, PluginConfig, QmdSearchResult, RecallPlanMode } from "../types.js";
50
51
  import {
@@ -987,17 +988,22 @@ export class RecallSearchPipelineCoordinator {
987
988
  options.recallResultLimit,
988
989
  options.prompt,
989
990
  caps,
991
+ // #2859: packet semantics are off under a historical asOf pin.
992
+ stateViewPacketActive(options.stateViewActive, options.asOfMs),
990
993
  );
991
994
  options.resultPartitionSink.partition = partition;
992
995
  return partition.appliedResults;
993
996
  }
994
- return this.deps.diversifyAndLimitRecallResults(
995
- "memories",
996
- results,
997
- options.recallResultLimit,
998
- options.prompt,
999
- caps,
1000
- );
997
+ return this.deps.recallRerankCoordinator
998
+ .diversifyRecallResultsWithHeadroom(
999
+ "memories",
1000
+ results,
1001
+ options.recallResultLimit,
1002
+ options.prompt,
1003
+ caps,
1004
+ stateViewPacketActive(options.stateViewActive, options.asOfMs),
1005
+ )
1006
+ .appliedResults;
1001
1007
  }
1002
1008
 
1003
1009
  async loadSearchResultMemoryMap(
@@ -1132,10 +1138,11 @@ export class RecallSearchPipelineCoordinator {
1132
1138
  // when its successor SURVIVES this filter — a successor rejected by
1133
1139
  // the connector/lifecycle/validity/dedicated-surface/status gates
1134
1140
  // must never anchor (or spend a result slot on) its superseded row.
1135
- // Anchors are therefore collected from rows that survive the pass
1136
- // below; superseded rows defer admission to the post-pass fixpoint.
1141
+ // #2859: anchors are namespace-qualified and include the successor
1142
+ // `supersedes` back-pointer (see StateViewAnchorTracker); superseded
1143
+ // rows defer admission to the post-pass fixpoint.
1137
1144
  const stateViewActive = options?.stateViewActive === true;
1138
- const stateViewSurvivorIds = stateViewActive ? new Set<string>() : null;
1145
+ const stateViewAnchors = stateViewActive ? new StateViewAnchorTracker() : null;
1139
1146
  const stateViewDeferred: number[] = [];
1140
1147
  const stateViewBuilt: (QmdSearchResult | null)[] | null = stateViewActive
1141
1148
  ? new Array<QmdSearchResult | null>(results.length).fill(null)
@@ -1150,8 +1157,11 @@ export class RecallSearchPipelineCoordinator {
1150
1157
  ? {
1151
1158
  id: memory.frontmatter.id,
1152
1159
  status: memory.frontmatter.status,
1160
+ supersedes: memory.frontmatter.supersedes,
1153
1161
  supersededBy: memory.frontmatter.supersededBy,
1154
1162
  supersededAt: memory.frontmatter.supersededAt,
1163
+ validAt: memory.frontmatter.valid_at,
1164
+ invalidAt: memory.frontmatter.invalid_at,
1155
1165
  }
1156
1166
  : {}),
1157
1167
  });
@@ -1307,10 +1317,7 @@ export class RecallSearchPipelineCoordinator {
1307
1317
  const builtRow = buildRecallRow(r, memory);
1308
1318
  if (stateViewBuilt !== null) {
1309
1319
  stateViewBuilt[resultIdx] = builtRow;
1310
- if (memory) {
1311
- const id = memory.frontmatter.id;
1312
- if (typeof id === "string" && id.length > 0) stateViewSurvivorIds!.add(id);
1313
- }
1320
+ if (memory && stateViewAnchors) stateViewAnchors.admit(r.namespace, memory.frontmatter);
1314
1321
  }
1315
1322
  filtered.push(builtRow);
1316
1323
  }
@@ -1324,12 +1331,12 @@ export class RecallSearchPipelineCoordinator {
1324
1331
  progress = false;
1325
1332
  for (const deferredIdx of stateViewDeferred) {
1326
1333
  if (admitted.has(deferredIdx)) continue;
1327
- const deferredMemory = memoryForResult(memoryByPath, results[deferredIdx]!);
1334
+ const deferredRow = results[deferredIdx]!;
1335
+ const deferredMemory = memoryForResult(memoryByPath, deferredRow);
1328
1336
  if (!deferredMemory) continue;
1329
- if (stateViewSurvivorIds!.has(deferredMemory.frontmatter.supersededBy ?? "")) {
1337
+ if (stateViewAnchors!.anchored(deferredRow.namespace, deferredMemory.frontmatter)) {
1330
1338
  admitted.add(deferredIdx);
1331
- const id = deferredMemory.frontmatter.id;
1332
- if (typeof id === "string" && id.length > 0) stateViewSurvivorIds!.add(id);
1339
+ stateViewAnchors!.admit(deferredRow.namespace, deferredMemory.frontmatter);
1333
1340
  progress = true;
1334
1341
  }
1335
1342
  }
@@ -209,3 +209,92 @@ test("an anchored predecessor keeps its rank position when admitted", async () =
209
209
  await rm(memoryDir, { recursive: true, force: true });
210
210
  }
211
211
  });
212
+
213
+ test("#2859 namespace fanout collision: a same-id successor in another namespace cannot anchor", async () => {
214
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-sv-fanout-"));
215
+ try {
216
+ const coordinator = await makeCoordinator(memoryDir);
217
+ const A_OLD = "facts/a-old.md";
218
+ const B_NEW = "facts/b-new.md";
219
+ // ns-a: superseded predecessor whose successor id m-1 is NOT in the
220
+ // candidate set. ns-b: an unrelated active row that reuses id m-1.
221
+ // Bare-id matching (pre-#2859) admitted the ns-a predecessor on the
222
+ // ns-b anchor; qualified keys must not.
223
+ const results: QmdSearchResult[] = [
224
+ { ...result(B_NEW, 0.9), namespace: "ns-b" },
225
+ { ...result(A_OLD, 0.7), namespace: "ns-a" },
226
+ ];
227
+ const memories = new Map<string, MemoryFile>([
228
+ [`ns-b\0${B_NEW}`, memory(B_NEW, { id: "m-1", status: "active" })],
229
+ [
230
+ `ns-a\0${A_OLD}`,
231
+ memory(A_OLD, {
232
+ id: "m-0",
233
+ status: "superseded",
234
+ supersededBy: "m-1",
235
+ supersededAt: "2026-08-01",
236
+ }),
237
+ ],
238
+ ]);
239
+ const safe = coordinator.filterSearchResultsByRecallSafety(results, memories, {
240
+ stateViewActive: true,
241
+ });
242
+ assert.deepEqual(
243
+ safe.map((r) => r.path),
244
+ [B_NEW],
245
+ "a foreign-namespace successor must never anchor the superseded row"
246
+ );
247
+
248
+ // Positive control: ns-a's own m-1 present → the pair is admitted.
249
+ const A_NEW = "facts/a-new.md";
250
+ const pairResults: QmdSearchResult[] = [
251
+ { ...result(A_NEW, 0.9), namespace: "ns-a" },
252
+ { ...result(A_OLD, 0.7), namespace: "ns-a" },
253
+ ];
254
+ const pairMemories = new Map<string, MemoryFile>([
255
+ [`ns-a\0${A_NEW}`, memory(A_NEW, { id: "m-1", status: "active" })],
256
+ [`ns-a\0${A_OLD}`, memories.get(`ns-a\0${A_OLD}`)!],
257
+ ]);
258
+ const pair = coordinator.filterSearchResultsByRecallSafety(pairResults, pairMemories, {
259
+ stateViewActive: true,
260
+ });
261
+ assert.deepEqual(
262
+ pair.map((r) => r.path),
263
+ [A_NEW, A_OLD],
264
+ "the same-namespace successor anchors the pair as before"
265
+ );
266
+ } finally {
267
+ await rm(memoryDir, { recursive: true, force: true });
268
+ }
269
+ });
270
+
271
+ test("#2859 back-pointer anchors a deferred row whose supersededBy is absent", async () => {
272
+ const memoryDir = await mkdtemp(path.join(os.tmpdir(), "remnic-sv-backptr-"));
273
+ try {
274
+ const coordinator = await makeCoordinator(memoryDir);
275
+ const results = [result(NEW, 0.9), result(OLD, 0.7)];
276
+ const memories = new Map<string, MemoryFile>([
277
+ [NEW, memory(NEW, { id: "m-new", status: "active", supersedes: "m-old" })],
278
+ [
279
+ OLD,
280
+ memory(OLD, {
281
+ id: "m-old",
282
+ status: "superseded",
283
+ supersededAt: "2026-08-01",
284
+ }),
285
+ ],
286
+ ]);
287
+ const safe = coordinator.filterSearchResultsByRecallSafety(results, memories, {
288
+ stateViewActive: true,
289
+ });
290
+ assert.deepEqual(
291
+ safe.map((r) => r.path),
292
+ [NEW, OLD],
293
+ "the successor's supersedes back-pointer must admit its predecessor"
294
+ );
295
+ assert.equal(safe[1]?.supersedes, undefined, "the admitted row itself has no back-pointer");
296
+ assert.equal(safe[0]?.supersedes, "m-old", "the survivor carries its supersedes back-pointer");
297
+ } finally {
298
+ await rm(memoryDir, { recursive: true, force: true });
299
+ }
300
+ });
@@ -4,7 +4,9 @@
4
4
  * within its file-size ratchet. Everything here derives from the re-read
5
5
  * COMMITTED record; nothing reads the incoming extraction.
6
6
  */
7
-
7
+ import { createHash } from "node:crypto";
8
+ import { readFile } from "node:fs/promises";
9
+ import { canonicalSemanticFileText } from "../storage/cas-revision-store.js";
8
10
  import { parseOriginClass } from "../security/origin-authority.js";
9
11
  import { log } from "../logger.js";
10
12
  import { inferMemoryStatus } from "../memory-lifecycle-ledger-utils.js";
@@ -76,6 +78,15 @@ export interface MergedTargetPromotionPayload {
76
78
  committedRevision?: string;
77
79
  /** #2813 (P1 B): sha256 hex digest of the durable memory file when committed. */
78
80
  committedDigest?: string;
81
+ /** #2870: canonical SEMANTIC fingerprint of the durable file at
82
+ * payload-build time — access telemetry (`accessCount`/`lastAccessed`)
83
+ * excluded, the same exclusion set `invalidationCommitFingerprint`
84
+ * applies. The final guard re-reads the file and compares THIS, not the
85
+ * byte digest: an access-tracking flush between build and promotion
86
+ * leaves it equal (the flush mints no receipt and touches no semantic
87
+ * line), while any body/confidence/provenance/scope/tags/status change
88
+ * makes it differ. */
89
+ committedSemanticFingerprint?: string;
79
90
  }
80
91
 
81
92
  /**
@@ -151,13 +162,22 @@ export async function buildMergedTargetPromotionPayload(
151
162
  return { payload: null, readFailed: false };
152
163
  }
153
164
  const fm = committed.frontmatter;
154
- // #2813 (P1 B): promotion reads record metadata and digest, then receipt.
155
- // Compare record snapshot digest to receipt's committed digest to catch
156
- // interleaving metadata writers with same body/new metadata.
165
+ // #2870: bind to the record's SEMANTIC identity, not its bytes. The
166
+ // receipt's committed semantic fingerprint — the durable file with the
167
+ // access-telemetry keys (`accessCount:`, `lastAccessed:`) stripped, the
168
+ // same exclusion set `invalidationCommitFingerprint` applies — stays
169
+ // equal across an access-tracking flush (which rewrites exactly those
170
+ // two lines without minting a receipt), so a flush between the merge
171
+ // commit and this reread no longer blocks a valid promotion. Any other
172
+ // frontmatter or body change still refuses. Shards recorded before
173
+ // #2870 carry no stored semantic fingerprint; those keep the stricter
174
+ // full-digest comparison until the next semantic write re-records the
175
+ // shard.
157
176
  const snapshotDigest =
158
177
  typeof storage.readDurableFileDigest === "function"
159
178
  ? await storage.readDurableFileDigest(committed.path).catch(() => null)
160
179
  : null;
180
+ const snapshotSemanticFingerprint = await readDurableSemanticFingerprint(committed.path);
161
181
  const receipt = await readPromotionReceiptStatus(storage, committed.path);
162
182
  if (!receipt.available) {
163
183
  log.warn(
@@ -165,7 +185,22 @@ export async function buildMergedTargetPromotionPayload(
165
185
  );
166
186
  return { payload: null, readFailed: true };
167
187
  }
168
- if (receipt.committedDigest !== undefined && snapshotDigest !== receipt.committedDigest) {
188
+ if (
189
+ receipt.committedSemanticFingerprint !== undefined &&
190
+ snapshotSemanticFingerprint !== receipt.committedSemanticFingerprint
191
+ ) {
192
+ log.warn(
193
+ snapshotSemanticFingerprint == null
194
+ ? `semantic-merge: merged-target promotion refused for ${merge.targetId} — the semantic snapshot fingerprint is unavailable while the CAS receipt carries ${receipt.committedSemanticFingerprint}; promotion and reconciliation retry on the next merge`
195
+ : `semantic-merge: merged-target promotion refused for ${merge.targetId} — record semantic fingerprint (${snapshotSemanticFingerprint}) does not match committed receipt fingerprint (${receipt.committedSemanticFingerprint}); record metadata was mutated concurrently`,
196
+ );
197
+ return { payload: null, readFailed: true };
198
+ }
199
+ if (
200
+ receipt.committedSemanticFingerprint === undefined &&
201
+ receipt.committedDigest !== undefined &&
202
+ snapshotDigest !== receipt.committedDigest
203
+ ) {
169
204
  log.warn(
170
205
  snapshotDigest == null
171
206
  ? `semantic-merge: merged-target promotion refused for ${merge.targetId} — the record snapshot digest is unavailable while the CAS receipt carries committed digest ${receipt.committedDigest}; promotion and reconciliation retry on the next merge`
@@ -210,11 +245,30 @@ export async function buildMergedTargetPromotionPayload(
210
245
  : snapshotDigest !== null
211
246
  ? { committedDigest: snapshotDigest }
212
247
  : {}),
248
+ ...(receipt.committedSemanticFingerprint !== undefined
249
+ ? { committedSemanticFingerprint: receipt.committedSemanticFingerprint }
250
+ : snapshotSemanticFingerprint !== null
251
+ ? { committedSemanticFingerprint: snapshotSemanticFingerprint }
252
+ : {}),
213
253
  },
214
254
  readFailed: false,
215
255
  };
216
256
  }
217
257
 
258
+ /** #2870: canonical SEMANTIC fingerprint of a durable file's CURRENT
259
+ * bytes — the file text with access telemetry stripped
260
+ * ({@link canonicalSemanticFileText}), hashed exactly the way the CAS
261
+ * receipt records it at commit time. Null when the file cannot be read
262
+ * (fail-open, like readDurableFileDigest). */
263
+ export async function readDurableSemanticFingerprint(filePath: string): Promise<string | null> {
264
+ try {
265
+ return createHash("sha256")
266
+ .update(canonicalSemanticFileText(await readFile(filePath, "utf8")))
267
+ .digest("hex");
268
+ } catch {
269
+ return null;
270
+ }
271
+ }
218
272
  /** #2813 (P1 A): read the standing receipt as a three-way truth for the
219
273
  * promotion path. Present and absent are usable identities (absent = the
220
274
  * target predates the sidecar); unavailable is not. A storage whose status
@@ -223,7 +277,7 @@ export async function readPromotionReceiptStatus(
223
277
  storage: Pick<StorageManager, "readCasRevisionStatus">,
224
278
  filePath: string,
225
279
  ): Promise<
226
- | { available: true; revision: string | undefined; committedDigest?: string }
280
+ | { available: true; revision: string | undefined; committedDigest?: string; committedSemanticFingerprint?: string }
227
281
  | { available: false; reason: string }
228
282
  > {
229
283
  try {
@@ -233,6 +287,8 @@ export async function readPromotionReceiptStatus(
233
287
  available: true,
234
288
  revision: status.status === "present" ? status.revision : undefined,
235
289
  committedDigest: status.status === "present" ? status.committedDigest : undefined,
290
+ committedSemanticFingerprint:
291
+ status.status === "present" ? status.committedSemanticFingerprint : undefined,
236
292
  };
237
293
  } catch (err) {
238
294
  return { available: false, reason: err instanceof Error ? err.message : String(err) };