8.1 KiB
OpenSpec Change: network-core
- Change ID: network-core
- Package:
@suaveplan/network(new) - Status: PROPOSED
- Type: new-package
- Date: 2026-04-29
Why
Genesis has production-grade crypto (crypto-cipher), streams (streams with real AEAD + compression + framing), bitpacker, storage, and event-bus primitives — but no networking layer to compose them. The suaveplan network package exists in ../suaveplan/packages/universal/network with the right architecture (plugin-based, hierarchical topology, governance, failover) but its transform layer contains documented stubs (fake encryption, fake compression, unimplemented ping). Rather than port the whole monolith, we extract the core plugin architecture and abstractions into a genesis-native package, then add real plugin packages that wire to genesis primitives.
What changes
- ADDED:
NetworkPlugininterface — universal contract for all network extensions (name,install(node),start(),stop(),dispose?()). - ADDED:
NetworkNodeclass — single entry-point that owns plugin lifecycle, message routing, and envelope validation. - ADDED:
MessageEnvelopeschema — Zod-validated envelope withid,type,senderId,targetId,payload,timestamp,headers. - ADDED:
Transportinterface — abstract contract for transport plugins (connect,disconnect,send,onMessage,getConnectedPeers). - ADDED:
NetworkBus— typed pub/sub broker wrapping@suaveplan/eventswith bounded-queue backpressure and interceptors. - ADDED:
PluginManager— installs plugins in registration order, starts them, stops them in reverse, disposes in reverse. - ADDED:
MessageRouter— routes envelopes to transports (unicast bytargetId, broadcast to all peers, fan-out across transports). - ADDED:
NETWORK_CODES— frozen error registry (defineCodes("NET", [...])).
Out of scope
- Concrete transport implementations →
network-plugin-webrtc,network-plugin-websocket(deferred). - Governance/election logic →
network-plugin-governance. - Peer registry / delta sync →
network-plugin-registry. - Heartbeat / failover FSM →
network-plugin-failover. - Tiered topology management →
network-plugin-topology. - Signaling server → deferred; plugins accept a pluggable
SignalingClientinterface.
Source mapping
This change derives from ../suaveplan/enterprise/network.md and ../suaveplan/packages/universal/network/src/core/engine/, src/contracts/, src/plugin/.
| Requirement | Source lines | Notes |
|---|---|---|
| Plugin lifecycle (install → start → stop → dispose) | network/src/plugin/manager/manager.md |
verbatim contract |
| NetworkNode unified API | network/src/core/network/unified-node/network-node.md |
reworded; genesis uses NetworkBus instead of direct EventEmitter |
| MessageEnvelope shape | network/src/contracts/core.types.md |
extended with Zod schema |
| Transport abstraction | network/src/contracts/transport.types.md |
verbatim |
Requirements with no source line
| Requirement | Justification |
|---|---|
| Zod validation on every envelope | Genesis cross-cutting requirement per AGENTS.md |
NetworkBus wraps @suaveplan/events |
Genesis already has a typed event bus; no need to invent a second one |
PluginManager reverse-order stop/dispose |
Defensive programming not explicitly in source docs |
Verification approach
src/plugin/plugin.spec-conformance.test.ts— pinsNetworkPlugininterface shape and lifecycle order.src/node/node.spec-conformance.test.ts— pinsNetworkNodepublic API, envelope validation, and plugin wiring.src/bus/bus.spec-conformance.test.ts— pinsNetworkBusFIFO, backpressure, interceptor behavior.src/router/router.spec-conformance.test.ts— pins unicast, broadcast, and transport fan-out.src/envelope/envelope.spec-conformance.test.ts— pins Zod schema rejections and valid envelope acceptance.tests/dep-graph.test.ts— pins no circular deps, no external runtime deps beyond workspace.
Enhancement: API Versioning Infrastructure
Source: docs/old-network-planning/ADAPT_2.md §API Versioning, PHASE_0_IMPLEMENTATION_PLAN.md §Version Info
The core needs versioning from the start to ensure interoperability as the mesh evolves:
VersionInfo— semantic versioning withmajor.minor.patch.isCompatibleWith(other)checks same major and minor >= required.VersionManager— tracks current library version, provides migration paths between versions, stability classification (experimental,stable,deprecated).VersionNegotiator— exchanges versions during peer handshake. Rejects incompatible peers.- Version is embedded in
MessageEnvelopeheaders.
Enhancement: Network Timestamps
Source: docs/old-network-planning/ADAPT_4.md §Timestamp Handling
Cross-node operations require reliable time handling:
NetworkTimestamp— standardized timestamp with multiple formats: ISO8601, unix, custom. Timezone support with adjustment. Precision levels: millisecond, microsecond, nanosecond.Clockinterface — injectable clock for testing. Default usesperformance.now()orDate.now().TimestampComparer—isAfter(),isBefore(),compare()with timezone awareness.
Enhancement: Standardized Event Constants
Source: docs/old-network-planning/PHASE_0_IMPLEMENTATION_PLAN.md §Event Constants
The bus uses string topics. Standardized constants prevent typos and enable IDE autocomplete:
NetworkEvents— frozen enum of all standard bus topics:- Node lifecycle:
node:created,node:connected,node:disconnected,node:updated,node:removed - Message:
message:sent,message:received,message:routed,message:dropped - Hierarchy:
hierarchy:changed,hierarchy:parent-changed,hierarchy:child-added,hierarchy:child-removed,hierarchy:level-changed - Plugin:
plugin:registered,plugin:unregistered - System:
system:error,system:warning,system:info
- Node lifecycle:
Enhancement: Bootstrap and Cold Start
Source: docs/old-network-planning/ADAPT_3.md §Optimize Cold Start Procedure
The core must support fast initialization for first-time mesh joiners:
BootstrapOptions— configurable bootstrap:mode: 'aggressive' | 'balanced' | 'conservative',initialPeers,bootstrapServers,connectionConcurrency,discoveryTimeout,prioritizeLocalNetwork.NetworkNode.bootstrap(options)— fast-path initialization that progressively discovers peers and forms hierarchy without blocking on full mesh state.ConnectionPreWarmer— pre-opens transport connections to known peers before they are needed.StatePreLoader— hydrates cached topology and registry state from previous session to skip full discovery.
Enhancement: Transport Plugin Development Kit (PDK)
Source: docs/old-network-planning/ADAPT_2.md §Enhance Transport Plugin Framework
Third-party transport plugins need a standardized development kit:
BaseTransportPluginabstract class — implements common transport lifecycle (connect, disconnect, send, health tracking).TransportCapabilitiesinterface —supportsDirect,supportsRelay,supportsBroadcast,maxMessageSize,reliabilityLevel.TransportTester— conformance test suite that any transport plugin can run:testBasicFunctionality(),testReliability(),testBackpressure(),testReconnection().TransportBenchmark— performance benchmark harness: throughput, latency, memory usage.- Plugin discovery —
PluginRegistrysupports runtime registration and lookup by capability.
Enhancement: Plugin Registry and Discovery
Source: docs/old-network-planning/ADAPT_5.md §Develop Plugin Ecosystem Support
PluginRegistry— runtime registry of installed plugins.register(plugin),unregister(id),has(id),get(id),list().PluginDiscovery— scans for available plugins by capability query:findPluginsByCapability('state-sync').PluginCapabilityValidator— verifies that a plugin's declared capabilities match its actual exports.
Migration impact
None — additive only. No consumers in genesis reference @suaveplan/network yet.