Feb 06, 8-9 PM (13)
Feb 06, 9-10 PM (15)
Feb 06, 10-11 PM (25)
Feb 06, 11-12 AM (29)
Feb 07, 12-1 AM (6)
Feb 07, 1-2 AM (2)
Feb 07, 2-3 AM (5)
Feb 07, 3-4 AM (5)
Feb 07, 4-5 AM (5)
Feb 07, 5-6 AM (7)
Feb 07, 6-7 AM (0)
Feb 07, 7-8 AM (5)
Feb 07, 8-9 AM (7)
Feb 07, 9-10 AM (5)
Feb 07, 10-11 AM (2)
Feb 07, 11-12 PM (1)
Feb 07, 12-1 PM (2)
Feb 07, 1-2 PM (13)
Feb 07, 2-3 PM (16)
Feb 07, 3-4 PM (16)
Feb 07, 4-5 PM (11)
Feb 07, 5-6 PM (9)
Feb 07, 6-7 PM (9)
Feb 07, 7-8 PM (3)
Feb 07, 8-9 PM (3)
Feb 07, 9-10 PM (7)
Feb 07, 10-11 PM (26)
Feb 07, 11-12 AM (25)
Feb 08, 12-1 AM (1)
Feb 08, 1-2 AM (5)
Feb 08, 2-3 AM (7)
Feb 08, 3-4 AM (2)
Feb 08, 4-5 AM (2)
Feb 08, 5-6 AM (3)
Feb 08, 6-7 AM (0)
Feb 08, 7-8 AM (0)
Feb 08, 8-9 AM (9)
Feb 08, 9-10 AM (0)
Feb 08, 10-11 AM (2)
Feb 08, 11-12 PM (2)
Feb 08, 12-1 PM (2)
Feb 08, 1-2 PM (0)
Feb 08, 2-3 PM (3)
Feb 08, 3-4 PM (2)
Feb 08, 4-5 PM (3)
Feb 08, 5-6 PM (9)
Feb 08, 6-7 PM (1)
Feb 08, 7-8 PM (3)
Feb 08, 8-9 PM (4)
Feb 08, 9-10 PM (27)
Feb 08, 10-11 PM (42)
Feb 08, 11-12 AM (19)
Feb 09, 12-1 AM (3)
Feb 09, 1-2 AM (9)
Feb 09, 2-3 AM (4)
Feb 09, 3-4 AM (16)
Feb 09, 4-5 AM (6)
Feb 09, 5-6 AM (6)
Feb 09, 6-7 AM (31)
Feb 09, 7-8 AM (10)
Feb 09, 8-9 AM (70)
Feb 09, 9-10 AM (25)
Feb 09, 10-11 AM (78)
Feb 09, 11-12 PM (73)
Feb 09, 12-1 PM (104)
Feb 09, 1-2 PM (53)
Feb 09, 2-3 PM (60)
Feb 09, 3-4 PM (97)
Feb 09, 4-5 PM (48)
Feb 09, 5-6 PM (24)
Feb 09, 6-7 PM (16)
Feb 09, 7-8 PM (20)
Feb 09, 8-9 PM (48)
Feb 09, 9-10 PM (28)
Feb 09, 10-11 PM (36)
Feb 09, 11-12 AM (34)
Feb 10, 12-1 AM (17)
Feb 10, 1-2 AM (6)
Feb 10, 2-3 AM (8)
Feb 10, 3-4 AM (3)
Feb 10, 4-5 AM (9)
Feb 10, 5-6 AM (10)
Feb 10, 6-7 AM (16)
Feb 10, 7-8 AM (77)
Feb 10, 8-9 AM (58)
Feb 10, 9-10 AM (32)
Feb 10, 10-11 AM (77)
Feb 10, 11-12 PM (100)
Feb 10, 12-1 PM (64)
Feb 10, 1-2 PM (83)
Feb 10, 2-3 PM (50)
Feb 10, 3-4 PM (42)
Feb 10, 4-5 PM (25)
Feb 10, 5-6 PM (18)
Feb 10, 6-7 PM (20)
Feb 10, 7-8 PM (26)
Feb 10, 8-9 PM (16)
Feb 10, 9-10 PM (15)
Feb 10, 10-11 PM (40)
Feb 10, 11-12 AM (19)
Feb 11, 12-1 AM (4)
Feb 11, 1-2 AM (12)
Feb 11, 2-3 AM (4)
Feb 11, 3-4 AM (1)
Feb 11, 4-5 AM (6)
Feb 11, 5-6 AM (5)
Feb 11, 6-7 AM (9)
Feb 11, 7-8 AM (13)
Feb 11, 8-9 AM (132)
Feb 11, 9-10 AM (29)
Feb 11, 10-11 AM (37)
Feb 11, 11-12 PM (55)
Feb 11, 12-1 PM (89)
Feb 11, 1-2 PM (63)
Feb 11, 2-3 PM (54)
Feb 11, 3-4 PM (46)
Feb 11, 4-5 PM (54)
Feb 11, 5-6 PM (20)
Feb 11, 6-7 PM (34)
Feb 11, 7-8 PM (24)
Feb 11, 8-9 PM (41)
Feb 11, 9-10 PM (25)
Feb 11, 10-11 PM (47)
Feb 11, 11-12 AM (31)
Feb 12, 12-1 AM (10)
Feb 12, 1-2 AM (6)
Feb 12, 2-3 AM (12)
Feb 12, 3-4 AM (7)
Feb 12, 4-5 AM (8)
Feb 12, 5-6 AM (32)
Feb 12, 6-7 AM (13)
Feb 12, 7-8 AM (20)
Feb 12, 8-9 AM (22)
Feb 12, 9-10 AM (22)
Feb 12, 10-11 AM (46)
Feb 12, 11-12 PM (28)
Feb 12, 12-1 PM (40)
Feb 12, 1-2 PM (63)
Feb 12, 2-3 PM (80)
Feb 12, 3-4 PM (39)
Feb 12, 4-5 PM (49)
Feb 12, 5-6 PM (82)
Feb 12, 6-7 PM (31)
Feb 12, 7-8 PM (28)
Feb 12, 8-9 PM (20)
Feb 12, 9-10 PM (28)
Feb 12, 10-11 PM (50)
Feb 12, 11-12 AM (29)
Feb 13, 12-1 AM (9)
Feb 13, 1-2 AM (9)
Feb 13, 2-3 AM (14)
Feb 13, 3-4 AM (6)
Feb 13, 4-5 AM (5)
Feb 13, 5-6 AM (29)
Feb 13, 6-7 AM (33)
Feb 13, 7-8 AM (31)
Feb 13, 8-9 AM (39)
Feb 13, 9-10 AM (73)
Feb 13, 10-11 AM (73)
Feb 13, 11-12 PM (43)
Feb 13, 12-1 PM (52)
Feb 13, 1-2 PM (59)
Feb 13, 2-3 PM (48)
Feb 13, 3-4 PM (27)
Feb 13, 4-5 PM (27)
Feb 13, 5-6 PM (26)
Feb 13, 6-7 PM (25)
Feb 13, 7-8 PM (20)
Feb 13, 8-9 PM (1)
4,391 commits this week Feb 06, 2026 - Feb 13, 2026
Use chain hash comparison for properties on parametric `blk`
Some genesis tests still depend on 'TestBlock' specific logic.
Specifically, the `TestHash` (the `HeaderHash TestBlock` type family
instance) stores a number list representation of the path on the
`BlockTree` leading to the corresponding block (i.e. its prefix
`AnchoredFragment`); this is used to implement certain properties.

Here, such properties are refactored to parametric blocks by using direct
hash comparison (in some cases on the `BlockTree` trunk).

https://github.com/tweag/ouroboros-consensus-testing/pull/32/commits/3e838526a5a6d683bf12ac59297c824215c6ee78
holds a test showcasing a property of a previous refactor: namely that
the order of _fork numbers_ in a `TestHash` are not relevant for the
properties that depended on it. This alternative refactor (on
https://github.com/tweag/ouroboros-consensus-testing/pull/32/commits/dab534952a996f32bce1931b92698577c4115e26)
intended to preserve existing code structure, which was confusing, and
as such was changed in the end in search for clarity.
Add `deforestBlockTree`
An important in-progress task is to make more test code
block-polymorphic; right now it is largely hardcoded to use test blocks
but this will not work for running conformance tests against live
implementations of the protocol.

We do not know the exact motivation behind making these tests monomorphic;
regardless it seems the only thing the tests require is the ability to
compute where a block is on the block tree.

Here we add a helper function to make generalize this by constructing a map
from each block hash in the tree to the `AnchoredFragment` from it to the
anchor. That fragment is a prefix of the trunk if and only if the block
is on the trunk.

The deforested block tree is used to check for block membership, and
to prevent its unnecessary regeneration many thousands of times per test,
it is implemented by adding a `DeforestedBlockTree` field to `BlockTree` to
cache it and a smart constructor that populates it correctly at definition time
and makes it possible to deconstruct a block tree into its trunk and branches
without giving access to the cached deforestation.

GHC's pattern match checker [assumes that any case expression involving
a pattern synonym is
incomplete](https://ghc.gitlab.haskell.org/ghc/doc/users_guide/exts/pragmas.html#complete-pragmas);
with either `-Wincomplete-patterns` or `-Wall`, GHC will report usage of
such patterns an incomplete pattern match like this:

```
    Pattern match(es) are non-exhaustive
    In an equation for ‘mkProperty’:
        Patterns of type ‘GenesisTestFull blk’,
                         ‘StateView blk’ not matched:
            (GenesisTest _ _ _ _ (Test.Consensus.BlockTree.RawBlockTree _ _ _)
             _ _ _ _ _ _ _)
            _
```

For this reason we add a `COMPLETE` pragma to let GHC know that `BlockTree` is
in fact a complete set of patterns for deconstructing a block tree.
Generalize test machinery's reliance on `TestBlock`
Here we generalize all uses of unnecessarily-specified `TestBlock`s to
instead be parametric `blk`s. For this we introduce two new type classes.

The `IssueTestBlock` class abstracts the operations needed to produce
blocks during chain generation.

The `HasPointScheduleTestParams` class abstracts the parameters needed to run
the point schedule tests. We invoke `getProtocolInfoArgs` at the beginning of
a test, and use it to construct a `ProtocolInfo`, which in turn provides both a
`TopLevelConfig` and an `ExtLedgerState`. The requirement of `IO` comes
from needing to eventually parse cardano config files.
A key point of entry for this change is found on
`PeerSimulator.Run.nodeLifecycle`, where the `ProtocolInfo` is delivered,
enabling the generalization of the simulation to arbitrary blocks.

We provide instances for `TestBlock`.

Co-authored-by: Nathan Bloomfield <[email protected]>
Co-authored-by: Xavier Góngora <[email protected]>