@cleocode/core 2026.9.8 → 2026.9.9

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 (561) hide show
  1. package/dist/audit/reconstruct.d.ts +13 -43
  2. package/dist/audit/reconstruct.d.ts.map +1 -1
  3. package/dist/audit/reconstruct.js +295 -290
  4. package/dist/audit/reconstruct.js.map +1 -1
  5. package/dist/bootstrap.d.ts.map +1 -1
  6. package/dist/bootstrap.js +8 -2
  7. package/dist/bootstrap.js.map +1 -1
  8. package/dist/dispatch/mutate-projection.d.ts.map +1 -1
  9. package/dist/dispatch/mutate-projection.js +12 -0
  10. package/dist/dispatch/mutate-projection.js.map +1 -1
  11. package/dist/dispatch/mvi-projection.d.ts +29 -6
  12. package/dist/dispatch/mvi-projection.d.ts.map +1 -1
  13. package/dist/dispatch/mvi-projection.js +109 -139
  14. package/dist/dispatch/mvi-projection.js.map +1 -1
  15. package/dist/docs/docs-read-model.d.ts +3 -2
  16. package/dist/docs/docs-read-model.d.ts.map +1 -1
  17. package/dist/docs/docs-read-model.js +4 -3
  18. package/dist/docs/docs-read-model.js.map +1 -1
  19. package/dist/docs/export-document.js +5100 -2297
  20. package/dist/docs/export-document.js.map +3 -3
  21. package/dist/docs/projection.d.ts +67 -0
  22. package/dist/docs/projection.d.ts.map +1 -0
  23. package/dist/docs/projection.js +370 -0
  24. package/dist/docs/projection.js.map +1 -0
  25. package/dist/doctor/acceptance-drift.d.ts +6 -2
  26. package/dist/doctor/acceptance-drift.d.ts.map +1 -1
  27. package/dist/doctor/acceptance-drift.js +43 -5
  28. package/dist/doctor/acceptance-drift.js.map +1 -1
  29. package/dist/doctor/knowledge-summary.d.ts +41 -0
  30. package/dist/doctor/knowledge-summary.d.ts.map +1 -0
  31. package/dist/doctor/knowledge-summary.js +81 -0
  32. package/dist/doctor/knowledge-summary.js.map +1 -0
  33. package/dist/doctor/knowledge.d.ts +192 -0
  34. package/dist/doctor/knowledge.d.ts.map +1 -0
  35. package/dist/doctor/knowledge.js +1864 -0
  36. package/dist/doctor/knowledge.js.map +1 -0
  37. package/dist/git/work-tree.d.ts +64 -0
  38. package/dist/git/work-tree.d.ts.map +1 -0
  39. package/dist/git/work-tree.js +111 -0
  40. package/dist/git/work-tree.js.map +1 -0
  41. package/dist/hooks/handlers/task-hooks.d.ts +8 -5
  42. package/dist/hooks/handlers/task-hooks.d.ts.map +1 -1
  43. package/dist/hooks/handlers/task-hooks.js +15 -60
  44. package/dist/hooks/handlers/task-hooks.js.map +1 -1
  45. package/dist/identity/cleo-identity.d.ts +13 -0
  46. package/dist/identity/cleo-identity.d.ts.map +1 -1
  47. package/dist/identity/cleo-identity.js +20 -6
  48. package/dist/identity/cleo-identity.js.map +1 -1
  49. package/dist/injection.d.ts.map +1 -1
  50. package/dist/injection.js +29 -13
  51. package/dist/injection.js.map +1 -1
  52. package/dist/internal.d.ts +2 -0
  53. package/dist/internal.d.ts.map +1 -1
  54. package/dist/internal.js +2 -0
  55. package/dist/internal.js.map +1 -1
  56. package/dist/lifecycle/verification/satisfies-validator.d.ts.map +1 -1
  57. package/dist/lifecycle/verification/satisfies-validator.js +124 -120
  58. package/dist/lifecycle/verification/satisfies-validator.js.map +1 -1
  59. package/dist/llm/plugin-facade.js +4018 -1726
  60. package/dist/llm/plugin-facade.js.map +3 -3
  61. package/dist/memory/brain-backfill.d.ts +27 -12
  62. package/dist/memory/brain-backfill.d.ts.map +1 -1
  63. package/dist/memory/brain-backfill.js +325 -134
  64. package/dist/memory/brain-backfill.js.map +1 -1
  65. package/dist/memory/brain-doctor.d.ts +21 -0
  66. package/dist/memory/brain-doctor.d.ts.map +1 -1
  67. package/dist/memory/brain-doctor.js +111 -53
  68. package/dist/memory/brain-doctor.js.map +1 -1
  69. package/dist/memory/brain-links.d.ts.map +1 -1
  70. package/dist/memory/brain-links.js +31 -4
  71. package/dist/memory/brain-links.js.map +1 -1
  72. package/dist/memory/brain-reasoning.d.ts.map +1 -1
  73. package/dist/memory/brain-reasoning.js +28 -2
  74. package/dist/memory/brain-reasoning.js.map +1 -1
  75. package/dist/memory/brain-reconciler.d.ts +14 -19
  76. package/dist/memory/brain-reconciler.d.ts.map +1 -1
  77. package/dist/memory/brain-reconciler.js +70 -97
  78. package/dist/memory/brain-reconciler.js.map +1 -1
  79. package/dist/memory/brain-search.d.ts +2 -0
  80. package/dist/memory/brain-search.d.ts.map +1 -1
  81. package/dist/memory/brain-search.js +59 -29
  82. package/dist/memory/brain-search.js.map +1 -1
  83. package/dist/memory/brain-similarity.d.ts.map +1 -1
  84. package/dist/memory/brain-similarity.js +5 -4
  85. package/dist/memory/brain-similarity.js.map +1 -1
  86. package/dist/memory/brain-stub-prune.d.ts +31 -9
  87. package/dist/memory/brain-stub-prune.d.ts.map +1 -1
  88. package/dist/memory/brain-stub-prune.js +65 -18
  89. package/dist/memory/brain-stub-prune.js.map +1 -1
  90. package/dist/memory/brain-writer-handlers.d.ts +10 -1
  91. package/dist/memory/brain-writer-handlers.d.ts.map +1 -1
  92. package/dist/memory/brain-writer-handlers.js +23 -3
  93. package/dist/memory/brain-writer-handlers.js.map +1 -1
  94. package/dist/memory/brain-writer-thread.d.ts +11 -1
  95. package/dist/memory/brain-writer-thread.d.ts.map +1 -1
  96. package/dist/memory/brain-writer-thread.js +87 -20
  97. package/dist/memory/brain-writer-thread.js.map +1 -1
  98. package/dist/memory/brain-writer-worker.js +8 -1
  99. package/dist/memory/brain-writer-worker.js.map +1 -1
  100. package/dist/memory/decision-cross-link.d.ts +39 -0
  101. package/dist/memory/decision-cross-link.d.ts.map +1 -1
  102. package/dist/memory/decision-cross-link.js +316 -0
  103. package/dist/memory/decision-cross-link.js.map +1 -1
  104. package/dist/memory/decisions.d.ts +4 -1
  105. package/dist/memory/decisions.d.ts.map +1 -1
  106. package/dist/memory/decisions.js +7 -24
  107. package/dist/memory/decisions.js.map +1 -1
  108. package/dist/memory/dispatch-trace.d.ts +12 -5
  109. package/dist/memory/dispatch-trace.d.ts.map +1 -1
  110. package/dist/memory/dispatch-trace.js +17 -7
  111. package/dist/memory/dispatch-trace.js.map +1 -1
  112. package/dist/memory/eligibility.d.ts +51 -0
  113. package/dist/memory/eligibility.d.ts.map +1 -0
  114. package/dist/memory/eligibility.js +77 -0
  115. package/dist/memory/eligibility.js.map +1 -0
  116. package/dist/memory/engine-compat.d.ts +2 -0
  117. package/dist/memory/engine-compat.d.ts.map +1 -1
  118. package/dist/memory/engine-compat.js +10 -0
  119. package/dist/memory/engine-compat.js.map +1 -1
  120. package/dist/memory/extraction-gate.d.ts +21 -7
  121. package/dist/memory/extraction-gate.d.ts.map +1 -1
  122. package/dist/memory/extraction-gate.js +178 -216
  123. package/dist/memory/extraction-gate.js.map +1 -1
  124. package/dist/memory/graph-auto-populate.d.ts +38 -5
  125. package/dist/memory/graph-auto-populate.d.ts.map +1 -1
  126. package/dist/memory/graph-auto-populate.js +182 -60
  127. package/dist/memory/graph-auto-populate.js.map +1 -1
  128. package/dist/memory/graph-memory-bridge.d.ts +14 -1
  129. package/dist/memory/graph-memory-bridge.d.ts.map +1 -1
  130. package/dist/memory/graph-memory-bridge.js +66 -28
  131. package/dist/memory/graph-memory-bridge.js.map +1 -1
  132. package/dist/memory/index.d.ts +1 -19
  133. package/dist/memory/index.d.ts.map +1 -1
  134. package/dist/memory/index.js +1 -50
  135. package/dist/memory/index.js.map +1 -1
  136. package/dist/memory/learnings.d.ts.map +1 -1
  137. package/dist/memory/learnings.js +2 -23
  138. package/dist/memory/learnings.js.map +1 -1
  139. package/dist/memory/manifest-filter.d.ts +21 -0
  140. package/dist/memory/manifest-filter.d.ts.map +1 -0
  141. package/dist/memory/manifest-filter.js +51 -0
  142. package/dist/memory/manifest-filter.js.map +1 -0
  143. package/dist/memory/manifest-ingestion.d.ts +28 -30
  144. package/dist/memory/manifest-ingestion.d.ts.map +1 -1
  145. package/dist/memory/manifest-ingestion.js +104 -235
  146. package/dist/memory/manifest-ingestion.js.map +1 -1
  147. package/dist/memory/observer-reflector.d.ts +2 -0
  148. package/dist/memory/observer-reflector.d.ts.map +1 -1
  149. package/dist/memory/observer-reflector.js +6 -49
  150. package/dist/memory/observer-reflector.js.map +1 -1
  151. package/dist/memory/patterns.d.ts +10 -0
  152. package/dist/memory/patterns.d.ts.map +1 -1
  153. package/dist/memory/patterns.js +25 -33
  154. package/dist/memory/patterns.js.map +1 -1
  155. package/dist/memory/pipeline-manifest-sqlite.d.ts +72 -9
  156. package/dist/memory/pipeline-manifest-sqlite.d.ts.map +1 -1
  157. package/dist/memory/pipeline-manifest-sqlite.js +508 -412
  158. package/dist/memory/pipeline-manifest-sqlite.js.map +1 -1
  159. package/dist/memory/retrieval/build-retrieval-bundle.d.ts.map +1 -1
  160. package/dist/memory/retrieval/build-retrieval-bundle.js +16 -15
  161. package/dist/memory/retrieval/build-retrieval-bundle.js.map +1 -1
  162. package/dist/memory/retrieval/fetch.d.ts +7 -0
  163. package/dist/memory/retrieval/fetch.d.ts.map +1 -1
  164. package/dist/memory/retrieval/fetch.js +14 -11
  165. package/dist/memory/retrieval/fetch.js.map +1 -1
  166. package/dist/memory/retrieval/observe.d.ts +7 -1
  167. package/dist/memory/retrieval/observe.d.ts.map +1 -1
  168. package/dist/memory/retrieval/observe.js +58 -4
  169. package/dist/memory/retrieval/observe.js.map +1 -1
  170. package/dist/memory/retrieval/search.d.ts +14 -1
  171. package/dist/memory/retrieval/search.d.ts.map +1 -1
  172. package/dist/memory/retrieval/search.js +133 -69
  173. package/dist/memory/retrieval/search.js.map +1 -1
  174. package/dist/memory/retrieval/telemetry.d.ts +31 -0
  175. package/dist/memory/retrieval/telemetry.d.ts.map +1 -0
  176. package/dist/memory/retrieval/telemetry.js +53 -0
  177. package/dist/memory/retrieval/telemetry.js.map +1 -0
  178. package/dist/nexus/analyze-orchestrator.d.ts +41 -9
  179. package/dist/nexus/analyze-orchestrator.d.ts.map +1 -1
  180. package/dist/nexus/analyze-orchestrator.js +257 -58
  181. package/dist/nexus/analyze-orchestrator.js.map +1 -1
  182. package/dist/nexus/api-contracts.d.ts +2 -6
  183. package/dist/nexus/api-contracts.d.ts.map +1 -1
  184. package/dist/nexus/api-contracts.js +11 -2
  185. package/dist/nexus/api-contracts.js.map +1 -1
  186. package/dist/nexus/context.d.ts.map +1 -1
  187. package/dist/nexus/context.js +14 -37
  188. package/dist/nexus/context.js.map +1 -1
  189. package/dist/nexus/diff.d.ts.map +1 -1
  190. package/dist/nexus/diff.js +2 -1
  191. package/dist/nexus/diff.js.map +1 -1
  192. package/dist/nexus/identity.d.ts +29 -3
  193. package/dist/nexus/identity.d.ts.map +1 -1
  194. package/dist/nexus/identity.js +63 -12
  195. package/dist/nexus/identity.js.map +1 -1
  196. package/dist/nexus/impact.d.ts +21 -19
  197. package/dist/nexus/impact.d.ts.map +1 -1
  198. package/dist/nexus/impact.js +96 -192
  199. package/dist/nexus/impact.js.map +1 -1
  200. package/dist/nexus/knowledge.d.ts +80 -0
  201. package/dist/nexus/knowledge.d.ts.map +1 -0
  202. package/dist/nexus/knowledge.js +786 -0
  203. package/dist/nexus/knowledge.js.map +1 -0
  204. package/dist/nexus/living-brain.d.ts +8 -5
  205. package/dist/nexus/living-brain.d.ts.map +1 -1
  206. package/dist/nexus/living-brain.js +252 -188
  207. package/dist/nexus/living-brain.js.map +1 -1
  208. package/dist/nexus/registry.d.ts +11 -2
  209. package/dist/nexus/registry.d.ts.map +1 -1
  210. package/dist/nexus/registry.js +144 -128
  211. package/dist/nexus/registry.js.map +1 -1
  212. package/dist/nexus/source-roots.d.ts +16 -0
  213. package/dist/nexus/source-roots.d.ts.map +1 -0
  214. package/dist/nexus/source-roots.js +174 -0
  215. package/dist/nexus/source-roots.js.map +1 -0
  216. package/dist/nexus/task-evidence.d.ts +22 -0
  217. package/dist/nexus/task-evidence.d.ts.map +1 -0
  218. package/dist/nexus/task-evidence.js +210 -0
  219. package/dist/nexus/task-evidence.js.map +1 -0
  220. package/dist/nexus/tasks-bridge.d.ts +14 -7
  221. package/dist/nexus/tasks-bridge.d.ts.map +1 -1
  222. package/dist/nexus/tasks-bridge.js +81 -40
  223. package/dist/nexus/tasks-bridge.js.map +1 -1
  224. package/dist/orchestrate/lifecycle-ops.d.ts.map +1 -1
  225. package/dist/orchestrate/lifecycle-ops.js +170 -120
  226. package/dist/orchestrate/lifecycle-ops.js.map +1 -1
  227. package/dist/orchestrate/query-ops.d.ts +6 -7
  228. package/dist/orchestrate/query-ops.d.ts.map +1 -1
  229. package/dist/orchestrate/query-ops.js +509 -532
  230. package/dist/orchestrate/query-ops.js.map +1 -1
  231. package/dist/orchestration/bootstrap.d.ts +15 -1
  232. package/dist/orchestration/bootstrap.d.ts.map +1 -1
  233. package/dist/orchestration/bootstrap.js +21 -10
  234. package/dist/orchestration/bootstrap.js.map +1 -1
  235. package/dist/orchestration/index.d.ts +35 -3
  236. package/dist/orchestration/index.d.ts.map +1 -1
  237. package/dist/orchestration/index.js +64 -35
  238. package/dist/orchestration/index.js.map +1 -1
  239. package/dist/orchestration/lead-rollup.d.ts +24 -1
  240. package/dist/orchestration/lead-rollup.d.ts.map +1 -1
  241. package/dist/orchestration/lead-rollup.js +31 -11
  242. package/dist/orchestration/lead-rollup.js.map +1 -1
  243. package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
  244. package/dist/orchestration/spawn-prompt.js +16 -41
  245. package/dist/orchestration/spawn-prompt.js.map +1 -1
  246. package/dist/orchestration/unblock.d.ts +15 -1
  247. package/dist/orchestration/unblock.d.ts.map +1 -1
  248. package/dist/orchestration/unblock.js +23 -12
  249. package/dist/orchestration/unblock.js.map +1 -1
  250. package/dist/orchestration/validate-spawn.d.ts.map +1 -1
  251. package/dist/orchestration/validate-spawn.js +3 -3
  252. package/dist/orchestration/validate-spawn.js.map +1 -1
  253. package/dist/orchestration/waves.d.ts +29 -13
  254. package/dist/orchestration/waves.d.ts.map +1 -1
  255. package/dist/orchestration/waves.js +43 -55
  256. package/dist/orchestration/waves.js.map +1 -1
  257. package/dist/paths.d.ts +17 -163
  258. package/dist/paths.d.ts.map +1 -1
  259. package/dist/paths.js +145 -496
  260. package/dist/paths.js.map +1 -1
  261. package/dist/project-info.d.ts +2 -11
  262. package/dist/project-info.d.ts.map +1 -1
  263. package/dist/project-info.js +3 -31
  264. package/dist/project-info.js.map +1 -1
  265. package/dist/project-scope.d.ts +239 -0
  266. package/dist/project-scope.d.ts.map +1 -0
  267. package/dist/project-scope.js +473 -0
  268. package/dist/project-scope.js.map +1 -0
  269. package/dist/release/pr-evidence.d.ts +16 -3
  270. package/dist/release/pr-evidence.d.ts.map +1 -1
  271. package/dist/release/pr-evidence.js +53 -7
  272. package/dist/release/pr-evidence.js.map +1 -1
  273. package/dist/render/nexus/graph/index.d.ts.map +1 -1
  274. package/dist/render/nexus/graph/index.js +4 -2
  275. package/dist/render/nexus/graph/index.js.map +1 -1
  276. package/dist/render/orchestration/audit-reconstruct.d.ts +11 -0
  277. package/dist/render/orchestration/audit-reconstruct.d.ts.map +1 -1
  278. package/dist/render/orchestration/audit-reconstruct.js +21 -6
  279. package/dist/render/orchestration/audit-reconstruct.js.map +1 -1
  280. package/dist/render/tasks/show.js +2 -1
  281. package/dist/render/tasks/show.js.map +1 -1
  282. package/dist/resources/spawn-wrapper.d.ts +82 -14
  283. package/dist/resources/spawn-wrapper.d.ts.map +1 -1
  284. package/dist/resources/spawn-wrapper.js +585 -27
  285. package/dist/resources/spawn-wrapper.js.map +1 -1
  286. package/dist/selfimprove/fix-gen.js +4026 -1734
  287. package/dist/selfimprove/fix-gen.js.map +3 -3
  288. package/dist/sequence/index.d.ts.map +1 -1
  289. package/dist/sequence/index.js +76 -68
  290. package/dist/sequence/index.js.map +1 -1
  291. package/dist/session/canon-lint.d.ts +24 -3
  292. package/dist/session/canon-lint.d.ts.map +1 -1
  293. package/dist/session/canon-lint.js +72 -31
  294. package/dist/session/canon-lint.js.map +1 -1
  295. package/dist/session/engine-ops.d.ts +1 -4
  296. package/dist/session/engine-ops.d.ts.map +1 -1
  297. package/dist/session/engine-ops.js +6 -2
  298. package/dist/session/engine-ops.js.map +1 -1
  299. package/dist/sessions/briefing.d.ts +11 -1
  300. package/dist/sessions/briefing.d.ts.map +1 -1
  301. package/dist/sessions/briefing.js +76 -8
  302. package/dist/sessions/briefing.js.map +1 -1
  303. package/dist/sessions/handoff.d.ts +3 -1
  304. package/dist/sessions/handoff.d.ts.map +1 -1
  305. package/dist/sessions/handoff.js +2 -0
  306. package/dist/sessions/handoff.js.map +1 -1
  307. package/dist/shutdown-deadline.d.ts +24 -33
  308. package/dist/shutdown-deadline.d.ts.map +1 -1
  309. package/dist/shutdown-deadline.js +71 -14
  310. package/dist/shutdown-deadline.js.map +1 -1
  311. package/dist/shutdown.d.ts +21 -10
  312. package/dist/shutdown.d.ts.map +1 -1
  313. package/dist/shutdown.js +89 -42
  314. package/dist/shutdown.js.map +1 -1
  315. package/dist/skills/index.d.ts +1 -1
  316. package/dist/skills/index.d.ts.map +1 -1
  317. package/dist/skills/index.js +1 -1
  318. package/dist/skills/index.js.map +1 -1
  319. package/dist/skills/orchestrator/validator.d.ts +87 -20
  320. package/dist/skills/orchestrator/validator.d.ts.map +1 -1
  321. package/dist/skills/orchestrator/validator.js +330 -241
  322. package/dist/skills/orchestrator/validator.js.map +1 -1
  323. package/dist/store/agent-resolver.d.ts.map +1 -1
  324. package/dist/store/agent-resolver.js +16 -9
  325. package/dist/store/agent-resolver.js.map +1 -1
  326. package/dist/store/attachment-store.d.ts +4 -1
  327. package/dist/store/attachment-store.d.ts.map +1 -1
  328. package/dist/store/attachment-store.js +20 -3
  329. package/dist/store/attachment-store.js.map +1 -1
  330. package/dist/store/background-jobs.d.ts +426 -105
  331. package/dist/store/background-jobs.d.ts.map +1 -1
  332. package/dist/store/background-jobs.js +1208 -252
  333. package/dist/store/background-jobs.js.map +1 -1
  334. package/dist/store/background-ops.d.ts +145 -8
  335. package/dist/store/background-ops.d.ts.map +1 -1
  336. package/dist/store/background-ops.js +459 -15
  337. package/dist/store/background-ops.js.map +1 -1
  338. package/dist/store/backup-inspect.d.ts +48 -4
  339. package/dist/store/backup-inspect.d.ts.map +1 -1
  340. package/dist/store/backup-inspect.js +384 -4
  341. package/dist/store/backup-inspect.js.map +1 -1
  342. package/dist/store/converters.d.ts.map +1 -1
  343. package/dist/store/converters.js +19 -2
  344. package/dist/store/converters.js.map +1 -1
  345. package/dist/store/data-accessor.d.ts +9 -1
  346. package/dist/store/data-accessor.d.ts.map +1 -1
  347. package/dist/store/data-accessor.js +22 -5
  348. package/dist/store/data-accessor.js.map +1 -1
  349. package/dist/store/data-safety-central.d.ts.map +1 -1
  350. package/dist/store/data-safety-central.js +272 -232
  351. package/dist/store/data-safety-central.js.map +1 -1
  352. package/dist/store/db-helpers.d.ts +19 -3
  353. package/dist/store/db-helpers.d.ts.map +1 -1
  354. package/dist/store/db-helpers.js +42 -58
  355. package/dist/store/db-helpers.js.map +1 -1
  356. package/dist/store/dual-scope-db.d.ts +63 -4
  357. package/dist/store/dual-scope-db.d.ts.map +1 -1
  358. package/dist/store/dual-scope-db.js +166 -19
  359. package/dist/store/dual-scope-db.js.map +1 -1
  360. package/dist/store/exodus/archive.d.ts +21 -7
  361. package/dist/store/exodus/archive.d.ts.map +1 -1
  362. package/dist/store/exodus/archive.js +60 -18
  363. package/dist/store/exodus/archive.js.map +1 -1
  364. package/dist/store/exodus/migrate.d.ts.map +1 -1
  365. package/dist/store/exodus/migrate.js +27 -23
  366. package/dist/store/exodus/migrate.js.map +1 -1
  367. package/dist/store/exodus/on-open.d.ts +16 -27
  368. package/dist/store/exodus/on-open.d.ts.map +1 -1
  369. package/dist/store/exodus/on-open.js +121 -169
  370. package/dist/store/exodus/on-open.js.map +1 -1
  371. package/dist/store/exodus/recovery.d.ts +90 -0
  372. package/dist/store/exodus/recovery.d.ts.map +1 -0
  373. package/dist/store/exodus/recovery.js +434 -0
  374. package/dist/store/exodus/recovery.js.map +1 -0
  375. package/dist/store/exodus/types.d.ts +15 -0
  376. package/dist/store/exodus/types.d.ts.map +1 -1
  377. package/dist/store/memory-accessor.d.ts +52 -3
  378. package/dist/store/memory-accessor.d.ts.map +1 -1
  379. package/dist/store/memory-accessor.js +122 -7
  380. package/dist/store/memory-accessor.js.map +1 -1
  381. package/dist/store/nexus-sqlite.d.ts +24 -6
  382. package/dist/store/nexus-sqlite.d.ts.map +1 -1
  383. package/dist/store/nexus-sqlite.js +39 -20
  384. package/dist/store/nexus-sqlite.js.map +1 -1
  385. package/dist/store/ports/domain-binding.d.ts.map +1 -1
  386. package/dist/store/ports/domain-binding.js +27 -5
  387. package/dist/store/ports/domain-binding.js.map +1 -1
  388. package/dist/store/schema/background-jobs.d.ts +181 -2
  389. package/dist/store/schema/background-jobs.d.ts.map +1 -1
  390. package/dist/store/schema/background-jobs.js +27 -3
  391. package/dist/store/schema/background-jobs.js.map +1 -1
  392. package/dist/store/schema/cleo-global/skills.d.ts +2 -2
  393. package/dist/store/schema/cleo-project/lifecycle.d.ts +2 -2
  394. package/dist/store/schema/cleo-project/runtime.d.ts +1 -1
  395. package/dist/store/schema/cleo-project/tasks-core.d.ts +1 -1
  396. package/dist/store/schema/lifecycle.d.ts +2 -2
  397. package/dist/store/schema/skills-schema.d.ts +2 -2
  398. package/dist/store/schema/tasks.d.ts +1 -1
  399. package/dist/store/session-store.d.ts +3 -1
  400. package/dist/store/session-store.d.ts.map +1 -1
  401. package/dist/store/session-store.js +252 -207
  402. package/dist/store/session-store.js.map +1 -1
  403. package/dist/store/sqlite-data-accessor.d.ts +39 -4
  404. package/dist/store/sqlite-data-accessor.d.ts.map +1 -1
  405. package/dist/store/sqlite-data-accessor.js +689 -527
  406. package/dist/store/sqlite-data-accessor.js.map +1 -1
  407. package/dist/store/tasks-sqlite.d.ts +3 -1
  408. package/dist/store/tasks-sqlite.d.ts.map +1 -1
  409. package/dist/store/tasks-sqlite.js +309 -279
  410. package/dist/store/tasks-sqlite.js.map +1 -1
  411. package/dist/store/validation-schemas.d.ts +8 -8
  412. package/dist/store/writer-lease.d.ts +80 -8
  413. package/dist/store/writer-lease.d.ts.map +1 -1
  414. package/dist/store/writer-lease.js +503 -134
  415. package/dist/store/writer-lease.js.map +1 -1
  416. package/dist/system/audit.d.ts +2 -1
  417. package/dist/system/audit.d.ts.map +1 -1
  418. package/dist/system/audit.js +118 -71
  419. package/dist/system/audit.js.map +1 -1
  420. package/dist/system/backup.d.ts.map +1 -1
  421. package/dist/system/backup.js +5 -5
  422. package/dist/system/backup.js.map +1 -1
  423. package/dist/system/inject-generate.js +1 -1
  424. package/dist/task-work/index.d.ts +3 -0
  425. package/dist/task-work/index.d.ts.map +1 -1
  426. package/dist/task-work/index.js +34 -37
  427. package/dist/task-work/index.js.map +1 -1
  428. package/dist/tasks/ac-coverage-gate.d.ts.map +1 -1
  429. package/dist/tasks/ac-coverage-gate.js +4 -0
  430. package/dist/tasks/ac-coverage-gate.js.map +1 -1
  431. package/dist/tasks/ac-immutability.d.ts +7 -4
  432. package/dist/tasks/ac-immutability.d.ts.map +1 -1
  433. package/dist/tasks/ac-immutability.js +19 -17
  434. package/dist/tasks/ac-immutability.js.map +1 -1
  435. package/dist/tasks/ac-table.d.ts +5 -5
  436. package/dist/tasks/ac-table.d.ts.map +1 -1
  437. package/dist/tasks/ac-table.js +26 -12
  438. package/dist/tasks/ac-table.js.map +1 -1
  439. package/dist/tasks/acceptance-input.d.ts +52 -0
  440. package/dist/tasks/acceptance-input.d.ts.map +1 -0
  441. package/dist/tasks/acceptance-input.js +259 -0
  442. package/dist/tasks/acceptance-input.js.map +1 -0
  443. package/dist/tasks/add.d.ts +67 -29
  444. package/dist/tasks/add.d.ts.map +1 -1
  445. package/dist/tasks/add.js +255 -97
  446. package/dist/tasks/add.js.map +1 -1
  447. package/dist/tasks/complete.d.ts +16 -1
  448. package/dist/tasks/complete.d.ts.map +1 -1
  449. package/dist/tasks/complete.js +152 -55
  450. package/dist/tasks/complete.js.map +1 -1
  451. package/dist/tasks/decompose.d.ts +103 -0
  452. package/dist/tasks/decompose.d.ts.map +1 -0
  453. package/dist/tasks/decompose.js +224 -0
  454. package/dist/tasks/decompose.js.map +1 -0
  455. package/dist/tasks/delete.d.ts +5 -8
  456. package/dist/tasks/delete.d.ts.map +1 -1
  457. package/dist/tasks/delete.js +4 -3
  458. package/dist/tasks/delete.js.map +1 -1
  459. package/dist/tasks/dependency-check.d.ts +59 -0
  460. package/dist/tasks/dependency-check.d.ts.map +1 -1
  461. package/dist/tasks/dependency-check.js +73 -0
  462. package/dist/tasks/dependency-check.js.map +1 -1
  463. package/dist/tasks/deps-ready.d.ts +13 -1
  464. package/dist/tasks/deps-ready.d.ts.map +1 -1
  465. package/dist/tasks/deps-ready.js +16 -5
  466. package/dist/tasks/deps-ready.js.map +1 -1
  467. package/dist/tasks/engine-converters.d.ts +7 -0
  468. package/dist/tasks/engine-converters.d.ts.map +1 -1
  469. package/dist/tasks/engine-converters.js +8 -1
  470. package/dist/tasks/engine-converters.js.map +1 -1
  471. package/dist/tasks/evidence.d.ts +54 -26
  472. package/dist/tasks/evidence.d.ts.map +1 -1
  473. package/dist/tasks/evidence.js +292 -40
  474. package/dist/tasks/evidence.js.map +1 -1
  475. package/dist/tasks/find.d.ts +16 -12
  476. package/dist/tasks/find.d.ts.map +1 -1
  477. package/dist/tasks/find.js +107 -93
  478. package/dist/tasks/find.js.map +1 -1
  479. package/dist/tasks/gate-runner.d.ts +88 -14
  480. package/dist/tasks/gate-runner.d.ts.map +1 -1
  481. package/dist/tasks/gate-runner.js +596 -253
  482. package/dist/tasks/gate-runner.js.map +1 -1
  483. package/dist/tasks/hierarchy-policy.d.ts +8 -0
  484. package/dist/tasks/hierarchy-policy.d.ts.map +1 -1
  485. package/dist/tasks/hierarchy-policy.js +9 -2
  486. package/dist/tasks/hierarchy-policy.js.map +1 -1
  487. package/dist/tasks/hierarchy.d.ts +67 -1
  488. package/dist/tasks/hierarchy.d.ts.map +1 -1
  489. package/dist/tasks/hierarchy.js +81 -1
  490. package/dist/tasks/hierarchy.js.map +1 -1
  491. package/dist/tasks/index.d.ts +3 -0
  492. package/dist/tasks/index.d.ts.map +1 -1
  493. package/dist/tasks/index.js +3 -0
  494. package/dist/tasks/index.js.map +1 -1
  495. package/dist/tasks/infer-add-params.d.ts +1 -20
  496. package/dist/tasks/infer-add-params.d.ts.map +1 -1
  497. package/dist/tasks/infer-add-params.js +2 -203
  498. package/dist/tasks/infer-add-params.js.map +1 -1
  499. package/dist/tasks/list.d.ts +7 -2
  500. package/dist/tasks/list.d.ts.map +1 -1
  501. package/dist/tasks/list.js +24 -36
  502. package/dist/tasks/list.js.map +1 -1
  503. package/dist/tasks/ops.d.ts +6 -61
  504. package/dist/tasks/ops.d.ts.map +1 -1
  505. package/dist/tasks/ops.js +5 -53
  506. package/dist/tasks/ops.js.map +1 -1
  507. package/dist/tasks/plan.d.ts +15 -1
  508. package/dist/tasks/plan.d.ts.map +1 -1
  509. package/dist/tasks/plan.js +23 -25
  510. package/dist/tasks/plan.js.map +1 -1
  511. package/dist/tasks/population.d.ts +46 -0
  512. package/dist/tasks/population.d.ts.map +1 -0
  513. package/dist/tasks/population.js +88 -0
  514. package/dist/tasks/population.js.map +1 -0
  515. package/dist/tasks/reconcile-scope.d.ts +157 -0
  516. package/dist/tasks/reconcile-scope.d.ts.map +1 -0
  517. package/dist/tasks/reconcile-scope.js +242 -0
  518. package/dist/tasks/reconcile-scope.js.map +1 -0
  519. package/dist/tasks/req.d.ts +51 -12
  520. package/dist/tasks/req.d.ts.map +1 -1
  521. package/dist/tasks/req.js +125 -69
  522. package/dist/tasks/req.js.map +1 -1
  523. package/dist/tasks/session-scope.d.ts +6 -31
  524. package/dist/tasks/session-scope.d.ts.map +1 -1
  525. package/dist/tasks/session-scope.js +3 -17
  526. package/dist/tasks/session-scope.js.map +1 -1
  527. package/dist/tasks/severity-attestation.d.ts +39 -10
  528. package/dist/tasks/severity-attestation.d.ts.map +1 -1
  529. package/dist/tasks/severity-attestation.js +75 -36
  530. package/dist/tasks/severity-attestation.js.map +1 -1
  531. package/dist/tasks/task-next.d.ts +5 -0
  532. package/dist/tasks/task-next.d.ts.map +1 -1
  533. package/dist/tasks/task-next.js +10 -9
  534. package/dist/tasks/task-next.js.map +1 -1
  535. package/dist/tasks/task-reparent.d.ts.map +1 -1
  536. package/dist/tasks/task-reparent.js +3 -13
  537. package/dist/tasks/task-reparent.js.map +1 -1
  538. package/dist/tasks/update.d.ts +20 -43
  539. package/dist/tasks/update.d.ts.map +1 -1
  540. package/dist/tasks/update.js +64 -49
  541. package/dist/tasks/update.js.map +1 -1
  542. package/dist/validation/engine-ops.d.ts +17 -1
  543. package/dist/validation/engine-ops.d.ts.map +1 -1
  544. package/dist/validation/engine-ops.js +149 -11
  545. package/dist/validation/engine-ops.js.map +1 -1
  546. package/dist/workgraph/reparent-preflight.d.ts +1 -1
  547. package/dist/workgraph/reparent-preflight.d.ts.map +1 -1
  548. package/dist/workgraph/reparent-preflight.js +6 -1
  549. package/dist/workgraph/reparent-preflight.js.map +1 -1
  550. package/dist/workgraph/scaffold-apply.d.ts.map +1 -1
  551. package/dist/workgraph/scaffold-apply.js +81 -76
  552. package/dist/workgraph/scaffold-apply.js.map +1 -1
  553. package/dist/workgraph/structure-validation.d.ts +1 -1
  554. package/dist/workgraph/structure-validation.d.ts.map +1 -1
  555. package/dist/workgraph/structure-validation.js +6 -1
  556. package/dist/workgraph/structure-validation.js.map +1 -1
  557. package/migrations/drizzle-tasks/20260919180000_t12263-job-ownership-fences/migration.sql +34 -0
  558. package/migrations/drizzle-tasks/20260919184500_t12265-durable-pending-proposals/migration.sql +4 -0
  559. package/package.json +18 -13
  560. package/schemas/config.schema.json +2 -2
  561. package/templates/CLEO-INJECTION.md +103 -101
@@ -1 +1 @@
1
- {"version":3,"file":"graph-auto-populate.d.ts","sourceRoot":"","sources":["../../src/memory/graph-auto-populate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAYrF,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AAyB7C;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EACvB,MAAM,SAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAqBf;AAiCD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAuBf"}
1
+ {"version":3,"file":"graph-auto-populate.d.ts","sourceRoot":"","sources":["../../src/memory/graph-auto-populate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAOrF,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAYrF,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC;AA6D7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,aAAa,EACvB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,IAAI,CAAC,CAgEf;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EACvB,MAAM,SAAM,EACZ,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,yBAAyB,GAClC,OAAO,CAAC,IAAI,CAAC,CA4Cf;AAiCD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,OAAO,CAAC,IAAI,CAAC,CAcf;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAgBf;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,yBAAyB,CAAC,CAiBpC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,iBAAiB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -7,7 +7,7 @@
7
7
  * storePattern, storeLearning, and task completion).
8
8
  *
9
9
  * Design constraints:
10
- * - All writes are BEST-EFFORT — never block or fail the primary operation.
10
+ * - Legacy writes are best-effort; scoped projections propagate failures.
11
11
  * - All writes are gated on brain.autoCapture via isAutoCaptureEnabled.
12
12
  * - Uses INSERT OR REPLACE (onConflictDoUpdate) for upsert semantics.
13
13
  * - Edge inserts are idempotent via the composite PK (fromId, toId, edgeType).
@@ -16,7 +16,11 @@
16
16
  * @epic T523
17
17
  */
18
18
  import { createHash } from 'node:crypto';
19
+ import { resolveCleoConfig } from '../config/registry.js';
19
20
  import { getLogger } from '../logger.js';
21
+ import { generateProjectHash } from '../nexus/hash.js';
22
+ import { worktreeScope } from '../paths.js';
23
+ import { assertOperationWriteFence } from '../store/background-jobs.js';
20
24
  import { getBrainDb } from '../store/memory-sqlite.js';
21
25
  import { brainPageEdges, brainPageNodes } from '../store/schema/memory-schema.js';
22
26
  // Structured (pino) logger — writes directly to stderr, NOT through `console.*`.
@@ -43,6 +47,40 @@ async function shouldAutoPopulateGraph(projectRoot) {
43
47
  return false;
44
48
  }
45
49
  }
50
+ /** Read the captured project's policy without silently treating read failures as disabled. */
51
+ async function scopedGraphEnabled(context) {
52
+ context.assertActive();
53
+ const config = await resolveCleoConfig({
54
+ scope: 'merged',
55
+ projectRoot: context.identity.projectRoot,
56
+ });
57
+ context.assertActive();
58
+ const brain = config['brain'];
59
+ if (brain === undefined)
60
+ return true;
61
+ if (typeof brain !== 'object' || brain === null || Array.isArray(brain)) {
62
+ throw new Error('Invalid brain configuration for graph projection');
63
+ }
64
+ if (!('autoCapture' in brain) || brain.autoCapture === undefined)
65
+ return true;
66
+ if (typeof brain.autoCapture !== 'boolean') {
67
+ throw new Error('Invalid brain.autoCapture configuration for graph projection');
68
+ }
69
+ return brain.autoCapture;
70
+ }
71
+ /** Check cancellation and policy for strict callers; retain legacy best-effort behavior. */
72
+ async function graphWriteEnabled(projectRoot, context) {
73
+ if (!context)
74
+ return shouldAutoPopulateGraph(projectRoot);
75
+ context.assertActive();
76
+ if (projectRoot !== context.identity.projectRoot) {
77
+ throw new Error('Graph projection root differs from captured operation scope');
78
+ }
79
+ if (!(await scopedGraphEnabled(context))) {
80
+ throw new Error('Graph projection policy disabled during execution');
81
+ }
82
+ return true;
83
+ }
46
84
  // ---------------------------------------------------------------------------
47
85
  // Public API
48
86
  // ---------------------------------------------------------------------------
@@ -58,7 +96,7 @@ async function shouldAutoPopulateGraph(projectRoot) {
58
96
  * content; their hash will be null so duplicates are not rejected.
59
97
  *
60
98
  * This function is gated on brain.autoCapture. If the gate is disabled or any
61
- * error occurs, it returns silently without throwing.
99
+ * error occurs, legacy calls return silently. Context-aware calls throw failures.
62
100
  *
63
101
  * @param projectRoot - Absolute path to the project root directory.
64
102
  * @param nodeId - Stable composite ID in the form '<type>:<source-id>'.
@@ -67,49 +105,77 @@ async function shouldAutoPopulateGraph(projectRoot) {
67
105
  * @param qualityScore - 0.0 (noise) to 1.0 (canonical).
68
106
  * @param content - Canonical text used to derive the content hash.
69
107
  * @param metadata - Optional type-specific metadata blob.
108
+ * @param context - Captured scope; when supplied, failures throw and writes check cancellation.
70
109
  *
110
+ * @remarks Scoped calls pin storage routing and refuse to join an unowned transaction.
111
+ * @example
112
+ * ```ts
113
+ * await upsertGraphNode(root, 'task:T123', 'task', 'Task', 0.7, '');
114
+ * ```
71
115
  * @task T537
72
116
  */
73
- export async function upsertGraphNode(projectRoot, nodeId, nodeType, label, qualityScore, content, metadata) {
74
- try {
75
- if (!(await shouldAutoPopulateGraph(projectRoot)))
76
- return;
77
- const db = await getBrainDb(projectRoot);
78
- const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
79
- // Only compute a content hash for non-trivial content (external reference
80
- // nodes like task/session/epic may have empty content).
81
- const trimmed = content.trim().toLowerCase();
82
- const contentHash = trimmed
83
- ? createHash('sha256').update(trimmed).digest('hex').substring(0, 16)
84
- : null;
85
- await db
86
- .insert(brainPageNodes)
87
- .values({
88
- id: nodeId,
89
- nodeType,
90
- label: label.substring(0, 200),
91
- qualityScore,
92
- contentHash,
93
- metadataJson: metadata ? JSON.stringify(metadata) : null,
94
- lastActivityAt: now,
95
- createdAt: now,
96
- updatedAt: now,
97
- })
98
- .onConflictDoUpdate({
99
- target: brainPageNodes.id,
100
- set: {
117
+ export async function upsertGraphNode(projectRoot, nodeId, nodeType, label, qualityScore, content, metadata, context) {
118
+ const write = async () => {
119
+ try {
120
+ if (!(await graphWriteEnabled(projectRoot, context)))
121
+ return;
122
+ context?.assertActive();
123
+ const db = await getBrainDb(projectRoot);
124
+ context?.assertActive();
125
+ const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
126
+ // Only compute a content hash for non-trivial content (external reference
127
+ // nodes like task/session/epic may have empty content).
128
+ const trimmed = content.trim().toLowerCase();
129
+ const contentHash = trimmed
130
+ ? createHash('sha256').update(trimmed).digest('hex').substring(0, 16)
131
+ : null;
132
+ const query = db
133
+ .insert(brainPageNodes)
134
+ .values({
135
+ id: nodeId,
136
+ nodeType,
101
137
  label: label.substring(0, 200),
102
138
  qualityScore,
139
+ contentHash,
140
+ metadataJson: metadata ? JSON.stringify(metadata) : null,
103
141
  lastActivityAt: now,
142
+ createdAt: now,
104
143
  updatedAt: now,
105
- metadataJson: metadata ? JSON.stringify(metadata) : null,
106
- },
107
- });
108
- }
109
- catch (err) {
110
- // Log but never surface — this is a best-effort side effect.
111
- log.warn({ err }, 'upsertGraphNode failed');
112
- }
144
+ })
145
+ .onConflictDoUpdate({
146
+ target: brainPageNodes.id,
147
+ set: {
148
+ label: label.substring(0, 200),
149
+ qualityScore,
150
+ lastActivityAt: now,
151
+ updatedAt: now,
152
+ metadataJson: metadata ? JSON.stringify(metadata) : null,
153
+ },
154
+ });
155
+ if (context) {
156
+ db.transaction((tx) => {
157
+ assertOperationWriteFence(tx, context);
158
+ query.run();
159
+ });
160
+ }
161
+ else {
162
+ query.run();
163
+ }
164
+ }
165
+ catch (err) {
166
+ if (context)
167
+ throw err;
168
+ // Log but never surface — this is a best-effort side effect.
169
+ log.warn({ err }, 'upsertGraphNode failed');
170
+ }
171
+ };
172
+ return context
173
+ ? worktreeScope.run({
174
+ worktreeRoot: context.identity.projectRoot,
175
+ projectHash: generateProjectHash(context.identity.projectRoot),
176
+ execution: context,
177
+ }, write)
178
+ : write();
113
179
  }
114
180
  /**
115
181
  * Add a directed, typed edge between two graph nodes (idempotent).
@@ -119,7 +185,7 @@ export async function upsertGraphNode(projectRoot, nodeId, nodeType, label, qual
119
185
  * multiple times with the same arguments.
120
186
  *
121
187
  * This function is gated on brain.autoCapture. If the gate is disabled or any
122
- * error occurs, it returns silently without throwing.
188
+ * error occurs, legacy calls return silently. Context-aware calls throw failures.
123
189
  *
124
190
  * @param projectRoot - Absolute path to the project root directory.
125
191
  * @param fromId - Source node ID (brain_page_nodes.id).
@@ -127,30 +193,58 @@ export async function upsertGraphNode(projectRoot, nodeId, nodeType, label, qual
127
193
  * @param edgeType - Typed relationship from BRAIN_EDGE_TYPES.
128
194
  * @param weight - Edge confidence/weight (0.0–1.0). Defaults to 1.0.
129
195
  * @param provenance - Human-readable note on why this edge was emitted.
196
+ * @param context - Captured scope; when supplied, failures throw and writes check cancellation.
130
197
  *
198
+ * @remarks Scoped calls pin storage routing and refuse to join an unowned transaction.
199
+ * @example
200
+ * ```ts
201
+ * await addGraphEdge(root, 'task:T123', 'llmtxt:hash', 'embeds');
202
+ * ```
131
203
  * @task T537
132
204
  */
133
- export async function addGraphEdge(projectRoot, fromId, toId, edgeType, weight = 1.0, provenance) {
134
- try {
135
- if (!(await shouldAutoPopulateGraph(projectRoot)))
136
- return;
137
- const db = await getBrainDb(projectRoot);
138
- const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
139
- await db
140
- .insert(brainPageEdges)
141
- .values({
142
- fromId,
143
- toId,
144
- edgeType,
145
- weight,
146
- provenance: provenance ?? null,
147
- createdAt: now,
148
- })
149
- .onConflictDoNothing();
150
- }
151
- catch (err) {
152
- log.warn({ err }, 'addGraphEdge failed');
153
- }
205
+ export async function addGraphEdge(projectRoot, fromId, toId, edgeType, weight = 1.0, provenance, context) {
206
+ const write = async () => {
207
+ try {
208
+ if (!(await graphWriteEnabled(projectRoot, context)))
209
+ return;
210
+ context?.assertActive();
211
+ const db = await getBrainDb(projectRoot);
212
+ context?.assertActive();
213
+ const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
214
+ const query = db
215
+ .insert(brainPageEdges)
216
+ .values({
217
+ fromId,
218
+ toId,
219
+ edgeType,
220
+ weight,
221
+ provenance: provenance ?? null,
222
+ createdAt: now,
223
+ })
224
+ .onConflictDoNothing();
225
+ if (context) {
226
+ db.transaction((tx) => {
227
+ assertOperationWriteFence(tx, context);
228
+ query.run();
229
+ });
230
+ }
231
+ else {
232
+ query.run();
233
+ }
234
+ }
235
+ catch (err) {
236
+ if (context)
237
+ throw err;
238
+ log.warn({ err }, 'addGraphEdge failed');
239
+ }
240
+ };
241
+ return context
242
+ ? worktreeScope.run({
243
+ worktreeRoot: context.identity.projectRoot,
244
+ projectHash: generateProjectHash(context.identity.projectRoot),
245
+ execution: context,
246
+ }, write)
247
+ : write();
154
248
  }
155
249
  // ---------------------------------------------------------------------------
156
250
  // T945 Stage A — universal semantic graph hooks
@@ -237,6 +331,34 @@ export async function ensureLlmtxtNode(projectRoot, sha256, ownerId, label) {
237
331
  log.warn({ err }, 'ensureLlmtxtNode failed');
238
332
  }
239
333
  }
334
+ /**
335
+ * Project a canonical document into the graph with captured scope and visible failures.
336
+ *
337
+ * @remarks Each synchronous write checks the same absolute deadline. This does not preempt
338
+ * SQLite or promise atomicity across the node and edge; a failed edge leaves an
339
+ * idempotently resumable partial projection. Canonical document bytes are untouched.
340
+ *
341
+ * @param context - Caller-owned immutable identity, deadline and cancellation.
342
+ * @param sha256 - Canonical document content hash.
343
+ * @param ownerId - Qualified graph owner identity.
344
+ * @param label - Document display label.
345
+ * @returns Completed or explicitly disabled graph projection in the captured project.
346
+ * @throws Error - Configuration, storage, cancellation or deadline failure.
347
+ * @example
348
+ * ```ts
349
+ * const result = await ensureLlmtxtNodeScoped(context, sha256, 'task:T123', 'Design');
350
+ * ```
351
+ */
352
+ export async function ensureLlmtxtNodeScoped(context, sha256, ownerId, label) {
353
+ const identity = context.identity;
354
+ const result = { projectId: identity.projectId, projectRoot: identity.projectRoot };
355
+ if (!(await scopedGraphEnabled(context)))
356
+ return { ...result, status: 'disabled' };
357
+ const nodeId = `llmtxt:${sha256}`;
358
+ await upsertGraphNode(identity.projectRoot, nodeId, 'llmtxt', label, 0.8, sha256, { sha256 }, context);
359
+ await addGraphEdge(identity.projectRoot, ownerId, nodeId, 'embeds', 1, 'auto:docs-add', context);
360
+ return { ...result, status: 'completed' };
361
+ }
240
362
  /**
241
363
  * Upsert a `msg:<id>` graph node for a CONDUIT message and, when the message
242
364
  * body references one or more `T###` task IDs, emit `discusses` edges from
@@ -1 +1 @@
1
- {"version":3,"file":"graph-auto-populate.js","sourceRoot":"","sources":["../../src/memory/graph-auto-populate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph-auto-populate.js","sourceRoot":"","sources":["../../src/memory/graph-auto-populate.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,7 @@
17
17
  * @task graph-memory-bridge
18
18
  * @epic T523
19
19
  */
20
+ import type { DecisionCodeEvidenceLink } from '@cleocode/contracts';
20
21
  import { getNexusNativeDb } from '../store/nexus-sqlite.js';
21
22
  /** A single code-reference link created or found by the bridge. */
22
23
  export interface CodeReferenceLink {
@@ -54,6 +55,8 @@ export interface MemoriesForCodeResult {
54
55
  qualityScore: number;
55
56
  edgeWeight: number;
56
57
  matchStrategy: string;
58
+ /** Explicit verified source provenance when this is a sourced decision relation. */
59
+ provenance?: DecisionCodeEvidenceLink;
57
60
  }>;
58
61
  }
59
62
  /** Result from queryCodeForMemory. */
@@ -68,6 +71,8 @@ export interface CodeForMemoryResult {
68
71
  kind: string;
69
72
  edgeWeight: number;
70
73
  matchStrategy: string;
74
+ /** Explicit verified source provenance when this is a sourced decision relation. */
75
+ provenance?: DecisionCodeEvidenceLink;
71
76
  }>;
72
77
  }
73
78
  /**
@@ -98,7 +103,13 @@ export declare function linkMemoryToCode(projectRoot: string, memoryId: string,
98
103
  * @param filesModifiedJson - JSON array of file paths (may be null)
99
104
  * @param projectRoot - Absolute path to project root
100
105
  * @param nexusNative - Optional pre-loaded nexus database handle
101
- * @returns Count of edges written
106
+ * @returns Count of newly written edges; repeated calls preserve existing history.
107
+ * @remarks Only canonical file nodes are eligible. File evidence does not establish symbol-level changes;
108
+ * revision is explicitly unrecorded when the observation does not supply one.
109
+ * @example
110
+ * ```ts
111
+ * const written = await linkObservationToModifiedFiles(observationId, filePathsJson, projectRoot, undefined);
112
+ * ```
102
113
  */
103
114
  export declare function linkObservationToModifiedFiles(obsId: string, filesModifiedJson: string | null, projectRoot: string, nexusNative?: ReturnType<typeof getNexusNativeDb>): Promise<number>;
104
115
  /**
@@ -176,6 +187,8 @@ export declare function queryMemoriesForCode(projectRoot: string, symbol: string
176
187
  export declare function queryCodeForMemory(projectRoot: string, memoryId: string): Promise<CodeForMemoryResult>;
177
188
  /** A single code-memory link for display. */
178
189
  export interface CodeLinkEntry {
190
+ /** Explicit sourced relation metadata, when present. */
191
+ provenance?: DecisionCodeEvidenceLink;
179
192
  /** Brain memory node ID. */
180
193
  brainNodeId: string;
181
194
  /** Brain node type. */
@@ -1 +1 @@
1
- {"version":3,"file":"graph-memory-bridge.d.ts","sourceRoot":"","sources":["../../src/memory/graph-memory-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAOH,OAAO,EAAc,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAiBxE,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,aAAa,EAAE,YAAY,GAAG,cAAc,GAAG,cAAc,CAAC;IAC9D,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,wCAAwC;AACxC,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,QAAQ,EAAE,KAAK,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;CACJ;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,SAAS,EAAE,KAAK,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC,CAAC;CACJ;AAgID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CA8DlB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CA+CjB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iCAAiC,CACrD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CAmEjB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CAmEjB;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA8QnF;AAMD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC,CA6ChC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CAyD9B;AAMD,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA2D9F;AAMD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwG7B;AAMD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CA6LlC"}
1
+ {"version":3,"file":"graph-memory-bridge.d.ts","sourceRoot":"","sources":["../../src/memory/graph-memory-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAKH,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAc,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAsBxE,mEAAmE;AACnE,MAAM,WAAW,iBAAiB;IAChC,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,aAAa,EAAE,YAAY,GAAG,cAAc,GAAG,cAAc,CAAC;IAC9D,sDAAsD;IACtD,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,4CAA4C;AAC5C,MAAM,WAAW,cAAc;IAC7B,yDAAyD;IACzD,OAAO,EAAE,MAAM,CAAC;IAChB,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAC;IACf,sDAAsD;IACtD,aAAa,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,KAAK,EAAE,iBAAiB,EAAE,CAAC;CAC5B;AAED,wCAAwC;AACxC,MAAM,WAAW,qBAAqB;IACpC,0CAA0C;IAC1C,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,QAAQ,EAAE,KAAK,CAAC;QACd,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,oFAAoF;QACpF,UAAU,CAAC,EAAE,wBAAwB,CAAC;KACvC,CAAC,CAAC;CACJ;AAED,sCAAsC;AACtC,MAAM,WAAW,mBAAmB;IAClC,iDAAiD;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,SAAS,EAAE,KAAK,CAAC;QACf,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACxB,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,oFAAoF;QACpF,UAAU,CAAC,EAAE,wBAAwB,CAAC;KACvC,CAAC,CAAC;CACJ;AAgID;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,OAAO,CAAC,CAwElB;AAMD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,8BAA8B,CAClD,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CA0DjB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,iCAAiC,CACrD,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CAsEjB;AAMD;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,WAAW,CAAC,EAAE,UAAU,CAAC,OAAO,gBAAgB,CAAC,GAChD,OAAO,CAAC,MAAM,CAAC,CAsEjB;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CA8QnF;AAMD;;;;;;;;;GASG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,qBAAqB,CAAC,CAkDhC;AAMD;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,mBAAmB,CAAC,CA6D9B;AAMD,6CAA6C;AAC7C,MAAM,WAAW,aAAa;IAC5B,wDAAwD;IACxD,UAAU,CAAC,EAAE,wBAAwB,CAAC;IACtC,4BAA4B;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,uBAAuB;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,wBAAwB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,0BAA0B;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,8DAA8D;IAC9D,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,iCAAiC;IACjC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,KAAK,SAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA8D9F;AAMD;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iDAAiD;IACjD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,4EAA4E;IAC5E,QAAQ,EAAE,MAAM,CAAC;IACjB,4BAA4B;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,4BAA4B;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,wBAA6B,GACpC,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAwG7B;AAMD;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,6DAA6D;IAC7D,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,4BAA4B,CAChD,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,CAAC,CA6LlC"}
@@ -26,6 +26,7 @@ import { brainPageEdges, brainPageNodes } from '../store/schema/memory-schema.js
26
26
  import { applyPerfPragmas } from '../store/sqlite-pragmas.js';
27
27
  import { typedAll } from '../store/typed-query.js';
28
28
  import { withWriterLease } from '../store/writer-lease.js';
29
+ import { isCurrentDecisionCodeEvidence, linkDecisionToCodeEvidence, readDecisionCodeEvidence, } from './decision-cross-link.js';
29
30
  const _require = createRequire(import.meta.url);
30
31
  const { DatabaseSync } = _require('node:sqlite');
31
32
  // ---------------------------------------------------------------------------
@@ -143,11 +144,19 @@ function metadataText(metaJson) {
143
144
  * @returns True if the edge was created or already existed; false on error
144
145
  */
145
146
  export async function linkMemoryToCode(projectRoot, memoryId, codeSymbol) {
147
+ if (memoryId.startsWith('decision:')) {
148
+ const result = await linkDecisionToCodeEvidence(projectRoot, memoryId, {
149
+ symbols: [codeSymbol],
150
+ apply: true,
151
+ });
152
+ return (result.links.some((link) => link.targetId === codeSymbol) &&
153
+ !result.findings.some((finding) => finding.state === 'failed'));
154
+ }
146
155
  try {
147
156
  const brainDb = await getBrainDb(projectRoot);
148
157
  // Ensure nexus.db is initialized so we can verify the target node exists
149
- await getNexusDb();
150
- const nexusNative = getNexusNativeDb();
158
+ await getNexusDb(projectRoot);
159
+ const nexusNative = getNexusNativeDb(projectRoot);
151
160
  if (!nexusNative)
152
161
  return false;
153
162
  // Verify the nexus node exists (read-only check)
@@ -212,7 +221,13 @@ export async function linkMemoryToCode(projectRoot, memoryId, codeSymbol) {
212
221
  * @param filesModifiedJson - JSON array of file paths (may be null)
213
222
  * @param projectRoot - Absolute path to project root
214
223
  * @param nexusNative - Optional pre-loaded nexus database handle
215
- * @returns Count of edges written
224
+ * @returns Count of newly written edges; repeated calls preserve existing history.
225
+ * @remarks Only canonical file nodes are eligible. File evidence does not establish symbol-level changes;
226
+ * revision is explicitly unrecorded when the observation does not supply one.
227
+ * @example
228
+ * ```ts
229
+ * const written = await linkObservationToModifiedFiles(observationId, filePathsJson, projectRoot, undefined);
230
+ * ```
216
231
  */
217
232
  export async function linkObservationToModifiedFiles(obsId, filesModifiedJson, projectRoot, nexusNative) {
218
233
  let edgeCount = 0;
@@ -223,7 +238,7 @@ export async function linkObservationToModifiedFiles(obsId, filesModifiedJson, p
223
238
  const brainNative = getBrainNativeDb(projectRoot);
224
239
  if (!brainNative)
225
240
  return 0;
226
- const nexusDb = nexusNative ?? getNexusNativeDb();
241
+ const nexusDb = nexusNative ?? getNexusNativeDb(projectRoot);
227
242
  if (!nexusDb)
228
243
  return 0;
229
244
  const filesArray = JSON.parse(filesModifiedJson);
@@ -235,20 +250,26 @@ export async function linkObservationToModifiedFiles(obsId, filesModifiedJson, p
235
250
  continue;
236
251
  // Find nexus node by exact file path match
237
252
  const nexusNode = nexusDb
238
- .prepare('SELECT id FROM nexus_nodes WHERE file_path = ? LIMIT 1')
239
- .get(filePath);
240
- if (!nexusNode)
253
+ .prepare("SELECT id FROM main.nexus_nodes WHERE id = ? AND file_path = ? AND kind = 'file'")
254
+ .get(filePath, filePath);
255
+ if (typeof nexusNode?.id !== 'string')
241
256
  continue;
242
257
  // Write modified_by edge (file → observation)
243
258
  try {
244
- brainNative
259
+ const inserted = brainNative
245
260
  .prepare(`
246
- INSERT OR IGNORE INTO brain_page_edges
261
+ INSERT OR IGNORE INTO main.brain_page_edges
247
262
  (from_id, to_id, edge_type, weight, provenance, created_at)
248
- VALUES (?, ?, 'modified_by', 1.0, 'auto:file-modify', ?)
263
+ VALUES (?, ?, 'modified_by', 1.0, ?, ?)
249
264
  `)
250
- .run(nexusNode.id, obsId, now);
251
- edgeCount++;
265
+ .run(nexusNode.id, obsId, JSON.stringify({
266
+ source: 'observation.files_modified_json',
267
+ observationId: obsId,
268
+ precision: 'file',
269
+ filePath,
270
+ assessedRevision: null,
271
+ }), now);
272
+ edgeCount += Number(inserted.changes);
252
273
  }
253
274
  catch (err) {
254
275
  console.warn('[graph-memory-bridge] modified_by edge insert failed:', err);
@@ -287,7 +308,7 @@ export async function linkObservationToMentionedSymbols(obsId, text, projectRoot
287
308
  const brainNative = getBrainNativeDb(projectRoot);
288
309
  if (!brainNative)
289
310
  return 0;
290
- const nexusDb = nexusNative ?? getNexusNativeDb();
311
+ const nexusDb = nexusNative ?? getNexusNativeDb(projectRoot);
291
312
  if (!nexusDb)
292
313
  return 0;
293
314
  const nexusNames = typedAll(nexusDb.prepare('SELECT id, name FROM nexus_nodes WHERE name IS NOT NULL LIMIT 10000'));
@@ -310,7 +331,9 @@ export async function linkObservationToMentionedSymbols(obsId, text, projectRoot
310
331
  const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
311
332
  // Write mentions edges
312
333
  for (const name of matches) {
313
- const nexusNode = nexusNames.find((n) => n.name === name);
334
+ const matches = nexusNames.filter((node) => node.name === name);
335
+ const qualified = matches.filter((node) => text.includes(node.id));
336
+ const nexusNode = qualified.length === 1 ? qualified[0] : matches.length === 1 ? matches[0] : undefined;
314
337
  if (!nexusNode)
315
338
  continue;
316
339
  try {
@@ -360,7 +383,7 @@ export async function linkDecisionToSymbols(decisionId, contextText, projectRoot
360
383
  const brainNative = getBrainNativeDb(projectRoot);
361
384
  if (!brainNative)
362
385
  return 0;
363
- const nexusDb = nexusNative ?? getNexusNativeDb();
386
+ const nexusDb = nexusNative ?? getNexusNativeDb(projectRoot);
364
387
  if (!nexusDb)
365
388
  return 0;
366
389
  const nexusNames = typedAll(nexusDb.prepare('SELECT id, name FROM nexus_nodes WHERE name IS NOT NULL LIMIT 10000'));
@@ -383,7 +406,9 @@ export async function linkDecisionToSymbols(decisionId, contextText, projectRoot
383
406
  const now = new Date().toISOString().replace('T', ' ').slice(0, 19);
384
407
  // Write documents edges
385
408
  for (const name of matches) {
386
- const nexusNode = nexusNames.find((n) => n.name === name);
409
+ const matches = nexusNames.filter((node) => node.name === name);
410
+ const qualified = matches.filter((node) => contextText.includes(node.id));
411
+ const nexusNode = qualified.length === 1 ? qualified[0] : matches.length === 1 ? matches[0] : undefined;
387
412
  if (!nexusNode)
388
413
  continue;
389
414
  try {
@@ -432,8 +457,8 @@ export async function autoLinkMemories(projectRoot) {
432
457
  try {
433
458
  await getBrainDb(projectRoot);
434
459
  const brainNative = getBrainNativeDb(projectRoot);
435
- await getNexusDb();
436
- const nexusNative = getNexusNativeDb();
460
+ await getNexusDb(projectRoot);
461
+ const nexusNative = getNexusNativeDb(projectRoot);
437
462
  if (!brainNative || !nexusNative)
438
463
  return result;
439
464
  // Load all brain page nodes that are memory entity types
@@ -651,13 +676,18 @@ export async function queryMemoriesForCode(projectRoot, symbol) {
651
676
  ORDER BY e.weight DESC, n.quality_score DESC
652
677
  LIMIT 50
653
678
  `), symbol);
654
- result.memories = rows.map((r) => ({
679
+ result.memories = rows
680
+ .filter((row) => isCurrentDecisionCodeEvidence(brainNative, row.provenance))
681
+ .map((r) => ({
655
682
  nodeId: r.id,
656
683
  nodeType: r.node_type,
657
684
  label: r.label,
658
685
  qualityScore: r.quality_score,
659
686
  edgeWeight: r.weight,
660
- matchStrategy: r.provenance?.replace('auto:', '') ?? 'manual',
687
+ matchStrategy: readDecisionCodeEvidence(r.provenance)
688
+ ? 'explicit-decision-evidence'
689
+ : (r.provenance?.replace('auto:', '') ?? 'manual'),
690
+ provenance: readDecisionCodeEvidence(r.provenance) ?? undefined,
661
691
  }));
662
692
  }
663
693
  catch (err) {
@@ -683,8 +713,8 @@ export async function queryCodeForMemory(projectRoot, memoryId) {
683
713
  try {
684
714
  await getBrainDb(projectRoot);
685
715
  const brainNative = getBrainNativeDb(projectRoot);
686
- await getNexusDb();
687
- const nexusNative = getNexusNativeDb();
716
+ await getNexusDb(projectRoot);
717
+ const nexusNative = getNexusNativeDb(projectRoot);
688
718
  if (!brainNative || !nexusNative)
689
719
  return result;
690
720
  const brainEdges = typedAll(brainNative.prepare(`
@@ -699,6 +729,8 @@ export async function queryCodeForMemory(projectRoot, memoryId) {
699
729
  return result;
700
730
  // Fetch nexus node metadata for each target (read-only)
701
731
  for (const edge of brainEdges) {
732
+ if (!isCurrentDecisionCodeEvidence(brainNative, edge.provenance))
733
+ continue;
702
734
  const nexusNode = nexusNative
703
735
  .prepare('SELECT id, label, file_path, kind FROM nexus_nodes WHERE id = ? LIMIT 1')
704
736
  .get(edge.to_id);
@@ -709,7 +741,10 @@ export async function queryCodeForMemory(projectRoot, memoryId) {
709
741
  filePath: nexusNode.file_path,
710
742
  kind: nexusNode.kind,
711
743
  edgeWeight: edge.weight,
712
- matchStrategy: edge.provenance?.replace('auto:', '') ?? 'manual',
744
+ matchStrategy: readDecisionCodeEvidence(edge.provenance)
745
+ ? 'explicit-decision-evidence'
746
+ : (edge.provenance?.replace('auto:', '') ?? 'manual'),
747
+ provenance: readDecisionCodeEvidence(edge.provenance) ?? undefined,
713
748
  });
714
749
  }
715
750
  }
@@ -733,12 +768,12 @@ export async function listCodeLinks(projectRoot, limit = 100) {
733
768
  try {
734
769
  await getBrainDb(projectRoot);
735
770
  const brainNative = getBrainNativeDb(projectRoot);
736
- await getNexusDb();
737
- const nexusNative = getNexusNativeDb();
771
+ await getNexusDb(projectRoot);
772
+ const nexusNative = getNexusNativeDb(projectRoot);
738
773
  if (!brainNative || !nexusNative)
739
774
  return entries;
740
775
  const rows = typedAll(brainNative.prepare(`
741
- SELECT e.from_id, e.to_id, e.weight, e.created_at,
776
+ SELECT e.from_id, e.to_id, e.weight, e.created_at, e.provenance,
742
777
  n.node_type, n.label
743
778
  FROM brain_page_edges e
744
779
  JOIN brain_page_nodes n ON n.id = e.from_id
@@ -747,10 +782,13 @@ export async function listCodeLinks(projectRoot, limit = 100) {
747
782
  LIMIT ?
748
783
  `), limit);
749
784
  for (const row of rows) {
785
+ if (!isCurrentDecisionCodeEvidence(brainNative, row.provenance))
786
+ continue;
750
787
  const nexusNode = nexusNative
751
788
  .prepare('SELECT id, label, file_path, kind FROM nexus_nodes WHERE id = ? LIMIT 1')
752
789
  .get(row.to_id);
753
790
  entries.push({
791
+ provenance: readDecisionCodeEvidence(row.provenance) ?? undefined,
754
792
  brainNodeId: row.from_id,
755
793
  brainNodeType: row.node_type,
756
794
  brainNodeLabel: row.label,
@@ -910,8 +948,8 @@ export async function linkConduitMessagesToSymbols(projectRoot) {
910
948
  await getBrainDb(projectRoot);
911
949
  const brainNative = getBrainNativeDb(projectRoot);
912
950
  // Ensure nexus.db is available for symbol lookup
913
- await getNexusDb();
914
- const nexusNative = getNexusNativeDb();
951
+ await getNexusDb(projectRoot);
952
+ const nexusNative = getNexusNativeDb(projectRoot);
915
953
  if (!brainNative || !nexusNative)
916
954
  return result;
917
955
  // T11545: plasticity weight lives in the sibling nexus_relation_weights