Skip to content

proposal(fct_block_proposer_head): OR-group block sources to extend history (~2023-03, not merge-ready) - #294

Draft
samcm wants to merge 1 commit into
masterfrom
fix/block-proposer-head-gossip-optional
Draft

proposal(fct_block_proposer_head): OR-group block sources to extend history (~2023-03, not merge-ready)#294
samcm wants to merge 1 commit into
masterfrom
fix/block-proposer-head-gossip-optional

Conversation

@samcm

@samcm samcm commented Jul 13, 2026

Copy link
Copy Markdown
Member

Proposal, not merge-ready — read the blocker.

fct_block_proposer_head reads three redundant block-observation sources (gossip event, block event, libp2p gossipsub) but declares them as plain AND dependencies, so beacon_api_eth_v1_events_block_gossip — which only starts once a network has live collection (2025-05-14 on mainnet) — pins the model's backfill floor to 2025-05-14. OR-grouping the three makes the floor the earliest member instead of the latest (confirmed against the engine: an OR-group's range is MIN(members)), mirroring the existing proposer-duty OR-group.

How far this actually reaches: beacon_api_eth_v1_events_block has continuous data from 2023-03, libp2p_gossipsub_beacon_block from 2024-05, block_gossip from 2025-05. So the real floor this unlocks is ~2023-03, not genesis — a ~2-year gain for fct_block_proposerfct_reorg / fct_missed_slot_rate / fct_block_proposal_status / fct_attestation_inclusion_delay. These metrics need head-time block observation (to distinguish orphaned/reorged from missed), which does not exist before live collection, so 2023-03 is a physical floor, not a modelling choice. (The canonical-sourced sections — attestation participation, head-vote correctness — already reach genesis and are unaffected by this.)

Blocker (why this must not be merged alone): beacon_api_eth_v1_events_block and libp2p_gossipsub_beacon_block each carry a few stray pre-collection rows — 8,800 and 4 rows in Dec 2020 respectively, then zero until real collection begins. Production runs EXTERNAL_MODEL_MIN_TIMESTAMP=0, so CBT's external min(position) reads those stray rows as genesis. With this change the floor would drop to genesis and backfill 2020-12 → 2023-03 with no block data at all, writing every slot as "missed" — garbage that then propagates downstream. This change only becomes safe once those stray rows are excluded for the two block sources specifically. The global EXTERNAL_MODEL_MIN_TIMESTAMP is not a safe lever, because the canonical sources genuinely reach genesis and must not be floored.

One further semantics note for whoever picks this up: forward-fill uses union bounds, so at the head the model would advance to the fastest of the three block sources rather than waiting for the slowest. That is safe in practice (the proposer-duty completeness gate with its 1h settling window is the binding head constraint, and block roots are deterministic content), but it is a behavior change worth a conscious sign-off.

…istory

Proposal / not merge-ready — see caveats below.

The model reads three redundant block-observation sources (gossip event,
block event, libp2p gossipsub) but declares them as plain AND dependencies,
so beacon_api_eth_v1_events_block_gossip — which only begins once a network
has live collection (2025-05-14 on mainnet) — pins the model's backfill floor
to 2025-05-14 even though beacon_api_eth_v1_events_block has continuous data
from 2023-03 and libp2p_gossipsub from 2024-05.

Grouping the three into one OR-group makes the floor the earliest member
instead of the latest, mirroring the existing proposer-duty OR-group. This
would extend the downstream chain that surfaces the May-2025 cutoffs on the
lab consensus overview (fct_block_proposer -> fct_reorg / fct_missed_slot_rate
/ fct_block_proposal_status / fct_attestation_inclusion_delay) back to ~2023-03
-- roughly two years, not to genesis. These metrics need head-time block
observation (orphan/reorg detection), which does not exist before 2023, so
2023-03 is a physical floor, not a modelling choice.

BLOCKER: beacon_api_eth_v1_events_block and libp2p_gossipsub_beacon_block each
carry a handful of stray pre-collection rows (2020-12: 8800 and 4 rows
respectively, then zero until real collection starts). Production runs
EXTERNAL_MODEL_MIN_TIMESTAMP=0, so CBT's external min(position) reads those as
genesis. With this change the floor would drop to genesis and backfill
2020-12 -> 2023-03 with no block data at all, writing every slot as "missed"
-- garbage. This must be paired with excluding those stray rows for the two
block sources specifically (the global EXTERNAL_MODEL_MIN_TIMESTAMP is not a
safe lever: canonical sources genuinely reach genesis and must not be floored).

Claude-Session: https://claude.ai/code/session_01Mp4aKNXPmN6NfMuNGbf3Qm
@samcm
samcm force-pushed the fix/block-proposer-head-gossip-optional branch from 2fa0d3e to 65addbe Compare July 13, 2026 03:47
@samcm samcm changed the title feat(fct_block_proposer_head): extend history by OR-grouping block sources proposal(fct_block_proposer_head): OR-group block sources to extend history (~2023-03, not merge-ready) Jul 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant