May 18, 4-5 PM (45)
May 18, 5-6 PM (21)
May 18, 6-7 PM (16)
May 18, 7-8 PM (13)
May 18, 8-9 PM (23)
May 18, 9-10 PM (4)
May 18, 10-11 PM (25)
May 18, 11-12 AM (12)
May 19, 12-1 AM (7)
May 19, 1-2 AM (2)
May 19, 2-3 AM (9)
May 19, 3-4 AM (5)
May 19, 4-5 AM (10)
May 19, 5-6 AM (3)
May 19, 6-7 AM (53)
May 19, 7-8 AM (23)
May 19, 8-9 AM (46)
May 19, 9-10 AM (66)
May 19, 10-11 AM (30)
May 19, 11-12 PM (48)
May 19, 12-1 PM (81)
May 19, 1-2 PM (71)
May 19, 2-3 PM (41)
May 19, 3-4 PM (51)
May 19, 4-5 PM (15)
May 19, 5-6 PM (20)
May 19, 6-7 PM (18)
May 19, 7-8 PM (9)
May 19, 8-9 PM (21)
May 19, 9-10 PM (10)
May 19, 10-11 PM (28)
May 19, 11-12 AM (13)
May 20, 12-1 AM (21)
May 20, 1-2 AM (9)
May 20, 2-3 AM (4)
May 20, 3-4 AM (5)
May 20, 4-5 AM (9)
May 20, 5-6 AM (37)
May 20, 6-7 AM (47)
May 20, 7-8 AM (53)
May 20, 8-9 AM (50)
May 20, 9-10 AM (16)
May 20, 10-11 AM (41)
May 20, 11-12 PM (28)
May 20, 12-1 PM (50)
May 20, 1-2 PM (92)
May 20, 2-3 PM (21)
May 20, 3-4 PM (326)
May 20, 4-5 PM (23)
May 20, 5-6 PM (23)
May 20, 6-7 PM (17)
May 20, 7-8 PM (23)
May 20, 8-9 PM (15)
May 20, 9-10 PM (5)
May 20, 10-11 PM (34)
May 20, 11-12 AM (16)
May 21, 12-1 AM (16)
May 21, 1-2 AM (9)
May 21, 2-3 AM (11)
May 21, 3-4 AM (7)
May 21, 4-5 AM (4)
May 21, 5-6 AM (27)
May 21, 6-7 AM (14)
May 21, 7-8 AM (22)
May 21, 8-9 AM (34)
May 21, 9-10 AM (45)
May 21, 10-11 AM (37)
May 21, 11-12 PM (27)
May 21, 12-1 PM (63)
May 21, 1-2 PM (68)
May 21, 2-3 PM (60)
May 21, 3-4 PM (53)
May 21, 4-5 PM (20)
May 21, 5-6 PM (27)
May 21, 6-7 PM (27)
May 21, 7-8 PM (25)
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 (19)
May 22, 7-8 PM (19)
May 22, 8-9 PM (12)
May 22, 9-10 PM (12)
May 22, 10-11 PM (40)
May 22, 11-12 AM (11)
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 (33)
May 24, 11-12 AM (42)
May 25, 12-1 AM (9)
May 25, 1-2 AM (4)
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 (40)
May 25, 1-2 PM (37)
May 25, 2-3 PM (20)
May 25, 3-4 PM (18)
May 25, 4-5 PM (0)
3,660 commits this week May 18, 2026 - May 25, 2026
build(deps): bump golangci/golangci-lint-action from 9.2.0 to 9.2.1 (#2405)
Bumps [golangci/golangci-lint-action](https://github.com/golangci/golangci-lint-action) from 9.2.0 to 9.2.1.
- [Release notes](https://github.com/golangci/golangci-lint-action/releases)
- [Commits](https://github.com/golangci/golangci-lint-action/compare/1e7e51e771db61008b38414a730f564565cf7c20...82606bf257cbaff209d206a39f5134f0cfbfd2ee)

---
updated-dependencies:
- dependency-name: golangci/golangci-lint-action
  dependency-version: 9.2.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
analysis/sims/2026w22-lazy-voter: NA,0.200 lazy-voter abstention test
End-to-end exercise of the new `consensus-behaviours` wiring against
the same scenario family as 2026w18: NA,0.200 (no Plutus, 0.200
TxMB/s), top-stake-fraction committee (threshold 0.99), seed 0,
1500 slots, 750-node pseudo-mainnet topology.

Two paired runs:

- `baseline-shared-consensus/` — `leios-variant: shared-consensus`
  with `consensus-behaviours: []`.  Acts as the engine-baseline
  reference; tracks the 2026w18 `linear-with-tx-references` numbers
  closely (61 EBs, 10589 vs 10624 votes, 28 vs 27 endorsed L1
  blocks, identical 88-RB Praos chain) so the engine swap is not
  responsible for the abstention deltas.

- `lazy-voter-20pct/` — same config plus
  `consensus-behaviours: [{spec: lazy-voter declined, selection:
  stake-fraction 0.2}]`.  The smallest stake-prefix covering 20% of
  voting weight runs LazyVoter; the rest stay Honest.

Headline deltas (baseline → lazy-voter):
- Total votes:        10589 → 8868      (-16.2%)
- Avg votes / EB:     185.77 → 155.58   (-16.2%)
- EBs below threshold: 9/61 → 12/61
- Endorsed L1 blocks: 28 → 26
- Praos / tx-ref layers untouched (88 RBs, 120006/120006 txs in EB)
- New NoVote category surfaced: Declined 2088 (vs 0 in baseline)

Behaviour wiring confirmed live at scale: the 20%-stake abstention
shows up as a clean Declined column in vote-fail telemetry, with
quorum impact bounded (3 extra EB threshold misses, 2 fewer
certificates over 1500 slots).

Each run: 19m35s wall, ~5.7 GB peak RSS.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
sim-rs: wire shared-consensus behaviours into the simulator
shared-consensus's pluggable per-node `Behaviour` (lazy voter, RB
header equivocator, …) already had registry + install hooks on
`LeiosState`, `PraosState`, `MempoolState`.  Net-node consumed them
via its TOML `[behaviour]` block; sim-rs's adapter stub had a
docstring deferring the wiring "as a follow-on wrapper layer."  This
lands that wrapper layer.

Lift the cluster-wide selection resolver into shared-consensus so
sim-rs and net-cluster share one implementation:

- New `shared-consensus::behaviour::selection` exposes
  `BehaviourSelection` (kind = all|nodes|stake-random|stake-ordered|
  stake-fraction) plus `resolve_selection` and a new `resolve_specs`
  helper that resolves a list of `(spec, selection)` items to a
  per-index assignment, composing overlapping picks via
  `BehaviourSpec::Composite`.  17 unit tests cover variants,
  determinism, composition, and zero-stake filtering.

Surface it as a sim-rs parameter:

- `consensus-behaviours: Vec<{spec, selection}>` on `RawParameters`
  (kebab-case YAML); default empty = every node `Honest`, matching
  prior behaviour exactly.  Resolved once at
  `SimConfiguration::build` via `resolve_specs`, keyed by `NodeId`
  in topology-enumeration order so re-runs land on the same nodes.
  Static for the sim lifetime — no analog of net-node's runtime
  `swap_handle` path.

- `SharedConsensus::new` builds a single `BehaviourHandle` via
  `seed_from_node_id(name)` and assigns it to `leios.behaviour`,
  `praos.behaviour`, and `mempool.behaviour`.  One Arc across all
  three so stateful behaviours (e.g. `RbHeaderEquivocator`'s
  peer-partition map) observe events from every layer.

Drive-by fix: wire `committee-stake-fraction-threshold` through to
the adapter.  `derive_committee_selection` was hardcoding
`top_centile_of_stake: 0.95` with a TODO; threshold is now read
from `sim_config.committee_stake_fraction_threshold` (already on
`RawParameters` and used by the linear engine's
`vote_eligible_nodes` calc).  Necessary for top-stake-fraction
runs to honor their configured threshold (e.g. 0.99 in the CIP
sweeps).

Schema + default YAML: hand-updated `data/simulation/config.schema.json`
with `BehaviourSpec` and `BehaviourSelection` definitions; default
`consensus-behaviours: []` in `config.default.yaml`.  Example
fixture at `sim-rs/parameters/lazy-20pct.yaml`.

Limitations:
- Linear engine ignores the new field — `consensus-behaviours` is a
  shared-consensus-only knob.  Linear's `NodeBehaviours`
  (`ib_equivocation`, `withhold_txs`, `generate_conflicts`) is a
  separate, untouched config surface.
- No per-node topology override (only parameter-level `(spec,
  selection)` items).  Net-cluster's `BehaviourSelection` shape is
  better suited to cluster-scale experiments than hand-authoring
  750 topology entries.

Sim-rs tests: 59 lib (incl. 4 new resolver tests).  Shared-consensus
unit tests: 17 in the new `selection` module pass.

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