Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
282 commits
Select commit Hold shift + click to select a range
bfc9d2a
add: workflow to fix stuck PRs using bot account token
Apr 25, 2026
93a9847
fix: pass GH_PAT to checkout action so workflow uses bot account
Apr 25, 2026
bf1fa56
debug: simplify account check, add authentication debug output
Apr 25, 2026
49cc2ae
docs: add comprehensive petry-review-bot setup instructions
Apr 25, 2026
f545eba
docs: add GitHub App setup guide (recommended approach)
Apr 26, 2026
7735730
docs: add comprehensive GitHub App setup documentation
Apr 26, 2026
98d154b
fix: silence auth check in fix-stuck-prs when using GitHub App token
Apr 26, 2026
911b555
fix: use explicit author instead of @me in stuck PR search
Apr 26, 2026
ca298a7
fix: avoid subshell in while loop to preserve variable state
Apr 26, 2026
4c18c37
docs: add comprehensive status report for GitHub App setup
Apr 27, 2026
a61b5ca
docs: document stuck PR cleanup status and script fixes
Apr 28, 2026
5ecf6de
fix: update list-prs.sh to search all repos by owner instead of @me
Apr 28, 2026
3d13f77
docs: add investigation report for PR review agent workflow failures
Apr 28, 2026
bca8032
fix: move env section before steps in workflow to fix YAML structure
Apr 28, 2026
3308c20
script: add backfill-approvals to retroactively apply real approvals
Apr 28, 2026
da863d2
feat: add backfill-approvals workflow to run as GitHub App bot
Apr 28, 2026
e0ccdd3
fix: convert inner while loop to process substitution to preserve cou…
Apr 28, 2026
05dc8f5
car-hunt: add VIN-deep-dive flow, printable checklists, location-tier…
Apr 28, 2026
dcd20af
fix: re-approve PRs where approval predates last commit (stale approval)
Apr 28, 2026
4ac2d7d
fix: robustly extract JSON verdict from mixed claude --print output (…
don-petry Apr 28, 2026
3b97d29
fix: extract_verdict_json — check dest file first (agent Bash-write s…
don-petry Apr 29, 2026
414fcd2
Enforce MAX_REVIEW_CYCLES cap before running the cascade (#18)
don-petry Apr 29, 2026
a054ac6
Reliability hardening: session circuit breaker, timeouts, retry, dedu…
don-petry Apr 29, 2026
4bd2b68
Remove car-hunt skill and scheduled tasks (moved to don-petry/don-pet…
don-petry Apr 30, 2026
c288ba3
fix: apply Copilot fallback hardening and reuse GH_PAT for Copilot auth
don-petry May 3, 2026
14c65a4
fix: switch Copilot engine to gh built-in and fix app-id deprecation
don-petry May 3, 2026
04916e1
fix: harden Copilot fallback path and remove stale worktrees (#25)
claude[bot] May 3, 2026
57d0d4d
ci: add pre-flight dedup check to prevent duplicate claude-issue PRs …
don-petry May 3, 2026
a9af662
refactor: migrate to machine user PAT auth (closes #27) (#28)
don-petry May 5, 2026
7037199
refactor: merge approval repair scripts into single automation
don-petry May 5, 2026
c5798ff
feat: add @mention trigger for on-demand PR reviews (#30)
don-petry May 6, 2026
90e067c
fix: harden rebase, review dismissal, and health log diagnostics (#40)
don-petry May 7, 2026
c43f999
refactor: migrate to org-wide .github-private convention (#41)
don-petry May 7, 2026
bf048be
ci: add dependabot-automerge.yml workflow (#73)
don-petry May 10, 2026
47598b8
fix(pr-review): unblock queue starvation from self-authored PRs (#96)…
don-petry May 10, 2026
bc4b954
chore: rename GH_PAT_WORKFLOWS secret to DON_PETRY_BOT_GH_PAT (#99)
don-petry May 10, 2026
8a2fb83
chore: remove frameworks directory (#101)
don-petry May 10, 2026
4a6ca3e
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
858aca6
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
cec470b
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
c207f11
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
0bc3084
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
dbd6061
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
cd77a03
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
0ff759b
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
8ba5ca3
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
babe57c
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
5efdde3
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
8684ae3
revert: restore all erroneously deleted files (items 4-34) (#104)
don-petry May 11, 2026
c115925
feat: add Gemini Pro support and optimize PR review fallback chain (#…
don-petry May 11, 2026
848174b
fix(pr-review): gate rate-limit detection on non-zero exit code
May 11, 2026
1bfd540
fix(claude): sync inlined workflow with org standard (#109)
don-petry May 11, 2026
a8a12db
ci: replace inlined claude.yml with standard thin-caller stub
don-petry May 11, 2026
eb0c1ef
fix: replace gh copilot suggest with GitHub Models REST API (#151)
don-petry May 12, 2026
e71fa59
feat: prioritise .github/.github-private PRs, oldest-first within tie…
don-petry May 13, 2026
2369683
fix: restore pr-review.yml content (accidentally emptied in revert)
don-petry May 13, 2026
5e1e0c6
fix: restore pr-review.yml (file was accidentally emptied)
don-petry May 13, 2026
7d9640d
chore(deps): bump actions/cache from 4 to 5 (#165)
dependabot[bot] May 13, 2026
e87d2a1
chore(deps): bump petry-projects/.github/.github/workflows/claude-cod…
dependabot[bot] May 13, 2026
fa26713
fix(list-prs): search DELEGATION_ORGS and drop --checks success pre-f…
don-petry May 13, 2026
774895a
feat: add code-quality ruleset (compliance fix #60) (#86)
don-petry May 14, 2026
5008519
feat(prompts/dev-lead): add human prompt template
don-petry May 15, 2026
fb6090a
feat(prompts/dev-lead): add human-pr prompt template
don-petry May 15, 2026
b42a356
feat(dev-lead): implement dev-lead agent Phases 0-6
don-petry May 15, 2026
dfc63bc
feat(dev-lead): Phase 1.5 — reusable workflow for cross-repo adoption…
don-petry May 15, 2026
47dec6f
fix(dev-lead): rate-limit detection, separate status, and retry cron …
don-petry May 16, 2026
cacb98d
fix(pr-review): handle Gemini trust-mode failure and properly route e…
don-petry May 17, 2026
8fe3ab0
fix: resolve YAML syntax error in dev-lead-reusable workflow
May 17, 2026
6ac1b11
fix: address automated feedback from PR 217 (#219)
don-petry May 17, 2026
62eecd7
chore: remove Phase 7 shadow period comment from dev-lead.yml
don-petry May 17, 2026
0760e96
feat: skip PRs with CHANGES_REQUESTED review (+ FORCE_REVIEW and stal…
don-petry May 17, 2026
e5f3a27
fix(dev-lead): resolve context loss, missing checkout, and push logic…
don-petry May 17, 2026
81f67bb
test: bypass CI check
May 17, 2026
932e12a
fix(pr-review): remove CI bypass hack
May 17, 2026
cae661a
fix(dev-lead): use heredoc for multiline environment variables (#224)
don-petry May 17, 2026
bc95a61
fix(dev-lead): detect engine-committed changes and remove commit inst…
May 18, 2026
31e73e1
fix(dev-lead): address PR review findings — untracked files, upstream…
May 18, 2026
7ad9f5b
fix(pr-review): robust engine fallback and context optimization (#227)
don-petry May 18, 2026
2348d09
fix(dev-lead): handle SonarQube Quality Gate failures (issue #279) (#…
don-petry May 19, 2026
ac80ecc
fix(dev-lead): configure git identity, surface commit/push failures, …
don-petry May 19, 2026
007bfca
fix(dev-lead): resolve review threads after fixing + notify CodeRabbi…
don-petry May 19, 2026
25333cf
fix(dev-lead): post @coderabbitai resolve on no-changes + enable auto…
don-petry May 20, 2026
7fe491b
fix(dev-lead): relay check_run id, verify engine CLI, improve SonarCl…
don-petry May 20, 2026
b87b92d
ci: add required ci.yml workflow
don-petry May 20, 2026
ab51cc8
feat: implement issue #233 — Phase 2: CI Failure Analyst gh-aw workfl…
don-petry May 20, 2026
9842bb0
chore(deps): bump actions/cache from 4.3.0 to 5.0.5 (#310)
dependabot[bot] May 20, 2026
db4c1a3
fix: send client_payload as JSON object via --input (was 422 string)
don-petry May 20, 2026
0ff2b58
fix: address open review findings from PR #102 (#108)
don-petry May 20, 2026
4da7f50
fix(ci): move shopt before yamllint call (fixes syntax error)
don-petry May 20, 2026
71c57c7
feat: implement issue #236 — Phase 5: Remaining gh-aw workflows (Docs…
don-petry May 20, 2026
e4b5382
fix(dev-lead): configure git user identity in fix-issue script (#326)
don-petry May 20, 2026
ce69108
feat: implement issue #232 — Phase 1: Issue Triage gh-aw workflow (#284)
don-petry May 20, 2026
906a9f3
style(ci): remove trailing blank line to fix yamllint recurring failure
don-petry May 20, 2026
0895b3d
feat: implement issue #183 — Compliance: non-stub-claude.yml (#328)
don-petry May 20, 2026
9fac31d
feat: implement issue #135 — Compliance: unpinned-actions-claude.yml …
don-petry May 21, 2026
41903e3
feat: token cost observatory — ET metric + JSONL logging (#334)
don-petry May 21, 2026
280a7e2
chore(deps): bump actions/cache from 4.3.0 to 5.0.5 (#347)
dependabot[bot] May 21, 2026
6fc8369
feat(fleet-monitor): summarize token usage by workflow (#343)
don-petry May 21, 2026
dedab94
feat(dev-lead): harden agent instructions with Plan→TDD→Verify→Rubber…
don-petry May 23, 2026
68eda18
feat: implement issue #365 — dev-lead: preserve session output in Act…
don-petry May 23, 2026
8d51c31
fix(dev-lead): visible no-changes comments, ACTOR strip, full secret …
don-petry May 23, 2026
a5ab748
add: force-deploy-pr-review workflow for branch-protection bypass
Jun 3, 2026
42fd443
add: pr-review-reusable.yml wrapper for workflow_call pattern
Jun 4, 2026
9eab1e1
fix: explicitly pass secrets in pr-review-reusable.yml workflow_call
Jun 4, 2026
f0627a7
feat: implement issue #425 — dev-lead: Incomplete issue resolution - …
don-petry Jun 4, 2026
296dd6e
debug: pr-review enumeration logging (#410)
don-petry Jun 4, 2026
a5ece6f
chore(deps): bump actions/checkout from 4 to 6 (#433)
dependabot[bot] Jun 4, 2026
c046bd2
merge: PR #353 - PR Review Agent diagnostics and transient failure ha…
Jun 4, 2026
6e0aa3d
merge: PR #422 - Add deploy-pr-review.yml workflow for branch protect…
Jun 4, 2026
2dd1e22
fix(ci): strip trailing whitespace from deploy-pr-review workflows (#…
don-petry Jun 6, 2026
25a5c53
fix: support fine-grained tokens in pr-review scope validation (#443)
don-petry Jun 6, 2026
1c7e00d
fix(dev-lead): auto-resolve outdated bot threads and treat unresolved…
don-petry Jun 6, 2026
aed2d52
feat(dev-lead): enable auto-merge (squash) by default on every PR it …
don-petry Jun 6, 2026
9210b56
fix(dev-lead): check out PR branches in an isolated worktree (#448) (…
don-petry Jun 7, 2026
4cbbf8f
feat(token-report): org-wide weekly Token Cost Observatory report (#456)
don-petry Jun 7, 2026
861da59
fix(token-metrics): key usage sidecar per-call, not by $$ (concurrenc…
don-petry Jun 7, 2026
7a211b1
fix(dev-lead): hold auto-merge while working a PR + push defensively …
don-petry Jun 7, 2026
3eaea09
fix(dev-lead): stop false "rate-limited" claims; dedupe superseded ch…
don-petry Jun 7, 2026
3b303e2
fix(engine): handle gemini quota exhaustion and capture stderr (#226)
don-petry Jun 8, 2026
37904c4
feat: implement issue #396 — Compliance: non-stub-dependency-audit.ym…
don-petry Jun 8, 2026
7e8c0a0
feat: implement issue #438 — Compliance: unpinned-actions-deploy-pr-r…
don-petry Jun 8, 2026
216fbf0
feat: implement issue #400 — petry-projects — workflow failures detec…
don-petry Jun 8, 2026
6ad5559
feat: implement issue #399 — PR Review Agent — failures detected 2026…
don-petry Jun 8, 2026
2d911e1
feat: implement issue #402 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 8, 2026
24b6637
feat: implement advisory bot review gate in pr-review agent (#458)
don-petry Jun 8, 2026
5e05cd7
feat: implement issue #404 — PR Review Agent — failures detected 2026…
don-petry Jun 8, 2026
fb0f4b6
feat: implement issue #407 — PR Review Agent — failures detected 2026…
don-petry Jun 9, 2026
f2136b6
fix(pr-review): use classic PAT for approvals, fall back to fine-grai…
don-petry Jun 9, 2026
77e7c25
feat: implement issue #511 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
8e454df
feat: implement issue #272 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
acaba64
feat: implement issue #512 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
702495e
feat: implement issue #408 — petry-projects — workflow failures detec…
don-petry Jun 10, 2026
639c966
feat: implement issue #395 — Compliance: non-stub-dev-lead.yml (#488)
don-petry Jun 10, 2026
a70e754
chore: retire deploy-pr-review, force-deploy, and pr-review-reusable …
don-petry Jun 10, 2026
443fddb
feat: implement issue #195 — bug(dev-lead): engine.sh defines multi-t…
don-petry Jun 11, 2026
359abf4
chore(frameworks): vendor BMAD Method v6.8.0 + Test Architect v1.19.0…
don-petry Jun 11, 2026
0a5a4f0
feat: implement issue #244 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 11, 2026
1facd48
fix(engine): reorder cross-provider fallback to claude → copilot → ge…
don-petry Jun 12, 2026
f884b24
feat: implement issue #574 — pr-review: PRs with >300 changed files h…
don-petry Jun 12, 2026
daa0123
feat: implement issue #68 — Compliance: check-suite-auto-trigger-1236…
don-petry Jun 13, 2026
7ef8226
feat: implement issue #638 — Feature Ideation doesn't enhance human i…
don-petry Jun 13, 2026
500f89a
chore(deps): bump the actions group across 1 directory with 8 updates…
dependabot[bot] Jun 13, 2026
904ca7c
fix(initiative-planner): restore discussion→workflow_dispatch redispa…
don-petry Jun 13, 2026
b14b16d
feat: implement issue #677 — [Phase 1] Thread an optional MCP config …
don-petry Jun 14, 2026
5e8c103
feat: implement issue #678 — [Phase 1] Graceful degradation: warn (ne…
don-petry Jun 14, 2026
834b6ae
feat: implement issue #582 — [Phase 1] Define held-out eval-case form…
don-petry Jun 14, 2026
604344b
feat: implement issue #691 — Held-out hygiene: dev/holdout eval split…
don-petry Jun 14, 2026
1fecc28
feat: implement issue #583 — deterministic eval scorer (triage) over …
don-petry Jun 14, 2026
26ebcd9
fix(pr-review-sweep): dispatch with GH_PAT_WORKFLOWS, not the bot com…
don-petry Jun 15, 2026
fb05a20
feat: implement issue #382 — Enhance dev-lead and pr-review engines f…
don-petry Jun 15, 2026
cfc547d
feat: implement issue #547 — Compliance: secret_scan_ci_job_present (…
don-petry Jun 16, 2026
b5d64c7
feat: implement issue #143 — Compliance: secret_scanning_non_provider…
don-petry Jun 16, 2026
4d531fe
feat: implement issue #695 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 17, 2026
d3fe439
feat: implement issue #604 — [Phase 3] Plan/apply split: apply consum…
don-petry Jun 18, 2026
71f244c
feat: implement issue #752 — [Phase 3] Wire the DOWNSTREAM_IMPACT blo…
don-petry Jun 19, 2026
c0aa7e8
feat: implement issue #799 — Compliance: check-suite-prefs-unreadable…
don-petry Jun 19, 2026
e61026a
fix(dev-lead): repair auto-rebase conflict detection and applied-rate…
don-petry Jun 20, 2026
03158bf
feat: implement issue #821 — Fleet stubs for idea-triage and idea-enh…
don-petry Jun 20, 2026
79dc564
feat(dev-lead): retry failed initial issue implementations, never sil…
don-petry Jun 20, 2026
b52e2f8
test(dogfood): comment-only touch to exercise downstream-impact on ne…
don-petry Jun 21, 2026
6bbda53
feat: implement issue #840 — [Phase 1] Author the LSP pilot scoping d…
don-petry Jun 21, 2026
c67f8ed
revert(dogfood): remove ci-status.sh dogfood comment + re-prove downs…
don-petry Jun 21, 2026
b8e8203
feat: implement issue #841 — [Phase 1] Freeze the comparative pilot P…
don-petry Jun 21, 2026
29fafe9
feat: implement issue #842 — [Phase 2] Wire candidate LSP-MCP server(…
don-petry Jun 21, 2026
ebafc91
feat: implement issue #843 — [Phase 2] Add the LSP finding-verificati…
don-petry Jun 21, 2026
3be2ad2
feat(pr-review): add REVIEW_MCP_DEBUG knob to surface the MCP handsha…
don-petry Jun 21, 2026
7aec7e8
docs(release): document live dev-lead next/ring channels + staged-rol…
don-petry Jun 21, 2026
01ea19a
feat(release): codify release-channel-tags ruleset + apply-rulesets.s…
don-petry Jun 21, 2026
088fb01
feat: implement issue #873 — [Phase 1] Extend cut-release.sh + releas…
don-petry Jun 21, 2026
7d7deb3
feat(release): health-gated ring promotion automation — canary-rollou…
don-petry Jun 23, 2026
fa7849e
feat: implement issue #870 — Bring #482's .github-hosted reusables un…
don-petry Jun 23, 2026
76d2fc2
feat: implement issue #773 — pr-review: rubber-duck tier broken under…
don-petry Jun 23, 2026
3037e81
feat(#846): cache the LSP index + enforce the 30s cold-start SLA with…
don-petry Jun 25, 2026
8cb4b39
feat: implement issue #844 — [Phase 3] Run the comparative pilot and …
don-petry Jun 25, 2026
583fcaf
feat: implement issue #934 — feature-ideation enhancement backfill + …
don-petry Jun 25, 2026
40c11b4
feat(#844): live LSP off-vs-on comparison runner + measurement extrac…
don-petry Jun 27, 2026
62fcfb4
feat: wire cut-release.sh cross-repo publish via gh api (#872) (#959)
don-petry Jun 27, 2026
fef345c
feat: implement issue #963 — fix(feature-ideation): add discussion→di…
don-petry Jun 27, 2026
b1c5944
feat: implement issue #967 — [Phase 2] Bootstrap wrapper: scripts/boo…
don-petry Jun 27, 2026
ef3cf40
feat: implement issue #968 — [Phase 2] Release-ring confirmation + ce…
don-petry Jun 27, 2026
3e135db
feat: implement issue #960 — feat(#844): instrument the real pr-revie…
don-petry Jun 27, 2026
da02241
feat: implement issue #876 — [Phase 3] Deprecate idea-enhancer in .gi…
don-petry Jun 27, 2026
498d613
feat: implement issue #985 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 28, 2026
49ccb78
feat: implement issue #969 — [Phase 1] Drift-guard CI: fail when temp…
don-petry Jun 28, 2026
94f06a2
feat: implement issue #970 — [Phase 3] Docs cutover + end-to-end new-…
don-petry Jun 30, 2026
2abd0a0
feat(cut-release): add --promote for ring-to-ring channel moves (#501…
don-petry Jun 30, 2026
e1da9b0
feat: implement issue #869 — [Phase 2] Promote standards/ci-standards…
don-petry Jul 1, 2026
026bb8f
feat: implement issue #305 — feat(pr-reviewer): re-implement 7 safety…
don-petry Jul 2, 2026
ffd94eb
feat: implement issue #1018 — [dev-lead timeout B/3] Catch exit-124 a…
don-petry Jul 2, 2026
8494c99
feat: implement issue #947 — P1 (#860 follow-up): don't re-invoke rat…
don-petry Jul 2, 2026
f133348
feat: implement issue #999 — Harden #993 soak-promote to spec: #548 g…
don-petry Jul 2, 2026
383733e
feat: implement issue #1025 — canary-rollout post-merge: fleet-wide e…
don-petry Jul 3, 2026
9f87ef9
feat: implement issue #1028 — [dev-lead timeout follow-up 1/3] Don't …
don-petry Jul 3, 2026
a006885
feat: implement issue #1031 — fix(#844): plumb LSP_PILOT_ENABLED env …
don-petry Jul 3, 2026
b74d8e7
feat(canary-rings): onboard the 6 #482 reusables into the registry (#…
don-petry Jul 3, 2026
e8c6678
ci(canary-rollout): list all registry agents in the dispatch input (#…
don-petry Jul 3, 2026
8c822cc
fix(pr-review): unbreak reviews — stub must not forward lsp_pilot_var…
don-petry Jul 3, 2026
f45e2af
feat: implement issue #1049 — canary-rollout evaluate mis-reports all…
don-petry Jul 3, 2026
443bf89
feat: implement issue #1054 — canary-rollout PROMOTE fails for cross-…
don-petry Jul 3, 2026
65cb1fd
chore(rulesets): repoint apply-rulesets + bootstrap to .github fleet …
don-petry Jul 3, 2026
9c12d20
feat(canary-rollout): gated scheduled fleet auto-promote (#1045 part …
don-petry Jul 3, 2026
fc736eb
fix(canary-rollout): record deployment on the promoted commit's host …
don-petry Jul 3, 2026
57f36a2
feat(canary-rollout): auto-file blocker issues + rolling dashboard fo…
don-petry Jul 3, 2026
485491b
refactor(canary-rollout): fleet-status dashboard → job summary (not a…
don-petry Jul 3, 2026
cb3dc95
feat: implement issue #1069 — canary-rollout: auto-cut a new version …
don-petry Jul 4, 2026
5626194
fix(cut-release): set a git identity before the this-repo annotated-t…
don-petry Jul 4, 2026
06d87c4
fix(canary-rollout): sync-issues must not abort under set -e when iss…
don-petry Jul 4, 2026
e2ff692
feat: implement issue #1082 — canary-rollout: no auto-discovery of un…
don-petry Jul 4, 2026
2d4430b
fix(release): unify channel-tag moves onto the gh-api/App-token path …
don-petry Jul 4, 2026
8f95c1c
fix(feature-ideation): route caller inputs through a prep job (#571) …
don-petry Jul 4, 2026
0ee9b91
chore(#613): remove relocated canary-rollout engine + bootstrap (now …
don-petry Jul 9, 2026
0d87921
chore(lsp-pilot): retire the LSP pilot after Shell NO-GO (#839, #845)…
don-petry Jul 9, 2026
b4063e4
feat: implement issue #1184 — F2: cut-release.sh learns v<major>-<tie…
don-petry Jul 13, 2026
6a09438
Add Murat persona instance — worked example for the persona standard …
don-petry Jul 14, 2026
2fc280e
feat: implement issue #1193 — pr-review advisory gate: timeout-procee…
don-petry Jul 14, 2026
f356184
feat: implement issue #1091 — [Phase 2] Issue-type classifier + speci…
don-petry Jul 14, 2026
d3efe88
feat: implement issue #723 — [Phase 1] Move all scheduled workflows o…
don-petry Jul 14, 2026
e121fad
feat: implement issue #724 — [Phase 1] Codify the off-peak scheduling…
don-petry Jul 14, 2026
f6f4e85
fix(pr-review): FORCE_REVIEW bypasses the ci-failing gate (self-host …
don-petry Jul 14, 2026
0412d67
docs: refresh org READMEs (automated) (#1239)
don-petry Jul 14, 2026
fc1a2d0
feat(readme-refresh): discover & document reporting/dashboard workflo…
don-petry Jul 14, 2026
9a7c521
feat(readme-refresh): agentic-workflow fleet, working file links, age…
don-petry Jul 15, 2026
9db5ece
docs: refresh org READMEs from live state (automated) [skip ci] (#1246)
don-petry Jul 15, 2026
af36d5b
docs: refresh org READMEs from live state (automated) [skip ci] (#1260)
don-petry Jul 15, 2026
427aaf2
feat: implement issue #1253 — [#1052 A] CI guard: forwarded caller in…
don-petry Jul 15, 2026
e95a02c
feat: implement issue #1255 — [#1052 B] Stub-freeze drift guard for r…
don-petry Jul 15, 2026
7303c98
chore: remove ContentTwin product health-check workflow (#1273)
don-petry Jul 15, 2026
44972f3
docs: refresh org READMEs (automated) (#1278)
don-petry Jul 16, 2026
173c94e
Rename murat → qa-lead and make it @-addressable (#1279)
don-petry Jul 17, 2026
8eea665
Stop using address.aliases (half 1 of 2) (#1289)
don-petry Jul 17, 2026
8c4d6a9
feat: implement issue #1311 — dev-lead fixes-and-merges PRs it did NO…
don-petry Jul 18, 2026
b692b4b
fix(dev-lead): resolve identity from persona manifest, not shared var…
don-petry Jul 19, 2026
2b94739
feat: implement issue #1340 — dev-lead fix-bot reverts its own fix on…
don-petry Jul 21, 2026
7a7dd16
feat: implement issue #1290 — PR comments from maintainers are mechan…
don-petry Jul 21, 2026
7403dea
chore: sync 1 org-standard workflow stub(s) from petry-projects/.gith…
don-petry Jul 21, 2026
9a391b9
chore: sync 1 org-standard workflow stub(s) from petry-projects/.gith…
don-petry Jul 21, 2026
eea2fa5
chore: sync 3 org-standard workflow stub(s) from petry-projects/.gith…
don-petry Jul 23, 2026
ec15f01
feat: implement issue #1349 — pr-review: register Graphite, Qodo, Cod…
don-petry Jul 24, 2026
662d308
feat: implement issue #1410 — [Phase 4] Add a stall canary + rollback…
donpetry-bot Aug 2, 2026
7c34bb1
chore: dev-lead update (review-changes) [skip ci-relay]
donpetry-bot Aug 2, 2026
64d4ae1
chore: dev-lead update (review-changes) [skip ci-relay]
donpetry-bot Aug 2, 2026
5856b27
chore: dev-lead update (review-changes) [skip ci-relay]
donpetry-bot Aug 2, 2026
c1f03f9
chore: dev-lead update (review-changes) [skip ci-relay]
donpetry-bot Aug 2, 2026
7cdf267
fix(reviews): address review comments [skip ci-relay]
donpetry-bot Aug 2, 2026
a82dfb2
fix(ci): resolve all Tier-1 CI failures — duplicate headings, case ar…
donpetry-bot Aug 2, 2026
6e1d775
fix(ci): resolve remaining Tier-1 Lint and unit failures — duplicate …
donpetry-bot Aug 2, 2026
d346906
chore: dev-lead update (review-changes) [skip ci-relay]
donpetry-bot Aug 2, 2026
ec4a29e
chore: dev-lead update (review-changes) [skip ci-relay]
donpetry-bot Aug 2, 2026
0a44919
fix(test): isolate test_engine_mcp from TOKEN_LOG_FILE env leak
Aug 2, 2026
99d3d05
fix(reviews): address review comments [skip ci-relay]
donpetry-bot Aug 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/actions-fleet-monitor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -560,6 +560,7 @@ jobs:
run: |
# github.token events do not trigger issues:labeled workflows; use the
# PAT to fire repository_dispatch so Dev-Lead Agent is explicitly woken.
# Use --input so client_payload is sent as a JSON object, not a string.
gh api "repos/${{ github.repository }}/dispatches" \
-X POST \
--input - <<EOF
Expand Down
64 changes: 64 additions & 0 deletions .github/workflows/daily-pr-review-health.yml
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,70 @@ jobs:
});
core.notice(`Runaway issue created: ${issue.data.html_url}`);

# Stall-PR detection net (#1410, epic #1402). The mirror image of the
# runaway scan above: a pure gh-API + jq sweep of every open PR for the
# SILENT failure mode the narrowed Class-2 timers (#1407/#1408) could
# introduce — a PR stuck CI-green + REVIEW_REQUIRED with no agent activity
# and no pending event, that no fast path re-fires. #860's lesson was that
# detection must be pushed, not pulled; this builds that instrument BEFORE
# the timers narrow. Detect-only — no PR is mutated. Sets HAS_STALL when any
# candidate is found, surfaced through the same health-check /
# automated-report issue channel. No new scheduled workload.
- name: Scan for stalled PRs
env:
GH_TOKEN: ${{ secrets.DON_PETRY_BOT_GH_PAT }}
REPO: ${{ github.repository }}
run: bash scripts/pr_stall_scan.sh

- name: Truncate stall report if needed
run: |
if [ -f pr_stall_report.md ]; then
if [ "$(wc -c < pr_stall_report.md)" -gt 60000 ]; then
last_line=$(awk '{s+=length($0)+1; if(s>60000){print NR-1; exit}} END{if(s<=60000) print NR}' pr_stall_report.md)
head -n "${last_line:-0}" pr_stall_report.md > pr_stall_report.md.tmp
mv pr_stall_report.md.tmp pr_stall_report.md
printf '\n\n---\n_Report truncated at 60 000 bytes._\n' >> pr_stall_report.md
Comment thread
coderabbitai[bot] marked this conversation as resolved.
fi
fi
Comment thread
don-petry marked this conversation as resolved.

- name: Create stall-candidate issue
if: env.HAS_STALL == 'true' && hashFiles('pr_stall_report.md') != ''
uses: actions/github-script@3a2844b7e9c422d3c10d287c895573f7108da1b3 # v9.0.0
with:
github-token: ${{ github.token }}
script: |
Comment thread
qodo-code-review[bot] marked this conversation as resolved.
const fs = require('fs');
const report = fs.readFileSync('pr_stall_report.md', 'utf8');
if (!report.trim()) {
core.setFailed('Stall report file is empty');
return;
}
const today = new Date().toISOString().split('T')[0];
const titlePrefix = 'Stalled PR candidate(s) detected';
// Date-stamped title → a fresh issue every run. Close prior open ones.
const priors = await github.paginate(github.rest.issues.listForRepo, {
owner: context.repo.owner, repo: context.repo.repo,
state: 'open', labels: 'health-check,automated-report', per_page: 100,
});
for (const p of priors) {
if (!p.pull_request && p.title.startsWith(titlePrefix)) {
try {
await github.rest.issues.update({
owner: context.repo.owner, repo: context.repo.repo,
issue_number: p.number, state: 'closed', state_reason: 'completed',
});
} catch (err) { core.warning(`could not close prior digest #${p.number}: ${err.message}`); }
}
}
const issue = await github.rest.issues.create({
owner: context.repo.owner,
repo: context.repo.repo,
title: `${titlePrefix} ${today}`,
body: report,
labels: ['health-check', 'automated-report'],
});
core.notice(`Stall issue created: ${issue.data.html_url}`);

# Durable, affirmative MCP-connectivity monitor (#903, part of #676).
# Additive final step: when .github/review-mcp.json is present, assert that
# the configured server(s) handshake through the same flags engine.sh uses
Expand Down
2 changes: 2 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,8 @@
tests/test_pr_automation_budget.bats \
tests/test_pr_runaway_regression.bats \
tests/test_pr_runaway_detect.bats \
tests/test_pr_stall_detect.bats \
tests/test_pr_stall_regression.bats \
tests/test_premature_closure_detect.bats \
tests/test_ci_status.bats \
tests/test_push_protection.bats \
Expand Down Expand Up @@ -194,7 +196,7 @@
timeout-minutes: 5
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
# NOTE: persist-credentials is intentionally left at the default (true) —

Check warning on line 199 in .github/workflows/lint.yml

View workflow job for this annotation

GitHub Actions / Lint

199:9 [comments-indentation] comment not indented like content
# vci_resolve_reusable needs `git fetch origin` to authenticate against this
# private repo when resolving same-repo channel tags. Setting
# persist-credentials: false would silently push every such caller into the
Expand Down
12 changes: 12 additions & 0 deletions .github/workflows/pr-review-sweep.yml
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,18 @@ jobs:
exit 1
fi

- name: Guard — workflow-dispatch PAT present
# Without a workflow/actions:write PAT every dispatch returns HTTP 403 and
# the sweep "succeeds" while re-triggering nothing (the original #573 gap
# regression). Fail loudly instead of silently no-op'ing.
env:
GH_TOKEN: ${{ secrets.GH_PAT_DON_PETRY || secrets.GH_PAT_WORKFLOWS }}
run: |
if [ -z "${GH_TOKEN}" ]; then
echo "::error::GH_PAT_WORKFLOWS is required — GITHUB_TOKEN cannot start a dispatched run and the bot comment PAT lacks actions:write."
exit 1
fi

Comment thread
coderabbitai[bot] marked this conversation as resolved.
- name: Run stuck-review sweep
env:
# PAT with workflow/actions:write scope required: GITHUB_TOKEN cannot
Expand Down
81 changes: 81 additions & 0 deletions .github/workflows/pr-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,13 @@ on:
# migrates to `secrets: inherit`, after which they can be dropped (issue #1327).
COPILOT_GITHUB_TOKEN:
required: false
GH_PAT_DON_PETRY_COPILOT:
# don-petry's Copilot-subscription PAT (Copilot review engine). Canonical
# name under the GH_PAT_<ACCOUNT> schema; supersedes GH_PAT (below, kept as
# a transition fallback). The bot's own PATs keep their grandfathered names.
required: false
GH_PAT:
# DEPRECATED alias of GH_PAT_DON_PETRY_COPILOT — kept during migration.
Comment thread
coderabbitai[bot] marked this conversation as resolved.
required: false
DON_PETRY_BOT_GH_PAT:
required: false
Expand Down Expand Up @@ -314,6 +320,81 @@ jobs:
fi
fi

- name: Cache claude-code CLI
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5.0.5
with:
path: ~/.npm-global
key: claude-code-${{ env.CLAUDE_CODE_VERSION }}-${{ runner.os }}

- name: Verify auth scopes
# Inlined from scripts/verify-auth-scopes.sh so this step is self-contained
# when pr-review.yml is deployed to target repos that do not have the scripts/ dir.
run: |
set -euo pipefail

if auth_status="$(gh auth status 2>&1)"; then
:
else
auth_rc=$?
printf '%s\n' "$auth_status"
echo "::error::gh auth status failed"
exit "$auth_rc"
fi
printf '%s\n' "$auth_status"

# Fine-grained PATs are NOT supported — they fail at addPullRequestReview.
# Two detection methods: (1) prefix in auth status output; (2) gh auth token
# for gh versions that mask the prefix in status output (token never logged).
_fgpat=0
if grep -qi 'Token:.*github_pat_' <<< "$auth_status"; then
_fgpat=1
else
_tok="$(gh auth token 2>/dev/null || true)"
if [[ "${_tok:-}" == github_pat_* ]]; then
_fgpat=1
fi
unset _tok
fi
if [[ "$_fgpat" -eq 1 ]]; then
unset _fgpat
echo "::error::Fine-grained PAT detected — fine-grained PATs are not supported by this workflow."
echo "::error::Fine-grained PATs fail at addPullRequestReview (GraphQL: Resource not accessible by personal access token)."
echo "::error::Replace DON_PETRY_BOT_GH_PAT with a classic PAT that has repo, workflow, and read:org scopes."
echo "::error::See docs/pr-review-agent/setup.md → Troubleshooting for details."
exit 1
fi
unset _fgpat

scopes_line="$(grep 'Token scopes:' <<< "$auth_status" || true)"
normalized_scopes="${scopes_line//,/ }"
normalized_scopes="${normalized_scopes//$'\''/ }"

if [ -z "$normalized_scopes" ] || grep -qiE '(cannot determine|fine.grained)' <<< "$auth_status"; then
echo "::warning::Token scopes could not be determined. Skipping scope validation."
echo "::warning::Ensure the token has: repo + read:org (classic PAT) or contents + pull_requests:write."
exit 0
fi

if grep -qE "(^|[[:space:]])repo([[:space:]]|$)" <<< "$normalized_scopes"; then
if ! grep -qE "(^|[[:space:]])read:org([[:space:]]|$)" <<< "$normalized_scopes"; then
echo "::error::GH_TOKEN has 'repo' scope but is missing 'read:org'."
echo "::error::PRs with team-based reviewers will fail at 'gh pr view --json reviewRequests'."
echo "::error::Edit the classic PAT and check the 'read:org' box (no regeneration needed)."
exit 1
fi
else
if ! grep -qE "(^|[[:space:]])contents(:[^[:space:]]+)?([[:space:]]|$)" <<< "$normalized_scopes"; then
echo "::error::GH_TOKEN is missing required scope: contents"
echo "::error::Token must have either 'repo' + 'read:org' (classic) or 'contents' + 'pull_requests:write'"
exit 1
fi
if ! grep -qE "(^|[[:space:]])pull_requests(:write)?([[:space:]]|$)" <<< "$normalized_scopes"; then
echo "::error::GH_TOKEN is missing required scope: pull_requests with write access"
echo "::error::Token must have either 'repo' + 'read:org' (classic) or 'contents' + 'pull_requests:write'"
exit 1
fi
fi

Comment thread
coderabbitai[bot] marked this conversation as resolved.
- name: Install review engine CLIs
run: |
set -euo pipefail
Expand Down
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ Agent profiles in `/agents/` are available org-wide — invocable from GitHub.co
It also contains automated workflows (GitHub Actions agents running on events and schedules),
prompts, scripts, and the scheduled reporting dashboards that run across the org.

It also contains the scheduled PR review automation (workflows + scripts + prompts) that runs hourly across the org.

Comment thread
coderabbitai[bot] marked this conversation as resolved.
## Structure

```
Expand Down
82 changes: 82 additions & 0 deletions docs/agentic-interaction-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -492,3 +492,85 @@ update the table (and the role's §8 contract) in the same PR, or CI fails.
The table's exact shape is fixed **here** (this document is the normative source); #1406
consumes it. If the shape must change, it changes here first and #1406's fixtures change with
it — never the reverse.

---

## 11. Narrowing the Class-2 backstop timers — stall detector, rollback trigger, monitoring window

The Class-2 backstop timers that reconcile un-eventable transitions — `pr-review-sweep.yml`
(§4, `backstop`) and `dev-lead-retry.yml` (§4, `self-heal`, the §6.3 leak) — are slated to be
**narrowed** (#1407 / #1408) to cut the redundant fan-out they produce. Narrowing a safety net
is exactly the pattern the #860 post-mortem warns against: it can trade a *known, noisy* failure
mode (over-firing) for an *unknown, silent* one (a genuinely un-eventable transition that no fast
path re-fires and, once the cron is narrowed, nothing sweeps). #1410 therefore builds the
instrument **before** the net is narrowed, and defines the rollback path here so the decision is
explicit, not tribal.

### 11.1 The stall detector (the instrument)

`scripts/lib/pr-stall-detect.sh` is a **detect-only** pure lib (mirroring
`scripts/lib/pr-runaway-detect.sh`, §9 rule 2) — it never labels, comments, or halts. It flags an
open PR that is **CI-green + `REVIEW_REQUIRED`, not reviewed at head, with no agent activity and no
pending triggering event, idle longer than `STALL_MIN_AGE_MINUTES` (default 30 min — double the
sweep's ≤15-min backstop cadence; **#1408 must re-derive this default when the sweep cadence
is narrowed** so it remains ≥ 2× the new backstop interval)**. It is **fail-quiet on intentional stops**: a PR carrying
`needs-human-review` (checked via `pr_has_escalation_label`, §6.2.3), `dev-lead:hands-off`, or
`initiative:hold` (checked via a `STALL_HOLD_LABELS` loop) is never reported. The
`<!-- pr-automation-budget exhausted -->` marker is **not inspected directly** — it is excluded
only because budget exhaustion simultaneously applies `needs-human-review`; the marker alone does
not gate stall detection, preserving re-engagement for PRs that have the marker but no hold label. `scripts/pr_stall_scan.sh` runs it over every open PR as an
**additive step on the existing `daily-pr-review-health.yml`** and surfaces any candidate through
the same health-check / automated-report issue channel — **no new scheduled workload** (§1: this
adds a pushed signal and a documented human decision, not another automated brake). This is the
push detection §7 rule 7 requires: the un-eventable green transition the narrowed cron would drop
is caught here and **still resolves** (surfaced → human/backstop acts) instead of stalling unseen.
Comment thread
coderabbitai[bot] marked this conversation as resolved.

### 11.2 The rollback trigger (the condition)

**Trigger condition.** Roll back the narrowing if the stall detector reports **≥ 2 distinct
stalled PRs within any rolling 24-hour window**, *or* **any single PR stalled for ≥ 4 hours** (≈8×
the default threshold), during the monitoring window (§11.4). Either signal means the narrowed
timer let a genuinely un-eventable transition sit unresolved — the silent failure mode the
narrowing risked. A stall that is later explained by a human-gate marker does **not** count (it is
excluded by design and never reported). One transient single-PR stall under the 4-hour bar is a
watch item, not a revert.

Both thresholds are deliberately low: the cost of a false rollback is a return to the *known* noisy
state (fully recoverable), while the cost of tolerating a silent stall is the #860 blindness. When
in doubt, revert.

### 11.3 The revert procedure (the exact steps)

The narrowing lands as one or more PRs that edit the `schedule.cron` (and/or the `workflow_run`
scoping) of `pr-review-sweep.yml` / `dev-lead-retry.yml`. To revert:

1. **Identify** the merged narrowing PR(s) for #1407 / #1408 (labelled against those issues).
2. **Revert** them — `git revert <merge-sha>` for each, in reverse merge order — restoring
`pr-review-sweep.yml`'s guaranteed backstop cadence (`schedule: '2,17,32,47 * * * *'`, ≤15 min)
and `dev-lead-retry.yml`'s `schedule: '15 */2 * * *'`. Do **not** hand-edit the cron to a
guessed value; restore the exact pre-narrowing lines from history so the backstop returns to its
proven state.
3. **Open the revert PR** referencing the triggering stall issue(s), and confirm CI green +
`validate-workflow-schedules` passing (the restored crons are non-minute-0, AGENTS.md
"Scheduled workflows").
4. **Verify recovery**: after merge, confirm the previously-stalled PR(s) get re-reviewed on the
next backstop tick and the daily stall scan returns to all-clear.
5. **Record** the rollback as a comment on the epic (#1402) and this story (#1410) — the go/no-go
audit trail this repo uses for every safety-net change (mirrors the fleet-remediation
human-gate record in AGENTS.md). Reverting is the *expected*, low-cost response to the trigger,
not an incident.

### 11.4 The monitoring window (how long, who checks)

**Window.** The narrowed timers run under observation for **14 days** after the narrowing merges
(≥14 daily stall-scan runs — a full two weeks covers weekday *and* weekend PR cadence, since some
un-eventable transitions only appear under low-traffic conditions). The change is considered
**settled** only after 14 consecutive days with **zero** rollback-trigger hits (§11.2).

**Who/what checks.** The **daily `daily-pr-review-health.yml` stall scan** is the automated watcher
— it is the pushed signal, so no human has to remember to look (the #860 anti-pattern). A stall
candidate opens a `health-check` / `automated-report` issue labelled for **dev-lead** attention,
which is the human checkpoint. During the 14-day window, treat any stall-candidate issue as a
rollback decision per §11.2 rather than a routine triage item. After the window settles, the stall
Comment thread
coderabbitai[bot] marked this conversation as resolved.
scan remains as a **permanent** detector (it is cheap and detect-only) — settling ends the
*heightened* watch, not the instrument.
36 changes: 36 additions & 0 deletions docs/initiatives/idea-to-initiative-pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,42 @@ inputs.
marker) — the idempotency guarantee that let the standalone `idea-enhancer`
be retired (#876).

There is exactly **one** Discussion-triggered enhancer. The standalone
`idea-enhancer.yml` (with its `scripts/idea-enhancer/` tooling) has been
**removed** (#876) now that its capability is fully folded into the
`feature-ideation` reusable workflow (epic #872) — so a human-authored idea is
enhanced **once**, never twice.

For each open, human-authored, not-yet-enhanced **Ideas** Discussion the folded
enhancer posts **one** comment (sharpened problem/goal, repo + market context,
impact/effort, suggested acceptance criteria). Bot-authored ideas are skipped —
they are already AI-generated. It never approves, labels, or promotes — that
stays with triage and the human gates.

The enhancement logic lives in the **central** reusable `petry-projects/.github`
(`feature-ideation-reusable.yml`); `.github-private` ships only the thin
`feature-ideation.yml` caller stub (pinned to the `@feature-ideation/next`
dogfood ring), which exposes the enhancement modes as `workflow_dispatch`
inputs.

- **Backfill sweep** — dispatch `feature-ideation` with `enhance_backlog: true`.
It sweeps the target repo's open, human-authored, not-yet-enhanced **Ideas**
Discussions and posts **exactly one** structured enhancement comment each.
Bot-authored and already-enhanced ideas are skipped. This is the safety-net
backfill that catches human ideas added before the folded enhancer went live.
- **Dry-run** — dispatch with `dry_run: true` **and** `enhance_backlog: true`.
Every intended per-Discussion enhancement comment is logged to the JSONL
artifact and **nothing** is posted (one artifact entry per candidate
Discussion). The dry-run is free of model spend beyond candidate gathering.
- **Marker continuity (cutover-safe).** The idempotency check honors **both**
the legacy `<!-- idea-enhancer:enhanced -->` marker and the canonical
`<!-- feature-ideation:enhanced -->` marker; new enhancement comments emit the
single canonical marker. So **no** idea enhanced by the old `idea-enhancer` is
re-enhanced after the cutover, and a repeated backfill is a no-op.
- **Cost.** Operator-triggered (`workflow_dispatch`), **no new cron** — the
backfill reuses `feature-ideation`'s existing model budget and 20-minute
timeout, so it is cost-neutral-to-reducing.

Comment thread
coderabbitai[bot] marked this conversation as resolved.
### `idea-triage.yml` — weekly ripeness shortlist
- Scans every open **Ideas** Discussion, scores each **Ripe / Soon / Not yet**
on evidence, prerequisites, alignment, coverage, and freshness.
Expand Down
Loading
Loading