test(e2e): migrate passing tests to proposer pipelining#23275
Merged
PhilWindle merged 20 commits intoMay 15, 2026
Conversation
…pelining tryVoteWhenEscapeHatchOpen constructed CheckpointVoter with the wall-clock slot and called publisher.sendRequestsAt(slot). Under proposer pipelining we are the elected proposer for slot + 1 (targetSlot), and the multicall is expected to mine in that slot. Signing for the wall-clock slot makes the L1 contract's EIP-712 digest mismatch and the require msg.sender == getCurrentProposer() check fail, because the wall-clock slot's proposer is someone else. The whole multicall reverts silently inside Multicall3 and every governance/slashing entry is dropped. Thread targetSlot through and use it for both CheckpointVoter (which binds the EIP-712 signature) and publisher.sendRequestsAt (which delays submission so the tx mines in targetSlot). Mirrors tryVoteWhenSyncFails and CheckpointProposalJob.execute. When pipelining is disabled targetSlot equals slot, so sendRequestsAt resolves with no extra sleep and the legacy behaviour is preserved. Unblocks e2e_sequencer/escape_hatch_vote_only and the "should vote even when unable to build blocks" case in e2e_sequencer/gov_proposal.parallel under pipelining (these were skipped in #23275 pending this fix). See PIPELINING_TEST_STATUS.md §6 B5.
Exercises the §6 B5 source-level fix (`tryVoteWhenEscapeHatchOpen` now signs the CheckpointVoter for `targetSlot` and submits via `sendRequestsAt(targetSlot)`). Without the fix, governance signals cast during the escape-hatch window would fail signature verification inside Multicall3 and the test's `finalStats.votes >= slotsPassed` assertion would fail. Test-side adjustments needed for the pipelined timing model: - Move event listener attachment to after the warp into the escape-hatch epoch. Checkpoint proposals in flight at warp time fail their L1 propose (their target slot is now in the past after the L1 timestamp jump) and we don't want to count those setup-warp artifacts as escape-hatch failures. Also filter remaining events to those at or after `initialStats.slot` for the same reason. - Snapshot `slotAtMeasurement` for the vote-count lower bound, then wait for the L1 slot to advance two more so the trailing vote (signed in build slot N for target slot N+1) has time to mine before we count. Without this drain, `finalStats.votes` consistently lags `slotsPassed` by 1-2 under pipelining. Inlines `enableProposerPipelining: true` and `inboxLag: 2` directly in the test rather than importing a shared `PIPELINING_SETUP_OPTS` preset, since this is the only pipelined test on this branch.
Adds a PIPELINING_SETUP_OPTS preset to fixtures.ts and applies it to every e2e test that passes under pipelining without any per-test adaptation. The global enableProposerPipelining default stays false -- this PR migrates tests one by one rather than flipping the network-wide default. The preset sets the minimum fixture state pipelining needs: enableProposerPipelining=true, inboxLag=2, minTxsPerBlock=0, the 12s/4s slot durations, and a wider 30x walletMinFeePadding. setup.ts gains a small conditional so the deploy-phase minTxsPerBlock override respects pipelining (0 instead of 1) when the test opted in. Source for the test list: tests already covered by PR #23150's §1 that call setup() directly. Tests using base-class fixtures (BlacklistTokenContractTest, FeesTest, CrossChainMessagingTest, etc.) are excluded from this commit and tracked for a follow-up.
Second batch of e2e tests migrated under pipelining -- the ones that needed test-level or infrastructure-level adjustments. The global default still stays false; tests opt in explicitly via PIPELINING_SETUP_OPTS. Infrastructure changes the §2 tests depend on: - p2p dummy_service.ts: notifyOwnCheckpointProposal invokes the all-nodes callback synchronously, mirroring libp2p loopback. Without this the in-process e2e sequencer never sees its own proposal and the pipelined parent verification blocks indefinitely. - sequencer-publisher.ts: error log on publisher exhaustion now includes the underlying viem error and tried-addresses context. - sequencer.ts: B5 fix -- tryVoteWhenEscapeHatchOpen now takes targetSlot, signs the voter for targetSlot, and delays submission via sendRequestsAt(getTimestampForSlot(targetSlot)) under pipelining. Mirrors the existing tryVoteWhenSyncFails and CheckpointProposalJob patterns. Plus a refactor of canProposeAt simulation overrides via SimulationOverridesBuilder. - sequencer-client READMEs: rewritten to document the multi-block-per-slot pipelined architecture (was PR #23149 originally). - end-to-end bootstrap.sh / test_simple.sh: suite/Jest timeout bumps for pipelined cadence. - per-file const TIMEOUT bumps across the §2 tests. Per-suite test fixes follow §2 of the categorization in PR #23150. Test files that use base-class fixtures (BlacklistTokenContractTest, FeesTest, CrossChainMessagingTest, DeployTest, FullProverTest, EpochesTest, P2P fixtures) are migrated with their branch changes preserved but without adding explicit pipelining opt-in -- the base class is shared with other tests not in this batch and a blanket opt-in would over-migrate. They'll get explicit pipelining opt-in in follow-up PRs. §5 still-skipped tests are not part of this PR. They remain at base state.
Extends the setup() method on FeesTest, BlacklistTokenContractTest, and
DeployTest to accept an optional Partial<SetupOptions> that is spread
into the underlying fixture setup() call. Mirrors how EpochsTestContext
already works. Each §2 test that uses one of these base classes now
opts in by calling 'await t.setup({ ...PIPELINING_SETUP_OPTS })':
- FeesTest: failures, gas_estimation, private_payments
- BlacklistTokenContractTest: burn, minting, shielding,
transfer_private, transfer_public,
unshielding
- DeployTest: contract_class_registration
Tests not in §2 that share these base classes (e.g. account_init,
sponsored_payments, public_payments, fee_juice_payments, fee_settings,
access_control, legacy, private_initialization, deploy_method) are
untouched and continue to run under the legacy (non-pipelined) default.
CrossChainMessagingTest, FullProverTest, and EpochsTestContext are not
modified -- no §2 test in this batch requires them to opt in.
…lined sequencer CI on commit 7316839 ran transfer_private.test.ts under pipelining and it failed with 'TimeoutError: Timeout awaiting mineBlock' across all 10 tests in the suite. The failure origin is BlacklistTokenContractTest .applyBaseSetup -> crossTimestampOfChange -> warpL2TimeAtLeastBy(86400), which warps L1 by 24 hours (7200 12s slots) and then expects mineBlock to produce a new L2 block within slotDuration * 1.5 = 18s. Under pipelining the in-flight checkpoint job referencing pre-warp slot/ timestamp values orphans world-state forks (CI log shows DELETE_FORK failed: Fork not found), the sequencer wedges, and mineBlock cannot produce a new block in time. This is the same B1 failure mode that has been documented for e2e_blacklist_token_contract/access_control (in §5) all along — but the previous PIPELINING_TEST_STATUS.md §2 docs claimed the other 6 blacklist suites passed. They don't. Leave all 6 blacklist suites at their pre-pipelining base state and add a TODO pointing at PIPELINING_GOTCHAS.md. The BlacklistTokenContractTest.setup(opts) infrastructure from 6cb7f89 stays in place — when B1 (world-state fork lifecycle under abort/reorg from a long warp) is fixed, opting these suites back in is trivial.
…e to build blocks" — depends on §6 B5 fix not in this PR The B5 fix on `palla/kill-non-pipelined-flow` (`tryVoteWhenEscapeHatchOpen` uses `targetSlot` under pipelining) predates two refactors on `merge-train/spartan` and couldn't be cherry-picked cleanly. The forward-port needs separate work; until then the test that exercises the escape-hatch vote path stays skipped. Sibling "should propose blocks while voting" goes through the normal CheckpointProposalJob path and remains active.
…e to build blocks' Disabling the blob client no longer reliably prevents tx inclusion under pipelining — the tx gets built and checkpointed before the expected TimeoutError fires. The test also depends on the §6 B5 escape-hatch vote-only fix that lives on palla/kill-non-pipelined-flow (39b64eb) and predates refactors on merge-train/spartan; a clean forward-port belongs in its own source PR. Sibling test "should propose blocks while voting" stays enabled — it goes through the normal CheckpointProposalJob vote path which is unaffected.
…t in this PR The B5 fix on `palla/kill-non-pipelined-flow` (`tryVoteWhenEscapeHatchOpen` uses `targetSlot` under pipelining) predates two refactors on `merge-train/spartan` and couldn't be cherry-picked cleanly. The forward-port needs separate work; until then this test runs under the legacy non-pipelined flow (where it was previously green). Same rationale as `gov_proposal.parallel`'s 'vote even when unable to build blocks' which was already re-skipped for the same reason. See PIPELINING_GOTCHAS.md §6 B5.
4754c3a to
198b95d
Compare
…is in Rebased onto palla/fix-b5-escape-hatch-slot-targeting (PR #23296), which forward-ports the B5 escape-hatch slot-targeting fix onto the modern buildCheckpointSimulationOverridesPlan + flat l1Contracts API. - sequencer.ts: restored to the B5 base state. The earlier cherry-pick in this branch reintroduced the pre-refactor API surface (buildPipelinedParentSimulationOverridesPlan, config.rollupAddress, setProposerAddressForSimulation, Date arg to sendRequestsAt). With the rebase onto PR #23296 the B5 fix is correctly applied against the current API. - e2e_sequencer/escape_hatch_vote_only.test.ts: re-opted-in to PIPELINING_SETUP_OPTS (was un-opted via the previous "B5 not on this PR" commit; B5 is on this PR now). Removed the redundant explicit enableProposerPipelining/inboxLag overrides that duplicated the preset. - e2e_sequencer/gov_proposal.parallel.test.ts: un-skipped 'should vote even when unable to build blocks' (was kept as it.skip pending the B5 fix). Restored the pipelining-aware timing tweaks: wait two slots before declaring the tx un-syncable, retryUntil the L1 checkpoint advance, and bump the round-end timeout by an extra slot. - end-to-end test files: re-applied the build/lint fixes that the earlier "unblock CI build/lint failures" commit had introduced -- BlockNumber typing in contract_class_registration.test.ts, { receipt } destructuring in e2e_ordering.test.ts, underscore-prefix unused vars in e2e_block_building.test.ts and e2e_crowdfunding_and_claim.test.ts.
…proposal "vote even when unable to build blocks" Under pipelining the proposer pushes its own built block straight into its local archiver via syncProposedBlockToArchiver (checkpoint_proposal_job.ts), bypassing the blob client. So disabling the blob client alone is no longer sufficient to recreate the legacy "node cannot sync the block" state — the tx resolves locally as `checkpointed` and the test's `expect(...).rejects .toThrow(TimeoutError)` fails. Also set `skipPushProposedBlocksToArchiver: true` via aztecNodeAdmin before disabling the blob client, forcing the node back onto the blob client for sync. This restores the legacy premise so the tryVoteWhenSyncFails fallback path the test is actually exercising still has a syncing-broken state to exercise. This is a separate issue from §6 B5 (escape-hatch signature targeting, fixed via the rebase onto PR #23296) — both fixes are needed for this test under pipelining.
…able to build blocks' Under pipelining there are two shortcuts that let the proposer's own node observe its own checkpoint without going through the blob client: 1. CheckpointProposalJob.syncProposedBlockToArchiver pushes the built block straight into the local archiver (already closed at runtime via skipPushProposedBlocksToArchiver: true on aztecNodeAdmin.setConfig). 2. L1Synchronizer.tryBuildPublishedCheckpointFromProposed lets the L1 sync synthesise a published checkpoint from the locally-stored proposed checkpoint (entered by proposal_handler.ts § setProposedCheckpointFromBlocks when pipelining is on), again without fetching blobs. The previous fix on this branch closed only shortcut (1) — the CI run on http://ci.aztec-labs.com/104fb826f3853893 had skipPushProposedBlocksToArchiver: true already set and still observed status: 'checkpointed' for block 5 because shortcut (2) fired. Closing shortcut (2) requires skipPromoteProposedCheckpointDuringL1Sync: true, which is an archiver config not exposed via AztecNodeAdminConfig, so it has to be wired at setup() rather than via the runtime admin interface. With both shortcuts closed, disabling the blob client genuinely makes the tx un-syncable, the .send().wait() throws TimeoutError, and the test can continue to verify the vote-while-unable-to-build behavior.
The bot computes its own maxFeesPerGas using config.minFeePadding (default 4x), which is too low under pipelining where fee-asset price can drift ~4x+ between PXE snapshot and inclusion. Set minFeePadding to PIPELINED_FEE_PADDING (30x) to match the wallet padding baked into PIPELINING_SETUP_OPTS.
Under proposer pipelining, the post-markAsProven `waitBlocks(2)` could race with the sequencer's in-flight pipelined propose: the next L1 propose's build-time state predates the cheat-code storage write, so when it mines the propose() call reverts silently inside multicall3 (allowFailure=true, no logs, status:success, gasUsed ~90k). The archiver then detects the missing CheckpointProposed event, prunes the un-checkpointed L2 blocks, and the test's in-flight tx gets dropped by P2P as 'Block header not found'. Replace the waitBlocks(2) buffer with cheatCodes.eth.mineEmptyBlock(3), which advances Anvil's `finalized = latest - 2` heuristic past the storage write without involving the L2 pipeline. The chain-finalized event then fires on the next archiver poll, triggering world-state pruning, and the existing retryUntil completes well within budget.
Two unrelated failure clusters when opted into PIPELINING_SETUP_OPTS: 1. transaction-bot tests fail with maxFeesPerGas < gasFees (4x ratio) because the bot overrides wallet padding via setMinFeePadding(config.minFeePadding) with default minFeePadding=3. Would need PIPELINED_FEE_PADDING on every bot config in the file (precedent: 21ad17f for e2e_sequencer_config). 2. bridge resume / amm-bot / cross-chain-bot / setup-via-bridging tests fail with L1ToL2MessagesNotReadyError. AztecNodeService.simulatePublicCalls queries getL1ToL2Messages(proposedCheckpoint+1) at checkpoint boundaries without accounting for inboxLag, so the requested checkpoint isn't yet sealed on L1 under pipelining with inboxLag=2. Cluster 2 is a source-level simulator bug; cluster 1 is test-side fixable but partial per-describe pipelining opt-in isn't possible (single outer beforeAll). Un-opt-in the whole file with a TODO referencing both issues.
CI hit Rollup__InvalidArchive cascade ~12min into the run on e2e_avm_simulator, with the publisher's propose simulation reverting mid-suite and the archiver then dropping 62 checkpoints due to a predicted L1 reorg. This is the second consecutive simulate-heavy test on the B7 watch list to fail under pipelining (e2e_bot in commit e32ea4f, e2e_fees/failures in commit eb54267). Un-opt-in following the same pattern: drop PIPELINING_SETUP_OPTS from setup(...) so the suite runs under legacy until §6 B7 (simulator + inboxLag mismatch in AztecNodeService.simulatePublicCalls) is fixed in a separate source-level PR.
CI hit propose_action_not_successful + archiver prune cascade
("Pruning blocks after block 8 due to slot 10 not being checkpointed" →
"Reorg detected. Pruning blocks from 1 to 8" → "Chain pruned to block 0")
in e2e_contract_updates tests 1 and 2. The cascade wipes wallet state
and wedges the sequencer; the subsequent cheatCodes.warpL2TimeAtLeastBy
then fails with "Timeout awaiting mineBlock" (18s slot*1.5 budget).
Symptoms match §6 B2 (proposed-chain invalidation + PXE/anchor recovery)
documented in PIPELINING_TEST_STATUS.md.
Un-opt-in following the same pattern as e2e_bot (e32ea4f),
e2e_fees/failures (eb54267), and e2e_avm_simulator (a8ea0e9):
drop PIPELINING_SETUP_OPTS from setup(...) so the suite runs under
legacy until B2 is fixed in a separate source-level PR.
CI: http://ci.aztec-labs.com/8b65eace8dc2523f
This was referenced May 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Extracts the tests known to pass under proposer pipelining from PR #23150, without flipping the global default. Tests opt into pipelining explicitly via a new
PIPELINING_SETUP_OPTShelper. The globalenableProposerPipeliningdefault staysfalseonmerge-train/spartan; this PR migrates tests file-by-file so each one is opted in by name.This PR is intentionally scoped: it only includes tests whose pipelining-ready status is reasonably well understood. Tests that depend on shared base-class fixtures (
FeesTest,BlacklistTokenContractTest,CrossChainMessagingTest,DeployTest,FullProverTest, etc.) keep their branch changes but are not yet wired to pipelining via their base class -- those base classes are used by tests outside this batch and a blanket opt-in would over-migrate. They will be migrated in follow-up PRs.Two commits:
test(e2e): opt unchanged tests into proposer pipelining-- addsPIPELINING_SETUP_OPTStofixtures.ts, the small deploy-phaseaccountsDeployMinTxsconditional tosetup.ts, and the explicit opt-in to every §1 test that callssetup()directly.test(e2e): migrate tests that needed fixes into proposer pipelining-- the §2 tests with their branch fixes plus the infrastructure they depend on (sequencer.ts B5 fix, dummy_service.ts loopback, sequencer-publisher.ts error logging, sequencer-client READMEs rewrite, bootstrap.sh / test_simple.sh timeout bumps).The global default flip and the migration of base-class-using tests are intentionally deferred. They will land separately once each batch can be verified independently.
§1 -- Pipelining enabled and passing (no code changes)
Tests that pick up
enableProposerPipelining=truefrom the explicit opt-in and pass without any per-test fix. This is the majority of the suite -- too many to enumerate. Examples include the unmodifiede2e_authwit,e2e_nft,e2e_amm,e2e_partial_notes,e2e_token_contract/*(non-overflow),e2e_offchain_*,e2e_orderbook,e2e_event_*,e2e_keys,e2e_avm_simulator(after the suite-level timeout bump only),e2e_pending_note_hashes_contract, etc. None of these required test-level pipelining adaptations.Pre-existing
it.skips in this bucket are unrelated to pipelining (they predate the branch) and were not touched:e2e_token_contract/{transfer,transfer_in_private,transfer_in_public}"transfer into account to overflow"e2e_blacklist_token_contract/{transfer_private,transfer_public}"transfer into account to overflow"e2e_synching"replay history and then do a fresh sync" / "a wild prune appears"e2e_p2p/reex"validators re-execute transactions before attesting"§2 -- Pipelining enabled and needed fixes
Tests that needed test- or fixture-level changes to pass under pipelining. All currently passing under PR #23150.
Fixture-level (
src/fixtures/fixtures.ts+src/fixtures/setup.ts)PIPELINING_SETUP_OPTSpreset exportinginboxLag=2,minTxsPerBlock=0,aztecSlotDuration=12s,ethereumSlotDuration=4s,walletMinFeePadding=PIPELINED_FEE_PADDING(30x), andenableProposerPipelining=true.setup.tsgains a small conditional so the deploy-phaseminTxsPerBlockoverride uses0instead of1under pipelining (otherwise the chain stalls on alternating slots).Cheat-codes (
src/testing/cheat_codes.ts) -- already onmerge-train/spartanvia cherry-pick of #23213.P2P (
src/services/dummy_service.ts)notifyOwnCheckpointProposalnow invokes the all-nodes callback synchronously, mirroring libp2p loopback. Without this the in-process e2e sequencer never sees its own proposal and the pipelined parent verification blocks indefinitely.Sequencer-client
sequencer.ts::tryVoteWhenEscapeHatchOpen-- §6 B5 fix: takestargetSlot, signs the voter fortargetSlot, and delays submission viasendRequestsAt(getTimestampForSlot(targetSlot))when pipelining is enabled. Mirrors the existingtryVoteWhenSyncFailsandCheckpointProposalJob.executepatterns. Plus a refactor ofcanProposeAtsimulation overrides viaSimulationOverridesBuilder.sequencer-publisher.ts-- error log on publisher exhaustion now includes the underlying viem error and tried-addresses context.Per-suite test fixes
e2e_lending_contract-- predictable-time stub, longer hook windows.e2e_fees/private_payments"pays fees for tx that dont run public app logic".e2e_blacklist_token_contract/{burn, minting, shielding, transfer_private, transfer_public, unshielding}-- 6/7 suites re-enabled (access_controlstill skipped, see §5).e2e_contract_updates-- all 4 tests re-enabled (covered by §1 opt-in in this PR).e2e_expiration_timestampinvalidates tests -- L1-onlyeth.warp(target, { resetBlockInterval: true }), no publisher cascade.e2e_ordering-- switched from "latest block" to receipt-block reads; helper renamed toexpectLogsFromBlockToBe(logMessages, fromBlock).e2e_fees/failures-- snapshotprovenCheckpointBefore/After, usewaitForProvenwith extended timeout, account for newly-proven checkpoint deltas in reward math, read committed fee headers viagetCommittedProverFee/getCommittedBurn.e2e_fees/gas_estimation-- padmaxFeesPerGasviagetPaddedMaxFeesPerGas(aztecNode)inbeforeEachto absorb fee-asset price evolution between snapshot and submission. 3/3 passing.e2e_crowdfunding_and_claim"cannot donate after a deadline" -- L1-onlycheatCodes.eth.warp(deadline+1, { resetBlockInterval: true }).e2e_deploy_contract/contract_class_registrationprivate-ctor variants -- threadreceipt.blockNumberthroughdeployFn, read logs from that specific block instead of "latest". 21/21 passing.e2e_state_varsDelayedPublicMutable -- root cause was slot-duration mismatch (delay(4)assumedaztecSlotDuration=72sfromDefaultL1ContractsConfig; fixture forces12sunder pipelining). Replaceddelay(4)with a loop that pumps no-op txs untiltimestamp >= timestamp_of_change, and asserted exact equality againsttx.data.constants.anchorBlockHeader.globalVariables.timestamp + newDelay - 1n. TighttoEqual, no widened bound.e2e_pending_note_hashes_contract-- squash helpers use the latest non-empty block.e2e_expiration_timestamp-- include-by computation bumped by 2xaztecSlotDuration.e2e_p2p/*ande2e_epochs/*-- explicitenableProposerPipelining: true+inboxLag: 2on every test that builds its own config (so behavior is intentional rather than implicit).e2e_block_building"processes txs until hitting timetable" -- replaced legacycanStartNextBlockmock + single-deadline timetable with the pipelined sub-slot budget (blockDurationMs=2000,enforceTimeTable=true,fakeProcessingDelayPerTxMs=500). 10 simultaneous txs must span at least 2 distinct blocks; would fail if the proposer reverted to single-block-per-slot or stopped enforcing sub-slot deadlines.e2e_block_building"assembles a block with multiple txs" (x2) -- pre-publish the contract class once and passskipClassPublication: trueon each per-tx deploy so the deploys don't all share the sameContractClassRegistry.publishnullifier and get RBF-rejected against each other. Also resetblockDurationMsinafterEachso the multi-block-per-slot state from the previous test doesn't leak.e2e_block_building"publishes two empty blocks" --buildCheckpointIfEmpty: trueso the proposer doesn't skip empty sub-slots; retry budget bumped from 10s -> 60s because empty checkpoints land everyaztecSlotDuration(12s) rather than every legacy block.e2e_epochs/epochs_mbps.parallel"builds multiple blocks per slot with L2 to L1 messages" -- pipelined timing loses one sub-slot to attestation propagation; expectation dropped fromEXPECTED_BLOCKS_PER_CHECKPOINT=3to>= 2, mirroring the sibling MBPS tests.e2e_l1_with_wall_time-- test was explicitly passingethereumSlotDurationfrom env (=12s), defeating the fixture's pipelining override (=4s). Withaztec=eth=12s, pipelined timing can't fit propose+attest+publish in one Aztec slot. Removed the explicitethereumSlotDuration; also wrappedteardowninafterEachso setup failures surface their real error.e2e_p2p/add_rollupre-enabled (entire describe; 1 test, passes in ~9:14 locally). AttestationTimeoutError still fires in some slots, but the bundled-multicall governance-signal preCheck is independent of the propose preCheck -- signals accumulate and reach quorum even when checkpoint proposes fail to attest.e2e_pruned_blocks"can discover and use notes created in both pruned and available blocks" -- restored the explicitmarkAsProvencall (as it had pre-chore: Properly compute finalized block #21156) + a 2-block buffer for Anvil'sfinalized = latest - 2heuristic; test re-enabled and passes.e2e_sequencer/escape_hatch_vote_onlyre-enabled. Source fix atsequencer.ts::tryVoteWhenEscapeHatchOpen(see §B5 in PR feat(sequencer): kill non-pipelined proposer flow #23150). Test-side: attach event listeners after the warp, explicitly drain trailing in-flight votes before counting.e2e_sequencer/gov_proposal.parallelre-enabled (both tests). Two pipelining-aware adjustments: warp offset bumped tonextRoundBeginsAtTimestamp - AZTEC_SLOT_DURATION - ETHEREUM_SLOT_DURATION, and per-tx wait timeouts tuned for two slots of catch-up (proposer + L1 mine).Bash-level timeout adjustments (
end-to-end/bootstrap.sh) -- pipelined sequential dependent txs run at ~2x legacy latency:e2e_block_building: 25me2e_avm_simulator: 30mscripts/test_simple.shJest--testTimeout5m -> 10mconst TIMEOUTraised from 100/120/150/180s -> 300s.Out of scope
enableProposerPipelining=trueeverywhere. This PR keeps the defaultfalseand migrates per-test. The global flip will land in a follow-up.e2e_l1_publisher"with attestations" describe,epoch_cache.test.tsnon-pipelined branch coverage, demodocker-compose.yml): no change required while the default isfalse.e2e_blacklist_token_contract/access_control,e2e_publisher_funding_multi,e2e_fees/fee_settings, etc.) remain atmerge-train/spartanstate.FeesTest,BlacklistTokenContractTest,CrossChainMessagingTest,DeployTest,FullProverTest,EpochesTest, P2P fixtures): test files using these get their branch-side changes preserved but are not wired to pipelining via the base class -- those base classes are shared with tests not in this batch and a blanket opt-in would over-migrate. Follow-up PRs will opt them in selectively.Reference: PR #23150 (
palla/kill-non-pipelined-flow) for full context on the categorization, source-level bugs surfaced (§6 B1-B6), and per-suite investigation notes.