Execution core release process

August 30, 2026 ยท View on GitHub

This adapter releases only the host-neutral wsr-execution package. DSH Execution, Studio, and suite bundles are independently versioned and released from firestige/wsr-dsh. A stable tag is the output of qualification and component-first repinning, never a qualification trigger. Common identity and recovery rules are in the release automation guide.

Required order

flowchart LR
  A[Candidate on release/next] --> B[Acceptance and coordinate gates]
  B --> C[Materialize one manifest-bound core tgz]
  C --> D[Create x.y.z-rc.N prerelease]
  D --> E[Redownload and verify exact assets]
  E --> F[Attach qualification evidence]
  F --> G[Squash component to main and repin superproject]
  G --> H[Publish exact wsr-execution tgz]
  H --> I[Verify registry digest and metadata]
  I --> J[Create stable tag and Release last]

Changed bytes require a new -rc.N; an RC is never overwritten. Stable promotion targets the qualified RC commit and reuses its assets even when the component main branch contains the squash commit.

1. Prepare and qualify locally

pnpm release:check-coordinates
pnpm release:artifacts <release-directory>
pnpm release:verify <release-directory>
pnpm release:publish-npm <release-directory> # dry recovery plan

The verified builder produces one wsr-execution-<version>.tgz, its publication record, release-notes.md, and release-metadata.json. Direct source publication remains fail-closed. DSH clean-profile, lifecycle, browser, and bundle-composition qualification belongs to the wsr-dsh release flow.

2. Publish and qualify an RC

Create release/next from the exact component candidate and commit this immutable request as release/request.json:

{
  "candidate_tag": "0.1.5-rc.1",
  "authority_ref": "<superproject-ref-pinning-this-candidate>",
  "authority_manifest": "release/candidates/<candidate>.json"
}

The workflow verifies the superproject Execution pin, reruns the component gates, materializes only the exact core artifact bound by the unified manifest, creates or exactly resumes the prerelease, redownloads its assets into a clean directory, verifies them, and attaches release-qualification.json. It never rebuilds candidate bytes after qualification.

3. Merge and repin before promotion

Squash-merge the component candidate to main, update the superproject submodule to that main commit, and merge the repin. Preserve the RC URL, candidate SHA, squash SHA, superproject repin SHA, and manifest digest.

4. Promote exact qualified bytes

Configure the wsr-execution npm trusted publisher for firestige/wsr-execution and release-promote.yml. Promotion verifies the candidate commit, qualification record, manifest, and release notes; publishes the one exact tgz through OIDC; verifies registry digest, description, versions, and latest; then creates the stable GitHub tag and Release as the last operation. An existing version is skipped only when its registry bytes match the immutable manifest; a different digest is a permanent collision.