Skip to main content
.bellows.yaml sits at the root of your repository. It has four top-level keys, all optional. Any other top-level key is an error. Each key may appear once. All limits are collected in Limits.

Where the file is read from

Bellows reads the file when a run starts. It does not read it from the agent’s working tree.
  • It reads the file through GitHub at the tip of the task’s base branch. If the task has no base branch, it uses the repository’s default branch.
  • The file is read at one commit, and the whole plan is validated before anything launches. The run uses exactly that revision.
  • Each new run reads the file again. A change to .bellows.yaml applies to tasks started after it is merged into the base branch.
  • If the file is missing, the run has no gates, no services, no policy and no reviewers. Without an environment block no gates run, so nothing checks the agent’s work.
  • A file over 65,536 bytes is refused.
A task can edit .bellows.yaml in its own branch, but that edit changes nothing for that task. This is how policy stays out of the agent’s reach.

File format rules

The parser reads a small, strict subset of YAML. It refuses what it does not understand instead of guessing, because a silently skipped gate is a check that never ran.
Do not put a comment after a value inside environment, policy or reviewers. timeout: 5 # minutes is refused, because the whole text after the colon is the value. Put the comment on its own line. Comments after a value are accepted inside services.

Errors

A bad file fails the task before the agent starts, with a configuration error. The message is shown on the failed run. Fix the file on the base branch (or the default branch), then retry the task.

environment

The runner image and what runs in it.
.bellows.yaml
An environment block without image is an error: environment declares no image. environment takes no inline value, and a second environment block is an error. Guides: Configure your repo, Environment variables and secrets.

cache

Each item is an environment variable name. Bellows sets that variable, in the runner and in gates, to a directory that outlives the container, so package caches survive between runs of the same repo.

gates

Each gate starts with - name:. Other keys are indented under it. A gate’s timeout is capped by the platform’s run time budget. The agent cannot start a gate with timeout above 10 while it works; see Gates. Errors you may see: gate "x" has no command, gate "x" is declared twice, more than 16 gates, unknown gate field "k" — only name, command, timeout, on_demand and filter are read, on_demand must be "true".

services

Sidecar containers that start with the task. Guide: Services.
.bellows.yaml
Plan-level rules, checked across all services:
  • At most 10 services.
  • Two services cannot declare the same port. They share one network namespace.
  • services: takes a list, not an inline value, so services: [] is an error. Leave the block out instead.
  • unhardened is refused. Every service runs hardened, so declare user instead.
  • Other keys are errors: unknown service key "k" — supported: name, image, ports, environment, user.
Quoted values accept the usual YAML escapes in double quotes (\n, \", \xNN, \uNNNN). Single quotes know one escape, ''.

policy

The evidence a task must carry before Bellows publishes it. Guide: Policy and reviewers.
.bellows.yaml (excerpt)
Any other value, an unknown key or a repeated key is an error. policy takes keys, not an inline value. gates: required without an environment block is refused with policy requires gates but no environment declares any. Policy is read from the base branch only.

reviewers

Named reviewer profiles the agent can call as a separate run. Guide: Policy and reviewers.
.bellows.yaml
At most 8 reviewers. Errors include reviewer "x" has no instructions, reviewer "x" is declared twice, more than 8 reviewers, and reviewer name "X" must be lowercase letters, digits and hyphens.

Complete example

Every key in one file. Comments sit on their own lines.
.bellows.yaml