Skip to main content
Early Access. Commands and behavior can change between releases.
Your configuration lives in .architech/factory/factory.yaml. Commit it and review changes to it like code. Never put credentials in it.

Two ways to create the file

Onboarding

Writes your factory.yaml while it sets up the project.

Starter file

Writes a commented factory.yaml offline, with no project setup.
Both produce the same format, described on this page. The starter file is made with:

A complete file

This file runs a Cloud Factory for one repository. Every key is explained in a comment; the factory.yaml reference lists every allowed value. Replace acme, the project number and the repository with yours, and use a model your workspace lists.
Pickup, approval and changes labels count only when a person adds them; see approvals by label. Push writes the framework pin, so you never type the digest.

Connect your existing board

boards lists your boards and board picks one. A GitHub reference has an owner (an organization or user) and a project (the project number). List repositories separately, under repos.
Map only the columns you have. An unmapped status is not mirrored to the board, so you don’t need to create every canonical column.
Keys of statusMap are canonical statuses. Values are your board’s exact column names and can’t be blank. Leaving statusMap out is not the same as a partial map: Cloud then uses its default map. Cloud supports GitHub and Linear boards. A local file can also name jira or none, but Cloud doesn’t run those.

What starts work

Triggers decide which events start work: a board label, an assignment or a status, failed CI, or a schedule. The Triggers and routines page shows every event, what it starts, and how the stages chain. Without a triggers key, a pickup label or an assignment to factory starts plan, and failed CI on a factory/* branch sends the work back to build. Whatever the trigger, a board item also needs every pickup label and no hold label, and an item in triage never starts a run. A trigger starts work; it never approves a gate.

Approvals by label

A run waits for you twice: after the plan, and before the merge. You answer both with a label, in the issue or pull request sidebar or on the board. You don’t type a command.
  • Only a person counts. The label must be added by a GitHub user with write access to the repository. Labels added by a bot, an app or the Factory itself are ignored. The approval is recorded as github:@login.
  • Labels are used once. After reading factory:approved, factory:changes or merge:changes, the Factory removes it. merge-ready stays on the pull request until the merge, and is removed if new commits are pushed: approve the new head again.
  • Hold wins. merge:hold stops pickup and merge, whatever other labels are present. merge:yolo lets a person merge without merge-ready, never past a hold.
  • Moving a card doesn’t approve. The board can’t tell who moved it, so the Factory replies with a comment asking for the label instead.
  • Typing /approve with text is refused. A bare /approve comment is still accepted. Anything after it, such as /approve but add tests, is refused with a reply: put corrections in a comment and add the changes label.
  • Gate labels work in the repository the board is bound to, on GitHub boards.
The label names are the defaults; set your own under labels. From the shell, architech factory runs approve <run> --gate plan approves a plan too.

Which gates apply

  • Plan approval is required before any build at calibrating and standard autonomy.
  • Review is done by the reviewer role, not the developer who built the change. It can send work back to build up to two times.
  • Merge approval is required at calibrating autonomy (the default), and at any autonomy when a change touches a protected path (repos[].zones.protected).
  • The merge itself always waits for a person’s approve or loosen label on the pull request, at every autonomy level and with every merge preset.
  • Autonomy (calibrating, standard or autonomous) is set in policy.autonomy.
Never skip a gate to unblock a run.

Validate before pushing

Validation runs offline and refuses keys the language doesn’t have, with the key to use instead (refused keys). The dry run asks Cloud what would change. If push lists fields as accepted, not applied, Cloud stores them but doesn’t use them. Next: the Triggers and routines, operate the Factory, or the full factory.yaml reference.