Apr 17, 7-8 AM (96)
Apr 17, 8-9 AM (70)
Apr 17, 9-10 AM (53)
Apr 17, 10-11 AM (41)
Apr 17, 11-12 PM (58)
Apr 17, 12-1 PM (64)
Apr 17, 1-2 PM (39)
Apr 17, 2-3 PM (46)
Apr 17, 3-4 PM (36)
Apr 17, 4-5 PM (13)
Apr 17, 5-6 PM (10)
Apr 17, 6-7 PM (25)
Apr 17, 7-8 PM (22)
Apr 17, 8-9 PM (3)
Apr 17, 9-10 PM (16)
Apr 17, 10-11 PM (24)
Apr 17, 11-12 AM (16)
Apr 18, 12-1 AM (2)
Apr 18, 1-2 AM (2)
Apr 18, 2-3 AM (6)
Apr 18, 3-4 AM (1)
Apr 18, 4-5 AM (2)
Apr 18, 5-6 AM (2)
Apr 18, 6-7 AM (1)
Apr 18, 7-8 AM (2)
Apr 18, 8-9 AM (4)
Apr 18, 9-10 AM (4)
Apr 18, 10-11 AM (1)
Apr 18, 11-12 PM (6)
Apr 18, 12-1 PM (7)
Apr 18, 1-2 PM (8)
Apr 18, 2-3 PM (9)
Apr 18, 3-4 PM (0)
Apr 18, 4-5 PM (2)
Apr 18, 5-6 PM (6)
Apr 18, 6-7 PM (2)
Apr 18, 7-8 PM (2)
Apr 18, 8-9 PM (4)
Apr 18, 9-10 PM (9)
Apr 18, 10-11 PM (21)
Apr 18, 11-12 AM (23)
Apr 19, 12-1 AM (1)
Apr 19, 1-2 AM (4)
Apr 19, 2-3 AM (1)
Apr 19, 3-4 AM (0)
Apr 19, 4-5 AM (0)
Apr 19, 5-6 AM (3)
Apr 19, 6-7 AM (0)
Apr 19, 7-8 AM (2)
Apr 19, 8-9 AM (1)
Apr 19, 9-10 AM (1)
Apr 19, 10-11 AM (4)
Apr 19, 11-12 PM (7)
Apr 19, 12-1 PM (6)
Apr 19, 1-2 PM (8)
Apr 19, 2-3 PM (23)
Apr 19, 3-4 PM (7)
Apr 19, 4-5 PM (4)
Apr 19, 5-6 PM (3)
Apr 19, 6-7 PM (8)
Apr 19, 7-8 PM (3)
Apr 19, 8-9 PM (8)
Apr 19, 9-10 PM (6)
Apr 19, 10-11 PM (25)
Apr 19, 11-12 AM (23)
Apr 20, 12-1 AM (4)
Apr 20, 1-2 AM (5)
Apr 20, 2-3 AM (2)
Apr 20, 3-4 AM (7)
Apr 20, 4-5 AM (1)
Apr 20, 5-6 AM (8)
Apr 20, 6-7 AM (12)
Apr 20, 7-8 AM (29)
Apr 20, 8-9 AM (42)
Apr 20, 9-10 AM (37)
Apr 20, 10-11 AM (95)
Apr 20, 11-12 PM (42)
Apr 20, 12-1 PM (39)
Apr 20, 1-2 PM (53)
Apr 20, 2-3 PM (68)
Apr 20, 3-4 PM (47)
Apr 20, 4-5 PM (41)
Apr 20, 5-6 PM (31)
Apr 20, 6-7 PM (24)
Apr 20, 7-8 PM (10)
Apr 20, 8-9 PM (7)
Apr 20, 9-10 PM (16)
Apr 20, 10-11 PM (28)
Apr 20, 11-12 AM (18)
Apr 21, 12-1 AM (24)
Apr 21, 1-2 AM (5)
Apr 21, 2-3 AM (13)
Apr 21, 3-4 AM (4)
Apr 21, 4-5 AM (3)
Apr 21, 5-6 AM (8)
Apr 21, 6-7 AM (15)
Apr 21, 7-8 AM (44)
Apr 21, 8-9 AM (119)
Apr 21, 9-10 AM (36)
Apr 21, 10-11 AM (35)
Apr 21, 11-12 PM (98)
Apr 21, 12-1 PM (57)
Apr 21, 1-2 PM (71)
Apr 21, 2-3 PM (60)
Apr 21, 3-4 PM (33)
Apr 21, 4-5 PM (31)
Apr 21, 5-6 PM (27)
Apr 21, 6-7 PM (38)
Apr 21, 7-8 PM (35)
Apr 21, 8-9 PM (37)
Apr 21, 9-10 PM (14)
Apr 21, 10-11 PM (34)
Apr 21, 11-12 AM (12)
Apr 22, 12-1 AM (2)
Apr 22, 1-2 AM (3)
Apr 22, 2-3 AM (3)
Apr 22, 3-4 AM (4)
Apr 22, 4-5 AM (3)
Apr 22, 5-6 AM (17)
Apr 22, 6-7 AM (34)
Apr 22, 7-8 AM (21)
Apr 22, 8-9 AM (37)
Apr 22, 9-10 AM (18)
Apr 22, 10-11 AM (47)
Apr 22, 11-12 PM (44)
Apr 22, 12-1 PM (56)
Apr 22, 1-2 PM (64)
Apr 22, 2-3 PM (44)
Apr 22, 3-4 PM (86)
Apr 22, 4-5 PM (46)
Apr 22, 5-6 PM (17)
Apr 22, 6-7 PM (10)
Apr 22, 7-8 PM (18)
Apr 22, 8-9 PM (15)
Apr 22, 9-10 PM (23)
Apr 22, 10-11 PM (31)
Apr 22, 11-12 AM (17)
Apr 23, 12-1 AM (7)
Apr 23, 1-2 AM (4)
Apr 23, 2-3 AM (4)
Apr 23, 3-4 AM (6)
Apr 23, 4-5 AM (3)
Apr 23, 5-6 AM (8)
Apr 23, 6-7 AM (17)
Apr 23, 7-8 AM (25)
Apr 23, 8-9 AM (33)
Apr 23, 9-10 AM (33)
Apr 23, 10-11 AM (29)
Apr 23, 11-12 PM (30)
Apr 23, 12-1 PM (51)
Apr 23, 1-2 PM (66)
Apr 23, 2-3 PM (64)
Apr 23, 3-4 PM (26)
Apr 23, 4-5 PM (21)
Apr 23, 5-6 PM (6)
Apr 23, 6-7 PM (7)
Apr 23, 7-8 PM (10)
Apr 23, 8-9 PM (14)
Apr 23, 9-10 PM (6)
Apr 23, 10-11 PM (28)
Apr 23, 11-12 AM (18)
Apr 24, 12-1 AM (7)
Apr 24, 1-2 AM (4)
Apr 24, 2-3 AM (7)
Apr 24, 3-4 AM (5)
Apr 24, 4-5 AM (8)
Apr 24, 5-6 AM (11)
Apr 24, 6-7 AM (11)
Apr 24, 7-8 AM (7)
3,649 commits this week Apr 17, 2026 - Apr 24, 2026
sidecar composer: instrument convergence template for Antithesis
Applies the /antithesis-tests skill to the flagship test. Before, the
cardano_node_master testnet had:

- One no-op serial_driver (sleep 60), inherited from moog with no
  test semantics. Antithesis's 'All commands were run to completion
  at least once' property required it to run on some timeline, which
  it sometimes didn't at duration=1h (~30% flake rate).
- One eventually_ command with a 12-hour polling loop. Antithesis's
  eventually_ is meant to be a short post-fault recovery probe that
  exits quickly. A 12h loop means the script never 'runs to
  completion' in any reasonable duration, double-flagging under
  'started' and 'run to completion' properties.
- No finally_ command at all.
- No SDK assertions anywhere — the report had nothing to score.

After:

- components/sidecar/composer/convergence/helper_sdk_lib.sh
    Sourceable bash emitter for Antithesis's Fallback SDK JSONL.
    Offers sdk_reachable / sdk_unreachable / sdk_sometimes / sdk_always.
    'helper_' prefix → ignored by the composer, usable by siblings.

- components/sidecar/composer/convergence/eventually_converged.sh
    Rewritten per the canonical pattern: sleep 15s to settle after
    fault injection stops, then up to 10×2s retries (35s worst-case
    wall time) querying tip on every producer, exit 0 on
    convergence / 1 on failure. Emits sdk_reachable on entry,
    sdk_sometimes on success, sdk_unreachable on genuine
    non-convergence. Was a 12h polling loop.

- components/sidecar/composer/convergence/finally_tips_agree.sh
    New. Runs after drivers complete naturally. 15s settle + 5×2s
    tip-agreement retries. sdk_always on the final-state invariant:
    every producer agrees on the tip after workload ends. A failing
    sdk_always here means the test created a permanent fork.

- components/sidecar/composer/convergence/serial_driver_tip_agreement.sh
    New. Replaces serial_driver_sleep.sh. Samples tip on every
    producer 3× under active fault injection, emits sdk_sometimes
    whether tips agree or diverge. Real exclusive-access semantics
    (blocks parallel drivers from writing to the chain while
    sampling), and every sample is a reportable data point.

- components/sidecar/composer/convergence/serial_driver_sleep.sh — deleted.

Locally verified: each script runs to completion on a healthy
compose, all three emit well-formed antithesis_assert JSONL, total
wall time eventually=20s / finally=20s / serial=48s on a green
cluster. No timeout wrapper around cardano-cli ping (the sidecar
image is minimal — coreutils + bash + jq — and 'timeout' was
swallowing cardano-cli's stdout).
Remove ogmios from testnet pending #49 resolution
Ogmios produces a persistent 'No unexpected container exits → ogmios,
exit code: 255' finding on every run because the upstream
cardanosolutions/ogmios image exits 255 on any signal-driven shutdown
(SIGINT, SIGTERM). Not our bug, tracked in #49.

Dropping it from the testnet until the upstream (or a workaround)
lands. Ogmios will be re-added in the #49 fix PR.
Remove ogmios from testnet pending #49 resolution
Ogmios produces a persistent 'No unexpected container exits → ogmios,
exit code: 255' finding on every run because the upstream
cardanosolutions/ogmios image exits 255 on any signal-driven shutdown
(SIGINT, SIGTERM). Not our bug, tracked in #49.

Dropping it from the testnet until the upstream (or a workaround)
lands. Ogmios will be re-added in the #49 fix PR.
[Peras 4 revived] Add ObjectDiffusion and `Peras{Cert,Vote}` diffusion (instance of ObjectDiffusion) (#1800)
This PR reintroduces ObjectDiffusion now that
https://github.com/IntersectMBO/ouroboros-network/pull/5202 has been
merged as part of `ouroboros-network/main`!

It is based on
https://github.com/IntersectMBO/ouroboros-consensus/pull/1966 which
introduces consistency changes and improvements over the
`Peras{Cert,Vote}DB` that ObjectDiffusion plugs into