May 21, 4-5 PM (20)
May 21, 5-6 PM (27)
May 21, 6-7 PM (27)
May 21, 7-8 PM (27)
May 21, 8-9 PM (23)
May 21, 9-10 PM (3)
May 21, 10-11 PM (29)
May 21, 11-12 AM (10)
May 22, 12-1 AM (16)
May 22, 1-2 AM (6)
May 22, 2-3 AM (8)
May 22, 3-4 AM (4)
May 22, 4-5 AM (11)
May 22, 5-6 AM (10)
May 22, 6-7 AM (21)
May 22, 7-8 AM (13)
May 22, 8-9 AM (38)
May 22, 9-10 AM (12)
May 22, 10-11 AM (18)
May 22, 11-12 PM (25)
May 22, 12-1 PM (24)
May 22, 1-2 PM (34)
May 22, 2-3 PM (56)
May 22, 3-4 PM (13)
May 22, 4-5 PM (29)
May 22, 5-6 PM (13)
May 22, 6-7 PM (20)
May 22, 7-8 PM (20)
May 22, 8-9 PM (12)
May 22, 9-10 PM (12)
May 22, 10-11 PM (41)
May 22, 11-12 AM (12)
May 23, 12-1 AM (9)
May 23, 1-2 AM (0)
May 23, 2-3 AM (3)
May 23, 3-4 AM (1)
May 23, 4-5 AM (1)
May 23, 5-6 AM (4)
May 23, 6-7 AM (12)
May 23, 7-8 AM (1)
May 23, 8-9 AM (3)
May 23, 9-10 AM (1)
May 23, 10-11 AM (1)
May 23, 11-12 PM (5)
May 23, 12-1 PM (1)
May 23, 1-2 PM (6)
May 23, 2-3 PM (5)
May 23, 3-4 PM (5)
May 23, 4-5 PM (4)
May 23, 5-6 PM (0)
May 23, 6-7 PM (3)
May 23, 7-8 PM (23)
May 23, 8-9 PM (1)
May 23, 9-10 PM (9)
May 23, 10-11 PM (21)
May 23, 11-12 AM (27)
May 24, 12-1 AM (9)
May 24, 1-2 AM (0)
May 24, 2-3 AM (1)
May 24, 3-4 AM (1)
May 24, 4-5 AM (0)
May 24, 5-6 AM (3)
May 24, 6-7 AM (1)
May 24, 7-8 AM (2)
May 24, 8-9 AM (2)
May 24, 9-10 AM (4)
May 24, 10-11 AM (4)
May 24, 11-12 PM (1)
May 24, 12-1 PM (7)
May 24, 1-2 PM (46)
May 24, 2-3 PM (5)
May 24, 3-4 PM (3)
May 24, 4-5 PM (18)
May 24, 5-6 PM (2)
May 24, 6-7 PM (4)
May 24, 7-8 PM (13)
May 24, 8-9 PM (10)
May 24, 9-10 PM (15)
May 24, 10-11 PM (34)
May 24, 11-12 AM (42)
May 25, 12-1 AM (9)
May 25, 1-2 AM (5)
May 25, 2-3 AM (6)
May 25, 3-4 AM (1)
May 25, 4-5 AM (6)
May 25, 5-6 AM (14)
May 25, 6-7 AM (17)
May 25, 7-8 AM (17)
May 25, 8-9 AM (32)
May 25, 9-10 AM (43)
May 25, 10-11 AM (64)
May 25, 11-12 PM (33)
May 25, 12-1 PM (43)
May 25, 1-2 PM (40)
May 25, 2-3 PM (20)
May 25, 3-4 PM (27)
May 25, 4-5 PM (16)
May 25, 5-6 PM (6)
May 25, 6-7 PM (7)
May 25, 7-8 PM (11)
May 25, 8-9 PM (12)
May 25, 9-10 PM (16)
May 25, 10-11 PM (44)
May 25, 11-12 AM (26)
May 26, 12-1 AM (12)
May 26, 1-2 AM (11)
May 26, 2-3 AM (8)
May 26, 3-4 AM (11)
May 26, 4-5 AM (6)
May 26, 5-6 AM (9)
May 26, 6-7 AM (26)
May 26, 7-8 AM (43)
May 26, 8-9 AM (39)
May 26, 9-10 AM (42)
May 26, 10-11 AM (45)
May 26, 11-12 PM (59)
May 26, 12-1 PM (34)
May 26, 1-2 PM (50)
May 26, 2-3 PM (50)
May 26, 3-4 PM (18)
May 26, 4-5 PM (20)
May 26, 5-6 PM (13)
May 26, 6-7 PM (20)
May 26, 7-8 PM (12)
May 26, 8-9 PM (15)
May 26, 9-10 PM (15)
May 26, 10-11 PM (35)
May 26, 11-12 AM (30)
May 27, 12-1 AM (16)
May 27, 1-2 AM (8)
May 27, 2-3 AM (9)
May 27, 3-4 AM (5)
May 27, 4-5 AM (32)
May 27, 5-6 AM (9)
May 27, 6-7 AM (49)
May 27, 7-8 AM (63)
May 27, 8-9 AM (37)
May 27, 9-10 AM (74)
May 27, 10-11 AM (83)
May 27, 11-12 PM (30)
May 27, 12-1 PM (50)
May 27, 1-2 PM (38)
May 27, 2-3 PM (53)
May 27, 3-4 PM (37)
May 27, 4-5 PM (6)
May 27, 5-6 PM (17)
May 27, 6-7 PM (18)
May 27, 7-8 PM (25)
May 27, 8-9 PM (14)
May 27, 9-10 PM (13)
May 27, 10-11 PM (29)
May 27, 11-12 AM (27)
May 28, 12-1 AM (9)
May 28, 1-2 AM (3)
May 28, 2-3 AM (5)
May 28, 3-4 AM (2)
May 28, 4-5 AM (8)
May 28, 5-6 AM (34)
May 28, 6-7 AM (26)
May 28, 7-8 AM (83)
May 28, 8-9 AM (33)
May 28, 9-10 AM (54)
May 28, 10-11 AM (50)
May 28, 11-12 PM (19)
May 28, 12-1 PM (45)
May 28, 1-2 PM (50)
May 28, 2-3 PM (23)
May 28, 3-4 PM (41)
May 28, 4-5 PM (18)
3,374 commits this week May 21, 2026 - May 28, 2026
chore(deps): bump openssl from 0.10.72 to 0.10.80
Bumps [openssl](https://github.com/rust-openssl/rust-openssl) from 0.10.72 to 0.10.80.
- [Release notes](https://github.com/rust-openssl/rust-openssl/releases)
- [Commits](https://github.com/rust-openssl/rust-openssl/compare/openssl-v0.10.72...openssl-v0.10.80)

---
updated-dependencies:
- dependency-name: openssl
  dependency-version: 0.10.80
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <[email protected]>
Switch to tasty for tests (#2620)
Wait for #2324 to merge.

This makes a couple of changes to the tests:

1. Switch from hspec to tasty. Why? Few reasons, but 1 is I want to try
[tasty-cache](https://github.com/silky/tasty-cache);
2. We get some nice formatted test output in the PRs now:
<img width="870" height="1031" alt="image"
src="https://github.com/user-attachments/assets/0c660f0e-7103-4d78-a2cd-e1b3c2e0f5a6"
/>
3. Some more tests are ran in parallel
pre-push: restrict hook to lint and treefmt checks
The dynamic discovery via builtins.attrNames config.checks bakes all
check names into the script at eval time.  When downstream repos
consume the pre-push package from cardano-parts' output, the baked
names include perSystem-only checks (e.g. cardano-committee-monitor-
fixture) that don't exist in the consumer's flake, causing the hook
to fail.

Hardcode the two checks the hook should always run — lint and treefmt —
so the fixture check remains a CI/flake-check concern only.
tmpl: add committee-monitor alerts and README section
Adds the centrally-rendered alert rules that consume the cardano_cc_*
series published by profile-cardano-committee-monitor, plus a README
section covering enablement, prerequisites, threshold tuning, and the
collector-cadence/staleness coupling.

Alert rules (auto-discovered via parseDir on grafana/alerts):
  - cardano_cc_term_expiring (warning, 30d default)
  - cardano_cc_term_expiring_urgent (page, 7d default)
  - cardano_cc_hot_key_unauthorized / _resigned (page)
  - cardano_cc_member_expired (page)
  - cardano_cc_member_unrecognized (page)
  - cardano_cc_to_be_expired_next_epoch (page, authoritative ledger signal)
  - cardano_cc_no_members (page)
  - cardano_cc_metrics_stale (page, 5400s, paired with hourly cadence)
  - cardano_cc_collector_absent (page)

warnDays / pageDays are constants in the alert file (per-environment
tuning via duplicated rules with environment=~"..." selectors). The
file is part of the project template, so downstream repos own it after
template init.
nixosModule committee-monitor: add constitutional-committee state metrics collector
New profile profile-cardano-committee-monitor publishes per-member
constitutional-committee state to a prometheus textfile-collector .prom
file on an hourly systemd timer. The alloy node-exporter picks the file
up via the textfileCollectorDirectory wiring added in the previous
commit.

Metrics (all carry environment=<env>):
  - cardano_cc_member_epochs_until_expiration  (per cold_credential)
  - cardano_cc_member_seconds_until_expiration (per cold_credential)
  - cardano_cc_member_hot_cred_status          (info-gauge with status label)
  - cardano_cc_member_state                    (info-gauge with state label)
  - cardano_cc_member_next_epoch_change        (info-gauge with change label)
  - cardano_cc_current_epoch
  - cardano_cc_member_count
  - cardano_cc_seconds_per_epoch

The collector script lives in flakeModules/lib/ as a callPackage-able
writeShellApplication so the production unit and the fixture check share
the exact same text; the check swaps cardano-cli for a JSON-fixture shim
and diffs the output against a golden .prom file.

Module asserts on services.alloy.textfileCollectorDirectory != null and
services.cardano-node.shareNodeSocket = true. The cardano-node socket is
read via a SupplementaryGroups=[cardano-node node-textfile] hardened
DynamicUser=true oneshot; output is atomically published via mv on the
same filesystem. Cadence is hourly + RandomizedDelaySec=600s; the
matching staleness threshold lives in the alerts file added in the next
commit.

Wires in via flake-parts auto-discovery (recursiveImports); no
flake.nix or flakeModules/lib.nix changes needed.
nixosModule alloy: add textfile-collector and extra keep-regex options
Adds two opt-in options consumed by sibling profiles that publish metrics via prometheus textfile collector.

services.alloy.textfileCollectorDirectory (nullOr str, default null):
  - When non-null: enables the node-exporter "textfile" collector,
    emits the textfile { directory = ... } HCL block, creates a
    node-textfile group, and tmpfiles-rules the directory mode 2775
    (setgid so multiple publishers can share it).
  - When null: behaviour is identical to before.

services.alloy.extraPrometheusRelabelNodeKeepRegex (listOf str, default []):
  - Additional alternation arms appended to prometheusRelabelNodeKeepRegex.
    Lets sibling profiles whitelist their textfile metric series without
    a recursive mkForce on the base option.

Also extends the base prometheusRelabelNodeKeepRegex default with
node_textfile_(mtime_seconds|scrape_error) so textfile-collector
self-metrics are scrapeable (un-breaks NodeTextFileCollectorScrapeError
in templates/.../alerts/node-exporter.nix-import and enables a future
metrics-stale alert keyed on node_textfile_mtime_seconds).