Skip to content

docs(validation): §5.9 trace ancestor-error cascade — Portal↔RPC parity#152

Merged
dzhelezov merged 1 commit into
mainfrom
docs/validation-s59-trace-cascade
Jul 11, 2026
Merged

docs(validation): §5.9 trace ancestor-error cascade — Portal↔RPC parity#152
dzhelezov merged 1 commit into
mainfrom
docs/validation-s59-trace-cascade

Conversation

@dzhelezov

Copy link
Copy Markdown
Collaborator

Adds VALIDATION.md §5.9 — the detection-arc entry for the traces.error / traces.revert_reason ancestor-error cascade closed by #151. Closes the dangling "Upstream divergence documented in VALIDATION.md §5" reference left by the INV-20 catalog row (portal/INVARIANTS.md).

The arc (candor is the point)

  • Symptom: Portal historical backfill stored traces.error = NULL on frame [0,1] of a reverting DEX-aggregator tx (eth block 20351061 tx 26) where the RPC-path store held "execution reverted".
  • Ground truth: geth debug_traceBlockByNumber/callTracer reports [0,1] = null (the revert originates at [0,2]). The raw Portal /finalized-stream capture agrees with geth.
  • Root cause: ponder's RPC path cascades a reverted ancestor's error onto succeeded descendants (derived DFS post-processing, rpc/actions.ts ~186–219). On raw geth-literalism the Portal path was the more faithful of the two.
  • Resolution (fix(traces): ancestor-error cascade — Portal store byte-identical to the RPC path on traces.error/revert_reason #151): the fork ports the same cascade into the Portal historical assemble path (cascadeTraceErrors) so the store is byte-identical to the RPC path — drop-in determinism regardless of backend, mirroring the fix(transform): store NULL not fabricated [] when Portal drops accessList — refines #32 #110 access_list decision. Pinned by INV-20 (+ oracle tests, mutation-verified).
  • End-to-end: a fresh merged-main backfill of [20350978,20351278] diffs 424/424 rows byte-identical to the RPC store (22 non-null errors each side, 0 mismatch, no over-cascade).

Framing

No defect claim against upstream — ponder's cascade is a deliberate, documented behavior the fork matches for parity. The geth-literalism-vs-RPC-parity tradeoff is stated plainly.

Docs-only (+21 lines, VALIDATION.md). Draft pending committee review.

…ty detection arc

Documents the traces.error/revert_reason detection arc closed by #151. geth
callTracer ground truth and the raw Portal /finalized-stream both report the
succeeded child frame [0,1] as null; ponder's RPC path cascades the reverted
ancestor's error onto it (derived DFS post-processing in rpc/actions.ts); #151
ports that same cascade into the Portal historical assemble path so the store
is byte-identical to the RPC path for drop-in determinism (the #110 access_list
precedent). End-to-end: a fresh merged-main backfill of [20350978,20351278]
diffs 424/424 rows byte-identical to the RPC store (22 non-null errors each,
0 mismatch, no over-cascade).

Closes the "documented in VALIDATION.md §5" reference from the INV-20 catalog
row. Candid on the geth-literalism vs RPC-parity tradeoff; no defect claim
against upstream.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@dzhelezov dzhelezov force-pushed the docs/validation-s59-trace-cascade branch from 2e54f37 to 7ca34e9 Compare July 11, 2026 06:17
@dzhelezov dzhelezov marked this pull request as ready for review July 11, 2026 06:18
@dzhelezov dzhelezov merged commit 268630a into main Jul 11, 2026
14 checks passed
@dzhelezov dzhelezov deleted the docs/validation-s59-trace-cascade branch July 11, 2026 06:18
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