create-principles-disciple 1.93.0 → 1.95.0

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 (526) hide show
  1. package/console/dist/server/config/WorkspaceConfigStore.js +2 -1
  2. package/console/dist/server/config/pd-config-store.d.ts +40 -1
  3. package/console/dist/server/config/pd-config-store.js +170 -1
  4. package/console/dist/server/index.js +28 -10
  5. package/console/dist/server/models/ApprovalsConsoleModel.js +4 -12
  6. package/console/dist/server/models/EvidenceChainConsoleModel.d.ts +0 -2
  7. package/console/dist/server/models/EvidenceChainConsoleModel.js +36 -2
  8. package/console/dist/server/models/HealthCheckModel.js +5 -3
  9. package/console/dist/server/models/IntentDecisionModel.d.ts +66 -0
  10. package/console/dist/server/models/IntentDecisionModel.js +207 -0
  11. package/console/dist/server/models/IntentPageModel.d.ts +18 -0
  12. package/console/dist/server/models/IntentPageModel.js +90 -0
  13. package/console/dist/server/models/PrinciplesConsoleModel.d.ts +2 -0
  14. package/console/dist/server/models/PrinciplesConsoleModel.js +37 -1
  15. package/console/dist/server/models/WorkspaceService.d.ts +0 -28
  16. package/console/dist/server/models/WorkspaceService.js +0 -115
  17. package/console/dist/server/routes/config.js +55 -1
  18. package/console/dist/server/routes/feedback-reports.js +1 -1
  19. package/console/dist/server/routes/intent-decisions.d.ts +33 -0
  20. package/console/dist/server/routes/intent-decisions.js +499 -0
  21. package/console/dist/server/routes/intent.d.ts +3 -0
  22. package/console/dist/server/routes/intent.js +35 -0
  23. package/console/dist/server/routes/principles.js +67 -1
  24. package/console/dist/server/routes/update.d.ts +0 -1
  25. package/console/dist/server/routes/update.js +14 -11
  26. package/console/dist/ui/App.js +2 -7
  27. package/console/dist/ui/api.d.ts +44 -18
  28. package/console/dist/ui/api.js +44 -5
  29. package/console/dist/ui/components/layout/app-sidebar.js +2 -1
  30. package/console/dist/ui/components/ui/badge.d.ts +1 -1
  31. package/console/dist/ui/components/ui/button.d.ts +1 -1
  32. package/console/dist/ui/components/ui/shiny-text.d.ts +28 -0
  33. package/console/dist/ui/components/ui/shiny-text.js +46 -0
  34. package/console/dist/ui/i18n/en.json +167 -3
  35. package/console/dist/ui/i18n/zh-CN.json +167 -3
  36. package/console/dist/ui/pages/activation/ActivationPage.js +2 -1
  37. package/console/dist/ui/pages/control-center/ControlCenterPage.js +28 -2
  38. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.d.ts +28 -0
  39. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.js +38 -0
  40. package/console/dist/ui/pages/debt/DebtPage.js +219 -2
  41. package/console/dist/ui/pages/focus/FocusPage.js +2 -1
  42. package/console/dist/ui/pages/intent/IntentPage.d.ts +1 -0
  43. package/console/dist/ui/pages/intent/IntentPage.js +147 -0
  44. package/console/dist/ui/pages/pain/PainPage.js +234 -4
  45. package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +75 -0
  46. package/console/dist/ui/pages/pain/pain-card-helpers.js +78 -0
  47. package/console/dist/ui/pages/principles/PrinciplesPage.js +2 -1
  48. package/console/dist/ui/utils/validators.d.ts +163 -0
  49. package/console/dist/ui/utils/validators.js +433 -0
  50. package/console/dist/web/assets/app.css +138 -0
  51. package/console/dist/web/assets/app.js +3124 -1288
  52. package/console/package.json +3 -0
  53. package/core/dist/index.d.ts +2 -2
  54. package/core/dist/index.d.ts.map +1 -1
  55. package/core/dist/index.js +1 -1
  56. package/core/dist/index.js.map +1 -1
  57. package/core/dist/principle-tree-ledger.d.ts +55 -4
  58. package/core/dist/principle-tree-ledger.d.ts.map +1 -1
  59. package/core/dist/principle-tree-ledger.js +472 -13
  60. package/core/dist/principle-tree-ledger.js.map +1 -1
  61. package/core/dist/prompt-builder/__tests__/model-config.test.d.ts +2 -0
  62. package/core/dist/prompt-builder/__tests__/model-config.test.d.ts.map +1 -0
  63. package/core/dist/prompt-builder/__tests__/model-config.test.js +158 -0
  64. package/core/dist/prompt-builder/__tests__/model-config.test.js.map +1 -0
  65. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js +58 -0
  66. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js.map +1 -1
  67. package/core/dist/prompt-builder/__tests__/xml-escape.test.d.ts +2 -0
  68. package/core/dist/prompt-builder/__tests__/xml-escape.test.d.ts.map +1 -0
  69. package/core/dist/prompt-builder/__tests__/xml-escape.test.js +42 -0
  70. package/core/dist/prompt-builder/__tests__/xml-escape.test.js.map +1 -0
  71. package/core/dist/prompt-builder/empathy-keyword-matching.d.ts.map +1 -1
  72. package/core/dist/prompt-builder/empathy-keyword-matching.js +9 -6
  73. package/core/dist/prompt-builder/empathy-keyword-matching.js.map +1 -1
  74. package/core/dist/prompt-builder/index.d.ts +3 -0
  75. package/core/dist/prompt-builder/index.d.ts.map +1 -1
  76. package/core/dist/prompt-builder/index.js +2 -0
  77. package/core/dist/prompt-builder/index.js.map +1 -1
  78. package/core/dist/prompt-builder/model-config.d.ts +42 -0
  79. package/core/dist/prompt-builder/model-config.d.ts.map +1 -0
  80. package/core/dist/prompt-builder/model-config.js +84 -0
  81. package/core/dist/prompt-builder/model-config.js.map +1 -0
  82. package/core/dist/prompt-builder/size-guard.d.ts +1 -0
  83. package/core/dist/prompt-builder/size-guard.d.ts.map +1 -1
  84. package/core/dist/prompt-builder/size-guard.js +21 -0
  85. package/core/dist/prompt-builder/size-guard.js.map +1 -1
  86. package/core/dist/prompt-builder/types.d.ts +2 -0
  87. package/core/dist/prompt-builder/types.d.ts.map +1 -1
  88. package/core/dist/prompt-builder/xml-escape.d.ts +12 -0
  89. package/core/dist/prompt-builder/xml-escape.d.ts.map +1 -0
  90. package/core/dist/prompt-builder/xml-escape.js +19 -0
  91. package/core/dist/prompt-builder/xml-escape.js.map +1 -0
  92. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +205 -48
  93. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  94. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts +2 -0
  95. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts.map +1 -0
  96. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js +284 -0
  97. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js.map +1 -0
  98. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.d.ts +2 -0
  99. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.d.ts.map +1 -0
  100. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +500 -0
  101. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -0
  102. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +7 -5
  103. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  104. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js +11 -0
  105. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js.map +1 -1
  106. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +15 -2
  107. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
  108. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts +2 -0
  109. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts.map +1 -0
  110. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js +290 -0
  111. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js.map +1 -0
  112. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts +2 -0
  113. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts.map +1 -0
  114. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js +158 -0
  115. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js.map +1 -0
  116. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +15 -1
  117. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js.map +1 -1
  118. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts +2 -0
  119. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts.map +1 -0
  120. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js +62 -0
  121. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js.map +1 -0
  122. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +12 -2
  123. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
  124. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts +2 -0
  125. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts.map +1 -0
  126. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js +56 -0
  127. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js.map +1 -0
  128. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +8 -0
  129. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
  130. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +20 -0
  131. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -1
  132. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
  133. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js +6 -0
  134. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
  135. package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
  136. package/core/dist/runtime-v2/activation/sqlite-approval-store.js +86 -32
  137. package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
  138. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +65 -1
  139. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
  140. package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
  141. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +33 -11
  142. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
  143. package/core/dist/runtime-v2/bridge-result-shaper.d.ts +53 -0
  144. package/core/dist/runtime-v2/bridge-result-shaper.d.ts.map +1 -0
  145. package/core/dist/runtime-v2/bridge-result-shaper.js +117 -0
  146. package/core/dist/runtime-v2/bridge-result-shaper.js.map +1 -0
  147. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts +13 -0
  148. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.d.ts.map +1 -0
  149. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js +111 -0
  150. package/core/dist/runtime-v2/detection/__tests__/detection-funnel-policy.test.js.map +1 -0
  151. package/core/dist/runtime-v2/detection/detection-funnel-policy.d.ts +103 -0
  152. package/core/dist/runtime-v2/detection/detection-funnel-policy.d.ts.map +1 -0
  153. package/core/dist/runtime-v2/detection/detection-funnel-policy.js +135 -0
  154. package/core/dist/runtime-v2/detection/detection-funnel-policy.js.map +1 -0
  155. package/core/dist/runtime-v2/detection/index.d.ts +10 -0
  156. package/core/dist/runtime-v2/detection/index.d.ts.map +1 -0
  157. package/core/dist/runtime-v2/detection/index.js +9 -0
  158. package/core/dist/runtime-v2/detection/index.js.map +1 -0
  159. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +134 -15
  160. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
  161. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts +18 -0
  162. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts.map +1 -0
  163. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js +251 -0
  164. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js.map +1 -0
  165. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +73 -0
  166. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -1
  167. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +98 -0
  168. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
  169. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js +131 -0
  170. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
  171. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +8 -0
  172. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
  173. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +66 -3
  174. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
  175. package/core/dist/runtime-v2/diagnostician-output.d.ts +23 -0
  176. package/core/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
  177. package/core/dist/runtime-v2/diagnostician-output.js +16 -0
  178. package/core/dist/runtime-v2/diagnostician-output.js.map +1 -1
  179. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +32 -0
  180. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
  181. package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
  182. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts +12 -0
  183. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.d.ts.map +1 -0
  184. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js +181 -0
  185. package/core/dist/runtime-v2/evidence-triage/__tests__/observation-resolver.test.js.map +1 -0
  186. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js +104 -1
  187. package/core/dist/runtime-v2/evidence-triage/__tests__/triage-policy.test.js.map +1 -1
  188. package/core/dist/runtime-v2/evidence-triage/index.d.ts +3 -0
  189. package/core/dist/runtime-v2/evidence-triage/index.d.ts.map +1 -1
  190. package/core/dist/runtime-v2/evidence-triage/index.js +3 -0
  191. package/core/dist/runtime-v2/evidence-triage/index.js.map +1 -1
  192. package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts +128 -0
  193. package/core/dist/runtime-v2/evidence-triage/observation-resolver.d.ts.map +1 -0
  194. package/core/dist/runtime-v2/evidence-triage/observation-resolver.js +203 -0
  195. package/core/dist/runtime-v2/evidence-triage/observation-resolver.js.map +1 -0
  196. package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +1 -1
  197. package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +1 -1
  198. package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts +4 -0
  199. package/core/dist/runtime-v2/evidence-triage/triage-policy.d.ts.map +1 -1
  200. package/core/dist/runtime-v2/evidence-triage/triage-policy.js +66 -9
  201. package/core/dist/runtime-v2/evidence-triage/triage-policy.js.map +1 -1
  202. package/core/dist/runtime-v2/evidence-triage/types.d.ts +14 -0
  203. package/core/dist/runtime-v2/evidence-triage/types.d.ts.map +1 -1
  204. package/core/dist/runtime-v2/evidence-triage/types.js.map +1 -1
  205. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +56 -4
  206. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  207. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts +2 -0
  208. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts.map +1 -0
  209. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js +30 -0
  210. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js.map +1 -0
  211. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  212. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +11 -2
  213. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  214. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.d.ts.map +1 -1
  215. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js +0 -9
  216. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js.map +1 -1
  217. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.d.ts +15 -0
  218. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.d.ts.map +1 -0
  219. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.js +450 -0
  220. package/core/dist/runtime-v2/feedback/__tests__/redact-sensitive.test.js.map +1 -0
  221. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.d.ts +13 -0
  222. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.d.ts.map +1 -0
  223. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.js +243 -0
  224. package/core/dist/runtime-v2/feedback/__tests__/render-github-url.test.js.map +1 -0
  225. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.d.ts +12 -0
  226. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.d.ts.map +1 -0
  227. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.js +172 -0
  228. package/core/dist/runtime-v2/feedback/__tests__/safe-stringify.test.js.map +1 -0
  229. package/core/dist/runtime-v2/index.d.ts +15 -6
  230. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  231. package/core/dist/runtime-v2/index.js +15 -4
  232. package/core/dist/runtime-v2/index.js.map +1 -1
  233. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts +2 -0
  234. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts.map +1 -0
  235. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js +185 -0
  236. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js.map +1 -0
  237. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts +2 -0
  238. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts.map +1 -0
  239. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js +91 -0
  240. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -0
  241. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts +2 -0
  242. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts.map +1 -0
  243. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js +168 -0
  244. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js.map +1 -0
  245. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts +2 -0
  246. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts.map +1 -0
  247. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js +121 -0
  248. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js.map +1 -0
  249. package/core/dist/runtime-v2/intent/index.d.ts +6 -0
  250. package/core/dist/runtime-v2/intent/index.d.ts.map +1 -0
  251. package/core/dist/runtime-v2/intent/index.js +6 -0
  252. package/core/dist/runtime-v2/intent/index.js.map +1 -0
  253. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts +125 -0
  254. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts.map +1 -0
  255. package/core/dist/runtime-v2/intent/intent-decision-record.js +21 -0
  256. package/core/dist/runtime-v2/intent/intent-decision-record.js.map +1 -0
  257. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts +95 -0
  258. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts.map +1 -0
  259. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js +43 -0
  260. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js.map +1 -0
  261. package/core/dist/runtime-v2/intent/intent-doc.d.ts +19 -0
  262. package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -0
  263. package/core/dist/runtime-v2/intent/intent-doc.js +70 -0
  264. package/core/dist/runtime-v2/intent/intent-doc.js.map +1 -0
  265. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts +63 -0
  266. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts.map +1 -0
  267. package/core/dist/runtime-v2/intent/intent-friction-block.js +129 -0
  268. package/core/dist/runtime-v2/intent/intent-friction-block.js.map +1 -0
  269. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts +42 -0
  270. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts.map +1 -0
  271. package/core/dist/runtime-v2/intent/intent-patch-proposal.js +81 -0
  272. package/core/dist/runtime-v2/intent/intent-patch-proposal.js.map +1 -0
  273. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts +54 -0
  274. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts.map +1 -0
  275. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js +219 -0
  276. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js.map +1 -0
  277. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.d.ts +2 -0
  278. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.d.ts.map +1 -0
  279. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js +306 -0
  280. package/core/dist/runtime-v2/internalization/__tests__/c2-live-runner-chain.test.js.map +1 -0
  281. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts +2 -0
  282. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts.map +1 -0
  283. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js +360 -0
  284. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js.map +1 -0
  285. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts +2 -0
  286. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts.map +1 -0
  287. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js +333 -0
  288. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js.map +1 -0
  289. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts +2 -0
  290. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts.map +1 -0
  291. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js +113 -0
  292. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js.map +1 -0
  293. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +13 -0
  294. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
  295. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +42 -0
  296. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
  297. package/core/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
  298. package/core/dist/runtime-v2/internalization/diag-router-runner.js +27 -0
  299. package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
  300. package/core/dist/runtime-v2/internalization/index.d.ts +0 -16
  301. package/core/dist/runtime-v2/internalization/index.d.ts.map +1 -1
  302. package/core/dist/runtime-v2/internalization/index.js +0 -8
  303. package/core/dist/runtime-v2/internalization/index.js.map +1 -1
  304. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts +15 -0
  305. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.d.ts.map +1 -0
  306. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js +179 -0
  307. package/core/dist/runtime-v2/pain-gate/__tests__/pain-diagnostic-gate-policy.test.js.map +1 -0
  308. package/core/dist/runtime-v2/pain-gate/index.d.ts +10 -0
  309. package/core/dist/runtime-v2/pain-gate/index.d.ts.map +1 -0
  310. package/core/dist/runtime-v2/pain-gate/index.js +9 -0
  311. package/core/dist/runtime-v2/pain-gate/index.js.map +1 -0
  312. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts +121 -0
  313. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.d.ts.map +1 -0
  314. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js +157 -0
  315. package/core/dist/runtime-v2/pain-gate/pain-diagnostic-gate-policy.js.map +1 -0
  316. package/core/dist/runtime-v2/pain-signal-bridge.d.ts.map +1 -1
  317. package/core/dist/runtime-v2/pain-signal-bridge.js +14 -88
  318. package/core/dist/runtime-v2/pain-signal-bridge.js.map +1 -1
  319. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  320. package/core/dist/runtime-v2/pain-signal-observability.js +272 -61
  321. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  322. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +12 -0
  323. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  324. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +1 -1
  325. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  326. package/core/dist/runtime-v2/pain-to-principle-service.d.ts +6 -0
  327. package/core/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  328. package/core/dist/runtime-v2/pain-to-principle-service.js +2 -0
  329. package/core/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  330. package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -1
  331. package/core/dist/runtime-v2/proven-channel-baseline.js +1 -1
  332. package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
  333. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts +2 -0
  334. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts.map +1 -0
  335. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js +55 -0
  336. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js.map +1 -0
  337. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.d.ts.map +1 -1
  338. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js +6 -0
  339. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js.map +1 -1
  340. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts +2 -0
  341. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts.map +1 -0
  342. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js +272 -0
  343. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js.map +1 -0
  344. package/core/dist/runtime-v2/store/intent/index.d.ts +6 -0
  345. package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
  346. package/core/dist/runtime-v2/store/intent/index.js +5 -0
  347. package/core/dist/runtime-v2/store/intent/index.js.map +1 -0
  348. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts +51 -0
  349. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts.map +1 -0
  350. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js +306 -0
  351. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js.map +1 -0
  352. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js +14 -3
  353. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js.map +1 -1
  354. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts +2 -0
  355. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts.map +1 -0
  356. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +72 -0
  357. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -0
  358. package/core/dist/runtime-v2/store/sqlite-connection.d.ts +27 -0
  359. package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  360. package/core/dist/runtime-v2/store/sqlite-connection.js +124 -12
  361. package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  362. package/core/dist/runtime-v2/types/event-payload.d.ts +1 -20
  363. package/core/dist/runtime-v2/types/event-payload.d.ts.map +1 -1
  364. package/core/dist/runtime-v2/types/event-payload.js +0 -12
  365. package/core/dist/runtime-v2/types/event-payload.js.map +1 -1
  366. package/core/dist/runtime-v2/types/event-types.d.ts +5 -61
  367. package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
  368. package/core/dist/runtime-v2/types/event-types.js +2 -36
  369. package/core/dist/runtime-v2/types/event-types.js.map +1 -1
  370. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts +63 -0
  371. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts.map +1 -1
  372. package/core/dist/runtime-v2/types/evidence-chain-contract.js +234 -9
  373. package/core/dist/runtime-v2/types/evidence-chain-contract.js.map +1 -1
  374. package/core/dist/runtime-v2/types/index.d.ts +5 -5
  375. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  376. package/core/dist/runtime-v2/types/index.js +7 -3
  377. package/core/dist/runtime-v2/types/index.js.map +1 -1
  378. package/core/dist/runtime-v2/types/ledger-store.d.ts +30 -30
  379. package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -1
  380. package/core/dist/runtime-v2/types/ledger-store.js +10 -5
  381. package/core/dist/runtime-v2/types/ledger-store.js.map +1 -1
  382. package/core/dist/runtime-v2/types/pain-signal.d.ts +2 -2
  383. package/core/dist/runtime-v2/types/pain-signal.js +2 -2
  384. package/core/dist/workflow-funnel-loader.d.ts +2 -2
  385. package/core/dist/workflow-funnel-loader.d.ts.map +1 -1
  386. package/dist/installer.d.ts.map +1 -1
  387. package/dist/installer.js +16 -0
  388. package/dist/installer.js.map +1 -1
  389. package/dist/mvp-config.d.ts +0 -10
  390. package/dist/mvp-config.d.ts.map +1 -1
  391. package/dist/mvp-config.js +0 -65
  392. package/dist/mvp-config.js.map +1 -1
  393. package/package.json +1 -1
  394. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts +9 -0
  395. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +1 -0
  396. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js +166 -0
  397. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -0
  398. package/pd-cli/dist/commands/intent.d.ts +59 -0
  399. package/pd-cli/dist/commands/intent.d.ts.map +1 -0
  400. package/pd-cli/dist/commands/intent.js +350 -0
  401. package/pd-cli/dist/commands/intent.js.map +1 -0
  402. package/pd-cli/dist/commands/mvp-smoke.js +1 -1
  403. package/pd-cli/dist/commands/mvp-smoke.js.map +1 -1
  404. package/pd-cli/dist/commands/rulecode.js +1 -1
  405. package/pd-cli/dist/commands/rulecode.js.map +1 -1
  406. package/pd-cli/dist/commands/runtime-canary.d.ts.map +1 -1
  407. package/pd-cli/dist/commands/runtime-canary.js +10 -11
  408. package/pd-cli/dist/commands/runtime-canary.js.map +1 -1
  409. package/pd-cli/dist/commands/runtime-init.d.ts +43 -0
  410. package/pd-cli/dist/commands/runtime-init.d.ts.map +1 -0
  411. package/pd-cli/dist/commands/runtime-init.js +264 -0
  412. package/pd-cli/dist/commands/runtime-init.js.map +1 -0
  413. package/pd-cli/dist/commands/runtime-internalization-queue.d.ts.map +1 -1
  414. package/pd-cli/dist/commands/runtime-internalization-queue.js +13 -16
  415. package/pd-cli/dist/commands/runtime-internalization-queue.js.map +1 -1
  416. package/pd-cli/dist/commands/runtime-internalization-run-once.d.ts.map +1 -1
  417. package/pd-cli/dist/commands/runtime-internalization-run-once.js +3 -0
  418. package/pd-cli/dist/commands/runtime-internalization-run-once.js.map +1 -1
  419. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.d.ts.map +1 -1
  420. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js +61 -7
  421. package/pd-cli/dist/commands/runtime-internalization-run-rulehost.js.map +1 -1
  422. package/pd-cli/dist/commands/runtime.js +1 -1
  423. package/pd-cli/dist/commands/runtime.js.map +1 -1
  424. package/pd-cli/dist/index.js +92 -34
  425. package/pd-cli/dist/index.js.map +1 -1
  426. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.d.ts +2 -0
  427. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.d.ts.map +1 -0
  428. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.js +314 -0
  429. package/pd-cli/dist/services/__tests__/rulehost-readiness.test.js.map +1 -0
  430. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js +20 -12
  431. package/pd-cli/dist/services/__tests__/runtime-adapter-resolver.test.js.map +1 -1
  432. package/pd-cli/dist/services/demo-story-a-runner.d.ts.map +1 -1
  433. package/pd-cli/dist/services/demo-story-a-runner.js +6 -0
  434. package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
  435. package/pd-cli/dist/services/rulehost-readiness.d.ts +62 -0
  436. package/pd-cli/dist/services/rulehost-readiness.d.ts.map +1 -0
  437. package/pd-cli/dist/services/rulehost-readiness.js +214 -0
  438. package/pd-cli/dist/services/rulehost-readiness.js.map +1 -0
  439. package/pd-cli/dist/services/runtime-adapter-resolver.d.ts +1 -1
  440. package/pd-cli/dist/services/runtime-adapter-resolver.js +3 -3
  441. package/pd-cli/dist/services/runtime-adapter-resolver.js.map +1 -1
  442. package/pd-cli/package.json +1 -0
  443. package/plugin/dist/commands/evolution-status.js +0 -2
  444. package/plugin/dist/commands/pain.js +2 -0
  445. package/plugin/dist/core/control-ui-db.d.ts +11 -0
  446. package/plugin/dist/core/control-ui-db.js +40 -16
  447. package/plugin/dist/core/detection-funnel.d.ts +25 -11
  448. package/plugin/dist/core/detection-funnel.js +32 -80
  449. package/plugin/dist/core/event-log.d.ts +1 -3
  450. package/plugin/dist/core/event-log.js +5 -21
  451. package/plugin/dist/core/evolution-reducer.d.ts +0 -8
  452. package/plugin/dist/core/evolution-reducer.js +9 -19
  453. package/plugin/dist/core/intent-doc-reader-adapter.d.ts +28 -0
  454. package/plugin/dist/core/intent-doc-reader-adapter.js +56 -0
  455. package/plugin/dist/core/intent-doc-reader.d.ts +80 -0
  456. package/plugin/dist/core/intent-doc-reader.js +189 -0
  457. package/plugin/dist/core/pain-diagnostic-gate.d.ts +37 -28
  458. package/plugin/dist/core/pain-diagnostic-gate.js +53 -89
  459. package/plugin/dist/core/pain.d.ts +0 -63
  460. package/plugin/dist/core/pain.js +0 -167
  461. package/plugin/dist/core/paths.d.ts +0 -1
  462. package/plugin/dist/core/paths.js +2 -1
  463. package/plugin/dist/core/principle-tree-ledger.d.ts +27 -79
  464. package/plugin/dist/core/principle-tree-ledger.js +39 -524
  465. package/plugin/dist/core/reflection/reflection-context.d.ts +2 -2
  466. package/plugin/dist/core/schema/migrations/001-init-trajectory.js +3 -6
  467. package/plugin/dist/core/schema/schema-definitions.js +4 -9
  468. package/plugin/dist/core/trajectory.d.ts +16 -16
  469. package/plugin/dist/core/trajectory.js +338 -311
  470. package/plugin/dist/core/workspace-context.d.ts +2 -3
  471. package/plugin/dist/hooks/after-tool-call-helpers.d.ts +4 -1
  472. package/plugin/dist/hooks/after-tool-call-helpers.js +13 -17
  473. package/plugin/dist/hooks/gate-block-helper.js +57 -17
  474. package/plugin/dist/hooks/lifecycle.js +3 -6
  475. package/plugin/dist/hooks/llm.js +66 -26
  476. package/plugin/dist/hooks/pain.d.ts +3 -1
  477. package/plugin/dist/hooks/pain.js +124 -49
  478. package/plugin/dist/hooks/prompt-helpers.d.ts +105 -0
  479. package/plugin/dist/hooks/prompt-helpers.js +288 -0
  480. package/plugin/dist/hooks/prompt-types.d.ts +74 -0
  481. package/plugin/dist/hooks/prompt-types.js +12 -0
  482. package/plugin/dist/hooks/prompt.d.ts +7 -38
  483. package/plugin/dist/hooks/prompt.js +433 -338
  484. package/plugin/dist/hooks/raw-observation-adapter.d.ts +9 -50
  485. package/plugin/dist/hooks/raw-observation-adapter.js +9 -164
  486. package/plugin/dist/hooks/raw-observation-types.d.ts +6 -57
  487. package/plugin/dist/hooks/raw-observation-types.js +5 -9
  488. package/plugin/dist/hooks/triage-adapter.js +6 -26
  489. package/plugin/dist/hooks/trigger-cooldown-tracker.d.ts +12 -0
  490. package/plugin/dist/hooks/trigger-cooldown-tracker.js +25 -0
  491. package/plugin/dist/index.d.ts +3 -1
  492. package/plugin/dist/index.js +9 -5
  493. package/plugin/dist/service/evolution-worker.js +6 -64
  494. package/plugin/dist/service/runtime-summary-service.d.ts +0 -2
  495. package/plugin/dist/service/runtime-summary-service.js +1 -5
  496. package/plugin/dist/service/subagent-workflow/workflow-store.d.ts +14 -0
  497. package/plugin/dist/service/subagent-workflow/workflow-store.js +91 -2
  498. package/plugin/dist/types/event-types.d.ts +1 -1
  499. package/plugin/package.json +6 -3
  500. package/plugin/scripts/acceptance-test.mjs +3 -3
  501. package/plugin/scripts/sync-plugin.mjs +33 -22
  502. package/plugin/templates/langs/en/skills/pd-cli-operator/SKILL.md +20 -11
  503. package/plugin/templates/langs/en/skills/pd-runtime-v2/SKILL.md +10 -0
  504. package/plugin/templates/langs/zh/skills/pd-cli-operator/SKILL.md +20 -11
  505. package/plugin/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +10 -0
  506. package/console/dist/server/config/feature-flags.d.ts +0 -25
  507. package/console/dist/server/config/feature-flags.js +0 -101
  508. package/pd-cli/dist/commands/central-sync.d.ts +0 -10
  509. package/pd-cli/dist/commands/central-sync.d.ts.map +0 -1
  510. package/pd-cli/dist/commands/central-sync.js +0 -32
  511. package/pd-cli/dist/commands/central-sync.js.map +0 -1
  512. package/pd-cli/dist/services/feature-flag-loader.d.ts +0 -6
  513. package/pd-cli/dist/services/feature-flag-loader.d.ts.map +0 -1
  514. package/pd-cli/dist/services/feature-flag-loader.js +0 -53
  515. package/pd-cli/dist/services/feature-flag-loader.js.map +0 -1
  516. package/plugin/dist/core/observability.d.ts +0 -40
  517. package/plugin/dist/core/observability.js +0 -164
  518. package/plugin/dist/core/principle-tree-ledger-adapter.d.ts +0 -32
  519. package/plugin/dist/core/principle-tree-ledger-adapter.js +0 -125
  520. package/plugin/dist/hooks/subagent.d.ts +0 -9
  521. package/plugin/dist/hooks/subagent.js +0 -122
  522. package/plugin/dist/service/central-database.d.ts +0 -138
  523. package/plugin/dist/service/central-database.js +0 -731
  524. package/plugin/dist/service/central-sync-service.d.ts +0 -8
  525. package/plugin/dist/service/central-sync-service.js +0 -71
  526. package/plugin/scripts/validate-live-path.ts +0 -480
@@ -19,6 +19,332 @@ const DEFAULT_INLINE_THRESHOLD = 16 * 1024;
19
19
  const DEFAULT_BUSY_TIMEOUT_MS = 5000;
20
20
  const DEFAULT_ORPHAN_BLOB_GRACE_DAYS = 7;
21
21
  const SCHEMA_VERSION = 1;
22
+ /**
23
+ * Type guard: narrows `object` to `{ name: unknown }` without `as` casts.
24
+ * Used for PRAGMA table_info rows (rc-2-no-as-bypass).
25
+ */
26
+ function hasNameField(row) {
27
+ return Object.hasOwn(row, 'name');
28
+ }
29
+ /**
30
+ * Apply the full trajectory.db schema (tables + indexes + views + migrations) to an open
31
+ * Database handle. Used by TrajectoryDatabase.initSchema() and exported via
32
+ * initTrajectorySchema() for external callers (e.g. `pd runtime init`).
33
+ *
34
+ * DDL is the single source of truth for trajectory.db schema. pain-signal-observability.ts
35
+ * in principles-core also duplicates a subset of this DDL (acknowledged duplication); when
36
+ * updating this function, audit ensureTrajectorySchema() in core for parallel updates.
37
+ *
38
+ * Idempotent: all CREATE statements use IF NOT EXISTS; ALTER columns use try/catch on
39
+ * "duplicate column name" to skip existing columns.
40
+ */
41
+ function applyTrajectorySchema(db) {
42
+ const warnings = [];
43
+ const tables = [
44
+ 'schema_version', 'ingest_checkpoint', 'sessions', 'assistant_turns',
45
+ 'user_turns', 'tool_calls', 'pain_events', 'gate_blocks', 'trust_changes',
46
+ 'principle_events', 'task_outcomes', 'correction_samples', 'sample_reviews',
47
+ 'exports_audit', 'evolution_tasks', 'evolution_events',
48
+ ];
49
+ db.exec(`
50
+ CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL);
51
+ CREATE TABLE IF NOT EXISTS ingest_checkpoint (
52
+ source_key TEXT PRIMARY KEY,
53
+ imported_at TEXT NOT NULL
54
+ );
55
+ CREATE TABLE IF NOT EXISTS sessions (
56
+ session_id TEXT PRIMARY KEY,
57
+ started_at TEXT NOT NULL,
58
+ updated_at TEXT NOT NULL
59
+ );
60
+ CREATE TABLE IF NOT EXISTS assistant_turns (
61
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
62
+ session_id TEXT NOT NULL,
63
+ run_id TEXT NOT NULL,
64
+ provider TEXT NOT NULL,
65
+ model TEXT NOT NULL,
66
+ raw_text TEXT,
67
+ sanitized_text TEXT NOT NULL,
68
+ usage_json TEXT NOT NULL,
69
+ empathy_signal_json TEXT NOT NULL,
70
+ blob_ref TEXT,
71
+ raw_excerpt TEXT,
72
+ created_at TEXT NOT NULL
73
+ );
74
+ CREATE TABLE IF NOT EXISTS user_turns (
75
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
76
+ session_id TEXT NOT NULL,
77
+ turn_index INTEGER NOT NULL,
78
+ raw_text TEXT,
79
+ blob_ref TEXT,
80
+ raw_excerpt TEXT,
81
+ correction_detected INTEGER NOT NULL DEFAULT 0,
82
+ correction_cue TEXT,
83
+ references_assistant_turn_id INTEGER,
84
+ created_at TEXT NOT NULL
85
+ );
86
+ CREATE TABLE IF NOT EXISTS tool_calls (
87
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
88
+ session_id TEXT NOT NULL,
89
+ tool_name TEXT NOT NULL,
90
+ outcome TEXT NOT NULL,
91
+ duration_ms INTEGER,
92
+ exit_code INTEGER,
93
+ error_type TEXT,
94
+ error_message TEXT,
95
+ gfi_before REAL,
96
+ gfi_after REAL,
97
+ params_json TEXT NOT NULL,
98
+ created_at TEXT NOT NULL
99
+ );
100
+ CREATE TABLE IF NOT EXISTS pain_events (
101
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
102
+ session_id TEXT NOT NULL,
103
+ source TEXT NOT NULL,
104
+ score REAL NOT NULL,
105
+ reason TEXT,
106
+ severity TEXT,
107
+ origin TEXT,
108
+ confidence REAL,
109
+ text TEXT,
110
+ created_at TEXT NOT NULL
111
+ );
112
+ CREATE TABLE IF NOT EXISTS gate_blocks (
113
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
114
+ session_id TEXT,
115
+ tool_name TEXT NOT NULL,
116
+ file_path TEXT,
117
+ reason TEXT NOT NULL,
118
+ plan_status TEXT,
119
+ created_at TEXT NOT NULL
120
+ );
121
+ CREATE TABLE IF NOT EXISTS trust_changes (
122
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
123
+ session_id TEXT,
124
+ previous_score REAL NOT NULL,
125
+ new_score REAL NOT NULL,
126
+ delta REAL NOT NULL,
127
+ reason TEXT NOT NULL,
128
+ created_at TEXT NOT NULL
129
+ );
130
+ CREATE TABLE IF NOT EXISTS principle_events (
131
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
132
+ principle_id TEXT,
133
+ event_type TEXT NOT NULL,
134
+ payload_json TEXT NOT NULL,
135
+ created_at TEXT NOT NULL
136
+ );
137
+ CREATE TABLE IF NOT EXISTS task_outcomes (
138
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
139
+ session_id TEXT NOT NULL,
140
+ task_id TEXT,
141
+ outcome TEXT NOT NULL,
142
+ summary TEXT,
143
+ principle_ids_json TEXT NOT NULL,
144
+ created_at TEXT NOT NULL
145
+ );
146
+ CREATE TABLE IF NOT EXISTS correction_samples (
147
+ sample_id TEXT PRIMARY KEY,
148
+ session_id TEXT NOT NULL,
149
+ bad_assistant_turn_id INTEGER NOT NULL,
150
+ user_correction_turn_id INTEGER NOT NULL,
151
+ recovery_tool_span_json TEXT NOT NULL,
152
+ diff_excerpt TEXT NOT NULL,
153
+ principle_ids_json TEXT NOT NULL,
154
+ quality_score REAL NOT NULL,
155
+ review_status TEXT NOT NULL,
156
+ export_mode TEXT NOT NULL,
157
+ created_at TEXT NOT NULL,
158
+ updated_at TEXT NOT NULL
159
+ );
160
+ CREATE TABLE IF NOT EXISTS sample_reviews (
161
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
162
+ sample_id TEXT NOT NULL,
163
+ review_status TEXT NOT NULL,
164
+ note TEXT,
165
+ created_at TEXT NOT NULL
166
+ );
167
+ CREATE TABLE IF NOT EXISTS exports_audit (
168
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
169
+ export_kind TEXT NOT NULL,
170
+ mode TEXT NOT NULL,
171
+ approved_only INTEGER NOT NULL,
172
+ file_path TEXT NOT NULL,
173
+ row_count INTEGER NOT NULL,
174
+ created_at TEXT NOT NULL
175
+ );
176
+ CREATE TABLE IF NOT EXISTS evolution_tasks (
177
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
178
+ task_id TEXT UNIQUE NOT NULL,
179
+ trace_id TEXT NOT NULL,
180
+ source TEXT NOT NULL,
181
+ reason TEXT,
182
+ score INTEGER DEFAULT 0,
183
+ status TEXT DEFAULT 'pending',
184
+ enqueued_at TEXT,
185
+ started_at TEXT,
186
+ completed_at TEXT,
187
+ resolution TEXT,
188
+ created_at TEXT NOT NULL,
189
+ updated_at TEXT NOT NULL
190
+ );
191
+ CREATE TABLE IF NOT EXISTS evolution_events (
192
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
193
+ trace_id TEXT NOT NULL,
194
+ task_id TEXT,
195
+ stage TEXT NOT NULL,
196
+ level TEXT DEFAULT 'info',
197
+ message TEXT NOT NULL,
198
+ summary TEXT,
199
+ metadata_json TEXT,
200
+ created_at TEXT NOT NULL
201
+ );
202
+ `);
203
+ // Migration: Add text column to pain_events if it doesn't exist (MEM-01)
204
+ // SQLite doesn't support IF NOT EXISTS for ADD COLUMN, so we use try/catch
205
+ try {
206
+ db.exec(`ALTER TABLE pain_events ADD COLUMN text TEXT`);
207
+ }
208
+ catch (err) {
209
+ const message = err instanceof Error ? err.message : String(err);
210
+ if (!message.includes('duplicate column name') && !message.includes('no column named')) {
211
+ // Re-throw unexpected errors — silently swallowing migration failures is dangerous
212
+ throw err;
213
+ }
214
+ }
215
+ // PRI-406: Add canonical_pain_id and runtime_task_id columns to pain_events
216
+ for (const col of [
217
+ { name: 'canonical_pain_id', type: 'TEXT' },
218
+ { name: 'runtime_task_id', type: 'TEXT' },
219
+ ]) {
220
+ try {
221
+ db.exec(`ALTER TABLE pain_events ADD COLUMN ${col.name} ${col.type}`);
222
+ }
223
+ catch (err) {
224
+ const message = err instanceof Error ? err.message : String(err);
225
+ if (!message.includes('duplicate column name') && !message.includes('no column named')) {
226
+ throw err;
227
+ }
228
+ }
229
+ }
230
+ // Trajectory enhancement: add stop_reason, thinking_blocks_count, result_preview
231
+ const trajectoryEnhancementColumns = [
232
+ { table: 'assistant_turns', name: 'stop_reason', type: 'TEXT' },
233
+ { table: 'assistant_turns', name: 'thinking_blocks_count', type: 'INTEGER' },
234
+ { table: 'tool_calls', name: 'result_preview', type: 'TEXT' },
235
+ ];
236
+ for (const col of trajectoryEnhancementColumns) {
237
+ try {
238
+ db.exec(`ALTER TABLE ${col.table} ADD COLUMN ${col.name} ${col.type}`);
239
+ }
240
+ catch (err) {
241
+ const message = err instanceof Error ? err.message : String(err);
242
+ if (!message.includes('duplicate column name') && !message.includes('no column named')) {
243
+ throw err;
244
+ }
245
+ }
246
+ }
247
+ // PRI-406: Partial unique index on canonical_pain_id (non-null only) for dedup
248
+ db.exec(`
249
+ CREATE UNIQUE INDEX IF NOT EXISTS idx_pain_events_canonical_pain_id
250
+ ON pain_events(canonical_pain_id)
251
+ WHERE canonical_pain_id IS NOT NULL
252
+ `);
253
+ // V2 migration: Add V2 columns to evolution_tasks if they don't exist
254
+ const v2Columns = [
255
+ { name: 'task_kind', type: 'TEXT' },
256
+ { name: 'priority', type: 'TEXT' },
257
+ { name: 'retry_count', type: 'INTEGER' },
258
+ { name: 'max_retries', type: 'INTEGER' },
259
+ { name: 'last_error', type: 'TEXT' },
260
+ { name: 'result_ref', type: 'TEXT' },
261
+ ];
262
+ for (const col of v2Columns) {
263
+ const rows = db.prepare(`PRAGMA table_info(evolution_tasks)`).all();
264
+ const exists = rows.some((row) => {
265
+ if (typeof row !== 'object' || row === null)
266
+ return false;
267
+ // Use type guard predicate to narrow without `as` (rc-2-no-as-bypass)
268
+ return hasNameField(row) && row.name === col.name;
269
+ });
270
+ if (!exists) {
271
+ db.exec(`ALTER TABLE evolution_tasks ADD COLUMN ${col.name} ${col.type}`);
272
+ }
273
+ }
274
+ db.exec(`
275
+ CREATE VIEW IF NOT EXISTS v_error_clusters AS
276
+ SELECT tool_name, COALESCE(error_type, 'unknown') AS error_type, COUNT(*) AS occurrences
277
+ FROM tool_calls
278
+ WHERE outcome = 'failure'
279
+ GROUP BY tool_name, COALESCE(error_type, 'unknown')
280
+ ORDER BY occurrences DESC;
281
+ CREATE VIEW IF NOT EXISTS v_principle_effectiveness AS
282
+ SELECT event_type, COUNT(*) AS total
283
+ FROM principle_events
284
+ GROUP BY event_type
285
+ ORDER BY total DESC;
286
+ CREATE VIEW IF NOT EXISTS v_sample_queue AS
287
+ SELECT review_status, COUNT(*) AS total
288
+ FROM correction_samples
289
+ GROUP BY review_status;
290
+ CREATE INDEX IF NOT EXISTS idx_assistant_turns_session_id ON assistant_turns(session_id);
291
+ CREATE INDEX IF NOT EXISTS idx_assistant_turns_created_at ON assistant_turns(created_at);
292
+ CREATE INDEX IF NOT EXISTS idx_assistant_turns_provider_model ON assistant_turns(provider, model);
293
+ CREATE INDEX IF NOT EXISTS idx_user_turns_session_id ON user_turns(session_id);
294
+ CREATE INDEX IF NOT EXISTS idx_tool_calls_session_id ON tool_calls(session_id);
295
+ CREATE INDEX IF NOT EXISTS idx_tool_calls_created_at ON tool_calls(created_at);
296
+ CREATE INDEX IF NOT EXISTS idx_pain_events_session_id ON pain_events(session_id);
297
+ CREATE INDEX IF NOT EXISTS idx_correction_samples_review_status ON correction_samples(review_status);
298
+ CREATE INDEX IF NOT EXISTS idx_evolution_tasks_trace_id ON evolution_tasks(trace_id);
299
+ CREATE INDEX IF NOT EXISTS idx_evolution_tasks_status ON evolution_tasks(status);
300
+ CREATE INDEX IF NOT EXISTS idx_evolution_tasks_created_at ON evolution_tasks(created_at);
301
+ CREATE INDEX IF NOT EXISTS idx_evolution_events_trace_id ON evolution_events(trace_id);
302
+ CREATE INDEX IF NOT EXISTS idx_evolution_events_created_at ON evolution_events(created_at);
303
+ `);
304
+ return { tables, warnings };
305
+ }
306
+ /**
307
+ * Initialize trajectory.db schema at the given workspace directory.
308
+ *
309
+ * Opens trajectory.db in write mode, applies the full schema (tables + indexes + views +
310
+ * migrations), then closes the DB. Does NOT run importLegacyArtifacts() or
311
+ * pruneUnreferencedBlobs() — those are runtime side-effects of TrajectoryDatabase
312
+ * construction and are not needed for pure initialization.
313
+ *
314
+ * Idempotent: safe to call on an existing DB; all CREATE statements use IF NOT EXISTS.
315
+ *
316
+ * @returns list of created/verified table names and any warnings
317
+ */
318
+ export function initTrajectorySchema(workspaceDir) {
319
+ const resolvedDir = path.resolve(workspaceDir);
320
+ const stateDir = resolvePdPath(resolvedDir, 'STATE_DIR');
321
+ const blobDir = resolvePdPath(resolvedDir, 'TRAJECTORY_BLOBS_DIR');
322
+ const exportDir = resolvePdPath(resolvedDir, 'EXPORTS_DIR');
323
+ const dbPath = resolvePdPath(resolvedDir, 'TRAJECTORY_DB');
324
+ fs.mkdirSync(stateDir, { recursive: true });
325
+ fs.mkdirSync(blobDir, { recursive: true });
326
+ fs.mkdirSync(exportDir, { recursive: true });
327
+ const db = new Database(dbPath);
328
+ try {
329
+ db.pragma('journal_mode = WAL');
330
+ db.pragma('foreign_keys = ON');
331
+ db.pragma('synchronous = NORMAL');
332
+ db.pragma(`busy_timeout = ${DEFAULT_BUSY_TIMEOUT_MS}`);
333
+ const result = applyTrajectorySchema(db);
334
+ // Record schema version (same logic as TrajectoryDatabase.initSchema)
335
+ const row = db.prepare('SELECT version FROM schema_version LIMIT 1').get();
336
+ if (!row) {
337
+ db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(SCHEMA_VERSION);
338
+ }
339
+ else if (row.version !== SCHEMA_VERSION) {
340
+ db.prepare('UPDATE schema_version SET version = ?').run(SCHEMA_VERSION);
341
+ }
342
+ return result;
343
+ }
344
+ finally {
345
+ db.close();
346
+ }
347
+ }
22
348
  function nowIso() {
23
349
  return new Date().toISOString();
24
350
  }
@@ -170,60 +496,14 @@ export class TrajectoryDatabase {
170
496
  }
171
497
  }
172
498
  });
173
- // FTS indexing is best-effort run outside the transaction so it cannot
174
- // roll back the committed pain event row (MEM-03, MEM-04).
175
- if (input.text && insertedId > 0) {
176
- try {
177
- this.db.prepare(`
178
- INSERT INTO pain_events_fts (text, pain_event_id) VALUES (?, ?)
179
- `).run(input.text, insertedId);
180
- }
181
- catch (err) {
182
- // Non-fatal: FTS index is for search convenience, not correctness.
183
- // Log but do not re-throw — the pain event itself is already committed.
184
- console.warn(`[trajectory] FTS index insert failed for pain_event ${insertedId}: ${String(err)}`);
185
- }
186
- }
499
+ // FTS5 index write removed (PRI-451 Wave 1): the only reader (searchPainEvents)
500
+ // was dead code removed in Wave 1.1. The pain event row itself is committed
501
+ // above; nothing reads the FTS index anymore.
187
502
  return insertedId;
188
503
  }
189
- /**
190
- * Search pain_events using FTS5 full-text search (MEM-04).
191
- * Returns pain events matching the query, ordered by relevance.
192
- */
193
- searchPainEvents(query, limit = 10) {
194
- if (!query || query.trim().length === 0) {
195
- return [];
196
- }
197
- // Escape FTS5 special characters and format query for porter tokenizer
198
- const ftsQuery = query.trim().split(/\s+/).map(term => `"${term.replace(/"/g, '""')}"`).join(' ');
199
- try {
200
- const results = this.db.prepare(`
201
- SELECT pe.*
202
- FROM pain_events_fts pf
203
- JOIN pain_events pe ON pe.id = pf.pain_event_id
204
- WHERE pain_events_fts MATCH ?
205
- ORDER BY bm25(pain_events_fts) DESC
206
- LIMIT ?
207
- `).all(ftsQuery, limit);
208
- return results.map(row => ({
209
- id: row.id,
210
- sessionId: row.session_id,
211
- source: row.source,
212
- score: row.score,
213
- reason: row.reason,
214
- severity: row.severity,
215
- origin: row.origin,
216
- confidence: row.confidence,
217
- text: row.text,
218
- createdAt: row.created_at,
219
- }));
220
- }
221
- catch (err) {
222
- // If FTS5 query fails (e.g., syntax error), return empty results
223
- console.warn(`[PD:TrajectoryDatabase] FTS5 search failed: ${String(err)}`);
224
- return [];
225
- }
226
- }
504
+ // searchPainEvents removed (PRI-451 Wave 1): dead code. Its only caller was
505
+ // processDetectionQueue (also removed). The FTS5 index write it read is
506
+ // removed in Wave 1.2.
227
507
  recordGateBlock(input) {
228
508
  this.withWrite(() => {
229
509
  this.db.prepare(`
@@ -908,266 +1188,13 @@ export class TrajectoryDatabase {
908
1188
  return this.pruneUnreferencedBlobs();
909
1189
  }
910
1190
  initSchema() {
911
- this.db.exec(`
912
- CREATE TABLE IF NOT EXISTS schema_version (version INTEGER NOT NULL);
913
- CREATE TABLE IF NOT EXISTS ingest_checkpoint (
914
- source_key TEXT PRIMARY KEY,
915
- imported_at TEXT NOT NULL
916
- );
917
- CREATE TABLE IF NOT EXISTS sessions (
918
- session_id TEXT PRIMARY KEY,
919
- started_at TEXT NOT NULL,
920
- updated_at TEXT NOT NULL
921
- );
922
- CREATE TABLE IF NOT EXISTS assistant_turns (
923
- id INTEGER PRIMARY KEY AUTOINCREMENT,
924
- session_id TEXT NOT NULL,
925
- run_id TEXT NOT NULL,
926
- provider TEXT NOT NULL,
927
- model TEXT NOT NULL,
928
- raw_text TEXT,
929
- sanitized_text TEXT NOT NULL,
930
- usage_json TEXT NOT NULL,
931
- empathy_signal_json TEXT NOT NULL,
932
- blob_ref TEXT,
933
- raw_excerpt TEXT,
934
- created_at TEXT NOT NULL
935
- );
936
- CREATE TABLE IF NOT EXISTS user_turns (
937
- id INTEGER PRIMARY KEY AUTOINCREMENT,
938
- session_id TEXT NOT NULL,
939
- turn_index INTEGER NOT NULL,
940
- raw_text TEXT,
941
- blob_ref TEXT,
942
- raw_excerpt TEXT,
943
- correction_detected INTEGER NOT NULL DEFAULT 0,
944
- correction_cue TEXT,
945
- references_assistant_turn_id INTEGER,
946
- created_at TEXT NOT NULL
947
- );
948
- CREATE TABLE IF NOT EXISTS tool_calls (
949
- id INTEGER PRIMARY KEY AUTOINCREMENT,
950
- session_id TEXT NOT NULL,
951
- tool_name TEXT NOT NULL,
952
- outcome TEXT NOT NULL,
953
- duration_ms INTEGER,
954
- exit_code INTEGER,
955
- error_type TEXT,
956
- error_message TEXT,
957
- gfi_before REAL,
958
- gfi_after REAL,
959
- params_json TEXT NOT NULL,
960
- created_at TEXT NOT NULL
961
- );
962
- CREATE TABLE IF NOT EXISTS pain_events (
963
- id INTEGER PRIMARY KEY AUTOINCREMENT,
964
- session_id TEXT NOT NULL,
965
- source TEXT NOT NULL,
966
- score REAL NOT NULL,
967
- reason TEXT,
968
- severity TEXT,
969
- origin TEXT,
970
- confidence REAL,
971
- text TEXT,
972
- created_at TEXT NOT NULL
973
- );
974
- CREATE TABLE IF NOT EXISTS gate_blocks (
975
- id INTEGER PRIMARY KEY AUTOINCREMENT,
976
- session_id TEXT,
977
- tool_name TEXT NOT NULL,
978
- file_path TEXT,
979
- reason TEXT NOT NULL,
980
- plan_status TEXT,
981
- created_at TEXT NOT NULL
982
- );
983
- CREATE TABLE IF NOT EXISTS trust_changes (
984
- id INTEGER PRIMARY KEY AUTOINCREMENT,
985
- session_id TEXT,
986
- previous_score REAL NOT NULL,
987
- new_score REAL NOT NULL,
988
- delta REAL NOT NULL,
989
- reason TEXT NOT NULL,
990
- created_at TEXT NOT NULL
991
- );
992
- CREATE TABLE IF NOT EXISTS principle_events (
993
- id INTEGER PRIMARY KEY AUTOINCREMENT,
994
- principle_id TEXT,
995
- event_type TEXT NOT NULL,
996
- payload_json TEXT NOT NULL,
997
- created_at TEXT NOT NULL
998
- );
999
- CREATE TABLE IF NOT EXISTS task_outcomes (
1000
- id INTEGER PRIMARY KEY AUTOINCREMENT,
1001
- session_id TEXT NOT NULL,
1002
- task_id TEXT,
1003
- outcome TEXT NOT NULL,
1004
- summary TEXT,
1005
- principle_ids_json TEXT NOT NULL,
1006
- created_at TEXT NOT NULL
1007
- );
1008
- CREATE TABLE IF NOT EXISTS correction_samples (
1009
- sample_id TEXT PRIMARY KEY,
1010
- session_id TEXT NOT NULL,
1011
- bad_assistant_turn_id INTEGER NOT NULL,
1012
- user_correction_turn_id INTEGER NOT NULL,
1013
- recovery_tool_span_json TEXT NOT NULL,
1014
- diff_excerpt TEXT NOT NULL,
1015
- principle_ids_json TEXT NOT NULL,
1016
- quality_score REAL NOT NULL,
1017
- review_status TEXT NOT NULL,
1018
- export_mode TEXT NOT NULL,
1019
- created_at TEXT NOT NULL,
1020
- updated_at TEXT NOT NULL
1021
- );
1022
- CREATE TABLE IF NOT EXISTS sample_reviews (
1023
- id INTEGER PRIMARY KEY AUTOINCREMENT,
1024
- sample_id TEXT NOT NULL,
1025
- review_status TEXT NOT NULL,
1026
- note TEXT,
1027
- created_at TEXT NOT NULL
1028
- );
1029
- CREATE TABLE IF NOT EXISTS exports_audit (
1030
- id INTEGER PRIMARY KEY AUTOINCREMENT,
1031
- export_kind TEXT NOT NULL,
1032
- mode TEXT NOT NULL,
1033
- approved_only INTEGER NOT NULL,
1034
- file_path TEXT NOT NULL,
1035
- row_count INTEGER NOT NULL,
1036
- created_at TEXT NOT NULL
1037
- );
1038
- CREATE TABLE IF NOT EXISTS evolution_tasks (
1039
- id INTEGER PRIMARY KEY AUTOINCREMENT,
1040
- task_id TEXT UNIQUE NOT NULL,
1041
- trace_id TEXT NOT NULL,
1042
- source TEXT NOT NULL,
1043
- reason TEXT,
1044
- score INTEGER DEFAULT 0,
1045
- status TEXT DEFAULT 'pending',
1046
- enqueued_at TEXT,
1047
- started_at TEXT,
1048
- completed_at TEXT,
1049
- resolution TEXT,
1050
- created_at TEXT NOT NULL,
1051
- updated_at TEXT NOT NULL
1052
- );
1053
- CREATE TABLE IF NOT EXISTS evolution_events (
1054
- id INTEGER PRIMARY KEY AUTOINCREMENT,
1055
- trace_id TEXT NOT NULL,
1056
- task_id TEXT,
1057
- stage TEXT NOT NULL,
1058
- level TEXT DEFAULT 'info',
1059
- message TEXT NOT NULL,
1060
- summary TEXT,
1061
- metadata_json TEXT,
1062
- created_at TEXT NOT NULL
1063
- );
1064
- `);
1065
- // Migration: Add text column to pain_events if it doesn't exist (MEM-01)
1066
- // SQLite doesn't support IF NOT EXISTS for ADD COLUMN, so we use try/catch
1067
- try {
1068
- this.db.exec(`ALTER TABLE pain_events ADD COLUMN text TEXT`);
1069
- }
1070
- catch (err) {
1071
- const message = err instanceof Error ? err.message : String(err);
1072
- if (!message.includes('duplicate column name') && !message.includes('no column named')) {
1073
- // Re-throw unexpected errors — silently swallowing migration failures is dangerous
1074
- throw err;
1075
- }
1076
- }
1077
- // PRI-406: Add canonical_pain_id and runtime_task_id columns to pain_events
1078
- for (const col of [
1079
- { name: 'canonical_pain_id', type: 'TEXT' },
1080
- { name: 'runtime_task_id', type: 'TEXT' },
1081
- ]) {
1082
- try {
1083
- this.db.exec(`ALTER TABLE pain_events ADD COLUMN ${col.name} ${col.type}`);
1084
- }
1085
- catch (err) {
1086
- const message = err instanceof Error ? err.message : String(err);
1087
- if (!message.includes('duplicate column name') && !message.includes('no column named')) {
1088
- throw err;
1089
- }
1090
- }
1091
- }
1092
- // Trajectory enhancement: add stop_reason, thinking_blocks_count, result_preview
1093
- const trajectoryEnhancementColumns = [
1094
- { table: 'assistant_turns', name: 'stop_reason', type: 'TEXT' },
1095
- { table: 'assistant_turns', name: 'thinking_blocks_count', type: 'INTEGER' },
1096
- { table: 'tool_calls', name: 'result_preview', type: 'TEXT' },
1097
- ];
1098
- for (const col of trajectoryEnhancementColumns) {
1099
- try {
1100
- this.db.exec(`ALTER TABLE ${col.table} ADD COLUMN ${col.name} ${col.type}`);
1101
- }
1102
- catch (err) {
1103
- const message = err instanceof Error ? err.message : String(err);
1104
- if (!message.includes('duplicate column name') && !message.includes('no column named')) {
1105
- throw err;
1106
- }
1107
- }
1191
+ const result = applyTrajectorySchema(this.db);
1192
+ // Best-effort: surface any warnings from schema initialization (rc-9: no silent fallback).
1193
+ // Warnings include failed migrations or view creation issues; surfaced via console.info
1194
+ // because TrajectoryDatabase does not have a warnings buffer at this layer.
1195
+ for (const w of result.warnings) {
1196
+ console.info(`[PD:TrajectoryDatabase] schema init warning: ${w}`);
1108
1197
  }
1109
- // PRI-406: Partial unique index on canonical_pain_id (non-null only) for dedup
1110
- this.db.exec(`
1111
- CREATE UNIQUE INDEX IF NOT EXISTS idx_pain_events_canonical_pain_id
1112
- ON pain_events(canonical_pain_id)
1113
- WHERE canonical_pain_id IS NOT NULL
1114
- `);
1115
- // Create FTS5 virtual table for pain_events text search (MEM-04)
1116
- this.db.exec(`
1117
- CREATE VIRTUAL TABLE IF NOT EXISTS pain_events_fts USING fts5(
1118
- text,
1119
- pain_event_id UNINDEXED,
1120
- tokenize='porter unicode61'
1121
- )
1122
- `);
1123
- // V2 migration: Add V2 columns to evolution_tasks if they don't exist
1124
- // SQLite does not support IF NOT EXISTS for ADD COLUMN, so we must check manually
1125
- // before each ALTER to avoid "duplicate column name" errors on existing DBs
1126
- const v2Columns = [
1127
- { name: 'task_kind', type: 'TEXT' },
1128
- { name: 'priority', type: 'TEXT' },
1129
- { name: 'retry_count', type: 'INTEGER' },
1130
- { name: 'max_retries', type: 'INTEGER' },
1131
- { name: 'last_error', type: 'TEXT' },
1132
- { name: 'result_ref', type: 'TEXT' },
1133
- ];
1134
- for (const col of v2Columns) {
1135
- const exists = this.db.prepare(`PRAGMA table_info(evolution_tasks)`).all()
1136
- .some((row) => row.name === col.name);
1137
- if (!exists) {
1138
- this.db.exec(`ALTER TABLE evolution_tasks ADD COLUMN ${col.name} ${col.type}`);
1139
- }
1140
- }
1141
- this.db.exec(`
1142
- CREATE VIEW IF NOT EXISTS v_error_clusters AS
1143
- SELECT tool_name, COALESCE(error_type, 'unknown') AS error_type, COUNT(*) AS occurrences
1144
- FROM tool_calls
1145
- WHERE outcome = 'failure'
1146
- GROUP BY tool_name, COALESCE(error_type, 'unknown')
1147
- ORDER BY occurrences DESC;
1148
- CREATE VIEW IF NOT EXISTS v_principle_effectiveness AS
1149
- SELECT event_type, COUNT(*) AS total
1150
- FROM principle_events
1151
- GROUP BY event_type
1152
- ORDER BY total DESC;
1153
- CREATE VIEW IF NOT EXISTS v_sample_queue AS
1154
- SELECT review_status, COUNT(*) AS total
1155
- FROM correction_samples
1156
- GROUP BY review_status;
1157
- CREATE INDEX IF NOT EXISTS idx_assistant_turns_session_id ON assistant_turns(session_id);
1158
- CREATE INDEX IF NOT EXISTS idx_assistant_turns_created_at ON assistant_turns(created_at);
1159
- CREATE INDEX IF NOT EXISTS idx_assistant_turns_provider_model ON assistant_turns(provider, model);
1160
- CREATE INDEX IF NOT EXISTS idx_user_turns_session_id ON user_turns(session_id);
1161
- CREATE INDEX IF NOT EXISTS idx_tool_calls_session_id ON tool_calls(session_id);
1162
- CREATE INDEX IF NOT EXISTS idx_tool_calls_created_at ON tool_calls(created_at);
1163
- CREATE INDEX IF NOT EXISTS idx_pain_events_session_id ON pain_events(session_id);
1164
- CREATE INDEX IF NOT EXISTS idx_correction_samples_review_status ON correction_samples(review_status);
1165
- CREATE INDEX IF NOT EXISTS idx_evolution_tasks_trace_id ON evolution_tasks(trace_id);
1166
- CREATE INDEX IF NOT EXISTS idx_evolution_tasks_status ON evolution_tasks(status);
1167
- CREATE INDEX IF NOT EXISTS idx_evolution_tasks_created_at ON evolution_tasks(created_at);
1168
- CREATE INDEX IF NOT EXISTS idx_evolution_events_trace_id ON evolution_events(trace_id);
1169
- CREATE INDEX IF NOT EXISTS idx_evolution_events_created_at ON evolution_events(created_at);
1170
- `);
1171
1198
  const row = this.db.prepare('SELECT version FROM schema_version LIMIT 1').get();
1172
1199
  this.migrateSchema(row?.version);
1173
1200
  if (!row) {
@@ -6,12 +6,11 @@ import { HygieneTracker } from './hygiene/tracker.js';
6
6
  import { EvolutionReducerImpl } from './evolution-reducer.js';
7
7
  import type { TrajectoryDatabase } from './trajectory.js';
8
8
  import { PrincipleLifecycleService } from './principle-internalization/principle-lifecycle-service.js';
9
- import { type PrincipleSubtree } from './principle-tree-ledger.js';
10
- import type { Principle, PrincipleValueMetrics } from '../types/principle-tree-schema.js';
9
+ import { type PrincipleSubtree, type LedgerPrinciple, type PrincipleValueMetrics } from './principle-tree-ledger.js';
11
10
  import type { Principle as ActivePrinciple } from './evolution-types.js';
12
11
  interface PrincipleTreeLedgerAccessor {
13
12
  getPrincipleSubtree(_principleId: string): PrincipleSubtree | undefined;
14
- updatePrinciple(_principleId: string, updates: Partial<Principle>): Principle;
13
+ updatePrinciple(_principleId: string, updates: Partial<LedgerPrinciple>): LedgerPrinciple;
15
14
  updatePrincipleValueMetrics(principleId: string, _metrics: PrincipleValueMetrics): PrincipleValueMetrics;
16
15
  }
17
16
  /**