Skip to content

release: the version check expects the name the artifact ships as - #277

Merged
orveth merged 1 commit into
mainfrom
fix/release-version-shipped-name
Jul 30, 2026
Merged

release: the version check expects the name the artifact ships as#277
orveth merged 1 commit into
mainfrom
fix/release-version-shipped-name

Conversation

@orveth

@orveth orveth commented Jul 30, 2026

Copy link
Copy Markdown
Contributor

Unblocks the release pipeline. Dry-run #5 (run 30501403283, main 433fcea) failed on all three
platforms
at Verify the version matches the release, immediately after each Build succeeded:

verify-release-version: target/aarch64-apple-darwin/release/maxplayer reports 'maxplayer 0.1.0',
expected 'mobee 0.1.0' — this artifact was built from a different tree

The binary is right and the verifier was wrong. verify-release-version.sh compared against a
hardcoded "mobee $VERSION", which is the crate name; the binary answers to maxplayer, because
[[bin]] name and [package] name are deliberately different and the store path stays mobee-0.1.0.

Why the rename audit could not have caught it

The rename was swept for residual forms of the old binary name — bin/mobee, release/mobee,
/b/mobee, mainProgram "mobee", apps.*.program, the arm64 ^mobee version grep. That sweep was
correct and it was complete for the forms it enumerated. This site names the binary inside a quoted
shell equality test
, [ "$reported" = "mobee $VERSION" ] — a seventh form, adjacent to none of the
six, and invisible to a path-shaped grep. The file's own usage comment already read
result/bin/maxplayer: the documentation had been renamed and the assertion had not.

The fix

The expected name is derived from the basename of the path the workflow is about to package, so it
follows the binary rather than restating it:

SHIPPED_AS="$(basename "$BINARY")"
[ "$reported" = "$SHIPPED_AS $VERSION" ] || die ...

A literal here silently commits to one of two deliberately-different names and goes stale the moment
either moves — which is precisely how this check came to expect mobee from a binary that correctly
answers to maxplayer.

It also adds coverage the literal never had: an artifact shipped under a name it does not answer to
now fails. That is the same hazard the constructed asset filename guards against upstream — a runner
published under the racer's package name would install, run, and be the wrong program.

Red-proved, not asserted

cargo is absent on the seat that wrote this, so cargo was stubbed (the script only ever reads
manifest metadata from it, never builds) and the real script was run end-to-end against real npm
manifests and stub binaries — a green control plus three distinct reds, including one for the failure
this PR fixes and one for the failure the check already existed to catch:

✅ correct artifact (maxplayer 0.1.0)              want=PASS got=PASS
✅ THE BUG: reports 'mobee', shipped as maxplayer  want=FAIL got=FAIL
✅ stale artifact (version 0.2.0)                  want=FAIL got=FAIL
✅ ships as 'runner', answers to 'maxplayer'       want=FAIL got=FAIL
✅ tree-only (no binary argument)                  want=PASS got=PASS
=== 5 passed, 0 failed ===

Base is main, deliberately

Dry-runs are workflow_dispatch against main and read the scripts from the dispatched ref, so the
fix has to be on main to re-run dry-run #5. dev == main right now, so a back-merge (fast-forward)
restores main ⊆ dev immediately after — the same shape used for #270.

Not a release. Nothing here can publish: release.yml has no branch trigger (push: tags: ['v*']
plus workflow_dispatch), and both publishing jobs are gated
github.event_name == 'push' && github.ref_type == 'tag'.

Verified nearby, needing no change

  • npm is already coherentnpm/mobee/ declares name maxplayer with bin maxplayer, and the
    platform packages are @maxplayerai/linux-x64 / @maxplayerai/linux-arm64 with bin/maxplayer. So
    npx maxplayer resolves once published; the directory name is cosmetic.
  • t=mobee staysMOBEE_TAG in gateway.rs and the two kinds.js files is a nostr wire
    value
    , not a display name. Renaming it would break interop with every live seat.
  • cargo metadata's p.name === "mobee" lookup in this same script is correct and untouched: that one
    really is the crate.

`verify-release-version.sh` asserted the built binary reports `mobee <version>`. The binary answers
to `maxplayer`: `[[bin]] name` and `[package] name` are deliberately different, so the assertion was
comparing against the crate name. Every platform's `Verify the version matches the release` step
failed immediately after its `Build` step succeeded (run 30501403283).

The expected name is now derived from the basename of the path the workflow is about to package, so
it follows the binary instead of restating it. Six residual-grep forms of the old binary name were
swept before the rename landed — `bin/`, `release/`, `/b/`, `mainProgram`, `apps.*.program`, the
arm64 version grep — and none of them could match a name written inside a quoted equality test.

This also adds coverage the literal never had: an artifact shipped under a name it does not answer
to now fails, which is the hazard the constructed asset filename guards against upstream. The stale
artifact case the check exists for is unchanged.

Red-proved against the real script with a stubbed cargo and stub binaries: correct artifact passes,
tree-only passes, and it fails on `mobee 0.1.0` at a `maxplayer` path, on version `0.2.0`, and on a
binary shipped as `runner` that answers to `maxplayer`.
@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
mobee Ready Ready Preview Jul 30, 2026 12:09am

Request Review

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