Security posture

A release pipeline holds the keys to everything you ship. These are the decisions that follow from taking that seriously — and, at the end, the thing this does not claim.

Credentials

Untrusted builds

A pull request from a fork runs on a pool with zero credentials and cannot distribute. That property is derived from the credentials a job actually resolves, not declared by a flag — so a step that starts needing a secret stops being fork-safe automatically, rather than when somebody remembers.

Identity

Passkeys are the primary factor, with an emailed code as the fallback that always works — including for somebody invited five minutes ago. Refresh tokens rotate, and reuse of a rotated one revokes the whole family on the assumption that reuse means theft. Every authorisation decision is re-evaluated server-side on every request; the interface hiding a button is a convenience, never a control.

Approvals

A distribution that needs sign-off is checked before any bytes move. An uploaded TestFlight build is already visible to internal testers, so waiting after the upload would be guarding a door that is already open. N approvers means N distinct people, enforced by the schema rather than counted.

Audit

Events are append-only at the database level and hash-chained per organisation, with a verifier that locates any altered record.

What this does not claim

The audit log is tamper-evident, not tamper-proof. Someone with table ownership can bypass the trigger — at which point the chain verifier detects it. We would rather say that plainly than let an auditor infer something stronger.