Pack once. Approve with 2FA. Verify the bytes.
Start · Model · Release · Setup · Protocol · Architecture
npx sallyport init --strict
npx sallyport checkinit writes a caller workflow pinned to the installed sallyport commit. check
audits the release setup without changing it.
Use check --remote to audit GitHub and npm posture. Missing proof is
UNVERIFIED, never PASS.
signed tag → pack → seal → smoke exact bytes → stage with OIDC
→ approve with 2FA → verify → immutable GitHub Release
CI can stage a package. It cannot publish one. sallyport finishes only after the registry tarball matches the staged candidate byte for byte.
No service, account, daemon, database, npm token, or runtime dependency.
Your package provides two scripts:
release:checkvalidates the tagged source.release:smoketests the exact tarball inSALLYPORT_TARBALL.
See the Protocol for the complete contract.
Push a signed version tag:
git tag --sign v0.2.0 -m "package v0.2.0"
git push origin v0.2.0Approve the npm stage with maintainer 2FA, then finalize its candidate run:
npm stage approve <stage-id>
gh workflow run sallyport.yml -f candidate_run_id=<run-id>Setup · Protocol · Architecture · Recovery · Threat model · Releasing sallyport · Security
Public, single-package npm repositories on GitHub-hosted Linux runners. Running
the CLI requires Node 22.18.0 or newer and a root package-lock.json. Release
workflows use the exact Node 24.19.0 / npm 11.17.0 toolchain.
npm ci
npm run release:checkMIT