# Network realisation contract, version 1 This package owns the deployed wire vocabulary for the `vpc.*` control-plane-to-network-realisation boundary: subjects, payload JSON, the `{success,error}` acknowledgement envelope, delivery mode and the `vpcd-workers` queue group. It does not move `vpcd`, perform any NATS I/O, or change any lifecycle or reliability semantics. It is a characterization of what is deployed today, split one route family per file, not a redesign. ## Ownership Network owns the meaning and wire contract of every route below, because it owns OVN and host realisation. EC2 and the other managed-service domains own their own AWS-visible state transitions and decide when, and whether, to issue a projection onto one of these subjects; this package does not grant them authority over a route's semantics, only a stable shape to publish against. ## Route table | Subject | Payload | Reply | Delivery | Queue group | |---|---|---|---|---| | `vpc.create` | `VPCEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.delete` | `VPCEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.create-subnet` | `SubnetEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.delete-subnet` | `SubnetEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.create-port` | `PortEvent` | `AckEnvelope` | request/reply, 5s | `vpcd-workers` | | `vpc.delete-port` | `PortEvent` | `AckEnvelope` | request/reply, 5s; caller treats failure as non-fatal | `vpcd-workers` | | `vpc.update-port-sgs` | `PortSecurityGroupsUpdateEvent` | `AckEnvelope` | request/reply, 5s | `vpcd-workers` | | `vpc.igw-attach` | `InternetGatewayEvent` | none | fire-and-forget, non-fatal | `vpcd-workers` | | `vpc.igw-detach` | `InternetGatewayEvent` | none | fire-and-forget, non-fatal | `vpcd-workers` | | `vpc.add-nat` | `NATEvent` | `AckEnvelope` | request/reply, 45s (OVN flows barrier); some callers fire-and-forget | `vpcd-workers` | | `vpc.delete-nat` | `NATEvent` | `AckEnvelope` | request/reply, 15s, retried on `ErrNoResponders` (3 attempts, 500ms apart) | `vpcd-workers` | | `vpc.add-nat-gateway` | `NATGatewayEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.delete-nat-gateway` | `NATGatewayEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.add-igw-route` | `IGWRouteEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.delete-igw-route` | `IGWRouteEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.gate-subnet-egress` | `SubnetEgressGateEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.ungate-subnet-egress` | `SubnetEgressUngateEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.add-system-egress` | `SystemEgressEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.delete-system-egress` | `SystemEgressEvent` | none | fire-and-forget | `vpcd-workers` | | `vpc.create-sg` | `SecurityGroupEvent` | `AckEnvelope` | request/reply, 5s | `vpcd-workers` | | `vpc.delete-sg` | `SecurityGroupEvent` | `AckEnvelope` | request/reply, 5s, idempotent | `vpcd-workers` | | `vpc.update-sg` | `SecurityGroupEvent` | `AckEnvelope` | request/reply, 5s | `vpcd-workers` | Producer for every route above is the daemon (`spinifex-daemon`), through the typed client in `domains/network/projection`; `vpc.add-system-egress` has no current producer. Consumer for every route is `vpcd`, by way of `domains/network/subscribers`. This package is the sole declared owner of every subject and type above, including `vpc.igw-attach`/`vpc.igw-detach`, which were previously also declared in `contracts/ec2/v1`; that duplicate has been removed. ## Compatibility rules This is the deployed v1 contract. Changes follow N/N-1: a subject, JSON field name, JSON field type, or the ack envelope shape must not be renamed, retyped, or reinterpreted to mean something else. A breaking change needs a new, explicitly versioned successor package, not an edit here. Every subject and golden JSON literal in this package is pinned by an external `_test` package; a failing pin means the change broke compatibility, not that the test is stale. ## What this package does not do It does not move `vpcd` or any subscriber out of its current package. It does not change any route's delivery mode, timeout, retry budget, queue group, or the NAT add barrier.