Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
652 commits
Select commit Hold shift + click to select a range
cddea46
docs: add CLAUDE.md with repo-specific Claude Code instructions
don-petry May 11, 2026
4c723d9
feat: add Gemini Pro support and optimize PR review fallback chain (#…
don-petry May 11, 2026
8ea45e0
revert: remove CLAUDE.md (added in error, not required)
don-petry May 11, 2026
ff26805
fix(pr-review): correct bot username to donpetry-bot (no hyphen) (#100)
don-petry May 11, 2026
d5bede9
fix(post-review): treat 'skip' decision as no-op (exit 100)
don-petry May 11, 2026
cbf9ac8
fix(claude): sync inlined workflow with org standard (#109)
don-petry May 11, 2026
6441486
ci: replace inlined claude.yml with standard thin-caller stub
don-petry May 11, 2026
d2c057f
fix: pin actions/checkout to SHA in pr-review.yml (#74)
don-petry May 11, 2026
ad4ba4c
fix: per-PR isolation and single-review retry (closes #132) (#133)
don-petry May 12, 2026
cf3b8f7
fix: embed idempotency marker in fix-request PR comments (#134)
don-petry May 12, 2026
a5ffadf
fix: replace gh copilot suggest with GitHub Models REST API (#151)
don-petry May 12, 2026
8a8bcf6
feat: prioritise .github/.github-private PRs, oldest-first within tie…
don-petry May 13, 2026
16d6454
ci: add cron entries at :22, :37, :52 to ensure hourly runs
don-petry May 13, 2026
8c015d4
fix: restore pr-review.yml content (accidentally emptied in revert)
don-petry May 13, 2026
87b1bd2
fix: restore pr-review.yml (file was accidentally emptied)
don-petry May 13, 2026
4ad98d7
fix: tighten rate-limit detector, add is_cli_error, route CLI errors …
don-petry May 13, 2026
bc67259
fix: add github-actions ecosystem to dependabot config (#76)
don-petry May 13, 2026
04074b8
chore(deps): bump actions/cache from 4 to 5 (#165)
dependabot[bot] May 13, 2026
a1ca7c0
chore(deps): bump actions/setup-node from 4.4.0 to 6.4.0 (#167)
dependabot[bot] May 13, 2026
b98e6ec
chore(deps): bump actions/github-script from 7.1.0 to 9.0.0 (#162)
dependabot[bot] May 13, 2026
3f493dc
chore(deps): bump petry-projects/.github/.github/workflows/claude-cod…
dependabot[bot] May 13, 2026
3dea25b
chore(deps): bump actions/checkout from 4 to 6 (#171)
dependabot[bot] May 13, 2026
2de9708
fix: add Gemini pre-flight check and engine availability summary (#150)
don-petry May 13, 2026
499da73
fix(list-prs): search DELEGATION_ORGS and drop --checks success pre-f…
don-petry May 13, 2026
4556e2f
fix: add push-protection baseline to .gitignore (#89)
don-petry May 14, 2026
e003d50
docs(dev-lead): add agent architecture specification
don-petry May 15, 2026
53ca4ba
docs(dev-lead): add detailed implementation plan with unit and e2e tests
don-petry May 15, 2026
9c699c9
docs(dev-lead): rubber-duck review — v2 plan with cross-repo, prompts…
don-petry May 15, 2026
6d5bfd0
feat(prompts/dev-lead): add fix-bot-comment prompt template
don-petry May 15, 2026
c16c4be
feat(prompts/dev-lead): add fix-ci prompt template
don-petry May 15, 2026
096eb9e
feat(prompts/dev-lead): add fix-reviews prompt template
don-petry May 15, 2026
6a13bac
feat(prompts/dev-lead): add human prompt template
don-petry May 15, 2026
1abd8f6
feat(prompts/dev-lead): add human-pr prompt template
don-petry May 15, 2026
0e1a2e0
feat(prompts/dev-lead): add fix-issue prompt template
don-petry May 15, 2026
c1e99f6
feat(prompts/dev-lead): add rebase prompt template
don-petry May 15, 2026
3d5a477
feat(dev-lead): implement dev-lead agent Phases 0-6
don-petry May 15, 2026
861a1e3
feat(dev-lead): Phase 1.5 — reusable workflow for cross-repo adoption…
don-petry May 15, 2026
3312a01
fix(dev-lead): replace fromJson(INTENT_CONTEXT) with pre-parsed env vars
don-petry May 15, 2026
afc78c9
fix(dev-lead): remove step-level INTENT_TYPE env overrides shadowing …
don-petry May 15, 2026
6c082dd
fix(dev-lead): PR-level exhaustion guard prevents token waste on larg…
don-petry May 15, 2026
f95f43c
temp: push workflow to main for dispatch test
don-petry May 16, 2026
d5ac796
temp: sync workflow on main for dispatch test
don-petry May 16, 2026
ced3743
temp: sync workflow on main for dispatch test
don-petry May 16, 2026
547f5c4
temp: sync to main for dispatch
don-petry May 16, 2026
2bc00d3
fix(dev-lead): rate-limit detection, separate status, and retry cron …
don-petry May 16, 2026
45dccc6
docs(pr-review-agent): document read:org requirement for team review …
don-petry May 16, 2026
63b4394
feat: Actions Fleet Monitor — pure telemetry, shim interface, docs, l…
don-petry May 17, 2026
831982b
fix(post-pr-review): insert verdict findings into fix-request comment…
don-petry May 17, 2026
b36ca92
fix(pr-review): handle Gemini trust-mode failure and properly route e…
don-petry May 17, 2026
0cd4bbb
fix: resolve YAML syntax error in dev-lead-reusable workflow
May 17, 2026
eeb838c
fix: address automated feedback from PR 217 (#219)
don-petry May 17, 2026
99cdbed
fix(ci): ensure gemini-cli installs in reusable dev-lead workflow (#220)
don-petry May 17, 2026
1895030
chore: remove Phase 7 shadow period comment from dev-lead.yml
don-petry May 17, 2026
da7b243
fix(dev-lead): resolve context loss, missing checkout, and push logic…
don-petry May 17, 2026
6069baa
test: bypass CI check
May 17, 2026
93ea649
fix(pr-review): remove CI bypass hack
May 17, 2026
075e6f3
fix(dev-lead): use heredoc for multiline environment variables (#224)
don-petry May 17, 2026
b2869e9
fix(dev-lead): detect engine-committed changes and remove commit inst…
May 18, 2026
840803d
feat(concurrency): serialize dev-lead to one active run per repo (#278)
don-petry May 18, 2026
feeefc4
fix(dev-lead): address PR review findings — untracked files, upstream…
May 18, 2026
b746413
feat(fleet-monitor): track high-failure workflows as GitHub Issues
don-petry May 18, 2026
82482ba
fix(pr-review): robust engine fallback and context optimization (#227)
don-petry May 18, 2026
9802fbe
fix(dev-lead): handle SonarQube Quality Gate failures (issue #279) (#…
don-petry May 19, 2026
f5449cc
fix(dev-lead): configure git identity, surface commit/push failures, …
don-petry May 19, 2026
c716adc
fix(dev-lead): resolve review threads after fixing + notify CodeRabbi…
don-petry May 19, 2026
61f162a
fix(dev-lead): add chatgpt-codex-connector[bot] to TRUSTED_BOTS + fix…
don-petry May 19, 2026
1f15ef1
feat: implement issue #292 — fix(dev-lead): expose DEEP_TIMEOUT_SEC r…
don-petry May 19, 2026
c235aa3
feat: implement issue #294 — fix(dev-lead): expose ACTION_TIMEOUT_SEC…
don-petry May 20, 2026
df6cb2d
fix(dev-lead): post @coderabbitai resolve on no-changes + enable auto…
don-petry May 20, 2026
8e70502
feat(pr-review): replace cron schedule with event-driven triggers
don-petry May 20, 2026
37828f6
fix(dev-lead): relay check_run id, verify engine CLI, improve SonarCl…
don-petry May 20, 2026
a53d5f3
fix(health-check): pin claude-code version via cache, surface CLI errors
don-petry May 20, 2026
2f7783b
fix(security): expand .gitignore to comprehensive secrets baseline
don-petry May 20, 2026
a037844
ci: add required ci.yml workflow
don-petry May 20, 2026
40d0f81
feat: implement issue #233 — Phase 2: CI Failure Analyst gh-aw workfl…
don-petry May 20, 2026
22d1ac6
chore(deps): bump actions/cache from 4.3.0 to 5.0.5 (#310)
dependabot[bot] May 20, 2026
3f64e8a
chore(deps): bump actions/checkout from 4.3.1 to 6.0.2 (#311)
dependabot[bot] May 20, 2026
dc149a1
chore(deps): bump github/gh-aw-actions from 0.74.4 to 0.74.6 (#309)
dependabot[bot] May 20, 2026
d4d9314
fix: replace all DON_PETRY_BOT_GH_PAT usages with GH_PAT_WORKFLOWS
don-petry May 20, 2026
403cae2
fix(pr-review): route check_suite events to per-PR concurrency slot (…
don-petry May 20, 2026
162214f
fix: address open review findings from PR #102 (#108)
don-petry May 20, 2026
b4b131d
fix(ci): move shopt before yamllint call (fixes syntax error)
don-petry May 20, 2026
b0baab8
feat: implement issue #234 — Phase 3: Stale Manager and Release Notes…
don-petry May 20, 2026
6cd0fb1
feat: implement issue #235 — Phase 4: Cross-org deployment of gh-aw w…
don-petry May 20, 2026
63e7733
feat: implement issue #236 — Phase 5: Remaining gh-aw workflows (Docs…
don-petry May 20, 2026
372687f
fix(dev-lead): configure git user identity in fix-issue script (#326)
don-petry May 20, 2026
f88d272
feat(fleet-monitor): enrich report tables with icons, issue links, an…
don-petry May 20, 2026
472838b
feat: implement issue #232 — Phase 1: Issue Triage gh-aw workflow (#284)
don-petry May 20, 2026
4e07065
style(ci): remove trailing blank line to fix yamllint recurring failure
don-petry May 20, 2026
d188548
feat: implement issue #183 — Compliance: non-stub-claude.yml (#328)
don-petry May 20, 2026
f8524c6
feat: implement issue #142 — Compliance: secret_scanning_ai_detection…
don-petry May 20, 2026
5b42672
fix(aw): replace ubuntu-slim with ubuntu-latest in ci-failure-analyst…
don-petry May 20, 2026
da118d5
feat: implement issue #135 — Compliance: unpinned-actions-claude.yml …
don-petry May 21, 2026
8b4da17
feat(fleet-monitor): raise issues in the repo they pertain to (#331)
don-petry May 21, 2026
c254736
ci: use CLAUDE_CODE_OAUTH_TOKEN secret in ci-failure-analyst
don-petry May 21, 2026
254754f
feat: implement issue #338 — [Fleet Monitor] petry-projects/.github-p…
don-petry May 21, 2026
448e536
fix(aw): update frontmatter_hash and compiler_version to v0.74.6 in c…
don-petry May 21, 2026
363c93f
feat: token cost observatory — ET metric + JSONL logging (#334)
don-petry May 21, 2026
68284ee
revert(aw): restore ANTHROPIC_API_KEY secret in ci-failure-analyst
don-petry May 21, 2026
8dede52
chore(deps): bump actions/cache from 4.3.0 to 5.0.5 (#347)
dependabot[bot] May 21, 2026
57c9ac9
chore(deps): bump anthropics/claude-code-action from 1.0.124 to 1.0.1…
dependabot[bot] May 21, 2026
7d2582c
chore(deps): bump actions/checkout from 4.3.1 to 6.0.2 (#350)
dependabot[bot] May 21, 2026
46aa910
chore(deps): bump github/gh-aw-actions from 0.74.6 to 0.74.9 (#351)
dependabot[bot] May 21, 2026
216a4a8
feat(aw): rewrite ci-failure-analyst to use CLAUDE_CODE_OAUTH_TOKEN (…
don-petry May 21, 2026
53f76ed
feat(fleet-monitor): summarize token usage by workflow (#343)
don-petry May 21, 2026
39b53f1
feat(aw): make CI Failure Analyst org-wide via reusable workflow (#367)
don-petry May 23, 2026
4018355
fix(ci-analyst): pin reusable ref to post-merge main SHA
don-petry May 23, 2026
bdcd57b
feat(dev-lead): harden agent instructions with Plan→TDD→Verify→Rubber…
don-petry May 23, 2026
81efad8
feat: implement issue #365 — dev-lead: preserve session output in Act…
don-petry May 23, 2026
e2fb754
fix(dev-lead): visible no-changes comments, ACTOR strip, full secret …
don-petry May 23, 2026
46ab667
fix(dev-lead): resolve outdated threads in no-changes; marker-based s…
don-petry May 23, 2026
baaedc0
add: force-deploy-pr-review workflow for branch-protection bypass
Jun 3, 2026
bedba0e
fix: revert .gitignore changes before git checkout to prevent workflo…
Jun 4, 2026
7e5af13
add: pr-review-reusable.yml wrapper for workflow_call pattern
Jun 4, 2026
41df9aa
fix: add workflow_call trigger to pr-review.yml for reusable workflow…
Jun 4, 2026
cc56c26
fix: explicitly pass secrets in pr-review-reusable.yml workflow_call
Jun 4, 2026
1e09d96
feat: implement issue #425 — dev-lead: Incomplete issue resolution - …
don-petry Jun 4, 2026
8c024ea
fix: preserve PR_NUMBER in skip intents for pull_request_review events
donpetry-bot Jun 4, 2026
78e67b5
feat: implement issue #423 — Enhance agentic development environment …
don-petry Jun 4, 2026
e3d4a13
debug: pr-review enumeration logging (#410)
don-petry Jun 4, 2026
0ffe849
chore(deps): bump actions/checkout from 4 to 6 (#433)
dependabot[bot] Jun 4, 2026
7d12a65
chore(deps): bump anthropics/claude-code-action from 1.0.133 to 1.0.1…
dependabot[bot] Jun 4, 2026
f6c2280
merge: PR #353 - PR Review Agent diagnostics and transient failure ha…
Jun 4, 2026
e9697b6
merge: PR #422 - Add deploy-pr-review.yml workflow for branch protect…
Jun 4, 2026
9e0955a
fix(ci): strip trailing whitespace from deploy-pr-review workflows (#…
don-petry Jun 6, 2026
ba0ee7f
chore(dev-lead): retire the legacy `claude` issue-trigger label (#444)
don-petry Jun 6, 2026
e4ed9e1
fix: support fine-grained tokens in pr-review scope validation (#443)
don-petry Jun 6, 2026
da5059e
fix(dev-lead): auto-resolve outdated bot threads and treat unresolved…
don-petry Jun 6, 2026
46b84fd
fix(dev-lead): trust chatgpt-codex-connector[bot] in the reusable wor…
don-petry Jun 6, 2026
424ef5e
fix(dev-lead): per-issue/per-PR concurrency lanes so pickups aren't c…
don-petry Jun 7, 2026
a96a27e
fix(dev-lead): check out PR branches in an isolated worktree (#448) (…
don-petry Jun 7, 2026
bf147c0
feat(dev-lead): dev-lead:hands-off label to exclude infra PRs from th…
don-petry Jun 7, 2026
787f0a5
test(dev-lead): assert per-issue/per-PR concurrency lanes (align with…
don-petry Jun 7, 2026
6f3c5e9
feat(token-report): org-wide weekly Token Cost Observatory report (#456)
don-petry Jun 7, 2026
6c28ae2
fix(token-metrics): key usage sidecar per-call, not by $$ (concurrenc…
don-petry Jun 7, 2026
bbaa030
fix(dev-lead): hold auto-merge while working a PR + push defensively …
don-petry Jun 7, 2026
1511752
fix(pr-review): count only non-converging review cycles; make escalat…
don-petry Jun 7, 2026
a138e73
feat(token-report): 2-decimal USD, cost-per-day chart, PR titles (#465)
don-petry Jun 7, 2026
215d1b1
fix(compliance): add CLAUDE.md and dependabot.yml (#152)
don-petry Jun 8, 2026
187abfb
fix(engine): handle gemini quota exhaustion and capture stderr (#226)
don-petry Jun 8, 2026
52fbb2b
feat: implement issue #431 — [Fleet Monitor] petry-projects/.github-p…
donpetry-bot Jun 8, 2026
15c3292
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Jun 8, 2026
af35e4e
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 8, 2026
014fd80
feat: implement issue #469 — pr-review: mention-triggered runs silent…
don-petry Jun 8, 2026
484eadc
feat: implement issue #393 — Compliance: missing-permissions-issue-tr…
don-petry Jun 8, 2026
7a008c4
feat: implement issue #401 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 8, 2026
46f909f
feat: implement issue #396 — Compliance: non-stub-dependency-audit.ym…
don-petry Jun 8, 2026
680b2ec
feat: implement issue #438 — Compliance: unpinned-actions-deploy-pr-r…
don-petry Jun 8, 2026
567bca5
feat: implement issue #400 — petry-projects — workflow failures detec…
don-petry Jun 8, 2026
a0edcbf
feat: implement issue #399 — PR Review Agent — failures detected 2026…
don-petry Jun 8, 2026
72f710b
feat: implement issue #398 — Compliance: secret_scanning_ai_detection…
don-petry Jun 8, 2026
283fa6f
feat: implement issue #402 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 8, 2026
2a0cd02
feat: implement advisory bot review gate in pr-review agent (#458)
don-petry Jun 8, 2026
674f0d2
feat: implement issue #404 — PR Review Agent — failures detected 2026…
don-petry Jun 8, 2026
b24882f
fix(dev-lead): release stale PR-branch worktrees before checkout (#47…
don-petry Jun 8, 2026
6e12e0d
feat(initiative): dependency-aware driver to deliver epics agenticall…
don-petry Jun 9, 2026
5cfddc5
feat: implement issue #407 — PR Review Agent — failures detected 2026…
don-petry Jun 9, 2026
7d16b2c
feat(release): versioning scheme + cut-release helper (#496) (#508)
don-petry Jun 9, 2026
db3eca1
docs: Safe Release Strategy for Agentic Workflows — initiative analys…
don-petry Jun 9, 2026
abf234c
feat(pr-review): add agent_ref input for pinned self-checkout (#497/#…
don-petry Jun 9, 2026
1ae01d7
feat(pr-review): self-host pin via trigger stub — reusable-only (#497…
don-petry Jun 9, 2026
4ca995a
fix(pr-review): use classic PAT for approvals, fall back to fine-grai…
don-petry Jun 9, 2026
27ef2a8
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Jun 10, 2026
7828af9
fix(ci-status): filter the cascade's nested 'review / review' own-che…
don-petry Jun 10, 2026
5c913d9
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 10, 2026
aa75824
feat: implement issue #337 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
bb0ecb8
feat: implement issue #409 — petry-projects — workflow failures detec…
don-petry Jun 10, 2026
f36696d
feat: implement issue #511 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
539ce76
feat: implement issue #272 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
662acf9
feat: implement issue #512 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
f641a84
feat: implement issue #408 — petry-projects — workflow failures detec…
don-petry Jun 10, 2026
b3461b7
feat(dev-lead): add agent_ref input for pinned script checkout (#535/…
don-petry Jun 10, 2026
595dc89
fix(pr-review): checkout the agent repo explicitly, not the caller (#…
don-petry Jun 10, 2026
3da9845
feat: implement issue #395 — Compliance: non-stub-dev-lead.yml (#488)
don-petry Jun 10, 2026
fa66e86
fix(ci-status): filter own-checks by workflowName (covers consumer fo…
don-petry Jun 10, 2026
5c8e53e
chore: retire deploy-pr-review, force-deploy, and pr-review-reusable …
don-petry Jun 10, 2026
f12ac52
fix(pr-review): stop cancelling racing same-PR review runs (#534) (#543)
don-petry Jun 10, 2026
0e36800
fix(dev-lead): self-host pin to @dev-lead/stable + agent_ref (#535) (…
don-petry Jun 10, 2026
dbdbfb2
docs(release): cut/promote/rollback runbook (#498) (#558)
don-petry Jun 10, 2026
0db55fe
fix(dev-lead): write multiline INTENT_BODY with heredoc delimiter (#5…
don-petry Jun 11, 2026
9db0e4a
feat: implement issue #195 — bug(dev-lead): engine.sh defines multi-t…
don-petry Jun 11, 2026
26ef5d3
feat(initiatives): idea-triage + BMAD Scrum Master initiative-planner…
don-petry Jun 11, 2026
0f68283
feat: implement issue #553 — Enable new Claude models (Fable 5 / Opus…
don-petry Jun 11, 2026
2073679
chore(frameworks): vendor BMAD Method v6.8.0 + Test Architect v1.19.0…
don-petry Jun 11, 2026
a70b372
feat: implement issue #244 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 11, 2026
49ecbe3
feat: implement issue #577 — advisory-bot gate strands PRs forever: p…
don-petry Jun 11, 2026
fdea617
fix(initiative-planner): skip non-issue references in gather-context …
don-petry Jun 12, 2026
135c3d8
fix(engine): reorder cross-provider fallback to claude → copilot → ge…
don-petry Jun 12, 2026
8c6da61
feat: implement issue #608 — pr-review CI gate treats CANCELLED check…
don-petry Jun 12, 2026
4feda06
feat: implement issue #591 — bug(initiative-planner): claude-code-act…
don-petry Jun 12, 2026
fca0c1f
feat: implement issue #574 — pr-review: PRs with >300 changed files h…
don-petry Jun 12, 2026
e9262f1
feat: implement issue #405 — petry-projects — workflow failures detec…
don-petry Jun 13, 2026
29e5a6a
feat: implement issue #638 — Feature Ideation doesn't enhance human i…
don-petry Jun 13, 2026
91123f4
fix(dev-lead): force-with-lease retry when a rebase rewrites branch h…
don-petry Jun 13, 2026
805dad5
chore(deps): bump the actions group across 1 directory with 8 updates…
dependabot[bot] Jun 13, 2026
c18177b
feat: implement issue #61 — Compliance: codeowners-org-leads-not-firs…
don-petry Jun 13, 2026
6423f64
fix(initiative-planner): restore discussion→workflow_dispatch redispa…
don-petry Jun 13, 2026
7222116
feat: implement issue #317 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 13, 2026
32631f6
fix(initiative-driver): auto-drive every initiative:auto epic, not ju…
don-petry Jun 14, 2026
daef849
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 14, 2026
c8b9e08
feat: implement issue #682 — initiative-planner blocking open-questio…
don-petry Jun 14, 2026
1f6f9ff
feat: implement issue #677 — [Phase 1] Thread an optional MCP config …
don-petry Jun 14, 2026
8f1ff0c
feat: implement issue #391 — Compliance: missing-dependencies-label (…
don-petry Jun 14, 2026
75c2ede
feat: implement issue #679 — [Phase 1] Surface the MCP knob to the re…
don-petry Jun 14, 2026
b7b8165
feat: implement issue #316 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 14, 2026
0448e0d
fix(reviews): address review comments [skip ci-relay]
donpetry-bot Jun 14, 2026
46d17f1
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 18, 2026
a8eec2a
fix(reviews): address review comments [skip ci-relay]
donpetry-bot Jun 18, 2026
eed1dca
feat: implement issue #752 — [Phase 3] Wire the DOWNSTREAM_IMPACT blo…
don-petry Jun 19, 2026
58b9907
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 19, 2026
e421c32
test(dogfood): comment-only touch to exercise downstream-impact on ne…
don-petry Jun 21, 2026
555ce12
revert(dogfood): remove ci-status.sh dogfood comment + re-prove downs…
don-petry Jun 21, 2026
654fe2e
feat: implement issue #773 — pr-review: rubber-duck tier broken under…
don-petry Jun 23, 2026
682cd26
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 23, 2026
2b1f715
feat: implement issue #898 — pr-review self-review deadlock: `ci-pend…
don-petry Jun 24, 2026
66b57e6
fix: pr-review-mention workflow and pr_review_health script
donpetry-bot Jun 25, 2026
3a17d29
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 25, 2026
7c66e80
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 25, 2026
d0b8cf4
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 25, 2026
ed14f59
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 25, 2026
77775ea
fix: pr_review_health.sh — restore LOG_DIR guard, error handling, and…
donpetry-bot Jun 25, 2026
e2551ba
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 25, 2026
2a050dc
fix(reviews): address review comments [skip ci-relay]
donpetry-bot Jun 25, 2026
703cc91
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 25, 2026
fe89431
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 25, 2026
2bec18b
chore: apply manual instructions [skip ci-relay]
donpetry-bot Jun 25, 2026
97ea3ca
fix(reviews): address review comments [skip ci-relay]
donpetry-bot Jun 25, 2026
1aa1245
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 25, 2026
bb49912
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 25, 2026
df444b7
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 26, 2026
998ba1a
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 26, 2026
f05bd5a
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
59ed7e1
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
be4f203
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
21eb4bb
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
6c7dafd
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
eb8a5c9
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
817fad3
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
81687c0
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
08bab32
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
7885d7c
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 27, 2026
212f5d3
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 28, 2026
fda3bed
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 28, 2026
99daee0
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 28, 2026
b0af866
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 28, 2026
91b7b19
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 30, 2026
5657594
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 30, 2026
7d34b22
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jun 30, 2026
458cf07
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jul 1, 2026
36883af
Merge branch 'main' into dev-lead/issue-431-20260608-0044
don-petry Jul 1, 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
21 changes: 1 addition & 20 deletions .github/workflows/daily-pr-review-health.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,6 @@ jobs:
env:
CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
LOOKBACK_DAYS: ${{ inputs.lookback_days || '1' }}
# Pin via vars.CLAUDE_CODE_VERSION for reproducible caching; default
# 'latest' caches an install indefinitely — flush via the Actions cache
# UI or bump the variable to pick up new releases. Mirrors pr-review.yml.
CLAUDE_CODE_VERSION: ${{ vars.CLAUDE_CODE_VERSION || 'latest' }}

steps:
- name: Checkout agent repo
Expand All @@ -41,23 +37,8 @@ jobs:
with:
node-version: '20'

- 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: Install Claude Code CLI
run: |
mkdir -p "$HOME/.npm-global"
npm config set prefix "$HOME/.npm-global"
echo "$HOME/.npm-global/bin" >> "$GITHUB_PATH"
export PATH="$HOME/.npm-global/bin:$PATH"
if command -v claude >/dev/null 2>&1; then
echo "claude-code cache hit: $(claude --version)"
else
npm install -g "@anthropic-ai/claude-code@${CLAUDE_CODE_VERSION}" # NOSONAR — install scripts required for native binary setup; version intentionally uses CLAUDE_CODE_VERSION var (same pattern as pr-review.yml)
fi
run: npm install -g @anthropic-ai/claude-code@2.1.187

- name: Run health check
env:
Expand Down
7 changes: 2 additions & 5 deletions .github/workflows/pr-review-mention.yml
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@
#
# PR Review Mention — thin caller for the org-level reusable.
# To adopt: copy this file to .github/workflows/pr-review-mention.yml in your repo.
# Requires: GH_PAT_WORKFLOWS org secret — API calls and dispatching the review agent
# DON_PETRY_BOT_GH_PAT org secret — posting acknowledgement comments as the bot
# Requires: GH_PAT_WORKFLOWS, DON_PETRY_BOT_GH_PAT org secrets.
name: PR Review — Mention Trigger

on:
Expand All @@ -38,6 +37,4 @@ jobs:
permissions:
pull-requests: write
uses: petry-projects/.github/.github/workflows/pr-review-mention-reusable.yml@pr-review-mention/next
secrets:
GH_PAT_WORKFLOWS: ${{ secrets.GH_PAT_WORKFLOWS }}
DON_PETRY_BOT_GH_PAT: ${{ secrets.DON_PETRY_BOT_GH_PAT }}
secrets: inherit
147 changes: 95 additions & 52 deletions .github/workflows/pr-review.yml
Original file line number Diff line number Diff line change
@@ -1,64 +1,39 @@
name: PR Review Agent

on:
workflow_call:
schedule:
# Every 15 min to ensure at least one run fires per hour
# (GitHub Actions scheduled runs can be delayed/skipped under load)
- cron: "7 * * * *"
- cron: "22 * * * *"
- cron: "37 * * * *"
- cron: "52 * * * *"
workflow_dispatch:
inputs:
agent_ref:
# The .github-private ref to check out for the agent's own scripts
# (engine.sh, review-one-pr.sh, …). A trigger-stub caller passes its
# pinned channel (e.g. pr-review/stable) so the SCRIPTS run at the
# pinned version, not the caller's branch — closing the reusable
# self-ref gap (#506). Empty (the default) preserves the historical
# behaviour exactly: actions/checkout treats an empty ref as "default".
description: "Ref of petry-projects/.github-private to check out for agent scripts"
type: string
required: false
default: ""
# Mirror the workflow_dispatch inputs as workflow_call inputs so a trigger
# stub can forward them. The job's env block already reads `inputs.*`;
# these resolve from whichever trigger fired (dispatch or call).
pr_url:
description: "Optional: review a single PR URL instead of enumerating"
type: string
required: false
default: ""
type: string
dry_run:
description: "If true, never submit reviews or comments"
type: string
required: false
default: ""
default: "false"
type: string
force_review:
description: "If true, bypass idempotency and re-review at the same head SHA"
description: "If true, bypass idempotency check and re-review even if already reviewed at head SHA (use for @mention-triggered reviews)"
required: false
default: "false"
type: string
agent_ref:
description: "Git ref (branch/tag/SHA) of petry-projects/.github-private to check out for scripts. Empty defaults to main."
required: false
default: ""
secrets:
CLAUDE_CODE_OAUTH_TOKEN:
required: false
GOOGLE_API_KEY:
required: false
COPILOT_GITHUB_TOKEN:
required: false
DON_PETRY_BOT_GH_PAT:
required: false
# Classic PAT for the bot. Required for `gh pr review --approve`
# (addPullRequestReview), which fails for fine-grained PATs. Preferred
# over DON_PETRY_BOT_GH_PAT when set; see docs/pr-review-agent/machine-user-setup.md.
DON_PETRY_BOT_GH_PAT_CLASSIC:
required: false
GH_PAT:
required: false

# ── Reusable-only (#497 self-host pinning) ───────────────────────────────
# Event-driven triggering now lives in the thin caller `pr-review-trigger.yml`,
# which invokes this workflow pinned to `pr-review.yml@pr-review/stable` and
# passes `agent_ref: pr-review/stable` so the agent's own scripts run at the
# pinned version too. Keeping this file reusable-only is what lets
# .github-private's OWN PR reviews run the known-good `stable` release — not
# whatever is on the branch under review — which is what breaks the
# self-hosting circular dependency. The job below still reads `github.event.*`
# (inherited from the caller's triggering event) and `inputs.*` (forwarded by
# the stub), so its behaviour is unchanged.
type: string
repository_dispatch:
# Triggered by the petry-projects/.github mention-listener workflow.
# Requires only Contents: write on this repo (not Actions: write).
# Payload: { pr_url: "https://github.com/...", force_review: "true" }
types: [pr-review-mention]

permissions:
contents: read
Expand Down Expand Up @@ -248,11 +223,12 @@ jobs:
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
echo "::warning::Fine-grained PAT detected — gh pr review --approve (addPullRequestReview) will fail."
echo "::warning::Set DON_PETRY_BOT_GH_PAT_CLASSIC (classic PAT with repo + read:org) to enable approvals."
echo "::warning::See docs/pr-review-agent/machine-user-setup.md for the dual-secret setup."
echo "::warning::Proceeding with reduced functionality (read/comment; no approval submissions)."
echo 'HAS_CLASSIC_PAT=false' >> "$GITHUB_ENV"
exit 0
Comment thread
coderabbitai[bot] marked this conversation as resolved.
fi
unset _fgpat

Expand Down Expand Up @@ -358,6 +334,73 @@ jobs:
;;
esac

- name: Verify auth
env:
GH_TOKEN: ${{ secrets.GH_PAT_WORKFLOWS }}
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 "::warning::Fine-grained GH_PAT_WORKFLOWS detected. Skipping workflow-token scope validation."
echo "::warning::PR approval capability is determined by the main review GH_TOKEN validation step."
exit 0
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

# ── LSP-MCP review pilot (epic #839, story #842) ─────────────────────
# Opt-in ONLY: runs when the repo variable LSP_PILOT_ENABLED == 'true'.
# When off (the default) this step is skipped entirely, REVIEW_MCP_CONFIG
Expand Down
16 changes: 16 additions & 0 deletions .gitleaksignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,19 @@ eb7fd4c955378d274794e38ee9b942912ce79c6f:tests/dev-lead/unit/test_engine_fallbac
# 40-char classic-PAT-length test placeholder verbatim; commit a547c50 rewrote
# it to avoid the literal. Fingerprint suppresses the historical commit's finding.
334fac2ca4528d821b7511e1a0f8e5051a2aca65:.gitleaksignore:github-pat:5
# commit 8183136af11619917453bf58f6195fdc9f4350c8 (frameworks subtree add): test
# fixtures and adversarial-review samples in bmad-method and gsd frameworks contain
# placeholder API keys used by their own test suites. These are not real credentials.
8183136af11619917453bf58f6195fdc9f4350c8:frameworks/bmad-method/test/adversarial-review-tests/sample-content.md:generic-api-key:24
8183136af11619917453bf58f6195fdc9f4350c8:frameworks/gsd/sdk/src/query/config-query.test.ts:generic-api-key:228
8183136af11619917453bf58f6195fdc9f4350c8:frameworks/gsd/sdk/src/query/config-mutation.test.ts:generic-api-key:501
8183136af11619917453bf58f6195fdc9f4350c8:frameworks/gsd/tests/commands.test.cjs:generic-api-key:759
8183136af11619917453bf58f6195fdc9f4350c8:frameworks/gsd/tests/security-scan.test.cjs:generic-api-key:300
# commit 1d9a5e0088cc6f0aa7db71503dd70c1ec42027c9 (refactor: migrate to org-wide .github-private convention #41):
# same test fixtures re-committed during the migration; same dummy placeholder API keys,
# not real credentials.
1d9a5e0088cc6f0aa7db71503dd70c1ec42027c9:frameworks/bmad-method/test/adversarial-review-tests/sample-content.md:generic-api-key:24
1d9a5e0088cc6f0aa7db71503dd70c1ec42027c9:frameworks/gsd/sdk/src/query/config-query.test.ts:generic-api-key:228
1d9a5e0088cc6f0aa7db71503dd70c1ec42027c9:frameworks/gsd/sdk/src/query/config-mutation.test.ts:generic-api-key:501
1d9a5e0088cc6f0aa7db71503dd70c1ec42027c9:frameworks/gsd/tests/commands.test.cjs:generic-api-key:759
1d9a5e0088cc6f0aa7db71503dd70c1ec42027c9:frameworks/gsd/tests/security-scan.test.cjs:generic-api-key:300
33 changes: 28 additions & 5 deletions docs/dev-lead/implementation-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -809,14 +809,37 @@ Scanned on every `fix-reviews` trigger before acting.

### 4.2 Unit tests: `test_fix_reviews_human.bats` (5 cases)

- Human instruction executed via `run_writer()` ✓
- User instruction included in prompt ✓
- Dry-run: no commit ✓
- Anti-loop: agent's own reply to comment doesn't re-trigger ✓
- Empty instruction (just `@dev-lead` with no text) → asks for clarification ✓
Test cases cover: `@dev-lead` mention parsing, intent dispatch, rename/edit/delete operations, dry-run guard, and comment-reply confirmation.

### 4.3 Unit tests: `test_fix_rebase.bats` (6 cases)

```bash
@test "rebase: YAML SHA conflict resolved by preferring newer SHA" {
# Set up a fake conflict in a .yml file
cat > /tmp/conflict.yml << 'EOF'
uses: actions/checkout@abc123 # v5.0.0
EOF
run bash -c '
source scripts/dev-lead-fix-reviews.sh
resolve_yaml_sha_conflict /tmp/conflict.yml
'
[ "$status" -eq 0 ]
# Should have picked abc123 (newer semver v5.0.0 > v4.0.0)
grep -q "abc123" /tmp/conflict.yml
}

@test "rebase: non-YAML conflict → abort immediately" {
cat > /tmp/conflict.ts << 'EOF'
const foo = "bar";
EOF
run bash -c '
source scripts/dev-lead-fix-reviews.sh
resolve_conflict /tmp/conflict.ts
'
[ "$status" -ne 0 ]
}
```

- YAML SHA conflict: newer semver wins ✓
- YAML SHA conflict: both sides same version → keeps base ✓
- YAML SHA conflict: version cannot be determined → abort ✓
Expand Down
1 change: 1 addition & 0 deletions evals/validate-cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,7 @@ def validate_directory(eval_root: Path) -> None:
f"no cross-split id overlap.")



# ── Entry point ───────────────────────────────────────────────────────────────

def main() -> None:
Expand Down
Loading
Loading