carlos / contra Public

intent

The first commit of CONTRA: the architecture written down before any code, per the family rule. Four documents — AGENTS.md (binding: the one rule, CARLOS A1 strict, and ten dated settled decisions), README.md (user-facing, trade-offs first), DESIGN.md (the key hierarchy and the Emergency Kit), PLAN.md (build order and reasoning).

⚠️ This branch is the whole project. main is empty. The overnight work queue in discussions 6–18 all assumes these documents; until this merges, agents must git checkout intent and branch from there.

The decisions most worth a reviewer's attention:

A1 strict, on Slopbox's shape rather than Eleven's. Eleven's thread membership is exactly what places Eleven in A2. A password manager whose pitch is "absolutely nothing revealed" cannot spend that allowance, so vault membership is the access-control list your own instance consults, not an identifier derived from your content.

Recovery is a passphrase plus a printed kit, reversing Eleven (2026-07-25) and Slopbox (2026-07-26), which both killed the paper kit for a recovery passkey. A recovery passkey lives in iCloud Keychain or 1Password — the product CONTRA replaces — so it is circular, and worst for the person migrating off 1Password. Paper is the only medium that is not the thing we are replacing.

The kit is two PDFs, an Account Key card and a Recovery sheet, because the values have different blast radii and the risk being managed is storage, not printing.

Agents create, humans promote, nothing mutates — an agent that could rewrite an existing item's URL could let your own autofill pour a real password into a lookalike site.

Next: merge, then discussion 6 (golden vectors) before anything else.

Commits 2
Files changed 3 +394 −2
Discussions 1 0 open
Tasks 1/25 done

Discussions 0 open

  • No discussions on this branch yet.

Tasks 1/25 done

  • DESIGN.md: key hierarchy, wraps, and the sealed schema Not started
  • Slice 1: rastrillo instance + client-shape web console Not started
  • Signup, passphrase sign-in, print-once recovery codes Not started
  • The merciless greps: canary strings through every write path, SQLite + bucket Not started
  • Ledger publish-time screen: check every prompt against local vault-value hashes Not started

Activity

  • paul@keymail.dev pushed aed6043 licence: MPL 2.0 authored by Paul Campbell
  • paul@keymail.dev pushed e94acca sync ledger: withhold a foreign session's prompt authored by Paul Campbell
  • claude agent, operated by paul@keymail.dev replied to DECISION NEEDED: do we print a 128-bit Account Key beside the recovery code?
  • task updated: Emergency Kit PDF: client-generated, two separated panels, QR per value, fold line
  • claude agent, operated by paul@keymail.dev added task Account Key card PDF: wallet-sized, QR, handle, 'useless without your passphrase'
  • claude agent, operated by paul@keymail.dev added task Recovery sheet PDF: archival framing, QR, 'never photograph this', where it should live
  • claude agent, operated by paul@keymail.dev added task Signup: print-both action, and no way past until both are confirmed
  • claude agent, operated by paul@keymail.dev added task Reprint the kit: Account Key exact from device cache, recovery code regenerated
  • claude agent, operated by paul@keymail.dev added task Nag to enrol a second device, and to reprint a lost kit while a device remains
  • claude agent, operated by paul@keymail.dev replied to DECISION NEEDED: do we print a 128-bit Account Key beside the recovery code?
  • claude agent, operated by paul@keymail.dev added task Emergency Kit PDF: client-generated, two separated panels, QR per value, fold line
  • claude agent, operated by paul@keymail.dev added task Fresh-device ladder: handoff from enrolled device (Slopbox link pattern), QR scan, typed entry
  • claude agent, operated by paul@keymail.dev added task Quantise ciphertext sizes into 256-byte buckets
  • claude agent, operated by paul@keymail.dev added task Serve the web console from a separate static signed origin (SRI, PWA)
  • claude agent, operated by paul@keymail.dev added task Optional sign-in 2FA gating blob release
  • claude agent, operated by paul@keymail.dev opened DECISION NEEDED: do we print a 128-bit Account Key beside the recovery code?
  • claude agent, operated by paul@keymail.dev added task Golden vectors: Argon2id, every HKDF label, Crockford normalisation, checksum
  • claude agent, operated by paul@keymail.dev added task Bucket lifecycle policy: expire superseded object versions after 30 days
  • claude agent, operated by paul@keymail.dev added task Move the email pepper off the instance (routing layer or KMS)
  • claude agent, operated by paul@keymail.dev added task Shared vaults: group key wrapped per member, forward rotation on removal
  • claude agent, operated by paul@keymail.dev added task Agent access: list / use-env / use-http via the local daemon
  • claude agent, operated by paul@keymail.dev added task Slice 2: native Mac app against the settled contract
  • claude agent, operated by paul@keymail.dev added task Slice 3: AutoFill Credential Provider extension (macOS)
  • claude agent, operated by paul@keymail.dev added task Ledger publish-time screen: check every prompt against local vault-value hashes
  • claude agent, operated by paul@keymail.dev added task Daemon redaction choke point: scan all daemon-to-agent bytes for injected values
  • claude agent, operated by paul@keymail.dev added task Agent writes are create-only into quarantined staging; humans promote
  • claude agent, operated by paul@keymail.dev added task 1PUX import, parsed and sealed entirely client-side
  • claude agent, operated by paul@keymail.dev added task DESIGN.md: key hierarchy, wraps, and the sealed schema
  • claude agent, operated by paul@keymail.dev added task Slice 1: rastrillo instance + client-shape web console
  • claude agent, operated by paul@keymail.dev added task Signup, passphrase sign-in, print-once recovery codes