Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
211 commits
Select commit Hold shift + click to select a range
56cfdc5
bench: add cheap-opcode interpreter hotloop workload to transact
RealiCZ Aug 11, 2026
c520902
feat(rex7): settle compute gas at checkpoints
RealiCZ Aug 11, 2026
035426b
test(rex7): pin REX6/REX7 checkpoint settlement parity
RealiCZ Aug 11, 2026
9d7d2a1
feat(rex7): enforce compute limits with the V0 gas clamp
RealiCZ Aug 11, 2026
dc541a5
test(rex7): cover V0 gas-clamp enforcement
RealiCZ Aug 11, 2026
603af84
fix(rex7): apply the detention cap on a frame-local checkpoint exceed
RealiCZ Aug 11, 2026
fc53eed
docs(rex7): document checkpoint compute gas accounting
RealiCZ Aug 11, 2026
66dd956
test(rex7): cover interceptor and precompile resume settlement
RealiCZ Aug 11, 2026
40d7ce9
test(rex7): pin where a latched non-compute exceed surfaces
RealiCZ Aug 11, 2026
4f7e6dd
test(rex7): cover the three gas-leakage paths under an active clamp
RealiCZ Aug 11, 2026
4a20994
test(rex7): extend REX6/REX7 parity to system-path transaction shapes
RealiCZ Aug 11, 2026
dad83f7
test(rex7): sweep the double-exceed corner across the knife edge
RealiCZ Aug 11, 2026
789d67c
test(rex7): add a parity case for every checkpoint opcode
RealiCZ Aug 11, 2026
0fdb576
test(rex7): satisfy clippy doc-markdown in the new suites
RealiCZ Aug 11, 2026
e481864
test(rex7): describe the new suites in the module docs
RealiCZ Aug 11, 2026
efc378c
test(rex7): engage the clamp in the frame-local corner sweep
RealiCZ Aug 11, 2026
6648de8
docs(rex7): correct halt-field actual/limit contract and top-frame ti…
RealiCZ Aug 11, 2026
ab45e02
fix(rex7): bind the V0 gas clamp on an explicit lifecycle
RealiCZ Aug 11, 2026
4964765
fix(rex7): settle every exceptional halt's burned remainder as compute
RealiCZ Aug 11, 2026
1b3008e
fix(rex7): report the binding budget in a clamp-induced exceed
RealiCZ Aug 11, 2026
a3d41e1
fix(rex7): report the final compute usage in a clamp-induced halt
RealiCZ Aug 11, 2026
4a4f53c
test(rex7): compare state in the shared parity assertion
RealiCZ Aug 11, 2026
c3a8230
docs(rex7): align the carve-out and clamp rules with the fixed behavior
RealiCZ Aug 11, 2026
9188680
docs(rex7): correct the frame-exit hook docstrings after the split
RealiCZ Aug 11, 2026
3ba8273
docs: note the REX7 exceptional-halt burn lane in AGENTS.md
RealiCZ Aug 11, 2026
d7ba3cc
test(rex7): explain the callee loop size in the payload case
RealiCZ Aug 11, 2026
ae0ad80
fix(rex7): enforce the work an exceptionally halted frame performed
RealiCZ Aug 12, 2026
113fd7b
fix(rex7): keep an aborted checkpoint's storage charge out of compute
RealiCZ Aug 12, 2026
9c6b609
fix(rex7): keep the sandbox's compute-gas split across the merge
RealiCZ Aug 12, 2026
201fa4e
docs(rex7): state what a clamp-induced exceed's actual can exceed
RealiCZ Aug 12, 2026
db8a414
test(rex7): pin which half of an exceptional frame enforces
RealiCZ Aug 12, 2026
b16e94a
docs(rex7): specify the executed / destroyed split of an exceptional …
RealiCZ Aug 12, 2026
476c760
fix(rex7): stop enforcing destroyed compute gas at the block limit
RealiCZ Aug 12, 2026
432c4ce
test(rex7): admit a cheap transaction behind a destroyed remainder
RealiCZ Aug 12, 2026
bcff49c
docs: split block compute accounting into reported and enforced
RealiCZ Aug 12, 2026
cbf4f4d
docs: say which compute counter a block ComputeGasLimit rejection rep…
RealiCZ Aug 12, 2026
54d95b4
docs(rex7): qualify precision invariant to exclude exceptional-halt f…
RealiCZ Aug 12, 2026
6881366
Merge remote-tracking branch 'origin/cz/chore/upgrade-revm-40' into c…
RealiCZ Aug 12, 2026
0047ff0
Merge remote-tracking branch 'origin/cz/chore/upgrade-revm-40' into c…
RealiCZ Aug 13, 2026
d35d293
perf(evm): monomorphize checkpoint gating off the frozen-spec hot path
RealiCZ Aug 13, 2026
12380c8
fix(evm): rebuild spec-latched limit state on cfg spec migration
RealiCZ Aug 13, 2026
fc0fab9
docs(evm): replace the V0 design codename with the spec term gas clamp
RealiCZ Aug 13, 2026
f849383
refactor(evm): restore runtime checkpoint gating, matching upstream r…
RealiCZ Aug 13, 2026
62cd042
refactor(limit): fold checkpoint/clamp state into a CheckpointTracker
RealiCZ Aug 13, 2026
b9323d5
refactor(evm): align the leftover checkpoint_accounting local with th…
RealiCZ Aug 13, 2026
2450928
refactor(evm): build the rex7 table by inheriting rex6 slots
RealiCZ Aug 14, 2026
dd17a15
test(rex7): guard the rex7 opcode set against the rex6 one
RealiCZ Aug 14, 2026
83b2a1b
feat(evm): charge static gas on REX7 volatile-guard reject
RealiCZ Aug 14, 2026
df2d9c3
docs(rex7): specify charge-on-reject and mark-at-load
RealiCZ Aug 14, 2026
95a52f6
fix(evm): charge REX7 reject static gas only on the reject arm
RealiCZ Aug 14, 2026
33a8ce9
fix(rex7): correct guard-pass charge site and pin SELFBALANCE
RealiCZ Aug 14, 2026
49403ca
docs(rex7): correct checkpoint docs and specify prepaid-crossing sema…
RealiCZ Aug 14, 2026
a73fef7
test(rex7): pin static-fee edges for GAS, LOG1, and CREATE
RealiCZ Aug 14, 2026
8c98a34
feat(evm): split REX7 precompile-halt compute into executed and destr…
RealiCZ Aug 14, 2026
95c4bdc
test(rex7): pin equal-value spend-all OutOfGas receipt against REX6
RealiCZ Aug 14, 2026
b1a06b1
docs(rex7): specify precompile-halt split and inspector accounting co…
RealiCZ Aug 14, 2026
38068a3
docs(rex7): anchor the destroyed part to the forwarded envelope and p…
RealiCZ Aug 14, 2026
26be4e7
test(rex7): kill T20 mutation survivors and record equivalent suppres…
RealiCZ Aug 14, 2026
63444a4
feat(evm): take over the precompile seam and split KZG halts by reason
RealiCZ Aug 14, 2026
fe062fd
docs(rex7): move the two block compute-gas readings into a details block
RealiCZ Aug 14, 2026
ab513f8
feat(sandbox): book the KeylessDeploy interceptor's destroyed envelope
RealiCZ Aug 14, 2026
be5432e
feat(evm): book the pre-execution intrinsic halt's destroyed envelope
RealiCZ Aug 14, 2026
926b1a8
test(rex7): widen the precompile mirror matrix and pin the KZG cap co…
RealiCZ Aug 14, 2026
4bc36d3
feat(rex7): derive the destroyed remainder from a conservation law
RealiCZ Aug 14, 2026
7cc03e9
refactor(rex7): name the call-stipend term after the mint that create…
RealiCZ Aug 15, 2026
2731ddd
feat(rex7): report the destroyed remainder derived at settlement
RealiCZ Aug 15, 2026
6d9eca8
test(rex7): cover the conservation law's terms in combination
RealiCZ Aug 15, 2026
c5ebe32
docs(rex7): define destroyed compute gas by the conservation law
RealiCZ Aug 15, 2026
b68a838
fix(rex7): keep block admission on the per-site compute lane
RealiCZ Aug 15, 2026
c702acb
chore: fix prettier formatting and refresh a drifted suppression line
RealiCZ Aug 17, 2026
4d3986f
chore: remove accidentally committed design reference material
RealiCZ Aug 17, 2026
7d8ac51
docs: split multi-sentence lines, name the KZG input length, fix two …
RealiCZ Aug 17, 2026
5a51e1f
docs(precompiles): require explicit work accounting for future haltin…
RealiCZ Aug 17, 2026
4a8af15
fix(rex7): key the KZG accounting arm on precompile identity
RealiCZ Aug 18, 2026
594d50e
test(rex7): reconcile the tracker lanes with the receipt on every tra…
RealiCZ Aug 18, 2026
2a71acf
fix(rex7): account for the envelope a failed deposit's receipt reports
RealiCZ Aug 18, 2026
52989f7
fix(state-test): list Rex6 and Rex7 in the --bench-spec error message
RealiCZ Aug 18, 2026
a265a52
fix(rex7): weigh a CREATE's code-deposit compute gas before recording it
RealiCZ Aug 20, 2026
b4d8d0c
fix(rex7): read the code-deposit charge off the active gas schedule
RealiCZ Aug 20, 2026
208861f
feat: reject a gas schedule that deviates from the spec's
RealiCZ Aug 20, 2026
f21d825
feat: reject a context whose two spec fields disagree
RealiCZ Aug 20, 2026
456a115
docs: gate the Rex7 code-deposit recording rules behind `<details>`
RealiCZ Aug 20, 2026
452997c
fix(rex7): book the envelope a refused frame init destroys
RealiCZ Aug 28, 2026
2ed8a45
fix(rex7): keep a halting CALL body's charges in the open segment
RealiCZ Aug 28, 2026
bb6814d
feat(state-test): judge an unstable spec against the frozen spec it i…
RealiCZ Aug 31, 2026
6784d21
feat(state-test): add `--diff-spec` and keep-going `--fill` to the CLI
RealiCZ Aug 31, 2026
1e7a27c
ci: sweep the EEST corpus against the unstable spec nightly
RealiCZ Aug 31, 2026
8a86fc4
fix(state-test): make the differential gate's evidence unforgeable
RealiCZ Aug 31, 2026
1648bf8
fix(state-test): count what a sweep judged, and re-derive that its co…
RealiCZ Aug 31, 2026
c78a095
feat(evm): wrap every inspector in a measurement shim
RealiCZ Aug 31, 2026
5112f5a
feat(rex7): book what an inspector does to the EVM's gas
RealiCZ Aug 31, 2026
133c693
feat(rex7): keep an inspector's gas out of enforcement and re-clamp a…
RealiCZ Aug 31, 2026
fc83755
feat(rex7): refuse an inspector's failed-to-successful create rewrite
RealiCZ Aug 31, 2026
a94a09f
test(rex7): pin the shapes a rewriting inspector can take
RealiCZ Aug 31, 2026
1f69448
docs: state the inspector term in the conservation law and what it do…
RealiCZ Aug 31, 2026
5b8eef9
docs(evm): state the refused create rewrite inline instead of linking…
RealiCZ Aug 31, 2026
f7c7e7f
refactor(evm): settle a frame once, after the last callback that can …
RealiCZ Aug 31, 2026
2bd7293
fix(evm): show an inspector the logs a precompile emitted
RealiCZ Aug 31, 2026
9224115
feat(rex7): roll a frame's state back with the frame-local revert it …
RealiCZ Aug 31, 2026
0eff221
test(rex7): pin the frame lifecycle end to end, on both loops
RealiCZ Aug 31, 2026
50a5148
test(rex7): pin the envelope an intercepted frame destroys
RealiCZ Aug 31, 2026
3a30b75
docs: state that a frame's state follows the result its caller is handed
RealiCZ Aug 31, 2026
0c78af4
chore(evm): drop the unused alloc alias from the frame module
RealiCZ Aug 31, 2026
6713104
refactor(limit): read every limit check off an explicit view of its t…
RealiCZ Sep 1, 2026
0ff7c72
feat(rex7): settle a late frame-local exceed before the pop that hide…
RealiCZ Sep 1, 2026
428f713
feat(rex7): hold a frame's journal decision until its result is final
RealiCZ Sep 1, 2026
e7535e2
test(rex7): pin the late frame-local exceed end to end
RealiCZ Sep 1, 2026
c4c8b64
docs: state that a late frame-local exceed is decided before the merge
RealiCZ Sep 1, 2026
a51fc70
perf(limit): hand the check bodies a reading to ask, not one to carry
RealiCZ Sep 1, 2026
2fa1b5b
refactor(limit): state the gas conservation law once, as one set of t…
RealiCZ Sep 1, 2026
520d623
feat(evm): report the inspector ledger on the transaction outcome
RealiCZ Sep 1, 2026
68a10fb
feat(block): refuse an inspector-adjusted transaction on the canonica…
RealiCZ Sep 1, 2026
831db52
test(block): run the two claims the guard's coverage rests on
RealiCZ Sep 1, 2026
69cec4b
test(rex7): sweep the inspector trait surface, callback by rewrite shape
RealiCZ Sep 1, 2026
875c9f9
feat(limit): route destroyed booking through an exhaustive Instructio…
RealiCZ Sep 1, 2026
ab6e4cc
feat(state-test): sweep the corpus under a deterministic rewriting in…
RealiCZ Sep 1, 2026
6891cdd
docs(evm): state the inspector contract as a per-shape table
RealiCZ Sep 1, 2026
9782cba
test(rex7): pin the two windows a rewrite lands in after its accounting
RealiCZ Sep 1, 2026
b632ff4
fix(evm): stop booking a counter edit that cannot reach the envelope
RealiCZ Sep 1, 2026
4fd8f63
fix(limit): settle a precompile's envelope against its final classifi…
RealiCZ Sep 1, 2026
6423162
feat(evm): book the rewrites an inspector makes that move no gas
RealiCZ Sep 1, 2026
a2273ae
chore(state-test): retire the two chaos triage switches
RealiCZ Sep 1, 2026
6eecfb6
docs(eest-sweep): drop the two retired chaos knobs from the runner's …
RealiCZ Sep 1, 2026
a781ddb
refactor(evm): key the precompile settlement on the staging, not on t…
RealiCZ Sep 1, 2026
df30c5d
test(rex7): pin the pending action as a gas-carrying surface
RealiCZ Sep 1, 2026
17d2e88
feat(evm): measure the gas an inspector writes into a pending action
RealiCZ Sep 1, 2026
cd19e8d
test(rex7): put the pending action in the cheat matrix
RealiCZ Sep 1, 2026
766b8dd
feat(state-test): add the pending-action shapes to the chaos pool
RealiCZ Sep 1, 2026
7876e4c
docs(evm): state the pending action as a measured surface
RealiCZ Sep 1, 2026
908a68e
test(rex7): pin a pending action's classification rewrite as an inter…
RealiCZ Sep 1, 2026
aa42a69
test(rex7): pin the gas a synthetic outcome carries
RealiCZ Sep 1, 2026
a747bdc
feat(evm): measure the gas an inspector's synthetic outcome carries
RealiCZ Sep 1, 2026
9d4cc6d
test(rex7): put a non-echoing interception in the cheat matrix
RealiCZ Sep 1, 2026
693955c
feat(state-test): add the non-echoing interception shapes to the chao…
RealiCZ Sep 1, 2026
946d443
docs(evm): close the gas-surface enumeration and pin it
RealiCZ Sep 1, 2026
fe8ace2
style(evm): unmangle the interception assert message
RealiCZ Sep 1, 2026
4ff0424
test(rex7): pin the interception lane on a frozen spec
RealiCZ Sep 1, 2026
ba09331
test(rex7): pin the refund and state-gas surfaces the ledger cannot see
RealiCZ Sep 1, 2026
6b5e007
feat(evm): measure the refund and the state gas an inspector writes
RealiCZ Sep 1, 2026
6b32771
test(rex7): put the receipt's other two numbers in the cheat matrix
RealiCZ Sep 1, 2026
114ecce
test(rex7): lock the gas-surface table against open gaps
RealiCZ Sep 1, 2026
e38076f
style(rex7): lift the refund columns' moment guard out of the match
RealiCZ Sep 1, 2026
9a619dc
feat(state-test): add the receipt's other two numbers to the chaos pool
RealiCZ Sep 1, 2026
e2ccd66
feat(evm): check the receipt's other two numbers against the lanes
RealiCZ Sep 1, 2026
f353e88
docs(evm): close the gas-surface enumeration on the receipt's other n…
RealiCZ Sep 1, 2026
c4c257a
test(rex7): pin the figures a synthetic outcome carries
RealiCZ Sep 1, 2026
8b0f856
test(rex7): pin the two lanes on a frozen spec
RealiCZ Sep 1, 2026
45d778e
Merge branch 'orch/rex7-t31-tripwire' into orch/rex7-t31-port
RealiCZ Sep 1, 2026
b3fcdd6
feat(evm): make the ledger see the rewrites a net-only reading admitted
RealiCZ Sep 2, 2026
18b5975
feat(state-test): put the four blind-spot shapes in the chaos pool, w…
RealiCZ Sep 2, 2026
b7000de
docs(evm): name MemoryGas as the second cautionary case in the closed…
RealiCZ Sep 2, 2026
cf60d7a
test(block-executor): the block path refuses a frame grown for free
RealiCZ Sep 2, 2026
8eb7d6e
docs(rex7): correct the blind-spot module's own count of what it pins
RealiCZ Sep 2, 2026
53b3df7
docs(evm): state what the working-set snapshot covers without overcla…
RealiCZ Sep 2, 2026
9688e9a
test(rex7): anchor the two shapes an all-zero ledger still admits
RealiCZ Sep 2, 2026
a293183
feat(evm): take every constant-time reading of the interpreter, not a…
RealiCZ Sep 2, 2026
90ce614
test(rex7): pin the interpreter's own field set against upstream's Debug
RealiCZ Sep 2, 2026
7d67456
feat(state-test): put the skipped opcode and the forged return buffer…
RealiCZ Sep 2, 2026
2df729a
docs(evm): state the O(1) reading rule and its upgrade obligation
RealiCZ Sep 2, 2026
4ef26e8
bench: add inspected-path rows to transact
RealiCZ Sep 2, 2026
750ab3c
test(rex7): pin the frame invariants against a per-frame comparison
RealiCZ Sep 2, 2026
c53b909
perf(evm): make the shim's per-callback measurement cheaper without t…
RealiCZ Sep 2, 2026
bed640e
feat(evm): refuse a classification rewrite of a result frame init pro…
RealiCZ Sep 2, 2026
c63e6b9
test(rex7): drive the frame-loop matrix through a rewriting inspector
RealiCZ Sep 2, 2026
44ccdce
feat(state-test): draw the refused init-result rewrite, and count it
RealiCZ Sep 2, 2026
1233ee7
docs(evm): give the init-result refusal a row and a reopening condition
RealiCZ Sep 2, 2026
e0a8908
feat(evm): let a read-only inspector declare itself and skip the meas…
RealiCZ Sep 2, 2026
2aaee70
test(rex7): pin a declared observer against a measured and an uninspe…
RealiCZ Sep 2, 2026
41494a2
feat(state-test): run the control declared, and compare all three
RealiCZ Sep 2, 2026
d2f9630
bench: add the declared-observer rows to transact
RealiCZ Sep 2, 2026
de480e4
docs(evm): give the declared observer a contract section
RealiCZ Sep 2, 2026
d81deaf
refactor(limit): drop the precompile settlement's unreachable conjure…
RealiCZ Sep 2, 2026
a82d5c8
test(rex7): pin the two rewrite surfaces nothing was checking
RealiCZ Sep 2, 2026
306cb25
refactor(evm): measure a frame's entry and its ending in one body each
RealiCZ Sep 2, 2026
2641614
fix(limit): book a staged gas edit's traffic where it is measured
RealiCZ Sep 2, 2026
399cbc2
docs(evm): cut the shim's rustdoc to its constraints
RealiCZ Sep 2, 2026
98c784f
docs(evm): correct the declared-observer fence, and check it where it…
RealiCZ Sep 2, 2026
2c1750a
style(evm): name the outcome case tuple, as the reading cases are named
RealiCZ Sep 2, 2026
cca43ef
docs(limit): cut the ledger's rustdoc, and correct the result lane
RealiCZ Sep 2, 2026
e8e40f5
docs(limit): compress the destroyed-remainder module's prose
RealiCZ Sep 2, 2026
472b361
docs(limit): tighten the inspector settlement prose, and drop a stale…
RealiCZ Sep 2, 2026
674458a
test(rex7): state the halting interception's traffic instead of readi…
RealiCZ Sep 2, 2026
e8283ea
docs(limit): keep the intra-doc link on one line
RealiCZ Sep 2, 2026
6851bd1
test(rex7): fold the suite's five transaction drivers into one
RealiCZ Sep 2, 2026
b68c38a
test(rex7): give the inspected fixtures one home
RealiCZ Sep 2, 2026
8d164bd
test(rex7): put the other four measurement files on the shared fixtures
RealiCZ Sep 2, 2026
0166cd4
test(rex7): route the two refusal files through the shared driver
RealiCZ Sep 2, 2026
0a07361
test(rex7): make the cheat matrix's grid data and its axes derived
RealiCZ Sep 2, 2026
6c8d9f8
test(rex7): collect the shim's tests into two files, by mechanism
RealiCZ Sep 2, 2026
fc66719
refactor(evm): book the shim's lanes through one borrow, and state th…
RealiCZ Sep 2, 2026
8021578
refactor(state-test): make the chaos shape pool one row per shape
RealiCZ Sep 2, 2026
4873aa5
test(rex7): hoist the six fixture builders the suite still wrote out …
RealiCZ Sep 2, 2026
48907a0
test(rex7): split the shim suite back into one file per mechanism
RealiCZ Sep 2, 2026
731d291
style: format AGENTS.md emphasis for prettier
RealiCZ Sep 2, 2026
edea4d1
chore(mutants): re-anchor the state_growth spec-gate suppressions to …
RealiCZ Sep 2, 2026
56836fc
test(equivalence): pin the frame settlement's EQUIVALENCE side, and s…
RealiCZ Sep 2, 2026
866762b
feat(block): admit an inspected transaction on a declaration, not on …
RealiCZ Sep 2, 2026
0abf71f
fix(chaos): derive a vector's seed from a corpus-relative identity
RealiCZ Sep 2, 2026
c483038
docs(spec): exclude code deposit from Rex7's unchanged-recording-site…
RealiCZ Sep 2, 2026
4957f7f
docs(spec): scope the failed-deposit zero-capacity rule to the rebuil…
RealiCZ Sep 2, 2026
0dc0a2f
refactor(block): drop the executor constructor that refuses every tra…
RealiCZ Sep 2, 2026
f79bba0
fix(evm): read the inspector declaration off the inspector, not off t…
RealiCZ Sep 2, 2026
bc09357
feat(evm): supply the declaration wrapper once, instead of a forwardi…
RealiCZ Sep 2, 2026
82cc5fe
fix(evm): compare a creation's inputs on their semantic fields, not t…
RealiCZ Sep 2, 2026
d80f890
fix(state-test): count file errors in the differential failure summary
RealiCZ Sep 2, 2026
3a4bdd9
test(state-test): prefix cli_exit tests with test_
RealiCZ Sep 2, 2026
cc3d47f
docs: retarget leftover shim_measurement.rs comments after the rex7 t…
RealiCZ Sep 2, 2026
a1fafcf
test(limit): cover the pre-pop peek, the inspector lanes and the term…
RealiCZ Sep 3, 2026
513c3f9
test(evm): cover the transaction tripwires, the frame-stack accessor …
RealiCZ Sep 3, 2026
230d2b1
chore(mutants): record six equivalent survivors with justifications
RealiCZ Sep 3, 2026
ee53a0d
test(diff): validate an inspected rerun before using its frame evidence
RealiCZ Sep 3, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 12 additions & 0 deletions .github/workflows/build-and-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,18 @@ jobs:
- name: Run Test
run: cargo test --workspace

# The EEST sweep runs nightly, but the cache guards it rests on are shell, and a change that
# breaks them would otherwise surface as a green sweep over a fraction of the corpus. The suite
# drives `run.sh` against a synthetic archive and a stub binary, so it needs no corpus and no
# build.
corpus-cache:
runs-on: ubuntu-24.04
timeout-minutes: 10
steps:
- uses: actions/checkout@v4
- name: Run corpus cache integrity suite
run: tools/eest-sweep/tests/cache_integrity.sh

no-std:
runs-on: ubuntu-24.04
timeout-minutes: 10
Expand Down
117 changes: 117 additions & 0 deletions .github/workflows/eest-nightly.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
name: EEST Nightly Sweep

# Runs the whole Ethereum execution-spec-tests state-test corpus through the mega-evm runner,
# nightly, under the unstable spec.
#
# Two questions, one pass. Does anything break — a fixture that trips a debug assertion or an
# internal invariant? And does the unstable spec still differ from the frozen spec it inherits
# from only where its own precision invariant permits? The second is what an unstable spec cannot
# get from fixtures alone: nobody has computed expected results for it, so the frozen spec is the
# only oracle available, and the invariant is what says when the two are allowed to disagree.
#
# Both are hard gates. Everything else — fixtures the runner declines before execution,
# differences the classifier accounts for — is reported and compared against a committed
# baseline, and drift there is a warning in the summary rather than a red run.
#
# Needs no secrets: it builds the repo and runs it against a public, hash-pinned corpus.

on:
schedule:
# Nightly at 04:00 UTC, after the mutation sweep's 03:00 slot.
- cron: "0 4 * * *"
# No spec inputs. The comparison is decided by Rex7's precision invariant, which relates Rex7 to
# Rex6 and states nothing about any other pair, so there is nothing here to choose: the runner
# refuses every other pair. When a later spec becomes the unstable one, its own invariant has to
# be written into the classifier, and the pair below changes with it.
workflow_dispatch:

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

permissions:
contents: read

jobs:
sweep:
name: EEST differential sweep
runs-on: ubuntu-24.04
# The sweep itself is minutes; the headroom is for a cold dependency build.
timeout-minutes: 90
env:
TARGET_SPEC: "Rex7"
BASE_SPEC: "Rex6"
steps:
- uses: actions/checkout@v4
with:
submodules: recursive

- name: Install Rust
uses: actions-rust-lang/setup-rust-toolchain@v1

- name: Install Foundry
uses: foundry-rs/foundry-toolchain@v1

- name: Read pinned corpus
id: corpus
run: |
# shellcheck disable=SC1091
. tools/eest-sweep/corpus.env
echo "release=$EEST_RELEASE" >> "$GITHUB_OUTPUT"
echo "sha256=$EEST_SHA256" >> "$GITHUB_OUTPUT"

# Keyed on the corpus hash, not on the release name, so an entry restored here always
# belongs to the release the sweep is pinned to.
#
# The key is not what makes the entry trustworthy. The cache holds both the archive and the
# tree unpacked from it; the archive is hash-verified on every run, and the tree — which is
# what the sweep actually reads — is restored from wherever a previous run left it, whole or
# not. What rules out sweeping a fraction of the corpus is on the other side: `run.sh`
# unpacks via a scratch directory and one rename, and records a manifest of every file it
# extracted with that file's hash. Before each run the tree is re-derived from its bytes and
# compared against that manifest; anything missing, added or edited discards the tree and
# unpacks it again.
- name: Cache corpus
uses: actions/cache@v4
with:
path: .eest-cache
key: eest-corpus-${{ steps.corpus.outputs.sha256 }}

# `hivetests` is optimized *and* keeps debug assertions live, which is the point: the Rex7
# gas-conservation cross-checks are `debug_assert!`s, and a release build would run the
# corpus without ever evaluating them.
- name: Build state-test
run: cargo build --profile hivetests -p state-test

- name: Run sweep
id: sweep
run: |
tools/eest-sweep/run.sh \
--no-build \
--target-spec "$TARGET_SPEC" \
--base-spec "$BASE_SPEC" \
--cache-dir .eest-cache \
--report-dir .eest-report

- name: Write job summary
if: always()
run: |
if [ -f .eest-report/diff-report.json ]; then
python3 tools/eest-sweep/summarize.py \
.eest-report/diff-report.json \
--baseline tools/eest-sweep/baseline.json \
>> "$GITHUB_STEP_SUMMARY"
else
echo "The sweep produced no report; see the job log." >> "$GITHUB_STEP_SUMMARY"
fi

- name: Upload report
if: always()
uses: actions/upload-artifact@v4
with:
name: eest-sweep-report
path: |
.eest-report/diff-report.json
.eest-report/sweep.log
if-no-files-found: warn
retention-days: 30
7 changes: 7 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,10 @@

# Python bytecode cache (scripts/)
__pycache__/

# EEST sweep working directories (tools/eest-sweep/run.sh): the hash-pinned corpus
# archive and the reports a run produces. Both are regenerable.
/.eest-cache
/.eest-report
# `--report-dir` names the directory, so a run that uses a different one leaves its own.
/.eest-report-*
Loading
Loading