principles-disciple 1.71.0 → 1.73.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 (309) hide show
  1. package/openclaw.plugin.json +10 -5
  2. package/package.json +17 -19
  3. package/scripts/acceptance-test.mjs +16 -73
  4. package/scripts/sync-plugin.mjs +382 -77
  5. package/src/commands/archive-impl.ts +2 -1
  6. package/src/commands/capabilities.ts +2 -2
  7. package/src/commands/context.ts +2 -2
  8. package/src/commands/disable-impl.ts +2 -1
  9. package/src/commands/evolution-status.ts +16 -16
  10. package/src/commands/export.ts +12 -67
  11. package/src/commands/pain.ts +91 -1
  12. package/src/commands/principle-rollback.ts +2 -1
  13. package/src/commands/promote-impl.ts +7 -43
  14. package/src/commands/rollback-impl.ts +2 -1
  15. package/src/commands/rollback.ts +2 -1
  16. package/src/commands/samples.ts +2 -1
  17. package/src/commands/thinking-os.ts +2 -1
  18. package/src/config/errors.ts +18 -2
  19. package/src/constants/diagnostician.ts +2 -2
  20. package/src/constants/tools.ts +2 -1
  21. package/src/core/__tests__/focus-history.test.ts +210 -0
  22. package/src/core/config.ts +1 -1
  23. package/src/core/confirm-first-gate.ts +255 -0
  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 +38 -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/pain-diagnostic-gate.ts +154 -0
  37. package/src/core/pain-signal.ts +21 -138
  38. package/src/core/pain.ts +15 -88
  39. package/src/core/pd-task-reconciler.ts +26 -115
  40. package/src/core/pd-task-service.ts +9 -9
  41. package/src/core/pd-task-types.ts +23 -127
  42. package/src/core/principle-compiler/__tests__/compiler-replay-gate.test.ts +174 -0
  43. package/src/core/principle-compiler/code-validator.ts +15 -42
  44. package/src/core/principle-compiler/compiler.ts +100 -15
  45. package/src/core/principle-compiler/index.ts +5 -2
  46. package/src/core/principle-compiler/template-generator.ts +4 -104
  47. package/src/core/principle-injection.ts +10 -202
  48. package/src/core/principle-internalization/filesystem-lifecycle-datasource.ts +42 -0
  49. package/src/core/principle-internalization/lifecycle-read-model.ts +39 -242
  50. package/src/core/principle-internalization/principle-lifecycle-service.ts +12 -10
  51. package/src/core/principle-tree-ledger-adapter.ts +145 -0
  52. package/src/core/principle-tree-ledger.ts +8 -6
  53. package/src/core/reflection/reflection-context.ts +14 -109
  54. package/src/core/replay-engine.ts +8 -500
  55. package/src/core/rule-host-helpers.ts +5 -35
  56. package/src/core/rule-host-types.ts +10 -82
  57. package/src/core/rule-host.ts +6 -63
  58. package/src/core/runtime-v2-prompt-activation-reader.ts +231 -0
  59. package/src/core/session-tracker.ts +87 -101
  60. package/src/core/shadow-observation-registry.ts +19 -48
  61. package/src/core/trajectory.ts +3 -1
  62. package/src/core/workflow-funnel-loader.ts +62 -68
  63. package/src/core/workspace-context.ts +46 -0
  64. package/src/core/workspace-dir-service.ts +1 -1
  65. package/src/core/workspace-dir-validation.ts +18 -9
  66. package/src/hooks/AGENTS.md +1 -1
  67. package/src/hooks/gate-block-helper.ts +46 -44
  68. package/src/hooks/gate.ts +207 -7
  69. package/src/hooks/lifecycle.ts +30 -32
  70. package/src/hooks/llm.ts +60 -32
  71. package/src/hooks/pain.ts +297 -103
  72. package/src/hooks/prompt.ts +469 -339
  73. package/src/hooks/subagent.ts +2 -29
  74. package/src/i18n/commands.ts +2 -10
  75. package/src/index.ts +95 -85
  76. package/src/openclaw-sdk.ts +311 -0
  77. package/src/service/central-database.ts +8 -4
  78. package/src/service/evolution-queue-migration.ts +2 -1
  79. package/src/service/evolution-worker.ts +163 -1786
  80. package/src/service/internalization-trigger-adapter.ts +302 -0
  81. package/src/service/keyword-optimization-service.ts +4 -4
  82. package/src/service/monitoring-query-service.ts +1 -215
  83. package/src/service/queue-io.ts +60 -331
  84. package/src/service/runtime-summary-service.ts +115 -18
  85. package/src/service/subagent-workflow/index.ts +0 -41
  86. package/src/service/subagent-workflow/types.ts +9 -120
  87. package/src/service/subagent-workflow/workflow-store.ts +2 -119
  88. package/src/service/workflow-watchdog.ts +0 -43
  89. package/src/types/event-payload.ts +16 -74
  90. package/src/types/event-types.ts +39 -547
  91. package/src/types/hygiene-types.ts +7 -30
  92. package/src/types/principle-tree-schema.ts +20 -222
  93. package/src/types/queue.ts +15 -70
  94. package/src/types/runtime-summary.ts +5 -49
  95. package/src/utils/io.ts +10 -0
  96. package/src/utils/retry.ts +1 -1
  97. package/src/utils/shadow-fingerprint.ts +2 -2
  98. package/src/utils/workspace-resolver.ts +50 -0
  99. package/templates/langs/en/core/AGENTS.md +2 -2
  100. package/templates/langs/en/core/BOOT.md +1 -1
  101. package/templates/langs/en/core/HEARTBEAT.md +2 -2
  102. package/templates/langs/en/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  103. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  104. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  105. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  106. package/templates/langs/en/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  107. package/templates/langs/en/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
  108. package/templates/langs/en/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  109. package/templates/langs/en/skills/evolve-task/SKILL.md +1 -1
  110. package/templates/langs/en/skills/pd-cli-operator/SKILL.md +67 -0
  111. package/templates/langs/en/skills/pd-diagnostician/SKILL.md +1 -1
  112. package/templates/langs/en/skills/pd-mentor/SKILL.md +1 -1
  113. package/templates/langs/en/skills/pd-pain-signal/SKILL.md +17 -39
  114. package/templates/langs/en/skills/pd-runtime-v2/SKILL.md +61 -0
  115. package/templates/langs/zh/core/AGENTS.md +2 -2
  116. package/templates/langs/zh/core/BOOT.md +1 -1
  117. package/templates/langs/zh/core/HEARTBEAT.md +2 -2
  118. package/templates/langs/zh/skills/ai-sprint-orchestration/references/agent-registry.json +1 -72
  119. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/bugfix-complex-template.json +6 -6
  120. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/feature-complex-template.json +6 -6
  121. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/nocturnal-trinity-quality-enhancement.json +8 -8
  122. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal-verify.json +2 -12
  123. package/templates/langs/zh/skills/ai-sprint-orchestration/references/specs/workflow-validation-minimal.json +2 -12
  124. package/templates/langs/zh/skills/ai-sprint-orchestration/runtime/.gitignore +2 -2
  125. package/templates/langs/zh/skills/ai-sprint-orchestration/scripts/run.mjs +51 -15
  126. package/templates/langs/zh/skills/ai-sprint-orchestration/test/run.test.mjs +21 -5
  127. package/templates/langs/zh/skills/evolve-task/SKILL.md +2 -2
  128. package/templates/langs/zh/skills/pd-cli-operator/SKILL.md +67 -0
  129. package/templates/langs/zh/skills/pd-diagnostician/SKILL.md +1 -1
  130. package/templates/langs/zh/skills/pd-mentor/SKILL.md +1 -1
  131. package/templates/langs/zh/skills/pd-pain-signal/SKILL.md +17 -38
  132. package/templates/langs/zh/skills/pd-runtime-v2/SKILL.md +61 -0
  133. package/tests/build-artifacts.test.ts +1 -3
  134. package/tests/commands/evolution-status.test.ts +0 -118
  135. package/tests/core/bootstrap-rules.test.ts +1 -1
  136. package/tests/core/config.test.ts +1 -1
  137. package/tests/core/event-log.test.ts +35 -0
  138. package/tests/core/evolution-engine.test.ts +610 -0
  139. package/tests/core/file-store.test.ts +102 -0
  140. package/tests/core/focus-history.test.ts +203 -11
  141. package/tests/core/merge-gate-audit.test.ts +2 -169
  142. package/tests/core/model-deployment-registry.test.ts +7 -1
  143. package/tests/core/model-training-registry.test.ts +19 -0
  144. package/tests/core/observability.test.ts +0 -1
  145. package/tests/core/pain-diagnostic-gate.test.ts +498 -0
  146. package/tests/core/pain.test.ts +0 -1
  147. package/tests/core/principle-internalization/deprecated-readiness.test.ts +2 -2
  148. package/tests/core/principle-internalization/lifecycle-metrics.test.ts +2 -2
  149. package/tests/core/principle-internalization/{internalization-routing-policy.test.ts → lifecycle-routing-policy.test.ts} +6 -6
  150. package/tests/core/principle-internalization/lineage-source-retired.test.ts +56 -0
  151. package/tests/core/principle-internalization/principle-lifecycle-service.test.ts +1 -23
  152. package/tests/core/principle-tree-ledger-adapter.test.ts +253 -0
  153. package/tests/core/reflection-context.test.ts +0 -14
  154. package/tests/core/replay-engine.test.ts +127 -215
  155. package/tests/core/rule-host-helpers.test.ts +2 -2
  156. package/tests/core/rule-implementation-runtime.test.ts +0 -27
  157. package/tests/core/workflow-funnel-loader.test.ts +162 -0
  158. package/tests/core/workspace-dir-validation.test.ts +8 -1
  159. package/tests/core-anti-growth.test.ts +192 -0
  160. package/tests/hook-workspace-nextaction-contract.test.ts +42 -0
  161. package/tests/hooks/confirm-first-gate.test.ts +333 -0
  162. package/tests/hooks/gate-auto-correct-shadow.test.ts +310 -0
  163. package/tests/hooks/gate-auto-correct.test.ts +665 -0
  164. package/tests/hooks/gate-rule-host-pipeline.test.ts +2 -1
  165. package/tests/hooks/pain.test.ts +269 -12
  166. package/tests/hooks/prompt-characterization.test.ts +500 -0
  167. package/tests/hooks/prompt-size-guard.test.ts +329 -0
  168. package/tests/hooks/runtime-v2-prompt-activation.test.ts +869 -0
  169. package/tests/index.test.ts +94 -1
  170. package/tests/integration/auto-entry-gate.test.ts +248 -0
  171. package/tests/integration/internalization-trigger-guard.test.ts +69 -0
  172. package/tests/integration/m8-legacy-paths.test.ts +63 -0
  173. package/tests/integration/runtime-v2-pain-guard.test.ts +125 -0
  174. package/tests/plugin-config-resolution-cutover.test.ts +359 -0
  175. package/tests/runtime-v2-discovery-guard.test.ts +154 -0
  176. package/tests/service/central-database.test.ts +457 -0
  177. package/tests/service/evolution-worker.correction-observer.test.ts +173 -0
  178. package/tests/service/evolution-worker.timeout.test.ts +11 -129
  179. package/tests/service/internalization-trigger-adapter.test.ts +251 -0
  180. package/tests/service/monitoring-query-service.test.ts +1 -47
  181. package/tests/service/queue-io.test.ts +1 -62
  182. package/tests/service/runtime-summary-service.test.ts +184 -3
  183. package/tests/service/workflow-watchdog.test.ts +0 -91
  184. package/tests/utils/file-lock.test.ts +5 -3
  185. package/tests/utils/session-key.test.ts +52 -0
  186. package/tests/utils/subagent-probe.test.ts +48 -1
  187. package/vitest.config.ts +4 -11
  188. package/.planning/codebase/ARCHITECTURE.md +0 -157
  189. package/.planning/codebase/CONCERNS.md +0 -145
  190. package/.planning/codebase/CONVENTIONS.md +0 -148
  191. package/.planning/codebase/INTEGRATIONS.md +0 -81
  192. package/.planning/codebase/STACK.md +0 -87
  193. package/.planning/codebase/STRUCTURE.md +0 -193
  194. package/.planning/codebase/TESTING.md +0 -243
  195. package/.planning/phases/01-basic-visualization/01-GAP-CLOSURE-VERIFICATION.md +0 -113
  196. package/docs/COMMAND_REFERENCE.md +0 -76
  197. package/docs/COMMAND_REFERENCE_EN.md +0 -79
  198. package/scripts/build-web.mjs +0 -46
  199. package/scripts/diagnose-nocturnal.mjs +0 -537
  200. package/scripts/seed-nocturnal-scenarios.mjs +0 -384
  201. package/src/commands/nocturnal-review.ts +0 -322
  202. package/src/commands/nocturnal-rollout.ts +0 -790
  203. package/src/commands/nocturnal-train.ts +0 -986
  204. package/src/commands/pd-reflect.ts +0 -88
  205. package/src/core/adaptive-thresholds.ts +0 -478
  206. package/src/core/diagnostician-task-store.ts +0 -192
  207. package/src/core/nocturnal-arbiter.ts +0 -715
  208. package/src/core/nocturnal-artifact-lineage.ts +0 -116
  209. package/src/core/nocturnal-artificer.ts +0 -257
  210. package/src/core/nocturnal-candidate-scoring.ts +0 -530
  211. package/src/core/nocturnal-compliance.ts +0 -1146
  212. package/src/core/nocturnal-dataset.ts +0 -763
  213. package/src/core/nocturnal-executability.ts +0 -428
  214. package/src/core/nocturnal-export.ts +0 -499
  215. package/src/core/nocturnal-paths.ts +0 -240
  216. package/src/core/nocturnal-reasoning-deriver.ts +0 -343
  217. package/src/core/nocturnal-rule-implementation-validator.ts +0 -246
  218. package/src/core/nocturnal-snapshot-contract.ts +0 -99
  219. package/src/core/nocturnal-trajectory-extractor.ts +0 -512
  220. package/src/core/nocturnal-trinity-types.ts +0 -218
  221. package/src/core/nocturnal-trinity.ts +0 -2680
  222. package/src/core/principle-internalization/deprecated-readiness.ts +0 -93
  223. package/src/core/principle-internalization/internalization-routing-policy.ts +0 -208
  224. package/src/core/principle-internalization/lifecycle-metrics.ts +0 -152
  225. package/src/http/principles-console-route.ts +0 -709
  226. package/src/service/central-health-service.ts +0 -49
  227. package/src/service/central-overview-service.ts +0 -138
  228. package/src/service/control-ui-query-service.ts +0 -900
  229. package/src/service/cooldown-strategy.ts +0 -97
  230. package/src/service/evolution-pain-context.ts +0 -79
  231. package/src/service/evolution-query-service.ts +0 -407
  232. package/src/service/health-query-service.ts +0 -1038
  233. package/src/service/nocturnal-config.ts +0 -214
  234. package/src/service/nocturnal-runtime.ts +0 -734
  235. package/src/service/nocturnal-service.ts +0 -1605
  236. package/src/service/nocturnal-target-selector.ts +0 -545
  237. package/src/service/sleep-cycle.ts +0 -157
  238. package/src/service/startup-reconciler.ts +0 -112
  239. package/src/service/subagent-workflow/correction-observer-types.ts +0 -82
  240. package/src/service/subagent-workflow/correction-observer-workflow-manager.ts +0 -250
  241. package/src/service/subagent-workflow/deep-reflect-workflow-manager.ts +0 -1
  242. package/src/service/subagent-workflow/dynamic-timeout.ts +0 -30
  243. package/src/service/subagent-workflow/empathy-observer-workflow-manager.ts +0 -268
  244. package/src/service/subagent-workflow/nocturnal-workflow-manager.ts +0 -795
  245. package/src/service/subagent-workflow/runtime-direct-driver.ts +0 -268
  246. package/src/service/subagent-workflow/workflow-manager-base.ts +0 -580
  247. package/src/tools/write-pain-flag.ts +0 -215
  248. package/tests/commands/nocturnal-review.test.ts +0 -448
  249. package/tests/commands/nocturnal-train.test.ts +0 -97
  250. package/tests/commands/pd-reflect.test.ts +0 -49
  251. package/tests/core/adaptive-thresholds.test.ts +0 -261
  252. package/tests/core/nocturnal-arbiter.test.ts +0 -559
  253. package/tests/core/nocturnal-artifact-lineage.test.ts +0 -53
  254. package/tests/core/nocturnal-artificer.test.ts +0 -241
  255. package/tests/core/nocturnal-candidate-scoring.test.ts +0 -532
  256. package/tests/core/nocturnal-compliance-p-principles.test.ts +0 -133
  257. package/tests/core/nocturnal-compliance.test.ts +0 -646
  258. package/tests/core/nocturnal-dataset.test.ts +0 -892
  259. package/tests/core/nocturnal-e2e.test.ts +0 -234
  260. package/tests/core/nocturnal-executability.test.ts +0 -357
  261. package/tests/core/nocturnal-export.test.ts +0 -517
  262. package/tests/core/nocturnal-reasoning-deriver.test.ts +0 -372
  263. package/tests/core/nocturnal-reviewed-subset-comparison.test.ts +0 -428
  264. package/tests/core/nocturnal-rule-implementation-validator.test.ts +0 -127
  265. package/tests/core/nocturnal-snapshot-contract.test.ts +0 -121
  266. package/tests/core/nocturnal-trajectory-extractor.test.ts +0 -634
  267. package/tests/core/nocturnal-trinity.test.ts +0 -2053
  268. package/tests/core/pain-auto-repair.test.ts +0 -96
  269. package/tests/core/pain-integration.test.ts +0 -510
  270. package/tests/fixtures/nocturnal-reviewed-subset.json +0 -183
  271. package/tests/http/principles-console-route.test.ts +0 -162
  272. package/tests/integration/chaos-resilience.test.ts +0 -348
  273. package/tests/integration/empathy-workflow-integration.test.ts +0 -626
  274. package/tests/integration/pain-diagnostician-loop.e2e.test.ts +0 -380
  275. package/tests/service/control-ui-query-service.test.ts +0 -121
  276. package/tests/service/cooldown-strategy.test.ts +0 -164
  277. package/tests/service/data-endpoints-regression.test.ts +0 -834
  278. package/tests/service/empathy-observer-workflow-manager.test.ts +0 -175
  279. package/tests/service/evolution-worker.nocturnal.test.ts +0 -601
  280. package/tests/service/nocturnal-runtime-hardening.test.ts +0 -118
  281. package/tests/service/nocturnal-runtime.test.ts +0 -473
  282. package/tests/service/nocturnal-service-code-candidate.test.ts +0 -330
  283. package/tests/service/nocturnal-target-selector.test.ts +0 -615
  284. package/tests/service/startup-reconciler.test.ts +0 -148
  285. package/tests/tools/write-pain-flag.test.ts +0 -358
  286. package/ui/src/App.tsx +0 -45
  287. package/ui/src/api.ts +0 -220
  288. package/ui/src/charts.tsx +0 -955
  289. package/ui/src/components/ErrorState.tsx +0 -6
  290. package/ui/src/components/Loading.tsx +0 -13
  291. package/ui/src/components/ProtectedRoute.tsx +0 -12
  292. package/ui/src/components/Shell.tsx +0 -91
  293. package/ui/src/components/WorkspaceConfig.tsx +0 -178
  294. package/ui/src/components/index.ts +0 -5
  295. package/ui/src/context/auth.tsx +0 -80
  296. package/ui/src/context/theme.tsx +0 -66
  297. package/ui/src/hooks/useAutoRefresh.ts +0 -39
  298. package/ui/src/i18n/ui.ts +0 -473
  299. package/ui/src/main.tsx +0 -16
  300. package/ui/src/pages/EvolutionPage.tsx +0 -333
  301. package/ui/src/pages/FeedbackPage.tsx +0 -138
  302. package/ui/src/pages/GateMonitorPage.tsx +0 -136
  303. package/ui/src/pages/LoginPage.tsx +0 -89
  304. package/ui/src/pages/OverviewPage.tsx +0 -599
  305. package/ui/src/pages/SamplesPage.tsx +0 -174
  306. package/ui/src/pages/ThinkingModelsPage.tsx +0 -702
  307. package/ui/src/styles.css +0 -2020
  308. package/ui/src/types.ts +0 -384
  309. 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
@@ -168,3 +168,13 @@ export function planStatus(projectDir: string): string {
168
168
  }
169
169
  return '';
170
170
  }
171
+
172
+ /**
173
+ * Normalize command arguments from PluginCommandContext.args.
174
+ * Handles string | string[] | undefined union by joining arrays with spaces.
175
+ */
176
+ export function normalizeCommandArgs(args: string | string[] | undefined): string {
177
+ if (args === undefined || args === null) return '';
178
+ if (Array.isArray(args)) return args.join(' ');
179
+ return args;
180
+ }
@@ -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
+ }
@@ -18,7 +18,7 @@ Make decisions based on relative paths in the **Project Battlefield**:
18
18
 
19
19
  - **Strategic Focus**: `./memory/STRATEGY.md`
20
20
  - **Physical Plan**: `./PLAN.md`
21
- - **Pain Signal**: `./.state/.pain_flag`
21
+ - **Pain Signal**: Runtime V2 `PainSignalBridge` (`pd pain record` for manual trigger; `.state/.pain_flag` is legacy compatibility only)
22
22
  - **System Capabilities**: `./.state/SYSTEM_CAPABILITIES.json`
23
23
 
24
24
  ---
@@ -72,7 +72,7 @@ When you receive a heartbeat poll, don't just reply `HEARTBEAT_OK` every time. U
72
72
 
73
73
  ### What to Check (rotate through these):
74
74
 
75
- - **Pain & Evolution**: Check `.pain_flag`, `EVOLUTION_QUEUE.json`
75
+ - **Pain & Evolution**: Check Runtime V2 diagnostics (`pd pain record`, candidates, ledger) and `EVOLUTION_QUEUE.json`; `.pain_flag` is legacy compatibility only
76
76
  - **Strategic Alignment**: Compare against `CURRENT_FOCUS.md`
77
77
  - **Environment Health**: Tool chain status, project root cleanliness
78
78
 
@@ -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.*
@@ -4,77 +4,6 @@
4
4
  "lastUpdated": "2026-04-04",
5
5
 
6
6
  "agents": {
7
- "iflow": {
8
- "command": "iflow --experimental-acp",
9
- "description": "iFlow CLI with ACP support (智谱 Code Plan / MiniMax Code Plan 付费套餐更稳定,但以下模型全部免费)",
10
- "version": "0.5.18",
11
- "models": {
12
- "glm-4.7": {
13
- "description": "GLM-4.7 — official recommended model, fast",
14
- "pricing": "free",
15
- "recommendedTimeoutSeconds": 1200,
16
- "features": ["recommended", "fast"],
17
- "notes": "官方推荐模型,速度快"
18
- },
19
- "glm-5": {
20
- "description": "GLM-5 — 744B parameters, long-context",
21
- "pricing": "free",
22
- "recommendedTimeoutSeconds": 1800,
23
- "features": ["slow", "needs-extra-time"],
24
- "notes": "744B 参数,运行明显较慢。Review 任务超时必须 ≥ 1800s"
25
- },
26
- "qwen3-coder-plus": {
27
- "description": "Qwen3-Coder-Plus — efficient coding model",
28
- "pricing": "free",
29
- "recommendedTimeoutSeconds": 1200,
30
- "features": ["fast", "coding-optimized"],
31
- "notes": "通义编码模型"
32
- },
33
- "deepseek-v3.2": {
34
- "description": "DeepSeek V3.2",
35
- "pricing": "free",
36
- "recommendedTimeoutSeconds": 1200,
37
- "features": ["fast"],
38
- "notes": ""
39
- },
40
- "minimax-m2.5": {
41
- "description": "MiniMax M2.5",
42
- "pricing": "free",
43
- "recommendedTimeoutSeconds": 1200,
44
- "features": ["fast"],
45
- "notes": ""
46
- },
47
- "kimi-k2-thinking": {
48
- "description": "Kimi K2 Thinking",
49
- "pricing": "free",
50
- "recommendedTimeoutSeconds": 1800,
51
- "features": ["reasoning"],
52
- "notes": "推理型模型"
53
- },
54
- "kimi-k2.5": {
55
- "description": "Kimi K2.5",
56
- "pricing": "free",
57
- "recommendedTimeoutSeconds": 1200,
58
- "features": ["fast"],
59
- "notes": ""
60
- },
61
- "kimi-k2-0905": {
62
- "description": "Kimi K2 0905",
63
- "pricing": "free",
64
- "recommendedTimeoutSeconds": 1200,
65
- "features": ["fast"],
66
- "notes": ""
67
- },
68
- "iflow-rome-30ba3b": {
69
- "description": "iFlow ROME 30BA3B",
70
- "pricing": "free",
71
- "recommendedTimeoutSeconds": 1200,
72
- "features": ["preview"],
73
- "notes": "预览版本"
74
- }
75
- }
76
- },
77
-
78
7
  "opencode": {
79
8
  "command": "npx -y opencode-ai acp",
80
9
  "description": "OpenCode ACP adapter",
@@ -209,6 +138,6 @@
209
138
  "codex": "codex-acp 在当前环境无法使用,不登记。",
210
139
  "kilocode": "kilocode ACP 是 server 模式(监听端口),不是 headless prompt-response,不兼容 acpx,不登记。",
211
140
  "qodercli": "qodercli 没有 --acp 标志,不登记。",
212
- "model_discovery": "opencode 可通过 'opencode models' 自动列出模型。其他 agent(iflow, gemini, qwen)没有 CLI 列表命令,需手动维护。"
141
+ "model_discovery": "opencode 可通过 'opencode models' 自动列出模型。其他 agent(gemini, qwen)没有 CLI 列表命令,需手动维护。"
213
142
  }
214
143
  }
@@ -33,19 +33,19 @@
33
33
  "stageTimeoutMinutes": 15,
34
34
  "stages": ["investigate", "implement-pass-1", "verify"],
35
35
  "producer": {
36
- "agent": "iflow",
37
- "model": "glm-4.7",
36
+ "agent": "opencode",
37
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
38
38
  "timeoutSeconds": 180
39
39
  },
40
40
  "reviewerA": {
41
- "agent": "iflow",
42
- "model": "glm-4.7",
41
+ "agent": "opencode",
42
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
43
43
  "timeoutSeconds": 120,
44
44
  "focus": "Validate root cause, behavioral change, and code correctness."
45
45
  },
46
46
  "reviewerB": {
47
- "agent": "iflow",
48
- "model": "glm-4.7",
47
+ "agent": "opencode",
48
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
49
49
  "timeoutSeconds": 120,
50
50
  "focus": "Validate scope control, verification quality, and regression risk."
51
51
  },
@@ -33,19 +33,19 @@
33
33
  "stageTimeoutMinutes": 20,
34
34
  "stages": ["investigate", "implement-pass-1", "verify"],
35
35
  "producer": {
36
- "agent": "iflow",
37
- "model": "glm-4.7",
36
+ "agent": "opencode",
37
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
38
38
  "timeoutSeconds": 240
39
39
  },
40
40
  "reviewerA": {
41
- "agent": "iflow",
42
- "model": "glm-4.7",
41
+ "agent": "opencode",
42
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
43
43
  "timeoutSeconds": 120,
44
44
  "focus": "Validate feature behavior, acceptance criteria coverage, and architecture fit."
45
45
  },
46
46
  "reviewerB": {
47
- "agent": "iflow",
48
- "model": "glm-4.7",
47
+ "agent": "opencode",
48
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
49
49
  "timeoutSeconds": 120,
50
50
  "focus": "Validate implementation scope, verification evidence, and regression risk."
51
51
  },