Skip to content

chore(release): 0.6.1, published as one workspace - #213

Merged
LeadcodeDev merged 8 commits into
mainfrom
release/0.6.1
Aug 19, 2026
Merged

chore(release): 0.6.1, published as one workspace#213
LeadcodeDev merged 8 commits into
mainfrom
release/0.6.1

Conversation

@LeadcodeDev

Copy link
Copy Markdown
Owner

0.6.0 is unrecoverable: rustmotion-core 0.6.0 reached crates.io before the run
died, and a published version is permanent. This moves the workspace to 0.6.1 and
replaces the publish sequence with one that cannot repeat the failure.

No issue tracks this; it follows the failed run
32287388143.
Refs #212.

What actually failed

Not propagation timing. The wait loops polled
https://crates.io/api/v1/crates/<name>/<version>, and that endpoint rejects
requests without an identifying User-Agent under the crates.io data access
policy. curl -sf reads the rejection as failure, so the loop could never
succeed: it always spent its 150 seconds and exited 1.

The job therefore published rustmotion-core, then failed at the step meant to
confirm it. Everything downstream was skipped.

The same broken check misled the investigation of #212, where it reported "not
published" for crates that were. The authoritative source is the sparse index at
index.crates.io — what cargo itself reads — and it shows rustmotion-core 0.6.0
present and unyanked.

The guarantee this PR buys

Seven hand-rolled steps become one:

cargo publish --workspace --exclude rustmotion-studio --exclude rustmotion-cli

Cargo packages and rebuilds every selected crate from its own tarball before
uploading anything
, then uploads in dependency order and waits for index
propagation itself. If one crate fails to build from its archive, nothing ships.
That is the property the previous sequence never had: it published crate by
crate, so a defect in the fourth was discovered with the first three already
permanent.

No crates.io API call remains, so the User-Agent problem is gone rather than
worked around.

Why 0.6.1 rather than finishing 0.6.0

The three remaining crates could have been published at 0.6.0 — they depend on
rustmotion-core 0.6.0, which now exists. Bumping instead keeps the four in
lockstep and sidesteps an open question: whether cargo publish --workspace
skips an already-published version or stops on it. On an irreversible path that
question is not worth answering live.

rustmotion-core 0.6.0 stays on crates.io as a stray version. Yanking it is a
separate decision and is deliberately not part of this PR.

Verification

cargo publish --workspace --exclude rustmotion-studio --exclude rustmotion-cli --dry-run exits 0. All four crates package at 0.6.1, rebuild from their own
tarball, and the upload order is core → html → components → rustmotion.
cargo fmt --all --check is clean.

Before tagging

A tag-triggered workflow is read from the tag's own commit, so 0.6.1 must be
created after this merges, on the merge commit.

0.6.0 cannot be reused: rustmotion-core 0.6.0 reached crates.io before the run
failed, and a published version is permanent. Moving every crate to 0.6.1 keeps
the four in lockstep and leaves no version half-taken.
The seven hand-rolled steps polled https://crates.io/api/v1/crates/<name>/<version>
to wait for each crate. That endpoint rejects requests without an identifying
User-Agent, so the loop could never succeed — it always spent 150s and exited 1.
The 0.6.0 run died there, after rustmotion-core had already been published.

cargo publish --workspace packages and rebuilds every selected crate from its own
tarball before uploading anything, then uploads in dependency order and waits for
index propagation itself. Nothing ships unless all of it can.
@LeadcodeDev LeadcodeDev added the bug Something isn't working label Aug 19, 2026
@LeadcodeDev LeadcodeDev self-assigned this Aug 19, 2026
The version was written ten times — one per manifest, plus one per internal
dependency requirement. Nothing kept them in agreement, and a single stale one
fails the publish after the earlier crates have already shipped, which cannot be
undone.

[workspace.package] and [workspace.dependencies] now hold it; the six crates
inherit. The tag check reads cargo metadata instead of grepping a manifest,
since the manifest no longer contains a literal to grep.
[workspace.package] now holds the version and the six crates inherit it, but
cargo cannot inherit it into a dependency requirement: an entry in
[workspace.dependencies] must carry a literal, because a published crate cannot
depend on a bare path. So the package version and the three internal requirements
can silently disagree, and cargo only notices at publish time — once the earlier
crates are already on crates.io.

The check fails on either kind of drift: a requirement that no longer matches the
workspace version, or a crate that stopped inheriting it.
publish = false in the studio and cli manifests already keeps them out of
cargo publish --workspace and cargo package --workspace, verified by running
both without the flags: cargo selects exactly the four publishable crates.
Repeating that in the workflow duplicated a fact the manifests already carry.
cargo publish --workspace and cargo package --workspace do not treat
publish = false the same way. publish skips those crates; package archives them
anyway and fails on rustmotion-studio, which depends on rustmotion by path with
no version — an unversioned dependency cannot be packaged.

Removing the flags from both commands generalised a check run only against
publish. Reproduced locally: with the excludes the job exits 0, without them it
exits 101 on that manifest.
cargo publish --workspace already packages and rebuilds every crate from its own
tarball before uploading anything, so a packaging defect now fails the release
with nothing published. Repeating that work on every PR guarded against a risk
the tag workflow already removes.
The publish step already packages and verifies every crate before uploading, so
this catches nothing new and rebuilds all four a second time. What it buys is a
readable failure: a packaging defect now stops before the publish command runs at
all, so the log cannot be mistaken for a release that started and broke halfway —
which is how 0.6.0 ended, with one crate already on crates.io.
@LeadcodeDev
LeadcodeDev merged commit c5a61f2 into main Aug 19, 2026
3 checks passed
@LeadcodeDev
LeadcodeDev deleted the release/0.6.1 branch August 19, 2026 23:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Something isn't working

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant