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.
- package/README.md +14 -3
- package/builtin-skills/browser/SKILL.md +42 -0
- package/dist/a2a/contracts.d.ts +1 -0
- package/dist/a2a/contracts.js +1 -0
- package/dist/a2a/registry.d.ts +2 -0
- package/dist/a2a/registry.js +20 -1
- package/dist/a2a/server.d.ts +7 -0
- package/dist/a2a/server.js +5 -2
- package/dist/a2a/service.d.ts +1 -1
- package/dist/a2a/service.js +57 -8
- package/dist/a2a/store.d.ts +8 -5
- package/dist/a2a/store.js +24 -67
- package/dist/agent/activity.d.ts +3 -0
- package/dist/agent/bootProviderConfig.d.ts +21 -0
- package/dist/agent/bootProviderConfig.js +74 -0
- package/dist/agent/claudeAdapter.js +2 -2
- package/dist/agent/cursorProvider.d.ts +2 -0
- package/dist/agent/cursorProvider.js +30 -5
- package/dist/agent/fakeAgent.d.ts +1 -0
- package/dist/agent/fakeAgent.js +13 -0
- package/dist/agent/piAdapter.d.ts +11 -24
- package/dist/agent/piAdapter.js +107 -50
- package/dist/agent/piIsolatedMcp.d.ts +2 -0
- package/dist/agent/piIsolatedMcp.js +10 -2
- package/dist/agent/piSessionFactory.d.ts +38 -0
- package/dist/agent/piSessionFactory.js +60 -0
- package/dist/agent/port.d.ts +8 -0
- package/dist/agent/streamLogRedact.d.ts +7 -1
- package/dist/agent/streamLogRedact.js +26 -11
- package/dist/browser/anchor.d.ts +27 -0
- package/dist/browser/anchor.js +127 -0
- package/dist/browser/auditSink.d.ts +38 -0
- package/dist/browser/auditSink.js +34 -0
- package/dist/browser/browserHost.d.ts +86 -0
- package/dist/browser/browserHost.js +7 -0
- package/dist/browser/browserSweep.d.ts +14 -0
- package/dist/browser/browserSweep.js +54 -0
- package/dist/browser/browserTeardown.d.ts +56 -0
- package/dist/browser/browserTeardown.js +235 -0
- package/dist/browser/fakeRemoteBrowserHost.d.ts +2 -0
- package/dist/browser/fakeRemoteBrowserHost.js +34 -0
- package/dist/browser/gateHandoff.d.ts +25 -0
- package/dist/browser/gateHandoff.js +83 -0
- package/dist/browser/humanLogin.d.ts +18 -0
- package/dist/browser/humanLogin.js +34 -0
- package/dist/browser/keyProvider.d.ts +10 -0
- package/dist/browser/keyProvider.js +39 -0
- package/dist/browser/localBrowserHost.d.ts +10 -0
- package/dist/browser/localBrowserHost.js +152 -0
- package/dist/browser/localProfileLock.d.ts +2 -0
- package/dist/browser/localProfileLock.js +218 -0
- package/dist/browser/localProfileStore.d.ts +5 -0
- package/dist/browser/localProfileStore.js +91 -0
- package/dist/browser/loginCheck.d.ts +53 -0
- package/dist/browser/loginCheck.js +147 -0
- package/dist/browser/memoryProfileLock.d.ts +2 -0
- package/dist/browser/memoryProfileLock.js +53 -0
- package/dist/browser/memoryProfileStore.d.ts +2 -0
- package/dist/browser/memoryProfileStore.js +31 -0
- package/dist/browser/navigationAudit.d.ts +16 -0
- package/dist/browser/navigationAudit.js +53 -0
- package/dist/browser/persistedEnv.d.ts +3 -0
- package/dist/browser/persistedEnv.js +15 -0
- package/dist/browser/profileLock.d.ts +40 -0
- package/dist/browser/profileLock.js +10 -0
- package/dist/browser/profileStore.d.ts +23 -0
- package/dist/browser/profileStore.js +39 -0
- package/dist/browser/runLiveness.d.ts +13 -0
- package/dist/browser/runLiveness.js +39 -0
- package/dist/browser/sitePolicy.d.ts +10 -0
- package/dist/browser/sitePolicy.js +61 -0
- package/dist/browser/stageBrowserEnv.d.ts +22 -0
- package/dist/browser/stageBrowserEnv.js +147 -0
- package/dist/browser/stageProfileLock.d.ts +17 -0
- package/dist/browser/stageProfileLock.js +39 -0
- package/dist/cli/artifactCommand.js +9 -16
- package/dist/cli/backupCommand.d.ts +9 -0
- package/dist/cli/backupCommand.js +111 -0
- package/dist/cli/browserCommand.d.ts +44 -0
- package/dist/cli/browserCommand.js +472 -0
- package/dist/cli/debugRunCommand.d.ts +10 -0
- package/dist/cli/debugRunCommand.js +109 -0
- package/dist/cli/doctorCommand.d.ts +32 -0
- package/dist/cli/doctorCommand.js +453 -0
- package/dist/cli/envelopeCommand.js +9 -2
- package/dist/cli/exportAllCommand.d.ts +55 -0
- package/dist/cli/exportAllCommand.js +218 -0
- package/dist/cli/exportRunCommand.js +23 -21
- package/dist/cli/hostClient.d.ts +41 -3
- package/dist/cli/hostClient.js +129 -14
- package/dist/cli/initCommand.d.ts +1 -0
- package/dist/cli/initCommand.js +23 -7
- package/dist/cli/initTemplates.d.ts +5 -2
- package/dist/cli/initTemplates.js +32 -2
- package/dist/cli/resolveSafeOutPath.d.ts +2 -0
- package/dist/cli/resolveSafeOutPath.js +40 -0
- package/dist/cli/restoreCommand.d.ts +10 -0
- package/dist/cli/restoreCommand.js +90 -0
- package/dist/cli/runCommand.d.ts +3 -2
- package/dist/cli/runCommand.js +93 -11
- package/dist/cli/runOutput.d.ts +4 -0
- package/dist/cli/runOutput.js +33 -7
- package/dist/cli/runStageCommand.d.ts +1 -0
- package/dist/cli/runStageCommand.js +44 -25
- package/dist/cli/runsCommand.d.ts +1 -1
- package/dist/cli/runsCommand.js +168 -10
- package/dist/cli/triggerCommand.d.ts +12 -0
- package/dist/cli/triggerCommand.js +183 -0
- package/dist/cli/validateCommand.d.ts +1 -1
- package/dist/cli/validateCommand.js +23 -6
- package/dist/cli.js +202 -32
- package/dist/config/browseCatalog.d.ts +1 -0
- package/dist/config/browseCatalog.js +5 -4
- package/dist/config/builtinSkills.d.ts +4 -0
- package/dist/config/builtinSkills.js +23 -0
- package/dist/config/catalogRelativePath.d.ts +63 -0
- package/dist/config/catalogRelativePath.js +126 -0
- package/dist/config/configOrigin.d.ts +27 -0
- package/dist/config/configOrigin.js +59 -0
- package/dist/config/createTrigger.d.ts +27 -0
- package/dist/config/createTrigger.js +232 -0
- package/dist/config/draftPackage.d.ts +117 -0
- package/dist/config/draftPackage.js +550 -0
- package/dist/config/ensureCatalogScanRoot.d.ts +16 -0
- package/dist/config/ensureCatalogScanRoot.js +73 -0
- package/dist/config/hostConfig.d.ts +57 -0
- package/dist/config/hostConfig.js +360 -0
- package/dist/config/listSkills.d.ts +26 -0
- package/dist/config/listSkills.js +206 -5
- package/dist/config/loadOutcome.d.ts +7 -1
- package/dist/config/loadPipeline.js +39 -2
- package/dist/config/loadStage.js +25 -0
- package/dist/config/loadStageflowManifest.js +25 -0
- package/dist/config/loadTask.d.ts +2 -0
- package/dist/config/loadTask.js +57 -18
- package/dist/config/loadTrigger.d.ts +9 -0
- package/dist/config/loadTrigger.js +120 -0
- package/dist/config/materializeStageModels.js +5 -1
- package/dist/config/mergePipelineIncludes.d.ts +3 -0
- package/dist/config/mergePipelineIncludes.js +19 -0
- package/dist/config/migrateYaml.js +6 -11
- package/dist/config/multiProjectCatalog.d.ts +32 -0
- package/dist/config/multiProjectCatalog.js +150 -0
- package/dist/config/normalizePipelineStageEntry.js +27 -1
- package/dist/config/parseCompletionContract.js +6 -0
- package/dist/config/pipelineStageKeys.js +3 -0
- package/dist/config/publishDraftPackage.d.ts +7 -0
- package/dist/config/publishDraftPackage.js +25 -0
- package/dist/config/resolveCatalogContext.js +1 -1
- package/dist/config/resolveCatalogRoots.d.ts +27 -0
- package/dist/config/resolveCatalogRoots.js +76 -0
- package/dist/config/resolveModel.d.ts +7 -1
- package/dist/config/resolveModel.js +11 -1
- package/dist/config/resolvePipelineDag.js +1 -1
- package/dist/config/resolveStageMcpServers.d.ts +9 -1
- package/dist/config/resolveStageMcpServers.js +36 -9
- package/dist/config/scanCatalogPaths.d.ts +1 -1
- package/dist/config/scanCatalogPaths.js +6 -2
- package/dist/config/secretFromEnvOrFile.d.ts +9 -0
- package/dist/config/secretFromEnvOrFile.js +34 -0
- package/dist/config/seededCatalog.d.ts +11 -0
- package/dist/config/seededCatalog.js +29 -0
- package/dist/config/stageBrowser.d.ts +12 -0
- package/dist/config/stageBrowser.js +118 -0
- package/dist/config/toolRequires.d.ts +24 -0
- package/dist/config/toolRequires.js +115 -0
- package/dist/config/triggerCatalog.d.ts +10 -0
- package/dist/config/triggerCatalog.js +37 -0
- package/dist/config/validateCatalog.d.ts +17 -3
- package/dist/config/validateCatalog.js +223 -3
- package/dist/config/validateCompletionContract.js +8 -0
- package/dist/diagnostics/checks.d.ts +39 -0
- package/dist/diagnostics/checks.js +135 -0
- package/dist/envelope/preEmitChecks.d.ts +1 -1
- package/dist/envelope/preEmitChecks.js +8 -0
- package/dist/errors/codes.d.ts +14 -0
- package/dist/errors/codes.js +59 -0
- package/dist/git/cache.d.ts +14 -0
- package/dist/git/cache.js +150 -0
- package/dist/git/credentials.d.ts +9 -0
- package/dist/git/credentials.js +88 -0
- package/dist/git/errors.d.ts +20 -0
- package/dist/git/errors.js +94 -0
- package/dist/git/exec.d.ts +16 -0
- package/dist/git/exec.js +135 -0
- package/dist/git/operations.d.ts +29 -0
- package/dist/git/operations.js +153 -0
- package/dist/git/version.d.ts +1 -0
- package/dist/git/version.js +10 -0
- package/dist/logging/audit.d.ts +16 -0
- package/dist/logging/audit.js +19 -0
- package/dist/logging/commonWords.d.ts +2 -0
- package/dist/logging/commonWords.js +13 -0
- package/dist/logging/logger.d.ts +49 -0
- package/dist/logging/logger.js +193 -0
- package/dist/logging/namedSecrets.d.ts +6 -0
- package/dist/logging/namedSecrets.js +58 -0
- package/dist/logging/redact.d.ts +17 -0
- package/dist/logging/redact.js +105 -0
- package/dist/mcp/catalogTools.js +492 -81
- package/dist/mcp/checkoutTools.d.ts +52 -0
- package/dist/mcp/checkoutTools.js +332 -0
- package/dist/mcp/controlTools.js +182 -6
- package/dist/mcp/deps.d.ts +3 -0
- package/dist/mcp/getStartedTool.d.ts +3 -0
- package/dist/mcp/getStartedTool.js +62 -0
- package/dist/mcp/readArtifact.d.ts +11 -0
- package/dist/mcp/readArtifact.js +46 -30
- package/dist/mcp/server.js +2 -0
- package/dist/mcp/tools.js +6 -0
- package/dist/mcp/triggerTools.d.ts +3 -0
- package/dist/mcp/triggerTools.js +176 -0
- package/dist/net/proxy.d.ts +14 -0
- package/dist/net/proxy.js +78 -0
- package/dist/operatorAgent/docsRetrieval.d.ts +40 -0
- package/dist/operatorAgent/docsRetrieval.js +269 -0
- package/dist/operatorAgent/draftContext.d.ts +16 -0
- package/dist/operatorAgent/draftContext.js +68 -0
- package/dist/operatorAgent/fakeHost.d.ts +39 -0
- package/dist/operatorAgent/fakeHost.js +92 -0
- package/dist/operatorAgent/host.d.ts +40 -0
- package/dist/operatorAgent/host.js +179 -0
- package/dist/operatorAgent/index.d.ts +9 -0
- package/dist/operatorAgent/index.js +8 -0
- package/dist/operatorAgent/piModel.d.ts +80 -0
- package/dist/operatorAgent/piModel.js +528 -0
- package/dist/operatorAgent/profiles/workshopAuthor.d.ts +23 -0
- package/dist/operatorAgent/profiles/workshopAuthor.js +338 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.d.ts +6 -0
- package/dist/operatorAgent/profiles/workshopAuthorPlaybook.js +103 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.d.ts +57 -0
- package/dist/operatorAgent/profiles/workshopAuthorTools.js +623 -0
- package/dist/operatorAgent/proposals.d.ts +32 -0
- package/dist/operatorAgent/proposals.js +144 -0
- package/dist/operatorAgent/types.d.ts +128 -0
- package/dist/operatorAgent/types.js +1 -0
- package/dist/package-meta.d.ts +2 -1
- package/dist/package-meta.js +2 -1
- package/dist/preflight/bash.d.ts +8 -0
- package/dist/preflight/bash.js +34 -0
- package/dist/preflight/claudeRoot.d.ts +11 -0
- package/dist/preflight/claudeRoot.js +23 -0
- package/dist/preflight/mcpCommands.d.ts +8 -0
- package/dist/preflight/mcpCommands.js +36 -0
- package/dist/preflight/pipelinePreflight.d.ts +40 -0
- package/dist/preflight/pipelinePreflight.js +192 -0
- package/dist/preflight/tls.d.ts +6 -0
- package/dist/preflight/tls.js +18 -0
- package/dist/preflight/toolchain.d.ts +45 -0
- package/dist/preflight/toolchain.js +219 -0
- package/dist/project/findManifestRoot.d.ts +3 -0
- package/dist/project/findManifestRoot.js +35 -0
- package/dist/project/findProjectRoot.js +3 -4
- package/dist/project/globalHome.d.ts +7 -0
- package/dist/project/globalHome.js +63 -2
- package/dist/project/resolveProjectContext.js +2 -2
- package/dist/project/resolveStageflowContext.d.ts +7 -0
- package/dist/project/resolveStageflowContext.js +46 -30
- package/dist/projection/projectRun.d.ts +2 -1
- package/dist/projection/projectRun.js +1 -0
- package/dist/runstore/assertTmpdir.d.ts +1 -0
- package/dist/runstore/assertTmpdir.js +25 -0
- package/dist/runstore/backup.d.ts +52 -0
- package/dist/runstore/backup.js +292 -0
- package/dist/runstore/createStore.d.ts +18 -1
- package/dist/runstore/createStore.js +64 -5
- package/dist/runstore/debugBundle.d.ts +60 -0
- package/dist/runstore/debugBundle.js +143 -0
- package/dist/runstore/diskUsage.d.ts +50 -0
- package/dist/runstore/diskUsage.js +214 -0
- package/dist/runstore/exportRunPayload.d.ts +8 -0
- package/dist/runstore/exportRunPayload.js +23 -0
- package/dist/runstore/normalizeCatalogPath.d.ts +1 -0
- package/dist/runstore/normalizeCatalogPath.js +10 -0
- package/dist/runstore/paths.d.ts +5 -0
- package/dist/runstore/paths.js +145 -1
- package/dist/runstore/port.d.ts +139 -13
- package/dist/runstore/port.js +8 -1
- package/dist/runstore/restore.d.ts +81 -0
- package/dist/runstore/restore.js +355 -0
- package/dist/runstore/retention.d.ts +27 -0
- package/dist/runstore/retention.js +74 -0
- package/dist/runstore/runManifest.d.ts +146 -0
- package/dist/runstore/runManifest.js +288 -0
- package/dist/runstore/runProjection.d.ts +3 -1
- package/dist/runstore/runProjection.js +63 -1
- package/dist/runstore/sqlite/SqliteRunStore.d.ts +35 -3
- package/dist/runstore/sqlite/SqliteRunStore.js +442 -219
- package/dist/runstore/sqlite/applyStorePragmas.d.ts +39 -0
- package/dist/runstore/sqlite/applyStorePragmas.js +145 -0
- package/dist/runstore/sqlite/migrations/001-baseline.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/001-baseline.js +10 -0
- package/dist/runstore/sqlite/migrations/002-repository-binding.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/002-repository-binding.js +29 -0
- package/dist/runstore/sqlite/migrations/003-run-lifecycle.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/003-run-lifecycle.js +28 -0
- package/dist/runstore/sqlite/migrations/004-auto-resume-count.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/004-auto-resume-count.js +19 -0
- package/dist/runstore/sqlite/migrations/005-config-origins.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/005-config-origins.js +19 -0
- package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/006-pipeline-body-and-caller.js +28 -0
- package/dist/runstore/sqlite/migrations/007-projects-registry.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/007-projects-registry.js +31 -0
- package/dist/runstore/sqlite/migrations/008-triggers-table.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/008-triggers-table.js +19 -0
- package/dist/runstore/sqlite/migrations/009-trigger-next-run.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/009-trigger-next-run.js +19 -0
- package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.d.ts +7 -0
- package/dist/runstore/sqlite/migrations/010-trigger-adapter-state.js +17 -0
- package/dist/runstore/sqlite/migrations/index.d.ts +21 -0
- package/dist/runstore/sqlite/migrations/index.js +78 -0
- package/dist/runstore/sqlite/schema.d.ts +20 -1
- package/dist/runstore/sqlite/schema.js +277 -1
- package/dist/runstore/sqlite/storeOpenError.d.ts +6 -0
- package/dist/runstore/sqlite/storeOpenError.js +11 -0
- package/dist/runstore/sqlite/storeSchemaError.d.ts +5 -0
- package/dist/runstore/sqlite/storeSchemaError.js +8 -0
- package/dist/runstore/stageExecution.js +3 -0
- package/dist/runstore/storeFilesystem.d.ts +32 -0
- package/dist/runstore/storeFilesystem.js +148 -0
- package/dist/runstore/trackProjection.js +2 -0
- package/dist/runstore/workspaceLayout.d.ts +13 -0
- package/dist/runstore/workspaceLayout.js +76 -0
- package/dist/runtime/answerResume.d.ts +1 -0
- package/dist/runtime/answerResume.js +3 -1
- package/dist/runtime/completionCheckRunner.d.ts +15 -1
- package/dist/runtime/completionCheckRunner.js +67 -7
- package/dist/runtime/containerLimits.d.ts +16 -0
- package/dist/runtime/containerLimits.js +84 -0
- package/dist/runtime/credentialBinding.d.ts +2 -0
- package/dist/runtime/credentialBinding.js +3 -0
- package/dist/runtime/credentialMaterialisation.d.ts +28 -0
- package/dist/runtime/credentialMaterialisation.js +128 -0
- package/dist/runtime/emailSource.d.ts +72 -0
- package/dist/runtime/emailSource.js +304 -0
- package/dist/runtime/gitCheckoutCapability.js +7 -13
- package/dist/runtime/githubPollSource.d.ts +86 -0
- package/dist/runtime/githubPollSource.js +284 -0
- package/dist/runtime/pipelineRunner.d.ts +40 -1
- package/dist/runtime/pipelineRunner.js +181 -17
- package/dist/runtime/pipelineScheduler.d.ts +17 -0
- package/dist/runtime/pipelineScheduler.js +220 -28
- package/dist/runtime/reloadRunCatalog.js +6 -1
- package/dist/runtime/repositoryMaterialize.d.ts +47 -0
- package/dist/runtime/repositoryMaterialize.js +235 -0
- package/dist/runtime/resumeTimedOut.d.ts +1 -1
- package/dist/runtime/resumeTimedOut.js +5 -2
- package/dist/runtime/runChangeBus.js +9 -0
- package/dist/runtime/runDeletion.d.ts +7 -0
- package/dist/runtime/runDeletion.js +37 -0
- package/dist/runtime/runManager.d.ts +169 -4
- package/dist/runtime/runManager.js +1748 -83
- package/dist/runtime/runRetentionSweep.d.ts +31 -0
- package/dist/runtime/runRetentionSweep.js +328 -0
- package/dist/runtime/runRetryCoordinator.d.ts +4 -0
- package/dist/runtime/runRetryCoordinator.js +20 -2
- package/dist/runtime/runSkills.d.ts +40 -0
- package/dist/runtime/runSkills.js +173 -0
- package/dist/runtime/scheduleSource.d.ts +38 -0
- package/dist/runtime/scheduleSource.js +119 -0
- package/dist/runtime/settingsFile.d.ts +5 -0
- package/dist/runtime/settingsFile.js +61 -54
- package/dist/runtime/stageAttemptBootstrap.d.ts +5 -1
- package/dist/runtime/stageAttemptBootstrap.js +250 -27
- package/dist/runtime/stageCacheEnv.d.ts +6 -0
- package/dist/runtime/stageCacheEnv.js +34 -0
- package/dist/runtime/stageConcurrency.d.ts +2 -1
- package/dist/runtime/stageConcurrency.js +4 -2
- package/dist/runtime/stageEnvironment.d.ts +38 -0
- package/dist/runtime/stageEnvironment.js +194 -0
- package/dist/runtime/stageHitl.d.ts +1 -0
- package/dist/runtime/stageHitl.js +5 -1
- package/dist/runtime/stageProcessLauncher.d.ts +20 -0
- package/dist/runtime/stageProcessLauncher.js +236 -41
- package/dist/runtime/stageRecovery.d.ts +3 -1
- package/dist/runtime/stageRecovery.js +19 -4
- package/dist/runtime/stageRoots.d.ts +38 -1
- package/dist/runtime/stageRoots.js +118 -0
- package/dist/runtime/stageRunner.d.ts +6 -0
- package/dist/runtime/stageRunner.js +32 -6
- package/dist/runtime/stageSecretDecl.d.ts +9 -0
- package/dist/runtime/stageSecretDecl.js +102 -0
- package/dist/runtime/stageSecrets.d.ts +40 -0
- package/dist/runtime/stageSecrets.js +181 -0
- package/dist/runtime/stageStreamLog.d.ts +1 -0
- package/dist/runtime/stageStreamLog.js +2 -1
- package/dist/runtime/stageWorker.d.ts +3 -2
- package/dist/runtime/stageWorker.js +58 -10
- package/dist/runtime/stageWorkerProtocol.d.ts +5 -0
- package/dist/runtime/stageWorkerProtocol.js +8 -0
- package/dist/runtime/startPayload.d.ts +32 -0
- package/dist/runtime/startPayload.js +59 -0
- package/dist/runtime/taskInput.js +14 -5
- package/dist/runtime/triggerCatalog.d.ts +6 -0
- package/dist/runtime/triggerCatalog.js +24 -0
- package/dist/runtime/triggerEventMatch.d.ts +2 -0
- package/dist/runtime/triggerEventMatch.js +6 -0
- package/dist/runtime/triggerPort.d.ts +14 -0
- package/dist/runtime/triggerPort.js +1 -0
- package/dist/runtime/triggerRunner.d.ts +17 -0
- package/dist/runtime/triggerRunner.js +89 -0
- package/dist/runtime/verifiedStageExecution.d.ts +8 -0
- package/dist/runtime/verifiedStageExecution.js +16 -1
- package/dist/runtime/webhookSignature.d.ts +1 -0
- package/dist/runtime/webhookSignature.js +12 -0
- package/dist/runtime/workspaceBinding.d.ts +20 -0
- package/dist/runtime/workspaceBinding.js +60 -0
- package/dist/server/allowedHosts.d.ts +19 -0
- package/dist/server/allowedHosts.js +179 -0
- package/dist/server/bootstrap.d.ts +42 -2
- package/dist/server/bootstrap.js +273 -5
- package/dist/server/controlToken.d.ts +47 -0
- package/dist/server/controlToken.js +254 -0
- package/dist/server/createHttpHost.d.ts +11 -2
- package/dist/server/createHttpHost.js +106 -10
- package/dist/server/ensureGlobalService.d.ts +5 -1
- package/dist/server/ensureGlobalService.js +35 -1
- package/dist/server/healthSurfaces.d.ts +6 -0
- package/dist/server/healthSurfaces.js +123 -0
- package/dist/server/http.d.ts +27 -1
- package/dist/server/http.js +2254 -477
- package/dist/server/listenHost.d.ts +5 -0
- package/dist/server/listenHost.js +56 -0
- package/dist/server/mcpHost.d.ts +10 -1
- package/dist/server/mcpHost.js +36 -6
- package/dist/server/operatorResults.d.ts +2 -2
- package/dist/server/operatorResults.js +40 -29
- package/dist/server/requestAuthContext.d.ts +12 -0
- package/dist/server/requestAuthContext.js +21 -0
- package/dist/server/shutdown.d.ts +69 -0
- package/dist/server/shutdown.js +219 -0
- package/dist/server/triggerRoutes.d.ts +15 -0
- package/dist/server/triggerRoutes.js +268 -0
- package/dist/tools/askOperator.d.ts +3 -2
- package/dist/types/completion.d.ts +3 -0
- package/dist/types/pipeline.d.ts +10 -1
- package/dist/types/preEmitCheck.d.ts +7 -0
- package/dist/types/stage.d.ts +22 -0
- package/dist/types/stageflowManifest.d.ts +3 -0
- package/dist/types/task.d.ts +8 -0
- package/dist/types/trigger.d.ts +18 -0
- package/dist/types/trigger.js +1 -0
- package/dist/ui/assets/{index-CSsDued1.css → index-Bv4p1aPK.css} +1 -1
- package/dist/ui/assets/index-CntB4bZR.js +133 -0
- package/dist/ui/index.html +2 -2
- package/dist/workshop/autosave.d.ts +58 -0
- package/dist/workshop/autosave.js +222 -0
- package/dist/workshop/buildStore.d.ts +79 -0
- package/dist/workshop/buildStore.js +326 -0
- package/dist/workshop/chatTurn.d.ts +232 -0
- package/dist/workshop/chatTurn.js +475 -0
- package/dist/workshop/modelSettings.d.ts +18 -0
- package/dist/workshop/modelSettings.js +44 -0
- package/dist/workshop/sessionStore.d.ts +61 -0
- package/dist/workshop/sessionStore.js +254 -0
- package/dist/workshop/workshopPin.d.ts +72 -0
- package/dist/workshop/workshopPin.js +193 -0
- package/examples/README.md +99 -0
- package/examples/archify-on-pr/README.md +213 -0
- package/examples/archify-on-pr/archify-on-pr.pipeline.yaml +19 -0
- package/examples/archify-on-pr/archify-on-pr.task.yaml +19 -0
- package/examples/archify-on-pr/author-diagrams.yaml +106 -0
- package/examples/archify-on-pr/detect-changes.yaml +89 -0
- package/examples/browser-session/README.md +77 -0
- package/examples/browser-session/browser-session.pipeline.yaml +50 -0
- package/examples/browser-session/browser-session.task.yaml +6 -0
- package/examples/browser-session/check-login.yaml +22 -0
- package/examples/browser-session/fixture-server.mjs +64 -0
- package/examples/browser-session/human-login.yaml +31 -0
- package/examples/browser-session/merge.yaml +36 -0
- package/examples/browser-session/work-a.yaml +41 -0
- package/examples/browser-session/work-b.yaml +41 -0
- package/examples/ci-validate/README.md +35 -0
- package/examples/ci-validate/check.yaml +13 -0
- package/examples/ci-validate/ci-demo.pipeline.yaml +4 -0
- package/examples/ci-validate/validate.sh +5 -0
- package/examples/compliance-review-demo/README.md +125 -0
- package/examples/compliance-review-demo/compliance-review-demo.pipeline.yaml +29 -0
- package/examples/compliance-review-demo/connect-account.yaml +47 -0
- package/examples/compliance-review-demo/map-to-control.yaml +123 -0
- package/examples/compliance-review-demo/poll-bucket-config.yaml +103 -0
- package/examples/compliance-review-demo/publish-report.yaml +79 -0
- package/examples/compliance-review-demo/review-verdict.yaml +122 -0
- package/examples/compliance-review-demo/run-compliance-check.yaml +96 -0
- package/examples/compliance-review-demo/store-evidence.yaml +143 -0
- package/examples/conditional-fork/README.md +89 -0
- package/examples/conditional-fork/branch-a.yaml +13 -0
- package/examples/conditional-fork/branch-b.yaml +13 -0
- package/examples/conditional-fork/decide.yaml +35 -0
- package/examples/conditional-fork/fork-demo.pipeline.yaml +20 -0
- package/examples/conditional-fork/fork-demo.task.yaml +8 -0
- package/examples/context7-mcp/README.md +42 -0
- package/examples/context7-mcp/context7-mcp.pipeline.yaml +15 -0
- package/examples/context7-mcp/context7-mcp.task.yaml +4 -0
- package/examples/context7-mcp/fetch-docs.yaml +52 -0
- package/examples/context7-mcp/resolve-library.yaml +31 -0
- package/examples/context7-mcp/write-brief.yaml +52 -0
- package/examples/feature-loop/README.md +104 -0
- package/examples/feature-loop/address-feedback.yaml +148 -0
- package/examples/feature-loop/align.yaml +116 -0
- package/examples/feature-loop/decompose.yaml +86 -0
- package/examples/feature-loop/default-model-hierarchy.task.yaml +58 -0
- package/examples/feature-loop/feature-loop.pipeline.yaml +140 -0
- package/examples/feature-loop/feature-loop.task.yaml +25 -0
- package/examples/feature-loop/implement.yaml +128 -0
- package/examples/feature-loop/plan.yaml +111 -0
- package/examples/feature-loop/publish.yaml +167 -0
- package/examples/feature-loop/review.yaml +146 -0
- package/examples/feature-loop/verify.yaml +106 -0
- package/examples/feedback-loop/README.md +72 -0
- package/examples/feedback-loop/VERIFY.md +208 -0
- package/examples/feedback-loop/continue-only.task.yaml +4 -0
- package/examples/feedback-loop/exhaust-require-continue.task.yaml +6 -0
- package/examples/feedback-loop/exhaust-wait-human.task.yaml +11 -0
- package/examples/feedback-loop/feedback-loop-wait-human.pipeline.yaml +23 -0
- package/examples/feedback-loop/feedback-loop.pipeline.yaml +23 -0
- package/examples/feedback-loop/feedback-loop.task.yaml +4 -0
- package/examples/feedback-loop/implement.yaml +14 -0
- package/examples/feedback-loop/plan.yaml +14 -0
- package/examples/feedback-loop/review.yaml +15 -0
- package/examples/feedback-loop/send-back-once.task.yaml +6 -0
- package/examples/feedback-loop/submit.yaml +12 -0
- package/examples/generic-fan-in/README.md +151 -0
- package/examples/generic-fan-in/clarify.yaml +18 -0
- package/examples/generic-fan-in/generic-fan-in-accepted.pipeline.yaml +19 -0
- package/examples/generic-fan-in/generic-fan-in-accepted.task.yaml +8 -0
- package/examples/generic-fan-in/generic-fan-in.pipeline.yaml +18 -0
- package/examples/generic-fan-in/generic-fan-in.task.yaml +9 -0
- package/examples/generic-fan-in/research.yaml +45 -0
- package/examples/generic-fan-in/synthesize.yaml +66 -0
- package/examples/generic-fan-in/validation.yaml +45 -0
- package/examples/github-release/README.md +78 -0
- package/examples/github-release/draft-release-notes.yaml +64 -0
- package/examples/github-release/github-release.pipeline.yaml +11 -0
- package/examples/github-release/github-release.task.yaml +13 -0
- package/examples/github-release/publish-github-release.yaml +64 -0
- package/examples/hello-world/README.md +28 -0
- package/examples/hello-world/hello.pipeline.yaml +4 -0
- package/examples/hello-world/my-task.task.yaml +6 -0
- package/examples/hello-world/research.yaml +18 -0
- package/examples/mcp-hitl-tour/README.md +113 -0
- package/examples/mcp-hitl-tour/draft-angle.yaml +33 -0
- package/examples/mcp-hitl-tour/draft-short.yaml +32 -0
- package/examples/mcp-hitl-tour/emit-angles.yaml +45 -0
- package/examples/mcp-hitl-tour/gather.yaml +31 -0
- package/examples/mcp-hitl-tour/intake.yaml +62 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour-exhaust.task.yaml +13 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour.pipeline.yaml +54 -0
- package/examples/mcp-hitl-tour/mcp-hitl-tour.task.yaml +16 -0
- package/examples/mcp-hitl-tour/polish.yaml +33 -0
- package/examples/mcp-hitl-tour/review.yaml +17 -0
- package/examples/mcp-hitl-tour/ship.yaml +25 -0
- package/examples/oss-issue-contribution/README.md +218 -0
- package/examples/oss-issue-contribution/oss-address-review-feedback.yaml +117 -0
- package/examples/oss-issue-contribution/oss-approve-contribution.yaml +181 -0
- package/examples/oss-issue-contribution/oss-approve-plan.yaml +111 -0
- package/examples/oss-issue-contribution/oss-explain-fix.yaml +108 -0
- package/examples/oss-issue-contribution/oss-explain-issue.yaml +114 -0
- package/examples/oss-issue-contribution/oss-implement-source-fix.yaml +171 -0
- package/examples/oss-issue-contribution/oss-investigate-area.yaml +116 -0
- package/examples/oss-issue-contribution/oss-issue-contribution.pipeline.yaml +125 -0
- package/examples/oss-issue-contribution/oss-issue-intake.yaml +106 -0
- package/examples/oss-issue-contribution/oss-plan-investigation.yaml +112 -0
- package/examples/oss-issue-contribution/oss-plan-review.yaml +109 -0
- package/examples/oss-issue-contribution/oss-reproduce-issue.yaml +140 -0
- package/examples/oss-issue-contribution/oss-review-change.yaml +107 -0
- package/examples/oss-issue-contribution/oss-verify-fix.yaml +130 -0
- package/examples/oss-issue-contribution/oss-write-regression-test.yaml +135 -0
- package/examples/oss-issue-contribution/pi-7629.task.yaml +79 -0
- package/examples/oss-issue-contribution/pi-8919.task.yaml +75 -0
- package/examples/oss-issue-contribution/pydantic-ai-7971.task.yaml +53 -0
- package/examples/oss-quick-fix/README.md +65 -0
- package/examples/oss-quick-fix/implement-fix.yaml +84 -0
- package/examples/oss-quick-fix/oss-quick-fix.pipeline.yaml +35 -0
- package/examples/oss-quick-fix/oss-quick-fix.task.yaml +19 -0
- package/examples/oss-quick-fix/ship-fix.yaml +81 -0
- package/examples/oss-quick-fix/understand-issue.yaml +67 -0
- package/examples/oss-quick-fix/verify-fix.yaml +73 -0
- package/examples/plan-review/README.md +37 -0
- package/examples/plan-review/plan-review-followup.yaml +13 -0
- package/examples/plan-review/plan-review.pipeline.yaml +9 -0
- package/examples/plan-review/plan-review.task.yaml +9 -0
- package/examples/plan-review/plan-review.yaml +25 -0
- package/examples/playwright-mcp/README.md +39 -0
- package/examples/playwright-mcp/playwright-mcp.pipeline.yaml +5 -0
- package/examples/playwright-mcp/playwright-mcp.task.yaml +4 -0
- package/examples/playwright-mcp/screenshot.yaml +40 -0
- package/examples/retry-tour/README.md +75 -0
- package/examples/retry-tour/retry-tour.pipeline.yaml +122 -0
- package/examples/retry-tour/retry-tour.task.yaml +9 -0
- package/examples/route-if-tour/README.md +202 -0
- package/examples/route-if-tour/route-if-tour.pipeline.yaml +950 -0
- package/examples/route-if-tour/route-if-tour.task.yaml +4 -0
- package/examples/route-wiring-smoke-test/01-core-routing.pipeline.yaml +168 -0
- package/examples/route-wiring-smoke-test/02-on-gating.pipeline.yaml +44 -0
- package/examples/route-wiring-smoke-test/03-two-entry-points.pipeline.yaml +28 -0
- package/examples/route-wiring-smoke-test/04-entry-false-equivalent-to-omitted.pipeline.yaml +27 -0
- package/examples/route-wiring-smoke-test/05-fork-choice.pipeline.yaml +110 -0
- package/examples/route-wiring-smoke-test/06-fan-out-fan-in.pipeline.yaml +82 -0
- package/examples/route-wiring-smoke-test/07-loop-human-decision.pipeline.yaml +82 -0
- package/examples/route-wiring-smoke-test/08-skip-fallback-and-multi-on-gate.pipeline.yaml +77 -0
- package/examples/route-wiring-smoke-test/09-multi-loop-targets.pipeline.yaml +102 -0
- package/examples/route-wiring-smoke-test/10-uses-dialect-fork.pipeline.yaml +23 -0
- package/examples/route-wiring-smoke-test/11-sequential-io-handoff.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/12-complex-io-schemas.pipeline.yaml +138 -0
- package/examples/route-wiring-smoke-test/13-ref-io-handoff.pipeline.yaml +84 -0
- package/examples/route-wiring-smoke-test/14-if-eq-gating.pipeline.yaml +50 -0
- package/examples/route-wiring-smoke-test/15-if-all-gated.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/16-if-composition.pipeline.yaml +65 -0
- package/examples/route-wiring-smoke-test/17-if-join.pipeline.yaml +80 -0
- package/examples/route-wiring-smoke-test/README.md +377 -0
- package/examples/route-wiring-smoke-test/rejected/01-reject-legacy-needs.pipeline.yaml +26 -0
- package/examples/route-wiring-smoke-test/rejected/02-reject-legacy-fork.pipeline.yaml +25 -0
- package/examples/route-wiring-smoke-test/rejected/03-reject-legacy-feedback-loop.pipeline.yaml +30 -0
- package/examples/route-wiring-smoke-test/rejected/04-reject-missing-entry.pipeline.yaml +24 -0
- package/examples/route-wiring-smoke-test/rejected/05-reject-unreachable.pipeline.yaml +35 -0
- package/examples/route-wiring-smoke-test/rejected/06-reject-allow-none-without-route-select.pipeline.yaml +37 -0
- package/examples/route-wiring-smoke-test/rejected/07-reject-cycle.pipeline.yaml +27 -0
- package/examples/route-wiring-smoke-test/rejected/08-reject-loop-non-ancestor.pipeline.yaml +42 -0
- package/examples/route-wiring-smoke-test/rejected/09-reject-route-select-leaf.pipeline.yaml +26 -0
- package/examples/route-wiring-smoke-test/rejected/12-reject-loop-replay-unsafe.pipeline.yaml +55 -0
- package/examples/route-wiring-smoke-test/rejected/13-reject-multiple-loop-entries.pipeline.yaml +51 -0
- package/examples/route-wiring-smoke-test/rejected/14-reject-duplicate-stage-id.pipeline.yaml +35 -0
- package/examples/route-wiring-smoke-test/rejected/15-reject-unknown-route-target.pipeline.yaml +15 -0
- package/examples/route-wiring-smoke-test/rejected/16-reject-malformed-route-item.pipeline.yaml +15 -0
- package/examples/route-wiring-smoke-test/rejected/17-reject-io-incompatible.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/18-reject-nested-io.pipeline.yaml +51 -0
- package/examples/route-wiring-smoke-test/rejected/19-reject-array-item-io.pipeline.yaml +55 -0
- package/examples/route-wiring-smoke-test/rejected/20-reject-closed-io.pipeline.yaml +36 -0
- package/examples/route-wiring-smoke-test/rejected/21-reject-ref-io.pipeline.yaml +42 -0
- package/examples/route-wiring-smoke-test/rejected/22-reject-if-unknown-field.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/23-reject-if-optional-field.pipeline.yaml +32 -0
- package/examples/route-wiring-smoke-test/rejected/24-reject-if-empty-all.pipeline.yaml +31 -0
- package/examples/route-wiring-smoke-test/rejected/25-reject-if-gt-on-string.pipeline.yaml +33 -0
- package/examples/route-wiring-smoke-test/rejected/26-reject-if-optional-nested.pipeline.yaml +36 -0
- package/examples/route-wiring-smoke-test/rejected/27-reject-if-on-loop.pipeline.yaml +63 -0
- package/examples/route-wiring-smoke-test/rejected/29-reject-if-on-failed.pipeline.yaml +46 -0
- package/examples/route-wiring-smoke-test/smoke-test.task.yaml +4 -0
- package/examples/route-wiring-smoke-test/stages/branch-a.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/branch-b.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/decide.yaml +12 -0
- package/examples/route-wiring-smoke-test/stages/finish.yaml +12 -0
- package/examples/ship-feature/README.md +190 -0
- package/examples/ship-feature/feat-address-feedback.yaml +119 -0
- package/examples/ship-feature/feat-implement.yaml +180 -0
- package/examples/ship-feature/feat-plan.yaml +120 -0
- package/examples/ship-feature/feat-review.yaml +109 -0
- package/examples/ship-feature/feat-ship.yaml +203 -0
- package/examples/ship-feature/ship-feature.pipeline.yaml +44 -0
- package/examples/ship-feature/ship-feature.task.yaml +78 -0
- package/examples/stage-mcp/README.md +145 -0
- package/examples/stage-mcp/echo-mcp.mjs +20 -0
- package/examples/stage-mcp/stage-mcp-dead.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp-dead.task.yaml +3 -0
- package/examples/stage-mcp/stage-mcp-missing-var.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp-missing-var.task.yaml +3 -0
- package/examples/stage-mcp/stage-mcp.pipeline.yaml +5 -0
- package/examples/stage-mcp/stage-mcp.task.yaml +4 -0
- package/examples/stage-mcp/use-echo.yaml +20 -0
- package/examples/stageflow.yaml +51 -0
- package/examples/verify-tour/README.md +80 -0
- package/examples/verify-tour/verify-tour.pipeline.yaml +162 -0
- package/examples/verify-tour/verify-tour.task.yaml +11 -0
- package/package.json +9 -1
- package/skills/stageflow/SKILL.md +6 -6
- package/skills/stageflow/references/control-surface.md +13 -5
- package/skills/stageflow/scripts/detect-host.mjs +14 -1
- package/skills/stageflow/scripts/detect-host.test.mjs +29 -1
- package/skills/stageflow-author/SKILL.md +4 -3
- package/skills/stageflow-author/references/catalog-mapping.md +16 -0
- package/skills/stageflow-author/references/catalog-write-conventions.md +1 -1
- package/skills/stageflow-author/references/stage-prompt-template.md +4 -4
- package/skills/stageflow-run/SKILL.md +22 -12
- package/skills/stageflow-run/references/mcp-call.md +9 -1
- package/skills/stageflow-run/references/task-and-pipeline-selection.md +19 -6
- package/skills/stageflow-run/scripts/mcp-call.mjs +46 -6
- package/skills/stageflow-run/scripts/mcp-call.test.mjs +64 -0
- package/skills/stageflow-session-capture/references/catalog-authoring.md +2 -0
- package/skills/stageflow-setup/SKILL.md +51 -8
- package/dist/ui/assets/index-Da5EHU6M.js +0 -119
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
id: poll-bucket-config
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Read bucket, check_id, and scenario from the prior stage's payload.
|
|
4
|
+
bucket is the bare bucket name, no gs:// or s3:// prefix — add the right
|
|
5
|
+
prefix yourself for whichever CLI you end up using.
|
|
6
|
+
|
|
7
|
+
The four output fields (block_public_acls, ignore_public_acls,
|
|
8
|
+
block_public_policy, restrict_public_buckets) are cloud-agnostic — they
|
|
9
|
+
mean "is public access meaningfully blocked", not literally AWS S3
|
|
10
|
+
setting names. Try real polls in this order, first one that works wins:
|
|
11
|
+
|
|
12
|
+
1. GCP: if `gcloud` is on PATH and `gcloud auth list
|
|
13
|
+
--filter=status:ACTIVE --format="value(account)"` returns a account,
|
|
14
|
+
poll the real bucket:
|
|
15
|
+
gcloud storage buckets describe gs://<bucket> --format=json
|
|
16
|
+
gcloud storage buckets get-iam-policy gs://<bucket> --format=json
|
|
17
|
+
Read these exact fields from the describe output:
|
|
18
|
+
public_access_prevention ("enforced" or "inherited")
|
|
19
|
+
uniform_bucket_level_access (boolean)
|
|
20
|
+
From the IAM policy output, check every binding's members list for
|
|
21
|
+
"allUsers" or "allAuthenticatedUsers" — call this has_public_iam_binding.
|
|
22
|
+
Map to the four fields:
|
|
23
|
+
block_public_acls = uniform_bucket_level_access
|
|
24
|
+
ignore_public_acls = uniform_bucket_level_access
|
|
25
|
+
block_public_policy = (public_access_prevention == "enforced")
|
|
26
|
+
restrict_public_buckets = NOT has_public_iam_binding
|
|
27
|
+
Set source = "real-gcp". Ignore scenario in this case.
|
|
28
|
+
|
|
29
|
+
2. AWS: else if `aws` CLI is on PATH and `aws sts get-caller-identity`
|
|
30
|
+
succeeds, run `aws s3api get-public-access-block --bucket <bucket>`
|
|
31
|
+
and use that real response directly (the field names already match).
|
|
32
|
+
Set source = "real-aws". Ignore scenario in this case.
|
|
33
|
+
|
|
34
|
+
3. Simulated: otherwise — no working cloud CLI — produce a SIMULATED
|
|
35
|
+
response and set source = "simulated". Never present simulated data
|
|
36
|
+
as real; label it "simulated" wherever it's written down. Use
|
|
37
|
+
scenario to pick the fixture:
|
|
38
|
+
|
|
39
|
+
scenario "fail":
|
|
40
|
+
{ block_public_acls: true, ignore_public_acls: true,
|
|
41
|
+
block_public_policy: false, restrict_public_buckets: true }
|
|
42
|
+
|
|
43
|
+
scenario "fixed":
|
|
44
|
+
{ block_public_acls: true, ignore_public_acls: true,
|
|
45
|
+
block_public_policy: true, restrict_public_buckets: true }
|
|
46
|
+
|
|
47
|
+
Write the raw response via write_stage_artifact. For a real GCP poll,
|
|
48
|
+
include both the raw gcloud fields (public_access_prevention,
|
|
49
|
+
uniform_bucket_level_access, has_public_iam_binding) and the four mapped
|
|
50
|
+
booleans, so the translation is visible, not hidden. Clearly mark the
|
|
51
|
+
artifact "simulated", "real-aws", or "real-gcp".
|
|
52
|
+
|
|
53
|
+
summary and payload are handed to the next stage verbatim. State outcomes
|
|
54
|
+
and artifact pointers only. Do not repeat this stage's prohibitions in
|
|
55
|
+
summary — downstream will obey them literally.
|
|
56
|
+
|
|
57
|
+
When finished, call emit_stage_envelope exactly once with status, summary,
|
|
58
|
+
artifacts, and a payload matching io.output.schema: bucket, check_id,
|
|
59
|
+
scenario carried forward, plus source and the four boolean fields. Your
|
|
60
|
+
last tool call in this attempt must be emit_stage_envelope. An empty
|
|
61
|
+
final message is a stage failure.
|
|
62
|
+
model: anthropic/claude-sonnet-4-5
|
|
63
|
+
io:
|
|
64
|
+
input:
|
|
65
|
+
schema:
|
|
66
|
+
type: object
|
|
67
|
+
required: [bucket, check_id, scenario]
|
|
68
|
+
properties:
|
|
69
|
+
bucket:
|
|
70
|
+
type: string
|
|
71
|
+
check_id:
|
|
72
|
+
type: string
|
|
73
|
+
scenario:
|
|
74
|
+
type: string
|
|
75
|
+
output:
|
|
76
|
+
schema:
|
|
77
|
+
type: object
|
|
78
|
+
required:
|
|
79
|
+
- bucket
|
|
80
|
+
- check_id
|
|
81
|
+
- scenario
|
|
82
|
+
- source
|
|
83
|
+
- block_public_acls
|
|
84
|
+
- ignore_public_acls
|
|
85
|
+
- block_public_policy
|
|
86
|
+
- restrict_public_buckets
|
|
87
|
+
properties:
|
|
88
|
+
bucket:
|
|
89
|
+
type: string
|
|
90
|
+
check_id:
|
|
91
|
+
type: string
|
|
92
|
+
scenario:
|
|
93
|
+
type: string
|
|
94
|
+
source:
|
|
95
|
+
type: string
|
|
96
|
+
block_public_acls:
|
|
97
|
+
type: boolean
|
|
98
|
+
ignore_public_acls:
|
|
99
|
+
type: boolean
|
|
100
|
+
block_public_policy:
|
|
101
|
+
type: boolean
|
|
102
|
+
restrict_public_buckets:
|
|
103
|
+
type: boolean
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
id: publish-report
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Read the evidence log at
|
|
4
|
+
examples/compliance-review-demo/data/evidence-log.json (checkout-relative,
|
|
5
|
+
use the Read tool) and the current run's payload.
|
|
6
|
+
|
|
7
|
+
Write a short markdown report via write_stage_artifact (for example
|
|
8
|
+
report.md) showing the timeline for this check_id + resource: every
|
|
9
|
+
recorded verdict with its timestamp, and — for any row with
|
|
10
|
+
reviewed = true — the reviewer. Make the human-in-the-loop review visible:
|
|
11
|
+
call out explicitly which rows were auto-approved (no flip) versus which
|
|
12
|
+
required a person's confirmation (a flip), since that distinction is the
|
|
13
|
+
whole point of this pipeline.
|
|
14
|
+
|
|
15
|
+
When finished, call emit_stage_envelope exactly once with status, summary,
|
|
16
|
+
and artifacts pointing at the report. Your last tool call in this attempt
|
|
17
|
+
must be emit_stage_envelope. An empty final message is a stage failure.
|
|
18
|
+
model: anthropic/claude-sonnet-4-5
|
|
19
|
+
io:
|
|
20
|
+
input:
|
|
21
|
+
schema:
|
|
22
|
+
type: object
|
|
23
|
+
required:
|
|
24
|
+
- bucket
|
|
25
|
+
- check_id
|
|
26
|
+
- scenario
|
|
27
|
+
- source
|
|
28
|
+
- block_public_acls
|
|
29
|
+
- ignore_public_acls
|
|
30
|
+
- block_public_policy
|
|
31
|
+
- restrict_public_buckets
|
|
32
|
+
- verdict
|
|
33
|
+
- resource
|
|
34
|
+
- failed_fields
|
|
35
|
+
- reviewed
|
|
36
|
+
- auto_approved
|
|
37
|
+
- reviewer
|
|
38
|
+
- control_id
|
|
39
|
+
- changed_files
|
|
40
|
+
properties:
|
|
41
|
+
bucket:
|
|
42
|
+
type: string
|
|
43
|
+
check_id:
|
|
44
|
+
type: string
|
|
45
|
+
scenario:
|
|
46
|
+
type: string
|
|
47
|
+
source:
|
|
48
|
+
type: string
|
|
49
|
+
block_public_acls:
|
|
50
|
+
type: boolean
|
|
51
|
+
ignore_public_acls:
|
|
52
|
+
type: boolean
|
|
53
|
+
block_public_policy:
|
|
54
|
+
type: boolean
|
|
55
|
+
restrict_public_buckets:
|
|
56
|
+
type: boolean
|
|
57
|
+
verdict:
|
|
58
|
+
type: string
|
|
59
|
+
resource:
|
|
60
|
+
type: string
|
|
61
|
+
failed_fields:
|
|
62
|
+
type: array
|
|
63
|
+
items:
|
|
64
|
+
type: string
|
|
65
|
+
reviewed:
|
|
66
|
+
type: boolean
|
|
67
|
+
auto_approved:
|
|
68
|
+
type: boolean
|
|
69
|
+
reviewer:
|
|
70
|
+
type: string
|
|
71
|
+
control_id:
|
|
72
|
+
type: string
|
|
73
|
+
changed_files:
|
|
74
|
+
type: array
|
|
75
|
+
items:
|
|
76
|
+
type: string
|
|
77
|
+
output:
|
|
78
|
+
schema:
|
|
79
|
+
type: object
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
id: review-verdict
|
|
2
|
+
system_prompt: |
|
|
3
|
+
This stage never pauses for a human — it has to be safe to run unattended
|
|
4
|
+
on a schedule (cron, a nightly GitHub Action, Cloud Scheduler). It still
|
|
5
|
+
tells the difference between "nothing changed" and "this just flipped,"
|
|
6
|
+
it just never blocks on that difference.
|
|
7
|
+
|
|
8
|
+
1. Read examples/compliance-review-demo/data/evidence-log.json if it
|
|
9
|
+
exists (checkout-relative path, use the Read tool). Find the most
|
|
10
|
+
recent entry for this run's check_id + resource, if any.
|
|
11
|
+
2. No prior entry, or the prior entry's verdict matches this run's
|
|
12
|
+
verdict: set reviewer = "auto".
|
|
13
|
+
3. Prior entry exists and its verdict differs from this run's verdict (a
|
|
14
|
+
flip): set reviewer = "unreviewed-flip" and write a short artifact via
|
|
15
|
+
write_stage_artifact noting the flip (prior verdict, new verdict, the
|
|
16
|
+
raw field values from the prior stage's payload), so a person can spot
|
|
17
|
+
it later in the evidence log or the published report — without the
|
|
18
|
+
run ever waiting on them.
|
|
19
|
+
4. In both cases set reviewed = false and auto_approved = true. Never
|
|
20
|
+
call ask_operator — this stage has no gate_kinds. Always emit an
|
|
21
|
+
advancing success status; a flip is information, not a failure.
|
|
22
|
+
|
|
23
|
+
summary and payload are handed to the next stage verbatim. State outcomes
|
|
24
|
+
and artifact pointers only. Do not repeat this stage's prohibitions in
|
|
25
|
+
summary — downstream will obey them literally.
|
|
26
|
+
|
|
27
|
+
When finished, call emit_stage_envelope exactly once with status, summary,
|
|
28
|
+
artifacts, and a payload matching io.output.schema: everything carried
|
|
29
|
+
forward from the prior stage, plus reviewed, auto_approved, and reviewer
|
|
30
|
+
as described above. Your last tool call in this attempt must be
|
|
31
|
+
emit_stage_envelope. An empty final message is a stage failure.
|
|
32
|
+
model: anthropic/claude-sonnet-4-5
|
|
33
|
+
io:
|
|
34
|
+
input:
|
|
35
|
+
schema:
|
|
36
|
+
type: object
|
|
37
|
+
required:
|
|
38
|
+
- bucket
|
|
39
|
+
- check_id
|
|
40
|
+
- scenario
|
|
41
|
+
- source
|
|
42
|
+
- block_public_acls
|
|
43
|
+
- ignore_public_acls
|
|
44
|
+
- block_public_policy
|
|
45
|
+
- restrict_public_buckets
|
|
46
|
+
- verdict
|
|
47
|
+
- resource
|
|
48
|
+
- failed_fields
|
|
49
|
+
properties:
|
|
50
|
+
bucket:
|
|
51
|
+
type: string
|
|
52
|
+
check_id:
|
|
53
|
+
type: string
|
|
54
|
+
scenario:
|
|
55
|
+
type: string
|
|
56
|
+
source:
|
|
57
|
+
type: string
|
|
58
|
+
block_public_acls:
|
|
59
|
+
type: boolean
|
|
60
|
+
ignore_public_acls:
|
|
61
|
+
type: boolean
|
|
62
|
+
block_public_policy:
|
|
63
|
+
type: boolean
|
|
64
|
+
restrict_public_buckets:
|
|
65
|
+
type: boolean
|
|
66
|
+
verdict:
|
|
67
|
+
type: string
|
|
68
|
+
resource:
|
|
69
|
+
type: string
|
|
70
|
+
failed_fields:
|
|
71
|
+
type: array
|
|
72
|
+
items:
|
|
73
|
+
type: string
|
|
74
|
+
output:
|
|
75
|
+
schema:
|
|
76
|
+
type: object
|
|
77
|
+
required:
|
|
78
|
+
- bucket
|
|
79
|
+
- check_id
|
|
80
|
+
- scenario
|
|
81
|
+
- source
|
|
82
|
+
- block_public_acls
|
|
83
|
+
- ignore_public_acls
|
|
84
|
+
- block_public_policy
|
|
85
|
+
- restrict_public_buckets
|
|
86
|
+
- verdict
|
|
87
|
+
- resource
|
|
88
|
+
- failed_fields
|
|
89
|
+
- reviewed
|
|
90
|
+
- auto_approved
|
|
91
|
+
- reviewer
|
|
92
|
+
properties:
|
|
93
|
+
bucket:
|
|
94
|
+
type: string
|
|
95
|
+
check_id:
|
|
96
|
+
type: string
|
|
97
|
+
scenario:
|
|
98
|
+
type: string
|
|
99
|
+
source:
|
|
100
|
+
type: string
|
|
101
|
+
block_public_acls:
|
|
102
|
+
type: boolean
|
|
103
|
+
ignore_public_acls:
|
|
104
|
+
type: boolean
|
|
105
|
+
block_public_policy:
|
|
106
|
+
type: boolean
|
|
107
|
+
restrict_public_buckets:
|
|
108
|
+
type: boolean
|
|
109
|
+
verdict:
|
|
110
|
+
type: string
|
|
111
|
+
resource:
|
|
112
|
+
type: string
|
|
113
|
+
failed_fields:
|
|
114
|
+
type: array
|
|
115
|
+
items:
|
|
116
|
+
type: string
|
|
117
|
+
reviewed:
|
|
118
|
+
type: boolean
|
|
119
|
+
auto_approved:
|
|
120
|
+
type: boolean
|
|
121
|
+
reviewer:
|
|
122
|
+
type: string
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
id: run-compliance-check
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Read the four public-access-block field values, bucket, and check_id from
|
|
4
|
+
the prior stage's payload.
|
|
5
|
+
|
|
6
|
+
Apply the rule for bucket-level public access block (the same rule
|
|
7
|
+
Prowler's SOC2-labeled AWS S3 check uses, applied here to whichever
|
|
8
|
+
cloud the prior stage actually polled): the check passes only if
|
|
9
|
+
block_public_acls, ignore_public_acls, block_public_policy, and
|
|
10
|
+
restrict_public_buckets are all true. If any field is false, the check
|
|
11
|
+
fails; name which field(s) failed in failed_fields. Use an empty list
|
|
12
|
+
when nothing failed.
|
|
13
|
+
|
|
14
|
+
Write the verdict via write_stage_artifact (for example verdict.md),
|
|
15
|
+
including the field values and which failed, if any.
|
|
16
|
+
|
|
17
|
+
summary and payload are handed to the next stage verbatim. State outcomes
|
|
18
|
+
and artifact pointers only. Do not repeat this stage's prohibitions in
|
|
19
|
+
summary — downstream will obey them literally.
|
|
20
|
+
|
|
21
|
+
When finished, call emit_stage_envelope exactly once with status, summary,
|
|
22
|
+
artifacts, and a payload matching io.output.schema: everything carried
|
|
23
|
+
forward from the prior stage, plus verdict ("PASS" or "FAIL"), resource
|
|
24
|
+
(the bucket name), and failed_fields. Your last tool call in this attempt
|
|
25
|
+
must be emit_stage_envelope. An empty final message is a stage failure.
|
|
26
|
+
model: anthropic/claude-sonnet-4-5
|
|
27
|
+
io:
|
|
28
|
+
input:
|
|
29
|
+
schema:
|
|
30
|
+
type: object
|
|
31
|
+
required:
|
|
32
|
+
- bucket
|
|
33
|
+
- check_id
|
|
34
|
+
- scenario
|
|
35
|
+
- source
|
|
36
|
+
- block_public_acls
|
|
37
|
+
- ignore_public_acls
|
|
38
|
+
- block_public_policy
|
|
39
|
+
- restrict_public_buckets
|
|
40
|
+
properties:
|
|
41
|
+
bucket:
|
|
42
|
+
type: string
|
|
43
|
+
check_id:
|
|
44
|
+
type: string
|
|
45
|
+
scenario:
|
|
46
|
+
type: string
|
|
47
|
+
source:
|
|
48
|
+
type: string
|
|
49
|
+
block_public_acls:
|
|
50
|
+
type: boolean
|
|
51
|
+
ignore_public_acls:
|
|
52
|
+
type: boolean
|
|
53
|
+
block_public_policy:
|
|
54
|
+
type: boolean
|
|
55
|
+
restrict_public_buckets:
|
|
56
|
+
type: boolean
|
|
57
|
+
output:
|
|
58
|
+
schema:
|
|
59
|
+
type: object
|
|
60
|
+
required:
|
|
61
|
+
- bucket
|
|
62
|
+
- check_id
|
|
63
|
+
- scenario
|
|
64
|
+
- source
|
|
65
|
+
- block_public_acls
|
|
66
|
+
- ignore_public_acls
|
|
67
|
+
- block_public_policy
|
|
68
|
+
- restrict_public_buckets
|
|
69
|
+
- verdict
|
|
70
|
+
- resource
|
|
71
|
+
- failed_fields
|
|
72
|
+
properties:
|
|
73
|
+
bucket:
|
|
74
|
+
type: string
|
|
75
|
+
check_id:
|
|
76
|
+
type: string
|
|
77
|
+
scenario:
|
|
78
|
+
type: string
|
|
79
|
+
source:
|
|
80
|
+
type: string
|
|
81
|
+
block_public_acls:
|
|
82
|
+
type: boolean
|
|
83
|
+
ignore_public_acls:
|
|
84
|
+
type: boolean
|
|
85
|
+
block_public_policy:
|
|
86
|
+
type: boolean
|
|
87
|
+
restrict_public_buckets:
|
|
88
|
+
type: boolean
|
|
89
|
+
verdict:
|
|
90
|
+
type: string
|
|
91
|
+
resource:
|
|
92
|
+
type: string
|
|
93
|
+
failed_fields:
|
|
94
|
+
type: array
|
|
95
|
+
items:
|
|
96
|
+
type: string
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
id: store-evidence
|
|
2
|
+
system_prompt: |
|
|
3
|
+
Append one row to the checkout-relative evidence log at
|
|
4
|
+
examples/compliance-review-demo/data/evidence-log.json.
|
|
5
|
+
|
|
6
|
+
Read that file with the Read tool if it exists and parse it as a JSON
|
|
7
|
+
array; if it does not exist yet, start from an empty array. Append a new
|
|
8
|
+
object with: timestamp (ISO 8601, now), check_id, resource, control_id,
|
|
9
|
+
verdict, reviewed, auto_approved, reviewer (use JSON null in this file
|
|
10
|
+
when reviewer is "") — all from the prior stage's payload. Write the full
|
|
11
|
+
updated array back to that same path with the checkout write/edit tool,
|
|
12
|
+
pretty-printed.
|
|
13
|
+
|
|
14
|
+
Success requires real checkout edits. Put
|
|
15
|
+
["examples/compliance-review-demo/data/evidence-log.json"] in
|
|
16
|
+
payload.changed_files. Do not put stages/.../artifacts paths there. A
|
|
17
|
+
report or map alone is a failure emit, not success.
|
|
18
|
+
|
|
19
|
+
summary and payload are handed to the next stage verbatim. State outcomes
|
|
20
|
+
and artifact pointers only. Do not repeat this stage's prohibitions in
|
|
21
|
+
summary — downstream will obey them literally.
|
|
22
|
+
|
|
23
|
+
When finished, call emit_stage_envelope exactly once with status, summary,
|
|
24
|
+
artifacts, and a payload matching io.output.schema: everything carried
|
|
25
|
+
forward from the prior stage, plus changed_files naming the evidence log
|
|
26
|
+
path. Your last tool call in this attempt must be emit_stage_envelope. An
|
|
27
|
+
empty final message is a stage failure.
|
|
28
|
+
model: anthropic/claude-sonnet-4-5
|
|
29
|
+
io:
|
|
30
|
+
input:
|
|
31
|
+
schema:
|
|
32
|
+
type: object
|
|
33
|
+
required:
|
|
34
|
+
- bucket
|
|
35
|
+
- check_id
|
|
36
|
+
- scenario
|
|
37
|
+
- source
|
|
38
|
+
- block_public_acls
|
|
39
|
+
- ignore_public_acls
|
|
40
|
+
- block_public_policy
|
|
41
|
+
- restrict_public_buckets
|
|
42
|
+
- verdict
|
|
43
|
+
- resource
|
|
44
|
+
- failed_fields
|
|
45
|
+
- reviewed
|
|
46
|
+
- auto_approved
|
|
47
|
+
- reviewer
|
|
48
|
+
- control_id
|
|
49
|
+
properties:
|
|
50
|
+
bucket:
|
|
51
|
+
type: string
|
|
52
|
+
check_id:
|
|
53
|
+
type: string
|
|
54
|
+
scenario:
|
|
55
|
+
type: string
|
|
56
|
+
source:
|
|
57
|
+
type: string
|
|
58
|
+
block_public_acls:
|
|
59
|
+
type: boolean
|
|
60
|
+
ignore_public_acls:
|
|
61
|
+
type: boolean
|
|
62
|
+
block_public_policy:
|
|
63
|
+
type: boolean
|
|
64
|
+
restrict_public_buckets:
|
|
65
|
+
type: boolean
|
|
66
|
+
verdict:
|
|
67
|
+
type: string
|
|
68
|
+
resource:
|
|
69
|
+
type: string
|
|
70
|
+
failed_fields:
|
|
71
|
+
type: array
|
|
72
|
+
items:
|
|
73
|
+
type: string
|
|
74
|
+
reviewed:
|
|
75
|
+
type: boolean
|
|
76
|
+
auto_approved:
|
|
77
|
+
type: boolean
|
|
78
|
+
reviewer:
|
|
79
|
+
type: string
|
|
80
|
+
control_id:
|
|
81
|
+
type: string
|
|
82
|
+
output:
|
|
83
|
+
schema:
|
|
84
|
+
type: object
|
|
85
|
+
required:
|
|
86
|
+
- bucket
|
|
87
|
+
- check_id
|
|
88
|
+
- scenario
|
|
89
|
+
- source
|
|
90
|
+
- block_public_acls
|
|
91
|
+
- ignore_public_acls
|
|
92
|
+
- block_public_policy
|
|
93
|
+
- restrict_public_buckets
|
|
94
|
+
- verdict
|
|
95
|
+
- resource
|
|
96
|
+
- failed_fields
|
|
97
|
+
- reviewed
|
|
98
|
+
- auto_approved
|
|
99
|
+
- reviewer
|
|
100
|
+
- control_id
|
|
101
|
+
- changed_files
|
|
102
|
+
properties:
|
|
103
|
+
bucket:
|
|
104
|
+
type: string
|
|
105
|
+
check_id:
|
|
106
|
+
type: string
|
|
107
|
+
scenario:
|
|
108
|
+
type: string
|
|
109
|
+
source:
|
|
110
|
+
type: string
|
|
111
|
+
block_public_acls:
|
|
112
|
+
type: boolean
|
|
113
|
+
ignore_public_acls:
|
|
114
|
+
type: boolean
|
|
115
|
+
block_public_policy:
|
|
116
|
+
type: boolean
|
|
117
|
+
restrict_public_buckets:
|
|
118
|
+
type: boolean
|
|
119
|
+
verdict:
|
|
120
|
+
type: string
|
|
121
|
+
resource:
|
|
122
|
+
type: string
|
|
123
|
+
failed_fields:
|
|
124
|
+
type: array
|
|
125
|
+
items:
|
|
126
|
+
type: string
|
|
127
|
+
reviewed:
|
|
128
|
+
type: boolean
|
|
129
|
+
auto_approved:
|
|
130
|
+
type: boolean
|
|
131
|
+
reviewer:
|
|
132
|
+
type: string
|
|
133
|
+
control_id:
|
|
134
|
+
type: string
|
|
135
|
+
changed_files:
|
|
136
|
+
type: array
|
|
137
|
+
items:
|
|
138
|
+
type: string
|
|
139
|
+
verify:
|
|
140
|
+
- id: evidence-log-written
|
|
141
|
+
type: checkout_changes
|
|
142
|
+
path_fields: [changed_files]
|
|
143
|
+
when: [after]
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# conditional-fork
|
|
2
|
+
|
|
3
|
+
Operator HITL, then exclusive Route `if`. The `decide` stage asks for **branch-a** or **branch-b**, emits that value on `payload.branch`, and listed successors stay on the DAG. After success, each `if` runs against that payload: the matching arm runs; the other is skipped. The completing agent does not pick YAML successors.
|
|
4
|
+
|
|
5
|
+
See [YAML catalog — Route wiring](../../docs/yaml-catalog.md#route) (Route `if`). `if.field` must be a required output property — optional fields cannot be used in `if`.
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
- Node.js ≥ 20, Stageflow installed (`npm i -g stageflow`), **or** this repo built (`npm run build`)
|
|
10
|
+
- Provider auth connected (`sf ui` → Settings → Providers, or `sf providers login …`)
|
|
11
|
+
- Operator console for the gate: `sf ui` (default `http://127.0.0.1:3847`)
|
|
12
|
+
|
|
13
|
+
## Manual test
|
|
14
|
+
|
|
15
|
+
Commands run from the **repository git root**. Run state lives in `<repo>/.stageflow` even if you start `sf ui` from a subdirectory.
|
|
16
|
+
|
|
17
|
+
### Terminal 1 — operator console
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
cd examples/conditional-fork
|
|
21
|
+
sf ui
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
### Terminal 2 — validate and run (repo root)
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
sf validate --pipeline examples/conditional-fork/fork-demo.pipeline.yaml --strict
|
|
28
|
+
sf run \
|
|
29
|
+
--pipeline examples/conditional-fork/fork-demo.pipeline.yaml \
|
|
30
|
+
--task examples/conditional-fork/fork-demo.task.yaml
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### From the Stageflow repo (no global install)
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
npm run build
|
|
37
|
+
npm run dev -- validate --pipeline examples/conditional-fork/fork-demo.pipeline.yaml --strict
|
|
38
|
+
npm run dev -- run \
|
|
39
|
+
--pipeline examples/conditional-fork/fork-demo.pipeline.yaml \
|
|
40
|
+
--task examples/conditional-fork/fork-demo.task.yaml
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### At the HITL gate
|
|
44
|
+
|
|
45
|
+
When `decide` blocks, open the run in the console and answer the free-text prompt with exactly:
|
|
46
|
+
|
|
47
|
+
- `branch-a`, or
|
|
48
|
+
- `branch-b`
|
|
49
|
+
|
|
50
|
+
Exit code `2` means waiting on operator input. See [docs/hitl.md](../../docs/hitl.md).
|
|
51
|
+
|
|
52
|
+
### What to verify in the UI
|
|
53
|
+
|
|
54
|
+
After you answer:
|
|
55
|
+
|
|
56
|
+
1. The chosen branch stage (`branch-a` or `branch-b`) reaches **succeeded**
|
|
57
|
+
2. The other branch is **skipped**
|
|
58
|
+
3. The run overall **succeeded**
|
|
59
|
+
|
|
60
|
+
### Re-test the other branch
|
|
61
|
+
|
|
62
|
+
Start a **new** run and answer the opposite id at the gate.
|
|
63
|
+
|
|
64
|
+
## How it works
|
|
65
|
+
|
|
66
|
+
`decide` is `entry: true` with two `route` targets, each gated by `if` (`field: branch`, `op: eq`). After the operator answers, the agent emits `payload: { "branch": "branch-a" }` or `{ "branch": "branch-b" }`. Stageflow evaluates those predicates against the success payload: the matching successor runs; the miss is skipped. Both `to:` stay on the DAG.
|
|
67
|
+
|
|
68
|
+
`io.output.schema` requires `branch` as a string so `if.field: branch` is valid. Branch stage `io.input` is an empty object (a subset of decide output).
|
|
69
|
+
|
|
70
|
+
Validate may warn `pipeline.route_all_gated` because every forward `to:` on `decide` has `if`. That warning keeps `ok: true`; `--strict` does not promote it.
|
|
71
|
+
|
|
72
|
+
## Layout
|
|
73
|
+
|
|
74
|
+
```
|
|
75
|
+
examples/conditional-fork/
|
|
76
|
+
fork-demo.pipeline.yaml
|
|
77
|
+
fork-demo.task.yaml
|
|
78
|
+
decide.yaml
|
|
79
|
+
branch-a.yaml
|
|
80
|
+
branch-b.yaml
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## References
|
|
84
|
+
|
|
85
|
+
- [YAML catalog — Route wiring](../../docs/yaml-catalog.md#route)
|
|
86
|
+
- [YAML catalog — Upgrading older catalogs](../../docs/yaml-catalog.md#upgrading-older-catalogs)
|
|
87
|
+
- [HITL](../../docs/hitl.md)
|
|
88
|
+
- Fixtures: [`route-if-eq.pipeline.yaml`](../../tests/fixtures/pipelines/route-if-eq.pipeline.yaml)
|
|
89
|
+
- Related walkthrough: [`../route-if-tour/`](../route-if-tour/)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
id: branch-a
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are branch-a. Call emit_stage_envelope exactly once with status success,
|
|
4
|
+
a short summary that acknowledges branch-a ran, and artifacts []. Do not call
|
|
5
|
+
ask_operator.
|
|
6
|
+
model: anthropic/claude-sonnet-4-5
|
|
7
|
+
io:
|
|
8
|
+
input:
|
|
9
|
+
schema:
|
|
10
|
+
type: object
|
|
11
|
+
output:
|
|
12
|
+
schema:
|
|
13
|
+
type: object
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
id: branch-b
|
|
2
|
+
system_prompt: |
|
|
3
|
+
You are branch-b. Call emit_stage_envelope exactly once with status success,
|
|
4
|
+
a short summary that acknowledges branch-b ran, and artifacts []. Do not call
|
|
5
|
+
ask_operator.
|
|
6
|
+
model: cursor/auto
|
|
7
|
+
io:
|
|
8
|
+
input:
|
|
9
|
+
schema:
|
|
10
|
+
type: object
|
|
11
|
+
output:
|
|
12
|
+
schema:
|
|
13
|
+
type: object
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
id: decide
|
|
2
|
+
gate_kinds:
|
|
3
|
+
- free_text
|
|
4
|
+
system_prompt: |
|
|
5
|
+
You are the deciding stage for exclusive Route if branching. The operator
|
|
6
|
+
chooses which branch runs. Follow these steps exactly:
|
|
7
|
+
|
|
8
|
+
1. Call ask_operator with kind free_text. Ask which branch to take. Tell the
|
|
9
|
+
operator to reply with exactly one of: branch-a or branch-b.
|
|
10
|
+
2. Wait for the operator answer. Do not call emit_stage_envelope before you
|
|
11
|
+
have that answer.
|
|
12
|
+
3. After the operator answers, call emit_stage_envelope exactly once with:
|
|
13
|
+
- status: success
|
|
14
|
+
- a non-empty summary
|
|
15
|
+
- artifacts: []
|
|
16
|
+
- payload: { "branch": "branch-a" } or { "branch": "branch-b" }, matching
|
|
17
|
+
the operator reply exactly
|
|
18
|
+
|
|
19
|
+
Rules:
|
|
20
|
+
- Never emit before the operator answers.
|
|
21
|
+
- Do not emit fork_choice. Routing is deterministic from payload.branch.
|
|
22
|
+
- Never invent other branch values.
|
|
23
|
+
- Put only the id the operator chose in payload.branch.
|
|
24
|
+
model: cursor/auto
|
|
25
|
+
io:
|
|
26
|
+
input:
|
|
27
|
+
schema:
|
|
28
|
+
type: object
|
|
29
|
+
output:
|
|
30
|
+
schema:
|
|
31
|
+
type: object
|
|
32
|
+
required: [branch]
|
|
33
|
+
properties:
|
|
34
|
+
branch:
|
|
35
|
+
type: string
|