Invariants / CN-WIRE-11

CN-WIRE-11

CN derived enforced

Ade's serve-side ChainSync server must be wire-compatible with a real cardano-node follower's MsgFindIntersect, in two halves, served from the SINGLE ServedChainView authority: (A) REQUEST DECODE -- the codec MUST accept the MsgFindIntersect points list whether a real cardano-node encodes it as a CBOR INDEFINITE-length array (0x9f .. 0xff) or Ade encodes it definite-length. Scoped to THAT list ONLY: the outer message array, each Point, and the tip stay strictly definite (decode_array_header is unchanged and still rejects indefinite everywhere else); the indefinite form requires the 0xff break and the message is full-consumed -- no catch-all, no fallback, no unknown-CBOR acceptance. (B) REPLY -- Origin is the universal common ancestor (every chain descends from genesis), so a MsgFindIntersect whose points include Origin MUST be answered IntersectFound[Origin]; block points resolve through the existing closed ServedHeaderLookup::intersect; no match yields IntersectNotFound -- no widening beyond the Origin intersect. Closed grammar, byte-pinned against captured real cardano-node fixtures (the follower's MsgFindIntersect request + the node's MsgIntersectFound reply), never an Ade<->Ade round-trip (which passes against Ade's own definite-length encoding and so cannot catch the indefinite-array incompatibility).

Source

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

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

Enforcement trace

Tests 7

  • real_cardano_node_findintersect_indefinite_points_list_decodes
  • real_cardano_node_findintersect_yields_intersect_found_origin
  • producer_chain_sync_serve_find_intersect_origin_yields_intersect_found_origin
  • producer_chain_sync_serve_find_intersect_known_point_yields_intersect_found
  • producer_chain_sync_serve_find_intersect_unknown_point_yields_intersect_not_found
  • decode_array_header_still_rejects_indefinite
  • two_form_accepts_definite_and_indefinite

Cross-references

Evidence notes

PHASE4-N-F-G-M S1+S2 (2026-06-04). SCOPE CORRECTED by the live fixture: G-M's original premise was a RESPONSE-grammar defect (Ade decodes the request but fails to answer MsgFindIntersect). An instrumented C1 rerun proved the failure is EARLIER, in the REQUEST DECODE: the real cardano-node 11.0.1 follower (c1 private-net, magic 42, genesis) sends MsgFindIntersect bytes 82 04 9f 80 80 ff = FindIntersect{points:[Origin,Origin]} with the points list as a CBOR INDEFINITE-length array (9f..ff), and Ade's ChainSync decoder rejected it ('indefinite-length array not allowed') -> dispatch dropped the frame -> no reply -> the follower timed out at SingIntersect. Reproduced byte-identically across 9 consecutive follower reconnects (the V15 handshake completes each time -- CN-WIRE-10 holds live). Ade<->Ade loopback passed because Ade ENCODES the points list definite-length, so it round-trips its own bytes. S1 captured the IntersectFound reply (corpus/network/n2n/chain_sync/c1privnet_origin_intersect_recv.cbor); S2 captured the FindIntersect request (corpus/network/n2n/chain_sync/c1privnet_follower_findintersect_recv.cbor -- the half S1 missed) and fixed both halves: (A) decode_find_intersect_points accepts the indefinite points list for MsgFindIntersect ONLY (via the scoped decode_array_head_two_form + try_consume_break; decode_array_header stays definite-only, guarded by the decode_array_header_still_rejects_indefinite test); (B) the reducer answers IntersectFound[Origin] for an Origin intersection (block points unchanged via the existing closed intersect). This is NOT decoder loosening -- it accepts the real cardano-node MsgFindIntersect points-list encoding, the exact compatibility target. ade_network chain_sync lib (46) + the new fixture pins (2) + the primitives scope guards (3) + the G-L handshake responder pins (3) all pass (no regression). CE-G-M-2 (the live follower's hot session sustaining past SingIntersect + proceeding toward header/BlockFetch) stays operator-gated; no RO-LIVE flip; no acceptance claim without the follower log through correlate.