@remnic/core 9.65.6 → 9.65.8

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 (623) hide show
  1. package/dist/access-admin-ops-surface.d.ts +15 -13
  2. package/dist/access-admin-ops-surface.js +54 -54
  3. package/dist/access-audit.js +2 -2
  4. package/dist/access-authorization-probe.d.ts +15 -13
  5. package/dist/access-authorization-probe.js +55 -55
  6. package/dist/access-boundary.d.ts +15 -13
  7. package/dist/access-boundary.js +54 -54
  8. package/dist/access-cli.js +156 -148
  9. package/dist/access-cli.js.map +1 -1
  10. package/dist/access-coding-context-resolution.d.ts +2 -1
  11. package/dist/access-extraction-force-flush.d.ts +15 -13
  12. package/dist/access-extraction-force-flush.js +54 -54
  13. package/dist/access-health-types.d.ts +2 -1
  14. package/dist/access-http-lcm-compaction.d.ts +15 -13
  15. package/dist/access-http-lifecycle-flush.d.ts +15 -13
  16. package/dist/access-http-offline-stream.d.ts +15 -13
  17. package/dist/access-http-query.d.ts +3 -2
  18. package/dist/access-http-query.js +56 -56
  19. package/dist/access-http.d.ts +17 -20
  20. package/dist/access-http.js +75 -73
  21. package/dist/access-identity-continuity-surface.d.ts +13 -11
  22. package/dist/access-identity-continuity-surface.js +54 -54
  23. package/dist/access-lcm-surface.d.ts +15 -13
  24. package/dist/access-lcm-surface.js +54 -54
  25. package/dist/access-mcp-output-schemas.js +1 -1
  26. package/dist/access-mcp.d.ts +15 -13
  27. package/dist/access-mcp.js +66 -64
  28. package/dist/access-memory-search-fanout.d.ts +3 -2
  29. package/dist/{access-namespace-preflight-D_6mo8ms.d.ts → access-namespace-preflight-CpAOrS-9.d.ts} +1 -1
  30. package/dist/access-namespace-preflight.d.ts +4 -3
  31. package/dist/access-namespace-preflight.js +54 -54
  32. package/dist/access-observe-write-surface.d.ts +15 -13
  33. package/dist/access-observe-write-surface.js +54 -54
  34. package/dist/access-offline-manifest.d.ts +13 -11
  35. package/dist/access-offline-manifest.js +6 -6
  36. package/dist/access-operations-batch.js +58 -58
  37. package/dist/access-operations.d.ts +21 -19
  38. package/dist/access-operations.js +63 -61
  39. package/dist/access-recall-concurrency.d.ts +15 -13
  40. package/dist/access-recall-concurrency.js +54 -54
  41. package/dist/access-recall-response.d.ts +15 -13
  42. package/dist/access-recall-response.js +54 -54
  43. package/dist/access-recall-surface.d.ts +15 -13
  44. package/dist/access-recall-surface.js +54 -54
  45. package/dist/access-schema.d.ts +83 -83
  46. package/dist/access-schema.js +3 -3
  47. package/dist/{access-service-sbiNS5UB.d.ts → access-service-Diu61Cfv.d.ts} +72 -72
  48. package/dist/access-service-helpers.d.ts +15 -13
  49. package/dist/access-service.d.ts +15 -13
  50. package/dist/access-service.js +54 -54
  51. package/dist/access-surface-catalog.d.ts +15 -13
  52. package/dist/access-surface-catalog.js +66 -56
  53. package/dist/access-surface-catalog.js.map +1 -1
  54. package/dist/access-wearables-meetings-surface.d.ts +6 -3
  55. package/dist/action-confidence.d.ts +2 -1
  56. package/dist/active-context-config.d.ts +27 -0
  57. package/dist/active-context-config.js +14 -0
  58. package/dist/active-context-transform.d.ts +267 -0
  59. package/dist/active-context-transform.js +31 -0
  60. package/dist/active-memory-bridge.d.ts +2 -1
  61. package/dist/active-recall.d.ts +2 -1
  62. package/dist/active-recall.js +13 -12
  63. package/dist/active-recall.js.map +1 -1
  64. package/dist/adapters/index.js +4 -4
  65. package/dist/adapters/registry.js +2 -2
  66. package/dist/ambient-provenance.d.ts +2 -1
  67. package/dist/artifact-search.d.ts +2 -1
  68. package/dist/{auto-sync-XVMLL2RH.js → auto-sync-2YPITIWN.js} +6 -6
  69. package/dist/behavior-learner.d.ts +2 -1
  70. package/dist/behavior-signals.d.ts +2 -1
  71. package/dist/bootstrap.d.ts +13 -11
  72. package/dist/briefing-window.d.ts +5 -2
  73. package/dist/briefing.d.ts +5 -2
  74. package/dist/briefing.js +25 -25
  75. package/dist/buffer-surprise-report.d.ts +2 -1
  76. package/dist/buffer-turn-helpers.d.ts +2 -1
  77. package/dist/buffer.d.ts +5 -2
  78. package/dist/buffer.js +6 -6
  79. package/dist/bulk-import/index.d.ts +4 -3
  80. package/dist/calibration.d.ts +2 -1
  81. package/dist/capabilities.d.ts +2 -1
  82. package/dist/{capsule-crypto-GWVG7LGC.js → capsule-crypto-7FJQINUR.js} +2 -2
  83. package/dist/{catalog-DO_7zfkv.d.ts → catalog-9f-vEQLS.d.ts} +1 -1
  84. package/dist/causal-behavior.d.ts +4 -3
  85. package/dist/causal-behavior.js +2 -2
  86. package/dist/causal-chain.js +2 -2
  87. package/dist/causal-consolidation.d.ts +2 -1
  88. package/dist/causal-consolidation.js +28 -28
  89. package/dist/causal-retrieval.js +2 -2
  90. package/dist/causal-trajectory-graph.d.ts +2 -1
  91. package/dist/causal-trajectory-graph.js +2 -2
  92. package/dist/causal-trajectory.js +1 -1
  93. package/dist/{chunk-OWHERGF2.js → chunk-2NLLXCJG.js} +2 -2
  94. package/dist/{chunk-NZPFCP5A.js → chunk-2PSX5BJU.js} +2 -2
  95. package/dist/{chunk-RKNJBZ55.js → chunk-2QSZNTDO.js} +4 -4
  96. package/dist/{chunk-X2DWBWOX.js → chunk-3A2NJP2U.js} +2 -2
  97. package/dist/chunk-3BCULS4U.js +1093 -0
  98. package/dist/chunk-3BCULS4U.js.map +1 -0
  99. package/dist/{chunk-JGG5HVI2.js → chunk-3PKAS6VL.js} +2 -2
  100. package/dist/{chunk-LSYD7GHZ.js → chunk-3SZD4CYO.js} +3 -3
  101. package/dist/chunk-43HUVDTD.js +114 -0
  102. package/dist/chunk-43HUVDTD.js.map +1 -0
  103. package/dist/{chunk-5TG4MU2U.js → chunk-4F4AQFWL.js} +8 -8
  104. package/dist/{chunk-D35XLYQ7.js → chunk-4QEYREAV.js} +12 -12
  105. package/dist/{chunk-46WM6JX2.js → chunk-4ZWCQJNM.js} +5 -5
  106. package/dist/{chunk-DVYRD4HY.js → chunk-5ACCD4L7.js} +30 -1
  107. package/dist/chunk-5ACCD4L7.js.map +1 -0
  108. package/dist/{chunk-W6J4POB6.js → chunk-5DHKCO52.js} +2 -2
  109. package/dist/{chunk-IRXMJLTW.js → chunk-5HK3CJAR.js} +2 -2
  110. package/dist/{chunk-NLUCDKLT.js → chunk-5RWZH6PH.js} +2 -2
  111. package/dist/{chunk-H7BZBSP6.js → chunk-645WOU5I.js} +4 -4
  112. package/dist/{chunk-AYAZWXJI.js → chunk-76DIF5KT.js} +2 -2
  113. package/dist/{chunk-OPPBTPUU.js → chunk-7KQB4EBS.js} +4 -4
  114. package/dist/{chunk-I2HTKOOP.js → chunk-7VZFRUQU.js} +3 -3
  115. package/dist/{chunk-DPNXADEI.js → chunk-7WOWGRAU.js} +11 -7
  116. package/dist/chunk-7WOWGRAU.js.map +1 -0
  117. package/dist/{chunk-JCWY73FK.js → chunk-AHPIFKNG.js} +2 -2
  118. package/dist/{chunk-FC7TIRFS.js → chunk-AX7UXCHJ.js} +6 -1
  119. package/dist/chunk-AX7UXCHJ.js.map +1 -0
  120. package/dist/{chunk-3I22VWB3.js → chunk-AZMLH5UT.js} +2 -2
  121. package/dist/chunk-B32WYRXX.js +77 -0
  122. package/dist/chunk-B32WYRXX.js.map +1 -0
  123. package/dist/{chunk-JOEJG4SD.js → chunk-BEC4YBNA.js} +4 -4
  124. package/dist/chunk-BWGCOLEL.js +61 -0
  125. package/dist/chunk-BWGCOLEL.js.map +1 -0
  126. package/dist/{chunk-BXXOPKT5.js → chunk-CAMNRAJF.js} +2 -2
  127. package/dist/{chunk-C24UZSFW.js → chunk-CEH2AFXG.js} +6 -6
  128. package/dist/{chunk-YOXVZJFM.js → chunk-CFVTRUR3.js} +2 -2
  129. package/dist/{chunk-SVSRPG6M.js → chunk-CPA5NBHN.js} +2 -2
  130. package/dist/{chunk-7BEPVIH3.js → chunk-CRML27CO.js} +3 -3
  131. package/dist/{chunk-AXGFOFNY.js → chunk-DA7ITC5Z.js} +2 -2
  132. package/dist/{chunk-5W7MKXMU.js → chunk-DEACDKE3.js} +144 -78
  133. package/dist/chunk-DEACDKE3.js.map +1 -0
  134. package/dist/{chunk-FEO2CDXR.js → chunk-DPCXDG7G.js} +2 -2
  135. package/dist/{chunk-HZNYJN77.js → chunk-F3NVYTTA.js} +2 -2
  136. package/dist/{chunk-7SSRXEZJ.js → chunk-F7XUD3PL.js} +2 -2
  137. package/dist/{chunk-LDBFXD4F.js → chunk-FP7YTTVO.js} +3 -1
  138. package/dist/chunk-FP7YTTVO.js.map +1 -0
  139. package/dist/{chunk-XZBXINXZ.js → chunk-GIC6BASP.js} +4 -4
  140. package/dist/{chunk-PP7R754B.js → chunk-GPFZFCRN.js} +1 -1
  141. package/dist/{chunk-53MZQEBD.js → chunk-GTO56JY5.js} +2 -2
  142. package/dist/{chunk-RAIUTAZZ.js → chunk-H2YSH3DG.js} +2 -2
  143. package/dist/{chunk-HWVNYNIV.js → chunk-HMZKGHMD.js} +2 -2
  144. package/dist/{chunk-ZXUZ54Z5.js → chunk-HRHO3ZNG.js} +2 -2
  145. package/dist/{chunk-SDEPLF7V.js → chunk-IBJ6U753.js} +2 -2
  146. package/dist/chunk-JCCWJHOP.js +240 -0
  147. package/dist/chunk-JCCWJHOP.js.map +1 -0
  148. package/dist/{chunk-T3JQTCCO.js → chunk-JI7U6AS3.js} +4 -4
  149. package/dist/{chunk-TR7DGXGI.js → chunk-JOZUBF4A.js} +5 -5
  150. package/dist/{chunk-YWBOOBDP.js → chunk-JYSN42VN.js} +71 -71
  151. package/dist/{chunk-ZPUIRTIZ.js → chunk-KOLJJN5G.js} +12 -75
  152. package/dist/chunk-KOLJJN5G.js.map +1 -0
  153. package/dist/{chunk-5W7CTZ2E.js → chunk-KQAFEZQX.js} +4 -4
  154. package/dist/{chunk-D2YNNDML.js → chunk-KWIGDKM2.js} +2 -2
  155. package/dist/{chunk-YUTTMSC7.js → chunk-KZIF6XHX.js} +93 -30
  156. package/dist/chunk-KZIF6XHX.js.map +1 -0
  157. package/dist/chunk-LB7WCZHY.js +553 -0
  158. package/dist/chunk-LB7WCZHY.js.map +1 -0
  159. package/dist/{chunk-RIAM7DND.js → chunk-LDKPDODJ.js} +2 -2
  160. package/dist/{chunk-227UFSEQ.js → chunk-LEPOP46W.js} +4 -4
  161. package/dist/{chunk-2JHRCWHT.js → chunk-LKYIOCWL.js} +107 -107
  162. package/dist/{chunk-XAWIL7TC.js → chunk-LOXHYCVS.js} +2 -2
  163. package/dist/{chunk-OMZLBT4B.js → chunk-LPNCR4QK.js} +48 -27
  164. package/dist/chunk-LPNCR4QK.js.map +1 -0
  165. package/dist/{chunk-OLBZ2WGG.js → chunk-LTBKKSCX.js} +2 -2
  166. package/dist/{chunk-O4BAGJDN.js → chunk-MDD2RINF.js} +2 -2
  167. package/dist/{chunk-H63EDPFJ.js → chunk-MI2OTWV5.js} +15 -2
  168. package/dist/{chunk-H63EDPFJ.js.map → chunk-MI2OTWV5.js.map} +1 -1
  169. package/dist/{chunk-LBFFNDFM.js → chunk-MINHJ55X.js} +1 -1
  170. package/dist/chunk-MINHJ55X.js.map +1 -0
  171. package/dist/{chunk-ROEAEANL.js → chunk-MY2BC6UE.js} +15 -15
  172. package/dist/{chunk-RACZB5HT.js → chunk-N37X5RU7.js} +4 -4
  173. package/dist/{chunk-AG46P24C.js → chunk-NNBZS3DY.js} +4 -4
  174. package/dist/{chunk-PGW64IFQ.js → chunk-NPFUNWNX.js} +2 -2
  175. package/dist/{chunk-MFOSZUIT.js → chunk-NPIBN2VL.js} +2 -2
  176. package/dist/{chunk-IF4EY26E.js → chunk-OA2O2GJ4.js} +3 -3
  177. package/dist/{chunk-6FUMA6AA.js → chunk-ODU2CNNX.js} +2 -2
  178. package/dist/{chunk-PNAGNVGK.js → chunk-OXRRJXPR.js} +42 -37
  179. package/dist/chunk-OXRRJXPR.js.map +1 -0
  180. package/dist/{chunk-TWBQQ3FT.js → chunk-P36Z4JRA.js} +2 -2
  181. package/dist/{chunk-OUKBMQ2O.js → chunk-PD66CVSD.js} +2 -2
  182. package/dist/{chunk-MVIYRRVJ.js → chunk-PMVPCZJZ.js} +5 -5
  183. package/dist/{chunk-US4IRASK.js → chunk-PU56CXZA.js} +6 -6
  184. package/dist/{chunk-IDQ6DKXC.js → chunk-S5XOSTYM.js} +3 -3
  185. package/dist/{chunk-DYO24BNB.js → chunk-SEEJOGQX.js} +5 -5
  186. package/dist/{chunk-7OZSHBWK.js → chunk-SNOIKAHM.js} +2 -2
  187. package/dist/{chunk-SR7JIRAR.js → chunk-T6ILXUAH.js} +2 -2
  188. package/dist/{chunk-2RXUZVPU.js → chunk-T7XP6IZE.js} +2 -2
  189. package/dist/{chunk-KBOG7FJV.js → chunk-TFR3HG4K.js} +3 -3
  190. package/dist/{chunk-XUZ5CIEE.js → chunk-TUHBYJXL.js} +1 -1
  191. package/dist/{chunk-7K5Q6COX.js → chunk-TVVEYCNW.js} +4 -4
  192. package/dist/{chunk-ZK4BFABK.js → chunk-U7EW2W4W.js} +13 -13
  193. package/dist/{chunk-4K7IW3F7.js → chunk-UD7UNYRD.js} +34 -3
  194. package/dist/chunk-UD7UNYRD.js.map +1 -0
  195. package/dist/{chunk-VFYRYFLL.js → chunk-UEBDCMOO.js} +2 -2
  196. package/dist/{chunk-JFWZRUKP.js → chunk-UENKPWCS.js} +4 -4
  197. package/dist/{chunk-AAXJNINV.js → chunk-UL4MKZHI.js} +2 -2
  198. package/dist/chunk-ULM7JCDH.js +154 -0
  199. package/dist/chunk-ULM7JCDH.js.map +1 -0
  200. package/dist/{chunk-R2MZCYA6.js → chunk-UNUMFURP.js} +3 -3
  201. package/dist/{chunk-5GIZM4RX.js → chunk-UPFNQJC7.js} +2 -2
  202. package/dist/{chunk-W4BMEGQA.js → chunk-UTQUEHC7.js} +2 -2
  203. package/dist/{chunk-I32NKXE2.js → chunk-V4IDF3EZ.js} +2 -2
  204. package/dist/{chunk-6LS5OX3U.js → chunk-W2BAGGEW.js} +50 -18
  205. package/dist/chunk-W2BAGGEW.js.map +1 -0
  206. package/dist/chunk-W2UOAATB.js +521 -0
  207. package/dist/chunk-W2UOAATB.js.map +1 -0
  208. package/dist/{chunk-QMZY3GG6.js → chunk-WNXYT4MK.js} +3 -3
  209. package/dist/{chunk-UVYI6VIX.js → chunk-X7Y7WX73.js} +1 -1
  210. package/dist/{chunk-T42L3S6A.js → chunk-XBGHAAKR.js} +2 -2
  211. package/dist/{chunk-RQ2EQRRR.js → chunk-XNWXSGHS.js} +80 -7
  212. package/dist/chunk-XNWXSGHS.js.map +1 -0
  213. package/dist/{chunk-THG4GYIE.js → chunk-YEUXERJ6.js} +5 -5
  214. package/dist/{chunk-BIJAWZYW.js → chunk-YMOPYG3K.js} +6 -6
  215. package/dist/{chunk-M4AHBM72.js → chunk-Z3YEGSR4.js} +2 -2
  216. package/dist/{cli-Bfgo0n1L.d.ts → cli-O3F-ht3i.d.ts} +5 -5
  217. package/dist/cli.d.ts +17 -15
  218. package/dist/cli.js +106 -104
  219. package/dist/coding/pre-action-gate.d.ts +2 -1
  220. package/dist/coding/pre-action-gate.js +2 -2
  221. package/dist/compounding/engine.d.ts +5 -2
  222. package/dist/compounding/engine.js +26 -26
  223. package/dist/compounding/preference-consolidator.d.ts +4 -3
  224. package/dist/compression-optimizer.d.ts +2 -1
  225. package/dist/config-security.js +2 -2
  226. package/dist/config.d.ts +2 -1
  227. package/dist/config.js +13 -12
  228. package/dist/connectors/codex-materialize-runner.d.ts +2 -1
  229. package/dist/connectors/codex-materialize-runner.js +25 -25
  230. package/dist/connectors/codex-materialize.d.ts +2 -1
  231. package/dist/connectors/index.d.ts +2 -1
  232. package/dist/connectors/index.js +25 -25
  233. package/dist/consolidation-provenance-check.d.ts +5 -2
  234. package/dist/consolidation-provenance-check.js +2 -2
  235. package/dist/consolidation-undo.d.ts +5 -2
  236. package/dist/context-summary.d.ts +43 -0
  237. package/dist/context-summary.js +14 -0
  238. package/dist/context-summary.js.map +1 -0
  239. package/dist/contradiction/index.d.ts +6 -3
  240. package/dist/contradiction/index.js +5 -5
  241. package/dist/converge-config.d.ts +2 -1
  242. package/dist/convergence-refresh.d.ts +5 -2
  243. package/dist/convergence-refresh.js +28 -28
  244. package/dist/conversation-index/backend.d.ts +2 -1
  245. package/dist/conversation-index/backend.js +2 -2
  246. package/dist/conversation-index/chunker.d.ts +2 -1
  247. package/dist/conversation-index/faiss-adapter.d.ts +2 -1
  248. package/dist/conversation-index/indexer.d.ts +2 -1
  249. package/dist/conversation-index/search.d.ts +2 -1
  250. package/dist/corpus-watermark.d.ts +2 -1
  251. package/dist/corpus-watermark.js +27 -27
  252. package/dist/cross-lingual-recall.d.ts +2 -1
  253. package/dist/day-summary.d.ts +2 -1
  254. package/dist/delinearize.d.ts +2 -1
  255. package/dist/dependency-propagation-config.d.ts +2 -1
  256. package/dist/{dependency-propagation-delivery-D23_x-s5.d.ts → dependency-propagation-delivery-CL6RWXTA.d.ts} +1 -1
  257. package/dist/direct-answer-wiring.d.ts +2 -1
  258. package/dist/direct-answer.d.ts +2 -1
  259. package/dist/embedding-fallback.d.ts +2 -1
  260. package/dist/enrichment/index.d.ts +2 -1
  261. package/dist/entity-origin-fields.d.ts +2 -1
  262. package/dist/entity-retrieval.d.ts +5 -2
  263. package/dist/entity-retrieval.js +26 -26
  264. package/dist/entity-schema.d.ts +2 -1
  265. package/dist/episodic-context.d.ts +2 -1
  266. package/dist/eval-trajectory-contracts.d.ts +257 -0
  267. package/dist/eval-trajectory-contracts.js +56 -0
  268. package/dist/eval-trajectory-contracts.js.map +1 -0
  269. package/dist/eval-trajectory-store.d.ts +40 -0
  270. package/dist/eval-trajectory-store.js +19 -0
  271. package/dist/eval-trajectory-store.js.map +1 -0
  272. package/dist/eval-trajectory.d.ts +68 -0
  273. package/dist/eval-trajectory.js +46 -0
  274. package/dist/eval-trajectory.js.map +1 -0
  275. package/dist/event-order-recall.js +2 -2
  276. package/dist/explicit-capture.d.ts +13 -11
  277. package/dist/explicit-capture.js +6 -6
  278. package/dist/external-wiki-access.d.ts +15 -13
  279. package/dist/external-wiki-access.js +55 -55
  280. package/dist/external-wiki-collection-registration.d.ts +2 -1
  281. package/dist/external-wiki-collection.d.ts +2 -1
  282. package/dist/external-wiki-mcp-tools.d.ts +15 -13
  283. package/dist/extraction-error-classification.d.ts +2 -1
  284. package/dist/extraction-faithfulness.d.ts +2 -1
  285. package/dist/extraction-judge-telemetry.d.ts +2 -1
  286. package/dist/extraction-judge-training.d.ts +2 -1
  287. package/dist/extraction-judge.d.ts +2 -1
  288. package/dist/extraction-liveness.d.ts +2 -1
  289. package/dist/extraction-normalization.d.ts +2 -1
  290. package/dist/extraction-prompt.d.ts +2 -1
  291. package/dist/extraction-source-grounding-rules.d.ts +2 -1
  292. package/dist/extraction-source-grounding.d.ts +2 -1
  293. package/dist/extraction.d.ts +2 -1
  294. package/dist/extraction.js +33 -33
  295. package/dist/fallback-llm.d.ts +2 -1
  296. package/dist/{forget-SZ2BXDGF.js → forget-2AE4MDK3.js} +3 -3
  297. package/dist/graph-dashboard-diff.d.ts +2 -1
  298. package/dist/graph-dashboard-key.d.ts +2 -1
  299. package/dist/graph-dashboard-parser.d.ts +2 -1
  300. package/dist/{graph-edge-decay-FXGELBFA.js → graph-edge-decay-A4SDFMMS.js} +4 -4
  301. package/dist/graph-edge-decay-A4SDFMMS.js.map +1 -0
  302. package/dist/graph-edge-reinforcement.d.ts +2 -1
  303. package/dist/graph-path-reconstruction.d.ts +2 -1
  304. package/dist/graph-path-scoring.d.ts +2 -1
  305. package/dist/graph-snapshot.d.ts +2 -1
  306. package/dist/graph-snapshot.js +3 -3
  307. package/dist/graph.d.ts +2 -1
  308. package/dist/graph.js +3 -3
  309. package/dist/harmonic-retrieval.js +1 -1
  310. package/dist/importance.d.ts +2 -1
  311. package/dist/importers/index.d.ts +2 -1
  312. package/dist/in-flight-reads.d.ts +2 -1
  313. package/dist/{index--QhGIXF2.d.ts → index-C7Xep6S9.d.ts} +2 -2
  314. package/dist/index.d.ts +706 -701
  315. package/dist/index.js +271 -200
  316. package/dist/intent.d.ts +2 -1
  317. package/dist/lcm/engine.d.ts +3 -2
  318. package/dist/lcm/engine.js +3 -2
  319. package/dist/lcm/index.d.ts +4 -2
  320. package/dist/lcm/index.js +6 -5
  321. package/dist/lcm/summarizer.d.ts +4 -6
  322. package/dist/lcm/summarizer.js +2 -1
  323. package/dist/lcm/tools.d.ts +4 -3
  324. package/dist/lifecycle.d.ts +2 -1
  325. package/dist/live-connectors-runner.d.ts +2 -1
  326. package/dist/local-llm.d.ts +2 -1
  327. package/dist/local-model-endpoint.d.ts +2 -1
  328. package/dist/location/index.d.ts +128 -1
  329. package/dist/location/index.js +60 -750
  330. package/dist/location/index.js.map +1 -1
  331. package/dist/maintenance/memory-governance.d.ts +2 -1
  332. package/dist/maintenance/memory-governance.js +26 -26
  333. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +5 -2
  334. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +25 -25
  335. package/dist/maintenance/rebuild-memory-projection.d.ts +5 -2
  336. package/dist/maintenance/rebuild-memory-projection.js +27 -27
  337. package/dist/{maintenance-PFvY1Pw_.d.ts → maintenance-CJ-xqFp0.d.ts} +4 -3
  338. package/dist/mcp-memory-inspector-app.d.ts +15 -13
  339. package/dist/mcp-read-only-tools.js +1 -1
  340. package/dist/memory-action-policy.d.ts +18 -2
  341. package/dist/memory-action-policy.js +3 -1
  342. package/dist/memory-cache.d.ts +2 -1
  343. package/dist/memory-controller.d.ts +2 -1
  344. package/dist/memory-controller.js +2 -2
  345. package/dist/memory-lifecycle-ledger-utils.d.ts +2 -1
  346. package/dist/memory-projection-store.d.ts +2 -1
  347. package/dist/memory-provenance.d.ts +2 -1
  348. package/dist/memory-snapshot.d.ts +2 -1
  349. package/dist/memory-subject-cli.d.ts +15 -13
  350. package/dist/memory-subject.d.ts +15 -13
  351. package/dist/memory-subject.js +3 -3
  352. package/dist/memory-worth-outcomes.d.ts +50 -3
  353. package/dist/memory-worth-outcomes.js +5 -3
  354. package/dist/models-json.d.ts +2 -1
  355. package/dist/namespaces/migrate.d.ts +6 -3
  356. package/dist/namespaces/migrate.js +26 -26
  357. package/dist/namespaces/principal.d.ts +2 -1
  358. package/dist/namespaces/search.d.ts +2 -1
  359. package/dist/namespaces/search.js +11 -11
  360. package/dist/namespaces/storage.d.ts +6 -3
  361. package/dist/namespaces/storage.js +25 -25
  362. package/dist/native-knowledge.d.ts +2 -1
  363. package/dist/offline-sync-impression-drain.d.ts +2 -1
  364. package/dist/offline-sync-impression-drain.js +2 -2
  365. package/dist/operator-doctor-corpus.d.ts +2 -1
  366. package/dist/operator-doctor-corpus.js +28 -28
  367. package/dist/operator-doctor-replica.d.ts +2 -1
  368. package/dist/operator-toolkit.d.ts +6 -3
  369. package/dist/operator-toolkit.js +45 -44
  370. package/dist/orchestration/compression-guideline-coordinator.d.ts +5 -2
  371. package/dist/orchestration/maintenance.d.ts +7 -4
  372. package/dist/orchestration/maintenance.js +34 -32
  373. package/dist/{orchestrator-4wzJrPVm.d.ts → orchestrator-BsntWxLy.d.ts} +8 -8
  374. package/dist/orchestrator.d.ts +13 -11
  375. package/dist/orchestrator.js +156 -148
  376. package/dist/patterns-cli.d.ts +2 -1
  377. package/dist/{pipeline-CgXgdIrF.d.ts → pipeline-CVoysPm2.d.ts} +1 -1
  378. package/dist/policy-runtime.d.ts +2 -1
  379. package/dist/proactive-contention.d.ts +2 -1
  380. package/dist/provenance.d.ts +2 -1
  381. package/dist/{public-http-BP3VQDl5.d.ts → public-http-CuOxlTC2.d.ts} +1 -1
  382. package/dist/{qmd-BppGGxsi.d.ts → qmd-DWMAGA5l.d.ts} +1 -1
  383. package/dist/qmd-preflight.d.ts +3 -2
  384. package/dist/qmd-recall-cache.d.ts +2 -1
  385. package/dist/qmd.d.ts +3 -2
  386. package/dist/qmd.js +4 -4
  387. package/dist/recall-concurrency-config.d.ts +2 -1
  388. package/dist/recall-disclosure-escalation.d.ts +2 -1
  389. package/dist/recall-explain-renderer.d.ts +2 -1
  390. package/dist/recall-explain-renderer.js +3 -3
  391. package/dist/recall-memory-map.d.ts +2 -1
  392. package/dist/recall-planner-llm.d.ts +2 -1
  393. package/dist/recall-state.d.ts +2 -1
  394. package/dist/recall-tag-filter.d.ts +2 -1
  395. package/dist/recall-timings.d.ts +2 -1
  396. package/dist/recall-xray-cli.d.ts +2 -1
  397. package/dist/recall-xray-cli.js +4 -4
  398. package/dist/recall-xray-renderer.d.ts +2 -1
  399. package/dist/recall-xray-renderer.js +3 -3
  400. package/dist/recall-xray.d.ts +2 -1
  401. package/dist/recall-xray.js +2 -2
  402. package/dist/reconcile/cursor.d.ts +2 -1
  403. package/dist/reconcile/manifest.d.ts +2 -1
  404. package/dist/reconcile/manifest.js +3 -3
  405. package/dist/reconcile/plan.d.ts +2 -1
  406. package/dist/replay/normalizers/chatgpt.d.ts +2 -1
  407. package/dist/replay/normalizers/claude.d.ts +2 -1
  408. package/dist/replay/normalizers/openclaw.d.ts +2 -1
  409. package/dist/replay/normalizers/shared.d.ts +2 -1
  410. package/dist/replay/runner.d.ts +2 -1
  411. package/dist/replay/types.d.ts +2 -1
  412. package/dist/replica-divergence.d.ts +2 -1
  413. package/dist/replica-peers-config.d.ts +2 -1
  414. package/dist/{resolution-4552BNRV.js → resolution-XWBPKYFB.js} +6 -6
  415. package/dist/resolution-XWBPKYFB.js.map +1 -0
  416. package/dist/resolve-auth-token.d.ts +2 -1
  417. package/dist/resume-bundles.js +14 -13
  418. package/dist/retrieval-agents.d.ts +3 -2
  419. package/dist/retrieval-tiers.d.ts +2 -1
  420. package/dist/routing/engine.d.ts +2 -1
  421. package/dist/routing/store.d.ts +2 -1
  422. package/dist/salvage-envelope.d.ts +2 -1
  423. package/dist/salvage-envelope.js +5 -5
  424. package/dist/schemas.d.ts +124 -124
  425. package/dist/{scope-profiles-ChZUtxDU.d.ts → scope-profiles-CPWkW_dI.d.ts} +1 -1
  426. package/dist/search/embed-helper.d.ts +2 -1
  427. package/dist/search/factory.d.ts +2 -1
  428. package/dist/search/factory.js +10 -10
  429. package/dist/search/index.d.ts +2 -1
  430. package/dist/search/index.js +15 -15
  431. package/dist/search/lancedb-backend.d.ts +2 -1
  432. package/dist/search/lancedb-backend.js +2 -2
  433. package/dist/search/meilisearch-backend.d.ts +2 -1
  434. package/dist/search/meilisearch-backend.js +2 -2
  435. package/dist/search/noop-backend.d.ts +2 -1
  436. package/dist/search/orama-backend.d.ts +2 -1
  437. package/dist/search/orama-backend.js +2 -2
  438. package/dist/search/port.d.ts +2 -1
  439. package/dist/search/remote-backend.d.ts +2 -1
  440. package/dist/{semantic-consolidation-mSPwQSmF.d.ts → semantic-consolidation-CNFVBXFc.d.ts} +1 -1
  441. package/dist/semantic-consolidation.d.ts +3 -2
  442. package/dist/semantic-consolidation.js +31 -31
  443. package/dist/semantic-rule-promotion.js +25 -25
  444. package/dist/semantic-rule-verifier.d.ts +2 -1
  445. package/dist/semantic-rule-verifier.js +25 -25
  446. package/dist/{service-BICWLwSP.d.ts → service-Bb-JIdQ0.d.ts} +2 -2
  447. package/dist/session-observer-bands.d.ts +2 -1
  448. package/dist/session-observer-state.d.ts +2 -1
  449. package/dist/shared-context/manager.d.ts +8 -7
  450. package/dist/signal.d.ts +2 -1
  451. package/dist/source-agent-qualifier.d.ts +2 -1
  452. package/dist/source-agent-qualifier.js +29 -29
  453. package/dist/{storage-B7urx1K3.d.ts → storage-CukrlNKk.d.ts} +4 -1
  454. package/dist/storage.d.ts +5 -2
  455. package/dist/storage.js +24 -24
  456. package/dist/subject-config.d.ts +2 -1
  457. package/dist/subject-config.js +4 -4
  458. package/dist/summarizer.d.ts +2 -1
  459. package/dist/summary-snapshot.d.ts +2 -1
  460. package/dist/support-passport/index.d.ts +18 -16
  461. package/dist/support-passport/index.js +57 -57
  462. package/dist/temporal-supersession.d.ts +3 -2
  463. package/dist/temporal-timeline-recall.d.ts +2 -1
  464. package/dist/temporal-validity.d.ts +2 -1
  465. package/dist/threading.d.ts +2 -1
  466. package/dist/tier-migration.d.ts +5 -2
  467. package/dist/tier-routing.d.ts +2 -1
  468. package/dist/topics.d.ts +2 -1
  469. package/dist/transcript.d.ts +2 -1
  470. package/dist/transfer/backup.js +2 -2
  471. package/dist/transfer/capsule-export.js +2 -2
  472. package/dist/transfer/capsule-import.js +2 -2
  473. package/dist/transfer/types.d.ts +78 -78
  474. package/dist/trust-score-stage.d.ts +2 -1
  475. package/dist/trust-score.d.ts +2 -1
  476. package/dist/{types-ETU5N6nB.d.ts → types-djxQlxJ7.d.ts} +3 -2
  477. package/dist/types.d.ts +2 -1
  478. package/dist/types.js +1 -1
  479. package/dist/utility-runtime.d.ts +2 -1
  480. package/dist/verified-recall.js +25 -25
  481. package/dist/who-knows-cli.d.ts +15 -13
  482. package/dist/who-knows-cli.js +26 -26
  483. package/dist/who-knows.d.ts +15 -13
  484. package/dist/who-knows.js +25 -25
  485. package/dist/write-envelope.d.ts +2 -1
  486. package/dist/write-envelope.js +4 -4
  487. package/package.json +22 -2
  488. package/src/access-boundary.ts +5 -0
  489. package/src/access-http.ts +15 -16
  490. package/src/access-mcp-output-schemas.ts +5 -0
  491. package/src/access-mcp.ts +6 -6
  492. package/src/access-operations.ts +2 -0
  493. package/src/access-surface-catalog.ts +10 -0
  494. package/src/active-context-config.ts +98 -0
  495. package/src/active-context-transform.test.ts +533 -0
  496. package/src/active-context-transform.ts +981 -0
  497. package/src/config.ts +3 -5
  498. package/src/context-summary.ts +182 -0
  499. package/src/eval-trajectory-contracts.ts +411 -0
  500. package/src/eval-trajectory-store.ts +306 -0
  501. package/src/eval-trajectory.test.ts +534 -0
  502. package/src/eval-trajectory.ts +773 -0
  503. package/src/index.ts +6 -11
  504. package/src/lcm/summarizer.ts +14 -93
  505. package/src/location/access-operations.ts +84 -0
  506. package/src/location/http-glue.test.ts +100 -0
  507. package/src/location/http-glue.ts +85 -0
  508. package/src/location/index.ts +3 -0
  509. package/src/location/mcp-tools.ts +82 -0
  510. package/src/location/provider-setup.test.ts +106 -0
  511. package/src/location/provider-setup.ts +103 -0
  512. package/src/location/scheduler.test.ts +113 -0
  513. package/src/location/scheduler.ts +98 -0
  514. package/src/location/surfaces.test.ts +241 -0
  515. package/src/location/surfaces.ts +329 -0
  516. package/src/maintenance/day-summary-cron.ts +45 -0
  517. package/src/mcp-read-only-tools.ts +2 -0
  518. package/src/memory-action-policy.ts +28 -0
  519. package/src/memory-worth-outcomes.test.ts +53 -18
  520. package/src/memory-worth-outcomes.ts +91 -9
  521. package/src/orchestration/maintenance.ts +22 -30
  522. package/src/storage/context-transform-ledger.ts +39 -0
  523. package/src/storage/secure-line-reader.ts +50 -1
  524. package/src/storage.ts +4 -1
  525. package/src/types.ts +2 -3
  526. package/src/wearables/http-glue.ts +28 -0
  527. package/dist/chunk-4K7IW3F7.js.map +0 -1
  528. package/dist/chunk-5W7MKXMU.js.map +0 -1
  529. package/dist/chunk-6LS5OX3U.js.map +0 -1
  530. package/dist/chunk-DPNXADEI.js.map +0 -1
  531. package/dist/chunk-DVYRD4HY.js.map +0 -1
  532. package/dist/chunk-FC7TIRFS.js.map +0 -1
  533. package/dist/chunk-LBFFNDFM.js.map +0 -1
  534. package/dist/chunk-LDBFXD4F.js.map +0 -1
  535. package/dist/chunk-OMZLBT4B.js.map +0 -1
  536. package/dist/chunk-PNAGNVGK.js.map +0 -1
  537. package/dist/chunk-RQ2EQRRR.js.map +0 -1
  538. package/dist/chunk-YUTTMSC7.js.map +0 -1
  539. package/dist/chunk-ZPUIRTIZ.js.map +0 -1
  540. /package/dist/{capsule-crypto-GWVG7LGC.js.map → active-context-config.js.map} +0 -0
  541. /package/dist/{graph-edge-decay-FXGELBFA.js.map → active-context-transform.js.map} +0 -0
  542. /package/dist/{auto-sync-XVMLL2RH.js.map → auto-sync-2YPITIWN.js.map} +0 -0
  543. /package/dist/{resolution-4552BNRV.js.map → capsule-crypto-7FJQINUR.js.map} +0 -0
  544. /package/dist/{chunk-OWHERGF2.js.map → chunk-2NLLXCJG.js.map} +0 -0
  545. /package/dist/{chunk-NZPFCP5A.js.map → chunk-2PSX5BJU.js.map} +0 -0
  546. /package/dist/{chunk-RKNJBZ55.js.map → chunk-2QSZNTDO.js.map} +0 -0
  547. /package/dist/{chunk-X2DWBWOX.js.map → chunk-3A2NJP2U.js.map} +0 -0
  548. /package/dist/{chunk-JGG5HVI2.js.map → chunk-3PKAS6VL.js.map} +0 -0
  549. /package/dist/{chunk-LSYD7GHZ.js.map → chunk-3SZD4CYO.js.map} +0 -0
  550. /package/dist/{chunk-5TG4MU2U.js.map → chunk-4F4AQFWL.js.map} +0 -0
  551. /package/dist/{chunk-D35XLYQ7.js.map → chunk-4QEYREAV.js.map} +0 -0
  552. /package/dist/{chunk-46WM6JX2.js.map → chunk-4ZWCQJNM.js.map} +0 -0
  553. /package/dist/{chunk-W6J4POB6.js.map → chunk-5DHKCO52.js.map} +0 -0
  554. /package/dist/{chunk-IRXMJLTW.js.map → chunk-5HK3CJAR.js.map} +0 -0
  555. /package/dist/{chunk-NLUCDKLT.js.map → chunk-5RWZH6PH.js.map} +0 -0
  556. /package/dist/{chunk-H7BZBSP6.js.map → chunk-645WOU5I.js.map} +0 -0
  557. /package/dist/{chunk-AYAZWXJI.js.map → chunk-76DIF5KT.js.map} +0 -0
  558. /package/dist/{chunk-OPPBTPUU.js.map → chunk-7KQB4EBS.js.map} +0 -0
  559. /package/dist/{chunk-I2HTKOOP.js.map → chunk-7VZFRUQU.js.map} +0 -0
  560. /package/dist/{chunk-JCWY73FK.js.map → chunk-AHPIFKNG.js.map} +0 -0
  561. /package/dist/{chunk-3I22VWB3.js.map → chunk-AZMLH5UT.js.map} +0 -0
  562. /package/dist/{chunk-JOEJG4SD.js.map → chunk-BEC4YBNA.js.map} +0 -0
  563. /package/dist/{chunk-BXXOPKT5.js.map → chunk-CAMNRAJF.js.map} +0 -0
  564. /package/dist/{chunk-C24UZSFW.js.map → chunk-CEH2AFXG.js.map} +0 -0
  565. /package/dist/{chunk-YOXVZJFM.js.map → chunk-CFVTRUR3.js.map} +0 -0
  566. /package/dist/{chunk-SVSRPG6M.js.map → chunk-CPA5NBHN.js.map} +0 -0
  567. /package/dist/{chunk-7BEPVIH3.js.map → chunk-CRML27CO.js.map} +0 -0
  568. /package/dist/{chunk-AXGFOFNY.js.map → chunk-DA7ITC5Z.js.map} +0 -0
  569. /package/dist/{chunk-FEO2CDXR.js.map → chunk-DPCXDG7G.js.map} +0 -0
  570. /package/dist/{chunk-HZNYJN77.js.map → chunk-F3NVYTTA.js.map} +0 -0
  571. /package/dist/{chunk-7SSRXEZJ.js.map → chunk-F7XUD3PL.js.map} +0 -0
  572. /package/dist/{chunk-XZBXINXZ.js.map → chunk-GIC6BASP.js.map} +0 -0
  573. /package/dist/{chunk-PP7R754B.js.map → chunk-GPFZFCRN.js.map} +0 -0
  574. /package/dist/{chunk-53MZQEBD.js.map → chunk-GTO56JY5.js.map} +0 -0
  575. /package/dist/{chunk-RAIUTAZZ.js.map → chunk-H2YSH3DG.js.map} +0 -0
  576. /package/dist/{chunk-HWVNYNIV.js.map → chunk-HMZKGHMD.js.map} +0 -0
  577. /package/dist/{chunk-ZXUZ54Z5.js.map → chunk-HRHO3ZNG.js.map} +0 -0
  578. /package/dist/{chunk-SDEPLF7V.js.map → chunk-IBJ6U753.js.map} +0 -0
  579. /package/dist/{chunk-T3JQTCCO.js.map → chunk-JI7U6AS3.js.map} +0 -0
  580. /package/dist/{chunk-TR7DGXGI.js.map → chunk-JOZUBF4A.js.map} +0 -0
  581. /package/dist/{chunk-YWBOOBDP.js.map → chunk-JYSN42VN.js.map} +0 -0
  582. /package/dist/{chunk-5W7CTZ2E.js.map → chunk-KQAFEZQX.js.map} +0 -0
  583. /package/dist/{chunk-D2YNNDML.js.map → chunk-KWIGDKM2.js.map} +0 -0
  584. /package/dist/{chunk-RIAM7DND.js.map → chunk-LDKPDODJ.js.map} +0 -0
  585. /package/dist/{chunk-227UFSEQ.js.map → chunk-LEPOP46W.js.map} +0 -0
  586. /package/dist/{chunk-2JHRCWHT.js.map → chunk-LKYIOCWL.js.map} +0 -0
  587. /package/dist/{chunk-XAWIL7TC.js.map → chunk-LOXHYCVS.js.map} +0 -0
  588. /package/dist/{chunk-OLBZ2WGG.js.map → chunk-LTBKKSCX.js.map} +0 -0
  589. /package/dist/{chunk-O4BAGJDN.js.map → chunk-MDD2RINF.js.map} +0 -0
  590. /package/dist/{chunk-ROEAEANL.js.map → chunk-MY2BC6UE.js.map} +0 -0
  591. /package/dist/{chunk-RACZB5HT.js.map → chunk-N37X5RU7.js.map} +0 -0
  592. /package/dist/{chunk-AG46P24C.js.map → chunk-NNBZS3DY.js.map} +0 -0
  593. /package/dist/{chunk-PGW64IFQ.js.map → chunk-NPFUNWNX.js.map} +0 -0
  594. /package/dist/{chunk-MFOSZUIT.js.map → chunk-NPIBN2VL.js.map} +0 -0
  595. /package/dist/{chunk-IF4EY26E.js.map → chunk-OA2O2GJ4.js.map} +0 -0
  596. /package/dist/{chunk-6FUMA6AA.js.map → chunk-ODU2CNNX.js.map} +0 -0
  597. /package/dist/{chunk-TWBQQ3FT.js.map → chunk-P36Z4JRA.js.map} +0 -0
  598. /package/dist/{chunk-OUKBMQ2O.js.map → chunk-PD66CVSD.js.map} +0 -0
  599. /package/dist/{chunk-MVIYRRVJ.js.map → chunk-PMVPCZJZ.js.map} +0 -0
  600. /package/dist/{chunk-US4IRASK.js.map → chunk-PU56CXZA.js.map} +0 -0
  601. /package/dist/{chunk-IDQ6DKXC.js.map → chunk-S5XOSTYM.js.map} +0 -0
  602. /package/dist/{chunk-DYO24BNB.js.map → chunk-SEEJOGQX.js.map} +0 -0
  603. /package/dist/{chunk-7OZSHBWK.js.map → chunk-SNOIKAHM.js.map} +0 -0
  604. /package/dist/{chunk-SR7JIRAR.js.map → chunk-T6ILXUAH.js.map} +0 -0
  605. /package/dist/{chunk-2RXUZVPU.js.map → chunk-T7XP6IZE.js.map} +0 -0
  606. /package/dist/{chunk-KBOG7FJV.js.map → chunk-TFR3HG4K.js.map} +0 -0
  607. /package/dist/{chunk-XUZ5CIEE.js.map → chunk-TUHBYJXL.js.map} +0 -0
  608. /package/dist/{chunk-7K5Q6COX.js.map → chunk-TVVEYCNW.js.map} +0 -0
  609. /package/dist/{chunk-ZK4BFABK.js.map → chunk-U7EW2W4W.js.map} +0 -0
  610. /package/dist/{chunk-VFYRYFLL.js.map → chunk-UEBDCMOO.js.map} +0 -0
  611. /package/dist/{chunk-JFWZRUKP.js.map → chunk-UENKPWCS.js.map} +0 -0
  612. /package/dist/{chunk-AAXJNINV.js.map → chunk-UL4MKZHI.js.map} +0 -0
  613. /package/dist/{chunk-R2MZCYA6.js.map → chunk-UNUMFURP.js.map} +0 -0
  614. /package/dist/{chunk-5GIZM4RX.js.map → chunk-UPFNQJC7.js.map} +0 -0
  615. /package/dist/{chunk-W4BMEGQA.js.map → chunk-UTQUEHC7.js.map} +0 -0
  616. /package/dist/{chunk-I32NKXE2.js.map → chunk-V4IDF3EZ.js.map} +0 -0
  617. /package/dist/{chunk-QMZY3GG6.js.map → chunk-WNXYT4MK.js.map} +0 -0
  618. /package/dist/{chunk-UVYI6VIX.js.map → chunk-X7Y7WX73.js.map} +0 -0
  619. /package/dist/{chunk-T42L3S6A.js.map → chunk-XBGHAAKR.js.map} +0 -0
  620. /package/dist/{chunk-THG4GYIE.js.map → chunk-YEUXERJ6.js.map} +0 -0
  621. /package/dist/{chunk-BIJAWZYW.js.map → chunk-YMOPYG3K.js.map} +0 -0
  622. /package/dist/{chunk-M4AHBM72.js.map → chunk-Z3YEGSR4.js.map} +0 -0
  623. /package/dist/{forget-SZ2BXDGF.js.map → forget-2AE4MDK3.js.map} +0 -0
@@ -0,0 +1,773 @@
1
+ /**
2
+ * Issue #2345 — privacy-safe action-to-outcome trajectory evaluator (offline slice).
3
+ *
4
+ * Pure, local, deterministic evaluator that joins sanitized action rows to
5
+ * delayed outcome rows inside ONE namespace and ONE bounded time window, then
6
+ * emits a redacted shadow artifact (digests, enums, numbers, counts only).
7
+ *
8
+ * This module never:
9
+ * - reads live stores (inputs are synthetic or caller-sanitized rows),
10
+ * - calls a model or network,
11
+ * - mutates memories, counters, utility runtime, or policy decisions.
12
+ *
13
+ * Delivery note (issue "Delivery order"): schema + offline path first. The
14
+ * live `EvalTrajectoryReader` projections and eval-queue wiring arrive with
15
+ * #2348; this module ships the contract they will feed.
16
+ *
17
+ * Contracts and shared helpers live in `eval-trajectory-contracts.ts`;
18
+ * validation, persistence, and the promotion gate live in
19
+ * `eval-trajectory-store.ts`. Both are re-exported here so consumers import
20
+ * one public surface.
21
+ */
22
+
23
+ import assert from "node:assert/strict";
24
+ import {
25
+ DEFAULT_EVAL_TRAJECTORY_OUTCOME_WINDOW_MS,
26
+ EVAL_TRAJECTORY_REPORT_SCHEMA_VERSION,
27
+ type EvalActionInput,
28
+ type EvalActionOutcomeRow,
29
+ type EvalActionProjection,
30
+ type EvalOutcomeInput,
31
+ type EvalOutcomeProjection,
32
+ type EvalStaleUseEvidence,
33
+ type EvalStaleUseEvidenceInput,
34
+ type EvalTrajectoryAggregates,
35
+ type EvalTrajectoryJoinKind,
36
+ type EvalTrajectoryMetricName,
37
+ type EvalTrajectoryRejectionReason,
38
+ type EvalTrajectoryReport,
39
+ type EvalTrajectoryRowStatus,
40
+ type EvalTrajectoryRunConfig,
41
+ STALE_LIFECYCLE_STATES,
42
+ STALE_OUTCOMES,
43
+ canonicalJson,
44
+ compareRows,
45
+ compareStrings,
46
+ digestOf,
47
+ isFiniteNumber,
48
+ isIsoTimestamp,
49
+ isMemoryActionType,
50
+ isNonEmptyString,
51
+ resolveEvalTrajectoryRunConfig,
52
+ serializeEvalTrajectoryReport,
53
+ sha256Hex,
54
+ } from "./eval-trajectory-contracts.js";
55
+ import type { MemoryActionType } from "./types.js";
56
+
57
+ export {
58
+ DEFAULT_EVAL_TRAJECTORY_MAX_FUTURE_SKEW_MS,
59
+ DEFAULT_EVAL_TRAJECTORY_MAX_ROWS,
60
+ DEFAULT_EVAL_TRAJECTORY_OUTCOME_WINDOW_MS,
61
+ DEFAULT_EVAL_TRAJECTORY_REPORT_MAX_AGE_MS,
62
+ DEFAULT_EVAL_TRAJECTORY_WEIGHTS,
63
+ EVAL_TRAJECTORY_PROMOTION_THRESHOLDS,
64
+ EVAL_TRAJECTORY_REPORT_SCHEMA_VERSION,
65
+ MAX_EVAL_TRAJECTORY_ROWS_LIMIT,
66
+ resolveEvalTrajectoryRunConfig,
67
+ serializeEvalTrajectoryReport,
68
+ type EvalActionInput,
69
+ type EvalActionProjection,
70
+ type EvalOutcomeInput,
71
+ type EvalOutcomeProjection,
72
+ type EvalStaleUseEvidence,
73
+ type EvalStaleUseEvidenceInput,
74
+ type EvalStaleUseLifecycleState,
75
+ type EvalStaleUseOutcome,
76
+ type EvalTrajectoryAggregates,
77
+ type EvalTrajectoryJoinKind,
78
+ type EvalTrajectoryMetricName,
79
+ type EvalTrajectoryOutcomeSource,
80
+ type EvalTrajectoryRejectionReason,
81
+ type EvalTrajectoryReport,
82
+ type EvalTrajectoryRowStatus,
83
+ type EvalTrajectoryRunConfig,
84
+ type EvalTrajectoryTaskResult,
85
+ type EvalTrajectoryWeights,
86
+ type UnifiedMemoryPromotionReport,
87
+ type UnifiedMemoryPromotionState,
88
+ } from "./eval-trajectory-contracts.js";
89
+ export * from "./eval-trajectory-store.js";
90
+
91
+ /**
92
+ * Future live-reader seam (#2348). Must receive a trusted principal and a
93
+ * resolved namespace, verify access, and return sanitized rows only.
94
+ */
95
+ export interface EvalTrajectoryReaderResult {
96
+ actions: EvalActionInput[];
97
+ outcomes: EvalOutcomeInput[];
98
+ staleUseEvidence: EvalStaleUseEvidenceInput[];
99
+ }
100
+
101
+ export type EvalTrajectoryReader = (input: {
102
+ trustedPrincipal: string;
103
+ resolvedNamespace: string;
104
+ asOf: string;
105
+ }) => Promise<EvalTrajectoryReaderResult> | EvalTrajectoryReaderResult;
106
+
107
+ /** Synthetic reader over caller-supplied clean rows (tests, offline runs). */
108
+ export function createSyntheticEvalTrajectoryReader(rows: EvalTrajectoryReaderResult): EvalTrajectoryReader {
109
+ return () => rows;
110
+ }
111
+
112
+ // ---------------------------------------------------------------------------
113
+ // Input normalization with per-reason rejection counting
114
+ // ---------------------------------------------------------------------------
115
+
116
+ function emptyRejectionCounts(): Record<EvalTrajectoryRejectionReason, number> {
117
+ return {
118
+ missing_action_id: 0,
119
+ namespace_mismatch: 0,
120
+ invalid_timestamp: 0,
121
+ future_beyond_skew: 0,
122
+ malformed_row: 0,
123
+ invalid_context_budget: 0,
124
+ duplicate_row: 0,
125
+ max_rows_exceeded: 0,
126
+ };
127
+ }
128
+
129
+ interface NormalizeContext {
130
+ namespace: string;
131
+ namespaceDigest: string;
132
+ salt: string;
133
+ asOfMs: number;
134
+ config: EvalTrajectoryRunConfig;
135
+ rejections: Record<EvalTrajectoryRejectionReason, number>;
136
+ }
137
+
138
+ function normalizeAction(raw: unknown, context: NormalizeContext): EvalActionProjection | null {
139
+ if (typeof raw !== "object" || raw === null) {
140
+ context.rejections.malformed_row += 1;
141
+ return null;
142
+ }
143
+ const row = raw as Partial<EvalActionInput>;
144
+ if (!isNonEmptyString(row.actionId)) {
145
+ context.rejections.missing_action_id += 1;
146
+ return null;
147
+ }
148
+ if (row.namespace !== context.namespace) {
149
+ context.rejections.namespace_mismatch += 1;
150
+ return null;
151
+ }
152
+ if (!isIsoTimestamp(row.actionAt)) {
153
+ context.rejections.invalid_timestamp += 1;
154
+ return null;
155
+ }
156
+ if (Date.parse(row.actionAt) > context.asOfMs + context.config.maxFutureSkewMs) {
157
+ context.rejections.future_beyond_skew += 1;
158
+ return null;
159
+ }
160
+ if (!isMemoryActionType(row.action)) {
161
+ context.rejections.malformed_row += 1;
162
+ return null;
163
+ }
164
+ const immediateStatus = row.immediateStatus;
165
+ if (immediateStatus !== "applied" && immediateStatus !== "skipped" && immediateStatus !== "failed") {
166
+ context.rejections.malformed_row += 1;
167
+ return null;
168
+ }
169
+ if (
170
+ row.policyDecision !== undefined &&
171
+ row.policyDecision !== "allow" &&
172
+ row.policyDecision !== "defer" &&
173
+ row.policyDecision !== "deny"
174
+ ) {
175
+ context.rejections.malformed_row += 1;
176
+ return null;
177
+ }
178
+
179
+ const tokensPresent =
180
+ row.contextTokensBefore !== undefined ||
181
+ row.contextTokensAfter !== undefined ||
182
+ row.contextTokenBudget !== undefined;
183
+ let contextTokenCost: number | null = null;
184
+ if (tokensPresent) {
185
+ const before = row.contextTokensBefore;
186
+ const after = row.contextTokensAfter;
187
+ const budget = row.contextTokenBudget;
188
+ if (
189
+ (before !== undefined && (!isFiniteNumber(before) || before < 0)) ||
190
+ (after !== undefined && (!isFiniteNumber(after) || after < 0)) ||
191
+ budget === undefined ||
192
+ !isFiniteNumber(budget)
193
+ ) {
194
+ context.rejections.malformed_row += 1;
195
+ return null;
196
+ }
197
+ if (budget === 0) {
198
+ context.rejections.invalid_context_budget += 1;
199
+ return null;
200
+ }
201
+ contextTokenCost = after === undefined ? null : Math.min(1, Math.max(0, after / Math.max(1, budget)));
202
+ }
203
+
204
+ const appliedDeny = immediateStatus === "applied" && row.policyDecision === "deny";
205
+ const trustViolation: 0 | 1 =
206
+ appliedDeny || row.replayMismatch === true || row.missingReversibleGuard === true || row.outsideEligibility === true
207
+ ? 1
208
+ : 0;
209
+
210
+ return {
211
+ schemaVersion: 1,
212
+ actionDigest: digestOf(context.salt, {
213
+ kind: "action",
214
+ namespace: context.namespace,
215
+ actionId: row.actionId,
216
+ }),
217
+ namespaceDigest: context.namespaceDigest,
218
+ actionAt: row.actionAt,
219
+ action: row.action,
220
+ immediateStatus,
221
+ policyDecision: row.policyDecision ?? null,
222
+ policyVersion: isNonEmptyString(row.policyVersion) ? row.policyVersion : null,
223
+ source: isNonEmptyString(row.subsystem) ? row.subsystem : null,
224
+ actionIdDigest: digestOf(context.salt, {
225
+ kind: "actionId",
226
+ namespace: context.namespace,
227
+ actionId: row.actionId,
228
+ }),
229
+ sessionKeyDigest: isNonEmptyString(row.sessionKey)
230
+ ? digestOf(context.salt, { kind: "sessionKey", namespace: context.namespace, sessionKey: row.sessionKey })
231
+ : null,
232
+ memoryIdDigest: isNonEmptyString(row.memoryId)
233
+ ? digestOf(context.salt, { kind: "memoryId", namespace: context.namespace, memoryId: row.memoryId })
234
+ : null,
235
+ trajectoryIdDigest: isNonEmptyString(row.trajectoryId)
236
+ ? digestOf(context.salt, {
237
+ kind: "trajectoryId",
238
+ namespace: context.namespace,
239
+ trajectoryId: row.trajectoryId,
240
+ })
241
+ : null,
242
+ contextTokenCost,
243
+ trustViolation,
244
+ };
245
+ }
246
+
247
+ function normalizeOutcome(raw: unknown, context: NormalizeContext): EvalOutcomeProjection | null {
248
+ if (typeof raw !== "object" || raw === null) {
249
+ context.rejections.malformed_row += 1;
250
+ return null;
251
+ }
252
+ const row = raw as Partial<EvalOutcomeInput>;
253
+ if (!isNonEmptyString(row.outcomeId)) {
254
+ context.rejections.malformed_row += 1;
255
+ return null;
256
+ }
257
+ if (row.namespace !== context.namespace) {
258
+ context.rejections.namespace_mismatch += 1;
259
+ return null;
260
+ }
261
+ if (row.source !== "eval_artifact" && row.source !== "causal_trajectory" && row.source !== "memory_outcome") {
262
+ context.rejections.malformed_row += 1;
263
+ return null;
264
+ }
265
+ if (!isIsoTimestamp(row.outcomeAt)) {
266
+ context.rejections.invalid_timestamp += 1;
267
+ return null;
268
+ }
269
+ if (Date.parse(row.outcomeAt) > context.asOfMs + context.config.maxFutureSkewMs) {
270
+ context.rejections.future_beyond_skew += 1;
271
+ return null;
272
+ }
273
+ if (row.result !== undefined && row.result !== "success" && row.result !== "partial" && row.result !== "failure") {
274
+ context.rejections.malformed_row += 1;
275
+ return null;
276
+ }
277
+ const hasJoinKey =
278
+ isNonEmptyString(row.actionId) ||
279
+ isNonEmptyString(row.trajectoryId) ||
280
+ isNonEmptyString(row.sessionKey) ||
281
+ (isNonEmptyString(row.memoryId) && isNonEmptyString(row.sessionKey));
282
+ if (!hasJoinKey) {
283
+ context.rejections.malformed_row += 1;
284
+ return null;
285
+ }
286
+
287
+ const value =
288
+ row.result === undefined || row.source === "memory_outcome"
289
+ ? null
290
+ : row.result === "success"
291
+ ? 1
292
+ : row.result === "partial"
293
+ ? 0.5
294
+ : 0;
295
+ const ref = row.actionId ?? row.trajectoryId ?? row.memoryId ?? row.sessionKey ?? row.outcomeId;
296
+
297
+ return {
298
+ schemaVersion: 1,
299
+ outcomeDigest: digestOf(context.salt, {
300
+ kind: "outcome",
301
+ namespace: context.namespace,
302
+ outcomeId: row.outcomeId,
303
+ }),
304
+ namespaceDigest: context.namespaceDigest,
305
+ recordedAt: row.outcomeAt,
306
+ kind: row.source,
307
+ value,
308
+ sourceRefDigest: digestOf(context.salt, { kind: "sourceRef", namespace: context.namespace, ref }),
309
+ actionIdDigest: isNonEmptyString(row.actionId)
310
+ ? digestOf(context.salt, { kind: "actionId", namespace: context.namespace, actionId: row.actionId })
311
+ : null,
312
+ trajectoryIdDigest: isNonEmptyString(row.trajectoryId)
313
+ ? digestOf(context.salt, {
314
+ kind: "trajectoryId",
315
+ namespace: context.namespace,
316
+ trajectoryId: row.trajectoryId,
317
+ })
318
+ : null,
319
+ memoryIdDigest: isNonEmptyString(row.memoryId)
320
+ ? digestOf(context.salt, { kind: "memoryId", namespace: context.namespace, memoryId: row.memoryId })
321
+ : null,
322
+ sessionKeyDigest: isNonEmptyString(row.sessionKey)
323
+ ? digestOf(context.salt, { kind: "sessionKey", namespace: context.namespace, sessionKey: row.sessionKey })
324
+ : null,
325
+ };
326
+ }
327
+
328
+ function normalizeStaleEvidence(raw: unknown, context: NormalizeContext): EvalStaleUseEvidence | null {
329
+ if (typeof raw !== "object" || raw === null) {
330
+ context.rejections.malformed_row += 1;
331
+ return null;
332
+ }
333
+ const row = raw as Partial<EvalStaleUseEvidenceInput>;
334
+ if (!isNonEmptyString(row.actionId) || !isNonEmptyString(row.memoryId)) {
335
+ context.rejections.malformed_row += 1;
336
+ return null;
337
+ }
338
+ if (row.namespace !== context.namespace) {
339
+ context.rejections.namespace_mismatch += 1;
340
+ return null;
341
+ }
342
+ if (typeof row.lifecycleState !== "string" || STALE_LIFECYCLE_STATES[row.lifecycleState] !== true) {
343
+ context.rejections.malformed_row += 1;
344
+ return null;
345
+ }
346
+ if (!isIsoTimestamp(row.usedAt) || typeof row.outcome !== "string" || STALE_OUTCOMES[row.outcome] !== true) {
347
+ context.rejections.malformed_row += 1;
348
+ return null;
349
+ }
350
+ return {
351
+ schemaVersion: 1,
352
+ actionDigest: digestOf(context.salt, {
353
+ kind: "action",
354
+ namespace: context.namespace,
355
+ actionId: row.actionId,
356
+ }),
357
+ memoryDigest: digestOf(context.salt, {
358
+ kind: "memoryId",
359
+ namespace: context.namespace,
360
+ memoryId: row.memoryId,
361
+ }),
362
+ lifecycleState: row.lifecycleState,
363
+ usedAt: row.usedAt,
364
+ outcome: row.outcome,
365
+ };
366
+ }
367
+
368
+ // ---------------------------------------------------------------------------
369
+ // Join + metric core
370
+ // ---------------------------------------------------------------------------
371
+
372
+ interface JoinCandidateLevel {
373
+ kind: EvalTrajectoryJoinKind;
374
+ matches: (action: EvalActionProjection, outcome: EvalOutcomeProjection) => boolean;
375
+ }
376
+
377
+ const JOIN_LEVELS: JoinCandidateLevel[] = [
378
+ {
379
+ kind: "action_id",
380
+ matches: (action, outcome) => outcome.actionIdDigest !== null && outcome.actionIdDigest === action.actionIdDigest,
381
+ },
382
+ {
383
+ kind: "trajectory_id",
384
+ matches: (action, outcome) =>
385
+ action.trajectoryIdDigest !== null &&
386
+ outcome.trajectoryIdDigest !== null &&
387
+ outcome.trajectoryIdDigest === action.trajectoryIdDigest,
388
+ },
389
+ {
390
+ kind: "memory_scope",
391
+ matches: (action, outcome) =>
392
+ outcome.kind === "memory_outcome" &&
393
+ action.memoryIdDigest !== null &&
394
+ outcome.memoryIdDigest !== null &&
395
+ outcome.memoryIdDigest === action.memoryIdDigest &&
396
+ action.sessionKeyDigest !== null &&
397
+ outcome.sessionKeyDigest !== null &&
398
+ outcome.sessionKeyDigest === action.sessionKeyDigest,
399
+ },
400
+ {
401
+ kind: "session_scope",
402
+ matches: (action, outcome) =>
403
+ outcome.kind !== "memory_outcome" &&
404
+ action.sessionKeyDigest !== null &&
405
+ outcome.sessionKeyDigest !== null &&
406
+ outcome.sessionKeyDigest === action.sessionKeyDigest,
407
+ },
408
+ ];
409
+
410
+ /** Half-open delayed window: `actionAt < outcomeAt < actionAt + outcomeWindowMs`. */
411
+ function outcomeInWindow(
412
+ action: EvalActionProjection,
413
+ outcome: EvalOutcomeProjection,
414
+ config: EvalTrajectoryRunConfig
415
+ ): boolean {
416
+ const outcomeMs = Date.parse(outcome.recordedAt);
417
+ return Date.parse(action.actionAt) < outcomeMs && outcomeMs < Date.parse(action.actionAt) + config.outcomeWindowMs;
418
+ }
419
+
420
+ function anyKeyMatch(action: EvalActionProjection, outcome: EvalOutcomeProjection): boolean {
421
+ return JOIN_LEVELS.some((level) => level.matches(action, outcome));
422
+ }
423
+
424
+ function staleHarmFor(action: EvalActionProjection, evidence: EvalStaleUseEvidence[]): 0 | 0.5 | 1 {
425
+ let harm: 0 | 0.5 | 1 = 0;
426
+ for (const item of evidence) {
427
+ if (item.actionDigest !== action.actionDigest) continue;
428
+ if (item.lifecycleState !== "stale" && item.lifecycleState !== "archived") continue;
429
+ if (Date.parse(item.usedAt) <= Date.parse(action.actionAt)) continue;
430
+ if (item.outcome === "failure") return 1;
431
+ if (item.outcome === "partial" || item.outcome === "unknown") harm = 0.5;
432
+ }
433
+ return harm;
434
+ }
435
+
436
+ function buildRow(
437
+ action: EvalActionProjection,
438
+ outcomes: EvalOutcomeProjection[],
439
+ evidence: EvalStaleUseEvidence[],
440
+ config: EvalTrajectoryRunConfig,
441
+ asOfMs: number
442
+ ): EvalActionOutcomeRow {
443
+ let selected: EvalOutcomeProjection | null = null;
444
+ let joinKind: EvalTrajectoryJoinKind | null = null;
445
+ let ambiguous = false;
446
+
447
+ for (const level of JOIN_LEVELS) {
448
+ const inWindow = outcomes.filter(
449
+ (outcome) =>
450
+ level.matches(action, outcome) &&
451
+ outcomeInWindow(action, outcome, config) &&
452
+ Date.parse(outcome.recordedAt) <= asOfMs
453
+ );
454
+ if (inWindow.length === 1) {
455
+ selected = inWindow[0] ?? null;
456
+ joinKind = level.kind;
457
+ break;
458
+ }
459
+ if (inWindow.length > 1) {
460
+ ambiguous = true;
461
+ joinKind = level.kind;
462
+ break;
463
+ }
464
+ }
465
+
466
+ let status: EvalTrajectoryRowStatus;
467
+ let outcomeDigest: string | null = null;
468
+ let outcomeRecordedAt: string | null = null;
469
+ let lateProjection: EvalOutcomeProjection | null = null;
470
+ if (ambiguous) {
471
+ status = "ambiguous";
472
+ } else if (selected !== null) {
473
+ status = "joined";
474
+ outcomeDigest = selected.outcomeDigest;
475
+ outcomeRecordedAt = selected.recordedAt;
476
+ } else {
477
+ const keyMatches = outcomes.filter((outcome) => anyKeyMatch(action, outcome));
478
+ // Prefer the in-data off-window result when one exists; a future result
479
+ // (recorded after asOf) is reported but never matched.
480
+ const lateCandidates = keyMatches
481
+ .filter(
482
+ (outcome) =>
483
+ Date.parse(outcome.recordedAt) >= Date.parse(action.actionAt) + config.outcomeWindowMs &&
484
+ Date.parse(outcome.recordedAt) <= asOfMs
485
+ )
486
+ .sort((a, b) => compareStrings(a.recordedAt, b.recordedAt));
487
+ lateProjection = lateCandidates.length > 0 ? (lateCandidates[lateCandidates.length - 1] ?? null) : null;
488
+ if (lateProjection !== null) {
489
+ status = "late_outcome";
490
+ outcomeDigest = lateProjection.outcomeDigest;
491
+ outcomeRecordedAt = lateProjection.recordedAt;
492
+ } else if (keyMatches.some((outcome) => Date.parse(outcome.recordedAt) > asOfMs)) {
493
+ status = "future_outcome";
494
+ } else {
495
+ status = "missing_within_window";
496
+ }
497
+ }
498
+
499
+ // Only task-source outcomes carry a task value; memory outcomes never do.
500
+ const matched = selected ?? (status === "late_outcome" ? lateProjection : null);
501
+ const taskOutcome: number | null =
502
+ status === "joined" || status === "late_outcome"
503
+ ? matched !== null && matched.kind !== "memory_outcome"
504
+ ? matched.value
505
+ : null
506
+ : null;
507
+
508
+ const staleMemoryHarm = staleHarmFor(action, evidence);
509
+ const weights = config.weights;
510
+ const missingDimensions: EvalTrajectoryMetricName[] = [];
511
+ if (taskOutcome === null && weights.task > 0) missingDimensions.push("taskOutcome");
512
+ if (action.contextTokenCost === null && weights.context > 0) missingDimensions.push("contextTokenCost");
513
+
514
+ const actionConditionedUtility =
515
+ status !== "joined" || missingDimensions.length > 0
516
+ ? null
517
+ : Math.min(
518
+ 1,
519
+ Math.max(
520
+ -1,
521
+ weights.task * (taskOutcome ?? 0) -
522
+ weights.context * (action.contextTokenCost ?? 0) -
523
+ weights.trust * action.trustViolation -
524
+ weights.stale * staleMemoryHarm
525
+ )
526
+ );
527
+
528
+ return {
529
+ schemaVersion: 1,
530
+ actionDigest: action.actionDigest,
531
+ outcomeDigest: status === "future_outcome" ? null : outcomeDigest,
532
+ join: status === "joined" || status === "ambiguous" ? joinKind : null,
533
+ status,
534
+ outcomeRecordedAt: status === "future_outcome" ? null : outcomeRecordedAt,
535
+ taskOutcome,
536
+ contextTokenCost: action.contextTokenCost,
537
+ trustViolation: action.trustViolation,
538
+ staleMemoryHarm,
539
+ actionConditionedUtility,
540
+ missingDimensions,
541
+ };
542
+ }
543
+
544
+ // ---------------------------------------------------------------------------
545
+ // Report builder (pure — no I/O, no model, no memory writes)
546
+ // ---------------------------------------------------------------------------
547
+
548
+ export interface BuildEvalTrajectoryReportOptions {
549
+ /** Single resolved namespace for the whole run. Never "all namespaces". */
550
+ namespace: string;
551
+ asOf: string;
552
+ /** Per-run salt. Required, never exported. */
553
+ salt: string;
554
+ actions: unknown[];
555
+ outcomes?: unknown[];
556
+ staleUseEvidence?: unknown[];
557
+ config?: Partial<EvalTrajectoryRunConfig>;
558
+ }
559
+
560
+ export function buildEvalTrajectoryReport(options: BuildEvalTrajectoryReportOptions): EvalTrajectoryReport {
561
+ if (!isNonEmptyString(options.namespace)) throw new Error("eval trajectory run requires a namespace");
562
+ if (!isNonEmptyString(options.salt)) throw new Error("eval trajectory run requires a salt");
563
+ if (!isIsoTimestamp(options.asOf)) throw new Error("asOf must be a normalized ISO-8601 UTC timestamp");
564
+ const config = resolveEvalTrajectoryRunConfig(options.config);
565
+ const asOfMs = Date.parse(options.asOf);
566
+ const context: NormalizeContext = {
567
+ namespace: options.namespace,
568
+ namespaceDigest: digestOf(options.salt, { kind: "namespace", namespace: options.namespace }),
569
+ salt: options.salt,
570
+ asOfMs,
571
+ config,
572
+ rejections: emptyRejectionCounts(),
573
+ };
574
+
575
+ const actions: EvalActionProjection[] = [];
576
+ const seenActionDigests = new Set<string>();
577
+ for (const raw of options.actions ?? []) {
578
+ const projection = normalizeAction(raw, context);
579
+ if (projection === null) continue;
580
+ if (seenActionDigests.has(projection.actionDigest)) {
581
+ context.rejections.duplicate_row += 1;
582
+ continue;
583
+ }
584
+ seenActionDigests.add(projection.actionDigest);
585
+ actions.push(projection);
586
+ }
587
+ actions.sort((a, b) => compareStrings(a.actionDigest, b.actionDigest));
588
+ if (actions.length > config.maxRows) {
589
+ context.rejections.max_rows_exceeded += actions.length - config.maxRows;
590
+ actions.length = config.maxRows;
591
+ }
592
+
593
+ const outcomes: EvalOutcomeProjection[] = [];
594
+ const seenOutcomeDigests = new Set<string>();
595
+ for (const raw of options.outcomes ?? []) {
596
+ const projection = normalizeOutcome(raw, context);
597
+ if (projection === null) continue;
598
+ if (seenOutcomeDigests.has(projection.outcomeDigest)) {
599
+ context.rejections.duplicate_row += 1;
600
+ continue;
601
+ }
602
+ seenOutcomeDigests.add(projection.outcomeDigest);
603
+ outcomes.push(projection);
604
+ }
605
+ outcomes.sort((a, b) => compareStrings(a.outcomeDigest, b.outcomeDigest));
606
+
607
+ const evidence: EvalStaleUseEvidence[] = [];
608
+ for (const raw of options.staleUseEvidence ?? []) {
609
+ const projection = normalizeStaleEvidence(raw, context);
610
+ if (projection !== null) evidence.push(projection);
611
+ }
612
+ evidence.sort((a, b) => {
613
+ const byUsedAt = compareStrings(a.usedAt, b.usedAt);
614
+ if (byUsedAt !== 0) return byUsedAt;
615
+ return compareStrings(a.memoryDigest, b.memoryDigest);
616
+ });
617
+
618
+ const rows = actions.map((action) => buildRow(action, outcomes, evidence, config, asOfMs));
619
+ rows.sort(compareRows);
620
+
621
+ const inputFingerprint = sha256Hex(
622
+ canonicalJson({
623
+ schemaVersion: EVAL_TRAJECTORY_REPORT_SCHEMA_VERSION,
624
+ namespace: options.namespace,
625
+ asOf: options.asOf,
626
+ salt: options.salt,
627
+ config,
628
+ actions,
629
+ outcomes,
630
+ evidence,
631
+ })
632
+ );
633
+ const reportId = sha256Hex(
634
+ canonicalJson({
635
+ kind: "eval-trajectory-report",
636
+ inputFingerprint,
637
+ namespaceDigest: context.namespaceDigest,
638
+ asOf: options.asOf,
639
+ })
640
+ );
641
+
642
+ const report: EvalTrajectoryReport = {
643
+ schemaVersion: EVAL_TRAJECTORY_REPORT_SCHEMA_VERSION,
644
+ reportId,
645
+ namespaceDigest: context.namespaceDigest,
646
+ asOf: options.asOf,
647
+ config,
648
+ sourceCounts: { actions: actions.length, outcomes: outcomes.length, staleUseEvidence: evidence.length },
649
+ rejectionCounts: context.rejections,
650
+ rows,
651
+ aggregates: computeAggregates(rows, actions),
652
+ inputFingerprint,
653
+ contentHash: "",
654
+ };
655
+ report.contentHash = sha256Hex(canonicalJson({ ...report, contentHash: undefined }));
656
+ return report;
657
+ }
658
+
659
+ function computeAggregates(rows: EvalActionOutcomeRow[], actions: EvalActionProjection[]): EvalTrajectoryAggregates {
660
+ const statusCounts: Record<EvalTrajectoryRowStatus, number> = {
661
+ joined: 0,
662
+ ambiguous: 0,
663
+ late_outcome: 0,
664
+ future_outcome: 0,
665
+ missing_within_window: 0,
666
+ };
667
+ for (const row of rows) statusCounts[row.status] += 1;
668
+
669
+ const digestToAction = new Map(actions.map((action) => [action.actionDigest, action]));
670
+ const joinedRows = rows.filter((row) => row.status === "joined");
671
+ const mean = (values: number[]): number | null =>
672
+ values.length === 0 ? null : values.reduce((sum, value) => sum + value, 0) / values.length;
673
+
674
+ interface GroupTally {
675
+ rowCount: number;
676
+ utilitySum: number;
677
+ utilityCount: number;
678
+ }
679
+ const bump = (map: Map<string, GroupTally>, key: string, utility: number | null): void => {
680
+ const tally = map.get(key) ?? { rowCount: 0, utilitySum: 0, utilityCount: 0 };
681
+ tally.rowCount += 1;
682
+ if (utility !== null) {
683
+ tally.utilitySum += utility;
684
+ tally.utilityCount += 1;
685
+ }
686
+ map.set(key, tally);
687
+ };
688
+ const byActionMap = new Map<string, GroupTally>();
689
+ const byPolicyMap = new Map<string, GroupTally>();
690
+ for (const row of joinedRows) {
691
+ const action = digestToAction.get(row.actionDigest);
692
+ if (!action) continue;
693
+ bump(byActionMap, action.action, row.actionConditionedUtility);
694
+ bump(byPolicyMap, action.policyDecision ?? "unrecorded", row.actionConditionedUtility);
695
+ }
696
+
697
+ const reachDenominator = rows.length - statusCounts.future_outcome;
698
+ return {
699
+ rowCount: rows.length,
700
+ statusCounts,
701
+ metricMeans: {
702
+ taskOutcome: mean(joinedRows.map((row) => row.taskOutcome).filter(isFiniteNumber)),
703
+ contextTokenCost: mean(joinedRows.map((row) => row.contextTokenCost).filter(isFiniteNumber)),
704
+ trustViolation: mean(joinedRows.map((row) => row.trustViolation).filter(isFiniteNumber)),
705
+ staleMemoryHarm: mean(joinedRows.map((row) => row.staleMemoryHarm).filter(isFiniteNumber)),
706
+ actionConditionedUtility: mean(joinedRows.map((row) => row.actionConditionedUtility).filter(isFiniteNumber)),
707
+ },
708
+ coverage: {
709
+ reach: reachDenominator > 0 ? statusCounts.joined / reachDenominator : null,
710
+ joined: statusCounts.joined,
711
+ missingWithinWindow: statusCounts.missing_within_window,
712
+ lateOutcome: statusCounts.late_outcome,
713
+ futureOutcome: statusCounts.future_outcome,
714
+ ambiguous: statusCounts.ambiguous,
715
+ excludedFromMeans: rows.length - statusCounts.joined,
716
+ },
717
+ byAction: [...byActionMap.entries()]
718
+ .sort(([a], [b]) => compareStrings(a, b))
719
+ .map(([action, tally]) => ({
720
+ action: action as MemoryActionType,
721
+ rowCount: tally.rowCount,
722
+ meanUtility: tally.utilityCount > 0 ? tally.utilitySum / tally.utilityCount : null,
723
+ })),
724
+ byPolicyDecision: [...byPolicyMap.entries()]
725
+ .sort(([a], [b]) => compareStrings(a, b))
726
+ .map(([policyDecision, tally]) => ({
727
+ policyDecision,
728
+ rowCount: tally.rowCount,
729
+ meanUtility: tally.utilityCount > 0 ? tally.utilitySum / tally.utilityCount : null,
730
+ })),
731
+ };
732
+ }
733
+
734
+ // ---------------------------------------------------------------------------
735
+ // Self-check (minimal made-up fixture): npx tsx packages/remnic-core/src/eval-trajectory.ts
736
+ // ---------------------------------------------------------------------------
737
+
738
+ if (process.argv[1]?.endsWith("eval-trajectory.ts") === true) {
739
+ const report = buildEvalTrajectoryReport({
740
+ namespace: "self-check",
741
+ asOf: "2026-08-15T00:00:00.000Z",
742
+ salt: "self-check-salt",
743
+ actions: [
744
+ {
745
+ schemaVersion: 1,
746
+ actionId: "act-1",
747
+ namespace: "self-check",
748
+ actionAt: "2026-08-10T00:00:00.000Z",
749
+ action: "store_note",
750
+ immediateStatus: "applied",
751
+ sessionKey: "agent:main",
752
+ },
753
+ ],
754
+ outcomes: [
755
+ {
756
+ schemaVersion: 1,
757
+ namespace: "self-check",
758
+ outcomeId: "out-1",
759
+ outcomeAt: "2026-08-12T00:00:00.000Z",
760
+ source: "causal_trajectory",
761
+ result: "partial",
762
+ sessionKey: "agent:main",
763
+ },
764
+ ],
765
+ });
766
+ const row = report.rows[0];
767
+ assert.equal(row?.status, "joined", "self-check row must join");
768
+ assert.equal(row?.taskOutcome, 0.5, "partial must score 0.5");
769
+ assert.equal(report.aggregates.coverage.reach, 1, "reach must be 1");
770
+ assert.ok(serializeEvalTrajectoryReport(report).includes('"contentHash"'), "report must serialize");
771
+ assert.ok(DEFAULT_EVAL_TRAJECTORY_OUTCOME_WINDOW_MS === 604_800_000, "default window must stay 7 days");
772
+ console.log("eval-trajectory self-check OK");
773
+ }