Skip to main content

Labels and routing

Labels in Agent Peer Review carry exactly two independent pieces of information, and nothing else. Routing, in contrast, is never a label: it uses GitHub's own requested-reviewer mechanism.

PurposeLabel(s)ColorSet by
Trigger (required)ai-review0e8a16requester, via review.create
Skill (zero or more, optional)bare names: security, architecture, performance, testing, api, react-native, did, oid4vc, cryptography, documentation, second-opinion5319e7requester, via review.create

There are no review, reviewer:*, skill:*, or status labels of any kind. A basic request is ai-review plus a requested reviewer; add bare skill labels only when you want a specific specialty applied. second-opinion is the one exception: review.claim attaches it automatically to an enricher's task during a multi-reviewer panel, so you do not request it yourself.

Languages are not labels

A programming language such as rust or python is never a skill label. review.claim detects languages automatically from the pull request's changed files and loads the matching checklist on its own; there is nothing to request and nothing to bootstrap. See Languages for the full list and how detection works.

Why routing is not a label

Early designs for workflows like this often add a reviewer:alice style label to say who should look at something. Agent Peer Review does not, because GitHub already has a mechanism for exactly that: the Reviewers field on a pull request. review.create calls the native requestReviewers API with the logins you pass to --reviewers, and review.list finds work with a plain GitHub search:

is:pr is:open label:ai-review review-requested:<login>

An agent only ever processes pull requests that carry ai-review and were requested from its own login. This keeps the label surface tiny and lets you see exactly who a PR is waiting on from GitHub's normal UI, with no custom dashboard required.

Bootstrapping the label profile

labels.bootstrap (CLI: agent-review labels bootstrap, MCP: labels_bootstrap) idempotently creates or updates the ai-review trigger label plus one label per name in SKILL_NAMES. Run it once per repository, and again any time a new skill is added, since it is safe to repeat: existing labels with the right color and description are left alone and reported as unchanged, mismatched ones are updated, and missing ones are created.

Unrecognized labels are ignored, not errored

Skill matching is a simple membership check against the built-in SKILL_NAMES list, both when reading labels off a pull request and when composing labels for a new request:

  • If a pull request carries labels beyond ai-review and its skills, such as GitHub's own default documentation label used loosely, or bug, or wontfix, the agent simply does not look at them. Only names in SKILL_NAMES are read as skills.
  • If you request a review with --skills sekurity (a typo), that name is silently dropped from the labels that get added; it is not an error, and no sekurity label is created. Run agent-review skills list first if you are not sure of the exact spelling.

This is a deliberate trade-off: it means older agent versions keep working unmodified when a repository grows new labels for unrelated purposes, at the cost of failing silently on a typo instead of loudly.

Panel review: concurrent, not first-claim-wins

Requesting more than one reviewer, for example --reviewers alice,bob, now runs a concurrent panel. Each reviewer claims independently; the earliest claimant is the anchor and posts the primary review; every other claimant is an enricher that adds one consolidated second opinion once the primary lands. See Panel review (multiple reviewers) for the full flow.