stageflow 0.25.0 → 0.30.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 (681) hide show
  1. package/README.md +14 -3
  2. package/builtin-skills/browser/SKILL.md +42 -0
  3. package/dist/a2a/contracts.d.ts +1 -0
  4. package/dist/a2a/contracts.js +1 -0
  5. package/dist/a2a/registry.d.ts +2 -0
  6. package/dist/a2a/registry.js +20 -1
  7. package/dist/a2a/server.d.ts +7 -0
  8. package/dist/a2a/server.js +5 -2
  9. package/dist/a2a/service.d.ts +1 -1
  10. package/dist/a2a/service.js +57 -8
  11. package/dist/a2a/store.d.ts +8 -5
  12. package/dist/a2a/store.js +24 -67
  13. package/dist/agent/activity.d.ts +3 -0
  14. package/dist/agent/bootProviderConfig.d.ts +21 -0
  15. package/dist/agent/bootProviderConfig.js +74 -0
  16. package/dist/agent/claudeAdapter.js +2 -2
  17. package/dist/agent/cursorProvider.d.ts +2 -0
  18. package/dist/agent/cursorProvider.js +30 -5
  19. package/dist/agent/fakeAgent.d.ts +1 -0
  20. package/dist/agent/fakeAgent.js +13 -0
  21. package/dist/agent/piAdapter.d.ts +11 -24
  22. package/dist/agent/piAdapter.js +107 -50
  23. package/dist/agent/piIsolatedMcp.d.ts +2 -0
  24. package/dist/agent/piIsolatedMcp.js +10 -2
  25. package/dist/agent/piSessionFactory.d.ts +38 -0
  26. package/dist/agent/piSessionFactory.js +60 -0
  27. package/dist/agent/port.d.ts +8 -0
  28. package/dist/agent/streamLogRedact.d.ts +7 -1
  29. package/dist/agent/streamLogRedact.js +26 -11
  30. package/dist/browser/anchor.d.ts +27 -0
  31. package/dist/browser/anchor.js +127 -0
  32. package/dist/browser/auditSink.d.ts +38 -0
  33. package/dist/browser/auditSink.js +34 -0
  34. package/dist/browser/browserHost.d.ts +86 -0
  35. package/dist/browser/browserHost.js +7 -0
  36. package/dist/browser/browserSweep.d.ts +14 -0
  37. package/dist/browser/browserSweep.js +54 -0
  38. package/dist/browser/browserTeardown.d.ts +56 -0
  39. package/dist/browser/browserTeardown.js +235 -0
  40. package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
  41. package/dist/browser/fakeRemoteBrowserHost.js +34 -0
  42. package/dist/browser/gateHandoff.d.ts +25 -0
  43. package/dist/browser/gateHandoff.js +83 -0
  44. package/dist/browser/humanLogin.d.ts +18 -0
  45. package/dist/browser/humanLogin.js +34 -0
  46. package/dist/browser/keyProvider.d.ts +10 -0
  47. package/dist/browser/keyProvider.js +39 -0
  48. package/dist/browser/localBrowserHost.d.ts +10 -0
  49. package/dist/browser/localBrowserHost.js +152 -0
  50. package/dist/browser/localProfileLock.d.ts +2 -0
  51. package/dist/browser/localProfileLock.js +218 -0
  52. package/dist/browser/localProfileStore.d.ts +5 -0
  53. package/dist/browser/localProfileStore.js +91 -0
  54. package/dist/browser/loginCheck.d.ts +53 -0
  55. package/dist/browser/loginCheck.js +147 -0
  56. package/dist/browser/memoryProfileLock.d.ts +2 -0
  57. package/dist/browser/memoryProfileLock.js +53 -0
  58. package/dist/browser/memoryProfileStore.d.ts +2 -0
  59. package/dist/browser/memoryProfileStore.js +31 -0
  60. package/dist/browser/navigationAudit.d.ts +16 -0
  61. package/dist/browser/navigationAudit.js +53 -0
  62. package/dist/browser/persistedEnv.d.ts +3 -0
  63. package/dist/browser/persistedEnv.js +15 -0
  64. package/dist/browser/profileLock.d.ts +40 -0
  65. package/dist/browser/profileLock.js +10 -0
  66. package/dist/browser/profileStore.d.ts +23 -0
  67. package/dist/browser/profileStore.js +39 -0
  68. package/dist/browser/runLiveness.d.ts +13 -0
  69. package/dist/browser/runLiveness.js +39 -0
  70. package/dist/browser/sitePolicy.d.ts +10 -0
  71. package/dist/browser/sitePolicy.js +61 -0
  72. package/dist/browser/stageBrowserEnv.d.ts +22 -0
  73. package/dist/browser/stageBrowserEnv.js +147 -0
  74. package/dist/browser/stageProfileLock.d.ts +17 -0
  75. package/dist/browser/stageProfileLock.js +39 -0
  76. package/dist/cli/artifactCommand.js +9 -16
  77. package/dist/cli/backupCommand.d.ts +9 -0
  78. package/dist/cli/backupCommand.js +111 -0
  79. package/dist/cli/browserCommand.d.ts +44 -0
  80. package/dist/cli/browserCommand.js +472 -0
  81. package/dist/cli/debugRunCommand.d.ts +10 -0
  82. package/dist/cli/debugRunCommand.js +109 -0
  83. package/dist/cli/doctorCommand.d.ts +32 -0
  84. package/dist/cli/doctorCommand.js +453 -0
  85. package/dist/cli/envelopeCommand.js +9 -2
  86. package/dist/cli/exportAllCommand.d.ts +55 -0
  87. package/dist/cli/exportAllCommand.js +218 -0
  88. package/dist/cli/exportRunCommand.js +23 -21
  89. package/dist/cli/hostClient.d.ts +41 -3
  90. package/dist/cli/hostClient.js +129 -14
  91. package/dist/cli/initCommand.d.ts +1 -0
  92. package/dist/cli/initCommand.js +23 -7
  93. package/dist/cli/initTemplates.d.ts +5 -2
  94. package/dist/cli/initTemplates.js +32 -2
  95. package/dist/cli/resolveSafeOutPath.d.ts +2 -0
  96. package/dist/cli/resolveSafeOutPath.js +40 -0
  97. package/dist/cli/restoreCommand.d.ts +10 -0
  98. package/dist/cli/restoreCommand.js +90 -0
  99. package/dist/cli/runCommand.d.ts +3 -2
  100. package/dist/cli/runCommand.js +93 -11
  101. package/dist/cli/runOutput.d.ts +4 -0
  102. package/dist/cli/runOutput.js +33 -7
  103. package/dist/cli/runStageCommand.d.ts +1 -0
  104. package/dist/cli/runStageCommand.js +44 -25
  105. package/dist/cli/runsCommand.d.ts +1 -1
  106. package/dist/cli/runsCommand.js +168 -10
  107. package/dist/cli/triggerCommand.d.ts +12 -0
  108. package/dist/cli/triggerCommand.js +183 -0
  109. package/dist/cli/validateCommand.d.ts +1 -1
  110. package/dist/cli/validateCommand.js +23 -6
  111. package/dist/cli.js +202 -32
  112. package/dist/config/browseCatalog.d.ts +1 -0
  113. package/dist/config/browseCatalog.js +5 -4
  114. package/dist/config/builtinSkills.d.ts +4 -0
  115. package/dist/config/builtinSkills.js +23 -0
  116. package/dist/config/catalogRelativePath.d.ts +63 -0
  117. package/dist/config/catalogRelativePath.js +126 -0
  118. package/dist/config/configOrigin.d.ts +27 -0
  119. package/dist/config/configOrigin.js +59 -0
  120. package/dist/config/createTrigger.d.ts +27 -0
  121. package/dist/config/createTrigger.js +232 -0
  122. package/dist/config/draftPackage.d.ts +117 -0
  123. package/dist/config/draftPackage.js +550 -0
  124. package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
  125. package/dist/config/ensureCatalogScanRoot.js +73 -0
  126. package/dist/config/hostConfig.d.ts +57 -0
  127. package/dist/config/hostConfig.js +360 -0
  128. package/dist/config/listSkills.d.ts +26 -0
  129. package/dist/config/listSkills.js +206 -5
  130. package/dist/config/loadOutcome.d.ts +7 -1
  131. package/dist/config/loadPipeline.js +39 -2
  132. package/dist/config/loadStage.js +25 -0
  133. package/dist/config/loadStageflowManifest.js +25 -0
  134. package/dist/config/loadTask.d.ts +2 -0
  135. package/dist/config/loadTask.js +57 -18
  136. package/dist/config/loadTrigger.d.ts +9 -0
  137. package/dist/config/loadTrigger.js +120 -0
  138. package/dist/config/materializeStageModels.js +5 -1
  139. package/dist/config/mergePipelineIncludes.d.ts +3 -0
  140. package/dist/config/mergePipelineIncludes.js +19 -0
  141. package/dist/config/migrateYaml.js +6 -11
  142. package/dist/config/multiProjectCatalog.d.ts +32 -0
  143. package/dist/config/multiProjectCatalog.js +150 -0
  144. package/dist/config/normalizePipelineStageEntry.js +27 -1
  145. package/dist/config/parseCompletionContract.js +6 -0
  146. package/dist/config/pipelineStageKeys.js +3 -0
  147. package/dist/config/publishDraftPackage.d.ts +7 -0
  148. package/dist/config/publishDraftPackage.js +25 -0
  149. package/dist/config/resolveCatalogContext.js +1 -1
  150. package/dist/config/resolveCatalogRoots.d.ts +27 -0
  151. package/dist/config/resolveCatalogRoots.js +76 -0
  152. package/dist/config/resolveModel.d.ts +7 -1
  153. package/dist/config/resolveModel.js +11 -1
  154. package/dist/config/resolvePipelineDag.js +1 -1
  155. package/dist/config/resolveStageMcpServers.d.ts +9 -1
  156. package/dist/config/resolveStageMcpServers.js +36 -9
  157. package/dist/config/scanCatalogPaths.d.ts +1 -1
  158. package/dist/config/scanCatalogPaths.js +6 -2
  159. package/dist/config/secretFromEnvOrFile.d.ts +9 -0
  160. package/dist/config/secretFromEnvOrFile.js +34 -0
  161. package/dist/config/seededCatalog.d.ts +11 -0
  162. package/dist/config/seededCatalog.js +29 -0
  163. package/dist/config/stageBrowser.d.ts +12 -0
  164. package/dist/config/stageBrowser.js +118 -0
  165. package/dist/config/toolRequires.d.ts +24 -0
  166. package/dist/config/toolRequires.js +115 -0
  167. package/dist/config/triggerCatalog.d.ts +10 -0
  168. package/dist/config/triggerCatalog.js +37 -0
  169. package/dist/config/validateCatalog.d.ts +17 -3
  170. package/dist/config/validateCatalog.js +223 -3
  171. package/dist/config/validateCompletionContract.js +8 -0
  172. package/dist/diagnostics/checks.d.ts +39 -0
  173. package/dist/diagnostics/checks.js +135 -0
  174. package/dist/envelope/preEmitChecks.d.ts +1 -1
  175. package/dist/envelope/preEmitChecks.js +8 -0
  176. package/dist/errors/codes.d.ts +14 -0
  177. package/dist/errors/codes.js +59 -0
  178. package/dist/git/cache.d.ts +14 -0
  179. package/dist/git/cache.js +150 -0
  180. package/dist/git/credentials.d.ts +9 -0
  181. package/dist/git/credentials.js +88 -0
  182. package/dist/git/errors.d.ts +20 -0
  183. package/dist/git/errors.js +94 -0
  184. package/dist/git/exec.d.ts +16 -0
  185. package/dist/git/exec.js +135 -0
  186. package/dist/git/operations.d.ts +29 -0
  187. package/dist/git/operations.js +153 -0
  188. package/dist/git/version.d.ts +1 -0
  189. package/dist/git/version.js +10 -0
  190. package/dist/logging/audit.d.ts +16 -0
  191. package/dist/logging/audit.js +19 -0
  192. package/dist/logging/commonWords.d.ts +2 -0
  193. package/dist/logging/commonWords.js +13 -0
  194. package/dist/logging/logger.d.ts +49 -0
  195. package/dist/logging/logger.js +193 -0
  196. package/dist/logging/namedSecrets.d.ts +6 -0
  197. package/dist/logging/namedSecrets.js +58 -0
  198. package/dist/logging/redact.d.ts +17 -0
  199. package/dist/logging/redact.js +105 -0
  200. package/dist/mcp/catalogTools.js +492 -81
  201. package/dist/mcp/checkoutTools.d.ts +52 -0
  202. package/dist/mcp/checkoutTools.js +332 -0
  203. package/dist/mcp/controlTools.js +182 -6
  204. package/dist/mcp/deps.d.ts +3 -0
  205. package/dist/mcp/getStartedTool.d.ts +3 -0
  206. package/dist/mcp/getStartedTool.js +62 -0
  207. package/dist/mcp/readArtifact.d.ts +11 -0
  208. package/dist/mcp/readArtifact.js +46 -30
  209. package/dist/mcp/server.js +2 -0
  210. package/dist/mcp/tools.js +6 -0
  211. package/dist/mcp/triggerTools.d.ts +3 -0
  212. package/dist/mcp/triggerTools.js +176 -0
  213. package/dist/net/proxy.d.ts +14 -0
  214. package/dist/net/proxy.js +78 -0
  215. package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
  216. package/dist/operatorAgent/docsRetrieval.js +269 -0
  217. package/dist/operatorAgent/draftContext.d.ts +16 -0
  218. package/dist/operatorAgent/draftContext.js +68 -0
  219. package/dist/operatorAgent/fakeHost.d.ts +39 -0
  220. package/dist/operatorAgent/fakeHost.js +92 -0
  221. package/dist/operatorAgent/host.d.ts +40 -0
  222. package/dist/operatorAgent/host.js +179 -0
  223. package/dist/operatorAgent/index.d.ts +9 -0
  224. package/dist/operatorAgent/index.js +8 -0
  225. package/dist/operatorAgent/piModel.d.ts +80 -0
  226. package/dist/operatorAgent/piModel.js +528 -0
  227. package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
  228. package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
  229. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
  230. package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
  231. package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
  232. package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
  233. package/dist/operatorAgent/proposals.d.ts +32 -0
  234. package/dist/operatorAgent/proposals.js +144 -0
  235. package/dist/operatorAgent/types.d.ts +128 -0
  236. package/dist/operatorAgent/types.js +1 -0
  237. package/dist/package-meta.d.ts +2 -1
  238. package/dist/package-meta.js +2 -1
  239. package/dist/preflight/bash.d.ts +8 -0
  240. package/dist/preflight/bash.js +34 -0
  241. package/dist/preflight/claudeRoot.d.ts +11 -0
  242. package/dist/preflight/claudeRoot.js +23 -0
  243. package/dist/preflight/mcpCommands.d.ts +8 -0
  244. package/dist/preflight/mcpCommands.js +36 -0
  245. package/dist/preflight/pipelinePreflight.d.ts +40 -0
  246. package/dist/preflight/pipelinePreflight.js +192 -0
  247. package/dist/preflight/tls.d.ts +6 -0
  248. package/dist/preflight/tls.js +18 -0
  249. package/dist/preflight/toolchain.d.ts +45 -0
  250. package/dist/preflight/toolchain.js +219 -0
  251. package/dist/project/findManifestRoot.d.ts +3 -0
  252. package/dist/project/findManifestRoot.js +35 -0
  253. package/dist/project/findProjectRoot.js +3 -4
  254. package/dist/project/globalHome.d.ts +7 -0
  255. package/dist/project/globalHome.js +63 -2
  256. package/dist/project/resolveProjectContext.js +2 -2
  257. package/dist/project/resolveStageflowContext.d.ts +7 -0
  258. package/dist/project/resolveStageflowContext.js +46 -30
  259. package/dist/projection/projectRun.d.ts +2 -1
  260. package/dist/projection/projectRun.js +1 -0
  261. package/dist/runstore/assertTmpdir.d.ts +1 -0
  262. package/dist/runstore/assertTmpdir.js +25 -0
  263. package/dist/runstore/backup.d.ts +52 -0
  264. package/dist/runstore/backup.js +292 -0
  265. package/dist/runstore/createStore.d.ts +18 -1
  266. package/dist/runstore/createStore.js +64 -5
  267. package/dist/runstore/debugBundle.d.ts +60 -0
  268. package/dist/runstore/debugBundle.js +143 -0
  269. package/dist/runstore/diskUsage.d.ts +50 -0
  270. package/dist/runstore/diskUsage.js +214 -0
  271. package/dist/runstore/exportRunPayload.d.ts +8 -0
  272. package/dist/runstore/exportRunPayload.js +23 -0
  273. package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
  274. package/dist/runstore/normalizeCatalogPath.js +10 -0
  275. package/dist/runstore/paths.d.ts +5 -0
  276. package/dist/runstore/paths.js +145 -1
  277. package/dist/runstore/port.d.ts +139 -13
  278. package/dist/runstore/port.js +8 -1
  279. package/dist/runstore/restore.d.ts +81 -0
  280. package/dist/runstore/restore.js +355 -0
  281. package/dist/runstore/retention.d.ts +27 -0
  282. package/dist/runstore/retention.js +74 -0
  283. package/dist/runstore/runManifest.d.ts +146 -0
  284. package/dist/runstore/runManifest.js +288 -0
  285. package/dist/runstore/runProjection.d.ts +3 -1
  286. package/dist/runstore/runProjection.js +63 -1
  287. package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
  288. package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
  289. package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
  290. package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
  291. package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
  292. package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
  293. package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
  294. package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
  295. package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
  296. package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
  297. package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
  298. package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
  299. package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
  300. package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
  301. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
  302. package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
  303. package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
  304. package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
  305. package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
  306. package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
  307. package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
  308. package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
  309. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
  310. package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
  311. package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
  312. package/dist/runstore/sqlite/migrations/index.js +78 -0
  313. package/dist/runstore/sqlite/schema.d.ts +20 -1
  314. package/dist/runstore/sqlite/schema.js +277 -1
  315. package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
  316. package/dist/runstore/sqlite/storeOpenError.js +11 -0
  317. package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
  318. package/dist/runstore/sqlite/storeSchemaError.js +8 -0
  319. package/dist/runstore/stageExecution.js +3 -0
  320. package/dist/runstore/storeFilesystem.d.ts +32 -0
  321. package/dist/runstore/storeFilesystem.js +148 -0
  322. package/dist/runstore/trackProjection.js +2 -0
  323. package/dist/runstore/workspaceLayout.d.ts +13 -0
  324. package/dist/runstore/workspaceLayout.js +76 -0
  325. package/dist/runtime/answerResume.d.ts +1 -0
  326. package/dist/runtime/answerResume.js +3 -1
  327. package/dist/runtime/completionCheckRunner.d.ts +15 -1
  328. package/dist/runtime/completionCheckRunner.js +67 -7
  329. package/dist/runtime/containerLimits.d.ts +16 -0
  330. package/dist/runtime/containerLimits.js +84 -0
  331. package/dist/runtime/credentialBinding.d.ts +2 -0
  332. package/dist/runtime/credentialBinding.js +3 -0
  333. package/dist/runtime/credentialMaterialisation.d.ts +28 -0
  334. package/dist/runtime/credentialMaterialisation.js +128 -0
  335. package/dist/runtime/emailSource.d.ts +72 -0
  336. package/dist/runtime/emailSource.js +304 -0
  337. package/dist/runtime/gitCheckoutCapability.js +7 -13
  338. package/dist/runtime/githubPollSource.d.ts +86 -0
  339. package/dist/runtime/githubPollSource.js +284 -0
  340. package/dist/runtime/pipelineRunner.d.ts +40 -1
  341. package/dist/runtime/pipelineRunner.js +181 -17
  342. package/dist/runtime/pipelineScheduler.d.ts +17 -0
  343. package/dist/runtime/pipelineScheduler.js +220 -28
  344. package/dist/runtime/reloadRunCatalog.js +6 -1
  345. package/dist/runtime/repositoryMaterialize.d.ts +47 -0
  346. package/dist/runtime/repositoryMaterialize.js +235 -0
  347. package/dist/runtime/resumeTimedOut.d.ts +1 -1
  348. package/dist/runtime/resumeTimedOut.js +5 -2
  349. package/dist/runtime/runChangeBus.js +9 -0
  350. package/dist/runtime/runDeletion.d.ts +7 -0
  351. package/dist/runtime/runDeletion.js +37 -0
  352. package/dist/runtime/runManager.d.ts +169 -4
  353. package/dist/runtime/runManager.js +1748 -83
  354. package/dist/runtime/runRetentionSweep.d.ts +31 -0
  355. package/dist/runtime/runRetentionSweep.js +328 -0
  356. package/dist/runtime/runRetryCoordinator.d.ts +4 -0
  357. package/dist/runtime/runRetryCoordinator.js +20 -2
  358. package/dist/runtime/runSkills.d.ts +40 -0
  359. package/dist/runtime/runSkills.js +173 -0
  360. package/dist/runtime/scheduleSource.d.ts +38 -0
  361. package/dist/runtime/scheduleSource.js +119 -0
  362. package/dist/runtime/settingsFile.d.ts +5 -0
  363. package/dist/runtime/settingsFile.js +61 -54
  364. package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
  365. package/dist/runtime/stageAttemptBootstrap.js +250 -27
  366. package/dist/runtime/stageCacheEnv.d.ts +6 -0
  367. package/dist/runtime/stageCacheEnv.js +34 -0
  368. package/dist/runtime/stageConcurrency.d.ts +2 -1
  369. package/dist/runtime/stageConcurrency.js +4 -2
  370. package/dist/runtime/stageEnvironment.d.ts +38 -0
  371. package/dist/runtime/stageEnvironment.js +194 -0
  372. package/dist/runtime/stageHitl.d.ts +1 -0
  373. package/dist/runtime/stageHitl.js +5 -1
  374. package/dist/runtime/stageProcessLauncher.d.ts +20 -0
  375. package/dist/runtime/stageProcessLauncher.js +236 -41
  376. package/dist/runtime/stageRecovery.d.ts +3 -1
  377. package/dist/runtime/stageRecovery.js +19 -4
  378. package/dist/runtime/stageRoots.d.ts +38 -1
  379. package/dist/runtime/stageRoots.js +118 -0
  380. package/dist/runtime/stageRunner.d.ts +6 -0
  381. package/dist/runtime/stageRunner.js +32 -6
  382. package/dist/runtime/stageSecretDecl.d.ts +9 -0
  383. package/dist/runtime/stageSecretDecl.js +102 -0
  384. package/dist/runtime/stageSecrets.d.ts +40 -0
  385. package/dist/runtime/stageSecrets.js +181 -0
  386. package/dist/runtime/stageStreamLog.d.ts +1 -0
  387. package/dist/runtime/stageStreamLog.js +2 -1
  388. package/dist/runtime/stageWorker.d.ts +3 -2
  389. package/dist/runtime/stageWorker.js +58 -10
  390. package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
  391. package/dist/runtime/stageWorkerProtocol.js +8 -0
  392. package/dist/runtime/startPayload.d.ts +32 -0
  393. package/dist/runtime/startPayload.js +59 -0
  394. package/dist/runtime/taskInput.js +14 -5
  395. package/dist/runtime/triggerCatalog.d.ts +6 -0
  396. package/dist/runtime/triggerCatalog.js +24 -0
  397. package/dist/runtime/triggerEventMatch.d.ts +2 -0
  398. package/dist/runtime/triggerEventMatch.js +6 -0
  399. package/dist/runtime/triggerPort.d.ts +14 -0
  400. package/dist/runtime/triggerPort.js +1 -0
  401. package/dist/runtime/triggerRunner.d.ts +17 -0
  402. package/dist/runtime/triggerRunner.js +89 -0
  403. package/dist/runtime/verifiedStageExecution.d.ts +8 -0
  404. package/dist/runtime/verifiedStageExecution.js +16 -1
  405. package/dist/runtime/webhookSignature.d.ts +1 -0
  406. package/dist/runtime/webhookSignature.js +12 -0
  407. package/dist/runtime/workspaceBinding.d.ts +20 -0
  408. package/dist/runtime/workspaceBinding.js +60 -0
  409. package/dist/server/allowedHosts.d.ts +19 -0
  410. package/dist/server/allowedHosts.js +179 -0
  411. package/dist/server/bootstrap.d.ts +42 -2
  412. package/dist/server/bootstrap.js +273 -5
  413. package/dist/server/controlToken.d.ts +47 -0
  414. package/dist/server/controlToken.js +254 -0
  415. package/dist/server/createHttpHost.d.ts +11 -2
  416. package/dist/server/createHttpHost.js +106 -10
  417. package/dist/server/ensureGlobalService.d.ts +5 -1
  418. package/dist/server/ensureGlobalService.js +35 -1
  419. package/dist/server/healthSurfaces.d.ts +6 -0
  420. package/dist/server/healthSurfaces.js +123 -0
  421. package/dist/server/http.d.ts +27 -1
  422. package/dist/server/http.js +2254 -477
  423. package/dist/server/listenHost.d.ts +5 -0
  424. package/dist/server/listenHost.js +56 -0
  425. package/dist/server/mcpHost.d.ts +10 -1
  426. package/dist/server/mcpHost.js +36 -6
  427. package/dist/server/operatorResults.d.ts +2 -2
  428. package/dist/server/operatorResults.js +40 -29
  429. package/dist/server/requestAuthContext.d.ts +12 -0
  430. package/dist/server/requestAuthContext.js +21 -0
  431. package/dist/server/shutdown.d.ts +69 -0
  432. package/dist/server/shutdown.js +219 -0
  433. package/dist/server/triggerRoutes.d.ts +15 -0
  434. package/dist/server/triggerRoutes.js +268 -0
  435. package/dist/tools/askOperator.d.ts +3 -2
  436. package/dist/types/completion.d.ts +3 -0
  437. package/dist/types/pipeline.d.ts +10 -1
  438. package/dist/types/preEmitCheck.d.ts +7 -0
  439. package/dist/types/stage.d.ts +22 -0
  440. package/dist/types/stageflowManifest.d.ts +3 -0
  441. package/dist/types/task.d.ts +8 -0
  442. package/dist/types/trigger.d.ts +18 -0
  443. package/dist/types/trigger.js +1 -0
  444. package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
  445. package/dist/ui/assets/index-CntB4bZR.js +133 -0
  446. package/dist/ui/index.html +2 -2
  447. package/dist/workshop/autosave.d.ts +58 -0
  448. package/dist/workshop/autosave.js +222 -0
  449. package/dist/workshop/buildStore.d.ts +79 -0
  450. package/dist/workshop/buildStore.js +326 -0
  451. package/dist/workshop/chatTurn.d.ts +232 -0
  452. package/dist/workshop/chatTurn.js +475 -0
  453. package/dist/workshop/modelSettings.d.ts +18 -0
  454. package/dist/workshop/modelSettings.js +44 -0
  455. package/dist/workshop/sessionStore.d.ts +61 -0
  456. package/dist/workshop/sessionStore.js +254 -0
  457. package/dist/workshop/workshopPin.d.ts +72 -0
  458. package/dist/workshop/workshopPin.js +193 -0
  459. package/examples/README.md +99 -0
  460. package/examples/archify-on-pr/README.md +213 -0
  461. package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
  462. package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
  463. package/examples/archify-on-pr/author-diagrams.yaml +106 -0
  464. package/examples/archify-on-pr/detect-changes.yaml +89 -0
  465. package/examples/browser-session/README.md +77 -0
  466. package/examples/browser-session/browser-session.pipeline.yaml +50 -0
  467. package/examples/browser-session/browser-session.task.yaml +6 -0
  468. package/examples/browser-session/check-login.yaml +22 -0
  469. package/examples/browser-session/fixture-server.mjs +64 -0
  470. package/examples/browser-session/human-login.yaml +31 -0
  471. package/examples/browser-session/merge.yaml +36 -0
  472. package/examples/browser-session/work-a.yaml +41 -0
  473. package/examples/browser-session/work-b.yaml +41 -0
  474. package/examples/ci-validate/README.md +35 -0
  475. package/examples/ci-validate/check.yaml +13 -0
  476. package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
  477. package/examples/ci-validate/validate.sh +5 -0
  478. package/examples/compliance-review-demo/README.md +125 -0
  479. package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
  480. package/examples/compliance-review-demo/connect-account.yaml +47 -0
  481. package/examples/compliance-review-demo/map-to-control.yaml +123 -0
  482. package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
  483. package/examples/compliance-review-demo/publish-report.yaml +79 -0
  484. package/examples/compliance-review-demo/review-verdict.yaml +122 -0
  485. package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
  486. package/examples/compliance-review-demo/store-evidence.yaml +143 -0
  487. package/examples/conditional-fork/README.md +89 -0
  488. package/examples/conditional-fork/branch-a.yaml +13 -0
  489. package/examples/conditional-fork/branch-b.yaml +13 -0
  490. package/examples/conditional-fork/decide.yaml +35 -0
  491. package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
  492. package/examples/conditional-fork/fork-demo.task.yaml +8 -0
  493. package/examples/context7-mcp/README.md +42 -0
  494. package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
  495. package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
  496. package/examples/context7-mcp/fetch-docs.yaml +52 -0
  497. package/examples/context7-mcp/resolve-library.yaml +31 -0
  498. package/examples/context7-mcp/write-brief.yaml +52 -0
  499. package/examples/feature-loop/README.md +104 -0
  500. package/examples/feature-loop/address-feedback.yaml +148 -0
  501. package/examples/feature-loop/align.yaml +116 -0
  502. package/examples/feature-loop/decompose.yaml +86 -0
  503. package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
  504. package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
  505. package/examples/feature-loop/feature-loop.task.yaml +25 -0
  506. package/examples/feature-loop/implement.yaml +128 -0
  507. package/examples/feature-loop/plan.yaml +111 -0
  508. package/examples/feature-loop/publish.yaml +167 -0
  509. package/examples/feature-loop/review.yaml +146 -0
  510. package/examples/feature-loop/verify.yaml +106 -0
  511. package/examples/feedback-loop/README.md +72 -0
  512. package/examples/feedback-loop/VERIFY.md +208 -0
  513. package/examples/feedback-loop/continue-only.task.yaml +4 -0
  514. package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
  515. package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
  516. package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
  517. package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
  518. package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
  519. package/examples/feedback-loop/implement.yaml +14 -0
  520. package/examples/feedback-loop/plan.yaml +14 -0
  521. package/examples/feedback-loop/review.yaml +15 -0
  522. package/examples/feedback-loop/send-back-once.task.yaml +6 -0
  523. package/examples/feedback-loop/submit.yaml +12 -0
  524. package/examples/generic-fan-in/README.md +151 -0
  525. package/examples/generic-fan-in/clarify.yaml +18 -0
  526. package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
  527. package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
  528. package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
  529. package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
  530. package/examples/generic-fan-in/research.yaml +45 -0
  531. package/examples/generic-fan-in/synthesize.yaml +66 -0
  532. package/examples/generic-fan-in/validation.yaml +45 -0
  533. package/examples/github-release/README.md +78 -0
  534. package/examples/github-release/draft-release-notes.yaml +64 -0
  535. package/examples/github-release/github-release.pipeline.yaml +11 -0
  536. package/examples/github-release/github-release.task.yaml +13 -0
  537. package/examples/github-release/publish-github-release.yaml +64 -0
  538. package/examples/hello-world/README.md +28 -0
  539. package/examples/hello-world/hello.pipeline.yaml +4 -0
  540. package/examples/hello-world/my-task.task.yaml +6 -0
  541. package/examples/hello-world/research.yaml +18 -0
  542. package/examples/mcp-hitl-tour/README.md +113 -0
  543. package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
  544. package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
  545. package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
  546. package/examples/mcp-hitl-tour/gather.yaml +31 -0
  547. package/examples/mcp-hitl-tour/intake.yaml +62 -0
  548. package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
  549. package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
  550. package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
  551. package/examples/mcp-hitl-tour/polish.yaml +33 -0
  552. package/examples/mcp-hitl-tour/review.yaml +17 -0
  553. package/examples/mcp-hitl-tour/ship.yaml +25 -0
  554. package/examples/oss-issue-contribution/README.md +218 -0
  555. package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
  556. package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
  557. package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
  558. package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
  559. package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
  560. package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
  561. package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
  562. package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
  563. package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
  564. package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
  565. package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
  566. package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
  567. package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
  568. package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
  569. package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
  570. package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
  571. package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
  572. package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
  573. package/examples/oss-quick-fix/README.md +65 -0
  574. package/examples/oss-quick-fix/implement-fix.yaml +84 -0
  575. package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
  576. package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
  577. package/examples/oss-quick-fix/ship-fix.yaml +81 -0
  578. package/examples/oss-quick-fix/understand-issue.yaml +67 -0
  579. package/examples/oss-quick-fix/verify-fix.yaml +73 -0
  580. package/examples/plan-review/README.md +37 -0
  581. package/examples/plan-review/plan-review-followup.yaml +13 -0
  582. package/examples/plan-review/plan-review.pipeline.yaml +9 -0
  583. package/examples/plan-review/plan-review.task.yaml +9 -0
  584. package/examples/plan-review/plan-review.yaml +25 -0
  585. package/examples/playwright-mcp/README.md +39 -0
  586. package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
  587. package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
  588. package/examples/playwright-mcp/screenshot.yaml +40 -0
  589. package/examples/retry-tour/README.md +75 -0
  590. package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
  591. package/examples/retry-tour/retry-tour.task.yaml +9 -0
  592. package/examples/route-if-tour/README.md +202 -0
  593. package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
  594. package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
  595. package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
  596. package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
  597. package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
  598. package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
  599. package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
  600. package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
  601. package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
  602. package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
  603. package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
  604. package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
  605. package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
  606. package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
  607. package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
  608. package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
  609. package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
  610. package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
  611. package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
  612. package/examples/route-wiring-smoke-test/README.md +377 -0
  613. package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
  614. package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
  615. package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
  616. package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
  617. package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
  618. package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
  619. package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
  620. package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
  621. package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
  622. package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
  623. package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
  624. package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
  625. package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
  626. package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
  627. package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
  628. package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
  629. package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
  630. package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
  631. package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
  632. package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
  633. package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
  634. package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
  635. package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
  636. package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
  637. package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
  638. package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
  639. package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
  640. package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
  641. package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
  642. package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
  643. package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
  644. package/examples/ship-feature/README.md +190 -0
  645. package/examples/ship-feature/feat-address-feedback.yaml +119 -0
  646. package/examples/ship-feature/feat-implement.yaml +180 -0
  647. package/examples/ship-feature/feat-plan.yaml +120 -0
  648. package/examples/ship-feature/feat-review.yaml +109 -0
  649. package/examples/ship-feature/feat-ship.yaml +203 -0
  650. package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
  651. package/examples/ship-feature/ship-feature.task.yaml +78 -0
  652. package/examples/stage-mcp/README.md +145 -0
  653. package/examples/stage-mcp/echo-mcp.mjs +20 -0
  654. package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
  655. package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
  656. package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
  657. package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
  658. package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
  659. package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
  660. package/examples/stage-mcp/use-echo.yaml +20 -0
  661. package/examples/stageflow.yaml +51 -0
  662. package/examples/verify-tour/README.md +80 -0
  663. package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
  664. package/examples/verify-tour/verify-tour.task.yaml +11 -0
  665. package/package.json +9 -1
  666. package/skills/stageflow/SKILL.md +6 -6
  667. package/skills/stageflow/references/control-surface.md +13 -5
  668. package/skills/stageflow/scripts/detect-host.mjs +14 -1
  669. package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
  670. package/skills/stageflow-author/SKILL.md +4 -3
  671. package/skills/stageflow-author/references/catalog-mapping.md +16 -0
  672. package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
  673. package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
  674. package/skills/stageflow-run/SKILL.md +22 -12
  675. package/skills/stageflow-run/references/mcp-call.md +9 -1
  676. package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
  677. package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
  678. package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
  679. package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
  680. package/skills/stageflow-setup/SKILL.md +51 -8
  681. package/dist/ui/assets/index-Da5EHU6M.js +0 -119
@@ -0,0 +1,218 @@
1
+ # OSS issue contribution pipeline
2
+
3
+ Use a real upstream issue to demonstrate Stageflow's strongest runtime features:
4
+ evidence-preserving stages, parallel investigation, explicit handoffs, human
5
+ approval, one controlled writer, independent verification, parallel review, and
6
+ a final publication gate.
7
+
8
+ The pipeline is repository-neutral. Point the task's `checkout` at a dedicated,
9
+ clean branch in Mastra, Pydantic AI, or another project. It reads that project's
10
+ own contribution instructions before acting.
11
+
12
+ This catalog is **route-wired** (`entry` / `route` / multiple `to:`). Investigation
13
+ and review are parallel DAG fan-out, not a sealed
14
+ [Clone Chain](../../docs/yaml-catalog.md#clone-chain) (emitter → clone child → Join).
15
+ One Clone Instance per investigation or review item remains intended future
16
+ wiring; author that shape from
17
+ [`tests/fixtures/pipelines/clone-chain-*.pipeline.yaml`](../../tests/fixtures/pipelines/).
18
+
19
+ ## Flow
20
+
21
+ 1. Capture the issue, repository baseline, and contribution rules.
22
+ 2. In parallel with reproduction, write a ce-explain HTML teaching artifact for the issue (no HITL).
23
+ 3. Reproduce the failure without editing tracked files.
24
+ 4. Intended Clone Chain: one Clone Instance per investigation item (parallel).
25
+ 5. Join the evidence into an implementation plan and ask for approval.
26
+ 6. Write the regression test in its own short stage, then implement the fix
27
+ and drive the plan's full validation command list to green in one
28
+ session — the only stage that can edit the checkout owns the whole
29
+ fix-and-validate loop, rather than handing an unfinished fix to a
30
+ read-only stage that could only report the gap.
31
+ 7. Independently verify the diff and relevant tests.
32
+ 8. In parallel with review planning, write a ce-explain HTML teaching artifact for the verified fix (no HITL).
33
+ 9. Intended Clone Chain: one Clone Instance per focused review (parallel).
34
+ 10. Address every blocking review finding in one fixup stage — sweeping for
35
+ every instance of the same category of problem, not only the ones
36
+ reviewers happened to cite. This catalog stays a DAG (parallel fan-out
37
+ via multiple `to:`); it does not declare `{ type: loop }` back to
38
+ oss-implement-source-fix or a second review pass.
39
+ 11. Join into a PR-ready package, ask for final approval, and — once the
40
+ operator accepts — push the branch and open the pull request against the
41
+ fork in that same stage.
42
+
43
+ No stage ever targets the upstream repo, and no stage before the final one
44
+ commits, pushes, or opens a pull request. `oss-approve-contribution` writes
45
+ `contribution-package.md`, calls `ask_operator`, and only runs `git`/`gh`
46
+ against the fork after an explicit accept through its `artifact_backed` gate.
47
+ There is no separate publish flag or dry-run mode: the operator's accept is
48
+ the only gate between "package written" and "PR opened."
49
+
50
+ ## Runtime contracts
51
+
52
+ Several stages opt into Stageflow runtime contracts that make the pipeline fail
53
+ closed when a stage skips its deliverable.
54
+
55
+ Every stage except the two approval stages declares `gate_kinds: []`, which
56
+ unregisters the `ask_operator` tool entirely. Those stages cannot pause for
57
+ operator input or offer to substitute a report for real work. Only
58
+ `oss-approve-plan` and `oss-approve-contribution` keep
59
+ `gate_kinds: [artifact_backed]`.
60
+
61
+ ### Review feedback has no loop in this catalog
62
+
63
+ Loops exist via `{ type: loop }` on `route` (see
64
+ [`examples/feedback-loop/`](../feedback-loop/)). This pipeline does not use
65
+ one: it stays a DAG with parallel fan-out via multiple `to:`. If
66
+ `oss-review-change` finds a blocking problem, the run does not resume
67
+ `oss-implement-source-fix` or `oss-verify-fix`. `oss-address-review-feedback`
68
+ is the accommodation: a single fixup stage after review and before approval
69
+ that addresses every blocking finding — sweeping for other instances of the
70
+ same category of problem, not only the ones a reviewer happened to cite — then
71
+ hands off to `oss-approve-contribution`, which independently re-checks the
72
+ fix before accepting it. It cannot get a fresh review of its own fix,
73
+ though: if its patch introduces something new, `oss-approve-contribution`'s
74
+ fail-closed check is the backstop, and the operator has to intervene by hand —
75
+ see [docs/cli-reference.md](../../docs/cli-reference.md) for `sf runs retry`,
76
+ which can retry a succeeded stage in place and reset everything downstream.
77
+
78
+ Every stage declares `verify` with at least one `type: artifact` check, so a
79
+ success emit is rejected unless the named file appears in the envelope's
80
+ artifact list. Writer stages add `type: checkout_changes` with `path_fields`;
81
+ approval stages also declare a `type: gate` check (`kind: artifact_backed`).
82
+ Pipeline entries wire `on_verify_fail` (repair for most stages; `manual` on
83
+ `oss-approve-contribution`) so after-phase failures retry or wait for an
84
+ operator instead of silently advancing.
85
+
86
+ | Stage | Gate | Required artifacts | Other checks |
87
+ |-------|------|--------------------|--------------|
88
+ | `oss-issue-intake` | `[]` | `issue-intake.md` | — |
89
+ | `oss-explain-issue` | `[]` | `issue-explainer.html` | — |
90
+ | `oss-reproduce-issue` | `[]` | `reproduction.md` | — |
91
+ | `oss-plan-investigation` | `[]` | `investigation-map.md` | intended Clone Chain emitter |
92
+ | `oss-investigate-area` | `[]` | `investigation.md` | intended clone child |
93
+ | `oss-approve-plan` | `[artifact_backed]` | `implementation-plan.md` | — |
94
+ | `oss-write-regression-test` | `[]` | `regression-test-report.md` | `[test_files]` |
95
+ | `oss-implement-source-fix` | `[]` | `implementation-report.md` | `[changed_files]` |
96
+ | `oss-verify-fix` | `[]` | `verification.md` | — |
97
+ | `oss-explain-fix` | `[]` | `fix-explainer.html` | — |
98
+ | `oss-plan-review` | `[]` | `review-plan.md` | intended Clone Chain emitter |
99
+ | `oss-review-change` | `[]` | `review.md` | intended clone child |
100
+ | `oss-address-review-feedback` | `[]` | `review-feedback-report.md` | — |
101
+ | `oss-approve-contribution` | `[artifact_backed]` | `contribution-package.md`, `pull-request.md` | — |
102
+
103
+ Intended Clone Chains: `oss-plan-investigation` → `oss-investigate-area` → `oss-approve-plan`, and `oss-plan-review` → `oss-review-change` → join at address/approve. This directory's YAML is not yet that shape. See [YAML catalog — Clone Chain](../../docs/yaml-catalog.md#clone-chain).
104
+
105
+ `oss-investigate-area` and `oss-review-change` use empty `io.input` (a subset of each parent's `io.output`). Assignment fields (`area_id`/`objective`/`paths`/`questions`/`constraints` or the review equivalent) belong on intended Clone Chain payloads, not this DAG.
106
+
107
+ Plan approval (`oss-approve-plan`) and contribution approval
108
+ (`oss-approve-contribution`) use `artifact_backed` HITL and cannot self-approve;
109
+ the runtime checks the QA trail before accepting a success emit.
110
+
111
+ `oss-write-regression-test` and `oss-implement-source-fix` require an array
112
+ field (`test_files` or `changed_files`) with `minItems: 1` on `io.output.schema`.
113
+ That constraint only checks the array is non-empty — it does not verify the
114
+ entries are real edits in the checkout, and a Stageflow artifact path satisfies
115
+ it. A run that never touched the checkout has passed this way before.
116
+
117
+ Both writer stages therefore also declare a `verify` check of
118
+ `type: checkout_changes` with `path_fields` naming that array field, so the
119
+ runtime enforces after the stage what the prompts alone could not:
120
+
121
+ - `type: checkout_changes` rejects a success outcome when
122
+ `git status --porcelain` in the bound task checkout is empty.
123
+ - `path_fields: [changed_files]` (or `[test_files]`) rejects a success outcome
124
+ when any listed entry is not a path inside the checkout — including the
125
+ `stages/<id>/attempts/<n>/artifacts/...` paths returned by
126
+ `write_stage_artifact`.
127
+
128
+ Stageflow is a configurable-stage runtime. These contracts are opt-in per
129
+ catalog; this example is one consumer that uses them to enforce a strict
130
+ contribution workflow.
131
+
132
+ ## Explainers
133
+
134
+ The two explainer stages are dead-end siblings: they do not pause investigation,
135
+ implementation, or review, and they do not call `ask_operator`. Each composes a
136
+ ce-explain HTML teaching artifact — concept for the issue, diff for the verified
137
+ fix — grounded in quoted checkout source and an inline SVG, written with
138
+ `write_stage_artifact`. Open `issue-explainer.html` and `fix-explainer.html`
139
+ from the run artifacts when you want them. They require the `ce-explain` skill
140
+ at `.pi/skills/ce-explain/` (copy the skill tree from Compound Engineering;
141
+ `sf skills install` expects a doctor binary this skill does not ship).
142
+
143
+ ## Prepare the target repository
144
+
145
+ Use a dedicated branch and begin with a clean tracked worktree:
146
+
147
+ ```bash
148
+ git clone https://github.com/mastra-ai/mastra.git
149
+ cd mastra
150
+ git switch -c investigate-22863
151
+ git status --short
152
+ ```
153
+
154
+ ## Create a task outside the target checkout
155
+
156
+ Task context is the pipeline's portable issue input. Include the issue body or
157
+ acceptance criteria so the run remains useful if GitHub access is unavailable.
158
+
159
+ ```yaml
160
+ id: mastra-22863
161
+ goal: >
162
+ Deliver a verified minimal fix for Mastra issue #22863, applied as source and
163
+ test edits in the checkout working tree.
164
+ context: |
165
+ Issue: https://github.com/mastra-ai/mastra/issues/22863
166
+ Title: <copy the current issue title>
167
+ Reported behavior: <copy or summarize the concrete failure>
168
+ Expected behavior: <copy or summarize the acceptance criterion>
169
+ Current triage/maintainer status: <record what you verified today>
170
+ constraints: |
171
+ Respect all repository contribution and agent instructions.
172
+ Do not publish while the issue is awaiting maintainer direction.
173
+ Do not commit, push, or open a pull request.
174
+ Keep the change limited to the reproduced issue and its regression test.
175
+ checkout: /absolute/path/to/mastra
176
+ ```
177
+
178
+ For Pydantic AI, use the same shape with a Pydantic issue and set `checkout` to
179
+ the absolute path of that clone. A ready task for issue #7971 is
180
+ `pydantic-ai-7971.task.yaml`. The stage definitions do not need to change.
181
+
182
+ ## Run
183
+
184
+ From any directory with Stageflow installed:
185
+
186
+ ```bash
187
+ sf validate \
188
+ --pipeline /path/to/stageflow/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml \
189
+ --strict
190
+
191
+ sf run \
192
+ --pipeline /path/to/stageflow/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml \
193
+ --task /path/to/mastra-22863.task.yaml
194
+ ```
195
+
196
+ `oss-approve-contribution` pushes and opens the pull request against the fork
197
+ as soon as the operator accepts its `artifact_backed` gate — there is no
198
+ dry-run mode and no extra flag. `gh` must be on `PATH` and authenticated
199
+ (`GH_TOKEN` or `GITHUB_TOKEN`) before you accept, or the publish step will
200
+ fail after approval.
201
+
202
+ Run `sf ui` in another terminal to inspect envelopes, artifacts, Clone Instances,
203
+ and answer the two artifact-backed gates. The explainer HTML files are ordinary
204
+ stage artifacts; they do not appear as gates.
205
+
206
+ ## Safety and interpretation
207
+
208
+ - Plan approval authorizes only local edits in the task checkout.
209
+ - Review Clone Instances always complete successfully and carry `pass` or
210
+ `changes_required` in their payload, allowing the Join to see every review.
211
+ - Any blocking review fails the final stage closed.
212
+ - The operator's accept through `oss-approve-contribution`'s `artifact_backed`
213
+ gate is the only authorization to publish, and it happens moments before the
214
+ stage runs `git push` / `gh pr create` in the same session — there is no
215
+ separate flag and no second chance to reconsider after accepting. It never
216
+ authorizes targeting upstream.
217
+ - Issue labels, assignments, and maintainer guidance can change. Re-verify them
218
+ before accepting the gate on a run that will open a pull request.
@@ -0,0 +1,117 @@
1
+ id: oss-address-review-feedback
2
+ system_prompt: |
3
+ Address every blocking finding from oss-review-change before the
4
+ contribution package is assembled. There is no automatic path back to
5
+ oss-implement-source-fix or oss-verify-fix in this pipeline, and this is the
6
+ only stage positioned to edit the checkout after review — treat that as the
7
+ reason this stage exists, not as license to rewrite the fix. This stage is
8
+ the last-mile fixup for what reviewers found, not a second implementation
9
+ pass.
10
+
11
+ Reading upstream evidence. The user prompt contains a line
12
+ "Factory run workspace: <absolute path>". Prior artifacts arrive in the
13
+ prior envelope's artifacts[] as run-relative paths; read each one at
14
+ <Factory run workspace>/<artifact path>. Every oss-review-change
15
+ envelope's payload (review_id, verdict, blocking_findings) and its review.md
16
+ are authoritative; implementation-report.md and verification.md give the
17
+ context needed to make a correct, narrow fix. Prose summaries are secondary.
18
+
19
+ Definition of done — every line must hold before you emit success:
20
+ - Every oss-review-change envelope and its review.md have been read.
21
+ - If every verdict is pass: the checkout is untouched, fixed_files is empty,
22
+ and addressed_all_blocking is true.
23
+ - If any verdict is changes_required: every entry in every review's
24
+ blocking_findings has been addressed, not only the specific file/line
25
+ reviewers happened to cite — search for every other instance of the same
26
+ category of problem (for example, every other test still asserting
27
+ semantics the fix already inverted elsewhere, or every other call site
28
+ with the same missing type widening) and fix those too. A reviewer's
29
+ citation is a sample of the problem, not its full extent.
30
+ - git diff in the checkout is non-empty whenever any verdict was
31
+ changes_required; the emit is rejected if you claim to have addressed a
32
+ blocking finding while the working tree is clean.
33
+ - Every fixed_files entry is a repo-relative path inside the checkout that
34
+ also appears in git diff --name-only; the emit is rejected for any entry
35
+ pointing into the factory run workspace.
36
+ - Every check a blocking finding cited as failing has been re-run here and
37
+ now passes; verification_commands records each with its result.
38
+ - review-feedback-report.md is written and listed in the emitted artifacts;
39
+ the emit is rejected without it.
40
+
41
+ 1. Read every oss-review-change envelope and review.md via the recipe
42
+ above. If every verdict is pass, skip to step 5 with nothing to fix.
43
+ 2. For each changes_required review, read every blocking_findings entry and
44
+ its remediation guidance. Do not re-litigate a pass verdict or reopen
45
+ non-blocking findings or suggestions — those are out of scope here.
46
+ 3. Fix each blocking finding at its cited location, then search the rest of
47
+ the checkout for other instances of the same category of problem and fix
48
+ those too (see Definition of done). Do not perform unrelated formatting,
49
+ refactors, or scope expansion beyond what the findings require. Do not
50
+ weaken, delete, or skip a test to make it pass.
51
+ 4. Re-run every command a blocking finding cited as failing, plus the
52
+ specific test(s) it named, and confirm each now passes. If a fix cannot
53
+ be completed or a re-run still fails, emit failure and record exactly
54
+ what remains broken and why — do not present partial remediation as
55
+ success.
56
+ 5. Write review-feedback-report.md listing every blocking finding, whether
57
+ it was addressed (with the fix location and the passing re-run), or
58
+ that there was nothing to address because every verdict was pass.
59
+ 6. Emit exactly once, including review-feedback-report.md and all inherited
60
+ evidence artifacts, with a payload matching the schema.
61
+
62
+ Contract violations — emit failure rather than presenting these as success:
63
+ - addressed_all_blocking: true while any blocking_findings entry remains
64
+ unaddressed or unverified.
65
+ - Fixing only the literal file/line a reviewer cited when the same category
66
+ of problem exists elsewhere in the diff.
67
+ - Emitting success while git diff is empty and any verdict was
68
+ changes_required.
69
+ - A fixed_files entry under stages/.../artifacts/ or anywhere else in the
70
+ factory run workspace.
71
+ - Editing anything outside the scope of a blocking finding.
72
+ - verification_commands listing commands you did not execute.
73
+
74
+ Never commit, push, or open a pull request.
75
+
76
+ Write summary as outcomes and resulting state for oss-approve-contribution:
77
+ which blocking findings existed, what changed to address them, and
78
+ confirmation every cited check now passes (or, on failure, what remains
79
+ open). Downstream stages receive this summary verbatim and can mistake it
80
+ for their own instructions, so never restate this stage's prohibitions or
81
+ scope limits in it.
82
+ model: omniroute/auto
83
+ io:
84
+ input:
85
+ schema:
86
+ type: object
87
+ output:
88
+ schema:
89
+ type: object
90
+ required:
91
+ - addressed_all_blocking
92
+ - fixed_files
93
+ - verification_commands
94
+ - remaining_risks
95
+ properties:
96
+ addressed_all_blocking:
97
+ type: boolean
98
+ fixed_files:
99
+ type: array
100
+ items:
101
+ type: string
102
+ verification_commands:
103
+ type: array
104
+ items:
105
+ type: string
106
+ remaining_risks:
107
+ type: array
108
+ items:
109
+ type: string
110
+ verify:
111
+ - id: review-feedback-report
112
+ type: artifact
113
+ path: review-feedback-report.md
114
+ nonempty: true
115
+ when:
116
+ - after
117
+ gate_kinds: []
@@ -0,0 +1,181 @@
1
+ id: oss-approve-contribution
2
+ system_prompt: |
3
+ Produce one operator-approved contribution-package.md that states the
4
+ verified facts of the change, then — once the operator accepts it — publish
5
+ the pull request against the fork yourself in this same stage. Do not edit
6
+ source files. Never target pydantic/pydantic-ai; only the fork named in the
7
+ task.
8
+
9
+ Reading upstream evidence. The user prompt contains a line
10
+ "Factory run workspace: <absolute path>". Prior artifacts arrive in the prior
11
+ envelope's artifacts[] as run-relative paths; read each one at
12
+ <Factory run workspace>/<artifact path>. verification.md is the authoritative
13
+ record of which commands ran and their results, implementation-report.md of
14
+ what was changed, implementation-plan.md of what was approved,
15
+ review-feedback-report.md of what oss-address-review-feedback fixed after
16
+ review, and each review.md of what each reviewer originally found. Prose
17
+ summaries are secondary.
18
+
19
+ Trust but verify oss-address-review-feedback. Its report is a claim, not
20
+ proof by itself: cross-check addressed_all_blocking against the original
21
+ review.md blocking_findings and confirm the specific checks they cited
22
+ actually pass now, rather than accepting the claim at face value.
23
+
24
+ Definition of done, checked before you emit:
25
+ - Every oss-review-change envelope, its review.md, and
26
+ review-feedback-report.md have been read.
27
+ - contribution-package.md is written, listed in the emitted artifacts, and
28
+ contains the PR title, PR body, tests run with their results, changed
29
+ files, and the exact publish commands.
30
+ - changed_files matches git diff --name-only in the checkout.
31
+ - tests are the commands and node ids recorded in verify/implement evidence.
32
+ - publish_repo is the fork named in the task, and the artifact says so
33
+ explicitly.
34
+ - The operator accepted the package through the artifact_backed gate before
35
+ any publish command runs.
36
+ - opened is true only if gh pr view confirms the PR exists after you created
37
+ it; pull-request.md is written and listed in the emitted artifacts.
38
+
39
+ 1. Read every oss-review-change envelope/artifact, review-feedback-
40
+ report.md, the task, implementation-plan.md, implementation-report.md,
41
+ and verification.md via the recipe above. Run git diff --name-only and
42
+ git diff --stat in the checkout.
43
+ 2. Write contribution-package.md containing issue link and scope, root cause,
44
+ before/after behavior, changed files, exact validation results, all review
45
+ verdicts and how any blocking findings were addressed, remaining risks,
46
+ current maintainer/triage status, and a proposed pull-request title and
47
+ body targeting the fork named in the task (not upstream). State the fork
48
+ explicitly as the publish target. Do not claim tests, approval,
49
+ assignment, or maintainer support that was not verified.
50
+ 3. Fail closed. If review-feedback-report.md says addressed_all_blocking is
51
+ not true, or your own re-check finds any original blocking_findings entry
52
+ whose cited check still fails, mark the package NOT READY and emit
53
+ failure with the artifact. Do not ask the operator to approve
54
+ known-blocking code, and do not run any publish command in that case.
55
+ 4. Otherwise call ask_operator with kind artifact_backed referencing the
56
+ package. Ask whether it is ready to publish against the fork.
57
+ 5. For wording/report changes, revise the artifact and ask again. If the
58
+ operator requests code changes or declines publication, emit failure and
59
+ preserve the requested changes in the artifact. Do not run any publish
60
+ command without an explicit accept.
61
+ 6. Only after explicit acceptance: confirm publish_repo is exactly the fork
62
+ named in the task (never pydantic/pydantic-ai), then run git add, git
63
+ commit (using pr_title as the message unless the package recipe says
64
+ otherwise), git push, and gh pr create --repo <publish_repo>
65
+ --head <branch> --base main --title <pr_title> --body <pr_body_summary>.
66
+ Auth is GH_TOKEN or GITHUB_TOKEN already in the environment; gh is on
67
+ PATH.
68
+ 7. Confirm with gh pr view. Write pull-request.md via write_stage_artifact
69
+ with the PR URL, the commands actually run, and their results. If a pull
70
+ request already exists for this branch, or any command fails, emit
71
+ status failure and record what happened; never retry a create with
72
+ altered scope.
73
+ 8. Emit exactly once, including contribution-package.md, pull-request.md,
74
+ and all inherited evidence artifacts, with a payload matching the schema.
75
+ Do not stop after a chat reply or after opening the PR — the stage only
76
+ completes when emit_stage_envelope returns.
77
+
78
+ Payload discipline. changed_files must be copied from the verify and
79
+ implement payloads and cross-checked against git diff --name-only; entries
80
+ that do not appear in that output, or that point under stages/.../artifacts/,
81
+ are a contract violation. tests must be the real commands or test node ids
82
+ from verification.md, never invented and never n/a, none, tbd, or pending.
83
+ Every string field must carry real content and every array substantive
84
+ entries, not placeholders such as ["see diff"]. commands_run must list only
85
+ the git/gh commands you actually executed, each with its outcome.
86
+
87
+ Contract violations — emit failure rather than presenting these as success:
88
+ - Running git add, git commit, git push, or gh pr create before the operator
89
+ has explicitly accepted through the artifact_backed gate.
90
+ - opened: true without gh pr view confirming the PR exists.
91
+ - publish_repo anything other than the exact fork named in the task.
92
+ - commands_run listing commands you did not execute.
93
+ - Writing contribution-package.md without reading the reviews and
94
+ reconciling the diff first.
95
+
96
+ Summary authoring. The emitted summary describes outcomes and state for
97
+ downstream consumers: readiness, review verdicts, which files changed, which
98
+ tests passed, the publish target, and the PR URL if opened. Do not restate
99
+ this stage's own prohibitions or scope limits in the summary.
100
+ model: omniroute/auto
101
+ io:
102
+ input:
103
+ schema:
104
+ type: object
105
+ required:
106
+ - addressed_all_blocking
107
+ - fixed_files
108
+ - verification_commands
109
+ - remaining_risks
110
+ properties:
111
+ addressed_all_blocking:
112
+ type: boolean
113
+ fixed_files:
114
+ type: array
115
+ items:
116
+ type: string
117
+ verification_commands:
118
+ type: array
119
+ items:
120
+ type: string
121
+ remaining_risks:
122
+ type: array
123
+ items:
124
+ type: string
125
+ output:
126
+ schema:
127
+ type: object
128
+ required:
129
+ - pr_title
130
+ - pr_body_summary
131
+ - tests
132
+ - changed_files
133
+ - publish_repo
134
+ - commands_run
135
+ - opened
136
+ - pr_url
137
+ properties:
138
+ pr_title:
139
+ type: string
140
+ pr_body_summary:
141
+ type: string
142
+ tests:
143
+ type: array
144
+ items:
145
+ type: string
146
+ changed_files:
147
+ type: array
148
+ items:
149
+ type: string
150
+ publish_repo:
151
+ type: string
152
+ commands_run:
153
+ type: array
154
+ minItems: 1
155
+ items:
156
+ type: string
157
+ opened:
158
+ type: boolean
159
+ pr_url:
160
+ type: string
161
+ verify:
162
+ - id: contribution-approved
163
+ type: gate
164
+ kind: artifact_backed
165
+ when:
166
+ - emit
167
+ - after
168
+ - id: contribution-package
169
+ type: artifact
170
+ path: contribution-package.md
171
+ nonempty: true
172
+ when:
173
+ - after
174
+ - id: pull-request
175
+ type: artifact
176
+ path: pull-request.md
177
+ nonempty: true
178
+ when:
179
+ - after
180
+ gate_kinds:
181
+ - artifact_backed
@@ -0,0 +1,111 @@
1
+ id: oss-approve-plan
2
+ system_prompt: |
3
+ Write implementation-plan.md as a mechanical checklist the implement stage can
4
+ execute, and get explicit operator approval of it before any source edit.
5
+
6
+ Reading upstream work: prior envelopes' artifacts[] hold run-relative paths.
7
+ Read each one at <Factory run workspace>/<artifact path>, using the absolute
8
+ "Factory run workspace" value given in this stage's user prompt. The
9
+ oss-investigate-area investigation artifacts and the intake and reproduction
10
+ artifacts are authoritative over any prose in the prior envelopes' summaries;
11
+ those summaries describe their own stages only.
12
+
13
+ Definition of done — every line must hold before you emit success:
14
+ - implementation-plan.md is written and listed in the emitted artifacts; the
15
+ emit is rejected without it.
16
+ - The plan names the exact regression test node id, the exact files and edit
17
+ sites, and the exact validation commands to run.
18
+ - The operator explicitly accepted the plan through the artifact_backed gate,
19
+ and that accepted decision is recorded verbatim inside
20
+ implementation-plan.md.
21
+ - planned_files and validation_commands are non-empty and concrete;
22
+ approved is true only after that explicit accept.
23
+
24
+ 1. Read the task, all prior oss-investigate-area envelopes and their
25
+ artifacts, plus the intake and reproduction evidence. Reconcile
26
+ contradictions rather than silently choosing one claim.
27
+ 2. Write implementation-plan.md with root-cause evidence and a mechanical
28
+ implementation checklist: the exact regression test name and node id to add
29
+ or run, each file to edit with the symbol and line region of the edit site,
30
+ the minimal change at each site, and the validation commands to run in the
31
+ checkout. Then record alternatives and tradeoffs, risks, and any
32
+ contribution-policy blockers. State whether current issue triage or
33
+ maintainer guidance permits publishing a pull request; lack of permission
34
+ may block publication without blocking a local investigation.
35
+ 3. Call ask_operator with kind artifact_backed referencing that artifact. Ask
36
+ whether to approve the exact scope for implementation.
37
+ 4. On rejection or requested plan changes, revise the artifact and ask again.
38
+ 5. After explicit acceptance, rewrite implementation-plan.md to include an
39
+ operator-decision section holding the accepted decision, the operator's
40
+ wording, and any conditions attached. The HITL question-and-answer trail is
41
+ not replayed into downstream prompts, so this artifact is the only durable
42
+ record the implement stage can read.
43
+ 6. Emit exactly one envelope, including the accepted plan and the inherited
44
+ evidence artifacts, with a payload matching the schema. Emit success only
45
+ after explicit acceptance. If the operator declines implementation, emit
46
+ failure with a concise reason.
47
+
48
+ Contract violations — do not present these as success:
49
+ - approved: true without an explicit operator accept, or interpreting silence
50
+ as approval.
51
+ - planned_files or validation_commands left empty, generic, or expressed as
52
+ intent rather than concrete paths and runnable commands.
53
+ - A plan that describes the problem without naming the regression test node id
54
+ and the edit sites.
55
+
56
+ Never edit source files in this stage. Never commit, push, or open a pull
57
+ request.
58
+
59
+ Write summary as outcomes and resulting state for downstream stages: what the
60
+ approved scope is, which artifact carries the checklist, what the operator
61
+ accepted, and what blockers remain. The implement stage receives this summary
62
+ verbatim and can mistake it for its own instructions, so never put this
63
+ stage's prohibitions or scope limits in it — in particular, no "no source
64
+ edits" language, which applies here and not downstream.
65
+ model: omniroute/auto
66
+ timeout_ms: 3600000
67
+ io:
68
+ input:
69
+ schema:
70
+ type: object
71
+ output:
72
+ schema:
73
+ type: object
74
+ required:
75
+ - approved
76
+ - scope_summary
77
+ - planned_files
78
+ - validation_commands
79
+ - publication_blockers
80
+ properties:
81
+ approved:
82
+ type: boolean
83
+ scope_summary:
84
+ type: string
85
+ planned_files:
86
+ type: array
87
+ items:
88
+ type: string
89
+ validation_commands:
90
+ type: array
91
+ items:
92
+ type: string
93
+ publication_blockers:
94
+ type: array
95
+ items:
96
+ type: string
97
+ verify:
98
+ - id: plan-approved
99
+ type: gate
100
+ kind: artifact_backed
101
+ when:
102
+ - emit
103
+ - after
104
+ - id: implementation-plan
105
+ type: artifact
106
+ path: implementation-plan.md
107
+ nonempty: true
108
+ when:
109
+ - after
110
+ gate_kinds:
111
+ - artifact_backed