rename: the application ships as maxplayer, buyers are racers - #262
Merged
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
The binary, the npm packages, the release assets and the CLI's own output all
carry the product name; the crates, the state directory and the internal
identifiers do not.
`[[bin]] name = "maxplayer"` is what separates the two. Without it Cargo derives
the executable name from the package, which is why the application rename looked
like it forced a crate rename. It does not, and the crates stay `mobee`
deliberately: nothing publishes to crates.io, so those names are invisible to
users while renaming them would touch most of the workspace.
npm goes to the ruled layout -- the launcher unscoped as `maxplayer`, payloads as
`@maxplayerai/linux-*`. Directories under npm/ keep their paths: seven sites
hardcode `npm/mobee`, and nothing derives from the directory name, so moving it
would be churn with a failure mode.
package-release-asset.sh takes the artifact name as an argument rather than
hardcoding the new one. The release matrix is about to ship a second binary from
the same script, and hardcoding here would mean un-hardcoding it there.
Two renames are deliberately NOT made, both because they would change behaviour
rather than naming:
* the `buyer` and `sell` subcommands keep their tokens. `sell` cannot become
`run` because `run` already exists as a different command, and `buyer` pairs
with a self-spawn argument in daemon.rs by string -- a mismatch compiles
cleanly and fails at runtime, in the money-path daemon.
* MOBEE_HOME and ~/.mobee are untouched. That directory holds the key, the
wallet and the spend ledger; pointing it somewhere new is a migration with
its own proof obligations, not a rename.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…aths The `[[bin]]` change renames the built executable, so every path that names it had to follow. Six were missed, and `nix run` was the shipped regression: the flake's app pointed at `/bin/mobee`, which no longer exists. flake.nix meta.mainProgram, apps.default.program scripts/verify-static-artifact.sh default binary path, staged name, container invocation scripts/verify-arm64-artifact.sh the same three, plus the `^mobee <semver>` assertion scripts/verify-release-version.sh usage example docs/PACKAGING-SCOPE.md invocation example docs/SELLER-QUICKSTART.md MOBEE_BIN path .gitignore comment naming the default `-p mobee` in cargoBuildFlags stays: that selects the package, not the binary. The two artifact verifiers had a second coupling behind the first. Each stages the binary under a fixed name and then invokes that name inside a container, so renaming the staged file without the invocation would have failed at runtime rather than at build. The arm64 verifier also greps the version output for `^mobee`, which the renamed binary no longer prints. Evaluated rather than assumed: `nix eval` on apps.default.program now returns `.../bin/maxplayer`, and meta.mainProgram returns `maxplayer`. The store path stays `mobee-0.1.0` because that is the package name, which is unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… that will not exist Track B in the packaging scope is the npm install path, and its heading still named the command `npx mobee`. That package was never published, and after this PR the launcher is `maxplayer`, so the heading named an install path that cannot work in either direction. Found by re-running the acceptance predicate after the rebase rather than by re-reading it: the `npx mobee` clause came back 1, not 0, against a PR body asserting the docs no longer advertise it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
orveth
force-pushed
the
rename/maxplayer-surface
branch
from
July 29, 2026 23:03
731b2b0 to
747584e
Compare
orveth
added a commit
that referenced
this pull request
Jul 30, 2026
…285, #295) mobee-desktop probed and spawned the bin name `mobee`, which stopped existing when #262 renamed the CLI to `maxplayer`; the crate is outside default-members so the root build stays green while every spawn fails. Fix routes all three sites through one `const CLI_BIN = "maxplayer"` and splits out a testable `resolve_cli_command`. Scope narrow: MOBEE_BIN override + all wire values / crate names / paths untouched (keep-list protects wire VALUES, not the bin name). Gated: -p mobee-desktop builds green (independently re-run — CI does NOT build this crate); resolver test passes 5/5 by name (4->5); non-vacuous (assert_ne red-leg) + red-proved failing->passing on the constant. Mine to land first per market; the rename sweep rebases onto this.
orveth
added a commit
that referenced
this pull request
Jul 30, 2026
…, #217, #265, #296) #216 doctor now parses --home (mirrors sell.rs) + refuses unknown flags + names the resolved home in the key-check message. #217 doctor's agent check calls seller_agents::resolve — the exact call boot makes — via the shared build_checks, so doctor and sell_readiness_gate converge by construction. #265 did NOT reproduce (key check is already home-aware key_file_present(home)); only the cosmetic message remained, fixed under #216. Gated: doctor.rs only, scope clean (no wire/crate renames); both #216 and #217 red-proved (red on revert, restore re-grepped); independently ran cargo test -p mobee --bin maxplayer = 33 passed with all 5 teeth by name (CI does not test -p mobee — that gap is #264). Scoped to --bin maxplayer to dodge the pre-existing CARGO_BIN_EXE_mobee integ-test compile breakage (a #262 residual, tracked for #264).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The application ships as
maxplayer, buyers are racers, sellers are runners. 40 files, noCargo.lockchange.A textual rename of
mobeewould touch 141 files and collide with all nine open PRs — 35 of the 50 files under review. So this renames the surface and leaves the substrate: the binary, npm packages, release assets, repo references and the CLI's own output move; crates, the state directory and internal identifiers do not.Second push — the blast radius my own predicate missed
Bounced on gate-fail, correctly. My acceptance pattern was
release/mobee, which covers the cargo output path and nothing else. The nix output path isresult/bin/mobee, the verifiers stage to$SHIPDIR/mobeeand invoke/b/mobee, and the flake names it inmeta.mainProgramandapps.default.program. One pattern, one form, six missed sites — andnix run github:MakePrisms/maxplayeraiwas a shipped regression, pointing at a path that no longer exists.CI could never have caught it: the release workflow passes
release.ymlan explicit maxplayer path, so a green run is necessary and not sufficient, and specifically blind to every other reference to the same binary.Fixed in
731b2b0. Two further couplings surfaced only because I enumerated forms instead of grepping one:verify-arm64-artifact.shgreps the version output for^mobee <semver>, which the renamed binary no longer printsNow evaluated rather than asserted —
nix evalon a real flake evaluation, no build required:The store path stays
mobee-0.1.0because that is the package name, correctly unchanged.Third push — rebased onto dev, and a string-level collision a file-list audit can't see
#204 rewrote
scripts/crossmint-smoke.sh(561 lines) and #236 added toRELEASE.md.RELEASE.mdauto-merged; the smoke script was the one conflict.Resolved by taking dev's file byte-identically (proven with
cmp, not asserted) and then re-applying the rename by rule — a command a human types or a path on disk moves; this script's own internals and the state directory do not. Six lines:maxplayer job/maxplayer collect <job_id>no maxplayer binary at $MOBEEguard messageLeft alone: every
MOBEE_*var,~/.mobee, theMOBEE=variable, andmobee_at()— plus the three prose lines aboutmobee_at(), since renaming the noun while the helper keeps its name reads worse, not better.The collision worth naming: dev's new fixtures quote
`mobee wallet mint-complete`— and this PR changes the Rust that prints that string (wallet_cli.rs:284). A file-list audit found the file; it could not have told me a fixture string was coupled to a Rust change. To be precise about the size of it: nothing would have failed. The fixture feedsparse_quote_id, which stops at whitespace and never reads that token. But its documented purpose is fidelity to real output, so it follows the binary.That is checkable here rather than in CI, because the script ships its own parser suite:
What makes the binary rename separable
There was no
[[bin]]section anywhere in the workspace, so Cargo was deriving the executable name from the package — which is why the application rename looked like it forced a crate rename. It doesn't:Crates stay
mobeedeliberately — 81 of the 141 files live there, nothing publishes to crates.io, so users never see those names. A comment incrates/mobee/Cargo.tomlsays so, so the next reader doesn't file it as an oversight.npm
The ruled layout: launcher unscoped as
maxplayer, payloads as@maxplayerai/linux-x64|arm64asoptionalDependencies.Directories under
npm/keep their paths. Nothing derives from the launcher directory name, but seven sites hardcode the literal path (release.yml:51/301/302,npm-pack-local.sh:24,verify-release-version.sh:67/71/72). "Nothing depends on it" ≠ "nothing references it" — a rename is only free when both hold. The payload dirs must keep thecli-<platform>shape regardless: the publish guard globsnpm/cli-*/and derives the platform from the basename.The payloads stay scoped, so
--access publicin the publish job remains load-bearing rather than vestigial.The artifact name is now an argument
package-release-asset.shtakes the name as$5instead of hardcoding it. The release matrix is about to ship a second binary from this same script — the runner, built--features acp,wallet— and hardcodingmaxplayerhere would mean un-hardcoding it in the very next PR. Making the next change's premise true is naming work.Proven locally, including the negative legs:
${5-default}and not${5:-default}on purpose: the colon form substitutes for an argument passed-but-empty, which is exactly how an unset caller-side variable arrives — and defaulting there would quietly produce a racer-named archive for a caller that thought it named something else. My first version used the colon form, which made the empty-name check unreachable; the red leg caught it.An invariant now stated at its site
release.yml's npm publish step constructs the asset filename rather than globbingdist/. Once the runner artifact exists, a glob there would publish whichever archive sorted first — which is how a seller binary ends up on the registry under the racer's package name. There is now a comment saying so, because the constructed form looks like something a later cleanup would "simplify".asset-<platform>→asset-racer-<platform>, andverify-buyer-surface.sh→verify-racer-surface.sh, so the runner PR is purely additive: it adds a matrix dimension and a sibling verifier, renaming nothing.Two renames deliberately NOT made
1. The
buyerandsellsubcommand tokens stay.sellcannot becomerun—runalready exists as a different command (agent execution).runnerwas rejected as too close torunfor a money CLI.buyeris the sharper one.cli.rsmatchesSome("buyer")anddaemon.rspasses.arg("buyer")to spawn itself — a string-to-string pairing the compiler cannot check. Rename one and the buyer daemon fails to spawn at runtime, having compiled cleanly.⚠ And the tests that would catch it never run. CI runs
cargo test -p mobee-corefour times andcargo test -p mobeezero times, socrates/mobee/tests/cli_e2e.rsandmcp_daemon.rs— the latter being the connect-or-spawn acceptance test — are never executed. Filed separately; it is not this PR's to fix, but it is why the token rename waits for a PR whose correctness someone can actually demonstrate.How this surfaced is worth a line: I had already written
maxplayer runinto a Dockerfile comment as a substitution formobee sell, because the rename made them sound like the same command. They aren't. That is a rename inventing a behaviour change, and it would have shipped as a one-word comment edit.2.
MOBEE_HOMEand~/.mobeeare untouched. 34MOBEE_*variables, plusENV MOBEE_HOME=/datain the Dockerfile and live seats. That directory holds the0600key,buyer.sqliteand the spend ledger. AMAXPLAYER_HOMEdefaulting to~/.maxplayerwould silently start every existing install with an empty wallet while real balances sat at the old path. That is a migration needing old-var fallback and a balance read either side of it — not a rename.Same principle covers the Dockerfile's
-p mobeebuild flag and its unix service account, both substrate.Also here
RELEASE.mdrecords the version scheme, because it is forced rather than preferred: plain0.x.y, no-rcsuffix. Any hyphen makes the workflow treat the release as a pre-release, and a pre-release publishes under thercdist-tag only — leavinglatestunset andnpx maxplayerwith nothing to resolve. The dist-tag branch's own reasoning assumes a stable already exists; the first release is the one case it doesn't cover. The doc keeps the caveat that thelatest-unset half is npm's documented behaviour and has not been executed here, along with the one-command repair if it ever bites.The docs also stop advertising
npx mobee— that package was never published (registry.npmjs.org/mobee→ 404, against anexpress→ 200 control), so we were documenting an install path that could not work.Acceptance
Every clause measured, both directions, before and after:
Re-measured on the rebased tree, not carried over from the previous push. Each row states the predicate, because a count alone proves you counted — not that you counted the right set.
The both-directions check is the point: a blanket
s/mobee/maxplayer/would have broken the build via-p mobeeand silently kept old binary paths elsewhere. Either half alone is a half-verified rename.The two diff lines that touch substrate are the interesting ones, not exceptions to wave past — both carry a moving token and a staying one on the same line:
⚠ Two numbers in the previous version of this body were wrong, both true measurements of a set I hadn't defined:
-p mobeeread 6 where the tree has 18, andMOBEE_*read 34 against 33 distinct. Neither was load-bearing, which is exactly why they went unchecked — so the rows above are now predicates over the diff rather than counts of the tree.⚠ Not verifiable here: nothing was compiled. There is no Rust toolchain on this box (nix only), so the
[[bin]]change is asserted from Cargo's documented behaviour, not from a build. CI proves it —Verify the version matches the releasetakes the binary path as an argument and dies withno executable at …if the name is wrong. If it fails, the fallback is renaming the crate.