kapas a release control plane that fails closed. It does not ship your code. It decides whether your code is allowed to ship — and records the reasoning either way.

kapas verify    # dry-run the whole sequence; execute nothing; print the plan
kapas release --env production --tag v2026.08.21
kapas rollback --to <ledger-target>

The refusal above is the product. Everything else exists so this line can be trusted.

DESCRIPTION

Two failure modes ship green through ordinary CI: the bad migration (applied at boot, unbacked, by an all-powerful role) and the known-vulnerable dependency(reported by a scanner nobody reads, blocked by nothing). Both are expensive precisely because nothing stopped them.

Kapas runs the gated sequence across your own providers — your Vercel, your Fly, your Neon, your GitHub Actions. It holds no long-lived credential and never proxies production traffic. When every gate passes, traffic moves. When one fails, the release stops, restores what moved, and writes down why.

L1

The absence of a pass is a failure.a missing signal, a malformed signal, and a failing signal are the same signal

L2

A green unit test is not a green production path.the gate runs backup → migrate-as-owner → privilege-check before traffic moves

L3

"Skipped" means does not apply — never failed quietly.run/skip is decided from config shape before execution; execution can only pass or fail

L4

Exceptions carry an owner, a reason, and an expiry.an accepted advisory re-blocks the day its acceptance lapses — recorded in the ledger

THE SEQUENCE

Sixteen steps, in order, per release. Where each runs is a typed property of the step — deploy steps stay in your CI with your secrets; the red rows are the control plane's own: the gates it will not delegate and the recovery that must work when your CI is the thing that broke.

#STEPRUNS INGATE
1PREFLIGHTkapastyped confirmation · tag == deploy-branch HEAD · adapters resolved
2GATEtenant-cithe tenant's declared checks exit 0
3DEPS_AUDITtenant-cifails closed at a severity floor on the production tree
4ARTIFACTtenant-cibuild once; deploy this exact digest everywhere
5ROLLBACK_MARKkapascapture the rollback target before anything mutates
6DB_BACKUPkapascopy-on-write restore point before any migration
7MIGRATEtenant-ciexpand/contract enforced; owner role, never the app role
8GRANTStenant-cileast-privilege CRUD re-applied to the runtime role
9PRIV_CHECKtenant-ciruntime role owns nothing, no CREATE; platform caveats recorded
10CANARYtenant-cideploy without moving production traffic
11HEALTH_CANARYkapascanary healthy before any traffic moves
12PROMOTEkapastraffic moves only to a health-checked canary
13HEALTH_PROMOkapasproduction healthy after cutover, or the release rolls back
14FANOUTkapasdependent surfaces in dependency order, each fully gated
15ROLLBACKkapasevery promoted surface restored to its captured mark, reverse order
16LEDGERkapasone immutable record: plan, evidence, outcome — green or blocked

Data steps 6–9 apply only to surfaces that own a database; elsewhere they are recorded as skipped, with the reason. Evidence doubles as the resume checkpoint: a crashed release resumes without re-executing anything that passed — it promotes the exact canary the crashed run deployed.

EXIT STATUS

0released — every gate held; traffic moved; the ledger holds the lineage: commit, digest, backup ref, migrations, grants, privilege report, health, promote.
1blocked — a gate refused before traffic moved. Production never changed. This is the exit code that pays for the product.
2rolled-back — a post-promote gate failed; every promoted surface was restored to its captured mark, in reverse dependency order.
3failed — rollback itself could not complete. Stated plainly, paged loudly, never dressed up as anything else.

WHAT IT IS NOT

not a host

Never runs your app or database, never proxies prod traffic. Your compute stays on your providers; Kapas decides and records.

not a credential keeper

Deploy steps run in your CI with your secrets. Kapas-run steps mint short-lived, scoped, per-release tokens — and store nothing that could deploy on its own.

not a lock-in

kapas init writes standard, reviewable artifacts you own. Delete Kapas; keep a working pipeline. Proven in tests, not promised.

not a flatterer

Where a platform ceiling can't be removed, the check records the caveat instead of pretending. Claiming more safety than exists is the worse bug.

PROVENANCE

Extracted from production systems we run, not imagined. The same sequence was built by hand across our own products — different stacks, same discipline — until the repetition was the product insight. Kapas releases all of them before it opens to anyone.

8
production systems on the dogfood roster — Next on Vercel, a Python monorepo on Fly, a websocket surface, one Neon each
16
canonical steps; 36 gated instances for a three-surface release, dependency-ordered
4
products found exposed by one advisory on 2026-07-25 — the day the gate earned its place
0
long-lived provider credentials stored. the mark is a slashed zero for a reason

SEE ALSO

kapas — zero bad releases; the landing page
manifesto(7) — every release on the record
licence(7) — BUSL 1.1, converting to Apache-2.0 on 2029-07-25
status: dogfooding on eight production systems · private beta forming

kapas — hindi for raw cotton: the material before the thread2026 · KAPAS(1)