Distribution model is set by ADR 0015:
no crates.io for v0.1.0 — ship via cargo install --git + prebuilt GitHub
Release binaries. Every step here is reversible (re-privatise the repo, edit
or delete a Release, move a tag) — the opposite of a crates.io publish.
Going public and creating a Release are hard-confirm gates (CLAUDE.md "Decision points"). Run these yourself in your own terminal.
This runbook is append-friendly: future versions add a new section.
Verified this cycle on a3ff6d4 (= v0.1.0^{commit} = the annotated, pushed tag):
v0.1.0annotated tag exists on origin →a3ff6d4(objectc0b583d8).- CI green:
fmt·clippy -D warnings·build --locked· test 368 passed / 2 skipped ·doc -D warnings. cargo deny checkok ·cargo audit0 vuln (3 allowed warns, ADR 0011).cargo package -p mcp-loadtestpackages + verifies (115 files).- Cargo.toml registry metadata complete (used by the deferred crates.io path; harmless now).
- crates.io names
mcp-loadtest/mcp-loadtest-clifree as of 2026-05-18 (only relevant if the Appendix is ever taken).
Optional quick re-confirm (safe, read-only):
git fetch origin --tags
test "$(git rev-parse 'v0.1.0^{commit}')" = "$(git rev-parse HEAD || true)" && echo "HEAD == tag" || echo "HEAD != tag (build the release from the tag)"
cargo package -p mcp-loadtest --locked # must succeedBoth distribution channels need a public repo. Cargo.toml
repository/homepage already point at the canonical URL.
- Repo is public at
https://github.com/Teerapat-Vatpitak/mcp-loadtest. -
v0.1.0tag is on origin:git ls-remote --tags origin v0.1.0→ prints…refs/tags/v0.1.0. - Push the post-tag docs commits so the public
mainmatches reality:git push origin main(carries the v0.2 backlog + the ADR 0015 doc set; thev0.1.0tag does not include them — intentional). - Smoke the first channel immediately:
cargo install --git https://github.com/Teerapat-Vatpitak/mcp-loadtest mcp-loadtest-clithenmcp-loadtest --version && mcp-loadtest doctor.
Reversibility: the repo can be set private again; nothing is permanent here.
.github/workflows/release.yml (hand-rolled matrix — not cargo-dist) builds
the mcp-loadtest binary for x86_64-unknown-linux-gnu,
aarch64-apple-darwin, x86_64-apple-darwin, x86_64-pc-windows-msvc, then
creates the GitHub Release (if absent) and attaches each archive + its
.sha256. Future v* tag pushes run it automatically; v0.1.0 was tagged
before the workflow existed, so trigger it once manually:
gh workflow run release.yml -f tag=v0.1.0(Or: GitHub → Actions → release → Run workflow → tag = v0.1.0.)
Watch the run:
gh run watch "$(gh run list --workflow=release.yml --limit 1 --json databaseId -q '.[0].databaseId')"Do not delete-and-repush the v0.1.0 tag to trigger CI — moving a pushed
tag is destructive and needs explicit sign-off; workflow_dispatch exists so
you don't have to.
- Workflow green; binaries built for all 4 targets.
The workflow already created the Release with notes + assets — no manual
gh release create. Verify:
gh release view v0.1.0 --json assets -q ".assets[].name"
cargo install --git https://github.com/Teerapat-Vatpitak/mcp-loadtest mcp-loadtest-cli
mcp-loadtest --version- 4 archives + 4
.sha256attached;cargo install --gitworks. - A Release can be edited or deleted later — nothing append-only here.
- HN / lobste.rs / r/rust per DESIGN.md §10. Lead with the deadlock demo;
install line is the
cargo install --gitone (notcargo install).
- Everything here is reversible — the whole reason for ADR 0015. Repo → private again; Release → edit/delete; binaries → re-upload; tag → (with sign-off) move. Contrast crates.io: a version there is permanent.
- Post-tag commits (v0.2 backlog
4729fb1, the ADR 0015 doc set) are not inv0.1.0. Intentional — planning/distribution docs must not mutate a shipped tag. The tag is the code;mainis where the docs move forward. - If a Bash/permission rule blocks a step inside Claude, run it in your own terminal; nothing about this release requires it to run inside Claude.
Recorded for the future revisit (trigger: 0.x API stabilises, or a real external library consumer asks). Append-only — only do this when the name/API commitment is acceptable.
# scoped token (publish-new + publish-update) at https://crates.io/settings/tokens
cargo login
git switch --detach v0.1.0 # publish from the exact tagged commit
cargo publish -p mcp-loadtest --locked
# wait ~1–2 min for the index
cargo publish -p mcp-loadtest-cli --locked
git switch mainWhen this is taken, update README/DESIGN install lines back to plain
cargo install mcp-loadtest-cli and write the follow-up ADR that closes ADR
0015's revisit question.