stageflow 0.25.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 (501) hide show
  1. package/README.md +10 -3
  2. package/dist/a2a/contracts.d.ts +1 -0
  3. package/dist/a2a/contracts.js +1 -0
  4. package/dist/a2a/registry.d.ts +2 -0
  5. package/dist/a2a/registry.js +20 -1
  6. package/dist/a2a/server.d.ts +7 -0
  7. package/dist/a2a/server.js +5 -2
  8. package/dist/a2a/service.d.ts +1 -1
  9. package/dist/a2a/service.js +57 -8
  10. package/dist/a2a/store.d.ts +8 -5
  11. package/dist/a2a/store.js +24 -67
  12. package/dist/agent/activity.d.ts +3 -0
  13. package/dist/agent/bootProviderConfig.d.ts +21 -0
  14. package/dist/agent/bootProviderConfig.js +74 -0
  15. package/dist/agent/piAdapter.d.ts +9 -1
  16. package/dist/agent/piAdapter.js +58 -3
  17. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  18. package/dist/agent/piIsolatedMcp.js +10 -2
  19. package/dist/agent/port.d.ts +6 -0
  20. package/dist/agent/streamLogRedact.d.ts +1 -1
  21. package/dist/agent/streamLogRedact.js +4 -11
  22. package/dist/cli/artifactCommand.js +9 -16
  23. package/dist/cli/backupCommand.d.ts +9 -0
  24. package/dist/cli/backupCommand.js +111 -0
  25. package/dist/cli/debugRunCommand.d.ts +10 -0
  26. package/dist/cli/debugRunCommand.js +109 -0
  27. package/dist/cli/doctorCommand.d.ts +32 -0
  28. package/dist/cli/doctorCommand.js +453 -0
  29. package/dist/cli/envelopeCommand.js +9 -2
  30. package/dist/cli/exportAllCommand.d.ts +55 -0
  31. package/dist/cli/exportAllCommand.js +218 -0
  32. package/dist/cli/exportRunCommand.js +23 -21
  33. package/dist/cli/hostClient.d.ts +21 -3
  34. package/dist/cli/hostClient.js +93 -12
  35. package/dist/cli/initTemplates.d.ts +1 -1
  36. package/dist/cli/initTemplates.js +8 -1
  37. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  38. package/dist/cli/resolveSafeOutPath.js +40 -0
  39. package/dist/cli/restoreCommand.d.ts +10 -0
  40. package/dist/cli/restoreCommand.js +90 -0
  41. package/dist/cli/runCommand.d.ts +3 -2
  42. package/dist/cli/runCommand.js +93 -11
  43. package/dist/cli/runOutput.d.ts +4 -0
  44. package/dist/cli/runOutput.js +33 -7
  45. package/dist/cli/runStageCommand.d.ts +1 -0
  46. package/dist/cli/runStageCommand.js +44 -25
  47. package/dist/cli/runsCommand.d.ts +1 -1
  48. package/dist/cli/runsCommand.js +162 -8
  49. package/dist/cli.js +171 -30
  50. package/dist/config/catalogRelativePath.d.ts +62 -0
  51. package/dist/config/catalogRelativePath.js +118 -0
  52. package/dist/config/configOrigin.d.ts +27 -0
  53. package/dist/config/configOrigin.js +59 -0
  54. package/dist/config/hostConfig.d.ts +55 -0
  55. package/dist/config/hostConfig.js +333 -0
  56. package/dist/config/listSkills.d.ts +26 -0
  57. package/dist/config/listSkills.js +190 -3
  58. package/dist/config/loadOutcome.d.ts +1 -1
  59. package/dist/config/loadPipeline.js +23 -2
  60. package/dist/config/loadStage.js +18 -0
  61. package/dist/config/loadTask.d.ts +2 -0
  62. package/dist/config/loadTask.js +57 -18
  63. package/dist/config/materializeStageModels.js +5 -1
  64. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  65. package/dist/config/mergePipelineIncludes.js +19 -0
  66. package/dist/config/migrateYaml.js +6 -11
  67. package/dist/config/multiProjectCatalog.d.ts +30 -0
  68. package/dist/config/multiProjectCatalog.js +142 -0
  69. package/dist/config/normalizePipelineStageEntry.js +20 -1
  70. package/dist/config/pipelineStageKeys.js +2 -0
  71. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  72. package/dist/config/resolveCatalogRoots.js +76 -0
  73. package/dist/config/resolveModel.d.ts +7 -1
  74. package/dist/config/resolveModel.js +11 -1
  75. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  76. package/dist/config/resolveStageMcpServers.js +36 -9
  77. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  78. package/dist/config/secretFromEnvOrFile.js +34 -0
  79. package/dist/config/seededCatalog.d.ts +11 -0
  80. package/dist/config/seededCatalog.js +29 -0
  81. package/dist/config/toolRequires.d.ts +24 -0
  82. package/dist/config/toolRequires.js +115 -0
  83. package/dist/config/validateCatalog.d.ts +5 -1
  84. package/dist/config/validateCatalog.js +140 -1
  85. package/dist/diagnostics/checks.d.ts +39 -0
  86. package/dist/diagnostics/checks.js +135 -0
  87. package/dist/errors/codes.d.ts +14 -0
  88. package/dist/errors/codes.js +59 -0
  89. package/dist/git/cache.d.ts +14 -0
  90. package/dist/git/cache.js +150 -0
  91. package/dist/git/credentials.d.ts +9 -0
  92. package/dist/git/credentials.js +88 -0
  93. package/dist/git/errors.d.ts +20 -0
  94. package/dist/git/errors.js +94 -0
  95. package/dist/git/exec.d.ts +16 -0
  96. package/dist/git/exec.js +135 -0
  97. package/dist/git/operations.d.ts +29 -0
  98. package/dist/git/operations.js +153 -0
  99. package/dist/git/version.d.ts +1 -0
  100. package/dist/git/version.js +10 -0
  101. package/dist/logging/audit.d.ts +16 -0
  102. package/dist/logging/audit.js +19 -0
  103. package/dist/logging/commonWords.d.ts +2 -0
  104. package/dist/logging/commonWords.js +13 -0
  105. package/dist/logging/logger.d.ts +49 -0
  106. package/dist/logging/logger.js +193 -0
  107. package/dist/logging/namedSecrets.d.ts +6 -0
  108. package/dist/logging/namedSecrets.js +58 -0
  109. package/dist/logging/redact.d.ts +13 -0
  110. package/dist/logging/redact.js +88 -0
  111. package/dist/mcp/catalogTools.js +456 -80
  112. package/dist/mcp/checkoutTools.d.ts +52 -0
  113. package/dist/mcp/checkoutTools.js +332 -0
  114. package/dist/mcp/controlTools.js +179 -5
  115. package/dist/mcp/deps.d.ts +1 -0
  116. package/dist/mcp/getStartedTool.d.ts +3 -0
  117. package/dist/mcp/getStartedTool.js +62 -0
  118. package/dist/mcp/readArtifact.d.ts +11 -0
  119. package/dist/mcp/readArtifact.js +46 -30
  120. package/dist/mcp/server.js +1 -0
  121. package/dist/mcp/tools.js +4 -0
  122. package/dist/net/proxy.d.ts +14 -0
  123. package/dist/net/proxy.js +78 -0
  124. package/dist/package-meta.d.ts +2 -1
  125. package/dist/package-meta.js +2 -1
  126. package/dist/preflight/bash.d.ts +8 -0
  127. package/dist/preflight/bash.js +34 -0
  128. package/dist/preflight/claudeRoot.d.ts +11 -0
  129. package/dist/preflight/claudeRoot.js +23 -0
  130. package/dist/preflight/mcpCommands.d.ts +8 -0
  131. package/dist/preflight/mcpCommands.js +36 -0
  132. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  133. package/dist/preflight/pipelinePreflight.js +192 -0
  134. package/dist/preflight/tls.d.ts +6 -0
  135. package/dist/preflight/tls.js +18 -0
  136. package/dist/preflight/toolchain.d.ts +45 -0
  137. package/dist/preflight/toolchain.js +219 -0
  138. package/dist/project/findProjectRoot.js +3 -4
  139. package/dist/project/globalHome.d.ts +7 -0
  140. package/dist/project/globalHome.js +63 -2
  141. package/dist/project/resolveProjectContext.js +2 -2
  142. package/dist/project/resolveStageflowContext.js +2 -2
  143. package/dist/projection/projectRun.d.ts +2 -1
  144. package/dist/projection/projectRun.js +1 -0
  145. package/dist/runstore/assertTmpdir.d.ts +1 -0
  146. package/dist/runstore/assertTmpdir.js +21 -0
  147. package/dist/runstore/backup.d.ts +52 -0
  148. package/dist/runstore/backup.js +292 -0
  149. package/dist/runstore/createStore.d.ts +18 -1
  150. package/dist/runstore/createStore.js +64 -5
  151. package/dist/runstore/debugBundle.d.ts +60 -0
  152. package/dist/runstore/debugBundle.js +143 -0
  153. package/dist/runstore/diskUsage.d.ts +50 -0
  154. package/dist/runstore/diskUsage.js +214 -0
  155. package/dist/runstore/exportRunPayload.d.ts +8 -0
  156. package/dist/runstore/exportRunPayload.js +23 -0
  157. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  158. package/dist/runstore/normalizeCatalogPath.js +10 -0
  159. package/dist/runstore/paths.d.ts +5 -0
  160. package/dist/runstore/paths.js +145 -1
  161. package/dist/runstore/port.d.ts +111 -13
  162. package/dist/runstore/port.js +8 -1
  163. package/dist/runstore/restore.d.ts +81 -0
  164. package/dist/runstore/restore.js +355 -0
  165. package/dist/runstore/retention.d.ts +27 -0
  166. package/dist/runstore/retention.js +74 -0
  167. package/dist/runstore/runManifest.d.ts +146 -0
  168. package/dist/runstore/runManifest.js +288 -0
  169. package/dist/runstore/runProjection.d.ts +3 -1
  170. package/dist/runstore/runProjection.js +63 -1
  171. package/dist/runstore/sqlite/SqliteRunStore.d.ts +28 -3
  172. package/dist/runstore/sqlite/SqliteRunStore.js +352 -219
  173. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  174. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  175. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  176. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  177. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  178. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  179. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  180. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  181. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  182. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  183. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  184. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  185. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  186. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  187. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  188. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  189. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  190. package/dist/runstore/sqlite/migrations/index.js +72 -0
  191. package/dist/runstore/sqlite/schema.d.ts +20 -1
  192. package/dist/runstore/sqlite/schema.js +277 -1
  193. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  194. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  195. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  196. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  197. package/dist/runstore/stageExecution.js +3 -0
  198. package/dist/runstore/storeFilesystem.d.ts +32 -0
  199. package/dist/runstore/storeFilesystem.js +148 -0
  200. package/dist/runstore/trackProjection.js +2 -0
  201. package/dist/runstore/workspaceLayout.d.ts +13 -0
  202. package/dist/runstore/workspaceLayout.js +76 -0
  203. package/dist/runtime/completionCheckRunner.d.ts +3 -0
  204. package/dist/runtime/completionCheckRunner.js +45 -7
  205. package/dist/runtime/containerLimits.d.ts +16 -0
  206. package/dist/runtime/containerLimits.js +84 -0
  207. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  208. package/dist/runtime/credentialMaterialisation.js +128 -0
  209. package/dist/runtime/gitCheckoutCapability.js +7 -13
  210. package/dist/runtime/pipelineRunner.d.ts +36 -1
  211. package/dist/runtime/pipelineRunner.js +178 -17
  212. package/dist/runtime/pipelineScheduler.d.ts +15 -0
  213. package/dist/runtime/pipelineScheduler.js +135 -27
  214. package/dist/runtime/reloadRunCatalog.js +6 -1
  215. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  216. package/dist/runtime/repositoryMaterialize.js +235 -0
  217. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  218. package/dist/runtime/resumeTimedOut.js +5 -2
  219. package/dist/runtime/runChangeBus.js +9 -0
  220. package/dist/runtime/runDeletion.d.ts +7 -0
  221. package/dist/runtime/runDeletion.js +37 -0
  222. package/dist/runtime/runManager.d.ts +158 -4
  223. package/dist/runtime/runManager.js +1596 -79
  224. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  225. package/dist/runtime/runRetentionSweep.js +328 -0
  226. package/dist/runtime/runRetryCoordinator.d.ts +2 -0
  227. package/dist/runtime/runRetryCoordinator.js +19 -2
  228. package/dist/runtime/runSkills.d.ts +40 -0
  229. package/dist/runtime/runSkills.js +173 -0
  230. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  231. package/dist/runtime/stageAttemptBootstrap.js +195 -24
  232. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  233. package/dist/runtime/stageCacheEnv.js +34 -0
  234. package/dist/runtime/stageConcurrency.d.ts +2 -1
  235. package/dist/runtime/stageConcurrency.js +4 -2
  236. package/dist/runtime/stageEnvironment.d.ts +38 -0
  237. package/dist/runtime/stageEnvironment.js +193 -0
  238. package/dist/runtime/stageProcessLauncher.d.ts +18 -0
  239. package/dist/runtime/stageProcessLauncher.js +194 -38
  240. package/dist/runtime/stageRecovery.d.ts +3 -1
  241. package/dist/runtime/stageRecovery.js +19 -4
  242. package/dist/runtime/stageRoots.d.ts +38 -1
  243. package/dist/runtime/stageRoots.js +118 -0
  244. package/dist/runtime/stageRunner.d.ts +1 -0
  245. package/dist/runtime/stageRunner.js +3 -1
  246. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  247. package/dist/runtime/stageSecretDecl.js +102 -0
  248. package/dist/runtime/stageSecrets.d.ts +40 -0
  249. package/dist/runtime/stageSecrets.js +181 -0
  250. package/dist/runtime/stageWorker.d.ts +3 -2
  251. package/dist/runtime/stageWorker.js +58 -10
  252. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  253. package/dist/runtime/stageWorkerProtocol.js +8 -0
  254. package/dist/runtime/startPayload.d.ts +32 -0
  255. package/dist/runtime/startPayload.js +59 -0
  256. package/dist/runtime/taskInput.js +14 -5
  257. package/dist/runtime/verifiedStageExecution.d.ts +1 -0
  258. package/dist/runtime/verifiedStageExecution.js +2 -1
  259. package/dist/runtime/workspaceBinding.d.ts +20 -0
  260. package/dist/runtime/workspaceBinding.js +60 -0
  261. package/dist/server/allowedHosts.d.ts +19 -0
  262. package/dist/server/allowedHosts.js +179 -0
  263. package/dist/server/bootstrap.d.ts +36 -2
  264. package/dist/server/bootstrap.js +209 -5
  265. package/dist/server/controlToken.d.ts +47 -0
  266. package/dist/server/controlToken.js +241 -0
  267. package/dist/server/createHttpHost.d.ts +11 -2
  268. package/dist/server/createHttpHost.js +103 -10
  269. package/dist/server/ensureGlobalService.d.ts +5 -1
  270. package/dist/server/ensureGlobalService.js +35 -1
  271. package/dist/server/healthSurfaces.d.ts +6 -0
  272. package/dist/server/healthSurfaces.js +98 -0
  273. package/dist/server/http.d.ts +12 -1
  274. package/dist/server/http.js +1085 -485
  275. package/dist/server/listenHost.d.ts +5 -0
  276. package/dist/server/listenHost.js +56 -0
  277. package/dist/server/mcpHost.d.ts +10 -1
  278. package/dist/server/mcpHost.js +36 -6
  279. package/dist/server/operatorResults.d.ts +2 -2
  280. package/dist/server/operatorResults.js +40 -29
  281. package/dist/server/requestAuthContext.d.ts +12 -0
  282. package/dist/server/requestAuthContext.js +21 -0
  283. package/dist/server/shutdown.d.ts +69 -0
  284. package/dist/server/shutdown.js +219 -0
  285. package/dist/types/pipeline.d.ts +7 -0
  286. package/dist/types/stage.d.ts +8 -0
  287. package/dist/types/task.d.ts +8 -0
  288. package/dist/ui/assets/index-B6hlSXXn.js +120 -0
  289. package/dist/ui/index.html +1 -1
  290. package/examples/README.md +98 -0
  291. package/examples/archify-on-pr/README.md +213 -0
  292. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  293. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  294. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  295. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  296. package/examples/ci-validate/README.md +35 -0
  297. package/examples/ci-validate/check.yaml +13 -0
  298. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  299. package/examples/ci-validate/validate.sh +5 -0
  300. package/examples/compliance-review-demo/README.md +125 -0
  301. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  302. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  303. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  304. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  305. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  306. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  307. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  308. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  309. package/examples/conditional-fork/README.md +89 -0
  310. package/examples/conditional-fork/branch-a.yaml +13 -0
  311. package/examples/conditional-fork/branch-b.yaml +13 -0
  312. package/examples/conditional-fork/decide.yaml +35 -0
  313. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  314. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  315. package/examples/context7-mcp/README.md +42 -0
  316. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  317. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  318. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  319. package/examples/context7-mcp/resolve-library.yaml +31 -0
  320. package/examples/context7-mcp/write-brief.yaml +52 -0
  321. package/examples/feature-loop/README.md +104 -0
  322. package/examples/feature-loop/address-feedback.yaml +148 -0
  323. package/examples/feature-loop/align.yaml +116 -0
  324. package/examples/feature-loop/decompose.yaml +86 -0
  325. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  326. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  327. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  328. package/examples/feature-loop/implement.yaml +128 -0
  329. package/examples/feature-loop/plan.yaml +111 -0
  330. package/examples/feature-loop/publish.yaml +167 -0
  331. package/examples/feature-loop/review.yaml +146 -0
  332. package/examples/feature-loop/verify.yaml +106 -0
  333. package/examples/feedback-loop/README.md +72 -0
  334. package/examples/feedback-loop/VERIFY.md +208 -0
  335. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  336. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  337. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  338. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  339. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  340. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  341. package/examples/feedback-loop/implement.yaml +14 -0
  342. package/examples/feedback-loop/plan.yaml +14 -0
  343. package/examples/feedback-loop/review.yaml +15 -0
  344. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  345. package/examples/feedback-loop/submit.yaml +12 -0
  346. package/examples/generic-fan-in/README.md +151 -0
  347. package/examples/generic-fan-in/clarify.yaml +18 -0
  348. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  349. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  350. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  351. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  352. package/examples/generic-fan-in/research.yaml +45 -0
  353. package/examples/generic-fan-in/synthesize.yaml +66 -0
  354. package/examples/generic-fan-in/validation.yaml +45 -0
  355. package/examples/github-release/README.md +78 -0
  356. package/examples/github-release/draft-release-notes.yaml +64 -0
  357. package/examples/github-release/github-release.pipeline.yaml +11 -0
  358. package/examples/github-release/github-release.task.yaml +13 -0
  359. package/examples/github-release/publish-github-release.yaml +64 -0
  360. package/examples/hello-world/README.md +28 -0
  361. package/examples/hello-world/hello.pipeline.yaml +4 -0
  362. package/examples/hello-world/my-task.task.yaml +6 -0
  363. package/examples/hello-world/research.yaml +18 -0
  364. package/examples/mcp-hitl-tour/README.md +113 -0
  365. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  366. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  367. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  368. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  369. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  370. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  371. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  372. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  373. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  374. package/examples/mcp-hitl-tour/review.yaml +17 -0
  375. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  376. package/examples/oss-issue-contribution/README.md +218 -0
  377. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  378. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  379. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  380. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  381. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  382. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  383. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  384. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  385. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  386. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  387. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  388. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  389. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  390. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  391. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  392. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  393. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  394. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  395. package/examples/oss-quick-fix/README.md +65 -0
  396. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  397. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  398. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  399. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  400. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  401. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  402. package/examples/plan-review/README.md +37 -0
  403. package/examples/plan-review/plan-review-followup.yaml +13 -0
  404. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  405. package/examples/plan-review/plan-review.task.yaml +9 -0
  406. package/examples/plan-review/plan-review.yaml +25 -0
  407. package/examples/playwright-mcp/README.md +39 -0
  408. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  409. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  410. package/examples/playwright-mcp/screenshot.yaml +40 -0
  411. package/examples/retry-tour/README.md +75 -0
  412. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  413. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  414. package/examples/route-if-tour/README.md +202 -0
  415. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  416. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  417. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  418. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  419. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  420. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  421. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  422. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  423. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  424. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  425. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  426. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  427. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  428. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  429. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  430. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  431. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  432. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  433. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  434. package/examples/route-wiring-smoke-test/README.md +377 -0
  435. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  436. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  437. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  438. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  439. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  440. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  441. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  442. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  443. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  444. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  445. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  446. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  447. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  448. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  449. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  450. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  451. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  452. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  453. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  454. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  455. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  456. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  457. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  458. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  459. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  460. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  461. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  462. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  463. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  464. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  465. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  466. package/examples/ship-feature/README.md +190 -0
  467. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  468. package/examples/ship-feature/feat-implement.yaml +180 -0
  469. package/examples/ship-feature/feat-plan.yaml +120 -0
  470. package/examples/ship-feature/feat-review.yaml +109 -0
  471. package/examples/ship-feature/feat-ship.yaml +203 -0
  472. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  473. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  474. package/examples/stage-mcp/README.md +144 -0
  475. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  476. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  477. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  478. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  479. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  480. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  481. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  482. package/examples/stage-mcp/use-echo.yaml +20 -0
  483. package/examples/verify-tour/README.md +80 -0
  484. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  485. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  486. package/package.json +5 -1
  487. package/skills/stageflow/SKILL.md +6 -6
  488. package/skills/stageflow/references/control-surface.md +11 -5
  489. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  490. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  491. package/skills/stageflow-author/SKILL.md +4 -3
  492. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  493. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  494. package/skills/stageflow-run/SKILL.md +20 -12
  495. package/skills/stageflow-run/references/mcp-call.md +9 -1
  496. package/skills/stageflow-run/references/task-and-pipeline-selection.md +16 -5
  497. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  498. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  499. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  500. package/skills/stageflow-setup/SKILL.md +40 -8
  501. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,31 @@
1
+ id: gather
2
+ system_prompt: |
3
+ You are the Clone Chain join. Summarize each clone instance's angle.md into
4
+ one note. Do not invent angles that were not cloned.
5
+
6
+ 1. Call write_stage_artifact with path angles-brief.md.
7
+ 2. Emit success with artifacts [angles-brief.md] and payload
8
+ { "kind": "angles" }.
9
+ io:
10
+ input:
11
+ schema:
12
+ type: object
13
+ output:
14
+ schema:
15
+ type: object
16
+ required: [kind]
17
+ properties:
18
+ kind:
19
+ type: string
20
+ verify:
21
+ - id: angles-brief-declared
22
+ type: artifact
23
+ basename: angles-brief.md
24
+ when:
25
+ - emit
26
+ - id: angles-brief-on-disk
27
+ type: artifact
28
+ path: angles-brief.md
29
+ nonempty: true
30
+ when:
31
+ - after
@@ -0,0 +1,62 @@
1
+ id: intake
2
+ gate_kinds:
3
+ - free_text
4
+ system_prompt: |
5
+ You are the HITL intake for an MCP operator-host walkthrough.
6
+
7
+ The topic arrives as task input (io.input.topic). Do not invent a different topic.
8
+
9
+ Follow these steps exactly:
10
+
11
+ 1. Call ask_operator with kind free_text. Ask which audience the brief is
12
+ for. Tell the operator to reply with exactly one of: operators or
13
+ executives.
14
+ - operators: concrete, how-it-works language
15
+ - executives: short, stakes-and-tradeoffs language
16
+ 2. Wait for the operator answer. Do not call emit_stage_envelope before you
17
+ have that answer.
18
+ 3. Call write_stage_artifact with path intake.md. Write the topic, the chosen
19
+ audience, and one sentence that both a clone-chain draft and a short
20
+ draft will run, then join at polish.
21
+ 4. Call emit_stage_envelope exactly once with:
22
+ - status: success
23
+ - a non-empty summary
24
+ - artifacts: [intake.md]
25
+ - payload: { "topic": "<task topic>", "audience": "operators" } or
26
+ { "topic": "<task topic>", "audience": "executives" }, matching the
27
+ operator reply exactly
28
+
29
+ Rules:
30
+ - Never emit before the operator answers.
31
+ - Never invent other audience values.
32
+ - Do not emit fork_choice. Both successor stages always run.
33
+ io:
34
+ input:
35
+ schema:
36
+ type: object
37
+ required:
38
+ - topic
39
+ properties:
40
+ topic:
41
+ type: string
42
+ output:
43
+ schema:
44
+ type: object
45
+ required: [topic, audience]
46
+ properties:
47
+ topic:
48
+ type: string
49
+ audience:
50
+ type: string
51
+ verify:
52
+ - id: intake-declared
53
+ type: artifact
54
+ basename: intake.md
55
+ when:
56
+ - emit
57
+ - id: intake-on-disk
58
+ type: artifact
59
+ path: intake.md
60
+ nonempty: true
61
+ when:
62
+ - after
@@ -0,0 +1,13 @@
1
+ id: mcp-hitl-tour-exhaust
2
+ goal: |
3
+ Same walkthrough as mcp-hitl-tour: send the brief back until the loop parks
4
+ for a human decision after intake HITL.
5
+ context: |
6
+ Pair with mcp-hitl-tour.pipeline.yaml. Answer intake with exactly operators
7
+ or executives. Every review success MUST emit send_back target polish —
8
+ never continue — until waiting_kind is feedback_loop_decision.
9
+ constraints: |
10
+ Docs only. First review: send_back polish. After the polish replay, second
11
+ review: send_back polish again so MCP can call decide_feedback_loop.
12
+ input:
13
+ topic: Local-first notes apps for small teams
@@ -0,0 +1,54 @@
1
+ id: mcp-hitl-tour
2
+ model: cursor/auto
3
+ schemas:
4
+ Angle:
5
+ type: object
6
+ required: [id, title, topic]
7
+ properties:
8
+ id:
9
+ type: string
10
+ title:
11
+ type: string
12
+ topic:
13
+ type: string
14
+ stages:
15
+ - id: intake
16
+ uses: ./intake.yaml
17
+ entry: true
18
+ route:
19
+ - to: emit-angles
20
+ - to: draft-short
21
+ - id: emit-angles
22
+ uses: ./emit-angles.yaml
23
+ clone_cap: 2
24
+ clone_mode: sequential
25
+ route:
26
+ - to: draft-angle
27
+ - id: draft-angle
28
+ uses: ./draft-angle.yaml
29
+ route:
30
+ - to: gather
31
+ - id: gather
32
+ uses: ./gather.yaml
33
+ route:
34
+ - to: polish
35
+ - id: draft-short
36
+ uses: ./draft-short.yaml
37
+ route:
38
+ - to: polish
39
+ - id: polish
40
+ uses: ./polish.yaml
41
+ route:
42
+ - to: review
43
+ - id: review
44
+ uses: ./review.yaml
45
+ route:
46
+ - to: ship
47
+ - type: loop
48
+ to: polish
49
+ max_replays: 1
50
+ on_max_replays: wait_for_human
51
+ replay_session: resume
52
+ - id: ship
53
+ uses: ./ship.yaml
54
+ replay_safe: false
@@ -0,0 +1,16 @@
1
+ id: mcp-hitl-tour
2
+ goal: |
3
+ Produce a short operator-readable brief on the given topic. At intake, the
4
+ operator chooses audience (operators or executives). Both a Clone Chain
5
+ draft and a short draft always run, then join at polish. Review always
6
+ sends the brief back once so the operator decides the loop.
7
+ context: |
8
+ MCP operator-host walkthrough. Answer the intake free_text gate with exactly
9
+ operators or executives. Every review success MUST emit send_back target
10
+ polish — never continue — until waiting_kind is feedback_loop_decision.
11
+ constraints: |
12
+ Docs only; no implementation code; no git push. First review: send_back
13
+ polish. After the polish replay, second review: send_back polish again so
14
+ the operator can call decide_feedback_loop.
15
+ input:
16
+ topic: Local-first notes apps for small teams
@@ -0,0 +1,33 @@
1
+ id: polish
2
+ system_prompt: |
3
+ Produce the canonical brief.md the reviewer will read.
4
+
5
+ Both parents always ran: start from short.md and from angles-brief.md plus
6
+ the clone angle.md files. Match the intake audience. On a feedback replay,
7
+ read Feedback Loop Context and revise brief.md to address the send-back.
8
+
9
+ 1. Call write_stage_artifact with path brief.md.
10
+ 2. Emit success with artifacts [brief.md] and payload { "polished": true }.
11
+ io:
12
+ input:
13
+ schema:
14
+ type: object
15
+ output:
16
+ schema:
17
+ type: object
18
+ required: [polished]
19
+ properties:
20
+ polished:
21
+ type: boolean
22
+ verify:
23
+ - id: brief-declared
24
+ type: artifact
25
+ basename: brief.md
26
+ when:
27
+ - emit
28
+ - id: brief-on-disk
29
+ type: artifact
30
+ path: brief.md
31
+ nonempty: true
32
+ when:
33
+ - after
@@ -0,0 +1,17 @@
1
+ id: review
2
+ system_prompt: |
3
+ Review brief.md against the task goal.
4
+ On every success you MUST emit feedback_loop send_back — never continue:
5
+
6
+ {"action":"send_back","target":"polish"}
7
+
8
+ This walkthrough always takes one polish replay, then parks for a human
9
+ feedback decision (MCP decide_feedback_loop). Do not continue to ship from
10
+ this stage.
11
+ io:
12
+ input:
13
+ schema:
14
+ type: object
15
+ output:
16
+ schema:
17
+ type: object
@@ -0,0 +1,25 @@
1
+ id: ship
2
+ system_prompt: |
3
+ Ship the approved brief. Call write_stage_artifact with path ship.md
4
+ summarizing the final brief in a few sentences. Emit success with
5
+ artifacts [ship.md]. This stage is replay_safe: false — it runs only after
6
+ review continues.
7
+ io:
8
+ input:
9
+ schema:
10
+ type: object
11
+ output:
12
+ schema:
13
+ type: object
14
+ verify:
15
+ - id: ship-declared
16
+ type: artifact
17
+ basename: ship.md
18
+ when:
19
+ - emit
20
+ - id: ship-on-disk
21
+ type: artifact
22
+ path: ship.md
23
+ nonempty: true
24
+ when:
25
+ - after
@@ -0,0 +1,218 @@
1
+ # OSS issue contribution pipeline
2
+
3
+ Use a real upstream issue to demonstrate Stageflow's strongest runtime features:
4
+ evidence-preserving stages, parallel investigation, explicit handoffs, human
5
+ approval, one controlled writer, independent verification, parallel review, and
6
+ a final publication gate.
7
+
8
+ The pipeline is repository-neutral. Point the task's `checkout` at a dedicated,
9
+ clean branch in Mastra, Pydantic AI, or another project. It reads that project's
10
+ own contribution instructions before acting.
11
+
12
+ This catalog is **route-wired** (`entry` / `route` / multiple `to:`). Investigation
13
+ and review are parallel DAG fan-out, not a sealed
14
+ [Clone Chain](../../docs/yaml-catalog.md#clone-chain) (emitter → clone child → Join).
15
+ One Clone Instance per investigation or review item remains intended future
16
+ wiring; author that shape from
17
+ [`tests/fixtures/pipelines/clone-chain-*.pipeline.yaml`](../../tests/fixtures/pipelines/).
18
+
19
+ ## Flow
20
+
21
+ 1. Capture the issue, repository baseline, and contribution rules.
22
+ 2. In parallel with reproduction, write a ce-explain HTML teaching artifact for the issue (no HITL).
23
+ 3. Reproduce the failure without editing tracked files.
24
+ 4. Intended Clone Chain: one Clone Instance per investigation item (parallel).
25
+ 5. Join the evidence into an implementation plan and ask for approval.
26
+ 6. Write the regression test in its own short stage, then implement the fix
27
+ and drive the plan's full validation command list to green in one
28
+ session — the only stage that can edit the checkout owns the whole
29
+ fix-and-validate loop, rather than handing an unfinished fix to a
30
+ read-only stage that could only report the gap.
31
+ 7. Independently verify the diff and relevant tests.
32
+ 8. In parallel with review planning, write a ce-explain HTML teaching artifact for the verified fix (no HITL).
33
+ 9. Intended Clone Chain: one Clone Instance per focused review (parallel).
34
+ 10. Address every blocking review finding in one fixup stage — sweeping for
35
+ every instance of the same category of problem, not only the ones
36
+ reviewers happened to cite. This catalog stays a DAG (parallel fan-out
37
+ via multiple `to:`); it does not declare `{ type: loop }` back to
38
+ oss-implement-source-fix or a second review pass.
39
+ 11. Join into a PR-ready package, ask for final approval, and — once the
40
+ operator accepts — push the branch and open the pull request against the
41
+ fork in that same stage.
42
+
43
+ No stage ever targets the upstream repo, and no stage before the final one
44
+ commits, pushes, or opens a pull request. `oss-approve-contribution` writes
45
+ `contribution-package.md`, calls `ask_operator`, and only runs `git`/`gh`
46
+ against the fork after an explicit accept through its `artifact_backed` gate.
47
+ There is no separate publish flag or dry-run mode: the operator's accept is
48
+ the only gate between "package written" and "PR opened."
49
+
50
+ ## Runtime contracts
51
+
52
+ Several stages opt into Stageflow runtime contracts that make the pipeline fail
53
+ closed when a stage skips its deliverable.
54
+
55
+ Every stage except the two approval stages declares `gate_kinds: []`, which
56
+ unregisters the `ask_operator` tool entirely. Those stages cannot pause for
57
+ operator input or offer to substitute a report for real work. Only
58
+ `oss-approve-plan` and `oss-approve-contribution` keep
59
+ `gate_kinds: [artifact_backed]`.
60
+
61
+ ### Review feedback has no loop in this catalog
62
+
63
+ Loops exist via `{ type: loop }` on `route` (see
64
+ [`examples/feedback-loop/`](../feedback-loop/)). This pipeline does not use
65
+ one: it stays a DAG with parallel fan-out via multiple `to:`. If
66
+ `oss-review-change` finds a blocking problem, the run does not resume
67
+ `oss-implement-source-fix` or `oss-verify-fix`. `oss-address-review-feedback`
68
+ is the accommodation: a single fixup stage after review and before approval
69
+ that addresses every blocking finding — sweeping for other instances of the
70
+ same category of problem, not only the ones a reviewer happened to cite — then
71
+ hands off to `oss-approve-contribution`, which independently re-checks the
72
+ fix before accepting it. It cannot get a fresh review of its own fix,
73
+ though: if its patch introduces something new, `oss-approve-contribution`'s
74
+ fail-closed check is the backstop, and the operator has to intervene by hand —
75
+ see [docs/cli-reference.md](../../docs/cli-reference.md) for `sf runs retry`,
76
+ which can retry a succeeded stage in place and reset everything downstream.
77
+
78
+ Every stage declares `verify` with at least one `type: artifact` check, so a
79
+ success emit is rejected unless the named file appears in the envelope's
80
+ artifact list. Writer stages add `type: checkout_changes` with `path_fields`;
81
+ approval stages also declare a `type: gate` check (`kind: artifact_backed`).
82
+ Pipeline entries wire `on_verify_fail` (repair for most stages; `manual` on
83
+ `oss-approve-contribution`) so after-phase failures retry or wait for an
84
+ operator instead of silently advancing.
85
+
86
+ | Stage | Gate | Required artifacts | Other checks |
87
+ |-------|------|--------------------|--------------|
88
+ | `oss-issue-intake` | `[]` | `issue-intake.md` | — |
89
+ | `oss-explain-issue` | `[]` | `issue-explainer.html` | — |
90
+ | `oss-reproduce-issue` | `[]` | `reproduction.md` | — |
91
+ | `oss-plan-investigation` | `[]` | `investigation-map.md` | intended Clone Chain emitter |
92
+ | `oss-investigate-area` | `[]` | `investigation.md` | intended clone child |
93
+ | `oss-approve-plan` | `[artifact_backed]` | `implementation-plan.md` | — |
94
+ | `oss-write-regression-test` | `[]` | `regression-test-report.md` | `[test_files]` |
95
+ | `oss-implement-source-fix` | `[]` | `implementation-report.md` | `[changed_files]` |
96
+ | `oss-verify-fix` | `[]` | `verification.md` | — |
97
+ | `oss-explain-fix` | `[]` | `fix-explainer.html` | — |
98
+ | `oss-plan-review` | `[]` | `review-plan.md` | intended Clone Chain emitter |
99
+ | `oss-review-change` | `[]` | `review.md` | intended clone child |
100
+ | `oss-address-review-feedback` | `[]` | `review-feedback-report.md` | — |
101
+ | `oss-approve-contribution` | `[artifact_backed]` | `contribution-package.md`, `pull-request.md` | — |
102
+
103
+ Intended Clone Chains: `oss-plan-investigation` → `oss-investigate-area` → `oss-approve-plan`, and `oss-plan-review` → `oss-review-change` → join at address/approve. This directory's YAML is not yet that shape. See [YAML catalog — Clone Chain](../../docs/yaml-catalog.md#clone-chain).
104
+
105
+ `oss-investigate-area` and `oss-review-change` use empty `io.input` (a subset of each parent's `io.output`). Assignment fields (`area_id`/`objective`/`paths`/`questions`/`constraints` or the review equivalent) belong on intended Clone Chain payloads, not this DAG.
106
+
107
+ Plan approval (`oss-approve-plan`) and contribution approval
108
+ (`oss-approve-contribution`) use `artifact_backed` HITL and cannot self-approve;
109
+ the runtime checks the QA trail before accepting a success emit.
110
+
111
+ `oss-write-regression-test` and `oss-implement-source-fix` require an array
112
+ field (`test_files` or `changed_files`) with `minItems: 1` on `io.output.schema`.
113
+ That constraint only checks the array is non-empty — it does not verify the
114
+ entries are real edits in the checkout, and a Stageflow artifact path satisfies
115
+ it. A run that never touched the checkout has passed this way before.
116
+
117
+ Both writer stages therefore also declare a `verify` check of
118
+ `type: checkout_changes` with `path_fields` naming that array field, so the
119
+ runtime enforces after the stage what the prompts alone could not:
120
+
121
+ - `type: checkout_changes` rejects a success outcome when
122
+ `git status --porcelain` in the bound task checkout is empty.
123
+ - `path_fields: [changed_files]` (or `[test_files]`) rejects a success outcome
124
+ when any listed entry is not a path inside the checkout — including the
125
+ `stages/<id>/attempts/<n>/artifacts/...` paths returned by
126
+ `write_stage_artifact`.
127
+
128
+ Stageflow is a configurable-stage runtime. These contracts are opt-in per
129
+ catalog; this example is one consumer that uses them to enforce a strict
130
+ contribution workflow.
131
+
132
+ ## Explainers
133
+
134
+ The two explainer stages are dead-end siblings: they do not pause investigation,
135
+ implementation, or review, and they do not call `ask_operator`. Each composes a
136
+ ce-explain HTML teaching artifact — concept for the issue, diff for the verified
137
+ fix — grounded in quoted checkout source and an inline SVG, written with
138
+ `write_stage_artifact`. Open `issue-explainer.html` and `fix-explainer.html`
139
+ from the run artifacts when you want them. They require the `ce-explain` skill
140
+ at `.pi/skills/ce-explain/` (copy the skill tree from Compound Engineering;
141
+ `sf skills install` expects a doctor binary this skill does not ship).
142
+
143
+ ## Prepare the target repository
144
+
145
+ Use a dedicated branch and begin with a clean tracked worktree:
146
+
147
+ ```bash
148
+ git clone https://github.com/mastra-ai/mastra.git
149
+ cd mastra
150
+ git switch -c investigate-22863
151
+ git status --short
152
+ ```
153
+
154
+ ## Create a task outside the target checkout
155
+
156
+ Task context is the pipeline's portable issue input. Include the issue body or
157
+ acceptance criteria so the run remains useful if GitHub access is unavailable.
158
+
159
+ ```yaml
160
+ id: mastra-22863
161
+ goal: >
162
+ Deliver a verified minimal fix for Mastra issue #22863, applied as source and
163
+ test edits in the checkout working tree.
164
+ context: |
165
+ Issue: https://github.com/mastra-ai/mastra/issues/22863
166
+ Title: <copy the current issue title>
167
+ Reported behavior: <copy or summarize the concrete failure>
168
+ Expected behavior: <copy or summarize the acceptance criterion>
169
+ Current triage/maintainer status: <record what you verified today>
170
+ constraints: |
171
+ Respect all repository contribution and agent instructions.
172
+ Do not publish while the issue is awaiting maintainer direction.
173
+ Do not commit, push, or open a pull request.
174
+ Keep the change limited to the reproduced issue and its regression test.
175
+ checkout: /absolute/path/to/mastra
176
+ ```
177
+
178
+ For Pydantic AI, use the same shape with a Pydantic issue and set `checkout` to
179
+ the absolute path of that clone. A ready task for issue #7971 is
180
+ `pydantic-ai-7971.task.yaml`. The stage definitions do not need to change.
181
+
182
+ ## Run
183
+
184
+ From any directory with Stageflow installed:
185
+
186
+ ```bash
187
+ sf validate \
188
+ --pipeline /path/to/stageflow/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml \
189
+ --strict
190
+
191
+ sf run \
192
+ --pipeline /path/to/stageflow/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml \
193
+ --task /path/to/mastra-22863.task.yaml
194
+ ```
195
+
196
+ `oss-approve-contribution` pushes and opens the pull request against the fork
197
+ as soon as the operator accepts its `artifact_backed` gate — there is no
198
+ dry-run mode and no extra flag. `gh` must be on `PATH` and authenticated
199
+ (`GH_TOKEN` or `GITHUB_TOKEN`) before you accept, or the publish step will
200
+ fail after approval.
201
+
202
+ Run `sf ui` in another terminal to inspect envelopes, artifacts, Clone Instances,
203
+ and answer the two artifact-backed gates. The explainer HTML files are ordinary
204
+ stage artifacts; they do not appear as gates.
205
+
206
+ ## Safety and interpretation
207
+
208
+ - Plan approval authorizes only local edits in the task checkout.
209
+ - Review Clone Instances always complete successfully and carry `pass` or
210
+ `changes_required` in their payload, allowing the Join to see every review.
211
+ - Any blocking review fails the final stage closed.
212
+ - The operator's accept through `oss-approve-contribution`'s `artifact_backed`
213
+ gate is the only authorization to publish, and it happens moments before the
214
+ stage runs `git push` / `gh pr create` in the same session — there is no
215
+ separate flag and no second chance to reconsider after accepting. It never
216
+ authorizes targeting upstream.
217
+ - Issue labels, assignments, and maintainer guidance can change. Re-verify them
218
+ before accepting the gate on a run that will open a pull request.
@@ -0,0 +1,117 @@
1
+ id: oss-address-review-feedback
2
+ system_prompt: |
3
+ Address every blocking finding from oss-review-change before the
4
+ contribution package is assembled. There is no automatic path back to
5
+ oss-implement-source-fix or oss-verify-fix in this pipeline, and this is the
6
+ only stage positioned to edit the checkout after review — treat that as the
7
+ reason this stage exists, not as license to rewrite the fix. This stage is
8
+ the last-mile fixup for what reviewers found, not a second implementation
9
+ pass.
10
+
11
+ Reading upstream evidence. The user prompt contains a line
12
+ "Factory run workspace: <absolute path>". Prior artifacts arrive in the
13
+ prior envelope's artifacts[] as run-relative paths; read each one at
14
+ <Factory run workspace>/<artifact path>. Every oss-review-change
15
+ envelope's payload (review_id, verdict, blocking_findings) and its review.md
16
+ are authoritative; implementation-report.md and verification.md give the
17
+ context needed to make a correct, narrow fix. Prose summaries are secondary.
18
+
19
+ Definition of done — every line must hold before you emit success:
20
+ - Every oss-review-change envelope and its review.md have been read.
21
+ - If every verdict is pass: the checkout is untouched, fixed_files is empty,
22
+ and addressed_all_blocking is true.
23
+ - If any verdict is changes_required: every entry in every review's
24
+ blocking_findings has been addressed, not only the specific file/line
25
+ reviewers happened to cite — search for every other instance of the same
26
+ category of problem (for example, every other test still asserting
27
+ semantics the fix already inverted elsewhere, or every other call site
28
+ with the same missing type widening) and fix those too. A reviewer's
29
+ citation is a sample of the problem, not its full extent.
30
+ - git diff in the checkout is non-empty whenever any verdict was
31
+ changes_required; the emit is rejected if you claim to have addressed a
32
+ blocking finding while the working tree is clean.
33
+ - Every fixed_files entry is a repo-relative path inside the checkout that
34
+ also appears in git diff --name-only; the emit is rejected for any entry
35
+ pointing into the factory run workspace.
36
+ - Every check a blocking finding cited as failing has been re-run here and
37
+ now passes; verification_commands records each with its result.
38
+ - review-feedback-report.md is written and listed in the emitted artifacts;
39
+ the emit is rejected without it.
40
+
41
+ 1. Read every oss-review-change envelope and review.md via the recipe
42
+ above. If every verdict is pass, skip to step 5 with nothing to fix.
43
+ 2. For each changes_required review, read every blocking_findings entry and
44
+ its remediation guidance. Do not re-litigate a pass verdict or reopen
45
+ non-blocking findings or suggestions — those are out of scope here.
46
+ 3. Fix each blocking finding at its cited location, then search the rest of
47
+ the checkout for other instances of the same category of problem and fix
48
+ those too (see Definition of done). Do not perform unrelated formatting,
49
+ refactors, or scope expansion beyond what the findings require. Do not
50
+ 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. Write review-feedback-report.md listing every blocking finding, whether
57
+ it was addressed (with the fix location and the passing re-run), or
58
+ that there was nothing to address because every verdict was pass.
59
+ 6. Emit exactly once, including review-feedback-report.md and all inherited
60
+ evidence artifacts, with a payload matching the schema.
61
+
62
+ Contract violations — emit failure rather than presenting these as success:
63
+ - addressed_all_blocking: true while any blocking_findings entry remains
64
+ unaddressed or unverified.
65
+ - Fixing only the literal file/line a reviewer cited when the same category
66
+ of problem exists elsewhere in the diff.
67
+ - Emitting success while git diff is empty and any verdict was
68
+ changes_required.
69
+ - A fixed_files entry under stages/.../artifacts/ or anywhere else in the
70
+ factory run workspace.
71
+ - Editing anything outside the scope of a blocking finding.
72
+ - verification_commands listing commands you did not execute.
73
+
74
+ Never commit, push, or open a pull request.
75
+
76
+ Write summary as outcomes and resulting state for oss-approve-contribution:
77
+ which blocking findings existed, what changed to address them, and
78
+ confirmation every cited check now passes (or, on failure, what remains
79
+ open). Downstream stages receive this summary verbatim and can mistake it
80
+ for their own instructions, so never restate this stage's prohibitions or
81
+ scope limits in it.
82
+ model: omniroute/auto
83
+ io:
84
+ input:
85
+ schema:
86
+ type: object
87
+ output:
88
+ schema:
89
+ type: object
90
+ required:
91
+ - addressed_all_blocking
92
+ - fixed_files
93
+ - verification_commands
94
+ - remaining_risks
95
+ properties:
96
+ addressed_all_blocking:
97
+ type: boolean
98
+ fixed_files:
99
+ type: array
100
+ items:
101
+ type: string
102
+ verification_commands:
103
+ type: array
104
+ items:
105
+ type: string
106
+ remaining_risks:
107
+ type: array
108
+ items:
109
+ type: string
110
+ verify:
111
+ - id: review-feedback-report
112
+ type: artifact
113
+ path: review-feedback-report.md
114
+ nonempty: true
115
+ when:
116
+ - after
117
+ gate_kinds: []