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,146 @@
1
+ id: review
2
+ system_prompt: |
3
+ Review the entire implementation as one change — every story's edits
4
+ together, not per-story. Work the way a compound-engineering
5
+ ce-code-review run would: report-only, persona-quality findings,
6
+ no checkout edits. Do not commit, push, or open a pull request.
7
+
8
+ This is a whole-diff review. coverage.md and the union of implement
9
+ reports are context; git diff against the feature branch merge base
10
+ is the code under review. Emit success even when verdict is
11
+ changes_required — failure only if the review itself cannot be
12
+ performed.
13
+
14
+ Reading upstream work: the user prompt contains "Factory run
15
+ workspace: <absolute path>". Read coverage.md and inherited artifacts
16
+ at <Factory run workspace>/<path>. If this attempt includes Feedback
17
+ Loop Context, that envelope is the address-feedback send-back: review
18
+ the current checkout plus what that pass claimed to fix, not the
19
+ original review-report.md as if nothing changed.
20
+
21
+ Definition of done — every line must hold before you emit success:
22
+ - You ran git diff against the merge base (origin/main or the task's
23
+ base branch) and read every changed file, not hunks alone.
24
+ - review-report.md was written through write_stage_artifact and
25
+ appears in the emitted artifacts list.
26
+ - Every publication-blocking issue is in blocking_findings with
27
+ file:line evidence. Describing a blocker only in prose findings
28
+ while leaving blocking_findings empty is a contract violation.
29
+ - verdict is pass only when blocking_findings is empty.
30
+ - The working tree is unchanged by this stage.
31
+
32
+ 1. Read the task, coverage.md, aligned-plans.md, and every
33
+ implementation-report.md you can resolve. Run git diff and
34
+ git diff --name-only against the merge base.
35
+ 2. Review correctness, regressions, tests, security, and whether the
36
+ landed diff still matches the aligned plans as a whole (cross-story
37
+ seams, duplicated abstractions, missed acceptance).
38
+ 3. Classify findings. Blocking: correctness, regression, missing
39
+ required tests, security, or broken acceptance. Suggestions stay
40
+ out of blocking_findings.
41
+ 4. Call write_stage_artifact with path review-report.md: verdict,
42
+ answers, findings, evidence, and concrete remediation for each
43
+ blocker.
44
+ 5. Emit success with a payload matching the schema, including
45
+ review-report.md and inherited evidence.
46
+
47
+ Required files must be created with write_stage_artifact. Checkout
48
+ write/edit does not satisfy after-phase verify.
49
+
50
+ summary and payload are handed to the next stage verbatim. State
51
+ verdict, whether blockers exist, and the artifact pointer. Do not
52
+ repeat this stage's prohibitions in summary.
53
+
54
+ When finished, call emit_stage_envelope exactly once with status,
55
+ summary, artifacts, and a payload matching the schema. Your last
56
+ tool call in this attempt must be emit_stage_envelope. An empty
57
+ final message is a stage failure.
58
+ model: cursor/auto
59
+ timeout_ms: 3600000
60
+ io:
61
+ input:
62
+ schema:
63
+ type: object
64
+ required:
65
+ - expected_story_ids
66
+ - implemented_story_ids
67
+ - missing_story_ids
68
+ - extra_story_ids
69
+ - coverage_complete
70
+ - changed_files
71
+ properties:
72
+ expected_story_ids:
73
+ type: array
74
+ minItems: 1
75
+ items:
76
+ type: string
77
+ implemented_story_ids:
78
+ type: array
79
+ minItems: 1
80
+ items:
81
+ type: string
82
+ missing_story_ids:
83
+ type: array
84
+ items:
85
+ type: string
86
+ extra_story_ids:
87
+ type: array
88
+ items:
89
+ type: string
90
+ coverage_complete:
91
+ type: boolean
92
+ changed_files:
93
+ type: array
94
+ minItems: 1
95
+ items:
96
+ type: string
97
+ output:
98
+ schema:
99
+ type: object
100
+ required:
101
+ - verdict
102
+ - findings
103
+ - blocking_findings
104
+ - suggestions
105
+ - evidence
106
+ - reviewed_files
107
+ properties:
108
+ verdict:
109
+ type: string
110
+ enum:
111
+ - pass
112
+ - changes_required
113
+ findings:
114
+ type: array
115
+ items:
116
+ type: string
117
+ blocking_findings:
118
+ type: array
119
+ items:
120
+ type: string
121
+ suggestions:
122
+ type: array
123
+ items:
124
+ type: string
125
+ evidence:
126
+ type: array
127
+ items:
128
+ type: string
129
+ reviewed_files:
130
+ type: array
131
+ minItems: 1
132
+ items:
133
+ type: string
134
+ verify:
135
+ - id: review-report-declared
136
+ type: artifact
137
+ basename: review-report.md
138
+ when:
139
+ - emit
140
+ - id: review-report
141
+ type: artifact
142
+ path: review-report.md
143
+ nonempty: true
144
+ when:
145
+ - after
146
+ gate_kinds: []
@@ -0,0 +1,106 @@
1
+ id: verify
2
+ system_prompt: |
3
+ You are the join after implement. Confirm every aligned
4
+ story was implemented and none were skipped, then hand a coverage
5
+ ledger to review. Do not edit source, commit, push, or open a pull
6
+
7
+ Read each prior implement payload.story_id and changed_files.
8
+ aligned-plans.md is the expected story set and implementation_order.
9
+
10
+ Reading upstream work: the user prompt contains "Factory run
11
+ workspace: <absolute path>". Read artifacts at <Factory run
12
+ workspace>/<artifact path>. Also run git diff --name-only in the
13
+ checkout so the ledger matches the tree, not just envelopes.
14
+
15
+ Definition of done — every line must hold before you emit success:
16
+ - expected_story_ids is the full implementation_order from
17
+ aligned-plans.md.
18
+ - implemented_story_ids is every implement payload.story_id.
19
+ - missing_story_ids is empty. extra_story_ids is empty.
20
+ - coverage_complete is true only when those sets match and every
21
+ expected story has a non-empty changed_files list that exists in
22
+ git diff --name-only.
23
+ - coverage.md was written through write_stage_artifact and appears in
24
+ the emitted artifacts list.
25
+
26
+ 1. Read aligned-plans.md and every implement envelope/report.
27
+ 2. Build the expected vs implemented sets. Union changed_files across
28
+ implement reports and intersect with git diff --name-only.
29
+ 3. If any story is missing, extra, or claimed files that are not in
30
+ the checkout diff, write coverage.md describing the gap and emit
31
+ failure. Do not present partial coverage as success.
32
+ 4. Otherwise write coverage.md with the story matrix, files per
33
+ story, union diff, and residual risk from implement reports.
34
+ 5. Emit success with a payload matching the schema, including
35
+ coverage.md and inherited evidence.
36
+
37
+ Required files must be created with write_stage_artifact. Checkout
38
+ write/edit does not satisfy after-phase verify.
39
+
40
+ summary and payload are handed to the next stage verbatim. State
41
+ that coverage is complete, list story_ids, and point at coverage.md.
42
+ Do not repeat this stage's prohibitions in summary.
43
+
44
+ When finished, call emit_stage_envelope exactly once with status,
45
+ summary, artifacts, and a payload matching the schema. Your last
46
+ tool call in this attempt must be emit_stage_envelope. An empty
47
+ final message is a stage failure.
48
+ model: cursor/auto
49
+ timeout_ms: 1800000
50
+ io:
51
+ input:
52
+ schema:
53
+ type: object
54
+ output:
55
+ schema:
56
+ type: object
57
+ required:
58
+ - expected_story_ids
59
+ - implemented_story_ids
60
+ - missing_story_ids
61
+ - extra_story_ids
62
+ - coverage_complete
63
+ - changed_files
64
+ properties:
65
+ expected_story_ids:
66
+ type: array
67
+ minItems: 1
68
+ items:
69
+ type: string
70
+ implemented_story_ids:
71
+ type: array
72
+ minItems: 1
73
+ items:
74
+ type: string
75
+ missing_story_ids:
76
+ type: array
77
+ items:
78
+ type: string
79
+ extra_story_ids:
80
+ type: array
81
+ items:
82
+ type: string
83
+ coverage_complete:
84
+ type: boolean
85
+ changed_files:
86
+ type: array
87
+ minItems: 1
88
+ items:
89
+ type: string
90
+ verify:
91
+ - id: coverage-declared
92
+ type: artifact
93
+ basename: coverage.md
94
+ when:
95
+ - emit
96
+ - id: coverage
97
+ type: artifact
98
+ path: coverage.md
99
+ nonempty: true
100
+ when:
101
+ - after
102
+ - id: coverage-payload
103
+ type: payload_schema
104
+ when:
105
+ - after
106
+ gate_kinds: []
@@ -0,0 +1,72 @@
1
+ # feedback-loop
2
+
3
+ Source-owned feedback loop: `review` may `continue` or `send_back` to `implement`.
4
+ `submit` is `replay_safe: false` so it is never on a replay route.
5
+
6
+ Catalog policy is a `{ type: loop }` entry on `route` (not a top-level `feedback_loop:` key). The envelope field is still `feedback_loop`. See [YAML catalog — Feedback loops](../../docs/yaml-catalog.md#feedback-loops) and [`feedback-loop.pipeline.yaml`](../../tests/fixtures/pipelines/feedback-loop.pipeline.yaml).
7
+
8
+ Domain-neutral — the same wiring works for release notes, research digests, content review, or an SDLC-style plan/implement pass.
9
+
10
+ ## Prerequisites
11
+
12
+ - Node.js ≥ 20, Stageflow installed (`npm i -g stageflow`), **or** this repo built (`npm run build`)
13
+ - Provider auth connected (`sf ui` → Settings → Providers, or `sf providers login …`)
14
+
15
+ ## Manual verification (recommended)
16
+
17
+ Step-by-step scenarios A–D (continue, one send_back, require_continue exhaust, wait_for_human decide):
18
+
19
+ → **[VERIFY.md](./VERIFY.md)**
20
+
21
+ ## Commands
22
+
23
+ From the **repository git root**:
24
+
25
+ ```bash
26
+ sf validate --pipeline examples/feedback-loop/feedback-loop.pipeline.yaml --strict
27
+ sf run \
28
+ --pipeline examples/feedback-loop/feedback-loop.pipeline.yaml \
29
+ --task examples/feedback-loop/feedback-loop.task.yaml
30
+ ```
31
+
32
+ Wait-for-human policy (`max_replays: 1`):
33
+
34
+ ```bash
35
+ sf run \
36
+ --pipeline examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml \
37
+ --task examples/feedback-loop/exhaust-wait-human.task.yaml
38
+ ```
39
+
40
+ Optional console (any subdirectory):
41
+
42
+ ```bash
43
+ cd examples/feedback-loop && sf ui
44
+ ```
45
+
46
+ ### From the Stageflow repo (no global install)
47
+
48
+ ```bash
49
+ npm run build
50
+ npm run dev -- validate --pipeline examples/feedback-loop/feedback-loop.pipeline.yaml --strict
51
+ npm run dev -- run \
52
+ --pipeline examples/feedback-loop/feedback-loop.pipeline.yaml \
53
+ --task examples/feedback-loop/feedback-loop.task.yaml
54
+ ```
55
+
56
+ ## Layout
57
+
58
+ ```
59
+ examples/feedback-loop/
60
+ VERIFY.md # manual scenarios A–D
61
+ feedback-loop.pipeline.yaml # require_continue, max_replays 2
62
+ feedback-loop-wait-human.pipeline.yaml
63
+ feedback-loop.task.yaml
64
+ continue-only / send-back-once / exhaust-*.task.yaml
65
+ plan.yaml | implement.yaml | review.yaml | submit.yaml
66
+ ```
67
+
68
+ ## References
69
+
70
+ - [YAML catalog — Feedback loops](../../docs/yaml-catalog.md#feedback-loops)
71
+ - [Envelopes — Feedback loops](../../docs/envelopes.md#feedback-loops)
72
+ - [CLI — feedback-decide](../../docs/cli-reference.md#sf-runs-feedback-decide)
@@ -0,0 +1,208 @@
1
+ # Feedback-loop manual verification
2
+
3
+ Simple runs to exercise the feedback-loop work from this repo. Uses a real provider (not FakeAgent).
4
+
5
+ ## Setup
6
+
7
+ ```bash
8
+ cd /path/to/software-factory
9
+ npm i
10
+ npm run build
11
+ # Provider auth once (example stages use omniroute/auto)
12
+ # Connect via: npm run dev -- ui → Settings → Providers
13
+ ```
14
+
15
+ Use `npm run dev -- …` as `sf` from this worktree. Run state lives in `<repo>/.stageflow/`.
16
+
17
+ Optional console:
18
+
19
+ ```bash
20
+ npm run dev -- ui
21
+ ```
22
+
23
+ If `sf ui` is up on `:3847`, mutating CLI (`runs feedback-decide`) is refused — decide in the UI panel, or stop the host and use CLI.
24
+
25
+ Validate once:
26
+
27
+ ```bash
28
+ npm run dev -- validate --pipeline examples/feedback-loop/feedback-loop.pipeline.yaml --strict
29
+ npm run dev -- validate --pipeline examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml --strict
30
+ ```
31
+
32
+ ---
33
+
34
+ ## Scenario A — Continue only (happy path)
35
+
36
+ **Expect:** `plan → implement → review → submit`, no replay.
37
+
38
+ ```bash
39
+ npm run dev -- run \
40
+ --pipeline examples/feedback-loop/feedback-loop.pipeline.yaml \
41
+ --task examples/feedback-loop/continue-only.task.yaml \
42
+ --json > /tmp/fb-a.json
43
+ ```
44
+
45
+ **Pass:** exit `0`; all four stages `succeeded`; `submit` ran once.
46
+
47
+ ```bash
48
+ RUN=$(jq -r .runId /tmp/fb-a.json)
49
+ npm run dev -- runs show --run "$RUN" --json | jq '{
50
+ status,
51
+ stages: [.stages[] | {id: .stage_id, status}],
52
+ active: .active_feedback_loop,
53
+ loops: [.feedback_loops[]?.loop.state]
54
+ }'
55
+ ```
56
+
57
+ **Fail:** any `send_back`, or `submit` never runs.
58
+
59
+ ---
60
+
61
+ ## Scenario B — One send_back, then continue
62
+
63
+ **Expect:** review sends back to `implement` once; replay includes Feedback Loop Context; then continue → submit.
64
+
65
+ ```bash
66
+ npm run dev -- run \
67
+ --pipeline examples/feedback-loop/feedback-loop.pipeline.yaml \
68
+ --task examples/feedback-loop/send-back-once.task.yaml \
69
+ --json > /tmp/fb-b.json
70
+ ```
71
+
72
+ **Pass:**
73
+
74
+ - Stage path roughly `plan → implement → review → implement → review → submit`
75
+ - One replay in history; loop ends `continued`
76
+ - On the replayed stages, the agent prompt shows a **Feedback Loop Context** block
77
+
78
+ ```bash
79
+ RUN=$(jq -r .runId /tmp/fb-b.json)
80
+ npm run dev -- runs show --run "$RUN" --json | jq '{
81
+ status,
82
+ stages: [.stages[] | {id: .stage_id, status}],
83
+ replays: [.feedback_loops[0].replays[] | {
84
+ n: .replay.replay_number,
85
+ target: .replay.target_stage_id,
86
+ status: .replay.status
87
+ }],
88
+ loop: .feedback_loops[0].loop.state
89
+ }'
90
+ ```
91
+
92
+ UI: Feedback Loop panel shows budget / route / replay timeline.
93
+
94
+ **Fail:** submit before continue; no replay recorded; no Feedback Loop Context on replay.
95
+
96
+ ---
97
+
98
+ ## Scenario C — Exhaust `require_continue` (over-limit send_back fails)
99
+
100
+ Pipeline: `max_replays: 2`, `on_max_replays: require_continue`.
101
+
102
+ **Expect:** two accepted send_backs, third rejected; `submit` never succeeds.
103
+
104
+ ```bash
105
+ npm run dev -- run \
106
+ --pipeline examples/feedback-loop/feedback-loop.pipeline.yaml \
107
+ --task examples/feedback-loop/exhaust-require-continue.task.yaml \
108
+ --json > /tmp/fb-c.json
109
+ ```
110
+
111
+ **Pass:** run failed; ~2 replays; failure mentions `max_replays` / `require_continue`; `submit` not succeeded.
112
+
113
+ ```bash
114
+ RUN=$(jq -r .runId /tmp/fb-c.json)
115
+ npm run dev -- runs show --run "$RUN" --json | jq '{
116
+ status,
117
+ failed_stage_id,
118
+ failed_reason,
119
+ replay_count: (.feedback_loops[0].replays | length),
120
+ submit: [.stages[] | select(.stage_id=="submit") | .status]
121
+ }'
122
+ ```
123
+
124
+ **Fail:** third send_back accepted; run succeeds; or parks for human (wrong policy).
125
+
126
+ ---
127
+
128
+ ## Scenario D — Exhaust `wait_for_human`, then decide
129
+
130
+ Pipeline: `feedback-loop-wait-human.pipeline.yaml` (`max_replays: 1`, `on_max_replays: wait_for_human`).
131
+
132
+ **Pairing:** You **must** use `feedback-loop-wait-human.pipeline.yaml` with `exhaust-wait-human.task.yaml`. The default `feedback-loop.pipeline.yaml` uses `require_continue` — wrong pipeline means **no human ask** (run fails on over-limit send_back instead of parking). Every review success until park must `send_back` (never `continue`).
133
+
134
+ **Expect:** second send_back parks the run; you choose extend / continue / abandon.
135
+
136
+ Prefer **no** `sf ui` on `:3847` if you will use CLI decide.
137
+
138
+ ```bash
139
+ npm run dev -- run \
140
+ --pipeline examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml \
141
+ --task examples/feedback-loop/exhaust-wait-human.task.yaml \
142
+ --json > /tmp/fb-d.json
143
+ # Exit 2 when parked waiting is normal
144
+ ```
145
+
146
+ Inspect the park:
147
+
148
+ ```bash
149
+ RUN=$(jq -r .runId /tmp/fb-d.json)
150
+ npm run dev -- runs waiting --run "$RUN" --json
151
+ npm run dev -- runs show --run "$RUN" --json | jq '.active_feedback_loop | {
152
+ state, policy, deferred_send_back
153
+ }'
154
+ ```
155
+
156
+ Expect `waiting_kind: "feedback_loop_decision"`, `state: "waiting_for_human"`, deferred target `implement`.
157
+
158
+ Pick **one** decision (host down for CLI):
159
+
160
+ ```bash
161
+ # Extra replay budget, then agent should continue later
162
+ npm run dev -- runs feedback-decide --run "$RUN" --stage review --decision extend --json
163
+
164
+ # Or release downstream without another replay
165
+ npm run dev -- runs feedback-decide --run "$RUN" --stage review --decision continue --json
166
+
167
+ # Or fail the run
168
+ npm run dev -- runs feedback-decide --run "$RUN" --stage review --decision abandon --reason "stop" --json
169
+ ```
170
+
171
+ With `sf ui` instead: open the run → FeedbackDecidePanel → Extend / Continue / Abandon.
172
+
173
+ After decide, wait for terminal if needed:
174
+
175
+ ```bash
176
+ npm run dev -- runs wait --run "$RUN" --until terminal --timeout-ms 240000 --json
177
+ ```
178
+
179
+ **Pass:**
180
+
181
+ | Decision | Expect |
182
+ |----------|--------|
183
+ | `extend` | `effect: extended`; another implement→review; then continue → submit; `max_replays` bumped by 1 |
184
+ | `continue` | `effect: continued`; submit runs; no further replay |
185
+ | `abandon` | run `failed`; submit never runs |
186
+
187
+ **Fail:** second send_back rejected instead of parking; decide refused while host is still up.
188
+
189
+ ---
190
+
191
+ ## Quick matrix
192
+
193
+ | Scenario | Pipeline | Task | Cost note |
194
+ |----------|----------|------|-----------|
195
+ | A Continue | `feedback-loop.pipeline.yaml` | `continue-only.task.yaml` | ~4 stages |
196
+ | B One send_back | `feedback-loop.pipeline.yaml` | `send-back-once.task.yaml` | ~6 stage runs |
197
+ | C require_continue exhaust | `feedback-loop.pipeline.yaml` | `exhaust-require-continue.task.yaml` | ~7+ stage runs, expects failure |
198
+ | D wait_for_human | `feedback-loop-wait-human.pipeline.yaml` | `exhaust-wait-human.task.yaml` | parks; then decide |
199
+
200
+ Clone-chain Loop from Join is covered by fixture
201
+ [`tests/fixtures/pipelines/clone-chain-loop-from-join.pipeline.yaml`](../../tests/fixtures/pipelines/clone-chain-loop-from-join.pipeline.yaml),
202
+ not this walkthrough.
203
+
204
+ ## References
205
+
206
+ - [YAML catalog — Feedback loops](../../docs/yaml-catalog.md#feedback-loops)
207
+ - [CLI — feedback-decide](../../docs/cli-reference.md#sf-runs-feedback-decide)
208
+ - [Envelopes — Feedback loops](../../docs/envelopes.md#feedback-loops)
@@ -0,0 +1,4 @@
1
+ id: feedback-loop-continue-only
2
+ goal: Draft a short brief and submit it after review continues on the first pass
3
+ context: Verification scenario — review must emit continue (no send_back)
4
+ constraints: Docs only. review must emit feedback_loop.action continue on the first success.
@@ -0,0 +1,6 @@
1
+ id: feedback-loop-exhaust-require-continue
2
+ goal: Keep sending work back from review until the loop rejects further send_back
3
+ context: Verification scenario — force require_continue max_replays exhaustion
4
+ constraints: |
5
+ Docs only. Every successful review must emit feedback_loop send_back target implement.
6
+ Never emit continue. Expect the third send_back to fail after max_replays 2.
@@ -0,0 +1,11 @@
1
+ id: feedback-loop-exhaust-wait-human
2
+ goal: Send work back twice so the loop parks for a human decision
3
+ context: Verification scenario — wait_for_human after max_replays 1
4
+ constraints: |
5
+ MUST pair with pipeline feedback-loop-wait-human.pipeline.yaml
6
+ (on_max_replays: wait_for_human, max_replays: 1). Do NOT use
7
+ feedback-loop.pipeline.yaml (require_continue) — that never asks a human.
8
+ Docs only. Every review success until the run parks MUST emit send_back
9
+ target implement — never emit continue. First review: send_back implement;
10
+ after replay, second review: send_back implement again so the loop parks
11
+ for feedback-decide.
@@ -0,0 +1,23 @@
1
+ id: feedback-loop-wait-human
2
+ stages:
3
+ - id: plan
4
+ entry: true
5
+ route:
6
+ - to: implement
7
+ uses: ./plan.yaml
8
+ - id: implement
9
+ route:
10
+ - to: review
11
+ uses: ./implement.yaml
12
+ - id: review
13
+ route:
14
+ - to: submit
15
+ - type: loop
16
+ to: implement
17
+ max_replays: 1
18
+ on_max_replays: wait_for_human
19
+ replay_session: resume
20
+ uses: ./review.yaml
21
+ - id: submit
22
+ uses: ./submit.yaml
23
+ replay_safe: false
@@ -0,0 +1,23 @@
1
+ id: feedback-loop
2
+ stages:
3
+ - id: plan
4
+ entry: true
5
+ route:
6
+ - to: implement
7
+ uses: ./plan.yaml
8
+ - id: implement
9
+ route:
10
+ - to: review
11
+ uses: ./implement.yaml
12
+ - id: review
13
+ route:
14
+ - to: submit
15
+ - type: loop
16
+ to: implement
17
+ max_replays: 2
18
+ on_max_replays: require_continue
19
+ replay_session: resume
20
+ uses: ./review.yaml
21
+ - id: submit
22
+ uses: ./submit.yaml
23
+ replay_safe: false
@@ -0,0 +1,4 @@
1
+ id: feedback-loop
2
+ goal: Draft a short brief, revise it until a review stage continues, then submit
3
+ context: Domain-neutral feedback-loop walkthrough — plan → implement → review → submit
4
+ constraints: Docs only; no implementation code. Prefer one send_back then continue.
@@ -0,0 +1,14 @@
1
+ id: implement
2
+ system_prompt: |
3
+ Produce the work described by the upstream plan envelope.
4
+ Keep the deliverable short (a brief outline or draft).
5
+ Emit a success envelope summarizing what you produced.
6
+ On a feedback replay, read Feedback Loop Context and address the review feedback.
7
+ model: omniroute/auto
8
+ io:
9
+ input:
10
+ schema:
11
+ type: object
12
+ output:
13
+ schema:
14
+ type: object
@@ -0,0 +1,14 @@
1
+ id: plan
2
+ system_prompt: |
3
+ Create a short plan for the task goal.
4
+ List the sections you will produce and any open questions.
5
+ Emit a success envelope with a clear summary when done.
6
+ On a feedback replay, read Feedback Loop Context and revise the plan to address the send-back.
7
+ model: omniroute/auto
8
+ io:
9
+ input:
10
+ schema:
11
+ type: object
12
+ output:
13
+ schema:
14
+ type: object
@@ -0,0 +1,15 @@
1
+ id: review
2
+ system_prompt: |
3
+ Review the upstream work against the task goal.
4
+ On success you MUST include feedback_loop in emit_stage_envelope:
5
+ - {"action":"continue"} when the work is good enough to submit
6
+ - {"action":"send_back","target":"implement"} when another pass is needed
7
+ Prefer at most one send_back in this walkthrough, then continue.
8
+ model: omniroute/auto
9
+ io:
10
+ input:
11
+ schema:
12
+ type: object
13
+ output:
14
+ schema:
15
+ type: object
@@ -0,0 +1,6 @@
1
+ id: feedback-loop-send-back-once
2
+ goal: Draft a short brief, send it back once from review, then continue and submit
3
+ context: Verification scenario — exactly one send_back to implement, then continue
4
+ constraints: |
5
+ Docs only. On the first review success, emit feedback_loop send_back target implement.
6
+ On the second review success, emit feedback_loop continue. Do not send_back twice.
@@ -0,0 +1,12 @@
1
+ id: submit
2
+ system_prompt: |
3
+ Submit the approved work. Summarize the final brief in the envelope.
4
+ This stage is replay_safe: false — it runs only after review continues.
5
+ model: omniroute/auto
6
+ io:
7
+ input:
8
+ schema:
9
+ type: object
10
+ output:
11
+ schema:
12
+ type: object