May 10, 9-10 PM (10)
May 10, 10-11 PM (29)
May 10, 11-12 AM (19)
May 11, 12-1 AM (12)
May 11, 1-2 AM (5)
May 11, 2-3 AM (5)
May 11, 3-4 AM (7)
May 11, 4-5 AM (3)
May 11, 5-6 AM (12)
May 11, 6-7 AM (28)
May 11, 7-8 AM (60)
May 11, 8-9 AM (34)
May 11, 9-10 AM (77)
May 11, 10-11 AM (58)
May 11, 11-12 PM (78)
May 11, 12-1 PM (84)
May 11, 1-2 PM (102)
May 11, 2-3 PM (41)
May 11, 3-4 PM (27)
May 11, 4-5 PM (24)
May 11, 5-6 PM (26)
May 11, 6-7 PM (42)
May 11, 7-8 PM (53)
May 11, 8-9 PM (57)
May 11, 9-10 PM (22)
May 11, 10-11 PM (49)
May 11, 11-12 AM (19)
May 12, 12-1 AM (2)
May 12, 1-2 AM (2)
May 12, 2-3 AM (3)
May 12, 3-4 AM (4)
May 12, 4-5 AM (8)
May 12, 5-6 AM (11)
May 12, 6-7 AM (17)
May 12, 7-8 AM (25)
May 12, 8-9 AM (26)
May 12, 9-10 AM (35)
May 12, 10-11 AM (82)
May 12, 11-12 PM (98)
May 12, 12-1 PM (38)
May 12, 1-2 PM (69)
May 12, 2-3 PM (54)
May 12, 3-4 PM (41)
May 12, 4-5 PM (57)
May 12, 5-6 PM (40)
May 12, 6-7 PM (24)
May 12, 7-8 PM (24)
May 12, 8-9 PM (18)
May 12, 9-10 PM (8)
May 12, 10-11 PM (40)
May 12, 11-12 AM (19)
May 13, 12-1 AM (10)
May 13, 1-2 AM (2)
May 13, 2-3 AM (4)
May 13, 3-4 AM (2)
May 13, 4-5 AM (5)
May 13, 5-6 AM (29)
May 13, 6-7 AM (52)
May 13, 7-8 AM (43)
May 13, 8-9 AM (44)
May 13, 9-10 AM (21)
May 13, 10-11 AM (22)
May 13, 11-12 PM (47)
May 13, 12-1 PM (25)
May 13, 1-2 PM (44)
May 13, 2-3 PM (57)
May 13, 3-4 PM (42)
May 13, 4-5 PM (33)
May 13, 5-6 PM (30)
May 13, 6-7 PM (51)
May 13, 7-8 PM (31)
May 13, 8-9 PM (9)
May 13, 9-10 PM (24)
May 13, 10-11 PM (29)
May 13, 11-12 AM (11)
May 14, 12-1 AM (18)
May 14, 1-2 AM (3)
May 14, 2-3 AM (4)
May 14, 3-4 AM (21)
May 14, 4-5 AM (11)
May 14, 5-6 AM (18)
May 14, 6-7 AM (18)
May 14, 7-8 AM (47)
May 14, 8-9 AM (53)
May 14, 9-10 AM (35)
May 14, 10-11 AM (20)
May 14, 11-12 PM (114)
May 14, 12-1 PM (54)
May 14, 1-2 PM (151)
May 14, 2-3 PM (32)
May 14, 3-4 PM (17)
May 14, 4-5 PM (14)
May 14, 5-6 PM (37)
May 14, 6-7 PM (12)
May 14, 7-8 PM (22)
May 14, 8-9 PM (36)
May 14, 9-10 PM (35)
May 14, 10-11 PM (27)
May 14, 11-12 AM (14)
May 15, 12-1 AM (18)
May 15, 1-2 AM (15)
May 15, 2-3 AM (5)
May 15, 3-4 AM (3)
May 15, 4-5 AM (13)
May 15, 5-6 AM (14)
May 15, 6-7 AM (10)
May 15, 7-8 AM (31)
May 15, 8-9 AM (23)
May 15, 9-10 AM (52)
May 15, 10-11 AM (71)
May 15, 11-12 PM (70)
May 15, 12-1 PM (73)
May 15, 1-2 PM (73)
May 15, 2-3 PM (66)
May 15, 3-4 PM (26)
May 15, 4-5 PM (12)
May 15, 5-6 PM (30)
May 15, 6-7 PM (29)
May 15, 7-8 PM (25)
May 15, 8-9 PM (8)
May 15, 9-10 PM (34)
May 15, 10-11 PM (34)
May 15, 11-12 AM (25)
May 16, 12-1 AM (2)
May 16, 1-2 AM (2)
May 16, 2-3 AM (3)
May 16, 3-4 AM (3)
May 16, 4-5 AM (0)
May 16, 5-6 AM (6)
May 16, 6-7 AM (2)
May 16, 7-8 AM (10)
May 16, 8-9 AM (1)
May 16, 9-10 AM (2)
May 16, 10-11 AM (1)
May 16, 11-12 PM (13)
May 16, 12-1 PM (11)
May 16, 1-2 PM (8)
May 16, 2-3 PM (15)
May 16, 3-4 PM (10)
May 16, 4-5 PM (2)
May 16, 5-6 PM (2)
May 16, 6-7 PM (1)
May 16, 7-8 PM (10)
May 16, 8-9 PM (6)
May 16, 9-10 PM (4)
May 16, 10-11 PM (27)
May 16, 11-12 AM (42)
May 17, 12-1 AM (7)
May 17, 1-2 AM (1)
May 17, 2-3 AM (0)
May 17, 3-4 AM (1)
May 17, 4-5 AM (0)
May 17, 5-6 AM (3)
May 17, 6-7 AM (1)
May 17, 7-8 AM (1)
May 17, 8-9 AM (1)
May 17, 9-10 AM (1)
May 17, 10-11 AM (6)
May 17, 11-12 PM (6)
May 17, 12-1 PM (3)
May 17, 1-2 PM (5)
May 17, 2-3 PM (9)
May 17, 3-4 PM (4)
May 17, 4-5 PM (5)
May 17, 5-6 PM (14)
May 17, 6-7 PM (8)
May 17, 7-8 PM (1)
May 17, 8-9 PM (4)
May 17, 9-10 PM (1)
4,225 commits this week May 10, 2026 - May 17, 2026
chore(deps): bump github.com/blinklabs-io/gouroboros (#718)
Bumps [github.com/blinklabs-io/gouroboros](https://github.com/blinklabs-io/gouroboros) from 0.166.1 to 0.168.0.
- [Release notes](https://github.com/blinklabs-io/gouroboros/releases)
- [Changelog](https://github.com/blinklabs-io/gouroboros/blob/main/RELEASE_NOTES.md)
- [Commits](https://github.com/blinklabs-io/gouroboros/compare/v0.166.1...v0.168.0)

---
updated-dependencies:
- dependency-name: github.com/blinklabs-io/gouroboros
  dependency-version: 0.168.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
chore(deps): bump github.com/utxorpc/go-sdk from 0.0.2 to 0.0.4 (#717)
Bumps [github.com/utxorpc/go-sdk](https://github.com/utxorpc/go-sdk) from 0.0.2 to 0.0.4.
- [Release notes](https://github.com/utxorpc/go-sdk/releases)
- [Commits](https://github.com/utxorpc/go-sdk/compare/v0.0.2...v0.0.4)

---
updated-dependencies:
- dependency-name: github.com/utxorpc/go-sdk
  dependency-version: 0.0.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
chore(deps): Bump github.com/blinklabs-io/gouroboros
Bumps [github.com/blinklabs-io/gouroboros](https://github.com/blinklabs-io/gouroboros) from 0.153.1 to 0.170.1.
- [Release notes](https://github.com/blinklabs-io/gouroboros/releases)
- [Changelog](https://github.com/blinklabs-io/gouroboros/blob/main/RELEASE_NOTES.md)
- [Commits](https://github.com/blinklabs-io/gouroboros/compare/v0.153.1...v0.170.1)

---
updated-dependencies:
- dependency-name: github.com/blinklabs-io/gouroboros
  dependency-version: 0.168.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
chore(deps): Bump github.com/fxamacker/cbor/v2 from 2.9.1 to 2.9.2 (#323)
Bumps [github.com/fxamacker/cbor/v2](https://github.com/fxamacker/cbor) from 2.9.1 to 2.9.2.
- [Release notes](https://github.com/fxamacker/cbor/releases)
- [Commits](https://github.com/fxamacker/cbor/compare/v2.9.1...v2.9.2)

---
updated-dependencies:
- dependency-name: github.com/fxamacker/cbor/v2
  dependency-version: 2.9.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
build(deps): bump golang.org/x/net from 0.50.0 to 0.54.0
Bumps [golang.org/x/net](https://github.com/golang/net) from 0.50.0 to 0.54.0.
- [Commits](https://github.com/golang/net/compare/v0.50.0...v0.54.0)

---
updated-dependencies:
- dependency-name: golang.org/x/net
  dependency-version: 0.54.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
build(deps): bump github.com/utxorpc/go-codegen from 0.18.1 to 0.19.0 (#576)
Bumps [github.com/utxorpc/go-codegen](https://github.com/utxorpc/go-codegen) from 0.18.1 to 0.19.0.
- [Release notes](https://github.com/utxorpc/go-codegen/releases)
- [Commits](https://github.com/utxorpc/go-codegen/compare/v0.18.1...v0.19.0)

---
updated-dependencies:
- dependency-name: github.com/utxorpc/go-codegen
  dependency-version: 0.19.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
L1: Add Maybe LeiosCert on DijkstraBody (Dijkstra-only)
Introduce 'Maybe LeiosCert' (mirrored after the existing 'Maybe PerasCert')
as an optional field on the Dijkstra-era 'BlockBody'. Other eras are
unaffected — this is the entire Leios-related ledger change per the
rebase plan's decision #3 (no 'Body'/'BodyInline'/'BodyCertificate' sum,
no early-era touch).

The change spans four pieces, all kept together so the type, codec,
hashing, and lens story land coherent:

- 'LeiosCert' / 'PerasCert' placeholders encode as @encodeListLen 0@
  rather than @encCBOR ()@ — the latter is 'encodeNull' (0xf6), which
  collides with the null-tag of 'encodeNullStrictMaybe' and made
  'SJust LeiosCert' indistinguishable from 'SNothing' on the wire.
  Adds a regression test in 'BaseTypesSpec' covering both certs.
- 'DijkstraBlockBody' carries pre-encoded bytes for body / wits /
  aux-data / is-valid / Leios cert / Peras cert, six slots total
  (numSegComponents = 6). The Leios and Peras cert slots always emit
  a CBOR token (null when absent) so the on-wire layout is fixed.
- Lens setters ('txSeqBlockBodyL', 'leiosCertBlockBodyL',
  'perasCertBlockBodyL') rebuild via the bidirectional
  'DijkstraBlockBody' pattern. The previous setters only updated the
  structural field and silently kept the stale pre-encoded bytes, so
  e.g. setting txs left 'dbbTxsBodyBytes' as the empty list and the
  block on the wire had no transactions even though the in-memory
  rep was correct. Mirrors the Alonzo idiom
  @lens abbTxs (\_ s -> AlonzoBlockBody s)@.
- 'Arbitrary' and 'TreeDiff' instances for the body extended to
  generate / show the new cert slot.

Co-Authored-By: Claude <[email protected]>
Migrate to BearerBytes + Reception from the remade network fork
Flip the ouroboros-network SRP pin from the upstream
'main-peras-5202-merged' tag to the local 'leios-prototype-remake' branch
(file://path so the project-specific repo can later pin the same SHA).
Adapt the consensus side to two API changes from chunk N:

1. BearerBytes class replaces dataSize on ProtocolSizeLimits.
   - byteLimitsLeiosFetch/byteLimitsLeiosNotify drop their (bytes -> Word)
     parameter.
   - Every byteLimits* call site loses its (const 0) / size argument
     (consensus diffusion's noByteLimits/byteLimits records and the
     PeerSimulator chainSyncNoSizeLimits/blockFetchNoSizeLimits).
   - mkApps on N2N and N2C grows BearerBytes constraints for each bytes
     parameter; Ouroboros.Network.Protocol.Limits is imported for it.

2. Reception arrival-time wrapping on channel recv.
   - Every (a, Maybe bytes) trailing in N2N/N2C aChainSync*/aBlockFetch*/
     etc. becomes (a, Maybe (Reception bytes)).
   - createConnectedChannelsWithDelay in ThreadNet/Network wraps recv'd
     values with `MkReception IntMap.empty` (mirroring how the network
     repo's tests/demos synthesise trailings — no real arrival times when
     the channel is an in-process TMVar).
   - PeerSimulator ChainSync/BlockFetch runners strip the Reception when
     packaging results into PeerSimulatorResult (`fmap received trailing`).
   - immdb-server's MiniProtocols re-add the arrival timestamps in the
     JSON tracers — restoring the `mux_at` field the C8 commit had to
     placeholder while the old SRP didn't carry them.

Unrelated upstream-drift fixes folded in:
- TraceSendMsg/TraceRecvMsg now carry a Time / Maybe Time argument; the
  PeerSimulator.Trace pattern is updated.
- FetchModeGenesis constructor renamed to GenesisFetchMode in
  Ouroboros.Network.BlockFetch.ConsensusInterface; updated in the
  BlockFetch test + PeerSimulator.BlockFetch.
- Node.hs: Cardano.LedgerPeersConsensusInterface's `getBlockHash` field
  renamed to `getImmutableBlockPoint` returning Either
  GetImmutableBlockPointError, with separate error cases for
  Genesis/NotYetImmutable.
- ChurnMode is now newtype { getFetchMode :: FetchMode }; replace
  `ChurnModeNormal` with `ChurnMode (PraosFetchMode FetchModeDeadline)`.
- Qualify NodeKernel.getFetchMode to disambiguate from
  Cardano.Network.PeerSelection.Churn's identically-named field.

End-to-end gate after migration:
- cabal build all (including --enable-tests): clean.
- cardano-test -p "Leios" --quickcheck-tests=200: PASS, 1/1, 78.6s.
- consensus-test -p "Peras": PASS, 7/7, 2.3s.
- leios-schedule-gen smoke + immdb-server --help: green.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
C5: Cumulative tx bytes + Dijkstra ResolveLeiosBlock instance
Per the rebase plan's C5. Adds an era-abstract running total of
transaction bytes applied so far on the Shelley-based ledger, and lands
the real 'ResolveLeiosBlock' splice for Dijkstra-era CardanoBlocks
(C3 only added the structural class; the actual EB-closure read sits in
Shelley/Ledger/Ledger.hs and lands here together with the cumulative
tx-bytes change since they share the same file).

- 'Ouroboros.Consensus.Ledger.SupportsMempool' gains a per-block
  'blockTxBytes' projection that the cumulative counter updates from.
- 'shelleyCumulativeTxBytes :: Word64' on 'ShelleyLedgerState' and
  'tickedShelleyCumulativeTxBytes' on the ticked variant; both
  CBOR-versioned through (en|de)codeShelleyLedgerState.
- 'HardFork.Combinator.Mempool' threads cumulative tx bytes through
  per-era projections.
- 'ResolveLeiosBlock (ShelleyBlock (Praos c) DijkstraEra)': reads the
  parent's 'praosStateLeiosAnnouncement' + 'praosStateLastSlot',
  queries 'leiosDbQueryCompletedEbByPoint', and splices the EB's tx
  closure into the body via 'Core.txSeqBlockBodyL'. Errors with a
  clear message if the announced EB isn't available locally (matches
  the prototype's FIXME — race that the threadnet harness avoids by
  snapshotting LeiosDb per node, see C7).

Refs: #1988

Co-Authored-By: Claude <[email protected]>
Drop unused imports / dead bindings / Word-identity flagged by -Werror
Cleanup that haskell.nix's -Werror surfaces but local cabal -Wall does
not. The touched files were last modified by C7 (threadnet harness),
the N migration (BearerBytes + Reception) and C8 (immdb-server + schedule
generator), so this is left as a follow-up commit rather than squashed
into C7 (the autosquash conflicts with later commits that touch the same
files).

- Test/ThreadNet/Network.hs: drop unused LeiosDemo* / Control.Exception /
  Ouroboros.Network.Mux imports; drop dead 'cfg'' binding and unused
  NodeLeiosDb data type + the record field that referenced it.
- TxGen/Cardano.hs: drop unused LedgerState / mkShelleyTx / Praos imports
  + dead ejectDijkstraTickedLedgerState.
- ouroboros-consensus.cabal: drop unused io-sim + unstable-byron-testlib
  + unstable-cardano-testlib + unstable-mock-block from
  unstable-cardano-tools deps; drop unused cardano-slotting from
  leios-schedule-gen deps.
- Cardano/Tools/DBAnalyser/Block/Cardano.hs: drop unused
  ShelleyLeaderCredentials import.
- Cardano/Tools/ThreadNet/Run.hs: fill missing txLogicVersion field
  (upstream's TestConfig grew this in 0dac43e80 Aug 2024); use maxBound
  to match other call sites.
- Test/ThreadNet/Cardano.hs: fill missing ctgeExtraTxGen field
  (upstream's CardanoTxGenExtra grew this).
- Ouroboros.Consensus.Node: drop unused nullTracer import.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
C8: ImmDBServer schedule-driven Leios + schedule generator
Brings back the immdb-server's Leios bits — the schedule-driven LeiosNotify
and LeiosFetch servers — plus the prototype's schedule generator as a
standalone binary.

Source modules (under unstable-cardano-tools):

- Cardano/Tools/ImmDBServer/Json.hs (+ Json/Say.hs + Json/SendRecv.hs)
  Atomic JSON-line tracer (`mkUltimateTracer`) used by the schedule-driven
  immdb-server.
- Cardano/Tools/ImmDBServer/MiniProtocols.hs
  Grafted onto main's structure: keep the modern `Cardano.Network.NodeToNode`
  imports + `PerasUnsupported` in `stdVersionDataNTN`, add the
  schedule-driven `leiosNotifyProt` / `leiosFetchProt`, plus the
  per-message send/recv JSON tracers (`maybeShowSendRecvCS/BF/LF`,
  `mapBFEvent`).  `chainSyncServer` now consults `getSlotDelay` so blocks
  are released at their wallclock slot.  Leios mini-protocol limits are
  inlined locally (5 MiB ingress queue) since `Consensus.N2N` no longer
  exposes leios-specific limit helpers.
- Cardano/Tools/ImmDBServer/Diffusion.hs
  Exports `LeiosSchedule` + extended `run` taking `getSlotDelay`,
  `leiosDbFile`, `LeiosSchedule`.  The scheduler thread feeds
  `MP.leiosMailbox` from the time-ordered schedule entries.  Server plumbing
  uses main's `Server.with`-shaped API.

Executables:

- app/immdb-server.hs gains `--leios-db`, `--leios-schedule`,
  `--initial-slot`, `--initial-time` (+ `--address`).  Slot-to-wallclock
  uses a 1-second slot assumption.
- app/leios-schedule-gen.hs is the prototype's `leiosdemo202510.hs` carrying
  only the `generate` subcommand: read a JSON manifest, write a SQLite
  Leios DB + a matching schedule JSON.  Per-message helper subcommands
  (MsgLeiosBlock*, ebId-to-point, fetch-logic-iteration, hash-txs,
  cache-copy) are intentionally dropped; those were used by the November
  demo shell scripts, which are out of scope.

Drift note: the JSON tracers now set `mux_at = Nothing` instead of an
arrival timestamp.  The prototype's "arrival-time on TraceRecvMsg" patch
lives on the leios-prototype `ouroboros-network` fork; until that pin is
flipped, `TraceSendMsg` / `TraceRecvMsg` here only carry the message.

Library deps added to `unstable-cardano-tools`: `io-classes:si-timers`,
`time`, `typed-protocols`.  `immdb-server` exe adds aeson, cardano-slotting,
time.  New `leios-schedule-gen` exe pulls direct-sqlite, base16-bytestring,
cardano-binary, cardano-crypto-class, cborg, random, vector, etc.

Smoke-tested end-to-end: a minimal manifest produces a valid SQLite DB and
a schedule JSON with the expected MsgLeiosBlockOffer/MsgLeiosBlockTxsOffer
entries.  `cabal build all` clean.

Refs: #1718, #1724, #1883

Co-Authored-By: Claude Opus 4.7 <[email protected]>
C7: Leios threadnet test + harness rebase
Per the rebase plan's C7. Brings up the Leios threadnet QuickCheck test
on the new structural foundation (chunks C1-C5). The November-demo
scripts ('scripts/leios-demo/', 'nix/leios-mvd/') are intentionally
dropped; the 'run-threadnet' executable is also deferred (its prototype
has upstream API drift — see follow-up).

- 'test/cardano-test/Test/ThreadNet/Leios.hs': the property test
  itself — verifies cert blocks happen, no vacuous runs, gap >
  minCertificationGap, all nodes converge, and an independent replay
  of each node's chain through 'resolveLeiosBlock' produces the same
  final ledger as the live node.
- 'unstable-diffusion-testlib/Test/ThreadNet/Network.hs' is the
  central rebase: 'NodeInfo' parametrises over a Leios state functor
  so the live version holds a 'StrictTVar m' and the snapshot reader
  produces 'Identity'; 'mkArgs' threads the TVar to
  'fromMinimalChainDbArgs' via the new 'mcdbLeiosDbVar' field on
  'MinimalChainDbArgs'; 'mkTestOutput' returns the snapshotted LeiosDb
  so the post-hoc 'replayNodeChain' / 'sumChainTxBytes' can resolve
  EBs (without this, every test would crash at the first cert block).
  Per-node 'leiosVotingKey' wired so voting fires.
- All other test-side call sites updated for new ChainDB / forge /
  mempool signatures (ChainDB.Unit, StateMachine, FollowerPromptness,
  LedgerSnapshots, BlockFetch.Client, LocalStateQuery.Server,
  PeerSimulator, Genesis tests, HardFork.Combinator tests).
- 'unstable-cardano-testlib': 'Test.Consensus.Cardano.ProtocolInfo'
  gains a 'hardForkInto Dijkstra' entry; 'Test.ThreadNet.TxGen.Cardano'
  projects DijkstraEra from the cardano TxGen.
- 'unstable-shelley-testlib': generators / examples updated for the
  new Praos header field and ShelleyLedgerState cumulative tx bytes.

Refs: #1883, #1906

Co-Authored-By: Claude <[email protected]>
C2: Praos header EB announcement + protocolStateLeiosInfo
Per the rebase plan's C2, extends the Praos header and chain-dep state
to carry the optional Leios EB announcement (the certify flag is gone —
the cert lives on 'DijkstraBody' instead, per resolved decision #3).

- 'Header': add 'hbLeiosEbAnnouncement :: !(StrictMaybe EbAnnouncement)';
  emit / decode it alongside the existing header fields.
- 'PraosState': add 'praosStateLeiosAnnouncement :: !(StrictMaybe ...)'
  and update it from the applied block's signed header view. The
  announcement is intentionally *non-sticky* — every block overwrites
  the slot with that block's own announcement (or 'SNothing'), so a
  certifying block can only be the *direct* successor of the announcer.
  Simpler than the prototype's 'LeiosState' record; we drop the unused
  'leiosStateCumulativeEbAnnouncementSize'.
- 'ProtocolHeaderSupportsKES.protocolStateLeiosInfo': new class method
  returning '(EbAnnouncement, WithOrigin SlotNo)' for the forger's
  certify decision. TPraos default returns 'Nothing'; Praos reads from
  'PraosState'.
- 'Block.SupportsProtocol' / Shelley protocol shims threaded
  accordingly. Test generators updated to populate the new field.

Refs: #1978, #1921

Co-Authored-By: Claude <[email protected]>
C1: Leios foundations + mini-protocols (consensus side)
Per the rebase plan's C1, brings the prototype's Leios scaffolding into
'ouroboros-consensus' / 'ouroboros-consensus-diffusion'. Self-contained
infrastructure that later chunks (C2-C7) build on top of:

- LeiosDemo{Types, Db, Logic, Exception, OnlyTest{Fetch, Notify}} and
  'LeiosVoteState' under 'ouroboros-consensus/src/ouroboros-consensus/'.
  Module names kept flat-and-prefixed, matching the prototype layout.
- 'LeiosNotify' / 'LeiosFetch' mini-protocols (types, codecs, server
  + client, handlers) and 'leiosFetchLogic' background thread, plumbed
  through 'NodeToNode' and 'NodeKernel'. The voting thread and voting
  message paths land in this chunk too — splitting them out would
  fracture single files for no review benefit; C6 only contributes the
  threadnet-side voting key wire.
- 'LeiosDbConnection' threaded into 'ChainDbArgs' (cdbsLeiosDb), the
  ChainDB.Impl pipeline, and the LedgerDB args. Real-node start path
  ('Ouroboros.Consensus.Node') opens the DB.
- 'cabal.project' SRP pins flipped to the rebased ledger fork
  ('cardano-ledger-leios-prototype-remake-on-chap') and the network
  fork that carries the demo-tuning add-ons.
- 'cardano-blueprint' submodule added at the new prototype branch tip,
  so consensus / network can pull the Leios CDDL from one place.
- New modules registered in 'ouroboros-consensus.cabal'.

Refs: #1832, #1837, #1979

Co-Authored-By: Claude <[email protected]>
C3: ResolveLeiosBlock class + ChainDB / LedgerDB apply hook
Per the rebase plan's C3, threads a 'ResolveLeiosBlock' typeclass through
the block-application pipeline so that Dijkstra-era blocks carrying a
'SJust LeiosCert' get their (empty) tx list filled in from the EB
closure in 'LeiosDb' before validation. Plumbing only — no chain-
selection rule change (per resolved decision #1, decision #3).

- 'Storage.LedgerDB.Forker' grows a 'ResolveLeiosBlock' class and the
  'applyBlock' hook calls 'resolveLeiosBlock leiosDb hdrSt b' before
  'tickThen{Apply,Reapply}'. The forker's 'ExtLedgerState' is read to
  extract 'headerState' for the splice (used to look up the previous
  EB announcement on the chain-dep state).
- 'Storage.LedgerDB.V2.validate' threads 'LeiosDbConnection' alongside
  the existing args, so the new applyBlock signature reaches the V2
  pipeline.
- Default 'ResolveLeiosBlock' instances ('return blk') for every block
  type that doesn't carry Leios: Byron, mock SimpleBlock', DualBlock,
  TestBlock, HardForkBlock, ShelleyBlock (TPraos). The Dijkstra-era
  'ShelleyBlock (Praos c)' splice lives next to the cumulative tx
  bytes change in C5 since both live in
  'Ouroboros.Consensus.Shelley.Ledger.Ledger'.
- CardanoBlock dispatch in 'Ouroboros.Consensus.Cardano.Block' routes
  per-era to the appropriate instance.

Refs: #1873, #1889

Co-Authored-By: Claude <[email protected]>