Cut `cli-v0.2.1` — `package.json` has said 0.2.1 since MOTIR-2537 and four CLI commits sit unreleased, including a user-visible `motir link` error fix and the ACME copy rename the docs already show
Repo: motir-core. No PR — this card's deliverable is a pushed tag and the verified artifacts it produces. Carved out of MOTIR-2611 by its 2026-08-10 re-plan.
⚠️ Read this first: the reason MOTIR-2611 gave for cutting this tag was FALSE. That card asserted
cli-v0.2.0's tree predatedmotir login. It did not —git show cli-v0.2.0:packages/cli/src/program.tscarriesregister(program, 'login')at line 95 andcommandCatalog.tspath: 'login'at line 146, the same lines the card cited as main-only, and@motir/cli@0.2.0installed from npm listsloginfirst under SETUP COMMANDS. Nothing user-facing is broken today, and this tag does not fix a reported symptom. It is release hygiene. Do not restore the urgency the original card carried.
What is actually unreleased (measured on origin/main @ 816eb501, 2026-08-10)
git log --oneline cli-v0.2.0..origin/main -- packages/cli → 4 commits (MOTIR-2611 said 20; that number was wrong too):
| commit | what it changes |
|---|---|
e27a6b77 | "API tokens" → "Tokens" in the three packages/cli/src hint sites (MOTIR-2537) — the same commit that bumped package.json to 0.2.1 |
248de2d8 | the PROD example key retired for ACME across reader-facing CLI copy (MOTIR-2343 family) |
672e4931 | motir link reports the real failure instead of "not accessible" (MOTIR-2492) — the only behaviour change |
b814889e | packages/cli/sandbox/README.md records the cli-v0.2.0 digests |
So the published CLI still prints PROD-7 in its help and still says "API tokens", while /docs and the app say ACME and "Tokens". That skew is the real (small) cost of leaving this untagged, and sandbox-staleness.yml will fail on it once the drift passes its 7-day window (tag cut 2026-08-08 → fires 2026-08-15).
Why this is blocked by MOTIR-2612
A cli-v* lane replays the tag's own tree ([[tag-triggered-release-replays-tag-tree]]). If the tag is cut before MOTIR-2612's credential-free content check is on main, that check does not run on this release and the release ships ungated — which is the whole point of the pair. Cut the tag only after MOTIR-2612 has merged.
Do this
- Confirm
packages/cli/package.jsonstill reads0.2.1and thatgit log cli-v0.2.1..origin/main -- packages/cliwill be empty at tag time — if further CLI commits have landed since this card was written, re-read them and bump again rather than tagging a subset. git tag cli-v0.2.1 <origin/main sha> && git push origin refs/tags/cli-v0.2.1. Never movecli-v0.2.0— a tag lane replays its tree, and moving it silently rewrites what the existing immutable:claude-0.2.0tag and every recorded digest mean.gh run watchboth lanes the tag fires —release-cli.yml(npm, OIDC Trusted Publishing; see [[npm-cli-publish-404-is-token-auth]] if it 404s) andrelease-sandbox.yml(the GHCR profile matrix).- Verify as an OUTSIDER, and record the evidence on this card.
Acceptance criteria
cli-v0.2.1exists onorigin, both lanes it fires are green, andnpm view @motir/cli versionreturns0.2.1.git log cli-v0.2.1..origin/main -- packages/cliis empty at tag time — the tag carries every CLI commit then onmain, not a subset.- Anonymous pull check, no
Authorizationheader / registry login /packages:scope:node packages/cli/sandbox/smoke/assert-public.mjs --ref ghcr.io/moooon-b-v/motir-sandbox:claudeexits 0, run with the out-of-org controlghcr.io/astral-sh/uv:latestproven able to report "public" first. - Content, not just pull: a container from the newly published image prints
0.2.1formotir -vAND listslogininmotir help. Assert something only the new build says — asserting the pull succeeded is what let MOTIR-2131 through. - MOTIR-2612's
sandbox-commandsjob ran on THIS release and passed — visible in the release run, not inferred from its presence onmain. - The digests of the republished
:claude/:base/ every profile tag are recorded on this card and inpackages/cli/sandbox/README.md's published-images table (that README edit is the one file change, and it belongs to whoever cuts the tag).
Context refs
.github/workflows/release-cli.yml,.github/workflows/release-sandbox.yml,.github/workflows/sandbox-images.yml— the lanes the tag fires..github/workflows/sandbox-staleness.yml— the 7-day drift tripwire that makes this scheduled rather than urgent.packages/cli/sandbox/README.md— the published-images / digest table to update.packages/cli/sandbox/smoke/assert-public.mjs— AC 3's probe, control-first.
Out of scope
The docker pull gap in the guide — that is MOTIR-2611. The content-check job itself — that is MOTIR-2612.