Apr 16, 4-5 PM (47)
Apr 16, 5-6 PM (56)
Apr 16, 6-7 PM (17)
Apr 16, 7-8 PM (68)
Apr 16, 8-9 PM (38)
Apr 16, 9-10 PM (11)
Apr 16, 10-11 PM (24)
Apr 16, 11-12 AM (23)
Apr 17, 12-1 AM (12)
Apr 17, 1-2 AM (8)
Apr 17, 2-3 AM (3)
Apr 17, 3-4 AM (4)
Apr 17, 4-5 AM (3)
Apr 17, 5-6 AM (9)
Apr 17, 6-7 AM (26)
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 (9)
Apr 22, 7-8 PM (17)
Apr 22, 8-9 PM (14)
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 (56)
Apr 23, 3-4 PM (20)
Apr 23, 4-5 PM (0)
3,818 commits this week Apr 16, 2026 - Apr 23, 2026
run separate golden_traceMessages test for debug/release
The tracing messages that get emitted differ between debug and release
builds. Therefore, running the same test (with the same golden file of
expected tracing messages) both for debug and release builds will cause
problems. To avoid these, we now have two separate tests, each with its
own golden file, and only run the appropriate one depending on the build
type.

The only reason this did not lead to problems so far is that the test
only inserted four entries into the table, not triggering any
interesting internal events. However, we *will* emit internal messages
once we start migrating the union level when a union is paid off (or we
decide to test more interesting operations).
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).
feat(ledger): introduce hardfork combinator shapes and refactor ledger (#2011)
* feat(ledger/hardfork): implement hardfork combinator types

Signed-off-by: Chris Guiney <[email protected]>

* chore: move all references to TransitionState and TransitionInfo to hardfork package

Signed-off-by: Chris Guiney <[email protected]>

* feat(ledger): add StabilityWindowForEra function

Signed-off-by: Chris Guiney <[email protected]>

* feat(ledger): add HardforkSummary method to ledger state

Signed-off-by: Chris Guiney <[email protected]>

* refactor(ledger): wire SlotToTime, TimeToSlot, and SlotToEpoch through HardforkSummary

Signed-off-by: Chris Guiney <[email protected]>

* refactor(leger): refactor queryHardforkEraHistory to use hardfork package

Signed-off-by: Chris Guiney <[email protected]>

---------

Signed-off-by: Chris Guiney <[email protected]>
Update head.hackage hash (#248)
This should fix the following error:

    error: hash mismatch in fixed-output derivation '/nix/store/4a81ynkkkxdg2zj29vf3nv9933n0ckxv-head.hackage.ghc.haskell.org.drv':
             specified: sha256-yFGpWo9ulwBEUyzTLKJBtbCWi7Ly4NEtocBRogdew9g=
                got:    sha256-O6vUr/LlMiC9FtmGQg+1DiiTnhkru8Bkgtrjo+A06gw=
    error: Cannot build '/nix/store/xa64sf0p9kxd57zbrn5jh4x6gnh7r22b-dot-cabal.drv'.