Workflow runs preserve progress, so you can leave and return without replaying completed work. Across IDE, CLI, and Web, the run remains connected to its parent conversation while Kiro checkpoints node status, outputs, artifacts, repeat progress, watch cursors, and step sessions at durable boundaries.
A background workflow does not block the main conversation. Kiro can acknowledge the launch, return progress while steps run, inspect the completed run and its artifacts, and synthesize the outcome in the parent chat. The Workflows overview traces one such run end to end.
In Kiro Web, the parent session and run details remain visible together:
A progress update in the parent chat and a direct message to a selected step serve different purposes. Ask the main agent to interpret progress, resolve a broader issue, or decide what should happen next. Message the step when the guidance applies specifically to that agent's current task.
The channel between the parent chat and a step runs both ways, at any point in the run. A step reports outward through its send_message signals. Guidance reaches the step by either route: message the selected step directly in your client, or tell the main agent in the parent chat what the step should do and it delivers that guidance into the step's session. A running step picks the guidance up on its next turn; a paused step treats it as the reply it was waiting for.
Open Workflows above the parent chat. The area lists the session's runs. Expand a run to inspect its step tree and status, then select a step to open a dedicated Workflow step tab. The tab identifies the step and agent, preserves the step's own message history, and can remain beside the parent chat while the run continues.
The parent run card shows Pause and Stop while work is active. Expanded step details show the selected agent, model, effort, and activity. Launch and completion updates in the parent chat can also expose the run name, ID, task, output artifact, elapsed time, and estimated usage when available.
A run that requires input can surface a Needs you state. Return to the run and select the paused step to answer it directly, or ask the main agent in the parent chat to pass your answer to that step.
A run reports one of five statuses, and paused covers three different situations that call for different responses. The controls a client offers differ by surface; the statuses, and what moves a run between them, are the same everywhere.
| Status | Meaning | You can | It moves on when |
|---|---|---|---|
running | Kiro is executing or scheduling nodes | Pause (takes effect at the next node boundary; status stays running until then) or Stop | a step asks for input (paused), every required top-level node completes (completed), or a node fails (failed) |
paused · needs input | A step called send_message with severity warning and is waiting for you | Reply in the paused step (the run stays paused while that turn runs) or Stop | the step signals success (running) or error (failed), or asks again (stays paused) |
paused · at a boundary | A requested pause took effect at a safe node boundary | Resume from persisted state, or Stop | you resume (running) |
paused · iteration cap | A repeat reached maxIterations with onMaxIterations: "pause" | Resume, which does not add iterations, so the repeat reaches the same cap and pauses again; or Stop; or revise the remaining plan | you stop, or a revised plan replaces the remaining work |
completed | Every required top-level node completed | Inspect the run and its artifacts | terminal |
failed | A node failed and the failure propagated to the run | Retry when the failed nodes are retryable: failed targets reset, completed siblings are kept | you retry (running), otherwise terminal |
aborted | The run was stopped, or a repeat used onMaxIterations: "abort" | Retry when retryable work remains | you retry (running), otherwise terminal |
Nodes can also be pending or skipped. Each repeat iteration creates a fresh set of state entries for its body, so the same static node ID can appear once per iteration. Which of these controls each client exposes is listed under Choose the right run control.
A step can ask for information and pause without losing its session context. The step agent signals this by calling send_message with severity warning; Kiro parks the step and run until you reply.
Your reply has to reach the paused step's session. The direct route is to open that step in your client and answer there; the tabs below show where. You can also answer through the parent chat by asking the main agent to pass your answer to the paused step, and it delivers the reply into the step's session for you. A plain message typed into the parent chat without that instruction is a conversation with the main agent, not a reply to the step.
Kiro routes the message through the parked step and runs another turn in the same backing session. The run remains paused until the step completes or fails.
Whichever route you take, the reply lands in the paused step's own session; the parent chat is at most the place you typed it. Three things decide what happens next, and the figure below follows one reply through all of them: the step continues with its history intact; its next send_message signal picks the branch; and only success moves the run on to the next node in a new session. A warning pauses the same session again, and an error ends the run.
Select a node, or play the run.
Paused step · session 7f2
next send_message
triagesession 7f2 · paused · waiting for your input
Send_message · warning.
triage asks for input and the run pauses
Where it goes: session 7f2, typed there or relayed by the main agent. The parent learns the outcome only when the step signals.
your reply lands in the paused step's own session; its next signal picks the branch, and only success moves on to a new session
The flow above is Kiro's built-in pause when a step asks for input. A recipe author can also make a step explicitly interactive with completion, which keeps the step open after each reply until a condition is met:
{ "type": "step", "id": "triage", "agent": "wf-planner", "prompt": "Investigate the flaky test and refine a fix plan with the user.", "completion": { "completionSignal": "success" } }
After each turn, Kiro evaluates completion. If it remains false, the step waits for another message in its session.
Interactive steps cannot run inside parallel, because Kiro cannot park one branch for input while its siblings continue.
| Action | Meaning |
|---|---|
| Pause | Let the active agent turn finish, then park at a safe node boundary |
| Resume | Continue a paused run from persisted state |
| Stop / Cancel | Interrupt active work and mark the run aborted without undoing file changes |
| Retry | Reset retryable failed work to pending while preserving completed siblings; exposed in CLI and on Web terminal runs with failed nodes |
Open the run in Workflows and use the run controls:
aborted.The current IDE UI does not expose Retry. To repeat a recipe after completion or failure, start it as a new run after inspecting the workspace.
Pause is cooperative. Acceptance of a pause request does not mean execution has already stopped. The active agent turn can continue until Kiro reaches the next node boundary. Inspect the run until its status becomes paused before assuming no more agent work is occurring.
A repeat paused by onMaxIterations: "pause" has exhausted its fixed budget. Resume does not add iterations; the repeat reaches the same cap and pauses again. Revise the remaining plan, or stop the run and launch a corrected recipe as a new run.
Use Stop, /workflow cancel, or Ctrl+X only when work must stop immediately. Cancellation can interrupt a step between file operations. Files already changed remain changed. Inspect the workspace and use version control to discard unwanted partial edits before starting again.
CLI can retry all unsuccessful work or a selected failed/aborted node:
/workflow retry <workflowId> /workflow retry <workflowId> <nodeId>
Kiro resets each retry target to pending and clears its step session, timestamps, captured output, node artifacts, failure metadata, completion metadata, interactive state, and watch state. It reopens terminal ancestors so execution can reach the target while preserving completed sibling work.
Retry does not undo workspace files. Inspect partial edits before retrying. A completed run is not retryable in the current CLI UI; launch the recipe again to create a new run.
Each run has its own workflow ID and state tree. Recipe files do not isolate output paths, Git branches, or worktrees, so two runs can still edit the same checkout or overwrite the same artifact.
/workflow history or /workflow list, then select or pass the workflow ID.run_dir and artifact paths.Completion is a handoff, not just a status change. The main agent can inspect the run, read its declared artifacts and relevant files, verify the requested evidence, and summarize the result in the parent conversation.
A useful completion summary names:
In Kiro Web, use Summary, Files, and Artifacts to inspect that evidence directly. A recipe or step agent must produce and expose an artifact; not every file created during a run becomes a declared artifact automatically.
A running or paused workflow can replace its remaining top-level plan while preserving nodes that already ran.
Who may revise a plan is fixed by the run structure:
| Caller | Update its current step | Replace the remaining plan |
|---|---|---|
| A step agent at the root level or nested inside one root-level container | Yes | Yes |
| The parent session that launched the run | No current step | Yes |
| A sub-agent spawned inside a step | No | No |
Agents use update_workflow for both actions. For ordinary outcomes, a step should still signal through send_message; update_status is for deliberate overrides. Plan revision is an agent/runtime capability and does not imply that every client exposes a manual revision control.
A watch node polls an external resource without spending model turns while the resource is idle. Its handler returns one of three outcomes:
| Outcome | Effect |
|---|---|
idle | Wait for the next poll |
new-activity | Finish this watch instance and expose the JSON payload as its output |
terminal-state | Finish the watch and latch its terminal flag for a repeat's stopWhen condition |
Kiro persists the watch cursor and terminal state with the run, so novelty tracking survives a restart. Across an interruption and recovery, delivery is at least once, so a responder must tolerate a repeated item. If idleTimeoutSec is set, an idle watch ends with a terminal outcome after that duration; without it, the watch can wait indefinitely.
Two handlers are built in. github-pr tracks what it has already reported itself. command runs a program you write once per poll and stores whatever cursor the program returns, so your program decides what counts as new; see Watch anything else with command.
The publish-pr pattern pairs a github-pr watch with a responder inside a repeat; see Publish and respond.
Kiro persists full workflow state after node transitions. Completed steps, recorded terminal outcomes, paused-for-input state, captured outputs, artifacts, and watch cursors survive at their last durable boundary. An interrupted step without a final signal continues in its existing step session instead of replaying its initial prompt as a new step.
paused, use Resume or reply in the paused step as appropriate.failed or aborted, inspect the workspace and launch the corrected recipe as a new run; the current IDE has no Retry control.A run that still reports running does not accept Resume. Reopen its parent session or monitor and inspect its active step. If it remains running without new output, record the workflow ID and collect client diagnostics before starting a duplicate run; the client has no separate manual "reclaim" control.
Kiro limits repeated failed continuation attempts and fails the step rather than retrying forever. The exact storage layout and process-ownership records are implementation details, not recipe API.
| Symptom | Check |
|---|---|
| IDE workflow surfaces are missing | Enable workflows for the workspace, then start a new chat session |
| CLI workflow commands are missing | Enable workflows under /settings → Features, then restart Kiro CLI |
| Recipe does not appear | Confirm its source and precedence; project files must be under .kiro/workflows/ with a supported suffix |
Run starts with literal {{name}} | The bare input was not declared or supplied at launch |
| Step fails on an output or artifact template | Confirm the producer runs first and captures or declares the value |
| Repeat reaches its cap | Inspect the stop file, JSON path, expected value, and producing step |
| Repeat pauses immediately after Resume | Resume does not grant more iterations; see Resume |
| File condition never matches | Confirm valid JSON, the exact JSON path/value, and an allowed workspace path |
| Validation passes but run creation fails | Check agent names, model access, and watch-handler configuration; standalone validation cannot fully check runtime registries |
command watch fails at once | The program exited 2, 126, or 127, or exited 0 with malformed JSON or no cursor; run it by hand with a saved stdin object and check that stdout holds exactly one JSON object |
command watch never wakes | Any other non-zero exit, including a commandTimeoutSec kill, counts as idle and retries; check stderr for a recurring failure, and confirm the program reports new-activity instead of only advancing its cursor |
| Parallel work is not faster | Kiro starts branches concurrently, but use parallel for isolation and join semantics rather than speed |
| Cancelled run left edits behind | Cancellation does not undo file changes; inspect or revert the workspace |
| Paused step ignores a reply | Send text in the step's own session, not only an attachment or the parent chat |
step nodes.repeat has a positive maxIterations.parallel gives each branch its own context and a join policy (all, allSettled, or any). Kiro starts the branches concurrently; use it for isolation and join semantics rather than assuming a shorter wall-clock time.
Run and manage workflows