cargo publish --dry-run on each of the 9 workspace crates: - Tier 1 leaves (mxaccess-codec, mxaccess-rpc, mxaccess-asb-nettcp) pass cleanly. cargo assembles each tarball, the only failure is the dry-run upload abort. - Tiers 2 + 3 (galaxy, callback, asb, nmx, mxaccess, mxaccess-compat) surface the documented "no matching package" registry-lookup failure because workspace internal deps are pinned at version "0.0.0" which doesn't exist on crates.io. Expected; resolves at actual publish time once the leaves are uploaded and indexed. cargo package --list confirms each crate ships only source + tests + small round-trip fixtures. No captures, decompiled binaries, or accidental big files. design/F48-publish-dry-run.md captures the per-crate run output, the per-crate file count, and the V1 publish recipe (bump 0.0.0 → 0.1.0 across workspace + internal-dep pins, publish in tier order, wait for indexing between tiers, tag). design/followups.md F48 entry annotated with the dry-run status. The actual publish to crates.io is deliberately not done — that needs maintainer auth + a deliberate version bump that's a release- cut decision, not a routine validation. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
3.4 KiB
F48 publish dry-run validation — 2026-05-06
This document captures the per-crate cargo publish --dry-run outcome on the V1-pre-cut workspace state. Run from rust/ against the workspace at version = "0.0.0".
Tier 1 — leaves (no internal deps)
$ cargo publish --dry-run -p mxaccess-codec --allow-dirty
Finished `dev` profile [unoptimized + debuginfo] target(s)
Uploading mxaccess-codec v0.0.0
warning: aborting upload due to dry run ← OK
$ cargo publish --dry-run -p mxaccess-rpc --allow-dirty ← OK
$ cargo publish --dry-run -p mxaccess-asb-nettcp --allow-dirty ← OK
All three pass. The cargo package step assembles the source tarball without errors; --dry-run aborts only at the network upload step.
Tiers 2 + 3 — dependent crates
$ cargo publish --dry-run -p mxaccess-galaxy --allow-dirty
Caused by:
no matching package named `mxaccess-codec` found
location searched: crates.io index
required by package `mxaccess-galaxy v0.0.0`
Identical "no matching package" failure for:
mxaccess-galaxy,mxaccess-callback,mxaccess-asb(tier 2)mxaccess-nmx,mxaccess,mxaccess-compat(tier 3)
This is expected — the workspace internal deps are pinned at version = "0.0.0" (placeholder for the as-yet-unpublished V1 cut). Cargo's registry lookup happens even with --no-verify, and 0.0.0 won't exist on crates.io until the leaves are actually published. The dependent crates will dry-run cleanly after each upstream tier lands.
Package contents
cargo package -p <crate> --list confirms each crate's tarball includes only source, tests, and fixture data — no captures, decompiled binaries, or accidental large files.
| Crate | File count | Notes |
|---|---|---|
mxaccess-codec |
27 | source + 2 round-trip fixture binaries (~1KB each) |
mxaccess-rpc |
16 | source only |
mxaccess-asb-nettcp |
12 | source only |
mxaccess-galaxy |
11 | source only |
mxaccess-callback |
9 | source only |
mxaccess-asb |
14 | source only |
mxaccess-nmx |
7 | source only |
mxaccess |
18 | source + 7 examples |
mxaccess-compat |
varies | source + 5 live tests |
What the actual V1 publish needs
Per F48's "Resolves when":
- Bump workspace version
0.0.0→0.1.0inrust/Cargo.toml[workspace.package]. - For each crate's
[dependencies]block, bump the workspace-internalversion = "0.0.0"pins toversion = "0.1.0"(path deps can stay). - Publish in tier order (1 → 2 → 3). Wait for crates.io to index each tier (~30–60s) before starting the next.
- After all 9 are live, run
cargo install mxaccessfrom a fresh checkout — should resolve cleanly without--locked. - Tag
git tag v0.1.0 && git push origin v0.1.0.
Open observations
- The
--allow-dirtyflag was used because the workspace has uncommitted edits during this validation pass; the actual publish should run from a clean working tree without that flag. Cargo.lockis included in the published tarball for binary-target crates (notablymxaccessships examples). This is the cargo default for crates with executables; library-only crates don't need it but cargo includes it anyway under the modern resolver.- No
package.excluderules were tripped: thetests/fixtures/m6-buffered/*.binfiles inmxaccess-codecare tiny (round-trip fixtures, not big captures) and are deliberately shipped because the parity tests reference them.