release: close issues addressed by a release (feedback-loop closeout) - #127
Conversation
Adds scripts/resolve_addressed_issues.py, run post-publish by release.yml, to close the GitHub issues a release has fixed. A changelog fragment marks a fix with an own-line 'Addressed: #N' (deliberately not GitHub's merge-time 'Fixes #N'), and the resolver diffs CHANGELOG.md + changelog.d/ across the release tag window, then for each open issue on this repo posts the version + release URL as evidence, applies the resolved-in-release label, and closes it. Fail-safe: explicit markers only, open issues only, idempotent, bounded, and non-fatal (a close failure never fails the build). Pure marker parser is unit-tested (12 cases); job-scoped issues:write. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Grok review (HIGH) caught a false-closure: changelog.d/README.md carries example 'Addressed: #N' lines, and the scan diffed the whole changelog.d/ dir, so the next release would falsely close the example issue. Fix: scan_pathspec() excludes README.md and archived/ (the compiled CHANGELOG.md always carries a real marker, so nothing is lost), and the README example uses a non-extractable placeholder. Reliability (MEDIUM): per-call subprocess timeout + a 5-minute step timeout so a hung gh can't run to the job deadline, and the per-issue state probe now sits inside the non-fatal try. Adds scan-path, issue-zero, and cap tests (17 total). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
You have reached your Codex usage limits for security reviews. Please try again later. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f8384c0f11
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| _run(["gh", "issue", "edit", str(number), "--repo", repo, | ||
| "--add-label", _RESOLVED_LABEL], check=False) |
There was a problem hiding this comment.
Handle label failures before reporting successful resolution
When gh issue edit fails—for example because of a transient API error—the discarded return code allows the subsequent close to succeed and the script to report the issue as resolved even though resolved-in-release was never applied. This can affect every issue in the run if label creation also failed, because label_ensured is still set; gh issue edit --help identifies --add-label as the operation that adds the label, so its failure should be checked or at least surfaced rather than silently losing the release audit metadata.
Useful? React with 👍 / 👎.
Closes the feedback loop opened by the workspace plugin-error reporting rule: sessions file GitHub issues on plugin errors, and now the release that fixes them marks them resolved.
Mechanism. A changelog fragment marks a fix with an own-line
Addressed: #N(deliberately NOT GitHub's merge-timeFixes #N, so closure happens when the signed build ships, not at merge). Post-publish,release.ymlrunsscripts/resolve_addressed_issues.py, which diffsCHANGELOG.md+changelog.d/across the release's tag window, and for each open issue posts the version + release URL as evidence, appliesresolved-in-release, and closes it.Fail-safe by construction: explicit markers only (no text matching);
scan_pathspec()excludeschangelog.d/README.mdandarchived/so example/already-released markers can never false-close; open issues on this repo only (PRs skipped); idempotent; bounded per-run cap; per-call + step timeouts; every per-issue action non-fatal (a close failure never fails the published release). Job-scopedissues: write. Preview with--target-rev HEAD --dry-run.Review. Grok (xai, distinct family)
review.repository: round 1 REQUEST_CHANGES caught a real HIGH false-closure (the README exampleAddressed: #125would have closed issue #125 on the next release) + two MEDIUM reliability gaps; all fixed (README exclusion + placeholder, subprocess/step timeouts, per-issue try scope, added tests). Re-verify (request_id resolve-issues-review-2): SHIP, 0 findings. Verified live: the exclusion yields[]where the bug yielded[125]; issue-state probe correctly returns open / skips PRs / skips missing. 17 parser/scan/cap tests (run by the release gate'sscriptsdiscovery).🤖 Generated with Claude Code
author: claude
standing_directives: operator direction 2026-08-19 (close the plugin-error feedback loop at build time; marker + version evidence, hard-close); reliable/simple/elegant baseline; Tier-2 process
tier: 2
cross_check: Grok (xai, distinct from author) review.repository frontier/maximum — round 1 REQUEST_CHANGES (1 HIGH false-closure + 2 MEDIUM), all integrated; re-verify request_id resolve-issues-review-2 verdict SHIP, 0 findings (execution receipt emitted)
post_condition: a release closes issues explicitly marked Addressed: #N in its tag window, with version+URL evidence and the resolved-in-release label; non-fatal, README/archived excluded, open-issue-only, bounded
mcp_coverage_gap: NONE
plugin_affected: NONE (release tooling + workflow only; no packaged content or version change)
readme_refresh_status: changelog.d/README.md documents the Addressed: marker convention
contributor_rights: OWNER-AUTHORED
operator_reserved: no