diff --git a/.github/workflows/base-std-fork-tests.yml b/.github/workflows/base-std-fork-tests.yml
deleted file mode 100644
index 6566050..0000000
--- a/.github/workflows/base-std-fork-tests.yml
+++ /dev/null
@@ -1,234 +0,0 @@
-name: Base Std Fork Tests
-
-on:
- pull_request:
- merge_group:
- workflow_dispatch:
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
- cancel-in-progress: true
-
-env:
- BASE_REF: main
- # Branch to clone; SHA below is pinned for reproducibility and verified after clone.
- BASE_ANVIL_BRANCH: base-anvil-fork
- BASE_ANVIL_SHA: 14a43909528eb7ff4bafab0e5fee9b3b651bcd50
- CARGO_TERM_COLOR: always
-
-permissions:
- contents: read
- pull-requests: write
-
-jobs:
- fork-tests:
- name: Base Std Fork Tests
- runs-on: ubuntu-latest
- timeout-minutes: 120
- # Advisory: base-std is the spec forerunner. Divergences mean base/base needs to catch up,
- # not that base-std is wrong. This job surfaces failures without blocking PR merges.
- continue-on-error: true
- steps:
- - name: Harden the runner (Audit all outbound calls)
- uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
- with:
- egress-policy: audit
-
- - name: Checkout base-std
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- with:
- fetch-depth: 1
- submodules: recursive
-
- - name: Free disk space
- shell: bash
- run: |
- sudo rm -rf /usr/local/lib/android
- sudo rm -rf /usr/share/dotnet
- sudo rm -rf /opt/ghc
- sudo rm -rf /usr/local/share/boost
- sudo rm -rf /opt/hostedtoolcache/CodeQL
- df -h
-
- - name: Install native dependencies
- uses: awalsh128/cache-apt-pkgs-action@5902b33ae29014e6ca012c5d8025d4346556bd40 # v1.4.3
- with:
- packages: libsqlite3-dev clang libclang-dev llvm llvm-dev build-essential pkg-config protobuf-compiler
- version: 1.4
-
- - name: Install Rust
- shell: bash
- run: |
- rustup default stable
- rustup show active-toolchain
-
- - name: Set LIBCLANG_PATH
- shell: bash
- run: |
- LLVM_BIN=$(command -v llvm-config || ls /usr/bin/llvm-config-* 2>/dev/null | sort -V | tail -1)
- LLVM_VERSION=$($LLVM_BIN --version | cut -d. -f1)
- echo "LIBCLANG_PATH=/usr/lib/llvm-${LLVM_VERSION}/lib" >> "$GITHUB_ENV"
-
- - name: Install mold
- uses: rui314/setup-mold@725a8794d15fc7563f59595bd9556495c0564878 # v1
-
- - name: Setup sccache
- uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9
-
- - name: Install Foundry
- uses: foundry-rs/foundry-toolchain@50d5a8956f2e319df19e6b57539d7e2acb9f8c1e # v1.5.0
- with:
- version: stable
-
- - name: Clone fork-test repositories
- shell: bash
- run: |
- set -euo pipefail
-
- workdir="$RUNNER_TEMP/base-std-fork-tests"
- rm -rf "$workdir"
- mkdir -p "$workdir"
-
- git clone --depth 1 --single-branch --branch "$BASE_REF" \
- https://github.com/base/base.git "$workdir/base"
-
- git clone --depth 1 --single-branch --branch "$BASE_ANVIL_BRANCH" \
- https://github.com/base/base-anvil.git "$workdir/base-anvil"
-
- actual_sha=$(git -C "$workdir/base-anvil" rev-parse HEAD)
- if [ "$actual_sha" != "$BASE_ANVIL_SHA" ]; then
- echo "::warning::base-anvil HEAD ($actual_sha) differs from pinned SHA ($BASE_ANVIL_SHA) — update BASE_ANVIL_SHA in the workflow"
- fi
-
- echo "BASE_DIR=$workdir/base" >> "$GITHUB_ENV"
- echo "BASE_ANVIL_DIR=$workdir/base-anvil" >> "$GITHUB_ENV"
-
- - name: Build patched base-anvil binaries
- shell: bash
- env:
- CARGO_PROFILE_RELEASE_LTO: "false"
- RUSTC_WRAPPER: "sccache"
- SCCACHE_GHA_ENABLED: "true"
- run: |
- set -euo pipefail
-
- cd "$BASE_ANVIL_DIR"
- rustup show active-toolchain
- cargo \
- --config "patch.\"https://github.com/base/base.git\".base-common-precompiles.path=\"$BASE_DIR/crates/common/precompiles\"" \
- --config "patch.\"https://github.com/base/base.git\".base-common-chains.path=\"$BASE_DIR/crates/common/chains\"" \
- build --release --no-default-features --features anvil/cli -p anvil -p forge
-
- "$BASE_ANVIL_DIR/target/release/anvil" --version
- "$BASE_ANVIL_DIR/target/release/forge" --version
-
- - name: Set up Python 3.13
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
- with:
- python-version: '3.13'
-
- - name: Set up fork-test runner venv
- shell: bash
- # setup-python makes python3 == 3.13; make python-check enforces it.
- run: make smoke-setup PYTHON=python3
-
- - name: Run base-std fork tests
- id: fork_tests
- shell: bash
- run: |
- set -euo pipefail
-
- ANVIL_BIN="$BASE_ANVIL_DIR/target/release/anvil" \
- FORGE_BIN="$BASE_ANVIL_DIR/target/release/forge" \
- ANVIL_LOG="$RUNNER_TEMP/base-std-anvil.log" \
- make fork-tests 2>&1 | tee "$RUNNER_TEMP/fork-test-output.txt"
- echo "fork_tests_exit=${PIPESTATUS[0]}" >> "$GITHUB_OUTPUT"
- continue-on-error: true
-
- - name: Summarize fork test results
- if: always()
- shell: bash
- run: |
- output="$RUNNER_TEMP/fork-test-output.txt"
- passed=$(grep -c '\[PASS\]' "$output" 2>/dev/null || true); passed=${passed:-0}
- failed=$(grep -c '\[FAIL' "$output" 2>/dev/null || true); failed=${failed:-0}
-
- {
- echo "## Fork Test Results"
- echo ""
- if [ "$failed" -eq 0 ]; then
- echo "✅ All **${passed}** tests passed — base/base is fully in sync with base-std."
- else
- echo "⚠️ **${failed}** test(s) failed, **${passed}** passed."
- echo ""
- echo "These failures indicate divergences where **base/base needs to catch up** to the base-std spec."
- echo "base-std PRs are not blocked by this check."
- echo ""
- echo "### Failing tests"
- echo '```'
- grep '\[FAIL' "$output" | sed 's/\x1B\[[0-9;]*m//g' || true
- echo '```'
- fi
- } >> "$GITHUB_STEP_SUMMARY"
-
- - name: Comment fork test results on PR
- if: github.event_name == 'pull_request' && always()
- shell: bash
- env:
- GH_TOKEN: ${{ github.token }}
- run: |
- output="$RUNNER_TEMP/fork-test-output.txt"
- passed=$(grep -c '\[PASS\]' "$output" 2>/dev/null || true); passed=${passed:-0}
- failed=$(grep -c '\[FAIL' "$output" 2>/dev/null || true); failed=${failed:-0}
- marker=""
-
- if [ ! -s "$output" ] || [ "$((passed + failed))" -eq 0 ]; then
- body="${marker}
- ### ❌ Fork tests did not run
- The build or setup step failed before any tests could execute. Check the [workflow logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details."
- elif [ "$failed" -eq 0 ]; then
- body="${marker}
- ### ✅ Fork tests: all ${passed} passed
- base/base is fully in sync with the base-std spec."
- else
- # Extract test name and full error for each failure, deduplicated
- failing=$(grep '\[FAIL' "$output" \
- | sed 's/\x1B\[[0-9;]*m//g' \
- | sed 's/^\[FAIL: \(.*\)\] \(.*\) (runs.*$/- **\2**: `\1`/' \
- | sort -u || true)
- body="${marker}
- ### ⚠️ Fork tests: ${failed} failed, ${passed} passed
-
- These failures indicate divergences where **base/base needs to catch up** to the base-std spec. This check is advisory and does not block merging.
-
-
- Failing tests
-
- ${failing}
-
- "
- fi
-
- pr="${{ github.event.pull_request.number }}"
- repo="${{ github.repository }}"
-
- # Find existing comment with our marker and update it, or post a new one
- existing_id=$(gh api "repos/${repo}/issues/${pr}/comments" \
- --jq ".[] | select(.body | startswith(\"${marker}\")) | .id" \
- | head -1)
-
- if [ -n "$existing_id" ]; then
- gh api "repos/${repo}/issues/comments/${existing_id}" \
- -X PATCH --field body="$body" > /dev/null
- else
- gh api "repos/${repo}/issues/${pr}/comments" \
- --field body="$body" > /dev/null
- fi
-
- - name: Upload anvil log
- if: always()
- uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
- with:
- name: base-std-anvil-log
- path: ${{ runner.temp }}/base-std-anvil.log
- if-no-files-found: ignore
diff --git a/.github/workflows/conformance-beryl.yml b/.github/workflows/conformance-beryl.yml
new file mode 100644
index 0000000..a852640
--- /dev/null
+++ b/.github/workflows/conformance-beryl.yml
@@ -0,0 +1,137 @@
+name: Conformance (shipped base/base)
+
+# ADVISORY, NEVER BLOCKING. Runs the base-std unit suite against the live Rust
+# precompiles from the *published* base-anvil build we ship (Beryl v1.1.0 at
+# launch) — no from-source compile, so it's fast enough for every PR. A failure
+# means base/base diverges from the base-std Solidity reference, not that this
+# PR is wrong; the signal is delivered as a PR comment, never a red check.
+# The "against base/base main" early-warning lives in conformance-main.yml.
+
+on:
+ pull_request:
+ merge_group:
+ workflow_dispatch:
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+ pull-requests: write
+
+env:
+ # Published base-anvil release to test against. Rolling `nightly` always
+ # points at the latest shipped build (Beryl at launch); pin to a specific
+ # `nightly-` here if you ever need a fixed target.
+ BASE_ANVIL_RELEASE: nightly
+
+jobs:
+ conformance-shipped:
+ name: "Conformance: shipped base/base (advisory)"
+ runs-on: ubuntu-latest
+ timeout-minutes: 20
+ # Advisory: never fails the run. Divergences are reported in a PR comment.
+ continue-on-error: true
+ steps:
+ - name: Harden the runner (audit egress)
+ uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
+ with:
+ egress-policy: audit
+
+ - name: Checkout base-std
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ fetch-depth: 1
+ submodules: recursive
+
+ - name: Download published base-anvil binaries
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ set -euo pipefail
+ dir="$RUNNER_TEMP/base-anvil-bin"
+ mkdir -p "$dir"
+ curl -fsSL -o "$dir/foundry.tar.gz" \
+ "https://github.com/base/base-anvil/releases/download/${BASE_ANVIL_RELEASE}/foundry_nightly_linux_amd64.tar.gz"
+ tar -xzf "$dir/foundry.tar.gz" -C "$dir"
+ echo "ANVIL_BIN=$dir/anvil" >> "$GITHUB_ENV"
+ echo "FORGE_BIN=$dir/forge" >> "$GITHUB_ENV"
+ "$dir/anvil" --version
+ # Record the base/base commit this build reproduces, for the report.
+ base_sha=$(gh release view "$BASE_ANVIL_RELEASE" --repo base/base-anvil --json body --jq .body \
+ | grep -oiE 'base/base[^0-9a-f]+[0-9a-f]{40}' | grep -oiE '[0-9a-f]{40}' | head -1 || true)
+ echo "BASE_SHA=${base_sha:-unknown}" >> "$GITHUB_ENV"
+
+ - name: Set up Python 3.13
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
+ with:
+ python-version: '3.13'
+
+ - name: Set up fork-test runner venv
+ shell: bash
+ run: make smoke-setup PYTHON=python3
+
+ - name: Run conformance suite (advisory)
+ shell: bash
+ run: |
+ set +e
+ ANVIL_LOG="$RUNNER_TEMP/anvil.log" make fork-tests 2>&1 | tee "$RUNNER_TEMP/out.txt"
+ # Advisory: do not fail the check. The PR comment carries the signal.
+ exit 0
+
+ - name: Report results (summary + PR comment)
+ if: always()
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ out="$RUNNER_TEMP/out.txt"
+ passed=$(grep -c '\[PASS\]' "$out" 2>/dev/null || true); passed=${passed:-0}
+ failed=$(grep -c '\[FAIL' "$out" 2>/dev/null || true); failed=${failed:-0}
+ marker=""
+
+ if [ ! -s "$out" ] || [ "$((passed + failed))" -eq 0 ]; then
+ body="${marker}
+ ### Conformance (shipped base/base): did not run
+ The download or setup step failed before any tests executed — this is a CI/infra issue, not a divergence. See the [run logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }})."
+ elif [ "$failed" -eq 0 ]; then
+ body="${marker}
+ ### ✅ Conformance (shipped base/base): all ${passed} passed
+ The shipped base-anvil build (base/base \`${BASE_SHA}\`) matches the base-std reference. _Advisory — never blocks._"
+ else
+ failing=$(grep '\[FAIL' "$out" | sed 's/\x1B\[[0-9;]*m//g' \
+ | sed 's/^\[FAIL: \(.*\)\] \(.*\) (runs.*$/- **\2**: `\1`/' | sort -u || true)
+ body="${marker}
+ ### ⚠️ Conformance (shipped base/base): ${failed} diverged, ${passed} passed
+
+ Ran the base-std suite against the live Rust precompiles from the shipped base-anvil build (base/base \`${BASE_SHA}\`). These are points where **base/base diverges from the base-std Solidity reference** — base/base needs to catch up, *not* a problem with this PR. **Advisory: does not block merge.**
+
+ Diverging tests
+
+ ${failing}
+
+ "
+ fi
+
+ { echo "## Conformance (shipped base/base)"; echo ""; echo "$body" | sed '1d'; } >> "$GITHUB_STEP_SUMMARY"
+
+ if [ "${{ github.event_name }}" = "pull_request" ]; then
+ pr="${{ github.event.pull_request.number }}"; repo="${{ github.repository }}"
+ existing=$(gh api "repos/${repo}/issues/${pr}/comments" \
+ --jq ".[] | select(.body | startswith(\"${marker}\")) | .id" | head -1)
+ if [ -n "$existing" ]; then
+ gh api "repos/${repo}/issues/comments/${existing}" -X PATCH --field body="$body" > /dev/null
+ else
+ gh api "repos/${repo}/issues/${pr}/comments" --field body="$body" > /dev/null
+ fi
+ fi
+
+ - name: Upload anvil log
+ if: always()
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: conformance-shipped-anvil-log
+ path: ${{ runner.temp }}/anvil.log
+ if-no-files-found: ignore
diff --git a/.github/workflows/conformance-main.yml b/.github/workflows/conformance-main.yml
new file mode 100644
index 0000000..bf3e6e7
--- /dev/null
+++ b/.github/workflows/conformance-main.yml
@@ -0,0 +1,154 @@
+name: Conformance (base/base main)
+
+# ADVISORY EARLY-WARNING. Builds base-anvil from source against base/base *main*
+# HEAD and runs the base-std suite against it, to catch divergences in
+# bleeding-edge base/base before it ships. Slow (compiles Foundry), so it runs
+# on a schedule rather than per-PR. Divergences here are expected while base/base
+# is mid-development — this is a monitor, not a gate, and never runs on PRs.
+# The fast per-PR check against the *shipped* build lives in conformance-beryl.yml.
+
+on:
+ schedule:
+ - cron: "0 7 * * *"
+ workflow_dispatch:
+
+concurrency:
+ group: ${{ github.workflow }}
+ cancel-in-progress: true
+
+env:
+ BASE_REF: main
+ BASE_ANVIL_BRANCH: base-anvil-fork
+ CARGO_TERM_COLOR: always
+
+permissions:
+ contents: read
+
+jobs:
+ conformance-main:
+ name: "Conformance: base/base main (advisory)"
+ runs-on: ubuntu-latest
+ timeout-minutes: 120
+ continue-on-error: true
+ steps:
+ - name: Harden the runner (audit egress)
+ uses: step-security/harden-runner@9af89fc71515a100421586dfdb3dc9c984fbf411 # v2.19.4
+ with:
+ egress-policy: audit
+
+ - name: Checkout base-std
+ uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
+ with:
+ fetch-depth: 1
+ submodules: recursive
+
+ - name: Free disk space
+ shell: bash
+ run: |
+ sudo rm -rf /usr/local/lib/android /usr/share/dotnet /opt/ghc \
+ /usr/local/share/boost /opt/hostedtoolcache/CodeQL
+ df -h
+
+ - name: Install native dependencies
+ uses: awalsh128/cache-apt-pkgs-action@5902b33ae29014e6ca012c5d8025d4346556bd40 # v1.4.3
+ with:
+ packages: libsqlite3-dev clang libclang-dev llvm llvm-dev build-essential pkg-config protobuf-compiler
+ version: 1.4
+
+ - name: Install Rust
+ shell: bash
+ run: rustup default stable && rustup show active-toolchain
+
+ - name: Set LIBCLANG_PATH
+ shell: bash
+ run: |
+ LLVM_BIN=$(command -v llvm-config || ls /usr/bin/llvm-config-* 2>/dev/null | sort -V | tail -1)
+ LLVM_VERSION=$($LLVM_BIN --version | cut -d. -f1)
+ echo "LIBCLANG_PATH=/usr/lib/llvm-${LLVM_VERSION}/lib" >> "$GITHUB_ENV"
+
+ - name: Install mold
+ uses: rui314/setup-mold@725a8794d15fc7563f59595bd9556495c0564878 # v1
+
+ - name: Setup sccache
+ uses: mozilla-actions/sccache-action@7d986dd989559c6ecdb630a3fd2557667be217ad # v0.0.9
+
+ - name: Clone base/base + base-anvil
+ shell: bash
+ run: |
+ set -euo pipefail
+ workdir="$RUNNER_TEMP/conformance-main"
+ rm -rf "$workdir"; mkdir -p "$workdir"
+ git clone --depth 1 --single-branch --branch "$BASE_REF" \
+ https://github.com/base/base.git "$workdir/base"
+ git clone --depth 1 --single-branch --branch "$BASE_ANVIL_BRANCH" \
+ https://github.com/base/base-anvil.git "$workdir/base-anvil"
+ echo "BASE_DIR=$workdir/base" >> "$GITHUB_ENV"
+ echo "BASE_ANVIL_DIR=$workdir/base-anvil" >> "$GITHUB_ENV"
+ echo "BASE_SHA=$(git -C "$workdir/base" rev-parse HEAD)" >> "$GITHUB_ENV"
+
+ - name: Build base-anvil against base/base main
+ shell: bash
+ env:
+ CARGO_PROFILE_RELEASE_LTO: "false"
+ RUSTC_WRAPPER: "sccache"
+ SCCACHE_GHA_ENABLED: "true"
+ run: |
+ set -euo pipefail
+ cd "$BASE_ANVIL_DIR"
+ cargo \
+ --config "patch.\"https://github.com/base/base.git\".base-common-precompiles.path=\"$BASE_DIR/crates/common/precompiles\"" \
+ --config "patch.\"https://github.com/base/base.git\".base-common-chains.path=\"$BASE_DIR/crates/common/chains\"" \
+ build --release --no-default-features --features anvil/cli -p anvil -p forge
+ "$BASE_ANVIL_DIR/target/release/anvil" --version
+
+ - name: Set up Python 3.13
+ uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
+ with:
+ python-version: '3.13'
+
+ - name: Set up fork-test runner venv
+ shell: bash
+ run: make smoke-setup PYTHON=python3
+
+ - name: Run conformance suite against base/base main (advisory)
+ shell: bash
+ run: |
+ set +e
+ ANVIL_BIN="$BASE_ANVIL_DIR/target/release/anvil" \
+ FORGE_BIN="$BASE_ANVIL_DIR/target/release/forge" \
+ ANVIL_LOG="$RUNNER_TEMP/anvil.log" \
+ make fork-tests 2>&1 | tee "$RUNNER_TEMP/out.txt"
+ exit 0
+
+ - name: Report results (step summary)
+ if: always()
+ shell: bash
+ run: |
+ out="$RUNNER_TEMP/out.txt"
+ passed=$(grep -c '\[PASS\]' "$out" 2>/dev/null || true); passed=${passed:-0}
+ failed=$(grep -c '\[FAIL' "$out" 2>/dev/null || true); failed=${failed:-0}
+ {
+ echo "## Conformance: base/base main"
+ echo ""
+ echo "Built base-anvil against base/base \`${BASE_SHA}\` (main HEAD)."
+ echo ""
+ if [ "$((passed + failed))" -eq 0 ]; then
+ echo "Did not run — see logs (build/setup issue, not a divergence)."
+ elif [ "$failed" -eq 0 ]; then
+ echo "✅ All ${passed} passed — base/base main is in sync with the base-std reference."
+ else
+ echo "⚠️ ${failed} diverged, ${passed} passed. These are points where base/base **main** has drifted from the base-std reference — an early warning for base/base to catch up before shipping. Advisory only."
+ echo ""
+ echo '```'
+ grep '\[FAIL' "$out" | sed 's/\x1B\[[0-9;]*m//g' || true
+ echo '```'
+ fi
+ } >> "$GITHUB_STEP_SUMMARY"
+
+ - name: Upload anvil log
+ if: always()
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: conformance-main-anvil-log
+ path: ${{ runner.temp }}/anvil.log
+ if-no-files-found: ignore
diff --git a/README.md b/README.md
index a75ca4d..7b0e1db 100644
--- a/README.md
+++ b/README.md
@@ -99,6 +99,29 @@ ActivationRegistry, (2) the precompile isn't deployed at its canonical
address on the forked chain, or (3) the Rust impl's storage layout /
behavior diverges from the Solidity reference at the asserted slot.
+### Reading CI checks
+
+base-std CI has two kinds of checks, and the distinction tells you whether a red
+check is yours to fix:
+
+- **base-std correctness (blocking).** `Build`, `Test`, `Format`, the coverage
+ checks, and CodeQL verify the library and the Solidity reference suite (run
+ against the mocks — "reference mode"). These are required; a failure is a real
+ base-std bug to fix before merge.
+- **Conformance (advisory, never blocking).** The `Conformance: …` jobs run the
+ same suite against the live Rust precompiles to check that base/base matches
+ the reference. A failure means base/base diverges — base/base's job to catch
+ up, not a problem with your PR. These never show a red check; the result is
+ posted as a PR comment instead.
+ - `Conformance: shipped base/base` runs on every PR against the published
+ base-anvil build we ship (fast; Beryl at launch). It should pass.
+ - `Conformance: base/base main` runs on a schedule against bleeding-edge
+ base/base (built from source). Divergences there are an expected early
+ warning during base/base development.
+
+Rule of thumb: **a red check is always something to fix; conformance divergences
+arrive as a PR comment, never a red check.**
+
## License
MIT