Plenum Backend Architecture

Workstreams W0-W9, the trait contracts that join them, and the FCMP++ swap boundary. Companion to architecture_idea and the whitepaper.

GUI human REST API scripts MCP API AI agent co-equal over one command set · the GUI mirrors the agent live (C4) W8 Daemon / Actor - owns wallet state, drives WalletCommand / WalletEvent W0 plenum-core contracts: Transport · SecureChannel · SpendAuthority · ChainSource · Store · BackupSink · KeyMaterial W3 SecureChannel MLS (OpenMLS) epochs, fwd secrecy W2 FROST DKG (build now) + signing (waits) W6 Store SQLite no plaintext at rest W5 Backup one blob 3 sinks, seed-locked W1 Monero engine scan · build · sign monero-oxide W9 Auditable opt-in identity + attestations SpendAuthority / SigningSession - the swap boundary: CLSAG today, FCMP++/GSP later (A1) Transport ChainSource BackupSink W4 Transport Nostr flood bus · Tor or Nym ephemeral keys, trial-decrypt W7 Node access monero-rpc-pool health-weighted, failover Nostr relays public, dumb backup destinations local · S3 · members monerod remote nodes build now (proof-system-independent + clients) waits for clean FCMP++ (A1 decision) trait contract

How to read it. Everything talks through the W0 contracts (the band), so each workstream builds in isolation against traits plus mocks. The clients (GUI, REST, MCP) are peers over one command set; the daemon (W8) owns the state. The dashed box is the SpendAuthority swap boundary: per the A1 decision Plenum waits for a clean FCMP++/CARROT and targets its FROST-GSP signing, so W1 and the signing half of W2 are deferred (amber), while the proof-system-independent backend and the clients (green) are built first.