Skip to content

Review

This page settles how a change gets checked before it can land: a charter reviewer holds it to the team's written standards, an adversary is required to disagree, and the two verdicts are arbitrated by an argument, not by whichever role spoke first.

Charter review

The charter reviewer checks a change against the team's own written standards — the style and correctness rules in its code-style.md or equivalent pack. It is not reviewing taste; it is reviewing against a document a human wrote and can point to. A charter nobody wrote is a review that can only comment on taste, which is why the charter itself is part of what a team customizes. See Team cartridge.

The adversary must disagree

The adversary reviews the same change without deferring to the charter reviewer's verdict, and its job is specifically to find what the charter reviewer missed. An adversary that rubber-stamps whatever the charter review already said is not doing the job the seat exists for — the two reviews are only useful apart if they were actually produced independently.

Arbitration sides with an argument, not a role

When the charter reviewer and the adversary disagree, the arbiter reads both verdicts and sides with whichever one has the stronger argument, not with whichever role usually wins. Neither reviewer's seat carries authority by default; the reasoning does.

How much review a change gets

Scrutiny follows what a mistake would cost, not the size of the diff. The team's review_tier policy puts each change in a tier:

  • Tier 0, trivial and self-evident: the charter reviewer alone.
  • Tier 1, small and contained: the charter reviewer and the adversary.
  • Tier 2, on a dangerous surface (a schema, a migration, auth and so on) or simply big: both reviewers, and the arbiter runs whether or not they disagree.

No tier skips review. See Policy for the keys.

The checks run before review

Review reads the checks' results, not the builder's account of them. The harness runs the team's checks and the repository's .agent-checks in the worktree first; see Landing.

validate_chunk and validate_phase are blind by design

validate_chunk checks one task's result against the checks the project actually runs, and validate_phase checks a phase's tickets together the same way — both run without seeing the charter or adversary verdicts first. This is blind on purpose: a validator that already knows the reviewers approved a change validates differently than one that hasn't been told, and the point of validation is that it runs the checks itself rather than trusting what review already said. Success reported by review is not evidence — a validator that trusted a status field would confidently report a run that wrote nothing.

What follows review

A verdict that survives arbitration and validation is what reaches Landing. A verdict that doesn't goes back to build, in the same worktree, for the same task.