Repository navigation
petry-projects — workflow failures detected 2026-05-28 #405
Copy link
Copy link
Closed
Labels
automated-reportCreated by automated workflowCreated by automated workflowdev-leadFor dev-lead agent pickupFor dev-lead agent pickuphealth-checkAutomated health check reportAutomated health check report
Description
Actions Fleet Monitor — 2026-05-28
Org: petry-projects | Lookback: 1 day(s) | Repos: 8 | Workflows: 170
Fleet Health
🔴 CRITICAL: 0 🟠 DEGRADED: 1 🟡 WARNING: 4 ✅ HEALTHY: 38
pie title Workflow Status Distribution
"DEGRADED" : 1
"WARNING" : 4
"HEALTHY" : 38
Top Failing Workflows
xychart-beta
title "Top Failing Workflows (≥5 runs)"
x-axis ["broodly/dev-lead.yml","broodly/pr-review-mention.yml",".github-private/pr-review.yml",".github-private/dev-lead.yml",".github-private/pr-review-mention.yml"]
y-axis "Failure Rate %" 0 --> 100
bar [25,9,6,3,3]
Per-Repo Summary
| Repo | Workflows | Total Runs | Failures | Issues | Worst Status |
|---|---|---|---|---|---|
petry-projects/.github ✅ |
31 | 110 | 1 | #345 #334 #331 #330 #329 | ✅ HEALTHY |
petry-projects/.github-private 🟡 |
33 | 219 | 5 | #402 #401 #342 #341 #337 #244 | 🟡 WARNING |
petry-projects/ContentTwin ✅ |
14 | 5 | 0 | #189 #188 #180 #179 | ✅ HEALTHY |
petry-projects/bmad-bgreat-suite ✅ |
15 | 5 | 0 | #201 #198 #197 #185 #184 #183 | ✅ HEALTHY |
petry-projects/broodly 🟠 |
19 | 75 | 15 | #280 #243 #240 #230 #227 #226 #223 #224 | 🟠 DEGRADED |
petry-projects/google-app-scripts ✅ |
23 | 5 | 0 | #322 #318 #317 #315 #305 #303 #304 | ✅ HEALTHY |
petry-projects/markets ✅ |
18 | 6 | 0 | #215 #209 #208 #203 #202 | ✅ HEALTHY |
Fleet Detail
| Repo | Workflow | Issues | Total | ✅ | ❌ | ⚪ | Failure Rate | p50 | p95 | Status | |
|---|---|---|---|---|---|---|---|---|---|---|---|
petry-projects/broodly 🟠 |
dev-lead.yml |
#227 | 27 | 8 | 7 | 0 | 25.9% | ██░░░░░░░░ | 9s | 1m19s | 🟠 DEGRADED |
petry-projects/.github-private 🟡 |
dev-lead.yml |
#341 | 56 | 12 | 2 | 24 | 3.6% | ░░░░░░░░░░ | 9s | 9m40s | 🟡 WARNING |
petry-projects/.github-private 🟡 |
pr-review-mention.yml |
26 | 0 | 1 | 0 | 3.8% | ░░░░░░░░░░ | 1s | 3s | 🟡 WARNING | |
petry-projects/.github-private 🟡 |
pr-review.yml |
#402 | 31 | 27 | 2 | 0 | 6.5% | ░░░░░░░░░░ | 43s | 2m8s | 🟡 WARNING |
petry-projects/broodly 🟡 |
pr-review-mention.yml |
#280 | 11 | 0 | 1 | 0 | 9.1% | ░░░░░░░░░░ | 2s | 11s | 🟡 WARNING |
petry-projects/.github ✅ |
agent-shield.yml |
2 | 2 | 0 | 0 | 0% | ░░░░░░░░░░ | 15s | 15s | ✅ HEALTHY | |
petry-projects/.github ✅ |
ci.yml |
#329 | 2 | 2 | 0 | 0 | 0% | ░░░░░░░░░░ | 18s | 18s | ✅ HEALTHY |
petry-projects/.github ✅ |
codeql |
2 | 2 | 0 | 0 | 0% | ░░░░░░░░░░ | 2m16s | 2m16s | ✅ HEALTHY | |
petry-projects/.github ✅ |
daily-org-status.yml |
#334 | 1 | 1 | 0 | 0 | 0% | ░░░░░░░░░░ | 3m34s | 3m34s | ✅ HEALTHY |
petry-projects/.github ✅ |
dependabot-automerge.yml |
2 | 0 | 0 | 0 | 0% | ░░░░░░░░░░ | 1s | 1s | ✅ HEALTHY | |
petry-projects/.github ✅ |
dependabot-rebase.yml |
5 | 5 | 0 | 0 | 0% | ░░░░░░░░░░ | 11s | 11s | ✅ HEALTHY | |
petry-projects/.github ✅ |
dependency-audit.yml |
2 | 2 | 0 | 0 | 0% | ░░░░░░░░░░ | 10s | 10s | ✅ HEALTHY | |
petry-projects/.github ✅ |
dev-lead.yml |
#330 | 52 | 23 | 0 | 23 | 0% | ░░░░░░░░░░ | 11s | 1m36s | ✅ HEALTHY |
petry-projects/.github ✅ |
pr-auto-review.yml |
#345 | 11 | 11 | 0 | 0 | 0% | ░░░░░░░░░░ | 9s | 12s | ✅ HEALTHY |
petry-projects/.github ✅ |
pr-review-mention.yml |
#331 | 28 | 0 | 0 | 0 | 0% | ░░░░░░░░░░ | 1s | 2s | ✅ HEALTHY |
petry-projects/.github ✅ |
sonarcloud.yml |
2 | 2 | 0 | 0 | 0% | ░░░░░░░░░░ | 39s | 39s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
agent-shield.yml |
10 | 10 | 0 | 0 | 0% | ░░░░░░░░░░ | 19s | 45s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
auto-rebase.yml |
1 | 1 | 0 | 0 | 0% | ░░░░░░░░░░ | 20s | 20s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
ci-failure-analyst.lock.yml |
18 | 0 | 0 | 0 | 0% | ░░░░░░░░░░ | 1s | 2s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
ci.yml |
#244 | 10 | 10 | 0 | 0 | 0% | ░░░░░░░░░░ | 16s | 33s | ✅ HEALTHY |
petry-projects/.github-private ✅ |
codeql |
10 | 10 | 0 | 0 | 0% | ░░░░░░░░░░ | 51s | 1m6s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
content-twin-audit.yml |
1 | 1 | 0 | 0 | 0% | ░░░░░░░░░░ | 23s | 23s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
copilot-pull-request-reviewer |
1 | 1 | 0 | 0 | 0% | ░░░░░░░░░░ | 1m34s | 1m34s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
daily-pr-review-health.yml |
1 | 1 | 0 | 0 | 0% | ░░░░░░░░░░ | 1m51s | 1m51s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
dependabot-automerge.yml |
9 | 0 | 0 | 0 | 0% | ░░░░░░░░░░ | 1s | 2s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
dependency-audit.yml |
10 | 10 | 0 | 0 | 0% | ░░░░░░░░░░ | 7s | 31s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
dev-lead-retry.yml |
6 | 6 | 0 | 0 | 0% | ░░░░░░░░░░ | 7m36s | 8m23s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
lint.yml |
#342 | 8 | 8 | 0 | 0 | 0% | ░░░░░░░░░░ | 17s | 1m54s | ✅ HEALTHY |
petry-projects/.github-private ✅ |
release-notes.yml |
1 | 1 | 0 | 0 | 0% | ░░░░░░░░░░ | 10s | 10s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
sonarcloud.yml |
10 | 10 | 0 | 0 | 0% | ░░░░░░░░░░ | 42s | 54s | ✅ HEALTHY | |
petry-projects/.github-private ✅ |
test.yml |
10 | 10 | 0 | 0 | 0% | ░░░░░░░░░░ | 8s | 19s | ✅ HEALTHY | |
petry-projects/ContentTwin ✅ |
codeql |
1 | 1 | 0 | 0 | 0% | ░░░░░░░░░░ | 56s | 56s | ✅ HEALTHY | |
petry-projects/ContentTwin ✅ |
dependabot-rebase.yml |
4 | 4 | 0 | 0 | 0% | ░░░░░░░░░░ | 13s | 15s | ✅ HEALTHY | |
petry-projects/bmad-bgreat-suite ✅ |
dependabot-rebase.yml |
5 | 5 | 0 | 0 | 0% | ░░░░░░░░░░ | 20s | 24s | ✅ HEALTHY | |
petry-projects/broodly ✅ |
agent-shield.yml |
3 | 3 | 0 | 0 | 0% | ░░░░░░░░░░ | 17s | 18s | ✅ HEALTHY | |
petry-projects/broodly ✅ |
ci-failure-analyst.yml |
#243 | 12 | 0 | 0 | 0 | 0% | ░░░░░░░░░░ | 1s | 8s | ✅ HEALTHY |
petry-projects/broodly ✅ |
codeql |
3 | 3 | 0 | 0 | 0% | ░░░░░░░░░░ | 1m10s | 1m21s | ✅ HEALTHY | |
petry-projects/broodly ✅ |
copilot-pull-request-reviewer |
1 | 1 | 0 | 0 | 0% | ░░░░░░░░░░ | 1m35s | 1m35s | ✅ HEALTHY | |
petry-projects/broodly ✅ |
dependabot-automerge.yml |
3 | 0 | 0 | 0 | 0% | ░░░░░░░░░░ | 1s | 2s | ✅ HEALTHY | |
petry-projects/broodly ✅ |
dependabot-rebase.yml |
5 | 5 | 0 | 0 | 0% | ░░░░░░░░░░ | 8s | 11s | ✅ HEALTHY | |
petry-projects/broodly ✅ |
sonarcloud.yml |
3 | 3 | 0 | 0 | 0% | ░░░░░░░░░░ | 53s | 55s | ✅ HEALTHY | |
petry-projects/google-app-scripts ✅ |
dependabot-rebase.yml |
#317 | 5 | 5 | 0 | 0 | 0% | ░░░░░░░░░░ | 22s | 23s | ✅ HEALTHY |
petry-projects/markets ✅ |
dependabot-rebase.yml |
#215 | 6 | 6 | 0 | 0 | 0% | ░░░░░░░░░░ | 10s | 11s | ✅ HEALTHY |
petry-projects/.github 🟡 |
compliance-retrigger.yml |
1 | 0 | 1 | 0 | 100% | ██████████ | 10s | 10s | 🟡 LOW-CONF | |
petry-projects/broodly 🟡 |
ci.yml |
#223 | 3 | 0 | 3 | 0 | 100% | ██████████ | 1m6s | 1m7s | 🟡 LOW-CONF |
petry-projects/broodly 🟡 |
dependabot-updates |
#240 | 1 | 0 | 1 | 0 | 100% | ██████████ | 59s | 59s | 🟡 LOW-CONF |
petry-projects/broodly 🟡 |
dependency-audit.yml |
#226 | 3 | 0 | 3 | 0 | 100% | ██████████ | 42s | 45s | 🟡 LOW-CONF |
Failed Runs
petry-projects/.github / compliance-retrigger.yml
| Run | Date | Duration | Link |
|---|---|---|---|
| #7 | 2026-05-27 | 10s | view |
petry-projects/.github-private / dev-lead.yml
| Run | Date | Duration | Link |
|---|---|---|---|
| #5509 | 2026-05-27 | 0s | view |
| #5508 | 2026-05-27 | 0s | view |
petry-projects/.github-private / pr-review-mention.yml
| Run | Date | Duration | Link |
|---|---|---|---|
| #2175 | 2026-05-27 | 0s | view |
petry-projects/.github-private / pr-review.yml
| Run | Date | Duration | Link |
|---|---|---|---|
| #2272 | 2026-05-27 | 0s | view |
| #2261 | 2026-05-27 | 25s | view |
petry-projects/broodly / ci.yml
| Run | Date | Duration | Link |
|---|---|---|---|
| #773 | 2026-05-27 | 1m6s | view |
| #772 | 2026-05-27 | 1m7s | view |
| #771 | 2026-05-27 | 1m2s | view |
petry-projects/broodly / dependency-audit.yml
| Run | Date | Duration | Link |
|---|---|---|---|
| #686 | 2026-05-27 | 41s | view |
| #685 | 2026-05-27 | 42s | view |
| #684 | 2026-05-27 | 45s | view |
petry-projects/broodly / dev-lead.yml
| Run | Date | Duration | Link |
|---|---|---|---|
| #2163 | 2026-05-27 | 31s | view |
| #2154 | 2026-05-27 | 29s | view |
| #2152 | 2026-05-27 | 0s | view |
| #2151 | 2026-05-27 | 0s | view |
| #2145 | 2026-05-27 | 33s | view |
| #2142 | 2026-05-27 | 1m19s | view |
| #2140 | 2026-05-27 | 23s | view |
petry-projects/broodly / pr-review-mention.yml
| Run | Date | Duration | Link |
|---|---|---|---|
| #1396 | 2026-05-27 | 0s | view |
petry-projects/broodly / dependabot-updates
| Run | Date | Duration | Link |
|---|---|---|---|
| #92 | 2026-05-28 | 59s | view |
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
automated-reportCreated by automated workflowCreated by automated workflowdev-leadFor dev-lead agent pickupFor dev-lead agent pickuphealth-checkAutomated health check reportAutomated health check report
Activity
don-petry commentedon Jun 9, 2026
don-petry commentedon Jun 9, 2026
Dev-Lead Implementation Plan
Issue: #405 — petry-projects — workflow failures detected 2026-05-28
Scope
Fix two code-level root causes behind
.github-privateworkflow failures: (1)dev-lead.ymlcrashes when a trusted-bot comment arrives on an already-merged PR whose branch was deleted, becausecheckout_pr_in_worktreecallsgh pr checkouton a non-existent branch; (2) defense-in-depth skip in the intent classifier sofix-bot-commentevents on closed PRs never reach checkout at all.The
pr-review.ymlfailures are caused byDON_PETRY_BOT_GH_PATbeing a fine-grained PAT; the workflow code correctly detects this and fails fast — the fix is a secret rotation (noted as a follow-up, not a code change).Implementation Checklist
scripts/lib/pr-worktree.sh— incheckout_pr_in_worktree, add agh pr view --json statecheck beforegh pr checkout; if the PR is notOPEN, emit a notice andexit 0cleanlyscripts/dev-lead-intent.sh— in theissue_commentrouting block, after theis_prguard, check.issue.state == "closed"and emitskip pr-already-closedtests/dev-lead/unit/test_pr_worktree.bats— update theghstub to return${PR_STATE_API:-OPEN}for state queries; add two new tests (merged, closed)tests/dev-lead/fixtures/events/issue_comment_sonarqube_closed_pr.json— new fixture: same asissue_comment_sonarqube.jsonbut with"state": "closed"tests/dev-lead/unit/test_intent_reviews.bats— add test: trusted-bot comment on closed PR →skip/pr-already-closedTests to Write
test_pr_worktree.bats:checkout_pr_in_worktree: exits cleanly (status 0) when PR state is MERGEDtest_pr_worktree.bats:checkout_pr_in_worktree: exits cleanly (status 0) when PR state is CLOSEDtest_intent_reviews.bats:issue_comment: trusted-bot comment on closed PR → skip (pr-already-closed)Test Command
bats tests/dev-lead/unit/Follow-up (not in this PR)
DON_PETRY_BOT_GH_PATfrom a fine-grained PAT back to a classic PAT withrepo+read:orgscopes to resolve the ongoingpr-review.ymldegradation (tracked in [Fleet Monitor] petry-projects/.github-private — pr-review.yml #402).don-petry commentedon Jun 9, 2026
Implementation complete — issue #405
Root cause
issue_commentevents from trusted bots (SonarQube, Coderabbit, etc.) arriving on already-merged PRs were routed tofix-bot-comment. That intent callscheckout_pr_in_worktree, which runsgh pr checkout— and when the PR's head branch was deleted after merging, that command aborts withfatal: couldn't find remote ref.Fix (two layers of defence)
Layer 1 — fast-path guard in
dev-lead-intent.sh(scripts/dev-lead-intent.sh)In the
issue_commentbranch, immediately after confirming the comment is on a PR, the classifier now readsissue.statefrom the event payload. If it is"closed", it emitsskipwith reasonpr-already-closedand exits before any token spend.Layer 2 — deep safety net in
checkout_pr_in_worktree(scripts/lib/pr-worktree.sh)As the very first operation in
checkout_pr_in_worktree(beforemktemp, before the EXIT trap), agh pr view --json statecall checks the PR state. If notOPEN, it prints a::notice::annotation and exits 0 cleanly. This catches any path that reaches the function regardless of the intent classifier.The state check must be before the EXIT trap — placing it after (the initial broken placement) caused the trap to capture and replay bats' own lifecycle handler when
exit 0fired, producing "Executed 2 instead of expected 1 tests" in the unit tests.Tests
test_intent_reviews.bats: new regression test — trusted-bot comment on closed PR →skip/pr-already-closedtest_pr_worktree.bats: two new regression tests —checkout_pr_in_worktreeexits cleanly for MERGED and CLOSED states; updatedghstub to handle--json statequeriestests/dev-lead/fixtures/events/issue_comment_sonarqube_closed_pr.jsonVerification
feat: implement issue #405 — petry-projects — workflow failures detec…
feat: implement issue #405 — petry-projects — workflow failures detec…
feat: implement issue #405 — petry-projects — workflow failures detec…
feat: implement issue #405 — petry-projects — workflow failures detec…
feat: implement issue #405 — petry-projects — workflow failures detec…