Skip to content

fix(release): compare draft asset names with deterministic collation - #243

Draft
raiseCatError wants to merge 2 commits into
mainfrom
fix/release-draft-asset-order-20261112
Draft

raiseCatError wants to merge 2 commits into
mainfrom
fix/release-draft-asset-order-20261112

Conversation

@raiseCatError

Copy link
Copy Markdown
Owner

Observed failure

Release publish run 43085872196 failed in Verify the draft's assets byte for byte after successfully creating the five-file v2.1.0 draft. The GitHub CLI's jq sort lists uppercase MeowDisplay* before lowercase appcast*, while the runner's locale-sensitive POSIX sort puts lowercase files first. The lists have identical members; the differing collation caused a false-negative and skipped the actual downloaded-asset verification.

Bounded correction

Use LC_ALL=C sort for the expected names, matching jq's bytewise ordering. This changes only the comparison order, not the membership requirement, artifact SHA-256 check, signing/notarization verification, release gate, or publish/revert sequence.

Evidence and verification

  • Failing lists from run: MeowDisplay.dmg MeowDisplayReceiver.dmg SHA256SUMS.txt appcast-receiver.xml appcast.xml vs appcast-receiver.xml appcast.xml MeowDisplay.dmg MeowDisplayReceiver.dmg SHA256SUMS.txt.
  • Both contain the same five expected filenames. ASCII/C sort matches jq's sort for these filenames.
  • Review GitHub's release-tooling check and remaining required CI checks. No live GitHub Release publication, physical-device test, or rerun is claimed here.

Important: release recovery remains separate

Do not merge this into release/2.1.0 or advance that branch merely to apply this fix. iOS 2.1 is already published against immutable release candidate 94c796fc34fd699776764d67d2f26013909a308e; moving the release head would create a different candidate. A v2.1.0 draft remains after the failed run, and release-state records publication failed. A normal rerun of the original immutable release workflow still carries the old comparison and refuses an existing draft. Recovery requires a separately reviewed, fail-closed procedure that verifies the draft byte-for-byte, retains its SHA and both feed signatures, and preserves the explicit publication approval. Do not delete or publish the draft as part of this PR.

Scope: only .github/workflows/release-publish.yml; no app code, release config, credentials, environment protection, store publication, or release-state mutation.

This branch has not been deployed

No deployments
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