Disco ParrotDisco Parrot Home
Docs
Request a Demo

Automation reference and limits

The exact values behind the automation engine. Flow and step grammar, the expression syntax, per-skill output contracts, the real-time event names, and the platform's hard limits in one place.

This is the value reference for automation. Use it to confirm a field name, an operator, an output field, an event name, or a ceiling by its exact value. It covers the grammar that defines a Flow and its steps, the expression syntax those steps use, the structured result each skill returns, the real-time events the platform emits while work runs, and the hard limits that bound all of it. The concepts behind these values live in the Flows, Build a Flow, and Skills guides.

info

A Flow is agent work that executes: ordered steps, checkpoints, and results. A Workflow is the set of statuses a record moves through. They are different features. This page is about Flows. Workflow statuses are in the statuses reference.

Flow definition grammar

A Flow is a template made of a few named parts. These are the exact fields.

FieldTypeWhat it holds
flowIdstringThe Flow's stable identifier.
scopestringWhere the template comes from: global, repo, or filesystem.
usableScopeglobal / initiative / planWhere a run may be launched from. Optional.
titlestringThe display name.
descriptionstringWhat the Flow does.
stepsstep arrayThe ordered units of work.
parametersparameter arrayThe inputs supplied at run time.
defaultsdefaults objectHow the run behaves unless overridden.
triggertrigger objectAn optional rule that fires the Flow on its own.
Flow templateflowId, scope, usableScope, title, descriptionSteps
Ordered units. Each runs one skill.
Parameters
Inputs supplied at run time.
Defaults
Checkpoint mode, interactive or background, limits.
Trigger
Optional. Fires the Flow on its own.
A Flow template is four named parts: the ordered steps, the parameters it takes, the defaults that govern a run, and an optional trigger that fires it without a person.
add_photo_alternate
Screenshot to capture
The Flow editor open on a built-in SDLC Flow, left panel listing ordered steps with their skill names, right panel showing the defaults for the selected step including checkpoint mode and execution mode
save as: public/docs-media/flow-editor-steps-defaults.png
Caption when added: A Flow editor showing its steps and defaults. Every field in the grammar above maps to a control here.

Step fields

Each step runs one skill and carries the controls below. The Flows guide explains what each one does; this is the exact shape.

FieldTypeNotes
stepIdstringUnique within the Flow.
namestringDisplay name.
skillSlugstringThe skill this step runs.
parametersstring mapValues passed to the skill. A value can be a literal or a reference to an earlier step's output.
checkpointobjectenabled, plus an optional message and autoApproveInBackground. A checkpoint pauses the run for an approval.
conditionstringAn expression that must be true for the step to run.
skipConditionstringAn expression that, when true, skips the step.
onFailureabort / skip / fallbackWhat to do if the step fails.
fallbackStepIdstringThe step to run when onFailure is fallback.
maxTurnsnumberA cap on agent turns in this step.
contextModefull / parameters-onlyHow much prior context the step receives. Default full.
executionModesidecar / headlessWhere the step runs. Default sidecar.
sideEffectsexternalMarks a non-idempotent step so it is never auto-retried after a stall.
ordernumberThe step's position. Array order is the runtime order.

Parameter fields

FieldTypeNotes
namestringThe parameter's identifier.
descriptionstringThe user-facing prompt in the run dialog.
typestring / number / booleanThe value type.
requiredbooleanWhether a value must be supplied.
defaultValuestringUsed when none is supplied. Optional.
hiddenbooleanHides the parameter from the run dialog, for internal values. Optional.

Defaults fields

FieldTypeNotes
checkpointModetemplate / all / noneWhich steps pause for approval. template pauses only at marked steps.
modeinteractive / backgroundWhether the run is watched or proceeds on its own.
maxTotalTurnsnumberA cap on agent turns across all steps. Optional.
timeoutMsnumberA wall-clock ceiling for the run. Optional.
agentRuntimeobjectPins the run to a provider and model when no profile sets one. Optional.
autoDispatchOnReviewbooleanWhen true, the Flow dispatches itself for each blocking review finding. Default false.
maxIterationsnumberThe recheck loop's maximum rounds before unresolved findings go back to a person. Default 3.

Triggers

A Flow runs on demand, and a trigger can fire it on its own. There are three shapes.

TriggerFires whenFilters
scheduledA cron expression matches, in an optional time zone. The schedule can be paused and resumed.None.
pr-commentA comment arrives on a pull request.By finding severity (blocking, suggestion, nit, question) and source (ai, github-comment, in-app). Each filter is optional; with none set, the source defaults to AI findings and human GitHub comments, and all severities are included.
pr-reviewA pull-request review is submitted.By review state (approve, request-changes, comment). Optional; defaults to changes-requested.
add_photo_alternate
Screenshot to capture
The trigger configuration panel for a Flow with the pr-comment trigger selected, showing the finding-severity and source filters and a paused cron schedule below
save as: public/docs-media/flow-trigger-config.png
Caption when added: Configuring a trigger so a Flow fires on its own.

How a run starts

A run begins one of four ways. The first is a person; the other three are a trigger firing on its own. All four count the same against the daily-runs limit.

StartWhat begins the run
ManualA person launches the Flow from a record or the Flows list and fills in its parameters.
ScheduledA scheduled trigger's cron expression matches.
Pull-request commentA pr-comment trigger matches an arriving comment by severity and source.
Pull-request reviewA pr-review trigger matches a submitted review by its state.

A triggered run has no person to fill the run dialog, so it uses the Flow's defaults and each parameter's default value. A parameter a trigger relies on therefore needs a defaultValue, or a hidden value set on it, or the run starts without it.

Where a template resolves from

The same flowId can exist at three layers, and the most specific one wins. This is how a built-in becomes editable without losing the original.

  1. A filesystem default that ships with the platform.
  2. A workspace copy your team has saved.
  3. A repository copy scoped to a single repo.

A built-in is read-only until you Customize it, which forks it into a workspace copy. Reset to Default removes the copy and restores the built-in, keeping any schedule attached. The full lifecycle is on Flows.

Repository copyScoped to one repo. Most specific.Workspace copySaved by your team.Filesystem defaultShips with the platform. Read-only.most specificwinsCustomize / Reset to DefaultFork a built-in to edit it, or restore it.
The same flowId can exist at three layers. The most specific one wins. Customize forks a built-in into a workspace copy you can edit; Reset to Default removes the copy and restores the built-in.

Expression grammar

Conditions and parameter references share one small expression language. It compares and combines values; it does not calculate them. That keeps a Flow easy to read and its behavior easy to predict.

expression  = or_expr
or_expr     = and_expr ( "||" and_expr )*
and_expr    = comparison ( "&&" comparison )*
comparison  = unary ( ("==" | "!=") unary )?
unary       = "(" expression ")" | value
value       = ref | string | number | "null" | "true" | "false"
ref         = "$" segment ("." segment)*
segment     = identifier ( "[" number "]" )?
FormReadsExample
$input.nameA value the run was started with.$input.initiativeName
$steps.id.output.fieldA field from an earlier step's result.$steps.verify.output.readyForPr
field[n]An element of an array field.$steps.research.output.files[0]

A resolved reference is turned into text before it reaches the skill, so a comparison against one quotes the value: $steps.verify.output.readyForPr == "true", not a bare boolean. A reference to a field an earlier step did not produce resolves to the string "undefined", so it pays to bind against fields the upstream skill actually emits. The operators are equality (==, !=) and the logical && and ||, with parentheses for grouping. An expression is capped at 4096 characters; a longer one is rejected. When a decision needs more than a match, have a step report a plain result in its output and branch on that.

Step output contracts

Every step returns a structured result validated against a fixed shape for its skill, with a couple of automatic retries if the first result does not fit. Each result carries the base contract below, and named skills extend it with their own fields, which the next step can read.

Base fieldTypeWhat it holds
summarystringA one to three sentence summary of what the step did.
statussuccess / partial / blocked / errorThe step's outcome. A step that reports blocked pauses the run for attention.
artifactsstring mapA map of artifact name to its file path in the sandbox.

The built-in skills the SDLC and fix Flows compose extend that base with these fields.

SkillExtended output fields
ax-researchentryPointName, entryPointType, discoveryDocPath, dependencyCount
initiativeinitiativeId, initiativeFile, featureCount, phases
planplanId, initiativeId, planFile, stepCount
implementplanFile, commitHashes, stepsCompleted, buildStatus (pass / fail / skipped)
verifyplanFile, buildPass, integrityPass, readyForPr, issues
create-prprUrl, prNumber, branch
generate-test-casestestCaseIds, planId, count
reviewprNumber, overallVerdict (approve / request-changes / comment), findings, filesTouched, reviewerIteration
scoped-implementprNumber, addressedFindingIds, skippedFindingIds, commitSha, filesTouched, rationale
recheckprNumber, iteration, findingResults, regressionsDetected, allResolved, shouldContinue
verify stepoutputBase contractsummary · status · artifactsstatus: success / partial / blocked / errorExtended fieldsreadyForPr · buildPassintegrityPass · issues$steps.verify.output.readyForPrcreate-pr stepconditionreadyForPr == "true"Runs only when verify reports the work is ready,then opens a real pull request and returnsprUrl · prNumber · branch
Every step returns the same base result, a summary, a status, and its artifacts, and a named skill adds its own fields. The next step reads any of them by name.
add_photo_alternate
Screenshot to capture
A Flow run detail page with one step expanded, showing its status, summary, and the named output fields the step produced such as prNumber and overallVerdict
save as: public/docs-media/run-detail-step-output.png
Caption when added: A run detail page showing the output fields a step produced. The next step reads these by name.

A skill your team authors produces the base contract, so a custom step still reports a summary, a status, and its artifacts, and a later step can read those. The verify, review, and recheck skills declare that they require an applied environment, so the Flow gates them on open environment-health blockers before and after they run, parking the run for attention rather than pressing on with a broken environment. A create-github-pr skill returns the same fields as create-pr for teams that name it explicitly.

Reading one contract end to end

Here is a single output field crossing from one step into the next step's condition. The review step runs and reports its result:

{
  "summary": "Reviewed PR 482. One blocking finding on input validation.",
  "status": "success",
  "overallVerdict": "request-changes",
  "findings": [ { "findingId": "finding-1a2b", "severity": "blocking" } ]
}

A later scoped-implement step reads that verdict by name in its condition, so it runs only when the review asked for changes:

$steps.review.output.overallVerdict == "request-changes"

The verdict was a literal value in one step's result; one step on, it is the gate that decides whether the next step runs at all. Nothing was passed in a prompt and nothing was inferred. The field is a named part of the review contract, the reference reads it by that name, and the comparison quotes it because a resolved reference reaches the expression as text. That is the shape of a Flow: a step states a fact, and a later step acts on it.

Skill reference

A skill is the unit a step runs. A Flow composes skills; a skill is what does the work inside one step. These are the parts that matter when you bind one to a step.

FieldWhat it holds
slugThe skill's stable identifier, the value a step's skillSlug names.
titleThe display name in the skill picker.
descriptionWhat the skill does, shown when you choose it for a step.
promptTemplateThe instructions the skill runs. A step's parameter values fill it in.
scopeWhere the skill comes from: a built-in that ships with the platform, or one saved in your workspace.
visibilityWhether a workspace skill is private to its author or shared with the tenant.
modelOverrideAn optional model the skill always runs on, so a step can pin its own model.

A skill takes its inputs through the step that runs it: the step's parameters are interpolated into the promptTemplate, as literals or as references to earlier output. Authoring a skill is on the Skills guide.

Run states

A run and its steps move through fixed sets of states. The full tables, including what each state means, are in the statuses reference; the values are listed here for quick lookup.

ManualScheduledPR commentPR reviewStartedA person or a triggerRunningSteps in orderCheckpointPauses for approvalResultLands in your work modelstep output → next step conditionrecheck up to 3 times, then back to a person
One run, start to result. A person or a trigger starts it, the steps run in order with each one's output feeding the next step's condition, a checkpoint can pause it for approval, a fix loop rechecks up to three times before handing back to a person, and the result lands in your work model as a record or a pull request.
  • A flow run is pending, running, paused, completed, failed, rejected, cancelled, blocked, or interrupted_by_deploy.
  • A step is pending, running, completed, failed, blocked, skipped, or cancelled.
add_photo_alternate
Screenshot to capture
The Flow runs list on the automation surface showing several runs with status pills in different states: one running with a step-progress indicator, one paused at a checkpoint awaiting approval, one completed, and one blocked with a precondition note, each row showing the Flow name, who started it, and how it was started
save as: public/docs-media/flow-run-states-list.png
Caption when added: A list of runs in different states. The status on each row is one of the run-state values above.

Who may read, run, edit, or cancel a Flow is set by the flows.read, flows.run, flows.manage, and flows.cancel.any scopes in the permission scope catalog.

Real-time events

The platform keeps every open tab current over a single server-sent events stream at /__/events. The events on it are lightweight signals: each one names what changed so the page can refetch the authoritative record. The store is the source of truth, not the event payload, so a missed signal is corrected on the next read rather than lost.

Record lifecycle signals

These fire as records are created, changed, or removed. They are grouped by the kind of record.

GroupEvent names
Initiativesinitiative-created, initiative-updated, initiative-deleted, initiative-restored
Plansplan-created, plan-updated, plan-deleted, plan-restored
Bugsbug-created, bug-updated, bug-deleted, bug-restored
Test casestest-case-created, test-case-updated, test-case-deleted, test-case-restored
Sprintssprint-created, sprint-updated, sprint-deleted, sprint-restored
Sprint membershipsprint-items-added, sprint-items-removed, sprint-items-reordered
Projectsproject-created, project-updated, project-deleted, project-restored, project-team-linked, project-team-unlinked
Portfoliosportfolio-created, portfolio-updated, portfolio-deleted, portfolio-restored, portfolio-project-added, portfolio-project-removed, portfolio-team-linked, portfolio-team-unlinked
Goalsgoal-created, goal-updated, goal-deleted, keyresult-updated
Teamsteam-created, team-updated, team-deleted, team-member-added, team-member-updated, team-member-removed, team-owner-transferred
Skillsskill-created, skill-updated, skill-deleted
Agent instructionsagent-instructions-updated
MCP configsmcp-server-config-created, mcp-server-config-updated, mcp-server-config-deleted
Sandbox profilessandbox-profile-created, sandbox-profile-updated, sandbox-profile-deleted, sandbox-profile-test-run-completed
Workflowsworkflow-updated

Portfolio and project events are gated by membership, so a person receives one only for a record they can see. The rest fan out across the workspace.

Run and activity signals

Flow runs, background tasks, and fan-out work emit their own progress signals on the same stream. Like the lifecycle signals above, each one names what advanced so the page can refetch the run's authoritative record.

SourceReports when
Flow runThe run starts, advances a step, reaches a checkpoint, and finishes.
Background taskThe task changes state as it provisions, runs, and settles for review.
Fan-out batchEach subtask starts, completes, or fails.
Chat turnA turn starts and completes.

A fan-out subtask inherits the parent's context, its inputs and the prior results, so each one starts oriented without being told everything again. The fine-grained content of a turn travels on its own stream, covered next; these are the coarse signals that tell a surface a run moved.

The chat-turn stream

A single agent turn streams its own output on a separate, cursor-resumable response so a dropped connection can reconnect and replay from where it left off. The chunks on it are typed.

ChunkWhat it carries
deltaA piece of the agent's reply as it is written.
thinking_deltaA piece of the agent's reasoning, when the model exposes it.
tool_startA tool call beginning, with its inputs.
tool_endA tool call finishing, with its result.
agent_resultThe turn's terminal outcome.
errorA runtime error during the turn.
heartbeatA keepalive, about every 15 seconds, that holds the connection open.

The turn ends on a [DONE] marker rather than a closed connection, so the client can tell a finished turn from a dropped one and resume accordingly.

Workspace events/__/events
One stream, lightweight signals. A signal names what changed; the page refetches the record.
plan-updated, sprint-items-added
Chat-turn streamper turn
One turn, cursor-resumable. Reconnects and replays from where it dropped. Ends on a marker.
delta, tool_start, agent_result, [DONE]
Operator channelself-hosted
Command and response. Carries provisioning to your cluster, not workspace events.
create, status, destroy
Three separate channels. Workspace events keep every tab current with lightweight signals. The chat-turn stream follows one turn and resumes if it drops. The operator channel drives a self-hosted sandbox and never carries workspace events.

The operator that drives a self-hosted sandbox talks over a separate command-and-response channel, not this event stream. It carries provisioning instructions to your cluster and their results, never the workspace events above.

Limits and ceilings

These are the numbers the platform enforces. They come in three kinds, and the value column says which: a fixed cap is the same on every plan and keeps one run from affecting another; a plan allowance rises with your plan and is marked "By plan"; and a per-run default is a starting value you can change on a single run, marked "default". Most are sized so they never come up in normal use.

LimitValueWhat it bounds
Expression length4096 charactersA single Flow condition or parameter reference.
Daily flow runsBy plan (Free 5, Team 20, Business and up uncapped)Flow starts per workspace per UTC day, across manual, scheduled, and triggered starts.
Workspace Flow templatesBy plan (Free 1, Team 3, Business 10, Enterprise uncapped)Flows your team saves or customizes. Built-in defaults do not count.
Recheck rounds3 (default, configurable per run)How many times a fix Flow rechecks before handing unresolved findings to a person.
Fan-out tasks20Subtasks one fan-out batch can spawn.
Fan-out wait120 s default, 300 s maximumHow long a step waits for its spawned subtasks.
Planning fetches per turn6Times an agent can pull related planning records in one turn.
List page size50 default, 200 maximumRecords returned by one list query.
Typeahead results100 per groupMatches returned per group in a search.
Bulk sprint update100 itemsItems changed in one batch sprint operation.
Credential leases64 per origin, 16 per minuteShort-lived credential grants a run can hold and request.
Saved dashboards20 per personDashboards one person can keep.
Estimates1000The ceiling on a single hours, points, or actual-hours value.
Upload size50 MBA single file or request body.
Large-value storageAbout 58 KBThe point at which a long text field moves to blob storage automatically.

A run's AI authoring is also bounded by per-turn and per-day budgets and is rate-limited and audited as it writes; those are covered on the agent runtime and counted against your quotas.

Programmatic access

Automation on this platform is built where the work lives, as Flows and skills you compose, schedule, and trigger, rather than as scripts that drive the work model from outside. A scheduled or pull-request trigger starts a run with no person and no external caller, and a Flow's steps read each other's results through the contracts on this page, so a multi-step pipeline runs inside the product rather than from a job server you keep alive. The HTTP endpoints behind the web and operator surfaces are internal to them and are not a published API today. If your team wants one, raise it with your account contact so it can be weighed against what Flows and triggers already reach.

Keeping this reference current

These values are read from the platform's own definitions, so they move with the product. The live surfaces own them: a Flow's editor shows its steps and defaults, a run's detail page shows the result fields a step produced, and the Workflows and quota pages show the values in force for your workspace. When a number here drives a decision, confirm it against the surface that owns it.

Why automation is shaped this way

Every value on this page is a contract that holds while a run is in flight. A step's output fields are a promise about what the next step can read, which is what lets a Flow be assembled from parts instead of written as one long prompt. The expression language stays small so a condition reads at a glance. The events are signals rather than payloads because the record is the source of truth, so a Flow that ran while you were away leaves its result in your work model, not in a message you can miss. The limits are stated in full for the same reason: when you build on a platform, the numbers it holds you to should be ones you can read before you reach them, not after.

For a power user, this is the page behind a Flow you are assembling: the step fields when you wire one up, the output contracts when you pass a result forward, and the operators when you write a condition.

For a developer, the event names and the limits are the reference to keep. The lifecycle signals are how a surface stays live, the chat-turn stream is how a turn is followed, and the ceilings are the numbers to design within.

For an administrator, the triggers and the recheck default are the ones to know. A scheduled or pull-request trigger is how work starts without a person, and the recheck ceiling is how a fix loop knows when to hand back to a human.

For a prospect, the takeaway is that the automation is composable and bounded: a small grammar, clear contracts between steps, live signals you do not have to poll for, and limits stated in the open.