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,104 @@
1
+ # feature-loop
2
+
3
+ Epic-to-PR walkthrough: split a requirements document into stories,
4
+ plan them in parallel, align the plans, implement them **sequentially**,
5
+ verify nothing was missed, review the whole diff, fix review blockers
6
+ (with a send-back loop), then open an operator-approved pull request.
7
+
8
+ This is the shape for work that starts as one epic and must not land
9
+ as overlapping parallel edits. It is repository-neutral — point the
10
+ task `checkout` at a feature branch of whatever tree you are shipping.
11
+ Nothing in the stage files names a product, repo, or keyword.
12
+
13
+ The shipped YAML is two sealed [Clone Chains](../../docs/yaml-catalog.md#clone-chain)
14
+ plus a `{ type: loop }` from `address-feedback` back to `review`. Wiring
15
+ is outbound `route` (`entry`, `clone_cap` / `clone_mode` on emitters).
16
+ `sf validate --strict` against this pipeline is expected to pass.
17
+
18
+ ## Flow
19
+
20
+ ```
21
+ decompose ──Clone Array (parallel)──► plan~N ──Join──► align
22
+ │
23
+ sequential Clone Array │
24
+ ▼
25
+ implement~1 → implement~2 → …
26
+ │
27
+ ▼
28
+ verify → review ⇄ address-feedback → publish
29
+ ```
30
+
31
+ 1. **decompose** — Read the epic (task + requirements doc). Cut 1–8
32
+ stories into a Clone Array (`stories` items `$ref` `story-assignment`).
33
+ Writes `epic-split.md`. Emitter: `clone_cap: 8`, `clone_mode: parallel`.
34
+ 2. **plan** — One Clone Instance per story (`clone_mode: parallel`). Each
35
+ writes `story-plan.md` (edit sites, validation commands, neighbor
36
+ boundaries). No source edits. Entire `io.input.schema` is
37
+ `{ $ref: "#/schemas/story-assignment" }`.
38
+ 3. **align** — Join of every plan Clone Instance. Fix overlapping files and
39
+ contradictions, choose **implementation order**, ask the operator to
40
+ accept. Then this stage is the emitter of the next Clone Chain
41
+ (`clone_mode: sequential`): `stories` items `$ref` `story-work`, with
42
+ `order` / `depends_on` on each item.
43
+ 4. **implement** — Sequential Clone Instances in array order; `~N`
44
+ starts only after `~N-1` succeeded, so earlier edits are already in
45
+ the tree. Each instance executes only its story and must change the
46
+ checkout. Entire `io.input.schema` is `{ $ref: "#/schemas/story-work" }`.
47
+ 5. **verify** — Join of implement Clone Instances. Fail if any aligned
48
+ `story_id` is missing from the instance set or the union diff. Writes
49
+ `coverage.md`.
50
+ 6. **review** — One whole-diff review of every story together
51
+ (ce-code-review style). Report-only. `verdict: pass | changes_required`.
52
+ 7. **address-feedback** — Fix blockers. Envelope `feedback_loop`
53
+ `send_back` to `review` when the tree changed so the whole diff is re-read;
54
+ `continue` when review is clean. Catalog loop:
55
+ `{ type: loop, to: review, max_replays: 2, on_max_replays: wait_for_human,
56
+ replay_session: new_session }`. After two send-backs the run waits
57
+ for an operator decision. `publish` is `replay_safe: false`.
58
+ 8. **publish** — Operator accepts `ship-package.md`, then this same
59
+ attempt commits, pushes the current branch, and opens the PR.
60
+
61
+ No stage before `publish` commits, pushes, or opens a PR. No stage
62
+ creates or switches branches.
63
+
64
+ ## Runtime contracts
65
+
66
+ | Stage | Gate | Required artifacts | Other checks |
67
+ |-------|------|--------------------|--------------|
68
+ | `plan` | — | `story-plan.md` | `io.input` assignment |
69
+ | `implement` | — | `implementation-report.md` | `checkout_changes` |
70
+ | `verify` | — | `coverage.md` | `io.output` |
71
+ | `review` | — | `review-report.md` | whole-diff, report-only |
72
+ | `address-feedback` | — | `review-feedback-report.md` | `{ type: loop }` → `review` |
73
+ | `publish` | `artifact_backed` | `ship-package.md`, `pull-request.md` | `on_verify_fail: manual` |
74
+
75
+ `on_verify_fail` repair (idempotent, 3 attempts) sits on every stage except
76
+ `publish` (`manual` / `side_effecting`). Stage files use `io` / `verify` /
77
+ `on_verify_fail`.
78
+
79
+ Shared JSON Schema lives on the pipeline under `schemas:` —
80
+ `story-assignment` is the first Clone Array item (`plan` input `$ref`);
81
+ `story-work` is the second (`implement` input `$ref`). See
82
+ [YAML catalog — Pipeline schemas](../../docs/yaml-catalog.md#pipeline-schemas)
83
+ and [Clone Chain](../../docs/yaml-catalog.md#clone-chain).
84
+
85
+ ## Run
86
+
87
+ Fill in [`feature-loop.task.yaml`](feature-loop.task.yaml) (epic path,
88
+ publish repo, base branch, `checkout` on the feature branch). Operator
89
+ accepts twice: aligned plans, then the ship package.
90
+
91
+ ```bash
92
+ node dist/cli.js validate --pipeline examples/feature-loop/feature-loop.pipeline.yaml --strict
93
+ node dist/cli.js run \
94
+ --pipeline examples/feature-loop/feature-loop.pipeline.yaml \
95
+ --task examples/feature-loop/feature-loop.task.yaml
96
+ ```
97
+
98
+ Needs a configured provider (`sf providers status`), `gh` on PATH, and
99
+ `GH_TOKEN` or `GITHUB_TOKEN` for the publish stage. Optional: add
100
+ `mcp: [context7]` on the `plan` pipeline entry when `CONTEXT7_API_KEY`
101
+ is set so story plans can query current library docs.
102
+
103
+ Inspect Clone Instance tracks and envelopes in the operator console (`sf ui`)
104
+ on the `plan` and `implement` stages, then the `align` / `verify` Joins.
@@ -0,0 +1,148 @@
1
+ id: address-feedback
2
+ system_prompt: |
3
+ Address every blocking finding from review. This is the only stage
4
+ after implement that may edit the checkout. It is last-mile fixup,
5
+ not a second epic. Do not commit, push, or open a pull request.
6
+
7
+ On success you MUST include feedback_loop in emit_stage_envelope:
8
+ - {"action":"continue"} when verdict was pass, or when you fixed
9
+ every blocker and a further review pass is not needed (no remaining
10
+ blocking risk).
11
+ - {"action":"send_back","target":"review"} when you changed the
12
+ checkout to address blockers — review must re-read the whole diff
13
+ before publish. Do not combine send_back with fork_choice or
14
+
15
+ Reading upstream work: the user prompt contains "Factory run
16
+ workspace: <absolute path>". review-report.md and review payload
17
+ (verdict, blocking_findings) are authoritative. If Feedback Loop
18
+ Context is present, that is a prior send-back: fix what the latest
19
+ review still blocks.
20
+
21
+ Definition of done — every line must hold before you emit success:
22
+ - review-report.md and the review envelope were read.
23
+ - If verdict is pass and blocking_findings is empty: the checkout is
24
+ untouched, fixed_files is empty, addressed_all_blocking is true,
25
+ feedback_loop is continue.
26
+ - If any blocker exists: every blocking_findings entry is fixed, then
27
+ search for other instances of the same category and fix those too.
28
+ git diff is non-empty. Every cited failing check was re-run and
29
+ now passes. addressed_all_blocking is true. feedback_loop is
30
+ send_back to review unless a Feedback Loop Context remaining-replay
31
+ count is already exhausted — then continue only if the latest
32
+ review is actually clean; otherwise emit failure.
33
+ - Every fixed_files entry is a repo-relative checkout path in
34
+ git diff --name-only.
35
+ - review-feedback-report.md was written through write_stage_artifact
36
+ and appears in the emitted artifacts list.
37
+
38
+ 1. Read review-report.md. If every verdict is pass, skip to the
39
+ report step with nothing to fix and continue.
40
+ 2. Fix each blocker at the cited location, then sweep the rest of
41
+ the diff for the same category. No unrelated refactors. Do not
42
+ weaken or delete tests to go green.
43
+ 3. Re-run every command a blocker cited. If a fix cannot complete,
44
+ emit failure — do not present partial remediation as success.
45
+ 4. Call write_stage_artifact with path review-feedback-report.md
46
+ listing each blocker, the fix, the passing re-run, or that there
47
+ was nothing to address.
48
+ 5. Emit exactly once, including the report and inherited evidence,
49
+ with a payload matching the schema and feedback_loop as above.
50
+
51
+ Success requires real checkout edits when blockers existed. Put
52
+ checkout-relative paths in payload.fixed_files. Do not put
53
+ stages/.../artifacts paths there.
54
+
55
+ Contract violations — emit failure rather than presenting these as
56
+ success:
57
+ - addressed_all_blocking: true while any blocker remains unverified.
58
+ - continue after checkout edits that have not been re-reviewed, when
59
+ a send_back replay remains available.
60
+ - send_back when the tree was not changed.
61
+ - A fixed_files entry under stages/.../artifacts/.
62
+
63
+ summary and payload are handed to the next stage verbatim. State
64
+ what was fixed, whether review must run again, and remaining risk.
65
+ Do not repeat this stage's prohibitions in summary.
66
+
67
+ When finished, call emit_stage_envelope exactly once. Your last tool
68
+ call in this attempt must be emit_stage_envelope. An empty final
69
+ message is a stage failure.
70
+ model: cursor/auto
71
+ timeout_ms: 3600000
72
+ io:
73
+ input:
74
+ schema:
75
+ type: object
76
+ required:
77
+ - verdict
78
+ - findings
79
+ - blocking_findings
80
+ - suggestions
81
+ - evidence
82
+ - reviewed_files
83
+ properties:
84
+ verdict:
85
+ type: string
86
+ enum:
87
+ - pass
88
+ - changes_required
89
+ findings:
90
+ type: array
91
+ items:
92
+ type: string
93
+ blocking_findings:
94
+ type: array
95
+ items:
96
+ type: string
97
+ suggestions:
98
+ type: array
99
+ items:
100
+ type: string
101
+ evidence:
102
+ type: array
103
+ items:
104
+ type: string
105
+ reviewed_files:
106
+ type: array
107
+ minItems: 1
108
+ items:
109
+ type: string
110
+ output:
111
+ schema:
112
+ type: object
113
+ required:
114
+ - addressed_all_blocking
115
+ - fixed_files
116
+ - verification_commands
117
+ - remaining_risks
118
+ - sent_back
119
+ properties:
120
+ addressed_all_blocking:
121
+ type: boolean
122
+ fixed_files:
123
+ type: array
124
+ items:
125
+ type: string
126
+ verification_commands:
127
+ type: array
128
+ items:
129
+ type: string
130
+ remaining_risks:
131
+ type: array
132
+ items:
133
+ type: string
134
+ sent_back:
135
+ type: boolean
136
+ verify:
137
+ - id: review-feedback-report-declared
138
+ type: artifact
139
+ basename: review-feedback-report.md
140
+ when:
141
+ - emit
142
+ - id: review-feedback-report
143
+ type: artifact
144
+ path: review-feedback-report.md
145
+ nonempty: true
146
+ when:
147
+ - after
148
+ gate_kinds: []
@@ -0,0 +1,116 @@
1
+ id: align
2
+ system_prompt: |
3
+ You are the join after plan. Read all story plans together,
4
+ fix overlaps and contradictions in the plan artifacts, choose the
5
+ sequential implementation order, and get operator acceptance before any
6
+ source edit. Do not implement, commit, push, or open a pull request.
7
+
8
+ Prior plan envelopes' payload (story_id, planned_files, validation_commands) and
9
+ story-plan.md are authoritative over any prose summary.
10
+
11
+ Reading upstream work: the user prompt contains "Factory run workspace:
12
+ <absolute path>". Read each prior artifact at <Factory run workspace>/
13
+ <artifact path>.
14
+
15
+ Definition of done — every line must hold before you emit success:
16
+ - Every plan envelope and story-plan.md was read.
17
+ - Overlapping planned_files, contradictory approaches, and missing
18
+ epic coverage were resolved by editing the affected story plans via
19
+ write_stage_artifact (new aligned copies named
20
+ story-plan-<story_id>.md in this attempt) — not by hoping implement
21
+ will notice.
22
+ - aligned-plans.md was written through write_stage_artifact, appears
23
+ in the emitted artifacts list, and records the final story set, the
24
+ implementation order, what changed in which plan, and remaining
25
+ risks.
26
+ - payload.stories is a Clone Array of story-work objects, one per
27
+ aligned story, in implementation order. Each item has story_id,
28
+ title, plan_artifact, order (1-based), depends_on, planned_files, and
29
+ validation_commands. The first item has no unmet neighbor
30
+ dependency; later items may depend only on earlier story_ids.
31
+ Encode order in each item; do not emit a sibling implementation_order
32
+ or story_ids array.
33
+ - remaining_risks is a string. approved is a boolean. alignment_notes
34
+ is a string.
35
+ - The operator accepted aligned-plans.md through artifact_backed, and
36
+ that accepted decision is recorded inside the artifact.
37
+
38
+ 1. Read every plan envelope and story-plan.md. Diff planned_files across stories. Flag overlap, gaps
39
+ against epic-split.md, and validation commands that do not exist
40
+ in this repo.
41
+ 2. Rewrite any story plan that needs a fix into
42
+ story-plan-<story_id>.md via write_stage_artifact. Unchanged plans
43
+ are still copied so implement reads from this attempt.
44
+ 3. Choose a sequential order that respects neighbor_dependencies and
45
+ file coupling (shared types and contracts first). Put that order
46
+ on each stories item as order and depends_on.
47
+ 4. Call write_stage_artifact with path aligned-plans.md covering the
48
+ matrix of stories, order, diffs you made, and why sequential
49
+ implement will not thrash shared files.
50
+ 5. Call ask_operator with kind artifact_backed referencing
51
+ aligned-plans.md. Ask whether this set and order are ready to
52
+ implement. On reject or change text: revise artifacts and ask
53
+ again in this same stage. Never emit before accept.
54
+ 6. After explicit acceptance, rewrite aligned-plans.md to include an
55
+ operator-decision section (accepted wording and any conditions).
56
+ Then emit the stories Clone Array plus approved, alignment_notes,
57
+ and remaining_risks as scalars.
58
+
59
+ Required files must be created with write_stage_artifact. Checkout
60
+ write/edit does not satisfy after-phase verify.
61
+
62
+ this same attempt. Do not pause after accept. Do not ask_operator for
63
+ emit/schema errors.
64
+
65
+ summary and payload are handed to the next stage verbatim. State the
66
+ approved story set, order, and artifact pointers only. Do not repeat
67
+ this stage's prohibitions in summary.
68
+
69
+ When finished, call emit_stage_envelope exactly once. Your last tool
70
+ call in this attempt must be emit_stage_envelope (or ask_operator if
71
+ waiting on HITL). An empty final message is a stage failure.
72
+ model: cursor/auto
73
+ timeout_ms: 3600000
74
+ io:
75
+ input:
76
+ schema:
77
+ type: object
78
+ output:
79
+ schema:
80
+ type: object
81
+ required:
82
+ - stories
83
+ - approved
84
+ - alignment_notes
85
+ - remaining_risks
86
+ properties:
87
+ stories:
88
+ type: array
89
+ items:
90
+ $ref: "#/schemas/story-work"
91
+ approved:
92
+ type: boolean
93
+ alignment_notes:
94
+ type: string
95
+ remaining_risks:
96
+ type: string
97
+ verify:
98
+ - id: plans-approved
99
+ type: gate
100
+ kind: artifact_backed
101
+ when:
102
+ - emit
103
+ - after
104
+ - id: aligned-plans-declared
105
+ type: artifact
106
+ basename: aligned-plans.md
107
+ when:
108
+ - emit
109
+ - id: aligned-plans
110
+ type: artifact
111
+ path: aligned-plans.md
112
+ nonempty: true
113
+ when:
114
+ - after
115
+ gate_kinds:
116
+ - artifact_backed
@@ -0,0 +1,86 @@
1
+ id: decompose
2
+ system_prompt: |
3
+ Split the task's requirements document (the epic) into independent
4
+ implementation stories for the next stage to plan. Do not write story plans here, edit source, commit, push, or
5
+ open a pull request.
6
+
7
+ There is no prior stage. The task goal, context, and constraints name
8
+ the epic: a requirements path, pasted epic, or equivalent. Read that
9
+ document from the checkout when a path is given, plus the files and
10
+ neighbors the epic implies. A split that restates the epic without
11
+ grounding it in the real tree is not done.
12
+
13
+ Definition of done — every line must hold before you emit success:
14
+ - epic-split.md was written through write_stage_artifact and appears in
15
+ the emitted artifacts list.
16
+ - payload.stories is an array of 1–8 story-assignment objects. Each item
17
+ has story_id, title, epic_slice, acceptance, neighboring_story_ids, and
18
+ constraints. Do not emit a parallel story_ids string array.
19
+ - Each story is a slice the next stage can plan in isolation: one
20
+ story_id (stable kebab-case), a title, an epic_slice that quotes or
21
+ paraphrases only the epic text that slice owns, acceptance the
22
+ implementer can falsify, neighboring_story_ids it must not steal
23
+ work from, and constraints that clone must honor.
24
+ - Stories do not overlap files or acceptance. Together they cover the
25
+ epic; leftover epic text with no owner is a contract violation.
26
+ - Emit 1–8 stories. Never zero stories, never more than eight.
27
+
28
+ 1. Read the task and the named requirements document in the checkout.
29
+ Map the epic onto real files before cutting stories.
30
+ 2. Cut 1–8 stories. Prefer seams the checkout already has (modules,
31
+ APIs, UI vs runtime, tests vs prod) over arbitrary chapter splits.
32
+ If the epic is one tight change, emit one story — do not invent filler
33
+ stories.
34
+ 3. Call write_stage_artifact with path epic-split.md listing each
35
+ story_id, title, owned epic text, likely files, acceptance, and why
36
+ the slices can be planned in parallel.
37
+ 4. Emit exactly one success envelope with payload matching the schema,
38
+ artifacts containing epic-split.md, and stories as those objects in
39
+ deterministic order. Sibling fields requirements_source and
40
+ split_rationale are strings only.
41
+
42
+ Required files must be created with write_stage_artifact. Checkout
43
+ write/edit does not satisfy after-phase verify.
44
+
45
+ summary and payload are handed to the next stage verbatim. State
46
+ outcomes and artifact pointers only. Do not repeat this stage's
47
+ prohibitions in summary — downstream will obey them literally.
48
+
49
+ When finished, call emit_stage_envelope exactly once with status,
50
+ this attempt must be emit_stage_envelope. An empty final message is a
51
+ stage failure.
52
+ model: cursor/auto
53
+ timeout_ms: 3600000
54
+ io:
55
+ input:
56
+ schema:
57
+ type: object
58
+ output:
59
+ schema:
60
+ type: object
61
+ required:
62
+ - stories
63
+ - requirements_source
64
+ - split_rationale
65
+ properties:
66
+ stories:
67
+ type: array
68
+ items:
69
+ $ref: "#/schemas/story-assignment"
70
+ requirements_source:
71
+ type: string
72
+ split_rationale:
73
+ type: string
74
+ verify:
75
+ - id: epic-split-declared
76
+ type: artifact
77
+ basename: epic-split.md
78
+ when:
79
+ - emit
80
+ - id: epic-split
81
+ type: artifact
82
+ path: epic-split.md
83
+ nonempty: true
84
+ when:
85
+ - after
86
+ gate_kinds: []
@@ -0,0 +1,58 @@
1
+ id: default-model-hierarchy
2
+ goal: >
3
+ Implement default model resolution across Stageflow YAML layers so a
4
+ model can be set once on stageflow.yaml or a pipeline and inherited by
5
+ stages that omit model. Resolution priority must be stage first, then
6
+ pipeline, then the global stageflow.yaml default. Split the work into
7
+ stories, plan each story, align the plans, implement them in the agreed
8
+ order, verify coverage, review the whole diff, address review feedback,
9
+ and open an operator-approved pull request.
10
+ context: |
11
+ This repository is Stageflow itself (tejasghutukade/stageflow). The
12
+ checkout for this run is a dedicated git worktree already on branch
13
+ scratch/extra-workspace, tracking origin/main.
14
+
15
+ Epic (pasted — treat this block as the requirements document):
16
+
17
+ Today every stage must declare model (string). Omitting it fails load.
18
+ There is no pipeline-level or stageflow.yaml default for model. The
19
+ agent backend already resolves as stage > pipeline > global > "pi";
20
+ model needs the same shape of hierarchy, without reusing the agent key.
21
+
22
+ Required behavior:
23
+ 1. Optional top-level model on stageflow.yaml (global default).
24
+ 2. Optional top-level model on *.pipeline.yaml (pipeline default for
25
+ all stages in that pipeline).
26
+ 3. Stage model remains allowed on inline stage bodies and external
27
+ stage YAML, but becomes optional when a higher default can fill it.
28
+ 4. Effective resolution for each stage at load or run time:
29
+ stage.model ?? pipeline.model ?? stageflow.yaml model.
30
+ If still unset after that chain, load/run must fail with a clear
31
+ error — never invent a silent hardcoded model string.
32
+ 5. Priority is always stage override, then pipeline, then global.
33
+
34
+ Likely touch points (verify against the tree; do not assume line
35
+ numbers): src/types/stageflowManifest.ts, src/types/pipeline.ts,
36
+ src/types for StageConfig, src/config/loadStageflowManifest.ts,
37
+ src/config load/merge pipeline helpers, src/config/loadStage.ts,
38
+ resolveAgentPort.ts (pattern to mirror for model, not to conflate),
39
+ stage worker / adapters that read stage.model, docs/yaml-catalog.md,
40
+ fixtures under tests/fixtures/, and any create/init surfaces that
41
+ currently require stage model.
42
+
43
+ Keep model (LLM id string) distinct from agent (pi | claude backend).
44
+
45
+ - Publish target: tejasghutukade/stageflow
46
+ - Base branch: main
47
+ - Head branch: the checkout's current branch (do not create or switch)
48
+ constraints: |
49
+ Do not create, rename, or switch branches — the checkout is already
50
+ on the correct feature branch (scratch/extra-workspace).
51
+ Do not commit, push, or open a pull request except in publish, and
52
+ only after the operator accepts ship-package.md.
53
+ Do not expand scope past the epic. Story plans and sequential
54
+ implement clones must stay inside their assigned slices.
55
+ Do not change agent-backend resolution semantics except where
56
+ documentation must clarify that model and agent are separate.
57
+ publish_repo and base_branch must be the values named here, never guessed.
58
+ checkout: /Users/tejasghutukade/Projects/software-factory/.worktrees/scratch/extra-workspace
@@ -0,0 +1,140 @@
1
+ id: feature-loop
2
+ schemas:
3
+ story-assignment:
4
+ type: object
5
+ required:
6
+ - story_id
7
+ - title
8
+ - epic_slice
9
+ - acceptance
10
+ - neighboring_story_ids
11
+ - constraints
12
+ properties:
13
+ story_id:
14
+ type: string
15
+ title:
16
+ type: string
17
+ epic_slice:
18
+ type: string
19
+ acceptance:
20
+ type: string
21
+ neighboring_story_ids:
22
+ type: array
23
+ items:
24
+ type: string
25
+ constraints:
26
+ type: array
27
+ items:
28
+ type: string
29
+ story-work:
30
+ type: object
31
+ required:
32
+ - story_id
33
+ - title
34
+ - plan_artifact
35
+ - order
36
+ - depends_on
37
+ - planned_files
38
+ - validation_commands
39
+ properties:
40
+ story_id:
41
+ type: string
42
+ title:
43
+ type: string
44
+ plan_artifact:
45
+ type: string
46
+ order:
47
+ type: integer
48
+ minimum: 1
49
+ depends_on:
50
+ type: array
51
+ items:
52
+ type: string
53
+ planned_files:
54
+ type: array
55
+ items:
56
+ type: string
57
+ validation_commands:
58
+ type: array
59
+ items:
60
+ type: string
61
+ stages:
62
+ - id: decompose
63
+ uses: ./decompose.yaml
64
+ entry: true
65
+ clone_cap: 8
66
+ clone_mode: parallel
67
+ route:
68
+ - to: plan
69
+ on_verify_fail:
70
+ mode: repair
71
+ max_attempts: 3
72
+ retry_safety: idempotent
73
+ include_failed_checks: true
74
+ - id: plan
75
+ uses: ./plan.yaml
76
+ route:
77
+ - to: align
78
+ on_verify_fail:
79
+ mode: repair
80
+ max_attempts: 3
81
+ retry_safety: idempotent
82
+ include_failed_checks: true
83
+ - id: align
84
+ uses: ./align.yaml
85
+ clone_cap: 8
86
+ clone_mode: sequential
87
+ route:
88
+ - to: implement
89
+ on_verify_fail:
90
+ mode: repair
91
+ max_attempts: 3
92
+ retry_safety: idempotent
93
+ include_failed_checks: true
94
+ - id: implement
95
+ uses: ./implement.yaml
96
+ route:
97
+ - to: verify
98
+ on_verify_fail:
99
+ mode: repair
100
+ max_attempts: 3
101
+ retry_safety: idempotent
102
+ include_failed_checks: true
103
+ - id: verify
104
+ uses: ./verify.yaml
105
+ route:
106
+ - to: review
107
+ on_verify_fail:
108
+ mode: repair
109
+ max_attempts: 3
110
+ retry_safety: idempotent
111
+ include_failed_checks: true
112
+ - id: review
113
+ uses: ./review.yaml
114
+ route:
115
+ - to: address-feedback
116
+ on_verify_fail:
117
+ mode: repair
118
+ max_attempts: 3
119
+ retry_safety: idempotent
120
+ include_failed_checks: true
121
+ - id: address-feedback
122
+ uses: ./address-feedback.yaml
123
+ route:
124
+ - to: publish
125
+ - type: loop
126
+ to: review
127
+ max_replays: 2
128
+ on_max_replays: wait_for_human
129
+ replay_session: new_session
130
+ on_verify_fail:
131
+ mode: repair
132
+ max_attempts: 3
133
+ retry_safety: idempotent
134
+ include_failed_checks: true
135
+ - id: publish
136
+ uses: ./publish.yaml
137
+ on_verify_fail:
138
+ mode: manual
139
+ retry_safety: side_effecting
140
+ replay_safe: false
@@ -0,0 +1,25 @@
1
+ id: feature-loop
2
+ goal: >
3
+ Implement the epic in the requirements document named in context:
4
+ split it into stories, plan each story, align the plans, implement
5
+ them in the agreed order, verify coverage, review the whole diff,
6
+ address review feedback, and open an operator-approved pull request.
7
+ context: |
8
+ Point this task at a real checkout already on the feature branch.
9
+ Name the requirements/epic path (checkout-relative), the publish
10
+ repository (owner/name), and the base branch.
11
+
12
+ Replace the placeholders below before running:
13
+
14
+ - Requirements/epic: <path-to-requirements.md>
15
+ - Publish target: <owner/repo>
16
+ - Base branch: main
17
+ - Head branch: the checkout's current branch (do not create or switch)
18
+ constraints: |
19
+ Do not create, rename, or switch branches — the checkout is already
20
+ on the correct feature branch.
21
+ Do not commit, push, or open a pull request except in publish, and
22
+ only after the operator accepts ship-package.md.
23
+ Do not expand scope past the epic. Story plans and sequential
24
+ implement clones must stay inside their assigned slices.
25
+ publish_repo and base_branch must be the values named here, never guessed.