This document is the operational reference for how each pull request reviewer in this fleet behaves: which repositories it covers, how it is triggered, what its output looks like, and which committed file shapes it. It answers what a reviewer will actually do here, separately from pr-reviewer-evaluation.md, which measures whether a candidate is worth keeping and changes as that measurement changes.
The split is deliberate. A reader mid-review needs the behavior and needs it to be stable. The evaluation is a living argument and moves for reasons that have nothing to do with the behavior.
Much of what follows is external product state that the fleet observes rather than sets, so it goes stale without warning. An observation disagreeing with this file is not always that, though: a skipped review also comes from a rate limit, or from a repository's own committed configuration, both described below. Rule those out first, and where neither explains it, the product moved and this file is what gets corrected.
As of October 2026 both candidates run on their open-source tiers alone. Neither CodeRabbit nor Qodo reviews a private repository, so a private repository has Copilot as its only pull request reviewer, and Copilot's own review budget, a self-configured premium request cap, runs out under concurrent pull requests. CodeRabbit's open-source tier auto-reviews only a repository with at least ten stars, so on ProjectTemplate, which holds fewer, it reviews only on an explicit trigger. Qodo's open-source program auto-reviews only a public repository past a 200-star threshold, so in this fleet it auto-reviews PlexCleaner alone. The Claude GitHub App is installed on the account and is not configured as a reviewer, since the local-strict-review Skill already runs a review pass before every push toward a pull request.
The consequence a review loop actually needs: a private repository has Copilot alone, and no trigger produces a candidate review there, while a public repository below CodeRabbit's star gate still has a CodeRabbit review for the asking, and a repository below Qodo's star gate gets no automatic Qodo review, so its absence there is not waited on. .agents/skills/pr-review-conduct/SKILL.md "Which Reviewers a Repository Actually Has" states the rule an agent applies, in a form that needs none of the facts above, since it is carried into repositories that hold no copy of this file.
The repository already has first-class status, wait, comment, reply, resolution, coverage, and output-shape handling in scripts/pr_review.py.
A review is requested by that script rather than by hand. wait requests one on the current head where nothing it reads already settles the round and nothing is outstanding, so an accepted request that is never picked up is a state it cannot clear for itself. Clearing the request set is what leaves the next wait nothing to defer to. A wait ending REQUEST_NOT_RECORDED, exit 48, is a different state and takes none of this recovery: the request returned success and left neither a pending reviewer nor a review-request event, which is how an exhausted Copilot allowance has shown itself, so clearing and requesting again does not clear it and it goes to the maintainer. Nothing in the commands below is the script, so none of its scope refusals reaches them, and the owner in the target is checked by whoever runs them:
PR_NODE=$(gh pr view "<N>" --repo "<owner>/<repo>" --json id --jq '.id')
[ -n "$PR_NODE" ] || { echo "no pull request id was read, so nothing is written" >&2; exit 1; }
humans=$(gh pr view "<N>" --repo "<owner>/<repo>" --json reviewRequests --jq '.reviewRequests | length')
[ -n "$humans" ] || { echo "the pending set was not read, so nothing is written" >&2; exit 1; }
[ "$humans" = 0 ] || { echo "a human or team reviewer is requested, so this stall is the maintainer's" >&2; exit 1; }
gh api graphql -f query='
mutation($pr: ID!) {
requestReviews(input: { pullRequestId: $pr, botIds: [], union: false }) { pullRequest { id } }
}' -F pr="$PR_NODE"union: false replaces the whole request set rather than adding to it, and nothing here restores a request it drops, which is what the count guards. The count is a snapshot rather than a lock, since GitHub offers this mutation no precondition to hold the set still, so a request arriving between the read and the write is replaced out of it. What the guard bounds is therefore the ordinary case rather than that race, and the race is left standing because the alternative is the maintainer's manual click on every stall, which is what this recovery exists to retire. That read omits a Bot reviewer, so it answers whether a human or a team is requested and never whether the reviewer bot is, which the digest's own requested field answers instead. The next wait then requests afresh, or polls and says so on its own auto-request line where no review in the repository carries the reviewer's node id for it to request with. A stall still pending after that wait is the maintainer's too, rather than a second clear. Measured on a live pull request in another repository in this fleet on 2026-09-21 and reported on issue #1741, where a request sat unpicked for roughly eight minutes across two plain re-requests, and a clear followed by a request drew a round within a minute, twice. The pull request UI offers the same recovery by removing and re-adding the reviewer, and no agent seat can reach it.
The review body provides an actionable summary and links each finding to an inline thread. This makes manual triage straightforward.
Automatic review skips a pull request whose base is not the repository default unless .coderabbit.yaml lists the base under reviews.auto_review.base_branches, which the hub's file does for develop. The default branch is always included, and each entry is a regex. On the open-source tier, automatic review also needs the repository to hold at least ten stars, which ProjectTemplate does not, so a review here is triggered by commenting @coderabbitai review, and until then CodeRabbit's summary comment says so in place of a review while its status check reports success.
Its collapsed analysis is verbose and can dominate API output, and its status context reports success while actionable comments remain, so finding state is read from review threads rather than from that check.
On the open-source tier it is also rate limited. A rate-limited pull request receives a notice naming when a review can next run, in place of the review, and it has the same shape as the star-gate skip notice while behaving oppositely: re-triggering returns the notice again rather than a review.
Incremental follow-up needed an explicit command on pull request #892. Completion is reported by updating the command reply rather than by creating a new formal review.
It posts as qodo-free-for-open-source-projects, its open-source app's identity and the login scripts/pr_review.py tracks.
The findings are individually anchored and usually concise after HTML presentation is removed.
After a corrective push it updates the existing review comment and its resolved state rather than creating another review, so a reader comparing review creation events alone sees no second round.
The formal review body was empty. All useful state lived in inline comments, so a body-only reader would report no findings.
.github/skills/ and .claude-plugin/fleet-skills/ are the trees scripts/build_dist.py generates from .agents/skills/, and CI holds them current, so a finding in either belongs at its source and a review of every copy is one finding three times. Two committed files tell CodeRabbit and Qodo to skip them, and Copilot's exclusion is a repository setting this account does not have, so .github/copilot-instructions.md asks instead.
- CodeRabbit reads
reviews.path_filtersfrom.coderabbit.yamlat the repository root, where a pattern prefixed with!excludes. - Qodo reads its configuration from
.pr_agent.tomlat the root of the default branch, so the file binds only once it is promoted tomain, and its[ignore]glob list names the paths to skip. - GitHub Copilot honors content exclusion, a repository setting under Copilot rather than a file in the tree, whose paths are
fnmatchpatterns, anchored to the repository root by a leading slash and matched anywhere without one. Availability and enforcement vary by plan and by surface, so confirm the setting on this repository rather than assuming it, and note that it was unavailable here when last checked. In its place,.github/copilot-instructions.md"Reviewing Carried Fleet Content" asks Copilot to post no comment on either tree, and GitHub's code review customization tutorial documents instruction compliance as non-deterministic, so an instruction may be overlooked where a setting cannot.
Each reviewer's behavior is shaped by a committed file rather than accepted as given, and each setting below carries the finding or the cost that earned it.
- CodeRabbit, in
.coderabbit.yaml, whose settings reference names each option: auto review on pull requests intodevelop, which the open-source tier honors only at ten stars or more, no pause after five reviewed commits, since a fleet pull request routinely passes five pushes and the pause reads as a reviewer that stopped. A path instruction for Markdown asks for false, stale, unverifiable, or unfollowable claims only, since CI lints style and the local review pass reads canonical prose whole. Sequence diagrams, suggested labels and reviewers, and the in-progress fortune are off. The markdownlint, actionlint, shellcheck, and ruff tools are off, since CI runs the same four and fails the pull request on them. - Qodo, in
.pr_agent.toml, whose configuration reference names each option: an issues guideline asks for a reproduction with any claimed crash, after a claimedIsADirectoryErroron this repository's build was disproven by running it. A compliance guideline asks for the rule's own sentence and routes a rule against unchanged text to the summary. Informational findings go to the summary rather than a thread, since a thread blocks the merge until resolved. Images are off so a finding's title is plain text a matcher can see. Qodo's review standards import fromAGENTS.md,CLAUDE.md,copilot-instructions.md, andSKILL.mdfiles, each scoped to its folder at any depth, when changes merge, and only new rules are added, so an edited or deleted rule is changed in its portal instead. This repository sits below Qodo's star gate and gets no automatic Qodo review. - GitHub Copilot: the carried
.github/copilot-instructions.md, which bootstraps thefleet-code-reviewSkill, is the lever this repository uses. GitHub also documents path-scoped.github/instructions/*.instructions.mdfiles, unused here.
The paid trials are over, and both candidates run on their no-cost open-source tiers. Qodo's paid app is uninstalled rather than suspended, so its qodo-code-review identity posts nothing, its billing notice included. Candidate use is therefore limited to public repositories unless the maintainer approves a later plan change.
CodeRabbit's current plan documentation provides an open-source tier for public repositories with rate limits. Product plans are external state, so confirm the terms again before relying on them.
Private repositories remain Copilot-only unless a candidate's approved plan, data terms, and GitHub App permissions receive a separate review.