@remnic/core 9.65.1 → 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 (576) hide show
  1. package/dist/access-admin-ops-surface.d.ts +44 -44
  2. package/dist/access-admin-ops-surface.js +36 -35
  3. package/dist/access-authorization-probe.d.ts +39 -40
  4. package/dist/access-authorization-probe.js +37 -36
  5. package/dist/access-boundary.d.ts +41 -185
  6. package/dist/access-boundary.js +36 -35
  7. package/dist/access-cli.js +110 -107
  8. package/dist/access-cli.js.map +1 -1
  9. package/dist/access-coding-context-resolution.d.ts +3 -1
  10. package/dist/access-extraction-force-flush.d.ts +25 -25
  11. package/dist/access-extraction-force-flush.js +36 -35
  12. package/dist/access-health-types.d.ts +3 -1
  13. package/dist/access-http-lcm-compaction.d.ts +39 -39
  14. package/dist/access-http-lifecycle-flush.d.ts +40 -41
  15. package/dist/access-http-offline-stream.d.ts +25 -25
  16. package/dist/access-http-query.d.ts +4 -2
  17. package/dist/access-http-query.js +38 -37
  18. package/dist/access-http.d.ts +51 -44
  19. package/dist/access-http.js +57 -56
  20. package/dist/access-identity-continuity-surface.d.ts +12 -12
  21. package/dist/access-identity-continuity-surface.js +36 -35
  22. package/dist/access-lcm-surface.d.ts +27 -27
  23. package/dist/access-lcm-surface.js +36 -35
  24. package/dist/access-mcp-admin-tools.d.ts +9 -1
  25. package/dist/access-mcp-admin-tools.js +3 -1
  26. package/dist/access-mcp-output-schemas.js +1 -1
  27. package/dist/access-mcp.d.ts +39 -39
  28. package/dist/access-mcp.js +50 -47
  29. package/dist/access-memory-search-fanout.d.ts +4 -2
  30. package/dist/{access-namespace-preflight-BKUnKsBv.d.ts → access-namespace-preflight-B7Usyz-K.d.ts} +1 -1
  31. package/dist/access-namespace-preflight.d.ts +5 -3
  32. package/dist/access-namespace-preflight.js +36 -35
  33. package/dist/access-observe-write-surface.d.ts +39 -39
  34. package/dist/access-observe-write-surface.js +36 -35
  35. package/dist/access-offline-manifest.d.ts +12 -12
  36. package/dist/access-offline-manifest.js +5 -5
  37. package/dist/access-operations-batch.js +41 -40
  38. package/dist/access-operations.d.ts +46 -47
  39. package/dist/access-operations.js +44 -43
  40. package/dist/access-recall-concurrency.d.ts +40 -40
  41. package/dist/access-recall-concurrency.js +36 -35
  42. package/dist/access-recall-response.d.ts +24 -24
  43. package/dist/access-recall-response.js +36 -35
  44. package/dist/access-recall-surface.d.ts +24 -24
  45. package/dist/access-recall-surface.js +36 -35
  46. package/dist/access-schema.d.ts +139 -139
  47. package/dist/access-schema.js +3 -3
  48. package/dist/{access-service-B1Lbb-nQ.d.ts → access-service-DkaIG3n8.d.ts} +688 -140
  49. package/dist/access-service-helpers.d.ts +40 -40
  50. package/dist/access-service.d.ts +47 -47
  51. package/dist/access-service.js +36 -35
  52. package/dist/access-surface-catalog.d.ts +41 -42
  53. package/dist/access-surface-catalog.js +44 -37
  54. package/dist/access-surface-catalog.js.map +1 -1
  55. package/dist/access-wearables-meetings-surface.d.ts +5 -3
  56. package/dist/action-confidence.d.ts +3 -1
  57. package/dist/active-memory-bridge.d.ts +3 -1
  58. package/dist/active-recall.d.ts +3 -1
  59. package/dist/active-recall.js +11 -1
  60. package/dist/active-recall.js.map +1 -1
  61. package/dist/adapters/index.js +4 -4
  62. package/dist/adapters/registry.js +2 -2
  63. package/dist/ambient-provenance.d.ts +3 -1
  64. package/dist/artifact-search.d.ts +3 -1
  65. package/dist/{auto-sync-5L7EUZ27.js → auto-sync-H64ZCNIR.js} +13 -5
  66. package/dist/{auto-sync-5L7EUZ27.js.map → auto-sync-H64ZCNIR.js.map} +1 -1
  67. package/dist/behavior-learner.d.ts +3 -1
  68. package/dist/behavior-signals.d.ts +3 -1
  69. package/dist/bootstrap.d.ts +12 -12
  70. package/dist/briefing-window.d.ts +4 -2
  71. package/dist/briefing.d.ts +4 -2
  72. package/dist/briefing.js +16 -15
  73. package/dist/buffer-surprise-report.d.ts +3 -1
  74. package/dist/buffer-turn-helpers.d.ts +3 -1
  75. package/dist/buffer.d.ts +4 -2
  76. package/dist/buffer.js +4 -4
  77. package/dist/bulk-import/index.d.ts +5 -3
  78. package/dist/calibration.d.ts +3 -1
  79. package/dist/calibration.js +1 -1
  80. package/dist/capabilities.d.ts +3 -1
  81. package/dist/{capsule-crypto-7FJQINUR.js → capsule-crypto-YO5QJ6L3.js} +2 -2
  82. package/dist/{catalog-DjVhJoRM.d.ts → catalog-CX2BZEJh.d.ts} +1 -1
  83. package/dist/causal-behavior.d.ts +1 -1
  84. package/dist/causal-consolidation.d.ts +3 -1
  85. package/dist/causal-consolidation.js +20 -19
  86. package/dist/causal-consolidation.js.map +1 -1
  87. package/dist/causal-trajectory-graph.d.ts +1 -1
  88. package/dist/{chunk-MIBKEW7A.js → chunk-2VXWFYJE.js} +3 -3
  89. package/dist/{chunk-3YTTAGPB.js → chunk-3DVBKTSO.js} +2 -2
  90. package/dist/{chunk-EIR5VLIH.js → chunk-4K7IW3F7.js} +2 -2
  91. package/dist/chunk-4K7IW3F7.js.map +1 -0
  92. package/dist/{chunk-JTSVMJHV.js → chunk-4XDGYCZI.js} +3 -3
  93. package/dist/chunk-573TEZCD.js +88 -0
  94. package/dist/chunk-573TEZCD.js.map +1 -0
  95. package/dist/{chunk-HQSBYI5X.js → chunk-57HVIG5U.js} +2 -2
  96. package/dist/{chunk-PMVPCZJZ.js → chunk-6433HV72.js} +2 -2
  97. package/dist/{chunk-N6TRHP72.js → chunk-6TAX66IA.js} +2 -2
  98. package/dist/{chunk-AGKIG3YA.js → chunk-6VALIZKG.js} +2 -2
  99. package/dist/{chunk-YQ3CBLL4.js → chunk-76PL4XLG.js} +512 -8
  100. package/dist/chunk-76PL4XLG.js.map +1 -0
  101. package/dist/{chunk-4NZHHGVL.js → chunk-7BDZTALN.js} +4 -1
  102. package/dist/chunk-7BDZTALN.js.map +1 -0
  103. package/dist/{chunk-NS5ETDYD.js → chunk-7BEPVIH3.js} +3 -3
  104. package/dist/{chunk-JG22O53B.js → chunk-7CBKAQIG.js} +2 -1
  105. package/dist/chunk-7CBKAQIG.js.map +1 -0
  106. package/dist/{chunk-LYIZXQYY.js → chunk-7KFIMGMP.js} +2 -2
  107. package/dist/{chunk-LWVO2QZV.js → chunk-7QOO4LGC.js} +56 -56
  108. package/dist/chunk-AAXJNINV.js +55 -0
  109. package/dist/chunk-AAXJNINV.js.map +1 -0
  110. package/dist/{chunk-56BSXSHC.js → chunk-AB3A7EFH.js} +31 -2
  111. package/dist/{chunk-56BSXSHC.js.map → chunk-AB3A7EFH.js.map} +1 -1
  112. package/dist/{chunk-CCTVAVTT.js → chunk-AUO2LJ3K.js} +2 -2
  113. package/dist/{chunk-ALCJRQ72.js → chunk-AYDDB3XI.js} +2 -2
  114. package/dist/{chunk-3TMYV3LP.js → chunk-AYYGRVRP.js} +5 -5
  115. package/dist/{chunk-W6TSGWYS.js → chunk-AZAA5DNP.js} +2 -2
  116. package/dist/{chunk-WTOE7CW4.js → chunk-BKYPJUQL.js} +122 -16
  117. package/dist/chunk-BKYPJUQL.js.map +1 -0
  118. package/dist/{chunk-6JJT5AKI.js → chunk-BQUEAVNW.js} +2 -2
  119. package/dist/{chunk-2NLLXCJG.js → chunk-BXLOS5AJ.js} +2 -2
  120. package/dist/{chunk-CEH2AFXG.js → chunk-C24UZSFW.js} +6 -6
  121. package/dist/{chunk-ZPN7W3OP.js → chunk-CDUUDBWJ.js} +3 -3
  122. package/dist/{chunk-35NN3ZFA.js → chunk-CTVWELNK.js} +21 -3
  123. package/dist/chunk-CTVWELNK.js.map +1 -0
  124. package/dist/{chunk-Y23B2QXP.js → chunk-D27J626P.js} +2 -2
  125. package/dist/{chunk-2572MRP2.js → chunk-DHTQP334.js} +2 -2
  126. package/dist/{chunk-HJQZQUPC.js → chunk-DJZWNKFO.js} +5 -5
  127. package/dist/{chunk-X7Y7WX73.js → chunk-DQEMWVMT.js} +1 -1
  128. package/dist/{chunk-VJ6ECBIP.js → chunk-E4MVQQVX.js} +2 -2
  129. package/dist/{chunk-SYJ6EKKE.js → chunk-EIVIB73I.js} +2 -2
  130. package/dist/{chunk-HUNSEO5U.js → chunk-EV3YFLCB.js} +2 -2
  131. package/dist/{chunk-GEULB2VI.js → chunk-FC7TIRFS.js} +21 -1
  132. package/dist/chunk-FC7TIRFS.js.map +1 -0
  133. package/dist/{chunk-VPGRXEAB.js → chunk-G57LQRP6.js} +2 -2
  134. package/dist/{chunk-BC4QD3FM.js → chunk-GN55KU2P.js} +2 -2
  135. package/dist/{chunk-4W6INNXO.js → chunk-GUXS322H.js} +2 -2
  136. package/dist/{chunk-DBXZZIDU.js → chunk-H5FW4S5Q.js} +434 -693
  137. package/dist/chunk-H5FW4S5Q.js.map +1 -0
  138. package/dist/chunk-I32NKXE2.js +879 -0
  139. package/dist/chunk-I32NKXE2.js.map +1 -0
  140. package/dist/{chunk-3MADV4YC.js → chunk-IQSC3V2E.js} +2 -2
  141. package/dist/{chunk-UYCIS6V5.js → chunk-JCWY73FK.js} +2 -2
  142. package/dist/{chunk-T42L3S6A.js → chunk-LBWQ65SX.js} +4 -4
  143. package/dist/{chunk-MSTNSVXI.js → chunk-LDBFXD4F.js} +2 -1
  144. package/dist/chunk-LDBFXD4F.js.map +1 -0
  145. package/dist/{chunk-CEQF6L5K.js → chunk-LUNJ3WFO.js} +9 -7
  146. package/dist/chunk-LUNJ3WFO.js.map +1 -0
  147. package/dist/{chunk-256FBCVX.js → chunk-M4AHBM72.js} +7 -7
  148. package/dist/{chunk-YEQEGSJA.js → chunk-MBDJJTAT.js} +3 -3
  149. package/dist/{chunk-IAY7YBXS.js → chunk-MRTUN665.js} +2 -2
  150. package/dist/{chunk-JFJ3MHGV.js → chunk-NXKJHSDN.js} +1 -1
  151. package/dist/chunk-NXKJHSDN.js.map +1 -0
  152. package/dist/{chunk-R3AAOKR2.js → chunk-NZWEEALH.js} +2 -2
  153. package/dist/{chunk-I2HTKOOP.js → chunk-ODZG724P.js} +2 -2
  154. package/dist/{chunk-7QFBLYFP.js → chunk-OJD4WS2E.js} +3 -3
  155. package/dist/{chunk-CUS6S7PN.js → chunk-OLWTCWQ2.js} +9 -9
  156. package/dist/chunk-OLWTCWQ2.js.map +1 -0
  157. package/dist/{chunk-53ENM6F6.js → chunk-P4DHENRE.js} +2 -2
  158. package/dist/{chunk-DEFI2QBT.js → chunk-PAYGC3BD.js} +52 -22
  159. package/dist/chunk-PAYGC3BD.js.map +1 -0
  160. package/dist/{chunk-KPBLJCCV.js → chunk-PDVQ5JU3.js} +2 -2
  161. package/dist/{chunk-7BY7V4YX.js → chunk-Q4WONDMJ.js} +4 -3
  162. package/dist/{chunk-7BY7V4YX.js.map → chunk-Q4WONDMJ.js.map} +1 -1
  163. package/dist/{chunk-ESCQ6LY7.js → chunk-QFMO32TO.js} +3 -3
  164. package/dist/{chunk-HQSPXTQO.js → chunk-QXIQPCCN.js} +1 -1
  165. package/dist/{chunk-CFRBTATE.js → chunk-R47WINCY.js} +3 -3
  166. package/dist/{chunk-G72IPMR7.js → chunk-R4OCGPSH.js} +2 -2
  167. package/dist/{chunk-LCU5R6TQ.js → chunk-RAIUTAZZ.js} +22 -3
  168. package/dist/chunk-RAIUTAZZ.js.map +1 -0
  169. package/dist/chunk-RIAM7DND.js +167 -0
  170. package/dist/chunk-RIAM7DND.js.map +1 -0
  171. package/dist/{chunk-VZVP2W4O.js → chunk-RK4WXUI2.js} +2 -2
  172. package/dist/{chunk-JBPKEARU.js → chunk-RKNJBZ55.js} +4 -4
  173. package/dist/{chunk-6L27N6YI.js → chunk-S7Q5CM7E.js} +2 -2
  174. package/dist/{chunk-CTQRPANJ.js → chunk-SVSRPG6M.js} +2 -2
  175. package/dist/{chunk-GXWDWOWP.js → chunk-TDKSCV62.js} +2 -2
  176. package/dist/{chunk-S2VBSTTA.js → chunk-THG4GYIE.js} +2 -2
  177. package/dist/{chunk-IXRC7EQG.js → chunk-TR7DGXGI.js} +2 -2
  178. package/dist/{chunk-63FHSH7E.js → chunk-TYUS5TLG.js} +4 -4
  179. package/dist/{chunk-7PWWGYGO.js → chunk-URHCUXKI.js} +2 -2
  180. package/dist/{chunk-Z54TXZ2F.js → chunk-VA5KMSAE.js} +16 -7
  181. package/dist/chunk-VA5KMSAE.js.map +1 -0
  182. package/dist/{chunk-KQAFEZQX.js → chunk-VDX2J7OX.js} +2 -2
  183. package/dist/{chunk-MUJ4QFUQ.js → chunk-W4BMEGQA.js} +4 -4
  184. package/dist/{chunk-5HK3CJAR.js → chunk-W675UJCZ.js} +2 -2
  185. package/dist/{chunk-3PXVYJMC.js → chunk-WN5FSGLE.js} +2077 -215
  186. package/dist/chunk-WN5FSGLE.js.map +1 -0
  187. package/dist/{chunk-3RHFGGI5.js → chunk-YF6UHWOV.js} +30 -10
  188. package/dist/chunk-YF6UHWOV.js.map +1 -0
  189. package/dist/{chunk-X5SDZMO7.js → chunk-YHCBJULX.js} +2 -2
  190. package/dist/{chunk-5UYSCYR7.js → chunk-Z4RPXHJH.js} +4 -4
  191. package/dist/{cli-Pulnz-qm.d.ts → cli-ChKeYMZv.d.ts} +5 -5
  192. package/dist/cli.d.ts +25 -25
  193. package/dist/cli.js +81 -78
  194. package/dist/coding/pre-action-gate.d.ts +2 -60
  195. package/dist/compounding/engine.d.ts +4 -2
  196. package/dist/compounding/engine.js +17 -16
  197. package/dist/compounding/preference-consolidator.d.ts +3 -1
  198. package/dist/compression-optimizer.d.ts +3 -1
  199. package/dist/config.d.ts +3 -1
  200. package/dist/config.js +11 -1
  201. package/dist/connectors/codex-materialize-runner.d.ts +3 -1
  202. package/dist/connectors/codex-materialize-runner.js +16 -15
  203. package/dist/connectors/codex-materialize.d.ts +3 -1
  204. package/dist/connectors/index.d.ts +3 -1
  205. package/dist/connectors/index.js +16 -15
  206. package/dist/consolidation-provenance-check.d.ts +4 -2
  207. package/dist/consolidation-undo.d.ts +4 -2
  208. package/dist/contradiction/index.d.ts +10 -270
  209. package/dist/contradiction/index.js +20 -7
  210. package/dist/{contradiction-review-QKJH5DKD.js → contradiction-review-WRVLRWHS.js} +6 -2
  211. package/dist/{contradiction-scan-VOTQRRSX.js → contradiction-scan-AKUWPX5N.js} +5 -3
  212. package/dist/converge-config.d.ts +3 -1
  213. package/dist/convergence-refresh.d.ts +4 -2
  214. package/dist/convergence-refresh.js +18 -17
  215. package/dist/conversation-index/backend.d.ts +3 -1
  216. package/dist/conversation-index/chunker.d.ts +3 -1
  217. package/dist/conversation-index/faiss-adapter.d.ts +3 -1
  218. package/dist/conversation-index/indexer.d.ts +3 -1
  219. package/dist/conversation-index/search.d.ts +3 -1
  220. package/dist/corpus-watermark.d.ts +3 -1
  221. package/dist/corpus-watermark.js +18 -17
  222. package/dist/cross-lingual-recall.d.ts +3 -1
  223. package/dist/day-summary.d.ts +3 -1
  224. package/dist/delinearize.d.ts +3 -1
  225. package/dist/dependency-propagation-config.d.ts +3 -1
  226. package/dist/{dependency-propagation-delivery-Co17gxYb.d.ts → dependency-propagation-delivery-B8ZMBBCY.d.ts} +1 -1
  227. package/dist/direct-answer-wiring.d.ts +3 -1
  228. package/dist/direct-answer.d.ts +3 -1
  229. package/dist/embedding-fallback.d.ts +3 -1
  230. package/dist/enrichment/index.d.ts +3 -1
  231. package/dist/entity-origin-fields.d.ts +3 -1
  232. package/dist/entity-retrieval.d.ts +4 -2
  233. package/dist/entity-retrieval.js +16 -15
  234. package/dist/entity-schema.d.ts +3 -1
  235. package/dist/episodic-context.d.ts +3 -1
  236. package/dist/explicit-capture.d.ts +12 -12
  237. package/dist/explicit-capture.js +7 -6
  238. package/dist/external-wiki-access.d.ts +41 -42
  239. package/dist/external-wiki-access.js +37 -36
  240. package/dist/external-wiki-collection-registration.d.ts +3 -1
  241. package/dist/external-wiki-collection.d.ts +3 -1
  242. package/dist/external-wiki-mcp-tools.d.ts +40 -40
  243. package/dist/extraction-error-classification.d.ts +3 -1
  244. package/dist/extraction-faithfulness.d.ts +3 -1
  245. package/dist/extraction-judge-telemetry.d.ts +3 -1
  246. package/dist/extraction-judge-training.d.ts +3 -1
  247. package/dist/extraction-judge.d.ts +3 -1
  248. package/dist/extraction-judge.js +2 -2
  249. package/dist/extraction-liveness.d.ts +3 -1
  250. package/dist/extraction-normalization.d.ts +3 -1
  251. package/dist/extraction-normalization.js +2 -2
  252. package/dist/extraction-prompt.d.ts +4 -2
  253. package/dist/extraction-prompt.js +1 -1
  254. package/dist/extraction-source-grounding-rules.d.ts +3 -1
  255. package/dist/extraction-source-grounding.d.ts +3 -1
  256. package/dist/extraction.d.ts +3 -1
  257. package/dist/extraction.js +22 -21
  258. package/dist/fallback-llm.d.ts +3 -1
  259. package/dist/graph-dashboard-diff.d.ts +3 -1
  260. package/dist/graph-dashboard-key.d.ts +3 -1
  261. package/dist/graph-dashboard-parser.d.ts +3 -1
  262. package/dist/graph-edge-reinforcement.d.ts +3 -1
  263. package/dist/graph-path-reconstruction.d.ts +3 -1
  264. package/dist/graph-path-scoring.d.ts +3 -1
  265. package/dist/graph-snapshot.d.ts +3 -1
  266. package/dist/graph.d.ts +3 -1
  267. package/dist/harmonic-retrieval.js +1 -1
  268. package/dist/importance.d.ts +3 -1
  269. package/dist/importers/index.d.ts +3 -1
  270. package/dist/in-flight-reads.d.ts +3 -1
  271. package/dist/index-CexDrJzC.d.ts +284 -0
  272. package/dist/index.d.ts +946 -707
  273. package/dist/index.js +253 -151
  274. package/dist/intent.d.ts +3 -1
  275. package/dist/lcm/engine.d.ts +3 -1
  276. package/dist/lcm/engine.js +3 -3
  277. package/dist/lcm/index.d.ts +3 -1
  278. package/dist/lcm/index.js +6 -6
  279. package/dist/lcm/tools.d.ts +3 -1
  280. package/dist/lifecycle.d.ts +3 -1
  281. package/dist/live-connectors-runner.d.ts +3 -1
  282. package/dist/local-llm.d.ts +3 -1
  283. package/dist/local-model-endpoint.d.ts +3 -1
  284. package/dist/maintenance/memory-governance.d.ts +3 -1
  285. package/dist/maintenance/memory-governance.js +16 -15
  286. package/dist/maintenance/rebuild-memory-lifecycle-ledger.d.ts +4 -2
  287. package/dist/maintenance/rebuild-memory-lifecycle-ledger.js +16 -15
  288. package/dist/maintenance/rebuild-memory-projection.d.ts +4 -2
  289. package/dist/maintenance/rebuild-memory-projection.js +17 -16
  290. package/dist/{maintenance-DiSLtVN7.d.ts → maintenance-nkdtSrVr.d.ts} +3 -3
  291. package/dist/mcp-memory-inspector-app.d.ts +37 -37
  292. package/dist/mcp-read-only-tools.js +1 -1
  293. package/dist/memory-action-policy.d.ts +3 -1
  294. package/dist/memory-cache.d.ts +3 -1
  295. package/dist/memory-lifecycle-ledger-utils.d.ts +3 -1
  296. package/dist/memory-projection-store.d.ts +3 -1
  297. package/dist/memory-provenance.d.ts +3 -1
  298. package/dist/memory-snapshot.d.ts +3 -1
  299. package/dist/memory-subject-cli.d.ts +177 -0
  300. package/dist/memory-subject-cli.js +16 -0
  301. package/dist/memory-subject.d.ts +128 -0
  302. package/dist/memory-subject.js +44 -0
  303. package/dist/memory-subject.js.map +1 -0
  304. package/dist/memory-worth-outcomes.d.ts +7 -4
  305. package/dist/memory-worth-outcomes.js +1 -1
  306. package/dist/models-json.d.ts +3 -1
  307. package/dist/namespaces/migrate.d.ts +5 -3
  308. package/dist/namespaces/migrate.js +17 -16
  309. package/dist/namespaces/principal.d.ts +3 -1
  310. package/dist/namespaces/search.d.ts +3 -1
  311. package/dist/namespaces/search.js +6 -6
  312. package/dist/namespaces/storage.d.ts +5 -3
  313. package/dist/namespaces/storage.js +16 -15
  314. package/dist/native-knowledge.d.ts +3 -1
  315. package/dist/offline-sync-impression-drain.d.ts +3 -1
  316. package/dist/operator-doctor-corpus.d.ts +3 -1
  317. package/dist/operator-doctor-corpus.js +19 -18
  318. package/dist/operator-doctor-replica.d.ts +3 -1
  319. package/dist/operator-toolkit.d.ts +5 -3
  320. package/dist/operator-toolkit.js +29 -24
  321. package/dist/orchestration/compression-guideline-coordinator.d.ts +4 -2
  322. package/dist/orchestration/maintenance.d.ts +6 -4
  323. package/dist/orchestration/maintenance.js +22 -21
  324. package/dist/{orchestrator-DzCaxNS4.d.ts → orchestrator-Bvq1-RQs.d.ts} +23 -9
  325. package/dist/orchestrator.d.ts +12 -12
  326. package/dist/orchestrator.js +111 -108
  327. package/dist/patterns-cli.d.ts +3 -1
  328. package/dist/{pipeline-HJ8DKbFl.d.ts → pipeline-C8vfIiTX.d.ts} +1 -1
  329. package/dist/policy-runtime.d.ts +3 -1
  330. package/dist/proactive-contention.d.ts +3 -1
  331. package/dist/provenance.d.ts +3 -1
  332. package/dist/{public-http-DwXauTX3.d.ts → public-http-Cy0aYbys.d.ts} +1 -1
  333. package/dist/{qmd-BzxluoLt.d.ts → qmd-B9p1SZTZ.d.ts} +1 -1
  334. package/dist/qmd-preflight.d.ts +4 -2
  335. package/dist/qmd-recall-cache.d.ts +3 -1
  336. package/dist/qmd.d.ts +4 -2
  337. package/dist/qmd.js +4 -4
  338. package/dist/recall-concurrency-config.d.ts +3 -1
  339. package/dist/recall-disclosure-escalation.d.ts +3 -1
  340. package/dist/recall-explain-renderer.d.ts +3 -1
  341. package/dist/recall-explain-renderer.js +3 -3
  342. package/dist/recall-memory-map.d.ts +3 -1
  343. package/dist/recall-planner-llm.d.ts +3 -1
  344. package/dist/recall-state.d.ts +3 -1
  345. package/dist/recall-tag-filter.d.ts +3 -1
  346. package/dist/recall-timings.d.ts +3 -1
  347. package/dist/recall-xray-cli.d.ts +3 -1
  348. package/dist/recall-xray-cli.js +4 -4
  349. package/dist/recall-xray-renderer.d.ts +3 -1
  350. package/dist/recall-xray-renderer.js +3 -3
  351. package/dist/recall-xray.d.ts +3 -1
  352. package/dist/recall-xray.js +2 -2
  353. package/dist/reconcile/cursor.d.ts +3 -1
  354. package/dist/reconcile/manifest.d.ts +3 -1
  355. package/dist/reconcile/manifest.js +3 -3
  356. package/dist/reconcile/plan.d.ts +3 -1
  357. package/dist/replay/normalizers/chatgpt.d.ts +3 -1
  358. package/dist/replay/normalizers/claude.d.ts +3 -1
  359. package/dist/replay/normalizers/openclaw.d.ts +3 -1
  360. package/dist/replay/normalizers/shared.d.ts +3 -1
  361. package/dist/replay/runner.d.ts +3 -1
  362. package/dist/replay/types.d.ts +3 -1
  363. package/dist/replica-divergence.d.ts +3 -1
  364. package/dist/replica-peers-config.d.ts +3 -1
  365. package/dist/resolution-4552BNRV.js +36 -0
  366. package/dist/resolution-4552BNRV.js.map +1 -0
  367. package/dist/resolve-auth-token.d.ts +3 -1
  368. package/dist/resume-bundles.js +9 -2
  369. package/dist/retrieval-agents.d.ts +4 -2
  370. package/dist/retrieval-tiers.d.ts +3 -1
  371. package/dist/routing/engine.d.ts +3 -1
  372. package/dist/routing/store.d.ts +3 -1
  373. package/dist/salvage-envelope.d.ts +3 -1
  374. package/dist/salvage-envelope.js +10 -2
  375. package/dist/schemas.d.ts +130 -116
  376. package/dist/schemas.js +1 -1
  377. package/dist/{scope-profiles-CEMZz0t5.d.ts → scope-profiles-DLrRxFWR.d.ts} +1 -1
  378. package/dist/search/embed-helper.d.ts +3 -1
  379. package/dist/search/factory.d.ts +3 -1
  380. package/dist/search/factory.js +5 -5
  381. package/dist/search/index.d.ts +3 -1
  382. package/dist/search/index.js +9 -9
  383. package/dist/search/lancedb-backend.d.ts +3 -1
  384. package/dist/search/meilisearch-backend.d.ts +3 -1
  385. package/dist/search/noop-backend.d.ts +3 -1
  386. package/dist/search/orama-backend.d.ts +3 -1
  387. package/dist/search/port.d.ts +3 -1
  388. package/dist/search/remote-backend.d.ts +3 -1
  389. package/dist/{semantic-TddhF0y7.d.ts → semantic-BalR6EXU.d.ts} +1 -1
  390. package/dist/{semantic-consolidation-D9dYj6vu.d.ts → semantic-consolidation-DlN6xe20.d.ts} +1 -1
  391. package/dist/semantic-consolidation.d.ts +4 -2
  392. package/dist/semantic-consolidation.js +17 -16
  393. package/dist/semantic-rule-promotion.js +16 -15
  394. package/dist/semantic-rule-verifier.d.ts +3 -1
  395. package/dist/semantic-rule-verifier.js +16 -15
  396. package/dist/{service-_qgST_0y.d.ts → service-GkYyVfm9.d.ts} +2 -2
  397. package/dist/session-observer-bands.d.ts +3 -1
  398. package/dist/session-observer-state.d.ts +3 -1
  399. package/dist/shared-context/manager.d.ts +13 -11
  400. package/dist/signal.d.ts +3 -1
  401. package/dist/source-agent-qualifier.d.ts +3 -1
  402. package/dist/source-agent-qualifier.js +18 -17
  403. package/dist/{storage-B9lbNTYE.d.ts → storage-BIDzuKIn.d.ts} +3 -2
  404. package/dist/storage.d.ts +4 -2
  405. package/dist/storage.js +18 -17
  406. package/dist/subject-config.d.ts +40 -0
  407. package/dist/subject-config.js +20 -0
  408. package/dist/subject-config.js.map +1 -0
  409. package/dist/summarizer.d.ts +3 -1
  410. package/dist/summary-snapshot.d.ts +3 -1
  411. package/dist/support-passport/index.d.ts +43 -43
  412. package/dist/support-passport/index.js +39 -38
  413. package/dist/temporal-supersession.d.ts +4 -2
  414. package/dist/temporal-timeline-recall.d.ts +3 -1
  415. package/dist/temporal-validity.d.ts +3 -1
  416. package/dist/threading.d.ts +3 -1
  417. package/dist/tier-migration.d.ts +4 -2
  418. package/dist/tier-routing.d.ts +3 -1
  419. package/dist/topics.d.ts +3 -1
  420. package/dist/transcript.d.ts +3 -1
  421. package/dist/transfer/backup.js +2 -2
  422. package/dist/transfer/capsule-export.js +2 -2
  423. package/dist/transfer/capsule-import.js +2 -2
  424. package/dist/transfer/types.d.ts +86 -86
  425. package/dist/trust-score-stage.d.ts +3 -1
  426. package/dist/trust-score.d.ts +3 -1
  427. package/dist/{types-BrEzuxPA.d.ts → types-BxAcOl5Q.d.ts} +360 -32
  428. package/dist/types.d.ts +3 -1
  429. package/dist/types.js +1 -1
  430. package/dist/utility-runtime.d.ts +3 -1
  431. package/dist/verified-recall.js +16 -15
  432. package/dist/who-knows-cli.d.ts +40 -40
  433. package/dist/who-knows-cli.js +17 -16
  434. package/dist/who-knows.d.ts +42 -42
  435. package/dist/who-knows.js +16 -15
  436. package/dist/write-envelope.d.ts +7 -2
  437. package/dist/write-envelope.js +10 -1
  438. package/package.json +2 -2
  439. package/scripts/build-with-heap.mjs +1 -1
  440. package/src/access-boundary.ts +6 -0
  441. package/src/access-http.ts +6 -5
  442. package/src/access-mcp-admin-tools.ts +38 -0
  443. package/src/access-mcp-output-schemas.ts +20 -0
  444. package/src/access-mcp.ts +8 -8
  445. package/src/access-operations-batch.ts +13 -0
  446. package/src/access-service.ts +112 -0
  447. package/src/access-surface-catalog.test.ts +24 -0
  448. package/src/access-surface-catalog.ts +6 -0
  449. package/src/coding/action-gate.test.ts +341 -0
  450. package/src/coding/action-gate.ts +556 -0
  451. package/src/config.ts +15 -17
  452. package/src/contradiction/contradiction-review.ts +50 -4
  453. package/src/contradiction/contradiction-scan.ts +14 -3
  454. package/src/contradiction/resolution.ts +50 -2
  455. package/src/extraction-prompt.ts +1 -0
  456. package/src/extraction.ts +4 -1
  457. package/src/index.ts +9 -9
  458. package/src/mcp-read-only-tools.ts +1 -0
  459. package/src/memory-subject-cli.ts +135 -0
  460. package/src/memory-subject.test.ts +48 -0
  461. package/src/memory-subject.ts +314 -0
  462. package/src/memory-worth-outcomes.test.ts +6 -2
  463. package/src/memory-worth-outcomes.ts +11 -7
  464. package/src/operator-toolkit.ts +1 -1
  465. package/src/orchestration/extraction-persist.ts +48 -48
  466. package/src/orchestration/recall-internal.ts +6 -5
  467. package/src/orchestration/recall-rerank-coordinator.ts +123 -4
  468. package/src/orchestration/recall-result-formatter.ts +6 -2
  469. package/src/orchestration/recall-search-pipeline.ts +14 -1
  470. package/src/preferences/drift-config.ts +118 -0
  471. package/src/preferences/drift-recall.ts +133 -0
  472. package/src/preferences/drift-types.ts +87 -0
  473. package/src/preferences/index.ts +12 -0
  474. package/src/preferences/preference-drift.test.ts +690 -0
  475. package/src/preferences/preference-drift.ts +724 -0
  476. package/src/procedural/library-maintenance.test.ts +582 -0
  477. package/src/procedural/library-maintenance.ts +546 -0
  478. package/src/procedural/maintenance-config.ts +78 -0
  479. package/src/procedural/procedure-recall.ts +29 -1
  480. package/src/procedural/procedure-stats.ts +20 -0
  481. package/src/review/review-deck-access.test.ts +325 -0
  482. package/src/review/review-deck-http-base.ts +133 -0
  483. package/src/review/review-deck-mutation.test.ts +417 -0
  484. package/src/review/review-deck-mutation.ts +677 -0
  485. package/src/review/review-deck-snapshot.ts +196 -0
  486. package/src/review/review-deck-surface.ts +117 -0
  487. package/src/review/review-deck.test.ts +347 -0
  488. package/src/review/review-deck.ts +311 -0
  489. package/src/schemas.ts +7 -0
  490. package/src/spaces/index.ts +38 -2
  491. package/src/storage.ts +10 -8
  492. package/src/subject-config.ts +80 -0
  493. package/src/types.ts +33 -32
  494. package/src/write-envelope.test.ts +14 -0
  495. package/src/write-envelope.ts +24 -3
  496. package/dist/chunk-35NN3ZFA.js.map +0 -1
  497. package/dist/chunk-3PXVYJMC.js.map +0 -1
  498. package/dist/chunk-3RHFGGI5.js.map +0 -1
  499. package/dist/chunk-4NZHHGVL.js.map +0 -1
  500. package/dist/chunk-CEQF6L5K.js.map +0 -1
  501. package/dist/chunk-CUS6S7PN.js.map +0 -1
  502. package/dist/chunk-DBXZZIDU.js.map +0 -1
  503. package/dist/chunk-DEFI2QBT.js.map +0 -1
  504. package/dist/chunk-EIR5VLIH.js.map +0 -1
  505. package/dist/chunk-GEULB2VI.js.map +0 -1
  506. package/dist/chunk-JFJ3MHGV.js.map +0 -1
  507. package/dist/chunk-JG22O53B.js.map +0 -1
  508. package/dist/chunk-LCU5R6TQ.js.map +0 -1
  509. package/dist/chunk-MDVBCPOS.js +0 -402
  510. package/dist/chunk-MDVBCPOS.js.map +0 -1
  511. package/dist/chunk-MSTNSVXI.js.map +0 -1
  512. package/dist/chunk-WTOE7CW4.js.map +0 -1
  513. package/dist/chunk-YQ3CBLL4.js.map +0 -1
  514. package/dist/chunk-Z54TXZ2F.js.map +0 -1
  515. package/dist/resolution-DKMBPXHI.js +0 -18
  516. /package/dist/{capsule-crypto-7FJQINUR.js.map → capsule-crypto-YO5QJ6L3.js.map} +0 -0
  517. /package/dist/{chunk-MIBKEW7A.js.map → chunk-2VXWFYJE.js.map} +0 -0
  518. /package/dist/{chunk-3YTTAGPB.js.map → chunk-3DVBKTSO.js.map} +0 -0
  519. /package/dist/{chunk-JTSVMJHV.js.map → chunk-4XDGYCZI.js.map} +0 -0
  520. /package/dist/{chunk-HQSBYI5X.js.map → chunk-57HVIG5U.js.map} +0 -0
  521. /package/dist/{chunk-PMVPCZJZ.js.map → chunk-6433HV72.js.map} +0 -0
  522. /package/dist/{chunk-N6TRHP72.js.map → chunk-6TAX66IA.js.map} +0 -0
  523. /package/dist/{chunk-AGKIG3YA.js.map → chunk-6VALIZKG.js.map} +0 -0
  524. /package/dist/{chunk-NS5ETDYD.js.map → chunk-7BEPVIH3.js.map} +0 -0
  525. /package/dist/{chunk-LYIZXQYY.js.map → chunk-7KFIMGMP.js.map} +0 -0
  526. /package/dist/{chunk-LWVO2QZV.js.map → chunk-7QOO4LGC.js.map} +0 -0
  527. /package/dist/{chunk-CCTVAVTT.js.map → chunk-AUO2LJ3K.js.map} +0 -0
  528. /package/dist/{chunk-ALCJRQ72.js.map → chunk-AYDDB3XI.js.map} +0 -0
  529. /package/dist/{chunk-3TMYV3LP.js.map → chunk-AYYGRVRP.js.map} +0 -0
  530. /package/dist/{chunk-W6TSGWYS.js.map → chunk-AZAA5DNP.js.map} +0 -0
  531. /package/dist/{chunk-6JJT5AKI.js.map → chunk-BQUEAVNW.js.map} +0 -0
  532. /package/dist/{chunk-2NLLXCJG.js.map → chunk-BXLOS5AJ.js.map} +0 -0
  533. /package/dist/{chunk-CEH2AFXG.js.map → chunk-C24UZSFW.js.map} +0 -0
  534. /package/dist/{chunk-ZPN7W3OP.js.map → chunk-CDUUDBWJ.js.map} +0 -0
  535. /package/dist/{chunk-Y23B2QXP.js.map → chunk-D27J626P.js.map} +0 -0
  536. /package/dist/{chunk-2572MRP2.js.map → chunk-DHTQP334.js.map} +0 -0
  537. /package/dist/{chunk-HJQZQUPC.js.map → chunk-DJZWNKFO.js.map} +0 -0
  538. /package/dist/{chunk-X7Y7WX73.js.map → chunk-DQEMWVMT.js.map} +0 -0
  539. /package/dist/{chunk-VJ6ECBIP.js.map → chunk-E4MVQQVX.js.map} +0 -0
  540. /package/dist/{chunk-SYJ6EKKE.js.map → chunk-EIVIB73I.js.map} +0 -0
  541. /package/dist/{chunk-HUNSEO5U.js.map → chunk-EV3YFLCB.js.map} +0 -0
  542. /package/dist/{chunk-VPGRXEAB.js.map → chunk-G57LQRP6.js.map} +0 -0
  543. /package/dist/{chunk-BC4QD3FM.js.map → chunk-GN55KU2P.js.map} +0 -0
  544. /package/dist/{chunk-4W6INNXO.js.map → chunk-GUXS322H.js.map} +0 -0
  545. /package/dist/{chunk-3MADV4YC.js.map → chunk-IQSC3V2E.js.map} +0 -0
  546. /package/dist/{chunk-UYCIS6V5.js.map → chunk-JCWY73FK.js.map} +0 -0
  547. /package/dist/{chunk-T42L3S6A.js.map → chunk-LBWQ65SX.js.map} +0 -0
  548. /package/dist/{chunk-256FBCVX.js.map → chunk-M4AHBM72.js.map} +0 -0
  549. /package/dist/{chunk-YEQEGSJA.js.map → chunk-MBDJJTAT.js.map} +0 -0
  550. /package/dist/{chunk-IAY7YBXS.js.map → chunk-MRTUN665.js.map} +0 -0
  551. /package/dist/{chunk-R3AAOKR2.js.map → chunk-NZWEEALH.js.map} +0 -0
  552. /package/dist/{chunk-I2HTKOOP.js.map → chunk-ODZG724P.js.map} +0 -0
  553. /package/dist/{chunk-7QFBLYFP.js.map → chunk-OJD4WS2E.js.map} +0 -0
  554. /package/dist/{chunk-53ENM6F6.js.map → chunk-P4DHENRE.js.map} +0 -0
  555. /package/dist/{chunk-KPBLJCCV.js.map → chunk-PDVQ5JU3.js.map} +0 -0
  556. /package/dist/{chunk-ESCQ6LY7.js.map → chunk-QFMO32TO.js.map} +0 -0
  557. /package/dist/{chunk-HQSPXTQO.js.map → chunk-QXIQPCCN.js.map} +0 -0
  558. /package/dist/{chunk-CFRBTATE.js.map → chunk-R47WINCY.js.map} +0 -0
  559. /package/dist/{chunk-G72IPMR7.js.map → chunk-R4OCGPSH.js.map} +0 -0
  560. /package/dist/{chunk-VZVP2W4O.js.map → chunk-RK4WXUI2.js.map} +0 -0
  561. /package/dist/{chunk-JBPKEARU.js.map → chunk-RKNJBZ55.js.map} +0 -0
  562. /package/dist/{chunk-6L27N6YI.js.map → chunk-S7Q5CM7E.js.map} +0 -0
  563. /package/dist/{chunk-CTQRPANJ.js.map → chunk-SVSRPG6M.js.map} +0 -0
  564. /package/dist/{chunk-GXWDWOWP.js.map → chunk-TDKSCV62.js.map} +0 -0
  565. /package/dist/{chunk-S2VBSTTA.js.map → chunk-THG4GYIE.js.map} +0 -0
  566. /package/dist/{chunk-IXRC7EQG.js.map → chunk-TR7DGXGI.js.map} +0 -0
  567. /package/dist/{chunk-63FHSH7E.js.map → chunk-TYUS5TLG.js.map} +0 -0
  568. /package/dist/{chunk-7PWWGYGO.js.map → chunk-URHCUXKI.js.map} +0 -0
  569. /package/dist/{chunk-KQAFEZQX.js.map → chunk-VDX2J7OX.js.map} +0 -0
  570. /package/dist/{chunk-MUJ4QFUQ.js.map → chunk-W4BMEGQA.js.map} +0 -0
  571. /package/dist/{chunk-5HK3CJAR.js.map → chunk-W675UJCZ.js.map} +0 -0
  572. /package/dist/{chunk-X5SDZMO7.js.map → chunk-YHCBJULX.js.map} +0 -0
  573. /package/dist/{chunk-5UYSCYR7.js.map → chunk-Z4RPXHJH.js.map} +0 -0
  574. /package/dist/{contradiction-review-QKJH5DKD.js.map → contradiction-review-WRVLRWHS.js.map} +0 -0
  575. /package/dist/{contradiction-scan-VOTQRRSX.js.map → contradiction-scan-AKUWPX5N.js.map} +0 -0
  576. /package/dist/{resolution-DKMBPXHI.js.map → memory-subject-cli.js.map} +0 -0
@@ -24,6 +24,11 @@ import {
24
24
  buildMemoryWorthCounterMap,
25
25
  type MemoryWorthCounters,
26
26
  } from "../memory-worth-filter.js";
27
+ import {
28
+ applyPreferenceDriftRanking,
29
+ isPreferenceDriftStageActive,
30
+ type DriftRecallFrontmatter,
31
+ } from "../preferences/drift-recall.js";
27
32
  import {
28
33
  applyTrustScoreStage,
29
34
  buildTrustSignalsForRerank,
@@ -470,9 +475,16 @@ export class RecallRerankCoordinator {
470
475
  results: QmdSearchResult[];
471
476
  trustByPath: Map<string, TrustStageResultItem> | null;
472
477
  }> {
478
+ // The trust stage and the Memory Worth multiplier are mutually exclusive
479
+ // (rule 39); the preference-drift stage runs AFTER whichever one applied,
480
+ // on every branch, so its gate is uniform across recall paths (§27).
481
+ let staged = results;
482
+ let trustByPath: Map<string, TrustStageResultItem> | null = null;
473
483
  if (caps.recallTrustScore && results.length > 0) {
474
484
  try {
475
- return await this.applyTrustScoreRerank(results, namespaces, preloadedFrontmatter, abortSignal);
485
+ const outcome = await this.applyTrustScoreRerank(results, namespaces, preloadedFrontmatter, abortSignal);
486
+ staged = outcome.results;
487
+ trustByPath = outcome.trustByPath;
476
488
  } catch (err) {
477
489
  log.debug(`trust-score stage (${label}) failed open`, {
478
490
  error: (err as Error).message,
@@ -480,20 +492,127 @@ export class RecallRerankCoordinator {
480
492
  }
481
493
  } else if (caps.recallMemoryWorthFilter && results.length > 0) {
482
494
  try {
483
- const filtered = await this.applyMemoryWorthRerank(
495
+ staged = await this.applyMemoryWorthRerank(
484
496
  results,
485
497
  namespaces,
486
498
  preloadedFrontmatter,
487
499
  abortSignal,
488
500
  );
489
- return { results: filtered, trustByPath: null };
490
501
  } catch (err) {
491
502
  log.debug(`memory-worth filter (${label}) failed open`, {
492
503
  error: (err as Error).message,
493
504
  });
494
505
  }
495
506
  }
496
- return { results, trustByPath: null };
507
+ const damped = await this.applyPreferenceDriftStage(
508
+ staged,
509
+ namespaces,
510
+ preloadedFrontmatter,
511
+ abortSignal,
512
+ );
513
+ return { results: damped, trustByPath };
514
+ }
515
+
516
+ /**
517
+ * Issue #2371 — stale-preference damping + injection annotation.
518
+ *
519
+ * Runs immediately after the trust/Memory-Worth stage on EVERY recall branch
520
+ * (hot QMD, embedding fallback, recent scan, cold fallback), so the feature
521
+ * gate applies uniformly and fallback parity holds (§27, AGENTS.md retrieval
522
+ * guardrails). Fully inert on the default config: when neither damping nor
523
+ * annotation is active the input array is returned untouched and NO
524
+ * frontmatter is read, so recall ordering and injected text stay
525
+ * byte-identical to pre-#2371.
526
+ *
527
+ * Fail-open: any lookup error leaves the branch's results unchanged.
528
+ */
529
+ async applyPreferenceDriftStage(
530
+ results: QmdSearchResult[],
531
+ namespaces: string[],
532
+ preloadedFrontmatter?: ReadonlyMap<string, MemoryFile>,
533
+ abortSignal?: AbortSignal,
534
+ ): Promise<QmdSearchResult[]> {
535
+ const config = this.getConfig();
536
+ if (!isPreferenceDriftStageActive(config.driftDetection)) return results;
537
+ if (results.length === 0) return results;
538
+
539
+ try {
540
+ const frontmatterByKey = new Map<string, DriftRecallFrontmatter>();
541
+ const missing: QmdSearchResult[] = [];
542
+ for (const r of results) {
543
+ const key = memoryMapKey(r);
544
+ const preloaded = preloadedFrontmatter?.get(key) ?? preloadedFrontmatter?.get(r.path);
545
+ if (preloaded) {
546
+ frontmatterByKey.set(key, preloaded.frontmatter);
547
+ } else {
548
+ missing.push(r);
549
+ }
550
+ }
551
+
552
+ // Branches without a preloaded map (embedding fallback) read the
553
+ // candidates directly. Bounded-parallel at the same batch size the
554
+ // Memory Worth stage uses, and only for the handful of candidates the
555
+ // branch actually returned — never a corpus scan.
556
+ if (missing.length > 0) {
557
+ let reader: StorageManager | null = null;
558
+ for (const ns of namespaces) {
559
+ try {
560
+ reader = await this.getStorage(ns);
561
+ break;
562
+ } catch {
563
+ // try next namespace
564
+ }
565
+ }
566
+ if (reader) {
567
+ const readerNn = reader;
568
+ const BATCH = 16;
569
+ for (let off = 0; off < missing.length; off += BATCH) {
570
+ if (abortSignal?.aborted) break;
571
+ await Promise.all(
572
+ missing.slice(off, off + BATCH).map(async (r) => {
573
+ try {
574
+ const memory = await this.readQmdResultMemory(r.path, readerNn, namespaces, r.namespace);
575
+ if (memory) frontmatterByKey.set(memoryMapKey(r), memory.frontmatter);
576
+ } catch (err) {
577
+ log.debug("preference-drift: direct path lookup failed", {
578
+ path: r.path,
579
+ error: (err as Error).message,
580
+ });
581
+ }
582
+ }),
583
+ );
584
+ }
585
+ }
586
+ }
587
+
588
+ // Synthetic monotone-decreasing rank score so neutral candidates keep
589
+ // their upstream order and only the damped ones move — same technique the
590
+ // Memory Worth stage uses, for the same reason.
591
+ const ranked = results.map((r, i) => ({
592
+ key: memoryMapKey(r),
593
+ rank: results.length - i,
594
+ frontmatter: frontmatterByKey.get(memoryMapKey(r)),
595
+ }));
596
+ const ordered = applyPreferenceDriftRanking(ranked, {
597
+ config: config.driftDetection,
598
+ now: new Date(),
599
+ });
600
+
601
+ const byKey = new Map(results.map((r) => [memoryMapKey(r), r]));
602
+ const reordered: QmdSearchResult[] = [];
603
+ for (const item of ordered) {
604
+ const original = byKey.get(item.key);
605
+ if (!original) continue;
606
+ // `driftNote` is copied onto a NEW result object — never mutated in
607
+ // place — so a shared upstream result can't leak an annotation into an
608
+ // unrelated branch.
609
+ reordered.push(item.note ? { ...original, driftNote: item.note } : original);
610
+ }
611
+ return reordered;
612
+ } catch (err) {
613
+ log.debug("preference-drift stage failed open", { error: (err as Error).message });
614
+ return results;
615
+ }
497
616
  }
498
617
 
499
618
  diversifyRecallResultsWithHeadroom(
@@ -230,14 +230,18 @@ export class RecallResultFormatter {
230
230
  const withHandle = handle ? `${head.trimEnd()} ${handle}` : head.trimEnd();
231
231
  const connectorLabel = renderConnectorLabel(r.sourceConnector);
232
232
  const withConnector = connectorLabel ? `${withHandle} [agent: ${connectorLabel}]` : withHandle;
233
+ // Preference age note (issue #2371). Set only when
234
+ // `driftDetection.annotateAfterDays` is on, so this suffix is absent —
235
+ // and the rendered line byte-identical to pre-#2371 — by default.
236
+ const withDrift = r.driftNote ? `${withConnector} ${r.driftNote}` : withConnector;
233
237
  if (hedgeMap) {
234
238
  const item = trustResultFor(hedgeMap, r);
235
239
  if (item) {
236
240
  const hedge = renderEpistemicHedge(item.trust);
237
- if (hedge.length > 0) return `${withConnector} ${hedge}`;
241
+ if (hedge.length > 0) return `${withDrift} ${hedge}`;
238
242
  }
239
243
  }
240
- return withConnector;
244
+ return withDrift;
241
245
  });
242
246
  return { heading: `## ${title}`, entries };
243
247
  }
@@ -113,7 +113,10 @@ export interface RecallSearchPipelineDeps {
113
113
  recallNamespaces: string[],
114
114
  ): Promise<QueryAwarePrefilter>;
115
115
  readonly config: PluginConfig;
116
- readonly recallRerankCoordinator: Pick<RecallRerankCoordinator, "diversifyRecallResultsWithHeadroom">;
116
+ readonly recallRerankCoordinator: Pick<
117
+ RecallRerankCoordinator,
118
+ "diversifyRecallResultsWithHeadroom" | "applyPreferenceDriftStage"
119
+ >;
117
120
  diversifyAndLimitRecallResults(
118
121
  sectionId: string,
119
122
  results: QmdSearchResult[],
@@ -954,6 +957,16 @@ export class RecallSearchPipelineCoordinator {
954
957
  });
955
958
  }
956
959
  }
960
+ // Cold fallback boosts inline rather than through applyTrustScoreToBranch,
961
+ // so the preference-drift stage is applied here explicitly — otherwise
962
+ // damping would silently not apply to this branch (§27 fallback parity).
963
+ if (results.length > 0) {
964
+ results = await this.deps.recallRerankCoordinator.applyPreferenceDriftStage(
965
+ results,
966
+ options.recallNamespaces,
967
+ boostInput.memoryByPath,
968
+ );
969
+ }
957
970
 
958
971
  if (options.xrayPoolSizeSink) {
959
972
  options.xrayPoolSizeSink.size = Math.max(
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Preference drift detection config (issue #2371).
3
+ *
4
+ * Standalone top-level block, parsed the same way `contradictionScan` and
5
+ * `procedural.maintenance` are: shape-validated, string-coercion safe (§24),
6
+ * and honoring documented zero/no-op values (§33) rather than clamping them
7
+ * to something non-zero.
8
+ */
9
+
10
+ import { coerceBool, coerceNumber } from "../connectors/coerce.js";
11
+
12
+ export interface DriftDetectionConfig {
13
+ /** Master switch for drift classification and its apply mode. Default false. */
14
+ enabled: boolean;
15
+ /** A preference younger than this is never a scan candidate. Default 60. */
16
+ minAgeDays: number;
17
+ /** Evidence-gathering window, in days back from the run instant. Default 45. */
18
+ lookbackDays: number;
19
+ /** Cap on preferences classified per run. `0` disables the scan entirely. Default 25. */
20
+ maxCandidatesPerRun: number;
21
+ /** When true, recall damps `driftState: stale` preferences. Default false. */
22
+ recallDamping: boolean;
23
+ /** Multiplier applied to stale preferences in (0, 1]; `1` is a documented no-op. Default 0.8. */
24
+ stalePenalty: number;
25
+ /** Annotate injected preferences uncorroborated for this many days. `0` = off. Default 0. */
26
+ annotateAfterDays: number;
27
+ }
28
+
29
+ export const DRIFT_DETECTION_DEFAULTS: DriftDetectionConfig = {
30
+ enabled: false,
31
+ minAgeDays: 60,
32
+ lookbackDays: 45,
33
+ maxCandidatesPerRun: 25,
34
+ recallDamping: false,
35
+ stalePenalty: 0.8,
36
+ annotateAfterDays: 0,
37
+ };
38
+
39
+ function parseFlag(src: Record<string, unknown>, key: string, fallback: boolean): boolean {
40
+ const value = src[key];
41
+ if (value === undefined || value === null) return fallback;
42
+ const coerced = coerceBool(value);
43
+ if (coerced === undefined) {
44
+ throw new Error(
45
+ `driftDetection.${key} must be a boolean or one of "true"/"false"/"1"/"0"/"yes"/"no"/"on"/"off" (got ${JSON.stringify(value)}).`,
46
+ );
47
+ }
48
+ return coerced;
49
+ }
50
+
51
+ function parseDayCount(src: Record<string, unknown>, key: string, fallback: number): number {
52
+ const value = src[key];
53
+ if (value === undefined || value === null) return fallback;
54
+ const coerced = coerceNumber(value);
55
+ if (coerced === undefined || !Number.isFinite(coerced)) {
56
+ throw new Error(`driftDetection.${key} must be a finite number (got ${JSON.stringify(value)}).`);
57
+ }
58
+ if (!Number.isInteger(coerced)) {
59
+ throw new Error(`driftDetection.${key} must be an integer (got ${JSON.stringify(value)}).`);
60
+ }
61
+ if (coerced < 0 || coerced > 36_500) {
62
+ throw new Error(`driftDetection.${key} must be between 0 and 36500 (got ${JSON.stringify(value)}).`);
63
+ }
64
+ return coerced;
65
+ }
66
+
67
+ export function parseDriftDetectionConfig(raw: unknown): DriftDetectionConfig {
68
+ if (raw === undefined || raw === null) return { ...DRIFT_DETECTION_DEFAULTS };
69
+ if (typeof raw !== "object" || Array.isArray(raw)) {
70
+ throw new Error(
71
+ `driftDetection must be an object (got ${JSON.stringify(raw)}). Omit the key to keep drift detection disabled (issue #2371).`,
72
+ );
73
+ }
74
+ const src = raw as Record<string, unknown>;
75
+
76
+ // `0` disables the scan and MUST survive as zero — the documented disable
77
+ // value, never coerced up to a minimum (§33).
78
+ const rawMax = src.maxCandidatesPerRun;
79
+ let maxCandidatesPerRun = DRIFT_DETECTION_DEFAULTS.maxCandidatesPerRun;
80
+ if (rawMax !== undefined && rawMax !== null) {
81
+ const coerced = coerceNumber(rawMax);
82
+ if (coerced === undefined || !Number.isInteger(coerced) || coerced < 0) {
83
+ throw new Error(
84
+ `driftDetection.maxCandidatesPerRun must be an integer >= 0 (got ${JSON.stringify(rawMax)}). Use 0 to disable the scan.`,
85
+ );
86
+ }
87
+ maxCandidatesPerRun = coerced;
88
+ }
89
+
90
+ // stalePenalty is a multiplier in (0, 1]. `1` is the documented no-op; `0`
91
+ // would erase a memory's rank entirely and is rejected rather than accepted
92
+ // as a silent "delete from recall".
93
+ const rawPenalty = src.stalePenalty;
94
+ let stalePenalty = DRIFT_DETECTION_DEFAULTS.stalePenalty;
95
+ if (rawPenalty !== undefined && rawPenalty !== null) {
96
+ const coerced = coerceNumber(rawPenalty);
97
+ if (coerced === undefined || !Number.isFinite(coerced) || coerced <= 0 || coerced > 1) {
98
+ throw new Error(
99
+ `driftDetection.stalePenalty must be a number in (0, 1] (got ${JSON.stringify(rawPenalty)}). Use 1 to disable damping without changing the flag.`,
100
+ );
101
+ }
102
+ stalePenalty = coerced;
103
+ }
104
+
105
+ return {
106
+ enabled: parseFlag(src, "enabled", DRIFT_DETECTION_DEFAULTS.enabled),
107
+ minAgeDays: parseDayCount(src, "minAgeDays", DRIFT_DETECTION_DEFAULTS.minAgeDays),
108
+ lookbackDays: parseDayCount(src, "lookbackDays", DRIFT_DETECTION_DEFAULTS.lookbackDays),
109
+ maxCandidatesPerRun,
110
+ recallDamping: parseFlag(src, "recallDamping", DRIFT_DETECTION_DEFAULTS.recallDamping),
111
+ stalePenalty,
112
+ annotateAfterDays: parseDayCount(
113
+ src,
114
+ "annotateAfterDays",
115
+ DRIFT_DETECTION_DEFAULTS.annotateAfterDays,
116
+ ),
117
+ };
118
+ }
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Stale-preference recall stage (issue #2371).
3
+ *
4
+ * Pure ranking + annotation helpers, deliberately free of storage, LLM, and
5
+ * config-loading imports so the recall hot path can import them without
6
+ * pulling in the drift scan's dependency graph.
7
+ *
8
+ * Two independent, independently-gated effects:
9
+ *
10
+ * 1. `driftDetection.recallDamping` multiplies the rank score of a
11
+ * `category: preference` memory carrying `driftState: stale` by
12
+ * `stalePenalty`, so a stale preference sinks below an otherwise-equal
13
+ * fresh memory. Applied in the same boost stage as the Memory Worth
14
+ * multiplier, so the pipeline-order contract (retrieve → filter →
15
+ * rerank/boost → cap → format) is untouched.
16
+ * 2. `driftDetection.annotateAfterDays` emits a compact age note for a
17
+ * preference whose last corroboration is older than the configured
18
+ * window. Formatting-stage only — it never mutates the stored memory.
19
+ *
20
+ * Both are off by default, and with both off this module returns the input
21
+ * order and no notes, so recall output is byte-identical to pre-#2371.
22
+ */
23
+
24
+ import type { DriftDetectionConfig } from "./drift-config.js";
25
+ import type { MemoryDriftState } from "./drift-types.js";
26
+
27
+ const DAY_MS = 24 * 60 * 60 * 1000;
28
+
29
+ /** The only frontmatter fields this stage reads. */
30
+ export interface DriftRecallFrontmatter {
31
+ category?: string;
32
+ driftState?: MemoryDriftState;
33
+ lastCorroborated?: string;
34
+ created?: string;
35
+ }
36
+
37
+ export interface DriftRankInput {
38
+ /** Opaque candidate identity — the caller's composite (namespace, path) key. */
39
+ key: string;
40
+ /** Monotone-decreasing rank score preserving upstream order. */
41
+ rank: number;
42
+ frontmatter?: DriftRecallFrontmatter;
43
+ }
44
+
45
+ export interface DriftRankOutput {
46
+ key: string;
47
+ /** `1` when untouched, `stalePenalty` when damped. */
48
+ multiplier: number;
49
+ /** Injection annotation, when the age gate fired. */
50
+ note?: string;
51
+ }
52
+
53
+ /**
54
+ * True when this stage would change nothing. Callers use it to skip the
55
+ * frontmatter lookups entirely on the default (all-off) configuration.
56
+ *
57
+ * `stalePenalty === 1` is the documented no-op (§33): damping stays "enabled"
58
+ * but multiplies by one, so it must not by itself activate the stage.
59
+ */
60
+ export function isPreferenceDriftStageActive(config: DriftDetectionConfig | undefined): boolean {
61
+ if (!config) return false;
62
+ // `recallDamping` is a real boolean here: parseDriftDetectionConfig already
63
+ // coerced the string forms and threw on anything unrecognized, so no further
64
+ // coercion is needed at this boundary.
65
+ const damping = config.recallDamping && config.stalePenalty < 1;
66
+ return damping || config.annotateAfterDays > 0;
67
+ }
68
+
69
+ /**
70
+ * Render the age note for an uncorroborated preference, or `undefined` when
71
+ * the gate is off or the preference is inside the window.
72
+ *
73
+ * `lastCorroborated` absent falls back to `created`: a preference the scan has
74
+ * never corroborated is measured from when it was stated, which is exactly the
75
+ * "stated 2026-01; not corroborated since" case the survey describes.
76
+ */
77
+ export function driftAgeNote(
78
+ frontmatter: DriftRecallFrontmatter | undefined,
79
+ config: DriftDetectionConfig,
80
+ now: Date,
81
+ ): string | undefined {
82
+ if (config.annotateAfterDays <= 0) return undefined;
83
+ if (!frontmatter || frontmatter.category !== "preference") return undefined;
84
+ const anchor = frontmatter.lastCorroborated ?? frontmatter.created;
85
+ if (typeof anchor !== "string") return undefined;
86
+ const anchorMs = Date.parse(anchor);
87
+ if (!Number.isFinite(anchorMs)) return undefined;
88
+ const ageDays = Math.floor((now.getTime() - anchorMs) / DAY_MS);
89
+ if (ageDays < config.annotateAfterDays) return undefined;
90
+ const stated = new Date(anchorMs).toISOString().slice(0, 7);
91
+ return frontmatter.lastCorroborated
92
+ ? `(corroborated ${stated}; not since)`
93
+ : `(stated ${stated}; not corroborated since)`;
94
+ }
95
+
96
+ /**
97
+ * Rank and annotate one recall branch's candidates.
98
+ *
99
+ * Returns one output per input, ordered by damped rank descending with a
100
+ * stable key tiebreak so the comparator is total and the ordering is identical
101
+ * across runs (§12).
102
+ */
103
+ export function applyPreferenceDriftRanking(
104
+ inputs: readonly DriftRankInput[],
105
+ options: { config: DriftDetectionConfig; now: Date },
106
+ ): DriftRankOutput[] {
107
+ const { config, now } = options;
108
+ const damping = config.recallDamping && config.stalePenalty < 1;
109
+
110
+ const scored = inputs.map((input, index) => {
111
+ const fm = input.frontmatter;
112
+ const isStalePreference = fm?.category === "preference" && fm.driftState === "stale";
113
+ const multiplier = damping && isStalePreference ? config.stalePenalty : 1;
114
+ return {
115
+ key: input.key,
116
+ index,
117
+ multiplier,
118
+ damped: input.rank * multiplier,
119
+ note: driftAgeNote(fm, config, now),
120
+ };
121
+ });
122
+
123
+ scored.sort((a, b) => {
124
+ if (a.damped !== b.damped) return a.damped > b.damped ? -1 : 1;
125
+ // Equal damped score → preserve upstream order, then key, so the
126
+ // comparator returns 0 only for genuinely identical entries.
127
+ if (a.index !== b.index) return a.index < b.index ? -1 : 1;
128
+ if (a.key !== b.key) return a.key < b.key ? -1 : 1;
129
+ return 0;
130
+ });
131
+
132
+ return scored.map((s) => (s.note ? { key: s.key, multiplier: s.multiplier, note: s.note } : { key: s.key, multiplier: s.multiplier }));
133
+ }
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Shared preference-drift type surfaces (issue #2371).
3
+ *
4
+ * These live in the preferences module rather than in `types.ts` so the
5
+ * cross-cutting fields drift detection introduces are declared next to the
6
+ * subsystem that owns them, and `types.ts` composes them through `extends`
7
+ * instead of growing another inline block.
8
+ */
9
+
10
+ import type { DriftDetectionConfig } from "./drift-config.js";
11
+
12
+ /**
13
+ * Drift verdict persisted on `preference` memories. `corroborated` is
14
+ * deliberately NOT a member: a corroborated preference clears `driftState` and
15
+ * stamps `lastCorroborated`, so the stored enum only carries a negative
16
+ * verdict.
17
+ */
18
+ export type MemoryDriftState = "stale" | "drifted";
19
+
20
+ /**
21
+ * Derived drift provenance stamped by the scan AFTER a memory exists — never
22
+ * supplied at compose time, which is why these fields stay outside the sealed
23
+ * write envelope for exactly the reason `mw_success` / `mw_fail` do.
24
+ *
25
+ * Mixed into `MemoryFrontmatter`.
26
+ */
27
+ export interface MemoryDriftProvenance {
28
+ /**
29
+ * `stale` means the lookback window held no corroborating evidence either
30
+ * way; `drifted` means recent evidence pointed away from the preference and
31
+ * a review item was opened. Absent means "not classified".
32
+ */
33
+ driftState?: MemoryDriftState;
34
+ /** ISO 8601 timestamp of the last run that found corroborating evidence. */
35
+ lastCorroborated?: string;
36
+ }
37
+
38
+ /**
39
+ * Per-recall render hint, mixed into `QmdSearchResult`. Set by the
40
+ * preference-drift recall stage when `driftDetection.annotateAfterDays` is on
41
+ * and absent otherwise. Never persisted — this annotates one injection, it is
42
+ * not memory state.
43
+ */
44
+ export interface RecallDriftAnnotation {
45
+ driftNote?: string;
46
+ }
47
+
48
+ /** Mixed into `PluginConfig`. */
49
+ export interface DriftDetectionSettings {
50
+ driftDetection: DriftDetectionConfig;
51
+ }
52
+
53
+ /**
54
+ * Frontmatter codec for the drift stamps. Lives here, beside the interface it
55
+ * serializes, so `storage.ts` stays a caller rather than growing another
56
+ * field-specific block.
57
+ */
58
+ export function serializeDriftProvenance(fm: MemoryDriftProvenance): string[] {
59
+ const lines: string[] = [];
60
+ if (fm.driftState !== undefined) {
61
+ // An unrecognized verdict on write is a caller bug that must surface, not
62
+ // something to persist silently.
63
+ if (fm.driftState !== "stale" && fm.driftState !== "drifted") {
64
+ throw new Error(
65
+ `serializeFrontmatter: invalid driftState ${JSON.stringify(fm.driftState)} — expected "stale" | "drifted"`,
66
+ );
67
+ }
68
+ lines.push(`driftState: ${fm.driftState}`);
69
+ }
70
+ if (fm.lastCorroborated) lines.push(`lastCorroborated: ${fm.lastCorroborated}`);
71
+ return lines;
72
+ }
73
+
74
+ /**
75
+ * Read the drift stamps back. A hand-edited or unrecognized stored verdict
76
+ * round-trips to `undefined` rather than poisoning recall damping — the same
77
+ * policy the Memory Worth counters use for corrupt values.
78
+ */
79
+ export function parseDriftProvenance(
80
+ fm: Record<string, string | undefined>,
81
+ ): MemoryDriftProvenance {
82
+ return {
83
+ driftState:
84
+ fm.driftState === "stale" || fm.driftState === "drifted" ? fm.driftState : undefined,
85
+ lastCorroborated: fm.lastCorroborated || undefined,
86
+ };
87
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Preference drift detection (issue #2371) — public barrel.
3
+ *
4
+ * Ordered leaf-first (types → config → pure recall stage → scan/resolution) so
5
+ * the scan module, which is the only member with storage and contradiction
6
+ * imports, initializes last.
7
+ */
8
+
9
+ export * from "./drift-types.js";
10
+ export * from "./drift-config.js";
11
+ export * from "./drift-recall.js";
12
+ export * from "./preference-drift.js";