Skip to content

docs(fast-inbox): document message-prefix consumption and correct the streaming Inbox docs - #25416

Draft
spalladino wants to merge 11 commits into
spl/fi2-bucketless-node-cutoverfrom
spl/fi2-message-only-docs
Draft

docs(fast-inbox): document message-prefix consumption and correct the streaming Inbox docs#25416
spalladino wants to merge 11 commits into
spl/fi2-bucketless-node-cutoverfrom
spl/fi2-message-only-docs

Conversation

@spalladino

@spalladino spalladino commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Context

The bucketless Fast Inbox rebuild (#25413#25414#25415) changed what the node does with L1-to-L2 messages: every
L2 block consumes the messages the proposer's archiver has observed, blocks may end at any message prefix, only a
checkpoint's final position must be a live Inbox bucket end (resolved through Inbox.getBucketAtOrBeforeTotal and
preflighted through Rollup.validateCheckpointHeaderAndInbox), validators authenticate content and never penalise a
local prefix disagreement, and the archiver stores a plain message log whose reorg recovery rolls back to the newest
message still on L1 and refetches.

This PR is the normative documentation for that rebuild, plus the documentation errors the review turned up. It
changes prose and comments only — no behaviour, no timing value, no decision gate. The code fixes the review produced
are stacked directly above as #25440, and the three changes that alter node acceptance policy or proposer packing
are above that as #25436, #25437 and #25438, so each can be reviewed and taken or dropped on its own.

Documentation

ethereum-aztec-messaging/inbox.md is rewritten around the current contract: leaf index semantics, the MessageSent
event, a "How messages reach L2" section (immediate greedy consumption, an endpoint lookup only on the final block or
well into the checkpoint, the extra transaction-less block when the schedule runs out, mandatory consumption,
content-only validation), the distinction between public same-block consumption and private consumption against a
historical header, the accepted limitations, ring headroom and back pressure, and the full view-function table. The
portal overview, the aztec-nr messaging guide, the token-bridge, Uniswap and Aave tutorials and the operator glossary
drop the descendant-wait and fixed 12–30 s wording in favour of the readiness helpers.

resources/migration_notes.md gains the umbrella carry-overs, the additive Inbox/Rollup views and errors, the
count-addressed archiver API and the sequencer/validator internals. A new operator page
docs-operate/operators/reference/changelog/v6.md covers the automatic archiver store reset, the lowered
maxBlocksPerCheckpoint floor, the behaviour changes, the non-punitive validator reasons, rollback-and-refetch
recovery and the new L1 views.

Documentation the review found to be wrong

Several comments and pages asserted things the code does not do. Corrected here:

  • Recovery was described as comparing content before pruning. It rolls back to an authenticated anchor and refetches.
  • The publication preflight's verdict was presented as unconditional, when a due prune pins it to the proven tip.
  • Removed selection helpers were still named, and the message-sent log was documented with the wrong shape.
  • A comment called four block opportunities "below the Inbox minimum" when four is exactly the floor.
  • Range semantics were unstated: CustomRange.end is exclusive, and the archiver's typed range error arrives generic
    across JSON-RPC, so callers must not branch on its class.

No operational timing value was changed anywhere, including in the network defaults, where only the stale
justification comment moved.

Message-count prediction

The largest correction is to what a node promises when it simulates a public call. The count the simulator appends is
an estimate, not a bound in either direction: above the threshold, a checkpoint's final block ends on a live L1 bucket
boundary the simulating node never reads, and that boundary can sit below the local step.

With the consumption cursor at 0, 400 messages observed, and live buckets ending at 200 and 400:

value
what the local step allows 256
what the final block actually lands on 200

A public call reading message index 220 therefore simulates successfully and then fails when it runs for real. The
prediction mismatch itself is not fixed here (deferred), only described honestly, and waitForL1ToL2MessageReady /
isL1ToL2MessageReady are documented for what they check: inclusion at an L2 tip that already exists, which is a
statement about the chain as it stands rather than a promise about a future block.

Testing

One regression test accompanies the prediction correction — the 200/400 case above, asserting that the local step is
256 while the resolved final-block endpoint is 200. yarn workspace @aztec/sequencer-client test src/sequencer/inbox_message_selection.test.ts passes (18 tests). Nothing else in this PR is executable.

Stacked on #25415 (spl/fi2-bucketless-node-cutover). #25440, #25436, #25437 and #25438 stack above this one.

Part of A-1928

🤖 Generated with Claude Code

@spalladino spalladino added the ci-draft Run CI on draft PRs. label Sep 5, 2026
@spalladino
spalladino force-pushed the spl/fi2-message-only-docs branch 4 times, most recently from d88196e to 145907b Compare September 5, 2026 13:58
… checks, stale heights and the leaf-index derivation
Recovery no longer keeps unchanged messages and their proposed blocks until a
content difference is found. The operator changelog, the developer Inbox page
and the archiver README now say what actually happens: the log is rolled back
to the newest message the node can still find on L1 near the height it recorded
for it, proposed blocks that consumed anything past that point are dropped even
when the same content comes straight back, and published checkpoints are never
deleted by this path.
Replaces the completion-target wording in the developer Inbox page and the v6
operator changelog. Selection is local-only while a block's end stays at or
below 768 messages into the checkpoint; above that line, and on every final
block, the proposer resolves a live bucket end from the Inbox first. Nothing is
retained between blocks and consumption is never frozen, so a bucket closing
later in the slot can still be taken. The changelog also records the extra
transaction-less block that ends a checkpoint whose sub-slot schedule ran out,
its deadline derived from the timetable's last block build time rather than the
attestation deadline, and drops inbox_completion_unreachable from the reason
list.
@spalladino
spalladino force-pushed the spl/fi2-message-only-docs branch from 145907b to f0d1f1b Compare September 8, 2026 00:55
@spalladino spalladino changed the title docs(fast-inbox): document message-prefix consumption, count-addressed replay and the accepted limitations fix(fast-inbox): address the final review findings, and document message-prefix consumption Sep 9, 2026
@spalladino spalladino changed the title fix(fast-inbox): address the final review findings, and document message-prefix consumption fix(fast-inbox): address the review findings, and document message-prefix consumption Sep 9, 2026
spalladino and others added 2 commits September 9, 2026 18:12
…t a lower bound

The count a public simulation appends is an estimate, not a bound in either direction. Above the threshold a
checkpoint's final block ends on a live L1 bucket boundary that the simulating node never reads, and that
boundary can sit below the local step: with the cursor at 0, 400 messages observed and live buckets ending at
200 and 400, simulation appends 256 while the final block lands on 200, so a public call reading message index
220 simulates and then fails.

The readiness helper is documented for what it does — it checks inclusion at a chosen L2 tip, which is a
statement about the chain as it stands rather than a promise about a future block.

Wording and a regression test for the 200/400 case only; the prediction mismatch itself is unchanged.
Factual corrections across the migration notes, the archiver README, the messaging and changelog pages, the
Aave bridge tutorial, the barretenberg skill docs, and the comments in the network defaults, the Noir
constants and checkpoint root validator, and the Rollup field-range Solidity test.

The recurring errors were: describing recovery as comparing content before pruning rather than rolling back to
an authenticated anchor and refetching; presenting the publication preflight's verdict as unconditional when a
due prune pins it to the proven tip; promising fixed inclusion delays for L1-to-L2 messages instead of pointing
at the readiness helpers; naming removed selection helpers and the wrong shape for the message-sent log; and
calling four block opportunities "below the Inbox minimum" when four is exactly the floor. Timing values, the
proven-tip policy and every decision gate are unchanged.

Range reads: `CustomRange.end` is documented as exclusive, and the archiver's typed range error is documented
as arriving generic across JSON-RPC so callers do not branch on its class.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@spalladino
spalladino force-pushed the spl/fi2-message-only-docs branch from d43e92e to 8e97deb Compare September 9, 2026 21:15
@spalladino spalladino changed the title fix(fast-inbox): address the review findings, and document message-prefix consumption docs(fast-inbox): document message-prefix consumption and correct the streaming Inbox docs Sep 9, 2026
@spalladino
spalladino removed this pull request from stack #25417 September 9, 2026 21:16
@spalladino
spalladino added this pull request to stack #25441 September 9, 2026 21:16
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@spalladino spalladino closed this Sep 10, 2026
@spalladino spalladino reopened this Sep 10, 2026
@spalladino
spalladino removed this pull request from stack #25441 September 10, 2026 11:49
@spalladino
spalladino added this pull request to stack #25448 September 10, 2026 11:49
@spalladino spalladino closed this Sep 10, 2026
@spalladino spalladino reopened this Sep 10, 2026
@spalladino
spalladino force-pushed the spl/fi2-message-only-docs branch 2 times, most recently from 15e855e to 0df3fa2 Compare September 10, 2026 12:06
@spalladino
spalladino removed this pull request from stack #25448 September 10, 2026 12:09
@spalladino
spalladino changed the base branch from spl/fi2-bucketless-node-cutover to spl/fi2-l1-endpoint-resolver-preflight September 10, 2026 12:10
@spalladino
spalladino changed the base branch from spl/fi2-l1-endpoint-resolver-preflight to spl/fi2-bucketless-node-cutover September 10, 2026 12:10
@spalladino
spalladino added this pull request to stack #25449 September 10, 2026 12:11
@spalladino
spalladino removed this pull request from stack #25449 September 10, 2026 13:04
@spalladino
spalladino added this pull request to stack #25451 September 10, 2026 13:05
@spalladino
spalladino removed this pull request from stack #25451 September 10, 2026 13:53
@spalladino
spalladino added this pull request to stack #25452 September 10, 2026 13:54
@spalladino spalladino removed the ci-draft Run CI on draft PRs. label Sep 10, 2026
@spalladino
spalladino removed this pull request from stack #25452 September 10, 2026 14:31
@spalladino
spalladino added this pull request to stack #25453 September 10, 2026 14:32
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