Apr 25, 8-9 PM (55)
Apr 25, 9-10 PM (13)
Apr 25, 10-11 PM (21)
Apr 25, 11-12 AM (22)
Apr 26, 12-1 AM (5)
Apr 26, 1-2 AM (0)
Apr 26, 2-3 AM (2)
Apr 26, 3-4 AM (5)
Apr 26, 4-5 AM (2)
Apr 26, 5-6 AM (2)
Apr 26, 6-7 AM (3)
Apr 26, 7-8 AM (8)
Apr 26, 8-9 AM (3)
Apr 26, 9-10 AM (0)
Apr 26, 10-11 AM (2)
Apr 26, 11-12 PM (1)
Apr 26, 12-1 PM (6)
Apr 26, 1-2 PM (4)
Apr 26, 2-3 PM (14)
Apr 26, 3-4 PM (14)
Apr 26, 4-5 PM (0)
Apr 26, 5-6 PM (13)
Apr 26, 6-7 PM (13)
Apr 26, 7-8 PM (7)
Apr 26, 8-9 PM (7)
Apr 26, 9-10 PM (5)
Apr 26, 10-11 PM (27)
Apr 26, 11-12 AM (21)
Apr 27, 12-1 AM (7)
Apr 27, 1-2 AM (7)
Apr 27, 2-3 AM (9)
Apr 27, 3-4 AM (9)
Apr 27, 4-5 AM (5)
Apr 27, 5-6 AM (13)
Apr 27, 6-7 AM (7)
Apr 27, 7-8 AM (82)
Apr 27, 8-9 AM (47)
Apr 27, 9-10 AM (33)
Apr 27, 10-11 AM (62)
Apr 27, 11-12 PM (80)
Apr 27, 12-1 PM (66)
Apr 27, 1-2 PM (44)
Apr 27, 2-3 PM (52)
Apr 27, 3-4 PM (42)
Apr 27, 4-5 PM (36)
Apr 27, 5-6 PM (26)
Apr 27, 6-7 PM (13)
Apr 27, 7-8 PM (26)
Apr 27, 8-9 PM (13)
Apr 27, 9-10 PM (16)
Apr 27, 10-11 PM (42)
Apr 27, 11-12 AM (28)
Apr 28, 12-1 AM (17)
Apr 28, 1-2 AM (8)
Apr 28, 2-3 AM (4)
Apr 28, 3-4 AM (5)
Apr 28, 4-5 AM (5)
Apr 28, 5-6 AM (8)
Apr 28, 6-7 AM (8)
Apr 28, 7-8 AM (37)
Apr 28, 8-9 AM (54)
Apr 28, 9-10 AM (59)
Apr 28, 10-11 AM (53)
Apr 28, 11-12 PM (56)
Apr 28, 12-1 PM (49)
Apr 28, 1-2 PM (54)
Apr 28, 2-3 PM (69)
Apr 28, 3-4 PM (31)
Apr 28, 4-5 PM (14)
Apr 28, 5-6 PM (47)
Apr 28, 6-7 PM (9)
Apr 28, 7-8 PM (9)
Apr 28, 8-9 PM (14)
Apr 28, 9-10 PM (20)
Apr 28, 10-11 PM (34)
Apr 28, 11-12 AM (29)
Apr 29, 12-1 AM (13)
Apr 29, 1-2 AM (1)
Apr 29, 2-3 AM (1)
Apr 29, 3-4 AM (6)
Apr 29, 4-5 AM (1)
Apr 29, 5-6 AM (4)
Apr 29, 6-7 AM (12)
Apr 29, 7-8 AM (45)
Apr 29, 8-9 AM (75)
Apr 29, 9-10 AM (49)
Apr 29, 10-11 AM (28)
Apr 29, 11-12 PM (51)
Apr 29, 12-1 PM (39)
Apr 29, 1-2 PM (21)
Apr 29, 2-3 PM (66)
Apr 29, 3-4 PM (25)
Apr 29, 4-5 PM (36)
Apr 29, 5-6 PM (16)
Apr 29, 6-7 PM (10)
Apr 29, 7-8 PM (14)
Apr 29, 8-9 PM (13)
Apr 29, 9-10 PM (17)
Apr 29, 10-11 PM (25)
Apr 29, 11-12 AM (29)
Apr 30, 12-1 AM (6)
Apr 30, 1-2 AM (8)
Apr 30, 2-3 AM (1)
Apr 30, 3-4 AM (6)
Apr 30, 4-5 AM (2)
Apr 30, 5-6 AM (8)
Apr 30, 6-7 AM (15)
Apr 30, 7-8 AM (17)
Apr 30, 8-9 AM (100)
Apr 30, 9-10 AM (19)
Apr 30, 10-11 AM (50)
Apr 30, 11-12 PM (120)
Apr 30, 12-1 PM (69)
Apr 30, 1-2 PM (45)
Apr 30, 2-3 PM (117)
Apr 30, 3-4 PM (29)
Apr 30, 4-5 PM (34)
Apr 30, 5-6 PM (9)
Apr 30, 6-7 PM (20)
Apr 30, 7-8 PM (23)
Apr 30, 8-9 PM (28)
Apr 30, 9-10 PM (13)
Apr 30, 10-11 PM (25)
Apr 30, 11-12 AM (15)
May 01, 12-1 AM (18)
May 01, 1-2 AM (15)
May 01, 2-3 AM (6)
May 01, 3-4 AM (7)
May 01, 4-5 AM (3)
May 01, 5-6 AM (5)
May 01, 6-7 AM (8)
May 01, 7-8 AM (13)
May 01, 8-9 AM (24)
May 01, 9-10 AM (16)
May 01, 10-11 AM (16)
May 01, 11-12 PM (17)
May 01, 12-1 PM (37)
May 01, 1-2 PM (29)
May 01, 2-3 PM (19)
May 01, 3-4 PM (16)
May 01, 4-5 PM (25)
May 01, 5-6 PM (11)
May 01, 6-7 PM (20)
May 01, 7-8 PM (22)
May 01, 8-9 PM (65)
May 01, 9-10 PM (15)
May 01, 10-11 PM (40)
May 01, 11-12 AM (61)
May 02, 12-1 AM (6)
May 02, 1-2 AM (11)
May 02, 2-3 AM (5)
May 02, 3-4 AM (8)
May 02, 4-5 AM (6)
May 02, 5-6 AM (2)
May 02, 6-7 AM (2)
May 02, 7-8 AM (14)
May 02, 8-9 AM (6)
May 02, 9-10 AM (7)
May 02, 10-11 AM (6)
May 02, 11-12 PM (5)
May 02, 12-1 PM (7)
May 02, 1-2 PM (3)
May 02, 2-3 PM (14)
May 02, 3-4 PM (9)
May 02, 4-5 PM (26)
May 02, 5-6 PM (8)
May 02, 6-7 PM (29)
May 02, 7-8 PM (11)
May 02, 8-9 PM (9)
3,756 commits this week Apr 25, 2026 - May 02, 2026
tracer-sidecar: add pure ForkTree module + tests
ForkTreeState tracks per-host current tips and a global
parent map. Edges are recorded on AddedToCurrentChain
(producer's own extension always captures the true parent);
SwitchedToAFork only updates the host's tip without
recording an edge.

clusterForkDepth = max(tip.chainLength) - commonAncestor.chainLength,
where commonAncestor walks each host's ancestry back (capped
at maxDepth) and intersects to find the deepest shared block.

8 hspec unit tests cover: empty state, sequential extension,
agreement, 1-block fork, root-only common ancestor, deep 5-block
divergence, setTip without edge, depth-cap truncation.

Part of #119 — pure algebra commit; wiring + persistence in
follow-up commits on this branch.
asteria-game: bump cardano-node-clients pin post #120 (rsReady fix + CI gap closed)
Bumps cardano-node-clients SRP + flake input from 9db6672a (PR
#113 merge) to 428313de (PR #120 merge).

Upstream lambdasistemi/cardano-node-clients PR
https://github.com/lambdasistemi/cardano-node-clients/pull/120
folds in three things this branch surfaced:

  - Issue #119 fix: setUpstreamStatus's UpstreamConnected branch
    now re-derives rsReady from current rsSlotsBehind, so a
    reconnect to a chain at the indexer's last seen tip flips
    ready=true immediately instead of waiting for the next
    rollForward (which never came under fault injection on a
    short-test 1h run).

  - Issue #121 CI gap: nix/checks.nix + ci.yml + justfile now
    run the unit-tests suite. The 244-example suite had not
    been executed by upstream CI; the conservation regression
    (next item) had been red on origin/main since 9db6672a.

  - Issue #121 fix: TxBuild's post-balance evaluator no longer
    bails with EvalFailure on a script-conservation violation —
    it iterates with the balanced body as the new prevTx so
    Peek-driven scripts re-read the post-balance fee. Mirrors
    the pre-balance eval-failure retry path. Bounded by
    seenFees cycle detection.

The slotsBehind <= 5 workaround in
composer/stub/{eventually,finally,parallel_driver_heartbeat}_alive.sh
is left in place — it remains a more direct expression of "the
indexer is keeping up" and is now consistent with the upstream
fix (both check the same condition; one in Haskell, one in
bash). Reverting it is unnecessary.
fix(ci): honour workflow_dispatch `test` input in Antithesis dispatch
The cardano-node.yaml workflow declared a workflow_dispatch `test`
input ('Test configuration to run (a directory in testnets)') but
the env block hardcoded TESTNET=cardano_node_master, so the input
was silently ignored. Every dispatch — regardless of -f test=… —
sent cardano_node_master's image set to Antithesis.

Caught by the run on dae3a5b targeting cardano_node_tx_generator:
the tx-generator image was missing from antithesis.images and no
tx_generator_* assertions appeared in the report. Confirmed by
diffing the docker-compose.yaml of cardano_node_tx_generator (which
includes the tx-generator service) against the actual image set
sent to Antithesis (which did not).

Bind TESTNET to inputs.test with a cardano_node_master fallback so
the cron schedule (which has no inputs) keeps targeting master.
feat(u5c): serve v1alpha and v1beta gRPC side-by-side (#987)
Register both UTxORPC v1alpha and v1beta service implementations on the
same listener. Clients pick which proto package they call; on the wire
the two are entirely separate gRPC services (utxorpc.v1alpha.* vs
utxorpc.v1beta.*), so no routing logic is needed and v1alpha bytes stay
unchanged.

Layout:
- src/serve/grpc/v1alpha/{query,sync,watch,submit}.rs - moved from
  src/serve/grpc/, imports rewritten to explicit pallas v1alpha paths.
- src/serve/grpc/v1beta/{query,sync,watch,submit}.rs - copies with
  imports swapped to v1beta. The only body divergence is in
  v1beta/query.rs read_utxos, where Datum.original_cbor is
  Option<Bytes> rather than Bytes.
- mod.rs: registers eight server impls (4 services x 2 versions) and
  10 file descriptor sets in tonic reflection.

Cargo.toml: bumps pallas to git rev 0da71c2 to pick up v1alpha and
v1beta proto packages and the v1beta::Mapper.

Drive-by: drop unused _mapper field from SubmitServiceImpl, and remove
two stale commented-out blocks in sync.rs.
asteria-game: relax stub liveness probes from .ready=true to slotsBehind<=5
Run 3's report flagged 'stub finally_alive holds' as
sdk_sometimes False, with last_reply
{processedSlot:60, ready:false, slotsBehind:0, tipSlot:60} —
the indexer was *at the chain tip* (processedSlot==tipSlot,
slotsBehind=0) but its 'ready' boolean was still false.

The indexer's 'ready' flag has stricter semantics than
slots-behind-the-tip: it requires lifecycle events past the
ChainSync warmup (likely "have I received at least one
RollForward since (re)connection"). Under fault injection,
relay1 frequently restarts and the indexer reconnects via the
PR #98 supervisor; if the chain is at a settled tipSlot when
the indexer reattaches, processedSlot catches up via RollBack
without a subsequent RollForward, leaving 'ready=false' until
the next block lands.

The asteria-side scripts only mean to assert "the indexer is
keeping up with the chain". slotsBehind<=5 captures that
exactly (matches --ready-threshold-slots default) and is robust
to the warmup race. The 'ready' boolean is the indexer's
stricter self-assessment and is racy under fault injection.

Same fix applied to eventually_alive.sh, finally_alive.sh, and
parallel_driver_heartbeat.sh — they all had the same overstrict
check.