The verified-release release (r690–r703): releases are signed and their assets checksummed, installs verify what they download, and every API route is now held to an authorization matrix that fails the build when a new route is not classified.
Upgrade notes
- Creators who lost their seat lose access (r694). A service or database creator counts as its owner only while they hold a seat in a workspace it belongs to. Someone removed from the workspace (for example by SCIM) now gets "not found"; re-seating them restores access. Personal resources outside any workspace stay their creator's. Workspace owners always hold a seat, so they are unaffected.
- SCIM removal hands ownership over (r695). Suspending or deprovisioning a user through SCIM transfers what they created to the workspace owner, as the panel's own member-removal already did. Reinstating the user restores the seat, not the ownership.
- Installs verify downloads (r702). From this release on, the installer downloads the release's own source archive and checks it against the signed
SHA256SUMS; whencosign(v2.4+) is installed it also verifies the signature. A mismatch stops the install and the previous service keeps running. Hosts that cannot reach Sigstore can setNINEDEPLOY_SKIP_SIGNATURE_VERIFY=1(the checksum is still enforced). Older tags install as before, with a warning. - Self-update verifies the installer (r703). Takes effect from the first update a 0.10.43 panel starts.
- Revoking something that is already gone, or that is not yours, now answers 404 instead of 200 (r691).
- No migrations.
Security
- Seatless creators kept owner access (r694, high). Whoever created a team service or database kept full access after losing their seat — secret env export, database credentials, backup downloads, deploy and delete (82 routes).
- Cross-tenant ids on service create left half-created services (r692); the backup-drill route revealed whether another tenant's backup id exists (r693); owner-scoped deletes answered 200 for ids outside the caller's scope (r691).
- Authorization matrix (r690). A test boots the real API on a real database, enumerates every route (361), and checks each against two tenants and every role: no cross-tenant access, no write or outside call on refusal, the role floor holds, no secret in a viewer's response. A new route without a classification fails the build.
Release integrity
- Signed images (r700). Every published image is signed with Sigstore keyless signing (GitHub OIDC, no stored key) and carries build provenance. The exact
cosign verify,cosign verify-blobandgh attestation verifycommands are in README → Verifying a release. - Checksummed, signed release assets (r701). Each release carries
ninedeploy-vX.Y.Z.tar.gz,install.sh,SHA256SUMSand its signature bundle. The release is created as a draft, its assets are verified the way installers check them, and only then published —releases/latestnever points at a release without checksums. - What this guarantees: the archive, installer and image are byte-for-byte what this repository's release workflow produced. What it does not: the trust root is still GitHub and Sigstore.