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
@@ -0,0 +1,191 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+
5
+ // ── PRI-212: Plugin core anti-growth architecture guard ─────────────────────
6
+ //
7
+ // Prevents new unclassified files from being added to packages/openclaw-plugin/src/core/
8
+ // without explicit allowlisting. New pure domain logic MUST go to @principles/core.
9
+ //
10
+ // Baseline from PRI-211 inventory (2026-05-21).
11
+ // Reference: docs/reviews/plugin-core-inventory-2026-05.md
12
+ //
13
+ // How to add a new file:
14
+ // 1. Is it pure domain logic? → add to @principles/core, NOT here
15
+ // 2. Is it a plugin I/O adapter/binding? → add to PLUGIN_IO_FILES
16
+ // with a comment explaining why it belongs in plugin core
17
+ // 3. NEVER add to/from FROZEN_LEGACY (ADR-0005) — those must NOT be modified
18
+
19
+ describe('PRI-212 plugin core anti-growth guard', () => {
20
+ // Category 1: Frozen Legacy (ADR-0005) — deleted in PRI-230
21
+ const FROZEN_LEGACY = [
22
+ ] as const;
23
+
24
+ // Category 2: Pure domain logic with zero I/O imports — should migrate to @principles/core
25
+ const ZERO_IMPORT_CANDIDATES = [
26
+ 'trajectory-types.ts',
27
+ 'profile.ts',
28
+ 'pain-signal.ts',
29
+ 'pd-task-types.ts',
30
+ 'evolution-types.ts',
31
+ 'telemetry-event.ts',
32
+ 'empathy-types.ts',
33
+ 'correction-types.ts',
34
+ 'principle-injection.ts',
35
+ 'principle-compiler/template-generator.ts',
36
+ ] as const;
37
+
38
+ // Categories 3-5: Plugin I/O adapters, Do Not Move, I/O boundary
39
+ const PLUGIN_IO_FILES = [
40
+ // Thin adapter candidates
41
+ 'local-worker-routing.ts',
42
+ 'principle-tree-migration.ts',
43
+ 'principle-internalization/principle-lifecycle-service.ts',
44
+ 'principle-tree-ledger-adapter.ts',
45
+ 'principle-compiler/ledger-registrar.ts',
46
+ 'principle-compiler/code-validator.ts',
47
+ 'principle-injector.ts',
48
+ 'pd-task-service.ts',
49
+ 'principle-internalization/lifecycle-read-model.ts',
50
+ 'principle-internalization/filesystem-lifecycle-datasource.ts',
51
+ 'config-service.ts',
52
+ 'principle-compiler/index.ts',
53
+ 'principle-internalization/lifecycle-refresh.ts',
54
+ // Do Not Move
55
+ 'event-log.ts',
56
+ 'schema/schema-definitions.ts',
57
+ 'path-resolver.ts',
58
+ 'init.ts',
59
+ 'workspace-context.ts',
60
+ 'reflection/reflection-context.ts',
61
+ 'bootstrap-rules.ts',
62
+ 'schema/migration-runner.ts',
63
+ 'rule-host.ts',
64
+ 'principle-training-state.ts',
65
+ 'pain-diagnostic-gate.ts',
66
+ 'hygiene/tracker.ts',
67
+ 'schema/migrations/002-init-central.ts',
68
+ 'workspace-dir-service.ts',
69
+ 'paths.ts',
70
+ 'schema/migrations/004-add-thinking-and-gfi.ts',
71
+ 'evolution-hook.ts',
72
+ 'storage-adapter.ts',
73
+ 'schema/migrations/003-init-workflow.ts',
74
+ 'workspace-dir-validation.ts',
75
+ 'pain-signal-adapter.ts',
76
+ 'rule-implementation-runtime.ts',
77
+ 'detection-service.ts',
78
+ 'schema/migrations/index.ts',
79
+ 'dictionary-service.ts',
80
+ 'schema/index.ts',
81
+ 'schema/db-types.ts',
82
+ 'rule-host-types.ts',
83
+ 'rule-host-helpers.ts',
84
+ 'schema/migrations/001-init-trajectory.ts',
85
+ // I/O boundary
86
+ 'trajectory.ts',
87
+ 'evolution-reducer.ts',
88
+ 'promotion-gate.ts',
89
+ 'model-training-registry.ts',
90
+ 'focus-history.ts',
91
+ 'model-deployment-registry.ts',
92
+ 'training-program.ts',
93
+ 'replay-engine.ts',
94
+ 'external-training-contract.ts',
95
+ 'merge-gate-audit.ts',
96
+ 'shadow-observation-registry.ts',
97
+ 'control-ui-db.ts',
98
+ 'thinking-models.ts',
99
+ 'pd-task-reconciler.ts',
100
+ 'correction-cue-learner.ts',
101
+ 'principle-compiler/compiler.ts',
102
+ 'pain.ts',
103
+ 'pain-context-extractor.ts',
104
+ 'config.ts',
105
+ 'code-implementation-storage.ts',
106
+ 'observability.ts',
107
+ 'file-storage-adapter.ts',
108
+ 'workflow-funnel-loader.ts',
109
+ 'dictionary.ts',
110
+ 'thinking-os-parser.ts',
111
+ 'system-logger.ts',
112
+ 'detection-funnel.ts',
113
+ 'risk-calculator.ts',
114
+ 'migration.ts',
115
+ 'file-store.ts',
116
+ 'pd-task-store.ts',
117
+ 'evolution-migration.ts',
118
+ 'empathy-keyword-matcher.ts',
119
+ 'pain-lifecycle.ts',
120
+ 'session-tracker.ts',
121
+ 'principle-tree-ledger.ts',
122
+ 'evolution-logger.ts',
123
+ 'evolution-engine.ts',
124
+ 'runtime-v2-prompt-activation-reader.ts',
125
+ ] as const;
126
+
127
+ // Category 6: Test files
128
+ const KNOWN_TEST_FILES = [
129
+ '__tests__/focus-history.test.ts',
130
+ 'principle-compiler/__tests__/compiler-replay-gate.test.ts',
131
+ ] as const;
132
+
133
+ const ALL_KNOWN = [
134
+ ...FROZEN_LEGACY,
135
+ ...ZERO_IMPORT_CANDIDATES,
136
+ ...PLUGIN_IO_FILES,
137
+ ...KNOWN_TEST_FILES,
138
+ ];
139
+
140
+ function enumerateFiles(dir: string, prefix = ''): string[] {
141
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
142
+ const files: string[] = [];
143
+ for (const entry of entries) {
144
+ const relPath = prefix ? `${prefix}/${entry.name}` : entry.name;
145
+ const fullPath = path.resolve(dir, entry.name);
146
+ if (entry.isDirectory()) {
147
+ files.push(...enumerateFiles(fullPath, relPath));
148
+ } else if (entry.name.endsWith('.ts')) {
149
+ files.push(relPath.replace(/\\/g, '/'));
150
+ }
151
+ }
152
+ return files;
153
+ }
154
+
155
+ it('no new unclassified files in plugin core', () => {
156
+ const coreDir = path.resolve(__dirname, '../src/core');
157
+ const actualFiles = enumerateFiles(coreDir).sort();
158
+ const expectedFiles = [...ALL_KNOWN].sort();
159
+
160
+ const actualSet = new Set(actualFiles);
161
+ const knownSet = new Set(expectedFiles);
162
+
163
+ const unknownFiles = actualFiles.filter((f) => !knownSet.has(f));
164
+ const missingFiles = expectedFiles.filter((f) => !actualSet.has(f));
165
+
166
+ expect(unknownFiles, [
167
+ `\nUnclassified files detected in packages/openclaw-plugin/src/core/:`,
168
+ ...unknownFiles.map((f) => ` + ${f}`),
169
+ ``,
170
+ `New pure domain logic MUST go to @principles/core (packages/principles-core/).`,
171
+ `Plugin I/O adapter additions must be explicitly allowlisted in`,
172
+ `packages/openclaw-plugin/tests/core-anti-growth.test.ts`,
173
+ `ADR-0005 frozen files must NOT be modified.`,
174
+ `Reference: docs/reviews/plugin-core-inventory-2026-05.md (PRI-211)`,
175
+ ].join('\n')).toEqual([]);
176
+
177
+ expect(missingFiles, [
178
+ `\nBaseline files missing from packages/openclaw-plugin/src/core/:`,
179
+ ...missingFiles.map((f) => ` - ${f}`),
180
+ ``,
181
+ `Missing baseline files may indicate:`,
182
+ ` - File was moved or deleted (update inventory if intentional)`,
183
+ ` - Stale-main rollback (ERR-012): rebase on latest origin/main`,
184
+ ` - File was renamed (update inventory with new name)`,
185
+ ].join('\n')).toEqual([]);
186
+ });
187
+
188
+ it('zero-import candidates are tracked for migration awareness', () => {
189
+ expect(ZERO_IMPORT_CANDIDATES.length).toBeGreaterThan(0);
190
+ });
191
+ });
@@ -0,0 +1,42 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+
5
+ const INDEX_TS = fs.readFileSync(
6
+ path.resolve(__dirname, '../src/index.ts'),
7
+ 'utf-8',
8
+ );
9
+
10
+ describe('Hook workspace resolution NextAction contract', () => {
11
+ const FORBIDDEN_NEXT_ACTION_PATTERNS = [
12
+ /PD_WORKSPACE_DIR/,
13
+ /principles-disciple\.json/,
14
+ ];
15
+
16
+ it('does not claim PD_WORKSPACE_DIR env var as recovery in NextAction', () => {
17
+ const matches = INDEX_TS.match(/NextAction:[^`]*PD_WORKSPACE_DIR/g);
18
+ expect(matches).toBeNull();
19
+ });
20
+
21
+ it('does not claim principles-disciple.json as recovery in NextAction', () => {
22
+ const matches = INDEX_TS.match(/NextAction:[^`]*principles-disciple\.json/g);
23
+ expect(matches).toBeNull();
24
+ });
25
+
26
+ it('all hook failure NextActions reference canonical workspace migration', () => {
27
+ const nextActionLines = INDEX_TS.match(/NextAction: \${HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION}/g);
28
+ expect(nextActionLines).not.toBeNull();
29
+ expect(nextActionLines!.length).toBeGreaterThanOrEqual(7);
30
+ });
31
+
32
+ it('HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION constant exists and does not contain forbidden patterns', () => {
33
+ const constantMatch = INDEX_TS.match(
34
+ /const HOOK_WORKSPACE_RESOLUTION_NEXT_ACTION\s*=\s*'([^']+)'/,
35
+ );
36
+ expect(constantMatch).not.toBeNull();
37
+ const constantValue = constantMatch![1];
38
+ for (const pattern of FORBIDDEN_NEXT_ACTION_PATTERNS) {
39
+ expect(pattern.test(constantValue)).toBe(false);
40
+ }
41
+ });
42
+ });
@@ -0,0 +1,188 @@
1
+ /**
2
+ * PRI-286: Verify confirm-first gate has been fully removed from live paths.
3
+ *
4
+ * These tests prove that:
5
+ * 1. The confirm-first-gate module no longer exists as an importable live module
6
+ * 2. gate.ts does not call any confirm-first function
7
+ * 3. prompt.ts does not import any confirm-first function
8
+ * 4. gate-block-helper does not output confirm-first specific block messages
9
+ * 5. confirm_first_gate does not appear in DEFAULT_FEATURE_FLAGS
10
+ * 6. Default PD installation does not block mutating tools due to PLAN.md absence
11
+ * 7. PLAN.md is not a canonical PD path (paths.ts, path-resolver.ts, env.ts, migration.ts)
12
+ * 8. confirm-first event types and state store are fully deleted
13
+ */
14
+
15
+ import { describe, it, expect } from 'vitest';
16
+ import fs from 'fs';
17
+ import path from 'path';
18
+
19
+ // __dirname = packages/openclaw-plugin/tests/hooks → go up 4 to monorepo root
20
+ // (hooks → tests → openclaw-plugin → packages → monorepo-root)
21
+ const ROOT = path.resolve(__dirname, '..', '..', '..', '..');
22
+
23
+ describe('PRI-286: Confirm-first gate removal verification', () => {
24
+ it('confirm-first-gate.ts source file has been deleted', () => {
25
+ const gatePath = path.join(ROOT, 'packages/openclaw-plugin/src/core/confirm-first-gate.ts');
26
+ expect(fs.existsSync(gatePath)).toBe(false);
27
+ });
28
+
29
+ it('gate.ts does not import from confirm-first-gate', async () => {
30
+ const gateSource = fs.readFileSync(
31
+ path.join(ROOT, 'packages/openclaw-plugin/src/hooks/gate.ts'),
32
+ 'utf8',
33
+ );
34
+ expect(gateSource).not.toContain('confirm-first-gate');
35
+ expect(gateSource).not.toContain('evaluateConfirmFirstGateSync');
36
+ expect(gateSource).not.toContain('confirm-first');
37
+ });
38
+
39
+ it('prompt.ts does not import from confirm-first-gate', async () => {
40
+ const promptSource = fs.readFileSync(
41
+ path.join(ROOT, 'packages/openclaw-plugin/src/hooks/prompt.ts'),
42
+ 'utf8',
43
+ );
44
+ expect(promptSource).not.toContain('confirm-first-gate');
45
+ expect(promptSource).not.toContain('detectApprovalMarker');
46
+ expect(promptSource).not.toContain('setConfirmFirstDirective');
47
+ expect(promptSource).not.toContain('setConfirmFirstApproval');
48
+ expect(promptSource).not.toContain('hydrateFromStore');
49
+ expect(promptSource).not.toContain('pruneStoreStaleRows');
50
+ expect(promptSource).not.toContain('setConfirmFirstStore');
51
+ expect(promptSource).not.toContain('resetConfirmFirst');
52
+ expect(promptSource).not.toContain('setConfirmFirstGateEnabled');
53
+ expect(promptSource).not.toContain('SqliteConfirmFirstStateStore');
54
+ expect(promptSource).not.toContain('confirm_first_gate');
55
+ });
56
+
57
+ it('gate-block-helper does not have confirm-first specific branch', () => {
58
+ const helperSource = fs.readFileSync(
59
+ path.join(ROOT, 'packages/openclaw-plugin/src/hooks/gate-block-helper.ts'),
60
+ 'utf8',
61
+ );
62
+ expect(helperSource).not.toContain('confirm-first-gate');
63
+ expect(helperSource).not.toContain('Confirm-First Gate Blocked');
64
+ expect(helperSource).not.toContain('confirm-first behavioral directive');
65
+ });
66
+
67
+ it('confirm_first_gate is not in DEFAULT_FEATURE_FLAGS', async () => {
68
+ const { DEFAULT_FEATURE_FLAGS } = await import('@principles/core/runtime-v2');
69
+ const ids = DEFAULT_FEATURE_FLAGS.map((f: { id: string }) => f.id);
70
+ expect(ids).not.toContain('confirm_first_gate');
71
+ });
72
+
73
+ it('no PLAN.md physical interception language in AGENTS.md templates', () => {
74
+ const templateDirs = [
75
+ path.join(ROOT, 'packages/openclaw-plugin/templates'),
76
+ path.join(ROOT, 'packages/create-principles-disciple/templates'),
77
+ path.join(ROOT, 'packages/create-principles-disciple/plugin/templates'),
78
+ ];
79
+
80
+ for (const dir of templateDirs) {
81
+ if (!fs.existsSync(dir)) continue;
82
+ const agentsFiles = findFiles(dir, 'AGENTS.md');
83
+ for (const file of agentsFiles) {
84
+ const content = fs.readFileSync(file, 'utf8');
85
+ // Must NOT contain physical interception language
86
+ expect(content, `${file} should not contain physical interception`).not.toContain('Physical interception');
87
+ expect(content, `${file} should not contain 物理拦截`).not.toContain('物理拦截');
88
+ expect(content, `${file} should not contain Single source of truth.*PLAN`).not.toMatch(/Single source of truth.*PLAN/i);
89
+ }
90
+ }
91
+ });
92
+
93
+ it('no mandatory PLAN.md STATUS:READY in THINKING_OS templates', () => {
94
+ const templateDirs = [
95
+ path.join(ROOT, 'packages/openclaw-plugin/templates'),
96
+ path.join(ROOT, 'packages/create-principles-disciple/templates'),
97
+ path.join(ROOT, 'packages/create-principles-disciple/plugin/templates'),
98
+ ];
99
+
100
+ for (const dir of templateDirs) {
101
+ if (!fs.existsSync(dir)) continue;
102
+ const thinkingFiles = findFiles(dir, 'THINKING_OS.md');
103
+ for (const file of thinkingFiles) {
104
+ const content = fs.readFileSync(file, 'utf8');
105
+ expect(content, `${file} should not require PLAN.md status: READY`).not.toContain('PLAN.md` (status: READY)');
106
+ expect(content, `${file} should not require PLAN.md(状态:READY)`).not.toContain('PLAN.md`(状态:READY)');
107
+ }
108
+ }
109
+ });
110
+
111
+ // ── Round 2: Canonical PLAN.md path removal ──
112
+
113
+ it('paths.ts does not contain PLAN: entry', () => {
114
+ const source = fs.readFileSync(
115
+ path.join(ROOT, 'packages/openclaw-plugin/src/core/paths.ts'),
116
+ 'utf8',
117
+ );
118
+ expect(source).not.toMatch(/PLAN:\s*'PLAN\.md'/);
119
+ });
120
+
121
+ it('path-resolver.ts does not contain PLAN key', () => {
122
+ const source = fs.readFileSync(
123
+ path.join(ROOT, 'packages/openclaw-plugin/src/core/path-resolver.ts'),
124
+ 'utf8',
125
+ );
126
+ expect(source).not.toContain("'PLAN':");
127
+ expect(source).not.toContain('"PLAN":');
128
+ });
129
+
130
+ it('env.ts CORE_FILES does not contain PLAN.md', () => {
131
+ const source = fs.readFileSync(
132
+ path.join(ROOT, 'packages/create-principles-disciple/src/utils/env.ts'),
133
+ 'utf8',
134
+ );
135
+ // Match 'PLAN.md' inside the CORE_FILES array — should not exist
136
+ expect(source).not.toMatch(/CORE_FILES\s*=\s*\[[\s\S]*?'PLAN\.md'/);
137
+ });
138
+
139
+ it('migration.ts does not migrate docs/PLAN.md', () => {
140
+ const source = fs.readFileSync(
141
+ path.join(ROOT, 'packages/openclaw-plugin/src/core/migration.ts'),
142
+ 'utf8',
143
+ );
144
+ expect(source).not.toContain("'PLAN.md'");
145
+ expect(source).not.toContain("newKey: 'PLAN'");
146
+ });
147
+
148
+ // ── Round 2: Event type and state store full deletion ──
149
+
150
+ it('event-types.ts does not contain runtime_v2_confirm_first_gate', () => {
151
+ const source = fs.readFileSync(
152
+ path.join(ROOT, 'packages/principles-core/src/runtime-v2/types/event-types.ts'),
153
+ 'utf8',
154
+ );
155
+ expect(source).not.toContain('runtime_v2_confirm_first_gate');
156
+ expect(source).not.toContain('RuntimeV2ConfirmFirstGate');
157
+ });
158
+
159
+ it('confirm-first state store source has been deleted', () => {
160
+ const storePath = path.join(
161
+ ROOT, 'packages/principles-core/src/runtime-v2/activation/sqlite-confirm-first-state-store.ts',
162
+ );
163
+ expect(fs.existsSync(storePath)).toBe(false);
164
+ });
165
+
166
+ it('confirm-first state store test has been deleted', () => {
167
+ const testPath = path.join(
168
+ ROOT, 'packages/principles-core/src/runtime-v2/__tests__/sqlite-confirm-first-state-store.test.ts',
169
+ );
170
+ expect(fs.existsSync(testPath)).toBe(false);
171
+ });
172
+ });
173
+
174
+ function findFiles(dir: string, filename: string): string[] {
175
+ const results: string[] = [];
176
+ function walk(d: string): void {
177
+ for (const entry of fs.readdirSync(d, { withFileTypes: true })) {
178
+ const full = path.join(d, entry.name);
179
+ if (entry.isDirectory()) {
180
+ walk(full);
181
+ } else if (entry.name === filename) {
182
+ results.push(full);
183
+ }
184
+ }
185
+ }
186
+ walk(dir);
187
+ return results;
188
+ }