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
@@ -180,9 +180,15 @@ export class ControlUiDatabase {
180
180
  ON thinking_model_events(assistant_turn_id);
181
181
  CREATE INDEX IF NOT EXISTS idx_thinking_model_events_run_id
182
182
  ON thinking_model_events(run_id);
183
-
184
- DROP VIEW IF EXISTS v_thinking_model_usage;
185
- CREATE VIEW v_thinking_model_usage AS
183
+ `);
184
+ // Views depend on tables owned by TrajectoryDatabase (assistant_turns, tool_calls,
185
+ // pain_events, user_turns, correction_samples). If ControlUiDatabase is constructed
186
+ // before TrajectoryDatabase has run initSchema (e.g. llm_output is the first hook
187
+ // triggered on a fresh workspace), CREATE VIEW would throw and break the hook.
188
+ // Wrap each view creation in try/catch so missing-dependency views are skipped with
189
+ // a warning rather than aborting schema initialization (rc-9: no silent fallback —
190
+ // failures are surfaced via console.info).
191
+ this.createViewSafely('v_thinking_model_usage', `
186
192
  WITH totals AS (
187
193
  SELECT COUNT(*) AS assistant_turns FROM assistant_turns
188
194
  ),
@@ -205,10 +211,9 @@ export class ControlUiDatabase {
205
211
  ELSE ROUND(CAST(usage_rows.distinct_turns AS REAL) / CAST(totals.assistant_turns AS REAL), 4)
206
212
  END AS coverage_rate
207
213
  FROM usage_rows, totals
208
- ORDER BY usage_rows.hits DESC, usage_rows.model_id ASC;
209
-
210
- DROP VIEW IF EXISTS v_thinking_model_effectiveness;
211
- CREATE VIEW v_thinking_model_effectiveness AS
214
+ ORDER BY usage_rows.hits DESC, usage_rows.model_id ASC
215
+ `);
216
+ this.createViewSafely('v_thinking_model_effectiveness', `
212
217
  WITH event_windows AS (
213
218
  SELECT
214
219
  e.id,
@@ -274,10 +279,9 @@ export class ControlUiDatabase {
274
279
  ) THEN 1 ELSE 0 END) AS correction_sample_windows
275
280
  FROM bounded_windows b
276
281
  GROUP BY b.model_id
277
- ORDER BY events DESC, model_id ASC;
278
-
279
- DROP VIEW IF EXISTS v_thinking_model_scenarios;
280
- CREATE VIEW v_thinking_model_scenarios AS
282
+ ORDER BY events DESC, model_id ASC
283
+ `);
284
+ this.createViewSafely('v_thinking_model_scenarios', `
281
285
  SELECT
282
286
  e.model_id AS model_id,
283
287
  CAST(j.value AS TEXT) AS scenario,
@@ -290,19 +294,39 @@ export class ControlUiDatabase {
290
294
  END
291
295
  ) AS j
292
296
  GROUP BY e.model_id, CAST(j.value AS TEXT)
293
- ORDER BY hits DESC, scenario ASC;
294
-
295
- DROP VIEW IF EXISTS v_thinking_model_daily_trend;
296
- CREATE VIEW v_thinking_model_daily_trend AS
297
+ ORDER BY hits DESC, scenario ASC
298
+ `);
299
+ this.createViewSafely('v_thinking_model_daily_trend', `
297
300
  SELECT
298
301
  substr(created_at, 1, 10) AS day,
299
302
  model_id,
300
303
  COUNT(*) AS hits
301
304
  FROM thinking_model_events
302
305
  GROUP BY substr(created_at, 1, 10), model_id
303
- ORDER BY day ASC, model_id ASC;
306
+ ORDER BY day ASC, model_id ASC
304
307
  `);
305
308
  }
309
+ /**
310
+ * Create or replace a view, tolerating missing dependency tables.
311
+ *
312
+ * Views in ControlUiDatabase depend on tables created by TrajectoryDatabase
313
+ * (assistant_turns, tool_calls, pain_events, user_turns, correction_samples).
314
+ * If ControlUiDatabase is constructed before TrajectoryDatabase has created
315
+ * those tables, CREATE VIEW would throw. We DROP+CREATE with try/catch so
316
+ * missing-dependency views are skipped with a warning (rc-9: surfaced via
317
+ * console.info) rather than aborting schema initialization.
318
+ */
319
+ createViewSafely(viewName, viewBody) {
320
+ try {
321
+ this.db.exec(`DROP VIEW IF EXISTS ${viewName};`);
322
+ this.db.exec(`CREATE VIEW ${viewName} AS ${viewBody};`);
323
+ }
324
+ catch (err) {
325
+ const message = err instanceof Error ? err.message : String(err);
326
+ // rc-9: surface the failure — do not silently swallow
327
+ console.info(`[PD:ControlUiDatabase] view ${viewName} creation skipped: ${message}. It will be created on next TrajectoryDatabase initSchema().`);
328
+ }
329
+ }
306
330
  withWrite(fn) {
307
331
  return withLock(this.dbPath, fn, { lockSuffix: '.trajectory.lock', lockStaleMs: 30000 });
308
332
  }
@@ -1,24 +1,38 @@
1
+ /**
2
+ * Detection Funnel — PRI-446 thin adapter
3
+ *
4
+ * The pure three-layer funnel logic (LRU cache, async queue, layer dispatch)
5
+ * now lives in principles-core
6
+ * (runtime-v2/detection/detection-funnel-policy.ts). This file is a thin shell
7
+ * that wires DetectionFunnelCore with the two environment-coupled dependencies
8
+ * the plugin owns:
9
+ * - crypto.createHash (the L2 cache key hasher)
10
+ * - PainDictionary.match (the L1 exact matcher)
11
+ * - shouldIgnorePainProtocolText (the protocol-token gate)
12
+ *
13
+ * It re-exports DetectionFunnel (same class name + constructor signature) and
14
+ * DetectionResult so DetectionService, llm.ts, and evolution-worker keep working
15
+ * unchanged.
16
+ *
17
+ * ERR checklist:
18
+ * - ERR-011: this is a thin adapter delegating to core pure logic.
19
+ */
1
20
  import { type PainDictionary } from './dictionary.js';
2
- export interface DetectionResult {
3
- detected: boolean;
4
- severity?: number;
5
- ruleId?: string;
6
- source: 'l1_exact' | 'l2_cache' | 'l3_async_queued' | 'l3_semantic_hit';
7
- }
21
+ import { type DetectionResult } from '@principles/core/runtime-v2';
22
+ export type { DetectionResult };
8
23
  /**
9
24
  * Orchestrates the three-layer detection funnel for pain signals.
25
+ *
26
+ * Delegates to the core DetectionFunnelCore, injecting the crypto hasher,
27
+ * the dictionary matcher, and the protocol-token gate.
10
28
  */
11
29
  export declare class DetectionFunnel {
12
- private readonly cache;
13
- private asyncQueue;
14
- private readonly dictionary;
30
+ private readonly core;
15
31
  constructor(dictionary: PainDictionary);
16
32
  /**
17
33
  * Detects pain in the given text using L1 (Exact), L2 (Cache), and L3 (Async).
18
34
  */
19
35
  detect(text: string): DetectionResult;
20
- private static computeHash;
21
- private enqueueAsync;
22
36
  /**
23
37
  * Internal method for the worker to update the cache after a semantic hit.
24
38
  */
@@ -1,104 +1,56 @@
1
- import { createHash } from 'crypto';
2
- import { shouldIgnorePainProtocolText } from './dictionary.js';
3
1
  /**
4
- * A simple LRU Cache implementation using Map.
2
+ * Detection Funnel — PRI-446 thin adapter
3
+ *
4
+ * The pure three-layer funnel logic (LRU cache, async queue, layer dispatch)
5
+ * now lives in principles-core
6
+ * (runtime-v2/detection/detection-funnel-policy.ts). This file is a thin shell
7
+ * that wires DetectionFunnelCore with the two environment-coupled dependencies
8
+ * the plugin owns:
9
+ * - crypto.createHash (the L2 cache key hasher)
10
+ * - PainDictionary.match (the L1 exact matcher)
11
+ * - shouldIgnorePainProtocolText (the protocol-token gate)
12
+ *
13
+ * It re-exports DetectionFunnel (same class name + constructor signature) and
14
+ * DetectionResult so DetectionService, llm.ts, and evolution-worker keep working
15
+ * unchanged.
16
+ *
17
+ * ERR checklist:
18
+ * - ERR-011: this is a thin adapter delegating to core pure logic.
5
19
  */
6
- class SimpleLRU {
7
- cache;
8
- maxSize;
9
- constructor(maxSize = 100) {
10
- this.cache = new Map();
11
- this.maxSize = maxSize;
12
- }
13
- get(key) {
14
- const item = this.cache.get(key);
15
- if (item !== undefined) {
16
- // Refresh: delete and re-insert
17
- this.cache.delete(key);
18
- this.cache.set(key, item);
19
- }
20
- return item;
21
- }
22
- set(key, value) {
23
- if (this.cache.has(key)) {
24
- this.cache.delete(key);
25
- }
26
- else if (this.cache.size >= this.maxSize) {
27
- // Remove the oldest (first) item
28
- const firstKey = this.cache.keys().next().value;
29
- if (firstKey !== undefined) {
30
- this.cache.delete(firstKey);
31
- }
32
- }
33
- this.cache.set(key, value);
34
- }
35
- }
20
+ import { createHash } from 'crypto';
21
+ import { shouldIgnorePainProtocolText } from './dictionary.js';
22
+ import { DetectionFunnelCore, } from '@principles/core/runtime-v2';
36
23
  /**
37
24
  * Orchestrates the three-layer detection funnel for pain signals.
25
+ *
26
+ * Delegates to the core DetectionFunnelCore, injecting the crypto hasher,
27
+ * the dictionary matcher, and the protocol-token gate.
38
28
  */
39
29
  export class DetectionFunnel {
40
- cache = new SimpleLRU(100);
41
- asyncQueue = [];
42
- dictionary;
30
+ core;
43
31
  constructor(dictionary) {
44
- this.dictionary = dictionary;
32
+ this.core = new DetectionFunnelCore({
33
+ match: (text) => dictionary.match(text),
34
+ hash: (text) => createHash('sha256').update(text).digest('hex'),
35
+ shouldIgnoreProtocol: shouldIgnorePainProtocolText,
36
+ });
45
37
  }
46
38
  /**
47
39
  * Detects pain in the given text using L1 (Exact), L2 (Cache), and L3 (Async).
48
40
  */
49
41
  detect(text) {
50
- if (shouldIgnorePainProtocolText(text)) {
51
- return { detected: false, source: 'l1_exact' };
52
- }
53
- // --- Layer 1: Exact Match (Sync) ---
54
- const exactMatch = this.dictionary.match(text);
55
- if (exactMatch) {
56
- return {
57
- detected: true,
58
- severity: exactMatch.severity,
59
- ruleId: exactMatch.ruleId,
60
- source: 'l1_exact'
61
- };
62
- }
63
- // --- Layer 2: LRU Cache (Sync) ---
64
- const hash = DetectionFunnel.computeHash(text);
65
- const cached = this.cache.get(hash);
66
- if (cached) {
67
- return {
68
- detected: cached.detected,
69
- severity: cached.severity,
70
- source: 'l2_cache'
71
- };
72
- }
73
- // --- Layer 3: Async Semantic Queue ---
74
- this.enqueueAsync(text);
75
- return {
76
- detected: false,
77
- source: 'l3_async_queued'
78
- };
79
- }
80
- static computeHash(text) {
81
- return createHash('sha256').update(text).digest('hex');
82
- }
83
- enqueueAsync(text) {
84
- if (this.asyncQueue.length < 1000) {
85
- this.asyncQueue.push(text);
86
- }
87
- // Worker will pick this up and perform semantic search via createMemorySearchTool
42
+ return this.core.detect(text);
88
43
  }
89
44
  /**
90
45
  * Internal method for the worker to update the cache after a semantic hit.
91
46
  */
92
47
  updateCache(text, result) {
93
- const hash = DetectionFunnel.computeHash(text);
94
- this.cache.set(hash, result);
48
+ this.core.updateCache(text, result);
95
49
  }
96
50
  /**
97
51
  * Retrieves and clears the current asynchronous queue.
98
52
  */
99
53
  flushQueue() {
100
- const queue = [...this.asyncQueue];
101
- this.asyncQueue = [];
102
- return queue;
54
+ return this.core.flushQueue();
103
55
  }
104
56
  }
@@ -1,4 +1,4 @@
1
- import type { EventLogEntry, DailyStats, EmpathyEventStats, ToolCallEventData, PainSignalEventData, RuleMatchEventData, RulePromotionEventData, HookExecutionEventData, GateBlockEventData, GateBypassEventData, PlanApprovalEventData, EvolutionTaskEventData, EmpathyRollbackEventData, DiagnosisTaskEventData, HeartbeatDiagnosisEventData, DiagnosticianReportEventData, PrincipleCandidateEventData, RuleEnforcedEventData, RuleHostEvaluatedEventData, RuleHostBlockedEventData, RuleHostRequireApprovalEventData, RuleHostAutoCorrectProposedEventData, RuleHostAutoCorrectAppliedEventData, RuntimeV2PromptActivationsInjectedEventData, RuleHostUnhealthyEventData } from '../types/event-types.js';
1
+ import type { EventLogEntry, DailyStats, EmpathyEventStats, ToolCallEventData, PainSignalEventData, RulePromotionEventData, HookExecutionEventData, GateBlockEventData, GateBypassEventData, PlanApprovalEventData, EvolutionTaskEventData, EmpathyRollbackEventData, DiagnosisTaskEventData, HeartbeatDiagnosisEventData, DiagnosticianReportEventData, PrincipleCandidateEventData, RuleEnforcedEventData, RuleHostEvaluatedEventData, RuleHostBlockedEventData, RuleHostRequireApprovalEventData, RuleHostAutoCorrectProposedEventData, RuleHostAutoCorrectAppliedEventData, RuntimeV2PromptActivationsInjectedEventData, RuleHostUnhealthyEventData } from '../types/event-types.js';
2
2
  import type { PluginLogger } from '../openclaw-sdk.js';
3
3
  export declare class EventLog {
4
4
  private readonly logsDir;
@@ -11,7 +11,6 @@ export declare class EventLog {
11
11
  private flushTimer?;
12
12
  private currentEventsFile;
13
13
  private currentDate;
14
- private readonly painScoreSums;
15
14
  constructor(stateDir: string, logger?: PluginLogger);
16
15
  private getEventsFile;
17
16
  private getTodayStr;
@@ -19,7 +18,6 @@ export declare class EventLog {
19
18
  private cleanupOldEventFiles;
20
19
  recordToolCall(sessionId: string | undefined, data: ToolCallEventData): void;
21
20
  recordPainSignal(sessionId: string | undefined, data: PainSignalEventData): void;
22
- recordRuleMatch(sessionId: string | undefined, data: RuleMatchEventData): void;
23
21
  recordRulePromotion(data: RulePromotionEventData): void;
24
22
  recordHookExecution(data: HookExecutionEventData, opts?: {
25
23
  flushImmediately?: boolean;
@@ -15,7 +15,8 @@ export class EventLog {
15
15
  flushTimer;
16
16
  currentEventsFile;
17
17
  currentDate;
18
- painScoreSums = new Map();
18
+ // painScoreSums map removed (PRI-451 Wave 1.5): it only fed the dead
19
+ // stats.pain.avgScore counter, which is also removed.
19
20
  constructor(stateDir, logger) {
20
21
  this.logsDir = path.join(stateDir, 'logs');
21
22
  if (!fs.existsSync(this.logsDir)) {
@@ -68,9 +69,6 @@ export class EventLog {
68
69
  recordPainSignal(sessionId, data) {
69
70
  this.record('pain_signal', 'detected', sessionId, data);
70
71
  }
71
- recordRuleMatch(sessionId, data) {
72
- this.record('rule_match', 'detected', sessionId, data);
73
- }
74
72
  recordRulePromotion(data) {
75
73
  this.record('rule_promotion', 'promoted', undefined, data);
76
74
  }
@@ -293,16 +291,8 @@ export class EventLog {
293
291
  }
294
292
  else if (entry.type === 'pain_signal') {
295
293
  const data = entry.data;
296
- stats.pain.signalsDetected++;
297
- stats.pain.maxScore = Math.max(stats.pain.maxScore, data.score);
298
- if (data.source) {
299
- stats.pain.signalsBySource[data.source] = (stats.pain.signalsBySource[data.source] || 0) + 1;
300
- }
301
- const currentSum = this.painScoreSums.get(entry.date) ?? 0;
302
- this.painScoreSums.set(entry.date, currentSum + (data.score || 0));
303
- stats.pain.avgScore = stats.pain.signalsDetected > 0
304
- ? Math.round((currentSum + (data.score || 0)) / stats.pain.signalsDetected)
305
- : 0;
294
+ // stats.pain.* counters removed (PRI-451 Wave 1.5): no live reader.
295
+ // The user_empathy aggregation below (stats.empathy.*) is LIVE and stays.
306
296
  if (data.source === 'user_empathy') {
307
297
  if (data.deduped) {
308
298
  stats.empathy.dedupedCount++;
@@ -358,14 +348,8 @@ export class EventLog {
358
348
  stats.empathy.rollbackCount++;
359
349
  stats.empathy.rolledBackScore += data.originalScore || 0;
360
350
  }
361
- else if (entry.type === 'rule_match') {
362
- const data = entry.data;
363
- if (data.ruleId) {
364
- stats.pain.rulesMatched[data.ruleId] = (stats.pain.rulesMatched[data.ruleId] || 0) + 1;
365
- }
366
- }
367
351
  else if (entry.type === 'rule_promotion') {
368
- stats.pain.candidatesPromoted++;
352
+ // stats.pain.candidatesPromoted removed (PRI-451 Wave 1.5): dead counter.
369
353
  stats.evolution.rulesPromoted++;
370
354
  }
371
355
  else if (entry.type === 'evolution_task') {
@@ -52,20 +52,12 @@ export declare class EvolutionReducerImpl implements EvolutionReducer {
52
52
  private readonly failureStreak;
53
53
  private lastPromotedAt;
54
54
  private isReplaying;
55
- /** Registered pain_detected callbacks (e.g., PainSignalBridge). */
56
- private readonly _painCallbacks;
57
55
  constructor(opts: {
58
56
  workspaceDir: string;
59
57
  stateDir?: string;
60
58
  });
61
59
  emit(event: EvolutionLoopEvent): void;
62
60
  emitSync(event: EvolutionLoopEvent): void;
63
- /**
64
- * Register a callback for 'pain_detected' events.
65
- * The callback is invoked synchronously within emitSync() after applyEvent completes.
66
- * HG-4: Callbacks are fire-and-forget from the emitSync perspective.
67
- */
68
- on(callback: (event: EvolutionLoopEvent) => void): void;
69
61
  getEventLog(): EvolutionLoopEvent[];
70
62
  getCandidatePrinciples(): Principle[];
71
63
  getProbationPrinciples(): Principle[];
@@ -38,8 +38,9 @@ export class EvolutionReducerImpl {
38
38
  failureStreak = new Map();
39
39
  lastPromotedAt = null;
40
40
  isReplaying = false;
41
- /** Registered pain_detected callbacks (e.g., PainSignalBridge). */
42
- _painCallbacks = [];
41
+ // _painCallbacks pub/sub removed (PRI-451 Wave 1): no code ever registered a
42
+ // callback via .on(). The pain_detected → PainSignalBridge bridge happens via
43
+ // emitPainDetectedEvent (hooks/pain.ts), not this pub/sub layer.
43
44
  constructor(opts) {
44
45
  this.workspaceDir = opts.workspaceDir;
45
46
  this.stateDir = opts.stateDir;
@@ -77,14 +78,9 @@ export class EvolutionReducerImpl {
77
78
  }
78
79
  // Performance: sweepExpiredProbation() moved to getProbationPrinciples() for lazy cleanup
79
80
  }
80
- /**
81
- * Register a callback for 'pain_detected' events.
82
- * The callback is invoked synchronously within emitSync() after applyEvent completes.
83
- * HG-4: Callbacks are fire-and-forget from the emitSync perspective.
84
- */
85
- on(callback) {
86
- this._painCallbacks.push(callback);
87
- }
81
+ // on(callback) pub/sub registration removed (PRI-451 Wave 1): dead code —
82
+ // no caller ever registered a callback. pain_detected events still flow via
83
+ // emitPainDetectedEvent → PainSignalBridge, unaffected.
88
84
  getEventLog() {
89
85
  return [...this.memoryEvents];
90
86
  }
@@ -522,15 +518,9 @@ export class EvolutionReducerImpl {
522
518
  if (!this.isReplaying) {
523
519
  this.onPainDetected(event.data, event.ts);
524
520
  }
525
- // PainSignalBridge subscriptions: invoke registered callbacks (fire-and-forget)
526
- for (const cb of this._painCallbacks) {
527
- try {
528
- cb(event);
529
- }
530
- catch {
531
- // Keep the evolution loop resilient — callback errors must not propagate
532
- }
533
- }
521
+ // _painCallbacks dispatch removed (PRI-451 Wave 1): no callback was ever
522
+ // registered via .on() (also removed). The pain_detected → PainSignalBridge
523
+ // bridge flows through emitPainDetectedEvent (hooks/pain.ts), not here.
534
524
  return;
535
525
  case 'candidate_created':
536
526
  this.onCandidateCreated(event.data, event.ts);
@@ -0,0 +1,28 @@
1
+ /**
2
+ * PRI-468 — Plugin adapter implementing the core `IntentDocReader` port.
3
+ *
4
+ * Bridges the plugin-owned `safeReadIntentDoc()` I/O function to the
5
+ * core-owned `IntentDocReader` interface so Stage A (in core) can read
6
+ * INTENT.md without core performing any filesystem I/O.
7
+ *
8
+ * This adapter only MAPS types — it adds no new I/O, no new flag checks,
9
+ * and no new telemetry. The underlying `safeReadIntentDoc()` already
10
+ * performs the flag-first check (SPEC §12), TTL+mtime cache, and size cap.
11
+ *
12
+ * ERR checklist:
13
+ * EP-01 / ERR-001: never `as` — field-by-field mapping with typeof checks
14
+ * EP-02 / ERR-025: plugin I/O file, whitelisted in architecture-regression
15
+ * EP-03 / ERR-002: every degraded path flows through with reason + nextAction
16
+ *
17
+ * Architecture: this file is I/O (delegates to fs-reading safeReadIntentDoc).
18
+ * It will be added to KNOWN_PLUGIN_CORE_FILES in architecture-regression.test.ts.
19
+ */
20
+ import type { IntentDocReader } from '@principles/core/runtime-v2';
21
+ /**
22
+ * Create an IntentDocReader bound to a specific workspace.
23
+ *
24
+ * The returned reader is stateless beyond the workspace binding — each
25
+ * `readIntentDoc()` call delegates to `safeReadIntentDoc()`, which owns
26
+ * the TTL+mtime cache.
27
+ */
28
+ export declare function createIntentDocReader(workspaceDir: string): IntentDocReader;
@@ -0,0 +1,56 @@
1
+ /**
2
+ * PRI-468 — Plugin adapter implementing the core `IntentDocReader` port.
3
+ *
4
+ * Bridges the plugin-owned `safeReadIntentDoc()` I/O function to the
5
+ * core-owned `IntentDocReader` interface so Stage A (in core) can read
6
+ * INTENT.md without core performing any filesystem I/O.
7
+ *
8
+ * This adapter only MAPS types — it adds no new I/O, no new flag checks,
9
+ * and no new telemetry. The underlying `safeReadIntentDoc()` already
10
+ * performs the flag-first check (SPEC §12), TTL+mtime cache, and size cap.
11
+ *
12
+ * ERR checklist:
13
+ * EP-01 / ERR-001: never `as` — field-by-field mapping with typeof checks
14
+ * EP-02 / ERR-025: plugin I/O file, whitelisted in architecture-regression
15
+ * EP-03 / ERR-002: every degraded path flows through with reason + nextAction
16
+ *
17
+ * Architecture: this file is I/O (delegates to fs-reading safeReadIntentDoc).
18
+ * It will be added to KNOWN_PLUGIN_CORE_FILES in architecture-regression.test.ts.
19
+ */
20
+ import { safeReadIntentDoc } from './intent-doc-reader.js';
21
+ /**
22
+ * Create an IntentDocReader bound to a specific workspace.
23
+ *
24
+ * The returned reader is stateless beyond the workspace binding — each
25
+ * `readIntentDoc()` call delegates to `safeReadIntentDoc()`, which owns
26
+ * the TTL+mtime cache.
27
+ */
28
+ export function createIntentDocReader(workspaceDir) {
29
+ return {
30
+ readIntentDoc() {
31
+ const result = safeReadIntentDoc(workspaceDir);
32
+ if (result.ok && result.doc) {
33
+ const doc = result.doc;
34
+ const reference = {
35
+ raw: typeof doc.raw === 'string' ? doc.raw : '',
36
+ contentHash: typeof doc.contentHash === 'string' ? doc.contentHash : '',
37
+ path: typeof doc.path === 'string' ? doc.path : '',
38
+ };
39
+ return {
40
+ ok: true,
41
+ found: true,
42
+ flagEnabled: true,
43
+ doc: reference,
44
+ };
45
+ }
46
+ // Degraded path — preserve structured reason + nextAction (EP-03 / ERR-002)
47
+ return {
48
+ ok: false,
49
+ found: result.found,
50
+ flagEnabled: result.flagEnabled,
51
+ reason: result.reason,
52
+ nextAction: result.nextAction,
53
+ };
54
+ },
55
+ };
56
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * PRI-467 — safeReadIntentDoc: plugin I/O wrapper for reading INTENT.md.
3
+ *
4
+ * Reads `.principles/INTENT.md` with:
5
+ * - Feature flag check FIRST (SPEC §12: flag off → flag_disabled without fs)
6
+ * - TTL + mtime cache (60s TTL, mtime check) mirroring prompt.ts cachedReadFile
7
+ * - 32KB size cap (INTENT_MAX_BYTES)
8
+ * - Never throws — all errors return structured `reason` + `nextAction`
9
+ *
10
+ * Trust boundary (SPEC §12.2):
11
+ * - Raw content is returned for the pure builder to escape; this reader does
12
+ * NOT escape or bound the content for prompt injection. The pure builder
13
+ * `buildIntentFrictionBlock` handles escaping + bounding.
14
+ *
15
+ * ERR checklist:
16
+ * EP-01 / ERR-001, ERR-005: raw content validated with typeof, never `as`
17
+ * EP-02 / ERR-025, ERR-070: production path; plugin I/O file in the whitelist
18
+ * EP-03 / ERR-002, ERR-014: every degraded path returns structured reason + nextAction
19
+ * EP-09: tests use real fs writes in temp dirs
20
+ *
21
+ * Architecture: this file is I/O (fs, path). It is whitelisted in
22
+ * architecture-regression.test.ts KNOWN_PLUGIN_CORE_FILES.
23
+ */
24
+ import { type IntentDocSections, type IntentDocWarning } from '@principles/core/runtime-v2';
25
+ export type SafeReadIntentDocReason = 'flag_disabled' | 'not_found' | 'oversized' | 'read_error';
26
+ export interface IntentDoc {
27
+ /** Raw INTENT.md content (unescaped — caller escapes for prompt injection). */
28
+ raw: string;
29
+ /** Parsed sections from the raw content. */
30
+ sections: IntentDocSections;
31
+ /** SHA-256 content hash for deduplication and audit. */
32
+ contentHash: string;
33
+ /** Absolute path to the INTENT.md file. */
34
+ path: string;
35
+ /** ISO timestamp when the doc was read. */
36
+ readAt: string;
37
+ /** Validation warnings (missing/empty/too_vague sections). */
38
+ warnings: IntentDocWarning[];
39
+ }
40
+ export interface SafeReadIntentDocResult {
41
+ /** True when the doc was successfully read and parsed. */
42
+ ok: boolean;
43
+ /** True when the INTENT.md file exists on disk. */
44
+ found: boolean;
45
+ /** True when the intent_engineering flag is enabled. */
46
+ flagEnabled: boolean;
47
+ /** The parsed IntentDoc, present only when ok=true. */
48
+ doc?: IntentDoc;
49
+ /** Structured reason for a degraded path (present when ok=false). */
50
+ reason?: SafeReadIntentDocReason;
51
+ /** Next action for the operator (present when ok=false). */
52
+ nextAction?: string;
53
+ /** Validation warnings (always present, empty when no warnings). */
54
+ warnings: IntentDocWarning[];
55
+ }
56
+ /**
57
+ * Reset the intent doc cache for test isolation.
58
+ * Call in beforeEach() to ensure tests don't pollute each other.
59
+ */
60
+ export declare function resetIntentDocCacheForTest(workspaceDir?: string): void;
61
+ /**
62
+ * Safely read INTENT.md for prompt injection.
63
+ *
64
+ * Contract (SPEC §12):
65
+ * 1. Flag check FIRST via loadFeatureFlagFromConfig. Flag off → flag_disabled
66
+ * WITHOUT any fs access to INTENT.md.
67
+ * 2. Flag on → check TTL + mtime cache. If cached and fresh → return cached.
68
+ * 3. Otherwise → stat the file (oversized check), read, parse, validate, cache.
69
+ * 4. Never throws — all errors return structured reason + nextAction.
70
+ *
71
+ * @param workspaceDir - Absolute path to the workspace root
72
+ * @param options - Optional logger for debug-level diagnostics
73
+ * @returns SafeReadIntentDocResult (never throws)
74
+ */
75
+ export declare function safeReadIntentDoc(workspaceDir: string, options?: {
76
+ logger?: {
77
+ debug?: (msg: string) => void;
78
+ warn?: (msg: string) => void;
79
+ };
80
+ }): SafeReadIntentDocResult;