@remnic/core 10.0.63 → 10.0.64

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 (326) hide show
  1. package/dist/access-admin-ops-surface.js +46 -46
  2. package/dist/access-authorization-probe.js +47 -47
  3. package/dist/access-boundary.js +46 -46
  4. package/dist/access-cli.js +96 -96
  5. package/dist/access-extraction-force-flush.js +46 -46
  6. package/dist/access-http-briefing.js +47 -47
  7. package/dist/access-http-query.js +48 -48
  8. package/dist/access-http.js +66 -66
  9. package/dist/access-identity-continuity-surface.js +46 -46
  10. package/dist/access-lcm-surface.js +46 -46
  11. package/dist/access-mcp.js +58 -58
  12. package/dist/access-namespace-preflight.js +46 -46
  13. package/dist/access-observe-write-category.js +11 -11
  14. package/dist/access-observe-write-surface.js +46 -46
  15. package/dist/access-offline-manifest.js +10 -10
  16. package/dist/access-operations-batch.js +50 -50
  17. package/dist/access-operations.js +57 -57
  18. package/dist/access-recall-concurrency.js +46 -46
  19. package/dist/access-recall-response.js +46 -46
  20. package/dist/access-recall-surface.js +46 -46
  21. package/dist/access-schema.js +6 -6
  22. package/dist/access-service.js +46 -46
  23. package/dist/access-surface-catalog.js +48 -48
  24. package/dist/active-recall.js +21 -21
  25. package/dist/{auto-sync-UQQ6YJSB.js → auto-sync-ANOJDQD4.js} +7 -7
  26. package/dist/briefing.js +14 -14
  27. package/dist/buffer.js +7 -7
  28. package/dist/{capsule-merge-D4BTIJGK.js → capsule-merge-XVTQJJ6R.js} +4 -4
  29. package/dist/capture-write-lock.js +2 -2
  30. package/dist/causal-behavior.js +2 -2
  31. package/dist/causal-chain.js +2 -2
  32. package/dist/causal-consolidation.js +17 -17
  33. package/dist/causal-retrieval.js +2 -2
  34. package/dist/causal-trajectory-graph.js +3 -3
  35. package/dist/causal-trajectory.js +1 -1
  36. package/dist/{chunk-S4OZKPBS.js → chunk-2D7BTSDW.js} +2 -2
  37. package/dist/{chunk-WB3OFPM2.js → chunk-2DNFRLLL.js} +3 -3
  38. package/dist/{chunk-EKPRLTAE.js → chunk-2RUTN7PR.js} +2 -2
  39. package/dist/{chunk-EAALT5NB.js → chunk-2ZSRACNK.js} +42 -42
  40. package/dist/{chunk-X4PAATLA.js → chunk-3LBDEGQA.js} +4 -4
  41. package/dist/{chunk-2U7ZDC2E.js → chunk-3LSTL6EY.js} +2 -2
  42. package/dist/{chunk-QCAJMIAE.js → chunk-434E4BTO.js} +3 -3
  43. package/dist/{chunk-TPKB7T6Z.js → chunk-4XINO77L.js} +2 -2
  44. package/dist/{chunk-EADUOZWH.js → chunk-5JABRT5G.js} +5 -5
  45. package/dist/{chunk-6I6DFULH.js → chunk-5KDDAQ6K.js} +2 -2
  46. package/dist/{chunk-YDIOMDBW.js → chunk-5QV6CE6K.js} +3 -3
  47. package/dist/{chunk-QI7LLSWX.js → chunk-5UEGL5BF.js} +3 -3
  48. package/dist/{chunk-TMWSCE2L.js → chunk-5ZHFPUBC.js} +11 -11
  49. package/dist/{chunk-TUCEP2LS.js → chunk-63A2BU2B.js} +2 -2
  50. package/dist/{chunk-264B57GV.js → chunk-6D3IWYNY.js} +71 -88
  51. package/dist/chunk-6D3IWYNY.js.map +1 -0
  52. package/dist/{chunk-HJ3UTGIW.js → chunk-6P7U3HWG.js} +4 -4
  53. package/dist/{chunk-UEDC2VGP.js → chunk-7JYK7NNY.js} +2 -2
  54. package/dist/{chunk-IWAB7JVH.js → chunk-7ZTGMEXF.js} +2 -2
  55. package/dist/{chunk-QYAXMXOB.js → chunk-A7BM2JTH.js} +2 -2
  56. package/dist/{chunk-HSHLDSPX.js → chunk-AUFPPBC3.js} +3 -3
  57. package/dist/{chunk-QJ6IR35B.js → chunk-B7VD36TI.js} +4 -4
  58. package/dist/{chunk-ECT5ME6X.js → chunk-BBHKN2CN.js} +2 -2
  59. package/dist/{chunk-WA6XRNWE.js → chunk-BH7NVSEC.js} +4 -4
  60. package/dist/{chunk-QIMGULGN.js → chunk-BNZAR6PO.js} +2 -2
  61. package/dist/{chunk-C5OW2FFB.js → chunk-BOZQAUAJ.js} +2 -2
  62. package/dist/{chunk-WJCXUE2J.js → chunk-BV2BRHD4.js} +5 -5
  63. package/dist/{chunk-Z2T5BPOZ.js → chunk-CIEEYVUB.js} +2 -2
  64. package/dist/{chunk-PA6ZNFB7.js → chunk-CLSKGTAT.js} +2 -2
  65. package/dist/{chunk-YRL4PGPP.js → chunk-DRTSPRWL.js} +2 -2
  66. package/dist/{chunk-ZRSXXWIX.js → chunk-E4QIX2OB.js} +3 -3
  67. package/dist/{chunk-EBRG7ZIK.js → chunk-EBV6VXKF.js} +24 -2
  68. package/dist/{chunk-EBRG7ZIK.js.map → chunk-EBV6VXKF.js.map} +1 -1
  69. package/dist/{chunk-X2ZLHUEO.js → chunk-ECF627KC.js} +2 -2
  70. package/dist/{chunk-XICJL56Z.js → chunk-EI6M5NVK.js} +2 -2
  71. package/dist/{chunk-564YP3DW.js → chunk-ER7XANP3.js} +3 -3
  72. package/dist/{chunk-ILMB3X4X.js → chunk-FKGLJJVS.js} +3 -3
  73. package/dist/{chunk-L74VVEJA.js → chunk-FR7PK7ED.js} +3 -3
  74. package/dist/{chunk-UXRCORZX.js → chunk-FUDKGJDN.js} +2 -2
  75. package/dist/{chunk-GNEB3WXR.js → chunk-G6L3REL3.js} +2 -2
  76. package/dist/{chunk-4P4VLPGB.js → chunk-GKL6QYZO.js} +1 -1
  77. package/dist/{chunk-IMNJJKHW.js → chunk-GRAUQXQB.js} +28 -28
  78. package/dist/{chunk-JVFYP2LD.js → chunk-GROHOWR5.js} +2 -2
  79. package/dist/{chunk-LIUI46BX.js → chunk-H6VJSITJ.js} +2 -2
  80. package/dist/{chunk-YGM47S7M.js → chunk-HFEGRMFG.js} +8 -8
  81. package/dist/{chunk-A6JV3WHI.js → chunk-HG3CG557.js} +2 -2
  82. package/dist/{chunk-7JFXXA57.js → chunk-HHL4MX3W.js} +2 -2
  83. package/dist/{chunk-53OWLEAD.js → chunk-HNOSWPKG.js} +2 -2
  84. package/dist/{chunk-IJKBIOWL.js → chunk-HOR4RMUM.js} +25 -25
  85. package/dist/{chunk-WZEDFDJ6.js → chunk-HRRAOTOQ.js} +15 -15
  86. package/dist/{chunk-A5L5KGDI.js → chunk-IAYUTGF2.js} +2 -2
  87. package/dist/{chunk-WVEEVYMH.js → chunk-IGOW4TJE.js} +3 -3
  88. package/dist/{chunk-MKE5DP3S.js → chunk-IHCXMYSE.js} +2 -2
  89. package/dist/{chunk-SDXBR5QO.js → chunk-IZJQNDGI.js} +2 -2
  90. package/dist/{chunk-BQOOUKEN.js → chunk-JL5HXL25.js} +6 -6
  91. package/dist/{chunk-ZFU2B2GM.js → chunk-JPY3RMG2.js} +5 -5
  92. package/dist/{chunk-TWRPWJJT.js → chunk-JRVMCZE3.js} +2 -2
  93. package/dist/{chunk-FYPKSR6Z.js → chunk-KISOMGY2.js} +2 -2
  94. package/dist/{chunk-J62O2UW5.js → chunk-KNMSD2MQ.js} +2 -2
  95. package/dist/{chunk-MTVC5S5N.js → chunk-KO224R36.js} +2 -2
  96. package/dist/{chunk-UFQB5VQ5.js → chunk-KQJUEQ2E.js} +7 -7
  97. package/dist/{chunk-QNIYL5SK.js → chunk-KQLBXUUQ.js} +2 -2
  98. package/dist/{chunk-W5EO4USJ.js → chunk-KQUSP6LB.js} +2 -2
  99. package/dist/{chunk-BDNPW3KM.js → chunk-KYSSUY66.js} +4 -4
  100. package/dist/{chunk-R25JMO5O.js → chunk-LDHR465K.js} +2 -2
  101. package/dist/{chunk-CYEEVWQ6.js → chunk-LIGZO7XN.js} +2 -2
  102. package/dist/{chunk-QKXPOLQD.js → chunk-M4IEZGCK.js} +2 -2
  103. package/dist/{chunk-Q3DAWUAV.js → chunk-MRF5V5CD.js} +2 -2
  104. package/dist/{chunk-HTTZ3GJ6.js → chunk-MUHGYV2V.js} +2 -2
  105. package/dist/{chunk-HNZH57JK.js → chunk-N4T5FW6U.js} +2 -2
  106. package/dist/{chunk-YLB7TW2B.js → chunk-NM2II57L.js} +4 -4
  107. package/dist/{chunk-3VNRDRBM.js → chunk-OVL5AD3N.js} +2 -2
  108. package/dist/{chunk-3HLWLYRD.js → chunk-P2EM5LKH.js} +2 -2
  109. package/dist/{chunk-XL2EE5W3.js → chunk-PLCYKAWH.js} +2 -2
  110. package/dist/{chunk-JIYJIH5N.js → chunk-QDZWQBLU.js} +3 -3
  111. package/dist/{chunk-YXW4KXCV.js → chunk-QGJSBU4R.js} +2 -2
  112. package/dist/{chunk-DM5QZ3YU.js → chunk-QGVCFVX6.js} +2 -2
  113. package/dist/{chunk-VSHWPOUB.js → chunk-RJWL3RHB.js} +2 -2
  114. package/dist/{chunk-WU5WTCH5.js → chunk-RZH5RVJC.js} +3 -3
  115. package/dist/{chunk-76LKZ42K.js → chunk-SHHZWSSE.js} +2 -2
  116. package/dist/{chunk-N7CATBYH.js → chunk-SNS3DWG6.js} +2 -2
  117. package/dist/{chunk-IVJI5FDA.js → chunk-T22FBDG3.js} +2 -2
  118. package/dist/{chunk-YH7HJNWV.js → chunk-TGQW3AMK.js} +4 -4
  119. package/dist/{chunk-KQXRVELF.js → chunk-TIGYOZBU.js} +2 -2
  120. package/dist/{chunk-Z45353ML.js → chunk-UH6ROXFJ.js} +2 -2
  121. package/dist/{chunk-C2AYUXEF.js → chunk-UYUFDTIX.js} +2 -2
  122. package/dist/{chunk-2AKIVSHP.js → chunk-W26D2USW.js} +2 -2
  123. package/dist/{chunk-FZVZYU5C.js → chunk-W7K5BP3M.js} +3 -3
  124. package/dist/{chunk-ZARHK7PT.js → chunk-WWH7GJ42.js} +2 -2
  125. package/dist/{chunk-4NLHEE2Z.js → chunk-XLCEFUAU.js} +2 -2
  126. package/dist/{chunk-PWEIZCPS.js → chunk-XOFIJGB2.js} +2 -2
  127. package/dist/{chunk-6VBKU3FY.js → chunk-XVQVF2TK.js} +18 -12
  128. package/dist/chunk-XVQVF2TK.js.map +1 -0
  129. package/dist/{chunk-TRSKATZQ.js → chunk-XZ66U5M3.js} +2 -2
  130. package/dist/{chunk-UUZ7KZAO.js → chunk-Y33KJ556.js} +2 -2
  131. package/dist/{chunk-BU4W2ISH.js → chunk-YJQJRXUI.js} +2 -2
  132. package/dist/{chunk-QBK3IM6W.js → chunk-YSATDEBY.js} +2 -2
  133. package/dist/{chunk-WR5POHQ3.js → chunk-YUTT4ZTI.js} +2 -2
  134. package/dist/{chunk-JCL7RO2G.js → chunk-ZOBYTRBU.js} +2 -2
  135. package/dist/{chunk-FMOUUWQN.js → chunk-ZPLQ27MY.js} +3 -3
  136. package/dist/cli.js +81 -81
  137. package/dist/coding/export-okf-codegraph.js +14 -14
  138. package/dist/coding/pre-action-gate.js +2 -2
  139. package/dist/compounding/engine.js +16 -16
  140. package/dist/config.js +21 -21
  141. package/dist/connectors/codex-materialize-runner.js +14 -14
  142. package/dist/connectors/index.js +14 -14
  143. package/dist/consolidation-provenance-check.js +4 -4
  144. package/dist/consolidation-undo.js +3 -3
  145. package/dist/contradiction/index.js +5 -5
  146. package/dist/convergence-refresh.js +16 -16
  147. package/dist/corpus-watermark.js +16 -16
  148. package/dist/deep-recall-http-glue.js +7 -7
  149. package/dist/embedding-fallback.js +3 -3
  150. package/dist/embedding-generation-lock.js +2 -2
  151. package/dist/{entity-canonical-id-migration-CUDCKWPF.js → entity-canonical-id-migration-JJSTZF73.js} +4 -4
  152. package/dist/entity-retrieval.js +14 -14
  153. package/dist/explicit-capture.js +8 -8
  154. package/dist/external-wiki-access.js +47 -47
  155. package/dist/extraction.js +18 -18
  156. package/dist/{forget-E6ZTUKEC.js → forget-DE56ICCL.js} +3 -3
  157. package/dist/{graph-edge-decay-2BZTY2IM.js → graph-edge-decay-OEX5OGMI.js} +6 -6
  158. package/dist/graph-jsonl.js +4 -4
  159. package/dist/graph-snapshot.js +4 -4
  160. package/dist/graph-write-lock.js +2 -2
  161. package/dist/graph.js +3 -3
  162. package/dist/harmonic-retrieval.js +14 -14
  163. package/dist/index.js +96 -96
  164. package/dist/location/index.js +17 -17
  165. package/dist/maintenance/memory-governance.js +14 -14
  166. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +14 -14
  167. package/dist/maintenance/rebuild-memory-projection-runner.js +16 -16
  168. package/dist/maintenance/rebuild-memory-projection.js +15 -15
  169. package/dist/memory-browse-operations.js +47 -47
  170. package/dist/memory-subject.js +3 -3
  171. package/dist/namespaces/migrate.js +15 -15
  172. package/dist/namespaces/storage.js +14 -14
  173. package/dist/offline-sync-changeset-generations.js +4 -4
  174. package/dist/offline-sync-embedding-generation.js +3 -3
  175. package/dist/offline-sync-impression-drain.js +3 -3
  176. package/dist/offline-sync-snapshot-stream.js +6 -6
  177. package/dist/offline-sync.js +5 -5
  178. package/dist/operator-doctor-corpus.js +17 -17
  179. package/dist/operator-toolkit.js +33 -33
  180. package/dist/orchestration/buffer-drain-runner.js +96 -96
  181. package/dist/orchestration/extraction-run-helpers.d.ts +0 -3
  182. package/dist/orchestration/extraction-run-helpers.d.ts.map +1 -1
  183. package/dist/orchestration/extraction-run.d.ts +4 -2
  184. package/dist/orchestration/extraction-run.d.ts.map +1 -1
  185. package/dist/orchestration/maintenance.js +26 -26
  186. package/dist/orchestrator.js +96 -96
  187. package/dist/page-versioning.js +3 -3
  188. package/dist/recall-navigation-operations.js +47 -47
  189. package/dist/recall-navigation.js +46 -46
  190. package/dist/recall-state.js +2 -2
  191. package/dist/reconcile/manifest.js +3 -3
  192. package/dist/{resolution-NNYG37YB.js → resolution-BNWE5Y25.js} +6 -6
  193. package/dist/resume-bundles.js +22 -22
  194. package/dist/salvage-envelope.js +5 -5
  195. package/dist/semantic-consolidation.js +15 -15
  196. package/dist/semantic-rule-promotion.js +14 -14
  197. package/dist/semantic-rule-verifier.js +14 -14
  198. package/dist/source-agent-qualifier.js +17 -17
  199. package/dist/standup/build.js +14 -14
  200. package/dist/storage/buffer-drain-claims.js +2 -2
  201. package/dist/storage/buffer-session-files.js +2 -2
  202. package/dist/storage.d.ts +1 -0
  203. package/dist/storage.d.ts.map +1 -1
  204. package/dist/storage.js +13 -13
  205. package/dist/subject-config.js +4 -4
  206. package/dist/summarizer.js +3 -3
  207. package/dist/summary-snapshot.js +2 -2
  208. package/dist/support-passport/index.js +49 -49
  209. package/dist/transfer/capsule-import.js +4 -4
  210. package/dist/transfer/export-okf.js +14 -14
  211. package/dist/utils/serialize-mutations.d.ts +13 -0
  212. package/dist/utils/serialize-mutations.d.ts.map +1 -1
  213. package/dist/utils/serialize-mutations.js +3 -1
  214. package/dist/verified-recall.js +14 -14
  215. package/dist/who-knows-cli.js +15 -15
  216. package/dist/who-knows.js +14 -14
  217. package/dist/write-envelope.js +4 -4
  218. package/package.json +2 -2
  219. package/src/orchestration/extraction-run-helpers.ts +33 -52
  220. package/src/orchestration/extraction-run.ts +54 -54
  221. package/src/orchestrator-flush.test.ts +103 -79
  222. package/src/storage-update-meta.test.ts +114 -0
  223. package/src/storage.ts +7 -6
  224. package/src/utils/serialize-mutations.ts +53 -0
  225. package/dist/chunk-264B57GV.js.map +0 -1
  226. package/dist/chunk-6VBKU3FY.js.map +0 -1
  227. /package/dist/{auto-sync-UQQ6YJSB.js.map → auto-sync-ANOJDQD4.js.map} +0 -0
  228. /package/dist/{capsule-merge-D4BTIJGK.js.map → capsule-merge-XVTQJJ6R.js.map} +0 -0
  229. /package/dist/{chunk-S4OZKPBS.js.map → chunk-2D7BTSDW.js.map} +0 -0
  230. /package/dist/{chunk-WB3OFPM2.js.map → chunk-2DNFRLLL.js.map} +0 -0
  231. /package/dist/{chunk-EKPRLTAE.js.map → chunk-2RUTN7PR.js.map} +0 -0
  232. /package/dist/{chunk-EAALT5NB.js.map → chunk-2ZSRACNK.js.map} +0 -0
  233. /package/dist/{chunk-X4PAATLA.js.map → chunk-3LBDEGQA.js.map} +0 -0
  234. /package/dist/{chunk-2U7ZDC2E.js.map → chunk-3LSTL6EY.js.map} +0 -0
  235. /package/dist/{chunk-QCAJMIAE.js.map → chunk-434E4BTO.js.map} +0 -0
  236. /package/dist/{chunk-TPKB7T6Z.js.map → chunk-4XINO77L.js.map} +0 -0
  237. /package/dist/{chunk-EADUOZWH.js.map → chunk-5JABRT5G.js.map} +0 -0
  238. /package/dist/{chunk-6I6DFULH.js.map → chunk-5KDDAQ6K.js.map} +0 -0
  239. /package/dist/{chunk-YDIOMDBW.js.map → chunk-5QV6CE6K.js.map} +0 -0
  240. /package/dist/{chunk-QI7LLSWX.js.map → chunk-5UEGL5BF.js.map} +0 -0
  241. /package/dist/{chunk-TMWSCE2L.js.map → chunk-5ZHFPUBC.js.map} +0 -0
  242. /package/dist/{chunk-TUCEP2LS.js.map → chunk-63A2BU2B.js.map} +0 -0
  243. /package/dist/{chunk-HJ3UTGIW.js.map → chunk-6P7U3HWG.js.map} +0 -0
  244. /package/dist/{chunk-UEDC2VGP.js.map → chunk-7JYK7NNY.js.map} +0 -0
  245. /package/dist/{chunk-IWAB7JVH.js.map → chunk-7ZTGMEXF.js.map} +0 -0
  246. /package/dist/{chunk-QYAXMXOB.js.map → chunk-A7BM2JTH.js.map} +0 -0
  247. /package/dist/{chunk-HSHLDSPX.js.map → chunk-AUFPPBC3.js.map} +0 -0
  248. /package/dist/{chunk-QJ6IR35B.js.map → chunk-B7VD36TI.js.map} +0 -0
  249. /package/dist/{chunk-ECT5ME6X.js.map → chunk-BBHKN2CN.js.map} +0 -0
  250. /package/dist/{chunk-WA6XRNWE.js.map → chunk-BH7NVSEC.js.map} +0 -0
  251. /package/dist/{chunk-QIMGULGN.js.map → chunk-BNZAR6PO.js.map} +0 -0
  252. /package/dist/{chunk-C5OW2FFB.js.map → chunk-BOZQAUAJ.js.map} +0 -0
  253. /package/dist/{chunk-WJCXUE2J.js.map → chunk-BV2BRHD4.js.map} +0 -0
  254. /package/dist/{chunk-Z2T5BPOZ.js.map → chunk-CIEEYVUB.js.map} +0 -0
  255. /package/dist/{chunk-PA6ZNFB7.js.map → chunk-CLSKGTAT.js.map} +0 -0
  256. /package/dist/{chunk-YRL4PGPP.js.map → chunk-DRTSPRWL.js.map} +0 -0
  257. /package/dist/{chunk-ZRSXXWIX.js.map → chunk-E4QIX2OB.js.map} +0 -0
  258. /package/dist/{chunk-X2ZLHUEO.js.map → chunk-ECF627KC.js.map} +0 -0
  259. /package/dist/{chunk-XICJL56Z.js.map → chunk-EI6M5NVK.js.map} +0 -0
  260. /package/dist/{chunk-564YP3DW.js.map → chunk-ER7XANP3.js.map} +0 -0
  261. /package/dist/{chunk-ILMB3X4X.js.map → chunk-FKGLJJVS.js.map} +0 -0
  262. /package/dist/{chunk-L74VVEJA.js.map → chunk-FR7PK7ED.js.map} +0 -0
  263. /package/dist/{chunk-UXRCORZX.js.map → chunk-FUDKGJDN.js.map} +0 -0
  264. /package/dist/{chunk-GNEB3WXR.js.map → chunk-G6L3REL3.js.map} +0 -0
  265. /package/dist/{chunk-4P4VLPGB.js.map → chunk-GKL6QYZO.js.map} +0 -0
  266. /package/dist/{chunk-IMNJJKHW.js.map → chunk-GRAUQXQB.js.map} +0 -0
  267. /package/dist/{chunk-JVFYP2LD.js.map → chunk-GROHOWR5.js.map} +0 -0
  268. /package/dist/{chunk-LIUI46BX.js.map → chunk-H6VJSITJ.js.map} +0 -0
  269. /package/dist/{chunk-YGM47S7M.js.map → chunk-HFEGRMFG.js.map} +0 -0
  270. /package/dist/{chunk-A6JV3WHI.js.map → chunk-HG3CG557.js.map} +0 -0
  271. /package/dist/{chunk-7JFXXA57.js.map → chunk-HHL4MX3W.js.map} +0 -0
  272. /package/dist/{chunk-53OWLEAD.js.map → chunk-HNOSWPKG.js.map} +0 -0
  273. /package/dist/{chunk-IJKBIOWL.js.map → chunk-HOR4RMUM.js.map} +0 -0
  274. /package/dist/{chunk-WZEDFDJ6.js.map → chunk-HRRAOTOQ.js.map} +0 -0
  275. /package/dist/{chunk-A5L5KGDI.js.map → chunk-IAYUTGF2.js.map} +0 -0
  276. /package/dist/{chunk-WVEEVYMH.js.map → chunk-IGOW4TJE.js.map} +0 -0
  277. /package/dist/{chunk-MKE5DP3S.js.map → chunk-IHCXMYSE.js.map} +0 -0
  278. /package/dist/{chunk-SDXBR5QO.js.map → chunk-IZJQNDGI.js.map} +0 -0
  279. /package/dist/{chunk-BQOOUKEN.js.map → chunk-JL5HXL25.js.map} +0 -0
  280. /package/dist/{chunk-ZFU2B2GM.js.map → chunk-JPY3RMG2.js.map} +0 -0
  281. /package/dist/{chunk-TWRPWJJT.js.map → chunk-JRVMCZE3.js.map} +0 -0
  282. /package/dist/{chunk-FYPKSR6Z.js.map → chunk-KISOMGY2.js.map} +0 -0
  283. /package/dist/{chunk-J62O2UW5.js.map → chunk-KNMSD2MQ.js.map} +0 -0
  284. /package/dist/{chunk-MTVC5S5N.js.map → chunk-KO224R36.js.map} +0 -0
  285. /package/dist/{chunk-UFQB5VQ5.js.map → chunk-KQJUEQ2E.js.map} +0 -0
  286. /package/dist/{chunk-QNIYL5SK.js.map → chunk-KQLBXUUQ.js.map} +0 -0
  287. /package/dist/{chunk-W5EO4USJ.js.map → chunk-KQUSP6LB.js.map} +0 -0
  288. /package/dist/{chunk-BDNPW3KM.js.map → chunk-KYSSUY66.js.map} +0 -0
  289. /package/dist/{chunk-R25JMO5O.js.map → chunk-LDHR465K.js.map} +0 -0
  290. /package/dist/{chunk-CYEEVWQ6.js.map → chunk-LIGZO7XN.js.map} +0 -0
  291. /package/dist/{chunk-QKXPOLQD.js.map → chunk-M4IEZGCK.js.map} +0 -0
  292. /package/dist/{chunk-Q3DAWUAV.js.map → chunk-MRF5V5CD.js.map} +0 -0
  293. /package/dist/{chunk-HTTZ3GJ6.js.map → chunk-MUHGYV2V.js.map} +0 -0
  294. /package/dist/{chunk-HNZH57JK.js.map → chunk-N4T5FW6U.js.map} +0 -0
  295. /package/dist/{chunk-YLB7TW2B.js.map → chunk-NM2II57L.js.map} +0 -0
  296. /package/dist/{chunk-3VNRDRBM.js.map → chunk-OVL5AD3N.js.map} +0 -0
  297. /package/dist/{chunk-3HLWLYRD.js.map → chunk-P2EM5LKH.js.map} +0 -0
  298. /package/dist/{chunk-XL2EE5W3.js.map → chunk-PLCYKAWH.js.map} +0 -0
  299. /package/dist/{chunk-JIYJIH5N.js.map → chunk-QDZWQBLU.js.map} +0 -0
  300. /package/dist/{chunk-YXW4KXCV.js.map → chunk-QGJSBU4R.js.map} +0 -0
  301. /package/dist/{chunk-DM5QZ3YU.js.map → chunk-QGVCFVX6.js.map} +0 -0
  302. /package/dist/{chunk-VSHWPOUB.js.map → chunk-RJWL3RHB.js.map} +0 -0
  303. /package/dist/{chunk-WU5WTCH5.js.map → chunk-RZH5RVJC.js.map} +0 -0
  304. /package/dist/{chunk-76LKZ42K.js.map → chunk-SHHZWSSE.js.map} +0 -0
  305. /package/dist/{chunk-N7CATBYH.js.map → chunk-SNS3DWG6.js.map} +0 -0
  306. /package/dist/{chunk-IVJI5FDA.js.map → chunk-T22FBDG3.js.map} +0 -0
  307. /package/dist/{chunk-YH7HJNWV.js.map → chunk-TGQW3AMK.js.map} +0 -0
  308. /package/dist/{chunk-KQXRVELF.js.map → chunk-TIGYOZBU.js.map} +0 -0
  309. /package/dist/{chunk-Z45353ML.js.map → chunk-UH6ROXFJ.js.map} +0 -0
  310. /package/dist/{chunk-C2AYUXEF.js.map → chunk-UYUFDTIX.js.map} +0 -0
  311. /package/dist/{chunk-2AKIVSHP.js.map → chunk-W26D2USW.js.map} +0 -0
  312. /package/dist/{chunk-FZVZYU5C.js.map → chunk-W7K5BP3M.js.map} +0 -0
  313. /package/dist/{chunk-ZARHK7PT.js.map → chunk-WWH7GJ42.js.map} +0 -0
  314. /package/dist/{chunk-4NLHEE2Z.js.map → chunk-XLCEFUAU.js.map} +0 -0
  315. /package/dist/{chunk-PWEIZCPS.js.map → chunk-XOFIJGB2.js.map} +0 -0
  316. /package/dist/{chunk-TRSKATZQ.js.map → chunk-XZ66U5M3.js.map} +0 -0
  317. /package/dist/{chunk-UUZ7KZAO.js.map → chunk-Y33KJ556.js.map} +0 -0
  318. /package/dist/{chunk-BU4W2ISH.js.map → chunk-YJQJRXUI.js.map} +0 -0
  319. /package/dist/{chunk-QBK3IM6W.js.map → chunk-YSATDEBY.js.map} +0 -0
  320. /package/dist/{chunk-WR5POHQ3.js.map → chunk-YUTT4ZTI.js.map} +0 -0
  321. /package/dist/{chunk-JCL7RO2G.js.map → chunk-ZOBYTRBU.js.map} +0 -0
  322. /package/dist/{chunk-FMOUUWQN.js.map → chunk-ZPLQ27MY.js.map} +0 -0
  323. /package/dist/{entity-canonical-id-migration-CUDCKWPF.js.map → entity-canonical-id-migration-JJSTZF73.js.map} +0 -0
  324. /package/dist/{forget-E6ZTUKEC.js.map → forget-DE56ICCL.js.map} +0 -0
  325. /package/dist/{graph-edge-decay-2BZTY2IM.js.map → graph-edge-decay-OEX5OGMI.js.map} +0 -0
  326. /package/dist/{resolution-NNYG37YB.js.map → resolution-BNWE5Y25.js.map} +0 -0
@@ -4,13 +4,13 @@ import {
4
4
  renderWhoKnows,
5
5
  renderWhoKnowsJson,
6
6
  renderWhoKnowsText
7
- } from "./chunk-A6JV3WHI.js";
8
- import "./chunk-R25JMO5O.js";
9
- import "./chunk-6VBKU3FY.js";
7
+ } from "./chunk-HG3CG557.js";
8
+ import "./chunk-LDHR465K.js";
9
+ import "./chunk-XVQVF2TK.js";
10
10
  import "./chunk-UHVXE24Y.js";
11
- import "./chunk-DM5QZ3YU.js";
12
- import "./chunk-WVEEVYMH.js";
13
- import "./chunk-JCL7RO2G.js";
11
+ import "./chunk-QGVCFVX6.js";
12
+ import "./chunk-IGOW4TJE.js";
13
+ import "./chunk-ZOBYTRBU.js";
14
14
  import "./chunk-G6OFEGUR.js";
15
15
  import "./chunk-OH55F76C.js";
16
16
  import "./chunk-L334PSLW.js";
@@ -36,7 +36,7 @@ import "./chunk-LDXUBPMO.js";
36
36
  import "./chunk-FF6N7BXC.js";
37
37
  import "./chunk-WXPBDEMW.js";
38
38
  import "./chunk-AAD2ZS6P.js";
39
- import "./chunk-WJCXUE2J.js";
39
+ import "./chunk-BV2BRHD4.js";
40
40
  import "./chunk-ZIKENA2C.js";
41
41
  import "./chunk-YXZG5TVN.js";
42
42
  import "./chunk-3OUGSOJP.js";
@@ -46,16 +46,16 @@ import "./chunk-3WU7XOFN.js";
46
46
  import "./chunk-P4GUQSK3.js";
47
47
  import "./chunk-4LZ7SVKM.js";
48
48
  import "./chunk-YHTG64XV.js";
49
- import "./chunk-564YP3DW.js";
49
+ import "./chunk-ER7XANP3.js";
50
50
  import "./chunk-M5GVCJSJ.js";
51
51
  import "./chunk-RBOJCG4T.js";
52
- import "./chunk-A5L5KGDI.js";
52
+ import "./chunk-IAYUTGF2.js";
53
53
  import "./chunk-5WITETWU.js";
54
54
  import "./chunk-6CIAGZ6X.js";
55
55
  import "./chunk-7CT3AI52.js";
56
56
  import "./chunk-G7D6GZ5J.js";
57
57
  import "./chunk-7VLBZKNB.js";
58
- import "./chunk-UUZ7KZAO.js";
58
+ import "./chunk-Y33KJ556.js";
59
59
  import "./chunk-ELHJK7LM.js";
60
60
  import "./chunk-IUM3VSHI.js";
61
61
  import "./chunk-NWA6IXR3.js";
@@ -80,27 +80,27 @@ import "./chunk-PJKTFXE2.js";
80
80
  import "./chunk-W5BIQOAJ.js";
81
81
  import "./chunk-SEA56G6S.js";
82
82
  import "./chunk-YBA52OKG.js";
83
- import "./chunk-TWRPWJJT.js";
83
+ import "./chunk-JRVMCZE3.js";
84
84
  import "./chunk-BT7NVCML.js";
85
- import "./chunk-SDXBR5QO.js";
85
+ import "./chunk-IZJQNDGI.js";
86
86
  import "./chunk-BJMBJZ2Y.js";
87
87
  import "./chunk-UKJAGEXH.js";
88
88
  import "./chunk-FP2373TW.js";
89
89
  import "./chunk-L272A5QW.js";
90
- import "./chunk-QIMGULGN.js";
90
+ import "./chunk-BNZAR6PO.js";
91
91
  import "./chunk-ZA53AZND.js";
92
92
  import "./chunk-7RJUVTVF.js";
93
93
  import "./chunk-AL3UYZ5N.js";
94
94
  import "./chunk-RL6NEVXT.js";
95
95
  import "./chunk-YET735EZ.js";
96
96
  import "./chunk-PWPIERBM.js";
97
- import "./chunk-W5EO4USJ.js";
97
+ import "./chunk-KQUSP6LB.js";
98
98
  import "./chunk-5FVVY2EB.js";
99
99
  import "./chunk-BTNNL7ZW.js";
100
100
  import "./chunk-JDSVLVCG.js";
101
101
  import "./chunk-5GKPFL3S.js";
102
102
  import "./chunk-JAKIDQB2.js";
103
- import "./chunk-EBRG7ZIK.js";
103
+ import "./chunk-EBV6VXKF.js";
104
104
  import "./chunk-P7FMDTKL.js";
105
105
  import "./chunk-VUFL7X3H.js";
106
106
  import "./chunk-C5LWPYS3.js";
package/dist/who-knows.js CHANGED
@@ -9,12 +9,12 @@ import {
9
9
  loadWhoKnowsEntities,
10
10
  tokenizeTopic,
11
11
  validateWhoKnowsInput
12
- } from "./chunk-R25JMO5O.js";
13
- import "./chunk-6VBKU3FY.js";
12
+ } from "./chunk-LDHR465K.js";
13
+ import "./chunk-XVQVF2TK.js";
14
14
  import "./chunk-UHVXE24Y.js";
15
- import "./chunk-DM5QZ3YU.js";
16
- import "./chunk-WVEEVYMH.js";
17
- import "./chunk-JCL7RO2G.js";
15
+ import "./chunk-QGVCFVX6.js";
16
+ import "./chunk-IGOW4TJE.js";
17
+ import "./chunk-ZOBYTRBU.js";
18
18
  import "./chunk-G6OFEGUR.js";
19
19
  import "./chunk-OH55F76C.js";
20
20
  import "./chunk-L334PSLW.js";
@@ -40,7 +40,7 @@ import "./chunk-LDXUBPMO.js";
40
40
  import "./chunk-FF6N7BXC.js";
41
41
  import "./chunk-WXPBDEMW.js";
42
42
  import "./chunk-AAD2ZS6P.js";
43
- import "./chunk-WJCXUE2J.js";
43
+ import "./chunk-BV2BRHD4.js";
44
44
  import "./chunk-ZIKENA2C.js";
45
45
  import "./chunk-YXZG5TVN.js";
46
46
  import "./chunk-3OUGSOJP.js";
@@ -50,16 +50,16 @@ import "./chunk-3WU7XOFN.js";
50
50
  import "./chunk-P4GUQSK3.js";
51
51
  import "./chunk-4LZ7SVKM.js";
52
52
  import "./chunk-YHTG64XV.js";
53
- import "./chunk-564YP3DW.js";
53
+ import "./chunk-ER7XANP3.js";
54
54
  import "./chunk-M5GVCJSJ.js";
55
55
  import "./chunk-RBOJCG4T.js";
56
- import "./chunk-A5L5KGDI.js";
56
+ import "./chunk-IAYUTGF2.js";
57
57
  import "./chunk-5WITETWU.js";
58
58
  import "./chunk-6CIAGZ6X.js";
59
59
  import "./chunk-7CT3AI52.js";
60
60
  import "./chunk-G7D6GZ5J.js";
61
61
  import "./chunk-7VLBZKNB.js";
62
- import "./chunk-UUZ7KZAO.js";
62
+ import "./chunk-Y33KJ556.js";
63
63
  import "./chunk-ELHJK7LM.js";
64
64
  import "./chunk-IUM3VSHI.js";
65
65
  import "./chunk-NWA6IXR3.js";
@@ -84,27 +84,27 @@ import "./chunk-PJKTFXE2.js";
84
84
  import "./chunk-W5BIQOAJ.js";
85
85
  import "./chunk-SEA56G6S.js";
86
86
  import "./chunk-YBA52OKG.js";
87
- import "./chunk-TWRPWJJT.js";
87
+ import "./chunk-JRVMCZE3.js";
88
88
  import "./chunk-BT7NVCML.js";
89
- import "./chunk-SDXBR5QO.js";
89
+ import "./chunk-IZJQNDGI.js";
90
90
  import "./chunk-BJMBJZ2Y.js";
91
91
  import "./chunk-UKJAGEXH.js";
92
92
  import "./chunk-FP2373TW.js";
93
93
  import "./chunk-L272A5QW.js";
94
- import "./chunk-QIMGULGN.js";
94
+ import "./chunk-BNZAR6PO.js";
95
95
  import "./chunk-ZA53AZND.js";
96
96
  import "./chunk-7RJUVTVF.js";
97
97
  import "./chunk-AL3UYZ5N.js";
98
98
  import "./chunk-RL6NEVXT.js";
99
99
  import "./chunk-YET735EZ.js";
100
100
  import "./chunk-PWPIERBM.js";
101
- import "./chunk-W5EO4USJ.js";
101
+ import "./chunk-KQUSP6LB.js";
102
102
  import "./chunk-5FVVY2EB.js";
103
103
  import "./chunk-BTNNL7ZW.js";
104
104
  import "./chunk-JDSVLVCG.js";
105
105
  import "./chunk-5GKPFL3S.js";
106
106
  import "./chunk-JAKIDQB2.js";
107
- import "./chunk-EBRG7ZIK.js";
107
+ import "./chunk-EBV6VXKF.js";
108
108
  import "./chunk-P7FMDTKL.js";
109
109
  import "./chunk-VUFL7X3H.js";
110
110
  import "./chunk-C5LWPYS3.js";
@@ -12,15 +12,15 @@ import {
12
12
  isMemoryCategory,
13
13
  isSealedMemoryEnvelope,
14
14
  sealedWriteToLegacyArgs
15
- } from "./chunk-TWRPWJJT.js";
15
+ } from "./chunk-JRVMCZE3.js";
16
16
  import "./chunk-BT7NVCML.js";
17
- import "./chunk-SDXBR5QO.js";
18
- import "./chunk-W5EO4USJ.js";
17
+ import "./chunk-IZJQNDGI.js";
18
+ import "./chunk-KQUSP6LB.js";
19
19
  import "./chunk-5FVVY2EB.js";
20
20
  import "./chunk-JDSVLVCG.js";
21
21
  import "./chunk-5GKPFL3S.js";
22
22
  import "./chunk-JAKIDQB2.js";
23
- import "./chunk-EBRG7ZIK.js";
23
+ import "./chunk-EBV6VXKF.js";
24
24
  import "./chunk-P7FMDTKL.js";
25
25
  import "./chunk-X4OZMANG.js";
26
26
  import "./chunk-R2MBW2S4.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/core",
3
- "version": "10.0.63",
3
+ "version": "10.0.64",
4
4
  "description": "Framework-agnostic Remnic memory engine — orchestrator, storage, extraction, search, trust zones",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -3376,7 +3376,7 @@
3376
3376
  "core"
3377
3377
  ],
3378
3378
  "peerDependencies": {
3379
- "@remnic/coding-graph": "^10.0.63"
3379
+ "@remnic/coding-graph": "^10.0.64"
3380
3380
  },
3381
3381
  "peerDependenciesMeta": {
3382
3382
  "@remnic/coding-graph": {
@@ -206,7 +206,6 @@ export async function runExtractionDeferRetention(
206
206
  export interface ExtractionPostPersistOptions {
207
207
  result: ExtractionResult;
208
208
  storage: StorageManager;
209
- meta?: MetaState;
210
209
  extractionFingerprint?: string;
211
210
  shouldPersistProcessedFingerprint: boolean;
212
211
  recordProcessedExtractionFingerprint: (
@@ -239,7 +238,6 @@ export interface ExtractionPostPersistOptions {
239
238
  }
240
239
 
241
240
  export interface ExtractionPostPersistResult {
242
- meta?: MetaState;
243
241
  metadataFailed: boolean;
244
242
  }
245
243
 
@@ -255,41 +253,31 @@ export async function runExtractionPostPersist(
255
253
  }
256
254
  log.warn(`runExtraction: ${stage} failed after durable persistence; continuing with buffer clear`, error);
257
255
  };
258
- let meta = options.meta;
256
+ // Applied under the storage's per-dir meta lock (storage.updateMeta): the
257
+ // fingerprint record and the counters land on a FRESHLY loaded meta, so a
258
+ // concurrent extraction's updates are not reverted by this save.
259
+ const applyPostPersistMetadata = async (fresh: MetaState): Promise<void> => {
260
+ if (options.extractionFingerprint && options.shouldPersistProcessedFingerprint) {
261
+ try {
262
+ await options.recordProcessedExtractionFingerprint(options.storage, options.extractionFingerprint, fresh);
263
+ } catch (error) {
264
+ metadataFailed = true;
265
+ log.warn("runExtraction: processed fingerprint failed after durable persistence; continuing with buffer clear", error);
266
+ }
267
+ }
268
+ fresh.extractionCount += 1;
269
+ fresh.lastExtractionAt = new Date().toISOString();
270
+ fresh.totalMemories += Array.isArray(options.result.facts) ? options.result.facts.length : 0;
271
+ fresh.totalEntities += Array.isArray(options.result.entities) ? options.result.entities.length : 0;
272
+ };
259
273
  try {
260
- meta ??= (await options.runDeadlineAware(
261
- () => options.storage.loadMeta(),
262
- "during_post_persist_load_meta",
274
+ await options.runDeadlineAware(
275
+ () => options.storage.updateMeta(applyPostPersistMetadata),
276
+ "during_post_persist_meta_save",
263
277
  false,
264
- )) as MetaState;
278
+ );
265
279
  } catch (error) {
266
- recordFailure("metadata load", error);
267
- }
268
- if (meta && options.extractionFingerprint && options.shouldPersistProcessedFingerprint) {
269
- try {
270
- await options.runDeadlineAware(
271
- () => options.recordProcessedExtractionFingerprint(options.storage, options.extractionFingerprint!, meta!),
272
- "during_post_persist_fingerprint",
273
- false,
274
- );
275
- } catch (error) {
276
- recordFailure("processed fingerprint", error);
277
- }
278
- }
279
- if (meta) {
280
- meta.extractionCount += 1;
281
- meta.lastExtractionAt = new Date().toISOString();
282
- meta.totalMemories += Array.isArray(options.result.facts) ? options.result.facts.length : 0;
283
- meta.totalEntities += Array.isArray(options.result.entities) ? options.result.entities.length : 0;
284
- try {
285
- await options.runDeadlineAware(
286
- () => options.storage.saveMeta(meta!),
287
- "during_post_persist_meta_save",
288
- false,
289
- );
290
- } catch (error) {
291
- recordFailure("metadata save", error);
292
- }
280
+ recordFailure("metadata save", error);
293
281
  }
294
282
  const runBestEffort = options.runPostPersistBestEffort;
295
283
  await runExtractionDeferRetention(runBestEffort, {
@@ -313,7 +301,7 @@ export async function runExtractionPostPersist(
313
301
  throw options.createDeadlineError("during_buffer_clear");
314
302
  }
315
303
  if (deadlineError) throw deadlineError;
316
- return { meta, metadataFailed };
304
+ return { metadataFailed };
317
305
  }
318
306
 
319
307
  /**
@@ -325,7 +313,6 @@ export async function runExtractionPostPersist(
325
313
  */
326
314
  export async function commitEmptySuccessExtraction(args: {
327
315
  storage: StorageManager;
328
- meta: MetaState | null;
329
316
  extractionFingerprint: string | null;
330
317
  shouldPersistProcessedFingerprint: boolean;
331
318
  hasExtractionFailure: boolean;
@@ -336,7 +323,6 @@ export async function commitEmptySuccessExtraction(args: {
336
323
  }): Promise<void> {
337
324
  const {
338
325
  storage,
339
- meta: existingMeta,
340
326
  extractionFingerprint,
341
327
  shouldPersistProcessedFingerprint,
342
328
  hasExtractionFailure,
@@ -355,22 +341,17 @@ export async function commitEmptySuccessExtraction(args: {
355
341
 
356
342
  const metadataFailureIsFatal = shouldRecordFingerprint;
357
343
  try {
358
- const meta =
359
- existingMeta ??
360
- await runDeadlineAware(
361
- () => storage.loadMeta(),
362
- "during_empty_success_liveness_load",
363
- false,
364
- );
365
- if (shouldRecordFingerprint) {
366
- await recordProcessedExtractionFingerprint(storage, extractionFingerprint, meta);
367
- }
368
- if (shouldStampLiveness) {
369
- meta.extractionCount += 1;
370
- meta.lastExtractionAt = new Date().toISOString();
371
- }
372
344
  await runDeadlineAware(
373
- () => storage.saveMeta(meta),
345
+ () =>
346
+ storage.updateMeta(async (meta) => {
347
+ if (shouldRecordFingerprint) {
348
+ await recordProcessedExtractionFingerprint(storage, extractionFingerprint!, meta);
349
+ }
350
+ if (shouldStampLiveness) {
351
+ meta.extractionCount += 1;
352
+ meta.lastExtractionAt = new Date().toISOString();
353
+ }
354
+ }),
374
355
  "during_empty_success_liveness_save",
375
356
  false,
376
357
  );
@@ -363,10 +363,8 @@ export class ExtractionRunCoordinator {
363
363
  }
364
364
  }
365
365
  }
366
- /** Record an extraction failure into per-fingerprint backoff state + breaker,
367
- * persisting to namespace meta. Fail-open: never throws upward. */
366
+ /** Record an extraction failure into per-fingerprint backoff state + breaker, persisting to namespace meta. Fail-open. */
368
367
  private async recordExtractionFailure(
369
- storage: StorageManager,
370
368
  namespace: string,
371
369
  fingerprint: string,
372
370
  cls: ExtractionFailureClass,
@@ -375,35 +373,45 @@ export class ExtractionRunCoordinator {
375
373
  ): Promise<void> {
376
374
  try {
377
375
  this.hydrateRetryStateFromMeta(namespace, meta);
378
- const nsMap = this.extractionRetryState.get(namespace) ?? new Map<string, ExtractionRetryStateEntry>();
379
- const prev = nsMap.get(fingerprint);
380
- const attempts = (prev?.attempts ?? 0) + 1;
381
- const firstFailedAtMs = prev?.firstFailedAtMs ?? now;
382
- let nextEligibleAtMs: number;
383
- if (cls === "parse_empty" && attempts > this.config.extractionParseEmptyMaxAttempts) {
384
- // parse_empty exhausted its attempt budget → long-park (still never
385
- // marked processed). A dead gateway also yields unparseable output.
386
- nextEligibleAtMs = now + Math.max(0, this.config.extractionRetryMaxBackoffMs);
387
- } else {
388
- nextEligibleAtMs = computeExtractionRetryNextEligibleMs(
389
- attempts,
390
- this.config.extractionRetryScheduleMs,
391
- this.config.extractionRetryMaxBackoffMs,
392
- this.config.extractionRetryJitterRatio,
393
- now,
394
- );
395
- }
396
- nsMap.set(fingerprint, { attempts, nextEligibleAtMs, firstFailedAtMs, lastFailureClass: cls });
397
- this.extractionRetryState.set(namespace, nsMap);
398
- this.onProviderFailure(cls, now);
376
+ this.applyExtractionFailureToMemory(namespace, fingerprint, cls, now);
399
377
  this.persistRetryStateToMeta(namespace, meta);
400
- await storage.saveMeta(meta);
378
+ // The caller's storage.updateMeta persists this — saving here would write the same file twice.
401
379
  } catch (err) {
402
380
  // Fail-open: recording failure state must never crash observe/recall.
403
381
  log.warn("runExtraction: failed to record extraction retry state (non-fatal)", err);
404
382
  }
405
383
  }
406
384
 
385
+ /** Failure backoff into the in-memory mirror + breaker WITHOUT touching meta — the fallback
386
+ * when the locked meta write cannot run: the retry gate reads this mirror, so it stays shut. */
387
+ private applyExtractionFailureToMemory(
388
+ namespace: string,
389
+ fingerprint: string,
390
+ cls: ExtractionFailureClass,
391
+ now: number,
392
+ ): void {
393
+ const nsMap = this.extractionRetryState.get(namespace) ?? new Map<string, ExtractionRetryStateEntry>();
394
+ const prev = nsMap.get(fingerprint);
395
+ const attempts = (prev?.attempts ?? 0) + 1;
396
+ const firstFailedAtMs = prev?.firstFailedAtMs ?? now;
397
+ let nextEligibleAtMs: number;
398
+ if (cls === "parse_empty" && attempts > this.config.extractionParseEmptyMaxAttempts) {
399
+ // parse_empty budget exhausted → long-park (still never marked processed).
400
+ nextEligibleAtMs = now + Math.max(0, this.config.extractionRetryMaxBackoffMs);
401
+ } else {
402
+ nextEligibleAtMs = computeExtractionRetryNextEligibleMs(
403
+ attempts,
404
+ this.config.extractionRetryScheduleMs,
405
+ this.config.extractionRetryMaxBackoffMs,
406
+ this.config.extractionRetryJitterRatio,
407
+ now,
408
+ );
409
+ }
410
+ nsMap.set(fingerprint, { attempts, nextEligibleAtMs, firstFailedAtMs, lastFailureClass: cls });
411
+ this.extractionRetryState.set(namespace, nsMap);
412
+ this.onProviderFailure(cls, now);
413
+ }
414
+
407
415
  /** Delete a fingerprint's retry entry from the mirror + meta. Returns whether
408
416
  * meta changed (so the caller can decide to persist). Does not touch the
409
417
  * breaker — callers pair this with `resetProviderBreakerOnSuccess`. */
@@ -952,48 +960,43 @@ export class ExtractionRunCoordinator {
952
960
  // extractionRetryEnabled so a disabled feature restores prior behavior.
953
961
  if (extractionFingerprint && extractionRetryEnabled) {
954
962
  if (extractionFailure) {
963
+ const failureClass = result.extractionFailureClass ?? "provider_retryable";
955
964
  try {
956
- meta ??= await runDeadlineAware(() => storage.loadMeta(), "during_retry_bookkeeping_load", false);
957
965
  await runDeadlineAware(
958
966
  () =>
959
- this.recordExtractionFailure(
960
- storage,
961
- selfNamespace,
962
- extractionFingerprint,
963
- result.extractionFailureClass ?? "provider_retryable",
964
- meta!,
965
- Date.now(),
967
+ storage.updateMeta((freshMeta) =>
968
+ this.recordExtractionFailure(selfNamespace, extractionFingerprint, failureClass, freshMeta, Date.now()),
966
969
  ),
967
970
  "during_retry_bookkeeping_save",
968
971
  false,
969
972
  );
970
- // The buffer is retained below so the backoff gate can re-attempt
971
- // these turns after nextEligibleAt — clearing would orphan the
972
- // retry state.
973
973
  recordedRetryFailure = true;
974
974
  } catch (err) {
975
975
  if (err instanceof ExtractionDeadlineError) throw err;
976
- // Fail-open (codex review): retry bookkeeping is best-effort — a
977
- // corrupt or locked meta store must not reject the extraction task.
978
- // With no backoff recorded there is nothing to retain for, so the
979
- // pre-#1908 clear-buffer behavior applies below.
980
- log.warn("runExtraction: failed to load meta for retry bookkeeping (non-fatal)", err);
976
+ // Fail-open, but retain the turns (a cleared buffer with no retry state drops them). Only a
977
+ // LOCK skip reaches here without the mutator having run — a later save must not double-count.
978
+ if (err instanceof Error && err.message.includes("meta.json.lock not acquired"))
979
+ this.applyExtractionFailureToMemory(selfNamespace, extractionFingerprint, failureClass, Date.now());
980
+ recordedRetryFailure = true;
981
+ log.warn("runExtraction: retry state kept in memory; meta persist will catch up", err);
981
982
  }
982
983
  } else if (result.extractionSkippedReason === undefined) {
983
984
  // Provider responded without failure → breaker heals; clear any
984
985
  // parked backoff for this fingerprint so it proceeds normally.
985
986
  this.resetProviderBreakerOnSuccess();
986
987
  try {
987
- meta ??= await runDeadlineAware(() => storage.loadMeta(), "during_retry_bookkeeping_load", false);
988
- // Hydrate the in-memory mirror from persisted meta before clearing.
989
- // A forced flush (forceExtractionAttempt) bypasses the retry gate and
990
- // never hydrated, so without this a stale persisted backoff entry
991
- // would survive a successful forced flush and keep blocking normal
992
- // extraction until the timer expired (cursor/codex review).
993
- this.hydrateRetryStateFromMeta(selfNamespace, meta);
994
- if (this.clearExtractionRetryEntry(selfNamespace, extractionFingerprint, meta)) {
995
- await runDeadlineAware(() => storage.saveMeta(meta!), "during_retry_bookkeeping_save", false);
996
- }
988
+ await runDeadlineAware(
989
+ () =>
990
+ storage.updateMeta((freshMeta) => {
991
+ // Hydrate the mirror from persisted meta before clearing: a forced flush
992
+ // bypassed the retry gate, and a stale persisted entry would keep blocking.
993
+ this.hydrateRetryStateFromMeta(selfNamespace, freshMeta);
994
+ // `false` skips the save when nothing was parked for this fingerprint.
995
+ return this.clearExtractionRetryEntry(selfNamespace, extractionFingerprint, freshMeta);
996
+ }),
997
+ "during_retry_bookkeeping_save",
998
+ false,
999
+ );
997
1000
  } catch (err) {
998
1001
  if (err instanceof ExtractionDeadlineError) throw err;
999
1002
  log.warn("runExtraction: failed to persist cleared retry state (non-fatal)", err);
@@ -1018,7 +1021,6 @@ export class ExtractionRunCoordinator {
1018
1021
  }
1019
1022
  const emptySuccessCommit = {
1020
1023
  storage,
1021
- meta,
1022
1024
  extractionFingerprint,
1023
1025
  shouldPersistProcessedFingerprint,
1024
1026
  hasExtractionFailure: Boolean(extractionFailure),
@@ -1094,7 +1096,6 @@ export class ExtractionRunCoordinator {
1094
1096
  const postPersist = await runExtractionPostPersist({
1095
1097
  result,
1096
1098
  storage,
1097
- meta: meta ?? undefined,
1098
1099
  extractionFingerprint: extractionFingerprint ?? undefined,
1099
1100
  shouldPersistProcessedFingerprint,
1100
1101
  recordProcessedExtractionFingerprint: this.deps.recordProcessedExtractionFingerprint,
@@ -1113,7 +1114,6 @@ export class ExtractionRunCoordinator {
1113
1114
  clearBuffer,
1114
1115
  failOnExtractionFailure: options.failOnExtractionFailure === true,
1115
1116
  });
1116
- meta = postPersist.meta ?? null;
1117
1117
  const postPersistMetadataFailed = postPersist.metadataFailed;
1118
1118
 
1119
1119
  // Passive correction capture (issue #1581) — detect corrections expressed