cratis-engineering-review-rounds · git:20261025.cbed6a6 · 2026-10-25 · sha256 f9f24d55a508f787

cratis-engineering-review-rounds git:20261025.cbed6a6A

Immutable. This exact content never changes and is served at /api/v1/blob/f9f24d55a508f787.

---
name: cratis-engineering-review-rounds
description: Plan proportionate review rounds, distinguish blocking from advisory findings, and carry prior evidence into a delta round with a firm stopping point. Use when choosing a review round, handling blocking or advisory feedback, requesting a delta since the last reviewed SHA, or stopping recurring blockers. Not for review criteria (use cratis-code-review), grouping a release candidate (use cratis-engineering-release-trains), waiting on checks (use cratis-engineering-ci-gates), or a repeated regression class (use cratis-engineering-regression-cluster).
license: LICENSE
compatibility: Requires git and the GitHub CLI (gh).
---

<!-- Copyright (c) Cratis. All rights reserved. -->
<!-- Licensed under the MIT license. See LICENSE file in the project root for full license information. -->

# Review the change, then its corrections

Read [review-reports.md](../../rules/review-reports.md) before choosing reviewers
or reporting findings. Its report shape, verdicts, scope limits, and reviewer
independence apply to every round. This skill schedules reviews; it does not
replace the criteria in `cratis-code-review` or specialist review skills.

**Blocking** means a must-fix finding in **Blockers**, yielding **Changes
requested**. **Advisory** means a non-blocking finding in **Suggestions**. An
advisory preference is not a merge gate. Missing required evidence yields
**Incomplete**, not approval; retain that gap until it is resolved.

## Budget the review

- Run one quick round per delivery. A second is warranted only after a blocker,
  not to seek reassurance or eliminate suggestions.
- Run one whole-change review per PR on the assembled change. Quick delivery
  rounds do not replace it. Start whole-change inspection in parallel with the
  gate when possible, but keep it provisional: required gates must pass before
  an approval report is finalized. Do not launch duplicate gates for review.
- Use ordinary depth by default. Deep review needs one named risk class:
  **security**, **algorithmic**, **concurrency**, or **cross-cutting**, plus a
  one-line justification tied to the changed behavior. Data-loss exposure or
  irreversible migrations may justify cross-cutting review; merely wanting
  extra confidence does not.
- Prove migrations and deployment-sensitive behavior by running the migration
  on representative local data and exercising the relevant old/new behavior.
  Deeper inspection is not execution evidence. Follow repository test policy.

## First whole-change round

1. Fix the target scope and committed base and head SHAs. Name changed surfaces,
   expected behavior, required checks, and any specific risk before starting.
   Use `git rev-parse <base>` and `git rev-parse HEAD` to resolve full SHAs.
2. Apply reviewer independence from `review-reports.md`: use a different
   provider family where selectable. Where it is not selectable, declare
   `single-provider` in the report header and on the Not examined line. A
   provider/tool error makes the review Incomplete; fall back once as that
   rule directs, rather than manufacturing a verdict.
3. Review the whole diff using the applicable criteria and real gate results.
   Record round 1 with its base/head and retain the complete report unchanged.
   Keep local review records under `.ai-work/`; public reviewer notes follow
   [pull-requests.md](../../rules/pull-requests.md), never the release note.
4. Fix confirmed Blockers together. Dismiss a candidate only with evidence and
   a reason, not by silently deleting it. Correct required evidence gaps before
   seeking approval. Cheap advisory fixes may join this correction pass.

## Delta rounds

A delta round follows a whole-change review and reviews from the last reviewed
SHA, not from an arbitrary base. Carry the prior Blockers, unresolved evidence
gaps, Suggestions, and Dismissed findings with their reasons. Supply the round
number, prior report, original base, last reviewed SHA, and new head explicitly.

For example, after correcting a blocker from round 1:

```text
Round: 2 (delta)
Original base: <full base SHA>
Since: <full head SHA reviewed in round 1>
Head: <full corrected head SHA>
Prior: <complete round 1 report, including dismissals and scope limits>
Scope: inspect the correction diff and verify disposition of prior findings
```

Inspect the correction diff with `git diff <last-reviewed-sha>..<new-head-sha>`.
Recheck earlier blockers against the correction and its specifications. Preserve
unresolved findings and limits; a narrow delta cannot certify surfaces that
were never examined. Reuse earlier approval only for the exact committed SHAs
and examined scope, never for a dirty tree or a changed head.

Do not start a follow-up round for advisory findings alone. Fix them only when
cheap in an existing correction pass; otherwise leave them as Suggestions.
Never file an issue merely to dispose of advisory feedback. A distinct defect
needs its own evidence and the authority rules, not automatic issue creation.

## Stop instead of looping

Cap review at **3 rounds per work item**, normally fewer. Keep delivery and
whole-change round counts explicit; renaming the target does not reset a work
item's cap. If blockers recur, stop the fix/review loop. Make one structural
change addressing the failure class or ask the user about the approach. Use
`cratis-engineering-regression-cluster` when repeated instances share a surface.
A structural change does not authorize an automatic fourth round or waive any
required review; report the remaining blocker or required decision.

## Contract

A caller that schedules a round supplies these inputs. Resolve every SHA with
`git rev-parse`; never expand a short prefix by hand.

| Input | Meaning | Required |
| --- | --- | --- |
| `target` | The pull request, branch or work item under review | Always |
| `round` | Round number within the work item's cap of 3 | Always |
| `baseSha` | Full SHA of the original base | Always |
| `headSha` | Full SHA of the head being reviewed | Always |
| `since` | Full SHA of the head last reviewed | Delta rounds |
| `prior` | The complete previous report, with dismissals and limits | Delta rounds |
| `cachedReview` | An earlier review to reuse | Only for the exact same SHAs and scope |
| `mode` | `whole-change` or `delta`; quick, ordinary or deep depth | Always |
| `deepReason` | One named risk class and a one-line justification | Required when the depth is deep |

The result is one verdict from the canonical vocabulary in `review-reports.md`:
**Approved**, **Approved with suggestions**, **Changes requested** or
**Incomplete**. A provider or tool error yields **Incomplete**, never an
approval and never an invented verdict.

## What breaks

- **A whole-change restart after every correction:** repeats work while losing
  the earlier blocker list and dismissals. Use a delta with the prior report.
- **Advisory becomes blocking:** a preference causes needless edits, extra
  rounds, or unwanted issues. Preserve the shared report vocabulary.
- **Deep by habit:** extra review displaces running the behavior without a
  named risk. State the risk or use ordinary depth.
- **Green by absence:** a reviewer failure or missing required proof is
  Incomplete, not a successful review with no findings.

## How it is proven

Run the repository's required gates and behavioral specifications for the
correction; successful exits are required evidence, not review substitutes.
Use the delta command above to confirm scope and verify that each earlier
finding has a disposition with evidence. The report includes Blockers,
Suggestions, Dismissed (with reason), Verdict, and Not examined, per the shared
rule. No Blockers and complete required evidence permit approval; suggestions
alone permit Approved with suggestions.

For PR descriptions and release notes, run the deterministic
`cratis-check-pr.mjs` command from `pull-requests.md` and require a zero exit.
Do not spend a review round on checks that script owns.