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 (26)
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 (69)
Apr 23, 2-3 PM (74)
Apr 23, 3-4 PM (26)
Apr 23, 4-5 PM (22)
Apr 23, 5-6 PM (7)
Apr 23, 6-7 PM (7)
Apr 23, 7-8 PM (11)
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 (13)
Apr 24, 6-7 AM (12)
Apr 24, 7-8 AM (33)
Apr 24, 8-9 AM (40)
Apr 24, 9-10 AM (41)
Apr 24, 10-11 AM (72)
Apr 24, 11-12 PM (57)
Apr 24, 12-1 PM (100)
Apr 24, 1-2 PM (57)
Apr 24, 2-3 PM (35)
Apr 24, 3-4 PM (19)
Apr 24, 4-5 PM (16)
Apr 24, 5-6 PM (38)
Apr 24, 6-7 PM (27)
Apr 24, 7-8 PM (12)
Apr 24, 8-9 PM (42)
Apr 24, 9-10 PM (17)
Apr 24, 10-11 PM (30)
Apr 24, 11-12 AM (16)
Apr 25, 12-1 AM (8)
Apr 25, 1-2 AM (1)
Apr 25, 2-3 AM (10)
Apr 25, 3-4 AM (5)
Apr 25, 4-5 AM (3)
Apr 25, 5-6 AM (13)
Apr 25, 6-7 AM (1)
Apr 25, 7-8 AM (4)
Apr 25, 8-9 AM (24)
Apr 25, 9-10 AM (17)
Apr 25, 10-11 AM (4)
Apr 25, 11-12 PM (4)
Apr 25, 12-1 PM (13)
Apr 25, 1-2 PM (3)
Apr 25, 2-3 PM (10)
Apr 25, 3-4 PM (6)
Apr 25, 4-5 PM (10)
Apr 25, 5-6 PM (16)
Apr 25, 6-7 PM (13)
Apr 25, 7-8 PM (30)
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 (15)
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 (53)
Apr 28, 2-3 PM (68)
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 (8)
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 (70)
Apr 29, 9-10 AM (49)
Apr 29, 10-11 AM (25)
Apr 29, 11-12 PM (50)
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 (33)
Apr 29, 5-6 PM (7)
3,751 commits this week Apr 22, 2026 - Apr 29, 2026
chore(nix): fix nixpkgs-25.11 eval failures on Darwin and Windows
- Remove darwin.apple_sdk.frameworks.{CoreServices,AppKit} and
  darwin.libobjc from buildInputs in any-darwin.nix and devshells.nix;
  darwin.apple_sdk (aliased to apple_sdk_11_0) was removed as a legacy
  compatibility stub — the default Darwin stdenv SDK provides all
  frameworks automatically
- Update ghc8107 → ghc810 in installers/default.nix; ghc8107 was
  removed from nixpkgs-25.11 (closest available: ghc810)
feat(tests): add Python test framework with full schema coverage (#987)
* chore: update script for new release

* chore: bump node/dbsync/mithril

* chore: config files for node/dbsync

* feat(tests): add Python test framework with full schema coverage

Adds a Rosetta-inspired, read-only test suite at tests/ for any GraphQL
implementation of the cardano-graphql schema. Six phases shipped in one go:

  Phase 1 — sanity, golden functional, negative tests
  Phase 2 — Locust load harness + p95<500ms / err<1% baseline gate
  Phase 3 — multi-instance comparison (skipped without --compare-url)
  Phase 4 — regression goldens seeded from cardano-foundation issues
            (#951, #953, #978/#980, #979)
  Phase 5 — schema introspection diff against committed snapshot
  Phase 6 — CI workflows: PR gate, nightly, weekly

Coverage:
  * 52 / 52 top-level Query roots (100%)
  * 428 / 440 data-type fields (97.3%) across 61/61 types touched
  * 59 mainnet goldens captured at anchor block 13228000
  * 8 preprod goldens scaffolded (auto-skip on mainnet runs)
  * 8 negative tests, 7 schema tests (1 integration + 6 offline unit)

Determinism:
  * All goldens pinned to anchor_block 13228000 in config/networks.yaml
  * Address buckets: light / medium / heavy with separate goldens + perf tasks
  * --update-golden record-then-review lifecycle; forbidden when CI=true
  * Volatile fields masked via dot.notation[*] ignore_paths DSL

Tooling:
  * uv-managed, Python 3.12+
  * generate_report.py: self-contained HTML report with coverage panel,
    per-test timing table, and query corpus appendix
  * utils/coverage.py: graphql-core-based coverage report (top-level + field)
  * utils/markers.py: lists 52 auto-applied root markers + cip26/cip68
  * Dynamic markers — pytest -m assets / -m cip26 / -m cip68 / -m <root>
    target only goldens whose query touches that root, computed at collection

Reusable patterns lifted from cardano-rosetta-java/tests/data-endpoints:
  * pytest_runtest_makereport Allure attachment hook
  * Recording GraphQL client proxy
  * YAML network test data layout
  * Deep-diff with path-based ignores

Documentation:
  * tests/README.md            — top-level reference
  * tests/QUICKSTART.md         — install + run in 5 minutes
  * tests/TESTING_GUIDE.md      — skim-friendly reference for all test types
  * tests/CONTRIBUTING.md       — how to add tests, refresh anchor, debug
  * tests/{performance,multi_instance,schema,negative}/README.md
  * tests/queries/{coverage,regression}/README.md
  * .claude/skills/test-cardano-graphql.md — natural-language Claude skill

CI:
  * .github/workflows/graphql_tests.yml — PR gate (markers=pr), nightly (full
    functional + negative + schema), weekly (adds perf smoke + baseline gate),
    workflow_dispatch with optional URL override and run_perf toggle.
  * Every job exports CI=true to block --update-golden / --update-schema.

---------

Co-authored-by: VladislavKudrin <[email protected]>
Implement pure weighted Fait-Accompli logic
This commit implements the deterministic core of the weighted
Fait-Accompli algorithm using a precomputed extended stake distribution,
shareable across multiple voting committees running on the same epoch.

The implementation includes a tiebreaker mechanism to allow altering the
order of pools with the same stake when the threshold index between
persistent and non-persistent voters would land between them. This can
later be instantiated to allow for a fair split across epochs.

Co-authored-by: Nicolas BACQUEY <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Agustin Mista <[email protected]>
Tweak voting committee crypto interface for aggregatable types
This commit tweaks the generic voting committee interface around
aggregatable types to better acommodate the fact that cryptographic
aggregation of signatures can fail (in very rare cases). Previously, we
had encapsulated this problem by collecting keys and signatures and
aggregating them at verification time. The new interface is more
faithful and accounts for the new failure mode in a more honest way.

In addition, it renames the 'CryptoSupportsAggregateVRF' class into
'CryptoSupportsBatchVRFVerification', since the new interface
constraints the inputs to /not/ be aggregated at (batch) verification
time, so that implementations that require binding keys to VRF outputs
can do so more directly and explicitly.

Finally, it removes the trivial aggregation helpers introduced in Peras
22, as concrete implementations of the new aggregation interface will
not benefit much from having them, so there's no need to maintain unused
code for which we have no plans to use in the long term either.

Co-authored-by: Nicolas BACQUEY <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Agustin Mista <[email protected]>
Add property tests for WFALS implementation
This commit implements property tests for the real WFALS
implementation asserting that:

* votes cast by eligible voters are successfully verifiable under the
  same voting committee,
* fake (illegal) votes are successfully rejected, and
* certificates forged by multiple votes can be verifiable under the same
  voting committe

Co-authored-by: Nicolas BACQUEY <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Agustin Mista <[email protected]>
Add property tests for EveryoneVotes implementation
This commit implements property tests for the EveryoneVotes
implementation asserting that:

* votes cast by eligible voters are successfully verifiable under the
  same voting committee,
* fake (illegal) votes are successfully rejected, and
* certificates forged by multiple votes can be verifiable under the same
  voting committe

Co-authored-by: Nicolas BACQUEY <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Agustin Mista <[email protected]>
Implement BLS-based crypto helpers to instantiate voting committes
This commit implements BLS-based crypto helpers to simplify the
implementation of crypto schemes used for voting committees. It includes
both single and aggregate signature and VRF signing and verification, as
well as swap-attack-resistant aggregate VRF verification via
linearization.

Co-authored-by: Nicolas BACQUEY <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Agustin Mista <[email protected]>
Define PerasCrypto and wire up voting committee instance using BLS
This commit defines a concrete PerasCrypto scheme using BLS signatures
to instantiate all the voting committee superclasses needed by the WFALS
and EveryoneVotes voting committee implementations.

Note that these instances are heavily inspired by the ones defined for
TestCrypto in the generic voting committee test-suite, albeit with
slightly different types and more documentation.

Co-authored-by: Agustin Mista <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Nicolas BACQUEY <[email protected]>
Add conversions between Peras votes/certs and voting committee types
This commit implements conversion routines between the brand-new
(concrete) Peras votes and certificates and their corresponding
(abstract) voting committee counterparts.

This is done by introducing a `VotingCommitteeSupportsPeras` type class
to allow us to easily change the underlying voting committee
implementation via a proxy type.

Co-authored-by: Agustin Mista <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Nicolas BACQUEY <[email protected]>
Add conversion roundtrip tests between Peras votes/certs and voting committee types
This commit adds conversion rountrip tests between concrete Peras votes
and certificates and their corresponding (abstract) counterparts in the
WFALS and EveryoneVotes voting committee implementations.

Notably, the roundtrip properties allow testing both total (WFALS) and partial
(EveryoneVotes) conversions, generating both good and bad cases and
contrasting them against their expected rountrip outcome.

Co-authored-by: Agustin Mista <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Nicolas BACQUEY <[email protected]>
Implement local sortition for non-persistent seats
This commit implements the local sortition fallback scheme needed by
wFA^LS to allocate non-persistent voters. Each non-persistent voter
provides a VRF output that gets normalized and compared against the
output of a numerically-stable stake-weighted Poisson distribution.

Co-authored-by: Nicolas BACQUEY <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Agustin Mista <[email protected]>
Tweak existing WFALS model and conformance tests
This commit reorganizes the existing model and conformance test
infrastructure for WFALS in anticipation to the the tests for the real
implementation implemented in the next commit.

Co-authored-by: Nicolas BACQUEY <[email protected]>
Co-authored-by: Thomas BAGREL <[email protected]>
Co-authored-by: Agustin Mista <[email protected]>