.toml file into version control and launch with a single command:
Minimal example
A run config requires two fields:run.toml
| Field | Required | Description |
|---|---|---|
version | Yes | Config format version. Must be 1. |
graph | Yes | Path to the DOT workflow file, resolved relative to the TOML file’s directory. |
goal | No | What the workflow should accomplish. Passed to agents and used in retrospectives. Can also be provided via --goal CLI flag or DOT graph goal attribute. |
--goal > TOML goal > DOT graph attribute.
Full example
run.toml
Sections
[llm]
Override the default model and provider for all nodes that don’t have an explicit model assigned via a stylesheet.
run.toml
| Field | Description |
|---|---|
model | Model ID or alias (e.g. claude-sonnet-4-5, opus, gemini-pro). See Models. |
provider | Provider name (optional — auto-inferred from the model catalog). Only needed for models not in the catalog or to force a specific provider. |
[llm.fallbacks]
Map each provider to an ordered list of fallback providers. When the primary provider is unavailable, Fabro tries the fallbacks in order:
run.toml
[setup]
Shell commands to run before the workflow starts. Use this to clone repositories, install dependencies, or prepare the environment.
run.toml
| Field | Description |
|---|---|
commands | List of shell commands, executed sequentially via sh -c. |
timeout_ms | Per-command timeout in milliseconds. Default: 300000 (5 minutes). |
[sandbox]
Configure how agent tools (bash, file edits) are executed.
run.toml
| Field | Description |
|---|---|
provider | Sandbox mode: local (default), docker, daytona, ssh, or exe. |
preserve | When true, keep the sandbox alive after the run finishes. Useful for debugging. |
devcontainer | When true, use the repo’s devcontainer.json to configure the sandbox. See Devcontainers. |
[sandbox.daytona]
Additional settings when using the Daytona cloud sandbox:
run.toml
| Field | Description |
|---|---|
auto_stop_interval | Minutes of inactivity before the sandbox auto-stops. |
labels | Key-value labels attached to the sandbox for filtering and identification. |
snapshot.name | Snapshot name to create or use for the sandbox. |
snapshot.cpu | CPU cores for the snapshot. |
snapshot.memory | Memory in GB for the snapshot. |
snapshot.disk | Disk in GB for the snapshot. |
snapshot.dockerfile | Dockerfile content (inline string) or path ({ path = "..." }) for building the snapshot image. Paths are resolved relative to the TOML file’s directory. |
network | Network access mode: "allow_all" (default), "block", or { allow_list = ["..."] }. See Sandboxing. |
[sandbox.local]
Additional settings when using the local sandbox:
run.toml
| Field | Description |
|---|---|
worktree_mode | When to create a git worktree for the run: always, clean (default — only when the working tree is clean), dirty (also when dirty), or never. |
[sandbox.ssh]
Additional settings when using the SSH sandbox:
run.toml
| Field | Required | Description |
|---|---|---|
destination | Yes | SSH destination — user@host, a hostname, or an SSH alias from ~/.ssh/config. |
working_directory | Yes | Absolute path to the working directory on the remote host. |
config_file | No | Path to a custom SSH config file (e.g. for non-default keys or jump hosts). |
preview_url_base | No | Base URL for port previews (e.g. "http://myserver"). When set, preview URLs are {preview_url_base}:{port} instead of localhost. |
[sandbox.exe]
Additional settings when using the exe.dev cloud sandbox:
run.toml
| Field | Description |
|---|---|
image | Custom container image for the exe.dev VM. Optional — uses the exe.dev default when omitted. |
[sandbox.env]
Pass environment variables into sandbox command and agent execution. Values can be literal strings or host environment passthrough using ${env.VARNAME} syntax:
run.toml
| Syntax | Description |
|---|---|
"literal" | Static value passed as-is |
"${env.VARNAME}" | Resolved from the host environment at load time. Missing vars produce a hard error. |
"prefix-${env.X}" is not supported. Sandbox env vars from server.toml defaults and the run config are merged, with the run config winning on key collisions.
[checkpoint]
Configure how git checkpoint commits behave.
run.toml
| Field | Description |
|---|---|
exclude_globs | Glob patterns for files to exclude from checkpoint commits. Uses git pathspec :(glob,exclude) syntax. |
server.toml defaults and the run config are merged (union, deduplicated).
[vars]
Define variables that are expanded into the DOT source before the graph is parsed. See Variables for the full reference.
run.toml
$name syntax:
c-i.fabro
$variable in the DOT file has no matching entry in [vars], Fabro raises an error immediately. A bare $ not followed by an identifier (e.g. costs $5) is left as-is.
[assets]
Configure automatic collection of test artifacts (Playwright reports, JUnit XML, screenshots, etc.) from the execution environment after each stage.
run.toml
| Field | Description |
|---|---|
include | Glob patterns for files to collect as assets. Matched against the working directory after each stage completes. |
[assets] section is present, no file scanning occurs. This avoids the overhead of scanning large working directories when assets aren’t needed.
[mcp_servers]
Configure MCP servers available to agent stages during the workflow run. Each server is a named TOML table. All three transport types are supported: stdio, http, and sandbox.
run.toml
| Field | Description | Default |
|---|---|---|
type | Transport type: "stdio", "http", or "sandbox". | — |
command | (stdio, sandbox) Array: executable + arguments. | — |
port | (sandbox) Port the server listens on inside the sandbox. | — |
url | (http) The MCP server endpoint URL. | — |
env | (stdio, sandbox) Additional environment variables. | {} |
headers | (http) Optional HTTP headers for authentication. | {} |
startup_timeout_secs | Max seconds for server startup + MCP handshake. | 10 |
tool_timeout_secs | Max seconds for a single tool call. | 60 |
sandbox transport runs the MCP server inside the workflow’s sandbox. This is useful for tools that need access to the sandbox environment, such as browser automation with Playwright. See MCP for details.
[pull_request]
Automatically open a GitHub pull request when the workflow run completes successfully. Requires a GitHub App to be configured.
run.toml
| Field | Description |
|---|---|
enabled | When true, Fabro creates a PR from the agent’s working branch after a successful run. Default: false. |
draft | When true, the PR is created as a draft pull request. Default: true. |
[[hooks]]
Define hooks that run in response to lifecycle events. Each hook is a TOML array entry:
run.toml
| Field | Description |
|---|---|
name | Optional display name for the hook. |
event | Lifecycle event: run_start, run_complete, stage_start, stage_complete. |
command | Shell command to execute (shorthand for type = "command"). |
matcher | Regex matched against node ID or handler type. Limits which stages trigger this hook. |
blocking | Whether the hook must complete before execution continues. Defaults vary by event. |
timeout_ms | Hook timeout in milliseconds. Default: 60000 (60s). |
sandbox | Run inside the sandbox (true, default) or on the host (false). |
Top-level fields
In addition to the sections above, two optional top-level fields are available:| Field | Description |
|---|---|
directory | Working directory for the run. Defaults to the current directory. |
Graph path resolution
Thegraph path is resolved relative to the TOML file’s parent directory, not the current working directory. This means a run config and its workflow can live side by side:
Precedence
Settings can come from multiple sources. Fabro resolves them in this order (first match wins):| Source | Priority |
|---|---|
| Node-level stylesheet | Highest |
| Run config TOML | |
CLI flags (--model, --provider, --sandbox) | |
Server defaults (~/.fabro/server.toml) | |
DOT graph attributes (default_model, default_provider) | |
| Built-in defaults | Lowest |
For model and provider specifically, the precedence is: CLI flags > TOML config > server defaults > DOT graph attributes > built-in defaults. Stylesheet rules on individual nodes always take priority over all of these.
Server defaults
When running viafabro serve, the server config at ~/.fabro/server.toml can set default values for [llm], [setup], [sandbox], and [vars]. These defaults are applied to every run unless the run config overrides them.
For variables, defaults and run config are merged — the run config wins on key collisions:
Validation
Fabro validates the run config when it loads:- Version check — Only
version = 1is accepted. Other versions are rejected immediately. - Required fields —
versionandgraphare required.goalis optional (can be provided via--goalor DOT graph attribute). - Unknown fields — Extra fields not listed above are rejected (
deny_unknown_fields). - Variable check — Any
$variablein the DOT file without a matching[vars]entry produces an error.
--preflight to validate a run config without executing it: