principles-disciple 1.72.0 → 1.74.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 (319) hide show
  1. package/INSTALL.md +1 -3
  2. package/openclaw.plugin.json +10 -5
  3. package/package.json +17 -19
  4. package/scripts/acceptance-test.mjs +16 -73
  5. package/scripts/sync-plugin.mjs +382 -77
  6. package/src/commands/archive-impl.ts +2 -1
  7. package/src/commands/capabilities.ts +2 -2
  8. package/src/commands/context.ts +2 -2
  9. package/src/commands/disable-impl.ts +2 -1
  10. package/src/commands/evolution-status.ts +16 -16
  11. package/src/commands/export.ts +12 -67
  12. package/src/commands/pain.ts +91 -1
  13. package/src/commands/principle-rollback.ts +2 -1
  14. package/src/commands/promote-impl.ts +7 -43
  15. package/src/commands/rollback-impl.ts +2 -1
  16. package/src/commands/rollback.ts +2 -1
  17. package/src/commands/samples.ts +2 -1
  18. package/src/commands/thinking-os.ts +2 -1
  19. package/src/config/errors.ts +18 -2
  20. package/src/constants/diagnostician.ts +2 -2
  21. package/src/constants/tools.ts +2 -1
  22. package/src/core/__tests__/focus-history.test.ts +210 -0
  23. package/src/core/config.ts +1 -1
  24. package/src/core/correction-cue-learner.ts +2 -136
  25. package/src/core/correction-types.ts +16 -88
  26. package/src/core/dictionary.ts +19 -20
  27. package/src/core/empathy-keyword-matcher.ts +17 -289
  28. package/src/core/empathy-types.ts +18 -229
  29. package/src/core/event-log.ts +29 -132
  30. package/src/core/evolution-reducer.ts +21 -2
  31. package/src/core/evolution-types.ts +76 -464
  32. package/src/core/file-store.ts +80 -0
  33. package/src/core/focus-history.ts +228 -955
  34. package/src/core/local-worker-routing.ts +34 -314
  35. package/src/core/merge-gate-audit.ts +0 -195
  36. package/src/core/migration.ts +0 -1
  37. package/src/core/pain-diagnostic-gate.ts +154 -0
  38. package/src/core/pain-signal.ts +21 -138
  39. package/src/core/pain.ts +15 -88
  40. package/src/core/path-resolver.ts +0 -1
  41. package/src/core/paths.ts +0 -1
  42. package/src/core/pd-task-reconciler.ts +26 -115
  43. package/src/core/pd-task-service.ts +9 -9
  44. package/src/core/pd-task-types.ts +23 -127
  45. package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
  46. package/src/core/principle-compiler/code-validator.ts +15 -42
  47. package/src/core/principle-compiler/compiler.ts +100 -15
  48. package/src/core/principle-compiler/index.ts +5 -2
  49. package/src/core/principle-compiler/template-generator.ts +4 -104
  50. package/src/core/principle-injection.ts +10 -202
  51. package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
  52. package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
  53. package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
  54. package/src/core/principle-tree-ledger-adapter.ts +145 -0
  55. package/src/core/principle-tree-ledger.ts +8 -6
  56. package/src/core/reflection/reflection-context.ts +14 -109
  57. package/src/core/replay-engine.ts +8 -500
  58. package/src/core/rule-host-helpers.ts +5 -35
  59. package/src/core/rule-host-types.ts +10 -82
  60. package/src/core/rule-host.ts +6 -63
  61. package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
  62. package/src/core/session-tracker.ts +87 -101
  63. package/src/core/shadow-observation-registry.ts +19 -48
  64. package/src/core/trajectory.ts +3 -1
  65. package/src/core/workflow-funnel-loader.ts +62 -68
  66. package/src/core/workspace-context.ts +46 -0
  67. package/src/core/workspace-dir-service.ts +1 -1
  68. package/src/core/workspace-dir-validation.ts +18 -9
  69. package/src/hooks/AGENTS.md +1 -1
  70. package/src/hooks/gate-block-helper.ts +71 -64
  71. package/src/hooks/gate.ts +183 -31
  72. package/src/hooks/lifecycle.ts +30 -32
  73. package/src/hooks/llm.ts +60 -32
  74. package/src/hooks/pain.ts +297 -103
  75. package/src/hooks/prompt.ts +400 -440
  76. package/src/hooks/subagent.ts +2 -29
  77. package/src/i18n/commands.ts +2 -10
  78. package/src/index.ts +95 -85
  79. package/src/openclaw-sdk.ts +311 -0
  80. package/src/service/central-database.ts +8 -4
  81. package/src/service/evolution-queue-migration.ts +2 -1
  82. package/src/service/evolution-worker.ts +163 -1786
  83. package/src/service/internalization-trigger-adapter.ts +302 -0
  84. package/src/service/keyword-optimization-service.ts +4 -4
  85. package/src/service/monitoring-query-service.ts +1 -215
  86. package/src/service/queue-io.ts +60 -331
  87. package/src/service/runtime-summary-service.ts +59 -16
  88. package/src/service/subagent-workflow/index.ts +0 -41
  89. package/src/service/subagent-workflow/types.ts +9 -120
  90. package/src/service/subagent-workflow/workflow-store.ts +2 -119
  91. package/src/service/workflow-watchdog.ts +0 -43
  92. package/src/types/event-payload.ts +16 -74
  93. package/src/types/event-types.ts +38 -547
  94. package/src/types/hygiene-types.ts +7 -30
  95. package/src/types/principle-tree-schema.ts +20 -222
  96. package/src/types/queue.ts +15 -70
  97. package/src/types/runtime-summary.ts +5 -49
  98. package/src/utils/io.ts +8 -20
  99. package/src/utils/retry.ts +1 -1
  100. package/src/utils/shadow-fingerprint.ts +2 -2
  101. package/src/utils/workspace-resolver.ts +50 -0
  102. package/templates/langs/en/core/AGENTS.md +7 -7
  103. package/templates/langs/en/core/BOOT.md +1 -1
  104. package/templates/langs/en/core/HEARTBEAT.md +2 -2
  105. package/templates/langs/en/principles/THINKING_OS.md +3 -2
  106. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  107. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  108. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  109. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  110. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  111. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  112. package/templates/langs/en/skills/evolve-task/SKILL.md +3 -3
  113. package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
  114. package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
  115. package/templates/langs/en/skills/pd-mentor/SKILL.md +2 -3
  116. package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
  117. package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
  118. package/templates/langs/zh/core/AGENTS.md +7 -7
  119. package/templates/langs/zh/core/BOOT.md +1 -1
  120. package/templates/langs/zh/core/HEARTBEAT.md +2 -2
  121. package/templates/langs/zh/principles/THINKING_OS.md +3 -2
  122. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  123. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  124. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  125. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
  126. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  127. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  128. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  129. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
  130. package/templates/langs/zh/skills/evolve-task/SKILL.md +4 -4
  131. package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
  132. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
  133. package/templates/langs/zh/skills/pd-mentor/SKILL.md +2 -3
  134. package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
  135. package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
  136. package/tests/build-artifacts.test.ts +1 -3
  137. package/tests/commands/evolution-status.test.ts +0 -118
  138. package/tests/core/bootstrap-rules.test.ts +1 -1
  139. package/tests/core/config.test.ts +1 -1
  140. package/tests/core/event-log.test.ts +35 -0
  141. package/tests/core/evolution-engine.test.ts +610 -0
  142. package/tests/core/file-store.test.ts +102 -0
  143. package/tests/core/focus-history.test.ts +203 -11
  144. package/tests/core/merge-gate-audit.test.ts +2 -169
  145. package/tests/core/migration.test.ts +7 -7
  146. package/tests/core/model-deployment-registry.test.ts +7 -1
  147. package/tests/core/model-training-registry.test.ts +19 -0
  148. package/tests/core/observability.test.ts +0 -1
  149. package/tests/core/pain-diagnostic-gate.test.ts +498 -0
  150. package/tests/core/pain.test.ts +0 -1
  151. package/tests/core/path-resolver.test.ts +1 -1
  152. package/tests/core/paths-refactor.test.ts +0 -22
  153. package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
  154. package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
  155. package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
  156. package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
  157. package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
  158. package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
  159. package/tests/core/reflection-context.test.ts +0 -14
  160. package/tests/core/replay-engine.test.ts +127 -215
  161. package/tests/core/rule-host-helpers.test.ts +2 -2
  162. package/tests/core/rule-implementation-runtime.test.ts +0 -27
  163. package/tests/core/workflow-funnel-loader.test.ts +162 -0
  164. package/tests/core/workspace-context.test.ts +2 -2
  165. package/tests/core/workspace-dir-validation.test.ts +8 -1
  166. package/tests/core-anti-growth.test.ts +191 -0
  167. package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
  168. package/tests/hooks/confirm-first-removal.test.ts +188 -0
  169. package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
  170. package/tests/hooks/gate-auto-correct.test.ts +665 -0
  171. package/tests/hooks/gate-no-path-write-tool.test.ts +172 -0
  172. package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
  173. package/tests/hooks/pain.test.ts +269 -12
  174. package/tests/hooks/prompt-characterization.test.ts +500 -0
  175. package/tests/hooks/prompt-size-guard.test.ts +32 -17
  176. package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
  177. package/tests/index.test.ts +94 -1
  178. package/tests/integration/auto-entry-gate.test.ts +248 -0
  179. package/tests/integration/internalization-trigger-guard.test.ts +69 -0
  180. package/tests/integration/m8-legacy-paths.test.ts +63 -0
  181. package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
  182. package/tests/plugin-config-resolution-cutover.test.ts +359 -0
  183. package/tests/runtime-v2-discovery-guard.test.ts +154 -0
  184. package/tests/service/central-database.test.ts +457 -0
  185. package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
  186. package/tests/service/evolution-worker.timeout.test.ts +11 -129
  187. package/tests/service/internalization-trigger-adapter.test.ts +251 -0
  188. package/tests/service/monitoring-query-service.test.ts +1 -47
  189. package/tests/service/queue-io.test.ts +1 -62
  190. package/tests/service/runtime-summary-service.test.ts +3 -1
  191. package/tests/service/workflow-watchdog.test.ts +0 -91
  192. package/tests/utils/file-lock.test.ts +5 -3
  193. package/tests/utils/session-key.test.ts +52 -0
  194. package/tests/utils/subagent-probe.test.ts +48 -1
  195. package/vitest.config.ts +4 -11
  196. package/.planning/codebase/ARCHITECTURE.md +0 -157
  197. package/.planning/codebase/CONCERNS.md +0 -145
  198. package/.planning/codebase/CONVENTIONS.md +0 -148
  199. package/.planning/codebase/INTEGRATIONS.md +0 -81
  200. package/.planning/codebase/STACK.md +0 -87
  201. package/.planning/codebase/STRUCTURE.md +0 -193
  202. package/.planning/codebase/TESTING.md +0 -243
  203. package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
  204. package/docs/COMMAND_REFERENCE.md +0 -76
  205. package/docs/COMMAND_REFERENCE_EN.md +0 -79
  206. package/scripts/build-web.mjs +0 -46
  207. package/scripts/diagnose-nocturnal.mjs +0 -537
  208. package/scripts/seed-nocturnal-scenarios.mjs +0 -384
  209. package/src/commands/nocturnal-review.ts +0 -322
  210. package/src/commands/nocturnal-rollout.ts +0 -790
  211. package/src/commands/nocturnal-train.ts +0 -986
  212. package/src/commands/pd-reflect.ts +0 -88
  213. package/src/core/adaptive-thresholds.ts +0 -478
  214. package/src/core/diagnostician-task-store.ts +0 -192
  215. package/src/core/nocturnal-arbiter.ts +0 -715
  216. package/src/core/nocturnal-artifact-lineage.ts +0 -116
  217. package/src/core/nocturnal-artificer.ts +0 -257
  218. package/src/core/nocturnal-candidate-scoring.ts +0 -530
  219. package/src/core/nocturnal-compliance.ts +0 -1146
  220. package/src/core/nocturnal-dataset.ts +0 -763
  221. package/src/core/nocturnal-executability.ts +0 -428
  222. package/src/core/nocturnal-export.ts +0 -499
  223. package/src/core/nocturnal-paths.ts +0 -240
  224. package/src/core/nocturnal-reasoning-deriver.ts +0 -343
  225. package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
  226. package/src/core/nocturnal-snapshot-contract.ts +0 -99
  227. package/src/core/nocturnal-trajectory-extractor.ts +0 -512
  228. package/src/core/nocturnal-trinity-types.ts +0 -218
  229. package/src/core/nocturnal-trinity.ts +0 -2680
  230. package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
  231. package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
  232. package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
  233. package/src/http/principles-console-route.ts +0 -709
  234. package/src/service/central-health-service.ts +0 -49
  235. package/src/service/central-overview-service.ts +0 -138
  236. package/src/service/control-ui-query-service.ts +0 -900
  237. package/src/service/cooldown-strategy.ts +0 -97
  238. package/src/service/evolution-pain-context.ts +0 -79
  239. package/src/service/evolution-query-service.ts +0 -407
  240. package/src/service/health-query-service.ts +0 -1038
  241. package/src/service/nocturnal-config.ts +0 -214
  242. package/src/service/nocturnal-runtime.ts +0 -734
  243. package/src/service/nocturnal-service.ts +0 -1605
  244. package/src/service/nocturnal-target-selector.ts +0 -545
  245. package/src/service/sleep-cycle.ts +0 -157
  246. package/src/service/startup-reconciler.ts +0 -112
  247. package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
  248. package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
  249. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
  250. package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
  251. package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
  252. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
  253. package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
  254. package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
  255. package/src/tools/write-pain-flag.ts +0 -215
  256. package/templates/langs/en/skills/plan-script/SKILL.md +0 -32
  257. package/templates/langs/zh/skills/plan-script/SKILL.md +0 -32
  258. package/tests/commands/nocturnal-review.test.ts +0 -448
  259. package/tests/commands/nocturnal-train.test.ts +0 -97
  260. package/tests/commands/pd-reflect.test.ts +0 -49
  261. package/tests/core/adaptive-thresholds.test.ts +0 -261
  262. package/tests/core/nocturnal-arbiter.test.ts +0 -559
  263. package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
  264. package/tests/core/nocturnal-artificer.test.ts +0 -241
  265. package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
  266. package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
  267. package/tests/core/nocturnal-compliance.test.ts +0 -646
  268. package/tests/core/nocturnal-dataset.test.ts +0 -892
  269. package/tests/core/nocturnal-e2e.test.ts +0 -234
  270. package/tests/core/nocturnal-executability.test.ts +0 -357
  271. package/tests/core/nocturnal-export.test.ts +0 -517
  272. package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
  273. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
  274. package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
  275. package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
  276. package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
  277. package/tests/core/nocturnal-trinity.test.ts +0 -2053
  278. package/tests/core/pain-auto-repair.test.ts +0 -96
  279. package/tests/core/pain-integration.test.ts +0 -510
  280. package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
  281. package/tests/http/principles-console-route.test.ts +0 -162
  282. package/tests/integration/chaos-resilience.test.ts +0 -348
  283. package/tests/integration/empathy-workflow-integration.test.ts +0 -626
  284. package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
  285. package/tests/service/control-ui-query-service.test.ts +0 -121
  286. package/tests/service/cooldown-strategy.test.ts +0 -164
  287. package/tests/service/data-endpoints-regression.test.ts +0 -834
  288. package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
  289. package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
  290. package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
  291. package/tests/service/nocturnal-runtime.test.ts +0 -473
  292. package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
  293. package/tests/service/nocturnal-target-selector.test.ts +0 -615
  294. package/tests/service/startup-reconciler.test.ts +0 -148
  295. package/tests/tools/write-pain-flag.test.ts +0 -358
  296. package/ui/src/App.tsx +0 -45
  297. package/ui/src/api.ts +0 -220
  298. package/ui/src/charts.tsx +0 -955
  299. package/ui/src/components/ErrorState.tsx +0 -6
  300. package/ui/src/components/Loading.tsx +0 -13
  301. package/ui/src/components/ProtectedRoute.tsx +0 -12
  302. package/ui/src/components/Shell.tsx +0 -91
  303. package/ui/src/components/WorkspaceConfig.tsx +0 -178
  304. package/ui/src/components/index.ts +0 -5
  305. package/ui/src/context/auth.tsx +0 -80
  306. package/ui/src/context/theme.tsx +0 -66
  307. package/ui/src/hooks/useAutoRefresh.ts +0 -39
  308. package/ui/src/i18n/ui.ts +0 -473
  309. package/ui/src/main.tsx +0 -16
  310. package/ui/src/pages/EvolutionPage.tsx +0 -333
  311. package/ui/src/pages/FeedbackPage.tsx +0 -138
  312. package/ui/src/pages/GateMonitorPage.tsx +0 -136
  313. package/ui/src/pages/LoginPage.tsx +0 -89
  314. package/ui/src/pages/OverviewPage.tsx +0 -599
  315. package/ui/src/pages/SamplesPage.tsx +0 -174
  316. package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
  317. package/ui/src/styles.css +0 -2020
  318. package/ui/src/types.ts +0 -384
  319. package/ui/src/utils/format.ts +0 -15
@@ -22,233 +22,31 @@
22
22
  * - Track principle value ranking (pain prevented, adherence rate)
23
23
  */
24
24
 
25
- import type { PrincipleStatus } from '../core/evolution-types.js';
25
+ import type { Principle as CorePrinciple } from '@principles/core/runtime-v2';
26
26
  import type { PrincipleDetectorSpec } from '../core/evolution-types.js';
27
27
 
28
+ // Re-exported from core (PRI-51) for plugin consumers
29
+ export type {
30
+ PrinciplePriority,
31
+ PrincipleScope,
32
+ PrincipleEvaluability,
33
+ RuleStatus,
34
+ RuleType,
35
+ ImplementationLifecycleState,
36
+ ImplementationType,
37
+ Rule,
38
+ Implementation,
39
+ PrincipleDependency,
40
+ PrincipleValueMetrics,
41
+ PrincipleEventType,
42
+ PrincipleLifecycleEvent,
43
+ PrincipleTreeStore,
44
+ } from '@principles/core/runtime-v2';
45
+
28
46
  // =========================================================================
29
47
  // 1. PRINCIPLE (Tree Root) — Highly abstract, cross-scenario, value-driven
30
48
  // =========================================================================
31
49
 
32
- export type PrinciplePriority = 'P0' | 'P1' | 'P2';
33
-
34
- export type PrincipleScope = 'general' | 'domain';
35
-
36
- export type PrincipleEvaluability =
37
- | 'manual_only' // Cannot be automatically evaluated
38
- | 'deterministic' // Clear yes/no evaluation criteria
39
- | 'weak_heuristic'; // Fuzzy evaluation with confidence score
40
-
41
- export interface Principle {
42
- // Identity
43
- id: string; // e.g., "P_060"
44
- version: number; // Incremented on each update
45
-
46
- // Core content
47
- text: string; // One-line abstract principle statement
48
- coreAxiomId?: string; // Associated core axiom (e.g., "T-01")
49
- triggerPattern: string; // Regex/keywords for auto-matching pain signals
50
- action: string; // What to do when triggered
51
-
52
- // Status and lifecycle
53
- status: PrincipleStatus;
54
- priority: PrinciplePriority;
55
- scope: PrincipleScope;
56
- domain?: string; // Required when scope === 'domain', e.g., "file_operations"
57
- evaluability: PrincipleEvaluability;
58
-
59
- // Value metrics (auto-calculated)
60
- valueScore: number; // pain_prevented_count × avg_pain_severity
61
- adherenceRate: number; // 0-100, percentage of times followed
62
- painPreventedCount: number; // Number of pain signals prevented by this principle
63
- lastPainPreventedAt?: string; // ISO timestamp of most recent prevention
64
-
65
- // Relationships
66
- derivedFromPainIds: string[]; // Source pain signal IDs
67
- ruleIds: string[]; // Associated rule IDs (trunk connections)
68
- conflictsWithPrincipleIds: string[]; // Conflicting principles
69
- supersedesPrincipleId?: string; // If this replaces a deprecated principle
70
-
71
- // Metadata
72
- createdAt: string; // ISO timestamp
73
- updatedAt: string; // ISO timestamp
74
- deprecatedAt?: string; // Set when status changes to 'deprecated'
75
- deprecatedReason?: string; // Why it was deprecated (e.g., "solidified into hook at src/hooks/file-safety.ts")
76
-
77
- // Detector metadata (for auto-training eligibility)
50
+ export interface Principle extends CorePrinciple {
78
51
  detectorMetadata?: PrincipleDetectorSpec;
79
-
80
- // Compilation retry tracking (for runtime auto-trigger)
81
- // undefined = not yet attempted or succeeded; 0 = queued; n >= 1 = retry attempt n
82
- compilationRetryCount?: number;
83
- }
84
-
85
- // =========================================================================
86
- // 2. RULE (Tree Trunk) — Verifiable, actionable, principle-specific
87
- // =========================================================================
88
-
89
- export type RuleStatus =
90
- | 'proposed' // Suggested but not implemented
91
- | 'implemented' // Code/skill exists but not fully tested
92
- | 'enforced' // Actively enforced with monitoring
93
- | 'retired'; // No longer needed (principle deprecated)
94
-
95
- export type RuleType =
96
- | 'hook' // Code hook (before/after tool call)
97
- | 'gate' // Pre-execution gate (block/warn)
98
- | 'skill' // LLM skill/instruction
99
- | 'lora' // Fine-tuned model weight
100
- | 'test' // Automated test case
101
- | 'prompt' // System prompt injection;
102
-
103
- export interface Rule {
104
- // Identity
105
- id: string; // e.g., "R_060_01"
106
- version: number;
107
-
108
- // Core content
109
- name: string; // Short descriptive name
110
- description: string; // What this rule does
111
- type: RuleType;
112
-
113
- // Trigger and enforcement
114
- triggerCondition: string; // When this rule activates (regex, tool name, context)
115
- enforcement: 'block' | 'warn' | 'log'; // What happens when violated
116
- action: string; // Concrete action to take
117
-
118
- // Association
119
- principleId: string; // Parent principle ID
120
- parentRuleId?: string; // If this is a sub-rule
121
-
122
- // Status and metrics
123
- status: RuleStatus;
124
- coverageRate: number; // 0-100, how often this rule catches violations
125
- falsePositiveRate: number; // 0-100, how often this rule fires incorrectly
126
-
127
- // Implementation reference
128
- implementationPath?: string; // File path, skill name, or LoRA model path
129
- testPath?: string; // Test file path
130
-
131
- // Metadata
132
- createdAt: string;
133
- updatedAt: string;
134
- }
135
-
136
- // =========================================================================
137
- // 3. IMPLEMENTATION (Tree Leaf) — Concrete, executable
138
- // =========================================================================
139
-
140
- export type ImplementationLifecycleState =
141
- | 'candidate' // Newly created, awaiting replay evaluation
142
- | 'active' // Currently active for this rule
143
- | 'disabled' // Manually disabled (e.g., regression)
144
- | 'archived'; // Permanently archived
145
-
146
- export type ImplementationType = 'code' | 'skill' | 'lora' | 'test' | 'prompt';
147
-
148
- export interface Implementation {
149
- // Identity
150
- id: string; // e.g., "IMPL_060_01_hook"
151
- ruleId: string; // Parent rule ID
152
-
153
- // Type and location
154
- type: ImplementationType;
155
- path: string; // File path, skill ID, or model path
156
- version: string; // Code commit hash, skill version, or LoRA version
157
-
158
- // Coverage
159
- coversCondition: string; // What condition this implementation covers
160
- coveragePercentage: number; // 0-100, how much of the rule this covers
161
-
162
- // Lifecycle state
163
- lifecycleState: ImplementationLifecycleState;
164
-
165
- // Rollback support: tracks which implementation was active before this one
166
- previousActive?: string; // Implementation ID that was active before promotion
167
-
168
- // Disable metadata
169
- disabledAt?: string; // ISO timestamp of disable
170
- disabledBy?: string; // Who disabled (session/user)
171
- disabledReason?: string; // Human-readable reason
172
-
173
- // Archive metadata
174
- archivedAt?: string; // ISO timestamp of archive
175
-
176
- // Metadata
177
- createdAt: string;
178
- updatedAt: string;
179
- }
180
-
181
- // =========================================================================
182
- // 4. PRINCIPLE-RELATIONSHIP GRAPH
183
- // =========================================================================
184
-
185
- export interface PrincipleDependency {
186
- principleId: string;
187
- dependsOn: string[]; // Principle IDs this depends on
188
- conflictedWith: string[]; // Principle IDs this conflicts with
189
- supersedes: string[]; // Principle IDs this replaces
190
- }
191
-
192
- // =========================================================================
193
- // 5. VALUE METRICS (Auto-calculated)
194
- // =========================================================================
195
-
196
- export interface PrincipleValueMetrics {
197
- principleId: string;
198
-
199
- // Pain prevention
200
- painPreventedCount: number; // Total pain signals prevented
201
- avgPainSeverityPrevented: number; // Average severity of prevented pain
202
- lastPainPreventedAt?: string;
203
-
204
- // Adherence tracking
205
- totalOpportunities: number; // Times the principle could have applied
206
- adheredCount: number; // Times the principle was followed
207
- violatedCount: number; // Times the principle was violated
208
-
209
- // Cost-benefit
210
- implementationCost: number; // Dev hours to implement
211
- benefitScore: number; // pain_prevented × severity × adherence_rate
212
-
213
- // Timestamps
214
- calculatedAt: string;
215
- }
216
-
217
- // =========================================================================
218
- // 6. LIFECYCLE EVENTS (Event stream format for evolution.jsonl)
219
- // =========================================================================
220
-
221
- export type PrincipleEventType =
222
- | 'principle_created'
223
- | 'principle_updated'
224
- | 'principle_promoted'
225
- | 'principle_deprecated'
226
- | 'rule_created'
227
- | 'rule_enforced'
228
- | 'rule_retired'
229
- | 'implementation_added'
230
- | 'value_metrics_updated';
231
-
232
- export interface PrincipleLifecycleEvent {
233
- ts: string; // ISO timestamp
234
- type: PrincipleEventType;
235
- data: {
236
- principleId?: string;
237
- ruleId?: string;
238
- implementationId?: string;
239
- reason: string;
240
- metrics?: Partial<PrincipleValueMetrics>;
241
- };
242
- }
243
-
244
- // =========================================================================
245
- // 8. STORE SCHEMA (principle_training_state.json extension)
246
- // =========================================================================
247
-
248
- export interface PrincipleTreeStore {
249
- principles: Record<string, Principle>;
250
- rules: Record<string, Rule>;
251
- implementations: Record<string, Implementation>;
252
- metrics: Record<string, PrincipleValueMetrics>;
253
- lastUpdated: string;
254
52
  }
@@ -1,70 +1,15 @@
1
- /**
2
- * Branded types for queue and workflow domain identifiers.
3
- * These prevent accidental interchange of plain strings with domain-specific IDs.
4
- */
5
-
6
- /**
7
- * Brand type constructor using intersection type pattern.
8
- * @example type UserId = Brand<string, 'UserId'>;
9
- */
10
- export type Brand<T, B> = T & { readonly _brand: B };
11
-
12
- /**
13
- * Queue item identifier — not interchangeable with plain string.
14
- */
15
- export type QueueItemId = Brand<string, 'QueueItemId'>;
16
-
17
- /**
18
- * Workflow identifier — not interchangeable with plain string.
19
- */
20
- export type WorkflowId = Brand<string, 'WorkflowId'>;
21
-
22
- /**
23
- * Session key — not interchangeable with plain string.
24
- */
25
- export type SessionKey = Brand<string, 'SessionKey'>;
26
-
27
- /**
28
- * Constructor for QueueItemId.
29
- * @param id - raw string ID from queue operations
30
- */
31
- export function toQueueItemId(id: string): QueueItemId {
32
- return id as QueueItemId;
33
- }
34
-
35
- /**
36
- * Constructor for WorkflowId.
37
- * @param id - raw string ID from workflow operations
38
- */
39
- export function toWorkflowId(id: string): WorkflowId {
40
- return id as WorkflowId;
41
- }
42
-
43
- /**
44
- * Constructor for SessionKey.
45
- * @param key - raw string key from session operations
46
- */
47
- export function toSessionKey(key: string): SessionKey {
48
- return key as SessionKey;
49
- }
50
-
51
- /**
52
- * Type predicate: true if value is a QueueItemId.
53
- */
54
- export function isQueueItemId(value: unknown): value is QueueItemId {
55
- return typeof value === 'string';
56
- }
57
-
58
- /**
59
- * Type predicate: true if value is a WorkflowId.
60
- */
61
- export function isWorkflowId(value: unknown): value is WorkflowId {
62
- return typeof value === 'string';
63
- }
64
-
65
- /**
66
- * Type predicate: true if value is a SessionKey.
67
- */
68
- export function isSessionKey(value: unknown): value is SessionKey {
69
- return typeof value === 'string';
70
- }
1
+ export type {
2
+ Brand,
3
+ QueueItemId,
4
+ WorkflowId,
5
+ SessionKey,
6
+ } from '@principles/core/runtime-v2';
7
+
8
+ export {
9
+ toQueueItemId,
10
+ toWorkflowId,
11
+ toSessionKey,
12
+ isQueueItemId,
13
+ isWorkflowId,
14
+ isSessionKey,
15
+ } from '@principles/core/runtime-v2';
@@ -1,49 +1,5 @@
1
- /**
2
- * Runtime truth represents the current state of the system.
3
- * Used for control decisions, Phase 3 eligibility, and real-time operations.
4
- * Sources: queue state, active session registry
5
- */
6
- export interface RuntimeTruth {
7
- queueState: {
8
- total: number;
9
- pending: number;
10
- inProgress: number;
11
- completed: number;
12
- lastUpdated: string;
13
- };
14
- activeSessions: string[];
15
- }
16
-
17
- /**
18
- * Analytics truth represents historical data and aggregated metrics.
19
- * Used for insights, trends, and supporting evidence (where explicitly allowed).
20
- * NOT used for control decisions or Phase 3 eligibility.
21
- * Sources: trajectory.db, daily-stats.json, control-ui DB
22
- */
23
- export interface AnalyticsTruth {
24
- trajectoryData: {
25
- totalTasks: number;
26
- successRate: number;
27
- timeoutRate: number;
28
- lastUpdated: string;
29
- };
30
- dailyStats: {
31
- toolCalls: number;
32
- painSignals: number;
33
- evolutionTasks: number;
34
- lastUpdated: string;
35
- };
36
- trends: {
37
- sevenDay: TrendMetrics;
38
- thirtyDay: TrendMetrics;
39
- };
40
- }
41
-
42
- /**
43
- * Trend metrics for analytics aggregation.
44
- */
45
- export interface TrendMetrics {
46
- successRateChange: number;
47
- toolCallVolumeChange: number;
48
- painSignalRateChange: number;
49
- }
1
+ export type {
2
+ RuntimeTruth,
3
+ AnalyticsTruth,
4
+ TrendMetrics,
5
+ } from '@principles/core/runtime-v2';
package/src/utils/io.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import * as path from 'path';
2
2
  import * as fs from 'fs';
3
- import { resolvePdPath } from '../core/paths.js';
4
3
 
5
4
  /**
6
5
  * Atomic file write — write to temp then rename to prevent partial writes on crash.
@@ -148,23 +147,12 @@ export function serializeKvLines(data: Record<string, any>): string {
148
147
  return lines.join('\n');
149
148
  }
150
149
 
151
- export function planStatus(projectDir: string): string {
152
- const planPath = resolvePdPath(projectDir, 'PLAN');
153
- try {
154
- if (!fs.existsSync(planPath)) return '';
155
- const content = fs.readFileSync(planPath, 'utf8');
156
- const lines = content.split('\n');
157
- for (const line of lines) {
158
- if (line.startsWith('STATUS:')) {
159
- const parts = line.split(':');
160
- if (parts.length > 1) {
161
- return parts[1].trim().split(/\s+/)[0] || '';
162
- }
163
- }
164
- }
165
- /* eslint-disable @typescript-eslint/no-unused-vars -- Reason: Error is intentionally ignored for graceful degradation */
166
- } catch (_e) {
167
- // Ignore read errors
168
- }
169
- return '';
150
+ /**
151
+ * Normalize command arguments from PluginCommandContext.args.
152
+ * Handles string | string[] | undefined union by joining arrays with spaces.
153
+ */
154
+ export function normalizeCommandArgs(args: string | string[] | undefined): string {
155
+ if (args === undefined || args === null) return '';
156
+ if (Array.isArray(args)) return args.join(' ');
157
+ return args;
170
158
  }
@@ -307,7 +307,7 @@ export async function retryNetworkRequest<T>(
307
307
  }
308
308
 
309
309
  // =========================================================================
310
- // Dynamic Timeout Support (from dynamic-timeout.ts)
310
+ // Dynamic Timeout Support
311
311
  // =========================================================================
312
312
 
313
313
  /** Minimum samples needed before trusting learned timeout values */
@@ -35,8 +35,8 @@ export function computeRuntimeShadowTaskFingerprint(
35
35
  label: event.label ?? '',
36
36
  mode: event.mode,
37
37
  threadRequested: event.threadRequested,
38
- requesterChannel: event.requester?.channel ?? '',
39
- requesterThreadId: event.requester?.threadId ?? '',
38
+ requesterChannel: (event.requester as { channel?: string })?.channel ?? '',
39
+ requesterThreadId: (event.requester as { threadId?: string })?.threadId ?? '',
40
40
  };
41
41
  return crypto.createHash('sha256').update(JSON.stringify(payload)).digest('hex').slice(0, RUNTIME_SHADOW_FINGERPRINT_HEX_LENGTH);
42
42
  }
@@ -8,6 +8,7 @@ import type { OpenClawPluginApi, PluginCommandContext } from '../openclaw-sdk.js
8
8
  import { validateWorkspaceDir, type WorkspaceResolutionContext } from '../core/workspace-dir-validation.js';
9
9
  import { resolveWorkspaceDir } from '../core/workspace-dir-service.js';
10
10
  import { resolveWorkspaceDirFromApi } from '../core/path-resolver.js';
11
+ import * as path from 'path';
11
12
 
12
13
  /**
13
14
  * Resolve workspace directory for command execution.
@@ -93,3 +94,52 @@ export function resolveToolHookWorkspaceDirSafe(
93
94
  ): string | undefined {
94
95
  return resolveWorkspaceDir(api, ctx, { source });
95
96
  }
97
+
98
+ export class WorkspaceResolutionError extends Error {
99
+ readonly reason: string;
100
+ readonly nextAction: string;
101
+
102
+ constructor(message: string, reason: string, nextAction: string) {
103
+ super(message);
104
+ this.name = 'WorkspaceResolutionError';
105
+ this.reason = reason;
106
+ this.nextAction = nextAction;
107
+ }
108
+
109
+ toJSON() {
110
+ return {
111
+ ok: false as const,
112
+ reason: this.reason,
113
+ message: this.message,
114
+ nextAction: this.nextAction,
115
+ };
116
+ }
117
+ }
118
+
119
+ export function resolveWorkspaceDirForRuntimeV2(
120
+ ctx: { workspaceDir?: string },
121
+ api: OpenClawPluginApi | undefined,
122
+ source: string,
123
+ ): string {
124
+ const explicit = ctx.workspaceDir;
125
+ if (!explicit || !explicit.trim()) {
126
+ throw new WorkspaceResolutionError(
127
+ `No explicit workspace directory for Runtime V2 entrypoint (${source}). ` +
128
+ 'Provide workspaceDir in context. Runtime V2 does not use legacy discovery fallback.',
129
+ 'workspace_dir_missing',
130
+ 'Ensure the OpenClaw hook context includes workspaceDir, or set PD_WORKSPACE_DIR environment variable.',
131
+ );
132
+ }
133
+
134
+ const normalized = path.resolve(explicit.trim());
135
+ const validation = validateWorkspaceDir(normalized);
136
+ if (validation) {
137
+ throw new WorkspaceResolutionError(
138
+ `workspaceDir validation failed for ${source}: ${validation}`,
139
+ 'workspace_dir_invalid',
140
+ 'Provide a valid workspaceDir that is not the home directory, root, or empty.',
141
+ );
142
+ }
143
+
144
+ return normalized;
145
+ }
@@ -17,8 +17,7 @@ As Principles Disciple, you must distinguish between two physical spaces:
17
17
  Make decisions based on relative paths in the **Project Battlefield**:
18
18
 
19
19
  - **Strategic Focus**: `./memory/STRATEGY.md`
20
- - **Physical Plan**: `./PLAN.md`
21
- - **Pain Signal**: `./.state/.pain_flag`
20
+ - **Pain Signal**: Runtime V2 `PainSignalBridge` (`pd pain record` for manual trigger; `.state/.pain_flag` is legacy compatibility only)
22
21
  - **System Capabilities**: `./.state/SYSTEM_CAPABILITIES.json`
23
22
 
24
23
  ---
@@ -72,7 +71,7 @@ When you receive a heartbeat poll, don't just reply `HEARTBEAT_OK` every time. U
72
71
 
73
72
  ### What to Check (rotate through these):
74
73
 
75
- - **Pain & Evolution**: Check `.pain_flag`, `EVOLUTION_QUEUE.json`
74
+ - **Pain & Evolution**: Check Runtime V2 diagnostics (`pd pain record`, candidates, ledger) and `EVOLUTION_QUEUE.json`; `.pain_flag` is legacy compatibility only
76
75
  - **Strategic Alignment**: Compare against `CURRENT_FOCUS.md`
77
76
  - **Environment Health**: Tool chain status, project root cleanliness
78
77
 
@@ -166,12 +165,13 @@ On platforms that support reactions (Discord, Slack), use emoji reactions natura
166
165
  You default to architect mode.
167
166
 
168
167
  - **L1 (Direct Execution)**: Single-file tweaks, doc maintenance → do it directly
169
- - **L2 (Delegation Protocol)**: Major changes → **MUST** update `./PLAN.md` and use `pd_spawn_agent` tool
168
+ - **L2 (Delegation Protocol)**: Major changes → recommended to describe the plan and get owner confirmation before executing
170
169
 
171
- ### State Machine Gating
170
+ ### Planning Guidance
172
171
 
173
- - **Single source of truth**: `./PLAN.md`
174
- - **Physical interception**: Plugin activated. If `PLAN.md` is not `READY` and you attempt to modify risk paths, calls will be blocked
172
+ - For complex tasks, consider drafting a plan document and getting owner approval before making large changes
173
+ - This is a behavioral suggestion, not a built-in gate PD does not enforce plan-before-action by default
174
+ - If an owner-approved RuleHost rule enforces planning behavior, that rule takes effect automatically
175
175
  - **Prevent pollution**: Never write execution details back to strategic documents
176
176
 
177
177
  ---
@@ -16,7 +16,7 @@ Short, explicit instructions for what OpenClaw should do on startup. If the task
16
16
  2. **Confirm workspace**: Check current working directory is correct
17
17
  3. **Read identity files**: `SOUL.md`, `USER.md`, `IDENTITY.md`
18
18
  4. **Check memory state**: Read today's and yesterday's `memory/YYYY-MM-DD.md`
19
- 5. **Check pain signals**: See if `.state/.pain_flag` exists
19
+ 5. **Check Runtime V2 pain diagnostics**: use `pd candidate list` / ledger state; `.state/.pain_flag` is legacy compatibility only
20
20
 
21
21
  ---
22
22
 
@@ -8,7 +8,7 @@ On each heartbeat, run these core checks. **Don't just reply `HEARTBEAT_OK` ever
8
8
 
9
9
  ## 🩹 Pain & Evolution Check
10
10
 
11
- - [ ] **`.state/.pain_flag`** Any unprocessed pain signals?
11
+ - [ ] **Runtime V2 pain** — Check `pd candidate list` / ledger if a recent `pd pain record` or tool failure occurred. `.state/.pain_flag` is legacy compatibility only.
12
12
  - [ ] **`.state/evolution_queue.json`** — Any pending evolution tasks?
13
13
  - [ ] **`memory/logs/SYSTEM.log`** — Any unresolved high-priority issues?
14
14
 
@@ -71,4 +71,4 @@ On each heartbeat, run these core checks. **Don't just reply `HEARTBEAT_OK` ever
71
71
 
72
72
  ---
73
73
 
74
- *If no issues and no action needed, reply `HEARTBEAT_OK` to save tokens.*
74
+ *If no issues and no action needed, reply `HEARTBEAT_OK` to save tokens.*
@@ -39,8 +39,9 @@ LLMs are highly sensitive to XML tags; this structure is designed to boost instr
39
39
  <!-- 执行与物理限制 (Execution & Physical Constraints) -->
40
40
  <directive id="T-05" name="PHYSICAL_DEFENSE_AND_ORCHESTRATION">
41
41
  <trigger>When asked to perform a major refactoring, multi-file change (>2 files), or an architectural shift.</trigger>
42
- <must>Limit your blast radius. You MUST draft a `PLAN.md` (status: READY). After any code change, you MUST run canary tests (e.g., `npm test`, linters) to verify integrity.</must>
43
- <forbidden>Executing large-scale unstructured changes directly without a plan, or skipping post-modification validation.</forbidden>
42
+ <should>For complex changes, describe your plan and get owner confirmation before executing.</should>
43
+ <must>Limit your blast radius. After any code change, you MUST run canary tests (e.g., `npm test`, linters) to verify integrity.</must>
44
+ <forbidden>Executing large-scale unstructured changes directly, or skipping post-modification validation.</forbidden>
44
45
  </directive>
45
46
 
46
47
  <directive id="T-06" name="OCCAMS_RAZOR_MVC">