Repository navigation
Description
This track moves the PR bots (Copilot, CodeRabbit and Qodo) from automatic to policy-driven review, to cut reviewer cost per useful finding. The maintainer revised the plan on 2026-11-04:
- Account level: automatic review is off for all three bots.
- Per repository:
.github/agent-policy.jsonsays which bots review, on which bases, when, and how often.scripts/pr_review.pyobeys it, andrepo-config/configure.shapplies the bot-side settings. - Skills and rule text: they stay agnostic to whether reviews are automatic.
- Measurement:
scripts/backlog_metrics.pymeasures the effect.
Each repository's policy file is rendered from registry/repos.json. scripts/agent_policy.py write writes the files into a checkout. configure.sh apply writes the live settings and rulesets. check diffs against the render, reading the files from the default branch. The central settings repositories are written by scripts/central_config.py.
Four repositories review by explicit request with the same values (#3924): the hub, PlexCleaner, Financial-Modeling and HomeAutomation-Config. The hub's override names Qodo too, the other three leave Qodo on the fleet default:
| Bot | Trigger | Bases | When | Rounds |
|---|---|---|---|---|
| Copilot | explicit, gates | default branch | after-checks | per push, capped at 3 |
| CodeRabbit | explicit | main, develop | after-checks | once |
| Qodo | auto on the three, explicit on the hub | main, develop | on-open | per push |
Next steps
- Values check-in 1, on or after 2026-11-13. Review each bot's values against the weekly
scripts/backlog_metrics.pyoutput and the 28-day baseline, which is on the maintainer's machine, so ask for it. Fold in the test reports on this issue (the round-18 and round-19 comments). Qodo answered on its own on PlexCleaner#1220, the first repository where it does, so weigh its findings there. Put each change to the maintainer as a question with a recommendation. A change is a registry override PR, then each repository writes its files, thenconfigure.sh applywith the maintainer's go-ahead. - Collect the one report still owed: the Copilot 3-round cap, which needs a
main-base PR with more than one push. Read it from the repositories' own PRs. Also read the outcome of PlexCleaner#1220's CodeRabbit and Qodo rounds once it closes. - Promote Financial-Modeling and PlexCleaner to
main. The maintainer chose on 2026-11-08 to leave this to the peer sessions working those repositories, after their open PRs land. A next round checks whether it happened rather than doing it. Done for each whenconfigure.sh checkexits 0. Before any promotion, list its unverified commits (0 on both at round 19), and rewrite an unsigned one rather than bypassing. EspDinIoT is held ondevelopas a work in progress. - Values check-in 2, on or after 2026-11-20, or one week after step 6 turns the toggle off, whichever is later.
- Add the central config files with
central_config.py writein a clone of each settings repository oncecentral_config.py preconditionexits 0, then a PR there, each on the maintainer's go-ahead. - Turn the account toggles off and verify (maintainer, after step 5). Copilot's personal "Automatic Copilot code review" toggle is still on, and
waitnotes it on every PR. Then move other repositories by their registry entry, each with its two check-ins. - Close Stop pr_review.py Requesting Copilot on Feature Pull Requests into Develop #3758 with the pilot's verification. Comment on Decide: How the Coordinated Cutover to Explicit Bot-Review Requests Is Triggered, Scheduled, and Gated #3826 that the per-repo design superseded its single window. Close this track with
close.
External blockers
- The peer sessions in Financial-Modeling and PlexCleaner own step 3. The maintainer's word still gates each promotion.
- The maintainer's word for each settings-repository write.
- Copilot's personal auto-review toggle is UI-only and still on.
- The metrics baseline is on the maintainer's machine.
- CodeRabbit's plan rate limit binds explicit rounds on every repository, private ones included.
Internal dependencies
- Step 3 before step 5.
central_config.pywithholds the config file until every live registry repository carries its own file on its default branch. - Check-in 1 before other repositories move to explicit. Its answers decide which values they inherit.
State
- Hub:
mainat24535332, release2.0.1366.developat0ed3fe89holds nothingmainlacks from this track. No hub PR is open. - HomeAutomation-Config is on
mainwith its policy file. Financial-Modeling (9 ahead) and PlexCleaner (31 ahead) still have no policy file onmain. Financial-Modeling's only openmainPR is a Dependabot bump (repo-worktree's hook step installs into the git hooks dir every worktree shares #1816). - Open peer PRs at round 19: PlexCleaner#1220 and Financial-Modeling#1884, both into
develop. - Settings repositories: both config files are still withheld, since the step-3 precondition is unmet.
- This machine: the round-18 hub clone is deleted. This round's clone, a detached
maincheckout namedProjectTemplate-hub-<epoch>under the fleet worktree directory, is left for the maintainer to delete, or for the next session to remove. Claude Code loads the primary checkout, still ondevelop. - Peer sessions on this host are working PlexCleaner, Financial-Modeling and HomeAutomation-Config. Leave their repositories to them.
Parked decision queue
0 open decision issues (count: 0).
What the last round did
- Read the step-2 evidence from PlexCleaner#1220 and HomeAutomation-Config#1787 and recorded it as a comment on this issue. PlexCleaner's report is no longer owed. A rate-limited CodeRabbit released the merge live after Read CodeRabbit's Rate-Limit Reply With Markup Around Its Sentence #3930, 8 minutes against about an hour before. Qodo answered on its own for the first time, on PlexCleaner.
- Read step-3 readiness: no policy files on either
main, 0 unverified commits on eitherdevelop. - The maintainer chose to leave step 3 to the peer sessions. Deleted the round-18 hub clone after checking it was clean.
What not to repeat
- Don't promote Financial-Modeling or PlexCleaner from this track while their peer sessions are live. The maintainer chose to wait for them.
- Don't read a
waitexit 0 with threads open as a contract breach. In the usage text, "with no thread open" applies only to the attested held-head branch. Worth rewording the next time that usage text changes. - Don't expect an explicit Copilot round on a
developPR. Copilot'sbasesis@default. - Don't add a docstring line to
scripts/pr_review.pycasually. It sits at the 2200-line size ceiling. - Don't set CodeRabbit
offfor a private repository. It reviews them, and the maintainer wants it kept, explicit and once. - Don't trust
docs/pr-reviewer-reference.mdon which bots review private repositories until Reviewer Reference Says CodeRabbit Skips Private Repositories, but It Reviews Them #3925 lands. - Don't run
central_config.pyoragent_policy.pywith barepython3, oruv runwithout--no-projectin a hub worktree. Useuv run --no-project --script.
New learnings
- Recorded on this issue: the round-19 evidence comment.
- A pre-existing edge case, not filed: a check run with no
startedAtgets an emptysince, so a rate-limit comment of any age clears it. Nothing in the fleet posts such a check today.
Activity
ptr727 commentedon Nov 5, 2026
Round 1, closed 2026-11-04: Session Handoff [review-cutover]: Coordinated Cutover to Explicit Bot Reviews, Preparation PR Next
This track carries the coordinated cutover from automatic to explicit bot reviews for Copilot, CodeRabbit and Qodo. The work is #3758, held until the cutover, with the plan decided on #3826 (Option 1). The maintainer chose it as the next work and is pausing other agents for it.
Next steps
develop. Done when it merges with the switch defaulting to "automatic review on", so no agent's behavior changes. It holds four parts.scripts/reviewers/*.jsonorspec/. Pick one place, so every reader agrees.scripts/pr_review.py, beside Copilot'srequest_copilot_reviewand thewait --requestflag. Today Copilot is the only reviewer the script can request.mergegate that refuses a head with no explicit request for each configured reviewer, active only while the switch says automatic review is off. Tests cover both switch states.drive-pr,pr-review-conductandGOVERNANCE.md"PR Review Etiquette" naming both states, keyed on the switch. Regenerate the generated trees perskill-lifecycle.drive-prto a mergeable develop -> main promotion PR. The merge and the release each need the maintainer's go-ahead permerge-and-release.reviews.auto_review.enabled: falsein each repository carrying a.coderabbit.yaml;Confirm each repository from the live tree, not from memory.
developshows no botreview_requestedevent thatpr_review.pydid not send.close.External blockers
Internal dependencies
scripts/pr_review.pyfrom the hub when they use it. They need the switch and the explicit request paths already onmainwhen the switch flips, or a drive stalls with no review requested.main, notdevelop.State
mainat the time of writing:request_copilot_reviewandrun_waitinscripts/pr_review.py, andcopilot.json,coderabbit.jsonandqodo.jsonunderscripts/reviewers/..coderabbit.yamlhasreviews.auto_review.enabled: truewithbase_branches: ["^develop$"]..pr_agent.tomlsets no automatic-review trigger, so Qodo's automatic review is presumably an app-side setting. Step 3 confirms where it lives..coderabbit.yamlnor.pr_agent.tomlis inspec/files.json, so each repository holds its own. The runbook has to enumerate the repositories.mainruleset carries acopilot_code_reviewrule, and thedevelopruleset does not, per Stop pr_review.py Requesting Copilot on Feature Pull Requests into Develop #3758.defaulttrack Session Handoff [default]: Two Burndown Rounds Released as 2.0.1313 and 2.0.1319, Round 3 Next #2361 still says to close Stop pr_review.py Requesting Copilot on Feature Pull Requests into Develop #3758 once the Copilot setting changes. That line predates the Decide: How the Coordinated Cutover to Explicit Bot-Review Requests Is Triggered, Scheduled, and Gated #3826 answer and is now superseded by this track.Parked decision queue
No open
decisionissues at the time of writing (count: 0).What the last round did
What not to repeat
run_wait. The 2026-11-01 burndown worker onfeature/burn-3758showedrun_waitalready requests nothing on a PR into a non-default branch. The Copilot request lands from GitHub one to two seconds after the PR is created, before any script runs (Stop pr_review.py Requesting Copilot on Feature Pull Requests into Develop #3758 comments).New learnings
None beyond what #3758 and #3826 already record.
[-]Session Handoff [review-cutover]: Coordinated Cutover to Explicit Bot Reviews, Preparation PR Next[/-][+]Session Handoff [review-cutover]: #3881 Open With Its First Round Answered, Metrics Branch Waiting On It[/+]ptr727 commentedon Nov 5, 2026
Round 2, closed 2026-11-05: Session Handoff [review-cutover]: #3881 Open With Its First Round Answered, Metrics Branch Waiting On It
This track carries the move of the PR bots, Copilot, CodeRabbit and Qodo, from automatic to policy-driven review, to cut reviewer cost per useful finding. The maintainer revised the plan on 2026-11-04:
.github/pr-review.jsonsays which bots review, on which bases, when, and how often.scripts/pr_review.pyobeys it, andrepo-config/configure.shapplies its bot-side settings.scripts/backlog_metrics.py.This revision supersedes round 1's single hub switch and single coordinated window (#3826 Option 1).
Next steps
explicit(never gating, by the maintainer's decision), and the trigger-agnostic text. Done when its five openintroducedfindings each have an outcome and it is merged.explicitwithgate: falseandoffwith a partial history, are the substantive ones. Refusingexplicitwithgate: falsein the reader and schema is the likely answer for the first. For the second, check the policy beforeholds()forces a round.local-strict-reviewpass, then a push, thenattest.feature/review-metricsand open its PR, after Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881 merges. Its README citesspec/pr-review.schema.jsonandspec/pr-review.default.json, which Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881 adds.introducedfindings from its third local pass:BotStats.explicit_rounds;scripts/README.mdbacklog_metrics paragraph;developprobe shows the default branch in "Policy branch" instead ofn/a.--days 28before any repository changes its policy.repo-config/configure.shapplies and checks the policy.copilot_code_reviewrule in the develop and main rulesets comes from the policy rather than frommain.json. This needs a jq edit in bothapply_rulesetandcheck_ruleset.apply --checkout <path>writes only the auto-trigger keys of.coderabbit.yamland.pr_agent.tomlinto a local checkout. The maintainer chose the local-checkout form. The caller commits through the ordinary PR flow.checkreads both files through the contents API and reports drift.repo-config/README.md, which still describes today's fixed rule.ptr727/coderabbitwithreviews.auto_review.enabled: false, and install CodeRabbit on it. Then open a test PR on a public repo above CodeRabbit's 10-star gate that carries no.coderabbit.yaml.pr-agent-settingsroute on a personal account.ptr727/coderabbitandptr727/pr-agent-settingsfrom the hub, in thebuild_dist.pypattern, with an audit check. It extends Generate the Qodo Settings Repository From the Hub So Fleet Rules Are Authored Once and Auditable #1464, and the maintainer chose hub-generated settings repos.[config] disable_auto_feedback = true, confirmed in upstreampr_agent/settings/configuration.toml.merge-and-release..github/pr-review.jsonmoves to explicit, through a PR followed byconfigure.sh apply --checkout.close.External blockers
Internal dependencies
mainbefore the pilot, since agents fetchscripts/pr_review.pyfrom the hub'smain.State
feature/pr-review-policy-> develop, is open.e08f1756, attested.pr_review.py status 3881.feature/review-metricsis local only and not pushed. It holds three commits on develop's3a813621, each recorded by a local pass, and needs a rebase.ProjectTemplate-pr-review-policyholds Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881's branch.ProjectTemplate-review-metricsholds the metrics branch.ProjectTemplate-hub-review-cutoveris a hubmaintooling clone.Parked decision queue
No open
decisionissues at the time of writing (count: 0). The maintainer answered this session's questions in-session:configure.shwrites bot files into a local checkout;What the last round did
copilot_code_reviewrule.coderabbitcentral-config repo, documented for organizations only, or the UI organization default.pr-agent-settingsrepo. None of these is Enterprise-only.What not to repeat
side_asked_on_headkeys oncommittedDatefor that reason.heldalready excludes uncovered bases. The filter skips the roundwaitmust force on a partial or truncated history.gqlout in a test without attaching the default policy.GqlCase.answernow attaches it. A test that stages payloads without it skips the path every live run takes, which is how the base-filter regression passed the suite.scripts/pr_review.pysits at its 2,200-line size ceiling. New policy logic goes intoscripts/pr_review_side.pyorscripts/pr_review_policy.py, never into the gate.New learnings
None beyond what the code, #3881's body, and "What not to repeat" above record.
[-]Session Handoff [review-cutover]: #3881 Open With Its First Round Answered, Metrics Branch Waiting On It[/-][+]Session Handoff [review-cutover]: #3881 Answered Two Local Passes, 13 Findings Open for a Fresh Push[/+]Read a Per-Repository Review Policy Before Asking Any Bot for a Review (
ptr727 commentedon Nov 5, 2026
Round 3, closed 2026-11-05: Session Handoff [review-cutover]: #3881 Answered Two Local Passes, 13 Findings Open for a Fresh Push
This track carries the move of the PR bots, Copilot, CodeRabbit and Qodo, from automatic to policy-driven review, to cut reviewer cost per useful finding. The maintainer revised the plan on 2026-11-04:
.github/pr-review.jsonsays which bots review, on which bases, when, and how often.scripts/pr_review.pyobeys it, andrepo-config/configure.shapplies its bot-side settings.scripts/backlog_metrics.py.Next steps
waitexits 41 on a head refusal whilestatusreadscoverage=local.checks_holdreads green betweenneeds:stages, so reuseruns_openthe wayheld_checks_opendoes.await_green.wait's own earlier request.maxRoundsdescription, and finding 8, the skill, Copilot-instructions, and README statementscopilot_settlednow waives. Regenerate the skill trees withscripts/build_dist.py.GATE_SOURCES, and a ceiling forpr_review_policy.py.local-strict-reviewpass, then a push, thenattest. The budget is two edit rounds per push.feature/review-metricsand open its PR, after Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881 merges. Its README citesspec/pr-review.schema.jsonandspec/pr-review.default.json, which Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881 adds.introducedfindings from its third local pass:BotStats.explicit_rounds;scripts/README.mdbacklog_metrics paragraph;developprobe shows the default branch in "Policy branch" instead ofn/a.BotPolicy.capped,never_waited_on, and the explicit-must-gate refusal Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881 added since.--days 28before any repository changes its policy.repo-config/configure.shapplies and checks the policy.copilot_code_reviewrule in the develop and main rulesets comes from the policy rather than frommain.json. This needs a jq edit in bothapply_rulesetandcheck_ruleset.apply --checkout <path>writes only the auto-trigger keys of.coderabbit.yamland.pr_agent.tomlinto a local checkout, the form the maintainer chose. The caller commits through the ordinary PR flow.checkreads both files through the contents API and reports drift.repo-config/README.md, which still describes today's fixed rule.ptr727/coderabbitwithreviews.auto_review.enabled: false, install CodeRabbit on it, and open a test PR on a public repo above CodeRabbit's 10-star gate that carries no.coderabbit.yaml.pr-agent-settingsroute on a personal account.ptr727/coderabbitandptr727/pr-agent-settingsfrom the hub, in thebuild_dist.pypattern, with an audit check. It extends Generate the Qodo Settings Repository From the Hub So Fleet Rules Are Authored Once and Auditable #1464, and the maintainer chose hub-generated settings repos. Qodo's key is[config] disable_auto_feedback = true. Creating either repo is an outward write needing the go-ahead at the time.merge-and-release..github/pr-review.jsonmoves to explicit, through a PR followed byconfigure.sh apply --checkout.close.External blockers
Internal dependencies
mainbefore the pilot, since agents fetchscripts/pr_review.pyfrom the hub'smain.State
feature/pr-review-policy-> develop, is open.9946909f, attested with a pass recording 14 findings.pr_review.py status 3881.feature/review-metricsis local only and not pushed. It needs a rebase onto develop.ProjectTemplate-pr-review-policyholds Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881's branch, clean at writing.ProjectTemplate-review-metricsholds the metrics branch.maintooling clones namedProjectTemplate-hub-*can be removed once no session uses them.Parked decision queue
No open
decisionissues at the time of writing (count: 0). This round the maintainer chose to hand the next fix round to a fresh session.What the last round did
1cd983c2), then five of the seven the next pass raised (9946909f). It addedcopilot_settled,BotPolicy.never_waited_on,BotPolicy.capped, and the sharedreviewer_check.9946909f.What not to repeat
scripts/pr_review_rounds.py. It is at 699 of its 700-line ceiling, andpr_review.pyis at 2192 of 2200. This round fit only by moving a decision ontoBotPolicyand cutting a docstring. New logic goes intoscripts/pr_review_policy.py,scripts/pr_review_side.py, or a new module, never into a raised ceiling.sedpattern after a negative-control revert.and not reviewer_requested(pr)occurs in bothheldandowed, and the restore rewrote both. Revert by line number, or bygit diffagainst the commit.1cd983c2) left Copilot's refusal, partial round, and pending request on the head still blocking, and the next pass found it. Each further consumer of "no round is coming" must readcopilot_settled. Finding 1,wait's refusal exit, is the consumer still missing.heldalready excludes uncovered bases. The filter skips the roundwaitmust force on a partial or truncated history.gqlout in a test without attaching the default policy.GqlCase.answerattaches it, and a fakegqlmust also accept thepolicykeyword.New learnings
None beyond what the code, #3881's body, and "What not to repeat" above record.
[-]Session Handoff [review-cutover]: #3881 Answered Two Local Passes, 13 Findings Open for a Fresh Push[/-][+]Session Handoff [review-cutover]: #3881 Merged, Metrics PR and #3885 Next[/+]Measure PR Review Return on Cost in the Backlog Report (#3886)
ptr727 commentedon Nov 5, 2026
Round 4, closed 2026-11-05: Session Handoff [review-cutover]: #3881 Merged, Metrics PR and #3885 Next
This track carries the move of the PR bots, Copilot, CodeRabbit and Qodo, from automatic to policy-driven review, to cut reviewer cost per useful finding. The maintainer revised the plan on 2026-11-04:
.github/pr-review.jsonsays which bots review, on which bases, when, and how often.scripts/pr_review.pyobeys it, andrepo-config/configure.shapplies its bot-side settings.scripts/backlog_metrics.py.Next steps
feature/review-metricsand open its PR. Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881 is merged into develop, so its spec files exist there now. Done when the PR is merged into develop.repo-worktree, then rebase onto develop. Onlyscripts/README.mdoverlaps Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881's files. Redraft the body from the branch's commits.introducedfindings from its third local pass:BotStats.explicit_rounds.scripts/README.mdbacklog_metrics paragraph.developprobe shows the default branch in "Policy branch" instead ofn/a.BotPolicy.capped,never_waited_on,copilot_settled, the explicit-must-gate refusal, andpr_review_payload.bot_entry. Reuse those rather than re-reading the payload.local-strict-reviewpass, then a push, thenattest. The budget is two edit rounds per push.--days 28before any repository changes its policy.pr_review*.pyand step 1 touchesbacklog_metrics.py. Coordinate onscripts/README.md.repo-config/configure.shapplies and checks the policy.copilot_code_reviewrule in the develop and main rulesets comes from the policy rather than frommain.json. This needs a jq edit in bothapply_rulesetandcheck_ruleset.apply --checkout <path>writes only the auto-trigger keys of.coderabbit.yamland.pr_agent.tomlinto a local checkout, the form the maintainer chose. The caller commits through the ordinary PR flow.checkreads both files through the contents API and reports drift.repo-config/README.md, which still describes today's fixed rule.ptr727/coderabbitwithreviews.auto_review.enabled: false, and install CodeRabbit on it. Then open a test PR on a public repo above CodeRabbit's 10-star gate that carries no.coderabbit.yaml.pr-agent-settingsroute on a personal account.ptr727/coderabbitandptr727/pr-agent-settingsfrom the hub, in thebuild_dist.pypattern, with an audit check. It extends Generate the Qodo Settings Repository From the Hub So Fleet Rules Are Authored Once and Auditable #1464, and the maintainer chose hub-generated settings repos. Qodo's key is[config] disable_auto_feedback = true. Creating either repo is an outward write needing the go-ahead at the time.merge-and-release..github/pr-review.jsonmoves to explicit, through a PR followed byconfigure.sh apply --checkout.close.External blockers
Internal dependencies
mainbefore the pilot. Agents fetchscripts/pr_review.pyfrom the hub'smain.when: after-checks. Otherwise that reviewer is silently never asked on a head Copilot already covers.State
62f8b04don 2026-11-05. Its branch and worktree were removed bypr_review.py merge --cleanup. Not yet onmain.feature/review-metricsis local only and not pushed. It is 4 ahead and 2 behindorigin/develop, in theProjectTemplate-review-metricsworktree under the fleet worktrees directory. That worktree is a previous session's, so retire it when clean and re-isolate rather than working in it.maintooling clones namedProjectTemplate-hub-*can be removed once no session uses them, this round'sProjectTemplate-hub-handoff-rc-1104included.cleanupfast-forwarding itsdevelop.Parked decision queue
No open
decisionissues at the time of writing (count: 0).What the last round did
ad9feaabande4622ee6. Then six of the seven the next pass raised, in67612c8d. Addedscripts/pr_review_payload.pyfor the payload reads, withdefault_branchandbot_entry.side_asksconsolidation to Share the Attestation Marker and Reviewer Logins Between the Gate and the Metrics Report #3880. Comments on existing issues worked this round.What not to repeat
scripts/pr_review.pyorscripts/pr_review_rounds.py. They sit at 2199 of 2200 and 696 of 700 lines. New logic goes intoscripts/pr_review_side.py,scripts/pr_review_policy.py, orscripts/pr_review_payload.py, never into a raised ceiling.sedpattern after a negative-control revert. A repeated clause rewrote two sites. Revert by line number, or bygit diffagainst the commit.heldalready excludes uncovered bases.gqlout in a test without attaching the default policy.GqlCase.answerattaches it, and a fakegqlmust also accept thepolicykeyword.New learnings
[-]Session Handoff [review-cutover]: #3881 Merged, Metrics PR and #3885 Next[/-][+]Session Handoff [review-cutover]: #3886 Metrics Merged With Baseline Captured, #3885 and #3887 Next[/+]Ask an After-Checks Side Reviewer Once CI Settles, and Compare Ask Ti…
ptr727 commentedon Nov 5, 2026
Round 5, closed 2026-11-05: Session Handoff [review-cutover]: #3886 Metrics Merged With Baseline Captured, #3885 and #3887 Next
This track carries the move of the PR bots, Copilot, CodeRabbit and Qodo, from automatic to policy-driven review, to cut reviewer cost per useful finding. The maintainer revised the plan on 2026-11-04:
.github/pr-review.jsonsays which bots review, on which bases, when, and how often.scripts/pr_review.pyobeys it, andrepo-config/configure.shapplies its bot-side settings.scripts/backlog_metrics.py.Next steps
scripts/pr_review_side.py. Done when merged into develop.side_asked_on_headcomparescreatedAtwithcommittedDateas text. Usepr_review_checks.utc_instant, which Measure PR Review Return on Cost in the Backlog Report #3886 added besideagefor exactly this.repo-config/configure.shapplies and checks the policy.copilot_code_reviewrule in the develop and main rulesets comes from the policy rather than frommain.json. This needs a jq edit in bothapply_rulesetandcheck_ruleset.apply --checkout <path>writes only the auto-trigger keys of.coderabbit.yamland.pr_agent.tomlinto a local checkout, the form the maintainer chose. The caller commits through the ordinary PR flow.checkreads both files through the contents API and reports drift.repo-config/README.md, which still describes today's fixed rule.ptr727/coderabbitwithreviews.auto_review.enabled: false, and install CodeRabbit on it. Then open a test PR on a public repo above CodeRabbit's 10-star gate that carries no.coderabbit.yaml.pr-agent-settingsroute on a personal account.ptr727/coderabbitandptr727/pr-agent-settingsfrom the hub, in thebuild_dist.pypattern, with an audit check. It extends Generate the Qodo Settings Repository From the Hub So Fleet Rules Are Authored Once and Auditable #1464, and the maintainer chose hub-generated settings repos. Qodo's key is[config] disable_auto_feedback = true. Creating either repo is an outward write needing the go-ahead at the time.merge-and-release..github/pr-review.jsonmoves to explicit, through a PR followed byconfigure.sh apply --checkout.close.External blockers
uv run --no-project --script scripts/backlog_metrics.py, with uv on that host. Plainpython3now fails at import on markdown-it-py. Only the maintainer can change the timer.Internal dependencies
mainbefore the pilot. Agents fetchscripts/pr_review.pyfrom the hub'smain.when: after-checks. Otherwise that reviewer is silently never asked on a head Copilot already covers.State
ba118f12on 2026-11-05. Its branch and worktree were removed bypr_review.py merge --cleanup. Not yet onmain, nor is Read a Per-Repository Review Policy Before Asking Any Bot for a Review #3881.ba118f12on 2026-11-05, before any policy change. It is a local file on the maintainer's primary machine,~/review-metrics/baseline-2026-11-05.md, by the maintainer's choice to keep observed figures out of the repository. Its ProjectTemplate figures cover the newest 500 of 626 merged PRs, since the report's PR cap was reached.developatorigin/develop.Parked decision queue
No open
decisionissues at the time of writing (count: 0).What the last round did
backlog_metrics.pya uv script so it imports the gate's own readers. It now callsattestation,page_flag,thread_author,reviewer_nodeswithrefusal_of,side_asks,side_command, andside_rounds, and reads the policy throughpr_review_policy.fetch.gh_graphql.said_absentand addedpr_review_checks.utc_instant, which the gate'sagenow builds on.pr_review_rounds.py.What not to repeat
scripts/pr_review.py,scripts/pr_review_rounds.py, orscripts/pr_review_checks.py. They sit at about 2193 of 2200, 696 of 700, and 449 of 450 lines. A one-line docstring growth inpr_review_checks.pyfailedtest_pr_review_sizethis round.python3script. Every gate reader chains into markdown-it. The copies drifted from the gate within one round, on fences, first-wins, refusals, and ask rules. Make the script a uv script and import the reader.committedDatewith acreatedAtas text. AGitTimestampkeeps the committer's offset. Parse both withutc_instant.waitposts asks under the session's own account, so only a review-request event with a bot actor reads as automation.New learnings
bm.run_subprocessnever reachedgh_graphql.request. Pass the runner explicitly. Recorded in the hub-wide verification lessons memory.[-]Session Handoff [review-cutover]: #3886 Metrics Merged With Baseline Captured, #3885 and #3887 Next[/-][+]Session Handoff [review-cutover]: #3888 Merged, PR B configure.sh Next[/+]ptr727 commentedon Nov 5, 2026
A coordination note for this track's next round, from the session that worked #3200.
PR #3889, now merged into
develop, widens the per-repository review policy into one repo-local agent policy file. The maintainer decided this on 2026-11-05..github/pr-review.jsonbecame.github/agent-policy.json. The current schema moved under areviewsection.guardsection sits beside it. It lists the branches on whichgh-write-guardlets an agent commit in place in a primary checkout, the operational repository's standard workflow. The guard reads that section fromorigin/mainonly.spec/pr-review.schema.jsonandspec/pr-review.default.jsonare nowspec/agent-policy.*.scripts/pr_review_policy.pyreads thereviewsection, and a file with noreviewsection reads the hub default's.What this changes in the plan:
developas it stands.configure.shshould render the whole.github/agent-policy.jsonfrom the registry:workflowModel: operationalfills inguard.primaryCheckout.commitInPlace.branches: ["develop"], and an optional per-repositoryagentPolicyoverride covers the rest. The bot-side settings are then derived from the renderedreviewsection as already planned..github/agent-policy.jsonrather than.github/pr-review.json.48 remaining items
ptr727 commentedon Nov 7, 2026
Test reports for next step 1, read from the repositories' own PRs at the round 18 start, 2026-11-07. The cases are ptr727/Financial-Modeling#1880 and ptr727/HomeAutomation-Config#1782, both into
develop, and ptr727/HomeAutomation-Config#1785, a promotion tomain. PlexCleaner has opened no PR since its policy change (#1218), so its report is still owed.waitholds the CodeRabbit request until checks pass: yes, on all three. Each@coderabbitai reviewcame after the last check other than CodeRabbit had finished.developbase no later push drew a Copilot round. Session Handoff [default]: ESPHome-Config Build Profile and Kept Skills Tree Released as 2.0.663 #1782 had three pushes after open, which matches the policy's default-branch-only bases.main-base PR, Point the HomeAutomation-Config Audit's Escalation at Its Issue #1785, had a single push..coderabbit.yamlturned auto review off. Each head still carriesenabled: true, so CodeRabbit wrote a walkthrough on open as well. That matches CodeRabbit Clean Passes Leave No Review, and It Reads Config From the Head Branch #3929 item 2, a branch cut before the change still auto-triggers.enabled: false, yet CodeRabbit still posted "Review limit reached" when the PR opened. So the rate-limit notice comes before, or regardless of, the head-config skip. The merge came about an hour after the request, which fits A Rate-Limited CodeRabbit Holds pr_review.py wait Until Its Timeout #3928's hold-to-timeout case. I have not confirmed thatwaititself timed out.configure.sh checkexits 0 from hubmain. Financial-Modeling and PlexCleaner still have no policy files onmain.coderabbitai commentedon Nov 7, 2026
Analysis chain
Script executed:
Length of output: 68504
@ptr727Thanks for the test report.waittimed out on HomeAutomation-Config#1785.configure.sh checkreads policy files from the target repository’s default branch; I did not rerun the live check.mainper the report. Before adding central configs, checkcentral_config.py preconditionfor each settings repository.Learnings used
You are interacting with an AI system.
ptr727 commentedon Nov 8, 2026
Test report from ptr727/Financial-Modeling#1882, into
develop. It is the first PR there cut after the policy merge (#1878), so its head carries.coderabbit.yamlwithauto_review.enabled: false.skipping, so it ran no review. So a branch cut after the change does stop the auto review, but it does not stop the summary comment. That part of CodeRabbit Clean Passes Leave No Review, and It Reads Config From the Head Branch #3929 item 2 does not hold for the summary.waitheld the CodeRabbit request until checks passed.@coderabbitai reviewcame after 12/12 checks, and CodeRabbit answered "Review finished" 6 seconds later, with the note that it does not re-review commits it already reviewed. It was not rate limited this time, andwaitended with exit 0 after 657 s, not at its timeout.waitprinted its note that a request was already open when it started. It was one round with no findings, on a PR with a single push, so the 3-round cap is still untested here.🤖 Generated with Claude Code
coderabbitai commentedon Nov 8, 2026
Analysis chain
Script executed:
Length of output: 1155
Script executed:
Length of output: 4825
@ptr727Thanks for the report.#3929, a walkthrough summary on open does not by itself show that an automatic review ran. In this test, the status wasskipping.waitrequested CodeRabbit after all 12 checks passed and exited successfully after 657 seconds. CodeRabbit’s response noted that it does not re-review commits already reviewed.I could not independently verify the PR: both GitHub API reads returned 404.
Learnings used
You are interacting with an AI system.
ptr727 commentedon Nov 8, 2026
More step-1 evidence, from HomeAutomation-Config's session about ptr727/HomeAutomation-Config#1786, its first develop PR opened with the policy already on its base. It was run through
pr_review.py wait.waitflagged the automatic trigger as still on.waitrequested no explicit round, as intended, since Copilot'sbasesis@defaultonly. So the hold-until-checks behavior and the 3-round cap still have no test on amain-base PR with more than one push.waitposted@coderabbitai reviewonce, after checks were green. That round came back rate-limited, and on the next headwaitreported that the policy allows CodeRabbit no further round. Here the rate limit did not holdwait, which exited 0 after 719 s.wait's first exit 0 with 3 unresolved Copilot threads as a contract breach. It isn't one. In the usage text, "with no thread open" applies only to the held-head branch, and a review being present exits 0 so the driver can triage. The sentence is still easy to misread, and is worth rewording the next time that usage text changes.coderabbitai commentedon Nov 8, 2026
Analysis chain
Script executed:
Length of output: 56526
Script executed:
Length of output: 26904
@ptr727Thanks for the report.waitrequested CodeRabbit after checks passed and exited0despite the rate limit. On the next head, it reported that policy allowed no further CodeRabbit round.main-base PR with multiple pushes. That test should distinguishwaitrequests from the personal toggle’s requests.waitimplementation checks for open threads on the held-head local-pass path. A present Copilot review can return0with threads still open for triage.For the next usage-text edit, I suggest:
Learnings added
Learnings used
You are interacting with an AI system.
ptr727 commentedon Nov 8, 2026
Round 17, closed 2026-11-07: Session Handoff [review-cutover]: Three Repositories on Explicit Review, Hub 2.0.1365 Released, Test Reports Next
This track moves the PR bots (Copilot, CodeRabbit and Qodo) from automatic to policy-driven review, to cut reviewer cost per useful finding. The maintainer revised the plan on 2026-11-04:
.github/agent-policy.jsonsays which bots review, on which bases, when, and how often.scripts/pr_review.pyobeys it, andrepo-config/configure.shapplies the bot-side settings.scripts/backlog_metrics.pymeasures the effect.Each repository's policy file is rendered from
registry/repos.json.scripts/agent_policy.py writewrites the files into a checkout.configure.sh applywrites the live settings and rulesets.checkdiffs against the render, reading the files from the default branch. The central settings repositories are written byscripts/central_config.py.Four repositories now review by explicit request with the same values (#3924, released in
2.0.1365): the hub, PlexCleaner, Financial-Modeling and HomeAutomation-Config. The hub's override names Qodo too, the other three leave Qodo on the fleet default:Next steps
waitholds the Copilot and CodeRabbit requests until checks pass, the 3-round cap, CodeRabbit's answer to an explicit request, and Copilot reviewing on open. A fresh session reads the reports from the repositories' own PRs instead.scripts/backlog_metrics.pyoutput and the 28-day baseline, which is on the maintainer's machine, so ask for it. Fold in step 1's reports and the test findings under "What the last round did". Put each change to the maintainer as a question with a recommendation. A change is a registry override PR, then each repository writes its files, thenconfigure.sh applywith the maintainer's go-ahead.waituntil its timeout) before more repositories move. It turns every rate-limited explicit round into a 45-minute wait.main, on the maintainer's word only. Until thenconfigure.sh checkreports its policy files missing or stale onmain, which is expected. HomeAutomation-Config's session opened its promotion on 2026-11-07. Done for each whenconfigure.sh checkexits 0.main: Financial-Modeling and PlexCleaner are the twocentral_config.py preconditionnames. EspDinIoT is held ondevelopas a work in progress. Before any promotion, list its unverified commits, and rewrite an unsigned one rather than bypassing.central_config.py writein a clone of each settings repository oncecentral_config.py preconditionexits 0, then a PR there, each on the maintainer's go-ahead.waitnotes it on every PR. Then move other repositories by their registry entry, each with its two check-ins.close.External blockers
Internal dependencies
central_config.pywithholds the config file until every live registry repository carries its own file on its default branch.State
mainand the latest release at2.0.1365(Promote Develop: Move Three Repositories' Reviews to Explicit Requests and Refresh DevKitCIoT #3926 merged as20ac62f3, carrying Require the DevKitCIoT Pull Request Check and Refresh Its Registry Entry #3923, Move Three Repositories' Copilot and CodeRabbit Reviews to Explicit Requests #3924 and Describe DevKitCIoT's Registry Notes After Its Promotion #3927).developholds nothingmainlacks from this track. No hub PR is open from this track.develop.configure.sh applyran for all three from hubmain20ac62f3, removingcopilot_code_reviewfrom eachmainruleset. Eachchecknow fails only on the policy files onmain.mainthrough a peer session, and its registry notes now keep only current deviations (Describe DevKitCIoT's Registry Notes After Its Promotion #3927).20ac62f3. This session's worktrees are removed, andcleanup --sweepreportsproblems=0.Parked decision queue
0 open
decisionissues (count: 0).What the last round did
2.0.1365), and applied the rulesets.waitheld the CodeRabbit request until checks passed, then asked once.@coderabbitai reviewworks with auto review off. It answered in about 30 seconds when not rate-limited..coderabbit.yamlfrom the PR head (CodeRabbit Clean Passes Leave No Review, and It Reads Config From the Head Branch #3929).What not to repeat
offfor a private repository. It reviews them. The maintainer wants it kept, explicit and once, because its findings are good and its quota is scarce. Test turning a bot off in isolation, never bundled into another change.docs/pr-reviewer-reference.mdon which bots review private repositories until Reviewer Reference Says CodeRabbit Skips Private Repositories, but It Reviews Them #3925 lands.central_config.pyoragent_policy.pywith barepython3. Useuv run --no-project --script, which installs their inline dependencies.uv runwithout--no-projectin a hub worktree. It writes an untrackeduv.lockand.venv, which move the local review digest.--checkouttomerge --cleanupfor a worktree made from another clone. The worktree stays registered in its own base clone. Pass that clone instead.driftNoteas history.AUDIT.md"Reconcile driftNotes" deletes it, and a note restating a met baseline check goes too.New learnings
configure.sh, and each repository's session writes and drives its own policy PR on a "go" naming the hub merge commit and the files to expect.[-]Session Handoff [review-cutover]: Three Repositories on Explicit Review, Hub 2.0.1365 Released, Test Reports Next[/-][+]Session Handoff [review-cutover]: #3928 Fixed and Released as 2.0.1366, Check-In 1 Next[/+]ptr727 commentedon Nov 8, 2026
Correction to round 18's State: this session's hub clone, the detached
ProjectTemplate-hub-handoff-20261107under the fleet worktree directory, was not removed. A safety check blocked removing that directory. It is clean, sits onmainat24535332, and has no worktrees registered from it, so the maintainer can delete it safely. A resume should not use it as its hub checkout and should clone fresh instead.Parked decision queue at close: 0 open
decisionissues.coderabbitai commentedon Nov 8, 2026
Analysis chain
Script executed:
Length of output: 163747
Script executed:
Length of output: 12289
Script executed:
Length of output: 33732
Script executed:
Length of output: 8884
Script executed:
Length of output: 18790
@ptr727The current handoff is round 18. Issue#3928is closed:#3930fixed the rate-limit reader, and#3931promoted it. The handoff reports release2.0.1366. I did not run the tests.PlexCleaner test report, partial: PlexCleaner#1220 opened after the policy change.
codecov/projectstarted at 01:30:11, so the timeline does not establish whetherwaitsaw all checks before requesting.The PlexCleaner session’s
waitresult is still needed. Copilot’s three-round cap and the live rate-limit fix also remain untested.For check-in 1 on or after November 13, please share the 28-day baseline and the weekly metrics report.
Learnings added
Learnings used
You are interacting with an AI system.
ptr727 commentedon Nov 8, 2026
Step-2 evidence read at the round 19 start, 2026-11-08, from the repositories' own PRs.
PlexCleaner's report is no longer owed. ptr727/PlexCleaner#1220, into
develop, is the first PlexCleaner PR since its policy change (#1218). It is still open, so this covers what has posted so far.waitposted@coderabbitai reviewafter the required aggregator check passed. CodeRabbit answered "Review triggered", with no rate limit. One non-gating check,codecov/project, finished 6 s after the request. Sowaitwaits for the gate rather than for every check, which is as intended.developis not in itsbases, so no explicit round followed.A rate-limited CodeRabbit released the merge live after #3930. ptr727/HomeAutomation-Config#1787 is a promotion to
mainwith a single push. CodeRabbit posted "Review limit reached" on open.waitrequested once after checks passed, and CodeRabbit answered "Review rate limited". The PR merged 8 minutes after that reply. #1785, before #3930, took about an hour in the same state. This fits the "hold neither" fix. Thewaitexit code was not read, so this is the merge timing only.Still untested: the Copilot 3-round cap. #1787 had one push, like #1785. It needs a
main-base PR with more than one push.Step 3 readiness, read from GitHub: neither repository has
.github/agent-policy.jsononmainyet.compare main...developreports 0 unverified commits for both: Financial-Modeling is 9 ahead and PlexCleaner 31 ahead. Financial-Modeling's only openmainPR is a Dependabot bump (#1816), which is not a promotion.coderabbitai commentedon Nov 8, 2026
Analysis chain
Script executed:
Length of output: 34882
@ptr727Thanks for the report. The PlexCleaner report is no longer outstanding.waitrequested CodeRabbit after the required aggregator passed. The hub’s check logic also considers open workflow runs and settling checks, so this example does not establish that all non-gating checks are ignored.#3930. It does not establish thewaitexit code.main-base test with enough eligible heads to reach the cap and test a later head. The test should distinguish personal-toggle requests fromwaitrequests.central_config.py preconditionfor each settings repository.Learnings used
You are interacting with an AI system.
ptr727 commentedon Nov 8, 2026
Round 18, closed 2026-11-08: Session Handoff [review-cutover]: #3928 Fixed and Released as 2.0.1366, Check-In 1 Next
This track moves the PR bots (Copilot, CodeRabbit and Qodo) from automatic to policy-driven review, to cut reviewer cost per useful finding. The maintainer revised the plan on 2026-11-04:
.github/agent-policy.jsonsays which bots review, on which bases, when, and how often.scripts/pr_review.pyobeys it, andrepo-config/configure.shapplies the bot-side settings.scripts/backlog_metrics.pymeasures the effect.Each repository's policy file is rendered from
registry/repos.json.scripts/agent_policy.py writewrites the files into a checkout.configure.sh applywrites the live settings and rulesets.checkdiffs against the render, reading the files from the default branch. The central settings repositories are written byscripts/central_config.py.Four repositories review by explicit request with the same values (#3924): the hub, PlexCleaner, Financial-Modeling and HomeAutomation-Config. The hub's override names Qodo too, the other three leave Qodo on the fleet default:
Next steps
scripts/backlog_metrics.pyoutput and the 28-day baseline, which is on the maintainer's machine, so ask for it. Fold in the test reports on this issue (the round-18 comments) and the findings under "What the last round did". Put each change to the maintainer as a question with a recommendation. A change is a registry override PR, then each repository writes its files, thenconfigure.sh applywith the maintainer's go-ahead.main-base PR with more than one push. A rate-limited CodeRabbit releasingwaitandmergelive, after Read CodeRabbit's Rate-Limit Reply With Markup Around Its Sentence #3930, is untested too. Read each from the repositories' own PRs.main, on the maintainer's word only. Until thenconfigure.sh checkreports their policy files missing onmain, which is expected. Done for each whenconfigure.sh checkexits 0. EspDinIoT is held ondevelopas a work in progress. Before any promotion, list its unverified commits, and rewrite an unsigned one rather than bypassing.central_config.py writein a clone of each settings repository oncecentral_config.py preconditionexits 0, then a PR there, each on the maintainer's go-ahead.waitnotes it on every PR. Then move other repositories by their registry entry, each with its two check-ins.close.External blockers
Internal dependencies
central_config.pywithholds the config file until every live registry repository carries its own file on its default branch.State
mainat24535332(promotion Promote Develop: Read CodeRabbit's Rate-Limit Reply With Markup Around Its Sentence #3931, carrying Read CodeRabbit's Rate-Limit Reply With Markup Around Its Sentence #3930, merged with the head pinned at0ed3fe89). Release run 42433991462 succeeded from that tip and published2.0.1366. No hub PR is open from this track, anddevelopholds nothingmainlacks from it.main(its Point the HomeAutomation-Config Audit's Escalation at Its Issue #1785), andconfigure.sh checkexits 0. Financial-Modeling and PlexCleaner still have no policy files onmain.24535332, and the host-safety kit reads CURRENT. Claude Code loads the primary checkout, still ondevelopatc2373754, andcleanup --sweepreports it would fast-forward. That is the maintainer's to update.cleanup --sweepreportsproblems=0.ProjectTemplate-hub-handoff-20261107under the fleet worktree directory, is removed at close.Parked decision queue
0 open
decisionissues (count: 0).What the last round did
<dl><dd><br>, which thecoderabbit.jsonpattern did not allow. The maintainer decided "hold neither", so a rate-limited CodeRabbit whose one round is spent holds neitherwaitnormerge. The existinghosted_reviews_runningrate-limit release already covered both paths, so fixing the reader was the whole fix (Read CodeRabbit's Rate-Limit Reply With Markup Around Its Sentence #3930). It was promoted in Promote Develop: Read CodeRabbit's Rate-Limit Reply With Markup Around Its Sentence #3931 and closed A Rate-Limited CodeRabbit Holds pr_review.py wait Until Its Timeout #3928.enabled: falseskips the auto review on open, but can still post "Review limit reached" on open.What not to repeat
waitexit 0 with threads open as a contract breach. In the usage text, "with no thread open" applies only to the attested held-head branch. A review being present exits 0 so the driver can triage. Merge Gate item 3 ismerge's and the driver's. Worth rewording the next time that usage text changes.developPR. Copilot'sbasesis@default, and adevelophead is covered by the attested local pass. The only Copilot round there is the personal toggle's on-open one.scripts/pr_review.pycasually. It sits at the 2200-line size ceiling, and Read CodeRabbit's Rate-Limit Reply With Markup Around Its Sentence #3930 had to revert one.offfor a private repository. It reviews them. The maintainer wants it kept, explicit and once. Test turning a bot off in isolation, never bundled into another change.docs/pr-reviewer-reference.mdon which bots review private repositories until Reviewer Reference Says CodeRabbit Skips Private Repositories, but It Reviews Them #3925 lands.central_config.pyoragent_policy.pywith barepython3, oruv runwithout--no-projectin a hub worktree. Useuv run --no-project --script.New learnings
startedAtgets an emptysince, so a rate-limit comment of any age clears it. Nothing in the fleet posts such a check today.[-]Session Handoff [review-cutover]: #3928 Fixed and Released as 2.0.1366, Check-In 1 Next[/-][+]Session Handoff [review-cutover]: Step-2 Reports In, Step 3 Left to Peer Sessions, Check-In 1 Next[/+]ptr727 commentedon Nov 8, 2026
Answers given at the round 19 close, 2026-11-08:
Parked decision queue at close: 0 open
decisionissues.