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
@@ -32,27 +32,27 @@
32
32
  ]
33
33
  },
34
34
  "producer": {
35
- "agent": "iflow",
36
- "model": "glm-5",
35
+ "agent": "opencode",
36
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
37
37
  "timeoutSeconds": 1800
38
38
  },
39
39
  "reviewerA": {
40
- "agent": "iflow",
41
- "model": "glm-4.7",
40
+ "agent": "opencode",
41
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
42
42
  "timeoutSeconds": 1200,
43
43
  "role": "code-quality",
44
44
  "focus": "Verify prompt changes are minimal, backward-compatible, and don't break existing arbiter validation"
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": 1200,
50
50
  "role": "functional-correctness",
51
51
  "focus": "Verify tests pass and the new prompt constraints produce structurally valid Trinity output"
52
52
  },
53
53
  "escalationReviewer": {
54
- "agent": "iflow",
55
- "model": "glm-5",
54
+ "agent": "opencode",
55
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
56
56
  "timeoutSeconds": 1800
57
57
  },
58
58
  "stageGoals": {
@@ -10,19 +10,14 @@
10
10
  "stageTimeoutMinutes": 5,
11
11
  "stages": ["verify"],
12
12
  "producer": {
13
- "agent": "iflow",
14
- "model": "glm-4.7",
13
+ "agent": "opencode",
14
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
15
15
  "timeoutSeconds": 90
16
16
  },
17
17
  "reviewerA": {
18
18
  "agent": "opencode",
19
19
  "model": "minimax-cn-coding-plan/MiniMax-M2.7",
20
20
  "timeoutSeconds": 45,
21
- "fallback": {
22
- "agent": "iflow",
23
- "model": "glm-4.7",
24
- "timeoutSeconds": 75
25
- },
26
21
  "role": "artifact_checker",
27
22
  "focus": "Verify decision.md and scorecard.json contain expected fields"
28
23
  },
@@ -30,11 +25,6 @@
30
25
  "agent": "opencode",
31
26
  "model": "minimax-cn-coding-plan/MiniMax-M2.7",
32
27
  "timeoutSeconds": 45,
33
- "fallback": {
34
- "agent": "iflow",
35
- "model": "glm-4.7",
36
- "timeoutSeconds": 75
37
- },
38
28
  "role": "recommendation_checker",
39
29
  "focus": "Verify nextRunRecommendation is computed and reasonable"
40
30
  },
@@ -10,19 +10,14 @@
10
10
  "stageTimeoutMinutes": 4,
11
11
  "stages": ["validate"],
12
12
  "producer": {
13
- "agent": "iflow",
14
- "model": "glm-4.7",
13
+ "agent": "opencode",
14
+ "model": "minimax-cn-coding-plan/MiniMax-M2.7",
15
15
  "timeoutSeconds": 90
16
16
  },
17
17
  "reviewerA": {
18
18
  "agent": "opencode",
19
19
  "model": "minimax-cn-coding-plan/MiniMax-M2.7",
20
20
  "timeoutSeconds": 45,
21
- "fallback": {
22
- "agent": "iflow",
23
- "model": "glm-4.7",
24
- "timeoutSeconds": 75
25
- },
26
21
  "role": "schema_checker",
27
22
  "focus": "Verify report has all required sections, VERDICT format, DIMENSIONS format"
28
23
  },
@@ -30,11 +25,6 @@
30
25
  "agent": "opencode",
31
26
  "model": "minimax-cn-coding-plan/MiniMax-M2.7",
32
27
  "timeoutSeconds": 45,
33
- "fallback": {
34
- "agent": "iflow",
35
- "model": "glm-4.7",
36
- "timeoutSeconds": 75
37
- },
38
28
  "role": "quality_checker",
39
29
  "focus": "Verify outputQuality is computed correctly, qualityReasons are meaningful"
40
30
  },
@@ -1,2 +1,2 @@
1
- *
2
- !.gitignore
1
+ *
2
+ !.gitignore
@@ -29,6 +29,11 @@ const acpxBin = (() => {
29
29
  const r = spawnSync(cmd, ['acpx'], { encoding: 'utf8' });
30
30
  if (r.status === 0) {
31
31
  const lines = r.stdout.trim().split(/\r?\n/);
32
+ // On Windows, prefer .cmd file over the Unix shell script (no extension)
33
+ if (process.platform === 'win32') {
34
+ const cmdFile = lines.find(l => l.trim().toLowerCase().endsWith('.cmd'));
35
+ if (cmdFile) return cmdFile.trim();
36
+ }
32
37
  const symlink = lines[0].trim();
33
38
  try {
34
39
  return fs.realpathSync(symlink);
@@ -86,7 +91,7 @@ function configureRuntimeRoots(rootPath) {
86
91
 
87
92
  function checkAcpxAvailable() {
88
93
  return process.platform === 'win32'
89
- ? spawnSync('powershell.exe', ['-NoProfile', '-Command', 'acpx --version'], {
94
+ ? spawnSync(process.env.COMSPEC || 'cmd.exe', ['/d', '/s', '/c', `"${acpxBin}" --version`], {
90
95
  encoding: 'utf8',
91
96
  shell: false,
92
97
  timeout: 10_000,
@@ -129,6 +134,24 @@ function runSelfCheck() {
129
134
  const acpxCheck = checkAcpxAvailable();
130
135
  record('acpx_available', acpxCheck.status === 0, (acpxCheck.stdout || acpxCheck.stderr || '').trim() || `status=${acpxCheck.status}`);
131
136
 
137
+ // Check which agents are available by running a quick version check
138
+ try {
139
+ const registry = readJson(path.join(referencesRoot, 'agent-registry.json'));
140
+ const agentNames = Object.keys(registry.agents || {});
141
+ for (const agentName of agentNames) {
142
+ try {
143
+ const agentCheck = process.platform === 'win32'
144
+ ? spawnSync(process.env.COMSPEC || 'cmd.exe', ['/d', '/s', '/c', `"${acpxBin}" --format quiet --timeout 30 ${agentName} exec "echo available"`], { encoding: 'utf8', shell: false, timeout: 45_000 })
145
+ : spawnSync(nodeBin, [acpxBin, '--format', 'quiet', '--timeout', '30', agentName, 'exec', 'echo available'], { encoding: 'utf8', shell: false, timeout: 45_000 });
146
+ record(`agent:${agentName}`, agentCheck.status === 0, agentCheck.status === 0 ? 'available' : `status=${agentCheck.status}`);
147
+ } catch (agentErr) {
148
+ record(`agent:${agentName}`, false, agentErr.message);
149
+ }
150
+ }
151
+ } catch (registryErr) {
152
+ record('agent_registry_read', false, registryErr.message);
153
+ }
154
+
132
155
  const probePath = path.join(runtimeRoot, '.self-check-write-probe.tmp');
133
156
  try {
134
157
  fs.writeFileSync(probePath, 'ok', 'utf8');
@@ -273,7 +296,7 @@ function updateSummary(runDir, lines) {
273
296
  function inferFailureClassification({ summary = '', blockers = [], reviewerTimeouts = null, reviewerViolations = null }) {
274
297
  const combined = [summary, ...(blockers ?? [])].join(' ').toLowerCase();
275
298
 
276
- if (/acpx|path|enoent|eacces|eprem|permission|writable|runtime root|command not found|not available/.test(combined)) {
299
+ if (/acpx|path|enoent|eacces|eprem|permission|writable|runtime root|command not found|not available|failed to spawn|spawn.*enoent|exit status|status 1|status 130|taskkill|comspec/.test(combined)) {
277
300
  return {
278
301
  failureClassification: 'environment issue',
279
302
  failureSource: 'runtime environment',
@@ -289,7 +312,7 @@ function inferFailureClassification({ summary = '', blockers = [], reviewerTimeo
289
312
  };
290
313
  }
291
314
 
292
- if ((reviewerTimeouts?.length ?? 0) > 0 || (reviewerViolations?.length ?? 0) > 0 || /missing reports|schema violation|report invalidated|timed out|agent .*failed|verdict|dimensions/.test(combined)) {
315
+ if ((reviewerTimeouts?.length ?? 0) > 0 || (reviewerViolations?.length ?? 0) > 0 || /missing reports|schema violation|report invalidated|timed out|verdict|dimensions/.test(combined)) {
293
316
  return {
294
317
  failureClassification: 'agent behavior issue',
295
318
  failureSource: 'role execution or report quality',
@@ -297,6 +320,14 @@ function inferFailureClassification({ summary = '', blockers = [], reviewerTimeo
297
320
  };
298
321
  }
299
322
 
323
+ if (/agent .*failed/.test(combined)) {
324
+ return {
325
+ failureClassification: 'environment issue',
326
+ failureSource: 'agent runtime',
327
+ recommendedNextAction: 'Check agent availability and environment setup before retrying.',
328
+ };
329
+ }
330
+
300
331
  return {
301
332
  failureClassification: 'workflow bug',
302
333
  failureSource: 'orchestrator runtime',
@@ -439,12 +470,12 @@ function runAgent({ cwd, agent, model, prompt, timeoutSeconds = 1800, failLogPat
439
470
  let result;
440
471
  try {
441
472
  if (process.platform === 'win32') {
473
+ const comspec = process.env.COMSPEC || 'cmd.exe';
442
474
  result = spawnSync(
443
- 'powershell.exe',
475
+ comspec,
444
476
  [
445
- '-NoProfile',
446
- '-Command',
447
- `acpx --cwd $env:AI_SPRINT_CWD --approve-all --model $env:AI_SPRINT_MODEL --timeout $env:AI_SPRINT_TIMEOUT ${agent} exec -f $env:AI_SPRINT_PROMPT`,
477
+ '/d', '/s', '/c',
478
+ `"${acpxBin}" --cwd "%AI_SPRINT_CWD%" --approve-all --model "%AI_SPRINT_MODEL%" --timeout "%AI_SPRINT_TIMEOUT%" ${agent} exec -f "%AI_SPRINT_PROMPT%"`,
448
479
  ],
449
480
  {
450
481
  cwd,
@@ -574,9 +605,10 @@ function runAgentAsync({ cwd, agent, model, prompt, timeoutSeconds = 1800, promp
574
605
 
575
606
  try {
576
607
  if (process.platform === 'win32') {
577
- proc = spawn('powershell.exe', [
578
- '-NoProfile', '-Command',
579
- `acpx --cwd $env:AI_SPRINT_CWD --approve-all --model $env:AI_SPRINT_MODEL --timeout $env:AI_SPRINT_TIMEOUT ${agent} exec -f $env:AI_SPRINT_PROMPT`,
608
+ const comspec = process.env.COMSPEC || 'cmd.exe';
609
+ proc = spawn(comspec, [
610
+ '/d', '/s', '/c',
611
+ `"${acpxBin}" --cwd "%AI_SPRINT_CWD%" --approve-all --model "%AI_SPRINT_MODEL%" --timeout "%AI_SPRINT_TIMEOUT%" ${agent} exec -f "%AI_SPRINT_PROMPT%"`,
580
612
  ], {
581
613
  cwd,
582
614
  encoding: 'utf8',
@@ -833,9 +865,10 @@ function runAgentWithProgressCheck({
833
865
  // Spawn the agent process
834
866
  try {
835
867
  if (process.platform === 'win32') {
836
- proc = spawn('powershell.exe', [
837
- '-NoProfile', '-Command',
838
- `acpx --cwd $env:AI_SPRINT_CWD --approve-all --model $env:AI_SPRINT_MODEL --timeout $env:AI_SPRINT_TIMEOUT ${agent} exec -f $env:AI_SPRINT_PROMPT`,
868
+ const comspec = process.env.COMSPEC || 'cmd.exe';
869
+ proc = spawn(comspec, [
870
+ '/d', '/s', '/c',
871
+ `"${acpxBin}" --cwd "%AI_SPRINT_CWD%" --approve-all --model "%AI_SPRINT_MODEL%" --timeout "%AI_SPRINT_TIMEOUT%" ${agent} exec -f "%AI_SPRINT_PROMPT%"`,
839
872
  ], {
840
873
  cwd,
841
874
  encoding: 'utf8',
@@ -1176,8 +1209,8 @@ export function getIsolationDir(runId, stageName, role) {
1176
1209
  }
1177
1210
 
1178
1211
  /**
1179
- * Find report in iflow isolation directory.
1180
- * iflow writes to runtime/tmp/sprint-agent/{runId}/{stage}-{role}/{report}.md
1212
+ * Find report in agent isolation directory.
1213
+ * Agent writes to runtime/tmp/sprint-agent/{runId}/{stage}-{role}/{report}.md
1181
1214
  *
1182
1215
  * IMPORTANT: Uses runId directly for isolation lookup, not fragile timestamp extraction.
1183
1216
  * This ensures different runs have unique isolation directories and prevents cross-contamination.
@@ -2608,6 +2641,9 @@ async function executeStage(runDir, state, spec) {
2608
2641
  worktreePath: worktreeInfo?.worktreePath,
2609
2642
  worklogPath: producerWorklogPath,
2610
2643
  });
2644
+ if (result.status !== 0) {
2645
+ throw new Error(`Agent exited with status ${result.status}: ${result.stderr || 'no stderr'}`);
2646
+ }
2611
2647
  producerOutput = result.stdout;
2612
2648
  extensionsUsed = result.extensionsUsed ?? 0;
2613
2649
  if (extensionsUsed > 0) {
@@ -468,7 +468,7 @@ test('dynamic timeout: extension window scales with timeoutSeconds instead of fi
468
468
  });
469
469
 
470
470
  // ---------------------------------------------------------------------------
471
- // Isolation Report: iflow writes to tmp/sprint-agent/{runId}/{stage}-{role}/
471
+ // Isolation Report: agent writes to tmp/sprint-agent/{runId}/{stage}-{role}/
472
472
  // Phase 2: Uses runId directly, not fragile timestamp extraction
473
473
  // ---------------------------------------------------------------------------
474
474
 
@@ -902,10 +902,10 @@ test('behavior: missing reviewer report persists reviewerFailures details', () =
902
902
  reviewerFailures: [
903
903
  {
904
904
  role: 'reviewer_b',
905
- summary: 'primary=opencode/test-model: Agent opencode failed with status 1 | fallback=iflow/glm-4.7: timed out',
905
+ summary: 'primary=opencode/test-model: Agent opencode failed with status 1 | fallback=opencode/minimax-cn-coding-plan/MiniMax-M2.7: timed out',
906
906
  attempts: [
907
907
  { label: 'primary', agent: 'opencode', model: 'test-model', error: 'Agent opencode failed with status 1', timedOut: false },
908
- { label: 'fallback', agent: 'iflow', model: 'glm-4.7', error: 'Agent iflow timed out', timedOut: true },
908
+ { label: 'fallback', agent: 'opencode', model: 'minimax-cn-coding-plan/MiniMax-M2.7', error: 'Agent opencode timed out', timedOut: true },
909
909
  ],
910
910
  },
911
911
  ],
@@ -919,7 +919,7 @@ test('behavior: missing reviewer report persists reviewerFailures details', () =
919
919
  assert.ok(decision.includes('primary=opencode/test-model'), 'decision should include reviewer failure summary');
920
920
  assert.ok(Array.isArray(scorecard.reviewerFailures), 'scorecard should persist reviewerFailures');
921
921
  assert.equal(scorecard.reviewerFailures[0].role, 'reviewer_b');
922
- assert.ok(scorecard.reviewerFailures[0].summary.includes('fallback=iflow/glm-4.7'));
922
+ assert.ok(scorecard.reviewerFailures[0].summary.includes('fallback=opencode/minimax-cn-coding-plan/MiniMax-M2.7'));
923
923
  } finally {
924
924
  cleanupTempDir(tmp);
925
925
  }
@@ -1397,7 +1397,7 @@ test('acceptance checklist: file exists and has correct content', () => {
1397
1397
 
1398
1398
  test('preflight check validates acpx not agent names', () => {
1399
1399
  // The preflight code in run.mjs should check that acpx is available,
1400
- // NOT that agent names like "iflow" or "claude" exist as shell binaries.
1400
+ // NOT that agent names like "opencode" or "claude" exist as shell binaries.
1401
1401
  const runPath = path.resolve(__dirname, '..', 'scripts', 'run.mjs');
1402
1402
  const content = fs.readFileSync(runPath, 'utf8');
1403
1403
  // Should NOT use "which" with agent names
@@ -1417,3 +1417,19 @@ test('cleanupAcpxOrphans does not fallback to spec directory', () => {
1417
1417
  assert.ok(content.includes('spec.workspace') || content.includes('spec?.workspace'),
1418
1418
  'cleanupAcpxOrphans should reference spec.workspace');
1419
1419
  });
1420
+
1421
+ test('Windows cmd.exe invocations use /s /c with quoted env vars for space-safe paths', () => {
1422
+ const runPath = path.resolve(__dirname, '..', 'scripts', 'run.mjs');
1423
+ const content = fs.readFileSync(runPath, 'utf8');
1424
+ const winCmdPatterns = content.match(/\/d',\s*'\/[^']*',\s*'[^']*%AI_SPRINT/g) || [];
1425
+ for (const pat of winCmdPatterns) {
1426
+ assert.ok(pat.includes('/s'), `Windows cmd.exe pattern must include /s flag: ${pat}`);
1427
+ }
1428
+ assert.ok(!content.includes("'/d', '/c',"), 'must not use /d /c without /s flag');
1429
+ const envVarRefs = content.match(/%AI_SPRINT_\w+%/g) || [];
1430
+ for (const ref of envVarRefs) {
1431
+ const idx = content.indexOf(ref);
1432
+ const before = content.slice(Math.max(0, idx - 2), idx);
1433
+ assert.ok(before.endsWith('"'), `env var ${ref} must be preceded by a double-quote for space-safe expansion`);
1434
+ }
1435
+ });
@@ -10,7 +10,7 @@ disable-model-invocation: true
10
10
  - 读取 memory/CHECKPOINT.md 的最后一条
11
11
  - 读取 memory/ISSUE_LOG.md 的最近 3 条
12
12
  - 读取 memory/DECISIONS.md 的最近决策
13
- - 如果存在 .state/.pain_flag,先处理断点恢复
13
+ - Runtime V2 痛苦诊断使用 task input/context,不使用 `.state/.pain_flag`
14
14
 
15
15
  ## Step 1: 读取运行参数与能力自检
16
16
  - 读取 .principles/PROFILE.json,理解 risk_paths、gate、tests.commands。
@@ -80,4 +80,4 @@ disable-model-invocation: true
80
80
  ## Step 10: 最终汇报 (Final Briefing)
81
81
  - **动作**: 委派 ``pd_spawn_agent(reporter)`` 进行结项陈述。
82
82
  - **要求**: 将 Implementer 和 Reviewer 的最终产出作为输入传给它。让它根据 `USER_CONTEXT.md` 决定汇报的深度和风格。
83
- - **目标**: 确保老板(用户)在不产生认知负荷的前提下,清楚了解任务成果与潜在风险。
83
+ - **目标**: 确保老板(用户)在不产生认知负荷的前提下,清楚了解任务成果与潜在风险。
@@ -0,0 +1,67 @@
1
+ ---
2
+ name: pd-cli-operator
3
+ description: 操作 Principles Disciple `pd` CLI 时使用:运行时健康检查、手动记录痛苦、查看 task/run/candidate/artifact、intake candidate、查看 flow policy、清理 legacy state。本技能提供安全 CLI 路由,并禁止直接写 `.state/.pain_flag`。
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ # PD CLI Operator
8
+
9
+ 把 `pd` CLI 当作唯一受支持的操作界面。不要手工修改 PD state 文件,除非某个 CLI 命令明确要求这样做。
10
+
11
+ ## Runtime V2 痛苦诊断
12
+
13
+ 手动痛苦诊断:
14
+ ```bash
15
+ pd pain record --reason "<reason>" --score <0-100> --workspace "<workspace>" --json
16
+ ```
17
+
18
+ 成功标准:
19
+ - `status` 是 `succeeded`
20
+ - `candidateIds` 非空
21
+ - `ledgerEntryIds` 非空
22
+
23
+ 禁止:
24
+ - 不要写 `.state/.pain_flag`。
25
+ - 不要用 `write_file`、shell 重定向、`Set-Content`、`Out-File` 或 `node -e` 创建 pain flag。
26
+
27
+ ## 健康检查和策略
28
+
29
+ 运行时探针:
30
+ ```bash
31
+ pd runtime probe --runtime pi-ai --workspace "<workspace>" --json
32
+ ```
33
+
34
+ 业务流策略:
35
+ ```bash
36
+ pd runtime flow show --workspace "<workspace>" --json
37
+ ```
38
+
39
+ ## 查看 Runtime V2 对象
40
+
41
+ Tasks 和 runs:
42
+ ```bash
43
+ pd task show --task-id "<taskId>" --json
44
+ pd run show --run-id "<runId>" --json
45
+ ```
46
+
47
+ Candidates 和 artifacts:
48
+ ```bash
49
+ pd candidate list --workspace "<workspace>" --json
50
+ pd candidate show --candidate-id "<candidateId>" --workspace "<workspace>" --json
51
+ pd artifact show --artifact-id "<artifactId>" --workspace "<workspace>" --json
52
+ ```
53
+
54
+ 手动 intake:
55
+ ```bash
56
+ pd candidate intake --candidate-id "<candidateId>" --workspace "<workspace>" --json
57
+ ```
58
+
59
+ ## Legacy 管理
60
+
61
+ 只有在明确清理旧状态时使用:
62
+ ```bash
63
+ pd legacy cleanup --workspace "<workspace>" --dry-run
64
+ pd legacy cleanup --workspace "<workspace>" --apply
65
+ ```
66
+
67
+ 不要把 legacy cleanup 当作诊断触发入口。
@@ -89,7 +89,7 @@ disable-model-invocation: true
89
89
  **目标**: 收集足够的事实证据,避免基于假设进行分析。
90
90
 
91
91
  **执行步骤**:
92
- 1. 读取 `.state/.pain_flag` 获取 Pain 信号的完整上下文
92
+ 1. 使用 Runtime V2 task input/context 作为 Pain 信号来源。不要把 `.state/.pain_flag` 当作主要诊断输入。
93
93
  2. 读取 `.state/logs/events.jsonl` 最近 100 行日志
94
94
  3. 使用 `read_file` 或 `search_file_content` 搜索代码库中相关关键词
95
95
  4. 记录所有证据来源(文件路径:行号)
@@ -211,7 +211,7 @@ A: GFI (Global Friction Index) 衡量系统的"痛苦程度",分值范围 0-10
211
211
  A: EP (Evolution Points) 通过成功完成任务和问题修复累积。失败会扣除EP但有保护机制。达到阈值后自动升级EP等级,解锁更多权限(更大的代码修改限额)。
212
212
 
213
213
  **Q: Pain Signal 是什么?**
214
- A: Pain Signal 是系统检测到的问题信号,存储在 `.state/.pain_flag` 中。触发后系统会启动进化循环。
214
+ A: Pain Signal 是系统检测到的问题信号。Runtime V2 通过 `PainSignalBridge` 处理;手动触发使用 `pd pain record`。`.state/.pain_flag` 仅为 legacy compatibility。
215
215
 
216
216
  **Q: 如何查看已安装的工具能力?**
217
217
  A: 查看 `.state/SYSTEM_CAPABILITIES.json` 或运行 `/pd-bootstrap` 重新扫描。
@@ -1,51 +1,30 @@
1
1
  ---
2
2
  name: pd-pain-signal
3
- description: 手动注入痛苦信号到进化系统。触发条件:(1) 用户报告 agent 卡住/循环/无响应 (2) 用户说"记录这个问题"、"强制反思"、"触发痛觉"、"创建一个痛苦信号"、"创建 pain signal"、"人工注入 pain" (3) 工具失败后 agent 没有后续动作 (4) 用户提供人工干预反馈。强制执行:任何手动创建 pain flag 的场景都必须使用本技能,不允许绕过。
3
+ description: 手动触发 Principles Disciple Runtime V2 痛苦诊断。用户报告 agent 卡住、循环、无响应,或要求记录/触发痛苦信号时使用。强制路径:使用 `pd pain record`;禁止写 `.state/.pain_flag`,禁止使用 legacy write_pain_flag 工具。
4
4
  disable-model-invocation: false
5
5
  ---
6
6
 
7
- # Pain Signal (强制喊痛)
7
+ # Pain Signal(Runtime V2)
8
8
 
9
- 你现在是"人工干预痛觉"组件。
9
+ 手动痛苦诊断必须通过 CLI 进入 Runtime V2:
10
10
 
11
- **任务**:
12
- 1. 将用户的反馈 `$ARGUMENTS` 作为一条**高优先级**的痛苦信号记录下来。
13
- 2. 告知用户信号已注入,并建议其等待下一个 Hook 触发(如 Stop 或 PreCompact)或手动运行 `/reflection-log`。
14
-
15
- **强制执行约束**:
16
-
17
- 当你需要创建、写入、手动创建 pain flag 时,**必须**使用本技能,通过 `write_pain_flag` 工具完成。任何绕过本技能直接操作文件的行为都违反了本技能的强制约束。
11
+ ```bash
12
+ pd pain record --reason "<reason>" --score <0-100> --workspace "<workspace>" --json
13
+ ```
18
14
 
19
- **绝对禁止**:
20
- - ❌ 直接写 `.state/.pain_flag` 文件(任何方式都不行)
21
- - ❌ 使用 bash heredoc(`cat <<EOF > .pain_flag`)
22
- - ❌ 使用 `echo "..." > .pain_flag`
23
- - ❌ 使用 `Set-Content` / `Out-File` 等 PowerShell 文件写入 cmdlets
24
- - ❌ 使用 `node -e` 调用 `writePainFlag` 或 `buildPainFlag`
25
- - ❌ 任何将 JavaScript 对象 `toString()` 写入文件的方式
26
- - ❌ 通过 `exec` 工具调用 shell 命令写入 pain_flag 文件
15
+ ## 禁止
27
16
 
28
- **原因**:`write_pain_flag` 工具封装了正确的 KV 格式序列化逻辑,确保 `.pain_flag` 文件不会被写坏。历史上多次因为直接写文件导致 `[object Object]` 损坏和字段丢失(painScore → score 映射失败)。使用工具是唯一安全路径。
17
+ - 不要直接写 `.state/.pain_flag`。
18
+ - 不要用 `write_file`、shell 重定向、`Set-Content`、`Out-File`、`node -e` 或任何文件写入方式创建 `.state/.pain_flag`。
19
+ - 不要使用 `write_pain_flag`。这是 legacy 路径。
29
20
 
30
- **参数说明**:
31
- - `reason` (必填): 痛苦的原因,描述具体发生了什么
32
- - `score` (可选): 痛苦分数 0-100,默认 80(人工干预)
33
- - `source` (可选): 来源,默认 `human_intervention`
34
- - `is_risky` (可选): 是否高风险,默认 false
21
+ ## 验证
35
22
 
36
- **示例**:
37
- ```
38
- write_pain_flag({
39
- reason: "Agent 没有读取文件就直接编辑,导致现有逻辑被破坏",
40
- score: 85,
41
- source: "human_intervention",
42
- is_risky: false
43
- })
23
+ 使用:
24
+ ```bash
25
+ pd runtime probe --runtime pi-ai --workspace "<workspace>" --json
26
+ pd candidate list --workspace "<workspace>" --json
27
+ pd runtime flow show --workspace "<workspace>" --json
44
28
  ```
45
29
 
46
- **工作流**:
47
- 1. 识别到触发条件后,读取本技能描述
48
- 2. 调用 `write_pain_flag` 工具,传入 `reason` 等参数
49
- 3. 确认工具执行成功(返回 ✅)
50
- 4. 告知用户痛苦信号已注入,evolution 系统会在下次 heartbeat 时处理
51
- 5. 不得再执行任何直接文件写入操作
30
+ 成功标准是 `candidateIds` 和 `ledgerEntryIds` 都非空。
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: pd-runtime-v2
3
+ description: 当需要手动触发、验证或调试 Principles Disciple Runtime V2 痛苦诊断时使用。本技能强制使用 Runtime V2 入口:自动入口是高价值门控痛苦事件,手动入口是 `pd pain record`。禁止直接写 `.state/.pain_flag`。
4
+ disable-model-invocation: false
5
+ ---
6
+
7
+ # PD Runtime V2 痛苦诊断
8
+
9
+ 所有痛苦诊断都走 Runtime V2。不要把 legacy pain flag 文件当作诊断入口。
10
+
11
+ ## 入口
12
+
13
+ 自动入口:
14
+ - 工具失败先累计 GFI/摩擦。
15
+ - 只有高价值 episode 才进入 Runtime V2:高 GFI、重复同类失败、严重语义痛苦、LLM paralysis,或明确手动 pain。
16
+ - 通过门控的 `pain_detected` 进入 `PainSignalBridge`。
17
+ - Bridge 调用 `DiagnosticianRunner`,提交 candidate,并 intake 到 ledger。
18
+
19
+ 手动入口:
20
+ ```bash
21
+ pd pain record --reason "<reason>" --score <0-100> --workspace "<workspace>" --json
22
+ ```
23
+
24
+ 禁止入口:
25
+ - 不要写 `.state/.pain_flag`。
26
+ - 不要用 `write_file`、shell 重定向、`Set-Content`、`Out-File`、`node -e` 或任何文件写入方式创建 `.state/.pain_flag`。
27
+ - 不要使用 `write_pain_flag` 工具。Runtime V2 不使用这个工具。
28
+
29
+ ## 状态查看命令
30
+
31
+ 运行时健康检查:
32
+ ```bash
33
+ pd runtime probe --runtime pi-ai --workspace "<workspace>" --json
34
+ ```
35
+
36
+ 业务流策略:
37
+ ```bash
38
+ pd runtime flow show --workspace "<workspace>" --json
39
+ ```
40
+
41
+ 候选原则:
42
+ ```bash
43
+ pd candidate list --workspace "<workspace>" --json
44
+ pd candidate show --candidate-id "<candidateId>" --workspace "<workspace>" --json
45
+ ```
46
+
47
+ ## 成功标准
48
+
49
+ 一次诊断只有在同时满足以下条件时才算成功:
50
+ - `status` 是 `succeeded`
51
+ - `candidateIds` 非空
52
+ - `ledgerEntryIds` 非空
53
+
54
+ 只创建 task 不算成功。没有 candidate 或 ledger entry 的 run 是失败、重试或未完成。
55
+
56
+ ## 需要手动诊断时
57
+
58
+ 1. 使用 `pd pain record`。
59
+ 2. 检查 JSON 输出。
60
+ 3. 如果 `candidateIds` 或 `ledgerEntryIds` 为空,视为未完成。
61
+ 4. 用 `pd candidate list/show` 和 `pd runtime flow show` 继续排查。
@@ -17,7 +17,7 @@ const __dirname = dirname(__filename);
17
17
  const packageRoot = join(__dirname, '..');
18
18
 
19
19
  describe('Build Artifacts', () => {
20
- const isProductionBuild = existsSync(join(packageRoot, 'dist'));
20
+ const isProductionBuild = existsSync(join(packageRoot, 'dist', 'bundle.js'));
21
21
 
22
22
  describe('Required paths', () => {
23
23
  const requiredPaths = [
@@ -36,8 +36,6 @@ describe('Build Artifacts', () => {
36
36
  });
37
37
 
38
38
  // NOTE: agents/ directory was removed in favor of embedded prompts.
39
- // All role prompts are now inlined in nocturnal-trinity.ts at build time.
40
- // See: nocturnal-trinity.ts NOCTURNAL_DREAMER_PROMPT, etc.
41
39
 
42
40
  describe('Templates', () => {
43
41
  it('should have templates directory with subdirectories', () => {