Skip to content

tests: revamp and simplify interop tests#399

Merged
tcoratger merged 10 commits intoleanEthereum:mainfrom
tcoratger:revamp-interop-tests
Feb 16, 2026
Merged

tests: revamp and simplify interop tests#399
tcoratger merged 10 commits intoleanEthereum:mainfrom
tcoratger:revamp-interop-tests

Conversation

@tcoratger
Copy link
Collaborator

🗒️ Description

🔗 Related Issues or PRs

✅ Checklist

  • Ran tox checks to avoid unnecessary CI fails:
    uvx tox
  • Considered adding appropriate tests for the changes.
  • Considered updating the online docs in the ./docs/ directory.

tcoratger and others added 9 commits February 14, 2026 23:33
Poll loops capture safe_targets/justified_slots before sleeping 2s.
During that sleep, gossip updates the store. If the timeout expires,
the assertion uses the stale pre-sleep snapshot while diagnostics
show fresh values. Re-read values after diagnostics to fix.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove phases 4-7 (safe target, justification, finalization, sustained
finalization) which require the attestation pipeline to meet 800ms
interval deadlines. On a 2-core CI runner with 3 nodes sharing one
asyncio event loop, CPU contention causes missed intervals, divergent
attestation targets, and aggregation failures (nagg=0 on all nodes).

Keep 4 timing-tolerant phases:
1. Connectivity (QUIC full mesh)
2. Block production (gossip propagation, chain integrity, proposer rotation)
3. Attestation pipeline activity (gossip signatures enter pipeline)
4. Continued production (multi-slot growth, head consistency, block content)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Comment on lines +971 to +986
all_payloads: dict[SignatureKey, list[AggregatedSignatureProof]] = dict(
self.latest_known_aggregated_payloads
)
for sig_key, proofs in self.latest_new_aggregated_payloads.items():
if sig_key in all_payloads:
# Both pools have proofs for this key. Combine them.
all_payloads[sig_key] = [*all_payloads[sig_key], *proofs]
else:
# Only "new" has proofs for this key. Add them directly.
all_payloads[sig_key] = proofs

# Find head with minimum attestation threshold.
# Convert the merged aggregated payloads into per-validator votes.
#
# Each proof encodes which validators participated.
# This step unpacks those bitfields into a flat mapping of validator -> vote.
attestations = self.extract_attestations_from_aggregated_payloads(all_payloads)
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@unnawut @kamilsa please let me know what you think about this fix? If you think this is ok or not?


def on_tick(
self, time: Uint64, has_proposal: bool, is_aggregator: bool = False
self, target_interval: Uint64, has_proposal: bool, is_aggregator: bool = False
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@MegaRedHand Let me know if this solves the problem you had in mind?

@tcoratger tcoratger added bug Category: bug fix specs Scope: Changes to the specifications chore Category: chore labels Feb 16, 2026
@tcoratger tcoratger added this to the pq-devnet-3 milestone Feb 16, 2026
@tcoratger tcoratger merged commit 8b7636b into leanEthereum:main Feb 16, 2026
21 of 22 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bug Category: bug fix chore Category: chore specs Scope: Changes to the specifications

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant