Release Checklist
This checklist defines the public release bar for alpaca-rust.
Current Release Baseline
- The current published release line is
v0.26.0 .github/workflows/github-pages.ymlis the only release workflow- The release workflow publishes crates and GitHub Releases only on semantic version tags matching
v*.*.* - crates.io Trusted Publishing must remain configured for all published Rust crates:
alpaca-core,alpaca-rest-http,alpaca-data,alpaca-trade,alpaca-mock,alpaca-time,alpaca-option, andalpaca-facade - The
github-pagesenvironment must allow deployments frommainand tags matchingv*.*.* - First-time crates may require one manual
cargo publishbootstrap before Trusted Publishing can be enabled on crates.io
Public Surface
- The official published system surface is the Rust workspace only
packages/alpaca-time,packages/alpaca-option, andpackages/alpaca-traderemain optional workspace plus features and are not separate release artifacts- Root
README.mdreflects the current three-layer Rust workspace shape - Each published Rust crate has its own
README.md Cargo.tomlmetadata is present for every published Rust crate- docs.rs is the primary API-reference host
- GitHub Pages hosts narrative docs for the whole workspace
CHANGELOG.mdcontains a non-empty section for the release tag- author metadata uses
Weiming Zhai (wmzhai@gmail.com)
Verification
Run before a release:
pnpm install --frozen-lockfile
python3 tools/docs/generate-doc-site
cargo doc --workspace --no-deps
pnpm run build:website
for crate in alpaca-core alpaca-rest-http alpaca-data alpaca-trade alpaca-time alpaca-option alpaca-mock alpaca-facade; do
cargo package --list --allow-dirty -p "$crate"
done
cargo publish --dry-run --locked --allow-dirty --no-verify -p alpaca-core
cargo publish --dry-run --locked --allow-dirty --no-verify -p alpaca-time
cargo publish --dry-run cannot fully preflight downstream crates until their
new dependency versions are visible on crates.io. The release workflow therefore
performs staged dry-runs inside the dependency-ordered publish loop.
Minimal Patch Release Flow
Use this flow for a patch release. Set VERSION once and reuse it consistently.
-
Update the release metadata on
main- bump
[workspace.package].versioninCargo.toml - bump all in-workspace dependency version pins in crate
Cargo.tomlfiles - bump the website package version in
website/package.json - update versioned install snippets in
docs/getting-started.mdanddocs/installation.md - add a non-empty
## v${VERSION}section toCHANGELOG.md - ensure the three-layer crate list is consistent across
README.md,docs/, generated docs metadata, and the website - regenerate docs metadata with
python3 tools/docs/generate-doc-site
- bump
-
Run the local preflight
pnpm install --frozen-lockfile
python3 tools/docs/generate-doc-site
cargo doc --workspace --no-deps
pnpm run build:website
for crate in alpaca-core alpaca-rest-http alpaca-data alpaca-trade alpaca-time alpaca-option alpaca-mock alpaca-facade; do
cargo package --list --allow-dirty -p "$crate"
done
cargo publish --dry-run --locked --allow-dirty --no-verify -p alpaca-core
cargo publish --dry-run --locked --allow-dirty --no-verify -p alpaca-time
- Commit and push
main
git add Cargo.toml crates docs website CHANGELOG.md .github/workflows/github-pages.yml memory AGENTS.md design.md
git commit -m "chore: prepare v${VERSION} release"
git push origin main
- Create and push the tag
git tag "v${VERSION}"
git push origin "v${VERSION}"
- Watch the release workflow
gh run list --workflow github-pages.yml --limit 5
gh run watch <run-id> --interval 10 --exit-status
- Verify the published artifacts
gh release view "v${VERSION}" --json name,tagName,url --jq '.'
curl -fsS "https://crates.io/api/v1/crates/alpaca-core/${VERSION}" >/dev/null
curl -fsS "https://crates.io/api/v1/crates/alpaca-rest-http/${VERSION}" >/dev/null
curl -fsS "https://crates.io/api/v1/crates/alpaca-data/${VERSION}" >/dev/null
curl -fsS "https://crates.io/api/v1/crates/alpaca-trade/${VERSION}" >/dev/null
curl -fsS "https://crates.io/api/v1/crates/alpaca-mock/${VERSION}" >/dev/null
curl -fsS "https://crates.io/api/v1/crates/alpaca-time/${VERSION}" >/dev/null
curl -fsS "https://crates.io/api/v1/crates/alpaca-option/${VERSION}" >/dev/null
curl -fsS "https://crates.io/api/v1/crates/alpaca-facade/${VERSION}" >/dev/null
curl -I -L https://wmzhai.github.io/alpaca-rust/
Publishing Order
Publish in dependency order:
alpaca-corealpaca-rest-httpalpaca-dataalpaca-tradealpaca-timealpaca-optionalpaca-mockalpaca-facade
Wait for crates.io index visibility before publishing each dependent crate.
GitHub Automation
- Release automation runs from
.github/workflows/github-pages.yml - crates.io publication uses Trusted Publishing from GitHub Actions
- staged
cargo publish --dry-run --no-verifychecks run immediately before each real publish in dependency order - GitHub Pages deploys from release tags
- GitHub Release creation runs only from the tag workflow path
- First-time crates should be published manually once before relying on Trusted Publishing in CI
Failure Recovery
- If the workflow fails before any crate is uploaded, fix the issue on
main, bump to the next patch version, and tag that new version - If the workflow already published some crates for a version but the tagged source is incorrect, fix
main, bump to the next patch version, and tag that new version instead of reusing the partial release - If the workflow file itself is broken on the tagged commit, do not reuse that tag; fix
main, bump to the next patch version, and tag again - If GitHub Pages deployment is blocked by environment rules, fix the
github-pagesenvironment and rerun the same workflow - If the GitHub Release step fails after crates and Pages already succeeded, create or edit the GitHub Release for the same tag instead of republishing crates