Limits
Limits
AutoFlow enforces the limits below. None of them is configurable per workflow except the schedule-to-complete timeout.
Payloads and values
| Limit | Value | Where it applies |
|---|---|---|
| Script size | 100 KiB | StartWorkflowRequest.workflow_definition. |
| Workflow input | 256 KiB | The definition, args and kwargs marshaled together. Checked in AutoFlow, so a request over it is refused with INVALID_ARGUMENT. |
Single string, bytes or sensitive value | 256 KiB | Any value crossing the boundary between a workflow and AutoFlow. Enforced when the value leaves the workflow, not while it runs, so a concatenation can grow past it and fail later. |
| Integer | signed 64-bit | Any integer crossing that boundary. Starlark integers are arbitrary precision inside a workflow. |
| Action result | 256 KiB | The value an action resolves to, as recorded in history. |
| GitLab API response body | 240 KiB | The gitlab module reads the response up to the 256 KiB result cap minus a 16 KiB framing margin for the status and headers. |
| Module error message | 4 KiB | The Error.message a module returns. |
| Module file | 256 KiB | Each Starlark file a module descriptor ships. |
| Annotations | 32 per workflow, value 1 KiB | StartWorkflowRequest.annotations. Keys are unique and follow the Kubernetes annotation key format. |
Channels
| Limit | Value | Where it applies |
|---|---|---|
| Channel values received | 10,000 per workflow | Across every channel of one workflow, for its whole life. A send past it is refused with RESOURCE_EXHAUSTED and never clears. |
| Single channel value | 64 KiB marshaled | SendToWorkflowChannel and a module’s SendToChannel. |
| Channel name | 1 to 255 bytes | Names a caller supplies. The __autocore_internal: prefix is reserved. |
SendToChannel batch | 1 to 60 values | One message of a module’s send stream. |
Time
| Limit | Value | Where it applies |
|---|---|---|
| Schedule-to-complete timeout | 30 days by default, 60 days at most | Per workflow, set with schedule_to_complete_timeout. The deadline cannot be disabled. |
| Token expiry | start plus the timeout plus 1 hour | The tokens StartWorkflow returns, counted from the submission that created the workflow and recorded then, so re-minted tokens carry the same instant. Channel tokens the workflow mints for modules expire 1 hour after the workflow’s deadline. |
| Idempotency key retention | 76 days | Counted from the key’s first submission. A resubmission after that starts a fresh workflow under the same key. |
| Module registration | 30 minutes | A remote module’s descriptor. It re-registers periodically to stay loadable. |
| Inline action attempt | at most 500 ms | The in-goroutine attempt of an inlineable action. On expiry its context is canceled; an attempt that then fails is queued as any other action, and one that still returns a value is recorded. |
| Claim-to-complete timeout | 60 s | Each run of an action, each attempt of a poll and each load of a workflow’s modules, counted from when a worker starts it. On expiry the run’s context is canceled and an invocation that fails as a result is retried under its retry policy; a run that ignores the cancellation is not stopped, and a result it returns later still counts. |
| Data retention | 90 days | Workflow executions, history events and signal deliveries are partitioned by week and whole buckets are dropped past the window. |
Retention is also a ceiling on idle time, but one a workflow never reaches: the window exceeds the longest schedule-to-complete timeout by design, so the deadline, not retention, bounds the longest sleep or await a workflow definition can be written around.
Computation
| Limit | Value | Where it applies |
|---|---|---|
| Workflow thread steps | 100,000,000 | Each interpreter thread of a workflow, in Starlark computation steps, roughly a second of CPU. A warm resume carries the count and a cold replay reproduces it, so a runaway fails at the same instruction wherever it runs. |
| Module file thread steps | 10,000,000 | The thread that evaluates a loaded module file, a tenth of a workflow thread’s budget. |
| Transform source | 8 KiB | The source text of one derived_action transform. |
| Transform chain | 8 layers | How many transforms may wrap one invocation. |
| Transform steps | 1,000,000 | One run of a whole transform chain. Every layer spends from it. |
| Transform output | 256 KiB | The result a transform produces, checked inside the activity. |
| Poll predicate cost | 100,000 CEL units | One evaluation of a poll check. |
Identifiers and API
| Limit | Value | Where it applies |
|---|---|---|
| Workflow key | 1 to 255 bytes | Returned by StartWorkflow, presented by every other RPC. |
| Idempotency key | 1 to 255 bytes | StartWorkflow and SendToWorkflowChannel. Required; the __autocore_internal: prefix is reserved. |
| Workflow token, channel token | 1 byte to 4 KiB | Every RPC that addresses an existing workflow. |
| Token binding | exactly 64 bytes | StartWorkflowRequest.token_binding. |
| RPC rate | 60,000 calls per namespace per minute | All four RPCs together. Over the limit is RESOURCE_EXHAUSTED. |
SendToChannel rate | 1,000 batches per module agent per minute | A module’s send stream. A batch over the limit ends the stream with RESOURCE_EXHAUSTED. |
Last updated on