/* RFC-0564: TypeScript contracts for the SWIM membership and CRDT genome subsystem. Defines the member, config, membership view, and genome log entry interfaces used by swim.join, swim.leave, swim.members, and swim.status commands. Do not implement command handlers — those live in handlers.ts. Do not implement genome log I/O — that lives in genome-log.ts. Do not implement config loading — that lives in config.ts. Do not implement SWIM protocol gossip — that is delegated to the swim npm package. Contracts are type-only — runtime behavior lives in the sibling modules. RFC-0564: initial implementation — type contracts for SWIM membership subsystem. RFC-1097: step 6 — compass.migrate codemod run Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order. RFC-1097: sweep — werkstatt-engine clean Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics. */ export interface SwimMember { workshopId: string; endpoint: string; operatorVC: string; status: SwimMemberStatus; joinedAt: string; lastSeen: string; } export type SwimMemberStatus = "alive" | "suspect" | "dead" | "left"; export interface SwimConfig { workshopId: string; bindAddr: string; seedNodes: string[]; probeIntervalMs: number; probeTimeoutMs: number; suspicionTimeoutMs: number; indirectChecks: number; } export interface SwimMembershipView { members: SwimMember[]; total: number; alive: number; suspect: number; dead: number; } export interface GenomeLogEntry { workshopId: string; event: SwimMemberStatus; timestamp: string; source: string; signature: string; }