Maintainer And Release Guide
Copy MarkdownLockspire release work should stay boring, reviewable, tied to repo truth, and inside the 1.0 GA support contract defined in docs/supported-surface.md.
This guide is maintainer-only release operations guidance. It does not define a second public support contract.
Normal flow
- Merge reviewed changes to
main. - Let Release Please open or update the release PR.
- Treat the Release Please PR as review-only evidence, not authenticated release proof.
- Review the release PR diff,
mix.exs,CHANGELOG.md, and the workflow/config artifacts that define the release lane. - Merge the release PR.
- Let the Release workflow cross the
hex-publishenvironment boundary onmain. - Treat the resulting protected workflow run as the only authoritative proof of authenticated
mix release.preflightandmix hex.publish --yes.
Checked-in proof stops at the merged release commit plus the repo-owned workflow and docs. Protected-environment proof starts only when the publish job in .github/workflows/release.yml enters the hex-publish environment.
Evidence boundaries
Keep release evidence in three separate buckets:
- Repo-owned proof:
.github/workflows/release.yml,.github/actions/release-please/action.yml,docs/maintainer-release.md, andtest/lockspire/release_readiness_contract_test.exsdefine the canonical lane and should stay reviewable in git. - GitHub settings proof: the live
hex-publishenvironment settings prove branch restriction tomain, admin-bypass posture, and environment-secret placement. - Workflow-run proof: one successful
hex-publishworkflow run proves the trusted job actually crossed the protected secret boundary and executedmix release.preflightfollowed bymix hex.publish --yes.
Public release claims stay anchored to docs/supported-surface.md plus the checked-in artifact chain (mix.exs, .release-please-manifest.json, CHANGELOG.md). GitHub settings and workflow-run evidence support that story, but they do not replace the canonical support contract.
Contributor gate
Contributors should have one canonical answer before merge: run mix ci.
mix ci is the maintained contributor lane and it covers:
mix qamix docs.verifymix deps.auditmix package.buildmix test.fastmix test.integration(including the canonical onboarding and OIDC e2e proofs)mix test.phase3
CI may keep those checks split into separate jobs for cacheability and diagnostics, but that workflow still needs to remain mechanically equivalent to mix ci.
Release Please generated PR checks are informative review context. They are not authoritative release proof, because trusted proof starts only after merge in the protected hex-publish lane.
Keep the Release Please invocation repo-controlled. .github/workflows/release.yml should call ./.github/actions/release-please, and that checked-in action should remain the only implementation detail between the workflow contract and the upstream release-please runtime.
Maintainer-only release gate
mix release.preflight stays additive to mix ci. It is not a second contributor command and it should remain limited to the trusted publish path.
mix package.publish-dry-run remains a required release gate, but it is enforced from the trusted release workflow where HEX_API_KEY is available. It is not a manual local verification requirement for contributor closure.
If workflow_dispatch is used, treat it as recovery-only. It is not a normal publish trigger, it does not replace the Release Please driven path, and it must target the exact commit SHA or tag being recovered.
Release candidate checklist
Before merging a Release Please PR for the root package, confirm this checked-in release-candidate contract end to end:
- Run
mix cion the candidate revision. - Review
mix.exs,.release-please-manifest.json, andCHANGELOG.mdtogether so version, package metadata, and release notes describe one embedded-library release story. - Review
release-please-config.jsonand confirm the root package still usescomponent: "lockspire",include-v-in-tag: true, andinclude-component-in-tag: true. - Confirm the expected root release tag target is still
lockspire-v<version>for the root package. For the current checked-in1.0.0candidate, that target islockspire-v1.0.0. - Review
.github/workflows/release.ymland confirm the only checked-in Release Please entry point isuses: ./.github/actions/release-please. - Confirm
.github/actions/release-please/action.ymlstill preserves root outputs such astag_nameandrelease_created, because those outputs define which merged release commit is allowed to approach the protected publish lane. - Confirm
workflow_dispatchremains recovery-only, requires bothrecovery_reasonandrecovery_ref, and is documented as replaying an exact immutable SHA or existing tag rather than creating a new publish intent. - Confirm the publish job still targets exactly one protected environment,
hex-publish, and that checked-in proof stops there. - Confirm
docs/supported-surface.mdremains the canonical support contract and that this maintainer guide,README, andSECURITY.mdonly defer to it rather than creating a second support matrix. - Merge the reviewed Release Please PR and let the protected workflow run become the first authenticated evidence bucket.
Repo-owned commands stop at mix ci and the checked-in artifact review above. mix release.preflight and mix hex.publish --yes are trusted-workflow commands only; they belong to the protected hex-publish boundary, not to local maintainer folklore.
Secrets and environment
- Use a protected
hex-publishenvironment for publish jobs. - Store
HEX_API_KEYas an environment secret, not an inline workflow secret. - Restrict the environment to deployments from
main. - Keep workflow permissions minimal and publish jobs pinned to immutable action SHAs.
- Keep the authenticated dry-run inside the trusted workflow via
mix release.preflight. - If a merged release needs to be replayed after a workflow failure, use
workflow_dispatchwith both a recovery reason and the exact recovery ref so the protected publish lane replays the intended revision rather than whatevermainpoints to later. - Record protected-environment evidence separately from repo-owned proof: deployment restrictions, bypass posture, and environment-secret placement all live in GitHub settings rather than in the repo.
Release posture
Releases should only claim the supported surface the repo can currently prove.
The repo should not claim full release readiness or broader protocol support until the docs, CI, support policy, and maintainer runbooks all agree with implemented behavior.
That means release posture must stay inside the embedded Phoenix library wedge already proven in-repo: authorization code + PKCE, discovery, JWKS, repo-proven private_key_jwt on Lockspire-owned direct-client endpoints, userinfo, revocation, introspection, refresh rotation, generator-backed install, and operator workflows.
Do not broaden release claims to request-object-by-value support, generic external request_uri handling, unsupported client-auth methods, hosted auth service language, certification language, demo-app proof, or full CIAM positioning.
Preflight checklist
Before merging a release PR, confirm:
mix ci- the Release Please PR is still review-only and points at the same release workflow/config artifacts
.github/workflows/release.ymlstill calls./.github/actions/release-pleaserather than a direct third-party Release Please action referencerelease-please-config.jsonand.release-please-manifest.jsonstill match the intended release policy- publish job still targets the protected
hex-publishenvironment - trusted release workflow still runs
mix release.preflight - trusted publish lane still runs
mix hex.publish --yes - public docs and
SECURITY.mdstill defer todocs/supported-surface.md
Hold points
Stop the release if:
- docs require claims the repo no longer proves
- package metadata or docs build drift from the release artifact
- a workflow change bypasses CODEOWNERS or dependency review
- CI stops being equivalent to the maintained
mix cicontract - the protected
hex-publishenvironment stops being restricted tomain, allows bypass you do not intend to allow, or storesHEX_API_KEYoutside the environment boundary
This file does not broaden the Lockspire product contract. For public support truth, defer to docs/supported-surface.md.
Post-Publish Verification
After a successful publish to Hex, you must verify the published artifact to guarantee "Install Truth". Run the post-publish script:
./scripts/publish/verify_install_truth.sh
This step verifies the published Hex artifact and docs against the canonical support contract and proves clean Phoenix installability.