# protocol/ — Contratos canónicos + routing **Propósito.** Núcleo de intercomunicación del fractal: tipos canónicos (`Card`, capabilities, soma), handshake módulo↔Init, broker que empareja flows por tipo, y wire types de red. No corre lógica de dominio. ## Crates | crate | tipo | rol | | ---------------------- | ---- | -------------------------------------------------------- | | `brahman-card` | lib | Struct `Card` (19 campos, ver abajo) | | `brahman-card-wit` | lib | Extracción WIT desde componentes WASM | | `brahman-cards` | lib | Templates Nickel + helpers consumer/producer/broker | | `brahman-handshake` | lib | Init↔módulo: Hello, Ping, ListSessions, ListMatches | | `brahman-broker` | lib | Service locator: flow.input ↔ flow.output por tipo | | `brahman-admin` | lib | Socket admin separado: snapshots de sesiones+matches | | `brahman-sidecar` | lib | `spawn(card)` para que apps se presenten al Init | | `brahman-net` | lib | Malla libp2p opcional (TCP+noise+yamux+kad) | | `arje-card` | lib | Alias legacy — re-export de `brahman-card` | ## Struct `Card` (anatomía completa) ```rust pub struct Card { schema_version: u16, // versión del esquema fractal id: Ulid, // identidad opaca única lineage: Option, // ancestro genealógico label: String, // nombre humano-legible provides: BTreeSet, requires: BTreeSet, permissions: Permissions, // sandbox declarativo soma: SomaSpec, // runtime Linux (ns + cgroup + rlimits) payload: Payload, // WASM | ELF | Virtual | Legacy supervision: Supervision, // restart policy lifecycle: Lifecycle, // ortogonal a supervision priority: Priority, flow: Flows, // contratos de datos in/out service_socket: Option, // data plane separado references: Vec, // grafo de relaciones kind: CardKind, // Ente | Monada | Index | ... data: Option, // None para entes runtime genesis: Vec, // hijas a encarnar inmediatamente priority_contexts: BTreeMap, } ``` ## Dependencias - Intra: handshake → card + broker; sidecar → card; net → handshake. - Cross: consumido por todos los `modules/*` y `apps/*`. - No depende de `init/` ni de `runtime/` (es la base). ## Invariantes - Serialización: `postcard` length-prefixed sobre Unix SOCK_STREAM, JSON sobre HTTP (gateway). Schemas reproducibles vía Nickel. - Identidad: `peer_id` libp2p + firma Ed25519 anclada al peer. - Sesiones: el handshake mantiene una sesión por módulo encarnado. ## Estado Base estable (6,260 LOC con tests). 19 TODOs concentrados en handshake (trust remoto fase 3) y broker. Ver `docs/changelog/protocol.md`.