Skip to content

Commit cac7d44

Browse files
Th0rgalclaude
andauthored
Retire EVMYulLean fork-conformance burn-in window (#1828)
* Retire EVMYulLean fork-conformance burn-in window The two-week `continue-on-error` burn-in window for the EVMYulLean fork-conformance probe ended on 2026-05-04 (issue #1722 plan C4). Today is 2026-05-11, so the burn-in gating in the workflow, its test, and the audit/trust docs is stale. - `.github/workflows/evmyullean-fork-conformance.yml`: drop the `BURN_IN_END_UTC` env var, drop `continue-on-error: true` on the probe step (failures now propagate naturally), simplify the "Report probe outcome" step to a pass/fail message, drop the dedicated "Fail after burn-in conformance failure" step, and drop the `Date.now() < burnInEnd` guard inside `open-drift-issue`. - `scripts/test_evmyullean_fork_conformance_workflow.py`: assert the workflow no longer mentions burn-in / `BURN_IN_END_UTC` / `continue-on-error` / `burnInEnd`, and relax the issue-step body assertion to a presence check; rename the relevant tests. - `AUDIT.md`, `AXIOMS.md`, `TRUST_ASSUMPTIONS.md`: replace burn-in language with the steady-state "scheduled or manual failures fail the workflow and open or update a GitHub issue" wording. Verified: `python3 -m unittest scripts.test_evmyullean_fork_conformance_workflow` passes (4/4), and `make check` passes end-to-end (802 tests). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Sync trust-file date stamps for burn-in retirement PR #1828 changed the CI-guard language in AUDIT.md, AXIOMS.md, and TRUST_ASSUMPTIONS.md but did not bump the Last Updated stamps. The synchronization non-negotiable (CLAUDE.md #1) covers date stamps for any CI-boundary change, so refresh them to 2026-05-12. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
1 parent d694305 commit cac7d44

5 files changed

Lines changed: 23 additions & 61 deletions

File tree

.github/workflows/evmyullean-fork-conformance.yml

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,8 @@ name: EVMYulLean fork conformance
88
# public EndToEnd EVMYulLean target still builds, and all 123 concrete
99
# `native_decide` bridge-equivalence tests still pass.
1010
#
11-
# Burn-in: the probe step is captured with `continue-on-error: true`
12-
# during the two-week window starting 2026-04-20 (see issue #1722 plan
13-
# C4 risk analysis). Before 2026-05-04 failures are reported as
14-
# warnings. After that cutoff, scheduled/manual failures open or update
15-
# a tracking issue and the job exits red.
11+
# On scheduled or manual failure the probe job exits red and the
12+
# follow-up job opens or updates a tracking issue.
1613

1714
on:
1815
schedule:
@@ -75,9 +72,6 @@ on:
7572
permissions:
7673
contents: read
7774

78-
env:
79-
BURN_IN_END_UTC: '2026-05-04T00:00:00Z'
80-
8175
concurrency:
8276
group: evmyullean-fork-conformance-${{ github.ref }}
8377
cancel-in-progress: ${{ github.event_name != 'schedule' }}
@@ -98,7 +92,6 @@ jobs:
9892

9993
- name: Run EVMYulLean fork conformance probe
10094
id: probe
101-
continue-on-error: true
10295
run: make test-evmyullean-fork
10396

10497
- name: Report probe outcome
@@ -107,22 +100,7 @@ jobs:
107100
if [ "${{ steps.probe.outcome }}" = "success" ]; then
108101
echo "::notice::EVMYulLean fork conformance probe passed."
109102
else
110-
now_epoch="$(date -u +%s)"
111-
burn_in_epoch="$(date -u -d "$BURN_IN_END_UTC" +%s)"
112-
if [ "$now_epoch" -lt "$burn_in_epoch" ]; then
113-
echo "::warning::EVMYulLean fork conformance probe failed during burn-in window (ends $BURN_IN_END_UTC). Investigate locally with 'make test-evmyullean-fork'."
114-
else
115-
echo "::error::EVMYulLean fork conformance probe failed after burn-in. Investigate locally with 'make test-evmyullean-fork'."
116-
fi
117-
fi
118-
119-
- name: Fail after burn-in conformance failure
120-
if: steps.probe.outcome != 'success'
121-
run: |
122-
now_epoch="$(date -u +%s)"
123-
burn_in_epoch="$(date -u -d "$BURN_IN_END_UTC" +%s)"
124-
if [ "$now_epoch" -ge "$burn_in_epoch" ]; then
125-
exit 1
103+
echo "::error::EVMYulLean fork conformance probe failed. Investigate locally with 'make test-evmyullean-fork'."
126104
fi
127105
128106
open-drift-issue:
@@ -135,27 +113,16 @@ jobs:
135113
steps:
136114
- name: Open or update drift issue
137115
uses: actions/github-script@v7
138-
env:
139-
BURN_IN_END_UTC: ${{ env.BURN_IN_END_UTC }}
140116
with:
141117
script: |
142-
const burnInEnd = Date.parse(process.env.BURN_IN_END_UTC);
143-
if (!Number.isFinite(burnInEnd)) {
144-
throw new Error(`Invalid BURN_IN_END_UTC: ${process.env.BURN_IN_END_UTC}`);
145-
}
146-
if (Date.now() < burnInEnd) {
147-
core.notice(`EVMYulLean probe failed during burn-in; no issue opened until ${process.env.BURN_IN_END_UTC}.`);
148-
return;
149-
}
150-
151118
const marker = "<!-- evmyullean-fork-conformance-failure -->";
152119
const owner = context.repo.owner;
153120
const repo = context.repo.repo;
154121
const runUrl = `${context.serverUrl}/${owner}/${repo}/actions/runs/${context.runId}`;
155122
const title = "EVMYulLean fork conformance probe failed";
156123
const bodyLines = [
157124
marker,
158-
"The EVMYulLean fork conformance probe failed after the burn-in window.",
125+
"The EVMYulLean fork conformance probe failed.",
159126
"",
160127
`Run: ${runUrl}`,
161128
`Workflow: ${context.workflow}`,

AUDIT.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,8 @@ theorem is proved.
5454
adapter report, rebuilds adapter correctness and the public EndToEnd
5555
EVMYulLean target, and runs the concrete bridge-equivalence tests.
5656
- `.github/workflows/evmyullean-fork-conformance.yml` runs the EVMYulLean fork
57-
conformance probe weekly. During the burn-in ending 2026-05-04, failures are
58-
warnings; after burn-in, scheduled/manual failures open or update a GitHub
59-
issue and fail the workflow.
57+
conformance probe weekly. Scheduled or manual failures fail the workflow and
58+
open or update a GitHub issue for drift triage.
6059

6160
## Update Checklist
6261

@@ -68,4 +67,4 @@ theorem is proved.
6867
command.
6968
5. Run `make check`; run targeted Lean builds for changed proof modules.
7069

71-
**Last Updated**: 2026-04-21
70+
**Last Updated**: 2026-05-12

AXIOMS.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -121,8 +121,8 @@ the EVM.
121121
public EndToEnd EVMYulLean target, and the concrete `native_decide`
122122
bridge-equivalence tests.
123123
- `.github/workflows/evmyullean-fork-conformance.yml` runs the conformance probe
124-
weekly; after the burn-in ending 2026-05-04, scheduled/manual failures fail
125-
the workflow and open or update a GitHub issue for drift triage.
124+
weekly; scheduled or manual failures fail the workflow and
125+
open or update a GitHub issue for drift triage.
126126

127127
## External Call Module (ECM) Assumptions
128128

@@ -204,4 +204,4 @@ Any commit that adds, removes, renames, or moves an axiom must update this file
204204

205205
If this file is stale, trust analysis is stale.
206206

207-
**Last Updated**: 2026-04-09
207+
**Last Updated**: 2026-05-12

TRUST_ASSUMPTIONS.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ Current theorem totals, property-test coverage, and proof status live in [docs/V
6060
- **Role**: Runtime execution model.
6161
- **Status (native transition in progress)**: 25 universal pure bridge theorems (all fully proven) in `Compiler/Proofs/YulGeneration/Backends/EvmYulLeanBridgeLemmas.lean`, plus 11 context/env/storage/helper builtin bridge theorems, cover the 36 builtin bridge cases used by the transition regressions. All pure bridge cases are now covered by universal symbolic lemmas. `EvmYulLeanRetarget.lean` now remains transition/regression evidence rather than public compiler-correctness authority. The public EndToEnd composition surface in `Compiler/Proofs/EndToEnd.lean` targets native `EvmYul.Yul.callDispatcher` execution through `Compiler.Proofs.YulGeneration.Backends.EvmYulLeanNativeHarness`: the public surface is `nativeResultsMatchOn`, `sourceResultMatchesNativeOn`, the source/native result-composition theorem over that native result surface, and the concrete SimpleStorage native theorem. The fuel-indexed `nativeIRRuntimeMatchesIR` seams are file-local. The legacy `YulGeneration.Preservation` contract preservation theorem and the higher-level function equivalence ladder in `YulGeneration.Equivalence` are file-local reference-oracle transition code, and root `Compiler.lean` no longer re-exports the legacy Yul proof stack. Deeper generated/supported-Yul preservation is not yet fully retargeted to native EVMYulLean; `ReferenceOracle.Semantics`, `legacyExecYulFuel`, and related fuel-based helpers remain inside the isolated legacy stack. Gas is not modeled.
6262
- **Trust boundary (EVMYulLean EndToEnd target)**: For the native EndToEnd path, the runtime authority is EVMYulLean dispatcher execution after Verity Yul is lowered by the native harness and projected onto the observable result surface. The remaining legacy preservation/equivalence stack is transition evidence only until its generated/supported-Yul proofs are rebuilt directly against native EVMYulLean execution.
63-
- **Fork dependency**: Verity pins [`lfglabs-dev/EVMYulLean`](https://github.com/lfglabs-dev/EVMYulLean), a fork of [`NethermindEth/EVMYulLean`](https://github.com/NethermindEth/EVMYulLean). The pinned commit is recorded in `lake-manifest.json` under the `evmyul` package. The exact divergence from upstream is enumerated in [`artifacts/evmyullean_fork_audit.json`](artifacts/evmyullean_fork_audit.json), regenerated by `scripts/generate_evmyullean_fork_audit.py` and validated by `make check`. As of the current pin, the fork is 2 commits ahead of `upstream/main` and 0 behind; both commits are non-semantic (one visibility change on an exponentiation accumulator, one Lean 4.22.0 deprecation fix), so upstream Ethereum conformance test coverage applies transitively. In addition to the `make check` validation, a weekly scheduled GitHub Actions workflow ([`.github/workflows/evmyullean-fork-conformance.yml`](.github/workflows/evmyullean-fork-conformance.yml)) runs `make test-evmyullean-fork`, which re-verifies the fork audit artifact against `lake-manifest.json`, checks the EVMYulLean adapter report, rebuilds adapter correctness, rebuilds the native transition harness and smoke tests, rebuilds the public EndToEnd EVMYulLean target, and rebuilds the universal bridge lemmas (25 proven) together with the 123 concrete `native_decide` bridge-equivalence tests (`EvmYulLeanBridgeTest`), surfacing any upstream drift as a run annotation during the two-week `continue-on-error` burn-in ending 2026-05-04 and then as a red workflow plus an automatically opened or updated GitHub issue for scheduled/manual failures.
63+
- **Fork dependency**: Verity pins [`lfglabs-dev/EVMYulLean`](https://github.com/lfglabs-dev/EVMYulLean), a fork of [`NethermindEth/EVMYulLean`](https://github.com/NethermindEth/EVMYulLean). The pinned commit is recorded in `lake-manifest.json` under the `evmyul` package. The exact divergence from upstream is enumerated in [`artifacts/evmyullean_fork_audit.json`](artifacts/evmyullean_fork_audit.json), regenerated by `scripts/generate_evmyullean_fork_audit.py` and validated by `make check`. As of the current pin, the fork is 2 commits ahead of `upstream/main` and 0 behind; both commits are non-semantic (one visibility change on an exponentiation accumulator, one Lean 4.22.0 deprecation fix), so upstream Ethereum conformance test coverage applies transitively. In addition to the `make check` validation, a weekly scheduled GitHub Actions workflow ([`.github/workflows/evmyullean-fork-conformance.yml`](.github/workflows/evmyullean-fork-conformance.yml)) runs `make test-evmyullean-fork`, which re-verifies the fork audit artifact against `lake-manifest.json`, checks the EVMYulLean adapter report, rebuilds adapter correctness, rebuilds the native transition harness and smoke tests, rebuilds the public EndToEnd EVMYulLean target, and rebuilds the universal bridge lemmas (25 proven) together with the 123 concrete `native_decide` bridge-equivalence tests (`EvmYulLeanBridgeTest`), surfacing any upstream drift as a red workflow plus an automatically opened or updated GitHub issue for scheduled/manual failures.
6464
- **Remaining gap for whole-program retargeting**: The public EndToEnd native surface is in place, but whole-program generated/supported-Yul preservation still needs to be rebuilt directly over native EVMYulLean execution. The legacy reference-oracle preservation/equivalence modules remain importable as isolated transition code, and the external-call/function-table family stays carved out of `BridgedSafeStmts`.
6565
- **Implication**: Semantic correctness does not imply gas-safety.
6666
- **Proxy note**: `delegatecall`-based proxy / upgradeability flows still sit outside the current proof-interpreter model. Archive `--trust-report` and use `--deny-proxy-upgradeability` when proxy semantics must remain outside the selected verified subset (issue `#1420`).
@@ -113,5 +113,5 @@ High-level semantics can expose intermediate state in reverted computations. EVM
113113

114114
---
115115

116-
**Last Updated**: 2026-04-20
116+
**Last Updated**: 2026-05-12
117117
**Maintainer Rule**: Update on every trust-boundary-relevant code change.

scripts/test_evmyullean_fork_conformance_workflow.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,16 @@ def test_concrete_bridge_test_count_matches_adapter_report(self) -> None:
3838
f"{path.relative_to(ROOT)} should not contain stale concrete bridge-test counts",
3939
)
4040

41-
def test_post_burn_in_failures_open_or_update_issue(self) -> None:
41+
def test_scheduled_failures_open_or_update_issue(self) -> None:
4242
text = WORKFLOW.read_text(encoding="utf-8")
4343

44-
self.assertIn("BURN_IN_END_UTC: '2026-05-04T00:00:00Z'", text)
44+
# The burn-in window ended 2026-05-04; the workflow now fails hard on
45+
# any probe failure and the drift issue is unconditionally opened or
46+
# updated for scheduled/manual runs.
47+
self.assertNotIn("BURN_IN_END_UTC", text)
48+
self.assertNotIn("burn-in", text)
49+
self.assertNotIn("burnInEnd", text)
50+
self.assertNotIn("continue-on-error", text)
4551
for path in [
4652
"Compiler/Proofs/EndToEnd.lean",
4753
"scripts/generate_evmyullean_adapter_report.py",
@@ -109,30 +115,20 @@ def test_post_burn_in_failures_open_or_update_issue(self) -> None:
109115
re.S,
110116
)
111117
self.assertIsNotNone(issue_step)
112-
body = issue_step.group("body")
113-
self.assertIn("Date.now() < burnInEnd", body)
114118

115-
fail_step = re.search(
116-
r"- name: Fail after burn-in conformance failure\n(?P<body>.*?)(?=\n - name:|\Z)",
117-
text,
118-
re.S,
119-
)
120-
self.assertIsNotNone(fail_step)
121-
self.assertIn('if [ "$now_epoch" -ge "$burn_in_epoch" ]; then', fail_step.group("body"))
122-
self.assertIn("exit 1", fail_step.group("body"))
123-
124-
def test_trust_assumptions_describe_post_burn_in_issue_path(self) -> None:
119+
def test_trust_assumptions_describe_scheduled_issue_path(self) -> None:
125120
text = TRUST_ASSUMPTIONS.read_text(encoding="utf-8")
126121
self.assertIn("weekly scheduled GitHub Actions workflow", text)
127-
self.assertIn("two-week `continue-on-error` burn-in ending 2026-05-04", text)
128122
self.assertIn("automatically opened or updated GitHub issue", text)
123+
self.assertNotIn("burn-in", text)
129124

130125
def test_axioms_document_non_axiom_evmyullean_controls(self) -> None:
131126
text = AXIOMS.read_text(encoding="utf-8")
132127
self.assertIn("## EVMYulLean Runtime Semantics (Non-Axiom)", text)
133128
self.assertIn("make test-evmyullean-fork", text)
134129
self.assertIn(".github/workflows/evmyullean-fork-conformance.yml", text)
135130
self.assertIn("open or update a GitHub issue", text)
131+
self.assertNotIn("burn-in", text)
136132

137133

138134
if __name__ == "__main__":

0 commit comments

Comments
 (0)