@oisincoveney/pipeline 3.24.1 → 3.24.3

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 (327) hide show
  1. package/README.md +2 -2
  2. package/defaults/pipeline.yaml +23 -5
  3. package/defaults/profiles.yaml +104 -21
  4. package/dist/argo-graph.js +88 -88
  5. package/dist/argo-submit.d.ts +109 -137
  6. package/dist/argo-submit.js +337 -360
  7. package/dist/argo-workflow.d.ts +156 -176
  8. package/dist/argo-workflow.js +96 -138
  9. package/dist/backlog.js +5 -4
  10. package/dist/bench/eval-report.js +21 -12
  11. package/dist/claude-settings-config.js +23 -31
  12. package/dist/claude-user-config.js +6 -16
  13. package/dist/cli/bootstrap-commands.js +3 -3
  14. package/dist/cli/doctor.d.ts +1 -1
  15. package/dist/cli/doctor.js +172 -169
  16. package/dist/cli/factory-commands.js +12 -11
  17. package/dist/cli/format.js +92 -86
  18. package/dist/cli/loop-commands.js +21 -21
  19. package/dist/cli/mcp-gateway-commands.js +12 -12
  20. package/dist/cli/plan-commands.js +85 -116
  21. package/dist/cli/program.d.ts +2 -2
  22. package/dist/cli/program.js +35 -43
  23. package/dist/cli/run-command.js +25 -25
  24. package/dist/cli/run-commands.js +25 -25
  25. package/dist/cli/run-resolver.d.ts +1 -1
  26. package/dist/cli/run-resolver.js +30 -32
  27. package/dist/cli/run-service.d.ts +2 -2
  28. package/dist/cli/run-service.js +226 -239
  29. package/dist/cli/submit-options.js +78 -82
  30. package/dist/cluster-doctor.js +147 -175
  31. package/dist/codex-config.js +24 -30
  32. package/dist/commands/bench-command.js +9 -7
  33. package/dist/commands/pipeline-command.js +9 -5
  34. package/dist/commands/runner-command-command.js +28 -18
  35. package/dist/commands/ticket/complete.js +29 -33
  36. package/dist/commands/ticket/create.js +82 -82
  37. package/dist/commands/ticket/graph-check.js +11 -11
  38. package/dist/commands/ticket/next.js +36 -36
  39. package/dist/commands/ticket/sequence.js +10 -12
  40. package/dist/commands/ticket/shared.d.ts +1 -1
  41. package/dist/commands/ticket/shared.js +63 -66
  42. package/dist/commands/ticket/start.js +58 -67
  43. package/dist/commands/ticket-command.js +2 -2
  44. package/dist/config/defaults.d.ts +139 -139
  45. package/dist/config/defaults.js +81 -80
  46. package/dist/config/lint.js +52 -64
  47. package/dist/config/load.d.ts +4 -4
  48. package/dist/config/load.js +62 -74
  49. package/dist/config/schema/catalog.js +1 -1
  50. package/dist/config/schema/mcp.js +46 -52
  51. package/dist/config/schemas.d.ts +375 -525
  52. package/dist/config/schemas.js +397 -397
  53. package/dist/config/validate.d.ts +1 -1
  54. package/dist/config/validate.js +236 -201
  55. package/dist/context/repo-map.js +102 -119
  56. package/dist/credentials/broker.d.ts +6 -8
  57. package/dist/credentials/broker.js +17 -16
  58. package/dist/credentials/codex-config.js +15 -19
  59. package/dist/credentials/file-targets.js +9 -15
  60. package/dist/credentials/local-codex-auth-sync.js +55 -58
  61. package/dist/credentials/opencode-config.js +28 -32
  62. package/dist/credentials/runner.js +13 -13
  63. package/dist/effect-sync-errors.js +28 -0
  64. package/dist/factory/create-experiment.js +38 -42
  65. package/dist/factory/exec.js +10 -12
  66. package/dist/factory/git-credentials.js +4 -4
  67. package/dist/factory/stamp-answers.js +10 -11
  68. package/dist/factory/template-update.js +65 -44
  69. package/dist/factory-lane.d.ts +26 -40
  70. package/dist/factory-lane.js +26 -25
  71. package/dist/gates.js +3 -3
  72. package/dist/git-remote-url.js +17 -19
  73. package/dist/hooks.d.ts +26 -25
  74. package/dist/hooks.js +20 -22
  75. package/dist/index.d.ts +1 -1
  76. package/dist/index.js +21 -35
  77. package/dist/install-commands/claude-code.js +96 -92
  78. package/dist/install-commands/host-selection.js +3 -6
  79. package/dist/install-commands/opencode.js +263 -259
  80. package/dist/install-commands/planner.js +159 -180
  81. package/dist/install-commands/result-format.js +1 -3
  82. package/dist/install-commands/shared.js +25 -42
  83. package/dist/install-commands/writer.js +22 -25
  84. package/dist/install-commands.js +8 -8
  85. package/dist/jscpd-output.js +29 -0
  86. package/dist/json-config-merge.js +14 -20
  87. package/dist/json-line-values.js +17 -6
  88. package/dist/loop/argo-poll.js +52 -71
  89. package/dist/loop/backlog-records.js +1 -3
  90. package/dist/loop/controller-deps.js +146 -159
  91. package/dist/loop/controller.js +162 -186
  92. package/dist/loop/gh-checks.js +62 -61
  93. package/dist/loop/gh-runner.js +22 -25
  94. package/dist/loop/loop-command.js +66 -58
  95. package/dist/loop/loop-controller-entrypoint.js +28 -30
  96. package/dist/loop/merge.js +36 -40
  97. package/dist/mcp/gateway-config.js +25 -29
  98. package/dist/mcp/gateway-doctor.js +104 -116
  99. package/dist/mcp/gateway-reconcile.js +17 -22
  100. package/dist/mcp/gateway-runtime.js +1 -3
  101. package/dist/mcp/host-config.js +37 -40
  102. package/dist/mcp/host-renderers.js +10 -18
  103. package/dist/mcp/repo-local-backends.js +50 -54
  104. package/dist/mcp/toolhive-vmcp.js +39 -39
  105. package/dist/model-resolver.js +29 -33
  106. package/dist/moka-global-config.d.ts +78 -54
  107. package/dist/moka-global-config.js +90 -92
  108. package/dist/moka-submit.d.ts +2163 -864
  109. package/dist/moka-submit.js +97 -99
  110. package/dist/opencode-project-config.js +34 -40
  111. package/dist/package-assets.js +1 -3
  112. package/dist/path-refs.js +2 -2
  113. package/dist/pipeline-init.js +25 -25
  114. package/dist/pipeline-runtime.d.ts +11 -11
  115. package/dist/pipeline-runtime.js +49 -50
  116. package/dist/planned-node.js +6 -3
  117. package/dist/planning/compile.d.ts +3 -3
  118. package/dist/planning/compile.js +140 -139
  119. package/dist/planning/dependency-refs.js +5 -5
  120. package/dist/planning/generate.d.ts +1293 -1293
  121. package/dist/planning/generate.js +305 -314
  122. package/dist/planning/graph.js +131 -149
  123. package/dist/remote/argo/model.d.ts +103 -121
  124. package/dist/remote/argo/model.js +205 -197
  125. package/dist/remote/argo/policy.js +39 -47
  126. package/dist/remote/argo/storage.js +81 -85
  127. package/dist/remote/argo/templates.js +160 -181
  128. package/dist/remote/submit/argo-submission.js +53 -58
  129. package/dist/remote/submit/compilation.js +46 -49
  130. package/dist/remote/submit/event-boundary.js +62 -76
  131. package/dist/remote/submit/hook-events.d.ts +5 -0
  132. package/dist/remote/submit/io.js +40 -43
  133. package/dist/remote/submit/options.d.ts +50 -0
  134. package/dist/remote/submit/options.js +27 -0
  135. package/dist/remote/submit/service.js +45 -49
  136. package/dist/run-control/command-context.js +6 -8
  137. package/dist/run-control/commands.js +10 -10
  138. package/dist/run-control/contracts.d.ts +40 -100
  139. package/dist/run-control/contracts.js +56 -69
  140. package/dist/run-control/detach.js +66 -72
  141. package/dist/run-control/file-errors.js +1 -3
  142. package/dist/run-control/logical-segment.js +3 -3
  143. package/dist/run-control/next-node.js +66 -78
  144. package/dist/run-control/postgres/postgres-run-control-store.js +195 -224
  145. package/dist/run-control/resume-command.js +33 -41
  146. package/dist/run-control/run-artifacts-command.js +83 -105
  147. package/dist/run-control/run-command-domain.js +7 -11
  148. package/dist/run-control/run-control-store.js +9 -9
  149. package/dist/run-control/run-query-command.js +73 -100
  150. package/dist/run-control/run-record.js +2 -2
  151. package/dist/run-control/run-state-lock.js +5 -5
  152. package/dist/run-control/runtime-event-projection.js +38 -50
  153. package/dist/run-control/runtime-reporter.js +84 -102
  154. package/dist/run-control/stop-command.js +42 -53
  155. package/dist/run-control/store-fs-effects.js +3 -1
  156. package/dist/run-control/store-manifest.js +38 -13
  157. package/dist/run-control/store-paths.js +3 -3
  158. package/dist/run-control/store.js +1 -1
  159. package/dist/run-control/submit-result.js +21 -21
  160. package/dist/run-control/supervisor.js +77 -68
  161. package/dist/run-control/workspace.js +2 -2
  162. package/dist/run-state/git-refs.js +257 -307
  163. package/dist/runner/opencode-excludes.js +4 -4
  164. package/dist/runner/subprocess-result.js +28 -37
  165. package/dist/runner/subprocess.js +41 -41
  166. package/dist/runner/timeouts.js +14 -13
  167. package/dist/runner-command/dynamic-command.js +46 -39
  168. package/dist/runner-command/finalize.js +174 -153
  169. package/dist/runner-command/lifecycle-context.js +112 -130
  170. package/dist/runner-command/lifecycle.js +77 -71
  171. package/dist/runner-command/pre-schedule.js +201 -222
  172. package/dist/runner-command/run.js +432 -447
  173. package/dist/runner-command/schedule-source-options.js +8 -10
  174. package/dist/runner-command/select-ready-wave.js +38 -29
  175. package/dist/runner-command/task-descriptor.js +11 -17
  176. package/dist/runner-command-contract.d.ts +147 -156
  177. package/dist/runner-command-contract.js +401 -410
  178. package/dist/runner-event-schema.d.ts +364 -504
  179. package/dist/runner-event-schema.js +187 -175
  180. package/dist/runner-event-sink.js +37 -43
  181. package/dist/runner-output.js +6 -6
  182. package/dist/runner.d.ts +56 -36
  183. package/dist/runner.js +175 -127
  184. package/dist/runtime/actor-ids.js +2 -2
  185. package/dist/runtime/agent-node/agent-node.js +99 -111
  186. package/dist/runtime/agent-node/handoff-finalization.js +23 -24
  187. package/dist/runtime/agent-node/model-selection.js +19 -22
  188. package/dist/runtime/agent-node/output-finalization.js +174 -205
  189. package/dist/runtime/agent-node/prompt-rendering.js +207 -251
  190. package/dist/runtime/agent-node/session-execution.js +34 -38
  191. package/dist/runtime/builtins/builtins.js +212 -284
  192. package/dist/runtime/changed-files/changed-files.js +26 -34
  193. package/dist/runtime/command-executor/command-executor.js +31 -23
  194. package/dist/runtime/config-error.js +1 -3
  195. package/dist/runtime/context/context.js +35 -37
  196. package/dist/runtime/contracts/index.d.ts +1 -1
  197. package/dist/runtime/detached-race.js +11 -14
  198. package/dist/runtime/drain-merge/drain-merge.js +137 -163
  199. package/dist/runtime/durable-store/acquisition.js +5 -3
  200. package/dist/runtime/durable-store/durable-store.d.ts +1 -1
  201. package/dist/runtime/durable-store/postgres/migrate-substrate.js +36 -33
  202. package/dist/runtime/durable-store/postgres/postgres-store.js +17 -18
  203. package/dist/runtime/events/events.js +255 -323
  204. package/dist/runtime/gates/adjudication/llm-judge.js +21 -24
  205. package/dist/runtime/gates/adjudication/structured-claim.js +15 -16
  206. package/dist/runtime/gates/adjudicator/adjudicator.js +27 -27
  207. package/dist/runtime/gates/adjudicator/index.js +2 -2
  208. package/dist/runtime/gates/contract.js +5 -9
  209. package/dist/runtime/gates/gates.js +9 -8
  210. package/dist/runtime/gates/kinds/acceptance/acceptance.js +66 -70
  211. package/dist/runtime/gates/kinds/acceptance/index.js +2 -2
  212. package/dist/runtime/gates/kinds/artifact/artifact.js +4 -4
  213. package/dist/runtime/gates/kinds/artifact/index.js +2 -2
  214. package/dist/runtime/gates/kinds/builtin/builtin.js +4 -4
  215. package/dist/runtime/gates/kinds/builtin/index.js +2 -2
  216. package/dist/runtime/gates/kinds/changed-files/changed-files.js +31 -35
  217. package/dist/runtime/gates/kinds/changed-files/index.js +2 -2
  218. package/dist/runtime/gates/kinds/command/command.js +3 -3
  219. package/dist/runtime/gates/kinds/command/index.js +2 -2
  220. package/dist/runtime/gates/kinds/json-schema/index.js +2 -2
  221. package/dist/runtime/gates/kinds/json-schema/json-schema.js +7 -6
  222. package/dist/runtime/gates/kinds/verdict/index.js +2 -2
  223. package/dist/runtime/gates/kinds/verdict/verdict.js +3 -3
  224. package/dist/runtime/gates/orchestrator.js +72 -86
  225. package/dist/runtime/gates/registry.js +1 -3
  226. package/dist/runtime/handoff.d.ts +1 -1
  227. package/dist/runtime/handoff.js +43 -46
  228. package/dist/runtime/hooks/command-hook.js +57 -71
  229. package/dist/runtime/hooks/context.js +21 -25
  230. package/dist/runtime/hooks/events.js +84 -100
  231. package/dist/runtime/hooks/execution.js +6 -12
  232. package/dist/runtime/hooks/hooks.js +34 -23
  233. package/dist/runtime/hooks/invocation.js +23 -29
  234. package/dist/runtime/hooks/module-hook.js +35 -35
  235. package/dist/runtime/hooks/policy.js +32 -29
  236. package/dist/runtime/hooks/results.js +56 -66
  237. package/dist/runtime/journal-acquisition.d.ts +1 -1
  238. package/dist/runtime/journal-acquisition.js +14 -14
  239. package/dist/runtime/json-validation/json-validation.js +50 -72
  240. package/dist/runtime/local-scheduler.js +46 -48
  241. package/dist/runtime/node-execution.js +375 -446
  242. package/dist/runtime/node-protocol/node-protocol.js +36 -79
  243. package/dist/runtime/node-state-store.d.ts +1 -1
  244. package/dist/runtime/node-state-store.js +13 -57
  245. package/dist/runtime/node-state-tracker.js +46 -54
  246. package/dist/runtime/open-pull-request/open-pull-request.js +143 -187
  247. package/dist/runtime/opencode-adapter.js +23 -24
  248. package/dist/runtime/opencode-agent-name.js +6 -6
  249. package/dist/runtime/opencode-runtime.js +92 -92
  250. package/dist/runtime/opencode-server.js +39 -53
  251. package/dist/runtime/opencode-session-executor.js +315 -334
  252. package/dist/runtime/parallel-node/parallel-node.js +122 -134
  253. package/dist/runtime/parallel-worktrees/parallel-worktrees.js +90 -73
  254. package/dist/runtime/protected-paths/protected-paths.js +70 -71
  255. package/dist/runtime/remediation/remediation.js +202 -231
  256. package/dist/runtime/retry.js +8 -10
  257. package/dist/runtime/run-journal.js +7 -7
  258. package/dist/runtime/runtime-results.js +54 -69
  259. package/dist/runtime/scheduled-dependencies.d.ts +1 -1
  260. package/dist/runtime/scheduled-dependencies.js +59 -74
  261. package/dist/runtime/scheduler.js +177 -202
  262. package/dist/runtime/services/agent-node-runtime-service.js +3 -3
  263. package/dist/runtime/services/backlog-service.js +8 -14
  264. package/dist/runtime/services/command-executor-service.js +1 -1
  265. package/dist/runtime/services/config-io-service.js +24 -21
  266. package/dist/runtime/services/drain-merge-git-service.js +1 -1
  267. package/dist/runtime/services/file-system-service.js +9 -7
  268. package/dist/runtime/services/git-porcelain-service.js +6 -6
  269. package/dist/runtime/services/kubernetes-argo-service.d.ts +10 -2
  270. package/dist/runtime/services/kubernetes-argo-service.js +90 -84
  271. package/dist/runtime/services/mcp-gateway-service.js +82 -81
  272. package/dist/runtime/services/open-pull-request-git-service.js +1 -3
  273. package/dist/runtime/services/opencode-runtime-server-service.js +10 -12
  274. package/dist/runtime/services/opencode-sdk-service.js +7 -7
  275. package/dist/runtime/services/repo-io-service.js +10 -12
  276. package/dist/runtime/services/run-journal-file-service.js +2 -2
  277. package/dist/runtime/services/runner-command-io-service.js +48 -52
  278. package/dist/runtime/services/runner-event-sink-http-service.js +31 -39
  279. package/dist/runtime/step/step-node.js +15 -15
  280. package/dist/runtime/workflow-execution.js +55 -57
  281. package/dist/runtime/workflow-lifecycle.js +81 -101
  282. package/dist/safe-json.js +16 -16
  283. package/dist/schedule/backlog-context.js +120 -116
  284. package/dist/schedule/baseline.js +249 -255
  285. package/dist/schedule/passes/coverage.js +63 -68
  286. package/dist/schedule/passes/drain-merge.js +34 -40
  287. package/dist/schedule/passes/ids.js +15 -17
  288. package/dist/schedule/passes/models.js +40 -37
  289. package/dist/schedule/passes/open-pull-request.js +12 -18
  290. package/dist/schedule/passes/references.js +18 -22
  291. package/dist/schedule/prompts.js +134 -141
  292. package/dist/schedule/scheduling-roles.js +8 -14
  293. package/dist/schema-boundary.d.ts +1 -0
  294. package/dist/schema-boundary.js +145 -0
  295. package/dist/serialized-write-queue.js +2 -2
  296. package/dist/standard-output-schemas.js +61 -59
  297. package/dist/strings.js +12 -12
  298. package/dist/task-ref.js +5 -5
  299. package/dist/tickets/apply-ticket-plan.js +51 -61
  300. package/dist/tickets/backlog-task-store.d.ts +13 -22
  301. package/dist/tickets/backlog-task-store.js +80 -94
  302. package/dist/tickets/completion/complete-ticket.js +53 -59
  303. package/dist/tickets/ticket-graph-dto.d.ts +24 -47
  304. package/dist/tickets/ticket-graph-dto.js +40 -40
  305. package/dist/tickets/ticket-graph.d.ts +7 -1
  306. package/dist/tickets/ticket-graph.js +36 -50
  307. package/dist/tickets/ticket-plan-command-args.js +6 -10
  308. package/dist/tickets/ticket-plan-render.js +10 -16
  309. package/dist/tickets/ticket-plan.d.ts +31 -40
  310. package/dist/tickets/ticket-plan.js +97 -77
  311. package/dist/tickets/ticket-selection.d.ts +1 -1
  312. package/dist/tickets/ticket-selection.js +37 -52
  313. package/dist/tickets/ticket-task-index.js +13 -17
  314. package/dist/tickets/validation-error-format.js +3 -10
  315. package/dist/token-estimator.js +12 -7
  316. package/dist/unknown-fields.js +21 -0
  317. package/dist/workflow-submit-contract.d.ts +9 -9
  318. package/dist/workflow-submit-contract.js +10 -9
  319. package/docs/adr-opencode-first-goal-loop-runtime.md +11 -11
  320. package/docs/config-architecture.md +13 -13
  321. package/docs/mcp-host-isolation.md +1 -0
  322. package/docs/moka-orchestrator-design.md +3 -3
  323. package/docs/operator-guide.md +1 -1
  324. package/docs/runtime-actor-model.md +18 -18
  325. package/docs/slash-command-adapter-contract.md +3 -3
  326. package/package.json +73 -76
  327. package/dist/config/schema/reference-validation.js +0 -83
package/README.md CHANGED
@@ -290,8 +290,8 @@ sources of truth. Host resources use OpenCode native agents for model-backed
290
290
  nodes. Otherwise generated instructions dispatch to the configured command
291
291
  runner.
292
292
 
293
- | Host | Generated files | Invocation |
294
- | --- | --- | --- |
293
+ | Host | Generated files | Invocation |
294
+ | -------- | ----------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- |
295
295
  | OpenCode | `.opencode/commands/moka-<entrypoint>.md`, `.opencode/agents/*.md`, `.opencode/plugins/*.ts`, `.opencode/opencode.json` | `/moka-quick <task>`, `/moka-execute <task>`, `/moka-inspect <task>` |
296
296
 
297
297
  The installer is idempotent, supports `--check` and `--dry-run`, and refuses to
@@ -36,7 +36,12 @@ hooks:
36
36
  functions:
37
37
  generated-defaults-audit:
38
38
  kind: command
39
- command: [node, -e, "const fs=require('node:fs'); fs.writeFileSync(process.env.PIPELINE_HOOK_RESULT, JSON.stringify({status:'pass',summary:'Generated defaults audit passed'}));"]
39
+ command:
40
+ [
41
+ node,
42
+ -e,
43
+ "const fs=require('node:fs'); fs.writeFileSync(process.env.PIPELINE_HOOK_RESULT, JSON.stringify({status:'pass',summary:'Generated defaults audit passed'}));",
44
+ ]
40
45
  trusted: true
41
46
  timeout_ms: 5000
42
47
  output_limit_bytes: 4096
@@ -111,7 +116,8 @@ scheduler:
111
116
  green-implementation:
112
117
  category: green
113
118
  profile: moka-code-writer
114
- models: [opencode-go/qwen3.7-max, broker/gpt-5.5, kimi-for-coding/k2p6]
119
+ models:
120
+ [opencode-go/qwen3.7-max, broker/gpt-5.5, kimi-for-coding/k2p6]
115
121
  reasoning_effort: high
116
122
  verification:
117
123
  category: verification
@@ -119,7 +125,17 @@ scheduler:
119
125
  models: [broker/gpt-5.5, kimi-for-coding/kimi-k2-thinking]
120
126
  reasoning_effort: medium
121
127
  execute:
122
- required_categories: [intake, research, red, green, mechanical, acceptance, verification, learn]
128
+ required_categories:
129
+ [
130
+ intake,
131
+ research,
132
+ red,
133
+ green,
134
+ mechanical,
135
+ acceptance,
136
+ verification,
137
+ learn,
138
+ ]
123
139
  nodes:
124
140
  backlog-intake:
125
141
  category: intake
@@ -139,12 +155,14 @@ scheduler:
139
155
  green-backend:
140
156
  category: green
141
157
  profile: moka-code-writer
142
- models: [opencode-go/qwen3.7-max, broker/gpt-5.5, kimi-for-coding/k2p6]
158
+ models:
159
+ [opencode-go/qwen3.7-max, broker/gpt-5.5, kimi-for-coding/k2p6]
143
160
  reasoning_effort: high
144
161
  green-frontend:
145
162
  category: green
146
163
  profile: moka-code-writer
147
- models: [broker/gpt-5.5, kimi-for-coding/k2p6, opencode-go/qwen3.7-max]
164
+ models:
165
+ [broker/gpt-5.5, kimi-for-coding/k2p6, opencode-go/qwen3.7-max]
148
166
  reasoning_effort: high
149
167
  acceptance-review:
150
168
  category: acceptance
@@ -93,21 +93,37 @@ profiles:
93
93
  model: broker/gpt-5.5
94
94
  reasoning_effort: xhigh
95
95
  description: Orchestrate the configured pipeline and enforce gates.
96
- instructions: { inline: "Orchestrate through the canonical local `moka run` supervisor. For compatibility slash commands, run the `moka run` command and flags shown in the command body. Treat execution as CLI/supervised runtime, not OpenCode-native Task execution. Enforce only package-configured gates." }
96
+ instructions:
97
+ {
98
+ inline: "Orchestrate through the canonical local `moka run` supervisor. For compatibility slash commands, run the `moka run` command and flags shown in the command body. Treat execution as CLI/supervised runtime, not OpenCode-native Task execution. Enforce only package-configured gates.",
99
+ }
97
100
  skills: [orchestrate, execute, quick, inspect]
98
101
  mcp_servers: [pipeline-gateway]
99
102
  tools: [read, list, grep, glob, bash]
100
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
103
+ filesystem:
104
+ {
105
+ mode: read-only,
106
+ allow: ["**/*"],
107
+ deny: ["node_modules/**", "dist/**", ".git/**"],
108
+ }
101
109
  network: { mode: inherit }
102
110
  moka-researcher:
103
111
  runner: opencode
104
112
  description: Research the requested task and produce structured findings.
105
- instructions: { inline: "Inspect first-party source, tests, docs, and task context for the current task only. Produce concise findings with file references and stop; do not perform open-ended repository exploration." }
113
+ instructions:
114
+ {
115
+ inline: "Inspect first-party source, tests, docs, and task context for the current task only. Produce concise findings with file references and stop; do not perform open-ended repository exploration.",
116
+ }
106
117
  timeout_ms: 900000
107
118
  skills: [research, spec, scope]
108
119
  mcp_servers: [pipeline-gateway]
109
120
  tools: [read, list, grep, glob, bash]
110
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
121
+ filesystem:
122
+ {
123
+ mode: read-only,
124
+ allow: ["**/*"],
125
+ deny: ["node_modules/**", "dist/**", ".git/**"],
126
+ }
111
127
  network: { mode: inherit }
112
128
  output:
113
129
  format: json_schema
@@ -116,12 +132,20 @@ profiles:
116
132
  moka-ticket-scoper:
117
133
  runner: opencode
118
134
  description: Scope a request into a validated Backlog ticket plan.
119
- instructions: { inline: "Use the scope skill contract to produce implementation-complete Backlog tickets. Return only valid JSON matching `.pipeline/schemas/ticket-plan.schema.json`. Every acceptance criterion must include concrete evidence text. Do not emit partial tickets; include dependencies, likely files, references, priorities, and plan text for each proposed ticket." }
135
+ instructions:
136
+ {
137
+ inline: "Use the scope skill contract to produce implementation-complete Backlog tickets. Return only valid JSON matching `.pipeline/schemas/ticket-plan.schema.json`. Every acceptance criterion must include concrete evidence text. Do not emit partial tickets; include dependencies, likely files, references, priorities, and plan text for each proposed ticket.",
138
+ }
120
139
  timeout_ms: 300000
121
140
  skills: [scope]
122
141
  mcp_servers: [pipeline-gateway]
123
142
  tools: [read, list, grep, glob, bash]
124
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
143
+ filesystem:
144
+ {
145
+ mode: read-only,
146
+ allow: ["**/*"],
147
+ deny: ["node_modules/**", "dist/**", ".git/**"],
148
+ }
125
149
  network: { mode: inherit }
126
150
  output:
127
151
  format: json_schema
@@ -136,30 +160,51 @@ profiles:
136
160
  skills: [research]
137
161
  mcp_servers: [pipeline-gateway]
138
162
  tools: [read, list, grep, glob, bash]
139
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
163
+ filesystem:
164
+ {
165
+ mode: read-only,
166
+ allow: ["**/*"],
167
+ deny: ["node_modules/**", "dist/**", ".git/**"],
168
+ }
140
169
  network: { mode: inherit }
141
170
  moka-schedule-planner:
142
171
  runner: opencode
143
172
  model: broker/gpt-5.5
144
173
  reasoning_effort: xhigh
145
174
  description: Refine a baseline schedule into a specialized approved-plan artifact.
146
- instructions: { inline: "Generate exactly one workflow named root as an explicit schedule graph. Return YAML only." }
175
+ instructions:
176
+ {
177
+ inline: "Generate exactly one workflow named root as an explicit schedule graph. Return YAML only.",
178
+ }
147
179
  timeout_ms: 300000
148
180
  skills: [schedule-graph-shaping]
149
181
  mcp_servers: [pipeline-gateway]
150
182
  tools: [read, list, grep, glob, bash]
151
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
183
+ filesystem:
184
+ {
185
+ mode: read-only,
186
+ allow: ["**/*"],
187
+ deny: ["node_modules/**", "dist/**", ".git/**"],
188
+ }
152
189
  network: { mode: inherit }
153
190
  moka-test-writer:
154
191
  runner: opencode
155
192
  scheduling_roles: [implementation]
156
193
  description: Add focused failing tests for the requested behavior.
157
194
  timeout_ms: 1800000
158
- instructions: { inline: "This scheduled node is already dispatched by Moka; do direct repository work inside the current workspace. Do not invoke `moka run`, `moka submit`, `$dispatch`, `$scope`, `$execute`, or any nested Moka/workflow supervisor from this node. Add focused failing tests for the requested behavior only. Do not change production code. Only edit files matching test paths such as **/*.test.*, **/*.spec.*, **/*_test.*, **/__tests__/**, test/**, or tests/**. Tool findings about lint, types, complexity, or dead code must be resolved at source; comments must not hide them. If a gate flags your test, restructure the test (e.g. move restricted imports into shared support/fixture helpers). Return only valid JSON with top-level changes and verification. Every changes entry must include summary, why, and files. Include risks, followups, and lessons when present. Do not use Markdown fences or prose outside the JSON object." }
195
+ instructions:
196
+ {
197
+ inline: "This scheduled node is already dispatched by Moka; do direct repository work inside the current workspace. Do not invoke `moka run`, `moka submit`, `$dispatch`, `$scope`, `$execute`, or any nested Moka/workflow supervisor from this node. Add focused failing tests for the requested behavior only. Do not change production code. Only edit files matching test paths such as **/*.test.*, **/*.spec.*, **/*_test.*, **/__tests__/**, test/**, or tests/**. Tool findings about lint, types, complexity, or dead code must be resolved at source; comments must not hide them. If a gate flags your test, restructure the test (e.g. move restricted imports into shared support/fixture helpers). Return only valid JSON with top-level changes and verification. Every changes entry must include summary, why, and files. Include risks, followups, and lessons when present. Do not use Markdown fences or prose outside the JSON object.",
198
+ }
159
199
  skills: [test]
160
200
  mcp_servers: [pipeline-gateway]
161
201
  tools: [read, list, grep, glob, bash, edit, write]
162
- filesystem: { mode: workspace-write, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
202
+ filesystem:
203
+ {
204
+ mode: workspace-write,
205
+ allow: ["**/*"],
206
+ deny: ["node_modules/**", "dist/**", ".git/**"],
207
+ }
163
208
  network: { mode: inherit }
164
209
  output:
165
210
  format: json_schema
@@ -170,11 +215,19 @@ profiles:
170
215
  scheduling_roles: [implementation]
171
216
  description: Implement production code until the failing tests pass.
172
217
  timeout_ms: 1800000
173
- instructions: { inline: "This scheduled node is already dispatched by Moka; do direct repository work inside the current workspace. Do not invoke `moka run`, `moka submit`, `$dispatch`, `$scope`, `$execute`, or any nested Moka/workflow supervisor from this node. Implement the smallest production change that makes the failing tests pass. Tool findings about lint, types, complexity, or dead code must be resolved at source; comments must not hide them. Reduce complexity by extracting helpers, remove genuinely dead code, and migrate off deprecated APIs rather than hiding the warning. Return only valid JSON with top-level changes and verification. Every changes entry must include summary, why, and files. Include risks, followups, and lessons when present. Do not use Markdown fences or prose outside the JSON object." }
218
+ instructions:
219
+ {
220
+ inline: "This scheduled node is already dispatched by Moka; do direct repository work inside the current workspace. Do not invoke `moka run`, `moka submit`, `$dispatch`, `$scope`, `$execute`, or any nested Moka/workflow supervisor from this node. Implement the smallest production change that makes the failing tests pass. Tool findings about lint, types, complexity, or dead code must be resolved at source; comments must not hide them. Reduce complexity by extracting helpers, remove genuinely dead code, and migrate off deprecated APIs rather than hiding the warning. Return only valid JSON with top-level changes and verification. Every changes entry must include summary, why, and files. Include risks, followups, and lessons when present. Do not use Markdown fences or prose outside the JSON object.",
221
+ }
174
222
  skills: [trace, test, fix, library-first-development]
175
223
  mcp_servers: [pipeline-gateway]
176
224
  tools: [read, list, grep, glob, bash, edit, write]
177
- filesystem: { mode: workspace-write, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
225
+ filesystem:
226
+ {
227
+ mode: workspace-write,
228
+ allow: ["**/*"],
229
+ deny: ["node_modules/**", "dist/**", ".git/**"],
230
+ }
178
231
  network: { mode: inherit }
179
232
  output:
180
233
  format: json_schema
@@ -184,11 +237,19 @@ profiles:
184
237
  runner: opencode
185
238
  scheduling_roles: [coverage]
186
239
  description: Audit the finished change against every acceptance criterion.
187
- instructions: { inline: 'Audit the completed change against each canonical acceptance criterion independently. Return only valid JSON with top-level "verdict", "evidence", "acceptance", and optional "violations". Each "acceptance" entry must include "id", "verdict", and non-empty "evidence". Do not use Markdown fences or prose outside the JSON object.' }
240
+ instructions:
241
+ {
242
+ inline: 'Audit the completed change against each canonical acceptance criterion independently. Return only valid JSON with top-level "verdict", "evidence", "acceptance", and optional "violations". Each "acceptance" entry must include "id", "verdict", and non-empty "evidence". Do not use Markdown fences or prose outside the JSON object.',
243
+ }
188
244
  skills: [critique, doubt]
189
245
  mcp_servers: [pipeline-gateway]
190
246
  tools: [read, list, grep, glob, bash]
191
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
247
+ filesystem:
248
+ {
249
+ mode: read-only,
250
+ allow: ["**/*"],
251
+ deny: ["node_modules/**", "dist/**", ".git/**"],
252
+ }
192
253
  network: { mode: inherit }
193
254
  output:
194
255
  format: json_schema
@@ -198,11 +259,19 @@ profiles:
198
259
  runner: opencode
199
260
  scheduling_roles: [coverage]
200
261
  description: Perform the final thermo-nuclear code quality review of the integration branch.
201
- instructions: { inline: "Perform the final code quality review of the integration branch." }
262
+ instructions:
263
+ {
264
+ inline: "Perform the final code quality review of the integration branch.",
265
+ }
202
266
  skills: [critique]
203
267
  mcp_servers: [pipeline-gateway]
204
268
  tools: [read, list, grep, glob, bash]
205
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
269
+ filesystem:
270
+ {
271
+ mode: read-only,
272
+ allow: ["**/*"],
273
+ deny: ["node_modules/**", "dist/**", ".git/**"],
274
+ }
206
275
  network: { mode: inherit }
207
276
  output:
208
277
  format: json_schema
@@ -212,11 +281,19 @@ profiles:
212
281
  runner: opencode
213
282
  scheduling_roles: [coverage]
214
283
  description: Verify checks, implementation fit, and final evidence.
215
- instructions: { inline: 'Verify checks, implementation fit, and final evidence. Return only valid JSON with top-level "verdict", "evidence", and optional "violations". Do not use Markdown fences or prose outside the JSON object.' }
284
+ instructions:
285
+ {
286
+ inline: 'Verify checks, implementation fit, and final evidence. Return only valid JSON with top-level "verdict", "evidence", and optional "violations". Do not use Markdown fences or prose outside the JSON object.',
287
+ }
216
288
  skills: [verify, critique, secure, optimize]
217
289
  mcp_servers: [pipeline-gateway]
218
290
  tools: [read, list, grep, glob, bash]
219
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
291
+ filesystem:
292
+ {
293
+ mode: read-only,
294
+ allow: ["**/*"],
295
+ deny: ["node_modules/**", "dist/**", ".git/**"],
296
+ }
220
297
  network: { mode: inherit }
221
298
  output:
222
299
  format: json_schema
@@ -227,11 +304,17 @@ profiles:
227
304
  model: broker/gpt-5.5
228
305
  reasoning_effort: low
229
306
  description: Store durable lessons from the completed run.
230
- instructions: { inline: "Store durable lessons from the completed run when useful." }
307
+ instructions:
308
+ { inline: "Store durable lessons from the completed run when useful." }
231
309
  skills: [migrate]
232
310
  mcp_servers: [pipeline-gateway]
233
311
  tools: [read, list, grep, glob, bash]
234
- filesystem: { mode: read-only, allow: ["**/*"], deny: ["node_modules/**", "dist/**", ".git/**"] }
312
+ filesystem:
313
+ {
314
+ mode: read-only,
315
+ allow: ["**/*"],
316
+ deny: ["node_modules/**", "dist/**", ".git/**"],
317
+ }
235
318
  network: { mode: inherit }
236
319
  output:
237
320
  format: json_schema
@@ -1,107 +1,107 @@
1
1
  import { uniqueStrings } from "./strings.js";
2
- import { resolveExecutableDependencyIds } from "./planning/dependency-refs.js";
2
+ import { indexPlannedNodesById, resolveExecutableDependencyIds } from "./planning/dependency-refs.js";
3
3
  import { terminalDependencyItems } from "./planning/graph.js";
4
- import { Data } from "effect";
5
- import { z } from "zod";
4
+ import { mutableArray, nonEmptyMutableArray, parseStrictWithSchema, requiredString, struct } from "./schema-boundary.js";
5
+ import * as Option$1 from "effect/Option";
6
+ import * as Schema from "effect/Schema";
7
+ import * as Arr from "effect/Array";
8
+ import * as HashMap from "effect/HashMap";
9
+ import * as Match from "effect/Match";
6
10
  //#region src/argo-graph.ts
7
- const argoExecutableTaskSchema = z.object({
8
- dependencies: z.array(z.string().min(1)),
9
- nodeId: z.string().min(1),
10
- taskName: z.string().min(1),
11
- templateName: z.string().min(1)
12
- }).strict();
13
- const argoExecutionGraphSchema = z.object({
14
- terminalNodeIds: z.array(z.string().min(1)),
15
- tasks: z.array(argoExecutableTaskSchema).min(1),
16
- terminalTaskNames: z.array(z.string().min(1)),
17
- workflowId: z.string().min(1)
18
- }).strict();
11
+ const argoExecutableTaskSchema = struct({
12
+ dependencies: mutableArray(requiredString),
13
+ nodeId: requiredString,
14
+ taskName: requiredString,
15
+ templateName: requiredString
16
+ });
17
+ const argoExecutionGraphSchema = struct({
18
+ tasks: nonEmptyMutableArray(argoExecutableTaskSchema),
19
+ terminalNodeIds: mutableArray(requiredString),
20
+ terminalTaskNames: mutableArray(requiredString),
21
+ workflowId: requiredString
22
+ });
19
23
  /**
20
24
  * Thrown when the Argo graph compiler encounters a node kind that cannot be
21
25
  * lowered to an Argo DAG task. Callers should surface this as a validation
22
26
  * failure before attempting a cluster submission.
23
27
  */
24
- var ArgoGraphCompilerError = class extends Data.TaggedError("ArgoGraphCompilerError") {
28
+ var ArgoGraphCompilerError = class extends Schema.TaggedErrorClass()("ArgoGraphCompilerError", {
29
+ kind: Schema.String,
30
+ message: Schema.String,
31
+ nodeId: Schema.String
32
+ }) {
25
33
  constructor(kind, nodeId) {
26
34
  super({
27
35
  kind,
28
- nodeId,
29
- message: `Argo graph compiler: node kind '${kind}' on node '${nodeId}' cannot be lowered to an Argo DAG task`
36
+ message: `Argo graph compiler: node kind '${kind}' on node '${nodeId}' cannot be lowered to an Argo DAG task`,
37
+ nodeId
30
38
  });
31
39
  }
32
40
  };
33
- function compileArgoExecutionGraph(plan) {
34
- const compiler = new ArgoGraphCompiler(plan);
35
- return argoExecutionGraphSchema.parse(compiler.compile());
36
- }
37
- var ArgoGraphCompiler = class {
38
- nodeById = /* @__PURE__ */ new Map();
39
- plan;
40
- tasks = [];
41
- constructor(plan) {
42
- this.plan = plan;
43
- this.indexNodes(plan.topologicalOrder);
44
- }
45
- compile() {
46
- this.compileNodes(this.plan.topologicalOrder, []);
47
- const terminalTasks = this.terminalTasks();
48
- return {
49
- terminalNodeIds: terminalTasks.map((task) => task.nodeId),
50
- tasks: this.tasks,
51
- terminalTaskNames: terminalTasks.map((task) => task.taskName),
52
- workflowId: this.plan.workflowId
53
- };
54
- }
55
- indexNodes(nodes) {
56
- for (const node of nodes) {
57
- if (this.nodeById.has(node.id)) throw new Error(`Argo schedule contains duplicate node id '${node.id}'`);
58
- this.nodeById.set(node.id, node);
59
- this.indexNodes(node.children ?? []);
60
- }
61
- }
62
- compileNodes(nodes, inheritedNeeds) {
63
- for (const node of nodes) this.compileNode(node, inheritedNeeds);
64
- }
65
- compileNode(node, inheritedNeeds) {
66
- const kind = node.kind;
67
- switch (kind) {
68
- case "agent":
69
- case "builtin":
70
- case "command":
71
- this.compileExecutableNode(node, inheritedNeeds);
72
- return;
73
- case "group": return;
74
- case "parallel":
75
- this.compileParallelNode(node, inheritedNeeds);
76
- return;
77
- default: throw new ArgoGraphCompilerError(String(kind), node.id);
78
- }
79
- }
80
- compileExecutableNode(node, inheritedNeeds) {
81
- const dependencies = this.resolveDependencyTaskNames([...inheritedNeeds, ...node.needs]);
82
- const task = argoExecutableTaskSchema.parse({
83
- dependencies,
84
- nodeId: node.id,
85
- taskName: argoTaskName(node.id),
86
- templateName: argoTemplateName(node.id)
41
+ var ArgoGraphDuplicateNodeError = class extends Schema.TaggedErrorClass()("ArgoGraphDuplicateNodeError", {
42
+ message: Schema.String,
43
+ nodeId: Schema.String
44
+ }) {
45
+ constructor(nodeId) {
46
+ super({
47
+ message: `Argo schedule contains duplicate node id '${nodeId}'`,
48
+ nodeId
87
49
  });
88
- this.tasks.push(task);
89
- }
90
- compileParallelNode(node, inheritedNeeds) {
91
- this.compileNodes(node.children ?? [], [...inheritedNeeds, ...node.needs]);
92
- }
93
- resolveDependencyTaskNames(nodeIds) {
94
- return uniqueStrings(resolveExecutableDependencyIds(this.nodeById, nodeIds).map((id) => argoTaskName(id)));
95
- }
96
- terminalTasks() {
97
- return terminalDependencyItems(this.tasks, (task) => task.taskName, (task) => task.dependencies);
98
50
  }
99
51
  };
100
- function argoTaskName(nodeId) {
101
- return `node-${nodeId}`;
102
- }
103
- function argoTemplateName(nodeId) {
104
- return `task-${nodeId}`;
105
- }
52
+ const argoTaskName = (nodeId) => `node-${nodeId}`;
53
+ const argoTemplateName = (nodeId) => `task-${nodeId}`;
54
+ const emptyDuplicateNodeSearchState = {
55
+ duplicate: Option$1.none(),
56
+ seen: HashMap.empty()
57
+ };
58
+ const nodeAndDescendants = (node) => [node, ...Arr.flatMap(node.children ?? [], nodeAndDescendants)];
59
+ const plannedNodeTree = (nodes) => Arr.flatMap(nodes, nodeAndDescendants);
60
+ const trackDuplicateNodeId = (state, node) => Option$1.isSome(state.duplicate) ? state : HashMap.has(state.seen, node.id) ? {
61
+ ...state,
62
+ duplicate: Option$1.some(node.id)
63
+ } : {
64
+ duplicate: Option$1.none(),
65
+ seen: HashMap.set(state.seen, node.id, true)
66
+ };
67
+ const duplicateNodeId = (nodes) => Arr.reduce(plannedNodeTree(nodes), emptyDuplicateNodeSearchState, trackDuplicateNodeId).duplicate;
68
+ const assertUniqueNodeIds = (nodes) => {
69
+ Option$1.match(duplicateNodeId(nodes), {
70
+ onNone: () => void 0,
71
+ onSome: (nodeId) => {
72
+ throw new ArgoGraphDuplicateNodeError(nodeId);
73
+ }
74
+ });
75
+ };
76
+ const resolveDependencyTaskNames = (context, nodeIds) => uniqueStrings(resolveExecutableDependencyIds(context.nodeById, nodeIds).map((id) => argoTaskName(id)));
77
+ const compileExecutableNode = (context, node, inheritedNeeds) => {
78
+ return parseStrictWithSchema(argoExecutableTaskSchema, {
79
+ dependencies: resolveDependencyTaskNames(context, [...inheritedNeeds, ...node.needs]),
80
+ nodeId: node.id,
81
+ taskName: argoTaskName(node.id),
82
+ templateName: argoTemplateName(node.id)
83
+ });
84
+ };
85
+ const compileArgoNodes = (context, nodes, inheritedNeeds, initialTasks = []) => Arr.reduce(nodes, initialTasks, (tasks, node) => compileArgoNode({
86
+ context,
87
+ inheritedNeeds,
88
+ node,
89
+ tasks
90
+ }));
91
+ const compileArgoNode = (input) => Match.value(input.node.kind).pipe(Match.whenOr("agent", "builtin", "command", () => [...input.tasks, compileExecutableNode(input.context, input.node, input.inheritedNeeds)]), Match.when("group", () => input.tasks), Match.when("parallel", () => compileArgoNodes(input.context, input.node.children ?? [], [...input.inheritedNeeds, ...input.node.needs], input.tasks)), Match.exhaustive);
92
+ const compileArgoExecutionGraphUnchecked = (plan) => {
93
+ const tasks = compileArgoNodes({ nodeById: indexPlannedNodesById(plan.topologicalOrder) }, plan.topologicalOrder, []);
94
+ const terminalTasks = terminalDependencyItems(tasks, (task) => task.taskName, (task) => task.dependencies);
95
+ return {
96
+ tasks,
97
+ terminalNodeIds: terminalTasks.map((task) => task.nodeId),
98
+ terminalTaskNames: terminalTasks.map((task) => task.taskName),
99
+ workflowId: plan.workflowId
100
+ };
101
+ };
102
+ const compileArgoExecutionGraph = (plan) => {
103
+ assertUniqueNodeIds(plan.topologicalOrder);
104
+ return parseStrictWithSchema(argoExecutionGraphSchema, compileArgoExecutionGraphUnchecked(plan));
105
+ };
106
106
  //#endregion
107
107
  export { ArgoGraphCompilerError, compileArgoExecutionGraph };