Decided (Paul, 2026-09-01): Option A. The Account Key is printed on the kit alongside the recovery code, and the fresh-device cost is handled with UX rather than by giving up the protection.
Settled in DESIGN.md — "The Emergency Kit". What changed:
KEK_pw = HKDF-SHA-256(S_pw, salt=account_key, info="contra/v1/kek"). The input was already specified present-and-constant, so this was the re-wrap it was designed to be.W_rcandW_prfstay peer wraps, not gated on the Account Key. Gating recovery on it too would add nothing — both values live on one sheet, so whatever compromises one compromises the other — while adding a second thing to go wrong on the worst day of a user's life.- The compromise matrix improves in the row that matters: a passive server-plus-bucket leak now has no offline dictionary target at all. Every wrap is keyed by at least 128 bits of full entropy.
The kit is a client-generated PDF that never touches the server, laid out in two separated panels with a fold line. That layout is doing security work, not decoration: the Account Key gets handled routinely — every new device wants it — while the recovery code should ideally never leave the paper. Printed adjacent, routine handling of one exposes the other to every phone camera in the room. One panel is designed to be photographed; the other is designed not to be.
The UX layer, cheapest rung first and never dead-ending:
- Handoff from an enrolled device — the new browser mints an ephemeral keypair, the server relays a blob it cannot open, an enrolled device confirms a short code. Slopbox's
linkpattern, reused rather than reinvented. - Scan the QR on the kit.
- Type it — Crockford Base32, self-healing checksum, last resort.
Once cached, the passphrase alone unlocks that device, so the everyday case is exactly what was originally promised.
The cost, recorded honestly: "passphrase known, kit lost, every device gone" is now unrecoverable. That is new, and it is in the README without softening, next to the reason we think it is worth it. Two things follow and are now tasks — a prominent reprint flow (the Account Key reprints exactly, since enrolled devices cache it; the recovery code cannot be reprinted, only regenerated, and the copy says so before the user commits), and nagging people to enrol a second device.
Closing this.