Repo: motir-core. One PR. Re-scoped 2026-08-10 by THE REPLAN ACTION. The original diagnosis on this card was false and has been replaced — see What the original card claimed, and what is actually true below. Its two salvageable deliverables were carved out: MOTIR-2612 (the credential-free content check, this card's old AC 5) and MOTIR-2613 (cutting cli-v0.2.1, now release hygiene rather than a fix).
A reader following /docs/sandbox types the step-4 command and gets:
node@…:/workspace$ motir login
Error: Unknown command "login".
Hint: Run `motir help` to see the available commands and topics.
That is real and reproducible. It is not caused by the published image lagging.
The guide never tells anyone to pull. lib/apiDocs/sandbox.ts step 2 (start-the-container, rendersRunCommand: true) renders only docker run -it --name motir-sandbox … (the builder at :85–:92). Step 3's dev-container alternative pins "image": "${SANDBOX_IMAGE}:claude" in .devcontainer/devcontainer.json (:239). Step 1's prose even says "There is no build step — you pull" (:156) — but no rendered command anywhere in the guide is a docker pull.
docker run does not refresh a tag it already has locally. :claude is a MOVING tag: sandbox-images.yml publishes each profile as both a moving :<profile> and an immutable :<profile>-<version>. So the moving tag only ever reaches a reader who explicitly pulls it. VS Code's Dev Containers extension reuses a locally-present image the same way.
And exactly one published version produces that error. Installed from npm and run:
@motir/cli | motir -v | top-level login in motir help |
|---|---|---|
0.1.0 (cli-v0.1.0, 2026-07-30) | 0.1.0 | NO |
0.1.1 (cli-v0.1.1, 2026-08-05) | 0.1.1 | yes |
0.2.0 (cli-v0.2.0, 2026-08-08) | 0.2.0 | yes |
So a reader who ran the guide between 2026-07-30 and 2026-08-05 holds the cli-v0.1.0-era :claude permanently, and every later docker run — and every docker start -ai motir-sandbox, which the guide explicitly recommends (:208) — keeps serving it. /docs/sandbox has promised motir login that entire time.
| the card said | measured on origin/main @ 816eb501 |
|---|---|
"cli-v0.2.0's tree had no login" | False. git show cli-v0.2.0:packages/cli/src/program.ts → register(program, 'login') at :95, logout at :114; commandCatalog.ts → path: 'login' at :146. The very lines the card cited as main-only. |
"52 commits ahead, 20 touching packages/cli" | 53 total, 4 touching packages/cli; git diff cli-v0.2.0 origin/main -- packages/cli/src/program.ts is 4 lines, both copy edits. |
the published image cannot have login | False. :claude and :claude-0.2.0 are ONE index digest sha256:44d9022…, built 2026-08-08T21:43:35Z (amd64) / 22:02:39Z (arm64) by release run 31280497216 (success). Extracting /tmp/motir-cli.tgz from BOTH arch layers, installing it and running it gives 0.2.0 and lists login FIRST under SETUP COMMANDS. The anonymous token round trip succeeds, so it is public too. |
motir -v → 0.2.0 and no login | Impossible from any published artifact — see the version table. The two readings in the report came from different containers. |
docker pull ghcr.io/moooon-b-v/motir-sandbox:<profile> to step 2, ahead of the docker run, from the same AGENT_PROFILES source that already fills the run command — so the pull and the run can never name different tags.:claude MOVES and that docker run / docker start will not refresh it — a reader returning to an existing container needs docker pull and a fresh docker run with a new --name (or docker rm first), because the guide's own no---rm advice is what makes the stale container persist.devcontainer.json block, or the prose beside it, must tell the reader how to get a newer image (Dev Containers reuses a local one).:<profile>-<version> tag as the reproducible alternative, and say which to choose — that pairing is what packages/cli/sandbox/README.md's published-images table exists for.en and zh catalogs for any new copy (the catalog-parity gate), and extend the docs-page tests that already cover step rendering./docs/sandbox step 2 renders a docker pull command whose image reference is derived from the same profile source as the docker run, proven by a test that changes the profile and sees both change.docker run / docker start -ai will not fetch a newer image — in prose a reader meets before the run command, not in a footnote after it.:<profile>-<version> form is documented with a stated reason to prefer it (reproducibility) over the moving tag.en and zh catalogs; the i18n parity check passes.pnpm test passes for the changed files./docs/sandbox, read step 2, confirm the pull command names the same tag as the run command for at least two different profiles.lib/apiDocs/sandbox.ts — SANDBOX_IMAGE (:41), the run-command builder (:85–:92), step 2 start-the-container (:196), the "no build step — you pull" prose (:156), the dev-container block (:231–:260), step 4's cliCommands: ['login'] (:267).app/(public)/docs/sandbox/page.tsx — rendersRunCommand (:133) and sandboxRunCaption.packages/cli/sandbox/README.md — the published-images table carrying the immutable per-version tags..github/workflows/sandbox-images.yml — the moving-:<profile> + immutable-:<profile>-<version> publishing scheme (header, :19–:22).motir login claim is true of the currently published image, verified above.