What happened
The v0.16.0 release run failed at release / publish-plugins:
Release 'plugin-gist-sync-v1.1.0' already exists, but its index.js differ from the
freshly built bytes. plugin-gist-sync's source changed without bumping its manifest
version ... Bump the 'version' field in plugin-gist-sync's manifest.json and re-run.
The guard was right. fix(links): open the remaining dead external links via openUrl changed src/plugins/gist-sync/SettingsPage.tsx and added openExternal.ts without bumping src/plugins/gist-sync/manifest.json, so the freshly built bundle no longer matched the published plugin-gist-sync-v1.1.0 that the live catalogue points a hash at.
This is not a request to soften the check. Skipping instead of failing would ship an app whose embedded gist-sync bytes differ from what the catalogue serves, so an uninstall/reinstall would silently hand the user the old bundle back. Failing is correct.
The actual problem: where it fires
publish-plugins is needs: [changelog, publish-tauri], so the check runs only after all six desktop targets have built — ~20 minutes in, and after tag has already created an immutable v0.16.0. At that point the cheap fix (amend the offending commit) no longer exists; the bump has to land on a commit after the tag, and the shipped binary declares a version that no release matches.
The condition is a pure git-diff question — did any file under src/plugins/<id>/ change since that plugin's last published tag without manifest.json's version changing? It needs no build, no artifacts, and no release.
Blast radius, which is the part that hurt
publish-installers and publish-repo are both needs: [tag, release]. release failed, so both were skipped — Homebrew/winget and the apt/yum repo did not publish for v0.16.0 at all, and attach-plugin-catalog was skipped too. A one-line manifest omission silently took out every non-GitHub distribution channel for the release.
Proposal
- Add the version-mismatch check to
ci so a PR that edits a plugin's source without bumping its manifest fails review, not release.
- Failing that, make it a pre-flight job in
release.yml with no needs:, so it fires before tag and before 20 minutes of building.
- Reconsider whether
publish-installers / publish-repo should depend on the whole release job. A plugin-publishing failure should not be able to suppress Homebrew, winget and the Linux repos.
Remediation applied for 0.16.0
gist-sync manifest bumped to 1.1.1 on dev (80c0e79).
publish-plugins re-dispatched for gist-sync from that ref.
- The marketplace
plugins.json merge is still the usual manual follow-up.
- Homebrew/winget and the repo publish still need re-running for v0.16.0.
What happened
The v0.16.0 release run failed at
release / publish-plugins:The guard was right.
fix(links): open the remaining dead external links via openUrlchangedsrc/plugins/gist-sync/SettingsPage.tsxand addedopenExternal.tswithout bumpingsrc/plugins/gist-sync/manifest.json, so the freshly built bundle no longer matched the publishedplugin-gist-sync-v1.1.0that the live catalogue points a hash at.This is not a request to soften the check. Skipping instead of failing would ship an app whose embedded gist-sync bytes differ from what the catalogue serves, so an uninstall/reinstall would silently hand the user the old bundle back. Failing is correct.
The actual problem: where it fires
publish-pluginsisneeds: [changelog, publish-tauri], so the check runs only after all six desktop targets have built — ~20 minutes in, and aftertaghas already created an immutablev0.16.0. At that point the cheap fix (amend the offending commit) no longer exists; the bump has to land on a commit after the tag, and the shipped binary declares a version that no release matches.The condition is a pure git-diff question — did any file under
src/plugins/<id>/change since that plugin's last published tag withoutmanifest.json'sversionchanging? It needs no build, no artifacts, and no release.Blast radius, which is the part that hurt
publish-installersandpublish-repoare bothneeds: [tag, release].releasefailed, so both were skipped — Homebrew/winget and the apt/yum repo did not publish for v0.16.0 at all, andattach-plugin-catalogwas skipped too. A one-line manifest omission silently took out every non-GitHub distribution channel for the release.Proposal
ciso a PR that edits a plugin's source without bumping its manifest fails review, not release.release.ymlwith noneeds:, so it fires beforetagand before 20 minutes of building.publish-installers/publish-reposhould depend on the wholereleasejob. A plugin-publishing failure should not be able to suppress Homebrew, winget and the Linux repos.Remediation applied for 0.16.0
gist-syncmanifest bumped to 1.1.1 ondev(80c0e79).publish-pluginsre-dispatched forgist-syncfrom that ref.plugins.jsonmerge is still the usual manual follow-up.