Repository navigation
pr-review is missing from the canary ring registry — autocut never advances its channel, so merged fixes sit inert (two incidents in three days) #1166
Description
Story
As a maintainer,
I want pr-review registered in the canary ring registry,
so that a merged fix to the review agent reaches its channel automatically instead of sitting inert on main until someone remembers cut-release.sh.
The gap
standards/canary-rings.json registers 16 agents. pr-review is not one of them — pr-review-mention and pr-auto-review are, but not the agent whose scripts actually perform reviews (scripts/review-one-pr.sh, scripts/post-pr-review.sh, scripts/engine.sh, reusable .github/workflows/pr-review.yml in petry-projects/.github-private).
Consequence: canary-rollout.yml's 4-hourly autocut — "the FRONT END that closes the last manual seam" (#1069), gated by CANARY_AUTO_CUT, currently true — never cuts pr-review. Its channel only moves when a human runs cut-release.sh.
What that cost, twice in three days
| fix | merged to main |
live on pr-review/v1-next |
gap |
|---|---|---|---|
| combsmith/.github-private#1795 (non-required checks deadlocking every merge) | 2026-09-19 13:37 | only after a manual cut to v1.10.0 |
every PR in .github-private stayed deadlocked meanwhile |
| combsmith/.github-private#1875 (approval read-back, #1874) | 2026-09-21 13:22 | only after a manual cut to v1.11.0 |
phantom approvals continued at 13:40 and 13:42, stranding two PRs |
In both cases the fix was correct and merged; the repo kept exhibiting the fixed bug because the agent runs from the channel tag, not main.
Not a host problem — check before assuming otherwise
Hosting is not the reason it is missing: the registry already supports agents hosted in .github-private — dev-lead (petry-projects/.github-private, .github/workflows/dev-lead-reusable.yml) and ci-failure-analyst (same host) are both registered. So pr-review living there is no barrier.
But check for a deliberate exclusion before adding it. pr-review is the ring-0 self-host (#497): it reviews the repo that hosts it, and .github-private pins pr-review/v1-next precisely to dogfood the next channel. Auto-advancing next means a bad merge reaches the repo's own review automation immediately, with no earlier tier to catch it. That may have been a conscious choice. If it was, this issue's outcome is to document the exclusion rather than close the gap silently.
Acceptance Criteria
- Search the history (docs(standards): add Advanced Security (GHAS) org standard #495, canary autocut watches only the reusable blob, so script-only changes never ship; plus _gh_move_tag cannot create a missing channel ref #1019, apply-repo-settings can never reach the fleet: stub not deployable, ring tags missing, canary deadlocked on a vendored script #1045, 💡 Canary Pipeline Self-Health Observability & Reliability Standard #1069, enable pull request limits #497) for a deliberate decision to exclude
pr-review. State the finding in the PR. If the exclusion was intentional, stop and document it — instandards/canary-rings.jsonor the rollout ADR — and close this issue as documentation. - If no such decision exists: register
pr-reviewinstandards/canary-rings.jsonwith its host (petry-projects/.github-private), reusable path,run_workflow, and ring membership consistent with how it is consumed today (.github-privateis thenext-tier self-host). - Keep the three agreement points in sync —
RING_REUSABLESinscripts/lib/ring-pins.sh, theagentenum incanary-rollout.yml, and the registry — sincetests/canary_rollout.batsasserts the choice list equals.agents | keysand will fail otherwise. - Prove it with a dry run, not by inspection:
canary-rollout.ymlaction=autocut, agent=pr-reviewin dry-run mode shows the version it would cut and the channel it would advance, and the computed refs resolve. Paste the output in the PR. - Confirm no regression for the 16 already-registered agents: an
evaluate-all(read-only) before and after shows the same tiers. - Note in the PR whether
CANARY_AUTO_PROMOTE(alsotrue) meanspr-reviewwill now promote pastnextautomatically, and whether that is wanted for the self-host — if not, say how it is bounded.
Dev Notes
- This closes, in tooling, the rule just added to
AGENTS.mdin Enhance AGENTS.md with the operating rules learned delivering epic #1643 (channel cuts, verify-by-execution, hold semantics, dev-lead steering) .github-private#1882: "Merging tomaindoes not activate agent code — say whether a channel cut is required." A rule people must remember is weaker than a timer that does it. - Do not change
CANARY_AUTO_CUT/CANARY_AUTO_PROMOTE; both are alreadytrue. The gap is registration, not the kill-switches.
References
combsmith/.github-private#1795, #1874/#1875, #1882; #1069 (autocut), #1019 (registry agreement), #497 (self-hosting circular dependency), standards/canary-rings.json, scripts/lib/ring-pins.sh, .github/workflows/canary-rollout.yml.
Activity
don-petry commentedon Sep 23, 2026
Dev-Lead Implementation Plan
Issue: #1166 — pr-review is missing from the canary ring registry — autocut never advances its channel
History finding (AC #1)
Searched the in-repo record (both rollout ADRs,
ci-standards.md,#495/#497/#1019/#1045/#1069). No deliberate decision to excludepr-reviewwas found. The opposite: both ADRs explicitly namepr-reviewas a versioned, self-hosting agent slated to adopt the ring model (docs/initiatives/canary-rollout-adr.md§Scope + Decision 1;docs/initiatives/agent-canary-rings-adr.md— "#499/#616/#688"). The #497 self-host/circular-dependency concern is addressed by the ring design ("production self-review duty stays onstable… breaking the circular dependency"), not used to exclude the agent.pr-review.ymlevaded thedriftaudit only because that scan matches*-reusable.ymland the engine is the grandfatheredpr-review.yml(#1127). Conclusion: this is an oversight, not an intentional exclusion → proceed to register (AC #2).Scope
Register the
pr-reviewagent in the canary ring registry and keep the three agreement points in sync, so 4-hourlyautocutcuts/advances its channel automatically.Implementation Checklist
standards/canary-rings.json— add.agents["pr-review"](hostpetry-projects/.github-private, reusable.github/workflows/pr-review.yml,run_workflow, host-relative rings next→ring0→ring1→stable, standard Define the release soak standard (ring-promotion gate): time floor + traffic-scaled sample + health #548 gate — mirroring the.github-private-hosted siblingsdev-lead/ci-failure-analyst)scripts/lib/ring-pins.sh— addpr-reviewtoRING_REUSABLES(keep alphabetical).github/workflows/canary-rollout.yml— addpr-reviewto the dispatchagentenum (keep alphabetical)Tests to Write
tests/canary_rollout.bats:pr-reviewis registered with the expected host/reusable and its ring tiers resolve (next=.github-private, ring0=.github)tests/canary_rollout.bats"the agent choice list agrees with the registry" andtest/scripts/lib/ring-pins.bats"RING_REUSABLES equals the canary-rings.json agent registry"Verification (AC #4/#5/#6)
canary-rollout.sh autocut --dry-runscoped topr-review(+ resolve computed refs) — paste output.evaluate-all(read-only) before/after — confirm the 16 existing agents' tiers are unchanged.CANARY_AUTO_PROMOTE=trueconsequence for the self-host and how promotion pastnextis bounded by the soak/health gate.Test Command
bats tests/canary_rollout.bats test/scripts/lib/ring-pins.batsandbash .dev-lead/scripts/dev-lead-lint.shdon-petry commentedon Sep 23, 2026
Dev-Lead: Progress (in progress — not yet durable)
History finding (AC #1) — intent
Searched the in-repo record (both rollout ADRs,
ci-standards.md, and the referenced issues). No deliberate decision to excludepr-reviewwas found. Both ADRs name it as a versioned self-hosting agent slated for the ring model; the #497 self-host/circular-dependency concern is addressed by the ring design (production duty stays on outer tiers, gated by soak health), not used to exclude it.pr-review.ymlevaded thedriftaudit only because that scan matched*-reusable.ymland the engine keeps its grandfathered name (#1127). → Treated as an oversight; proceeded to register.Plan execution (intended, in this workspace)
.agents["pr-review"]tostandards/canary-rings.json(hostpetry-projects/.github-private, reusable.github/workflows/pr-review.yml, host-relative rings next→ring0→ring1→stable, standard Define the release soak standard (ring-promotion gate): time floor + traffic-scaled sample + health #548 gate — mirroring the.github-private-hosted siblings).pr-reviewtoRING_REUSABLES(scripts/lib/ring-pins.sh) and to the dispatchagentenum (.github/workflows/canary-rollout.yml) — the three agreement points (AC Add coding standards & principles section to AGENTS.md #3).run_workflow=PR Review Agent — Trigger(the caller stub's display name), NOT a*.ymlfilename: on outer tiers that lack the workflow, a display name yields the graceful "could not find any workflows named …" →[]([Fleet Monitor] petry-projects/.github — .github/workflows/canary-rollout.yml #747), whereas a filename 404s and_run_jsonmis-triages it as a transient failure that fails the gate closed (caught via a local dry evaluate).drift'smissing-filecheck listed host reusables by*-reusable.ymlsuffix only, so the grandfatheredpr-review.ymlwas reported as a "stale registry entry" every cycle._gh_list_reusablesnow also admits a present registered path; a genuinely-deleted one is still reported. (+2 regression tests.)Local check output (provisional — NOT the pushed run)
Dry-run autocut for
pr-review(the AC #4 evidence) — read-only:This is the gap itself: a merged fix (
main4fd4eac) has been sitting inert vs thenextcandidate (781b63c). Ring members resolve: next=.github-private, ring0=.github, ring1=TalkTerm/bmad-bgreat-suite, stable=*.evaluate pr-review(read-only) →next->ring0 BLOCKED(dwell met, sample 455,cum_fail=13triaged PRE_EXISTING), i.e. underCANARY_AUTO_PROMOTE=trueit will not silently advance pastnext— the soak gate holds it pending human--allow-pre-existing. That bounds the self-host risk (AC #6). Existing agents evaluated unchanged; the registry diff is purely additive (16→17, the 16 existing entries byte-identical).Files touched (this workspace, not yet pushed)
standards/canary-rings.json,scripts/lib/ring-pins.sh,.github/workflows/canary-rollout.yml,scripts/canary-rollout.sh(drift listing fix),tests/canary_rollout.bats(registration + drift regression tests)Notes
CANARY_AUTO_CUT/CANARY_AUTO_PROMOTE(per Dev Notes).evaluate-all(AC Add stacked PR strategy and Epic-level workflow guidance #5) and the dry-run (AC Add workflow, environment, and orchestration guidance #4) will be reproduced by the CI run that pushes this; the durable completion record follows the push.don-petry commentedon Sep 23, 2026
Dev-Lead: Implementation Complete — PR #1168
The implementation for issue #1166 is durable: commits are pushed and a pull request is open. This record is backed by verifiable artifacts you can confirm in one click.
a1980bb411c734c40b94b723cb9164c791571f48main: 5 file(s), +169/-13 linesReview happens on the PR. Acceptance criteria and test results are evidenced by the PR's diff and CI checks — not asserted here. If a later stage fails, this claim is retracted in place.
feat: implement issue #1166 — pr-review is missing from the canary ri…
fix: remove duplicate pr-review entry in canary-rings.json
feat: implement issue #1106 — pr-review is not a registered canary-ri…