Jun 06, 12-1 AM (6)
Jun 06, 1-2 AM (0)
Jun 06, 2-3 AM (3)
Jun 06, 3-4 AM (4)
Jun 06, 4-5 AM (0)
Jun 06, 5-6 AM (24)
Jun 06, 6-7 AM (1)
Jun 06, 7-8 AM (2)
Jun 06, 8-9 AM (3)
Jun 06, 9-10 AM (0)
Jun 06, 10-11 AM (3)
Jun 06, 11-12 PM (6)
Jun 06, 12-1 PM (2)
Jun 06, 1-2 PM (2)
Jun 06, 2-3 PM (2)
Jun 06, 3-4 PM (18)
Jun 06, 4-5 PM (1)
Jun 06, 5-6 PM (6)
Jun 06, 6-7 PM (0)
Jun 06, 7-8 PM (6)
Jun 06, 8-9 PM (0)
Jun 06, 9-10 PM (1)
Jun 06, 10-11 PM (27)
Jun 06, 11-12 AM (9)
Jun 07, 12-1 AM (14)
Jun 07, 1-2 AM (2)
Jun 07, 2-3 AM (0)
Jun 07, 3-4 AM (0)
Jun 07, 4-5 AM (1)
Jun 07, 5-6 AM (1)
Jun 07, 6-7 AM (3)
Jun 07, 7-8 AM (0)
Jun 07, 8-9 AM (0)
Jun 07, 9-10 AM (1)
Jun 07, 10-11 AM (2)
Jun 07, 11-12 PM (2)
Jun 07, 12-1 PM (5)
Jun 07, 1-2 PM (35)
Jun 07, 2-3 PM (2)
Jun 07, 3-4 PM (4)
Jun 07, 4-5 PM (2)
Jun 07, 5-6 PM (4)
Jun 07, 6-7 PM (0)
Jun 07, 7-8 PM (0)
Jun 07, 8-9 PM (17)
Jun 07, 9-10 PM (1)
Jun 07, 10-11 PM (21)
Jun 07, 11-12 AM (9)
Jun 08, 12-1 AM (9)
Jun 08, 1-2 AM (5)
Jun 08, 2-3 AM (3)
Jun 08, 3-4 AM (4)
Jun 08, 4-5 AM (2)
Jun 08, 5-6 AM (9)
Jun 08, 6-7 AM (5)
Jun 08, 7-8 AM (25)
Jun 08, 8-9 AM (36)
Jun 08, 9-10 AM (41)
Jun 08, 10-11 AM (24)
Jun 08, 11-12 PM (22)
Jun 08, 12-1 PM (40)
Jun 08, 1-2 PM (48)
Jun 08, 2-3 PM (33)
Jun 08, 3-4 PM (27)
Jun 08, 4-5 PM (12)
Jun 08, 5-6 PM (23)
Jun 08, 6-7 PM (14)
Jun 08, 7-8 PM (3)
Jun 08, 8-9 PM (6)
Jun 08, 9-10 PM (19)
Jun 08, 10-11 PM (29)
Jun 08, 11-12 AM (8)
Jun 09, 12-1 AM (5)
Jun 09, 1-2 AM (3)
Jun 09, 2-3 AM (1)
Jun 09, 3-4 AM (3)
Jun 09, 4-5 AM (26)
Jun 09, 5-6 AM (5)
Jun 09, 6-7 AM (23)
Jun 09, 7-8 AM (51)
Jun 09, 8-9 AM (35)
Jun 09, 9-10 AM (45)
Jun 09, 10-11 AM (51)
Jun 09, 11-12 PM (46)
Jun 09, 12-1 PM (86)
Jun 09, 1-2 PM (84)
Jun 09, 2-3 PM (36)
Jun 09, 3-4 PM (38)
Jun 09, 4-5 PM (16)
Jun 09, 5-6 PM (18)
Jun 09, 6-7 PM (18)
Jun 09, 7-8 PM (19)
Jun 09, 8-9 PM (16)
Jun 09, 9-10 PM (16)
Jun 09, 10-11 PM (28)
Jun 09, 11-12 AM (10)
Jun 10, 12-1 AM (11)
Jun 10, 1-2 AM (16)
Jun 10, 2-3 AM (11)
Jun 10, 3-4 AM (19)
Jun 10, 4-5 AM (5)
Jun 10, 5-6 AM (2)
Jun 10, 6-7 AM (46)
Jun 10, 7-8 AM (82)
Jun 10, 8-9 AM (18)
Jun 10, 9-10 AM (59)
Jun 10, 10-11 AM (46)
Jun 10, 11-12 PM (134)
Jun 10, 12-1 PM (49)
Jun 10, 1-2 PM (33)
Jun 10, 2-3 PM (32)
Jun 10, 3-4 PM (28)
Jun 10, 4-5 PM (36)
Jun 10, 5-6 PM (12)
Jun 10, 6-7 PM (12)
Jun 10, 7-8 PM (38)
Jun 10, 8-9 PM (11)
Jun 10, 9-10 PM (9)
Jun 10, 10-11 PM (20)
Jun 10, 11-12 AM (7)
Jun 11, 12-1 AM (10)
Jun 11, 1-2 AM (2)
Jun 11, 2-3 AM (0)
Jun 11, 3-4 AM (2)
Jun 11, 4-5 AM (8)
Jun 11, 5-6 AM (12)
Jun 11, 6-7 AM (34)
Jun 11, 7-8 AM (106)
Jun 11, 8-9 AM (36)
Jun 11, 9-10 AM (20)
Jun 11, 10-11 AM (105)
Jun 11, 11-12 PM (25)
Jun 11, 12-1 PM (38)
Jun 11, 1-2 PM (37)
Jun 11, 2-3 PM (14)
Jun 11, 3-4 PM (20)
Jun 11, 4-5 PM (5)
Jun 11, 5-6 PM (7)
Jun 11, 6-7 PM (26)
Jun 11, 7-8 PM (90)
Jun 11, 8-9 PM (11)
Jun 11, 9-10 PM (5)
Jun 11, 10-11 PM (25)
Jun 11, 11-12 AM (5)
Jun 12, 12-1 AM (8)
Jun 12, 1-2 AM (2)
Jun 12, 2-3 AM (2)
Jun 12, 3-4 AM (4)
Jun 12, 4-5 AM (7)
Jun 12, 5-6 AM (15)
Jun 12, 6-7 AM (46)
Jun 12, 7-8 AM (19)
Jun 12, 8-9 AM (28)
Jun 12, 9-10 AM (22)
Jun 12, 10-11 AM (29)
Jun 12, 11-12 PM (42)
Jun 12, 12-1 PM (24)
Jun 12, 1-2 PM (26)
Jun 12, 2-3 PM (22)
Jun 12, 3-4 PM (38)
Jun 12, 4-5 PM (23)
Jun 12, 5-6 PM (19)
Jun 12, 6-7 PM (26)
Jun 12, 7-8 PM (12)
Jun 12, 8-9 PM (17)
Jun 12, 9-10 PM (5)
Jun 12, 10-11 PM (30)
Jun 12, 11-12 AM (3)
Jun 13, 12-1 AM (0)
3,226 commits this week Jun 06, 2026 - Jun 13, 2026
ci: migrate e2e tests from EKS/Kubernetes to GitHub runners
Replaces the EKS-backed e2e workflow with one that runs entirely on
github-hosted runners. Each leg runs the release image via `docker run` +
`timeout` and gates on the process exit code; the new WorkStats filter gives
each test a finalization policy so oura self-terminates after N blocks
(exit 0), the Assert sink panics on a bad block (non-zero), and `timeout`
guards a hang (124).

- delete the `prepare` job (EKS kubeconfig / namespace / IRSA service account)
- extract each config from its k8s ConfigMap into .github/e2e/configs/*.toml,
  rewritten for the oura v2 schema (peers/socket_path, top-level
  chain/intersect, LegacyV1 filter for the Assert sink, SplitBlock+ParseCbor
  for cloud sinks, RollbackBuffer for min_depth, WorkStats for finalization)
- AWS creds via aws-actions/configure-aws-credentials (assuming the
  OuraE2ETest role) injected into the container instead of EKS IRSA
- n2c uses a Demeter dmtrcli socket port-forward (placeholder; DMTR_API_KEY
  secret) and is continue-on-error until that path is finalized

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
fix: install default rustls CryptoProvider for the u5c TLS path
The U5C source connects over TLS via tonic/rustls. In builds that pull more
than one rustls crypto provider (e.g. the `aws` feature brings in aws-lc-rs
alongside ring), rustls has no process-default provider and panics on the
first TLS handshake (`no process-level CryptoProvider available`). Install the
ring provider once at startup, gated on the `u5c` feature.

This only surfaced now because nothing exercised U5C in a multi-provider build;
the manual u5c tests built `--features u5c` alone (single provider).

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
ci(e2e): add u5c (utxorpc) legs for mainnet/preprod/preview
Move the manual u5c checks into the e2e suite as three `kind: u5c` legs
against the Demeter utxorpc endpoints, using the standard exit-code gate via
a WorkStats finalization policy (3 blocks -> exit 0); a #921-style regression
(reset loop, no apply events) never finalizes -> timeout -> fail.

API keys are parameterized as ${DMTR_UTXORPC_KEY_*} and resolved by envsubst
from GitHub secrets.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
feat: bump gasket to 0.10 and derive exit code from finalization
Bumps gasket 0.7 -> 0.10, which brings the non-panicking teardown and the new
`TetherState::Finished(StagePhase)` (PR construkts/gasket-rs#35). Adapt to the
0.10 API:

- `Daemon(tethers)` -> `Daemon::new(tethers)`.
- `block`/`teardown` now consume `Daemon`. `dump`/`watch` just call `block`
  (which tears down on stop). `run_daemon` shares the daemon via `Arc` with the
  prometheus + tui tasks, so it drives the stop loop over `&self` and reclaims
  ownership (after the aborted tasks drop their clones) for a graceful teardown.
- `console` handles the new `Finished` tether state.

Crucially, in 0.10 a crashing stage no longer aborts the process (gasket
isolates it per-thread), so `run_daemon` now derives the exit code from the
stages' terminal state: a stage that reached `Ended` (a finalization filter
completed) or a user termination signal -> exit 0; otherwise a stage crashed or
stalled -> non-zero. This is what makes the e2e exit-code gate meaningful: a
WorkStats finalize exits 0, an Assert panic exits non-zero.

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