@vellumai/assistant 0.10.12 → 0.11.0-staging.2

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 (809) hide show
  1. package/AGENTS.md +1 -1
  2. package/ARCHITECTURE.md +4 -5
  3. package/README.md +1 -1
  4. package/docs/architecture/memory.md +60 -23
  5. package/docs/error-handling.md +3 -3
  6. package/docs/guardian-request-flow.md +112 -0
  7. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  8. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
  9. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
  10. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
  11. package/node_modules/@vellumai/ces-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
  12. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts +28 -0
  13. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/app.d.ts.map +1 -1
  14. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts +2 -2
  15. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.d.ts.map +1 -1
  16. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/index.js.map +1 -1
  17. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts +2 -0
  18. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/dist/events/message.d.ts.map +1 -1
  19. package/node_modules/@vellumai/gateway-client/node_modules/@slack/types/package.json +1 -1
  20. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/package.json +1 -0
  21. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
  22. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
  23. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
  24. package/node_modules/@vellumai/gateway-client/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
  25. package/node_modules/@vellumai/gateway-client/package.json +1 -1
  26. package/node_modules/@vellumai/gateway-client/src/admission-policy-contract.ts +6 -0
  27. package/node_modules/@vellumai/gateway-client/src/inbound-contract.ts +34 -0
  28. package/node_modules/@vellumai/service-contracts/package.json +1 -0
  29. package/node_modules/@vellumai/service-contracts/src/__tests__/channels.test.ts +9 -1
  30. package/node_modules/@vellumai/service-contracts/src/__tests__/secret-detection.test.ts +449 -0
  31. package/node_modules/@vellumai/service-contracts/src/channels.ts +1 -0
  32. package/node_modules/@vellumai/service-contracts/src/secret-detection.ts +468 -0
  33. package/openapi.yaml +264 -14
  34. package/package.json +2 -2
  35. package/src/__tests__/acp-session.test.ts +3 -3
  36. package/src/__tests__/agent-loop-mutable-latest-user-message.test.ts +3 -0
  37. package/src/__tests__/anthropic-provider.test.ts +40 -0
  38. package/src/__tests__/app-conversation-ids-backfill.test.ts +33 -2
  39. package/src/__tests__/app-conversation-ids.test.ts +204 -0
  40. package/src/__tests__/approval-cascade.test.ts +5 -5
  41. package/src/__tests__/approval-routes-http.test.ts +3 -3
  42. package/src/__tests__/ask-question-resolver.test.ts +207 -0
  43. package/src/__tests__/assistant-event-hub-self-exclusion.test.ts +16 -16
  44. package/src/__tests__/assistant-event-hub-targeted.test.ts +13 -11
  45. package/src/__tests__/assistant-event-hub.test.ts +13 -11
  46. package/src/__tests__/assistant-event.test.ts +12 -9
  47. package/src/__tests__/assistant-feature-flag-guard.test.ts +3 -3
  48. package/src/__tests__/assistant-feature-flag-guardrails.test.ts +1 -1
  49. package/src/__tests__/assistant-id-boundary-guard.test.ts +0 -58
  50. package/src/__tests__/assistant-stream-state.test.ts +17 -7
  51. package/src/__tests__/avatar-identity-sync.test.ts +3 -3
  52. package/src/__tests__/background-workers-disk-pressure.test.ts +1 -0
  53. package/src/__tests__/call-conversation-messages.test.ts +134 -18
  54. package/src/__tests__/call-start-guardian-guard.test.ts +27 -0
  55. package/src/__tests__/channel-approvals.test.ts +0 -27
  56. package/src/__tests__/channel-guardian.test.ts +85 -512
  57. package/src/__tests__/channel-readiness-slack-remote.test.ts +151 -3
  58. package/src/__tests__/channel-retry-sweep.test.ts +88 -1
  59. package/src/__tests__/channel-setup-panel-ack.test.ts +12 -9
  60. package/src/__tests__/chat-reveal-guard-priming.test.ts +31 -34
  61. package/src/__tests__/cli-memory-v2-reembed-skills.test.ts +2 -2
  62. package/src/__tests__/compaction-events.test.ts +8 -8
  63. package/src/__tests__/config-loader-platform-defaults.test.ts +54 -28
  64. package/src/__tests__/config-model-image-provider.test.ts +20 -0
  65. package/src/__tests__/config-schema-memory-substrate.test.ts +306 -0
  66. package/src/__tests__/config-schema.test.ts +14 -2
  67. package/src/__tests__/config-set-platform-guard.test.ts +11 -12
  68. package/src/__tests__/config-sounds-sync.test.ts +4 -4
  69. package/src/__tests__/confirmation-request-guardian-bridge.test.ts +5 -0
  70. package/src/__tests__/context-search-memory-source.test.ts +1 -1
  71. package/src/__tests__/context-search-memory-v2-source.test.ts +6 -6
  72. package/src/__tests__/context-token-estimator.test.ts +54 -1
  73. package/src/__tests__/conversation-agent-loop-disk-pressure.test.ts +12 -3
  74. package/src/__tests__/conversation-agent-loop-fatal-cleanup.test.ts +13 -4
  75. package/src/__tests__/conversation-agent-loop-handlers-max-tokens.test.ts +4 -4
  76. package/src/__tests__/conversation-agent-loop-inference-profile.test.ts +10 -1
  77. package/src/__tests__/conversation-agent-loop-overflow.test.ts +22 -13
  78. package/src/__tests__/conversation-agent-loop.test.ts +39 -30
  79. package/src/__tests__/conversation-confirmation-signals.test.ts +14 -14
  80. package/src/__tests__/conversation-evictor.test.ts +49 -0
  81. package/src/__tests__/conversation-fork-crud.test.ts +1 -1
  82. package/src/__tests__/conversation-group-tools.test.ts +279 -0
  83. package/src/__tests__/conversation-history-web-search.test.ts +1 -1
  84. package/src/__tests__/conversation-key-store-disk-view.test.ts +5 -5
  85. package/src/__tests__/conversation-lineage.test.ts +235 -0
  86. package/src/__tests__/conversation-loop-db-lock-resilience.test.ts +5 -5
  87. package/src/__tests__/conversation-message-sync-tags.test.ts +4 -4
  88. package/src/__tests__/conversation-queue.test.ts +81 -81
  89. package/src/__tests__/conversation-routes-enabled-plugins.test.ts +8 -1
  90. package/src/__tests__/conversation-routes-hidden-queue.test.ts +8 -1
  91. package/src/__tests__/conversation-routes-slash-commands.test.ts +10 -1
  92. package/src/__tests__/conversation-runtime-assembly.test.ts +29 -2
  93. package/src/__tests__/conversation-slash-queue.test.ts +11 -11
  94. package/src/__tests__/conversation-slash-unknown.test.ts +2 -2
  95. package/src/__tests__/conversation-speed-override.test.ts +2 -2
  96. package/src/__tests__/conversation-summarize-route.test.ts +9 -0
  97. package/src/__tests__/conversation-surfaces-action-delivery.test.ts +18 -16
  98. package/src/__tests__/conversation-surfaces-activation-emit.test.ts +17 -17
  99. package/src/__tests__/conversation-surfaces-app-open.test.ts +7 -4
  100. package/src/__tests__/conversation-surfaces-data-persist.test.ts +7 -7
  101. package/src/__tests__/conversation-surfaces-standalone-payloads.test.ts +9 -9
  102. package/src/__tests__/conversation-surfaces-standalone.test.ts +12 -12
  103. package/src/__tests__/conversation-surfaces-state-update.test.ts +8 -5
  104. package/src/__tests__/conversation-surfaces-table-action.test.ts +6 -3
  105. package/src/__tests__/conversation-surfaces-task-progress.test.ts +46 -46
  106. package/src/__tests__/conversation-sync-tags.test.ts +5 -5
  107. package/src/__tests__/conversation-wait-for-idle.test.ts +2 -2
  108. package/src/__tests__/conversation-workspace-cache-state.test.ts +0 -4
  109. package/src/__tests__/conversation-workspace-injection.test.ts +0 -3
  110. package/src/__tests__/conversation-workspace-tool-tracking.test.ts +0 -3
  111. package/src/__tests__/copy-composer-tc-templates.test.ts +3 -131
  112. package/src/__tests__/credential-security-invariants.test.ts +1 -0
  113. package/src/__tests__/daemon-assistant-events.test.ts +14 -15
  114. package/src/__tests__/db-test-helpers.ts +13 -27
  115. package/src/__tests__/disk-pressure-routes.test.ts +12 -3
  116. package/src/__tests__/document-tool-security.test.ts +95 -0
  117. package/src/__tests__/drain-kick-guard.test.ts +232 -0
  118. package/src/__tests__/dynamic-skill-background-guard.test.ts +19 -6
  119. package/src/__tests__/emit-event-signal.test.ts +5 -6
  120. package/src/__tests__/encrypted-store-test-helpers.ts +10 -20
  121. package/src/__tests__/events-tail-route.test.ts +6 -4
  122. package/src/__tests__/feature-flag-test-helpers.ts +10 -20
  123. package/src/__tests__/file-edit-tool.test.ts +24 -4
  124. package/src/__tests__/file-list-tool.test.ts +2 -1
  125. package/src/__tests__/file-read-tool.test.ts +62 -10
  126. package/src/__tests__/file-write-tool.test.ts +24 -5
  127. package/src/__tests__/followup-tools.test.ts +58 -0
  128. package/src/__tests__/gateway-threshold-reader-mock.ts +99 -0
  129. package/src/__tests__/graph-extraction-event-date.test.ts +1 -1
  130. package/src/__tests__/guardian-question-mode.test.ts +42 -3
  131. package/src/__tests__/guardian-reply-router-answer-mode.test.ts +283 -0
  132. package/src/__tests__/guardian-vellum-destination-pinning.test.ts +221 -0
  133. package/src/__tests__/heartbeat-disk-pressure.test.ts +1 -0
  134. package/src/__tests__/heartbeat-service.test.ts +1 -0
  135. package/src/__tests__/helpers/native-web-search-harness.ts +10 -10
  136. package/src/__tests__/host-browser-proxy.test.ts +1 -1
  137. package/src/__tests__/host-file-edit-tool.test.ts +3 -3
  138. package/src/__tests__/host-file-read-tool.test.ts +2 -2
  139. package/src/__tests__/host-file-write-tool.test.ts +7 -3
  140. package/src/__tests__/host-shell-tool.test.ts +17 -5
  141. package/src/__tests__/host-transfer-pending-interactions.test.ts +8 -8
  142. package/src/__tests__/image-credentials.test.ts +65 -8
  143. package/src/__tests__/injection-block.test.ts +4 -4
  144. package/src/__tests__/injector-chain.test.ts +1 -1
  145. package/src/__tests__/injector-pkb-v2-silenced.test.ts +2 -2
  146. package/src/__tests__/injector-registry-order-guard.test.ts +4 -9
  147. package/src/__tests__/injector-v3-suppression.test.ts +6 -4
  148. package/src/__tests__/lifecycle-memory-v2-seed.test.ts +27 -28
  149. package/src/__tests__/list-messages-page-latest.test.ts +2 -2
  150. package/src/__tests__/llm-usage-store.test.ts +67 -4
  151. package/src/__tests__/log-redact.test.ts +18 -0
  152. package/src/__tests__/managed-profile-guard.test.ts +27 -0
  153. package/src/__tests__/managed-skill-lifecycle.test.ts +2 -2
  154. package/src/__tests__/media-generate-image.test.ts +62 -11
  155. package/src/__tests__/memory-identity-context-parity.test.ts +1 -1
  156. package/src/__tests__/memory-jobs-worker-lanes.test.ts +9 -1
  157. package/src/__tests__/memory-retrieval-hook.test.ts +4 -4
  158. package/src/__tests__/notification-decision-strategy.test.ts +115 -11
  159. package/src/__tests__/notification-deep-link.test.ts +12 -12
  160. package/src/__tests__/notification-vellum-adapter.test.ts +8 -8
  161. package/src/__tests__/outbound-slack-persistence.test.ts +8 -8
  162. package/src/__tests__/path-policy.test.ts +315 -0
  163. package/src/__tests__/pending-interactions-resolved-event.test.ts +6 -6
  164. package/src/__tests__/persistence-layering-guard.test.ts +2 -2
  165. package/src/__tests__/pkb-autoinject.test.ts +1 -1
  166. package/src/__tests__/platform-bash-auto-approve.test.ts +1 -0
  167. package/src/__tests__/platform-callback-registration.test.ts +10 -10
  168. package/src/__tests__/plugin-event-hub-facade.test.ts +22 -15
  169. package/src/__tests__/plugin-import-boundary-guard.test.ts +15 -15
  170. package/src/__tests__/processing-flag-persist-failure.test.ts +0 -4
  171. package/src/__tests__/provider-platform-proxy-integration.test.ts +0 -1
  172. package/src/__tests__/rebuild-index-graph-nodes.test.ts +1 -1
  173. package/src/__tests__/request-secret-standalone-channel-gate.test.ts +5 -5
  174. package/src/__tests__/require-fresh-approval.test.ts +38 -38
  175. package/src/__tests__/resolve-app-id.test.ts +32 -0
  176. package/src/__tests__/run-due-schedules.test.ts +72 -1
  177. package/src/__tests__/runtime-events-sse-parity.test.ts +11 -10
  178. package/src/__tests__/runtime-events-sse.test.ts +1 -1
  179. package/src/__tests__/schedule-routes.test.ts +44 -5
  180. package/src/__tests__/schedule-store.test.ts +3 -3
  181. package/src/__tests__/schedule-tools.test.ts +176 -0
  182. package/src/__tests__/secret-prompt-log-hygiene.test.ts +3 -3
  183. package/src/__tests__/secret-prompter-channel-fallback.test.ts +3 -3
  184. package/src/__tests__/secret-response-routing.test.ts +3 -3
  185. package/src/__tests__/secret-routes-platform-proxy.test.ts +4 -7
  186. package/src/__tests__/secret-scanner.test.ts +36 -0
  187. package/src/__tests__/send-endpoint-busy.test.ts +7 -7
  188. package/src/__tests__/slack-required-scopes-mirror.test.ts +81 -0
  189. package/src/__tests__/starter-task-flow.test.ts +26 -3
  190. package/src/__tests__/subagent-call-site-routing.test.ts +2 -2
  191. package/src/__tests__/subagent-disposal.test.ts +40 -11
  192. package/src/__tests__/subagent-fork-notifications.test.ts +4 -4
  193. package/src/__tests__/subagent-fork-prompt-role.test.ts +3 -3
  194. package/src/__tests__/subagent-fork-spawn.test.ts +4 -4
  195. package/src/__tests__/subagent-manager-notify.test.ts +73 -14
  196. package/src/__tests__/subagent-notify-parent.test.ts +48 -4
  197. package/src/__tests__/subagent-spawn-and-await.test.ts +62 -14
  198. package/src/__tests__/subagent-tools.test.ts +64 -0
  199. package/src/__tests__/sync-message-contract.test.ts +3 -3
  200. package/src/__tests__/terminal-tools.test.ts +12 -3
  201. package/src/__tests__/test-preload.ts +9 -0
  202. package/src/__tests__/tool-approval-handler.test.ts +587 -43
  203. package/src/__tests__/tool-execution-pipeline.benchmark.test.ts +7 -4
  204. package/src/__tests__/tool-executor.test.ts +116 -0
  205. package/src/__tests__/tool-grant-request-escalation.test.ts +5 -0
  206. package/src/__tests__/tool-preview-lifecycle.test.ts +32 -29
  207. package/src/__tests__/tool-result-metadata-plumbing.test.ts +5 -5
  208. package/src/__tests__/tool-side-effects-slack-dm.test.ts +1 -0
  209. package/src/__tests__/tool-start-timestamp.test.ts +4 -4
  210. package/src/__tests__/trusted-contact-lifecycle-notifications.test.ts +9 -22
  211. package/src/__tests__/ui-choice-copy-surfaces.test.ts +13 -13
  212. package/src/__tests__/ui-work-result-surface.test.ts +3 -3
  213. package/src/__tests__/voice-scoped-grant-consumer.test.ts +6 -6
  214. package/src/__tests__/voice-session-bridge.test.ts +44 -44
  215. package/src/__tests__/workspace-migration-134-image-generation-mode-to-provider.test.ts +284 -0
  216. package/src/__tests__/workspace-policy.test.ts +482 -2
  217. package/src/acp/__tests__/client-handler.test.ts +3 -3
  218. package/src/acp/__tests__/session-manager-persistence.test.ts +10 -10
  219. package/src/acp/__tests__/session-manager-resume.test.ts +7 -7
  220. package/src/acp/client-handler.ts +3 -3
  221. package/src/acp/session-manager.ts +8 -8
  222. package/src/api/events/subagent-event.ts +2 -2
  223. package/src/api/responses/memory-v2-activation-log.ts +2 -2
  224. package/src/api/responses/subagent-detail.ts +13 -0
  225. package/src/approvals/AGENTS.md +2 -0
  226. package/src/approvals/guardian-request-resolvers.ts +118 -24
  227. package/src/apps/app-store.ts +95 -4
  228. package/src/calls/__tests__/voice-control-protocol.test.ts +57 -0
  229. package/src/calls/__tests__/voice-session-bridge.test.ts +229 -7
  230. package/src/calls/__tests__/voice-triage-escalate.test.ts +3 -4
  231. package/src/calls/call-controller.ts +27 -27
  232. package/src/calls/call-conversation-messages.ts +58 -18
  233. package/src/calls/voice-control-protocol.ts +56 -0
  234. package/src/calls/voice-session-bridge.ts +178 -65
  235. package/src/calls/voice-triage-escalate.ts +2 -3
  236. package/src/channels/config.ts +8 -0
  237. package/src/channels/types.ts +1 -0
  238. package/src/cli/commands/config.ts +49 -13
  239. package/src/cli/commands/memory/index.help.ts +4 -2
  240. package/src/cli/commands/memory/memory-retrospective.ts +5 -0
  241. package/src/cli/commands/webhooks.help.ts +9 -4
  242. package/src/cli/lib/bundled-marketplace.json +12 -0
  243. package/src/cli.ts +2 -109
  244. package/src/config/__tests__/deployment-context-defaults.test.ts +9 -0
  245. package/src/config/__tests__/substrate-twin-shadowing.test.ts +191 -0
  246. package/src/config/assistant-feature-flags.ts +1 -1
  247. package/src/config/bundled-skills/conversation-groups/SKILL.md +29 -0
  248. package/src/config/bundled-skills/conversation-groups/TOOLS.json +58 -0
  249. package/src/config/bundled-skills/conversation-groups/tools/group-create.ts +12 -0
  250. package/src/config/bundled-skills/conversation-groups/tools/group-list.ts +12 -0
  251. package/src/config/bundled-skills/conversation-groups/tools/move-to-group.ts +12 -0
  252. package/src/config/bundled-skills/image-studio/tools/media-generate-image.ts +13 -7
  253. package/src/config/bundled-skills/schedule/SKILL.md +2 -0
  254. package/src/config/feature-flag-cache.ts +6 -16
  255. package/src/config/feature-flag-registry.json +14 -38
  256. package/src/config/loader.ts +7 -1
  257. package/src/config/memory-tier.ts +15 -10
  258. package/src/config/memory-v3-gate.test.ts +278 -1
  259. package/src/config/memory-v3-gate.ts +88 -26
  260. package/src/config/raw-config-utils.ts +1 -1
  261. package/src/config/schemas/__tests__/live-voice.test.ts +27 -16
  262. package/src/config/schemas/__tests__/memory-v3.test.ts +1 -0
  263. package/src/config/schemas/live-voice.ts +33 -7
  264. package/src/config/schemas/llm.ts +1 -0
  265. package/src/config/schemas/memory-retrospective.ts +13 -0
  266. package/src/config/schemas/memory-substrate.ts +183 -0
  267. package/src/config/schemas/memory-v2.ts +3 -2
  268. package/src/config/schemas/memory-v3.ts +11 -4
  269. package/src/config/schemas/memory.ts +35 -1
  270. package/src/config/schemas/services.ts +10 -2
  271. package/src/config/substrate-twin-shadowing.ts +195 -0
  272. package/src/config/webhook-routing.ts +67 -0
  273. package/src/context/compactor.ts +10 -3
  274. package/src/context/token-estimator.ts +21 -0
  275. package/src/daemon/__tests__/channel-ui-capability.test.ts +85 -0
  276. package/src/daemon/__tests__/conversation-surfaces-launch.test.ts +3 -3
  277. package/src/daemon/__tests__/embedding-reconcile.test.ts +3 -3
  278. package/src/daemon/__tests__/inference-profile-notification.test.ts +3 -6
  279. package/src/daemon/__tests__/native-web-search-metadata.test.ts +5 -5
  280. package/src/daemon/__tests__/web-search-status-text.test.ts +2 -2
  281. package/src/daemon/channel-ui-capability.ts +70 -1
  282. package/src/daemon/conversation-agent-loop-handlers.ts +4 -4
  283. package/src/daemon/conversation-agent-loop.ts +12 -5
  284. package/src/daemon/conversation-evictor.ts +26 -4
  285. package/src/daemon/conversation-launch.ts +11 -14
  286. package/src/daemon/conversation-lineage.ts +76 -0
  287. package/src/daemon/conversation-messaging.ts +14 -14
  288. package/src/daemon/conversation-notifiers.ts +2 -2
  289. package/src/daemon/conversation-process.ts +133 -21
  290. package/src/daemon/conversation-queue-manager.ts +7 -7
  291. package/src/daemon/conversation-runtime-assembly.ts +16 -0
  292. package/src/daemon/conversation-store.ts +11 -3
  293. package/src/daemon/conversation-surfaces.ts +8 -14
  294. package/src/daemon/conversation-tool-setup.ts +13 -7
  295. package/src/daemon/conversation-usage.ts +12 -11
  296. package/src/daemon/conversation.ts +38 -15
  297. package/src/daemon/disk-pressure-guard.ts +5 -12
  298. package/src/daemon/embedding-reconcile.ts +14 -9
  299. package/src/daemon/handlers/config-channels.ts +40 -134
  300. package/src/daemon/handlers/config-model.ts +15 -7
  301. package/src/daemon/handlers/conversations.ts +4 -2
  302. package/src/daemon/handlers/shared.ts +29 -0
  303. package/src/daemon/host-proxy-base.ts +4 -4
  304. package/src/daemon/lifecycle.ts +13 -0
  305. package/src/daemon/message-protocol.ts +8 -144
  306. package/src/daemon/message-types/computer-use.ts +0 -12
  307. package/src/daemon/message-types/conversations.ts +9 -345
  308. package/src/daemon/message-types/host-app-control.ts +0 -9
  309. package/src/daemon/message-types/host-browser.ts +0 -7
  310. package/src/daemon/message-types/host-ui-snapshot.ts +0 -7
  311. package/src/daemon/message-types/messages.ts +0 -48
  312. package/src/daemon/message-types/notifications.ts +0 -7
  313. package/src/daemon/message-types/skills.ts +0 -5
  314. package/src/daemon/message-types/surfaces.ts +0 -9
  315. package/src/daemon/message-types/sync.ts +0 -2
  316. package/src/daemon/process-message.ts +5 -5
  317. package/src/daemon/skill-memory-refresh.ts +5 -5
  318. package/src/daemon/tool-side-effects.ts +32 -16
  319. package/src/daemon/trust-context.ts +1 -1
  320. package/src/daemon/wake-conversation-ops.ts +4 -4
  321. package/src/heartbeat/__tests__/heartbeat-run-store.test.ts +100 -7
  322. package/src/heartbeat/__tests__/heartbeat-service.test.ts +67 -0
  323. package/src/heartbeat/heartbeat-run-store.ts +81 -4
  324. package/src/heartbeat/heartbeat-service.ts +32 -1
  325. package/src/home/__tests__/feed-writer.test.ts +7 -7
  326. package/src/home/__tests__/home-content-refresh.test.ts +3 -0
  327. package/src/home/__tests__/suggested-prompts.test.ts +1 -0
  328. package/src/home/feed-writer.ts +6 -13
  329. package/src/home/home-content-refresh.ts +6 -9
  330. package/src/home/relationship-state-writer.ts +5 -12
  331. package/src/home/suggested-prompts-cache.ts +6 -19
  332. package/src/ipc/__tests__/events-publish-client.test.ts +67 -0
  333. package/src/ipc/events-publish-client.ts +44 -0
  334. package/src/ipc/routes/__tests__/conversation-sync-ipc-routes.test.ts +2 -2
  335. package/src/ipc/routes/__tests__/events-ipc-routes.test.ts +38 -9
  336. package/src/ipc/routes/events-ipc-routes.ts +11 -31
  337. package/src/live-voice/__tests__/front-decision.test.ts +4 -176
  338. package/src/live-voice/__tests__/live-voice-agent-turn.test.ts +276 -68
  339. package/src/live-voice/__tests__/live-voice-continuation-fork-hydration.test.ts +286 -0
  340. package/src/live-voice/__tests__/live-voice-events.test.ts +6 -3
  341. package/src/live-voice/__tests__/live-voice-progress.test.ts +185 -46
  342. package/src/live-voice/__tests__/live-voice-triage-escalate.test.ts +24 -59
  343. package/src/live-voice/__tests__/live-voice-tts-session.test.ts +38 -54
  344. package/src/live-voice/__tests__/live-voice-vad.test.ts +1154 -636
  345. package/src/live-voice/front-decision.ts +5 -155
  346. package/src/live-voice/live-voice-metrics.ts +4 -1
  347. package/src/live-voice/live-voice-session.ts +1288 -439
  348. package/src/live-voice/progress-phrases.ts +17 -0
  349. package/src/live-voice/protocol.ts +15 -0
  350. package/src/media/app-icon-generator.ts +15 -8
  351. package/src/media/avatar-router.ts +9 -5
  352. package/src/media/image-credentials.ts +42 -10
  353. package/src/media/image-service.ts +1 -13
  354. package/src/media/types.ts +26 -3
  355. package/src/notifications/AGENTS.md +2 -0
  356. package/src/notifications/__tests__/broadcaster.test.ts +95 -0
  357. package/src/notifications/adapters/macos.ts +3 -3
  358. package/src/notifications/broadcaster.ts +57 -0
  359. package/src/notifications/copy-composer.ts +0 -15
  360. package/src/notifications/decision-engine.ts +21 -22
  361. package/src/notifications/guardian-question-mode.ts +57 -2
  362. package/src/notifications/home-feed-side-effect.ts +4 -0
  363. package/src/notifications/signal.ts +6 -4
  364. package/src/notifications/trusted-contact-payloads.ts +3 -4
  365. package/src/notifications/vellum-card-affinity.ts +39 -0
  366. package/src/oauth/AGENTS.md +1 -1
  367. package/src/permissions/channel-permission-query.test.ts +69 -0
  368. package/src/permissions/channel-permission-query.ts +73 -1
  369. package/src/permissions/checker.test.ts +298 -15
  370. package/src/permissions/checker.ts +102 -36
  371. package/src/permissions/confirmation-guardian-request.test.ts +2 -2
  372. package/src/permissions/confirmation-guardian-request.ts +2 -2
  373. package/src/permissions/gateway-threshold-reader.test.ts +224 -17
  374. package/src/permissions/gateway-threshold-reader.ts +82 -10
  375. package/src/permissions/ipc-risk-types.ts +8 -0
  376. package/src/permissions/prompter.ts +5 -5
  377. package/src/permissions/question-guardian-request.test.ts +222 -0
  378. package/src/permissions/question-guardian-request.ts +179 -0
  379. package/src/permissions/question-prompter.test.ts +8 -8
  380. package/src/permissions/question-prompter.ts +18 -0
  381. package/src/permissions/secret-prompter.ts +2 -4
  382. package/src/permissions/workspace-policy.ts +269 -34
  383. package/src/persistence/__tests__/lifecycle-quiesce.test.ts +82 -0
  384. package/src/persistence/__tests__/message-content-file.test.ts +58 -3
  385. package/src/persistence/conversation-crud.ts +93 -0
  386. package/src/persistence/conversation-key-store.ts +63 -0
  387. package/src/persistence/conversation-parent.ts +27 -0
  388. package/src/persistence/db-async-query.ts +1 -1
  389. package/src/persistence/db-singleton.ts +14 -27
  390. package/src/persistence/delivery-crud.ts +45 -0
  391. package/src/persistence/embeddings/embedding-backend.ts +2 -1
  392. package/src/persistence/embeddings/embedding-identity.ts +7 -3
  393. package/src/persistence/job-utils.ts +32 -27
  394. package/src/persistence/jobs-store.ts +92 -3
  395. package/src/persistence/lifecycle-quiesce.ts +80 -0
  396. package/src/persistence/llm-usage-store.ts +45 -8
  397. package/src/persistence/message-content-file.ts +4 -4
  398. package/src/persistence/migrations/336-move-memory-v2-activation-logs-to-memory-db.ts +1 -1
  399. package/src/persistence/migrations/351-schedule-skill-script-handoff.ts +39 -0
  400. package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.test.ts +83 -0
  401. package/src/persistence/migrations/352-drop-schedule-skill-script-handoff.ts +36 -0
  402. package/src/persistence/migrations/353-add-llm-usage-conversation-type.test.ts +110 -0
  403. package/src/persistence/migrations/353-add-llm-usage-conversation-type.ts +49 -0
  404. package/src/persistence/migrations/354-backfill-app-conversation-lineage.ts +41 -0
  405. package/src/persistence/schema/infrastructure.ts +11 -0
  406. package/src/persistence/steps.ts +9 -1
  407. package/src/plugin-api/__tests__/publish-event-forwarding.test.ts +113 -0
  408. package/src/plugin-api/__tests__/publish-event.test.ts +57 -0
  409. package/src/plugin-api/conversation-turn.ts +4 -4
  410. package/src/plugin-api/event-hub-facade.ts +15 -6
  411. package/src/plugin-api/index.ts +10 -4
  412. package/src/plugin-api/publish-event.ts +36 -0
  413. package/src/plugins/AGENTS.md +2 -0
  414. package/src/plugins/defaults/compaction/window-manager.ts +9 -0
  415. package/src/plugins/defaults/index.ts +9 -13
  416. package/src/plugins/defaults/memory/AGENTS.md +775 -0
  417. package/src/plugins/defaults/memory/__tests__/capability-seed-embed-gate.test.ts +186 -0
  418. package/src/plugins/defaults/memory/__tests__/fixtures/memory-v2-activation-fixtures.ts +1 -1
  419. package/src/plugins/defaults/memory/__tests__/indexer-tier-dispatch.test.ts +129 -0
  420. package/src/plugins/defaults/memory/__tests__/jobs-worker-quiesce-gate.test.ts +91 -0
  421. package/src/plugins/defaults/memory/__tests__/jobs-worker-v1-graph-substrate-noop.test.ts +342 -0
  422. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-graph-trigger-embed.test.ts +9 -1
  423. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-schedule.test.ts +36 -1
  424. package/src/plugins/defaults/memory/__tests__/jobs-worker-v2-sweep-defer.test.ts +9 -1
  425. package/src/plugins/defaults/memory/__tests__/memory-log-stores-degraded.test.ts +2 -2
  426. package/src/plugins/defaults/memory/__tests__/memory-retrospective-job.test.ts +44 -10
  427. package/src/plugins/defaults/memory/__tests__/memory-retrospective-sweep.test.ts +151 -10
  428. package/src/plugins/defaults/memory/__tests__/memory-tier-boundary-guard.test.ts +1155 -0
  429. package/src/plugins/defaults/memory/__tests__/memory-v2-activation-log-store.test.ts +1 -1
  430. package/src/plugins/defaults/memory/__tests__/memory-v2-concept-frequency.test.ts +3 -3
  431. package/src/plugins/defaults/memory/__tests__/tools-delete-memory-page.test.ts +1 -1
  432. package/src/plugins/defaults/memory/context-search/sources/memory-v2.ts +71 -35
  433. package/src/plugins/defaults/memory/context-search/sources/memory.ts +5 -1
  434. package/src/plugins/defaults/memory/fork-conversation-memory.ts +4 -4
  435. package/src/plugins/defaults/memory/graph/__tests__/conversation-graph-memory-v2-routing.test.ts +80 -10
  436. package/src/plugins/defaults/memory/graph/__tests__/handle-remember-v2.test.ts +1 -1
  437. package/src/plugins/defaults/memory/graph/capability-seed.ts +24 -10
  438. package/src/plugins/defaults/memory/graph/conversation-graph-memory.ts +123 -49
  439. package/src/plugins/defaults/memory/graph/graph-search.ts +6 -118
  440. package/src/plugins/defaults/memory/graph/in-context-tracker.test.ts +173 -0
  441. package/src/plugins/defaults/memory/graph/in-context-tracker.ts +109 -0
  442. package/src/plugins/defaults/memory/graph/store.ts +1 -0
  443. package/src/plugins/defaults/memory/graph/tool-handlers.test.ts +1 -1
  444. package/src/plugins/defaults/memory/graph/tool-handlers.ts +5 -2
  445. package/src/plugins/defaults/memory/graph-topology/__tests__/build-memory-graph.test.ts +1 -1
  446. package/src/plugins/defaults/memory/graph-topology/build-memory-graph.ts +6 -9
  447. package/src/plugins/defaults/memory/hooks/__tests__/user-prompt-submit.test.ts +30 -16
  448. package/src/plugins/defaults/memory/hooks/user-prompt-submit.ts +18 -14
  449. package/src/plugins/defaults/memory/indexer.ts +146 -89
  450. package/src/plugins/defaults/memory/injectors.ts +86 -41
  451. package/src/plugins/defaults/memory/job-handlers.ts +130 -39
  452. package/src/plugins/defaults/memory/jobs/__tests__/embed-concept-page.test.ts +2 -2
  453. package/src/plugins/defaults/memory/jobs/embed-concept-page.ts +22 -10
  454. package/src/plugins/defaults/memory/jobs-worker.ts +279 -208
  455. package/src/plugins/defaults/memory/memory-retrospective-enqueue.ts +4 -2
  456. package/src/plugins/defaults/memory/memory-retrospective-job.ts +40 -3
  457. package/src/plugins/defaults/memory/memory-retrospective-sweep.ts +99 -11
  458. package/src/plugins/defaults/memory/src/__tests__/memory-v2-routes.test.ts +5 -3
  459. package/src/plugins/defaults/memory/src/__tests__/memory-v2-simulate-route.test.ts +3 -4
  460. package/src/plugins/defaults/memory/src/memory-graph-routes.ts +2 -1
  461. package/src/plugins/defaults/memory/src/memory-item-routes.test.ts +7 -5
  462. package/src/plugins/defaults/memory/src/memory-item-routes.ts +51 -19
  463. package/src/plugins/defaults/memory/src/memory-v2-routes.ts +31 -20
  464. package/src/plugins/defaults/memory/startup.ts +58 -21
  465. package/src/plugins/defaults/memory/substrate/__tests__/boot-maintenance.test.ts +335 -0
  466. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/cli-command-store.test.ts +14 -8
  467. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-job.test.ts +51 -21
  468. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/edge-index.test.ts +1 -1
  469. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/frontmatter-sweep.test.ts +3 -3
  470. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-index.test.ts +1 -1
  471. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/page-store.test.ts +1 -1
  472. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/prompts-consolidation.test.ts +2 -2
  473. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/qdrant.test.ts +23 -14
  474. package/src/plugins/defaults/memory/substrate/__tests__/reembed-job.test.ts +262 -0
  475. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sim.test.ts +9 -12
  476. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-content.test.ts +2 -2
  477. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/skill-store.test.ts +9 -9
  478. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sparse-bm25.test.ts +12 -5
  479. package/src/plugins/defaults/memory/substrate/__tests__/spread.test.ts +276 -0
  480. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/static-context.test.ts +17 -8
  481. package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/sweep-job.test.ts +9 -9
  482. package/src/plugins/defaults/memory/{v3/substrate/memory-v2-startup.ts → substrate/boot-maintenance.ts} +43 -24
  483. package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-store.ts +13 -8
  484. package/src/plugins/defaults/memory/{v3/substrate → substrate}/consolidation-job.ts +51 -27
  485. package/src/plugins/defaults/memory/{v3/substrate → substrate}/constants.ts +1 -0
  486. package/src/plugins/defaults/memory/{v3/substrate → substrate}/edge-index.ts +28 -9
  487. package/src/plugins/defaults/memory/{v3/substrate → substrate}/frontmatter-sweep.ts +14 -7
  488. package/src/plugins/defaults/memory/{v3/substrate → substrate}/injected-block-slugs.ts +9 -3
  489. package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-index.ts +29 -10
  490. package/src/plugins/defaults/memory/{v3/substrate → substrate}/page-store.ts +35 -12
  491. package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/consolidation.ts +14 -8
  492. package/src/plugins/defaults/memory/{v3/substrate → substrate}/prompts/sweep.ts +4 -1
  493. package/src/plugins/defaults/memory/{v3/substrate → substrate}/qdrant.ts +96 -36
  494. package/src/plugins/defaults/memory/substrate/reembed-job.ts +54 -0
  495. package/src/plugins/defaults/memory/{v3/substrate → substrate}/sim.ts +26 -15
  496. package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-content.ts +1 -1
  497. package/src/plugins/defaults/memory/{v3/substrate → substrate}/skill-store.ts +13 -8
  498. package/src/plugins/defaults/memory/{v3/substrate → substrate}/sparse-bm25.ts +27 -10
  499. package/src/plugins/defaults/memory/substrate/spread.ts +165 -0
  500. package/src/plugins/defaults/memory/{v3/substrate → substrate}/static-context.ts +12 -7
  501. package/src/plugins/defaults/memory/{v3/substrate → substrate}/sweep-job.ts +20 -15
  502. package/src/plugins/defaults/memory/substrate/tuning.ts +93 -0
  503. package/src/plugins/defaults/memory/{v3/substrate → substrate}/types.ts +7 -4
  504. package/src/plugins/defaults/memory/tools.test.ts +1 -1
  505. package/src/plugins/defaults/memory/tools.ts +1 -1
  506. package/src/plugins/defaults/memory/v1/README.md +5 -0
  507. package/src/plugins/defaults/memory/{__tests__ → v1/__tests__}/filing-jobs.test.ts +4 -4
  508. package/src/plugins/defaults/memory/{filing-jobs.ts → v1/filing-jobs.ts} +3 -3
  509. package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.test.ts +68 -6
  510. package/src/plugins/defaults/memory/{graph → v1/graph}/bootstrap.ts +40 -21
  511. package/src/plugins/defaults/memory/{graph → v1/graph}/consolidation.ts +14 -14
  512. package/src/plugins/defaults/memory/{graph → v1/graph}/decay.test.ts +1 -1
  513. package/src/plugins/defaults/memory/{graph → v1/graph}/decay.ts +3 -3
  514. package/src/plugins/defaults/memory/{graph → v1/graph}/extraction-job.ts +5 -5
  515. package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.test.ts +1 -1
  516. package/src/plugins/defaults/memory/{graph → v1/graph}/extraction.ts +20 -14
  517. package/src/plugins/defaults/memory/{graph → v1/graph}/graph-search.test.ts +3 -3
  518. package/src/plugins/defaults/memory/v1/graph/graph-search.ts +123 -0
  519. package/src/plugins/defaults/memory/{graph → v1/graph}/injection.test.ts +1 -118
  520. package/src/plugins/defaults/memory/{graph → v1/graph}/injection.ts +9 -111
  521. package/src/plugins/defaults/memory/{graph → v1/graph}/narrative.ts +6 -6
  522. package/src/plugins/defaults/memory/{graph → v1/graph}/pattern-scan.ts +5 -5
  523. package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.test.ts +135 -42
  524. package/src/plugins/defaults/memory/{graph → v1/graph}/retriever.ts +40 -22
  525. package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.test.ts +1 -1
  526. package/src/plugins/defaults/memory/{graph → v1/graph}/scoring.ts +1 -1
  527. package/src/plugins/defaults/memory/{graph → v1/graph}/serendipity.ts +1 -1
  528. package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.test.ts +1 -1
  529. package/src/plugins/defaults/memory/{graph → v1/graph}/triggers.ts +1 -1
  530. package/src/plugins/defaults/memory/{identity-context.ts → v1/identity-context.ts} +4 -4
  531. package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/backfill.ts +6 -6
  532. package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.test.ts +6 -6
  533. package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/embedding.ts +6 -6
  534. package/src/plugins/defaults/memory/{job-handlers → v1/job-handlers}/index-maintenance.ts +8 -8
  535. package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.test.ts +7 -7
  536. package/src/plugins/defaults/memory/{jobs → v1/jobs}/embed-pkb-file.ts +5 -5
  537. package/src/plugins/defaults/memory/{pkb → v1/pkb}/autoinject.ts +1 -1
  538. package/src/plugins/defaults/memory/{pkb → v1/pkb}/context.ts +2 -2
  539. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.test.ts +3 -3
  540. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-index.ts +2 -2
  541. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.test.ts +3 -3
  542. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-reconcile.ts +2 -2
  543. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.test.ts +3 -3
  544. package/src/plugins/defaults/memory/{pkb → v1/pkb}/pkb-search.ts +6 -6
  545. package/src/plugins/defaults/memory/{pkb → v1/pkb}/types.ts +3 -5
  546. package/src/plugins/defaults/memory/{pkb-schedule.ts → v1/pkb-schedule.ts} +2 -2
  547. package/src/plugins/defaults/memory/{search/semantic.ts → v1/semantic-search.ts} +1 -1
  548. package/src/plugins/defaults/memory/v2/__tests__/activation-store.test.ts +1 -1
  549. package/src/plugins/defaults/memory/v2/__tests__/activation.test.ts +11 -274
  550. package/src/plugins/defaults/memory/v2/__tests__/backfill-jobs.test.ts +9 -131
  551. package/src/plugins/defaults/memory/v2/__tests__/harness-compare.test.ts +1 -1
  552. package/src/plugins/defaults/memory/v2/__tests__/harness-oracle.test.ts +1 -1
  553. package/src/plugins/defaults/memory/v2/__tests__/harness-replay-input.test.ts +1 -1
  554. package/src/plugins/defaults/memory/v2/__tests__/injection.test.ts +14 -10
  555. package/src/plugins/defaults/memory/v2/__tests__/reranker.test.ts +7 -5
  556. package/src/plugins/defaults/memory/v2/__tests__/router.test.ts +12 -6
  557. package/src/plugins/defaults/memory/{memory-v2-activation-log-store.ts → v2/activation-log-store.ts} +2 -2
  558. package/src/plugins/defaults/memory/v2/activation-store.ts +22 -8
  559. package/src/plugins/defaults/memory/v2/activation.ts +30 -163
  560. package/src/plugins/defaults/memory/v2/backfill-jobs.ts +7 -54
  561. package/src/plugins/defaults/memory/{memory-v2-concept-frequency.ts → v2/concept-frequency.ts} +3 -3
  562. package/src/plugins/defaults/memory/v2/harness/oracle.ts +1 -1
  563. package/src/plugins/defaults/memory/v2/harness/replay-input.ts +2 -2
  564. package/src/plugins/defaults/memory/v2/harness/retriever.ts +1 -1
  565. package/src/plugins/defaults/memory/v2/injection.ts +36 -26
  566. package/src/plugins/defaults/memory/v2/migration.ts +2 -2
  567. package/src/plugins/defaults/memory/{rerank-local.ts → v2/rerank-local.ts} +44 -18
  568. package/src/plugins/defaults/memory/v2/reranker.ts +29 -11
  569. package/src/plugins/defaults/memory/v2/router.ts +38 -15
  570. package/src/plugins/defaults/memory/v3/__tests__/candidate-match.test.ts +5 -3
  571. package/src/plugins/defaults/memory/v3/__tests__/carry-integration.test.ts +21 -8
  572. package/src/plugins/defaults/memory/v3/__tests__/edge.test.ts +1 -1
  573. package/src/plugins/defaults/memory/v3/__tests__/live-integration.test.ts +1 -1
  574. package/src/plugins/defaults/memory/v3/__tests__/maintain-job.test.ts +4 -1
  575. package/src/plugins/defaults/memory/v3/__tests__/orchestrate.test.ts +181 -3
  576. package/src/plugins/defaults/memory/v3/__tests__/selection-log-store.test.ts +3 -0
  577. package/src/plugins/defaults/memory/v3/__tests__/shadow-integration.test.ts +14 -5
  578. package/src/plugins/defaults/memory/v3/__tests__/shadow-plugin.test.ts +40 -50
  579. package/src/plugins/defaults/memory/v3/__tests__/tuning-profile.test.ts +1 -0
  580. package/src/plugins/defaults/memory/v3/candidate-match.ts +2 -2
  581. package/src/plugins/defaults/memory/v3/capabilities.ts +6 -4
  582. package/src/plugins/defaults/memory/v3/card.ts +25 -9
  583. package/src/plugins/defaults/memory/v3/edge.ts +52 -18
  584. package/src/plugins/defaults/memory/v3/gate.ts +4 -4
  585. package/src/plugins/defaults/memory/v3/injector.ts +10 -3
  586. package/src/plugins/defaults/memory/v3/maintain-job.ts +3 -3
  587. package/src/plugins/defaults/memory/v3/orchestrate.ts +100 -18
  588. package/src/plugins/defaults/memory/v3/page-content.ts +26 -10
  589. package/src/plugins/defaults/memory/v3/prune.ts +40 -16
  590. package/src/plugins/defaults/memory/v3/selection-log-store.ts +34 -12
  591. package/src/plugins/defaults/memory/v3/shadow-plugin.ts +9 -13
  592. package/src/plugins/defaults/memory/v3/span-query.test.ts +86 -0
  593. package/src/plugins/defaults/memory/v3/span-query.ts +71 -0
  594. package/src/plugins/defaults/memory/v3/tuning-profile.ts +3 -0
  595. package/src/plugins/defaults/memory/v3/types.ts +4 -1
  596. package/src/plugins/defaults/memory/v3-eval/eval-packets.ts +2 -2
  597. package/src/plugins/defaults/memory/validation.ts +1 -1
  598. package/src/plugins/defaults/memory/worker.ts +2 -1
  599. package/src/plugins/defaults/platform-hosted/__tests__/reengage.test.ts +104 -12
  600. package/src/plugins/defaults/platform-hosted/routes/reengage.ts +104 -12
  601. package/src/plugins/types.ts +2 -2
  602. package/src/prompts/sections.ts +4 -16
  603. package/src/providers/__tests__/registry-native-web-search.test.ts +47 -2
  604. package/src/providers/anthropic/client.ts +15 -6
  605. package/src/providers/content-block-schema.ts +26 -0
  606. package/src/providers/inference/__tests__/connections-credential-normalize.test.ts +87 -0
  607. package/src/providers/inference/adapter-factory.ts +6 -0
  608. package/src/providers/inference/connections.ts +30 -14
  609. package/src/providers/model-catalog.ts +77 -0
  610. package/src/providers/openai/__tests__/chat-completions-input-audio.test.ts +260 -0
  611. package/src/providers/openai/chat-completions-provider.ts +65 -17
  612. package/src/providers/openai/input-audio.ts +76 -0
  613. package/src/providers/openrouter/client.ts +0 -2
  614. package/src/providers/platform-proxy/constants.ts +4 -0
  615. package/src/providers/poolside/client.ts +42 -0
  616. package/src/providers/registry.ts +40 -8
  617. package/src/providers/retry.ts +2 -0
  618. package/src/providers/types.ts +39 -1
  619. package/src/providers/vercel-ai-gateway/client.ts +0 -2
  620. package/src/runtime/AGENTS.md +7 -5
  621. package/src/runtime/__tests__/question-request-guardian-bridge.test.ts +173 -0
  622. package/src/runtime/__tests__/question-resolution.test.ts +111 -0
  623. package/src/runtime/access-request-helper.ts +7 -15
  624. package/src/runtime/assistant-event-hub.ts +43 -31
  625. package/src/runtime/assistant-event-publish-options.ts +31 -0
  626. package/src/runtime/assistant-event.ts +19 -30
  627. package/src/runtime/assistant-stream-state.ts +4 -4
  628. package/src/runtime/channel-approvals.ts +0 -25
  629. package/src/runtime/channel-readiness-service.ts +99 -40
  630. package/src/runtime/channel-retry-sweep.ts +38 -15
  631. package/src/runtime/confirmation-request-guardian-bridge.ts +4 -0
  632. package/src/runtime/guardian-reply-router.ts +108 -0
  633. package/src/runtime/http-server.ts +8 -0
  634. package/src/runtime/http-types.ts +2 -2
  635. package/src/runtime/process-role.ts +42 -0
  636. package/src/runtime/question-request-guardian-bridge.ts +184 -0
  637. package/src/runtime/question-resolution.ts +153 -0
  638. package/src/runtime/routes/__tests__/bookmark-routes.test.ts +6 -2
  639. package/src/runtime/routes/__tests__/conversation-query-routes.test.ts +1 -1
  640. package/src/runtime/routes/__tests__/subagents-routes.test.ts +250 -0
  641. package/src/runtime/routes/__tests__/webhook-routes.test.ts +201 -0
  642. package/src/runtime/routes/acp-routes.ts +2 -2
  643. package/src/runtime/routes/bookmark-routes.ts +3 -15
  644. package/src/runtime/routes/canned-message-complete.ts +2 -2
  645. package/src/runtime/routes/consolidation-routes.ts +8 -2
  646. package/src/runtime/routes/conversation-list-routes.ts +3 -19
  647. package/src/runtime/routes/conversation-management-routes.ts +1 -5
  648. package/src/runtime/routes/conversation-query-routes.ts +52 -8
  649. package/src/runtime/routes/conversation-routes.ts +36 -22
  650. package/src/runtime/routes/credential-request-routes.ts +0 -1
  651. package/src/runtime/routes/filing-routes.ts +7 -7
  652. package/src/runtime/routes/global-search-routes.ts +1 -1
  653. package/src/runtime/routes/guardian-approval-prompt.ts +2 -2
  654. package/src/runtime/routes/image-generation-routes.ts +12 -9
  655. package/src/runtime/routes/inbound-message-handler.ts +17 -0
  656. package/src/runtime/routes/inbound-stages/acl-enforcement.test.ts +50 -0
  657. package/src/runtime/routes/inbound-stages/acl-enforcement.ts +19 -0
  658. package/src/runtime/routes/inbound-stages/background-dispatch.ts +4 -4
  659. package/src/runtime/routes/inbound-stages/inbound-content-prep.test.ts +129 -0
  660. package/src/runtime/routes/inbound-stages/inbound-content-prep.ts +141 -9
  661. package/src/runtime/routes/index.ts +2 -0
  662. package/src/runtime/routes/lifecycle-routes.ts +199 -0
  663. package/src/runtime/routes/platform-routes.ts +3 -8
  664. package/src/runtime/routes/playground/__tests__/inject-failures.test.ts +7 -7
  665. package/src/runtime/routes/playground/__tests__/reset-circuit.test.ts +5 -5
  666. package/src/runtime/routes/question-routes.ts +34 -87
  667. package/src/runtime/routes/secret-routes.ts +11 -1
  668. package/src/runtime/routes/settings-routes.ts +8 -18
  669. package/src/runtime/routes/subagents-routes.ts +35 -8
  670. package/src/runtime/routes/upgrade-broadcast-routes.ts +4 -5
  671. package/src/runtime/routes/webhook-routes.ts +89 -30
  672. package/src/runtime/routes/workspace-routes.test.ts +7 -4
  673. package/src/runtime/slack-reply-session.test.ts +12 -12
  674. package/src/runtime/slack-reply-session.ts +17 -17
  675. package/src/runtime/sync/sync-publisher.test.ts +7 -5
  676. package/src/runtime/tool-grant-request-helper.ts +4 -0
  677. package/src/schedule/schedule-store.ts +70 -0
  678. package/src/schedule/scheduler.ts +27 -0
  679. package/src/security/AGENTS.md +1 -1
  680. package/src/security/credential-key.ts +17 -0
  681. package/src/security/secret-ingress.ts +14 -105
  682. package/src/security/secret-patterns.ts +8 -139
  683. package/src/security/secret-scanner.ts +8 -3
  684. package/src/security/store-path-override.ts +6 -16
  685. package/src/sequence/store.ts +8 -0
  686. package/src/signals/emit-event.ts +5 -10
  687. package/src/signals/event-stream.ts +20 -10
  688. package/src/subagent/manager.ts +76 -25
  689. package/src/subagent/notify.ts +8 -0
  690. package/src/subagent/types.ts +13 -3
  691. package/src/telegram/__tests__/webhook-health.test.ts +442 -0
  692. package/src/telegram/webhook-health.ts +478 -0
  693. package/src/telemetry/AGENTS.md +6 -0
  694. package/src/telemetry/memory-corpus-size.test.ts +129 -0
  695. package/src/telemetry/memory-corpus-size.ts +184 -0
  696. package/src/telemetry/memory-tier-reporter.test.ts +67 -2
  697. package/src/telemetry/memory-tier-reporter.ts +30 -3
  698. package/src/tools/__tests__/conversation-group-tool-input-schemas.test.ts +61 -0
  699. package/src/tools/__tests__/document-tool-input-schemas.test.ts +103 -0
  700. package/src/tools/__tests__/followup-call-acp-tool-input-schemas.test.ts +125 -0
  701. package/src/tools/__tests__/schedule-tool-input-schemas.test.ts +83 -0
  702. package/src/tools/__tests__/subagent-workflow-tool-input-schemas.test.ts +116 -0
  703. package/src/tools/__tests__/tool-input-schemas.test.ts +192 -0
  704. package/src/tools/__tests__/tool-schema-drift-harness.ts +142 -0
  705. package/src/tools/acp/abort.ts +21 -1
  706. package/src/tools/acp/context.ts +5 -5
  707. package/src/tools/acp/spawn.test.ts +15 -5
  708. package/src/tools/acp/spawn.ts +26 -3
  709. package/src/tools/acp/status.ts +20 -1
  710. package/src/tools/acp/steer.test.ts +20 -0
  711. package/src/tools/acp/steer.ts +23 -2
  712. package/src/tools/apps/resolve-app-id.ts +15 -3
  713. package/src/tools/ask-question/ask-question-tool.test.ts +65 -0
  714. package/src/tools/ask-question/ask-question-tool.ts +68 -92
  715. package/src/tools/browser/browser-screencast.ts +6 -6
  716. package/src/tools/calls/call-end.ts +24 -3
  717. package/src/tools/calls/call-start.ts +35 -11
  718. package/src/tools/calls/call-status.ts +20 -1
  719. package/src/tools/conversation-groups/group_create.ts +63 -0
  720. package/src/tools/conversation-groups/group_list.ts +20 -0
  721. package/src/tools/conversation-groups/group_shared.ts +52 -0
  722. package/src/tools/conversation-groups/move_to_group.ts +106 -0
  723. package/src/tools/document/document-comment-tool.test.ts +49 -0
  724. package/src/tools/document/document-comment-tool.ts +45 -6
  725. package/src/tools/document/document-tool.ts +142 -24
  726. package/src/tools/executor.ts +27 -13
  727. package/src/tools/filesystem/edit.ts +62 -60
  728. package/src/tools/filesystem/list.ts +36 -29
  729. package/src/tools/filesystem/read.ts +56 -39
  730. package/src/tools/filesystem/write.ts +44 -38
  731. package/src/tools/followups/followup_create.ts +41 -12
  732. package/src/tools/followups/followup_list.ts +34 -6
  733. package/src/tools/followups/followup_resolve.ts +26 -4
  734. package/src/tools/host-filesystem/edit.ts +50 -60
  735. package/src/tools/host-filesystem/read.ts +45 -39
  736. package/src/tools/host-filesystem/write.ts +31 -36
  737. package/src/tools/host-terminal/host-shell.ts +76 -62
  738. package/src/tools/policy-context.ts +27 -10
  739. package/src/tools/schedule/create.ts +76 -33
  740. package/src/tools/schedule/delete.ts +21 -2
  741. package/src/tools/schedule/list.ts +25 -3
  742. package/src/tools/schedule/update.ts +105 -48
  743. package/src/tools/shared/filesystem/path-policy.ts +246 -40
  744. package/src/tools/shared/zod-tool-schema.ts +117 -0
  745. package/src/tools/subagent/abort.ts +12 -4
  746. package/src/tools/subagent/consult-deadline.ts +9 -3
  747. package/src/tools/subagent/message.ts +21 -5
  748. package/src/tools/subagent/notify-parent.ts +44 -23
  749. package/src/tools/subagent/read.ts +15 -4
  750. package/src/tools/subagent/resolve.ts +26 -4
  751. package/src/tools/subagent/spawn.ts +37 -13
  752. package/src/tools/subagent/status.ts +12 -4
  753. package/src/tools/system/request-permission.ts +35 -26
  754. package/src/tools/terminal/shell.ts +68 -55
  755. package/src/tools/tool-approval-handler.ts +327 -53
  756. package/src/tools/tool-input-schemas.ts +85 -0
  757. package/src/tools/tool-types.ts +7 -0
  758. package/src/tools/types.ts +8 -0
  759. package/src/tools/workflows/manage-workflows.ts +30 -2
  760. package/src/tools/workflows/run-workflow.test.ts +54 -2
  761. package/src/tools/workflows/run-workflow.ts +32 -4
  762. package/src/util/fs-symlinks.ts +30 -0
  763. package/src/util/log-redact.ts +7 -3
  764. package/src/util/platform.ts +15 -0
  765. package/src/vellum-assistant-namespace.d.ts +80 -0
  766. package/src/watcher/watcher-store.ts +8 -0
  767. package/src/workflows/leaf-runner.test.ts +104 -2
  768. package/src/workflows/leaf-runner.ts +31 -6
  769. package/src/workspace/migrations/070-memory-v2-summary-schema-rebuild.ts +2 -2
  770. package/src/workspace/migrations/134-image-generation-mode-to-provider.ts +128 -0
  771. package/src/workspace/migrations/135-copy-substrate-tunables.ts +248 -0
  772. package/src/workspace/migrations/__tests__/135-copy-substrate-tunables.test.ts +446 -0
  773. package/src/workspace/migrations/__tests__/backfill-v3-leaves.test.ts +2 -2
  774. package/src/workspace/migrations/registry.ts +4 -0
  775. package/tsconfig.plugin-api.json +1 -1
  776. package/src/__tests__/memory-retrieval-budget.test.ts +0 -49
  777. package/src/__tests__/secret-patterns.test.ts +0 -27
  778. package/src/config/__tests__/proc-to-skills.test.ts +0 -21
  779. package/src/config/memory-tier.test.ts +0 -44
  780. package/src/daemon/message-types/acp.ts +0 -20
  781. package/src/daemon/message-types/apps.ts +0 -11
  782. package/src/daemon/message-types/background-tools.ts +0 -14
  783. package/src/daemon/message-types/bookmarks.ts +0 -13
  784. package/src/daemon/message-types/contacts.ts +0 -13
  785. package/src/daemon/message-types/document-comments.ts +0 -14
  786. package/src/daemon/message-types/documents.ts +0 -13
  787. package/src/daemon/message-types/home.ts +0 -15
  788. package/src/daemon/message-types/host-bash.ts +0 -12
  789. package/src/daemon/message-types/host-cu.ts +0 -10
  790. package/src/daemon/message-types/host-file.ts +0 -12
  791. package/src/daemon/message-types/host-transfer.ts +0 -12
  792. package/src/daemon/message-types/integrations.ts +0 -90
  793. package/src/daemon/message-types/memory.ts +0 -10
  794. package/src/daemon/message-types/schedules.ts +0 -14
  795. package/src/daemon/message-types/settings.ts +0 -17
  796. package/src/daemon/message-types/subagents.ts +0 -63
  797. package/src/daemon/message-types/upgrades.ts +0 -14
  798. package/src/daemon/message-types/workflows.ts +0 -25
  799. package/src/daemon/message-types/workspace.ts +0 -137
  800. package/src/live-voice/ack-phrases.ts +0 -58
  801. package/src/plugins/defaults/memory/retrieval-budget.ts +0 -29
  802. package/src/plugins/defaults/memory/v3/__tests__/gate-flag.test.ts +0 -69
  803. package/src/plugins/defaults/memory/v3/gate-flag.ts +0 -20
  804. package/src/plugins/defaults/memory/v3/substrate/__tests__/memory-v2-startup.test.ts +0 -86
  805. package/src/plugins/defaults/memory/v3/substrate/memory-v2-startup.test.ts +0 -205
  806. /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/concept-page-frontmatter-schema.test.ts +0 -0
  807. /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/consolidation-prompt-flag-gating-guard.test.ts +0 -0
  808. /package/src/plugins/defaults/memory/{v3/substrate → substrate}/__tests__/injected-block-slugs.test.ts +0 -0
  809. /package/src/plugins/defaults/memory/{v3/substrate → substrate}/cli-command-content.ts +0 -0
@@ -0,0 +1,775 @@
1
+ # Memory Plugin — Agent Instructions
2
+
3
+ Rules for code under `assistant/src/plugins/defaults/memory/` (`MEM/` below).
4
+ For the user-facing architecture narrative — what each tier does and how the
5
+ write and read paths fit together — read `assistant/docs/architecture/memory.md`
6
+ first. This file is the layering contract: where code goes, which names can
7
+ never be renamed, and how to retire a tier.
8
+
9
+ ## Tier movement is one-way
10
+
11
+ **v1 and v2 are legacy. Assistants move v1 → v2 → v3 and never back.** There is
12
+ no supported path from v3 to an earlier tier, so "what happens when an assistant
13
+ returns to v1 (or v2)" is not a scenario this code serves.
14
+
15
+ That rules out a whole class of plausible-sounding work: reconciling state that
16
+ a lower tier would need, keeping a lower tier's derived data warm while a higher
17
+ tier is live, or postponing a lower tier's jobs so they survive a downgrade.
18
+ Review feedback will periodically ask for exactly that — the reasoning looks
19
+ sound in isolation, because the state genuinely is missing. Decline it and point
20
+ here. The correct fix for a lower tier's stale derived data is to delete the
21
+ lower tier (see the runbooks below), not to maintain it.
22
+
23
+ Two consequences worth stating plainly:
24
+
25
+ - The return-to-v1 path has been **removed**, not merely left vestigial: the
26
+ `v1_entry_reconcile_done` checkpoint, its re-arm in `jobs-worker.ts`, the boot
27
+ claim in `startup.ts`, and `reconcileCapabilityEmbeddings` in
28
+ `graph/capability-seed.ts` are all gone. Do not reintroduce them. (A stale
29
+ `v1_entry_reconcile_done` row may still sit in `memory_checkpoints` on an
30
+ upgraded install; nothing reads it, so it is inert and needs no migration.)
31
+ - Gaps that only manifest after a downgrade are **not bugs**. Record them here
32
+ if they are non-obvious; do not build machinery to close them.
33
+
34
+ ## Directory / tier map
35
+
36
+ The plugin is layered into **tier directories** plus a **spine** that composes
37
+ them. Everything not listed as a tier directory is spine.
38
+
39
+ | Directory | What lives there | Gate predicate |
40
+ | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- |
41
+ | `substrate/` | The shared concept-page substrate (v2 + v3): `page-store`, `page-index`, `edge-index`, `qdrant`, `sim`, `sparse-bm25`, `spread`, `skill-store`, `cli-command-store`, `skill-content`, `cli-command-content`, `injected-block-slugs`, `static-context`, `boot-maintenance`, `frontmatter-sweep`, `consolidation-job`, `sweep-job`, `reembed-job`, `tuning`, `types`, `constants`, `prompts/`. | `usesConceptPageMemory()` |
42
+ | `v1/` | The legacy PKB/graph engine: `pkb/`, `graph/` (retriever, triggers, scoring, serendipity, extraction, extraction-job, decay, consolidation, pattern-scan, narrative, bootstrap, injection, and the hybrid node-search half of `graph-search`), `jobs/embed-pkb-file.ts`, `job-handlers/{backfill,embedding,index-maintenance}.ts`, `pkb-schedule.ts`, `filing-jobs.ts`, `semantic-search.ts`, `identity-context.ts`, `README.md`. | `isMemoryV1Active()` |
43
+ | `v2/` | The v2 activation/router injection engine: `activation`, `activation-store`, `activation-log-store`, `concept-frequency`, `injection`, `injection-events`, `router`, `reranker`, `rerank-local`, `migration`, `now-text`, `backfill-jobs` (migrate + activation-recompute), `harness/`, `prompts/router`. | `isV2InjectionEngineActive()` |
44
+ | `v3/`, `v3-eval/` | The v3 lanes, orchestrator, injectors, maintain job, and the eval siblings. | `isMemoryV3Live()` |
45
+
46
+ Everything else under the plugin root is **spine**:
47
+
48
+ - `graph/` — the **all-tier** legacy-graph store plus the tier dispatcher:
49
+ `conversation-graph-memory.ts` (the v1↔v2 dispatch spine; also owns
50
+ compaction eviction of v2 activation rows and v3 `everInjected` state, and
51
+ the injected-block strip identity), `store.ts`, `tool-handlers.ts`,
52
+ `tools.ts`, `capability-seed.ts`, `in-context-tracker.ts`, `graph-search.ts`
53
+ (node/trigger **embedding** plumbing — the v1 search half lives in
54
+ `v1/graph/graph-search.ts`), `graph-memory-state-store.ts`, `types.ts`,
55
+ `image-ref-utils.ts`. Despite the `memory_graph_*` naming, this directory is
56
+ not v1: capability seeding writes graph nodes on every tier.
57
+ - `graph-topology/` — the backend-agnostic memory-graph view served to the web
58
+ Memory tab (`build-memory-graph.ts`, `pending-buffer.ts`).
59
+ - Shared infra at the root: `logging`, `paths`, `embeddings`, `anisotropy`,
60
+ `frontmatter`, `validation`, `llm-helpers`, `config`, `memory-db`,
61
+ `host-utils`, `path-containment`, `prompt-override`, `memory-marker`,
62
+ `segmenter`, `message-media`, `worker`, `worker-control`,
63
+ `memory-recall-log-store`, `activation-session-store` (the onboarding
64
+ activation rail — **not** a memory tier despite the name),
65
+ `tail-reinjection-strip`, `task-memory-cleanup`, `conversation-memory-purge`,
66
+ `conversation-memory-orphan-sweep`, `fork-conversation-memory`,
67
+ `find-most-recent-retrospective-for`.
68
+ - The `memory-retrospective-*` family — tier-agnostic, gated on
69
+ `memory.enabled` alone. The one exception is
70
+ `memory-retrospective-skill-card.ts`, whose upstream enqueue only fires when
71
+ `isV3TierActive()` holds (memory on and v3 live).
72
+ - The rest of the spine: `startup.ts`, `jobs-worker.ts`, `job-handlers.ts`,
73
+ `job-handler-registration.ts`, `indexer.ts`, `injectors.ts`, `tools.ts`,
74
+ `hooks/`, `src/` (HTTP routes), `context-search/`.
75
+
76
+ ### The layering rule
77
+
78
+ **Tier directories never import each other.** The only sanctioned edge is
79
+ `substrate/` upward: `v2/` and `v3/`/`v3-eval/` may import `substrate/`, and
80
+ `substrate/` imports no tier. `v1/` imports no tier at all.
81
+
82
+ **Multi-tier composition happens only at the spine.** A spine file that imports
83
+ from two or more tier directories is a composition point and must be on the
84
+ frozen `SPINE_ALLOWLIST`, which today is exactly:
85
+
86
+ ```
87
+ fork-conversation-memory.ts
88
+ graph-topology/build-memory-graph.ts
89
+ graph/conversation-graph-memory.ts
90
+ injectors.ts
91
+ job-handlers.ts
92
+ jobs-worker.ts
93
+ src/memory-v2-routes.ts
94
+ startup.ts
95
+ ```
96
+
97
+ The list is frozen: new multi-tier composition belongs in one of these files,
98
+ and shrinking the list is how the deletion runbooks below retire an engine.
99
+ Inside them the tier arms carry `// V1 — delete with v1` /
100
+ `// V2 ENGINE — delete with v2` / `// SUBSTRATE (v2+v3)` banners, so
101
+ `grep -rn 'delete with v1' src/plugins/defaults/memory/` finds every v1 arm.
102
+ Two conventions keep that grep honest, and both are load-bearing:
103
+
104
+ - **The banner phrase is exact.** `startup.ts` labels its sections
105
+ `// ---- <tier> ... ----` rather than `// V1 …`, so its v1 labels spell out
106
+ `— delete with v1` too (`// ---- v1 (legacy engine) — delete with v1 ----`);
107
+ otherwise its three v1 blocks would be invisible to the grep.
108
+ - **Dispatch call sites are banner-marked, not just function bodies.** A v1
109
+ helper is typically an `else` arm calling a banner-marked function
110
+ (`jobs-worker.ts`'s `enqueueV1MaintenanceJobs`, `indexer.ts`'s
111
+ `enqueueV1IndexTriggers`). Deleting only the marked bodies leaves the calls
112
+ dangling, so the call sites carry their own banner.
113
+
114
+ `indexer.ts`, `injectors.ts`, and `context-search/sources/memory.ts` follow the
115
+ same convention even where the file touches a single tier.
116
+
117
+ **`injectors.ts` is the plugin's single injector entry point.** Its exported
118
+ `memoryInjectors` is the complete set `defaultMemoryPlugin` contributes —
119
+ including the v3 pair defined in `v3/injector.ts` — so `plugins/defaults/index.ts`
120
+ imports the array and nothing else. A new tier injector is added to that array,
121
+ never registered from the host.
122
+
123
+ Both rules are enforced by `__tests__/memory-tier-boundary-guard.test.ts`, which
124
+ also carries a reverse stale-exemption test: an allowlist entry whose multi-tier
125
+ import disappears fails loudly instead of lingering. Related guards:
126
+
127
+ - `src/__tests__/plugin-import-boundary-guard.test.ts` — relative-specifier
128
+ baseline for the whole plugin tree.
129
+ - `src/__tests__/persistence-layering-guard.test.ts` — one-way
130
+ memory → persistence direction. It holds **two** separate maps, and they mean
131
+ opposite things:
132
+ - `PERSISTENCE_TO_MEMORY_ALLOWLIST` — genuine tech debt, ratcheting to zero.
133
+ Today it holds exactly one file, `persistence/conversation-crud.ts`
134
+ (`fork-conversation-memory`, `indexer`).
135
+ - `MIGRATION_REGISTRY_MEMORY_IMPORTS` — a **permanent** exception, not tech
136
+ debt: `persistence/steps.ts` is the migration registry and references each
137
+ migration in the domain that owns it, today
138
+ `{"v1/graph/bootstrap"}`. Deleting v1 does not retire the exemption, it
139
+ moves the **pointer**: the v1 runbook relocates `migrateToolCreatedItems`
140
+ to a surviving home (the registration is append-only and must keep
141
+ running), and this entry is repointed at that module — or drops out only
142
+ if the function lands inside `persistence/` itself.
143
+ - `src/plugins/__tests__/plugin-state-boundary-guard.test.ts` — the
144
+ grandfathered main-DB exception for this plugin (do not grow its surface).
145
+
146
+ ## Which predicate gates what
147
+
148
+ All predicates live in `assistant/src/config/memory-v3-gate.ts`. **Nothing else
149
+ may read raw `memory.v2.*` / `memory.v3.*` tier keys** — those reads are a
150
+ layering leak, and the boundary guard's `TIER_KEY_READ_ALLOWLIST` pins the
151
+ frozen (path, namespace) exemptions.
152
+
153
+ | Predicate | True when | Gates |
154
+ | ------------------------------ | ------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
155
+ | `isMemoryEnabled` | `memory.enabled !== false` (master switch, defaults on) | the whole memory system, the retrospective family, the jobs worker's memory drain |
156
+ | `isMemoryV1Active` | memory on AND no concept-page consumer | everything under `v1/`, the v1 job handlers, the v1 maintenance/index triggers |
157
+ | `isV2InjectionEngineActive` | memory on AND `memory.v2.enabled === true` AND v3 not live | v2's turn-time selection — the ONLY correct "should v2 select this turn" check |
158
+ | `isMemoryV2ExplicitlyDisabled` | `memory.v2.enabled === false` (deliberately not the negation above) | `daemon/embedding-reconcile.ts`'s explicit-opt-out suppression |
159
+ | `usesConceptPageMemory` | memory on AND (`memory.v3.live` OR `memory.v2.enabled`) | everything under `substrate/`, the graph tool handlers, the static `<info>` block |
160
+ | `isMemoryV3Live` | `memory.v3.live === true` | everything under `v3/`, and the v2 suppression at runtime assembly |
161
+ | `isV3TierActive` | memory on AND v3 live (the v3 TIER — `memoryTier() === "v3"`) | `GET /memory-graph` + the `graph_supported` bit, AND procedural-memory-as-skills |
162
+
163
+ `memory.v2.enabled` defaults **true** and typically stays set on v3-live
164
+ assistants, so a direct read of it misbehaves under v3. That is exactly why
165
+ `isV2InjectionEngineActive` exists — reach for the predicate, never the key.
166
+
167
+ **`isMemoryV1Active` is not the only v1 gate.** Several v1 code paths key on
168
+ `!usesConceptPageMemory(config.memory)` instead — notably the v1 Qdrant
169
+ collection lifecycle and the PKB index reconcile in `startup.ts`, and the
170
+ tier dispatch in `jobs-worker.ts` / `indexer.ts` / `context-search/sources/`.
171
+ The two agree everywhere except when memory is OFF: `isMemoryV1Active` is
172
+ false, but `!usesConceptPageMemory` is **true**, so those paths still run.
173
+ That is observable in `startup.ts`, which has no memory-enabled guard of its
174
+ own — a `memory.enabled: false` assistant still ensures/migrates the v1
175
+ collection on boot (only the follow-up `rebuild_index` enqueue is
176
+ `isMemoryEnabled()`-gated). Read the actual gate before assuming a v1 block
177
+ is inert on an off assistant.
178
+
179
+ `assistant/src/config/memory-tier.ts`'s `memoryTier()` is fully DERIVED from
180
+ these predicates (`off` → `v3` → `v2` → `v1`, in that precedence), so the
181
+ telemetry buckets and the runtime gates can never disagree.
182
+ `persistence/jobs-store.ts`'s config-singleton `isMemoryEnabled()` delegates to
183
+ the gate predicate for the same reason.
184
+
185
+ ## Config namespaces
186
+
187
+ | Namespace | Role |
188
+ | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
189
+ | `memory.enabled` | Master switch. `false` turns the whole system off regardless of tier keys. |
190
+ | `memory.substrate.*` | **Override-only** substrate tuning. Fifteen keys, every one optional with no default. |
191
+ | `memory.v2.*` | The v2 engine's own tunables (activation weights, router, rerank) **plus** the historical substrate twins that supply the effective defaults. |
192
+ | `memory.v3.*` | v3 lane/orchestrator tuning, plus `memory.v3.live`. |
193
+ | `memory.retrospective.*` | Retrospective cadence and triggers — tier-agnostic. |
194
+
195
+ `substrate/tuning.ts`'s `resolveSubstrateTuning` is the substrate's **single
196
+ config choke point**: each key resolves as `memory.substrate.X ?? memory.v2.X`
197
+ (an explicit `null` on a nullable key counts as present and wins).
198
+ `spread_k` / `spread_hops` / `ann_candidate_limit` map onto `memory.v2.k` /
199
+ `memory.v2.hops` / `memory.v2.ann_candidate_limit`; every other key shares its
200
+ name with its twin.
201
+
202
+ Because a single substrate weight forms its effective pair with the v2 twin,
203
+ the dense/sparse sum-to-1 invariant is checked in three places for three
204
+ disjoint cases: the substrate schema's own refinement (both set), the v2
205
+ schema's (neither set), and the parent `MemoryConfigSchema.superRefine` (the
206
+ mixed case, over the RESOLVED pair). Keep all three when touching the weights.
207
+
208
+ Twelve of the fifteen twins reach the runtime through `resolveSubstrateTuning`
209
+ and nothing else, so once the `memory.substrate` key exists a `config set` on
210
+ the `memory.v2` twin persists but changes nothing. The other three — `k`,
211
+ `hops`, `ann_candidate_limit` — are read a **second** time by the live v2
212
+ injection engine straight off `config.memory.v2` (`v2/injection.ts`,
213
+ `v2/activation.ts`, `v2/backfill-jobs.ts`), so a write there retunes v2
214
+ injection while substrate recall stays on the substrate twin: the two
215
+ namespaces hold two effective values at once.
216
+
217
+ `config/substrate-twin-shadowing.ts` pairs the namespaces and carries the
218
+ `alsoReadByV2Engine` flag that separates the two classes, so neither case reads
219
+ as the other: the `config_set` route returns a `warning` (a no-op notice for a
220
+ substrate-only twin, a divergence notice for an engine-read one) and
221
+ `assistant config get` prints the matching `Shadowed:` / `Split:` line.
222
+
223
+ Workspace migration 135 copies explicitly-set NON-DEFAULT `memory.v2` substrate
224
+ tunables into `memory.substrate`. It skips loader-seeded defaults — including
225
+ `bm25_b`'s earlier `0.75` default — because raw presence in `config.json` is not
226
+ user intent (the loader serializes the fully-parsed config), and copying seeded
227
+ values would permanently pin those assistants when substrate defaults are
228
+ retuned.
229
+
230
+ ## FROZEN NAMES
231
+
232
+ These names are durable or wire-visible. **Never rename them**, including
233
+ during a tier deletion — several are spelled `v2` but belong to the substrate,
234
+ which outlives the v2 engine.
235
+
236
+ ### SQLite tables
237
+
238
+ Persisted rows; a rename orphans every existing install.
239
+
240
+ | Table | Owner |
241
+ | --------------------------------- | ----------------------------------- |
242
+ | `memory_graph_nodes` | all-tier (`graph/store.ts`) |
243
+ | `memory_graph_edges` | all-tier |
244
+ | `memory_graph_triggers` | all-tier |
245
+ | `memory_graph_node_edits` | all-tier |
246
+ | `memory_segments` | v1 indexing |
247
+ | `memory_summaries` | v1 indexing |
248
+ | `memory_embeddings` | shared embedding cache |
249
+ | `memory_checkpoints` | shared (all durable checkpoints) |
250
+ | `memory_jobs` | shared job queue |
251
+ | `memory_recall_logs` | shared recall audit |
252
+ | `conversation_graph_memory_state` | `graph/graph-memory-state-store.ts` |
253
+ | `activation_state` | v2 per-conversation activation |
254
+ | `memory_v2_activation_logs` | v2 inspector/harness |
255
+ | `memory_v2_injection_events` | v2 scoring feedback |
256
+ | `memory_v3_selections` | v3 selection log |
257
+ | `memory_v3_ever_injected` | v3 card dedup |
258
+ | `memory_retrospective_state` | retrospective (tier-agnostic) |
259
+ | `activation_sessions` | onboarding activation rail |
260
+
261
+ ### Job types (`memory_jobs.type`)
262
+
263
+ Persisted in job rows; unknown types either throw or get silently drained.
264
+
265
+ - Substrate: `memory_v2_consolidate`, `memory_v2_sweep`, `memory_v2_reembed`,
266
+ `embed_concept_page`
267
+ - v2 engine: `memory_v2_migrate`, `memory_v2_activation_recompute`
268
+ - v3: `memory_v3_maintain`
269
+ - Retrospective: `memory_retrospective`, `memory_retrospective_sweep`,
270
+ `skill_card_insert`
271
+ - v1: `graph_extract`, `graph_decay`, `graph_consolidate`, `graph_pattern_scan`,
272
+ `graph_narrative_refine`, `graph_bootstrap`, `embed_pkb_file`, `pkb_filing`,
273
+ `pkb_compaction`, `rebuild_index`, `backfill`, `delete_qdrant_vectors`,
274
+ `sweep_orphaned_graph_node_points`
275
+ - All-tier embedding: `embed_graph_node`, `graph_trigger_embed`,
276
+ `embed_segment`, `embed_summary`, `embed_media`, `embed_attachment`
277
+ - Retired, still in the union: `memory_v3_consolidate`,
278
+ `memory_v3_index_maintenance`, `memory_v3_edge_learning` (v3-rip casualties —
279
+ handlers removed) and `conversation_analyze` — never enqueued, but they stay
280
+ `MemoryJobType` members **and** `LEGACY_JOB_TYPES` members so pre-upgrade rows
281
+ drain silently
282
+ - Retired, `LEGACY_JOB_TYPES` only (already out of the union):
283
+ `memory_v2_rebuild_edges`, `memory_proc_distill`, and the pre-memory batch
284
+ (`embed_item`, `extract_items`, `batch_extract`, `extract_entities`,
285
+ `cleanup_stale_superseded_items`, `backfill_entity_relations`,
286
+ `refresh_weekly_summary`, `refresh_monthly_summary`, `journal_carry_forward`,
287
+ `generate_capability_cards`, `generate_thread_starters`)
288
+
289
+ Retired types are never deleted from the `MemoryJobType` union — they move to
290
+ `LEGACY_JOB_TYPES` in `jobs-worker.ts` so pre-upgrade rows drain instead of
291
+ throwing. Dropping a name from **either** list strands the persisted rows that
292
+ still carry it: the worker's dispatch falls through to
293
+ `Unknown memory job type: <type>` and the row fails forever instead of
294
+ completing. The `LEGACY_JOB_TYPES` set is therefore append-only in practice —
295
+ prune it only after you can prove no install still holds a pending row.
296
+
297
+ ### Checkpoint keys (`memory_checkpoints.key`)
298
+
299
+ `GRAPH_MAINTENANCE_CHECKPOINTS` in `jobs-worker.ts`, plus the consolidation
300
+ failure record and the section re-embed high-water:
301
+
302
+ - `memory_v2_consolidate_last_run`, `memory_v3_maintain_last_run` — cadence
303
+ - `memory_v2_consolidate_failure_state` (`substrate/consolidation-job.ts`) —
304
+ the consolidation backoff record
305
+ - `memory_v3_maintain:sections_embedded_through_ms`
306
+ (`v3/section-dense-store.ts`'s `MAINTAIN_EMBED_HIGH_WATER_KEY`) — durable
307
+ epoch-ms high-water of the last successful section re-embed pass; when it is
308
+ absent the maintain job re-embeds EVERY page, so losing or renaming it forces
309
+ a full rebuild. Distinct from the `memory_v3_maintain_last_run` cadence key
310
+ despite the shared prefix
311
+ - v1: `graph_maintenance:{decay,consolidate,pattern_scan,narrative}:last_run`,
312
+ `pkb_filing_last_run`, `pkb_compaction_last_run`,
313
+ `graph_bootstrap:*`, `memory:backfill:*`
314
+ - `retro_sweep:last_run` — retrospective sweep cadence
315
+
316
+ ### On-disk / vector-store names
317
+
318
+ | Name | Where | Why frozen |
319
+ | ----------------------------- | ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
320
+ | `memory_v2_concept_pages` | `substrate/qdrant.ts` `MEMORY_V2_COLLECTION` | Qdrant collection on disk. **Duplicated** in `persistence/embeddings/embedding-identity.ts` — change neither. |
321
+ | `memory_v3_sections` | `v3/section-dense-store.ts` `SECTION_COLLECTION` | Qdrant collection on disk |
322
+ | `.memory-v2-reembed-required` | `substrate/qdrant.ts` | on-disk sentinel read across upgrades |
323
+ | `memory/.v2-state/` | `substrate/consolidation-job.ts`, `v2/migration.ts`, workspace migration 060 | persisted workspace path (consolidation lock, migration sentinel) |
324
+
325
+ ### Wire-visible strings
326
+
327
+ | Name | Kind | Why frozen |
328
+ | --------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------------- |
329
+ | `memory_v2_consolidation` | `conversations.source` value | persisted on every consolidation run |
330
+ | `memory_retrospective` | request origin / `TitleOrigin` member | the permission checker's skill-authoring auto-grant is scoped to it |
331
+ | `skill-authored-card` | message kind | persisted on skill-card messages |
332
+ | `memoryV2Consolidation`, `memoryRetrospective` | LLM call-site ids | logging/attribution buckets |
333
+ | `memoryInjectedBlock`, `memoryV2StaticBlock`, `memoryV3InjectedBlock`, `memoryV3Commit` | message-metadata keys | persisted on messages; drives re-injection and the strip |
334
+ | `memory-v2-static` | injector + block id | `daemon/conversation-runtime-assembly.ts` matches on it |
335
+ | `MEMORY_V2_DISABLED` | error code | clients branch on it |
336
+ | `memory.v2.sweep` | notification job identifier | surfaced in `activity.failed` |
337
+
338
+ ### HTTP surface
339
+
340
+ Operation ids and endpoints are published in `assistant/openapi.yaml` and
341
+ consumed by generated clients:
342
+
343
+ - `memory-items`, `memory-items/:id` (`listMemoryItems`, `getMemoryItem`,
344
+ `createMemoryItem`, `updateMemoryItem`, `deleteMemoryItem`)
345
+ - `memory-nodes`, `memory-nodes/delete`, `memory-nodes/update`
346
+ (`listMemoryNodes`, `deleteMemoryNode`, `updateMemoryNode`)
347
+ - `memory/remember` (`createMemory`), `memory/stats` (`getMemoryStats`)
348
+ - `memory-graph`, `memory-graph-node` (`getMemoryGraph`, `getMemoryGraphNode`)
349
+ - `memory/v2/*` — `backfill`, `compare-retrievers`, `concept-frequency`,
350
+ `concept-page`, `ema-scores`, `list-concept-pages`, `now-text`,
351
+ `reembed-skills`, `router-prompt-template`, `simulate-router`, `validate`
352
+ (operation ids `memory_v2_*`)
353
+ - `memory/v3/*` — `backfill-sections`, `rebuild-index`
354
+ - `memory/worker/*`, `memory/eval/*`
355
+ - `consolidation/config`, `consolidation/run-now`, `consolidation/runs`
356
+ - `filing/config`, `filing/run-now` (v1)
357
+
358
+ ### Telemetry
359
+
360
+ | Name | Kind | Consumer |
361
+ | ----------------------------------------------------------------------------- | -------------------- | ------------------- |
362
+ | `memory.enabled`, `memory.v2.enabled`, `memory.v3.live` | config-setting keys | platform dashboards |
363
+ | `memory_tier` check_name + `detail.tier` ∈ `off`/`v1`/`v2`/`v3` | watchdog event | platform dashboards |
364
+ | `memory_v3_injection_gate`, `memory_v3_selection`, `memory_retrospective_run` | watchdog check names | platform dashboards |
365
+
366
+ Renaming any of these silently breaks a dashboard rather than failing a build —
367
+ coordinate with the platform before touching them. The `memory_tier` contract
368
+ (check name plus the exact `off`/`v1`/`v2`/`v3` bucket strings) is specified in
369
+ `src/telemetry/AGENTS.md` — that is the authoritative statement; do not restate
370
+ its rules here.
371
+
372
+ ### Log component names
373
+
374
+ `getLogger("<scope>")` tags every line the module emits with that scope, so a
375
+ scope name is **observable**: saved log queries, `vellum logs` filters, and
376
+ support runbooks grep on it. Renaming one does not fail a build and does not
377
+ lose data — it silently empties whatever was filtering on the old name. Not
378
+ frozen the way a table or a wire string is, but rename deliberately and expect
379
+ to update queries.
380
+
381
+ Two scopes changed in the tier split and are called out here so a stale query
382
+ is diagnosable:
383
+
384
+ | Module | Scope now | Was |
385
+ | ---------------------------- | ------------------- | ----------------------------------------------------- |
386
+ | `substrate/boot-maintenance` | `boot-maintenance` | `memory-v2-startup` |
387
+ | `substrate/reembed-job` | `memory-v2-reembed` | `memory-v2-backfill` (shared with `v2/backfill-jobs`) |
388
+
389
+ The reembed job was extracted out of `v2/backfill-jobs.ts`, so its lines moved
390
+ from the shared `memory-v2-backfill` scope to a dedicated one; the surviving
391
+ `memory_v2_migrate` / `memory_v2_activation_recompute` jobs still log under
392
+ `memory-v2-backfill`. Note that most substrate scopes keep their `memory-v2-*`
393
+ spelling (`memory-v2-qdrant`, `memory-v2-page-index`, `memory-v2-consolidate`,
394
+ `memory-v2-sweep`, …) — same rule as the frozen names above: the `v2` spelling
395
+ does not make them the v2 engine's, and they must not be renamed
396
+ opportunistically with it.
397
+
398
+ ## Deletion runbook: v1
399
+
400
+ ### Prerequisites that BLOCK deletion
401
+
402
+ Do not start until both are resolved. Each is a live all-tier dependency on
403
+ v1-era machinery.
404
+
405
+ 1. **The graph node surface is all-tier.** `graph/store.ts`,
406
+ `graph/capability-seed.ts`, and `graph/tool-handlers.ts` write and read
407
+ `memory_graph_nodes` on **every** tier. The `handleListMemory` /
408
+ `handleDeleteMemory` / `handleUpdateMemory` handlers are gated on
409
+ `usesConceptPageMemory()` yet operate on that v1-era store — so the node
410
+ surface (and the `memory-nodes` routes and `memory items` CLI over it) must
411
+ be ported to the substrate or retired **before** v1 can go. Deleting `v1/`
412
+ does not remove these tables.
413
+ 2. **`graph/conversation-graph-memory.ts` owns all-tier duties.** Beyond the
414
+ v1↔v2 dispatch it does compaction eviction of v2 activation rows and v3
415
+ `everInjected` state (`onCompacted`), and it defines the injected-block strip
416
+ identity that `daemon/conversation-runtime-assembly.ts` matches on. Those
417
+ move to a tier-neutral home first.
418
+
419
+ ### External consumers to repoint or retire
420
+
421
+ The steps below cover the plugin's own spine. These three production files sit
422
+ **outside** `MEM/` and import `v1/` directly, so a deletion that skips them
423
+ leaves broken imports and an unbuildable tree. Handle them in the same change,
424
+ before or alongside step 1.
425
+
426
+ 1. **`runtime/routes/global-search-routes.ts`** → `semanticSearch` from
427
+ `v1/semantic-search.ts`. **Retire the route arm.** It backs only
428
+ `searchMemoriesSemantic`, the `deep=true` half of the `memories` category,
429
+ and `semanticSearch` already returns `[]` on any concept-page assistant (its
430
+ own `usesConceptPageMemory` early return), so the arm is dead on every
431
+ non-v1 install. Delete `searchMemoriesSemantic` and its `deep` call site.
432
+ Do **not** repoint it at the substrate: the sibling `searchMemoryItems` is a
433
+ lexical scan of `memory_graph_nodes` — all-tier, and it keeps the category
434
+ answering — while surfacing concept pages here is a new feature over a
435
+ different id space (page slugs, not node ids) and belongs in its own change.
436
+ Both the `deep` query parameter and the response `source` enum
437
+ (`lexical` | `semantic`) are published in `assistant/openapi.yaml`: `deep`
438
+ becomes a no-op and `semantic` an unreachable variant, and narrowing either
439
+ is a separate, client-coordinated spec change.
440
+ 2. **`tools/filesystem/write.ts`** → `enqueuePkbIndexJob` from
441
+ `v1/jobs/embed-pkb-file.ts`. **Delete the call site.** It fire-and-forgets a
442
+ PKB re-index after a `file_write` under `workspace/pkb/**.md`, and
443
+ `enqueuePkbIndexJob` already returns `""` when `usesConceptPageMemory()`
444
+ holds — the call is inert under the substrate. Drop the whole `pkbRoot` /
445
+ `isInsidePkbRoot` try block; keep the local `isInsidePkbRoot` helper, which
446
+ the apps-dir containment check earlier in the file still uses. There is no
447
+ substrate equivalent to repoint to — concept pages are re-embedded by
448
+ `jobs/embed-concept-page.ts` off the page-write path.
449
+ 3. **`persistence/steps.ts`** → `migrateToolCreatedItems` from
450
+ `v1/graph/bootstrap.ts`. **MOVE THIS FUNCTION — DO NOT DELETE IT.** It is a
451
+ registered entry in the append-only migration list (slot "101b", between
452
+ `migrateMemoryGraphImageRefs` and `migrateDropMemoryItemsTables`) that
453
+ copies legacy `memory_items` rows into `memory_graph_nodes` — an all-tier
454
+ table that outlives v1. Every fresh install replays the whole chain, so
455
+ deleting the function strands those rows on upgrade paths and defeats
456
+ `migrateDropMemoryItemsTables`'s "already migrated" safety check. Three
457
+ things to preserve when moving it:
458
+ - **The exported name.** Bare-function steps are identified by
459
+ `Function.name` for checkpointing, and `migrateMoveMemoryGraphTablesToMemoryDb`
460
+ names the string `"migrateToolCreatedItems"` in its `dependsOn`. Renaming
461
+ it re-runs the migration on existing installs and breaks that dependency
462
+ edge.
463
+ - **Its position** in the ordered `steps.ts` list — it must still run before
464
+ `migrateDropMemoryItemsTables`.
465
+ - **The persistence-layering guard's exemption.**
466
+ `assistant/src/__tests__/persistence-layering-guard.test.ts` maps
467
+ `assistant/src/persistence/steps.ts` → `{"v1/graph/bootstrap"}` in
468
+ **`MIGRATION_REGISTRY_MEMORY_IMPORTS`** — NOT in
469
+ `PERSISTENCE_TO_MEMORY_ALLOWLIST`, which holds only
470
+ `persistence/conversation-crud.ts`. Editing the wrong map leaves the
471
+ exemption in place and fails the guard. The exemption itself is permanent
472
+ (a migration registry referencing the domain that owns each step is the
473
+ registry's job); what moves is the pointer. Repoint the entry at the new
474
+ module, or drop it only if the function lands inside `persistence/`; the
475
+ guard's stale-entry test fails on a left-behind exemption either way.
476
+
477
+ The function reads and writes only `memory_items`, `memory_graph_nodes`, and
478
+ its own memory checkpoint, so `persistence/migrations/` or the all-tier
479
+ `graph/` are both viable homes. `bootstrap.ts`'s other exports
480
+ (`bootstrapFromHistory`, `maybeEnqueueGraphBootstrap`) are genuinely v1 and
481
+ go with the tier.
482
+
483
+ **Re-run the scan at deletion time** rather than trusting this list — consumers
484
+ accrue:
485
+ `grep -rnE '(from|import\() *"[^"]*v1/' assistant/src --include='*.ts' --include='*.tsx' --exclude-dir=__tests__ --exclude-dir=v1 | grep -v '\.test\.'`
486
+ (spine hits are the composition points the steps below already cover; anything
487
+ else is a new external consumer needing its own repoint-or-retire decision).
488
+
489
+ **Then re-run it WITHOUT the test exclusions** — drop `--exclude-dir=__tests__`
490
+ and the `grep -v '\.test\.'`. Test files import `v1/` too, and not all of them
491
+ are v1 tier tests that die with the tier; the non-tier ones get **repointed,
492
+ not deleted**. Today the test-only hits are:
493
+
494
+ - v1 tier tests, deleted with the tier: `src/__tests__/pkb-autoinject.test.ts`,
495
+ `injection-block.test.ts`, `graph-extraction-event-date.test.ts`,
496
+ `memory-identity-context-parity.test.ts`,
497
+ `rebuild-index-graph-nodes.test.ts`, and
498
+ `injector-pkb-v2-silenced.test.ts` (its subject is the v1 PKB pair being
499
+ silenced under the substrate — keep its one tier-agnostic `now-md` case by
500
+ moving it, rather than losing the coverage).
501
+ - **not** v1 tests — repoint: `src/__tests__/injector-chain.test.ts` and
502
+ `src/__tests__/conversation-runtime-assembly.test.ts` both pull `getPkbRoot`
503
+ from `v1/pkb/types.js` purely to place a temp workspace; they cover the
504
+ injector chain and runtime assembly on every tier.
505
+ - a false positive: `MEM/__tests__/memory-tier-boundary-guard.test.ts` matches
506
+ on `"./v1/a.js"`-style string literals in its own parser tests.
507
+
508
+ ### Steps
509
+
510
+ 1. Delete `MEM/v1/**` (including `v1/README.md` and `v1/graph/graph-search.ts`,
511
+ the hybrid node-SEARCH half) — **after** `migrateToolCreatedItems` has been
512
+ moved out of `v1/graph/bootstrap.ts` per the external-consumers section
513
+ above. `graph/graph-search.ts` is the all-tier embedding plumbing and
514
+ **stays**.
515
+ 2. Delete `runtime/routes/filing-routes.ts` and drop its `ROUTES` entry from
516
+ `runtime/routes/index.ts`.
517
+ 3. Retire the `memory-items` route family (`MEM/src/memory-item-routes.ts`'s
518
+ item half) and `cli/commands/memory/items.ts`. Re-verify callers at deletion
519
+ time with `grep -rl 'memory-items' --exclude-dir=node_modules .` — today the
520
+ only hits outside the assistant are the generated `assistant/openapi.yaml`
521
+ and one web test (`clients/web/src/lib/api-interceptors.test.ts`); there are
522
+ no hand-written web callers.
523
+ 4. Remove the v1 arm of `graph/conversation-graph-memory.ts` (its
524
+ `../v1/graph/injection.js` and `../v1/graph/retriever.js` imports and the
525
+ branches they feed).
526
+ 5. Remove the v1 branch of `context-search/sources/memory.ts` — it is the file's
527
+ only non-substrate path (`searchGraphNodes` from `v1/graph/graph-search.ts`),
528
+ so the source collapses to its `usesConceptPageMemory` early return.
529
+ 6. Delete the v1 sections of the spine files. Every one is banner-marked, so
530
+ `grep -rn 'delete with v1' src/plugins/defaults/memory/` is the authoritative
531
+ list — it covers `startup.ts`'s `---- v1 (legacy engine) ----` section labels
532
+ (which spell out the banner phrase for exactly this reason) and the dispatch
533
+ call sites, not only the function bodies:
534
+ `startup.ts` (**three** blocks — the v1 Qdrant ensure and the PKB reconcile,
535
+ both covered by step 8, and the graph-bootstrap tail),
536
+ `jobs-worker.ts` (`enqueueV1MaintenanceJobs` **and** the `else` arm
537
+ that calls it), `job-handlers.ts`, `indexer.ts` (`enqueueV1IndexTriggers`
538
+ **and** its call site), `injectors.ts` (the PKB injector pair). The same grep
539
+ also returns `graph/conversation-graph-memory.ts` and
540
+ `context-search/sources/memory.ts` — steps 4 and 5 above.
541
+ 7. Delete `V1_QDRANT_JOB_TYPES` and the `SweepPostponedOffV1Error` postpone
542
+ path in `jobs-worker.ts`, plus the v1 job handlers
543
+ (`v1/job-handlers/{backfill,embedding,index-maintenance}.ts`) and their
544
+ `job-handlers.ts` registrations. Move retired job types into
545
+ `LEGACY_JOB_TYPES`; do NOT remove them from `MemoryJobType`.
546
+ 8. Delete the v1 Qdrant collection lifecycle in `startup.ts` (the
547
+ `config.memory.qdrant.collection` `ensureCollection` block and the PKB index
548
+ reconcile). Both are gated on `!usesConceptPageMemory(config.memory)`, **not
549
+ on `isMemoryV1Active`** — and `runMemoryStartup` has no memory-enabled guard
550
+ of its own, so today they run on `memory.enabled: false` assistants too.
551
+ Delete them outright rather than assuming step 9 already reaches them. Leave
552
+ the lexical-messages collection alone — it is independent.
553
+ 9. Collapse `isMemoryV1Active` call sites, then delete the predicate. Sweep for
554
+ `!usesConceptPageMemory(...)` separately: it is the actual v1 gate in
555
+ `startup.ts`, `jobs-worker.ts`, `indexer.ts`, and
556
+ `context-search/sources/memory.ts`, and those arms collapse the other way
557
+ (the substrate branch becomes unconditional).
558
+ 10. Repoint or delete the tests pinned to v1 — the test-inclusive re-scan above
559
+ lists the ones the import scan finds. One more it cannot find:
560
+ `src/__tests__/memory-jobs-worker-lanes.test.ts` sets
561
+ `memory.v2.enabled: false` so v1 is the live tier and its slow-lane job
562
+ (`graph_consolidate`) genuinely runs instead of no-opping under the
563
+ substrate. Repoint it at a surviving slow-lane job type — the lane
564
+ independence it covers is tier-agnostic and worth keeping.
565
+ 11. `memoryTier()`'s `"v1"` bucket becomes unreachable. **Coordinate with the
566
+ platform telemetry dashboard before removing the bucket** — see
567
+ `src/telemetry/AGENTS.md` for the `memory_tier` contract.
568
+ 12. Shrink the boundary guard: drop `v1` from `TIER_DIRS` /
569
+ `FORBIDDEN_TIER_IMPORTS`, and drop any `SPINE_ALLOWLIST` entry whose second
570
+ tier was v1 (the reverse stale-exemption test will name them for you).
571
+
572
+ ## Deletion runbook: v2
573
+
574
+ **Read this first:** the frozen substrate names merely SPELLED "v2" — the
575
+ `memory_v2_concept_pages` collection, the `memory_v2_consolidate` /
576
+ `memory_v2_sweep` / `memory_v2_reembed` job types, the `memory_v2_consolidation`
577
+ conversation source, the `memoryV2Consolidation` call-site id, the
578
+ `memory/.v2-state/` path, the `.memory-v2-reembed-required` sentinel, the
579
+ `memory-v2-static` injector id, and `memoryV2StaticBlock` — belong to the
580
+ **substrate**, which outlives the v2 engine. They survive this deletion and must
581
+ not be renamed opportunistically.
582
+
583
+ ### External consumers to repoint or retire
584
+
585
+ Eight production files import `v2/` today. Three are composition points the
586
+ steps below already name (`graph/conversation-graph-memory.ts`,
587
+ `job-handlers.ts`, `MEM/src/memory-v2-routes.ts`); the remaining **five** are
588
+ itemized here, and **four of the five sit outside the plugin entirely**.
589
+ Deleting the tier without handling them cannot produce a buildable tree.
590
+
591
+ 1. **`MEM/fork-conversation-memory.ts`** (spine, on the `SPINE_ALLOWLIST`) →
592
+ `forkActivationState` / `seedForkActivationState` from
593
+ `v2/activation-store.ts`. Remove the v2 arm; the module survives as a
594
+ substrate + v3 fork path (injected-block slugs, `v3/ever-injected-store`,
595
+ graph state, retrospective state). It stays on the `SPINE_ALLOWLIST` after
596
+ the cut — `substrate` is itself a tier directory in the guard's `TIER_DIRS`,
597
+ so substrate + v3 is still multi-tier and step 10 must **not** drop this
598
+ entry.
599
+ 2. **`runtime/routes/conversation-query-routes.ts`** →
600
+ `getMemoryV2ActivationLogByMessageIds` from `v2/activation-log-store.ts`.
601
+ This is the route end of the inspector chain below: it fills the
602
+ `memoryV2Activation` field of the LLM-context response. It is **deleted**
603
+ with that surface, not replaced — the tier-agnostic
604
+ `getMemoryRecallLogByMessageIds` and the v3
605
+ `getMemoryV3SelectionForInspectorByMessageIds` reads alongside it stay.
606
+ 3. **`daemon/conversation-agent-loop-handlers.ts`** →
607
+ `backfillMemoryV2ActivationMessageId` from `v2/activation-log-store.ts`. The
608
+ turn-end stamp that keys the activation row to the assistant `messageId` so
609
+ the inspector can find it. **Delete the try block**; no replacement is
610
+ needed, because with the engine gone nothing writes the log in the first
611
+ place (`v2/injection.ts`'s `recordMemoryV2ActivationLog` call dies with
612
+ step 1). Its two siblings — the memory-recall-log and v3-selection backfills
613
+ — are unaffected.
614
+ 4. **`cli/commands/memory/memory-v2.ts`** → `import type { ComparisonReport }`
615
+ from `v2/harness/runner.ts`. Type-only, and it feeds `memory v2 compare`,
616
+ which step 1 already retires with the engine. Drop the import together with
617
+ the subcommand and its `memory-v2-compare-render.js` imports; the surviving
618
+ `reembed` / `reembed-skills` / `validate` subcommands never touch
619
+ `harness/`.
620
+ 5. **`cli/commands/memory/memory-v2-compare-render.ts`** → the same
621
+ `import type { ComparisonReport }`. The renderer for `memory v2 compare`;
622
+ deleted whole in step 1, so it needs no separate decision — it is listed
623
+ only so the scan below reconciles against a complete list.
624
+
625
+ **The activation-log chain, end to end.** Retiring `memory_v2_activation_logs`
626
+ spans five layers, split across this section and steps 7–8. Land them together
627
+ or the tree and the published spec go out of sync:
628
+
629
+ - **writer** — `v2/injection.ts`'s `recordMemoryV2ActivationLog`, deleted with
630
+ `MEM/v2/**` (step 1), plus the daemon's turn-end `messageId` backfill
631
+ (item 3 above);
632
+ - **route** — `conversation-query-routes.ts`'s read (item 2 above);
633
+ - **wire contract** — `assistant/src/api/responses/memory-v2-activation-log.ts`
634
+ (`MemoryV2ActivationLogSchema`, re-exported from `src/api/index.ts` and so
635
+ published through `@vellumai/assistant-api`), embedded in
636
+ `api/responses/llm-context-response.ts`. `memoryV2Activation` is a
637
+ **required** property on both LLM-context responses in
638
+ `assistant/openapi.yaml`, so removing it regenerates the spec and the
639
+ generated client types — coordinate it with the web change;
640
+ - **web consumer** — the inspector's `memoryV2Activation` surface (step 8);
641
+ - **table** — the `memory_v2_activation_logs` drop (step 7).
642
+
643
+ **Re-run the scan at deletion time** rather than trusting this list — consumers
644
+ accrue:
645
+ `grep -rnE '(from|import\() *"[^"]*v2/' assistant/src --include='*.ts' --include='*.tsx' --exclude-dir=__tests__ --exclude-dir=v2 | grep -v '\.test\.'`
646
+ (hits inside `MEM/` are the composition points the steps below cover; anything
647
+ else is a new external consumer needing its own repoint-or-retire decision).
648
+
649
+ **Then re-run it WITHOUT the test exclusions** — drop `--exclude-dir=__tests__`
650
+ and the `grep -v '\.test\.'`. Test files import `v2/` too, and not all of them
651
+ are v2 tier tests that die with the tier; the non-tier ones get **repointed,
652
+ not deleted**. Today the test-only hits are:
653
+
654
+ - v2 tier tests and fixtures, deleted with the tier:
655
+ `MEM/__tests__/memory-v2-activation-log-store.test.ts`,
656
+ `MEM/__tests__/memory-v2-concept-frequency.test.ts`,
657
+ `MEM/__tests__/fixtures/memory-v2-activation-fixtures.ts` (a fixture module,
658
+ not a `.test.` file — the `grep -v '\.test\.'` misses it either way),
659
+ `MEM/graph/__tests__/conversation-graph-memory-v2-routing.test.ts` (the v2
660
+ half of the dispatch spine), and
661
+ `cli/commands/memory/__tests__/memory-v2-compare-render.test.ts`.
662
+ - **not** v2 tests — repoint by dropping their v2 arms:
663
+ `src/__tests__/injector-v3-suppression.test.ts` (pulls `INJECTION_HEADER`
664
+ from `v2/injection.js` to assert the v3 suppression),
665
+ `src/__tests__/conversation-fork-crud.test.ts` (pulls `hydrate` from
666
+ `v2/activation-store.js` while covering all-tier fork behavior),
667
+ `MEM/__tests__/memory-log-stores-degraded.test.ts` (degraded-mode coverage
668
+ spanning the recall log, the v2 activation log, and v3 stores), and
669
+ `runtime/routes/__tests__/conversation-query-routes.test.ts` (the route test
670
+ whose sibling recall-log and v3-selection assertions stay).
671
+ - a false positive: `MEM/__tests__/memory-tier-boundary-guard.test.ts` matches
672
+ on `"./v2/a.js"`-style string literals in its own parser tests.
673
+
674
+ ### Steps
675
+
676
+ 1. Delete `MEM/v2/**` and `cli/commands/memory/memory-v2-compare-render.ts`.
677
+ Two modules **split** rather than delete:
678
+ - `MEM/src/memory-v2-routes.ts` — the only multi-tier route module. Four of
679
+ its handlers read the substrate and must survive —
680
+ `memory/v2/concept-page`, `memory/v2/list-concept-pages`,
681
+ `memory/v2/reembed-skills`, `memory/v2/validate` — so move them (endpoint
682
+ strings, operation ids, and the `MEMORY_V2_DISABLED` code unchanged; they
683
+ are frozen wire surface) into a substrate-owned routes module.
684
+ `memory/v2/backfill` (operation id `memory_v2_backfill`) splits **by
685
+ operation** rather than dying whole: `MemoryV2BackfillParams`'s `op` enum
686
+ accepts three values, and `OP_TO_JOB_TYPE` sends `migrate` →
687
+ `memory_v2_migrate` and `activation-recompute` →
688
+ `memory_v2_activation_recompute` (both v2-engine jobs, retired in step 9)
689
+ but `reembed` → `memory_v2_reembed`, a **substrate** job whose handler
690
+ lives at `substrate/reembed-job.ts` and survives this deletion. Carry the
691
+ `reembed` arm across with its frozen operation id and endpoint intact —
692
+ narrow the `op` enum to `["reembed"]` and move the route with the other
693
+ survivors — or land a compatibility-preserving replacement first. Deleting
694
+ the route wholesale removes the only on-demand concept-page reembed
695
+ command an operator has; every other enqueue of that job is automatic
696
+ (consolidation follow-ups, boot maintenance, the embedding reconciler,
697
+ workspace migrations). Delete the remaining engine-only routes:
698
+ `compare-retrievers`, `concept-frequency`, `ema-scores`, `now-text`,
699
+ `router-prompt-template`, `simulate-router`. Publishing substrate-named
700
+ aliases and retiring the `memory/v2/*` spellings is a separate,
701
+ client-coordinated change.
702
+ - `cli/commands/memory/memory-v2.ts` — follows its routes rather than being
703
+ deleted outright. `memory v2 reembed` (which posts the surviving `reembed`
704
+ backfill op), `memory v2 reembed-skills`, and `memory v2 validate` keep
705
+ working and move with the substrate routes; `memory v2 activation` (the
706
+ `activation-recompute` op), `memory v2 ema`, `memory v2 simulate`, and
707
+ `memory v2 compare` go with the engine. There is no `migrate` subcommand —
708
+ the route is that job's only enqueue path.
709
+ 2. Remove the v2 arm of `graph/conversation-graph-memory.ts` (activation-store,
710
+ injection, now-text, router-pair imports) and the
711
+ `shouldRunLegacyMemoryRetrieval` path in `hooks/user-prompt-submit.ts`.
712
+ 3. Remove the v2-suppression strip in `daemon/conversation-runtime-assembly.ts`
713
+ (`suppressV2MemoryForV3`, the `memory-v2-static` capture, and the
714
+ `memoryV2StaticBlock` plumbing) — with no v2 engine there is nothing to
715
+ suppress, but the static `<info>` injector itself stays.
716
+ 4. Delete the v2 sections of `job-handlers.ts` marked
717
+ `// V2 ENGINE — delete with v2`.
718
+ `context-search/sources/memory-v2.ts` is misnamed, not v2-owned — it reads
719
+ only `substrate/` and survives; rename it (the filename is not a frozen
720
+ name) rather than deleting it.
721
+ 5. Collapse `usesConceptPageMemory()` to `isMemoryEnabled()` and delete
722
+ `isV2InjectionEngineActive`. For `isMemoryV2ExplicitlyDisabled`, decide what
723
+ `daemon/embedding-reconcile.ts`'s explicit-opt-out branch should mean once
724
+ `memory.v2.enabled` no longer exists — either drop the branch or re-express
725
+ it against `memory.enabled`.
726
+ 6. Drop the `memory.v2` schema subtree and the `orV2` fallback in
727
+ `substrate/tuning.ts`, giving `memory.substrate` **real defaults** (the
728
+ values currently in `config/schemas/memory-v2.ts`). Migration 135 copied
729
+ user overrides, but it deliberately skips values equal to a shipped default
730
+ — including `bm25_b: 0.75`, the pre-migration-075 default. On a workspace
731
+ still persisting `0.75`, that value reaches the runtime **only** through the
732
+ `orV2` fallback, so dropping the fallback silently retunes it to `0.4`.
733
+ **Land a sweep migration first**: for every substrate tunable, copy the
734
+ resolved effective value into `memory.substrate` wherever it is absent there
735
+ and present under `memory.v2`, this time regardless of whether it matches a
736
+ shipped default. Only then remove the fallback. Fold the parent
737
+ `MemoryConfigSchema.superRefine`'s mixed-case weight check back into the
738
+ substrate schema's own refinement.
739
+ 7. Drop tables `memory_v2_activation_logs`, `memory_v2_injection_events`, and
740
+ `activation_state` via a normal `persistence/migrations/` step (append-only —
741
+ never edit an existing migration). Keep the `conversation-memory-purge.ts`
742
+ deletes in sync.
743
+ 8. Web surfaces to retire or repoint:
744
+ - the inspector memory tab's `memoryV2Activation` context
745
+ (`clients/web/src/domains/chat/inspector/inspector-api.ts`,
746
+ `components/tabs/memory-tab.tsx`, `inspector-export.ts`) — this is the web
747
+ end of the activation-log chain spelled out in the external-consumers
748
+ section above; land it with the route, the daemon backfill, the
749
+ `api/responses/memory-v2-activation-log.ts` wire contract, and the step-7
750
+ table drop,
751
+ - the router playground (`memory-router-playground-page.tsx`,
752
+ `memory-router-simulator-api.ts`, and its `routes.tsx` entry),
753
+ - `concept-page-api.ts` and
754
+ `domains/intelligence/memory-v2/list-concept-pages.ts` — these call the
755
+ two substrate-reading routes that survive step 1, so they keep working
756
+ unchanged; only rename the modules/directory if you want to.
757
+ 9. Move the retired v2-engine job types (`memory_v2_migrate`,
758
+ `memory_v2_activation_recompute`) into `LEGACY_JOB_TYPES`.
759
+ 10. Shrink the boundary guard: drop `v2` from `TIER_DIRS` /
760
+ `FORBIDDEN_TIER_IMPORTS` and from `TIER_KEY_READ_ALLOWLIST`, and remove the
761
+ `SPINE_ALLOWLIST` entries that were v2 composition points — only those left
762
+ importing fewer than two tier directories. `fork-conversation-memory.ts`
763
+ still spans `substrate/` + `v3/` and stays; let the reverse
764
+ stale-exemption test tell you which entries actually went single-tier.
765
+
766
+ ## Where to add new code
767
+
768
+ - New shared concept-page capability (retrieval, consolidation, page/edge
769
+ storage, capability seeding) → `substrate/`.
770
+ - New lane, scorer, or injector behavior for the live engine → `v3/`.
771
+ - Tier-agnostic capture (retrospective, sweep triggers) → the plugin root.
772
+ - Multi-tier wiring → an existing spine composition point on the
773
+ `SPINE_ALLOWLIST`; do not create a new one.
774
+ - **Never add to `v1/` or `v2/`.** Both are in retirement; a new feature there
775
+ is work that has to be deleted twice.