stageflow 0.23.0 → 0.27.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 (511) hide show
  1. package/README.md +24 -5
  2. package/dist/a2a/configDiscovery.d.ts +9 -0
  3. package/dist/a2a/configDiscovery.js +18 -0
  4. package/dist/a2a/contracts.d.ts +94 -0
  5. package/dist/a2a/contracts.js +164 -0
  6. package/dist/a2a/limits.d.ts +14 -0
  7. package/dist/a2a/limits.js +29 -0
  8. package/dist/a2a/registry.d.ts +46 -0
  9. package/dist/a2a/registry.js +178 -0
  10. package/dist/a2a/server.d.ts +36 -0
  11. package/dist/a2a/server.js +344 -0
  12. package/dist/a2a/service.d.ts +97 -0
  13. package/dist/a2a/service.js +545 -0
  14. package/dist/a2a/store.d.ts +109 -0
  15. package/dist/a2a/store.js +202 -0
  16. package/dist/agent/activity.d.ts +3 -0
  17. package/dist/agent/bootProviderConfig.d.ts +21 -0
  18. package/dist/agent/bootProviderConfig.js +74 -0
  19. package/dist/agent/piAdapter.d.ts +9 -1
  20. package/dist/agent/piAdapter.js +58 -3
  21. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  22. package/dist/agent/piIsolatedMcp.js +10 -2
  23. package/dist/agent/port.d.ts +6 -0
  24. package/dist/agent/streamLogRedact.d.ts +1 -1
  25. package/dist/agent/streamLogRedact.js +4 -11
  26. package/dist/cli/a2aCommand.d.ts +8 -0
  27. package/dist/cli/a2aCommand.js +131 -0
  28. package/dist/cli/artifactCommand.js +9 -16
  29. package/dist/cli/backupCommand.d.ts +9 -0
  30. package/dist/cli/backupCommand.js +111 -0
  31. package/dist/cli/debugRunCommand.d.ts +10 -0
  32. package/dist/cli/debugRunCommand.js +109 -0
  33. package/dist/cli/doctorCommand.d.ts +32 -0
  34. package/dist/cli/doctorCommand.js +453 -0
  35. package/dist/cli/envelopeCommand.js +9 -2
  36. package/dist/cli/exportAllCommand.d.ts +55 -0
  37. package/dist/cli/exportAllCommand.js +218 -0
  38. package/dist/cli/exportRunCommand.js +23 -21
  39. package/dist/cli/hostClient.d.ts +21 -3
  40. package/dist/cli/hostClient.js +93 -12
  41. package/dist/cli/initTemplates.d.ts +1 -1
  42. package/dist/cli/initTemplates.js +8 -1
  43. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  44. package/dist/cli/resolveSafeOutPath.js +40 -0
  45. package/dist/cli/restoreCommand.d.ts +10 -0
  46. package/dist/cli/restoreCommand.js +90 -0
  47. package/dist/cli/runCommand.d.ts +3 -2
  48. package/dist/cli/runCommand.js +93 -11
  49. package/dist/cli/runOutput.d.ts +4 -0
  50. package/dist/cli/runOutput.js +33 -7
  51. package/dist/cli/runStageCommand.d.ts +34 -0
  52. package/dist/cli/runStageCommand.js +426 -0
  53. package/dist/cli/runsCommand.d.ts +1 -1
  54. package/dist/cli/runsCommand.js +162 -8
  55. package/dist/cli.js +190 -30
  56. package/dist/config/catalogRelativePath.d.ts +62 -0
  57. package/dist/config/catalogRelativePath.js +118 -0
  58. package/dist/config/configOrigin.d.ts +27 -0
  59. package/dist/config/configOrigin.js +59 -0
  60. package/dist/config/hostConfig.d.ts +55 -0
  61. package/dist/config/hostConfig.js +333 -0
  62. package/dist/config/listSkills.d.ts +26 -0
  63. package/dist/config/listSkills.js +190 -3
  64. package/dist/config/loadOutcome.d.ts +1 -1
  65. package/dist/config/loadPipeline.js +23 -2
  66. package/dist/config/loadStage.js +18 -0
  67. package/dist/config/loadTask.d.ts +2 -0
  68. package/dist/config/loadTask.js +57 -18
  69. package/dist/config/materializeStageModels.js +5 -1
  70. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  71. package/dist/config/mergePipelineIncludes.js +19 -0
  72. package/dist/config/migrateYaml.js +6 -11
  73. package/dist/config/multiProjectCatalog.d.ts +30 -0
  74. package/dist/config/multiProjectCatalog.js +142 -0
  75. package/dist/config/normalizePipelineStageEntry.js +20 -1
  76. package/dist/config/pipelineStageKeys.js +2 -0
  77. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  78. package/dist/config/resolveCatalogRoots.js +76 -0
  79. package/dist/config/resolveModel.d.ts +7 -1
  80. package/dist/config/resolveModel.js +11 -1
  81. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  82. package/dist/config/resolveStageMcpServers.js +36 -9
  83. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  84. package/dist/config/secretFromEnvOrFile.js +34 -0
  85. package/dist/config/seededCatalog.d.ts +11 -0
  86. package/dist/config/seededCatalog.js +29 -0
  87. package/dist/config/toolRequires.d.ts +24 -0
  88. package/dist/config/toolRequires.js +115 -0
  89. package/dist/config/validateCatalog.d.ts +5 -1
  90. package/dist/config/validateCatalog.js +140 -1
  91. package/dist/diagnostics/checks.d.ts +39 -0
  92. package/dist/diagnostics/checks.js +135 -0
  93. package/dist/errors/codes.d.ts +14 -0
  94. package/dist/errors/codes.js +59 -0
  95. package/dist/git/cache.d.ts +14 -0
  96. package/dist/git/cache.js +150 -0
  97. package/dist/git/credentials.d.ts +9 -0
  98. package/dist/git/credentials.js +88 -0
  99. package/dist/git/errors.d.ts +20 -0
  100. package/dist/git/errors.js +94 -0
  101. package/dist/git/exec.d.ts +16 -0
  102. package/dist/git/exec.js +135 -0
  103. package/dist/git/operations.d.ts +29 -0
  104. package/dist/git/operations.js +153 -0
  105. package/dist/git/version.d.ts +1 -0
  106. package/dist/git/version.js +10 -0
  107. package/dist/logging/audit.d.ts +16 -0
  108. package/dist/logging/audit.js +19 -0
  109. package/dist/logging/commonWords.d.ts +2 -0
  110. package/dist/logging/commonWords.js +13 -0
  111. package/dist/logging/logger.d.ts +49 -0
  112. package/dist/logging/logger.js +193 -0
  113. package/dist/logging/namedSecrets.d.ts +6 -0
  114. package/dist/logging/namedSecrets.js +58 -0
  115. package/dist/logging/redact.d.ts +13 -0
  116. package/dist/logging/redact.js +88 -0
  117. package/dist/mcp/catalogTools.js +591 -76
  118. package/dist/mcp/checkoutTools.d.ts +52 -0
  119. package/dist/mcp/checkoutTools.js +332 -0
  120. package/dist/mcp/controlTools.js +179 -5
  121. package/dist/mcp/deps.d.ts +1 -0
  122. package/dist/mcp/getStartedTool.d.ts +3 -0
  123. package/dist/mcp/getStartedTool.js +62 -0
  124. package/dist/mcp/readArtifact.d.ts +11 -0
  125. package/dist/mcp/readArtifact.js +46 -30
  126. package/dist/mcp/server.js +1 -0
  127. package/dist/mcp/tools.js +4 -0
  128. package/dist/net/proxy.d.ts +14 -0
  129. package/dist/net/proxy.js +78 -0
  130. package/dist/package-meta.d.ts +2 -1
  131. package/dist/package-meta.js +2 -1
  132. package/dist/preflight/bash.d.ts +8 -0
  133. package/dist/preflight/bash.js +34 -0
  134. package/dist/preflight/claudeRoot.d.ts +11 -0
  135. package/dist/preflight/claudeRoot.js +23 -0
  136. package/dist/preflight/mcpCommands.d.ts +8 -0
  137. package/dist/preflight/mcpCommands.js +36 -0
  138. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  139. package/dist/preflight/pipelinePreflight.js +192 -0
  140. package/dist/preflight/tls.d.ts +6 -0
  141. package/dist/preflight/tls.js +18 -0
  142. package/dist/preflight/toolchain.d.ts +45 -0
  143. package/dist/preflight/toolchain.js +219 -0
  144. package/dist/project/findProjectRoot.js +3 -4
  145. package/dist/project/globalHome.d.ts +7 -0
  146. package/dist/project/globalHome.js +63 -2
  147. package/dist/project/resolveProjectContext.js +2 -2
  148. package/dist/project/resolveStageflowContext.js +2 -2
  149. package/dist/projection/projectRun.d.ts +2 -1
  150. package/dist/projection/projectRun.js +1 -0
  151. package/dist/runstore/assertTmpdir.d.ts +1 -0
  152. package/dist/runstore/assertTmpdir.js +21 -0
  153. package/dist/runstore/backup.d.ts +52 -0
  154. package/dist/runstore/backup.js +292 -0
  155. package/dist/runstore/createStore.d.ts +27 -0
  156. package/dist/runstore/createStore.js +75 -7
  157. package/dist/runstore/debugBundle.d.ts +60 -0
  158. package/dist/runstore/debugBundle.js +143 -0
  159. package/dist/runstore/diskUsage.d.ts +50 -0
  160. package/dist/runstore/diskUsage.js +214 -0
  161. package/dist/runstore/exportRunPayload.d.ts +8 -0
  162. package/dist/runstore/exportRunPayload.js +23 -0
  163. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  164. package/dist/runstore/normalizeCatalogPath.js +10 -0
  165. package/dist/runstore/paths.d.ts +5 -0
  166. package/dist/runstore/paths.js +145 -1
  167. package/dist/runstore/port.d.ts +119 -8
  168. package/dist/runstore/port.js +8 -1
  169. package/dist/runstore/restore.d.ts +81 -0
  170. package/dist/runstore/restore.js +355 -0
  171. package/dist/runstore/retention.d.ts +27 -0
  172. package/dist/runstore/retention.js +74 -0
  173. package/dist/runstore/runManifest.d.ts +146 -0
  174. package/dist/runstore/runManifest.js +288 -0
  175. package/dist/runstore/runProjection.d.ts +3 -1
  176. package/dist/runstore/runProjection.js +63 -1
  177. package/dist/runstore/sqlite/SqliteRunStore.d.ts +37 -3
  178. package/dist/runstore/sqlite/SqliteRunStore.js +401 -227
  179. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  180. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  181. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  182. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  183. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  184. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  185. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  186. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  187. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  188. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  189. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  190. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  191. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  192. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  193. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  194. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  195. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  196. package/dist/runstore/sqlite/migrations/index.js +72 -0
  197. package/dist/runstore/sqlite/schema.d.ts +20 -1
  198. package/dist/runstore/sqlite/schema.js +283 -1
  199. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  200. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  201. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  202. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  203. package/dist/runstore/stageExecution.js +3 -0
  204. package/dist/runstore/storeFilesystem.d.ts +32 -0
  205. package/dist/runstore/storeFilesystem.js +148 -0
  206. package/dist/runstore/submission.d.ts +11 -0
  207. package/dist/runstore/submission.js +7 -0
  208. package/dist/runstore/trackProjection.js +2 -0
  209. package/dist/runstore/workspaceLayout.d.ts +13 -0
  210. package/dist/runstore/workspaceLayout.js +76 -0
  211. package/dist/runtime/completionCheckRunner.d.ts +3 -0
  212. package/dist/runtime/completionCheckRunner.js +45 -7
  213. package/dist/runtime/containerLimits.d.ts +16 -0
  214. package/dist/runtime/containerLimits.js +84 -0
  215. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  216. package/dist/runtime/credentialMaterialisation.js +128 -0
  217. package/dist/runtime/gitCheckoutCapability.js +7 -13
  218. package/dist/runtime/pipelineRunner.d.ts +38 -1
  219. package/dist/runtime/pipelineRunner.js +179 -15
  220. package/dist/runtime/pipelineScheduler.d.ts +15 -0
  221. package/dist/runtime/pipelineScheduler.js +167 -42
  222. package/dist/runtime/reloadRunCatalog.js +12 -1
  223. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  224. package/dist/runtime/repositoryMaterialize.js +235 -0
  225. package/dist/runtime/resolveEnvelopeRef.d.ts +30 -0
  226. package/dist/runtime/resolveEnvelopeRef.js +79 -0
  227. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  228. package/dist/runtime/resumeTimedOut.js +5 -2
  229. package/dist/runtime/runChangeBus.js +9 -0
  230. package/dist/runtime/runDeletion.d.ts +7 -0
  231. package/dist/runtime/runDeletion.js +37 -0
  232. package/dist/runtime/runManager.d.ts +179 -4
  233. package/dist/runtime/runManager.js +1644 -83
  234. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  235. package/dist/runtime/runRetentionSweep.js +328 -0
  236. package/dist/runtime/runRetryCoordinator.d.ts +2 -0
  237. package/dist/runtime/runRetryCoordinator.js +19 -2
  238. package/dist/runtime/runSkills.d.ts +40 -0
  239. package/dist/runtime/runSkills.js +173 -0
  240. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  241. package/dist/runtime/stageAttemptBootstrap.js +195 -24
  242. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  243. package/dist/runtime/stageCacheEnv.js +34 -0
  244. package/dist/runtime/stageConcurrency.d.ts +2 -1
  245. package/dist/runtime/stageConcurrency.js +4 -2
  246. package/dist/runtime/stageEnvironment.d.ts +38 -0
  247. package/dist/runtime/stageEnvironment.js +193 -0
  248. package/dist/runtime/stageProcessLauncher.d.ts +18 -0
  249. package/dist/runtime/stageProcessLauncher.js +194 -38
  250. package/dist/runtime/stageRecovery.d.ts +3 -1
  251. package/dist/runtime/stageRecovery.js +19 -4
  252. package/dist/runtime/stageRoots.d.ts +38 -1
  253. package/dist/runtime/stageRoots.js +118 -0
  254. package/dist/runtime/stageRunner.d.ts +1 -0
  255. package/dist/runtime/stageRunner.js +3 -1
  256. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  257. package/dist/runtime/stageSecretDecl.js +102 -0
  258. package/dist/runtime/stageSecrets.d.ts +40 -0
  259. package/dist/runtime/stageSecrets.js +181 -0
  260. package/dist/runtime/stageWorker.d.ts +3 -2
  261. package/dist/runtime/stageWorker.js +58 -10
  262. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  263. package/dist/runtime/stageWorkerProtocol.js +8 -0
  264. package/dist/runtime/startPayload.d.ts +32 -0
  265. package/dist/runtime/startPayload.js +59 -0
  266. package/dist/runtime/taskInput.js +14 -5
  267. package/dist/runtime/verifiedStageExecution.d.ts +1 -0
  268. package/dist/runtime/verifiedStageExecution.js +2 -1
  269. package/dist/runtime/workspaceBinding.d.ts +20 -0
  270. package/dist/runtime/workspaceBinding.js +60 -0
  271. package/dist/server/allowedHosts.d.ts +19 -0
  272. package/dist/server/allowedHosts.js +179 -0
  273. package/dist/server/bootstrap.d.ts +38 -2
  274. package/dist/server/bootstrap.js +219 -4
  275. package/dist/server/controlToken.d.ts +47 -0
  276. package/dist/server/controlToken.js +241 -0
  277. package/dist/server/createHttpHost.d.ts +11 -2
  278. package/dist/server/createHttpHost.js +109 -10
  279. package/dist/server/ensureGlobalService.d.ts +5 -1
  280. package/dist/server/ensureGlobalService.js +35 -1
  281. package/dist/server/healthSurfaces.d.ts +6 -0
  282. package/dist/server/healthSurfaces.js +98 -0
  283. package/dist/server/http.d.ts +12 -1
  284. package/dist/server/http.js +1085 -485
  285. package/dist/server/listenHost.d.ts +5 -0
  286. package/dist/server/listenHost.js +56 -0
  287. package/dist/server/mcpHost.d.ts +10 -1
  288. package/dist/server/mcpHost.js +36 -6
  289. package/dist/server/operatorResults.d.ts +2 -2
  290. package/dist/server/operatorResults.js +40 -29
  291. package/dist/server/requestAuthContext.d.ts +12 -0
  292. package/dist/server/requestAuthContext.js +21 -0
  293. package/dist/server/shutdown.d.ts +69 -0
  294. package/dist/server/shutdown.js +219 -0
  295. package/dist/types/pipeline.d.ts +7 -0
  296. package/dist/types/stage.d.ts +8 -0
  297. package/dist/types/task.d.ts +8 -0
  298. package/dist/ui/assets/index-B6hlSXXn.js +120 -0
  299. package/dist/ui/index.html +1 -1
  300. package/examples/README.md +98 -0
  301. package/examples/archify-on-pr/README.md +213 -0
  302. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  303. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  304. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  305. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  306. package/examples/ci-validate/README.md +35 -0
  307. package/examples/ci-validate/check.yaml +13 -0
  308. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  309. package/examples/ci-validate/validate.sh +5 -0
  310. package/examples/compliance-review-demo/README.md +125 -0
  311. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  312. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  313. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  314. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  315. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  316. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  317. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  318. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  319. package/examples/conditional-fork/README.md +89 -0
  320. package/examples/conditional-fork/branch-a.yaml +13 -0
  321. package/examples/conditional-fork/branch-b.yaml +13 -0
  322. package/examples/conditional-fork/decide.yaml +35 -0
  323. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  324. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  325. package/examples/context7-mcp/README.md +42 -0
  326. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  327. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  328. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  329. package/examples/context7-mcp/resolve-library.yaml +31 -0
  330. package/examples/context7-mcp/write-brief.yaml +52 -0
  331. package/examples/feature-loop/README.md +104 -0
  332. package/examples/feature-loop/address-feedback.yaml +148 -0
  333. package/examples/feature-loop/align.yaml +116 -0
  334. package/examples/feature-loop/decompose.yaml +86 -0
  335. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  336. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  337. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  338. package/examples/feature-loop/implement.yaml +128 -0
  339. package/examples/feature-loop/plan.yaml +111 -0
  340. package/examples/feature-loop/publish.yaml +167 -0
  341. package/examples/feature-loop/review.yaml +146 -0
  342. package/examples/feature-loop/verify.yaml +106 -0
  343. package/examples/feedback-loop/README.md +72 -0
  344. package/examples/feedback-loop/VERIFY.md +208 -0
  345. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  346. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  347. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  348. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  349. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  350. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  351. package/examples/feedback-loop/implement.yaml +14 -0
  352. package/examples/feedback-loop/plan.yaml +14 -0
  353. package/examples/feedback-loop/review.yaml +15 -0
  354. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  355. package/examples/feedback-loop/submit.yaml +12 -0
  356. package/examples/generic-fan-in/README.md +151 -0
  357. package/examples/generic-fan-in/clarify.yaml +18 -0
  358. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  359. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  360. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  361. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  362. package/examples/generic-fan-in/research.yaml +45 -0
  363. package/examples/generic-fan-in/synthesize.yaml +66 -0
  364. package/examples/generic-fan-in/validation.yaml +45 -0
  365. package/examples/github-release/README.md +78 -0
  366. package/examples/github-release/draft-release-notes.yaml +64 -0
  367. package/examples/github-release/github-release.pipeline.yaml +11 -0
  368. package/examples/github-release/github-release.task.yaml +13 -0
  369. package/examples/github-release/publish-github-release.yaml +64 -0
  370. package/examples/hello-world/README.md +28 -0
  371. package/examples/hello-world/hello.pipeline.yaml +4 -0
  372. package/examples/hello-world/my-task.task.yaml +6 -0
  373. package/examples/hello-world/research.yaml +18 -0
  374. package/examples/mcp-hitl-tour/README.md +113 -0
  375. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  376. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  377. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  378. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  379. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  380. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  381. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  382. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  383. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  384. package/examples/mcp-hitl-tour/review.yaml +17 -0
  385. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  386. package/examples/oss-issue-contribution/README.md +218 -0
  387. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  388. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  389. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  390. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  391. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  392. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  393. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  394. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  395. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  396. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  397. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  398. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  399. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  400. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  401. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  402. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  403. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  404. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  405. package/examples/oss-quick-fix/README.md +65 -0
  406. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  407. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  408. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  409. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  410. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  411. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  412. package/examples/plan-review/README.md +37 -0
  413. package/examples/plan-review/plan-review-followup.yaml +13 -0
  414. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  415. package/examples/plan-review/plan-review.task.yaml +9 -0
  416. package/examples/plan-review/plan-review.yaml +25 -0
  417. package/examples/playwright-mcp/README.md +39 -0
  418. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  419. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  420. package/examples/playwright-mcp/screenshot.yaml +40 -0
  421. package/examples/retry-tour/README.md +75 -0
  422. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  423. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  424. package/examples/route-if-tour/README.md +202 -0
  425. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  426. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  427. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  428. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  429. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  430. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  431. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  432. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  433. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  434. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  435. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  436. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  437. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  438. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  439. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  440. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  441. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  442. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  443. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  444. package/examples/route-wiring-smoke-test/README.md +377 -0
  445. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  446. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  447. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  448. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  449. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  450. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  451. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  452. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  453. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  454. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  455. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  456. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  457. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  458. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  459. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  460. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  461. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  462. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  463. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  464. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  465. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  466. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  467. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  468. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  469. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  470. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  471. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  472. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  473. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  474. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  475. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  476. package/examples/ship-feature/README.md +190 -0
  477. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  478. package/examples/ship-feature/feat-implement.yaml +180 -0
  479. package/examples/ship-feature/feat-plan.yaml +120 -0
  480. package/examples/ship-feature/feat-review.yaml +109 -0
  481. package/examples/ship-feature/feat-ship.yaml +203 -0
  482. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  483. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  484. package/examples/stage-mcp/README.md +144 -0
  485. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  486. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  487. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  488. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  489. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  490. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  491. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  492. package/examples/stage-mcp/use-echo.yaml +20 -0
  493. package/examples/verify-tour/README.md +80 -0
  494. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  495. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  496. package/package.json +6 -1
  497. package/skills/stageflow/SKILL.md +6 -6
  498. package/skills/stageflow/references/control-surface.md +11 -5
  499. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  500. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  501. package/skills/stageflow-author/SKILL.md +4 -3
  502. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  503. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  504. package/skills/stageflow-run/SKILL.md +20 -12
  505. package/skills/stageflow-run/references/mcp-call.md +9 -1
  506. package/skills/stageflow-run/references/task-and-pipeline-selection.md +16 -5
  507. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  508. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  509. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  510. package/skills/stageflow-setup/SKILL.md +40 -8
  511. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,12 @@
1
+ id: branch-b
2
+ system_prompt: |
3
+ Branch B -- an external stage file loaded via `uses:`. One sentence is enough.
4
+ Then emit a success envelope via emit_stage_envelope with status: success, a short summary, artifacts: [], and payload: {}.
5
+ model: cursor/auto
6
+ io:
7
+ input:
8
+ schema:
9
+ type: object
10
+ output:
11
+ schema:
12
+ type: object
@@ -0,0 +1,12 @@
1
+ id: decide
2
+ system_prompt: |
3
+ Start both follow-up branches. branch-a and branch-b both run next. One sentence is enough.
4
+ Then emit a success envelope via emit_stage_envelope with status: success, a short summary, artifacts: [], and payload: {}.
5
+ model: cursor/auto
6
+ io:
7
+ input:
8
+ schema:
9
+ type: object
10
+ output:
11
+ schema:
12
+ type: object
@@ -0,0 +1,12 @@
1
+ id: finish
2
+ system_prompt: |
3
+ Finish -- an external stage file loaded via `uses:`. One sentence is enough.
4
+ Then emit a success envelope via emit_stage_envelope with status: success, a short summary, artifacts: [], and payload: {}.
5
+ model: cursor/auto
6
+ io:
7
+ input:
8
+ schema:
9
+ type: object
10
+ output:
11
+ schema:
12
+ type: object
@@ -0,0 +1,190 @@
1
+ # Ship-feature pipeline
2
+
3
+ A small, general-purpose "ship any small feature through a governed
4
+ pipeline" pattern: plan → implement → parallel review → address feedback →
5
+ ship. It is deliberately a trimmed sibling of
6
+ [`examples/oss-issue-contribution/`](../oss-issue-contribution/) — no intake,
7
+ no explainers, no read-only reproduction stage, no investigation fan-out —
8
+ built for the common case where a feature is already well understood and the
9
+ value is in a governed, evidence-backed path from plan to pull request, not
10
+ in a multi-stage investigation.
11
+
12
+ The pipeline is repository-neutral. Point the task's `checkout` at a
13
+ dedicated branch of whatever repository you're shipping into. It reads that
14
+ repository's own scripts and conventions before acting; nothing in the stage
15
+ files names a specific repository, feature, or keyword.
16
+ [`ship-feature.task.yaml`](ship-feature.task.yaml) is one concrete instance
17
+ of the pattern — extending Stageflow's envelope JSON Schema subset — not a
18
+ template you must follow.
19
+
20
+ ## Flow
21
+
22
+ 1. Plan and get explicit operator approval for the exact scope, edit sites,
23
+ and validation commands (`feat-plan`, one merged propose-and-approve
24
+ stage — there is no separate earlier planning stage).
25
+ 2. Implement the approved plan and drive its full validation command list to
26
+ green in one session, writing any tests the plan calls for as part of
27
+ implementing rather than in a separate stage (`feat-implement`, the only
28
+ stage with edit access to the checkout).
29
+ 3. Fan out two to four focused, non-overlapping reviews in parallel — no
30
+ human gate here, this is the one automated fan-out in the middle
31
+ 4. Address every blocking review finding in one fixup stage — sweeping for
32
+ every instance of the same category of problem, not only the ones
33
+ reviewers happened to cite. This catalog stays a DAG; it does not
34
+ declare `{ type: loop }` back to `feat-implement` or a second review pass
35
+ (`feat-address-feedback`).
36
+ 5. Assemble a ship package, ask for final approval, and — once the operator
37
+ accepts — push the current branch and open the pull request in that same
38
+ stage (`feat-ship`).
39
+
40
+ No stage before the last one commits, pushes, or opens a pull request, and
41
+ no stage ever creates or renames a branch — the checkout is expected to
42
+ already be on the correct feature branch when the run starts. `feat-ship`
43
+ writes `ship-package.md`, calls `ask_operator`, and only runs `git`/`gh`
44
+ against the checkout's current branch after an explicit accept through its
45
+ `artifact_backed` gate. There is no separate publish flag or dry-run mode:
46
+ the operator's accept is the only gate between "package written" and "PR
47
+ opened."
48
+
49
+ ## Runtime contracts
50
+
51
+ Every stage declares `io.output.schema`, so a success emit is rejected unless
52
+ the payload matches it, and each stage file lists `verify` items so success
53
+ is independently checked rather than only claimed. Artifact paths below are
54
+ after-phase `type: artifact` checks on the stage body:
55
+
56
+ | Stage | `gate_kinds` | Required artifacts | Other `verify` |
57
+ |-------|--------------|--------------------|----------------|
58
+ | `feat-plan` | `[artifact_backed]` | `implementation-plan.md` | `gate` `artifact_backed` |
59
+ | `feat-implement` | `[]` | `implementation-report.md` | `checkout_changes` on `changed_files` |
60
+ | `feat-review` | `[]` | `review.md` | — |
61
+ | `feat-address-feedback` | `[]` | `review-feedback-report.md` | — |
62
+ | `feat-ship` | `[artifact_backed]` | `ship-package.md`, `pull-request.md` | `gate` `artifact_backed` |
63
+
64
+ `feat-implement`'s `checkout_changes` check (with `path_fields: [changed_files]`)
65
+ compares the checkout before and after the attempt and rejects a success emit
66
+ if `changed_files` is non-empty but the checkout never actually changed, or if
67
+ any listed path is not a real checkout-relative change. `feat-plan` and
68
+ `feat-ship` each also carry a `gate` verify item of kind `artifact_backed`, so
69
+ their `ask_operator` approval is independently verified, not just
70
+ self-reported. See [Verified Stage Execution](../../docs/verified-stage-execution.md)
71
+ and [YAML catalog — Verify](../../docs/yaml-catalog.md#verify).
72
+
73
+ it must partition the diff into two to four independent review assignments
74
+ and fan them out; it cannot skip review or hand it to a single clone.
75
+ `feat-review` `io.input` is an empty object so it stays a subset of
76
+ `feat-implement` `io.output`. See
77
+
78
+ Every stage but `feat-ship` uses `on_verify_fail: { mode: repair, max_attempts: 3,
79
+ retry_safety: idempotent, include_failed_checks: true }` on the pipeline
80
+ entry, so an after-phase verify failure starts a fresh attempt with the
81
+ failed-check evidence carried forward, up to three attempts. `feat-ship` uses
82
+ `on_verify_fail: { mode: manual, retry_safety: side_effecting }` instead,
83
+ because it publishes: a failed after-phase check there leaves the stage failed
84
+ until an operator explicitly retries or stops via `on_verify_fail` manual
85
+ handling. See
86
+ [Verified Stage Execution — Recovery policy](../../docs/verified-stage-execution.md#recovery-policy).
87
+
88
+ ### Review feedback has no loop in this catalog
89
+
90
+ Loops exist via `{ type: loop }` on `route` (see
91
+ [`examples/feedback-loop/`](../feedback-loop/)). This pipeline does not use
92
+ one. If `feat-review` finds a blocking problem, the run does not resume
93
+ `feat-implement`. `feat-address-feedback` is the accommodation: a single
94
+ fixup stage after review and before shipping that addresses every blocking
95
+ finding — sweeping for other instances of the same category of problem, not
96
+ only the ones a reviewer happened to cite — then hands off to `feat-ship`,
97
+ which independently re-checks the fix before accepting it. It cannot get a
98
+ fresh review of its own fix, though: if its patch introduces something new,
99
+ `feat-ship`'s fail-closed check is the backstop, and the operator has to
100
+ intervene by hand — see [`sf runs retry`](../../docs/cli-reference.md), which
101
+ can retry a succeeded stage in place and reset everything downstream.
102
+
103
+ ## Prepare a worktree
104
+
105
+ This pipeline expects to run against a checkout that is **already** on a
106
+ dedicated feature branch — no stage creates, renames, or switches a branch.
107
+ A `git worktree` keeps that branch isolated from whatever else you have
108
+ checked out in your primary clone of the target repository:
109
+
110
+ ```bash
111
+ cd /path/to/your/repo
112
+ git fetch origin
113
+ git worktree add ../your-repo-feature-branch -b your-feature-branch origin/main
114
+ cd ../your-repo-feature-branch
115
+ npm install # or the target repository's equivalent bootstrap command
116
+ git status --short
117
+ ```
118
+
119
+ Point the task's `checkout` field at that worktree's absolute path. When the
120
+ run finishes (or if it fails partway through), remove the worktree with
121
+ `git worktree remove ../your-repo-feature-branch` from the main clone once
122
+ you no longer need it.
123
+
124
+ ## Create a task
125
+
126
+ Task context is the pipeline's portable feature brief. Include enough detail
127
+ that `feat-plan` can ground a real plan in the actual repository rather than
128
+ re-deriving requirements from a one-line goal:
129
+
130
+ ```yaml
131
+ id: my-feature
132
+ goal: >
133
+ Describe the concrete, scoped change to ship, ending in an
134
+ operator-approved pull request against <owner>/<repo>.
135
+ context: |
136
+ Name the exact files and symbols involved, the existing conventions to
137
+ follow (test style, doc sections to update), and the ship target: which
138
+ repository, which base branch, and which branch the checkout is already on.
139
+ constraints: |
140
+ Do not create, rename, or switch branches — the checkout is already on the
141
+ correct branch.
142
+ Do not commit, push, or open a pull request in any stage except feat-ship.
143
+ checkout: /absolute/path/to/your-repo-feature-branch
144
+ ```
145
+
146
+ [`ship-feature.task.yaml`](ship-feature.task.yaml) is a complete example: it
147
+ targets this same Stageflow repository, adding `pattern`, `minLength`,
148
+ `maxLength`, and `nullable` support to `src/envelope/payloadSchema.ts`
149
+ against a worktree on branch `demo/richer-payload-schema-constraints`.
150
+
151
+ ## Run
152
+
153
+ From any directory with Stageflow installed:
154
+
155
+ ```bash
156
+ sf validate \
157
+ --pipeline /path/to/stageflow/examples/ship-feature/ship-feature.pipeline.yaml \
158
+ --strict
159
+
160
+ sf run \
161
+ --pipeline /path/to/stageflow/examples/ship-feature/ship-feature.pipeline.yaml \
162
+ --task /path/to/my-feature.task.yaml
163
+ ```
164
+
165
+ `feat-ship` pushes the checkout's current branch and opens the pull request
166
+ as soon as the operator accepts its `artifact_backed` gate — there is no
167
+ dry-run mode and no extra flag. `gh` must be on `PATH` and authenticated
168
+ (`GH_TOKEN` or `GITHUB_TOKEN`) before you accept, or the publish step will
169
+ fail after approval.
170
+
171
+ Run `sf ui` in another terminal to inspect envelopes, artifacts, clone
172
+ fan-out, and answer the two artifact-backed gates.
173
+
174
+ ## Safety and interpretation
175
+
176
+ - Plan approval authorizes only local edits in the task checkout.
177
+ - Review clones always complete successfully and carry `pass` or
178
+ `changes_required` in their payload, so `feat-address-feedback` sees every
179
+ review even when some pass and some don't.
180
+ - Any blocking review that survives `feat-address-feedback` fails the final
181
+ stage closed — `feat-ship` cross-checks `addressed_all_blocking` against
182
+ the original `blocking_findings` rather than trusting the fixup stage's
183
+ own claim.
184
+ - The operator's accept through `feat-ship`'s `artifact_backed` gate is the
185
+ only authorization to publish, and it happens moments before the stage
186
+ runs `git push` / `gh pr create` in the same session — there is no
187
+ separate flag and no second chance to reconsider after accepting.
188
+ - No stage creates, renames, or switches a branch. If the checkout is not
189
+ already on the intended feature branch when the run starts, fix that
190
+ before running — the pipeline will not do it for you.
@@ -0,0 +1,119 @@
1
+ id: feat-address-feedback
2
+ system_prompt: |
3
+ Address every blocking finding from feat-review before the ship package is
4
+ assembled. There is no automatic path back to feat-implement in this
5
+ pipeline, and this is the only stage positioned to edit the checkout after
6
+ review — treat that as the reason this stage exists, not as license to
7
+ rewrite the implementation. This stage is the last-mile fixup for what
8
+ reviewers found, not a second implementation pass.
9
+
10
+ Reading upstream evidence. The user prompt contains a line
11
+ "Factory run workspace: <absolute path>". Prior artifacts arrive in the
12
+ prior envelope's artifacts[] as run-relative paths; read each one at
13
+ <Factory run workspace>/<artifact path>. Every feat-review envelope's
14
+ payload (review_id, verdict, blocking_findings) and its review.md are
15
+ authoritative; implementation-report.md gives the context needed to make a
16
+ correct, narrow fix. Prose summaries are secondary.
17
+
18
+ Definition of done — every line must hold before you emit success:
19
+ - Every feat-review envelope and its review.md have been read.
20
+ - If every verdict is pass: the checkout is untouched, fixed_files is
21
+ empty, and addressed_all_blocking is true.
22
+ - If any verdict is changes_required: every entry in every review's
23
+ blocking_findings has been addressed, not only the specific file/line
24
+ reviewers happened to cite — search for every other instance of the same
25
+ category of problem (for example, every other call site with the same
26
+ missing validation, or every other test still asserting the old
27
+ behavior) and fix those too. A reviewer's citation is a sample of the
28
+ problem, not its full extent.
29
+ - git diff in the checkout is non-empty whenever any verdict was
30
+ changes_required; the emit is rejected if you claim to have addressed a
31
+ blocking finding while the working tree is clean.
32
+ - Every fixed_files entry is a repo-relative path inside the checkout that
33
+ also appears in git diff --name-only; the emit is rejected for any entry
34
+ pointing into the factory run workspace.
35
+ - Every check a blocking finding cited as failing has been re-run here and
36
+ now passes; verification_commands records each with its result.
37
+ - review-feedback-report.md was written through write_stage_artifact and
38
+ appears in the emitted artifacts list; the emit is rejected without it.
39
+
40
+ 1. Read every feat-review envelope and review.md via the recipe
41
+ above. If every verdict is pass, skip to step 5 with nothing to fix.
42
+ 2. For each changes_required review, read every blocking_findings entry
43
+ and its remediation guidance. Do not re-litigate a pass verdict or
44
+ reopen non-blocking findings or suggestions — those are out of scope
45
+ here.
46
+ 3. Fix each blocking finding at its cited location, then search the rest
47
+ of the checkout for other instances of the same category of problem and
48
+ fix those too (see Definition of done). Do not perform unrelated
49
+ formatting, refactors, or scope expansion beyond what the findings
50
+ require. Do not weaken, delete, or skip a test to make it pass.
51
+ 4. Re-run every command a blocking finding cited as failing, plus the
52
+ specific test(s) it named, and confirm each now passes. If a fix cannot
53
+ be completed or a re-run still fails, emit failure and record exactly
54
+ what remains broken and why — do not present partial remediation as
55
+ success.
56
+ 5. Call write_stage_artifact with path review-feedback-report.md listing
57
+ every blocking finding, whether it was addressed (with the fix location
58
+ and the passing re-run), or that there was nothing to address because
59
+ every verdict was pass.
60
+ 6. Emit exactly once, including review-feedback-report.md and all
61
+ inherited evidence artifacts, with a payload matching the schema.
62
+
63
+ Contract violations — emit failure rather than presenting these as
64
+ success:
65
+ - addressed_all_blocking: true while any blocking_findings entry remains
66
+ unaddressed or unverified.
67
+ - Fixing only the literal file/line a reviewer cited when the same
68
+ category of problem exists elsewhere in the diff.
69
+ - Emitting success while git diff is empty and any verdict was
70
+ changes_required.
71
+ - A fixed_files entry under stages/.../artifacts/ or anywhere else in the
72
+ factory run workspace.
73
+ - Editing anything outside the scope of a blocking finding.
74
+ - verification_commands listing commands you did not execute.
75
+
76
+ Never commit, push, or open a pull request.
77
+
78
+ Write summary as outcomes and resulting state for feat-ship: which
79
+ blocking findings existed, what changed to address them, and confirmation
80
+ every cited check now passes (or, on failure, what remains open).
81
+ Downstream stages receive this summary verbatim and can mistake it for
82
+ their own instructions, so never restate this stage's prohibitions or
83
+ scope limits in it.
84
+ model: omniroute/auto
85
+ io:
86
+ input:
87
+ schema:
88
+ type: object
89
+ output:
90
+ schema:
91
+ type: object
92
+ required:
93
+ - addressed_all_blocking
94
+ - fixed_files
95
+ - verification_commands
96
+ - remaining_risks
97
+ properties:
98
+ addressed_all_blocking:
99
+ type: boolean
100
+ fixed_files:
101
+ type: array
102
+ items:
103
+ type: string
104
+ verification_commands:
105
+ type: array
106
+ items:
107
+ type: string
108
+ remaining_risks:
109
+ type: array
110
+ items:
111
+ type: string
112
+ verify:
113
+ - id: review-feedback-report
114
+ type: artifact
115
+ path: review-feedback-report.md
116
+ nonempty: true
117
+ when:
118
+ - after
119
+ gate_kinds: []
@@ -0,0 +1,180 @@
1
+ id: feat-implement
2
+ system_prompt: |
3
+ Edit the checkout so the accepted plan is fully implemented and every one
4
+ of its validation_commands passes — not just the commands you find
5
+ convenient. Modified files under the project checkout are the only
6
+ acceptable output of this stage; no map, excerpt, document, or report can
7
+ substitute for them. If the plan calls for test coverage, write it here —
8
+ there is no separate stage that writes tests before this one.
9
+
10
+ You own the whole loop: implement, run the plan's full validation_commands,
11
+ and if anything fails, diagnose and fix it and run them again. Repeat until
12
+ every command passes or you have a concrete, evidence-backed reason further
13
+ iteration in this attempt will not help. This stage is the only one with
14
+ edit access to the checkout — nothing downstream can fix what you leave
15
+ broken, so do not hand off a partially-green result as success.
16
+
17
+ Reading upstream work: the prior envelope's artifacts[] holds run-relative
18
+ paths. Read each one at <Factory run workspace>/<artifact path>, using the
19
+ absolute "Factory run workspace" value given in this stage's user prompt.
20
+ implementation-plan.md is the authoritative approved scope — its
21
+ validation_commands list is the actual definition of done, not a
22
+ suggestion — and it outranks any prose in the prior envelope's summary.
23
+ That summary describes the PREVIOUS stage: any prohibition it carries, for
24
+ example "no source edits", applied to that stage and does not apply here.
25
+
26
+ Definition of done — every line must hold before you emit success:
27
+ - git diff in the checkout is non-empty and contains your edits; the emit
28
+ is rejected while the working tree is clean.
29
+ - Every changed_files entry is a repo-relative path inside the checkout
30
+ that also appears in git diff --name-only; the emit is rejected for any
31
+ entry pointing into the factory run workspace.
32
+ - Every command in implementation-plan.md's validation_commands has been
33
+ run here, in order, with its exit code recorded, and every one exited
34
+ zero. all_passed is true only when that is actually the case.
35
+ - implementation-report.md was written through write_stage_artifact and
36
+ appears in the emitted artifacts list; the emit is rejected without it.
37
+ - commands_run lists only commands you actually executed, each with its
38
+ outcome — the full validation_commands list plus anything else you ran
39
+ while diagnosing failures.
40
+
41
+ 1. Resolve implementation-plan.md from the prior envelope's artifacts[]
42
+ against the Factory run workspace absolute path and read it. If it
43
+ cannot be read, emit failure — do not substitute a plan you re-derived
44
+ yourself.
45
+ 2. Edit the source files — and add any test files
46
+ implementation-plan.md's validation_commands require that do not exist
47
+ yet — to satisfy the accepted plan. Do not perform unrelated
48
+ formatting, refactors, dependency upgrades, generated-file changes, or
49
+ scope expansion beyond what the plan describes.
50
+ 3. Run every command in implementation-plan.md's validation_commands, in
51
+ order, recording exit code and a stdout tail for each.
52
+ 4. If any command fails, treat that as unfinished work, not a report
53
+ footnote: diagnose the specific cause, make the corresponding source or
54
+ test edit, and return to step 3. Do not move on while a
55
+ validation_commands entry is red.
56
+ 5. Once every command passes, run git status --porcelain and git diff
57
+ --stat in the checkout and inspect the complete diff. If either output
58
+ is empty, this stage has not done its job: return to step 2 or emit
59
+ failure.
60
+ 6. Call write_stage_artifact with path implementation-report.md containing
61
+ the verbatim non-empty git diff --stat and git status --porcelain
62
+ output, the files changed, before/after behavior, every validation
63
+ command with its result, how many iterations it took, assumptions, and
64
+ any deviation from the plan.
65
+ 7. Partition the resulting diff into two to four independent,
66
+ non-overlapping review assignments (for example: correctness and edge
67
+ cases, test quality and coverage, and — only when the diff materially
68
+ involves compatibility, security, or public API surface — a scope and
69
+ compatibility assignment). Each assignment needs a review_id,
70
+ objective, the concrete repo-relative paths it owns (taken from the
71
+ actual diff, not guessed), specific questions a reviewer can answer by
72
+ reading those paths, and constraints. Scopes must not overlap and must
73
+ collectively cover every changed file.
74
+ 8. Emit exactly once, including implementation-report.md and all inherited
75
+ evidence artifacts, with a payload matching the schema, and the
76
+ definition-of-done line holds; otherwise emit failure while preserving
77
+ the working-tree evidence for the operator, and record in the summary
78
+ exactly which validation_commands entries remain red and why. On
79
+
80
+ Contract violations — emit failure rather than presenting these as
81
+ success:
82
+ - Emitting success while git diff in the checkout is empty.
83
+ - Emitting success while any validation_commands entry has not been run,
84
+ was skipped, or exited non-zero. all_passed: true when that is not the
85
+ case is a contract violation, not a reporting choice.
86
+ - A changed_files entry under stages/.../artifacts/ or anywhere else in
87
+ the factory run workspace. Such a path is never a valid entry.
88
+ - commands_run listing commands you did not execute.
89
+ - Treating a markdown map, excerpt file, or report as the deliverable.
90
+ Exploration-only completion is a failure of this stage.
91
+ four clones, overlapping scopes, or an assignment with empty paths or
92
+ questions.
93
+
94
+ only — skipping review is not permitted.
95
+
96
+ Write summary as outcomes and resulting state for downstream stages: what
97
+ now differs in the checkout, which tests cover it, confirmation that every
98
+ validation command passed, and which review scopes were assigned and why.
99
+ Downstream stages receive this summary verbatim and can mistake it for
100
+ their own instructions, so never restate this stage's prohibitions or
101
+ scope limits in it.
102
+ model: omniroute/auto
103
+ timeout_ms: 3600000
104
+ io:
105
+ input:
106
+ schema:
107
+ type: object
108
+ required:
109
+ - approved
110
+ - scope_summary
111
+ - planned_files
112
+ - validation_commands
113
+ - risks
114
+ properties:
115
+ approved:
116
+ type: boolean
117
+ scope_summary:
118
+ type: string
119
+ planned_files:
120
+ type: array
121
+ items:
122
+ type: string
123
+ validation_commands:
124
+ type: array
125
+ items:
126
+ type: string
127
+ risks:
128
+ type: array
129
+ items:
130
+ type: string
131
+ output:
132
+ schema:
133
+ type: object
134
+ required:
135
+ - changed_files
136
+ - implementation_summary
137
+ - tests_added
138
+ - commands_run
139
+ - all_passed
140
+ - review_count
141
+ - review_strategy
142
+ properties:
143
+ changed_files:
144
+ type: array
145
+ minItems: 1
146
+ items:
147
+ type: string
148
+ implementation_summary:
149
+ type: string
150
+ tests_added:
151
+ type: array
152
+ items:
153
+ type: string
154
+ commands_run:
155
+ type: array
156
+ minItems: 1
157
+ items:
158
+ type: string
159
+ all_passed:
160
+ type: boolean
161
+ review_count:
162
+ type: integer
163
+ minimum: 2
164
+ maximum: 4
165
+ review_strategy:
166
+ type: string
167
+ verify:
168
+ - id: implementation-report
169
+ type: artifact
170
+ path: implementation-report.md
171
+ nonempty: true
172
+ when:
173
+ - after
174
+ - id: checkout-changed
175
+ type: checkout_changes
176
+ path_fields:
177
+ - changed_files
178
+ when:
179
+ - after
180
+ gate_kinds: []
@@ -0,0 +1,120 @@
1
+ id: feat-plan
2
+ system_prompt: |
3
+ Write implementation-plan.md as a mechanical checklist the implement stage
4
+ can execute, and get explicit operator approval of it before any source
5
+ edit happens anywhere in this pipeline. This stage is the only planner —
6
+ there is no separate proposal stage before it and no separate approval
7
+ stage after it, so both concerns live here.
8
+
9
+ Reading the task. There is no prior stage in this pipeline; the task goal,
10
+ context, and constraints are the only input. Read the actual repository at
11
+ the checkout path in this stage's user prompt — the files the task names,
12
+ their neighbors, and any docs the task points at — rather than planning
13
+ from the task text alone. A plan that restates the goal without grounding
14
+ it in the real files is not done.
15
+
16
+ Definition of done — every line must hold before you emit success:
17
+ - implementation-plan.md was written through write_stage_artifact and
18
+ appears in the emitted artifacts list; the emit is rejected without it.
19
+ - The plan names the exact files to touch, the exact symbol or region at
20
+ each edit site, and the exact validation commands to run — copied
21
+ verbatim from this repository's own scripts (for example package.json),
22
+ never invented or guessed.
23
+ - If the task's goal implies new behavior needs test coverage, the plan
24
+ says so explicitly and names where that coverage belongs; it does not
25
+ silently omit tests.
26
+ - The operator explicitly accepted the plan through the artifact_backed
27
+ gate, and that accepted decision is recorded verbatim inside
28
+ implementation-plan.md.
29
+ - approved is true only after that explicit accept; planned_files and
30
+ validation_commands are non-empty and concrete.
31
+
32
+ 1. Read the task goal, context, and constraints. Read every file the task
33
+ names and enough of their neighbors to ground a real plan — the current
34
+ shape of the code to change, the existing test style to match, and any
35
+ doc sections that need updating alongside the code.
36
+ 2. Call write_stage_artifact with path implementation-plan.md containing:
37
+ the root cause or approach in plain terms, each file to edit with the
38
+ symbol/region of the edit site and the minimal change intended there,
39
+ the exact validation commands to run in the checkout (verified against
40
+ this repo's own script names, not guessed), any test coverage the plan
41
+ requires, and risks or open questions worth flagging before
42
+ implementation starts.
43
+ 3. Call ask_operator with kind artifact_backed referencing that artifact.
44
+ Ask whether to approve the exact scope for implementation.
45
+ 4. On rejection or requested changes, revise the artifact and ask again.
46
+ 5. After explicit acceptance, rewrite implementation-plan.md to include an
47
+ operator-decision section holding the accepted decision, the operator's
48
+ wording, and any conditions attached. The HITL question-and-answer
49
+ trail is not replayed into downstream prompts, so this artifact is the
50
+ only durable record the implement stage can read.
51
+ 6. Emit exactly one envelope, including implementation-plan.md, with a
52
+ payload matching the schema. Emit success only after explicit
53
+ acceptance. If the operator declines, emit failure with a concise
54
+ reason.
55
+
56
+ Contract violations — do not present these as success:
57
+ - approved: true without an explicit operator accept, or interpreting
58
+ silence as approval.
59
+ - planned_files or validation_commands left empty, generic, or expressed
60
+ as intent rather than concrete paths and runnable commands.
61
+ - A validation command you did not verify exists in this repository (check
62
+ package.json or the equivalent script manifest before naming one).
63
+ - A plan that describes the problem without naming exact edit sites.
64
+
65
+ Never edit source files in this stage. Never commit, push, or open a pull
66
+ request.
67
+
68
+ Write summary as outcomes and resulting state for downstream stages: what
69
+ the approved scope is, which artifact carries the checklist, and what the
70
+ operator accepted. The implement stage receives this summary verbatim and
71
+ can mistake it for its own instructions, so never put this stage's own
72
+ prohibitions or scope limits in it — in particular, no "no source edits"
73
+ language, which applies here and not downstream.
74
+ model: omniroute/auto
75
+ timeout_ms: 3600000
76
+ io:
77
+ input:
78
+ schema:
79
+ type: object
80
+ output:
81
+ schema:
82
+ type: object
83
+ required:
84
+ - approved
85
+ - scope_summary
86
+ - planned_files
87
+ - validation_commands
88
+ - risks
89
+ properties:
90
+ approved:
91
+ type: boolean
92
+ scope_summary:
93
+ type: string
94
+ planned_files:
95
+ type: array
96
+ items:
97
+ type: string
98
+ validation_commands:
99
+ type: array
100
+ items:
101
+ type: string
102
+ risks:
103
+ type: array
104
+ items:
105
+ type: string
106
+ verify:
107
+ - id: plan-approved
108
+ type: gate
109
+ kind: artifact_backed
110
+ when:
111
+ - emit
112
+ - after
113
+ - id: implementation-plan
114
+ type: artifact
115
+ path: implementation-plan.md
116
+ nonempty: true
117
+ when:
118
+ - after
119
+ gate_kinds:
120
+ - artifact_backed