Disco ParrotDisco Parrot Home
Docs
Request a Demo

Build a Flow

The authoring surface for Flows. Lay out the steps, bind a skill to each one, declare the inputs, set the checkpoints, write the conditions, and decide what happens when a step fails. The place you shape agent work to match how your team actually works.

The built-in Flows are a strong starting point, and most teams outgrow them the moment they have an opinion. You want a review step that runs your house style. You want a checkpoint in front of the step that opens a pull request, so a person signs off before anything reaches GitHub. You want a verification skill that knows your fixtures. Build a Flow is where you shape agent work to match how your team actually works: you lay out the steps in order, bind a skill to each one, declare the inputs, set the checkpoints, and decide what happens when a step fails.

A Flow is a template you write once and run many times. This page is about writing the template. Running it, watching the steps, and approving at the checkpoints is the sibling surface, Run a Flow & manage checkpoints.

info
A Flow is not a Workflow

A Flow is agent work that executes: steps, checkpoints, results. A Workflow is the set of statuses a plan or initiative moves through. Different features, configured in different places, doing different jobs. They share three letters and nothing else.

Where Flows are built

Flows live in the Platform area, under Flows. The list page shows every Flow your workspace can run, with a search box and a source filter so you can separate the built-ins from the copies your team has saved. Create Flow opens a short dialog: a title, a Flow ID derived from the title (the title is lower-cased and hyphenated, and a clash with an existing ID gets a numeric suffix; you can edit the ID before you commit), and a description. It drops you into the editor with a new Flow ready to fill in.

The editor itself is a detail page with three tabs:

  • Overview carries the Flow's identity and its run defaults.
  • Steps is where the real work lives: the ordered list of steps and the editor for each one.
  • Parameters declares the inputs a person supplies when they run the Flow.

Built-in Flows open in the same editor in a read-only state, with a Customize action that forks an editable copy. The whole authoring surface is gated by the flows.manage scope; a teammate with only flows.read can open a Flow and read it but cannot save changes.

add_photo_alternate
Screenshot to capture
The Flows list page in the Platform area. PageHeader breadcrumb 'Platform › Flows' with a primary 'Create Flow' button on the right. Below it a toolbar with a search input on the left and a 'Source' filter dropdown (options: Filesystem / Global / Repo) on the right, plus a count caption '14 flows'. A DataGrid with four columns (Title, Steps, Source, Scope): rows show a Flow title (e.g. 'Full SDLC', 'Quick SDLC', 'Fix PR Comments', 'Documentation Health Review'), a step-count ('5 steps'), a source Badge (the raw source value: 'filesystem' grey, 'global' cyan, 'repo' purple), and a scope value. Dark theme.
save as: public/docs-media/flows-list-page.png
Caption when added: The Flows list in the Platform area. The source filter separates the built-ins (filesystem) from your workspace (global) and repository (repo) copies.

The shape of a Flow

A Flow is a small thing to assemble. Three parts carry all of it, and the Flows concept page covers each in depth; here is the shape you are filling in as you build.

  • Steps, in order. Each step runs one skill and produces a structured result the next step can read.
  • Parameters, the inputs a person supplies at run time.
  • Defaults, the run settings (checkpoint mode and interactive-versus-background) that apply unless someone overrides them when they start a run.
ParametersPlancheckpointImplementcheckpointVerifyArtifactsPR · plan · files
A Flow runs as an ordered sequence of steps. Checkpoints sit between steps, and artifacts come out the end.

The Overview tab holds the identity and the defaults; the Steps and Parameters tabs hold the rest.

The Overview tab

The Overview tab is the Flow's front matter.

FieldWhat it sets
TitleThe human-readable name shown in the list and the action launcher.
DescriptionA sentence on what the Flow does, shown wherever the Flow is offered.
Flow IDThe stable identifier, derived from the title at creation and read-only thereafter.
ScopeWhether this is a built-in, a workspace copy, or a repository copy. Read-only; set by how the Flow was created or customized.
Usable scopeWhere the Flow is offered: against a plan, against an initiative, anywhere, or unset. This is what makes a plan-shaped Flow show up on plans and stay out of the way everywhere else. A Flow set to anywhere is the wildcard; it appears on every surface alongside the ones scoped to that surface.
Checkpoint modeThe default oversight level: template (pause only at marked steps), all (pause before every step), or none (run straight through). A run can override this.
ModeWhether the Flow runs interactive or in the background by default. A run can override this too.

The two defaults (checkpoint mode and mode) are exactly that: defaults. The person starting a run sees both in the run dialog and can change them for that run without touching the template, which is covered on the Run a Flow page.

The Steps tab

Most of a Flow's behavior lives in its steps, and the Steps tab is where you spend your time. Each step is a row in an accordion; expand one and you get its editor. Add Step appends a new step at the end; the up and down controls reorder; the delete control removes one. The order of the steps in the list is the order they run.

A single step carries the following.

FieldWhat it does
Step nameThe label shown in the run timeline.
Step IDThe stable identifier other steps use to read this one's output.
SkillThe unit of agent work this step runs. Picked from a dropdown of your tenant's resolved commands, not free text.
ParametersThe values passed into the skill: literals, references to the run's inputs, or references to an earlier step's output.
CheckpointWhether the run pauses before this step for approval, with an optional message.
ConditionAn expression that must be true for the step to run; otherwise the step is skipped.
On failureWhat happens if the step fails: abort the run, skip the step, or fall back to another step.
Max turnsA cap on how many agent turns this step may take.
ContextHow much prior context the step receives: full (earlier step results included) or parameters-only (results omitted, the run's parameters and the active initiative and plan files still passed).
Skillthe unit of workCheckpointpause for a personConditionrun only if trueOn failureabort · skip · fall backContext & max turnshow much it sees, how long it runs
One step is a skill with controls layered on: when it pauses, when it runs, what happens if it fails, and how much it sees.
info
The full step model is on the concept page

The editor exposes the controls a builder reaches for every day. A step definition also carries a few advanced controls, an execution mode (whether the step runs in the sandbox or as a lightweight host completion), a side-effects marker (so a step that opens a pull request is never auto-retried after a stall), and a skip condition. The Flows concept page lists the complete step model, field by field.

add_photo_alternate
Screenshot to capture
The Flow detail page on the Steps tab. A tab strip at the top reads Overview / Steps (4) / Parameters (2) with Steps selected. Below it a Fluent Accordion of four step rows: '1 · Plan', '2 · Implement', '3 · Review (house style)', '4 · Create PR'; each row has small up/down reorder chevrons and a trash icon on the right. The third row is expanded into an editor panel showing fields: Step Name ('Review (house style)'), Step ID ('review'), Skill (a dropdown showing '/review-house-style'), a Step Parameters sub-editor with one row ('planRef ← $steps.implement.output.planFile'), a Checkpoint checkbox (checked) with a message input ('Sign off before the PR opens'), a Condition input (empty), an On Failure dropdown ('Abort flow'), a Max Turns input ('30'), and a Context dropdown ('Full'). A primary 'Save' button sits in the page header, enabled. Dark theme.
save as: public/docs-media/flow-steps-tab-editor.png
Caption when added: The step editor on the Steps tab. Each step binds one skill and layers the controls that decide when it runs and what happens if it fails.

Bind a skill to each step

A step does its work by running one skill. You pick the skill from a dropdown sourced from your tenant's resolved command registry, the same registry that powers the action launcher and the chat slash menu. The dropdown shows the skill's title and its slug, so /implement and /review read the way they do everywhere else in the product.

This is the lever that tunes a Flow to your stack. The orchestration shape (plan, then implement, then review, then open a pull request) stays constant; the skill bound to each step is where your conventions live. A team that writes a review-house-style skill once can drop it into the review step of every Flow, and the Flow inherits the house style without any change to its structure. Skills are reusable, versioned, and authored on their own Skills surface; a Flow step is one of the places they get used.

lightbulb
A step runs a skill, and a skill can pin its own model

Because each step runs a skill, and a skill can carry its own pinned model, a single Flow can move across models, even across providers, as it runs. The implement step can run on a strong reasoning model while the verify step that follows runs on a different provider, so the work is checked by a model that did not write it. How the platform settles which model a step uses is in Run several providers at once.

Pass values between steps

A step rarely runs in isolation. Its parameters are how you feed it the run's inputs and the results of earlier steps. The step parameter editor gives you three kinds of value without making you write reference syntax by hand:

  • A literal. A fixed string, number, or boolean you type in.
  • A run input. A value the person supplied when they started the Flow, written $input.<name>.
  • An earlier step's output. A field from a step that already ran, written $steps.<stepId>.output.<field>.

For the core SDLC skills (research, initiative, plan, implement, verify, create-pr, generate-test-cases), the editor surfaces that skill's output fields in a dropdown, so binding the implement step's plan file into the review step is a pick, not a guess. For any other skill, you type the field name; every skill's result also carries the shared summary, status, and artifacts fields you can always reference. The full grammar, including array indexing like $steps.research.output.files[0], is on the concept page.

Run inputsrepositoryId, …PlanImplementReview$input.repositoryIdoutput: planFile, branch, summary$steps.implement.output.planFileA reference resolves to text before it reaches the skill.
Values flow forward. A run input feeds a step; a step's output feeds the next. A reference resolves to text before it reaches the skill.
lightbulb
A reference always resolves to text

When a reference like $steps.verify.output.readyForPr reaches a condition, it arrives as the string "true", not a boolean. That is why the condition examples below quote the value (== true compares text to text). One companion detail: a reference to a field an earlier step did not produce resolves to the literal string "undefined", so it pays to bind against fields the upstream skill actually emits. A comparison against the wrong type, or against a field that was never set, is a condition that silently never fires.

Mark the steps that need a checkpoint

A checkpoint is a pause before a step runs, where a person approves, rejects, or skips before the agent continues. On the step editor it is a single checkbox ("pause before this step for approval") plus an optional message that explains what the reviewer is signing off on.

Whether a checked step actually pauses depends on the Flow's checkpoint mode, which you set on the Overview tab and a run can override:

  • template pauses only at the steps you marked.
  • all pauses before every step, marked or not.
  • none runs straight through.

So the per-step checkbox and the Flow-level mode work together: the checkbox says "this step is worth a look," and the mode decides whether that intent is honored on a given run. The full mechanics of what a person does at a paused checkpoint, and how a background run handles one, are on the Run a Flow page and in Human checkpoints.

Decide when a step runs and what happens if it fails

Two controls keep a Flow from being a rigid straight line.

A condition is a short expression that must be true for the step to run. If it is false, the step is marked skipped and the run moves on. The built-in Quick SDLC Flow uses this on its create-a-pull-request step, which runs only once the verify step reports the work is ready:

$steps.verify.output.readyForPr == true

You can combine checks with && and || when a step should run only under more than one condition, for example a step that runs only when verification passed and the run was told not to skip review:

$steps.verify.output.readyForPr == true && $input.skipReview != "true"

Conditions compare and combine rather than calculate, on purpose. They use == and != to compare, && and || to combine, parentheses to group, and a null check for a value an earlier step left unset; they do not do arithmetic or < and > comparisons. A condition a reader can predict at a glance is a condition a team can trust, and when a decision needs more than a match, the right move is to have a step report a plain yes-or-no field in its output and branch on that. The agent decides; the condition reads the decision. The complete grammar, every step field, and each skill's output fields are catalogued in the automation reference.

On failure decides what happens when a step's skill fails outright. The dropdown offers three answers:

  • Abort flow stops the run (the default, and the safe one).
  • Skip step marks the failed step skipped and continues.
  • Jump to fallback step routes to a fallback step, for a recovery path (the fallback target is named in the Flow definition).

The fallback branch is where recovery becomes part of the Flow. A verify step set to jump to a summarize-failure step on failure can have that step write a plain-language note onto the plan describing what went wrong, so a run that hit a problem leaves a trace a person can pick up rather than a dead end. The recovery is part of the design, not something a person pieces together after the fact.

Each step's result is also checked against a fixed shape for its skill (a summary, a status, and any artifacts the skill declares); the platform gives the agent another pass when the result does not fit, so a malformed result is corrected rather than passed downstream. You get this for free; it is the skill's contract doing its job.

Max turns caps how many agent turns the step may take, and Context chooses between handing the step the full prior context or only the run's parameters. Both give the occasional step that needs a tighter leash or a cleaner slate exactly that.

The Parameters tab

The Parameters tab declares the inputs a person fills in when they start the Flow. Each parameter is a row.

ColumnWhat it sets
NameThe identifier a step reads with $input.<name>.
DescriptionThe label and helper text shown in the run dialog.
Typestring, number, or boolean. The run dialog renders the matching control.
RequiredWhether the run is blocked until the parameter has a value.
HiddenWhether the parameter is omitted from the run dialog (set from a default or a trigger instead).
DefaultA value pre-filled in the run dialog.

A parameter named repositoryId gets a repository picker in the run dialog rather than a plain text box, and a boolean parameter gets a checkbox. Required parameters with no value block the run until they are filled. This is the contract between the person starting a Flow and the steps that consume what they entered.

add_photo_alternate
Screenshot to capture
The Flow detail page on the Parameters tab. Tab strip Overview / Steps (4) / Parameters (2) with Parameters selected. A two-row parameter editor table with columns Name / Description / Type / Required / Hidden / Default. Row 1: name 'repositoryId', description 'Repository to run against', Type dropdown 'string', Required checked, Hidden unchecked, Default empty. Row 2: name 'skipReview', description 'Skip the house-style review step', Type dropdown 'boolean', Required unchecked, Hidden unchecked, Default a checkbox set to false. An 'Add Parameter' button below the rows; enabled Save in the page header. Dark theme.
save as: public/docs-media/flow-parameters-tab.png
Caption when added: The Parameters tab. Each row declares one run input; the type drives the control a person sees in the run dialog.

Start from a built-in

You rarely start from a blank page. Disco Parrot ships a set of built-in Flows covering the common shapes of work, from drafting an initiative to taking a change all the way to a pull request.

Full SDLCPlanImplementVerifyReviewCreate PRQuick SDLCPlanImplementVerifyCreate PRImplementImplementVerifyFix PR CommentsRead findingsFixRecheckDesign Initiative + PlansResearchDraftPlansDocumentation HealthScanDiffPropose
A sample of the built-in Flows. Each ships ready to run, and each is a starting point you can Customize.
Built-in FlowWhat it does
Full SDLCPlan, implement, verify, review, and open a pull request: a change from idea to PR in one run.
Quick SDLCThe lean path: plan, implement, verify, open a pull request.
ImplementImplement and verify an existing plan, without the planning steps in front.
Run AI ReviewReview the work and report findings, without changing code.
Fix PR CommentsWork through a pull request's review findings, fix, and recheck.
Design Initiative + PlansDraft an initiative and the plans underneath it.
Design Initiative / Revise InitiativeDraft or revise an initiative spec.
Create Plan / Revise PlanDraft a plan (with test cases) or revise an existing one.
Documentation Health ReviewSweep the repository docs and propose updates where the code has moved on.
Repository OnboardingRead a new repository and write its first architecture and convention docs.

The documentation-health and repository-onboarding Flows are covered in depth on their own page.

A built-in is read-only. To change one, Customize it: the platform forks the built-in into an editable workspace copy seeded from the original, and the editor unlocks. A customized Flow carries a Customized badge and a Reset to Default action that removes your copy and restores the built-in, keeping any schedule you attached. Flows resolve in layers, from most general to most specific, so the workspace copy you save shadows the built-in for your whole team.

Repository copyscoped to one repoWorkspace copyyour team customizedBuilt-inships with the platformmostspecificmostgeneralwhat runs:the topmostpresent layer
Flows resolve in three layers. A more specific copy shadows the one beneath it; the built-in is always there to reset to.

The detail page tells you which layer a Flow is. Customizing never overwrites the built-in; it adds a more specific copy that shadows it, so a reset always has the original to fall back to. (A repository can hold a copy that diverges from the workspace one for a single repo; that finer layer is set in the Flow definition rather than the editor.)

add_photo_alternate
Screenshot to capture
The Flow detail page for a built-in Flow ('Quick SDLC') on the Overview tab, in read-only state. The page header shows the title 'Quick SDLC', a grey 'Built-in' source badge, and a primary 'Customize' button (the Save button is absent because the Flow is read-only). The Overview fields (Title, Description, Flow ID, Checkpoint mode, Mode) are shown as read-only labels rather than editable inputs. A subtle banner under the header reads 'This is a built-in Flow. Customize it to make an editable copy.' Dark theme.
save as: public/docs-media/flow-customize-built-in.png
Caption when added: A built-in Flow open in read-only state. Customize forks an editable workspace copy; the built-in stays untouched.

Fork a built-in, end to end

Maya leads a backend team that wants every agent-opened pull request reviewed against the team's house style before it reaches GitHub. She does not want to build a Flow from scratch; she wants the Quick SDLC Flow with one step added. Here is the whole authoring session.

  1. She opens the Quick SDLC Flow from the Flows list and reads its four steps: plan, implement, verify, create a pull request, with the last step set to run only when verify reports the work ready.
  2. She clicks Customize. The editor unlocks on an editable copy that now carries a Customized badge.
  3. On the Steps tab she clicks Add Step, names it "Review (house style)," gives it the step ID review, and picks her team's /review-house-style skill from the Skill dropdown.
  4. She gives the review step the implemented work to look at by binding a planRef parameter to $steps.implement.output.planFile, picked from the editor's output-field list rather than typed.
  5. She reorders the review step above Create PR with the up control, so the review runs before anything opens.
  6. She checks the Checkpoint box on the review step and types the message "Sign off before the PR opens," so a person approves after the review and before the PR.
  7. She leaves On failure on Abort flow, and clicks Save.

Maya has not written a line of orchestration code. She picked a skill her team already owns, dropped it into a step, ordered it, and put a person in front of the PR. The Flow she saved is now the one her whole team runs, and the next time anyone implements a plan with it, the house-style review and the human sign-off happen on every pass.

Make a Flow run on its own

A Flow runs on demand, and a Flow can also carry a trigger that fires it automatically. A trigger is the platform turning an event into agent work that still flows through the same checkpoints, the same audit trail, and the same sandbox isolation as a run a person started by hand. The Flow model supports three trigger shapes.

  • Scheduled. A cron expression with an optional time zone runs the Flow on a cadence. The schedule can be paused and resumed without being deleted, and a scheduled run always executes in the background against a sandbox profile the schedule names.
  • On a pull-request comment. The Flow fires when a comment lands on a pull request, with optional filters by finding severity (blocking, suggestion, nit, question) and by source (an AI finding, a GitHub comment, or an in-app comment).
  • On a pull-request review. The Flow fires when a review is submitted, by default when changes are requested, with an optional filter by review sentiment.

The pull-request triggers are what let the built-in review and fix Flows respond to activity on a pull request, and they come pre-wired on those Flows: you do not assemble the trigger, you turn the behavior on. The clearest place to see a trigger you set yourself is the documentation-health schedule: on a repository's settings, under Documentation Health, you choose a cadence (presets from every six hours through daily, weekly, and biweekly, or a custom cron expression), a time of day, and a time zone, plus how far back to look and whether to auto-apply high-confidence updates. An enable toggle pauses and resumes the schedule without losing the configuration. That writes a scheduled trigger onto the documentation-health Flow; the repository documentation page covers it in context.

Schedulecron + timezonePR commentseverity + source filtersPR reviewsentiment filterFlow runbackgroundsame checkpointssame audit trailsame sandbox isolationa triggered run is governed like any other
A trigger turns an event into a run nobody clicked Start on. The run is governed exactly like one a person launched.

A triggered run is governed exactly like one a person started by hand. It runs through the same checkpoints, writes the same audit trail, and executes in the same isolated sandbox. Automation does not buy a Flow out of the oversight model; it just removes the click that started it.

lightbulb
A fix Flow can close the loop on its own

A fix Flow set to act on a pull-request review dispatches itself for each blocking finding, applies a fix, rechecks, and repeats, stopping when everything is resolved or after a set number of rounds (three by default), at which point anything still unresolved is handed back to a person rather than looped on forever. If a recheck finds that a fix broke something that used to pass, the run pauses instead of charging ahead. Flows covers the full loop.

info
Scheduled runs need a sandbox profile

A trigger fires a run with no person in the room, so it carries its own sandbox profile rather than asking for one. A scheduled trigger with no profile set is skipped rather than run against the wrong environment. When you set a documentation-health schedule, the repository's profile is what the run uses.

add_photo_alternate
Screenshot to capture
A repository's settings with the Documentation Health section expanded. A heading 'Documentation Health' with an Enable toggle (on). Below it a Frequency control showing preset options (Every 6 hours / Every 12 hours / Daily / Weekly on Monday / Biweekly / Custom) with 'Weekly on Monday' selected; a time-of-day picker showing '09:00'; a time-zone dropdown showing 'America/New_York'; a 'Look back' input showing '7 days'; and an 'Auto-apply high-confidence updates' toggle (off). A muted caption reads 'Writes a scheduled trigger on the Documentation Health Review Flow. Runs use this repository's sandbox profile.' Dark theme.
save as: public/docs-media/flow-trigger-config.png
Caption when added: The documentation-health schedule, the one trigger you configure yourself. The enable toggle pauses and resumes it without losing the cadence.

Save, and test by running

Save writes the Flow; it lights up the moment you have an unsaved change and a browser warning catches an accidental tab close with edits pending. A Flow saves once it has at least one step and each step has an ID and a bound skill, so a half-built step (a skill you have not chosen yet) is flagged rather than saved into a Flow that would not run. There is no separate publish step: a saved Flow is immediately runnable by anyone with flows.run.

The way you test a Flow is to run it. The Run Flow action on the editor opens the same run dialog described on the Run a Flow page, collecting the parameter values, a sandbox profile, the execution mode, and the checkpoint mode. Running with the checkpoint mode set to all is the natural way to step through a new Flow one stage at a time and confirm each step does what you meant before you let it run straight through. A test run is a real run: it produces the same Session, the same transcript, and the same auditable record as a run your team relies on, so there is no separate "draft mode" that behaves differently from the real thing.

How many Flows a workspace can keep

The number of Flows your workspace can hold (the built-ins are free; this counts the copies you create and customize) depends on your plan.

PlanWorkspace Flows
Free1
Team3
Business10

This is the cap you hit when a save is refused; it counts your tenant-created and customized templates at one time, not your runs. The per-day cap on how many times you can run Flows is covered on the Run a Flow page.

Permissions

You want toScope
Open a Flow and read its stepsflows.read
Create, edit, customize, reset, or delete a Flowflows.manage
Test a Flow by running itflows.run

flows.manage is the authoring scope, and it is separate from flows.run: a workspace can let many people start the Flows the team has built while keeping the authoring of those Flows in fewer hands. The editor hides the Create, Save, Customize, Reset, and Delete affordances when you lack flows.manage, and hides Run Flow when you lack flows.run.

Why building a Flow looks like this

Most automation tools make you choose between two shapes, and neither is good for serious engineering work. A no-code builder gives you boxes and arrows that cannot express "run this only if verification passed," so the interesting logic leaks into prose the runtime ignores. A code-first pipeline expresses anything but lives in a YAML file no product manager will ever open, so the people who own the work cannot shape the automation that does it.

Build a Flow is the path between them. The orchestration is a first-class artifact a planner can read: an ordered list of steps, each one a named skill, with checkpoints where a person decides and conditions that compare rather than compute. The depth lives in the skills, which are versioned and reusable and authored by whoever owns that kind of work, so a Flow stays legible while the expertise it carries gets arbitrarily deep. The conditions stay simple on purpose, because a Flow you cannot predict is a Flow you cannot trust. And the same three-layer resolution that lets you customize a built-in lets a single repository diverge without forking the whole library.

For a senior PM, Build a Flow is the answer to "can I shape how the agent works on my team's terms, or am I stuck with what shipped?" For an engineer, it is the place where the review skill that encodes the team's standards becomes a step every Flow runs. For a lead, it is where the checkpoint in front of the pull-request step turns "the agent opened a PR" into "the agent opened a PR after a person signed off." You write the shape once; the team runs it forever.