[Sprint 14] Harden board automation reliability - #216
Conversation
…o-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
🏗️ PR Added to Squad Triage QueueThis PR has been labeled with Next steps:
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## sprint/14-board-automation-reliability #216 +/- ##
=======================================================================
Coverage 78.64% 78.64%
=======================================================================
Files 43 43
Lines 721 721
Branches 112 112
=======================================================================
Hits 567 567
Misses 108 108
Partials 46 46 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Pull request overview
Improves GitHub Project (board) automation so sprint delivery issues are intake-filtered more strictly, issue statuses transition more reliably based on PR lifecycle events, and release promotions automatically advance completed work to Released.
Changes:
- Tighten project intake to sprint-stamped issues (title + milestone) and update sprint planning playbook to reflect issue-centric tracking.
- Expand PR-driven issue status transitions (draft/reopen/unmerged close) and add a release-promotion path to move Done → Released on
dev→mainmerges. - Prevent duplicate Ralph milestone review issues and add a scheduled/manual “report-only” board audit workflow.
Reviewed changes
Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| .squad/playbooks/sprint-planning.md | Updates sprint planning instructions to reflect automatic project intake and issue-centric tracking. |
| .github/workflows/project-board-automation.yml | Extends PR event handling for board transitions and adds Done → Released promotion on release merges. |
| .github/workflows/project-board-audit.yml | Adds a scheduled/dispatchable audit job that reports status drift and PR cards on the delivery board. |
| .github/workflows/milestone-blog.yml | Adds duplicate-detection to avoid creating multiple identical Ralph milestone review issues. |
| .github/workflows/add-prs-to-project.yml | Removes PR-card auto-add workflow in favor of issue-centric board tracking. |
| .github/workflows/add-issues-to-project.yml | Tightens issue intake to sprint-stamped issues with milestones. |
Comments suppressed due to low confidence (1)
.github/workflows/project-board-automation.yml:90
getIssueProjectItemonly fetches the first 20 project items for an issue. If an issue is part of more than 20 projects, the workflow can fail to find the delivery-board item and will incorrectly skip updating status. Consider increasing the page size and/or adding pagination so the project item lookup is reliable.
const projectQuery = await github.graphql(`
query($nodeId: ID!) {
node(id: $nodeId) {
... on Issue {
projectItems(first: 20) {
nodes {
id
project { id }
}
}
| if: contains(github.event.issue.labels.*.name, 'squad') | ||
| # Only add sprint-stamped delivery issues. | ||
| if: > | ||
| contains(github.event.issue.labels.*.name, 'squad') && |
There was a problem hiding this comment.
The intake condition only matches the literal squad label. If an issue is opened/reopened with only a member label (e.g., squad:aragorn) it will be excluded from auto-intake even if it’s sprint-stamped. Consider updating the predicate to allow squad:* labels as well (similar to how other workflows treat squad labels).
| contains(github.event.issue.labels.*.name, 'squad') && | |
| (contains(github.event.issue.labels.*.name, 'squad') || | |
| contains(toJson(github.event.issue.labels.*.name), 'squad:')) && |
| await updateStatus(item.id, statusTargets.released); | ||
| core.info(`✅ Issue #${item.content.number} → Released`); |
There was a problem hiding this comment.
In moveDoneIssuesToReleased, any failure updating a single item will throw and abort the entire release promotion (leaving the board partially transitioned). Consider wrapping each per-item update in its own try/catch (and continuing), similar to moveLinkedIssues, so a transient failure doesn’t block moving the rest.
| await updateStatus(item.id, statusTargets.released); | |
| core.info(`✅ Issue #${item.content.number} → Released`); | |
| try { | |
| await updateStatus(item.id, statusTargets.released); | |
| core.info(`✅ Issue #${item.content.number} → Released`); | |
| } catch (error) { | |
| core.warning( | |
| `Failed to move issue #${item.content?.number ?? 'unknown'} to Released: ${error.message}` | |
| ); | |
| } |
| @@ -139,8 +136,9 @@ gh project item-edit \ | |||
| --single-select-option-id {IN_SPRINT_OPTION_ID} | |||
There was a problem hiding this comment.
Step 4 now relies on auto-intake, but the kickoff command still requires {ITEM_ID} and the playbook no longer describes how to retrieve the project item ID for a given sprint issue. Add a short instruction for finding the project item ID (e.g., via GitHub UI or gh project item-list filtering by issue) so the manual kickoff step is actionable.
5470119
into
sprint/14-board-automation-reliability
Closes #215\n\n## Summary\n- tighten project intake so only sprint delivery issues auto-enter the board\n- harden PR-driven board transitions and automate Done -> Released on dev -> main release merges\n- prevent duplicate Ralph milestone review issues and add a report-only board audit workflow\n\n## Notes\n- normal PR cards are removed from the main delivery board in favor of issue-centric tracking\n- sprint planning playbook updated to match the new operating model