Skip to content

Leave a shipped milestone open when it still holds open items - #4813

Open
allister-beamable wants to merge 1 commit into
mainfrom
milestone-straggler-guard
Open

Leave a shipped milestone open when it still holds open items#4813
allister-beamable wants to merge 1 commit into
mainfrom
milestone-straggler-guard

Conversation

@allister-beamable

@allister-beamable allister-beamable commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

What

Follow-up to #4701. The Close shipped milestone step in release-unity.yml now checks the milestone's open_issues before closing it. If anything is still open, the milestone is left open and each straggler is named in the log.

Why

Closing a milestone does not close or detach its open issues - they stay open, stay attached, and stay findable with is:open milestone:"Unity X.Y.Z". What closing costs is visibility: the milestone drops off the default milestones view and its progress bar reads complete, so an overlooked issue keeps being overlooked.

A milestone that still holds open items also has not, in fact, shipped everything it claims. Leaving it open is the honest state and puts the triage where it belongs.

Worth noting the automation is not the problem here. Four closed milestones in this repo carry open issues - CLI 2.0.1, CLI 4.2.0, CLI 5.1.0, Unity 1.19.20 - and all four predate #4701 and were closed by hand. Every milestone closed since #4701 merged has zero stragglers. This change closes the remaining gap: that it closed silently.

Behavior

Milestone state Before After
No matching open milestone warn warn (unchanged)
Matches, nothing open close close (unchanged)
Matches, N items still open close silently leave open + warn per item

Deliberately not a failure. #4701 asked whether a missing milestone should fail as a hygiene gate; the answer here is no. A release is the moment least tolerant of a spurious delay, and a red job two steps removed from the artifact would obstruct exactly then. Every path exits 0, including a failed API lookup.

Testing

The step's shell was extracted and exercised against a stubbed gh across four scenarios - no matching milestone, clean milestone, milestone with two open issues, and a failing API call. All four produce the intended output and exit 0. The workflow file parses as YAML.

Sample output for the straggler case:

::warning::Milestone 'Unity 6.1.0' still has 2 open item(s), so it was left OPEN. Move them to the next milestone, then close 'Unity 6.1.0' by hand.
::warning::still open in milestone: #1234 Bundles CLI verbs still registered
::warning::still open in milestone: #1235 Folder meta backfill missing

Note

Leaves the inputs.dryRun == false guard in place rather than folding in the pending dryRun removal, to keep this diff to one concern.

🤖 Generated with Claude Code

The close-on-release step closed the milestone unconditionally. Closing
does not close or detach open issues, but it does drop the milestone off
the default milestones view and reads its progress bar as complete, so a
straggler stops being somewhere anyone looks.

Check open_issues before closing. When any remain, leave the milestone
open and emit a warning naming each one, so the release log says what
needs triage. Still warns rather than fails in every path, including a
failed API call, so it cannot block or redden a release.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@allister-beamable
allister-beamable force-pushed the milestone-straggler-guard branch from 4e52762 to 3aafd7b Compare August 27, 2026 18:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant