create-principles-disciple 1.95.0 → 1.97.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 (263) hide show
  1. package/console/dist/server/config/pd-config-store.js +49 -12
  2. package/console/dist/server/index.js +4 -3
  3. package/console/dist/server/models/IntentPageModel.d.ts +36 -2
  4. package/console/dist/server/models/IntentPageModel.js +213 -11
  5. package/console/dist/server/routes/intent.d.ts +5 -1
  6. package/console/dist/server/routes/intent.js +200 -12
  7. package/console/dist/types.d.ts +1 -0
  8. package/console/dist/ui/App.js +0 -53
  9. package/console/dist/ui/api.d.ts +18 -4
  10. package/console/dist/ui/api.js +38 -5
  11. package/console/dist/ui/components/layout/app-sidebar.js +12 -12
  12. package/console/dist/ui/components/ui/badge.d.ts +1 -1
  13. package/console/dist/ui/i18n/en.json +142 -3
  14. package/console/dist/ui/i18n/zh-CN.json +142 -3
  15. package/console/dist/ui/pages/control-center/AgentCard.d.ts +31 -0
  16. package/console/dist/ui/pages/control-center/AgentCard.js +156 -0
  17. package/console/dist/ui/pages/control-center/AgentGroup.d.ts +26 -0
  18. package/console/dist/ui/pages/control-center/AgentGroup.js +38 -0
  19. package/console/dist/ui/pages/control-center/ControlCenterPage.js +77 -41
  20. package/console/dist/ui/pages/control-center/WorkflowDiagram.d.ts +17 -0
  21. package/console/dist/ui/pages/control-center/WorkflowDiagram.js +55 -0
  22. package/console/dist/ui/pages/intent/IntentOnboarding.d.ts +67 -0
  23. package/console/dist/ui/pages/intent/IntentOnboarding.js +289 -0
  24. package/console/dist/ui/pages/intent/IntentPage.js +117 -6
  25. package/console/dist/ui/utils/agent-metadata.d.ts +58 -0
  26. package/console/dist/ui/utils/agent-metadata.js +275 -0
  27. package/console/dist/ui/utils/control-center-helpers.d.ts +19 -0
  28. package/console/dist/ui/utils/control-center-helpers.js +37 -0
  29. package/console/dist/ui/utils/validators.d.ts +37 -0
  30. package/console/dist/ui/utils/validators.js +130 -0
  31. package/console/dist/web/assets/app.css +360 -3
  32. package/console/dist/web/assets/app.js +2952 -1143
  33. package/console/package.json +1 -1
  34. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js +27 -35
  35. package/core/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
  36. package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js +85 -7
  37. package/core/dist/runtime-v2/__tests__/evaluator-runner-vslice-v2.test.js.map +1 -1
  38. package/core/dist/runtime-v2/__tests__/golden-trace-replay-validator.test.js +70 -0
  39. package/core/dist/runtime-v2/__tests__/golden-trace-replay-validator.test.js.map +1 -1
  40. package/core/dist/runtime-v2/__tests__/golden-trace.test.js +136 -1
  41. package/core/dist/runtime-v2/__tests__/golden-trace.test.js.map +1 -1
  42. package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.d.ts +2 -0
  43. package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.d.ts.map +1 -0
  44. package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.js +211 -0
  45. package/core/dist/runtime-v2/__tests__/v2-adversarial-cases.test.js.map +1 -0
  46. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js +93 -0
  47. package/core/dist/runtime-v2/activation/writers/__tests__/rule-host-writer.test.js.map +1 -1
  48. package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts +11 -0
  49. package/core/dist/runtime-v2/activation/writers/rule-host-writer.d.ts.map +1 -1
  50. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js +22 -0
  51. package/core/dist/runtime-v2/activation/writers/rule-host-writer.js.map +1 -1
  52. package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts +2 -0
  53. package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts.map +1 -0
  54. package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js +74 -0
  55. package/core/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js.map +1 -0
  56. package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts +2 -0
  57. package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.d.ts.map +1 -0
  58. package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js +246 -0
  59. package/core/dist/runtime-v2/feature-flags/__tests__/surface-guard-policy.test.js.map +1 -0
  60. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
  61. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js +7 -0
  62. package/core/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
  63. package/core/dist/runtime-v2/feature-flags/index.d.ts +2 -0
  64. package/core/dist/runtime-v2/feature-flags/index.d.ts.map +1 -1
  65. package/core/dist/runtime-v2/feature-flags/index.js +2 -0
  66. package/core/dist/runtime-v2/feature-flags/index.js.map +1 -1
  67. package/{plugin/dist/core/surface-guard.d.ts → core/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts} +15 -5
  68. package/core/dist/runtime-v2/feature-flags/surface-guard-policy.d.ts.map +1 -0
  69. package/{plugin/dist/core/surface-guard.js → core/dist/runtime-v2/feature-flags/surface-guard-policy.js} +14 -2
  70. package/core/dist/runtime-v2/feature-flags/surface-guard-policy.js.map +1 -0
  71. package/core/dist/runtime-v2/golden-trace-replay-validator.js +1 -1
  72. package/core/dist/runtime-v2/golden-trace-replay-validator.js.map +1 -1
  73. package/core/dist/runtime-v2/golden-trace.d.ts +19 -3
  74. package/core/dist/runtime-v2/golden-trace.d.ts.map +1 -1
  75. package/core/dist/runtime-v2/golden-trace.js +2 -0
  76. package/core/dist/runtime-v2/golden-trace.js.map +1 -1
  77. package/core/dist/runtime-v2/index.d.ts +15 -3
  78. package/core/dist/runtime-v2/index.d.ts.map +1 -1
  79. package/core/dist/runtime-v2/index.js +11 -2
  80. package/core/dist/runtime-v2/index.js.map +1 -1
  81. package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts +2 -0
  82. package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.d.ts.map +1 -0
  83. package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js +88 -0
  84. package/core/dist/runtime-v2/intent/__tests__/intent-doc-version.test.js.map +1 -0
  85. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js +91 -1
  86. package/core/dist/runtime-v2/intent/__tests__/intent-doc.test.js.map +1 -1
  87. package/core/dist/runtime-v2/intent/index.d.ts +2 -0
  88. package/core/dist/runtime-v2/intent/index.d.ts.map +1 -1
  89. package/core/dist/runtime-v2/intent/index.js +2 -0
  90. package/core/dist/runtime-v2/intent/index.js.map +1 -1
  91. package/core/dist/runtime-v2/intent/intent-browser.d.ts +23 -0
  92. package/core/dist/runtime-v2/intent/intent-browser.d.ts.map +1 -0
  93. package/core/dist/runtime-v2/intent/intent-browser.js +21 -0
  94. package/core/dist/runtime-v2/intent/intent-browser.js.map +1 -0
  95. package/core/dist/runtime-v2/intent/intent-doc-version.d.ts +28 -0
  96. package/core/dist/runtime-v2/intent/intent-doc-version.d.ts.map +1 -0
  97. package/core/dist/runtime-v2/intent/intent-doc-version.js +21 -0
  98. package/core/dist/runtime-v2/intent/intent-doc-version.js.map +1 -0
  99. package/core/dist/runtime-v2/intent/intent-doc.d.ts +17 -1
  100. package/core/dist/runtime-v2/intent/intent-doc.d.ts.map +1 -1
  101. package/core/dist/runtime-v2/intent/intent-doc.js +95 -7
  102. package/core/dist/runtime-v2/intent/intent-doc.js.map +1 -1
  103. package/core/dist/runtime-v2/intent/intent-hash.d.ts +2 -0
  104. package/core/dist/runtime-v2/intent/intent-hash.d.ts.map +1 -0
  105. package/core/dist/runtime-v2/intent/intent-hash.js +10 -0
  106. package/core/dist/runtime-v2/intent/intent-hash.js.map +1 -0
  107. package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js +41 -1
  108. package/core/dist/runtime-v2/internalization/__tests__/artificer-prompt-builder.test.js.map +1 -1
  109. package/core/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js +130 -2
  110. package/core/dist/runtime-v2/internalization/__tests__/artificer-rule-output.test.js.map +1 -1
  111. package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts +2 -0
  112. package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.d.ts.map +1 -0
  113. package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js +228 -0
  114. package/core/dist/runtime-v2/internalization/__tests__/behavior-example-pack.test.js.map +1 -0
  115. package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js +41 -11
  116. package/core/dist/runtime-v2/internalization/__tests__/diag-chain-e2e.test.js.map +1 -1
  117. package/core/dist/runtime-v2/internalization/__tests__/refiner-sandbox-wrapper.test.js +135 -0
  118. package/core/dist/runtime-v2/internalization/__tests__/refiner-sandbox-wrapper.test.js.map +1 -1
  119. package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts +2 -0
  120. package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts.map +1 -0
  121. package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js +449 -0
  122. package/core/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js.map +1 -0
  123. package/core/dist/runtime-v2/internalization/adversarial-case.d.ts.map +1 -1
  124. package/core/dist/runtime-v2/internalization/adversarial-case.js +24 -0
  125. package/core/dist/runtime-v2/internalization/adversarial-case.js.map +1 -1
  126. package/core/dist/runtime-v2/internalization/artificer-output.d.ts +10 -0
  127. package/core/dist/runtime-v2/internalization/artificer-output.d.ts.map +1 -1
  128. package/core/dist/runtime-v2/internalization/artificer-output.js +45 -0
  129. package/core/dist/runtime-v2/internalization/artificer-output.js.map +1 -1
  130. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts +2 -2
  131. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.d.ts.map +1 -1
  132. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js +7 -2
  133. package/core/dist/runtime-v2/internalization/artificer-prompt-builder.js.map +1 -1
  134. package/core/dist/runtime-v2/internalization/behavior-example-pack.d.ts +66 -0
  135. package/core/dist/runtime-v2/internalization/behavior-example-pack.d.ts.map +1 -0
  136. package/core/dist/runtime-v2/internalization/behavior-example-pack.js +183 -0
  137. package/core/dist/runtime-v2/internalization/behavior-example-pack.js.map +1 -0
  138. package/core/dist/runtime-v2/internalization/evaluator-output.d.ts +8 -0
  139. package/core/dist/runtime-v2/internalization/evaluator-output.d.ts.map +1 -1
  140. package/core/dist/runtime-v2/internalization/evaluator-output.js +10 -0
  141. package/core/dist/runtime-v2/internalization/evaluator-output.js.map +1 -1
  142. package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts +17 -0
  143. package/core/dist/runtime-v2/internalization/evaluator-runner.d.ts.map +1 -1
  144. package/core/dist/runtime-v2/internalization/evaluator-runner.js +118 -24
  145. package/core/dist/runtime-v2/internalization/evaluator-runner.js.map +1 -1
  146. package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.d.ts.map +1 -1
  147. package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js +1 -1
  148. package/core/dist/runtime-v2/internalization/refiner-sandbox-wrapper.js.map +1 -1
  149. package/core/dist/runtime-v2/internalization/rule-context-v2.d.ts +61 -0
  150. package/core/dist/runtime-v2/internalization/rule-context-v2.d.ts.map +1 -0
  151. package/core/dist/runtime-v2/internalization/rule-context-v2.js +301 -0
  152. package/core/dist/runtime-v2/internalization/rule-context-v2.js.map +1 -0
  153. package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts +9 -0
  154. package/core/dist/runtime-v2/internalization/rule-host-contracts.d.ts.map +1 -1
  155. package/core/dist/runtime-v2/internalization/v2-adversarial-cases.d.ts +55 -0
  156. package/core/dist/runtime-v2/internalization/v2-adversarial-cases.d.ts.map +1 -0
  157. package/core/dist/runtime-v2/internalization/v2-adversarial-cases.js +131 -0
  158. package/core/dist/runtime-v2/internalization/v2-adversarial-cases.js.map +1 -0
  159. package/core/dist/runtime-v2/pain-signal-observability.d.ts.map +1 -1
  160. package/core/dist/runtime-v2/pain-signal-observability.js +24 -1
  161. package/core/dist/runtime-v2/pain-signal-observability.js.map +1 -1
  162. package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts +2 -0
  163. package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.d.ts.map +1 -0
  164. package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js +95 -0
  165. package/core/dist/runtime-v2/risk/__tests__/risk-calculator-policy.test.js.map +1 -0
  166. package/core/dist/runtime-v2/risk/index.d.ts +7 -0
  167. package/core/dist/runtime-v2/risk/index.d.ts.map +1 -0
  168. package/core/dist/runtime-v2/risk/index.js +6 -0
  169. package/core/dist/runtime-v2/risk/index.js.map +1 -0
  170. package/core/dist/runtime-v2/risk/risk-calculator-policy.d.ts +18 -0
  171. package/core/dist/runtime-v2/risk/risk-calculator-policy.d.ts.map +1 -0
  172. package/core/dist/runtime-v2/risk/risk-calculator-policy.js +47 -0
  173. package/core/dist/runtime-v2/risk/risk-calculator-policy.js.map +1 -0
  174. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts +2 -0
  175. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.d.ts.map +1 -0
  176. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js +83 -0
  177. package/core/dist/runtime-v2/store/intent/__tests__/sqlite-intent-doc-version-store.test.js.map +1 -0
  178. package/core/dist/runtime-v2/store/intent/index.d.ts +2 -1
  179. package/core/dist/runtime-v2/store/intent/index.d.ts.map +1 -1
  180. package/core/dist/runtime-v2/store/intent/index.js +2 -1
  181. package/core/dist/runtime-v2/store/intent/index.js.map +1 -1
  182. package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts +28 -0
  183. package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.d.ts.map +1 -0
  184. package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js +88 -0
  185. package/core/dist/runtime-v2/store/intent/sqlite-intent-doc-version-store.js.map +1 -0
  186. package/core/dist/runtime-v2/store/sqlite-connection.d.ts.map +1 -1
  187. package/core/dist/runtime-v2/store/sqlite-connection.js +14 -0
  188. package/core/dist/runtime-v2/store/sqlite-connection.js.map +1 -1
  189. package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts +2 -0
  190. package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.d.ts.map +1 -0
  191. package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js +149 -0
  192. package/core/dist/runtime-v2/thinking-models/__tests__/thinking-models-policy.test.js.map +1 -0
  193. package/core/dist/runtime-v2/thinking-models/index.d.ts +3 -0
  194. package/core/dist/runtime-v2/thinking-models/index.d.ts.map +1 -0
  195. package/core/dist/runtime-v2/thinking-models/index.js +3 -0
  196. package/core/dist/runtime-v2/thinking-models/index.js.map +1 -0
  197. package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts +73 -0
  198. package/core/dist/runtime-v2/thinking-models/thinking-models-policy.d.ts.map +1 -0
  199. package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js +227 -0
  200. package/core/dist/runtime-v2/thinking-models/thinking-models-policy.js.map +1 -0
  201. package/core/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js +40 -1
  202. package/core/dist/runtime-v2/tools/__tests__/artificer-l2-tool-contract.test.js.map +1 -1
  203. package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.d.ts.map +1 -1
  204. package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js +28 -1
  205. package/core/dist/runtime-v2/tools/artificer-l2-tool-contract.js.map +1 -1
  206. package/core/dist/runtime-v2/tools/artificer-output-typebox.d.ts +3 -0
  207. package/core/dist/runtime-v2/tools/artificer-output-typebox.d.ts.map +1 -1
  208. package/core/dist/runtime-v2/tools/artificer-output-typebox.js +3 -0
  209. package/core/dist/runtime-v2/tools/artificer-output-typebox.js.map +1 -1
  210. package/core/package.json +4 -0
  211. package/package.json +1 -1
  212. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js +74 -3
  213. package/pd-cli/dist/commands/__tests__/intent-flag-wiring.test.js.map +1 -1
  214. package/pd-cli/dist/commands/intent.d.ts +21 -4
  215. package/pd-cli/dist/commands/intent.d.ts.map +1 -1
  216. package/pd-cli/dist/commands/intent.js +88 -27
  217. package/pd-cli/dist/commands/intent.js.map +1 -1
  218. package/plugin/dist/commands/pain.js +2 -2
  219. package/plugin/dist/core/behavior-example-pack-assembler.d.ts +43 -0
  220. package/plugin/dist/core/behavior-example-pack-assembler.js +247 -0
  221. package/plugin/dist/core/intent-doc-reader-adapter.d.ts +13 -5
  222. package/plugin/dist/core/intent-doc-reader-adapter.js +25 -5
  223. package/plugin/dist/core/intent-doc-reader.d.ts +13 -4
  224. package/plugin/dist/core/intent-doc-reader.js +45 -24
  225. package/plugin/dist/core/rule-context-assembler.d.ts +45 -0
  226. package/plugin/dist/core/rule-context-assembler.js +148 -0
  227. package/plugin/dist/core/thinking-models.d.ts +12 -57
  228. package/plugin/dist/core/thinking-models.js +18 -224
  229. package/plugin/dist/core/trajectory-types.d.ts +18 -0
  230. package/plugin/dist/core/trajectory.d.ts +34 -2
  231. package/plugin/dist/core/trajectory.js +103 -0
  232. package/plugin/dist/hooks/gate.js +59 -2
  233. package/plugin/dist/hooks/pain.js +2 -2
  234. package/plugin/dist/hooks/prompt.js +2 -1
  235. package/plugin/dist/index.js +1 -1
  236. package/plugin/package.json +1 -1
  237. package/plugin/dist/core/evolution-migration.d.ts +0 -5
  238. package/plugin/dist/core/evolution-migration.js +0 -65
  239. package/plugin/dist/core/risk-calculator.d.ts +0 -22
  240. package/plugin/dist/core/risk-calculator.js +0 -88
  241. package/plugin/dist/core/rule-host-helpers.d.ts +0 -8
  242. package/plugin/dist/core/rule-host-helpers.js +0 -7
  243. package/plugin/dist/core/rule-host-types.d.ts +0 -7
  244. package/plugin/dist/core/rule-host-types.js +0 -7
  245. package/plugin/dist/core/schema/db-types.d.ts +0 -11
  246. package/plugin/dist/core/schema/db-types.js +0 -5
  247. package/plugin/dist/core/schema/index.d.ts +0 -17
  248. package/plugin/dist/core/schema/index.js +0 -15
  249. package/plugin/dist/core/schema/migration-runner.d.ts +0 -53
  250. package/plugin/dist/core/schema/migration-runner.js +0 -170
  251. package/plugin/dist/core/schema/migrations/001-init-trajectory.d.ts +0 -6
  252. package/plugin/dist/core/schema/migrations/001-init-trajectory.js +0 -190
  253. package/plugin/dist/core/schema/migrations/002-init-central.d.ts +0 -5
  254. package/plugin/dist/core/schema/migrations/002-init-central.js +0 -108
  255. package/plugin/dist/core/schema/migrations/003-init-workflow.d.ts +0 -5
  256. package/plugin/dist/core/schema/migrations/003-init-workflow.js +0 -50
  257. package/plugin/dist/core/schema/migrations/004-add-thinking-and-gfi.d.ts +0 -8
  258. package/plugin/dist/core/schema/migrations/004-add-thinking-and-gfi.js +0 -66
  259. package/plugin/dist/core/schema/migrations/index.d.ts +0 -16
  260. package/plugin/dist/core/schema/migrations/index.js +0 -27
  261. package/plugin/dist/core/schema/schema-definitions.d.ts +0 -46
  262. package/plugin/dist/core/schema/schema-definitions.js +0 -599
  263. package/plugin/scripts/db-migrate.mjs +0 -170
@@ -1,163 +1,20 @@
1
1
  /**
2
- * Thinking Models — Detection Engine
2
+ * Thinking Models — Plugin I/O Adapter (Stage 3 slim)
3
3
  *
4
- * Core principle metadata (id, name, description) comes from the
5
- * Core Principle Registry in @principles/core/runtime-v2.
6
- * Detection patterns are carefully tuned regexes that match AI output text.
4
+ * Pure logic (BUILTIN_PATTERNS, BUILTIN_PATTERN_MAP, getFallbackName,
5
+ * getFallbackDescription, deriveThinkingScenarios, types) lives in
6
+ * @principles/core/runtime-v2/thinking-models.
7
7
  *
8
- * Flow:
9
- * Core Principle Registry (authority) id, name, description
10
- * BUILTIN_PATTERNS (engine) detection regexes per model id
11
- * THINKING_MODELS (merged) full definitions with patterns
8
+ * This file owns only the I/O boundary: reading THINKING_OS.md from a
9
+ * workspace dir and merging it with the builtin patterns. It re-exports
10
+ * the pure functions and types so existing relative imports
11
+ * (../core/thinking-models.js) continue to resolve.
12
12
  */
13
13
  import { loadThinkingOsFromWorkspace, generateDetectionPatterns } from './thinking-os-parser.js';
14
- import { CORE_PRINCIPLES } from '@principles/core/runtime-v2';
15
- const BUILTIN_PATTERNS = [
16
- {
17
- id: 'T-01',
18
- patterns: [
19
- // Thinking process language (AI reasoning output)
20
- /let me (first )?(understand|map|outline|survey|review the (structure|architecture|dependencies))/i,
21
- /before (changing|editing|touching) anything/i,
22
- /让我先(梳理|理解|看看|盘点).*(结构|架构|依赖|全貌)/i,
23
- /在执行任何.*/i,
24
- // Decision directive language (nocturnal artifact betterDecision)
25
- /review (the |)(docs|architecture|structure|requirements|constraints|dependencies|authorization)/i,
26
- /read (the |)(docs|architecture|requirements|constraints|logs?|error|stack)/i,
27
- /check (the |)(docs|architecture|source|authorization|requirements|error)/i,
28
- /understand (the |)(structure|architecture|requirements|constraints|full (context|picture))/i,
29
- /first (to|and|,) (verify|check|review|read|understand|confirm|diagnose)/i,
30
- /(verify|check|review|read|confirm) .+ first/i,
31
- ],
32
- baselineScenarios: ['exploration', 'discovery'],
33
- },
34
- {
35
- id: 'T-02',
36
- patterns: [
37
- // Thinking process language
38
- /(type|test|contract|schema|interface) (constraint|requirement|check|validation)/i,
39
- /(必须|需要).*(遵守|符合|满足).*(类型|测试|契约|接口|规范)/i,
40
- // Decision directive language
41
- /(trust|follow|respect|adhere to|meet) (the |)(constraint|requirement|contract|interface|specification|schema|type)/i,
42
- /(check|verify|validate|ensure) (the |)(constraint|requirement|contract|interface|specification|type|schema)/i,
43
- ],
44
- baselineScenarios: ['constraint-check', 'contract-verification'],
45
- },
46
- {
47
- id: 'T-03',
48
- patterns: [
49
- // Thinking process language
50
- /based on (the |this )?(evidence|logs?|output|error|stack trace|test result)/i,
51
- /let me (check|verify|confirm|read|look at) (the |)(actual|source|code|file|log)/i,
52
- /根据(日志|证据|输出|报错|堆栈|测试结果)/i,
53
- // Decision directive language (evidence-based decision)
54
- /(verify|check|confirm) (the |)(error|error code|error message|actual|evidence|logs?|output|stack)/i,
55
- /(error|failure) (logs?|output|stack trace|message|code) (before|then)/i,
56
- /(look at|read) (the |)(error|logs?|output|stack|actual|evidence|file|code)/i,
57
- ],
58
- baselineScenarios: ['evidence-gathering', 'verification'],
59
- },
60
- {
61
- id: 'T-04',
62
- patterns: [
63
- // Thinking process language
64
- /this (is|would be) (irreversible|destructive|permanent|not easily undone)/i,
65
- /(reversible|can be undone|safely roll back)/i,
66
- /(不可逆|破坏性|无法回滚|可以回滚|安全撤销)/i,
67
- // Decision directive language
68
- /(irreversible|destructive|permanent|high impact) (action|change|operation)/i,
69
- /(must be|need to be|should be) (reviewed|confirmed|verified|checked) (first|before)/i,
70
- /(get|obtain|ask for) (confirmation|authorization|approval|permission) (first|before)/i,
71
- ],
72
- baselineScenarios: ['risk-management', 'reversibility'],
73
- },
74
- {
75
- id: 'T-05',
76
- patterns: [
77
- // Thinking process language
78
- /we (must|should) (not|never|avoid|prevent|ensure we don't)/i,
79
- /(critical|important) (not to|that we don't|to avoid)/i,
80
- /(绝不能|必须避免|不可|禁止|确保不会)/i,
81
- // Decision directive language
82
- /(must|should|need to) (not |never |avoid )?(check|verify|review|read|confirm|ask)/i,
83
- /(safety|safe) (check|gate|checklist|guard)/i,
84
- ],
85
- baselineScenarios: ['guardrails', 'safety-rails'],
86
- },
87
- {
88
- id: 'T-06',
89
- patterns: [
90
- // Thinking process language
91
- /(simpl(er|est|ify)|minimal|straightforward|lean) (approach|solution|fix|implementation)/i,
92
- /(simple is better|keep it simple|no need to over)/i,
93
- /(最简|更简单|精简|没必要过度设计)/i,
94
- // Decision directive language
95
- /(minimal|smallest|narrowest) (change|modification|impact|approach)/i,
96
- /(only|just) (change|modify|touch|edit|affect) (the |what)/i,
97
- ],
98
- baselineScenarios: ['simplification', 'pragmatism'],
99
- },
100
- {
101
- id: 'T-07',
102
- patterns: [
103
- // Thinking process language
104
- /(minimal|smallest|narrowest|least) (change|diff|modification|impact)/i,
105
- /only (change|modify|touch|edit) (the |what)/i,
106
- /(最小改动|最小变更|只改|只动必要部分)/i,
107
- // Decision directive language
108
- /(limit|narrow) (the |)(change|impact|scope|blast radius)/i,
109
- ],
110
- baselineScenarios: ['minimal-diff', 'blast-radius-control'],
111
- },
112
- {
113
- id: 'T-08',
114
- patterns: [
115
- // Thinking process language
116
- /this (error|failure|issue) (tells us|indicates|signals|suggests|means)/i,
117
- /let me (stop|pause|step back|reconsider|rethink)/i,
118
- /这个(错误|失败|问题).*(说明|意味着|提示)/i,
119
- /让我(停下|暂停|退一步|重新考虑|重新审视)/i,
120
- // Decision directive language
121
- /(diagnose|analyze|investigate) (the |)(root |)(cause|reason|error|failure) (first|before)/i,
122
- /(understand|diagnose|analyze) (the |)(error|failure|issue|problem) (first|before)/i,
123
- ],
124
- baselineScenarios: ['reflection', 'pain-response'],
125
- },
126
- {
127
- id: 'T-09',
128
- patterns: [
129
- // Thinking process language
130
- /(break|split|decompose|divide) (this |the task |it )?(into|down)/i,
131
- /(step 1|first,? (we|i|let's)|phase 1)/i,
132
- /(拆分|分解|分步|分阶段|第一步)/i,
133
- // Decision directive language
134
- /(break|split|decompose|divide) (the |)(task|problem|action) (into|into steps)/i,
135
- ],
136
- baselineScenarios: ['decomposition', 'phased-execution'],
137
- },
138
- {
139
- id: 'T-10',
140
- patterns: [
141
- // Thinking process language
142
- /let me (write|save|record|note down|document)/i,
143
- /memory.*scratchpad|write.*plan\.md|write.*memory|memory.*persist/i,
144
- /(让我.*写入|写入.*memory|记录.*scratchpad)/i,
145
- // Decision directive language
146
- /(write|save|record|note) (the |)(conclusion|decision|plan|next step) (to|in) (file|plan\.md|scratchpad)/i,
147
- ],
148
- baselineScenarios: ['memory-persistence', 'state-externalization'],
149
- },
150
- ];
151
- const BUILTIN_PATTERN_MAP = new Map(BUILTIN_PATTERNS.map((p) => [p.id, p]));
152
- // Fallback name/description lookup — delegates to Core Principle Registry
153
- function getFallbackName(id) {
154
- const entry = CORE_PRINCIPLES.find(p => p.id === id);
155
- return entry?.name ?? id;
156
- }
157
- function getFallbackDescription(id) {
158
- const entry = CORE_PRINCIPLES.find(p => p.id === id);
159
- return entry?.statement ?? '';
160
- }
14
+ import { BUILTIN_PATTERN_MAP, getFallbackName, getFallbackDescription, } from '@principles/core/runtime-v2';
15
+ // Re-export pure logic + types so existing imports from this module keep working.
16
+ export { BUILTIN_PATTERN_MAP, getFallbackName, getFallbackDescription, } from '@principles/core/runtime-v2';
17
+ export { deriveThinkingScenarios } from '@principles/core/runtime-v2';
161
18
  // ---------------------------------------------------------------------------
162
19
  // Runtime model definitions — merged from THINKING_OS.md + builtin patterns
163
20
  // ---------------------------------------------------------------------------
@@ -200,27 +57,19 @@ export function listThinkingModels(workspaceDir) {
200
57
  }
201
58
  }
202
59
  // Fallback: built-in definitions
203
- for (const bp of BUILTIN_PATTERNS) {
60
+ for (const [id, builtin] of BUILTIN_PATTERN_MAP) {
204
61
  models.push({
205
- id: bp.id,
206
- name: getFallbackName(bp.id),
207
- description: getFallbackDescription(bp.id),
208
- patterns: bp.patterns,
209
- baselineScenarios: bp.baselineScenarios,
62
+ id,
63
+ name: getFallbackName(id),
64
+ description: getFallbackDescription(id),
65
+ patterns: builtin.patterns,
66
+ baselineScenarios: builtin.baselineScenarios,
210
67
  });
211
68
  }
212
69
  _cachedDefinitions = models;
213
70
  _cachedWorkspace = cacheKey;
214
71
  return models.slice();
215
72
  }
216
- /**
217
- * Clear the cached model definitions.
218
- * Call this when THINKING_OS.md changes.
219
- */
220
- export function clearThinkingModelCache() {
221
- _cachedDefinitions = null;
222
- _cachedWorkspace = null;
223
- }
224
73
  export function getThinkingModel(modelId, workspaceDir) {
225
74
  const models = listThinkingModels(workspaceDir);
226
75
  return models.find(m => m.id === modelId);
@@ -243,58 +92,3 @@ export function detectThinkingModelMatches(text, workspaceDir) {
243
92
  }
244
93
  return matches;
245
94
  }
246
- /**
247
- * Get all model definitions for display purposes (no patterns).
248
- */
249
- export function getThinkingModelDefinitions(workspaceDir) {
250
- return listThinkingModels(workspaceDir).map(m => ({
251
- modelId: m.id,
252
- name: m.id + ': ' + m.name,
253
- description: m.description,
254
- antiPattern: m.antiPattern,
255
- }));
256
- }
257
- export function deriveThinkingScenarios(modelId, context) {
258
- const scenarios = new Set(getThinkingModel(modelId)?.baselineScenarios ?? []);
259
- if ((context.recentToolCalls ?? []).some((call) => call.outcome === 'failure')) {
260
- scenarios.add('after-tool-failure');
261
- }
262
- // after-recovery: success that follows a failure (not just any success)
263
- const calls = context.recentToolCalls ?? [];
264
- const hasFailure = calls.some((call) => call.outcome === 'failure');
265
- const hasSuccess = calls.some((call) => call.outcome === 'success');
266
- if (hasFailure && hasSuccess) {
267
- scenarios.add('after-recovery');
268
- }
269
- if ((context.recentToolCalls ?? []).some((call) => call.outcome === 'blocked')) {
270
- scenarios.add('blocked-execution');
271
- }
272
- if ((context.recentToolCalls ?? []).some((call) => Boolean(call.errorType))) {
273
- scenarios.add('incident-response');
274
- }
275
- if ((context.recentPainEvents ?? []).length > 0) {
276
- scenarios.add('user-friction');
277
- }
278
- if ((context.recentGateBlocks ?? []).length > 0) {
279
- scenarios.add('gate-block');
280
- }
281
- if ((context.recentUserCorrections ?? []).length > 0) {
282
- scenarios.add('user-correction');
283
- }
284
- if ((context.recentPrincipleEvents ?? []).length > 0) {
285
- scenarios.add('principle-feedback');
286
- }
287
- if (modelId === 'T-03') {
288
- scenarios.add('root-cause-analysis');
289
- }
290
- if (modelId === 'T-04' || modelId === 'T-05') {
291
- scenarios.add('risk-review');
292
- }
293
- if (modelId === 'T-08') {
294
- scenarios.add('reflection-loop');
295
- }
296
- if (modelId === 'T-09') {
297
- scenarios.add('task-planning');
298
- }
299
- return Array.from(scenarios);
300
- }
@@ -222,4 +222,22 @@ export interface TrajectoryDatabaseOptions {
222
222
  busyTimeoutMs?: number;
223
223
  orphanBlobGraceDays?: number;
224
224
  }
225
+ /**
226
+ * Raw row from tool_calls for RuleContext v2 history assembly.
227
+ * Fields are raw strings from SQLite — the assembler validates them as unknown.
228
+ */
229
+ export interface RuleHostContextRow {
230
+ readonly id: number;
231
+ readonly toolName: string;
232
+ readonly outcome: string;
233
+ readonly paramsJson: string;
234
+ }
235
+ /**
236
+ * Result of getRuleHostContextRows: FIFO-ordered rows + truncated flag.
237
+ * truncated=true when more than `limit` rows existed (limit+1 read trick).
238
+ */
239
+ export interface RuleHostContextResult {
240
+ readonly rows: readonly RuleHostContextRow[];
241
+ readonly truncated: boolean;
242
+ }
225
243
  export type { DailyMetricRow };
@@ -1,5 +1,5 @@
1
- import type { CorrectionSampleReviewStatus, CorrectionExportMode, TrajectoryDataStats, TrajectoryAssistantTurnInput, TrajectoryUserTurnInput, TrajectoryToolCallInput, TrajectoryPainEventInput, TrajectoryGateBlockInput, TrajectoryTrustChangeInput, TrajectoryPrincipleEventInput, TrajectoryTaskOutcomeInput, TrajectorySessionInput, EvolutionTaskInput, EvolutionEventInput, EvolutionTaskRecord, EvolutionEventRecord, EvolutionTaskFilters, AssistantTurnRecord, CorrectionSampleRecord, TrajectoryExportResult, TrajectoryDatabaseOptions } from './trajectory-types.js';
2
- export type { CorrectionSampleReviewStatus, CorrectionExportMode, TrajectoryDataStats, TrajectoryAssistantTurnInput, TrajectoryUserTurnInput, TrajectoryToolCallInput, TrajectoryPainEventInput, TrajectoryGateBlockInput, DailyMetricRow, TrajectoryTrustChangeInput, TrajectoryPrincipleEventInput, TrajectoryTaskOutcomeInput, TrajectorySessionInput, TaskKind, TaskPriority, EvolutionTaskInput, EvolutionEventInput, EvolutionTaskRecord, EvolutionEventRecord, EvolutionTaskFilters, AssistantTurnRecord, CorrectionSampleRecord, TrajectoryExportResult, TrajectoryDatabaseOptions, } from './trajectory-types.js';
1
+ import type { CorrectionSampleReviewStatus, CorrectionExportMode, TrajectoryDataStats, TrajectoryAssistantTurnInput, TrajectoryUserTurnInput, TrajectoryToolCallInput, TrajectoryPainEventInput, TrajectoryGateBlockInput, TrajectoryTrustChangeInput, TrajectoryPrincipleEventInput, TrajectoryTaskOutcomeInput, TrajectorySessionInput, EvolutionTaskInput, EvolutionEventInput, EvolutionTaskRecord, EvolutionEventRecord, EvolutionTaskFilters, AssistantTurnRecord, CorrectionSampleRecord, TrajectoryExportResult, TrajectoryDatabaseOptions, RuleHostContextResult } from './trajectory-types.js';
2
+ export type { CorrectionSampleReviewStatus, CorrectionExportMode, TrajectoryDataStats, TrajectoryAssistantTurnInput, TrajectoryUserTurnInput, TrajectoryToolCallInput, TrajectoryPainEventInput, TrajectoryGateBlockInput, DailyMetricRow, TrajectoryTrustChangeInput, TrajectoryPrincipleEventInput, TrajectoryTaskOutcomeInput, TrajectorySessionInput, TaskKind, TaskPriority, EvolutionTaskInput, EvolutionEventInput, EvolutionTaskRecord, EvolutionEventRecord, EvolutionTaskFilters, AssistantTurnRecord, CorrectionSampleRecord, TrajectoryExportResult, TrajectoryDatabaseOptions, RuleHostContextRow, RuleHostContextResult, } from './trajectory-types.js';
3
3
  /**
4
4
  * Initialize trajectory.db schema at the given workspace directory.
5
5
  *
@@ -121,6 +121,15 @@ export declare class TrajectoryDatabase {
121
121
  resultPreview: string | null;
122
122
  createdAt: string;
123
123
  }[];
124
+ /**
125
+ * PRI-482 Phase 3: Query tool_calls for RuleContext v2 history assembly.
126
+ *
127
+ * Reads limit+1 rows (DESC by id) to compute truncated, then reverses to FIFO.
128
+ * Returns raw rows — the assembler (rule-context-assembler.ts) validates them.
129
+ *
130
+ * Spec: §5.1, §5.2. ERR-026: reuses production schema (no hand-written DDL).
131
+ */
132
+ getRuleHostContextRows(sessionId: string, limit?: number): RuleHostContextResult;
124
133
  /**
125
134
  * List pain events for a session.
126
135
  *
@@ -137,6 +146,29 @@ export declare class TrajectoryDatabase {
137
146
  confidence: number | null;
138
147
  createdAt: string;
139
148
  }[];
149
+ /**
150
+ * PRI-484 Phase 5 — Look up a single pain event by canonical_pain_id.
151
+ *
152
+ * Used by BehaviorExamplePackAssembler to anchor a pain lineage without
153
+ * already knowing the session_id. Returns null when not found.
154
+ *
155
+ * ERR-001 (rc-1, rc-2): row fields validated as unknown — no `as` bypass.
156
+ * Uses a type-guard predicate to narrow the DB row structurally.
157
+ */
158
+ getPainEventByCanonicalId(canonicalPainId: string): {
159
+ id: number;
160
+ sessionId: string;
161
+ source: string;
162
+ score: number;
163
+ reason: string | null;
164
+ severity: string | null;
165
+ origin: string | null;
166
+ confidence: number | null;
167
+ text: string | null;
168
+ canonicalPainId: string;
169
+ runtimeTaskId: string | null;
170
+ createdAt: string;
171
+ } | null;
140
172
  /**
141
173
  * List user turns for a session.
142
174
  * Returns sanitized/reduced fields for nocturnal use — NO raw text.
@@ -26,6 +26,34 @@ const SCHEMA_VERSION = 1;
26
26
  function hasNameField(row) {
27
27
  return Object.hasOwn(row, 'name');
28
28
  }
29
+ /**
30
+ * Pure structural narrowing from `unknown` to `Record<string, unknown>` with
31
+ * no `as` cast (ERR-001 / rc-2). The returned type allows indexed access in
32
+ * subsequent code without further casts.
33
+ */
34
+ function isStringRecord(value) {
35
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
36
+ }
37
+ function isPainEventRow(value) {
38
+ if (!isStringRecord(value))
39
+ return false;
40
+ if (typeof value.id !== 'number')
41
+ return false;
42
+ if (typeof value.session_id !== 'string')
43
+ return false;
44
+ // The remaining fields are accessed via String()/Number() which tolerate any
45
+ // primitive; presence check only (rc-5: Object.hasOwn over `in`).
46
+ return (Object.hasOwn(value, 'source')
47
+ && Object.hasOwn(value, 'score')
48
+ && Object.hasOwn(value, 'reason')
49
+ && Object.hasOwn(value, 'severity')
50
+ && Object.hasOwn(value, 'origin')
51
+ && Object.hasOwn(value, 'confidence')
52
+ && Object.hasOwn(value, 'text')
53
+ && Object.hasOwn(value, 'canonical_pain_id')
54
+ && Object.hasOwn(value, 'runtime_task_id')
55
+ && Object.hasOwn(value, 'created_at'));
56
+ }
29
57
  /**
30
58
  * Apply the full trajectory.db schema (tables + indexes + views + migrations) to an open
31
59
  * Database handle. Used by TrajectoryDatabase.initSchema() and exported via
@@ -69,6 +97,8 @@ function applyTrajectorySchema(db) {
69
97
  empathy_signal_json TEXT NOT NULL,
70
98
  blob_ref TEXT,
71
99
  raw_excerpt TEXT,
100
+ stop_reason TEXT,
101
+ thinking_blocks_count INTEGER,
72
102
  created_at TEXT NOT NULL
73
103
  );
74
104
  CREATE TABLE IF NOT EXISTS user_turns (
@@ -95,6 +125,7 @@ function applyTrajectorySchema(db) {
95
125
  gfi_before REAL,
96
126
  gfi_after REAL,
97
127
  params_json TEXT NOT NULL,
128
+ result_preview TEXT,
98
129
  created_at TEXT NOT NULL
99
130
  );
100
131
  CREATE TABLE IF NOT EXISTS pain_events (
@@ -107,6 +138,8 @@ function applyTrajectorySchema(db) {
107
138
  origin TEXT,
108
139
  confidence REAL,
109
140
  text TEXT,
141
+ canonical_pain_id TEXT,
142
+ runtime_task_id TEXT,
110
143
  created_at TEXT NOT NULL
111
144
  );
112
145
  CREATE TABLE IF NOT EXISTS gate_blocks (
@@ -185,6 +218,12 @@ function applyTrajectorySchema(db) {
185
218
  started_at TEXT,
186
219
  completed_at TEXT,
187
220
  resolution TEXT,
221
+ task_kind TEXT,
222
+ priority TEXT,
223
+ retry_count INTEGER,
224
+ max_retries INTEGER,
225
+ last_error TEXT,
226
+ result_ref TEXT,
188
227
  created_at TEXT NOT NULL,
189
228
  updated_at TEXT NOT NULL
190
229
  );
@@ -892,6 +931,36 @@ export class TrajectoryDatabase {
892
931
  };
893
932
  });
894
933
  }
934
+ /**
935
+ * PRI-482 Phase 3: Query tool_calls for RuleContext v2 history assembly.
936
+ *
937
+ * Reads limit+1 rows (DESC by id) to compute truncated, then reverses to FIFO.
938
+ * Returns raw rows — the assembler (rule-context-assembler.ts) validates them.
939
+ *
940
+ * Spec: §5.1, §5.2. ERR-026: reuses production schema (no hand-written DDL).
941
+ */
942
+ getRuleHostContextRows(sessionId, limit = 20) {
943
+ const cappedLimit = Math.max(1, Math.floor(limit));
944
+ const rows = this.db.prepare(`
945
+ SELECT id, tool_name, outcome, params_json
946
+ FROM tool_calls
947
+ WHERE session_id = ?
948
+ ORDER BY id DESC
949
+ LIMIT ?
950
+ `).all(sessionId, cappedLimit + 1);
951
+ const truncated = rows.length > cappedLimit;
952
+ const output = truncated ? rows.slice(0, cappedLimit) : rows;
953
+ output.reverse(); // DESC → FIFO (oldest first)
954
+ return {
955
+ rows: output.map((row) => ({
956
+ id: Number(row.id),
957
+ toolName: String(row.tool_name),
958
+ outcome: String(row.outcome),
959
+ paramsJson: String(row.params_json),
960
+ })),
961
+ truncated,
962
+ };
963
+ }
895
964
  /**
896
965
  * List pain events for a session.
897
966
  *
@@ -916,6 +985,40 @@ export class TrajectoryDatabase {
916
985
  createdAt: String(row.created_at),
917
986
  }));
918
987
  }
988
+ /**
989
+ * PRI-484 Phase 5 — Look up a single pain event by canonical_pain_id.
990
+ *
991
+ * Used by BehaviorExamplePackAssembler to anchor a pain lineage without
992
+ * already knowing the session_id. Returns null when not found.
993
+ *
994
+ * ERR-001 (rc-1, rc-2): row fields validated as unknown — no `as` bypass.
995
+ * Uses a type-guard predicate to narrow the DB row structurally.
996
+ */
997
+ getPainEventByCanonicalId(canonicalPainId) {
998
+ const rawRow = this.db.prepare(`
999
+ SELECT id, session_id, source, score, reason, severity, origin, confidence,
1000
+ text, canonical_pain_id, runtime_task_id, created_at
1001
+ FROM pain_events
1002
+ WHERE canonical_pain_id = ?
1003
+ LIMIT 1
1004
+ `).get(canonicalPainId);
1005
+ if (!isPainEventRow(rawRow))
1006
+ return null;
1007
+ return {
1008
+ id: rawRow.id,
1009
+ sessionId: rawRow.session_id,
1010
+ source: String(rawRow.source),
1011
+ score: Number(rawRow.score),
1012
+ reason: rawRow.reason ? String(rawRow.reason) : null,
1013
+ severity: rawRow.severity ? String(rawRow.severity) : null,
1014
+ origin: rawRow.origin ? String(rawRow.origin) : null,
1015
+ confidence: rawRow.confidence != null ? Number(rawRow.confidence) : null,
1016
+ text: rawRow.text ? String(rawRow.text) : null,
1017
+ canonicalPainId: String(rawRow.canonical_pain_id),
1018
+ runtimeTaskId: rawRow.runtime_task_id ? String(rawRow.runtime_task_id) : null,
1019
+ createdAt: String(rawRow.created_at),
1020
+ };
1021
+ }
919
1022
  /**
920
1023
  * List user turns for a session.
921
1024
  * Returns sanitized/reduced fields for nocturnal use — NO raw text.
@@ -12,12 +12,14 @@ import { normalizePath } from '../utils/io.js';
12
12
  import { WorkspaceContext } from '../core/workspace-context.js';
13
13
  import { recordGateBlockAndReturn } from './gate-block-helper.js';
14
14
  import { RuleHost } from '../core/rule-host.js';
15
- import { validateCorrectionProposal, validateProposedPathBounds } from '@principles/core/runtime-v2';
15
+ import { validateCorrectionProposal, validateProposedPathBounds, computeFeatureFlagsFromConfig, UNAVAILABLE_RULE_CONTEXT } from '@principles/core/runtime-v2';
16
16
  import { AGENT_TOOLS, BASH_TOOLS_SET, WRITE_TOOLS } from '../constants/tools.js';
17
17
  import { getSession, hasRecentThinking } from '../core/session-tracker.js';
18
18
  import { getEvolutionEngine } from '../core/evolution-engine.js';
19
19
  import { EventLogService } from '../core/event-log.js';
20
- import { estimateLineChanges } from '../core/risk-calculator.js';
20
+ import { estimateLineChanges } from '@principles/core/runtime-v2';
21
+ import { loadPdConfigForPlugin } from '../core/pd-config-loader.js';
22
+ import { buildProductionRuleContext } from '../core/rule-context-assembler.js';
21
23
  export function handleBeforeToolCall(event, ctx) {
22
24
  const logger = ctx.logger || console;
23
25
  // 1. Identify tool type
@@ -53,6 +55,10 @@ export function handleBeforeToolCall(event, ctx) {
53
55
  // 3. Rule Host Evaluation — sole gate
54
56
  try {
55
57
  const ruleHost = new RuleHost(wctx.stateDir, logger, { workspaceDir: ctx.workspaceDir });
58
+ // PRI-483 Phase 4: assemble RuleContextV2 when `rulecode_context_v2` flag is ON.
59
+ // flag OFF → undefined (v1 zero-change, no trajectory access).
60
+ // flag ON → RuleContextV2 (available or unavailable). Never throws (ERR-024).
61
+ const ruleContext = _buildRuleContextIfEnabled(wctx, relPath, ctx.sessionId, logger);
56
62
  const hostInput = {
57
63
  action: {
58
64
  toolName: event.toolName,
@@ -80,6 +86,7 @@ export function handleBeforeToolCall(event, ctx) {
80
86
  estimatedLineChanges: estimateLineChanges({ toolName: event.toolName, params: event.params ?? {} }),
81
87
  bashRisk: _getBashRisk(event),
82
88
  },
89
+ context: ruleContext,
83
90
  };
84
91
  const hostResult = ruleHost.evaluate(hostInput);
85
92
  // Always emit rulehost_evaluated
@@ -379,3 +386,53 @@ function _getBashRisk(event) {
379
386
  return 'unknown';
380
387
  }
381
388
  }
389
+ /**
390
+ * PRI-483 Phase 4 — Build RuleContextV2 for RuleHost.evaluate when the
391
+ * `rulecode_context_v2` feature flag is ON. Returns `undefined` when the flag
392
+ * is OFF (v1 zero-change — does NOT touch trajectory) or when config loading
393
+ * fails (conservative fail-soft: can't determine flag state → v1-style).
394
+ *
395
+ * ERR-024 prevention: context assembly failures never skip RuleHost.evaluate.
396
+ * - loadPdConfigForPlugin throws → return undefined (v1-style)
397
+ * - buildProductionRuleContext throws → return UNAVAILABLE_RULE_CONTEXT
398
+ * (structured unavailable so v2 rules see "context unavailable" and allow)
399
+ *
400
+ * Spec: docs/superpowers/specs/2026-06-27-rulecode-context-vision-design.md §5.3
401
+ */
402
+ function _buildRuleContextIfEnabled(wctx, targetPath, sessionId, logger) {
403
+ // Step 1: load PD config (flag-gated). If this throws, we can't safely
404
+ // determine whether v2 context is required — fall back to v1 (undefined).
405
+ let configResult;
406
+ try {
407
+ configResult = loadPdConfigForPlugin(wctx.workspaceDir);
408
+ }
409
+ catch (err) {
410
+ logger?.warn?.(`[PD_GATE] RuleContext v2: config load failed, skipping context assembly: ${String(err)}`);
411
+ return undefined;
412
+ }
413
+ // Step 2: compute effective flags and check rulecode_context_v2.
414
+ // Explicit ok:false guard (rc-9-no-silent-fallback): when config is malformed,
415
+ // do NOT silently fall through to flag computation on defaults — log and
416
+ // return v1-style undefined so config issues surface to the operator.
417
+ if (!configResult.ok) {
418
+ const reasons = configResult.errors.map(e => e.reason).join('; ');
419
+ logger?.warn?.(`[PD_GATE] RuleContext v2: config load returned malformed result, skipping context assembly: ${reasons}`);
420
+ return undefined;
421
+ }
422
+ const flagsResult = computeFeatureFlagsFromConfig(configResult.effective);
423
+ const v2Flag = flagsResult.flags.rulecode_context_v2;
424
+ if (!v2Flag?.enabled) {
425
+ // Flag OFF → v1 zero-change. Do NOT access trajectory (spec §10.1).
426
+ return undefined;
427
+ }
428
+ // Step 3: flag ON → assemble context via production data source.
429
+ // buildProductionRuleContext is fail-soft internally (returns unavailable),
430
+ // but wrap in try/catch as defense-in-depth (ERR-024).
431
+ try {
432
+ return buildProductionRuleContext(sessionId, targetPath, wctx.trajectory, wctx.workspaceDir);
433
+ }
434
+ catch (err) {
435
+ logger?.warn?.(`[PD_GATE] RuleContext v2: buildProductionRuleContext threw unexpectedly, using unavailable context: ${String(err)}`);
436
+ return UNAVAILABLE_RULE_CONTEXT;
437
+ }
438
+ }
@@ -25,7 +25,7 @@ import { resolveWorkspaceDirForRuntimeV2 } from '../utils/workspace-resolver.js'
25
25
  import { PainToPrincipleService, PrincipleTreeLedgerAdapter } from '@principles/core/runtime-v2';
26
26
  import { evaluatePainDiagnosticGate } from '../core/pain-diagnostic-gate.js';
27
27
  import { loadPdConfigForPlugin, loadFeatureFlagFromConfig } from '../core/pd-config-loader.js';
28
- import { createIntentDocReader } from '../core/intent-doc-reader-adapter.js';
28
+ import { createIntentDocReader, resolveIntentLang } from '../core/intent-doc-reader-adapter.js';
29
29
  import { evaluateTriggerController } from '@principles/core/runtime-v2';
30
30
  import { isSharedCooldownActive, markSharedEpisodeAsDiagnosed } from './trigger-cooldown-tracker.js';
31
31
  import { buildManualPainObservation, resolveSourceKind } from './raw-observation-adapter.js';
@@ -48,7 +48,7 @@ function createPainToPrincipleService(wctx) {
48
48
  // PRI-468: wire INTENT.md reader so Stage A can produce intentTension
49
49
  // when intent_engineering flag is on. Adapter performs no I/O beyond
50
50
  // delegating to safeReadIntentDoc (which owns the flag-first check).
51
- intentDocReader: createIntentDocReader(wctx.workspaceDir),
51
+ intentDocReader: createIntentDocReader(wctx.workspaceDir, resolveIntentLang(wctx.workspaceDir)),
52
52
  });
53
53
  }
54
54
  // buildTrajectoryEvidence is in ./trajectory-evidence.ts (re-exported above)
@@ -21,6 +21,7 @@ import { buildEmpathyObservation, resolveSourceKind } from './raw-observation-ad
21
21
  import { evaluateEvidenceTriage } from './triage-adapter.js';
22
22
  import { loadFeatureFlagFromConfig } from '../core/pd-config-loader.js';
23
23
  import { safeReadIntentDoc, resetIntentDocCacheForTest } from '../core/intent-doc-reader.js';
24
+ import { resolveIntentLang } from '../core/intent-doc-reader-adapter.js';
24
25
  import { buildIntentFrictionBlock } from '@principles/core/runtime-v2';
25
26
  import { CorrectionCueLearner } from '../core/correction-cue-learner.js';
26
27
  import { detectCorrectionCue as coreDetectCorrectionCue, escapeXml, extractMessageContent, isMinimalTrigger, } from '@principles/core/prompt-builder';
@@ -909,7 +910,7 @@ export async function handleBeforePromptBuild(event, ctx) {
909
910
  try {
910
911
  const intentFlag = loadFeatureFlagFromConfig(workspaceDir, 'intent_engineering', logger);
911
912
  if (intentFlag.enabled) {
912
- const intentResult = safeReadIntentDoc(workspaceDir, { logger });
913
+ const intentResult = safeReadIntentDoc(workspaceDir, resolveIntentLang(workspaceDir), { logger });
913
914
  if (intentResult.ok && intentResult.doc) {
914
915
  const block = buildIntentFrictionBlock({ rawIntentMd: intentResult.doc.raw });
915
916
  if (block.length > 0) {
@@ -38,7 +38,7 @@ import { SystemLogger } from './core/system-logger.js';
38
38
  import { PathResolver } from './core/path-resolver.js';
39
39
  import { resolveCommandWorkspaceDir, resolveToolHookWorkspaceDirSafe, resolveHookWorkspaceDir } from './utils/workspace-resolver.js';
40
40
  import { validateWorkspaceDir } from './core/workspace-dir-validation.js';
41
- import { checkSurfaceGuard, guardHook, guardService } from './core/surface-guard.js';
41
+ import { checkSurfaceGuard, guardHook, guardService } from '@principles/core/runtime-v2';
42
42
  // Track started workspaces — one-time init + evolution worker per workspace
43
43
  const startedWorkspaces = new Set();
44
44
  // ── Conversation Access Health Check (PRI-343) ────────────────────────────
@@ -62,7 +62,7 @@
62
62
  "@typescript-eslint/eslint-plugin": "^8.61.0",
63
63
  "@typescript-eslint/parser": "^8.58.0",
64
64
  "@vitest/coverage-v8": "^4.1.9",
65
- "esbuild": "^0.28.0",
65
+ "esbuild": "^0.28.1",
66
66
  "eslint": "^10.5.0",
67
67
  "jsdom": "^29.1.1",
68
68
  "typescript": "^6.0.3",
@@ -1,5 +0,0 @@
1
- export interface MigrationResult {
2
- importedEvents: number;
3
- streamPath: string;
4
- }
5
- export declare function migrateLegacyEvolutionData(workspaceDir: string): MigrationResult;