The three that touch code form a loop. The issue worker opens a PR labelled
agent:authored; PR review reviews it; if the review has findings, the review responder acts on them; a human merges. Alert triage feeds the same loop at its front: it files an issue labelled agent:triage, and a human who agrees adds agent:ready to hand it to the issue worker.
What it will never do
- Merge. There is no merge action in the GitHub integration, and no workflow in the pack calls one.
- Approve. PR review’s verdict is
COMMENTorREQUEST_CHANGES. The event is computed in one node from the reviewer’s answer by an expression with exactly those two outcomes, so a reviewer that returnsAPPROVE(confused, or steered by text in the PR) still posts aCOMMENT. The reviewer is also given no tool that can post a review. - Push to your default branch, to a protected branch, to a fork, or with
--force. Pushes go through agit_publishnode, which checks the branch against GitHub’s own answers before anything leaves your machine and refuses a push that is not a plain fast-forward. The issue worker may only pushautopilot/*branches; the review responder only the head branch of the PR it is answering, and only if the PR is in the same repository. - Add
agent:ready. Alert triage files issues asagent:triage. A human promotes them. - Act for a stranger. Who may start a run is a filter on the event (below), and the text of issues, PRs and comments reaches an agent only as quoted data from the people you trust.
- Hold a credential in a shell. Every agent shell and every
runnode in the pack is declaredcredentials: none. The push credential exists for the one push, insidegit_publish, and never reaches a shell, a file or the environment.
Turning it on
Open Workflows → Library, open the workflow, and choose Enable. One dialog turns on every trigger the workflow declares; it asks once for the project, the machine, the GitHub account to listen through and the workflow’s inputs (the settings below). An agent can write or edit these workflows but cannot enable them: only you can. Enable each workflow you want. They are independent, and none requires the others, though the loop above only closes when all three code workflows are on for the same repositories. PR review needs no machine, so choose No machine for it. The other three work in a checkout, so pick the machine that holds your repositories as sibling folders of one project (forge, control-plane, reliant, say), or one project per repository.
Alert triage also shows a webhook URL and token, once, when you enable it. See Wiring Alertmanager.
Settings
These are the workflows’ inputs, so they appear in the Enable dialog with their defaults. Each activation has its own values, which is how two projects can run the same workflow on different repositories.Shared by PR review, issue worker and review responder
trusted_ids holds ids, not logins: a login can be renamed and then registered by someone else. Find an id with gh api users/<login> --jq .id. You are always trusted through the GitHub connection you enabled the workflow with.
PR review
PR review covers every non-draft PR in
repos when it is opened or marked ready for review. Add skip-review to opt one out. A review can be asked for again by adding the re-review label or by commenting /autopilot re-review as you or a trusted person.
Issue worker
Review responder
Sharesmodel, the labels, lease_minutes, max_turns and gate_command with the issue worker, and adds:
Alert triage
Example
service_repos:
Who may start work
Trust is plain CEL over three things the event already carries, so there is no table to maintain and no settings page:trigger.sender.id is the numeric id of whoever GitHub says acted, verified by the webhook’s signature. trigger.activation.owner.github_id is you, by the connection you enabled the workflow with. A sender with no id, or an unverified one, never passes. The review responder and issue worker also drop any comment from the agent’s own thread, so an agent cannot talk itself into more work.
You can check what a filter does before enabling anything:
Labels
Each workflow creates the labels it needs on first use, with a colour and a description. Creating a label that already exists changes nothing, so your own colours survive. You can rename any of them in the settings above.Leases
Two runs must not work one issue or PR at once, for example a second label added a minute after the first. A run takes a lease first: a comment by the connection’s own account with a small machine-readable header (the run, an expiry, a state), mirrored byagent:working.
- If another run holds a live lease, the new run exits having written nothing.
- A lease that has expired (its run died) is marked superseded, and the new lease names the run it took over from.
- After posting, a run waits a few seconds and reads again; if another lease was posted earlier (earliest time, then lowest comment id), it steps aside.
- At the end the lease is released, and then the run looks for what arrived while it was held. The review responder runs another round for new feedback, up to
max_review_rounds.
Wiring Alertmanager
Enabling alert triage shows a webhook URL and a token, once. Add a receiver to Alertmanager:repeat_interval, so the trigger names the event itself (dedupe_key): the group, its status and its alerts’ fingerprints. A re-sent firing group within four hours is one event, and its resolved notification is another. Across those windows, each alert’s fingerprint is shown in its issue as plain text and searched for among the repository’s open issues: a match gets a comment (“Still firing” or “Resolved”) instead of a second issue. A failed search files nothing, since a missed alert is cheaper than a duplicate.
Logs and traces are not reachable from the investigator unless you give it a tool for them; its write-up says so rather than guessing.
What it costs
Nothing here has a budget of its own yet, so this is where your spend comes from:- PR review runs one reviewer per PR, up to 40 turns, on the
powerfultag with high thinking. It runs for every non-draft PR inrepos, including the ones agents open, so in a busy repository it is the largest line. Useskip-reviewon PRs that do not need it, and consider starting with one quiet repository. - Issue worker runs an agent for up to 120 turns per issue, plus a retry of up to 60 if the fast checks fail. It runs only for issues someone trusted opted in.
- Review responder runs up to 80 turns per round, three rounds at most per PR, plus a retry.
- Alert triage runs one investigation of up to 45 turns per new alert, at most five per notification, nothing for a repeat.
max_turns, max_investigations and max_review_rounds to lower the ceiling.
Using a different GitHub identity
By default the workflows write as the account of the GitHub connection you enabled them with, so their comments and PRs appear under your name, and GitHub will not let that account request changes on a PR it opened (PR review posts the same review as a comment, saying so). The built-in workflows leaveacting_identity at its default for now. Once your deployment supports acting as the GitHub App’s bot, set the activation’s identity to the App to keep the agents’ words apart from yours, and to let you approve their PRs.
Related topics
- Automations, for how workflows are enabled, and Webhooks
- GitHub integration, for the actions and events the pack uses
- Custom workflows, for
compute,git_publishandcredentials: none - Built-in workflows