Backup and Recovery Procedure
Implements: Business Continuity Policy Section 4 (Backup and Recovery) Owner: Security Lead Last Updated: 19 June 2026 Next Review: 21 November 2026
Scope
This procedure covers backup and recovery across both Maelstrom AI platforms — Provii (zero-knowledge age verification) and downpipes (no-custody backup & disaster recovery for the Cloudflare data layer):
- Maelstrom’s own Cloudflare estate (the production infrastructure behind Provii and our other Workers) is backed up by our own production instance of downpipes — we run downpipes as a customer of our own product. This is the live, finished state. See Cloudflare Backup Evidence.
- The downpipes product itself runs in each customer’s own Cloudflare account, under the customer’s keys (no-custody). Maelstrom holds no customer keys, data or Cloudflare tokens, so the customer’s backup and recovery operations are complementary user-entity controls (CUECs); the customer-side posture is summarised at the end of this document.
Backup Architecture
Maelstrom AI’s entire Cloudflare estate is backed up by our own production instance of downpipes. The engine runs as a routeless Worker inside our own Cloudflare account, reads the sources below on a schedule, seals each archive with post-quantum hybrid encryption under operator-held keys, and fans out (3-2-1) to two or more Maelstrom-controlled destinations.
| Component | Backup Method | Frequency | Retention | Location |
|---|---|---|---|---|
| Workers KV, D1, R2, Secrets Store | downpipes engine (in-tenant Worker) → 3-2-1 fan-out | Scheduled | Per destination policy | 2+ Maelstrom-controlled destinations |
| Zone & account configuration (51 surfaces) | downpipes engine (in-tenant Worker) → 3-2-1 fan-out | Scheduled | Per destination policy | 2+ Maelstrom-controlled destinations |
| Source code | Git (GitHub) | Every push | Indefinite | GitHub (+ local clones) |
| Cloudflare config | wrangler.toml in Git | Every change | Indefinite | Git |
| Secrets/keys | Manual record in secure storage | On rotation | Current + 1 previous | Encrypted storage |
Automated Backup (self-hosted downpipes)
Our own production instance of downpipes runs the backups for Maelstrom’s Cloudflare estate. On its schedule the engine:
- Reads the configured sources (Workers KV, D1, R2, Secrets Store, and the 51 zone/account configuration surfaces)
- Seals each archive with post-quantum hybrid encryption under operator-held keys (no archive is readable without those keys)
- Fans the sealed archive out (3-2-1) to two or more Maelstrom-controlled destinations
- Emits signed run reports and a content-free advisory beacon to the vendor-side control-plane (which holds no keys, data or Cloudflare tokens and is fail-open — it never gates backup or restore)
Verifying Backups
Recoverability is proven continuously by the product, not merely asserted:
- Hourly canary integrity flights confirm that archives are well-formed and decryptable.
- Scheduled in-account restore drills prove that a real restore succeeds, not just that a backup was written.
- Signed reports from the engine evidence restore-test recency and run success; review them in the downpipes console (
console.downpipes.io, our own instance). - Scored security posture with regression alerts surfaces any drift; alerts page the operator.
Review the posture and the most recent restore-drill report monthly or after any infrastructure change.
Recovery Procedures
Scenario 1: Corrupted KV Data
- Identify which namespace and keys are affected
- Select the most recent clean archive in the downpipes console (
console.downpipes.io, our own instance) and request a restore; restores require operator approval before they run - The engine decrypts the sealed archive under the operator-held key and restores the affected source in-account
- If the console or the engine is unavailable, recover with the MIT-licensed
downpipeoffline reader — it reconstructs the data from the archive bytes plus the operator’s offline key alone, with no vendor and no network - Verify the restored data via API calls
Scenario 2: Signing Key Loss
- Signing keys are stored in Cloudflare Workers Secrets
- If secrets are lost, redeploy with
wrangler secret put SIGNING_KEY - Generate new keys if the previous key material is unrecoverable
- If issuer signing keys are rotated, all existing credentials become invalid. Users must re-issue.
- Update JWKS endpoint with new public key
Scenario 3: Full Service Reconstruction
If Cloudflare account access is lost:
- All source code is in GitHub; clone the platform repositories
- Create a new Cloudflare account
- Run
wrangler deployfor each Worker using checked-inwrangler.toml - Restore secrets (from secure offline storage)
- Restore the Cloudflare data layer (Workers KV, D1, R2, Secrets Store, and zone/account configuration) from the most recent downpipes archives. Because the archives are sealed under operator-held keys and fanned out 3-2-1 to independent destinations, recovery does not depend on the original Cloudflare account being reachable: the
downpipeoffline reader restores from the archive bytes plus the operator’s offline key alone - Update DNS records to point to new Cloudflare account
- Estimated RTO: 4 hours
RPO and RTO
| Metric | Target | Justification |
|---|---|---|
| RPO | < 1 hour | Scheduled downpipes backups of the Cloudflare data layer bound data loss under normal conditions |
| RTO | < 4 hours | Redeployment from Git + secret restoration + downpipes restore of the Cloudflare data layer |
Testing
Backup recovery is tested continuously by the product and reviewed periodically:
- Hourly canary integrity flights confirm archives are well-formed and decryptable
- Scheduled in-account restore drills restore selected sources and prove a real restore succeeds
- Verify data integrity against the restored sources
- Document the signed restore-drill reports in the management review
downpipes Product — Customer-Operated Recovery (CUECs)
The recovery procedures above describe how Maelstrom recovers its own Cloudflare estate. When a customer runs downpipes, the engine and console run in the customer’s own Cloudflare account, under the customer’s keys, and Maelstrom holds no customer keys, data or Cloudflare tokens. The following are therefore the customer’s responsibility (complementary user-entity controls):
- Key custody. Customers generate break-glass, operational and archive-signer keys through the guided in-browser key ceremony, retain the printed recovery sheet, and store keys offline (encrypted USB, password manager, or Shamir split). The default two-recipient posture applies unless the customer explicitly opts into the strict break-glass-only mode.
- Destinations, retention and restore cadence. Customers choose their 3-2-1 destinations, set retention, and run their own restore drills.
- Restore approval. Restores are requested in the customer’s own console and require operator approval before they run.
- Vendor-independent recovery. The MIT-licensed
downpipeoffline reader restores from the archive bytes plus the customer’s offline key alone — no vendor, no network — built from a frozen public archive-format specification.
Maelstrom’s responsibility for the product is limited to building and maintaining the software and operating the vendor-side control-plane (fail-open) and the signature-pinned update channel (updates.downpipes.io, pull-only, no phone-home). The control-plane never gates a customer’s backup or restore.
See the ISMS Scope Statement shared-responsibility model and the Cloudflare Backup Evidence for Maelstrom’s own self-hosted instance.