RO-LIVE-05
RO release enforcedLive admission-agreement pass: operator runs ade_node against
a private cardano-node peer with admission enabled (bootstrap
loads a real initial ledger state from either a genesis-bundle
seed or an imported cardano-node ledger snapshot), follows the
peer's chain, admits blocks via the single admit authority
(CN-CONS-08), and emits a JSONL log of (peer_tip, ade_tip,
agreement_verdict) per admitted block over a 30-minute window.
Closes the admission/agreement half of RO-LIVE-03.
- Source
docs/planning/phase4-n-l-live-wire-smoke-invariants.md §1
Enforcement trace
Code
Tests 4
- live_operator_pass_against_docker_preprod
- live_bundle_imports_with_conway_era_and_deterministic_fingerprint
- cross_epoch_block_triggers_halt_without_admit
- adversarial_corpus_rejects_all_four_mutation_classes
Cross-references
Strengthened in
Evidence notes
PHASE4-N-M-C (2026-05-26) CLOSED RO-LIVE-05 on the bounded statement: (1) live wire integration end-to-end against docker preprod is proven (committed wire-only transcript at slot 76910188 with handshake_ok v15 + peer_tip_read); (2) the closed LiveConsensusInputs import authority + canonical Blake2b-256 fingerprint shipped (CN-CONS-IN-01, DC-CONS-IN-02), exercised against a live preprod bundle (epoch 179, 384 pools); (3) the GREEN LiveLedgerView + epoch-window guard (DC-VIEW-01, DC-ADMIT-11) + closed AdmissionPeerEvent emission contract from the RED wire pump (CN-PUMP-01, DC-PUMP-01, DC-PUMP-02) + Undecodable-tightening (DC-ADMIT-12) shipped; (4) adversarial false-accept corpus across 4 mandatory mutation classes (DC-EVIDENCE-02) proven fail-closed.
PHASE4-N-M-A1.1 (2026-05-26) CLOSED the original A1.1 reference-script gate AND the freshly-surfaced A1.2 Byron-address + Plutus-integer-field gates. The seed importer now handles the FULL preprod UTxO dump: 1,909,985 entries import cleanly at the bundle's tip (committed transcript phase4-n-m-a1.1-admission-bootstrap-transcript.jsonl records admission_started + bootstrap_complete with the canonical consensus_inputs_fingerprint_hex and initial_ledger_fp_hex). Two-imports byte-identity preserved across the full dump.
2026-05-27 follow-up: with the peer at 100% sync, the operator pass was re-run against the live tip (epoch 291, source_tip_slot 124134280). Bootstrap completes cleanly (committed bootstrap transcript) but the admission wire pump exits with BlockFetchDecode immediately after chain-sync intersect succeeds and block-fetch RequestRange is sent. Root cause (diagnosed 2026-05-27): the session reducer (ade_network::session::core::drain_connected_frames) emits ONE DeliverPeerFrame per mux frame, but cardano-node fragments large block-fetch responses across multiple mux frames (mux payload max = 65535 bytes; Conway preprod blocks exceed this). Per-mini-protocol payload reassembly across consecutive mux frames is MISSING in the session reducer. The capture binary crates/ade_network/src/bin/capture_block_fetch.rs::read_for_protocol already implements the correct reassembly pattern (per-protocol byte buffer + try_decode predicate); the session reducer needs the same logic ported into its closed-sum drain path.
This is a session-reducer slice (PHASE4-N-L or PHASE4-N-M-FRAG scope), NOT an A1.1 / C5 strengthening. A1.1 stands closed; the open obligation re-tags to reflect the newly-surfaced gate.
See docs/evidence/phase4-n-m-c-operator-pass-README.md §8 for the diagnosis runbook + the captured BlockFetchDecode evidence; [[feedback-shell-must-not-overstate-semantic-truth]] doctrine load.
PHASE4-N-M-FRAG (2026-05-27) CLOSED at HEAD 4d3dc98 shipped the session-reducer reassembly + tag-24 unwrap + chain_dep epoch_nonce wiring. Live pass against fully-synced peer then surfaced Header(VrfCert(VerificationFailed)) at the pool_active_stake_missing stage with epoch=0 — pointing at the era-schedule's epoch-number plumbing, NOT VRF / nonce / pool data.
PHASE4-N-M-SCHED (2026-05-27) CLOSED RO-LIVE-05 outright. Root cause: ade_node::admission::bootstrap::make_schedule_for_imported_window hardcoded start_epoch: EpochNo(0) instead of canonical.epoch_no. With the schedule treating all imported-window slots as epoch 0, LiveLedgerView (which gates lookups by epoch == self.inputs.epoch_no) refused every per-pool lookup → header_validate short-circuited at the pool_active_stake.ok_or(VerificationFailed) line. Fix: thread canonical.epoch_no into make_schedule_for_imported_window.
Committed live transcript at docs/evidence/phase4-n-m-c-operator-pass-transcript.jsonl records the full DC-EVIDENCE-01 statement:
- 1
admission_startedwithconsensus_inputs_fingerprint_hex=8166ba41… - 1
bootstrap_completewithinitial_ledger_fp_hex=65461b64…andchain_tip_slot=124136968 - 1
block_receivedat slot 124140368, peer hashd111e613… - 1
block_admittedat slot 124140368, our hashd111e613…matches peer hash, post_fp9528023e… - 1
agreement_verdict { kind: "agreed" }at slot 124140368, our_hash == peer_hash ==d111e613… - 0
agreement_verdict { kind: "diverged" } - 0
block_admittedwith mismatched hash - clean
admission_shutdown { reason: "signal_received" }
PHASE4-N-M-FOLLOW (2026-05-27) strengthens by demonstrating sustained admission across the natural chain-sync stream. Committed transcript at docs/evidence/phase4-n-m-follow-sustained-transcript.jsonl records 34 consecutive block_admitted events from real chain-sync follow + block-fetch (slots 124137045..124137868), 0 diverged, 0 mismatched-hash, 0 input_not_found. The pump now walks the peer's chain in order from intersect: each RollForward extracts a Point from the header envelope and triggers a block-fetch; block-fetch BatchDone gates the next chain-sync RequestNext. The op-cert counter rule was fixed inline — equal counter is now no-op (same op-cert re-used across blocks within a KES period, normal pool operation per the Cardano protocol). Previous strict-<= semantics over-rejected legitimate repeated op-certs and was masked by the corpus's one-block-per-pool design.