@remnic/core 9.65.2 → 9.65.3

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 (449) hide show
  1. package/dist/access-admin-ops-surface.d.ts +44 -44
  2. package/dist/access-admin-ops-surface.js +14 -14
  3. package/dist/access-authorization-probe.d.ts +38 -38
  4. package/dist/access-authorization-probe.js +15 -15
  5. package/dist/access-boundary.d.ts +40 -40
  6. package/dist/access-boundary.js +14 -14
  7. package/dist/access-cli.js +52 -52
  8. package/dist/access-coding-context-resolution.d.ts +3 -1
  9. package/dist/access-extraction-force-flush.d.ts +25 -25
  10. package/dist/access-extraction-force-flush.js +14 -14
  11. package/dist/access-health-types.d.ts +3 -1
  12. package/dist/access-http-lcm-compaction.d.ts +39 -39
  13. package/dist/access-http-lifecycle-flush.d.ts +39 -39
  14. package/dist/access-http-offline-stream.d.ts +25 -25
  15. package/dist/access-http-query.d.ts +4 -2
  16. package/dist/access-http-query.js +16 -16
  17. package/dist/access-http.d.ts +51 -44
  18. package/dist/access-http.js +30 -30
  19. package/dist/access-identity-continuity-surface.d.ts +12 -12
  20. package/dist/access-identity-continuity-surface.js +14 -14
  21. package/dist/access-lcm-surface.d.ts +27 -27
  22. package/dist/access-lcm-surface.js +14 -14
  23. package/dist/access-mcp-admin-tools.d.ts +9 -1
  24. package/dist/access-mcp-admin-tools.js +3 -1
  25. package/dist/access-mcp-output-schemas.js +1 -1
  26. package/dist/access-mcp.d.ts +39 -39
  27. package/dist/access-mcp.js +24 -24
  28. package/dist/access-memory-search-fanout.d.ts +4 -2
  29. package/dist/{access-namespace-preflight-Dhvcl-T0.d.ts → access-namespace-preflight-B7Usyz-K.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +5 -3
  31. package/dist/access-namespace-preflight.js +14 -14
  32. package/dist/access-observe-write-surface.d.ts +39 -39
  33. package/dist/access-observe-write-surface.js +14 -14
  34. package/dist/access-offline-manifest.d.ts +12 -12
  35. package/dist/access-operations-batch.js +18 -18
  36. package/dist/access-operations.d.ts +40 -40
  37. package/dist/access-operations.js +21 -21
  38. package/dist/access-recall-concurrency.d.ts +40 -40
  39. package/dist/access-recall-concurrency.js +14 -14
  40. package/dist/access-recall-response.d.ts +24 -24
  41. package/dist/access-recall-response.js +14 -14
  42. package/dist/access-recall-surface.d.ts +24 -24
  43. package/dist/access-recall-surface.js +14 -14
  44. package/dist/access-schema.d.ts +45 -45
  45. package/dist/{access-service-Bke1alZO.d.ts → access-service-DkaIG3n8.d.ts} +219 -75
  46. package/dist/access-service-helpers.d.ts +40 -40
  47. package/dist/access-service.d.ts +47 -47
  48. package/dist/access-service.js +14 -14
  49. package/dist/access-surface-catalog.d.ts +40 -40
  50. package/dist/access-surface-catalog.js +20 -16
  51. package/dist/access-surface-catalog.js.map +1 -1
  52. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  53. package/dist/action-confidence.d.ts +3 -1
  54. package/dist/active-memory-bridge.d.ts +3 -1
  55. package/dist/active-recall.d.ts +3 -1
  56. package/dist/active-recall.js +6 -1
  57. package/dist/active-recall.js.map +1 -1
  58. package/dist/ambient-provenance.d.ts +3 -1
  59. package/dist/artifact-search.d.ts +3 -1
  60. package/dist/behavior-learner.d.ts +3 -1
  61. package/dist/behavior-signals.d.ts +3 -1
  62. package/dist/bootstrap.d.ts +12 -12
  63. package/dist/briefing-window.d.ts +4 -2
  64. package/dist/briefing.d.ts +4 -2
  65. package/dist/briefing.js +3 -3
  66. package/dist/buffer-surprise-report.d.ts +3 -1
  67. package/dist/buffer-turn-helpers.d.ts +3 -1
  68. package/dist/buffer.d.ts +4 -2
  69. package/dist/bulk-import/index.d.ts +5 -3
  70. package/dist/calibration.d.ts +3 -1
  71. package/dist/capabilities.d.ts +3 -1
  72. package/dist/{catalog-DV6qnbr7.d.ts → catalog-CX2BZEJh.d.ts} +1 -1
  73. package/dist/causal-behavior.d.ts +1 -1
  74. package/dist/causal-consolidation.d.ts +3 -1
  75. package/dist/causal-consolidation.js +7 -7
  76. package/dist/causal-trajectory-graph.d.ts +1 -1
  77. package/dist/{chunk-R7JAM2XF.js → chunk-2VXWFYJE.js} +3 -3
  78. package/dist/{chunk-UXO5IMBK.js → chunk-4XDGYCZI.js} +2 -2
  79. package/dist/{chunk-OTHZWLUD.js → chunk-57HVIG5U.js} +2 -2
  80. package/dist/{chunk-EILZG5VC.js → chunk-6TAX66IA.js} +2 -2
  81. package/dist/{chunk-NKKD4ZAU.js → chunk-6VALIZKG.js} +2 -2
  82. package/dist/{chunk-BWLRUMOG.js → chunk-76PL4XLG.js} +435 -1
  83. package/dist/chunk-76PL4XLG.js.map +1 -0
  84. package/dist/{chunk-2E36UXVW.js → chunk-7KFIMGMP.js} +2 -2
  85. package/dist/{chunk-LGO6A7GJ.js → chunk-7QOO4LGC.js} +28 -28
  86. package/dist/{chunk-TBOJ76ER.js → chunk-AB3A7EFH.js} +18 -2
  87. package/dist/{chunk-TBOJ76ER.js.map → chunk-AB3A7EFH.js.map} +1 -1
  88. package/dist/{chunk-DZUJ46DO.js → chunk-AUO2LJ3K.js} +2 -2
  89. package/dist/{chunk-ZO6AXLEH.js → chunk-AYDDB3XI.js} +2 -2
  90. package/dist/{chunk-NTWN6HB2.js → chunk-AYYGRVRP.js} +2 -2
  91. package/dist/{chunk-7YQ4IYS2.js → chunk-AZAA5DNP.js} +2 -2
  92. package/dist/{chunk-4KYOLI6M.js → chunk-BKYPJUQL.js} +120 -14
  93. package/dist/chunk-BKYPJUQL.js.map +1 -0
  94. package/dist/{chunk-Z7PBQPJ4.js → chunk-BQUEAVNW.js} +2 -2
  95. package/dist/{chunk-35NN3ZFA.js → chunk-CTVWELNK.js} +21 -3
  96. package/dist/chunk-CTVWELNK.js.map +1 -0
  97. package/dist/{chunk-5YQ63T4B.js → chunk-D27J626P.js} +2 -2
  98. package/dist/{chunk-LZH5FR2W.js → chunk-DHTQP334.js} +2 -2
  99. package/dist/{chunk-Y7DK7HHJ.js → chunk-E4MVQQVX.js} +2 -2
  100. package/dist/{chunk-JYYBA7TF.js → chunk-EIVIB73I.js} +2 -2
  101. package/dist/{chunk-S2DPMJXH.js → chunk-EV3YFLCB.js} +2 -2
  102. package/dist/{chunk-TZNQUNKL.js → chunk-FC7TIRFS.js} +15 -1
  103. package/dist/chunk-FC7TIRFS.js.map +1 -0
  104. package/dist/{chunk-3I7ASZN3.js → chunk-G57LQRP6.js} +2 -2
  105. package/dist/{chunk-UIN2BWDD.js → chunk-GN55KU2P.js} +2 -2
  106. package/dist/{chunk-PE255F4T.js → chunk-GUXS322H.js} +2 -2
  107. package/dist/{chunk-V3MXUL3D.js → chunk-H5FW4S5Q.js} +319 -643
  108. package/dist/chunk-H5FW4S5Q.js.map +1 -0
  109. package/dist/chunk-I32NKXE2.js +879 -0
  110. package/dist/chunk-I32NKXE2.js.map +1 -0
  111. package/dist/{chunk-YB42WZCY.js → chunk-IQSC3V2E.js} +2 -2
  112. package/dist/{chunk-MN4KB2A4.js → chunk-MBDJJTAT.js} +3 -3
  113. package/dist/{chunk-SQI57UCJ.js → chunk-MRTUN665.js} +2 -2
  114. package/dist/{chunk-SBDCZ2AX.js → chunk-NXKJHSDN.js} +1 -1
  115. package/dist/chunk-NXKJHSDN.js.map +1 -0
  116. package/dist/{chunk-SPUJNJJC.js → chunk-NZWEEALH.js} +2 -2
  117. package/dist/{chunk-2XDWWPTN.js → chunk-OJD4WS2E.js} +2 -2
  118. package/dist/{chunk-ZWXJBFZU.js → chunk-OLWTCWQ2.js} +8 -8
  119. package/dist/{chunk-XRYZRW54.js → chunk-P4DHENRE.js} +2 -2
  120. package/dist/{chunk-J275IYMG.js → chunk-PAYGC3BD.js} +29 -2
  121. package/dist/chunk-PAYGC3BD.js.map +1 -0
  122. package/dist/{chunk-IID2CMUU.js → chunk-PDVQ5JU3.js} +2 -2
  123. package/dist/{chunk-7BY7V4YX.js → chunk-Q4WONDMJ.js} +4 -3
  124. package/dist/{chunk-7BY7V4YX.js.map → chunk-Q4WONDMJ.js.map} +1 -1
  125. package/dist/{chunk-5NM4OH4P.js → chunk-QFMO32TO.js} +3 -3
  126. package/dist/{chunk-SIHSCCUQ.js → chunk-QXIQPCCN.js} +1 -1
  127. package/dist/{chunk-2YI72KM3.js → chunk-R47WINCY.js} +2 -2
  128. package/dist/{chunk-ZQHI2BZB.js → chunk-RK4WXUI2.js} +2 -2
  129. package/dist/{chunk-QOS5LBZN.js → chunk-S7Q5CM7E.js} +2 -2
  130. package/dist/{chunk-GDFVPUJ5.js → chunk-TDKSCV62.js} +2 -2
  131. package/dist/{chunk-OCZIYAE5.js → chunk-TYUS5TLG.js} +3 -3
  132. package/dist/{chunk-GNCCUR6K.js → chunk-URHCUXKI.js} +2 -2
  133. package/dist/{chunk-TF77C7SV.js → chunk-VA5KMSAE.js} +7 -5
  134. package/dist/chunk-VA5KMSAE.js.map +1 -0
  135. package/dist/{chunk-SB7D4BT7.js → chunk-WN5FSGLE.js} +1545 -105
  136. package/dist/chunk-WN5FSGLE.js.map +1 -0
  137. package/dist/{chunk-YLDXWCZP.js → chunk-YF6UHWOV.js} +14 -9
  138. package/dist/chunk-YF6UHWOV.js.map +1 -0
  139. package/dist/{chunk-CT56C22C.js → chunk-Z4RPXHJH.js} +4 -4
  140. package/dist/{cli-cShQ13XG.d.ts → cli-ChKeYMZv.d.ts} +5 -5
  141. package/dist/cli.d.ts +25 -25
  142. package/dist/cli.js +44 -43
  143. package/dist/coding/pre-action-gate.d.ts +2 -60
  144. package/dist/compounding/engine.d.ts +4 -2
  145. package/dist/compounding/engine.js +3 -3
  146. package/dist/compounding/preference-consolidator.d.ts +3 -1
  147. package/dist/compression-optimizer.d.ts +3 -1
  148. package/dist/config.d.ts +3 -1
  149. package/dist/config.js +6 -1
  150. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  151. package/dist/connectors/codex-materialize-runner.js +3 -3
  152. package/dist/connectors/codex-materialize.d.ts +3 -1
  153. package/dist/connectors/index.d.ts +3 -1
  154. package/dist/connectors/index.js +3 -3
  155. package/dist/consolidation-provenance-check.d.ts +4 -2
  156. package/dist/consolidation-undo.d.ts +4 -2
  157. package/dist/contradiction/index.d.ts +10 -270
  158. package/dist/contradiction/index.js +11 -6
  159. package/dist/{contradiction-review-QKJH5DKD.js → contradiction-review-WRVLRWHS.js} +6 -2
  160. package/dist/{contradiction-scan-VOTQRRSX.js → contradiction-scan-AKUWPX5N.js} +5 -3
  161. package/dist/converge-config.d.ts +3 -1
  162. package/dist/convergence-refresh.d.ts +4 -2
  163. package/dist/convergence-refresh.js +5 -5
  164. package/dist/conversation-index/backend.d.ts +3 -1
  165. package/dist/conversation-index/chunker.d.ts +3 -1
  166. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  167. package/dist/conversation-index/indexer.d.ts +3 -1
  168. package/dist/conversation-index/search.d.ts +3 -1
  169. package/dist/corpus-watermark.d.ts +3 -1
  170. package/dist/corpus-watermark.js +5 -5
  171. package/dist/cross-lingual-recall.d.ts +3 -1
  172. package/dist/day-summary.d.ts +3 -1
  173. package/dist/delinearize.d.ts +3 -1
  174. package/dist/dependency-propagation-config.d.ts +3 -1
  175. package/dist/{dependency-propagation-delivery-CsGg-VwS.d.ts → dependency-propagation-delivery-B8ZMBBCY.d.ts} +1 -1
  176. package/dist/direct-answer-wiring.d.ts +3 -1
  177. package/dist/direct-answer.d.ts +3 -1
  178. package/dist/embedding-fallback.d.ts +3 -1
  179. package/dist/enrichment/index.d.ts +3 -1
  180. package/dist/entity-origin-fields.d.ts +3 -1
  181. package/dist/entity-retrieval.d.ts +4 -2
  182. package/dist/entity-retrieval.js +3 -3
  183. package/dist/entity-schema.d.ts +3 -1
  184. package/dist/episodic-context.d.ts +3 -1
  185. package/dist/explicit-capture.d.ts +12 -12
  186. package/dist/external-wiki-access.d.ts +40 -40
  187. package/dist/external-wiki-access.js +15 -15
  188. package/dist/external-wiki-collection-registration.d.ts +3 -1
  189. package/dist/external-wiki-collection.d.ts +3 -1
  190. package/dist/external-wiki-mcp-tools.d.ts +40 -40
  191. package/dist/extraction-error-classification.d.ts +3 -1
  192. package/dist/extraction-faithfulness.d.ts +3 -1
  193. package/dist/extraction-judge-telemetry.d.ts +3 -1
  194. package/dist/extraction-judge-training.d.ts +3 -1
  195. package/dist/extraction-judge.d.ts +3 -1
  196. package/dist/extraction-liveness.d.ts +3 -1
  197. package/dist/extraction-normalization.d.ts +3 -1
  198. package/dist/extraction-prompt.d.ts +3 -1
  199. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  200. package/dist/extraction-source-grounding.d.ts +3 -1
  201. package/dist/extraction.d.ts +3 -1
  202. package/dist/extraction.js +3 -3
  203. package/dist/fallback-llm.d.ts +3 -1
  204. package/dist/graph-dashboard-diff.d.ts +3 -1
  205. package/dist/graph-dashboard-key.d.ts +3 -1
  206. package/dist/graph-dashboard-parser.d.ts +3 -1
  207. package/dist/graph-edge-reinforcement.d.ts +3 -1
  208. package/dist/graph-path-reconstruction.d.ts +3 -1
  209. package/dist/graph-path-scoring.d.ts +3 -1
  210. package/dist/graph-snapshot.d.ts +3 -1
  211. package/dist/graph.d.ts +3 -1
  212. package/dist/harmonic-retrieval.js +1 -1
  213. package/dist/importance.d.ts +3 -1
  214. package/dist/importers/index.d.ts +3 -1
  215. package/dist/in-flight-reads.d.ts +3 -1
  216. package/dist/index-CexDrJzC.d.ts +284 -0
  217. package/dist/index.d.ts +251 -29
  218. package/dist/index.js +129 -75
  219. package/dist/intent.d.ts +3 -1
  220. package/dist/lcm/engine.d.ts +3 -1
  221. package/dist/lcm/index.d.ts +3 -1
  222. package/dist/lcm/tools.d.ts +3 -1
  223. package/dist/lifecycle.d.ts +3 -1
  224. package/dist/live-connectors-runner.d.ts +3 -1
  225. package/dist/local-llm.d.ts +3 -1
  226. package/dist/local-model-endpoint.d.ts +3 -1
  227. package/dist/maintenance/memory-governance.d.ts +3 -1
  228. package/dist/maintenance/memory-governance.js +3 -3
  229. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
  230. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +3 -3
  231. package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
  232. package/dist/maintenance/rebuild-memory-projection.js +4 -4
  233. package/dist/{maintenance-jhMpeGne.d.ts → maintenance-nkdtSrVr.d.ts} +3 -3
  234. package/dist/mcp-memory-inspector-app.d.ts +37 -37
  235. package/dist/memory-action-policy.d.ts +3 -1
  236. package/dist/memory-cache.d.ts +3 -1
  237. package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
  238. package/dist/memory-projection-store.d.ts +3 -1
  239. package/dist/memory-provenance.d.ts +3 -1
  240. package/dist/memory-snapshot.d.ts +3 -1
  241. package/dist/memory-subject-cli.d.ts +40 -40
  242. package/dist/memory-subject.d.ts +42 -42
  243. package/dist/memory-worth-outcomes.d.ts +4 -2
  244. package/dist/models-json.d.ts +3 -1
  245. package/dist/namespaces/migrate.d.ts +5 -3
  246. package/dist/namespaces/migrate.js +4 -4
  247. package/dist/namespaces/principal.d.ts +3 -1
  248. package/dist/namespaces/search.d.ts +3 -1
  249. package/dist/namespaces/storage.d.ts +5 -3
  250. package/dist/namespaces/storage.js +3 -3
  251. package/dist/native-knowledge.d.ts +3 -1
  252. package/dist/offline-sync-impression-drain.d.ts +3 -1
  253. package/dist/operator-doctor-corpus.d.ts +3 -1
  254. package/dist/operator-doctor-corpus.js +6 -6
  255. package/dist/operator-doctor-replica.d.ts +3 -1
  256. package/dist/operator-toolkit.d.ts +5 -3
  257. package/dist/operator-toolkit.js +15 -12
  258. package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
  259. package/dist/orchestration/maintenance.d.ts +6 -4
  260. package/dist/orchestration/maintenance.js +9 -9
  261. package/dist/{orchestrator-DyGUC7re.d.ts → orchestrator-Bvq1-RQs.d.ts} +23 -9
  262. package/dist/orchestrator.d.ts +12 -12
  263. package/dist/orchestrator.js +52 -52
  264. package/dist/patterns-cli.d.ts +3 -1
  265. package/dist/{pipeline-C25Oxtp1.d.ts → pipeline-C8vfIiTX.d.ts} +1 -1
  266. package/dist/policy-runtime.d.ts +3 -1
  267. package/dist/proactive-contention.d.ts +3 -1
  268. package/dist/provenance.d.ts +3 -1
  269. package/dist/{public-http-CMe7NQzj.d.ts → public-http-Cy0aYbys.d.ts} +1 -1
  270. package/dist/{qmd-DkDVCbgF.d.ts → qmd-B9p1SZTZ.d.ts} +1 -1
  271. package/dist/qmd-preflight.d.ts +4 -2
  272. package/dist/qmd-recall-cache.d.ts +3 -1
  273. package/dist/qmd.d.ts +4 -2
  274. package/dist/recall-concurrency-config.d.ts +3 -1
  275. package/dist/recall-disclosure-escalation.d.ts +3 -1
  276. package/dist/recall-explain-renderer.d.ts +3 -1
  277. package/dist/recall-explain-renderer.js +3 -3
  278. package/dist/recall-memory-map.d.ts +3 -1
  279. package/dist/recall-planner-llm.d.ts +3 -1
  280. package/dist/recall-state.d.ts +3 -1
  281. package/dist/recall-tag-filter.d.ts +3 -1
  282. package/dist/recall-timings.d.ts +3 -1
  283. package/dist/recall-xray-cli.d.ts +3 -1
  284. package/dist/recall-xray-cli.js +4 -4
  285. package/dist/recall-xray-renderer.d.ts +3 -1
  286. package/dist/recall-xray-renderer.js +3 -3
  287. package/dist/recall-xray.d.ts +3 -1
  288. package/dist/recall-xray.js +2 -2
  289. package/dist/reconcile/cursor.d.ts +3 -1
  290. package/dist/reconcile/manifest.d.ts +3 -1
  291. package/dist/reconcile/plan.d.ts +3 -1
  292. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  293. package/dist/replay/normalizers/claude.d.ts +3 -1
  294. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  295. package/dist/replay/normalizers/shared.d.ts +3 -1
  296. package/dist/replay/runner.d.ts +3 -1
  297. package/dist/replay/types.d.ts +3 -1
  298. package/dist/replica-divergence.d.ts +3 -1
  299. package/dist/replica-peers-config.d.ts +3 -1
  300. package/dist/{resolution-MFY72STR.js → resolution-4552BNRV.js} +13 -3
  301. package/dist/resolve-auth-token.d.ts +3 -1
  302. package/dist/resume-bundles.js +4 -2
  303. package/dist/retrieval-agents.d.ts +4 -2
  304. package/dist/retrieval-tiers.d.ts +3 -1
  305. package/dist/routing/engine.d.ts +3 -1
  306. package/dist/routing/store.d.ts +3 -1
  307. package/dist/salvage-envelope.d.ts +3 -1
  308. package/dist/schemas.d.ts +44 -44
  309. package/dist/{scope-profiles-B9xMoFO-.d.ts → scope-profiles-DLrRxFWR.d.ts} +1 -1
  310. package/dist/search/embed-helper.d.ts +3 -1
  311. package/dist/search/factory.d.ts +3 -1
  312. package/dist/search/index.d.ts +3 -1
  313. package/dist/search/lancedb-backend.d.ts +3 -1
  314. package/dist/search/meilisearch-backend.d.ts +3 -1
  315. package/dist/search/noop-backend.d.ts +3 -1
  316. package/dist/search/orama-backend.d.ts +3 -1
  317. package/dist/search/port.d.ts +3 -1
  318. package/dist/search/remote-backend.d.ts +3 -1
  319. package/dist/{semantic-TddhF0y7.d.ts → semantic-BalR6EXU.d.ts} +1 -1
  320. package/dist/{semantic-consolidation-C4uykW84.d.ts → semantic-consolidation-DlN6xe20.d.ts} +1 -1
  321. package/dist/semantic-consolidation.d.ts +4 -2
  322. package/dist/semantic-consolidation.js +4 -4
  323. package/dist/semantic-rule-promotion.js +3 -3
  324. package/dist/semantic-rule-verifier.d.ts +3 -1
  325. package/dist/semantic-rule-verifier.js +3 -3
  326. package/dist/{service-DCZDZNcV.d.ts → service-GkYyVfm9.d.ts} +2 -2
  327. package/dist/session-observer-bands.d.ts +3 -1
  328. package/dist/session-observer-state.d.ts +3 -1
  329. package/dist/shared-context/manager.d.ts +3 -1
  330. package/dist/signal.d.ts +3 -1
  331. package/dist/source-agent-qualifier.d.ts +3 -1
  332. package/dist/source-agent-qualifier.js +3 -3
  333. package/dist/{storage-CcKmEjL8.d.ts → storage-BIDzuKIn.d.ts} +1 -1
  334. package/dist/storage.d.ts +4 -2
  335. package/dist/storage.js +2 -2
  336. package/dist/subject-config.d.ts +3 -1
  337. package/dist/summarizer.d.ts +3 -1
  338. package/dist/summary-snapshot.d.ts +3 -1
  339. package/dist/support-passport/index.d.ts +43 -43
  340. package/dist/support-passport/index.js +17 -17
  341. package/dist/temporal-supersession.d.ts +4 -2
  342. package/dist/temporal-timeline-recall.d.ts +3 -1
  343. package/dist/temporal-validity.d.ts +3 -1
  344. package/dist/threading.d.ts +3 -1
  345. package/dist/tier-migration.d.ts +4 -2
  346. package/dist/tier-routing.d.ts +3 -1
  347. package/dist/topics.d.ts +3 -1
  348. package/dist/transcript.d.ts +3 -1
  349. package/dist/transfer/types.d.ts +20 -20
  350. package/dist/trust-score-stage.d.ts +3 -1
  351. package/dist/trust-score.d.ts +3 -1
  352. package/dist/{types-Pi0lfaEt.d.ts → types-BxAcOl5Q.d.ts} +323 -4
  353. package/dist/types.d.ts +3 -1
  354. package/dist/types.js +1 -1
  355. package/dist/utility-runtime.d.ts +3 -1
  356. package/dist/verified-recall.js +3 -3
  357. package/dist/who-knows-cli.d.ts +40 -40
  358. package/dist/who-knows-cli.js +4 -4
  359. package/dist/who-knows.d.ts +42 -42
  360. package/dist/who-knows.js +3 -3
  361. package/dist/write-envelope.d.ts +3 -1
  362. package/package.json +2 -2
  363. package/src/access-boundary.ts +4 -0
  364. package/src/access-http.ts +6 -5
  365. package/src/access-mcp-admin-tools.ts +24 -0
  366. package/src/access-mcp-output-schemas.ts +14 -0
  367. package/src/access-mcp.ts +2 -2
  368. package/src/access-operations-batch.ts +5 -0
  369. package/src/access-service.ts +27 -0
  370. package/src/access-surface-catalog.test.ts +24 -0
  371. package/src/access-surface-catalog.ts +4 -0
  372. package/src/coding/action-gate.test.ts +341 -0
  373. package/src/coding/action-gate.ts +556 -0
  374. package/src/config.ts +5 -0
  375. package/src/contradiction/contradiction-review.ts +50 -4
  376. package/src/contradiction/contradiction-scan.ts +14 -3
  377. package/src/contradiction/resolution.ts +50 -2
  378. package/src/index.ts +4 -3
  379. package/src/orchestration/recall-rerank-coordinator.ts +123 -4
  380. package/src/orchestration/recall-result-formatter.ts +6 -2
  381. package/src/orchestration/recall-search-pipeline.ts +14 -1
  382. package/src/preferences/drift-config.ts +118 -0
  383. package/src/preferences/drift-recall.ts +133 -0
  384. package/src/preferences/drift-types.ts +87 -0
  385. package/src/preferences/index.ts +12 -0
  386. package/src/preferences/preference-drift.test.ts +690 -0
  387. package/src/preferences/preference-drift.ts +724 -0
  388. package/src/review/review-deck-access.test.ts +325 -0
  389. package/src/review/review-deck-http-base.ts +133 -0
  390. package/src/review/review-deck-mutation.test.ts +417 -0
  391. package/src/review/review-deck-mutation.ts +677 -0
  392. package/src/review/review-deck-snapshot.ts +196 -0
  393. package/src/review/review-deck-surface.ts +117 -0
  394. package/src/review/review-deck.test.ts +347 -0
  395. package/src/review/review-deck.ts +311 -0
  396. package/src/storage.ts +4 -6
  397. package/src/types.ts +7 -3
  398. package/dist/chunk-35NN3ZFA.js.map +0 -1
  399. package/dist/chunk-4KYOLI6M.js.map +0 -1
  400. package/dist/chunk-BWLRUMOG.js.map +0 -1
  401. package/dist/chunk-J275IYMG.js.map +0 -1
  402. package/dist/chunk-SB7D4BT7.js.map +0 -1
  403. package/dist/chunk-SBDCZ2AX.js.map +0 -1
  404. package/dist/chunk-TF77C7SV.js.map +0 -1
  405. package/dist/chunk-TZNQUNKL.js.map +0 -1
  406. package/dist/chunk-V3MXUL3D.js.map +0 -1
  407. package/dist/chunk-XCTXS7VY.js +0 -402
  408. package/dist/chunk-XCTXS7VY.js.map +0 -1
  409. package/dist/chunk-YLDXWCZP.js.map +0 -1
  410. /package/dist/{chunk-R7JAM2XF.js.map → chunk-2VXWFYJE.js.map} +0 -0
  411. /package/dist/{chunk-UXO5IMBK.js.map → chunk-4XDGYCZI.js.map} +0 -0
  412. /package/dist/{chunk-OTHZWLUD.js.map → chunk-57HVIG5U.js.map} +0 -0
  413. /package/dist/{chunk-EILZG5VC.js.map → chunk-6TAX66IA.js.map} +0 -0
  414. /package/dist/{chunk-NKKD4ZAU.js.map → chunk-6VALIZKG.js.map} +0 -0
  415. /package/dist/{chunk-2E36UXVW.js.map → chunk-7KFIMGMP.js.map} +0 -0
  416. /package/dist/{chunk-LGO6A7GJ.js.map → chunk-7QOO4LGC.js.map} +0 -0
  417. /package/dist/{chunk-DZUJ46DO.js.map → chunk-AUO2LJ3K.js.map} +0 -0
  418. /package/dist/{chunk-ZO6AXLEH.js.map → chunk-AYDDB3XI.js.map} +0 -0
  419. /package/dist/{chunk-NTWN6HB2.js.map → chunk-AYYGRVRP.js.map} +0 -0
  420. /package/dist/{chunk-7YQ4IYS2.js.map → chunk-AZAA5DNP.js.map} +0 -0
  421. /package/dist/{chunk-Z7PBQPJ4.js.map → chunk-BQUEAVNW.js.map} +0 -0
  422. /package/dist/{chunk-5YQ63T4B.js.map → chunk-D27J626P.js.map} +0 -0
  423. /package/dist/{chunk-LZH5FR2W.js.map → chunk-DHTQP334.js.map} +0 -0
  424. /package/dist/{chunk-Y7DK7HHJ.js.map → chunk-E4MVQQVX.js.map} +0 -0
  425. /package/dist/{chunk-JYYBA7TF.js.map → chunk-EIVIB73I.js.map} +0 -0
  426. /package/dist/{chunk-S2DPMJXH.js.map → chunk-EV3YFLCB.js.map} +0 -0
  427. /package/dist/{chunk-3I7ASZN3.js.map → chunk-G57LQRP6.js.map} +0 -0
  428. /package/dist/{chunk-UIN2BWDD.js.map → chunk-GN55KU2P.js.map} +0 -0
  429. /package/dist/{chunk-PE255F4T.js.map → chunk-GUXS322H.js.map} +0 -0
  430. /package/dist/{chunk-YB42WZCY.js.map → chunk-IQSC3V2E.js.map} +0 -0
  431. /package/dist/{chunk-MN4KB2A4.js.map → chunk-MBDJJTAT.js.map} +0 -0
  432. /package/dist/{chunk-SQI57UCJ.js.map → chunk-MRTUN665.js.map} +0 -0
  433. /package/dist/{chunk-SPUJNJJC.js.map → chunk-NZWEEALH.js.map} +0 -0
  434. /package/dist/{chunk-2XDWWPTN.js.map → chunk-OJD4WS2E.js.map} +0 -0
  435. /package/dist/{chunk-ZWXJBFZU.js.map → chunk-OLWTCWQ2.js.map} +0 -0
  436. /package/dist/{chunk-XRYZRW54.js.map → chunk-P4DHENRE.js.map} +0 -0
  437. /package/dist/{chunk-IID2CMUU.js.map → chunk-PDVQ5JU3.js.map} +0 -0
  438. /package/dist/{chunk-5NM4OH4P.js.map → chunk-QFMO32TO.js.map} +0 -0
  439. /package/dist/{chunk-SIHSCCUQ.js.map → chunk-QXIQPCCN.js.map} +0 -0
  440. /package/dist/{chunk-2YI72KM3.js.map → chunk-R47WINCY.js.map} +0 -0
  441. /package/dist/{chunk-ZQHI2BZB.js.map → chunk-RK4WXUI2.js.map} +0 -0
  442. /package/dist/{chunk-QOS5LBZN.js.map → chunk-S7Q5CM7E.js.map} +0 -0
  443. /package/dist/{chunk-GDFVPUJ5.js.map → chunk-TDKSCV62.js.map} +0 -0
  444. /package/dist/{chunk-OCZIYAE5.js.map → chunk-TYUS5TLG.js.map} +0 -0
  445. /package/dist/{chunk-GNCCUR6K.js.map → chunk-URHCUXKI.js.map} +0 -0
  446. /package/dist/{chunk-CT56C22C.js.map → chunk-Z4RPXHJH.js.map} +0 -0
  447. /package/dist/{contradiction-review-QKJH5DKD.js.map → contradiction-review-WRVLRWHS.js.map} +0 -0
  448. /package/dist/{contradiction-scan-VOTQRRSX.js.map → contradiction-scan-AKUWPX5N.js.map} +0 -0
  449. /package/dist/{resolution-MFY72STR.js.map → resolution-4552BNRV.js.map} +0 -0
@@ -0,0 +1,417 @@
1
+ import assert from "node:assert/strict";
2
+
3
+ import { mkdir, readFile, rm, stat, writeFile } from "node:fs/promises";
4
+ import fs from "node:fs";
5
+ import os from "node:os";
6
+ import path from "node:path";
7
+ import test, { type TestContext } from "node:test";
8
+ import { computeReviewItemRevision } from "./review-deck.js";
9
+ import { readReviewDeckRow } from "./review-deck-snapshot.js";
10
+ import {
11
+ executeReviewDeckAction,
12
+ executeReviewDeckUndo,
13
+ parseReviewLifecycleReceipt,
14
+ ReviewDeckIdempotencyError,
15
+ type ReviewDeckMutationContext,
16
+ type ReviewLifecycleLedgerEvent,
17
+ } from "./review-deck-mutation.js";
18
+
19
+ async function makeMemoryDir(t: TestContext): Promise<string> {
20
+ const dir = await mkdtempSafe(t);
21
+ await mkdir(path.join(dir, "review"), { recursive: true });
22
+ return dir;
23
+ }
24
+
25
+ async function mkdtempSafe(t: TestContext): Promise<string> {
26
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "remnic-review-deck-"));
27
+ t.after(() => rm(dir, { recursive: true, force: true }));
28
+ return dir;
29
+ }
30
+
31
+ function reviewMarkdown(id: string, extra = ""): string {
32
+ return `---
33
+ id: ${id}
34
+ category: fact
35
+ confidence: 0.4
36
+ confidenceTier: low
37
+ source: test
38
+ created: 2026-05-17T00:00:00.000Z
39
+ reviewReason: low_confidence
40
+ lifecycleState: pending_review
41
+ status: pending_review
42
+ ${extra}---
43
+ Candidate memory.
44
+ `;
45
+ }
46
+
47
+ function makeCtx(
48
+ memoryDir: string,
49
+ events: unknown[],
50
+ extras: Partial<ReviewDeckMutationContext> = {},
51
+ ): ReviewDeckMutationContext {
52
+ return {
53
+ memoryDir,
54
+ namespace: "ns-test",
55
+ principalDigest: "prin-test",
56
+ async appendLifecycleEvents(next) {
57
+ events.push(...next);
58
+ },
59
+ async readLifecycleEvents(memoryId) {
60
+ if (!memoryId) return events;
61
+ return events.filter((row) => {
62
+ if (!row || typeof row !== "object" || !("memoryId" in row)) return false;
63
+ return row.memoryId === memoryId;
64
+ });
65
+ },
66
+ ...extras,
67
+ };
68
+ }
69
+
70
+ async function writeQueueItem(
71
+ memoryDir: string,
72
+ id: string,
73
+ extra = "",
74
+ ): Promise<{ filePath: string; content: string; revision: string }> {
75
+ const filePath = path.join(memoryDir, "review", `${id}.md`);
76
+ const content = reviewMarkdown(id, extra);
77
+ await writeFile(filePath, content, "utf8");
78
+ const row = readReviewDeckRow({ memoryDir, itemId: id });
79
+ assert.ok(row, `expected pending review row ${id}`);
80
+ return { filePath, content, revision: row.revision };
81
+ }
82
+
83
+ function ledgerEvent(value: unknown): ReviewLifecycleLedgerEvent {
84
+ if (!value || typeof value !== "object") throw new Error("expected lifecycle event");
85
+ // Test ledger rows are objects this suite appended.
86
+ return value as ReviewLifecycleLedgerEvent;
87
+ }
88
+
89
+ function todayStamp(): string {
90
+ return new Date().toISOString().split("T")[0];
91
+ }
92
+
93
+ test("keep promotes through performReview and fires tombstone revocation", async (t) => {
94
+ const memoryDir = await makeMemoryDir(t);
95
+ const events: unknown[] = [];
96
+ const hookCalls: Array<[string, string]> = [];
97
+ const item = await writeQueueItem(memoryDir, "keep-blocked", "blockedBy: tomb-1\n");
98
+ const ctx = makeCtx(memoryDir, events, {
99
+ onApproveBlockedMemory(tombstoneId, memoryId) {
100
+ hookCalls.push([tombstoneId, memoryId]);
101
+ },
102
+ });
103
+
104
+ const receipt = await executeReviewDeckAction(ctx, {
105
+ schemaVersion: 1,
106
+ itemId: "keep-blocked",
107
+ revision: item.revision,
108
+ action: "keep",
109
+ idempotencyKey: "keep-1",
110
+ });
111
+
112
+ assert.equal(receipt.outcome, "applied");
113
+ assert.equal(receipt.action, "keep");
114
+ assert.equal(receipt.undoAvailable, true);
115
+ assert.match(receipt.effect, /recalled/);
116
+ assert.deepEqual(hookCalls, [["tomb-1", "keep-blocked"]]);
117
+ await assert.rejects(stat(item.filePath), /ENOENT/);
118
+ const promoted = path.join(memoryDir, "facts", todayStamp(), "keep-blocked.md");
119
+ const promotedText = await readFile(promoted, "utf8");
120
+ assert.match(promotedText, /confidence: 0\.9/);
121
+ const row = ledgerEvent(events[0]);
122
+ assert.equal(row.eventType, "promoted");
123
+ assert.equal(row.actor, "admin-console.review-deck");
124
+ assert.equal(row.reviewReceipt?.action, "approve");
125
+ });
126
+
127
+ test("not true dismisses a queue item", async (t) => {
128
+ const memoryDir = await makeMemoryDir(t);
129
+ const events: unknown[] = [];
130
+ const item = await writeQueueItem(memoryDir, "dismiss-1");
131
+ const receipt = await executeReviewDeckAction(makeCtx(memoryDir, events), {
132
+ schemaVersion: 1,
133
+ itemId: "dismiss-1",
134
+ revision: item.revision,
135
+ action: "not_true",
136
+ idempotencyKey: "dismiss-1",
137
+ });
138
+
139
+ assert.equal(receipt.outcome, "applied");
140
+ assert.equal(receipt.action, "not_true");
141
+ assert.equal(receipt.undoAvailable, true);
142
+ assert.equal(typeof receipt.appliedRevision, "string");
143
+ await assert.rejects(stat(item.filePath), /ENOENT/);
144
+ const row = ledgerEvent(events[0]);
145
+ assert.equal(row.eventType, "rejected");
146
+ assert.equal(row.reviewReceipt?.action, "dismiss");
147
+ const undone = await executeReviewDeckUndo(makeCtx(memoryDir, events), {
148
+ schemaVersion: 1,
149
+ receiptId: receipt.receiptId,
150
+ expectedRevision: receipt.appliedRevision ?? "",
151
+ idempotencyKey: "dismiss-1-undo",
152
+ });
153
+ assert.equal(undone.outcome, "applied");
154
+ assert.equal(await readFile(item.filePath, "utf8"), item.content);
155
+ });
156
+
157
+ test("stale revision returns conflict with no file change", async (t) => {
158
+ const memoryDir = await makeMemoryDir(t);
159
+ const events: unknown[] = [];
160
+ const item = await writeQueueItem(memoryDir, "stale-1");
161
+ const receipt = await executeReviewDeckAction(makeCtx(memoryDir, events), {
162
+ schemaVersion: 1,
163
+ itemId: "stale-1",
164
+ revision: "rv1:deadbeef",
165
+ action: "keep",
166
+ idempotencyKey: "stale-1",
167
+ });
168
+
169
+ assert.equal(receipt.outcome, "conflict");
170
+ assert.equal(receipt.appliedRevision, item.revision);
171
+ assert.equal(receipt.undoAvailable, false);
172
+ assert.equal(await readFile(item.filePath, "utf8"), item.content);
173
+ assert.equal(events.length, 0);
174
+ });
175
+
176
+ test("duplicate idempotency key returns the saved receipt and does not apply twice", async (t) => {
177
+ const memoryDir = await makeMemoryDir(t);
178
+ const events: unknown[] = [];
179
+ const item = await writeQueueItem(memoryDir, "idemp-1");
180
+ const ctx = makeCtx(memoryDir, events);
181
+ const req = {
182
+ schemaVersion: 1 as const,
183
+ itemId: "idemp-1",
184
+ revision: item.revision,
185
+ action: "keep" as const,
186
+ idempotencyKey: "same-key",
187
+ };
188
+ const first = await executeReviewDeckAction(ctx, req);
189
+ const second = await executeReviewDeckAction(ctx, req);
190
+
191
+ assert.equal(first.outcome, "applied");
192
+ assert.equal(second.receiptId, first.receiptId);
193
+ assert.equal(second.outcome, first.outcome);
194
+ assert.equal(second.effect, first.effect);
195
+ assert.equal(events.length, 1);
196
+ const promoted = path.join(memoryDir, "facts", todayStamp(), "idemp-1.md");
197
+ assert.equal(computeReviewItemRevision(await readFile(promoted, "utf8")), first.appliedRevision);
198
+ });
199
+
200
+ test("same key with a different fingerprint is rejected", async (t) => {
201
+ const memoryDir = await makeMemoryDir(t);
202
+ const events: unknown[] = [];
203
+ const firstItem = await writeQueueItem(memoryDir, "fp-a");
204
+ await writeQueueItem(memoryDir, "fp-b");
205
+ const ctx = makeCtx(memoryDir, events);
206
+ await executeReviewDeckAction(ctx, {
207
+ schemaVersion: 1,
208
+ itemId: "fp-a",
209
+ revision: firstItem.revision,
210
+ action: "keep",
211
+ idempotencyKey: "shared-key",
212
+ });
213
+
214
+ await assert.rejects(
215
+ () =>
216
+ executeReviewDeckAction(ctx, {
217
+ schemaVersion: 1,
218
+ itemId: "fp-b",
219
+ revision: computeReviewItemRevision(fs.readFileSync(path.join(memoryDir, "review", "fp-b.md"), "utf8")),
220
+ action: "keep",
221
+ idempotencyKey: "shared-key",
222
+ }),
223
+ ReviewDeckIdempotencyError,
224
+ );
225
+ assert.ok(fs.existsSync(path.join(memoryDir, "review", "fp-b.md")));
226
+ });
227
+
228
+ test("prepare_fix returns a plan id and writes no lifecycle event and no file change", async (t) => {
229
+ const memoryDir = await makeMemoryDir(t);
230
+ const events: unknown[] = [];
231
+ const item = await writeQueueItem(memoryDir, "fix-1");
232
+ const receipt = await executeReviewDeckAction(
233
+ makeCtx(memoryDir, events, {
234
+ async planCorrection(input) {
235
+ return { planId: "plan-fix-1", preview: { itemId: input.itemId } };
236
+ },
237
+ }),
238
+ {
239
+ schemaVersion: 1,
240
+ itemId: "fix-1",
241
+ revision: item.revision,
242
+ action: "prepare_fix",
243
+ correctionText: "Replace the guessed preference.",
244
+ idempotencyKey: "fix-1",
245
+ },
246
+ );
247
+
248
+ assert.equal(receipt.outcome, "planned");
249
+ assert.equal(receipt.correctionPlanId, "plan-fix-1");
250
+ assert.deepEqual(receipt.correctionPreview, { itemId: "fix-1" });
251
+ assert.equal(receipt.undoAvailable, false);
252
+ assert.equal(events.length, 0);
253
+ assert.equal(await readFile(item.filePath, "utf8"), item.content);
254
+ });
255
+
256
+ test("abort before the write leaves the file untouched", async (t) => {
257
+ const memoryDir = await makeMemoryDir(t);
258
+ const events: unknown[] = [];
259
+ const item = await writeQueueItem(memoryDir, "abort-1");
260
+ const controller = new AbortController();
261
+ controller.abort();
262
+ await assert.rejects(
263
+ () =>
264
+ executeReviewDeckAction(makeCtx(memoryDir, events, { signal: controller.signal }), {
265
+ schemaVersion: 1,
266
+ itemId: "abort-1",
267
+ revision: item.revision,
268
+ action: "keep",
269
+ idempotencyKey: "abort-1",
270
+ }),
271
+ (err: Error) => err.name === "AbortError",
272
+ );
273
+ assert.equal(await readFile(item.filePath, "utf8"), item.content);
274
+ assert.equal(events.length, 0);
275
+ });
276
+
277
+ test("undo succeeds with no intervening change", async (t) => {
278
+ const memoryDir = await makeMemoryDir(t);
279
+ const events: unknown[] = [];
280
+ const item = await writeQueueItem(memoryDir, "undo-ok");
281
+ const ctx = makeCtx(memoryDir, events);
282
+ const kept = await executeReviewDeckAction(ctx, {
283
+ schemaVersion: 1,
284
+ itemId: "undo-ok",
285
+ revision: item.revision,
286
+ action: "keep",
287
+ idempotencyKey: "undo-ok",
288
+ });
289
+ const undone = await executeReviewDeckUndo(ctx, {
290
+ schemaVersion: 1,
291
+ receiptId: kept.receiptId,
292
+ expectedRevision: kept.appliedRevision ?? "",
293
+ idempotencyKey: "undo-ok-revert",
294
+ });
295
+
296
+ assert.equal(undone.outcome, "applied");
297
+ assert.equal(undone.action, "undo");
298
+ assert.equal(undone.undoAvailable, false);
299
+ assert.equal(await readFile(item.filePath, "utf8"), item.content);
300
+ await assert.rejects(stat(path.join(memoryDir, "facts", todayStamp(), "undo-ok.md")), /ENOENT/);
301
+ const restored = ledgerEvent(events.at(-1));
302
+ assert.equal(restored.eventType, "restored");
303
+ assert.equal(restored.reviewReceipt?.undoOfReceiptId, kept.receiptId);
304
+ });
305
+
306
+ test("undo after an intervening revision change returns conflict and leaves the memory unchanged", async (t) => {
307
+ const memoryDir = await makeMemoryDir(t);
308
+ const events: unknown[] = [];
309
+ const item = await writeQueueItem(memoryDir, "undo-conflict");
310
+ const ctx = makeCtx(memoryDir, events);
311
+ const kept = await executeReviewDeckAction(ctx, {
312
+ schemaVersion: 1,
313
+ itemId: "undo-conflict",
314
+ revision: item.revision,
315
+ action: "keep",
316
+ idempotencyKey: "undo-conflict",
317
+ });
318
+ const promoted = path.join(memoryDir, "facts", todayStamp(), "undo-conflict.md");
319
+ const edited = `${await readFile(promoted, "utf8")}\nEdited after keep.\n`;
320
+ await writeFile(promoted, edited, "utf8");
321
+
322
+ const undone = await executeReviewDeckUndo(ctx, {
323
+ schemaVersion: 1,
324
+ receiptId: kept.receiptId,
325
+ expectedRevision: kept.appliedRevision ?? "",
326
+ idempotencyKey: "undo-conflict-revert",
327
+ });
328
+
329
+ assert.equal(undone.outcome, "conflict");
330
+ assert.equal(await readFile(promoted, "utf8"), edited);
331
+ await assert.rejects(stat(item.filePath), /ENOENT/);
332
+ });
333
+
334
+ test("a corrupt receipt payload fails closed", async (t) => {
335
+ const memoryDir = await makeMemoryDir(t);
336
+ const events: unknown[] = [
337
+ {
338
+ eventId: "mle-corrupt",
339
+ memoryId: "ghost",
340
+ eventType: "promoted",
341
+ timestamp: "2026-05-17T00:00:00.000Z",
342
+ actor: "admin-console.review-deck",
343
+ ruleVersion: "admin-console.review-deck.v1",
344
+ reviewReceipt: {
345
+ schemaVersion: 1,
346
+ receiptId: "rcp1:corrupt",
347
+ requestFingerprint: "rfp1:x",
348
+ principalDigest: 12,
349
+ itemId: "ghost",
350
+ action: "approve",
351
+ beforeRevision: "rv1:a",
352
+ afterRevision: "rv1:b",
353
+ sourcePath: "review/ghost.md",
354
+ },
355
+ },
356
+ ];
357
+ const item = await writeQueueItem(memoryDir, "ghost");
358
+ const undone = await executeReviewDeckUndo(makeCtx(memoryDir, events), {
359
+ schemaVersion: 1,
360
+ receiptId: "rcp1:corrupt",
361
+ expectedRevision: "rv1:b",
362
+ idempotencyKey: "corrupt-undo",
363
+ });
364
+ assert.equal(undone.outcome, "failed");
365
+ assert.equal(undone.itemId, "");
366
+ assert.equal(await readFile(item.filePath, "utf8"), item.content);
367
+ assert.equal(parseReviewLifecycleReceipt(ledgerEvent(events[0]).reviewReceipt), null);
368
+ });
369
+
370
+ test("parseReviewLifecycleReceipt rejects invalid fields", () => {
371
+ assert.equal(parseReviewLifecycleReceipt(null), null);
372
+ assert.equal(parseReviewLifecycleReceipt("nope"), null);
373
+ assert.equal(
374
+ parseReviewLifecycleReceipt({
375
+ schemaVersion: 2,
376
+ receiptId: "rcp1:x",
377
+ requestFingerprint: "rfp1:x",
378
+ principalDigest: "p",
379
+ itemId: "i",
380
+ action: "approve",
381
+ beforeRevision: "a",
382
+ afterRevision: "b",
383
+ sourcePath: "review/x.md",
384
+ }),
385
+ null,
386
+ );
387
+ assert.equal(
388
+ parseReviewLifecycleReceipt({
389
+ schemaVersion: 1,
390
+ receiptId: "rcp1:x",
391
+ requestFingerprint: "rfp1:x",
392
+ principalDigest: "p",
393
+ itemId: "i",
394
+ action: "approve",
395
+ beforeRevision: "a",
396
+ afterRevision: "b",
397
+ sourcePath: "/abs/review/x.md",
398
+ }),
399
+ null,
400
+ );
401
+ const ok = parseReviewLifecycleReceipt({
402
+ schemaVersion: 1,
403
+ receiptId: "rcp1:x",
404
+ requestFingerprint: "rfp1:x",
405
+ principalDigest: "p",
406
+ itemId: "i",
407
+ action: "dismiss",
408
+ beforeRevision: "a",
409
+ afterRevision: "",
410
+ sourcePath: "review/x.md",
411
+ extra: "ignored",
412
+ });
413
+ assert.ok(ok);
414
+ assert.equal(ok?.action, "dismiss");
415
+ assert.equal(ok?.afterRevision, "");
416
+ });
417
+