create-principles-disciple 1.94.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 (339) hide show
  1. package/console/dist/server/config/WorkspaceConfigStore.js +2 -1
  2. package/console/dist/server/config/pd-config-store.d.ts +33 -0
  3. package/console/dist/server/config/pd-config-store.js +159 -0
  4. package/console/dist/server/index.js +18 -4
  5. package/console/dist/server/models/EvidenceChainConsoleModel.d.ts +0 -2
  6. package/console/dist/server/models/EvidenceChainConsoleModel.js +36 -2
  7. package/console/dist/server/models/HealthCheckModel.js +5 -3
  8. package/console/dist/server/models/IntentDecisionModel.d.ts +66 -0
  9. package/console/dist/server/models/IntentDecisionModel.js +207 -0
  10. package/console/dist/server/models/IntentPageModel.d.ts +18 -0
  11. package/console/dist/server/models/IntentPageModel.js +90 -0
  12. package/console/dist/server/models/PrinciplesConsoleModel.d.ts +2 -0
  13. package/console/dist/server/models/PrinciplesConsoleModel.js +37 -1
  14. package/console/dist/server/models/WorkspaceService.d.ts +0 -28
  15. package/console/dist/server/models/WorkspaceService.js +0 -115
  16. package/console/dist/server/routes/config.js +55 -1
  17. package/console/dist/server/routes/intent-decisions.d.ts +33 -0
  18. package/console/dist/server/routes/intent-decisions.js +499 -0
  19. package/console/dist/server/routes/intent.d.ts +3 -0
  20. package/console/dist/server/routes/intent.js +35 -0
  21. package/console/dist/server/routes/principles.js +67 -1
  22. package/console/dist/server/routes/update.d.ts +0 -1
  23. package/console/dist/server/routes/update.js +14 -11
  24. package/console/dist/ui/App.js +2 -7
  25. package/console/dist/ui/api.d.ts +44 -18
  26. package/console/dist/ui/api.js +44 -5
  27. package/console/dist/ui/components/layout/app-sidebar.js +2 -1
  28. package/console/dist/ui/components/ui/badge.d.ts +1 -1
  29. package/console/dist/ui/components/ui/button.d.ts +1 -1
  30. package/console/dist/ui/components/ui/shiny-text.d.ts +28 -0
  31. package/console/dist/ui/components/ui/shiny-text.js +46 -0
  32. package/console/dist/ui/i18n/en.json +167 -3
  33. package/console/dist/ui/i18n/zh-CN.json +167 -3
  34. package/console/dist/ui/pages/activation/ActivationPage.js +2 -1
  35. package/console/dist/ui/pages/control-center/ControlCenterPage.js +28 -2
  36. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.d.ts +28 -0
  37. package/console/dist/ui/pages/control-center/EmpathyObserverCostHint.js +38 -0
  38. package/console/dist/ui/pages/debt/DebtPage.js +219 -2
  39. package/console/dist/ui/pages/focus/FocusPage.js +2 -1
  40. package/console/dist/ui/pages/intent/IntentPage.d.ts +1 -0
  41. package/console/dist/ui/pages/intent/IntentPage.js +147 -0
  42. package/console/dist/ui/pages/pain/PainPage.js +234 -4
  43. package/console/dist/ui/pages/pain/pain-card-helpers.d.ts +75 -0
  44. package/console/dist/ui/pages/pain/pain-card-helpers.js +78 -0
  45. package/console/dist/ui/pages/principles/PrinciplesPage.js +2 -1
  46. package/console/dist/ui/utils/validators.d.ts +163 -0
  47. package/console/dist/ui/utils/validators.js +433 -0
  48. package/console/dist/web/assets/app.css +138 -0
  49. package/console/dist/web/assets/app.js +3124 -1288
  50. package/console/package.json +3 -0
  51. package/core/dist/principle-tree-ledger.d.ts +55 -4
  52. package/core/dist/principle-tree-ledger.d.ts.map +1 -1
  53. package/core/dist/principle-tree-ledger.js +472 -13
  54. package/core/dist/principle-tree-ledger.js.map +1 -1
  55. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js +58 -0
  56. package/core/dist/prompt-builder/__tests__/prompt-builder-core.test.js.map +1 -1
  57. package/core/dist/prompt-builder/empathy-keyword-matching.d.ts.map +1 -1
  58. package/core/dist/prompt-builder/empathy-keyword-matching.js +9 -6
  59. package/core/dist/prompt-builder/empathy-keyword-matching.js.map +1 -1
  60. package/core/dist/prompt-builder/size-guard.d.ts +1 -0
  61. package/core/dist/prompt-builder/size-guard.d.ts.map +1 -1
  62. package/core/dist/prompt-builder/size-guard.js +21 -0
  63. package/core/dist/prompt-builder/size-guard.js.map +1 -1
  64. package/core/dist/prompt-builder/types.d.ts +2 -0
  65. package/core/dist/prompt-builder/types.d.ts.map +1 -1
  66. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +118 -32
  67. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  68. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts +2 -0
  69. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.d.ts.map +1 -0
  70. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js +284 -0
  71. package/core/dist/runtime-v2/__tests__/evidence-chain-intent-tension.test.js.map +1 -0
  72. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js +105 -0
  73. package/core/dist/runtime-v2/__tests__/pain-signal-bridge-result-shaping.test.js.map +1 -1
  74. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js +7 -5
  75. package/core/dist/runtime-v2/__tests__/pain-signal-observability.test.js.map +1 -1
  76. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js +11 -0
  77. package/core/dist/runtime-v2/__tests__/pi-artifact-store.test.js.map +1 -1
  78. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js +15 -2
  79. package/core/dist/runtime-v2/__tests__/proven-channel-baseline.test.js.map +1 -1
  80. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts +2 -0
  81. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.d.ts.map +1 -0
  82. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js +290 -0
  83. package/core/dist/runtime-v2/__tests__/schema-float-precision.test.js.map +1 -0
  84. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts +2 -0
  85. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.d.ts.map +1 -0
  86. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js +158 -0
  87. package/core/dist/runtime-v2/__tests__/schema-orphan-detection.test.js.map +1 -0
  88. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js +15 -1
  89. package/core/dist/runtime-v2/activation/__tests__/approval-store-extended.test.js.map +1 -1
  90. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts +2 -0
  91. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.d.ts.map +1 -0
  92. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js +62 -0
  93. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store-fk.test.js.map +1 -0
  94. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js +12 -2
  95. package/core/dist/runtime-v2/activation/__tests__/sqlite-activation-state-store.test.js.map +1 -1
  96. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts +2 -0
  97. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.d.ts.map +1 -0
  98. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js +56 -0
  99. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store-fk.test.js.map +1 -0
  100. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js +8 -0
  101. package/core/dist/runtime-v2/activation/__tests__/sqlite-approval-store.test.js.map +1 -1
  102. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js +20 -0
  103. package/core/dist/runtime-v2/activation/__tests__/story-a-acceptance.test.js.map +1 -1
  104. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.d.ts.map +1 -1
  105. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js +6 -0
  106. package/core/dist/runtime-v2/activation/sqlite-activation-state-store.js.map +1 -1
  107. package/core/dist/runtime-v2/activation/sqlite-approval-store.d.ts.map +1 -1
  108. package/core/dist/runtime-v2/activation/sqlite-approval-store.js +86 -32
  109. package/core/dist/runtime-v2/activation/sqlite-approval-store.js.map +1 -1
  110. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +65 -1
  111. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
  112. package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
  113. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +33 -11
  114. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
  115. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js +134 -15
  116. package/core/dist/runtime-v2/diagnostician/__tests__/diag-rootcause-output.test.js.map +1 -1
  117. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts +18 -0
  118. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.d.ts.map +1 -0
  119. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js +251 -0
  120. package/core/dist/runtime-v2/diagnostician/__tests__/intent-tension-schema.test.js.map +1 -0
  121. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js +73 -0
  122. package/core/dist/runtime-v2/diagnostician/__tests__/rootcause-prompt-builder.test.js.map +1 -1
  123. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts +98 -0
  124. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.d.ts.map +1 -1
  125. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js +131 -0
  126. package/core/dist/runtime-v2/diagnostician/diag-rootcause-output.js.map +1 -1
  127. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts +8 -0
  128. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.d.ts.map +1 -1
  129. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js +66 -3
  130. package/core/dist/runtime-v2/diagnostician/rootcause-prompt-builder.js.map +1 -1
  131. package/core/dist/runtime-v2/diagnostician-output.d.ts +23 -0
  132. package/core/dist/runtime-v2/diagnostician-output.d.ts.map +1 -1
  133. package/core/dist/runtime-v2/diagnostician-output.js +16 -0
  134. package/core/dist/runtime-v2/diagnostician-output.js.map +1 -1
  135. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts +32 -0
  136. package/core/dist/runtime-v2/diagnostician-prompt-builder.d.ts.map +1 -1
  137. package/core/dist/runtime-v2/diagnostician-prompt-builder.js.map +1 -1
  138. package/core/dist/runtime-v2/evidence-triage/source-descriptors.d.ts +1 -1
  139. package/core/dist/runtime-v2/evidence-triage/source-descriptors.js +1 -1
  140. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js +23 -0
  141. package/core/dist/runtime-v2/feature-flags/__tests__/feature-flag-contract.test.js.map +1 -1
  142. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts +2 -0
  143. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.d.ts.map +1 -0
  144. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js +30 -0
  145. package/core/dist/runtime-v2/feature-flags/__tests__/intent-engineering-flag.test.js.map +1 -0
  146. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  147. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +2 -0
  148. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  149. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.d.ts.map +1 -1
  150. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js +0 -9
  151. package/core/dist/runtime-v2/feature-flags/plugin-surface-registry.js.map +1 -1
  152. package/core/dist/runtime-v2/index.d.ts +9 -4
  153. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  154. package/core/dist/runtime-v2/index.js +12 -3
  155. package/core/dist/runtime-v2/index.js.map +1 -1
  156. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts +2 -0
  157. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.d.ts.map +1 -0
  158. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js +185 -0
  159. package/core/dist/runtime-v2/intent/__tests__/intent-decision-record.test.js.map +1 -0
  160. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts +2 -0
  161. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.d.ts.map +1 -0
  162. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js +91 -0
  163. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -0
  164. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts +2 -0
  165. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.d.ts.map +1 -0
  166. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js +168 -0
  167. package/core/dist/runtime-v2/intent/__tests__/intent-friction-block.test.js.map +1 -0
  168. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts +2 -0
  169. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.d.ts.map +1 -0
  170. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js +121 -0
  171. package/core/dist/runtime-v2/intent/__tests__/intent-patch-proposal.test.js.map +1 -0
  172. package/core/dist/runtime-v2/intent/index.d.ts +6 -0
  173. package/core/dist/runtime-v2/intent/index.d.ts.map +1 -0
  174. package/core/dist/runtime-v2/intent/index.js +6 -0
  175. package/core/dist/runtime-v2/intent/index.js.map +1 -0
  176. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts +125 -0
  177. package/core/dist/runtime-v2/intent/intent-decision-record.d.ts.map +1 -0
  178. package/core/dist/runtime-v2/intent/intent-decision-record.js +21 -0
  179. package/core/dist/runtime-v2/intent/intent-decision-record.js.map +1 -0
  180. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts +95 -0
  181. package/core/dist/runtime-v2/intent/intent-doc-reader-port.d.ts.map +1 -0
  182. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js +43 -0
  183. package/core/dist/runtime-v2/intent/intent-doc-reader-port.js.map +1 -0
  184. package/core/dist/runtime-v2/intent/intent-doc.d.ts +19 -0
  185. package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -0
  186. package/core/dist/runtime-v2/intent/intent-doc.js +70 -0
  187. package/core/dist/runtime-v2/intent/intent-doc.js.map +1 -0
  188. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts +63 -0
  189. package/core/dist/runtime-v2/intent/intent-friction-block.d.ts.map +1 -0
  190. package/core/dist/runtime-v2/intent/intent-friction-block.js +129 -0
  191. package/core/dist/runtime-v2/intent/intent-friction-block.js.map +1 -0
  192. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts +42 -0
  193. package/core/dist/runtime-v2/intent/intent-patch-proposal.d.ts.map +1 -0
  194. package/core/dist/runtime-v2/intent/intent-patch-proposal.js +81 -0
  195. package/core/dist/runtime-v2/intent/intent-patch-proposal.js.map +1 -0
  196. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts +54 -0
  197. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.d.ts.map +1 -0
  198. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js +219 -0
  199. package/core/dist/runtime-v2/internalization/__tests__/__fixtures__/intent-tension-cases.js.map +1 -0
  200. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts +2 -0
  201. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.d.ts.map +1 -0
  202. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js +360 -0
  203. package/core/dist/runtime-v2/internalization/__tests__/diag-rootcause-intent-tension.test.js.map +1 -0
  204. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts +2 -0
  205. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.d.ts.map +1 -0
  206. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js +333 -0
  207. package/core/dist/runtime-v2/internalization/__tests__/diag-router-intent-tension.test.js.map +1 -0
  208. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts +2 -0
  209. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.d.ts.map +1 -0
  210. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js +113 -0
  211. package/core/dist/runtime-v2/internalization/__tests__/intent-tension-cases.test.js.map +1 -0
  212. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts +13 -0
  213. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.d.ts.map +1 -1
  214. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js +42 -0
  215. package/core/dist/runtime-v2/internalization/diag-rootcause-runner.js.map +1 -1
  216. package/core/dist/runtime-v2/internalization/diag-router-runner.d.ts.map +1 -1
  217. package/core/dist/runtime-v2/internalization/diag-router-runner.js +27 -0
  218. package/core/dist/runtime-v2/internalization/diag-router-runner.js.map +1 -1
  219. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  220. package/core/dist/runtime-v2/pain-signal-observability.js +257 -56
  221. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  222. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts +12 -0
  223. package/core/dist/runtime-v2/pain-signal-runtime-factory.d.ts.map +1 -1
  224. package/core/dist/runtime-v2/pain-signal-runtime-factory.js +1 -1
  225. package/core/dist/runtime-v2/pain-signal-runtime-factory.js.map +1 -1
  226. package/core/dist/runtime-v2/pain-to-principle-service.d.ts +6 -0
  227. package/core/dist/runtime-v2/pain-to-principle-service.d.ts.map +1 -1
  228. package/core/dist/runtime-v2/pain-to-principle-service.js +2 -0
  229. package/core/dist/runtime-v2/pain-to-principle-service.js.map +1 -1
  230. package/core/dist/runtime-v2/principle-tree/ledger-codec.js.map +1 -1
  231. package/core/dist/runtime-v2/proven-channel-baseline.js +1 -1
  232. package/core/dist/runtime-v2/proven-channel-baseline.js.map +1 -1
  233. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts +2 -0
  234. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.d.ts.map +1 -0
  235. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js +55 -0
  236. package/core/dist/runtime-v2/store/artifact/__tests__/sqlite-pi-artifact-store-fk.test.js.map +1 -0
  237. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.d.ts.map +1 -1
  238. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js +6 -0
  239. package/core/dist/runtime-v2/store/artifact/sqlite-pi-artifact-store.js.map +1 -1
  240. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts +2 -0
  241. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.d.ts.map +1 -0
  242. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js +272 -0
  243. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-decision-store.test.js.map +1 -0
  244. package/core/dist/runtime-v2/store/intent/index.d.ts +6 -0
  245. package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -0
  246. package/core/dist/runtime-v2/store/intent/index.js +5 -0
  247. package/core/dist/runtime-v2/store/intent/index.js.map +1 -0
  248. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts +51 -0
  249. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.d.ts.map +1 -0
  250. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js +306 -0
  251. package/core/dist/runtime-v2/store/intent/sqlite-intent-decision-store.js.map +1 -0
  252. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js +14 -3
  253. package/core/dist/runtime-v2/store/sqlite-connection-pragma.test.js.map +1 -1
  254. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts +2 -0
  255. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.d.ts.map +1 -0
  256. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js +72 -0
  257. package/core/dist/runtime-v2/store/sqlite-connection-schema-version.test.js.map +1 -0
  258. package/core/dist/runtime-v2/store/sqlite-connection.d.ts +27 -0
  259. package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  260. package/core/dist/runtime-v2/store/sqlite-connection.js +124 -12
  261. package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  262. package/core/dist/runtime-v2/types/event-payload.d.ts +1 -20
  263. package/core/dist/runtime-v2/types/event-payload.d.ts.map +1 -1
  264. package/core/dist/runtime-v2/types/event-payload.js +0 -12
  265. package/core/dist/runtime-v2/types/event-payload.js.map +1 -1
  266. package/core/dist/runtime-v2/types/event-types.d.ts +5 -34
  267. package/core/dist/runtime-v2/types/event-types.d.ts.map +1 -1
  268. package/core/dist/runtime-v2/types/event-types.js +0 -19
  269. package/core/dist/runtime-v2/types/event-types.js.map +1 -1
  270. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts +63 -0
  271. package/core/dist/runtime-v2/types/evidence-chain-contract.d.ts.map +1 -1
  272. package/core/dist/runtime-v2/types/evidence-chain-contract.js +234 -9
  273. package/core/dist/runtime-v2/types/evidence-chain-contract.js.map +1 -1
  274. package/core/dist/runtime-v2/types/index.d.ts +5 -5
  275. package/core/dist/runtime-v2/types/index.d.ts.map +1 -1
  276. package/core/dist/runtime-v2/types/index.js +5 -3
  277. package/core/dist/runtime-v2/types/index.js.map +1 -1
  278. package/core/dist/runtime-v2/types/ledger-store.d.ts +30 -30
  279. package/core/dist/runtime-v2/types/ledger-store.d.ts.map +1 -1
  280. package/core/dist/runtime-v2/types/ledger-store.js +10 -5
  281. package/core/dist/runtime-v2/types/ledger-store.js.map +1 -1
  282. package/core/dist/workflow-funnel-loader.d.ts +2 -2
  283. package/core/dist/workflow-funnel-loader.d.ts.map +1 -1
  284. package/dist/installer.d.ts.map +1 -1
  285. package/dist/installer.js +16 -0
  286. package/dist/installer.js.map +1 -1
  287. package/package.json +1 -1
  288. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts +9 -0
  289. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.d.ts.map +1 -0
  290. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js +166 -0
  291. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -0
  292. package/pd-cli/dist/commands/intent.d.ts +59 -0
  293. package/pd-cli/dist/commands/intent.d.ts.map +1 -0
  294. package/pd-cli/dist/commands/intent.js +350 -0
  295. package/pd-cli/dist/commands/intent.js.map +1 -0
  296. package/pd-cli/dist/commands/runtime-init.d.ts +43 -0
  297. package/pd-cli/dist/commands/runtime-init.d.ts.map +1 -0
  298. package/pd-cli/dist/commands/runtime-init.js +264 -0
  299. package/pd-cli/dist/commands/runtime-init.js.map +1 -0
  300. package/pd-cli/dist/index.js +25 -0
  301. package/pd-cli/dist/index.js.map +1 -1
  302. package/pd-cli/dist/services/demo-story-a-runner.d.ts.map +1 -1
  303. package/pd-cli/dist/services/demo-story-a-runner.js +6 -0
  304. package/pd-cli/dist/services/demo-story-a-runner.js.map +1 -1
  305. package/pd-cli/package.json +1 -0
  306. package/plugin/dist/commands/pain.js +2 -0
  307. package/plugin/dist/core/control-ui-db.d.ts +11 -0
  308. package/plugin/dist/core/control-ui-db.js +40 -16
  309. package/plugin/dist/core/event-log.js +0 -5
  310. package/plugin/dist/core/intent-doc-reader-adapter.d.ts +28 -0
  311. package/plugin/dist/core/intent-doc-reader-adapter.js +56 -0
  312. package/plugin/dist/core/intent-doc-reader.d.ts +80 -0
  313. package/plugin/dist/core/intent-doc-reader.js +189 -0
  314. package/plugin/dist/core/principle-tree-ledger.d.ts +27 -79
  315. package/plugin/dist/core/principle-tree-ledger.js +39 -524
  316. package/plugin/dist/core/reflection/reflection-context.d.ts +2 -2
  317. package/plugin/dist/core/trajectory.d.ts +16 -0
  318. package/plugin/dist/core/trajectory.js +332 -254
  319. package/plugin/dist/core/workspace-context.d.ts +2 -3
  320. package/plugin/dist/hooks/pain.js +5 -0
  321. package/plugin/dist/hooks/prompt-helpers.d.ts +19 -1
  322. package/plugin/dist/hooks/prompt-helpers.js +39 -2
  323. package/plugin/dist/hooks/prompt-types.d.ts +8 -0
  324. package/plugin/dist/hooks/prompt.js +80 -21
  325. package/plugin/dist/index.d.ts +3 -1
  326. package/plugin/dist/index.js +9 -5
  327. package/plugin/dist/service/runtime-summary-service.js +1 -1
  328. package/plugin/dist/service/subagent-workflow/workflow-store.d.ts +14 -0
  329. package/plugin/dist/service/subagent-workflow/workflow-store.js +91 -2
  330. package/plugin/dist/types/event-types.d.ts +1 -1
  331. package/plugin/package.json +6 -3
  332. package/plugin/scripts/acceptance-test.mjs +3 -3
  333. package/plugin/dist/core/principle-tree-ledger-adapter.d.ts +0 -32
  334. package/plugin/dist/core/principle-tree-ledger-adapter.js +0 -125
  335. package/plugin/dist/service/central-database.d.ts +0 -138
  336. package/plugin/dist/service/central-database.js +0 -731
  337. package/plugin/dist/service/central-sync-service.d.ts +0 -8
  338. package/plugin/dist/service/central-sync-service.js +0 -71
  339. package/plugin/scripts/validate-live-path.ts +0 -462
@@ -187,9 +187,13 @@ export function formatEvolutionPrinciples(active, probation) {
187
187
  * Assemble appendSystemContext from ordered parts.
188
188
  *
189
189
  * Content order (most important last):
190
- * behavioral_constraints → project_context → working_memory →
190
+ * behavioral_constraints → project_context → intent_block → working_memory →
191
191
  * thinking_os → evolution_principles → core_principles
192
192
  *
193
+ * PRI-467: intent_block (INTENT.md reference) sits after project_context
194
+ * (stable reference data, lower priority than principles) and before
195
+ * working_memory (volatile per-session state).
196
+ *
193
197
  * Pure logic — string assembly only, no I/O.
194
198
  *
195
199
  * @param parts Ordered content parts (empty/undefined parts are skipped)
@@ -207,7 +211,13 @@ ${parts.behavioralConstraints}
207
211
  if (parts.projectContext) {
208
212
  appendParts.push(`<project_context>\n${parts.projectContext}\n</project_context>`);
209
213
  }
210
- // 1.5. Working Memory (preserved from last compaction)
214
+ // 1.5. Intent Block (PRI-467) Owner-owned INTENT.md reference.
215
+ // Bounded + escaped by buildIntentFrictionBlock; treated as quoted reference
216
+ // data, not executable instructions (SPEC §12.2).
217
+ if (parts.intentBlock) {
218
+ appendParts.push(parts.intentBlock);
219
+ }
220
+ // 1.6. Working Memory (preserved from last compaction)
211
221
  if (parts.workingMemory) {
212
222
  appendParts.push(parts.workingMemory);
213
223
  }
@@ -235,6 +245,7 @@ The sections below are ordered by priority. When conflicts arise, **later sectio
235
245
  const executionRules = [
236
246
  parts.behavioralConstraints ? '- `<behavioral_constraints>` - Output format restrictions (hide diagnostic JSON)' : null,
237
247
  parts.projectContext ? '- `<project_context>` - Current priorities (can be overridden)' : null,
248
+ parts.intentBlock ? '- `<intent_anchor>` / `<intent_doc>` / `<intent_friction>` - Owner-owned intent reference (quoted evidence, not executable)' : null,
238
249
  parts.workingMemory ? '- `<working_memory>` - Persisted compacted memory snapshot' : null,
239
250
  parts.thinkingOs ? '- `<thinking_os>` - Stable reasoning framework' : null,
240
251
  parts.evolutionPrinciples ? '- `<evolution_principles>` - Learned principles (active + probation)' : null,
@@ -249,3 +260,29 @@ ${executionRules.join('\n')}
249
260
  `;
250
261
  return result;
251
262
  }
263
+ // ---------------------------------------------------------------------------
264
+ // Block H: Observer feedback → keyword phrase extraction
265
+ // ---------------------------------------------------------------------------
266
+ /**
267
+ * Extracts short, distinct keyword phrases from an EmpathyObserver reason string.
268
+ *
269
+ * Used to feed newly detected expressions back into the keyword store, so the
270
+ * keyword-based fast path can catch them on future turns without re-running
271
+ * the more expensive observer.
272
+ *
273
+ * Pure function — no I/O, no side effects. Fully unit-testable.
274
+ *
275
+ * @param reason - observer's reason string (e.g., "用户表达了强烈的挫败感,提到反复尝试失败")
276
+ * @param lang - UI locale for minimum length threshold (zh=2 chars, en=3 chars)
277
+ * @returns deduplicated array of up to 3 candidate phrases
278
+ */
279
+ export function extractPhrasesFromReason(reason, lang) {
280
+ const MAX_PHRASES = 3;
281
+ const MIN_LENGTH = lang === 'zh' ? 2 : 3;
282
+ const MAX_LENGTH = 20;
283
+ const segments = reason
284
+ .split(/[,,。.!!??、\n;;]/)
285
+ .map(s => s.trim())
286
+ .filter(s => s.length >= MIN_LENGTH && s.length <= MAX_LENGTH);
287
+ return [...new Set(segments)].slice(0, MAX_PHRASES);
288
+ }
@@ -55,6 +55,14 @@ export interface EvolutionPrincipleEntry extends CorePrincipleEntry {
55
55
  export interface AppendSystemContextParts {
56
56
  behavioralConstraints?: string;
57
57
  projectContext?: string;
58
+ /**
59
+ * PRI-467: Intent Engineering friction block. Bounded + escaped INTENT.md
60
+ * reference. Positioned after projectContext (stable reference data, lower
61
+ * priority than principles) and before workingMemory (volatile per-session
62
+ * state). Only populated when intent_engineering flag is on and INTENT.md
63
+ * is valid.
64
+ */
65
+ intentBlock?: string;
58
66
  workingMemory?: string;
59
67
  thinkingOs?: string;
60
68
  evolutionPrinciples?: string;
@@ -11,7 +11,7 @@ import { selectPrinciplesForInjection, DEFAULT_PRINCIPLE_BUDGET } from '../core/
11
11
  import { getCachedMaskedPrincipleSet, WorkflowFunnelLoader, PiAiRuntimeAdapter, EmpathyObserver, AgentScheduler, RUNTIME_V2_PRINCIPLE_BUDGET, trimToBudget, renderPrinciplesToDirectives } from '@principles/core/runtime-v2';
12
12
  import { truncateInjectionToBudget } from '@principles/core/prompt-builder';
13
13
  import { PromptActivationReader } from '../core/runtime-v2-prompt-activation-reader.js';
14
- import { matchEmpathyKeywords, loadKeywordStore, saveKeywordStore, getKeywordStoreSummary, } from '../core/empathy-keyword-matcher.js';
14
+ import { matchEmpathyKeywords, loadKeywordStore, saveKeywordStore, applyKeywordUpdates, getKeywordStoreSummary, } from '../core/empathy-keyword-matcher.js';
15
15
  import { severityToPenalty, DEFAULT_EMPATHY_KEYWORD_CONFIG } from '../core/empathy-types.js';
16
16
  import { evaluatePainDiagnosticGate } from '../core/pain-diagnostic-gate.js';
17
17
  import { emitPainDetectedEvent, buildTrajectoryEvidence } from './pain.js';
@@ -20,10 +20,12 @@ import { isSharedCooldownActive, markSharedEpisodeAsDiagnosed } from './trigger-
20
20
  import { buildEmpathyObservation, resolveSourceKind } from './raw-observation-adapter.js';
21
21
  import { evaluateEvidenceTriage } from './triage-adapter.js';
22
22
  import { loadFeatureFlagFromConfig } from '../core/pd-config-loader.js';
23
+ import { safeReadIntentDoc, resetIntentDocCacheForTest } from '../core/intent-doc-reader.js';
24
+ import { buildIntentFrictionBlock } from '@principles/core/runtime-v2';
23
25
  import { CorrectionCueLearner } from '../core/correction-cue-learner.js';
24
26
  import { detectCorrectionCue as coreDetectCorrectionCue, escapeXml, extractMessageContent, isMinimalTrigger, } from '@principles/core/prompt-builder';
25
27
  import { sanitizeForEvidence } from './message-sanitize.js';
26
- import { buildAgentIdentity, buildEmpathySilenceConstraint, extractUserMessageFromPrompt, assembleHeartbeatChecklist, formatCorePrinciples, formatEvolutionPrinciples, assembleAppendSystemContext, } from './prompt-helpers.js';
28
+ import { buildAgentIdentity, buildEmpathySilenceConstraint, extractUserMessageFromPrompt, assembleHeartbeatChecklist, formatCorePrinciples, formatEvolutionPrinciples, assembleAppendSystemContext, extractPhrasesFromReason, } from './prompt-helpers.js';
27
29
  // ---------------------------------------------------------------------------
28
30
  // Static file cache — avoids re-reading rarely-changing files every message
29
31
  // ---------------------------------------------------------------------------
@@ -103,10 +105,12 @@ export function resetPromptStateForTest(workspaceDir) {
103
105
  if (workspaceDir) {
104
106
  _staticFileCache.delete(workspaceDir);
105
107
  _empathyState.delete(workspaceDir);
108
+ resetIntentDocCacheForTest(workspaceDir);
106
109
  }
107
110
  else {
108
111
  _staticFileCache.clear();
109
112
  _empathyState.clear();
113
+ resetIntentDocCacheForTest();
110
114
  }
111
115
  }
112
116
  function parseContextInjectionConfig(value) {
@@ -301,6 +305,8 @@ export async function handleBeforePromptBuild(event, ctx) {
301
305
  // Increment turn counter (Finding #3: session.turnCount doesn't exist)
302
306
  empathyState.turnCounter++;
303
307
  const turnCount = empathyState.turnCounter;
308
+ const painTrigger = wctx.config.get('thresholds.pain_trigger') || 40;
309
+ const highGfiThreshold = Math.max(wctx.config.get('severity_thresholds.high') || 70, painTrigger + 30);
304
310
  if (matchResult.matched) {
305
311
  const penalty = severityToPenalty(matchResult.severity, DEFAULT_EMPATHY_KEYWORD_CONFIG);
306
312
  // trackFriction signature: (sessionId, deltaF: number, hash: string, workspaceDir?, options?)
@@ -310,8 +316,6 @@ export async function handleBeforePromptBuild(event, ctx) {
310
316
  logger?.info?.(`[PD:Empathy] MATCH: "${matchResult.matchedTerms.join(', ')}" → severity=${matchResult.severity}, score=${matchResult.score.toFixed(2)}, penalty=${penalty}`);
311
317
  const currentSession = getSession(sessionId);
312
318
  const currentGfi = currentSession?.currentGfi ?? 0;
313
- const painTrigger = wctx.config.get('thresholds.pain_trigger') || 40;
314
- const highGfiThreshold = Math.max(wctx.config.get('severity_thresholds.high') || 70, painTrigger + 30);
315
319
  if (currentGfi >= highGfiThreshold) {
316
320
  const gfiPainScore = Math.min(Math.round(currentGfi), 60);
317
321
  logger?.info?.(`[PD:Empathy] GFI-TRIGGERED: currentGfi=${currentGfi.toFixed(1)} >= highGfi=${highGfiThreshold}, emitting pain signal (score=${gfiPainScore})`);
@@ -447,7 +451,9 @@ export async function handleBeforePromptBuild(event, ctx) {
447
451
  }
448
452
  }
449
453
  }
450
- // Trigger asynchronous background Empathy Observer deep analysis (Zero Latency)
454
+ }
455
+ else {
456
+ // ── Pipeline: Observer only runs when keyword matcher misses ──
451
457
  const observer = resolveEmpathyObserver(wctx, logger);
452
458
  if (observer) {
453
459
  const scheduler = new AgentScheduler();
@@ -456,14 +462,40 @@ export async function handleBeforePromptBuild(event, ctx) {
456
462
  mode: 'realtime',
457
463
  runner: observer,
458
464
  });
459
- logger?.info?.(`[PD:Empathy] Triggering background Empathy Observer deep analysis for message: "${msgPreview}"`);
465
+ logger?.info?.(`[PD:Empathy] Pipeline: Triggering background Empathy Observer for unmatched message: "${msgPreview}"`);
460
466
  void scheduler.dispatch('empathy-observer', { userMessage: latestUserMessage })
461
467
  .then(async (result) => {
462
468
  if (result.damageDetected) {
463
- logger?.info?.(`[PD:Empathy] Background Empathy Observer detected damage. Severity: ${result.severity}, Reason: ${result.reason}`);
469
+ logger?.info?.(`[PD:Empathy] Pipeline: Background Empathy Observer detected damage. Severity: ${result.severity}, Reason: ${result.reason}`);
464
470
  // ── Persistence Contract ──
465
471
  const painScore = scoreFromSeverityForSpec(result.severity, wctx);
466
472
  trackFriction(sessionId, painScore, `observer_empathy_${result.severity}`, workspaceDir, { source: 'user_empathy' });
473
+ // ── Pipeline: feed back newly detected expressions into keyword store ──
474
+ if (result.reason) {
475
+ const rawLang = wctx.config.get('language');
476
+ const lang = rawLang === 'en' ? 'en' : 'zh';
477
+ const phrases = extractPhrasesFromReason(result.reason, lang);
478
+ if (phrases.length > 0) {
479
+ const updates = {};
480
+ for (const phrase of phrases) {
481
+ if (!Object.hasOwn(keywordStore.terms, phrase)) {
482
+ updates[phrase] = {
483
+ action: 'add',
484
+ weight: 0.4,
485
+ falsePositiveRate: 0.3,
486
+ reasoning: `Discovered by empathy observer: ${result.reason.substring(0, 100)}`,
487
+ };
488
+ }
489
+ }
490
+ if (Object.keys(updates).length > 0) {
491
+ const { added } = applyKeywordUpdates(keywordStore, updates);
492
+ if (added > 0) {
493
+ saveKeywordStore(wctx.stateDir, keywordStore);
494
+ logger?.info?.(`[PD:Empathy] Pipeline: added ${added} new terms from observer feedback`);
495
+ }
496
+ }
497
+ }
498
+ }
467
499
  const eventId = `emp_obs_${Date.now()}_${Math.random().toString(36).substring(2, 8)}`;
468
500
  wctx.eventLog.recordPainSignal(sessionId, {
469
501
  score: painScore,
@@ -520,7 +552,7 @@ export async function handleBeforePromptBuild(event, ctx) {
520
552
  const sourceKind = resolveSourceKind(rawObs);
521
553
  const triage = evaluateEvidenceTriage(sourceKind, freshGfiPainScore);
522
554
  if (triage.decision !== 'admit') {
523
- logger?.info?.(`[PD:Empathy] Observer triage ${triage.decision}: ${triage.reason}`);
555
+ logger?.info?.(`[PD:Empathy] Pipeline observer triage ${triage.decision}: ${triage.reason}`);
524
556
  }
525
557
  else {
526
558
  const cooldownActive = isSharedCooldownActive(sourceKind, sessionId, 'empathy_gfi_observer');
@@ -534,7 +566,7 @@ export async function handleBeforePromptBuild(event, ctx) {
534
566
  });
535
567
  if (triggerDecision.shouldCreateDiagnosticTask) {
536
568
  markSharedEpisodeAsDiagnosed(sourceKind, sessionId, 'empathy_gfi_observer');
537
- logger?.info?.(`[PD:Empathy] Gate B approved (observer), calling emitPainDetectedEvent...`);
569
+ logger?.info?.(`[PD:Empathy] Pipeline Gate B approved (observer), calling emitPainDetectedEvent...`);
538
570
  try {
539
571
  const evidence = buildTrajectoryEvidence(wctx, sessionId);
540
572
  // PRI-453: Reuse observerPainId for lineage consistency —
@@ -558,11 +590,11 @@ export async function handleBeforePromptBuild(event, ctx) {
558
590
  }, { recordObservability: false });
559
591
  }
560
592
  catch (emitErr) {
561
- logger?.error?.(`[PD:Empathy] FAILED to emit observer-triggered pain event: ${String(emitErr)}`);
593
+ logger?.error?.(`[PD:Empathy] Pipeline FAILED to emit observer-triggered pain event: ${String(emitErr)}`);
562
594
  }
563
595
  }
564
596
  else {
565
- logger?.info?.(`[PD:Empathy] Gate B skipped (observer): ${triggerDecision.reason}`);
597
+ logger?.info?.(`[PD:Empathy] Pipeline Gate B skipped (observer): ${triggerDecision.reason}`);
566
598
  }
567
599
  }
568
600
  }
@@ -582,7 +614,7 @@ export async function handleBeforePromptBuild(event, ctx) {
582
614
  },
583
615
  });
584
616
  if (gate.shouldDiagnose) {
585
- logger?.info?.(`[PD:Empathy] GFI threshold crossed after background observer. Emitting pain signal...`);
617
+ logger?.info?.(`[PD:Empathy] Pipeline GFI threshold crossed after background observer. Emitting pain signal...`);
586
618
  try {
587
619
  const evidence = buildTrajectoryEvidence(wctx, sessionId);
588
620
  // PRI-453: Reuse observerPainId for lineage consistency —
@@ -606,22 +638,20 @@ export async function handleBeforePromptBuild(event, ctx) {
606
638
  }, { recordObservability: false });
607
639
  }
608
640
  catch (emitErr) {
609
- logger?.error?.(`[PD:Empathy] FAILED to emit observer-triggered pain event: ${String(emitErr)}`);
641
+ logger?.error?.(`[PD:Empathy] Pipeline FAILED to emit observer-triggered pain event: ${String(emitErr)}`);
610
642
  }
611
643
  }
612
644
  }
613
645
  }
614
646
  }
615
647
  else {
616
- logger?.info?.(`[PD:Empathy] Background Empathy Observer did not detect any damage.`);
648
+ logger?.info?.(`[PD:Empathy] Pipeline: Background Empathy Observer did not detect any damage.`);
617
649
  }
618
650
  })
619
651
  .catch((err) => {
620
- logger?.warn?.(`[PD:Empathy] Background analysis failed or rejected: ${String(err)}`);
652
+ logger?.warn?.(`[PD:Empathy] Pipeline: Background analysis failed or rejected: ${String(err)}`);
621
653
  });
622
654
  }
623
- }
624
- else {
625
655
  // Log unmatched messages periodically for coverage analysis
626
656
  if (turnCount > 0 && turnCount % 50 === 0) {
627
657
  const sampleMsg = latestUserMessage.substring(0, 80).replace(/\n/g, ' ');
@@ -871,11 +901,38 @@ export async function handleBeforePromptBuild(event, ctx) {
871
901
  catch (e) {
872
902
  logger?.warn?.(`[PD:RuntimeV2] Failed to read Runtime V2 prompt activations: ${String(e)}`);
873
903
  }
904
+ // ── PRI-467: Intent Engineering — INTENT.md friction block injection ──
905
+ // SPEC §5: flag off → no fs access, no cache access, no injection, no telemetry.
906
+ // SPEC §13.1: inject only when flag on + INTENT.md exists + safeReadIntentDoc ok=true.
907
+ // SPEC §14.1 Mode A: prompt-only — no output-hook capture, no check_emitted counter.
908
+ let intentBlockContent;
909
+ try {
910
+ const intentFlag = loadFeatureFlagFromConfig(workspaceDir, 'intent_engineering', logger);
911
+ if (intentFlag.enabled) {
912
+ const intentResult = safeReadIntentDoc(workspaceDir, { logger });
913
+ if (intentResult.ok && intentResult.doc) {
914
+ const block = buildIntentFrictionBlock({ rawIntentMd: intentResult.doc.raw });
915
+ if (block.length > 0) {
916
+ intentBlockContent = block;
917
+ }
918
+ }
919
+ else if (!intentResult.ok && intentResult.reason !== 'not_found') {
920
+ // SPEC §13.1: missing file is silent (no debug noise). Other degraded
921
+ // paths (oversized, read_error, flag_disabled) log a debug reason.
922
+ logger?.debug?.(`[PD:Intent] INTENT.md injection skipped: reason=${intentResult.reason ?? 'unknown'}, nextAction=${intentResult.nextAction ?? 'none'}`);
923
+ }
924
+ }
925
+ }
926
+ catch (intentErr) {
927
+ // ERR-002 — fail-open: never let INTENT injection break the prompt hook.
928
+ logger?.warn?.(`[PD:Intent] INTENT injection failed, skipping: ${String(intentErr)}`);
929
+ }
874
930
  // Build appendSystemContext with recency effect
875
- // Content order (most important last): behavioral_constraints -> project_context -> working_memory -> reflection_log -> thinking_os -> principles
931
+ // Content order (most important last): behavioral_constraints -> project_context -> intent_block -> working_memory -> reflection_log -> thinking_os -> principles
876
932
  appendSystemContext = assembleAppendSystemContext({
877
933
  behavioralConstraints: shouldInjectBehavioralConstraints ? empathySilenceConstraint : undefined,
878
934
  projectContext: projectContextContent || undefined,
935
+ intentBlock: intentBlockContent,
879
936
  workingMemory: workingMemoryContent || undefined,
880
937
  thinkingOs: thinkingOsContent || undefined,
881
938
  evolutionPrinciples: evolutionPrinciplesContent || undefined,
@@ -892,10 +949,12 @@ export async function handleBeforePromptBuild(event, ctx) {
892
949
  // routing helpers deleted per PRI-448. No routing-related content is injected.
893
950
  // ──── 8. SIZE GUARD ────
894
951
  // Delegates to @principles/core/prompt-builder/truncateInjectionToBudget
895
- // which handles priority stripping: project_context → thinking_os
896
- // evolution_principles → reflection_log → reason: truncation → fallback.
952
+ // which handles priority stripping: project_context → intent_block
953
+ // thinking_os → evolution_principles → reflection_log → reason: truncation → fallback.
954
+ // PRI-467: intentBlockContent is passed so the guard can strip INTENT by
955
+ // exact match before falling back to the nuclear option.
897
956
  const result = truncateInjectionToBudget(prependSystemContext, prependContext, appendSystemContext, {
898
- blocks: { projectContextContent, thinkingOsContent, evolutionPrinciplesContent },
957
+ blocks: { projectContextContent, intentBlockContent, thinkingOsContent, evolutionPrinciplesContent },
899
958
  });
900
959
  prependSystemContext = result.prependSystemContext;
901
960
  prependContext = result.prependContext;
@@ -45,6 +45,8 @@ declare const plugin: {
45
45
  description: string;
46
46
  register(api: OpenClawPluginApi): void;
47
47
  };
48
- export { PrincipleTreeLedgerAdapter } from './core/principle-tree-ledger-adapter.js';
48
+ export { PrincipleTreeLedgerAdapter } from '@principles/core/runtime-v2';
49
49
  export { loadFeatureFlagFromWorkspace, isRecord };
50
+ export { initTrajectorySchema } from './core/trajectory.js';
51
+ export { initWorkflowSchema } from './service/subagent-workflow/workflow-store.js';
50
52
  export default plugin;
@@ -31,7 +31,6 @@ import { CorrectionObserverService } from './service/correction-observer-service
31
31
  import { InternalizationAutoConsumerService } from './service/internalization-auto-consumer-service.js';
32
32
  import { TrajectoryService } from './service/trajectory-service.js';
33
33
  import { PDTaskService } from './core/pd-task-service.js';
34
- import { CentralSyncService } from './service/central-sync-service.js';
35
34
  import { ensureWorkspaceTemplates } from './core/init.js';
36
35
  import { migrateDirectoryStructure } from './core/migration.js';
37
36
  import { migrateStaleWorkspaceGuidance } from './core/workspace-guidance-migrator.js';
@@ -408,9 +407,6 @@ const plugin = {
408
407
  const guardedPdTask = guardService('service:pd-task', PDTaskService, api.logger);
409
408
  if (guardedPdTask)
410
409
  api.registerService(guardedPdTask);
411
- const guardedCentralSync = guardService('service:central-sync', CentralSyncService, api.logger);
412
- if (guardedCentralSync)
413
- api.registerService(guardedCentralSync);
414
410
  const guardedAutoConsumer = guardService('service:internalization-auto-consumer', InternalizationAutoConsumerService, api.logger);
415
411
  if (guardedAutoConsumer)
416
412
  api.registerService(guardedAutoConsumer);
@@ -745,7 +741,15 @@ const plugin = {
745
741
  });
746
742
  }
747
743
  };
748
- export { PrincipleTreeLedgerAdapter } from './core/principle-tree-ledger-adapter.js';
744
+ // PrincipleTreeLedgerAdapter is exported from @principles/core/runtime-v2 (canonical,
745
+ // consolidated in PRI-459). The plugin-local duplicate was removed; re-export the core
746
+ // symbol so any external consumer importing from the plugin still resolves it.
747
+ export { PrincipleTreeLedgerAdapter } from '@principles/core/runtime-v2';
749
748
  /* istanbul ignore next — test exports for evolution worker gate */
750
749
  export { loadFeatureFlagFromWorkspace, isRecord };
750
+ // Schema initialization exports for `pd runtime init` (unified DB init).
751
+ // These functions open the DB in write mode, apply the full schema, and close the DB.
752
+ // They do NOT run runtime side-effects (importLegacyArtifacts, pruneUnreferencedBlobs).
753
+ export { initTrajectorySchema } from './core/trajectory.js';
754
+ export { initWorkflowSchema } from './service/subagent-workflow/workflow-store.js';
751
755
  export default plugin;
@@ -16,7 +16,7 @@ function pushWarning(warnings, message) {
16
16
  }
17
17
  }
18
18
  /**
19
- * YAML-SSOT-03: resolve a dot-path (e.g. 'evolution.nocturnalDreamerCompleted') from dailyStats.
19
+ * YAML-SSOT-03: resolve a dot-path (e.g. 'evolution.rulehostEvaluated') from dailyStats.
20
20
  * Returns { count, resolvable } to distinguish "field not found / non-numeric" from "legitimate zero".
21
21
  */
22
22
  function resolveStatsField(stats, dotPath) {
@@ -28,3 +28,17 @@ export declare class WorkflowStore {
28
28
  recordDuration(workflowId: string, durationMs: number): void;
29
29
  getCompletionDurations(workflowType: string, limit?: number): number[];
30
30
  }
31
+ /**
32
+ * Initialize subagent_workflows.db schema at the given workspace directory.
33
+ *
34
+ * Opens the DB in write mode, applies the full schema (tables + indexes + migrations),
35
+ * then closes the DB. Used by `pd runtime init` for unified DB initialization.
36
+ *
37
+ * Idempotent: safe to call on an existing DB; all CREATE statements use IF NOT EXISTS.
38
+ *
39
+ * @returns list of created/verified table names and any warnings
40
+ */
41
+ export declare function initWorkflowSchema(workspaceDir: string): {
42
+ tables: string[];
43
+ warnings: string[];
44
+ };
@@ -78,8 +78,12 @@ export class WorkflowStore {
78
78
  this.db.exec('ALTER TABLE subagent_workflows ADD COLUMN duration_ms INTEGER');
79
79
  console.info(`[PD:WorkflowStore] Schema migration v${fromVersion} → v${toVersion}: added duration_ms column`);
80
80
  }
81
- catch {
82
- void 0;
81
+ catch (err) {
82
+ // rc-9: surface failure reason instead of silent void 0
83
+ const message = err instanceof Error ? err.message : String(err);
84
+ if (!message.includes('duplicate column name')) {
85
+ console.info(`[PD:WorkflowStore] Schema migration v${fromVersion} → v${toVersion} failed: ${message}`);
86
+ }
83
87
  }
84
88
  }
85
89
  }
@@ -207,3 +211,88 @@ export class WorkflowStore {
207
211
  return rows.map(r => r.duration_ms);
208
212
  }
209
213
  }
214
+ /**
215
+ * Initialize subagent_workflows.db schema at the given workspace directory.
216
+ *
217
+ * Opens the DB in write mode, applies the full schema (tables + indexes + migrations),
218
+ * then closes the DB. Used by `pd runtime init` for unified DB initialization.
219
+ *
220
+ * Idempotent: safe to call on an existing DB; all CREATE statements use IF NOT EXISTS.
221
+ *
222
+ * @returns list of created/verified table names and any warnings
223
+ */
224
+ export function initWorkflowSchema(workspaceDir) {
225
+ const resolvedDir = path.resolve(workspaceDir);
226
+ const stateDir = path.join(resolvedDir, '.state');
227
+ const dbPath = path.join(stateDir, 'subagent_workflows.db');
228
+ const warnings = [];
229
+ const tables = ['schema_version', 'subagent_workflows', 'subagent_workflow_events'];
230
+ fs.mkdirSync(stateDir, { recursive: true });
231
+ const db = new Database(dbPath);
232
+ try {
233
+ db.pragma('journal_mode = WAL');
234
+ db.pragma('foreign_keys = ON');
235
+ db.pragma('synchronous = NORMAL');
236
+ db.pragma(`busy_timeout = ${DEFAULT_BUSY_TIMEOUT_MS}`);
237
+ db.exec(`
238
+ CREATE TABLE IF NOT EXISTS schema_version (
239
+ version INTEGER NOT NULL
240
+ );
241
+ CREATE TABLE IF NOT EXISTS subagent_workflows (
242
+ workflow_id TEXT PRIMARY KEY,
243
+ workflow_type TEXT NOT NULL,
244
+ transport TEXT NOT NULL,
245
+ parent_session_id TEXT NOT NULL,
246
+ child_session_key TEXT NOT NULL,
247
+ run_id TEXT,
248
+ state TEXT NOT NULL DEFAULT 'pending',
249
+ cleanup_state TEXT NOT NULL DEFAULT 'none',
250
+ created_at INTEGER NOT NULL,
251
+ updated_at INTEGER NOT NULL,
252
+ last_observed_at INTEGER,
253
+ duration_ms INTEGER,
254
+ metadata_json TEXT NOT NULL DEFAULT '{}'
255
+ );
256
+ CREATE TABLE IF NOT EXISTS subagent_workflow_events (
257
+ workflow_id TEXT NOT NULL,
258
+ event_type TEXT NOT NULL,
259
+ from_state TEXT,
260
+ to_state TEXT NOT NULL,
261
+ reason TEXT NOT NULL,
262
+ payload_json TEXT NOT NULL DEFAULT '{}',
263
+ created_at INTEGER NOT NULL,
264
+ FOREIGN KEY (workflow_id) REFERENCES subagent_workflows(workflow_id) ON DELETE CASCADE
265
+ );
266
+ CREATE INDEX IF NOT EXISTS idx_workflows_parent_session ON subagent_workflows(parent_session_id);
267
+ CREATE INDEX IF NOT EXISTS idx_workflows_child_session ON subagent_workflows(child_session_key);
268
+ CREATE INDEX IF NOT EXISTS idx_workflows_state ON subagent_workflows(state);
269
+ CREATE INDEX IF NOT EXISTS idx_workflows_type ON subagent_workflows(workflow_type);
270
+ CREATE INDEX IF NOT EXISTS idx_events_workflow ON subagent_workflow_events(workflow_id);
271
+ `);
272
+ // Run migrations to bring schema up to SCHEMA_VERSION
273
+ const row = db.prepare('SELECT version FROM schema_version LIMIT 1').get();
274
+ const currentVersion = row?.version ?? 0;
275
+ if (currentVersion === 0) {
276
+ db.prepare('INSERT INTO schema_version (version) VALUES (?)').run(SCHEMA_VERSION);
277
+ }
278
+ else if (currentVersion < SCHEMA_VERSION) {
279
+ // Inline migration logic (mirrors WorkflowStore.runMigrations)
280
+ if (currentVersion < 2 && SCHEMA_VERSION >= 2) {
281
+ try {
282
+ db.exec('ALTER TABLE subagent_workflows ADD COLUMN duration_ms INTEGER');
283
+ }
284
+ catch (err) {
285
+ const message = err instanceof Error ? err.message : String(err);
286
+ if (!message.includes('duplicate column name')) {
287
+ warnings.push(`migration v${currentVersion}→v${SCHEMA_VERSION} duration_ms failed: ${message}`);
288
+ }
289
+ }
290
+ }
291
+ db.prepare('UPDATE schema_version SET version = ?').run(SCHEMA_VERSION);
292
+ }
293
+ return { tables, warnings };
294
+ }
295
+ finally {
296
+ db.close();
297
+ }
298
+ }
@@ -1,2 +1,2 @@
1
- export type { EventType, EventCategory, EventLogEntry, ToolCallEventData, PainSignalEventData, RuleMatchEventData, RulePromotionEventData, HookExecutionEventData, GateBlockEventData, GateBypassEventData, PlanApprovalEventData, EvolutionTaskEventData, EmpathyRollbackEventData, HeartbeatDiagnosisEventData, DiagnosisTaskEventData, DiagnosticianReportEventData, PrincipleCandidateEventData, RuleEnforcedEventData, RuleHostEvaluatedEventData, RuleHostBlockedEventData, RuleHostRequireApprovalEventData, RuleHostAutoCorrectProposedEventData, RuleHostAutoCorrectAppliedEventData, RuntimeV2PromptActivationsInjectedEventData, RuleHostUnhealthyEventData, ToolCallStats, ErrorStats, EmpathyEventStats, GfiStats, EvolutionStats as EventEvolutionStats, HookStats, DailyStats, } from '@principles/core/runtime-v2';
1
+ export type { EventType, EventCategory, EventLogEntry, ToolCallEventData, PainSignalEventData, RulePromotionEventData, HookExecutionEventData, GateBlockEventData, GateBypassEventData, PlanApprovalEventData, EvolutionTaskEventData, EmpathyRollbackEventData, HeartbeatDiagnosisEventData, DiagnosisTaskEventData, DiagnosticianReportEventData, PrincipleCandidateEventData, RuleEnforcedEventData, RuleHostEvaluatedEventData, RuleHostBlockedEventData, RuleHostRequireApprovalEventData, RuleHostAutoCorrectProposedEventData, RuleHostAutoCorrectAppliedEventData, RuntimeV2PromptActivationsInjectedEventData, RuleHostUnhealthyEventData, ToolCallStats, ErrorStats, EmpathyEventStats, GfiStats, EvolutionStats as EventEvolutionStats, HookStats, DailyStats, } from '@principles/core/runtime-v2';
2
2
  export { createEmptyDailyStats, } from '@principles/core/runtime-v2';
@@ -3,9 +3,13 @@
3
3
  "version": "1.74.1",
4
4
  "description": "Native OpenClaw plugin for Principles Disciple",
5
5
  "type": "module",
6
- "main": "./dist/bundle.js",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
7
8
  "exports": {
8
- ".": "./dist/bundle.js"
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ }
9
13
  },
10
14
  "repository": {
11
15
  "type": "git",
@@ -47,7 +51,6 @@
47
51
  "lint": "eslint \"src/**/*.ts\"",
48
52
  "bootstrap-rules": "node scripts/bootstrap-rules.mjs",
49
53
  "compile-principles": "node scripts/compile-principles.mjs",
50
- "validate-live-path": "tsx scripts/validate-live-path.ts",
51
54
  "sync-plugin": "node scripts/sync-plugin.mjs"
52
55
  },
53
56
  "devDependencies": {
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  /**
4
- * Nocturnal Pipeline — End-to-End Acceptance Test
4
+ * PD Pipeline — End-to-End Acceptance Test
5
5
  *
6
- * Verifies that all components of the Nocturnal reflection pipeline
6
+ * Verifies that all components of the PD reflection pipeline
7
7
  * work correctly in a real environment (not unit tests).
8
8
  *
9
9
  * Usage:
@@ -71,7 +71,7 @@ function main() {
71
71
  process.exit(1);
72
72
  }
73
73
 
74
- console.log('\n🧪 Nocturnal Pipeline Acceptance Test');
74
+ console.log('\n🧪 PD Pipeline Acceptance Test');
75
75
  console.log('═'.repeat(55));
76
76
  console.log(`Workspace: ${workspaceDir}`);
77
77
  console.log(`Database: ${dbPath}\n`);
@@ -1,32 +0,0 @@
1
- import type { LedgerAdapter, LedgerPrincipleEntry } from '@principles/core/runtime-v2';
2
- /**
3
- * PrincipleTreeLedgerAdapter — bridges 11-field LedgerPrincipleEntry to 18+ field LedgerPrinciple.
4
- *
5
- * This adapter maintains an in-memory idempotency map. Create once and reuse
6
- * across calls within the same process lifetime. Do not create a new instance
7
- * per intake call.
8
- */
9
- export declare class PrincipleTreeLedgerAdapter implements LedgerAdapter {
10
- #private;
11
- constructor(opts: {
12
- stateDir: string;
13
- });
14
- /**
15
- * Write a probation entry to the ledger.
16
- *
17
- * Idempotency: if the same candidateId was already written, returns the
18
- * existing entry without writing again.
19
- *
20
- * @throws CandidateIntakeError with code LEDGER_WRITE_FAILED on write failure.
21
- */
22
- writeProbationEntry(entry: LedgerPrincipleEntry): LedgerPrincipleEntry;
23
- /**
24
- * Check if a ledger entry already exists for a given candidate.
25
- *
26
- * Queries both the in-memory Map (fast path for same-process repeat calls)
27
- * and the ledger file (for cross-process idempotency across CLI invocations).
28
- *
29
- * @returns The existing LedgerPrincipleEntry if found, null otherwise.
30
- */
31
- existsForCandidate(candidateId: string): LedgerPrincipleEntry | null;
32
- }