Merge branch 'main' into cet/memory-telemetry
Resolves a parallel-implementation conflict in the LeiosStore retention path: PR #913 landed on main with an untagged `VecDeque<LeiosNotification>` and a `notification_evictable` predicate that inspects each notification's referenced slots, while this branch had a slot-tagged deque. Adopt main's predicate-based design — it handles `VotesOffer` more accurately than the conservative max-slot tag — and re-layer this branch's additions on top: - `notifications_bytes_estimate` field in stats (Serialize-derived through net-core's serde dep) with `notification_heap_bytes` only counting the variable `VotesOffer` payload, never the enum size. - `tick_slot` advances retention by wall-clock without touching the version counter or watch channel — eviction is silent. - `push_notification` filter drops late-arriving offers whose slots are already below cutoff, before they can sit at the back of the deque past the front-only pop_front loop. - `notifications_after` clamps the cursor to the next-write index on overshoot so a consumer that gets ahead reconverges on the next inject. All five new behaviour tests + a 10k-slot stress test exercise the eviction guarantee end-to-end. Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>