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,53 @@
1
+ id: pydantic-ai-7971
2
+ goal: >
3
+ Deliver a verified minimal local fix for Pydantic AI issue #7971, Carry a
4
+ durable unit's emitted events and enqueued messages in its recorded output,
5
+ applied as source and test edits in the checkout working tree, plus an
6
+ operator-approved pull request opened against tejasghutukade/pydantic-ai
7
+ rather than pydantic/pydantic-ai.
8
+ context: |
9
+ Issue: https://github.com/pydantic/pydantic-ai/issues/7971
10
+ Title: Carry a durable unit's emitted events and enqueued messages in its recorded output
11
+ Upstream repo: https://github.com/pydantic/pydantic-ai
12
+ Fork (PR target after the run): https://github.com/tejasghutukade/pydantic-ai
13
+ State: OPEN, unassigned. Pydantic contributing guidance asks for assignment
14
+ before an upstream PR, so this run prepares a local change for a fork PR only.
15
+
16
+ Reported behavior: under durable execution, ctx.emit() and ctx.enqueue() are
17
+ side effects of running a durable unit rather than part of its recorded
18
+ result, so they do not survive replay. On Prefect/DBOS a replayed result
19
+ never re-emits; on Temporal emit from a tool or event stream handler raises;
20
+ ctx.enqueue() is rejected on all three engines. A capability therefore cannot
21
+ emit from its own tools under durable execution.
22
+
23
+ Expected behavior (proposal on the issue): carry the emitted events and
24
+ enqueued messages back in the unit's recorded output and replay them
25
+ container-side. (1) Worker-side, install capture sinks on the unit's
26
+ RunContext so emit and enqueue append instead of raising or reaching the live
27
+ buffer. (2) Return them alongside the operation's value in an envelope over
28
+ ResultT. (3) Container-side, re-emit the captured events and extend
29
+ pending_messages before handing the value back. DurableOperation already has
30
+ the shape: one handler, one result_codec, and declaration sites in
31
+ durable_exec/_base.py.
32
+
33
+ Care needed: liveness on in-process engines (live delivery vs
34
+ capture-then-replay), and wire compatibility (decode both the bare value and
35
+ the envelope; see test_durable_exec_compat.py).
36
+
37
+ The full issue write-up, including per-engine detail and related issues, is
38
+ captured by the intake stage in issue-intake.md.
39
+ constraints: |
40
+ Respect pydantic-ai AGENTS.md, CONTRIBUTING.md, and test docs.
41
+ Do not commit, push, create a branch, or open a pull request in any stage
42
+ except oss-approve-contribution, which may do so only after the operator
43
+ has explicitly accepted the contribution package through its
44
+ artifact_backed gate.
45
+ Do not target pydantic/pydantic-ai. The PR base is always
46
+ tejasghutukade/pydantic-ai (gh pr create --repo tejasghutukade/pydantic-ai).
47
+ Keep the change limited to the reproduced issue and its regression test.
48
+ Do not treat missing maintainer assignment as a reason to skip local work.
49
+ Source and test edits belong in the checkout working tree and must never be
50
+ replaced by a Stageflow artifact or report describing the change.
51
+ In the explainer stages only (oss-explain-issue, oss-explain-fix), the
52
+ explainer HTML belongs in Stageflow artifacts, never in the checkout.
53
+ checkout: /Users/tejasghutukade/Projects/pydantic-ai
@@ -0,0 +1,65 @@
1
+ # oss-quick-fix
2
+
3
+ A minimal, fully unattended sibling of
4
+ [`oss-issue-contribution`](../oss-issue-contribution/): one straight-line
5
+ spine from "understand the issue" to "PR opened against my fork," with no
6
+ operator gate anywhere in the run.
7
+
8
+ Every stage declares `gate_kinds: []`, which unregisters `ask_operator`
9
+ entirely — stages must decide and proceed, never pause for a human. Use this
10
+ shape for issues small enough that you trust a single unsupervised pass; use
11
+ `oss-issue-contribution` when you want parallel investigation/review and an
12
+ operator approval before anything ships.
13
+
14
+ ## Flow
15
+
16
+ ```
17
+ understand-issue → implement-fix → verify-fix → ship-fix
18
+ ```
19
+
20
+ 1. **understand-issue** — Reads the task goal/context, locates the responsible
21
+ code, reproduces the bug if practical, and writes `investigation.md`.
22
+ 2. **implement-fix** — Writes a failing regression test, fixes the root cause,
23
+ confirms the test (and the broader suite) passes, and writes
24
+ `fix-report.md`. `changed_files` must match `git diff --name-only` exactly.
25
+ 3. **verify-fix** — Independently re-runs the repo's real check/lint/test
26
+ commands against the actual diff (not the report's description of it) and
27
+ writes `verification.md`. `all_passed` is true only if every command it
28
+ ran actually exited zero.
29
+ 4. **ship-fix** — Commits, pushes, and opens a pull request against
30
+ `publish_repo` — the fork named in the task, never the upstream repo — and
31
+ writes `ship-report.md`. Refuses to proceed if `verify-fix` did not pass or
32
+ if the task does not name a fork.
33
+
34
+ Every stage declares `on_verify_fail: { mode: repair, retry_safety: idempotent, max_attempts: 3 }`
35
+ except `ship-fix`, which uses `mode: manual` / `retry_safety: side_effecting`
36
+ because it is the only stage with side effects (git push, PR creation).
37
+
38
+ ## Runtime contracts
39
+
40
+ | Stage | Required artifact | Other checks |
41
+ |-------|--------------------|---------------|
42
+ | `understand-issue` | `investigation.md` | — |
43
+ | `implement-fix` | `fix-report.md` | `type: checkout_changes` on `changed_files` |
44
+ | `verify-fix` | `verification.md` | — |
45
+ | `ship-fix` | `ship-report.md` | — |
46
+
47
+ ## Run
48
+
49
+ Fill in [`oss-quick-fix.task.yaml`](oss-quick-fix.task.yaml) — the issue, the
50
+ fork to publish to, and `checkout` pointed at a clean working tree of the
51
+ target repository.
52
+
53
+ ```bash
54
+ sf validate --pipeline examples/oss-quick-fix/oss-quick-fix.pipeline.yaml --strict
55
+ sf run \
56
+ --pipeline examples/oss-quick-fix/oss-quick-fix.pipeline.yaml \
57
+ --task examples/oss-quick-fix/oss-quick-fix.task.yaml
58
+ ```
59
+
60
+ Needs a configured provider (`sf providers status`), and `gh` on `PATH`
61
+ authenticated (`GH_TOKEN` or `GITHUB_TOKEN`) before `ship-fix` runs, or the
62
+ publish step fails after the fix is already verified.
63
+
64
+ Run `sf ui` in another terminal to inspect envelopes and artifacts — there are
65
+ no gates to answer.
@@ -0,0 +1,84 @@
1
+ id: implement-fix
2
+ system_prompt: |
3
+ Fix the issue in the checkout: edit source, add a regression test, and get
4
+ both passing. Never call ask_operator — decide and proceed.
5
+
6
+ Read investigation.md from the prior envelope's artifacts (a run-relative
7
+ path under the "Factory run workspace" value given in this stage's user
8
+ prompt) for the root cause, target files, and fix approach. Treat it as the
9
+ starting point, not gospel — if the real fix differs once you're in the
10
+ code, take the correct one and say why in fix-report.md.
11
+
12
+ 1. Write a regression test that fails against the current (buggy) code for
13
+ the reason described in investigation.md, using the repo's actual test
14
+ framework and conventions (find an existing test file near the affected
15
+ code and match its style; do not invent a new test setup pattern).
16
+ Confirm it fails, and capture that failing output.
17
+ 2. Edit the source to fix the root cause. Keep the change minimal and
18
+ scoped to this issue — do not refactor, rename, or clean up unrelated
19
+ code along the way.
20
+ 3. Run the regression test again and confirm it now passes. Then run the
21
+ broader test suite (or the most relevant scoped slice if a full run is
22
+ impractical) to check you haven't broken anything else. If something
23
+ breaks, fix it before moving on — you own this loop end to end; nothing
24
+ downstream can repair a broken implementation.
25
+ 4. Call write_stage_artifact with path fix-report.md containing: what you
26
+ changed and why, the regression test's id/path and its before/after
27
+ output, every command you ran with its result, and anything from
28
+ investigation.md you deviated from and why.
29
+ 5. Call emit_stage_envelope exactly once. changed_files must match
30
+ git diff --name-only exactly — no more, no fewer.
31
+ model: openrouter/minimax/minimax-m3:free
32
+ timeout_ms: 7200000
33
+ io:
34
+ input:
35
+ schema:
36
+ type: object
37
+ required:
38
+ - root_cause
39
+ - target_files
40
+ - repro_confirmed
41
+ - fix_approach
42
+ properties:
43
+ root_cause:
44
+ type: string
45
+ target_files:
46
+ type: array
47
+ items:
48
+ type: string
49
+ repro_confirmed:
50
+ type: boolean
51
+ fix_approach:
52
+ type: string
53
+ additionalProperties: false
54
+ output:
55
+ schema:
56
+ type: object
57
+ required:
58
+ - changed_files
59
+ - regression_test
60
+ - tests_passed
61
+ properties:
62
+ changed_files:
63
+ type: array
64
+ items:
65
+ type: string
66
+ regression_test:
67
+ type: string
68
+ tests_passed:
69
+ type: boolean
70
+ additionalProperties: false
71
+ verify:
72
+ - id: fix-report
73
+ type: artifact
74
+ path: fix-report.md
75
+ nonempty: true
76
+ when:
77
+ - after
78
+ - id: checkout-changed
79
+ type: checkout_changes
80
+ path_fields:
81
+ - changed_files
82
+ when:
83
+ - after
84
+ gate_kinds: []
@@ -0,0 +1,35 @@
1
+ id: oss-quick-fix
2
+ stages:
3
+ - id: understand-issue
4
+ entry: true
5
+ route:
6
+ - to: implement-fix
7
+ uses: ./understand-issue.yaml
8
+ on_verify_fail:
9
+ mode: repair
10
+ max_attempts: 3
11
+ retry_safety: idempotent
12
+ include_failed_checks: true
13
+ - id: implement-fix
14
+ route:
15
+ - to: verify-fix
16
+ uses: ./implement-fix.yaml
17
+ on_verify_fail:
18
+ mode: repair
19
+ max_attempts: 3
20
+ retry_safety: idempotent
21
+ include_failed_checks: true
22
+ - id: verify-fix
23
+ route:
24
+ - to: ship-fix
25
+ uses: ./verify-fix.yaml
26
+ on_verify_fail:
27
+ mode: repair
28
+ max_attempts: 3
29
+ retry_safety: idempotent
30
+ include_failed_checks: true
31
+ - id: ship-fix
32
+ uses: ./ship-fix.yaml
33
+ on_verify_fail:
34
+ mode: manual
35
+ retry_safety: side_effecting
@@ -0,0 +1,19 @@
1
+ id: oss-quick-fix-template
2
+ goal: >
3
+ Deliver a verified minimal local fix for <issue URL / short description>,
4
+ applied as source and test edits in the checkout working tree, plus a pull
5
+ request opened against your own fork (never the upstream repository).
6
+ context: |
7
+ Issue: <issue URL>
8
+ Title: <copy the current issue title>
9
+ Upstream repo: <owner/repo>
10
+ Fork (PR target): <your-username>/<repo>
11
+ Reported behavior: <copy or summarize the concrete failure>
12
+ Expected behavior: <copy or summarize the acceptance criterion>
13
+ constraints: |
14
+ Respect the target repository's AGENTS.md / CONTRIBUTING.md and test
15
+ conventions.
16
+ publish_repo in the final stage must be exactly the fork named above —
17
+ never the upstream owner/repo.
18
+ Keep the change limited to the reported issue and its regression test.
19
+ checkout: /absolute/path/to/checkout
@@ -0,0 +1,81 @@
1
+ id: ship-fix
2
+ system_prompt: |
3
+ Publish the verified fix as a pull request against your own fork —
4
+ never the upstream project. Opening a PR against upstream is a separate,
5
+ explicitly-authorized manual step outside this pipeline; this stage never
6
+ does that. Never call ask_operator or pause for review — within that
7
+ fork-only boundary, commit, push, and open the pull request yourself.
8
+
9
+ Read verification.md, fix-report.md, and investigation.md from prior
10
+ envelopes' artifacts (run-relative paths under the "Factory run workspace"
11
+ value given in this stage's user prompt). Do not proceed if
12
+ verification.md's all_passed is not true — emit failure instead and say
13
+ what's unresolved.
14
+
15
+ publish_repo is exactly the fork repository the task goal/context names as
16
+ the PR target (e.g. your-username/project, not the original upstream
17
+ owner/project). If the task does not explicitly name a fork, emit failure
18
+ instead of guessing — never push or open a PR against a repository nobody
19
+ named, and never target the upstream repository under any circumstance.
20
+
21
+ 1. Run git status to confirm the diff from implement-fix/verify-fix is
22
+ still present and is the only thing you're about to commit.
23
+ 2. Stage exactly the changed files (never a blanket add), commit with a
24
+ concise message describing the fix and why (match the target repo's
25
+ commit conventions from investigation.md if it recorded any), and push
26
+ to a new branch on publish_repo (your fork).
27
+ 3. Open a pull request with gh pr create --repo <publish_repo> against that
28
+ fork's default branch: title stating the fix, body with the issue
29
+ reference, root cause, what changed, and the verification commands that
30
+ passed. Note in the body that this targets the fork and that opening it
31
+ against upstream is a separate manual step.
32
+ 4. Confirm the PR exists with gh pr view. Call write_stage_artifact with
33
+ path ship-report.md containing the branch, commit sha, PR url, and the
34
+ exact git/gh commands you ran.
35
+ 5. Call emit_stage_envelope exactly once. opened is true only if gh pr view
36
+ confirmed the PR exists.
37
+ model: openrouter/minimax/minimax-m3:free
38
+ timeout_ms: 7200000
39
+ io:
40
+ input:
41
+ schema:
42
+ type: object
43
+ required:
44
+ - commands_run
45
+ - all_passed
46
+ properties:
47
+ commands_run:
48
+ type: array
49
+ items:
50
+ type: string
51
+ all_passed:
52
+ type: boolean
53
+ notes:
54
+ type: string
55
+ additionalProperties: false
56
+ output:
57
+ schema:
58
+ type: object
59
+ required:
60
+ - publish_repo
61
+ - branch
62
+ - opened
63
+ - pr_url
64
+ properties:
65
+ publish_repo:
66
+ type: string
67
+ branch:
68
+ type: string
69
+ opened:
70
+ type: boolean
71
+ pr_url:
72
+ type: string
73
+ additionalProperties: false
74
+ verify:
75
+ - id: ship-report
76
+ type: artifact
77
+ path: ship-report.md
78
+ nonempty: true
79
+ when:
80
+ - after
81
+ gate_kinds: []
@@ -0,0 +1,67 @@
1
+ id: understand-issue
2
+ system_prompt: |
3
+ Understand the reported issue well enough to fix it, then write
4
+ investigation.md as the durable record downstream stages read instead of
5
+ re-deriving this work. Do not edit source files in this stage. Never call
6
+ ask_operator — this pipeline runs unattended; make the best defensible call
7
+ yourself and keep going.
8
+
9
+ 1. Read the task goal and context for the issue statement (what's broken,
10
+ why, why it matters). If the checkout has AGENTS.md, CONTRIBUTING.md, or
11
+ other repo-instruction files, read the ones that govern the suspected
12
+ code area and note anything that constrains how a fix should look
13
+ (commit conventions, test runner, things you must not touch).
14
+ 2. Locate the actual code responsible, by reading it — not by guessing from
15
+ the issue text. Trace the failure to specific files and line ranges.
16
+ 3. Reproduce the bug if at all practical: write and run a minimal script,
17
+ failing test, or repro command that demonstrates the broken behavior
18
+ right now, in this checkout. If true reproduction isn't practical
19
+ (e.g. needs hardware or a live external service you don't have), say so
20
+ explicitly and explain what you verified by reading the code instead —
21
+ do not claim a reproduction that didn't happen.
22
+ 4. Call write_stage_artifact with path investigation.md containing: the
23
+ issue restated in full (not abbreviated — downstream stages rely on
24
+ this, not on the task text), root cause with file:line references,
25
+ repro method and its actual output, the fix approach you intend to take
26
+ and why, and any repo rules from step 1 that constrain the fix.
27
+ 5. Call emit_stage_envelope exactly once with a payload matching the
28
+ schema.
29
+
30
+ No placeholder values (n/a, tbd, unknown, "see issue") anywhere in the
31
+ payload or artifact — if something is genuinely unknown, say what you'd
32
+ need to find out and why you couldn't, and still record what you did
33
+ verify.
34
+ model: openrouter/minimax/minimax-m3:free
35
+ timeout_ms: 7200000
36
+ io:
37
+ input:
38
+ schema:
39
+ type: object
40
+ output:
41
+ schema:
42
+ type: object
43
+ required:
44
+ - root_cause
45
+ - target_files
46
+ - repro_confirmed
47
+ - fix_approach
48
+ properties:
49
+ root_cause:
50
+ type: string
51
+ target_files:
52
+ type: array
53
+ items:
54
+ type: string
55
+ repro_confirmed:
56
+ type: boolean
57
+ fix_approach:
58
+ type: string
59
+ additionalProperties: false
60
+ verify:
61
+ - id: investigation
62
+ type: artifact
63
+ path: investigation.md
64
+ nonempty: true
65
+ when:
66
+ - after
67
+ gate_kinds: []
@@ -0,0 +1,73 @@
1
+ id: verify-fix
2
+ system_prompt: |
3
+ Independently verify the fix is correct, complete, and clean before it
4
+ ships — you are the only check this pipeline has; there is no human review
5
+ step. Never call ask_operator. If you find a problem, fix it yourself and
6
+ re-verify rather than reporting it downstream.
7
+
8
+ Read fix-report.md and investigation.md from prior envelopes' artifacts
9
+ (run-relative paths under the "Factory run workspace" value given in this
10
+ stage's user prompt).
11
+
12
+ 1. Read the actual diff (git diff) rather than trusting fix-report.md's
13
+ description of it. Confirm the change matches the claimed root cause
14
+ and is scoped to the issue — flag and fix anything unrelated, debug
15
+ leftovers, commented-out code, or stray files.
16
+ 2. Run the repo's real check/lint/typecheck command and its real test
17
+ command (found in AGENTS.md, package scripts, or equivalent — use
18
+ whatever investigation.md recorded, or find it yourself if that's
19
+ incomplete). Run the regression test by its exact id, and the broader
20
+ suite. Record every command and its exit status.
21
+ 3. If anything fails or looks wrong, fix it in this stage and re-run until
22
+ it's clean. Do not report success on a red run, and do not hand a known
23
+ problem downstream with a note about it instead of fixing it.
24
+ 4. Call write_stage_artifact with path verification.md containing: every
25
+ command run and its result, confirmation the regression test passes,
26
+ confirmation of no unrelated changes, and any issues you found and
27
+ fixed in this stage.
28
+ 5. Call emit_stage_envelope exactly once with all_passed true only if
29
+ every command you ran actually exited zero.
30
+ model: openrouter/minimax/minimax-m3:free
31
+ timeout_ms: 7200000
32
+ io:
33
+ input:
34
+ schema:
35
+ type: object
36
+ required:
37
+ - changed_files
38
+ - regression_test
39
+ - tests_passed
40
+ properties:
41
+ changed_files:
42
+ type: array
43
+ items:
44
+ type: string
45
+ regression_test:
46
+ type: string
47
+ tests_passed:
48
+ type: boolean
49
+ additionalProperties: false
50
+ output:
51
+ schema:
52
+ type: object
53
+ required:
54
+ - commands_run
55
+ - all_passed
56
+ properties:
57
+ commands_run:
58
+ type: array
59
+ items:
60
+ type: string
61
+ all_passed:
62
+ type: boolean
63
+ notes:
64
+ type: string
65
+ additionalProperties: false
66
+ verify:
67
+ - id: verification
68
+ type: artifact
69
+ path: verification.md
70
+ nonempty: true
71
+ when:
72
+ - after
73
+ gate_kinds: []
@@ -0,0 +1,37 @@
1
+ # plan-review
2
+
3
+ Two-stage pipeline with an **artifact-backed operator gate** (`ask_operator`). This is an **SDLC-style example** — plan review before implementation — but the same HITL pattern applies to any workflow you author.
4
+
5
+ Fixture twin: `tests/fixtures/pipelines/plan-review-proving.pipeline.yaml`.
6
+
7
+ ## Prerequisites
8
+
9
+ - Node.js ≥ 20, Stageflow installed
10
+ - Provider auth connected
11
+ - Operator console: `sf ui` (default `http://127.0.0.1:3847`)
12
+
13
+ ## Commands
14
+
15
+ From the **repository git root**:
16
+
17
+ ```bash
18
+ sf validate --pipeline examples/plan-review/plan-review.pipeline.yaml --strict
19
+ ```
20
+
21
+ Terminal 1:
22
+
23
+ ```bash
24
+ sf ui
25
+ ```
26
+
27
+ Terminal 2:
28
+
29
+ ```bash
30
+ sf run \
31
+ --pipeline examples/plan-review/plan-review.pipeline.yaml \
32
+ --task examples/plan-review/plan-review.task.yaml
33
+ ```
34
+
35
+ When the first stage blocks on HITL, open the run in the console, review the plan artifact, and accept or reject. Exit code `2` means waiting on operator input.
36
+
37
+ See [docs/hitl.md](../../docs/hitl.md).
@@ -0,0 +1,13 @@
1
+ id: plan-review-followup
2
+ system_prompt: |
3
+ Acknowledge that the prior plan-review stage completed with operator acceptance
4
+ of the plan. Call emit_stage_envelope once with a short summary. Do not call
5
+ ask_operator. Do not perform further HITL.
6
+ model: anthropic/claude-sonnet-4-5
7
+ io:
8
+ input:
9
+ schema:
10
+ type: object
11
+ output:
12
+ schema:
13
+ type: object
@@ -0,0 +1,9 @@
1
+ id: plan-review
2
+ stages:
3
+ - id: plan-review
4
+ entry: true
5
+ route:
6
+ - to: plan-review-followup
7
+ uses: ./plan-review.yaml
8
+ - id: plan-review-followup
9
+ uses: ./plan-review-followup.yaml
@@ -0,0 +1,9 @@
1
+ id: plan-review
2
+ goal: Prove plan-review HITL through artifact-backed accept/reject then follow-up
3
+ context: |
4
+ Operator-console proving task for the plan-review pipeline. The first stage
5
+ must write a plan artifact, gate on ask_operator kind artifact_backed, and
6
+ emit only after accept. The follow-up stage only acknowledges acceptance.
7
+ constraints: |
8
+ Do not skip ask_operator. Do not emit_stage_envelope before plan accept.
9
+ Follow-up must not call ask_operator.
@@ -0,0 +1,25 @@
1
+ id: plan-review
2
+ gate_kinds:
3
+ - artifact_backed
4
+ system_prompt: |
5
+ Your job is to produce a concise feature plan for the task and get operator
6
+ acceptance before completing this stage.
7
+
8
+ 1. Write a concise feature plan via write_stage_artifact to a stage artifact
9
+ path (for example plan.md under stages/plan-review/attempts/1/artifacts/).
10
+ 2. Call ask_operator with kind artifact_backed referencing that artifact path
11
+ so the operator can review the plan.
12
+ 3. On reject or change text: revise the plan artifact and call ask_operator
13
+ again with artifact_backed in this same stage. Do not complete yet.
14
+ 4. Call emit_stage_envelope with an advancing success status only after the
15
+ operator accepts/confirms the plan. Never emit before plan accept.
16
+ 5. Optionally, before the plan gate, you may ask one clarifying free_text or
17
+ multi_question via ask_operator if needed. Never emit before plan accept.
18
+ model: anthropic/claude-sonnet-4-5
19
+ io:
20
+ input:
21
+ schema:
22
+ type: object
23
+ output:
24
+ schema:
25
+ type: object
@@ -0,0 +1,39 @@
1
+ # playwright-mcp
2
+
3
+ One-stage walkthrough: **open a page and screenshot it**, using Microsoft Playwright MCP (`npx @playwright/mcp@latest`) from git-root `.mcp.json`.
4
+
5
+ Playwright's `--output-dir` is interpolated to `STAGEFLOW_STAGE_ARTIFACTS_DIR` (this attempt's artifacts folder). Auto-named snapshots use that directory. A named `browser_take_screenshot` `filename` does **not** — Playwright MCP resolves it against the MCP client workspace (the project checkout). The stage prompt therefore passes `${STAGEFLOW_STAGE_ARTIFACTS_DIR}/page.png` (stamped to an absolute artifacts path at attach) so the PNG lands in the run Files pane instead of the git root.
6
+
7
+ | Stage | MCP | What it does |
8
+ |-------|-----|----------------|
9
+ | `screenshot` | `playwright` | `browser_navigate` → `browser_take_screenshot` (`page.png`) |
10
+
11
+ Completion requires `page.png` on disk. Settings Check (no stage) falls back to `examples/playwright-mcp/.playwright-mcp/` (gitignored).
12
+
13
+ ## Prerequisites
14
+
15
+ - Node.js ≥ 20 and this repo's CLI (`npm run build`), not an older global `sf`
16
+ - Provider auth (`sf ui` → Settings → Providers)
17
+ - First run may download Chromium via Playwright (needs network)
18
+
19
+ Git-root `.mcp.json` already names `playwright`. The stage still passes `mcp: [playwright]` — listing it in the catalog is not attach.
20
+
21
+ Optional: Settings → **Project MCP servers** → Check `playwright` before the run.
22
+
23
+ ## Run (repo root)
24
+
25
+ ```bash
26
+ npm run build
27
+ node dist/cli.js validate --pipeline examples/playwright-mcp/playwright-mcp.pipeline.yaml --strict
28
+ node dist/cli.js run \
29
+ --pipeline examples/playwright-mcp/playwright-mcp.pipeline.yaml \
30
+ --task examples/playwright-mcp/playwright-mcp.task.yaml
31
+ ```
32
+
33
+ Inspect:
34
+
35
+ ```bash
36
+ node dist/cli.js envelope get --run <runId> --stage screenshot --json
37
+ ```
38
+
39
+ The Files row is `page.png`.
@@ -0,0 +1,5 @@
1
+ id: playwright-mcp
2
+ stages:
3
+ - id: screenshot
4
+ uses: ./screenshot.yaml
5
+ mcp: [playwright]
@@ -0,0 +1,4 @@
1
+ id: playwright-mcp
2
+ goal: Open https://google.com and take a screenshot of that page as a PNG artifact.
3
+ context: One-stage Playwright MCP walkthrough. Playwright must save page.png under this attempt's artifacts directory (absolute path in the stage prompt), not the repo root.
4
+ constraints: Use only the playwright server named on the stage. Do not call ask_operator. The screenshot must be page.png in artifacts, not markdown and not the git root.
@@ -0,0 +1,40 @@
1
+ id: screenshot
2
+ system_prompt: |
3
+ Open the URL from the task in Playwright MCP, then take a screenshot.
4
+ Call browser_navigate, then browser_take_screenshot with type png and
5
+ filename exactly ${STAGEFLOW_STAGE_ARTIFACTS_DIR}/page.png — copy that
6
+ path verbatim. Playwright resolves a bare filename like page.png against
7
+ the project checkout (repo root), not --output-dir. Do not pass filename
8
+ page.png without the artifacts-directory prefix. Do not write screenshot.md.
9
+ Do not call write_stage_artifact for the image. Do not call ask_operator.
10
+
11
+ When finished, call emit_stage_envelope exactly once with status success,
12
+ a short summary, payload { "url": "<final page URL>", "screenshot": "page.png" },
13
+ and artifacts listing the run-relative PNG path this session already names
14
+ (stages/screenshot/attempts/<n>/artifacts/page.png). summary and payload are
15
+ handed downstream verbatim. State outcomes and artifact pointers only.
16
+
17
+ Your last tool call in this attempt must be emit_stage_envelope.
18
+ model: cursor/auto
19
+ io:
20
+ input:
21
+ schema:
22
+ type: object
23
+ output:
24
+ schema:
25
+ type: object
26
+ required:
27
+ - url
28
+ - screenshot
29
+ properties:
30
+ url:
31
+ type: string
32
+ screenshot:
33
+ type: string
34
+ verify:
35
+ - id: png
36
+ type: artifact
37
+ path: page.png
38
+ nonempty: true
39
+ when:
40
+ - after