@remnic/core 9.3.684 → 9.3.686

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 (315) hide show
  1. package/dist/access-boundary.d.ts +4 -3
  2. package/dist/access-boundary.js +23 -23
  3. package/dist/access-cli.js +152 -71
  4. package/dist/access-cli.js.map +1 -1
  5. package/dist/access-http.d.ts +3 -2
  6. package/dist/access-http.js +26 -26
  7. package/dist/access-mcp.d.ts +14 -3
  8. package/dist/access-mcp.js +25 -25
  9. package/dist/access-operations.d.ts +10 -4
  10. package/dist/access-operations.js +26 -24
  11. package/dist/access-schema.d.ts +4 -4
  12. package/dist/{access-service-D-siI-xJ.d.ts → access-service-DmCHJ4cH.d.ts} +106 -39
  13. package/dist/access-service.d.ts +3 -2
  14. package/dist/access-service.js +22 -22
  15. package/dist/access-surface-catalog.d.ts +3 -2
  16. package/dist/access-surface-catalog.js +2 -0
  17. package/dist/access-surface-catalog.js.map +1 -1
  18. package/dist/active-recall.js +2 -2
  19. package/dist/{auto-sync-5CJBJMPZ.js → auto-sync-NUQWSFQD.js} +7 -7
  20. package/dist/bootstrap.d.ts +2 -1
  21. package/dist/bootstrap.js +2 -2
  22. package/dist/boxes.js +2 -2
  23. package/dist/briefing.js +3 -3
  24. package/dist/buffer.js +2 -2
  25. package/dist/calibration.js +4 -4
  26. package/dist/catalog-COqWZlZ6.d.ts +456 -0
  27. package/dist/causal-behavior.js +4 -4
  28. package/dist/causal-chain.js +4 -4
  29. package/dist/causal-consolidation.js +11 -11
  30. package/dist/causal-retrieval.js +4 -4
  31. package/dist/causal-trajectory-graph.js +1 -1
  32. package/dist/causal-trajectory.js +1 -1
  33. package/dist/{chunk-ROHLEUTH.js → chunk-2KAYTPPT.js} +10 -10
  34. package/dist/{chunk-NHQGDVJF.js → chunk-2SJCWLQD.js} +3 -3
  35. package/dist/{chunk-YTWNKQ2G.js → chunk-3FC6LW6T.js} +2 -2
  36. package/dist/{chunk-5OE4PYY5.js → chunk-473JIN2U.js} +61 -11
  37. package/dist/chunk-473JIN2U.js.map +1 -0
  38. package/dist/{chunk-XEA4Z7JU.js → chunk-4FE2K57M.js} +3 -3
  39. package/dist/{chunk-WI7JKV2T.js → chunk-4N3TFFPH.js} +2 -2
  40. package/dist/{chunk-BTVX7ZXZ.js → chunk-4NFVPDIL.js} +4 -4
  41. package/dist/{chunk-OUWAQVDJ.js → chunk-5CEJH5ZN.js} +2 -2
  42. package/dist/{chunk-6QM24CP7.js → chunk-6GJS4BFH.js} +2 -2
  43. package/dist/{chunk-J2FBJ63F.js → chunk-6O6A6YUO.js} +4 -4
  44. package/dist/{chunk-HQ6NIBL6.js → chunk-7FL4CNPV.js} +2 -2
  45. package/dist/{chunk-5VDJMYTF.js → chunk-7WWURLG6.js} +3 -3
  46. package/dist/{chunk-QWRC7GIO.js → chunk-A4HH2EWA.js} +5 -5
  47. package/dist/{chunk-4SKKVWLQ.js → chunk-AGJH5ISO.js} +2 -2
  48. package/dist/{chunk-2L3KLWOV.js → chunk-B43NZNMG.js} +54 -92
  49. package/dist/chunk-B43NZNMG.js.map +1 -0
  50. package/dist/{chunk-WRE3JPAW.js → chunk-B4XVLHJA.js} +3 -3
  51. package/dist/{chunk-53FDU4CE.js → chunk-BLIWOONZ.js} +39 -36
  52. package/dist/chunk-BLIWOONZ.js.map +1 -0
  53. package/dist/{chunk-AJU4PJGY.js → chunk-BVKCV2ZY.js} +2 -2
  54. package/dist/{chunk-DQY7NJ5L.js → chunk-CTOQEZSN.js} +2 -2
  55. package/dist/{chunk-7OGJQP7T.js → chunk-DCWIQFNA.js} +4 -4
  56. package/dist/{chunk-MHQC2WU2.js → chunk-DKTSR7EK.js} +2 -2
  57. package/dist/{chunk-RN7MUWON.js → chunk-EHISUJFN.js} +2 -2
  58. package/dist/{chunk-WLEB7WCG.js → chunk-EO5QWINU.js} +2 -2
  59. package/dist/{chunk-XKXKSQU7.js → chunk-EXM3CQTZ.js} +2 -2
  60. package/dist/{chunk-M3FWYURP.js → chunk-FE6DQUNJ.js} +9 -9
  61. package/dist/{chunk-LCC5EZTT.js → chunk-FIVDN2SM.js} +4 -4
  62. package/dist/{chunk-3MY4W5V4.js → chunk-FUCUR2OZ.js} +550 -63
  63. package/dist/chunk-FUCUR2OZ.js.map +1 -0
  64. package/dist/{chunk-452WDNFO.js → chunk-GG6AJN7A.js} +2 -2
  65. package/dist/{chunk-2IBGHRIO.js → chunk-GS55WYRL.js} +3 -3
  66. package/dist/{chunk-IBTZEBUD.js → chunk-HYNHLBKA.js} +2 -2
  67. package/dist/{chunk-EVWIEEKZ.js → chunk-IQ7WCZRW.js} +2 -2
  68. package/dist/{chunk-B5XMS73R.js → chunk-IQVQJJL7.js} +2 -2
  69. package/dist/{chunk-6RHNCKHG.js → chunk-K43PI6DQ.js} +2 -2
  70. package/dist/{chunk-OIF36KGD.js → chunk-KCQA46NR.js} +2 -2
  71. package/dist/{chunk-2LDBXPLB.js → chunk-KF74X62T.js} +1 -1
  72. package/dist/{chunk-3EVIMVQU.js → chunk-KFBOZYME.js} +42 -3
  73. package/dist/chunk-KFBOZYME.js.map +1 -0
  74. package/dist/{chunk-MAV46GWQ.js → chunk-KYYL4U6X.js} +2 -2
  75. package/dist/{chunk-6GC5SGFE.js → chunk-L24JROPR.js} +2 -2
  76. package/dist/{chunk-Q5ZU3RNY.js → chunk-LQ6JI4VH.js} +2 -2
  77. package/dist/{chunk-GWKCEM3S.js → chunk-MCQDSY4G.js} +3 -3
  78. package/dist/{chunk-HP5FMB6L.js → chunk-MDJURR27.js} +2 -2
  79. package/dist/{chunk-FYEVFGJD.js → chunk-NN7QYW5W.js} +2 -2
  80. package/dist/chunk-NN7QYW5W.js.map +1 -0
  81. package/dist/{chunk-2ODBA7MQ.js → chunk-NU3CSQ4H.js} +5 -5
  82. package/dist/chunk-NU3CSQ4H.js.map +1 -0
  83. package/dist/{chunk-T2PO5MUF.js → chunk-O7GOFAM3.js} +2 -2
  84. package/dist/{chunk-Z2OXSMZK.js → chunk-OBXTMFZQ.js} +3 -3
  85. package/dist/{chunk-K6ZN34WC.js → chunk-OV4D5T7V.js} +3 -3
  86. package/dist/{chunk-OMLIFZ4I.js → chunk-PH3HOKYW.js} +2 -2
  87. package/dist/{chunk-C3IW2F5Z.js → chunk-PLBIPT6I.js} +2 -2
  88. package/dist/{chunk-QY7YA7OL.js → chunk-PNLCEFE4.js} +2 -2
  89. package/dist/{chunk-AGRPGAKR.js → chunk-PONNZ54D.js} +2 -2
  90. package/dist/{chunk-XZ4WBBB5.js → chunk-PWFWCGOO.js} +2 -2
  91. package/dist/{chunk-XWEXT4XU.js → chunk-QANVLERJ.js} +4 -4
  92. package/dist/{chunk-W4RVMTHR.js → chunk-QRDOSYOR.js} +2 -2
  93. package/dist/{chunk-OXNOINIP.js → chunk-QVMXQGT7.js} +24 -24
  94. package/dist/chunk-QVMXQGT7.js.map +1 -0
  95. package/dist/{chunk-6IMKOIZ6.js → chunk-R6OVFAX6.js} +2 -2
  96. package/dist/{chunk-5N5DXYDW.js → chunk-S2OU5DZY.js} +31 -10
  97. package/dist/chunk-S2OU5DZY.js.map +1 -0
  98. package/dist/{chunk-JOASJWQR.js → chunk-SANZHXY2.js} +2 -2
  99. package/dist/{chunk-7DTASS5T.js → chunk-SJHM6I4J.js} +2 -2
  100. package/dist/{chunk-M6BVYHBU.js → chunk-STOEE37X.js} +4 -4
  101. package/dist/{chunk-GKKAXVAJ.js → chunk-U33LWTQQ.js} +1 -7
  102. package/dist/chunk-U33LWTQQ.js.map +1 -0
  103. package/dist/{chunk-LXH3DIF2.js → chunk-U7D7NP4J.js} +2 -2
  104. package/dist/{chunk-DRD2Q7HQ.js → chunk-UFS7OXGL.js} +2 -2
  105. package/dist/{chunk-H3HDXD3U.js → chunk-UPTZYUYJ.js} +2 -2
  106. package/dist/{chunk-3Z7NPD5T.js → chunk-UTYBJR7M.js} +2 -2
  107. package/dist/{chunk-LN4YGHTM.js → chunk-UUH4YQOF.js} +2 -2
  108. package/dist/{chunk-6VF75M3X.js → chunk-VGUOEDTU.js} +2 -2
  109. package/dist/{chunk-44VFF3BB.js → chunk-VILEUJXC.js} +2 -2
  110. package/dist/{chunk-7SI52C65.js → chunk-VL7DP3OW.js} +2 -2
  111. package/dist/{chunk-7DHTMOND.js → chunk-VQ34TERH.js} +2 -2
  112. package/dist/{chunk-6VMIHVGO.js → chunk-VX6OBUDW.js} +2 -2
  113. package/dist/{chunk-EW5KFXHL.js → chunk-WDXCNJSF.js} +7 -7
  114. package/dist/{chunk-FMEKEF47.js → chunk-WIHPNY65.js} +79 -3
  115. package/dist/chunk-WIHPNY65.js.map +1 -0
  116. package/dist/{chunk-X6IRLNOO.js → chunk-WIWPSQYU.js} +2 -2
  117. package/dist/{chunk-DOCTITOP.js → chunk-WRFKZEO6.js} +2 -2
  118. package/dist/{chunk-E6ZDCOHM.js → chunk-XBZQRZ6G.js} +2 -2
  119. package/dist/{chunk-7YX23JBA.js → chunk-XHYGJVXL.js} +2 -2
  120. package/dist/{chunk-JD4SCARD.js → chunk-YN4ZT4CW.js} +1 -1
  121. package/dist/{chunk-YXWAILM4.js → chunk-YOI3ELXF.js} +2 -2
  122. package/dist/{chunk-XCAZF7KQ.js → chunk-ZA2S2VLL.js} +2 -2
  123. package/dist/{chunk-BEUDU7Y4.js → chunk-ZCWIH4LH.js} +2 -2
  124. package/dist/{chunk-V25ZAOSB.js → chunk-ZPTISBQU.js} +5 -5
  125. package/dist/{cli-ooj6JQBS.d.ts → cli-D8nZ2MPH.d.ts} +2 -2
  126. package/dist/cli.d.ts +4 -3
  127. package/dist/cli.js +44 -44
  128. package/dist/compounding/engine.js +4 -4
  129. package/dist/compounding/preference-consolidator.js +1 -1
  130. package/dist/config.js +2 -2
  131. package/dist/connectors/codex-materialize-runner.js +4 -4
  132. package/dist/connectors/codex-materialize.js +2 -2
  133. package/dist/connectors/index.js +5 -5
  134. package/dist/contradiction/index.js +3 -3
  135. package/dist/{contradiction-scan-AZTGFMPY.js → contradiction-scan-HWGEOUDS.js} +3 -3
  136. package/dist/conversation-index/backend.js +5 -5
  137. package/dist/conversation-index/cleanup.js +2 -2
  138. package/dist/conversation-index/faiss-adapter.js +2 -2
  139. package/dist/conversation-index/indexer.js +2 -2
  140. package/dist/conversation-index/search.js +2 -2
  141. package/dist/day-summary.js +2 -2
  142. package/dist/embedding-fallback.js +2 -2
  143. package/dist/entity-retrieval.js +4 -4
  144. package/dist/explicit-capture.d.ts +2 -1
  145. package/dist/explicit-capture.js +1 -1
  146. package/dist/extraction-judge-telemetry.js +2 -2
  147. package/dist/extraction-judge-training.js +2 -2
  148. package/dist/extraction-judge.js +5 -5
  149. package/dist/extraction.js +9 -9
  150. package/dist/fallback-llm.js +4 -4
  151. package/dist/{graph-edge-decay-KSVJGCZW.js → graph-edge-decay-D7OESCBR.js} +2 -2
  152. package/dist/graph-snapshot.js +2 -2
  153. package/dist/graph.js +1 -1
  154. package/dist/index.d.ts +5 -4
  155. package/dist/index.js +80 -80
  156. package/dist/lcm/archive.js +2 -2
  157. package/dist/lcm/engine.js +5 -5
  158. package/dist/lcm/index.js +5 -5
  159. package/dist/lcm/schema.js +2 -2
  160. package/dist/lcm/summarizer.js +3 -3
  161. package/dist/local-llm.js +2 -2
  162. package/dist/logger.js +1 -1
  163. package/dist/maintenance/memory-governance.js +3 -3
  164. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  165. package/dist/maintenance/rebuild-memory-projection.js +5 -5
  166. package/dist/mcp-memory-inspector-app.d.ts +3 -2
  167. package/dist/model-registry.js +2 -2
  168. package/dist/models-json.js +2 -2
  169. package/dist/namespaces/migrate.d.ts +1 -0
  170. package/dist/namespaces/migrate.js +16 -16
  171. package/dist/namespaces/search.js +13 -13
  172. package/dist/namespaces/storage.d.ts +42 -1
  173. package/dist/namespaces/storage.js +3 -3
  174. package/dist/native-knowledge.js +2 -2
  175. package/dist/negative.js +2 -2
  176. package/dist/operator-toolkit.js +22 -22
  177. package/dist/{orchestrator-DIDDvwDw.d.ts → orchestrator-CA6ouzBn.d.ts} +3 -464
  178. package/dist/orchestrator.d.ts +2 -1
  179. package/dist/orchestrator.js +61 -61
  180. package/dist/profiling.js +2 -2
  181. package/dist/qmd.js +2 -2
  182. package/dist/recall-planner-llm.js +4 -4
  183. package/dist/recall-qos.js +2 -2
  184. package/dist/recall-state.js +2 -2
  185. package/dist/relevance.js +2 -2
  186. package/dist/{resolution-IDTEBJFS.js → resolution-MN36NW5P.js} +3 -3
  187. package/dist/resolve-provider-secret.js +2 -2
  188. package/dist/resume-bundles.js +4 -4
  189. package/dist/retrieval-agents.js +2 -2
  190. package/dist/routing/store.js +2 -2
  191. package/dist/schemas.d.ts +38 -38
  192. package/dist/search/embed-helper.js +2 -2
  193. package/dist/search/factory.js +12 -12
  194. package/dist/search/index.js +12 -12
  195. package/dist/search/lancedb-backend.js +2 -2
  196. package/dist/search/meilisearch-backend.js +2 -2
  197. package/dist/search/orama-backend.js +2 -2
  198. package/dist/search/remote-backend.js +2 -2
  199. package/dist/semantic-consolidation.js +5 -5
  200. package/dist/semantic-rule-promotion.js +3 -3
  201. package/dist/semantic-rule-verifier.js +3 -3
  202. package/dist/session-observer-state.js +2 -2
  203. package/dist/session-transcript-migration.js +2 -2
  204. package/dist/shared-context/manager.js +2 -2
  205. package/dist/storage.d.ts +4 -0
  206. package/dist/storage.js +2 -2
  207. package/dist/summarizer.js +7 -7
  208. package/dist/temporal-supersession.js +2 -2
  209. package/dist/threading.js +2 -2
  210. package/dist/transcript.js +2 -2
  211. package/dist/transfer/types.d.ts +22 -22
  212. package/dist/verified-recall.js +4 -4
  213. package/package.json +2 -2
  214. package/src/access-boundary.ts +2 -1
  215. package/src/access-cli.ts +94 -4
  216. package/src/access-http.ts +40 -2
  217. package/src/access-mcp.ts +55 -2
  218. package/src/access-operations.ts +66 -0
  219. package/src/access-service.ts +148 -73
  220. package/src/access-surface-catalog.test.ts +1 -1
  221. package/src/access-surface-catalog.ts +2 -0
  222. package/src/cli.ts +2 -1
  223. package/src/coding/decision-surfaces.test.ts +279 -0
  224. package/src/coding/decision-surfaces.ts +475 -0
  225. package/src/explicit-capture.ts +3 -12
  226. package/src/logger.ts +13 -4
  227. package/src/namespaces/catalog.test.ts +2 -2
  228. package/src/namespaces/storage.ts +81 -0
  229. package/src/orchestrator.ts +22 -64
  230. package/src/storage.ts +36 -36
  231. package/dist/chunk-2L3KLWOV.js.map +0 -1
  232. package/dist/chunk-2ODBA7MQ.js.map +0 -1
  233. package/dist/chunk-3EVIMVQU.js.map +0 -1
  234. package/dist/chunk-3MY4W5V4.js.map +0 -1
  235. package/dist/chunk-53FDU4CE.js.map +0 -1
  236. package/dist/chunk-5N5DXYDW.js.map +0 -1
  237. package/dist/chunk-5OE4PYY5.js.map +0 -1
  238. package/dist/chunk-FMEKEF47.js.map +0 -1
  239. package/dist/chunk-FYEVFGJD.js.map +0 -1
  240. package/dist/chunk-GKKAXVAJ.js.map +0 -1
  241. package/dist/chunk-OXNOINIP.js.map +0 -1
  242. /package/dist/{auto-sync-5CJBJMPZ.js.map → auto-sync-NUQWSFQD.js.map} +0 -0
  243. /package/dist/{chunk-ROHLEUTH.js.map → chunk-2KAYTPPT.js.map} +0 -0
  244. /package/dist/{chunk-NHQGDVJF.js.map → chunk-2SJCWLQD.js.map} +0 -0
  245. /package/dist/{chunk-YTWNKQ2G.js.map → chunk-3FC6LW6T.js.map} +0 -0
  246. /package/dist/{chunk-XEA4Z7JU.js.map → chunk-4FE2K57M.js.map} +0 -0
  247. /package/dist/{chunk-WI7JKV2T.js.map → chunk-4N3TFFPH.js.map} +0 -0
  248. /package/dist/{chunk-BTVX7ZXZ.js.map → chunk-4NFVPDIL.js.map} +0 -0
  249. /package/dist/{chunk-OUWAQVDJ.js.map → chunk-5CEJH5ZN.js.map} +0 -0
  250. /package/dist/{chunk-6QM24CP7.js.map → chunk-6GJS4BFH.js.map} +0 -0
  251. /package/dist/{chunk-J2FBJ63F.js.map → chunk-6O6A6YUO.js.map} +0 -0
  252. /package/dist/{chunk-HQ6NIBL6.js.map → chunk-7FL4CNPV.js.map} +0 -0
  253. /package/dist/{chunk-5VDJMYTF.js.map → chunk-7WWURLG6.js.map} +0 -0
  254. /package/dist/{chunk-QWRC7GIO.js.map → chunk-A4HH2EWA.js.map} +0 -0
  255. /package/dist/{chunk-4SKKVWLQ.js.map → chunk-AGJH5ISO.js.map} +0 -0
  256. /package/dist/{chunk-WRE3JPAW.js.map → chunk-B4XVLHJA.js.map} +0 -0
  257. /package/dist/{chunk-AJU4PJGY.js.map → chunk-BVKCV2ZY.js.map} +0 -0
  258. /package/dist/{chunk-DQY7NJ5L.js.map → chunk-CTOQEZSN.js.map} +0 -0
  259. /package/dist/{chunk-7OGJQP7T.js.map → chunk-DCWIQFNA.js.map} +0 -0
  260. /package/dist/{chunk-MHQC2WU2.js.map → chunk-DKTSR7EK.js.map} +0 -0
  261. /package/dist/{chunk-RN7MUWON.js.map → chunk-EHISUJFN.js.map} +0 -0
  262. /package/dist/{chunk-WLEB7WCG.js.map → chunk-EO5QWINU.js.map} +0 -0
  263. /package/dist/{chunk-XKXKSQU7.js.map → chunk-EXM3CQTZ.js.map} +0 -0
  264. /package/dist/{chunk-M3FWYURP.js.map → chunk-FE6DQUNJ.js.map} +0 -0
  265. /package/dist/{chunk-LCC5EZTT.js.map → chunk-FIVDN2SM.js.map} +0 -0
  266. /package/dist/{chunk-452WDNFO.js.map → chunk-GG6AJN7A.js.map} +0 -0
  267. /package/dist/{chunk-2IBGHRIO.js.map → chunk-GS55WYRL.js.map} +0 -0
  268. /package/dist/{chunk-IBTZEBUD.js.map → chunk-HYNHLBKA.js.map} +0 -0
  269. /package/dist/{chunk-EVWIEEKZ.js.map → chunk-IQ7WCZRW.js.map} +0 -0
  270. /package/dist/{chunk-B5XMS73R.js.map → chunk-IQVQJJL7.js.map} +0 -0
  271. /package/dist/{chunk-6RHNCKHG.js.map → chunk-K43PI6DQ.js.map} +0 -0
  272. /package/dist/{chunk-OIF36KGD.js.map → chunk-KCQA46NR.js.map} +0 -0
  273. /package/dist/{chunk-2LDBXPLB.js.map → chunk-KF74X62T.js.map} +0 -0
  274. /package/dist/{chunk-MAV46GWQ.js.map → chunk-KYYL4U6X.js.map} +0 -0
  275. /package/dist/{chunk-6GC5SGFE.js.map → chunk-L24JROPR.js.map} +0 -0
  276. /package/dist/{chunk-Q5ZU3RNY.js.map → chunk-LQ6JI4VH.js.map} +0 -0
  277. /package/dist/{chunk-GWKCEM3S.js.map → chunk-MCQDSY4G.js.map} +0 -0
  278. /package/dist/{chunk-HP5FMB6L.js.map → chunk-MDJURR27.js.map} +0 -0
  279. /package/dist/{chunk-T2PO5MUF.js.map → chunk-O7GOFAM3.js.map} +0 -0
  280. /package/dist/{chunk-Z2OXSMZK.js.map → chunk-OBXTMFZQ.js.map} +0 -0
  281. /package/dist/{chunk-K6ZN34WC.js.map → chunk-OV4D5T7V.js.map} +0 -0
  282. /package/dist/{chunk-OMLIFZ4I.js.map → chunk-PH3HOKYW.js.map} +0 -0
  283. /package/dist/{chunk-C3IW2F5Z.js.map → chunk-PLBIPT6I.js.map} +0 -0
  284. /package/dist/{chunk-QY7YA7OL.js.map → chunk-PNLCEFE4.js.map} +0 -0
  285. /package/dist/{chunk-AGRPGAKR.js.map → chunk-PONNZ54D.js.map} +0 -0
  286. /package/dist/{chunk-XZ4WBBB5.js.map → chunk-PWFWCGOO.js.map} +0 -0
  287. /package/dist/{chunk-XWEXT4XU.js.map → chunk-QANVLERJ.js.map} +0 -0
  288. /package/dist/{chunk-W4RVMTHR.js.map → chunk-QRDOSYOR.js.map} +0 -0
  289. /package/dist/{chunk-6IMKOIZ6.js.map → chunk-R6OVFAX6.js.map} +0 -0
  290. /package/dist/{chunk-JOASJWQR.js.map → chunk-SANZHXY2.js.map} +0 -0
  291. /package/dist/{chunk-7DTASS5T.js.map → chunk-SJHM6I4J.js.map} +0 -0
  292. /package/dist/{chunk-M6BVYHBU.js.map → chunk-STOEE37X.js.map} +0 -0
  293. /package/dist/{chunk-LXH3DIF2.js.map → chunk-U7D7NP4J.js.map} +0 -0
  294. /package/dist/{chunk-DRD2Q7HQ.js.map → chunk-UFS7OXGL.js.map} +0 -0
  295. /package/dist/{chunk-H3HDXD3U.js.map → chunk-UPTZYUYJ.js.map} +0 -0
  296. /package/dist/{chunk-3Z7NPD5T.js.map → chunk-UTYBJR7M.js.map} +0 -0
  297. /package/dist/{chunk-LN4YGHTM.js.map → chunk-UUH4YQOF.js.map} +0 -0
  298. /package/dist/{chunk-6VF75M3X.js.map → chunk-VGUOEDTU.js.map} +0 -0
  299. /package/dist/{chunk-44VFF3BB.js.map → chunk-VILEUJXC.js.map} +0 -0
  300. /package/dist/{chunk-7SI52C65.js.map → chunk-VL7DP3OW.js.map} +0 -0
  301. /package/dist/{chunk-7DHTMOND.js.map → chunk-VQ34TERH.js.map} +0 -0
  302. /package/dist/{chunk-6VMIHVGO.js.map → chunk-VX6OBUDW.js.map} +0 -0
  303. /package/dist/{chunk-EW5KFXHL.js.map → chunk-WDXCNJSF.js.map} +0 -0
  304. /package/dist/{chunk-X6IRLNOO.js.map → chunk-WIWPSQYU.js.map} +0 -0
  305. /package/dist/{chunk-DOCTITOP.js.map → chunk-WRFKZEO6.js.map} +0 -0
  306. /package/dist/{chunk-E6ZDCOHM.js.map → chunk-XBZQRZ6G.js.map} +0 -0
  307. /package/dist/{chunk-7YX23JBA.js.map → chunk-XHYGJVXL.js.map} +0 -0
  308. /package/dist/{chunk-JD4SCARD.js.map → chunk-YN4ZT4CW.js.map} +0 -0
  309. /package/dist/{chunk-YXWAILM4.js.map → chunk-YOI3ELXF.js.map} +0 -0
  310. /package/dist/{chunk-XCAZF7KQ.js.map → chunk-ZA2S2VLL.js.map} +0 -0
  311. /package/dist/{chunk-BEUDU7Y4.js.map → chunk-ZCWIH4LH.js.map} +0 -0
  312. /package/dist/{chunk-V25ZAOSB.js.map → chunk-ZPTISBQU.js.map} +0 -0
  313. /package/dist/{contradiction-scan-AZTGFMPY.js.map → contradiction-scan-HWGEOUDS.js.map} +0 -0
  314. /package/dist/{graph-edge-decay-KSVJGCZW.js.map → graph-edge-decay-D7OESCBR.js.map} +0 -0
  315. /package/dist/{resolution-IDTEBJFS.js.map → resolution-MN36NW5P.js.map} +0 -0
@@ -20,6 +20,11 @@ import type {
20
20
  EngramAccessMemoryResponse,
21
21
  EngramAccessWriteResponse,
22
22
  } from "./access-service.js";
23
+ import {
24
+ DECISION_SUBCOMMANDS,
25
+ type DecisionSurfaceRequest,
26
+ type DecisionSurfaceResponse,
27
+ } from "./coding/decision-surfaces.js";
23
28
 
24
29
  // ---------------------------------------------------------------------------
25
30
  // memory_get — fetch one memory by id
@@ -135,12 +140,72 @@ export const memoryStoreOperation = defineOperation<MemoryStoreInput, MemoryStor
135
140
  // so the hook still fires inside the service's idempotent-write lock —
136
141
  // never before, never on a replay (#1434 invariant preserved by the
137
142
  // boundary migration).
143
+
138
144
  ctx.hooks,
139
145
  );
140
146
  return { result };
141
147
  },
142
148
  });
143
149
 
150
+ // ---------------------------------------------------------------------------
151
+ // coding_decision — decision-record surfaces (issue #1548 Track A PR 2)
152
+ // ---------------------------------------------------------------------------
153
+
154
+ /**
155
+ * The subcommand field is required and MUST be one of the four valid values
156
+ * (rule 51 — reject loudly, list the options, never silently default). The
157
+ * remaining fields are optional because each subcommand uses a different
158
+ * subset; the handler validates subcommand-specific requirements after
159
+ * routing.
160
+ */
161
+ /**
162
+ * MCP clients send `null` for absent optional fields. Zod `.optional()`
163
+ * rejects `null`, so strip nulls at the object level before the inner
164
+ * schema validates (review: cursor null-field thread).
165
+ */
166
+ const codingDecisionSchema = z.preprocess(
167
+ (data) => {
168
+ if (data && typeof data === "object" && !Array.isArray(data)) {
169
+ const out: Record<string, unknown> = {};
170
+ for (const [k, v] of Object.entries(data as Record<string, unknown>)) {
171
+ if (v !== null) out[k] = v;
172
+ }
173
+ return out;
174
+ }
175
+ return data;
176
+ },
177
+ z.object({
178
+ subcommand: z.enum(DECISION_SUBCOMMANDS),
179
+ sessionKey: z.string().trim().max(512).optional(),
180
+ namespace: z.string().trim().max(256).optional(),
181
+ id: z.string().trim().max(512).optional(),
182
+ title: z.string().trim().max(512).optional(),
183
+ status: z.string().trim().max(64).optional(),
184
+ context: z.string().trim().max(8192).optional(),
185
+ decision: z.string().trim().max(8192).optional(),
186
+ consequences: z.string().trim().max(8192).optional(),
187
+ entityRefs: z.array(z.string().trim().min(1).max(256)).optional(),
188
+ supersedesId: z.string().trim().max(512).optional(),
189
+ }),
190
+ );
191
+
192
+ export type CodingDecisionInput = DecisionSurfaceRequest;
193
+ export type CodingDecisionOutput = { result: DecisionSurfaceResponse };
194
+
195
+ export const codingDecisionOperation = defineOperation<
196
+ CodingDecisionInput,
197
+ CodingDecisionOutput
198
+ >({
199
+ name: "coding_decision",
200
+ description:
201
+ "List, get, record, or supersede decision records in the session's coding namespace (issue #1548 Track A).",
202
+ schema: codingDecisionSchema as z.ZodType<CodingDecisionInput>,
203
+ handler: async (input, ctx) => {
204
+ const result = await ctx.service.codingDecision(input, ctx.authenticatedPrincipal);
205
+ return { result };
206
+ },
207
+ });
208
+
144
209
  // ---------------------------------------------------------------------------
145
210
  // Surface registration map — what each transport calls the pilot ops
146
211
  // ---------------------------------------------------------------------------
@@ -154,4 +219,5 @@ export const REGISTERED_OPERATIONS = [
154
219
  memoryGetOperation.spec.name,
155
220
  memorySearchOperation.spec.name,
156
221
  memoryStoreOperation.spec.name,
222
+ codingDecisionOperation.spec.name,
157
223
  ] as const;
@@ -12,7 +12,13 @@ import {
12
12
  lcmSessionKeyForNamespace,
13
13
  projectTagProjectId,
14
14
  resolveCodingNamespaceOverlay,
15
+ type CodingNamespaceOverlay,
15
16
  } from "./coding/coding-namespace.js";
17
+ import {
18
+ handleCodingDecision,
19
+ type DecisionSurfaceRequest,
20
+ type DecisionSurfaceResponse,
21
+ } from "./coding/decision-surfaces.js";
16
22
  import { WorkStorage } from "./work/storage.js";
17
23
  import {
18
24
  exportWorkBoardMarkdown,
@@ -59,6 +65,7 @@ import { canReadNamespace, canWriteNamespace, defaultNamespaceForPrincipal, reca
59
65
  import {
60
66
  expandScopeProfileReadNamespaces,
61
67
  resolveScopeProfilePlan,
68
+ type ResolvedScopeProfilePlan,
62
69
  type ScopeProfileLayerResolution,
63
70
  type ScopeProfilePromotionResolution,
64
71
  } from "./namespaces/scope-profiles.js";
@@ -1346,74 +1353,29 @@ export class EngramAccessService {
1346
1353
  return null;
1347
1354
  }
1348
1355
 
1349
- /**
1350
- * Resolve the write namespace for explicit-write tools (memory_store /
1351
- * suggestion_submit), project-scoping the write the same way recall does so a
1352
- * memory stored with a client-injected `cwd`/`projectTag` is discoverable by
1353
- * project-scoped recall (#1434, rule 42).
1354
- *
1355
- * Precedence:
1356
- * - An explicit `namespace` always wins and is authorized strictly via
1357
- * `resolveWritableNamespace` → `canWriteNamespace`. A coding-overlay
1358
- * namespace string (`<base>-project-*`) is NOT a writable target via the
1359
- * explicit field — project scoping is requested with `cwd`/`projectTag`,
1360
- * never by naming the derived namespace — so there is no way to bypass the
1361
- * policy allow-list by guessing/forging an overlay name (Codex review).
1362
- * - With NO coding overlay, the write stays on `config.defaultNamespace` —
1363
- * exactly the pre-#1434 behavior, so an unqualified write is NOT silently
1364
- * moved to a principal self namespace (Codex review).
1365
- * - WITH a coding overlay, the base is the principal self namespace
1366
- * (`defaultNamespaceForPrincipal`, write-checked) — the SAME base recall,
1367
- * observe, and the orchestrator buffer-flush write path overlay onto
1368
- * (rule 42 / Cursor) — so a project-scoped store lands exactly where
1369
- * project-scoped recall searches. The overlay namespace is always REBUILT
1370
- * from the authenticated principal's base, never accepted as a caller
1371
- * string, so a caller can never reach another principal's subtree.
1372
- *
1373
- * Read-only: this NEVER mutates session coding context, so the idempotency
1374
- * peeks and dryRun preflights that call it stay side-effect free (Codex
1375
- * review). It prefers the per-call `cwd`/`projectTag` (the project explicitly
1376
- * identified for this write), else the session's existing context. The HTTP
1377
- * surface lets the peek and the write each resolve independently; the peek's
1378
- * namespace only gates rate-limiting (memory_store/suggestion_submit run their
1379
- * own idempotency check), so a benign session-context change between the two
1380
- * never fails a write — there is no namespace to "pin".
1381
- */
1382
- private async resolveCodingScopedWriteNamespace(
1356
+ /** Shared coding-scope derivation for the read/write resolvers below —
1357
+ * coding context, overlay, principal, scope-profile plan for an IMPLICIT
1358
+ * request, IDENTICAL to recall precedence (session-first, per-call fallback)
1359
+ * so a scoped store is discoverable by scoped recall (#1434). Single source
1360
+ * of truth for the namespacesEnabled/projectScope gates (rule 22; keeps the
1361
+ * scattered-config-read ratchet flat). READ-ONLY: never mutates session. */
1362
+ private async resolveCodingScopeInputs(
1383
1363
  request: CodingScopedWriteInput & {
1384
1364
  namespace?: string;
1385
1365
  sessionKey?: string;
1386
1366
  authenticatedPrincipal?: string;
1387
1367
  },
1388
- ): Promise<string> {
1389
- const hasExplicitNamespace =
1390
- typeof request.namespace === "string" && request.namespace.trim().length > 0;
1391
- if (hasExplicitNamespace) {
1392
- return this.resolveWritableNamespace(
1393
- request.namespace,
1394
- request.sessionKey,
1395
- request.authenticatedPrincipal,
1396
- );
1397
- }
1398
- // Project scoping only applies when namespaces are enabled (else overlaying
1399
- // would create false isolation over a single storage dir) and projectScope
1400
- // is on. The coding context MUST be resolved exactly as the recall path
1401
- // resolves it, or a scoped store won't be discoverable by scoped recall
1402
- // (the whole point of #1434). Recall calls `maybeAttachCodingContext`, which
1403
- // returns early when the session already has a context — so recall is
1404
- // SESSION-FIRST: an existing session binding wins, and the per-call
1405
- // cwd/projectTag is only used to seed a context when none is attached yet.
1406
- // Mirror that precedence here: session context first, per-call as fallback
1407
- // (Codex review — a per-call-wins write would land in a project that the
1408
- // same session's recall, still on the bound project, never searches).
1409
- //
1368
+ ): Promise<{
1369
+ principal: string | undefined;
1370
+ codingContext: CodingContext | null;
1371
+ overlay: CodingNamespaceOverlay | null;
1372
+ profilePlan: ResolvedScopeProfilePlan | null;
1373
+ }> {
1410
1374
  // A sessionKey is REQUIRED to apply the overlay. The recall path can only
1411
- // attach/look up coding context per session (`maybeAttachCodingContext` and
1412
- // `applyCodingNamespaceOverlay` both no-op without a sessionKey), so a
1413
- // sessionless recall always searches the base namespace. A sessionless
1414
- // write must therefore also stay on the base — otherwise a client that
1415
- // injects cwd/projectTag but no sessionKey would store into
1416
- // `default-project-*` that its own recall never searches (Codex review).
1375
+ // attach/look up coding context per session, so a sessionless recall always
1376
+ // searches the base namespace; a sessionless write/read must too — otherwise
1377
+ // a client that injects cwd/projectTag but no sessionKey would land in a
1378
+ // `default-project-*` namespace its own recall never searches (Codex review).
1417
1379
  const hasSession =
1418
1380
  typeof request.sessionKey === "string" && request.sessionKey.length > 0;
1419
1381
  const codingContext =
@@ -1443,6 +1405,35 @@ export class EngramAccessService {
1443
1405
  codingContext,
1444
1406
  codingOverlay: overlay,
1445
1407
  });
1408
+ return { principal, codingContext, overlay, profilePlan };
1409
+ }
1410
+
1411
+ /**
1412
+ * Resolve the write namespace for explicit-write tools (memory_store /
1413
+ * suggestion_submit), project-scoping the write the same way recall does so a
1414
+ * memory stored with a client-injected `cwd`/`projectTag` is discoverable by
1415
+ * project-scoped recall (#1434, rule 42). Shared derivation lives in
1416
+ * {@link resolveCodingScopeInputs}; this method enforces the WRITE acl
1417
+ * (`canWriteNamespace` / profile-layer writability). Read-only: never mutates
1418
+ * session coding context.
1419
+ */
1420
+ private async resolveCodingScopedWriteNamespace(
1421
+ request: CodingScopedWriteInput & {
1422
+ namespace?: string;
1423
+ sessionKey?: string;
1424
+ authenticatedPrincipal?: string;
1425
+ },
1426
+ ): Promise<string> {
1427
+ const hasExplicitNamespace =
1428
+ typeof request.namespace === "string" && request.namespace.trim().length > 0;
1429
+ if (hasExplicitNamespace) {
1430
+ return this.resolveWritableNamespace(
1431
+ request.namespace,
1432
+ request.sessionKey,
1433
+ request.authenticatedPrincipal,
1434
+ );
1435
+ }
1436
+ const { principal, overlay, profilePlan } = await this.resolveCodingScopeInputs(request);
1446
1437
  if (profilePlan) {
1447
1438
  const selectedLayer = profilePlan.layers.find((layer) => layer.id === profilePlan.writeLayer);
1448
1439
  const writeNamespaceReadable =
@@ -1475,6 +1466,60 @@ export class EngramAccessService {
1475
1466
  return combineNamespaces(base, overlay.namespace);
1476
1467
  }
1477
1468
 
1469
+ /** Read-side mirror of {@link resolveCodingScopedWriteNamespace}. Decision
1470
+ * `list`/`get` use this so a record written by a project-scoped session is
1471
+ * listable/fetchable by the SAME session without manually supplying the
1472
+ * overlaid namespace (review P2). Derivation is IDENTICAL to the write path
1473
+ * (shared via {@link resolveCodingScopeInputs}); the only difference is the
1474
+ * ACL — reads enforce {@link canReadNamespace}, so a read-but-not-write
1475
+ * principal can still list/fetch (rule 42). */
1476
+ private async resolveCodingScopedReadableNamespace(
1477
+ request: CodingScopedWriteInput & {
1478
+ namespace?: string;
1479
+ sessionKey?: string;
1480
+ authenticatedPrincipal?: string;
1481
+ },
1482
+ ): Promise<string> {
1483
+ const principal = this.resolveRequestPrincipal(
1484
+ request.sessionKey,
1485
+ request.authenticatedPrincipal,
1486
+ );
1487
+ const hasExplicitNamespace =
1488
+ typeof request.namespace === "string" && request.namespace.trim().length > 0;
1489
+ if (hasExplicitNamespace) {
1490
+ return this.resolveReadableNamespace(request.namespace, principal);
1491
+ }
1492
+ const inputs = await this.resolveCodingScopeInputs(request);
1493
+ const { overlay, profilePlan, principal: resolvedPrincipal } = inputs;
1494
+ if (profilePlan) {
1495
+ // The write layer is the namespace decisions are RECORDED under. The
1496
+ // WRITE path authorizes it through the profile plan (selectedLayer.
1497
+ // writable AND readNamespaces.includes(writeNamespace)), NOT the raw
1498
+ // namespace ACL, so the READ path must use the SAME profile-plan
1499
+ // authorization. canReadNamespace only recognizes explicit policies
1500
+ // plus default/shared namespaces, which would reject a profile-granted
1501
+ // layer the same session just wrote through (review P2: scope-profile
1502
+ // read authorization for decision reads; rule 42).
1503
+ const target = profilePlan.writeNamespace;
1504
+ if (!profilePlan.readNamespaces.includes(target)) {
1505
+ throw new EngramAccessInputError(`namespace is not readable: ${target}`);
1506
+ }
1507
+ return target;
1508
+ }
1509
+ if (!overlay) {
1510
+ // No coding overlay → read the base namespace through the standard read
1511
+ // ACL, identical to memory_get with no explicit namespace.
1512
+ return this.resolveReadableNamespace(undefined, resolvedPrincipal);
1513
+ }
1514
+ // Coding overlay → overlay onto the principal self base, the SAME namespace
1515
+ // the write path writes to, then enforce the read ACL.
1516
+ const base = defaultNamespaceForPrincipal(resolvedPrincipal, this.orchestrator.config);
1517
+ if (!canReadNamespace(resolvedPrincipal, base, this.orchestrator.config)) {
1518
+ throw new EngramAccessInputError(`namespace is not readable: ${base}`);
1519
+ }
1520
+ return combineNamespaces(base, overlay.namespace);
1521
+ }
1522
+
1478
1523
  /**
1479
1524
  * Resolve ONE effective memory scope plan for a write-producing request
1480
1525
  * (#1495 / seed for epic #1494). The returned {@link MemoryScopePlan} is the
@@ -4401,6 +4446,45 @@ export class EngramAccessService {
4401
4446
  };
4402
4447
  }
4403
4448
 
4449
+ /** Whether the coding_decision tool should appear in tools/list (rule 39). */
4450
+ get decisionRecordSurfaceVisible(): boolean {
4451
+ return this.orchestrator.config.codingKnowledge?.enabled === true
4452
+ && this.orchestrator.config.codingKnowledge?.decisionRecords === true;
4453
+ }
4454
+ /**
4455
+ * Thin delegate — handler logic in coding/decision-surfaces.ts (#1548 PR2).
4456
+ * All three surfaces (MCP/HTTP/CLI) arrive here via the boundary operation.
4457
+ * Namespace resolution uses the SAME path as memory_store (principal ACL +
4458
+ * coding overlay + default fallback) so decision records land in the same
4459
+ * storage root.
4460
+ */
4461
+ async codingDecision(
4462
+ request: DecisionSurfaceRequest,
4463
+ authenticatedPrincipal?: string,
4464
+ ): Promise<DecisionSurfaceResponse> {
4465
+ return handleCodingDecision(request, {
4466
+ codingKnowledge: this.orchestrator.config.codingKnowledge,
4467
+ getCodingContext: (sk) => this.orchestrator.getCodingContextForSession(sk),
4468
+ resolveStorage: async (req) => {
4469
+ const isWrite = req.subcommand === "record" || req.subcommand === "supersede";
4470
+ const ns = isWrite
4471
+ ? await this.resolveCodingScopedWriteNamespace({
4472
+ namespace: req.namespace,
4473
+ sessionKey: req.sessionKey,
4474
+ authenticatedPrincipal,
4475
+ })
4476
+ : await this.resolveCodingScopedReadableNamespace({
4477
+ namespace: req.namespace,
4478
+ sessionKey: req.sessionKey,
4479
+ authenticatedPrincipal,
4480
+ });
4481
+ const storage = await this.orchestrator.getStorage(ns);
4482
+ return Object.assign(storage, { namespace: ns });
4483
+ },
4484
+ throwInputError: (msg) => { throw new EngramAccessInputError(msg); },
4485
+ });
4486
+ }
4487
+
4404
4488
  async memoryBrowse(
4405
4489
  request: EngramAccessMemoryBrowseRequest = {},
4406
4490
  ): Promise<EngramAccessMemoryBrowseResponse> {
@@ -7646,17 +7730,7 @@ export class EngramAccessService {
7646
7730
  return this.orchestrator.storage;
7647
7731
  }
7648
7732
 
7649
- /**
7650
- * Best-effort catalog write touch delegate (issue #1499 sweep). HTTP/MCP
7651
- * surfaces resolve a per-namespace storage and write through it directly (e.g.
7652
- * a contradiction merge), bypassing the extraction write path that owns
7653
- * `markCatalogWrite`. They call this to record the write so a (possibly
7654
- * dynamic) namespace's `lastWriteAt` stays accurate and QMD maintenance does
7655
- * not miss it. Fire-and-forget and failure-tolerant on the orchestrator side.
7656
- */
7657
- recordCatalogWrite(namespace?: string, storageDir?: string): void {
7658
- this.orchestrator.recordCatalogWrite(namespace, storageDir);
7659
- }
7733
+ // #1522: recordCatalogWrite removed — catalog touch handled at the storage chokepoint.
7660
7734
 
7661
7735
  get configRef(): PluginConfig {
7662
7736
  return this.orchestrator.config;
@@ -8274,3 +8348,4 @@ export class EngramAccessService {
8274
8348
  });
8275
8349
  }
8276
8350
  }
8351
+
@@ -67,7 +67,7 @@ function shortToolName(advertised: string): string {
67
67
  /** Spin up a server with emitLegacyTools=true and read the deduped short names. */
68
68
  async function liveMcpToolShortNames(): Promise<ReadonlySet<string>> {
69
69
  const stub = { briefingEnabled: true } as unknown as EngramAccessService;
70
- const server = new EngramMcpServer(stub, { emitLegacyTools: true });
70
+ const server = new EngramMcpServer(stub, { emitLegacyTools: true, codingDecisionVisible: true });
71
71
  const response = await server.handleRequest({ jsonrpc: "2.0", id: 1, method: "tools/list" });
72
72
  const result = (response as { result?: { tools?: Array<{ name: string }> } }).result;
73
73
  const names = new Set<string>();
@@ -72,6 +72,7 @@ export const MCP_TOOLS: readonly McpToolEntry[] = [
72
72
  { tool: "memory_get", operation: "memory_get" },
73
73
  { tool: "memory_timeline", operation: null },
74
74
  { tool: "memory_store", operation: "memory_store" },
75
+ { tool: "coding_decision", operation: "coding_decision" },
75
76
  { tool: "suggestion_submit", operation: null },
76
77
  { tool: "entity_get", operation: null },
77
78
  { tool: "review_queue_list", operation: null },
@@ -168,6 +169,7 @@ export const HTTP_ROUTES: readonly HttpRouteEntry[] = [
168
169
  { method: "POST", pathname: "/engram/v1/lcm/compaction/record", operation: null },
169
170
  { method: "GET", pathname: "/engram/v1/lcm/status", operation: null },
170
171
  { method: "POST", pathname: "/engram/v1/memories", operation: "memory_store" },
172
+ { method: "POST", pathname: "/engram/v1/coding/decisions", operation: "coding_decision" },
171
173
  { method: "POST", pathname: "/engram/v1/suggestions", operation: null },
172
174
  { method: "GET", pathname: "/engram/v1/memories", operation: null },
173
175
  { method: "GET", pathname: "/engram/v1/memories/:id", operation: "memory_get" },
package/src/cli.ts CHANGED
@@ -2800,6 +2800,7 @@ export async function runAccessMcpServeCliCommand(
2800
2800
  new EngramMcpServer(service, {
2801
2801
  principal: options.principal,
2802
2802
  emitLegacyTools: options.emitLegacyTools,
2803
+ codingDecisionVisible: service.decisionRecordSurfaceVisible,
2803
2804
  });
2804
2805
  await server.runStdio(options.stdin ?? process.stdin, options.stdout ?? process.stdout);
2805
2806
  return { ok: true };
@@ -8999,7 +9000,7 @@ export function registerCli(
8999
9000
  // bypassing the extraction write path. Record it so QMD maintenance /
9000
9001
  // writtenSince don't miss the write. Best-effort and failure-tolerant.
9001
9002
  onMergedMemoryWritten: (namespace, storageDir) => {
9002
- orchestrator.recordCatalogWrite(namespace, storageDir);
9003
+ // #1522: catalog touch handled at the storage chokepoint.
9003
9004
  },
9004
9005
  });
9005
9006
  console.log(result.message);