Skip to content

Publish reviewed GitHub Releases to crates.io using shared tooling #259

Closed

Description

@acgetchell

Goal and prerequisite

Publish the la-stack crate to crates.io automatically after a reviewed, stable GitHub Release is published, using this repository's own deployment workflow and an exact published shared-tooling pin.

Target the approved la-stack v0.5.0 release, replacing the previous v0.4.7 release plan. Configure and verify the publishing workflow before that release; close this issue only after the approved release is successfully published and its crates.io availability is verified.

Shared capability: acgetchell/research-repo-tools#50, delivered in the published research-repo-tools v0.1.8 release. The native GitHub blocker records that capability prerequisite. Coordinate the workflow with the exact published shared-tooling pin adopted through #276, which targets research-repo-tools v0.1.9 for la-stack v0.5.0. Package publication and consumer adoption retain their separate acceptance gates.

Verified current surface and local requirements

The current workflow inventory has no crates.io publishing job. .github/workflows/release-benchmarks.yml is dispatched manually for release benchmark assets. The root Cargo package is la-stack; the workspace also contains benches/comparison, with the root as its default member.

Implementation and ownership

  • Adopt the published common release-validation contract and consumer workflow template. Keep workflow triggers, publisher registration, environment approvals, Actions permissions, crate selection, Cargo packaging/publishing commands, feature/MSRV/platform tests and scientific release policy here.
  • On the reviewed stable release: published event, verify repository identity, immutable tag/commit identity, default-branch ancestry, tag/package version and release-note consistency, and required successful checks for that exact commit. Reject draft/prerelease or mismatched events; missing/failed/pending checks are not success.
  • Configure crates.io Trusted Publishing with the reviewed repository/workflow/environment identity and the minimal OIDC job permissions. Follow current upstream setup/first-publication requirements. Record the actual configured publisher/environment evidence; committed YAML alone does not prove account settings are applied.
  • Use native Cargo package verification/dry-run before a guarded upload. Explain source/artifact identity honestly rather than assuming the PyPI build-once transfer model. Serialize publication for a crate/version and handle retries, already-published versions, partial upload success and registry-index delays explicitly. Never move a published tag or blindly retry an upload after a visibility timeout.
  • Document routine Just/release commands, manual recovery and registry verification; remove only the generic duplication actually replaced by the published shared contract.

Acceptance criteria

  • Published research-repo-tools v0.1.8 or a later compatible exact pin and lockfile are adopted; no sibling checkout or unpublished-package dependency.
  • Repository-owned workflow passes action/security checks and handles rejected events, wrong tag/version/commit, missing or failing checks, unavailable dependencies, and reruns without publishing during PR tests.
  • Required native Rust/platform checks and clean package dry-run pass for the release commit; repository scientific and feature coverage is retained.
  • Trusted-publisher identity, environment restrictions/approvals and permissions are configured and verified separately from the workflow source.
  • The next approved release produces a successful workflow run and the expected crates.io version; verify registry availability and a clean downstream resolution/install as appropriate. Do not publish a throwaway version merely to test automation.
  • Record release tag, commit, workflow run and registry evidence in this issue, including any failure/recovery. Closing the issue requires verified publication, not just merged YAML or a published GitHub Release.

References: Cargo publish behavior and crates.io Trusted Publishing.

Activity

  1. added this to the v0.5.0 milestone on Oct 10, 2026
  2. acgetchell commented on Oct 17, 2026

    @acgetchell
    OwnerAuthor

    Verified the approved la-stack v0.5.0 publication and completed the rollout criteria.

    • Release commit: 5d8f5b4ea1c0bd708cd748b86f426960b7597ab7. The GitHub release is published, stable and immutable. The repository adopts the exact published research-repo-tools==0.1.9 pin through uv.lock.
    • Native CI passed for this commit, including Linux/macOS/Windows builds and the required analysis checks. The publishing workflow's verification job also passed the release evidence gate and clean default/exact Cargo package dry-runs.
    • Release benchmark run succeeded. The durable release asset is la-stack-v0.5.0-criterion-baseline.tar.gz, 1,180,273 bytes, SHA-256 60b61254fba0a594d1ae98c88776b72091bea593e542d5e4b177781d154a9077.
    • Publishing run 39016703044 succeeded for the exact release commit. Both verify and publish completed successfully. The log records successful GitHub OIDC authentication, exchange for a short-lived crates.io trusted-publishing token, upload of la-stack v0.5.0, registry availability verification, and token revocation.
    • Live GitHub configuration was checked separately from the YAML: the crates-io environment requires reviewer acgetchell, disables administrator bypass, and permits only selected deployment tags matching v*. Approval history records acgetchell approving this run's environment deployment. The selected-action allowlist includes the exact pinned rust-lang/crates-io-auth-action@c6f97d42243bad5fab37ca0427f495c86d5b1a18. The successful token exchange from acgetchell/la-stack / publish-crates.yml / crates-io provides execution evidence that the trusted-publisher registration is active. The publication job has only contents: read, checks: read, and id-token: write.
    • just release-verify v0.5.0 passed locally after publication, verifying the stable release, required baseline asset and exact non-yanked registry version. crates.io version: archive checksum bb2a5e6ddc1c25ec4282811092431c844b04cad78617e07d9d56ff600274dbfd.
    • A disposable consumer with a fresh Cargo home resolved la-stack@=0.5.0 from crates.io and passed cargo check --locked first with default features and then with exact, using Rust 1.99.0. The downloaded .crate SHA-256 matches the registry checksum recorded in its Cargo lockfile.

    Recovery history: the first benchmark run exhausted its cold setup budget; #284 corrected that before the draft tag was updated and the successful fresh benchmark run above was started. Publication preparation also exposed two local Just-wrapper defects: prerequisite diagnostics polluted redirected release notes, and release-publish omitted the shared CLI's required --approve. Clean generated notes and the explicit approved shared CLI command resolved preparation; the resulting release event triggered the successful automated crates.io publishing run. A focused post-release recipe correction is being validated separately. No published tag was moved and no upload retry was needed.

    All acceptance criteria are satisfied; closing as completed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions