@yemi33/minions 0.1.2447 → 0.1.2449

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 (315) hide show
  1. package/bin/cli-api-client.js +1 -1
  2. package/bin/install-internal-minions.js +1382 -44
  3. package/bin/install-layout.js +150 -0
  4. package/bin/minions.js +460 -167
  5. package/dashboard/docs/typography.md +65 -12
  6. package/dashboard/js/command-center.js +66 -7
  7. package/dashboard/js/detail-panel.js +36 -0
  8. package/dashboard/js/memory-panel.js +59 -12
  9. package/dashboard/js/qa.js +186 -45
  10. package/dashboard/js/refresh.js +148 -12
  11. package/dashboard/js/render-dispatch.js +3 -4
  12. package/dashboard/js/render-inbox.js +2 -2
  13. package/dashboard/js/render-other.js +3 -3
  14. package/dashboard/js/render-pipelines.js +14 -0
  15. package/dashboard/js/render-plans.js +57 -9
  16. package/dashboard/js/render-prd.js +132 -23
  17. package/dashboard/js/render-prs.js +195 -166
  18. package/dashboard/js/render-schedules.js +63 -3
  19. package/dashboard/js/render-utils.js +3 -3
  20. package/dashboard/js/render-watches.js +19 -3
  21. package/dashboard/js/render-work-items.js +238 -30
  22. package/dashboard/js/settings.js +205 -54
  23. package/dashboard/js/utils.js +51 -1
  24. package/dashboard/pages/home.html +1 -1
  25. package/dashboard/pages/qa.html +1 -16
  26. package/dashboard/pages/work.html +40 -0
  27. package/dashboard/shared/cc-limits.js +79 -0
  28. package/dashboard/shared/pr-filters.js +21 -38
  29. package/dashboard/shared/project-git-summary.js +1 -1
  30. package/dashboard/shared/record-filters.js +169 -0
  31. package/dashboard/shared/watches-source.js +1 -1
  32. package/dashboard/shared/welcome-popup.js +1 -1
  33. package/dashboard/shared/wi-filters.js +302 -0
  34. package/dashboard/slim/body.html +1 -0
  35. package/dashboard/slim/js/command-send.js +26 -0
  36. package/dashboard/slim/js/modals-tiles.js +380 -39
  37. package/dashboard/slim/js/status.js +13 -21
  38. package/dashboard/slim/layout.html +1 -0
  39. package/dashboard/slim/panel-bootstrap.js +6 -2
  40. package/dashboard/slim/styles.css +38 -0
  41. package/dashboard/styles.css +159 -55
  42. package/dashboard-build.js +52 -6
  43. package/dashboard.js +956 -423
  44. package/docs/README.md +11 -6
  45. package/docs/api-errors.md +2 -2
  46. package/docs/architecture-review-2026-07-09.md +1 -1
  47. package/docs/architecture.excalidraw +2 -2
  48. package/docs/auto-discovery.md +18 -9
  49. package/docs/branch-derivation.md +4 -4
  50. package/docs/capture-demos.js +39 -2
  51. package/docs/ci-runner-canary.md +123 -0
  52. package/docs/claude-md-propagation.md +2 -2
  53. package/docs/cloud-agent-dispatch.md +204 -0
  54. package/docs/command-center.md +7 -7
  55. package/docs/completion-reports.md +43 -20
  56. package/docs/constants.md +10 -3
  57. package/docs/constellation-bridge.md +134 -6
  58. package/docs/constellation-style-telemetry.md +4 -4
  59. package/docs/contracts/capability-protocol.v1.json +165 -0
  60. package/docs/cooldown-merge-semantics.md +12 -12
  61. package/docs/copilot-cli-schema.md +7 -7
  62. package/docs/cross-repo-plans.md +10 -10
  63. package/docs/dead-code-audit-retractions.md +5 -5
  64. package/docs/default-branch-ci.md +173 -0
  65. package/docs/deprecated.json +31 -31
  66. package/docs/design-inbox-entries-schema.md +3 -3
  67. package/docs/design-language.md +1051 -0
  68. package/docs/design-state-storage.md +11 -11
  69. package/docs/diagnostics-crash-reports.md +9 -9
  70. package/docs/diagnostics-memory.md +5 -5
  71. package/docs/documentation-audit-2026-07-09.md +7 -7
  72. package/docs/engine-restart.md +90 -5
  73. package/docs/harness-mode.md +1 -1
  74. package/docs/internal-install.md +338 -39
  75. package/docs/kb-dedup-duplicate-pair-investigation.md +5 -5
  76. package/docs/kb-pr3223-cascade-archiving.md +1 -1
  77. package/docs/kb-pr696-merge-conflict-docs.md +6 -6
  78. package/docs/kb-sweep.md +35 -35
  79. package/docs/keep-processes.md +1 -1
  80. package/docs/live-checkout-mode.md +30 -30
  81. package/docs/managed-spawn.md +18 -14
  82. package/docs/named-agents.md +7 -7
  83. package/docs/plan-lifecycle.md +69 -2
  84. package/docs/pr-author-identity.md +114 -0
  85. package/docs/pr-auto-fix-dispatch.md +19 -4
  86. package/docs/pr-comment-followup.md +6 -6
  87. package/docs/pr-review-fix-loop.md +59 -10
  88. package/docs/process-termination.md +40 -0
  89. package/docs/proposals/repo-pool-for-live-checkout.md +13 -13
  90. package/docs/qa-runbook-lifecycle.md +367 -17
  91. package/docs/qa-runbooks.md +3 -3
  92. package/docs/rfc-completion-json.md +18 -18
  93. package/docs/runtime-adapters.md +26 -21
  94. package/docs/security.md +6 -6
  95. package/docs/self-improvement.md +4 -4
  96. package/docs/shared-lifecycle-module-map.md +473 -472
  97. package/docs/skills.md +52 -3
  98. package/docs/slim-ux/concepts.md +121 -116
  99. package/docs/specs/agent-configurability.md +18 -18
  100. package/docs/specs/agent-rename.md +18 -18
  101. package/docs/team-memory.md +38 -21
  102. package/docs/timeouts-and-liveness.md +118 -10
  103. package/docs/tutorials/01-install-and-connect.md +1 -1
  104. package/docs/watches.md +40 -39
  105. package/docs/workspace-manifests.md +4 -4
  106. package/docs/worktree-lifecycle.md +293 -14
  107. package/engine/README.md +46 -0
  108. package/engine/{ado-comment.js → ado/comment.js} +8 -8
  109. package/engine/{ado-git-auth.js → ado/git-auth.js} +4 -4
  110. package/engine/{ado.js → ado/index.js} +417 -63
  111. package/engine/{ado-status.js → ado/status.js} +6 -8
  112. package/engine/{ado-token.js → ado/token.js} +1 -1
  113. package/engine/{acp-transport.js → agents/acp-transport.js} +62 -22
  114. package/engine/{agent-worker-pool.js → agents/agent-worker-pool.js} +17 -8
  115. package/engine/{cc-worker-pool.js → agents/cc-worker-pool.js} +16 -6
  116. package/engine/{claude-md-context.js → agents/claude-md-context.js} +5 -5
  117. package/engine/{harness-context.js → agents/harness-context.js} +5 -5
  118. package/engine/{harness.js → agents/harness.js} +3 -3
  119. package/engine/{llm.js → agents/llm.js} +18 -14
  120. package/engine/{model-discovery.js → agents/model-discovery.js} +2 -2
  121. package/engine/{playbook.js → agents/playbook.js} +155 -22
  122. package/engine/{pooled-agent-process.js → agents/pooled-agent-process.js} +14 -12
  123. package/engine/{preflight.js → agents/preflight.js} +29 -10
  124. package/engine/{spawn-agent.js → agents/spawn-agent.js} +25 -14
  125. package/engine/{spawn-phase-watchdog.js → agents/spawn-phase-watchdog.js} +16 -7
  126. package/engine/{steering.js → agents/steering.js} +5 -5
  127. package/engine/{tools-inventory.js → agents/tools-inventory.js} +2 -2
  128. package/engine/{agent-api-validation.js → api/agent-api-validation.js} +2 -2
  129. package/engine/{api-validation.js → api/api-validation.js} +1 -1
  130. package/engine/api/bridge.js +787 -0
  131. package/engine/{cc-api-validation.js → api/cc-api-validation.js} +1 -1
  132. package/engine/api/companion.js +560 -0
  133. package/engine/{content-api-validation.js → api/content-api-validation.js} +2 -2
  134. package/engine/{pr-issue-validation.js → api/pr-issue-validation.js} +33 -6
  135. package/engine/{settings-validation.js → api/settings-validation.js} +32 -4
  136. package/engine/api-contracts/agent-content.js +4 -4
  137. package/engine/api-contracts/capability-manifest.js +236 -0
  138. package/engine/api-contracts/capability-protocol.js +333 -0
  139. package/engine/api-contracts/cc-ops.js +1 -1
  140. package/engine/api-contracts/config-runtime.js +5 -0
  141. package/engine/api-contracts/core.js +28 -1
  142. package/engine/api-contracts/index.js +100 -0
  143. package/engine/api-contracts/orchestration.js +18 -5
  144. package/engine/api-contracts/pull-requests.js +37 -6
  145. package/engine/api-contracts/qa-process.js +29 -6
  146. package/engine/api-contracts/work-plan-prd.js +21 -1
  147. package/engine/cloud/contract.js +212 -0
  148. package/engine/cloud/index.js +159 -0
  149. package/engine/{execution-model.js → core/execution-model.js} +1 -1
  150. package/engine/{features.js → core/features.js} +4 -4
  151. package/engine/{operator-identity.js → core/operator-identity.js} +1 -1
  152. package/engine/{queries.js → core/queries.js} +201 -36
  153. package/engine/{safe-expr.js → core/safe-expr.js} +1 -1
  154. package/engine/{shared.js → core/shared.js} +1637 -175
  155. package/engine/{stdio-timestamps.js → core/stdio-timestamps.js} +1 -1
  156. package/engine/{untrusted-fence.js → core/untrusted-fence.js} +3 -3
  157. package/engine/db/index.js +11 -2
  158. package/engine/db/migrations/002-dispatches.js +3 -3
  159. package/engine/db/migrations/003-work-items.js +1 -1
  160. package/engine/db/migrations/004-pull-requests.js +1 -1
  161. package/engine/db/migrations/006-metrics.js +1 -1
  162. package/engine/db/migrations/007-watches.js +2 -2
  163. package/engine/db/migrations/008-small-state.js +1 -1
  164. package/engine/db/migrations/009-qa.js +1 -1
  165. package/engine/db/migrations/010-pr-links.js +1 -1
  166. package/engine/db/migrations/011-remaining-state.js +1 -1
  167. package/engine/db/migrations/012-steering-deliveries.js +2 -2
  168. package/engine/db/migrations/013-backfill-broken-note-links.js +1 -1
  169. package/engine/db/migrations/014-pr-fix-target-prefs.js +2 -2
  170. package/engine/db/migrations/015-plans-prds.js +0 -0
  171. package/engine/db/migrations/018-sql-only-cutover.js +2 -2
  172. package/engine/db/migrations/021-archived-work-items.js +1 -1
  173. package/engine/db/migrations/022-global-cc-session.js +1 -1
  174. package/engine/db/migrations/023-engine-state.js +1 -1
  175. package/engine/db/migrations/025-malformed-work-item-phantoms.js +1 -1
  176. package/engine/db/migrations/027-review-learning-lifecycle.js +1 -1
  177. package/engine/db/migrations/029-repair-reused-versions.js +20 -0
  178. package/engine/db/migrations/031-pr-author-identity.js +137 -0
  179. package/engine/{consolidation.js → memory/consolidation.js} +6 -6
  180. package/engine/{kb-sweep-runner.js → memory/kb-sweep-runner.js} +2 -2
  181. package/engine/{kb-sweep.js → memory/kb-sweep.js} +9 -7
  182. package/engine/{memory-retrieval.js → memory/memory-retrieval.js} +46 -4
  183. package/engine/{memory-store.js → memory/memory-store.js} +3 -3
  184. package/engine/{promotion.js → memory/promotion.js} +3 -3
  185. package/engine/{review-learning-backfill.js → memory/review-learning-backfill.js} +6 -6
  186. package/engine/{review-learning.js → memory/review-learning.js} +10 -5
  187. package/engine/{diagnostics-memory.js → observability/diagnostics-memory.js} +1 -1
  188. package/engine/{logs-store.js → observability/logs-store.js} +5 -5
  189. package/engine/{metrics-store.js → observability/metrics-store.js} +4 -4
  190. package/engine/{check-status.js → operations/check-status.js} +3 -3
  191. package/engine/{cli.js → operations/cli.js} +271 -113
  192. package/engine/{distribution.js → operations/distribution.js} +5 -6
  193. package/engine/{cleanup.js → orchestration/cleanup.js} +72 -45
  194. package/engine/{cooldown.js → orchestration/cooldown.js} +5 -5
  195. package/engine/{dispatch-events.js → orchestration/dispatch-events.js} +2 -2
  196. package/engine/{dispatch.js → orchestration/dispatch.js} +129 -36
  197. package/engine/orchestration/failed-scheduled-cleanup.js +274 -0
  198. package/engine/{lifecycle.js → orchestration/lifecycle.js} +198 -90
  199. package/engine/{meeting.js → orchestration/meeting.js} +6 -16
  200. package/engine/{pipeline.js → orchestration/pipeline.js} +12 -12
  201. package/engine/{pre-dispatch-eval.js → orchestration/pre-dispatch-eval.js} +10 -9
  202. package/engine/{routing.js → orchestration/routing.js} +3 -3
  203. package/engine/{schedule-bootstrap.js → orchestration/schedule-bootstrap.js} +4 -4
  204. package/engine/{scheduler.js → orchestration/scheduler.js} +38 -8
  205. package/engine/{timeout.js → orchestration/timeout.js} +158 -109
  206. package/engine/{db-events.js → persistence/db-events.js} +2 -2
  207. package/engine/{dispatch-store.js → persistence/dispatch-store.js} +7 -7
  208. package/engine/{inbox-store.js → persistence/inbox-store.js} +2 -2
  209. package/engine/{note-link-backfill.js → persistence/note-link-backfill.js} +4 -4
  210. package/engine/{pr-fix-target-store.js → persistence/pr-fix-target-store.js} +8 -8
  211. package/engine/{pull-requests-store.js → persistence/pull-requests-store.js} +21 -7
  212. package/engine/{small-state-store.js → persistence/small-state-store.js} +31 -31
  213. package/engine/persistence/state-operations.js +350 -0
  214. package/engine/{steering-store.js → persistence/steering-store.js} +6 -6
  215. package/engine/{issues.js → planning/issues.js} +2 -2
  216. package/engine/{plan-prd-validation.js → planning/plan-prd-validation.js} +8 -2
  217. package/engine/planning/prd-result-sidecar.js +190 -0
  218. package/engine/{prd-store.js → planning/prd-store.js} +17 -17
  219. package/engine/{project-discovery.js → planning/project-discovery.js} +5 -5
  220. package/engine/{projects.js → planning/projects.js} +10 -10
  221. package/engine/{resolve-area.js → planning/resolve-area.js} +1 -1
  222. package/engine/{work-item-validation.js → planning/work-item-validation.js} +39 -3
  223. package/engine/{work-items-store.js → planning/work-items-store.js} +29 -21
  224. package/engine/{keep-process-sweep.js → processes/keep-process-sweep.js} +57 -17
  225. package/engine/{managed-spawn-launcher.js → processes/managed-spawn-launcher.js} +3 -3
  226. package/engine/{managed-spawn.js → processes/managed-spawn.js} +97 -46
  227. package/engine/{process-utils.js → processes/process-utils.js} +599 -55
  228. package/engine/{abandoned-pr-reconciliation.js → providers/abandoned-pr-reconciliation.js} +17 -7
  229. package/engine/{comment-classifier.js → providers/comment-classifier.js} +85 -17
  230. package/engine/{comment-format.js → providers/comment-format.js} +5 -5
  231. package/engine/{gh-comment.js → providers/gh-comment.js} +15 -15
  232. package/engine/{gh-token.js → providers/gh-token.js} +4 -4
  233. package/engine/{github.js → providers/github.js} +131 -54
  234. package/engine/{pr-action.js → providers/pr-action.js} +13 -12
  235. package/engine/{pr-clone-keep.js → providers/pr-clone-keep.js} +7 -7
  236. package/engine/{pr-devbox.js → providers/pr-devbox.js} +6 -6
  237. package/engine/{pr-fix-target.js → providers/pr-fix-target.js} +13 -13
  238. package/engine/{pr-remote-patch.js → providers/pr-remote-patch.js} +4 -4
  239. package/engine/{pr-resolve.js → providers/pr-resolve.js} +7 -7
  240. package/engine/{pr-temp-clone.js → providers/pr-temp-clone.js} +5 -5
  241. package/engine/{pr-track.js → providers/pr-track.js} +11 -13
  242. package/engine/{shared-branch-pr-reconcile.js → providers/shared-branch-pr-reconcile.js} +4 -4
  243. package/engine/qa/auto-prd-qa.js +313 -0
  244. package/engine/{qa-from-prd.js → qa/from-prd.js} +42 -12
  245. package/engine/qa/prd-session.js +240 -0
  246. package/engine/{qa-process-validation.js → qa/process-validation.js} +14 -9
  247. package/engine/{qa-runbooks.js → qa/runbooks.js} +1 -1
  248. package/engine/{qa-runs.js → qa/runs.js} +286 -15
  249. package/engine/{qa-sessions.js → qa/sessions.js} +595 -49
  250. package/engine/qa/visual-journey.js +654 -0
  251. package/engine/{qa-runners.js → qa-runners/index.js} +7 -7
  252. package/engine/qa-runners/maestro.js +3 -3
  253. package/engine/qa-runners/playwright.js +2 -2
  254. package/engine/{restart-health.js → recovery/restart-health.js} +48 -4
  255. package/engine/recovery/stop-stack.js +607 -0
  256. package/engine/{supervisor.js → recovery/supervisor.js} +105 -175
  257. package/engine/{watchdog.js → recovery/watchdog.js} +136 -13
  258. package/engine/runtimes/claude.js +14 -12
  259. package/engine/runtimes/codex.js +8 -6
  260. package/engine/runtimes/copilot.js +17 -16
  261. package/engine/{watch-actions.js → watches/actions.js} +13 -13
  262. package/engine/{watches.js → watches/index.js} +43 -32
  263. package/engine/{watches-store.js → watches/store.js} +4 -4
  264. package/engine/{create-pr-worktree.js → worktrees/create-pr.js} +1 -1
  265. package/engine/{worktree-gc.js → worktrees/gc.js} +70 -22
  266. package/engine/worktrees/inventory.js +671 -0
  267. package/engine/{live-checkout.js → worktrees/live-checkout.js} +4 -4
  268. package/engine/{worktree-pool.js → worktrees/pool.js} +2 -2
  269. package/engine/{worktree-preflight.js → worktrees/preflight.js} +1 -0
  270. package/engine/worktrees/quarantine-refs.js +173 -0
  271. package/engine.js +1137 -208
  272. package/minions.js +147 -77
  273. package/package.json +10 -6
  274. package/playbooks/_pr-description-audit.md +110 -78
  275. package/playbooks/build-fix-complex.md +2 -0
  276. package/playbooks/fix.md +16 -12
  277. package/playbooks/implement-shared.md +2 -0
  278. package/playbooks/implement.md +19 -20
  279. package/playbooks/plan-to-prd.md +18 -3
  280. package/playbooks/qa-session-draft.md +136 -1
  281. package/playbooks/qa-session-execute.md +80 -2
  282. package/playbooks/qa-session-setup.md +17 -1
  283. package/playbooks/qa-validate.md +1 -1
  284. package/playbooks/setup.md +2 -0
  285. package/playbooks/shared-rules.md +25 -32
  286. package/playbooks/templates/followup-dispatch.md +4 -3
  287. package/playbooks/verify.md +1 -1
  288. package/prompts/cc-system.md +19 -27
  289. package/watch-plugins/README.md +92 -0
  290. package/watch-plugins/ado-author-prs.js +336 -0
  291. package/watch-plugins/gh-author-prs.js +375 -0
  292. package/watch-plugins/http.js +474 -0
  293. package/watch-plugins/teams-channel.js +869 -0
  294. package/docs/dev-composite-workflow.md +0 -101
  295. package/docs/pr-screenshots/pr-886/after-single-header.png +0 -0
  296. package/docs/pr-screenshots/pr-886/before-duplicate-header.png +0 -0
  297. package/docs/pr-screenshots/pr-895/01-cancellation-reason-detail.png +0 -0
  298. package/docs/pr-screenshots/pr-899/worker-pool-worktrees-AFTER.png +0 -0
  299. package/docs/pr-screenshots/pr-899/worker-pool-worktrees-BEFORE.png +0 -0
  300. package/docs/pr-screenshots/pr-901/projects-tab-default.png +0 -0
  301. package/docs/pr-screenshots/pr-901/projects-tab-fmf-selected.png +0 -0
  302. package/docs/pr-screenshots/pr-916/model-picker-AFTER-crop.png +0 -0
  303. package/docs/pr-screenshots/pr-916/model-picker-AFTER.png +0 -0
  304. package/docs/pr-screenshots/pr-916/model-picker-BEFORE-crop.png +0 -0
  305. package/docs/pr-screenshots/pr-916/model-picker-BEFORE.png +0 -0
  306. package/docs/pr-screenshots/pr-916/model-picker-dropdown-AFTER.png +0 -0
  307. package/docs/pr-screenshots/pr-979/auto-fix-pane-AFTER.png +0 -0
  308. package/docs/pr-screenshots/pr-979/auto-fix-pane-BEFORE.png +0 -0
  309. package/docs/pr-screenshots/pr-985/pr-column-em-dash-AFTER.png +0 -0
  310. package/docs/pr-screenshots/pr-985/pr-column-em-dash-BEFORE.png +0 -0
  311. package/docs/visual-evidence-ci.md +0 -103
  312. package/engine/bridge.js +0 -379
  313. package/engine/quarantine-refs.js +0 -103
  314. package/engine/state-operations.js +0 -178
  315. /package/engine/{steering-constraints.js → agents/steering-constraints.js} +0 -0
@@ -1,16 +1,16 @@
1
1
  /**
2
- * engine/meeting.js — Team meeting orchestration.
2
+ * engine/orchestration/meeting.js — Team meeting orchestration.
3
3
  * Manages multi-round meetings: investigate → debate → conclude.
4
4
  */
5
5
 
6
6
  const fs = require('fs');
7
7
  const path = require('path');
8
- const shared = require('./shared');
8
+ const shared = require('../core/shared');
9
9
  const { safeJson, uid, log, ts, ENGINE_DEFAULTS, WORK_TYPE, DISPATCH_RESULT, MEETING_STATUS } = shared;
10
- const apiValidation = require('./api-validation');
11
- const queries = require('./queries');
10
+ const apiValidation = require('../api/api-validation');
11
+ const queries = require('../core/queries');
12
12
  const { getDispatch, getConfig } = queries;
13
- const { renderPlaybook } = require('./playbook');
13
+ const { renderPlaybook } = require('../agents/playbook');
14
14
  const dispatchModule = require('./dispatch');
15
15
 
16
16
  /** Patterns that indicate an agent returned no meaningful output */
@@ -971,17 +971,7 @@ function _killMeetingDispatches(meetingId) {
971
971
  return dp;
972
972
  }, { defaultValue: { pending: [], active: [], completed: [] } });
973
973
 
974
- const pidsToKill = [];
975
- for (const d of entriesToStop) {
976
- try {
977
- const pidFile = shared.findDispatchPidFile(d) || path.join(tmpDir, `pid-${d.id}.pid`);
978
- const pid = shared.validatePid(fs.readFileSync(pidFile, 'utf8').trim());
979
- pidsToKill.push(pid);
980
- } catch { /* pending entries and already-finished agents may not have PID files */ }
981
- }
982
- for (const pid of pidsToKill) {
983
- try { shared.killGracefully({ pid }); } catch { /* process may already be dead */ }
984
- }
974
+ dispatchModule.stopDispatchProcesses(entriesToStop);
985
975
  for (const fp of filesToDelete) {
986
976
  try { fs.unlinkSync(fp); } catch { /* sidecar may not exist */ }
987
977
  }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * engine/pipeline.js — Multi-stage pipeline orchestration.
2
+ * engine/orchestration/pipeline.js — Multi-stage pipeline orchestration.
3
3
  * Pipelines chain stages (task, meeting, plan, merge-prs, api, wait, parallel, condition)
4
4
  * with dependency tracking, artifact discovery, and conditional stop/termination.
5
5
  */
@@ -7,8 +7,8 @@
7
7
  const fs = require('fs');
8
8
  const path = require('path');
9
9
  const crypto = require('crypto');
10
- const shared = require('./shared');
11
- const queries = require('./queries');
10
+ const shared = require('../core/shared');
11
+ const queries = require('../core/queries');
12
12
  const { safeJson, safeJsonArr, safeJsonNoRestore, safeWrite, safeRead, safeReadDir, uid, log, ts, dateStamp, mutateJsonFileLocked, mutateWorkItems, mutateScheduleRuns, mutatePipelineRuns, slugify, formatTranscriptEntry, WI_STATUS, WORK_TYPE, WORK_ITEM_PRIORITY, PLAN_STATUS, PR_STATUS, PIPELINE_STATUS, STAGE_TYPE, MEETING_STATUS, READ_ONLY_ROOT_TASK_TYPES, ENGINE_DEFAULTS, MINIONS_DIR, isPrdArchived } = shared;
13
13
  const routing = require('./routing');
14
14
  const http = require('http');
@@ -18,9 +18,9 @@ const {
18
18
  buildSource,
19
19
  FENCE_OPEN_PREFIX,
20
20
  FENCE_CLOSE,
21
- } = require('./untrusted-fence');
22
- const smallStateStore = require('./small-state-store');
23
- const apiValidation = require('./api-validation');
21
+ } = require('../core/untrusted-fence');
22
+ const smallStateStore = require('../persistence/small-state-store');
23
+ const apiValidation = require('../api/api-validation');
24
24
  const scheduler = require('./scheduler');
25
25
 
26
26
  // All module-relative paths flow through MINIONS_DIR so MINIONS_TEST_DIR
@@ -737,7 +737,7 @@ function deletePipeline(id) {
737
737
  } catch (e) {
738
738
  // TOCTOU: a concurrent delete of the same id may win the race between
739
739
  // existsSync and unlinkSync. Treat ENOENT as "already deleted" instead
740
- // of throwing, mirroring deleteMeeting's unlink guard (engine/meeting.js).
740
+ // of throwing, mirroring deleteMeeting's unlink guard (engine/orchestration/meeting.js).
741
741
  if (e.code !== 'ENOENT') throw e;
742
742
  return false;
743
743
  }
@@ -753,7 +753,7 @@ function getPipelineRuns() {
753
753
  // Always read work items from the authoritative SQL store so stage-output
754
754
  // template substitution sees the latest completion metadata.
755
755
  function _allWorkItems() {
756
- return require('./work-items-store').readAllWorkItems();
756
+ return require('../planning/work-items-store').readAllWorkItems();
757
757
  }
758
758
 
759
759
  function getActiveRun(pipelineId) {
@@ -1333,7 +1333,7 @@ function _isUsablePipelinePrd(prd) {
1333
1333
  // a usable PRD. Require both a recognized top-level status AND an array
1334
1334
  // `missing_features` field before counting the PRD as an existing conversion.
1335
1335
  function _findExistingPrdForPlan(planFile) {
1336
- const prdFiles = require('./prd-store').listPrdRows().filter(row => !row.archived);
1336
+ const prdFiles = require('../planning/prd-store').listPrdRows().filter(row => !row.archived);
1337
1337
  const planKey = _canonicalPlanName(planFile);
1338
1338
  for (const { filename: pf, plan: prd } of prdFiles) {
1339
1339
  if (!prd?.source_plan || _canonicalPlanName(path.basename(String(prd.source_plan))) !== planKey) continue;
@@ -1455,7 +1455,7 @@ async function executePlanStage(stage, stageState, run, config, pipeline = {}) {
1455
1455
  // Use LLM to generate a structured plan (same approach as dashboard "Create Plan from Meeting" button)
1456
1456
  let content = '';
1457
1457
  try {
1458
- const llm = require('./llm');
1458
+ const llm = require('../agents/llm');
1459
1459
  const planPrompt = 'Create an actionable implementation plan from this meeting. ' +
1460
1460
  'Extract concrete action items from the conclusion and debates. ' +
1461
1461
  'For each item include: what to do, which files/areas to change, priority (high/medium/low), and estimated complexity (small/medium/large). ' +
@@ -1821,7 +1821,7 @@ function isStageComplete(stage, stageState, run, config) {
1821
1821
  const plans = artifacts.plans || [];
1822
1822
  const discoveredPrds = [];
1823
1823
  const discoveredWiIds = [];
1824
- const prdRows = require('./prd-store').listPrdRows().filter(row => !row.archived);
1824
+ const prdRows = require('../planning/prd-store').listPrdRows().filter(row => !row.archived);
1825
1825
  for (const planFile of plans) {
1826
1826
  const planKey = _canonicalPlanName(planFile);
1827
1827
  for (const { filename: pf, plan: prd } of prdRows) {
@@ -1860,7 +1860,7 @@ function isStageComplete(stage, stageState, run, config) {
1860
1860
  if (stage.autoApprove) {
1861
1861
  for (const prdFile of allPrds) {
1862
1862
  let approved = false;
1863
- require('./prd-store').mutatePrd(prdFile, (prd) => {
1863
+ require('../planning/prd-store').mutatePrd(prdFile, (prd) => {
1864
1864
  if (prd && prd.status === PLAN_STATUS.AWAITING_APPROVAL) {
1865
1865
  prd.status = PLAN_STATUS.APPROVED;
1866
1866
  prd.approvedAt = ts();
@@ -1,5 +1,5 @@
1
1
  /**
2
- * engine/pre-dispatch-eval.js — Cheap LLM gate that screens work items for
2
+ * engine/orchestration/pre-dispatch-eval.js — Cheap LLM gate that screens work items for
3
3
  * clear/actionable/testable acceptance criteria *before* they are queued for
4
4
  * dispatch. Catches impossible or ambiguous items so a slow/expensive agent
5
5
  * run isn't burned on something that can't succeed.
@@ -18,7 +18,7 @@
18
18
  * - Fail-open: any LLM error / runtime-unavailable / parse failure resolves
19
19
  * `{ valid: true }` so the gate cannot wedge dispatch.
20
20
  *
21
- * Wired from engine/dispatch.js → addToDispatchWithValidation().
21
+ * Wired from engine/orchestration/dispatch.js → addToDispatchWithValidation().
22
22
  *
23
23
  * Source: Ripley §3 recommendation in
24
24
  * knowledge/architecture/2026-05-11-ripley-daily-architecture-bug-review-ripley-s-investigati.md
@@ -28,9 +28,9 @@
28
28
  * broaden validator to read description when criteria are missing.
29
29
  */
30
30
 
31
- const shared = require('./shared');
31
+ const shared = require('../core/shared');
32
32
  const { log } = shared;
33
- const { callLLM } = require('./llm');
33
+ const { callLLM } = require('../agents/llm');
34
34
 
35
35
  const SYSTEM_PROMPT = 'Output only JSON.';
36
36
  const DEFAULT_TIMEOUT_MS = 60000;
@@ -46,7 +46,7 @@ const DEFAULT_TIMEOUT_MS = 60000;
46
46
  const DESCRIPTION_MIN_CHARS = 80;
47
47
 
48
48
  // Guardrail appended to every prompt. The validator runs a pure text-reasoning
49
- // LLM call (direct: true, cwd hardcoded to MINIONS_DIR per engine/llm.js
49
+ // LLM call (direct: true, cwd hardcoded to MINIONS_DIR per engine/agents/llm.js
50
50
  // _spawnProcess) with NO filesystem tools, so the model cannot see the target
51
51
  // project's code. P-b5e2a481 removed the read tools that were making the model
52
52
  // search MINIONS_DIR, but the model kept *asserting* unverified file-existence
@@ -145,7 +145,7 @@ function _parseResponse(text) {
145
145
  * 2. `shared.resolveCcModel(<engine sub-config>)` — defer to whatever the
146
146
  * engine has configured for its CC/direct LLM path. Tolerates both the
147
147
  * flat shape (`{ ccModel, defaultCli, ... }`, which is what
148
- * `engine/dispatch.js addToDispatchWithValidation` actually passes today)
148
+ * `engine/orchestration/dispatch.js addToDispatchWithValidation` actually passes today)
149
149
  * and a nested shape (`{ engine: { ccModel, ... } }`) for callers that
150
150
  * hand in the whole config blob.
151
151
  * 3. `undefined` — let the runtime adapter pick its own default. The Claude
@@ -181,7 +181,7 @@ function _resolveModel(opts) {
181
181
  * @param {object} [opts]
182
182
  * @param {object} [opts.engineConfig] - engine sub-config (flat
183
183
  * `{ ccModel, defaultCli, ... }` as passed by
184
- * `engine/dispatch.js addToDispatchWithValidation`, or the nested
184
+ * `engine/orchestration/dispatch.js addToDispatchWithValidation`, or the nested
185
185
  * `{ engine: { ... } }` whole-config shape). Used both for
186
186
  * runtime/model resolution in `callLLM` and for resolving the validator's
187
187
  * own model via `shared.resolveCcModel`.
@@ -190,7 +190,7 @@ function _resolveModel(opts) {
190
190
  * (adapter default) when nothing is configured.
191
191
  * @param {object} [opts.project] - target-project identity for prompt context
192
192
  * (`{ name, slug, localPath }`). Threaded by
193
- * `engine/dispatch.js addToDispatchWithValidation` so the model knows which
193
+ * `engine/orchestration/dispatch.js addToDispatchWithValidation` so the model knows which
194
194
  * repo the work item targets (it CANNOT see any repo) and does not default to
195
195
  * describing the Minions engine checkout it runs inside
196
196
  * (W-mr25eg2400078d4b).
@@ -215,9 +215,10 @@ async function validateAcceptanceCriteria(workItem, opts = {}) {
215
215
  label: 'pre-dispatch-eval',
216
216
  model: _resolveModel(opts),
217
217
  maxTurns: 1,
218
+ disableTools: true,
218
219
  direct: true,
219
220
  // No tools at all. Direct callLLM spawns the runtime CLI with
220
- // cwd=MINIONS_DIR (engine/llm.js _spawnProcess). P-b5e2a481 (2026-06-01
221
+ // cwd=MINIONS_DIR (engine/agents/llm.js _spawnProcess). P-b5e2a481 (2026-06-01
221
222
  // 23:44 UTC) removed write access (Edit/Write/Bash) after the validator
222
223
  // "previewed" work by editing dashboard/js/refresh.js in MINIONS_DIR, but
223
224
  // left Read/Grep/Glob in place. Those read tools made the model search the
@@ -1,12 +1,12 @@
1
1
  /**
2
- * engine/routing.js — Agent routing, budget checks, and routing table parsing.
2
+ * engine/orchestration/routing.js — Agent routing, budget checks, and routing table parsing.
3
3
  * Extracted from engine.js.
4
4
  */
5
5
 
6
6
  const fs = require('fs');
7
7
  const path = require('path');
8
- const shared = require('./shared');
9
- const queries = require('./queries');
8
+ const shared = require('../core/shared');
9
+ const queries = require('../core/queries');
10
10
 
11
11
  const { safeJson, safeRead, log, ts, WORK_TYPE } = shared;
12
12
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * engine/schedule-bootstrap.js — Batteries-included default schedules.
2
+ * engine/orchestration/schedule-bootstrap.js — Batteries-included default schedules.
3
3
  *
4
4
  * Historically the git-fetch-freshness schedule (git fetch origin, 12h cadence)
5
5
  * and the shared harness-sweep schedule (daily, explore type) only existed
@@ -22,13 +22,13 @@
22
22
  * Opt-out: `config.engine.bootstrapDefaultSchedules === false` disables all
23
23
  * bootstrap (the `ENGINE_DEFAULTS.bootstrapDefaultSchedules` default is `true`).
24
24
  *
25
- * Zero dependencies — Node built-ins + engine/shared only.
25
+ * Zero dependencies — Node built-ins + engine/core/shared only.
26
26
  */
27
27
 
28
28
  const path = require('path');
29
- const shared = require('./shared');
29
+ const shared = require('../core/shared');
30
30
 
31
- // Simplified cron is "minute hour dayOfWeek" (see engine/scheduler.js). These
31
+ // Simplified cron is "minute hour dayOfWeek" (see engine/orchestration/scheduler.js). These
32
32
  // mirror the schedules that were previously created by hand for
33
33
  // src/constellation/fmf/minions/office-bohemia.
34
34
  const GIT_FETCH_CRON = '0 */12 *'; // every 12 hours, on the hour
@@ -1,5 +1,5 @@
1
1
  /**
2
- * engine/scheduler.js -- Cron-style scheduled task discovery.
2
+ * engine/orchestration/scheduler.js -- Cron-style scheduled task discovery.
3
3
  * Zero dependencies -- uses only Node.js built-ins.
4
4
  *
5
5
  * Config schema:
@@ -22,11 +22,11 @@
22
22
  */
23
23
 
24
24
  const fs = require('fs');
25
- const shared = require('./shared');
25
+ const shared = require('../core/shared');
26
26
  const routing = require('./routing');
27
- const harness = require('./harness');
27
+ const harness = require('../agents/harness');
28
28
  const { safeJson, safeWrite, mutateJsonFileLocked, mutateScheduleRuns, ts, dateStamp, log, WI_STATUS, WORK_TYPE, WORK_ITEM_PRIORITY } = shared;
29
- const apiValidation = require('./api-validation');
29
+ const apiValidation = require('../api/api-validation');
30
30
 
31
31
  const SCHEDULE_LIMITS = Object.freeze({
32
32
  id: 64,
@@ -142,6 +142,23 @@ function validateScheduleDefinition(schedule, options = {}) {
142
142
  optional: true,
143
143
  values: SCHEDULE_WORK_TYPES,
144
144
  });
145
+ // W-ms5tb6ha016fda10 — a schedule may declare `executionSurface:
146
+ // 'control-plane'` for maintenance jobs whose whole contract is Minions/REST
147
+ // API calls plus external CLIs (`gh`, `az`). Validated fail-closed against
148
+ // the schedule's resolved work type, so a repo-mutating schedule can never
149
+ // dispatch without a checkout.
150
+ if (schedule.executionSurface !== undefined) {
151
+ const surfaceType = routing.normalizeWorkType(schedule.type, WORK_TYPE.IMPLEMENT);
152
+ const surface = shared.validateExecutionSurface(schedule.executionSurface, surfaceType);
153
+ if (!surface.valid) {
154
+ _scheduleInputError(surface.error, {
155
+ code: surface.code || 'invalid-execution-surface',
156
+ path: 'executionSurface',
157
+ rejectedValue: schedule.executionSurface,
158
+ allowedValues: shared.EXECUTION_SURFACE_VALUES,
159
+ });
160
+ }
161
+ }
145
162
  _validateSchedulePriority(schedule.priority);
146
163
  _validateConfiguredProject(schedule.project, options.config, 'project');
147
164
  _validateConfiguredAgent(schedule.agent, options.config, 'agent');
@@ -239,9 +256,9 @@ function buildScheduleTemplateVars(extraVars) {
239
256
  *
240
257
  * Plus any caller-supplied `extraVars` (string-coerced). Callers should only
241
258
  * pass vars known at schedule time — pipeline-time vars like {{project_name}}
242
- * stay in engine/playbook.js where the dispatch context is available.
259
+ * stay in engine/agents/playbook.js where the dispatch context is available.
243
260
  *
244
- * Downstream playbook rendering (engine/playbook.js) is a single-pass replace,
261
+ * Downstream playbook rendering (engine/agents/playbook.js) is a single-pass replace,
245
262
  * so any {{var}} embedded in a schedule's title/description would survive
246
263
  * substitution of {{task_description}} and surface as an "unresolved template
247
264
  * variables: var" warning plus a literal "{{var}}" in agent filenames.
@@ -486,10 +503,18 @@ function createScheduledWorkItem(sched, extraVars) {
486
503
  throw new Error('schedule id and title are required');
487
504
  }
488
505
  const workItemId = `sched-${sched.id}-${Date.now()}`;
506
+ const workType = routing.normalizeWorkType(sched.type, WORK_TYPE.IMPLEMENT);
507
+ // W-ms5tb6ha016fda10 — carry a validly-declared control-plane surface onto
508
+ // the materialized work item so the dispatcher skips checkout allocation.
509
+ // Resolved fail-closed: an ineligible type silently materializes as a normal
510
+ // repo dispatch here (validateScheduleDefinition already 400s the operator
511
+ // at write time, and spawnAgent re-validates as the terminal gate).
512
+ const surface = shared.validateExecutionSurface(sched.executionSurface, workType);
513
+ const executionSurface = surface.valid ? surface.value : shared.EXECUTION_SURFACE.REPO;
489
514
  const workItem = {
490
515
  id: workItemId,
491
516
  title: sched.title,
492
- type: routing.normalizeWorkType(sched.type, WORK_TYPE.IMPLEMENT),
517
+ type: workType,
493
518
  priority: sched.priority || WORK_ITEM_PRIORITY.MEDIUM,
494
519
  description: sched.description || sched.title,
495
520
  status: WI_STATUS.PENDING,
@@ -504,7 +529,12 @@ function createScheduledWorkItem(sched, extraVars) {
504
529
  // so the operator can navigate back to the dispatcher. Kept alongside
505
530
  // _scheduleId (used by queries / lifecycle / consolidation) so we don't
506
531
  // disturb the existing readers — meta.spawnedBy is purely additive.
507
- meta: { spawnedBy: 'schedule:' + sched.id },
532
+ meta: {
533
+ spawnedBy: 'schedule:' + sched.id,
534
+ ...(executionSurface === shared.EXECUTION_SURFACE.CONTROL_PLANE
535
+ ? { executionSurface }
536
+ : {}),
537
+ },
508
538
  };
509
539
  // Walk every string-valued field on the work item so vars embedded in
510
540
  // nested fields (e.g. _harness.rubric added by callers, references[].url,