Skip to content

fix(release): recover partial immutable drafts#1286

Merged
joshuajbouw merged 1 commit into
mainfrom
fix/release-draft-recovery
Jul 20, 2026
Merged

fix(release): recover partial immutable drafts#1286
joshuajbouw merged 1 commit into
mainfrom
fix/release-draft-recovery

Conversation

@joshuajbouw

@joshuajbouw joshuajbouw commented Jul 20, 2026

Copy link
Copy Markdown
Member

Linked Issue

Closes #1285

Summary

Make immutable release publication resumable after an interrupted asset upload without replacing any uploaded bytes.

Changes

  • upload immutable release assets sequentially to avoid concurrent policy races
  • reconstruct and authenticate the complete signed candidate on every attempt
  • verify existing draft payloads and Sigstore bundles, then upload only missing assets without clobbering
  • reauthenticate the complete remote asset contract before publication

Verification

  • python3 scripts/test_release_draft_recovery.py
  • python3 scripts/test_release_publication.py
  • python3 scripts/test_release_manifest.py
  • bash scripts/test_channel_workflow_contract.sh
  • actionlint .github/workflows/release.yml
  • git diff --check

Checklist

  • Linked to an issue
  • CHANGELOG.md updated (entry under [Unreleased])

@joshuajbouw
joshuajbouw marked this pull request as ready for review July 20, 2026 00:13
Copilot AI review requested due to automatic review settings July 20, 2026 00:13

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR makes immutable GitHub release publication resumable after an interrupted draft asset upload, ensuring previously uploaded assets are not replaced and that the final draft is fully re-authenticated before publication.

Changes:

  • Add a recovery planner (scripts/release_draft_recovery.py) plus tests to detect missing assets and validate any already-uploaded draft assets against the local candidate.
  • Update the release workflow to (a) always reconstruct and verify the signed candidate, (b) download and validate any existing draft assets, and (c) upload only missing assets sequentially.
  • Update CI path filters and changelog entry to reflect the new recovery behavior.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated no comments.

Show a summary per file
File Description
scripts/release_draft_recovery.py New helper to validate existing draft assets and compute the minimal missing upload set without clobbering.
scripts/test_release_draft_recovery.py Unit tests covering partial drafts, unexpected assets, byte mismatches, and symlink rejection.
.github/workflows/release.yml Implements sequential recovery uploads and re-authentication of both local candidate and recovered remote asset contract.
scripts/test_channel_workflow_contract.sh Extends workflow contract assertions to cover recovery script invocation and sequential upload behavior.
.github/workflows/ci.yml Ensures CI runs and path filters include the new recovery script and its tests.
CHANGELOG.md Documents the fix under [Unreleased].

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@joshuajbouw
joshuajbouw merged commit 726a857 into main Jul 20, 2026
23 of 24 checks passed
@joshuajbouw
joshuajbouw deleted the fix/release-draft-recovery branch July 20, 2026 00:19
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.

Recover partially uploaded immutable release drafts safely

2 participants