Invariants / CN-WIRE-10

CN-WIRE-10

CN derived enforced

Ade's serve-side N2N handshake RESPONDER must encode versionData / MsgAcceptVersion / query-reply in the closed Cardano NodeToNode wire grammar a real cardano-node decodes, through the SINGLE shared per-version authority (encode_n2n_version_params) the INITIATOR also uses -- the two directions cannot diverge. The versionData arity matches the negotiated version: V11..=15 emit the 4-element [networkMagic, initiatorAndResponderDiffusionMode, peerSharing, query]; V16+ append perasSupport. The responder MUST NOT emit a placeholder / bare value (the prior VersionParams(vec![0x01]) = CBOR TInt 1, which a real cardano-node rejected with HandshakeDecodeError NodeToNodeV_15 "unknown encoding: TInt 1"). Closed grammar -- no fallback interpretation, no decoder loosening; the encoding is byte-pinned against captured real cardano-node fixtures, never an Ade<->Ade round-trip.

Source

docs/clusters/PHASE4-N-F-G-L/cluster.md

Cluster
PHASE4-N-F-G-L
Introduced in
PHASE4-N-F-G-L

Enforcement trace

Tests 4

  • responder_v15_accept_matches_real_cardano_node_preprod_fixture
  • responder_v15_accept_matches_failing_c1_peer_fixture
  • responder_v15_versiondata_is_a_four_element_array_not_a_bare_int
  • served_view_projects_durable_chain

Cross-references

Evidence notes

PHASE4-N-F-G-L S1+S2 (2026-06-04). The G-K live rerun showed the follower reaches Ade :3002 but the N2N handshake fails: HandshakeDecodeError NodeToNodeV_15 'unknown encoding: TInt 1'. ROOT CAUSE: session/handshake_driver.rs built the serve responder's MsgAcceptVersion with a hardcoded placeholder VersionParams(vec![0x01]) (= CBOR TInt 1), discarding the negotiated versionData -- asymmetric (the initiator path encoded versionData correctly, so Ade's INITIATOR handshake worked). S1 captured the canonical real cardano-node V15 reply (corpus/network/n2n/handshake/{preprod,c1privnet}_v11_v16_propose_recv.cbor: [1, 15, [magic, true, 0, false]] -- a 4-element array; cardano-node 11.0.1 negotiates V15). S2 added the SINGLE shared per-version authority encode_n2n_version_params (V11-15 4-field, V16+ +perasSupport) used by BOTH the serve responder (handshake_driver) AND the initiator (build_n2n_version_table), and pinned the responder's V15 accept BYTE-IDENTICALLY against the captured fixtures (preprod magic 1 + the EXACT c1 failing peer magic 42) -- NOT an Ade<->Ade round-trip (which passed against the [0x01] placeholder and could not catch this). The DECODER was NOT loosened; the ENCODER now emits the closed grammar. ade_network handshake units (30) + the Ade<->Ade serve loopback (4) still pass (no regression). CN-WIRE-08 (tag-24) unchanged. CE-G-L-2 (the live C1 handshake completing + resuming the G-K rehearsal) stays operator-gated; no RO-LIVE flip; no acceptance claim without the follower log through correlate.