Home / Pragma / amaru
Aug 09, 10-11 AM (4)
Aug 09, 11-12 PM (2)
Aug 09, 12-1 PM (0)
Aug 09, 1-2 PM (0)
Aug 09, 2-3 PM (0)
Aug 09, 3-4 PM (2)
Aug 09, 4-5 PM (0)
Aug 09, 5-6 PM (1)
Aug 09, 6-7 PM (0)
Aug 09, 7-8 PM (1)
Aug 09, 8-9 PM (1)
Aug 09, 9-10 PM (0)
Aug 09, 10-11 PM (0)
Aug 09, 11-12 AM (0)
Aug 10, 12-1 AM (0)
Aug 10, 1-2 AM (0)
Aug 10, 2-3 AM (0)
Aug 10, 3-4 AM (0)
Aug 10, 4-5 AM (0)
Aug 10, 5-6 AM (0)
Aug 10, 6-7 AM (0)
Aug 10, 7-8 AM (0)
Aug 10, 8-9 AM (0)
Aug 10, 9-10 AM (0)
Aug 10, 10-11 AM (0)
Aug 10, 11-12 PM (0)
Aug 10, 12-1 PM (0)
Aug 10, 1-2 PM (0)
Aug 10, 2-3 PM (0)
Aug 10, 3-4 PM (0)
Aug 10, 4-5 PM (0)
Aug 10, 5-6 PM (0)
Aug 10, 6-7 PM (0)
Aug 10, 7-8 PM (0)
Aug 10, 8-9 PM (0)
Aug 10, 9-10 PM (0)
Aug 10, 10-11 PM (0)
Aug 10, 11-12 AM (0)
Aug 11, 12-1 AM (0)
Aug 11, 1-2 AM (0)
Aug 11, 2-3 AM (0)
Aug 11, 3-4 AM (0)
Aug 11, 4-5 AM (0)
Aug 11, 5-6 AM (2)
Aug 11, 6-7 AM (1)
Aug 11, 7-8 AM (1)
Aug 11, 8-9 AM (8)
Aug 11, 9-10 AM (3)
Aug 11, 10-11 AM (0)
Aug 11, 11-12 PM (2)
Aug 11, 12-1 PM (0)
Aug 11, 1-2 PM (1)
Aug 11, 2-3 PM (0)
Aug 11, 3-4 PM (0)
Aug 11, 4-5 PM (3)
Aug 11, 5-6 PM (1)
Aug 11, 6-7 PM (1)
Aug 11, 7-8 PM (5)
Aug 11, 8-9 PM (0)
Aug 11, 9-10 PM (0)
Aug 11, 10-11 PM (0)
Aug 11, 11-12 AM (0)
Aug 12, 12-1 AM (0)
Aug 12, 1-2 AM (0)
Aug 12, 2-3 AM (0)
Aug 12, 3-4 AM (0)
Aug 12, 4-5 AM (6)
Aug 12, 5-6 AM (2)
Aug 12, 6-7 AM (4)
Aug 12, 7-8 AM (0)
Aug 12, 8-9 AM (1)
Aug 12, 9-10 AM (2)
Aug 12, 10-11 AM (4)
Aug 12, 11-12 PM (2)
Aug 12, 12-1 PM (0)
Aug 12, 1-2 PM (0)
Aug 12, 2-3 PM (2)
Aug 12, 3-4 PM (1)
Aug 12, 4-5 PM (2)
Aug 12, 5-6 PM (7)
Aug 12, 6-7 PM (0)
Aug 12, 7-8 PM (0)
Aug 12, 8-9 PM (0)
Aug 12, 9-10 PM (0)
Aug 12, 10-11 PM (1)
Aug 12, 11-12 AM (2)
Aug 13, 12-1 AM (1)
Aug 13, 1-2 AM (0)
Aug 13, 2-3 AM (0)
Aug 13, 3-4 AM (0)
Aug 13, 4-5 AM (0)
Aug 13, 5-6 AM (0)
Aug 13, 6-7 AM (0)
Aug 13, 7-8 AM (0)
Aug 13, 8-9 AM (0)
Aug 13, 9-10 AM (1)
Aug 13, 10-11 AM (0)
Aug 13, 11-12 PM (0)
Aug 13, 12-1 PM (0)
Aug 13, 1-2 PM (1)
Aug 13, 2-3 PM (3)
Aug 13, 3-4 PM (1)
Aug 13, 4-5 PM (1)
Aug 13, 5-6 PM (0)
Aug 13, 6-7 PM (0)
Aug 13, 7-8 PM (0)
Aug 13, 8-9 PM (0)
Aug 13, 9-10 PM (0)
Aug 13, 10-11 PM (0)
Aug 13, 11-12 AM (0)
Aug 14, 12-1 AM (0)
Aug 14, 1-2 AM (0)
Aug 14, 2-3 AM (0)
Aug 14, 3-4 AM (0)
Aug 14, 4-5 AM (2)
Aug 14, 5-6 AM (0)
Aug 14, 6-7 AM (0)
Aug 14, 7-8 AM (3)
Aug 14, 8-9 AM (0)
Aug 14, 9-10 AM (0)
Aug 14, 10-11 AM (1)
Aug 14, 11-12 PM (12)
Aug 14, 12-1 PM (1)
Aug 14, 1-2 PM (2)
Aug 14, 2-3 PM (0)
Aug 14, 3-4 PM (1)
Aug 14, 4-5 PM (1)
Aug 14, 5-6 PM (0)
Aug 14, 6-7 PM (0)
Aug 14, 7-8 PM (0)
Aug 14, 8-9 PM (0)
Aug 14, 9-10 PM (0)
Aug 14, 10-11 PM (0)
Aug 14, 11-12 AM (0)
Aug 15, 12-1 AM (0)
Aug 15, 1-2 AM (0)
Aug 15, 2-3 AM (0)
Aug 15, 3-4 AM (0)
Aug 15, 4-5 AM (0)
Aug 15, 5-6 AM (0)
Aug 15, 6-7 AM (2)
Aug 15, 7-8 AM (2)
Aug 15, 8-9 AM (0)
Aug 15, 9-10 AM (0)
Aug 15, 10-11 AM (0)
Aug 15, 11-12 PM (0)
Aug 15, 12-1 PM (1)
Aug 15, 1-2 PM (0)
Aug 15, 2-3 PM (29)
Aug 15, 3-4 PM (0)
Aug 15, 4-5 PM (1)
Aug 15, 5-6 PM (0)
Aug 15, 6-7 PM (0)
Aug 15, 7-8 PM (0)
Aug 15, 8-9 PM (1)
Aug 15, 9-10 PM (1)
Aug 15, 10-11 PM (0)
Aug 15, 11-12 AM (0)
Aug 16, 12-1 AM (0)
Aug 16, 1-2 AM (0)
Aug 16, 2-3 AM (0)
Aug 16, 3-4 AM (0)
Aug 16, 4-5 AM (0)
Aug 16, 5-6 AM (0)
Aug 16, 6-7 AM (0)
Aug 16, 7-8 AM (0)
Aug 16, 8-9 AM (1)
Aug 16, 9-10 AM (0)
Aug 16, 10-11 AM (0)
141 commits this week Aug 09, 2025 - Aug 16, 2025
fix: pass *latest* proposal roots when ratifying, not the one from the snapshot.
  The proposals and therefore, their roots, must be the most recent ones. This is because we need to keep the resulting state free of any orphan proposals resulting from pruning. So if a new proposal was submitted in the epoch that just passed but referenced a proposal that is pruned; it must also get pruned. It is "safe" to have those proposals in the forest as well because, they can't possibly have any votes (they did not exists at the moment the snapshot was taken). So they will only be present in the forest to get discarded when needd.

Signed-off-by: KtorZ <[email protected]>
feat: start working on enacting proposals following ratification.
  The core idea is to stash store updates as we go, while mutating the
  RatificationContext we operate in. The data in the store that we use
  can in fact only be changed following those ratification updates; so
  we need not any kind of re-synchronisation and can apply updates
  directly on top of the snapshot we operate from.

  Because we need to immutability traverse the forest, while also
  occasionally allowing local mutations; we introduce a `Compass`, that
  acts as mutable iterator but without holding any reference on the
  forest (so it needs the forest each time it needs to access the next
  element).

  This allows to traverse the forest while remaining capable of
  borrowing an immutable reference to it on enactment.

  Now, we must also makes sure that the forest is getting properly
  pruned; which involves multiple steps:

  - Any impacted sub-tree must promote the enacted proposal as its new
    root, and prune all its siblings and their children. Those proposals
    are now unreachable / unvotable, and will be cleared from the state.

  - Any of the pruned proposal must be removed from the forest's lookup
    table;

  - The proposal sequence must be amended accordingly;

  - And finally, in case where a:

    - `hard_fork`; or
    - `constitutional_committee`; or
    - `constitution`

    proposal is ratified; then no other proposal can be ratified in the
    same epoch boundary. So any new cursor on the forest will yield
    `None`.

Signed-off-by: KtorZ <[email protected]>
fix: prefix all 'special' top-level store key.
  This prevents clashes between those special keys and any of the columns. I just bumped into a case where the 'proposal-roots' key would show up in the iter_proposals iterator, because it filters based on the 'prop' prefix. So, to fix this one and avoid future issues, it's best to prefix them with a character we do not use in columns' prefixes.

Signed-off-by: KtorZ <[email protected]>