Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
1020 commits
Select commit Hold shift + click to select a range
0e30fdb
Upgrade maintainability lens from Haiku 4.5 to Sonnet 4.6
Apr 9, 2026
8cfd644
Go-live improvements for PR review agent (#2)
don-petry Apr 9, 2026
da6322f
Add Claude delegation, auto-merge, and rebase handling (#3)
don-petry Apr 10, 2026
3c701f6
Optimize review: small-PR and incremental fast paths (#4)
don-petry Apr 10, 2026
6e5f686
Add Claude Code workflow (#8)
don-petry Apr 16, 2026
bfd9496
feat: add Copilot engine support via REVIEW_ENGINE toggle (#5)
don-petry Apr 16, 2026
2de14d9
feat: inline Claude Code workflow to access repo secrets directly (#9)
don-petry Apr 16, 2026
5ec79f6
feat: cross-engine adversarial rubber duck review (#11)
don-petry Apr 16, 2026
f58208b
fix: filter already-reviewed PRs from backlog to unblock queue
Apr 16, 2026
94ecd69
docs: clarify PR review batching issue
Apr 16, 2026
98c0a7a
fix: complete PR #10 fix - don't count no-ops toward MAX_PRS budget
Apr 16, 2026
a9795f6
feat: CI gate + poll-loop rebase wait across all review prompts (#14)
don-petry Apr 18, 2026
7ba6e89
fix: replace --checks passing with --checks success in list-prs.sh (#15)
don-petry Apr 19, 2026
5a8564f
docs: update repo references from self to pr-review-agent
Apr 21, 2026
429914d
feat: add car-hunt skill for used vehicle research and ranking
Apr 25, 2026
45b6dd6
fix: fix FB Marketplace links, improve AutoTrader fetch, add Sheets e…
Apr 25, 2026
3c20643
fix: add Craigslist as explicit source, enforce real-URL-only link rule
Apr 25, 2026
3fa0e84
fix: split zip/radius questions, rename MAX_MILES to MAX_ODOMETER
Apr 25, 2026
8daef79
fix: include self-authored PRs awaiting review in agent enumeration (…
don-petry Apr 25, 2026
804bd97
feat: add doors/transmission fields, update-mode sheet, fix CarGurus/…
Apr 25, 2026
e55a9fc
feat: add hard disqualification filters for finance-speak, title issu…
Apr 25, 2026
3ad9c1b
feat: add Distance to Car field using Nominatim geocoding + Haversine…
Apr 25, 2026
21fd00f
fix: address low result count — batch URL extraction, preview-filter …
Apr 25, 2026
d0a929c
fix: make cascade-action prompt explicit about gh pr review --approve
Apr 25, 2026
f7fdf58
improve: make cascade-action body composition and escalation more exp…
Apr 25, 2026
6a092d7
refactor: move review posting logic from agent prompts to bash script
Apr 25, 2026
c790dd9
add: cleanup script to fix PRs with comment approvals instead of revi…
Apr 25, 2026
de9075b
fix: cleanup script now requires bot account token
Apr 25, 2026
8d4db4e
add: workflow to fix stuck PRs using bot account token
Apr 25, 2026
2bcbdb1
fix: pass GH_PAT to checkout action so workflow uses bot account
Apr 25, 2026
65d3ddc
debug: simplify account check, add authentication debug output
Apr 25, 2026
7830cab
docs: add comprehensive petry-review-bot setup instructions
Apr 25, 2026
261981d
docs: add GitHub App setup guide (recommended approach)
Apr 26, 2026
57acf33
docs: add comprehensive GitHub App setup documentation
Apr 26, 2026
28cb151
fix: silence auth check in fix-stuck-prs when using GitHub App token
Apr 26, 2026
4e6847d
fix: use explicit author instead of @me in stuck PR search
Apr 26, 2026
4650419
fix: avoid subshell in while loop to preserve variable state
Apr 26, 2026
049400e
docs: add comprehensive status report for GitHub App setup
Apr 27, 2026
2f1cae7
docs: document stuck PR cleanup status and script fixes
Apr 28, 2026
f446bce
fix: update list-prs.sh to search all repos by owner instead of @me
Apr 28, 2026
7b7622c
docs: add investigation report for PR review agent workflow failures
Apr 28, 2026
e45e477
fix: move env section before steps in workflow to fix YAML structure
Apr 28, 2026
3832aae
script: add backfill-approvals to retroactively apply real approvals
Apr 28, 2026
6d7ebdf
feat: add backfill-approvals workflow to run as GitHub App bot
Apr 28, 2026
304d53d
fix: convert inner while loop to process substitution to preserve cou…
Apr 28, 2026
ab0f31a
car-hunt: add VIN-deep-dive flow, printable checklists, location-tier…
Apr 28, 2026
bb23c0a
fix: re-approve PRs where approval predates last commit (stale approval)
Apr 28, 2026
e97ee76
Enforce MAX_REVIEW_CYCLES cap before running the cascade (#18)
don-petry Apr 29, 2026
37ea796
Remove car-hunt skill and scheduled tasks (moved to don-petry/don-pet…
don-petry Apr 30, 2026
9a9bb6e
fix: apply Copilot fallback hardening and reuse GH_PAT for Copilot auth
don-petry May 3, 2026
7297b4a
fix: switch Copilot engine to gh built-in and fix app-id deprecation
don-petry May 3, 2026
5803adb
fix: harden Copilot fallback path and remove stale worktrees (#25)
claude[bot] May 3, 2026
70a39b3
ci: add pre-flight dedup check to prevent duplicate claude-issue PRs …
don-petry May 3, 2026
8766041
refactor: migrate to machine user PAT auth (closes #27) (#28)
don-petry May 5, 2026
1ddddbf
refactor: merge approval repair scripts into single automation
don-petry May 5, 2026
d6554c7
feat: add @mention trigger for on-demand PR reviews (#30)
don-petry May 6, 2026
9f7ef95
refactor: migrate to org-wide .github-private convention (#41)
don-petry May 7, 2026
0527ccd
ci: add dependabot-automerge.yml workflow (#73)
don-petry May 10, 2026
73b4377
fix(pr-review): unblock queue starvation from self-authored PRs (#96)…
don-petry May 10, 2026
f20ca3d
chore: rename GH_PAT_WORKFLOWS secret to DON_PETRY_BOT_GH_PAT (#99)
don-petry May 10, 2026
31de300
chore: remove frameworks directory (#101)
don-petry May 10, 2026
1380f25
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
77ee6b3
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
06822e7
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
01c6b99
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
f77197e
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
dbeda99
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
b4371da
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
b9b8020
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
751b3a7
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
1badc76
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
c863fdf
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
b33bec7
chore: deprecate pr-review-agent — remove all traces
don-petry May 11, 2026
4814362
revert: restore all erroneously deleted files (items 4-34) (#104)
don-petry May 11, 2026
ed57442
feat: add Gemini Pro support and optimize PR review fallback chain (#…
don-petry May 11, 2026
31940d9
fix(claude): sync inlined workflow with org standard (#109)
don-petry May 11, 2026
6d8cb9d
ci: replace inlined claude.yml with standard thin-caller stub
don-petry May 11, 2026
bf9b9cd
feat: prioritise .github/.github-private PRs, oldest-first within tie…
don-petry May 13, 2026
ebe3b70
fix: restore pr-review.yml content (accidentally emptied in revert)
don-petry May 13, 2026
966cc87
fix: restore pr-review.yml (file was accidentally emptied)
don-petry May 13, 2026
cbf43b0
chore(deps): bump actions/cache from 4 to 5 (#165)
dependabot[bot] May 13, 2026
b2bdde2
chore(deps): bump petry-projects/.github/.github/workflows/claude-cod…
dependabot[bot] May 13, 2026
d25b8a1
fix(list-prs): search DELEGATION_ORGS and drop --checks success pre-f…
don-petry May 13, 2026
e538a27
feat: add code-quality ruleset (compliance fix #60) (#86)
don-petry May 14, 2026
e5c45c5
feat(prompts/dev-lead): add human prompt template
don-petry May 15, 2026
3b0e08c
feat(prompts/dev-lead): add human-pr prompt template
don-petry May 15, 2026
27c3c0e
feat(dev-lead): implement dev-lead agent Phases 0-6
don-petry May 15, 2026
1715209
feat(dev-lead): Phase 1.5 — reusable workflow for cross-repo adoption…
don-petry May 15, 2026
460849a
fix(dev-lead): rate-limit detection, separate status, and retry cron …
don-petry May 16, 2026
3f9aa7f
fix(pr-review): handle Gemini trust-mode failure and properly route e…
don-petry May 17, 2026
5512a1e
fix: resolve YAML syntax error in dev-lead-reusable workflow
May 17, 2026
2a81bbf
chore: remove Phase 7 shadow period comment from dev-lead.yml
don-petry May 17, 2026
e064d88
test: bypass CI check
May 17, 2026
27f027b
fix(pr-review): remove CI bypass hack
May 17, 2026
c6615b7
fix(dev-lead): detect engine-committed changes and remove commit inst…
May 18, 2026
fa6ffea
fix(dev-lead): address PR review findings — untracked files, upstream…
May 18, 2026
5df3506
fix(pr-review): robust engine fallback and context optimization (#227)
don-petry May 18, 2026
16a6405
fix(dev-lead): handle SonarQube Quality Gate failures (issue #279) (#…
don-petry May 19, 2026
be5b2b9
fix(dev-lead): resolve review threads after fixing + notify CodeRabbi…
don-petry May 19, 2026
2340583
ci: add required ci.yml workflow
don-petry May 20, 2026
7758a75
chore(deps): bump actions/cache from 4.3.0 to 5.0.5 (#310)
dependabot[bot] May 20, 2026
1c2a0c6
fix: address open review findings from PR #102 (#108)
don-petry May 20, 2026
2251e7a
fix(ci): move shopt before yamllint call (fixes syntax error)
don-petry May 20, 2026
81cdec9
feat: implement issue #236 — Phase 5: Remaining gh-aw workflows (Docs…
don-petry May 20, 2026
f5de854
fix(dev-lead): configure git user identity in fix-issue script (#326)
don-petry May 20, 2026
e9e965a
feat: implement issue #232 — Phase 1: Issue Triage gh-aw workflow (#284)
don-petry May 20, 2026
32c59e4
style(ci): remove trailing blank line to fix yamllint recurring failure
don-petry May 20, 2026
5d81abe
feat: implement issue #183 — Compliance: non-stub-claude.yml (#328)
don-petry May 20, 2026
398738a
feat: implement issue #135 — Compliance: unpinned-actions-claude.yml …
don-petry May 21, 2026
2e6b6c4
feat: token cost observatory — ET metric + JSONL logging (#334)
don-petry May 21, 2026
3da2734
chore(deps): bump actions/cache from 4.3.0 to 5.0.5 (#347)
dependabot[bot] May 21, 2026
eefafeb
feat(dev-lead): harden agent instructions with Plan→TDD→Verify→Rubber…
don-petry May 23, 2026
d68fc14
feat: implement issue #365 — dev-lead: preserve session output in Act…
don-petry May 23, 2026
a04eee4
fix(dev-lead): visible no-changes comments, ACTOR strip, full secret …
don-petry May 23, 2026
5d09ada
add: force-deploy-pr-review workflow for branch-protection bypass
Jun 3, 2026
e1a0217
add: pr-review-reusable.yml wrapper for workflow_call pattern
Jun 4, 2026
85b9f91
fix: explicitly pass secrets in pr-review-reusable.yml workflow_call
Jun 4, 2026
4810d00
feat: implement issue #425 — dev-lead: Incomplete issue resolution - …
don-petry Jun 4, 2026
4900dbe
chore(deps): bump actions/checkout from 4 to 6 (#433)
dependabot[bot] Jun 4, 2026
2475e80
merge: PR #353 - PR Review Agent diagnostics and transient failure ha…
Jun 4, 2026
f92447a
merge: PR #422 - Add deploy-pr-review.yml workflow for branch protect…
Jun 4, 2026
ea76ca0
fix(ci): strip trailing whitespace from deploy-pr-review workflows (#…
don-petry Jun 6, 2026
6bde0a8
fix: support fine-grained tokens in pr-review scope validation (#443)
don-petry Jun 6, 2026
535d07a
fix(dev-lead): auto-resolve outdated bot threads and treat unresolved…
don-petry Jun 6, 2026
3d8733f
feat: implement issue #396 — Compliance: non-stub-dependency-audit.ym…
don-petry Jun 8, 2026
4e5b61d
feat: implement issue #438 — Compliance: unpinned-actions-deploy-pr-r…
don-petry Jun 8, 2026
cfef500
feat: implement issue #399 — PR Review Agent — failures detected 2026…
don-petry Jun 8, 2026
cb33aba
feat: implement advisory bot review gate in pr-review agent (#458)
don-petry Jun 8, 2026
8b918cc
feat: implement issue #404 — PR Review Agent — failures detected 2026…
don-petry Jun 8, 2026
b5f7279
feat: implement issue #407 — PR Review Agent — failures detected 2026…
don-petry Jun 9, 2026
cf67ea3
feat: implement issue #511 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
cd65e29
feat: implement issue #272 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
3df7240
feat: implement issue #512 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 10, 2026
cee2bf5
feat: implement issue #408 — petry-projects — workflow failures detec…
don-petry Jun 10, 2026
9a36153
feat: implement issue #395 — Compliance: non-stub-dev-lead.yml (#488)
don-petry Jun 10, 2026
99be3cf
chore: retire deploy-pr-review, force-deploy, and pr-review-reusable …
don-petry Jun 10, 2026
6c6b901
chore(frameworks): vendor BMAD Method v6.8.0 + Test Architect v1.19.0…
don-petry Jun 11, 2026
f8345d9
feat: implement issue #244 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 11, 2026
678061a
feat: implement issue #574 — pr-review: PRs with >300 changed files h…
don-petry Jun 12, 2026
5f6646c
feat: implement issue #68 — Compliance: check-suite-auto-trigger-1236…
don-petry Jun 13, 2026
d00bca4
feat: implement issue #638 — Feature Ideation doesn't enhance human i…
don-petry Jun 13, 2026
c92d5ec
chore(deps): bump the actions group across 1 directory with 8 updates…
dependabot[bot] Jun 13, 2026
8ae9a0e
fix(initiative-planner): restore discussion→workflow_dispatch redispa…
don-petry Jun 13, 2026
e166f4f
feat: implement issue #582 — [Phase 1] Define held-out eval-case form…
don-petry Jun 14, 2026
d1c99a2
feat: implement issue #583 — deterministic eval scorer (triage) over …
don-petry Jun 14, 2026
5ee014c
fix(pr-review-sweep): dispatch with GH_PAT_WORKFLOWS, not the bot com…
don-petry Jun 15, 2026
ea48870
feat: implement issue #547 — Compliance: secret_scan_ci_job_present (…
don-petry Jun 16, 2026
442ec16
feat: implement issue #143 — Compliance: secret_scanning_non_provider…
don-petry Jun 16, 2026
7ac8938
feat: implement issue #695 — [Fleet Monitor] petry-projects/.github-p…
don-petry Jun 17, 2026
45e5565
feat: implement issue #752 — [Phase 3] Wire the DOWNSTREAM_IMPACT blo…
don-petry Jun 19, 2026
0683e54
feat: implement issue #799 — Compliance: check-suite-prefs-unreadable…
don-petry Jun 19, 2026
df678e0
fix(dev-lead): repair auto-rebase conflict detection and applied-rate…
don-petry Jun 20, 2026
4cf7fb1
feat: implement issue #821 — Fleet stubs for idea-triage and idea-enh…
don-petry Jun 20, 2026
bc0fdad
feat(dev-lead): retry failed initial issue implementations, never sil…
don-petry Jun 20, 2026
af648f4
test(dogfood): comment-only touch to exercise downstream-impact on ne…
don-petry Jun 21, 2026
f3bfaf8
feat: implement issue #840 — [Phase 1] Author the LSP pilot scoping d…
don-petry Jun 21, 2026
08e97d0
revert(dogfood): remove ci-status.sh dogfood comment + re-prove downs…
don-petry Jun 21, 2026
b149b91
feat: implement issue #841 — [Phase 1] Freeze the comparative pilot P…
don-petry Jun 21, 2026
2bf5282
feat: implement issue #842 — [Phase 2] Wire candidate LSP-MCP server(…
don-petry Jun 21, 2026
894092f
feat: implement issue #843 — [Phase 2] Add the LSP finding-verificati…
don-petry Jun 21, 2026
7912b31
feat(release): codify release-channel-tags ruleset + apply-rulesets.s…
don-petry Jun 21, 2026
61367e3
feat: implement issue #873 — [Phase 1] Extend cut-release.sh + releas…
don-petry Jun 21, 2026
13141ed
feat(release): health-gated ring promotion automation — canary-rollou…
don-petry Jun 23, 2026
80b5711
feat: implement issue #870 — Bring #482's .github-hosted reusables un…
don-petry Jun 23, 2026
3c360f6
feat: implement issue #773 — pr-review: rubber-duck tier broken under…
don-petry Jun 23, 2026
013b72e
feat(#846): cache the LSP index + enforce the 30s cold-start SLA with…
don-petry Jun 25, 2026
79c4197
feat: implement issue #844 — [Phase 3] Run the comparative pilot and …
don-petry Jun 25, 2026
7fcb666
feat(#844): live LSP off-vs-on comparison runner + measurement extrac…
don-petry Jun 27, 2026
9304fbc
feat: wire cut-release.sh cross-repo publish via gh api (#872) (#959)
don-petry Jun 27, 2026
2714de8
feat: implement issue #967 — [Phase 2] Bootstrap wrapper: scripts/boo…
don-petry Jun 27, 2026
3e4ed8e
feat: implement issue #968 — [Phase 2] Release-ring confirmation + ce…
don-petry Jun 27, 2026
e944269
feat: implement issue #960 — feat(#844): instrument the real pr-revie…
don-petry Jun 27, 2026
01d5d74
feat: implement issue #876 — [Phase 3] Deprecate idea-enhancer in .gi…
don-petry Jun 27, 2026
ae152a5
feat: implement issue #970 — [Phase 3] Docs cutover + end-to-end new-…
don-petry Jun 30, 2026
bc1cf5c
feat(cut-release): add --promote for ring-to-ring channel moves (#501…
don-petry Jun 30, 2026
56a4a0a
fix(seed-repo-template): correct dependabot path/default + close test…
don-petry Jun 30, 2026
73f8710
feat: implement issue #869 — [Phase 2] Promote standards/ci-standards…
don-petry Jul 1, 2026
3f1046d
feat: implement issue #305 — feat(pr-reviewer): re-implement 7 safety…
don-petry Jul 2, 2026
b47140f
feat: implement issue #999 — Harden #993 soak-promote to spec: #548 g…
don-petry Jul 2, 2026
340dfc0
feat: implement issue #1025 — canary-rollout post-merge: fleet-wide e…
don-petry Jul 3, 2026
01be585
feat: implement issue #1031 — fix(#844): plumb LSP_PILOT_ENABLED env …
don-petry Jul 3, 2026
ad3c6ca
feat(canary-rings): onboard the 6 #482 reusables into the registry (#…
don-petry Jul 3, 2026
0aa4539
ci(canary-rollout): list all registry agents in the dispatch input (#…
don-petry Jul 3, 2026
1a9ee62
fix(pr-review): unbreak reviews — stub must not forward lsp_pilot_var…
don-petry Jul 3, 2026
449d546
feat: implement issue #1049 — canary-rollout evaluate mis-reports all…
don-petry Jul 3, 2026
a2773ab
feat: implement issue #1054 — canary-rollout PROMOTE fails for cross-…
don-petry Jul 3, 2026
d502af1
chore(rulesets): repoint apply-rulesets + bootstrap to .github fleet …
don-petry Jul 3, 2026
653d795
feat(canary-rollout): gated scheduled fleet auto-promote (#1045 part …
don-petry Jul 3, 2026
3781033
fix(canary-rollout): record deployment on the promoted commit's host …
don-petry Jul 3, 2026
a21025f
feat(canary-rollout): auto-file blocker issues + rolling dashboard fo…
don-petry Jul 3, 2026
4ebfa17
refactor(canary-rollout): fleet-status dashboard → job summary (not a…
don-petry Jul 3, 2026
436ff26
feat: implement issue #1069 — canary-rollout: auto-cut a new version …
don-petry Jul 4, 2026
8da9aab
fix(cut-release): set a git identity before the this-repo annotated-t…
don-petry Jul 4, 2026
60b05a1
fix(canary-rollout): sync-issues must not abort under set -e when iss…
don-petry Jul 4, 2026
ea15289
feat: implement issue #1082 — canary-rollout: no auto-discovery of un…
don-petry Jul 4, 2026
c6dc5bc
fix(release): unify channel-tag moves onto the gh-api/App-token path …
don-petry Jul 4, 2026
3be97d3
chore(#613): remove relocated canary-rollout engine + bootstrap (now …
don-petry Jul 9, 2026
c3f35db
chore(lsp-pilot): retire the LSP pilot after Shell NO-GO (#839, #845)…
don-petry Jul 9, 2026
4b2cbb1
Add Murat persona instance — worked example for the persona standard …
don-petry Jul 14, 2026
ec0782e
feat: implement issue #723 — [Phase 1] Move all scheduled workflows o…
don-petry Jul 14, 2026
ba45ad3
fix(pr-review): FORCE_REVIEW bypasses the ci-failing gate (self-host …
don-petry Jul 14, 2026
6ce8f88
feat(readme-refresh): discover & document reporting/dashboard workflo…
don-petry Jul 14, 2026
aff46c2
feat(readme-refresh): agentic-workflow fleet, working file links, age…
don-petry Jul 15, 2026
ae2a415
chore: remove ContentTwin product health-check workflow (#1273)
don-petry Jul 15, 2026
00412e8
Rename murat → qa-lead and make it @-addressable (#1279)
don-petry Jul 17, 2026
534dc15
Stop using address.aliases (half 1 of 2) (#1289)
don-petry Jul 17, 2026
dfa71e9
fix(dev-lead): resolve identity from persona manifest, not shared var…
don-petry Jul 19, 2026
4f12b69
chore: sync 1 org-standard workflow stub(s) from petry-projects/.gith…
don-petry Jul 21, 2026
77a2405
chore: sync 1 org-standard workflow stub(s) from petry-projects/.gith…
don-petry Jul 21, 2026
8ccd1b0
chore: sync 3 org-standard workflow stub(s) from petry-projects/.gith…
don-petry Jul 23, 2026
0c91f6a
feat: implement issue #1358 — pr-review: trusted first-party stub / s…
don-petry Jul 23, 2026
7aef845
feat: implement issue #1349 — pr-review: register Graphite, Qodo, Cod…
don-petry Jul 24, 2026
c15a21e
chore: sync 4 org-standard workflow stub(s) from petry-projects/.github
don-petry Jul 27, 2026
af80bfe
chore: sync 4 org-standard workflow stub(s) from petry-projects/.github
don-petry Jul 27, 2026
e34eb94
chore: sync 4 org-standard workflow stub(s) from petry-projects/.github
don-petry Jul 27, 2026
22fb668
feat: implement issue #1410 — [Phase 4] Add a stall canary + rollback…
don-petry Aug 2, 2026
7bce2db
feat: implement issue #1436 — [bug] seed-repo-template.sh repins call…
don-petry Aug 2, 2026
38ab1d5
feat: implement issue #1445 — [bug] dev-lead posts a detailed 'Comple…
don-petry Aug 3, 2026
f843ddf
fix: update dev-lead caller stub channel tag and test expectations
donpetry-bot Aug 3, 2026
20fc7a3
fix(ci): auto-fix for .github/dependabot.yml [skip ci-relay]
donpetry-bot Aug 3, 2026
5fe1a7a
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Aug 3, 2026
366c137
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Aug 3, 2026
3e97e51
fix: remove duplicate test definitions in test_cut_release.bats
donpetry-bot Aug 3, 2026
a4c54bb
fix: remove duplicate test definitions in modified test files
donpetry-bot Aug 3, 2026
f609d06
fix: remove duplicate function/variable definitions found by gitleaks
donpetry-bot Aug 3, 2026
c9c97c5
fix: align pr-auto-review.yml comment with actual uses ref (v1-next)
donpetry-bot Aug 3, 2026
9ae720f
chore(rebase): reconcile rebase artifacts with PR tip state
donpetry-bot Aug 7, 2026
2b14ea8
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Aug 7, 2026
016c849
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Aug 7, 2026
04528d3
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Aug 7, 2026
990bede
fix(compliance): restore permissions policy enforcement in dismiss-st…
donpetry-bot Aug 7, 2026
6c96a60
fix(tests): remove duplicate test blocks in test_cut_release.bats
donpetry-bot Aug 7, 2026
7a7c431
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Aug 7, 2026
99d4518
chore: dev-lead update (review-changes) [skip ci-relay]
donpetry-bot Aug 7, 2026
1e9e3fe
fix(reviews): address review comments [skip ci-relay]
donpetry-bot Aug 7, 2026
299879a
feat: implement issue #1480 — Compliance: gitignore_baseline (#1481)
don-petry Aug 7, 2026
14e598b
fix(docs): remove orphaned BATS test code causing markdown lint failures
donpetry-bot Aug 8, 2026
3c2c2b7
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 8, 2026
1972371
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 8, 2026
31689c6
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 12, 2026
8389c96
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 12, 2026
47f9a61
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 12, 2026
60ea534
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 12, 2026
44eb924
fix(bot): address bot feedback [skip ci-relay]
donpetry-bot Aug 12, 2026
60f25ac
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 12, 2026
0e74b68
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 12, 2026
1746532
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 12, 2026
953fc1a
chore: dev-lead update (review-changes) [skip ci-relay]
donpetry-bot Aug 12, 2026
9094e31
fix(reviews): address review comments [skip ci-relay]
donpetry-bot Aug 12, 2026
0bdc72c
Merge branch 'main' into standards-sync/workflows-20260727
don-petry Aug 13, 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
10 changes: 4 additions & 6 deletions .github/workflows/auto-rebase.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,12 @@
# To adopt: copy this file to .github/workflows/auto-rebase.yml in your repo.
# No secrets required — uses GITHUB_TOKEN only.
#
# By default the reusable only updates *review-ready* PRs: non-draft AND
# (carrying a current APPROVED review OR the `auto-rebase:ready` label). This
# keeps the workflow from fanning out branch-update CI runs to every behind PR.
# To tune it, pass inputs to the reusable, e.g.:
# By default the reusable updates *every* behind PR (`eligibility: all`). The
# `eligibility` input is a tunable extension point for future modes; to select
# one, pass it to the reusable, e.g.:
#
# with:
# eligibility: review-ready # default; or `all` to update every behind PR
# ready_label: auto-rebase:ready # label that opts a non-draft PR in
# eligibility: all # default — update every behind PR
#
name: Auto-rebase non-Dependabot PRs

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/dev-lead.yml
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ jobs:
# dependency). Promotion is done by moving the dev-lead/v1-stable tag centrally; this
# caller is never edited on release. agent_ref threads the same channel into
# dev-lead's own scripts/prompts checkout. See https://github.com/petry-projects/.github/blob/main/standards/ci-standards.md#dev-lead-agent.
uses: petry-projects/.github-private/.github/workflows/dev-lead-reusable.yml@dev-lead/stable # NOSONAR(githubactions:S7637) first-party channel ref
uses: petry-projects/.github-private/.github/workflows/dev-lead-reusable.yml@dev-lead/v1-stable # NOSONAR(githubactions:S7637) first-party channel ref
with:
agent_ref: dev-lead/stable
agent_ref: dev-lead/v1-stable
secrets: inherit # NOSONAR(githubactions:S7635) first-party trusted reusable
permissions:
contents: write
Expand Down
75 changes: 0 additions & 75 deletions .github/workflows/pr-review.yml
Original file line number Diff line number Diff line change
Expand Up @@ -344,81 +344,6 @@ jobs:
fi
fi

- name: Cache claude-code CLI
uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0
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

- name: Install review engine CLIs
run: |
set -euo pipefail
Expand Down
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -418,3 +418,6 @@ coverage/
# actionlint scanner binary — downloaded fresh in CI, never committed
/actionlint
/actionlint.tar.gz

# Editor/tooling backup artifacts — never committed (see #1378)
*.backup
15 changes: 8 additions & 7 deletions .gitleaksignore
Original file line number Diff line number Diff line change
Expand Up @@ -15,10 +15,11 @@ 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
# Framework test fixtures with sample/fake API keys (not real credentials).
# These are included in the frameworks subtree (git subtree) as test data.
68ab3109d74633dc4aa4c09ff58d1901795bbd11:frameworks/bmad-method/test/adversarial-review-tests/sample-content.md:generic-api-key:24
68ab3109d74633dc4aa4c09ff58d1901795bbd11:frameworks/gsd/sdk/src/query/config-query.test.ts:generic-api-key:228
68ab3109d74633dc4aa4c09ff58d1901795bbd11:frameworks/gsd/sdk/src/query/config-mutation.test.ts:generic-api-key:501
68ab3109d74633dc4aa4c09ff58d1901795bbd11:frameworks/gsd/tests/security-scan.test.cjs:generic-api-key:300
68ab3109d74633dc4aa4c09ff58d1901795bbd11:frameworks/gsd/tests/commands.test.cjs:generic-api-key:759
# commit 95fe0d4 (refactor: migrate to org-wide .github-private convention):
# framework subtree import introduced test fixture files with dummy API keys used
# for testing security scanning. These are not real credentials.
95fe0d46addc83e56a0ba36468583c2970b104e3:frameworks/bmad-method/test/adversarial-review-tests/sample-content.md:generic-api-key:24
95fe0d46addc83e56a0ba36468583c2970b104e3:frameworks/gsd/sdk/src/query/config-query.test.ts:generic-api-key:228
95fe0d46addc83e56a0ba36468583c2970b104e3:frameworks/gsd/sdk/src/query/config-mutation.test.ts:generic-api-key:501
95fe0d46addc83e56a0ba36468583c2970b104e3:frameworks/gsd/tests/commands.test.cjs:generic-api-key:759
95fe0d46addc83e56a0ba36468583c2970b104e3:frameworks/gsd/tests/security-scan.test.cjs:generic-api-key:300
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ breaks post-merge (the #1034 defect). This guard closes that gap.
The `caller-stub-freeze` job in `lint.yml` (#1255, epic #1052 Part B) is the byte-identity **backstop** to
`validate-caller-inputs` for the specific **ring-0 / self-host** caller stubs — the ones whose reusable lives
in **this** repo and is pinned to a canary channel tag (`docs/initiatives/agentic-release-strategy.md` §5):
`dev-lead.yml` (`@dev-lead/v1-next`), `pr-review-trigger.yml` (`@pr-review/next`), and
`dev-lead.yml` (`@dev-lead/v1-stable`), `pr-review-trigger.yml` (`@pr-review/next`), and
`ci-failure-analyst.lock.yml` (`@ci-failure-analyst/v1-stable`). A trigger/`with:` forwarding change to a
channel-pinned self-host stub is exercised by nothing in PR CI and only breaks post-merge (the #1034 defect
class), so each stub's `on:` trigger + `uses:`/`with:` forwarding block is frozen byte-for-byte against a
Expand Down
37 changes: 0 additions & 37 deletions docs/initiatives/idea-to-initiative-pipeline.md
Original file line number Diff line number Diff line change
Expand Up @@ -107,43 +107,6 @@ 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.

### `idea-triage.yml` — weekly ripeness shortlist
- Scans every open **Ideas** Discussion, scores each **Ripe / Soon / Not yet**
on evidence, prerequisites, alignment, coverage, and freshness.
- Rewrites a single **Idea Promotion Queue** tracking issue (label
Expand Down
85 changes: 0 additions & 85 deletions evals/validate-cases.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,6 @@ def fail(msg: str) -> NoReturn:

# ── File mode: schema + id-uniqueness validation ──────────────────────────────

def validate_file(cases_path: Path, schema_path: Path) -> None:
try:
import jsonschema
except ImportError:
fail("jsonschema not installed (pip install 'jsonschema>=4')")

try:
schema = json.loads(schema_path.read_text(encoding="utf-8"))
except (OSError, json.JSONDecodeError) as exc:
fail(f"could not read/parse schema {schema_path}: {exc}")

def validate_file(cases_path: Path, schema_path: Path) -> None:
try:
import jsonschema
Expand Down Expand Up @@ -157,80 +146,6 @@ def validate_directory(eval_root: Path) -> None:
print(f"OK: {len(skills)} skill(s), {total} case(s) across dev+holdout, "
f"no cross-split id overlap.")


# ── Directory mode: dev/holdout split hygiene ─────────────────────────────────

def load_split_ids(cases_path: Path) -> list[str]:
try:
raw = cases_path.read_text(encoding="utf-8")
except OSError as exc:
fail(f"could not read {cases_path}: {exc}")

ids: list[str] = []
seen: set[str] = set()
for lineno, line in enumerate(raw.splitlines(), start=1):
if not line.strip():
continue
try:
case = json.loads(line)
except json.JSONDecodeError as exc:
fail(f"{cases_path}:{lineno}: invalid JSON: {exc}")
if not isinstance(case, dict):
fail(f"{cases_path}:{lineno}: each case line must be a JSON object")
if "id" not in case:
fail(f"{cases_path}:{lineno}: case is missing required field 'id'")
cid = case["id"]
if not isinstance(cid, str) or not cid.strip():
fail(f"{cases_path}:{lineno}: case 'id' must be a non-empty string")
if cid in seen:
fail(f"{cases_path}:{lineno}: duplicate id '{cid}' within this split")
seen.add(cid)
ids.append(cid)
return ids


def validate_skill(skill_dir: Path) -> int:
split_ids: dict[str, list[str]] = {}
for split in SPLITS:
cases_path = skill_dir / split / CASES_FILENAME
if not cases_path.is_file():
fail(f"skill '{skill_dir.name}' is missing its {split} split "
f"(expected {cases_path})")
split_ids[split] = load_split_ids(cases_path)

overlap = set(split_ids["dev"]) & set(split_ids["holdout"])
if overlap:
joined = ", ".join(sorted(overlap))
fail(f"skill '{skill_dir.name}': id(s) appear in both dev and holdout "
f"splits (a case must not be in both): {joined}")

return sum(len(ids) for ids in split_ids.values())


def discover_skills(eval_root: Path) -> list[Path]:
skills = []
for child in sorted(eval_root.iterdir()):
if not child.is_dir():
continue
if any((child / split).is_dir() for split in SPLITS):
skills.append(child)
return skills


def validate_directory(eval_root: Path) -> None:
skills = discover_skills(eval_root)
if not skills:
fail(f"no skills found under {eval_root} "
f"(expected <skill>/dev/ and <skill>/holdout/ subdirectories)")

total = 0
for skill_dir in skills:
total += validate_skill(skill_dir)

print(f"OK: {len(skills)} skill(s), {total} case(s) across dev+holdout, "
f"no cross-split id overlap.")


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

def main() -> None:
Expand Down
25 changes: 25 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"name": ".github-private",
"version": "1.0.0",
"private": true,
"devDependencies": {
"bats": "1.13.0"
}
}
6 changes: 6 additions & 0 deletions prompts/cascade-action.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ PLACEHOLDER_SUMMARY
### Cross-engine agreement (if deep+duck)
<If tier is deep+duck and agreement field exists, include this section>

### Cross-engine agreement (if deep+duck)
<If tier is deep+duck and agreement field exists, include this section>

### Cross-engine agreement (if deep+duck)
<If tier is deep+duck and agreement field exists, include this section>

### Findings
PLACEHOLDER_FINDINGS_LIST

Expand Down
46 changes: 0 additions & 46 deletions prompts/dev-lead/fix-ci.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,52 +83,6 @@ Read every changed line as if you are a reviewer:
4. Ask: is there a simpler fix that achieves the same result with less risk?
5. Fix anything found, then re-run Phase 3

### Phase 2 — Fix

Apply targeted fixes using the Edit/Write tools:

1. Address each root cause identified in Phase 1
2. Fix only what is broken — do not refactor unrelated code
3. Do not modify test expectations to make tests pass artificially

#### External quality gate (SonarCloud, CodeQL, etc.)

If **Failure Logs** begins with `# External quality gate`, this check is not a GitHub Actions workflow — it is an external service that reported a quality gate failure. In this case:

- **Annotations** contains the specific lines and rule messages flagged by the gate — read it carefully
- If **Annotations** is empty, **Failure Logs** contains the PR diff to identify what the gate likely flagged
- For **SonarQube / SonarCloud**, note: `# NOSONAR` suppresses Bugs/Code Smells but **not Security Hotspots** — hotspots require code changes or UI acknowledgment in SonarCloud

Common SonarCloud Security Hotspot patterns to look for in changed files:

| Pattern | Typical fix |
|---|---|
| `curl … \| bash` / `wget … \| sh` | Replace with pinned download + verify checksum, or `gh extension install` |
| Hardcoded credentials / API keys | Move to secrets / env vars |
| `eval` / `exec` with dynamic input | Remove dynamic execution or sanitize input |
| HTTP (non-HTTPS) download URLs | Change to `https://` |
| `npm install` without `--ignore-scripts` | Add `--ignore-scripts` if install scripts are not required; otherwise, this may require manual acknowledgment in the SonarCloud UI |
| `npm install pkg@variable` or `@latest` | Pin to an exact version number (e.g. `pkg@1.2.3`), or exclude the file in `sonar-project.properties` if version is intentionally managed via a CI variable |

### Phase 3 — Verify Locally

After applying fixes, run the local equivalent of the failing check to confirm the fix works before finishing:

1. Identify the test/lint command this repo uses (check AGENTS.md, `package.json`, `Makefile`, etc.)
2. Run the full test suite — every test must pass, not just the ones that were failing
3. Run any lint/format checks relevant to the failing check
4. **If the local run still fails, diagnose and fix before finishing — the CI workflow will push and re-run checks; hand it a working fix**

### Phase 4 — Rubber Duck Review

Read every changed line as if you are a reviewer:

1. Run `git diff HEAD` to see all changes made during this session
2. Ask: does each change directly address a root cause from Phase 1?
3. Ask: could any fix introduce a regression in code that was previously passing?
4. Ask: is there a simpler fix that achieves the same result with less risk?
5. Fix anything found, then re-run Phase 3

## Constraints

- Fix only what is broken — do not refactor unrelated code
Expand Down
Loading
Loading