Mar 17, 10-11 AM (37)
Mar 17, 11-12 PM (20)
Mar 17, 12-1 PM (119)
Mar 17, 1-2 PM (110)
Mar 17, 2-3 PM (49)
Mar 17, 3-4 PM (88)
Mar 17, 4-5 PM (28)
Mar 17, 5-6 PM (13)
Mar 17, 6-7 PM (12)
Mar 17, 7-8 PM (30)
Mar 17, 8-9 PM (39)
Mar 17, 9-10 PM (30)
Mar 17, 10-11 PM (37)
Mar 17, 11-12 AM (21)
Mar 18, 12-1 AM (1)
Mar 18, 1-2 AM (11)
Mar 18, 2-3 AM (9)
Mar 18, 3-4 AM (0)
Mar 18, 4-5 AM (6)
Mar 18, 5-6 AM (5)
Mar 18, 6-7 AM (3)
Mar 18, 7-8 AM (12)
Mar 18, 8-9 AM (20)
Mar 18, 9-10 AM (80)
Mar 18, 10-11 AM (87)
Mar 18, 11-12 PM (64)
Mar 18, 12-1 PM (72)
Mar 18, 1-2 PM (49)
Mar 18, 2-3 PM (130)
Mar 18, 3-4 PM (44)
Mar 18, 4-5 PM (26)
Mar 18, 5-6 PM (33)
Mar 18, 6-7 PM (43)
Mar 18, 7-8 PM (39)
Mar 18, 8-9 PM (23)
Mar 18, 9-10 PM (32)
Mar 18, 10-11 PM (40)
Mar 18, 11-12 AM (31)
Mar 19, 12-1 AM (30)
Mar 19, 1-2 AM (13)
Mar 19, 2-3 AM (6)
Mar 19, 3-4 AM (4)
Mar 19, 4-5 AM (4)
Mar 19, 5-6 AM (1)
Mar 19, 6-7 AM (29)
Mar 19, 7-8 AM (58)
Mar 19, 8-9 AM (118)
Mar 19, 9-10 AM (73)
Mar 19, 10-11 AM (199)
Mar 19, 11-12 PM (54)
Mar 19, 12-1 PM (61)
Mar 19, 1-2 PM (48)
Mar 19, 2-3 PM (76)
Mar 19, 3-4 PM (138)
Mar 19, 4-5 PM (29)
Mar 19, 5-6 PM (19)
Mar 19, 6-7 PM (31)
Mar 19, 7-8 PM (19)
Mar 19, 8-9 PM (36)
Mar 19, 9-10 PM (13)
Mar 19, 10-11 PM (41)
Mar 19, 11-12 AM (18)
Mar 20, 12-1 AM (4)
Mar 20, 1-2 AM (4)
Mar 20, 2-3 AM (8)
Mar 20, 3-4 AM (9)
Mar 20, 4-5 AM (10)
Mar 20, 5-6 AM (4)
Mar 20, 6-7 AM (51)
Mar 20, 7-8 AM (27)
Mar 20, 8-9 AM (29)
Mar 20, 9-10 AM (38)
Mar 20, 10-11 AM (33)
Mar 20, 11-12 PM (22)
Mar 20, 12-1 PM (33)
Mar 20, 1-2 PM (91)
Mar 20, 2-3 PM (19)
Mar 20, 3-4 PM (52)
Mar 20, 4-5 PM (24)
Mar 20, 5-6 PM (20)
Mar 20, 6-7 PM (14)
Mar 20, 7-8 PM (15)
Mar 20, 8-9 PM (15)
Mar 20, 9-10 PM (16)
Mar 20, 10-11 PM (22)
Mar 20, 11-12 AM (18)
Mar 21, 12-1 AM (8)
Mar 21, 1-2 AM (2)
Mar 21, 2-3 AM (5)
Mar 21, 3-4 AM (2)
Mar 21, 4-5 AM (1)
Mar 21, 5-6 AM (2)
Mar 21, 6-7 AM (6)
Mar 21, 7-8 AM (3)
Mar 21, 8-9 AM (9)
Mar 21, 9-10 AM (7)
Mar 21, 10-11 AM (5)
Mar 21, 11-12 PM (4)
Mar 21, 12-1 PM (3)
Mar 21, 1-2 PM (8)
Mar 21, 2-3 PM (3)
Mar 21, 3-4 PM (9)
Mar 21, 4-5 PM (7)
Mar 21, 5-6 PM (12)
Mar 21, 6-7 PM (12)
Mar 21, 7-8 PM (2)
Mar 21, 8-9 PM (1)
Mar 21, 9-10 PM (5)
Mar 21, 10-11 PM (24)
Mar 21, 11-12 AM (21)
Mar 22, 12-1 AM (0)
Mar 22, 1-2 AM (6)
Mar 22, 2-3 AM (5)
Mar 22, 3-4 AM (0)
Mar 22, 4-5 AM (1)
Mar 22, 5-6 AM (6)
Mar 22, 6-7 AM (6)
Mar 22, 7-8 AM (1)
Mar 22, 8-9 AM (1)
Mar 22, 9-10 AM (2)
Mar 22, 10-11 AM (3)
Mar 22, 11-12 PM (5)
Mar 22, 12-1 PM (1)
Mar 22, 1-2 PM (1)
Mar 22, 2-3 PM (2)
Mar 22, 3-4 PM (6)
Mar 22, 4-5 PM (6)
Mar 22, 5-6 PM (17)
Mar 22, 6-7 PM (32)
Mar 22, 7-8 PM (48)
Mar 22, 8-9 PM (7)
Mar 22, 9-10 PM (1)
Mar 22, 10-11 PM (21)
Mar 22, 11-12 AM (23)
Mar 23, 12-1 AM (5)
Mar 23, 1-2 AM (4)
Mar 23, 2-3 AM (9)
Mar 23, 3-4 AM (7)
Mar 23, 4-5 AM (2)
Mar 23, 5-6 AM (4)
Mar 23, 6-7 AM (1)
Mar 23, 7-8 AM (7)
Mar 23, 8-9 AM (33)
Mar 23, 9-10 AM (36)
Mar 23, 10-11 AM (17)
Mar 23, 11-12 PM (97)
Mar 23, 12-1 PM (62)
Mar 23, 1-2 PM (53)
Mar 23, 2-3 PM (73)
Mar 23, 3-4 PM (67)
Mar 23, 4-5 PM (86)
Mar 23, 5-6 PM (65)
Mar 23, 6-7 PM (20)
Mar 23, 7-8 PM (18)
Mar 23, 8-9 PM (16)
Mar 23, 9-10 PM (16)
Mar 23, 10-11 PM (33)
Mar 23, 11-12 AM (31)
Mar 24, 12-1 AM (1)
Mar 24, 1-2 AM (3)
Mar 24, 2-3 AM (14)
Mar 24, 3-4 AM (4)
Mar 24, 4-5 AM (2)
Mar 24, 5-6 AM (4)
Mar 24, 6-7 AM (3)
Mar 24, 7-8 AM (101)
Mar 24, 8-9 AM (34)
Mar 24, 9-10 AM (13)
Mar 24, 10-11 AM (6)
4,487 commits this week Mar 17, 2026 - Mar 24, 2026
cardano-testnet: adapt to NetworkTopology type changes
NetworkTopology was moved to ouroboros-netowork and refactored, which causes the
following changes in cardano-testnet:
- `createTestnetEnv` now creates a concrete topology, instead of an abstract one
- `createTestnetEnv` now allocates random ports to nodes and writes them
  both to the concrete topology file and the to the nodes config directories
- `cardanoTestnet` now does not generate the ports and instead reads the ones
assigned by `createTestnetEnv` from disk
net-rs: add random rollbacks to fake server (Poisson distributed)
New --rollback-rate flag for the serve command generates random chain
rollbacks (depth 1-3) on an independent Poisson schedule. The ChainSync
server detects when a client's read pointer is invalidated by a rollback
and sends MsgRollBackward. Default rate is 0 (no rollbacks).

Example: --block-rate 1.0 --rollback-rate 0.1

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: remove server Request/Response boilerplate, use Message directly
The server-side Request/Response enums were 1:1 mappings of Message
variants, and receive_request()/send_response() were pure conversion
boilerplate. The Runner already enforces agency and state transitions,
so these types added no safety.

Server code now uses runner.recv()/runner.send() with Message directly,
matching the simplicity of the protocol framework design.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
net-rs: add server-side protocol helpers and fake server CLI
Add symmetric Request/Response enum pairs with receive_request() and
send_response() functions for ChainSync, BlockFetch, and KeepAlive
protocols. Add accept_and_handshake() server connection helper.

New `serve` CLI command runs a fake Cardano node that generates blocks
on a Poisson schedule (configurable rate), serves ChainSync/BlockFetch/
KeepAlive to connecting clients. Live-tested with the `follow` command.

Also fix all pre-existing clippy warnings (matches! macro, io::Error::other,
map key iteration).

109 tests, zero clippy warnings.

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
Write IOSim trace to file instead of stdout on test failure
  The old dumpTrace used say which in IO context dumps the entire IOSim
  trace (potentially thousands of JSON lines) to stdout on test failure.
  With slow-network tests generating much larger traces, this was very
  noisy. Now the trace is written to a temp file and only the path is
  printed.

Signed-off-by: Sasha Bogicevic <[email protected]>
net-rs: add KeepAlive protocol to prevent peer disconnects
Without KeepAlive (protocol ID 8), the peer drops idle connections after
~60-90s. Add KeepAlive protocol implementation (state machine, CBOR codec,
cookie validation) and run it as a background task in the follow command,
pinging every 20s. Live-tested: connection now stays alive indefinitely.

109 tests total (11 new for KeepAlive).

Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>