Write Tests
DataDog/datadog-ci
Write tests for datadog-ci commands and helpers using established repository patterns.
Write consensus tests using repository patterns and fixtures.
$ npx skills add ethereum/execution-specs --skill write-test -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install ethereum/execution-specs write-test --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/ethereum/execution-specs.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/write-test .claude/skills/write-test && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "write-test" agent skill from https://github.com/ethereum/execution-specs/tree/forks%2Fbogota/.agents/skills/write-test into .claude/skills/write-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-test", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/ethereum/execution-specs/tree/forks%2Fbogota/.agents/skills/write-testType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add ethereum/execution-specs --skill write-test -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install ethereum/execution-specs write-test --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ethereum/execution-specs.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/write-test .agents/skills/write-test && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "write-test" agent skill from https://github.com/ethereum/execution-specs/tree/forks%2Fbogota/.agents/skills/write-test into .agents/skills/write-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-test", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ethereum/execution-specs --skill write-test -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install ethereum/execution-specs write-test --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ethereum/execution-specs.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/write-test .cursor/skills/write-test && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "write-test" agent skill from https://github.com/ethereum/execution-specs/tree/forks%2Fbogota/.agents/skills/write-test into .cursor/skills/write-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-test", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/ethereum/execution-specs.git --path .agents/skills/write-test--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add ethereum/execution-specs --skill write-test -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install ethereum/execution-specs write-test --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ethereum/execution-specs.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/write-test .gemini/skills/write-test && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "write-test" agent skill from https://github.com/ethereum/execution-specs/tree/forks%2Fbogota/.agents/skills/write-test into .gemini/skills/write-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-test", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install ethereum/execution-specs write-testInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add ethereum/execution-specs --skill write-test -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/ethereum/execution-specs.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/write-test .github/skills/write-test && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "write-test" agent skill from https://github.com/ethereum/execution-specs/tree/forks%2Fbogota/.agents/skills/write-test into .github/skills/write-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-test", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add ethereum/execution-specs --skill write-test -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install ethereum/execution-specs write-test --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/ethereum/execution-specs.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/write-test .opencode/skills/write-test && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "write-test" agent skill from https://github.com/ethereum/execution-specs/tree/forks%2Fbogota/.agents/skills/write-test into .opencode/skills/write-test/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "write-test", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
write-testWrite consensus tests using repository patterns and fixtures.
Write Test is an agent skill from ethereum/execution-specs. Write consensus tests using repository patterns and fixtures.
Its SKILL.md is about 4.6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Testing & QA, covering Test generation and Design patterns. The repository describes itself as: Specification for the Execution Layer. Tracking network upgrades. The licence is CC0-1.0.
Read from SKILL.md and the folder at commit d7a84b8. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
ghuvFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use gh and uv, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Write Test loads about 4.6k tokens when it runs. Until then it costs about 18 tokens; SKILL.md has 2,467 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from ethereum/execution-specs at commit d7a84b8, republished under its CC0-1.0 licence (© ethereum). 2,467 words, ~4,634 tokens.
.claude/skills/write-test/SKILL.md (or your agent's skills folder).Conventions and patterns for writing consensus tests. Run this skill before writing or modifying tests.
execution_testing — it is the public APIpre: Alloc (pre-state builder), state_test: StateTestFiller, blockchain_test: BlockchainTestFiller, fork: Forkstate_test for single-transaction tests; fill auto-derives a blockchain_test from each, so no coverage is lost.blockchain_test when the test needs more than one transaction (a state_test holds exactly one), more than one block (e.g. transaction-ordering or fork-transition tests), or calls a system contract: a state test's pre-alloc lacks the predeploys a fork lists only in pre_allocation_blockchain(), so the CALL hits an empty account and the test passes vacuously.Block to reach blockchain_test. A state_test can assert the transaction's gas used and receipt logs (the tx's expected_receipt=TransactionReceipt(cumulative_gas_used=...)), reserve state gas (the tx's state_gas_reservoir=), and other block-header fields (blockchain_test_header_verify=Header(...)) without it.fork.*() accessor, a mixin ClassVar, a covariant marker) instead of building it in the test. Importing a helper from a sibling test_*.py is the sign it belongs somewhere shared: the framework for protocol logic, conftest.py for fixtures, a helper module next to the tests for scenario-specific code.pre.fund_eoa() — create funded EOA, returns Address. Accepts amount=, nonce=. With amount=0 nothing is added to the pre-alloc; you get a fresh, nonexistent address.pre.deploy_contract(code=..., storage={...}) — deploy contract, returns Addresspre directly. The one exception is overriding a predeploy's code, pre[addr] = Account(...) under @pytest.mark.pre_alloc_mutable. It replaces the whole account, and every field you leave out takes the Account default (nonce 0, zero balance, empty storage), so pass the ones the scenario needs. The marker skips the test in execute mode, so reserve it for scenarios a live chain cannot host.Op.SSTORE(key, value), Op.CALL(gas, addr, ...), etc. — concatenate with +Op.PUSH32(val) + Op.PUSH32(val) + Op.EXP for stack setupOm.OOG (consumes all gas), Om.MSTORE(data, offset) (arbitrary-length memory store)GasConsumer(gas=n, fork=fork) burns exactly n gas and falls through; GasConsumer.out_of_gas(fork) always runs out. Both are priced against the fork, so use them instead of sizing a burn by hand (JUMPDEST padding, a large MSTORE offset). After code that has already expanded memory, pass previous_memory_size= or the burn comes out short.Op.BALANCE(address=0x1234, address_warm=True), Op.SSTORE(key=1, value=0, key_warm=True, original_value=1, new_value=0) — see docs/writing_tests/opcode_metadata.mdbytecode.gas_cost(fork) — calculates exact gas for a bytecode sequence using opcode metadata. Use this instead of manually computing gasstorage = Storage() then storage.store_next(expected_value) — auto-increments slotOp.SSTORE(storage.store_next(sender), Op.ORIGIN) — build bytecode + expected storage in one steppost = {contract: Account(storage=storage)}Account(storage=...) compares storage exhaustively: any slot you omit must be zero. Opt an omitted key out with storage.set_expect_any(key).Every Amsterdam+ fixture carries a BAL whether or not the test asserts one. An expected_block_access_list= is a fill-time check that the spec built the BAL you predicted, so write one when the access pattern is the point of the test or a known edge (a revert, a system call, a withdrawal, a self-destruct), not by default. When you do write one, pair it with a post witness: the BAL records access, not outcome, so a transaction that ran and failed still merges its touches and satisfies the expectation, and only post tells the two apart.
[] asserts empty, and a non-empty list matches as an ordered subsequence (extra actual entries are skipped; yours must appear in order). BalAccountExpectation() with no field set raises; use .empty() for an account with no changes and {address: None} to assert an address is absent.tests/amsterdam/eip7928_block_level_access_lists/test_cases.md and read that test. A scenario with no row is a coverage gap worth reporting.@pytest.mark.valid_from("ForkName") — mandatory on every test@pytest.mark.valid_until("ForkName") — test only valid up to a fork@pytest.mark.with_all_tx_types — parametrize across all tx types@pytest.mark.with_all_call_opcodes — parametrize CALL/CALLCODE/DELEGATECALL/STATICCALL@pytest.mark.with_all_system_contracts, with_all_precompiles, with_all_system_contract_request_types (yields the request class as request_class), … — parametrize over a fork-derived set; selector=lambda value: ... narrows any with_all_* marker. Check docs/writing_tests/test_markers.md for the full list before writing out protocol values by hand.@pytest.mark.slow — excluded by default in fill@pytest.mark.exception_test — marks tests expecting exceptions.pytest.param(..., marks=...), not the function: exception_test on the function fails the passing cases, and a function-level EIPChecklist item stays green after the one case that proved it is deleted.fork.is_eip_enabled(N) for behaviour an EIP introduces; EIPs move between forks, so fork >= Cancun is only for facts about the fork itselffork.fork_at(timestamp=...) gives the fork active before/after a transition boundaryfork.gas_costs() constants directlyAn expectation is what fill checks. Each lives on one object:
| On | Field |
|---|---|
Transaction | error=, expected_receipt=TransactionReceipt(...) |
Block | exception=, header_verify=Header(...), expected_block_access_list= |
StateTest | blockchain_test_header_verify=Header(...), expected_block_access_list= |
post | Account(storage=..., balance=..., nonce=..., code=...) |
Choose each so it holds only if the behavior under test happened; then the fill fails when that behavior stops instead of writing a fixture that passes for another reason.
fill instead of quietly producing a new fixture.cumulative_gas_used equal to the gas_limit the test itself set, a storage slot expected to be zero when zero is also the untouched value, an Account.NONEXISTENT that a mis-wired setup would produce anyway: each of these passes just as happily under the wrong behavior. Give the transaction slack above the boundary so the charged amount cannot equal the limit, pre-set the witness slot to a sentinel, and assert the created address you actually expect. pre.deploy_contract(code, storage=storage.canary()) pre-sets every slot expected to be zero; it also changes each slot's original value, so a gas-sensitive test must price its SSTOREs with that.consume does not protect the fixture. When the discriminating fact cannot appear in the fixture, assert the premise in the test body: a plain assert on which of two thresholds binds, or a helper asserting the preconditions its boundary rests on, fails the fill the moment the assumption stops holding.len(slots) * COST, compute it from the same slots the expectation checks, so the two cannot drift apart.gas_used with header_verify=Header(...).set_expect_any on it.CALL result, a BALANCE, GAS or EXTCODESIZE reading only exists while the code runs; SSTORE it into a witness slot and assert that slot in post (storage.store_next(expected) builds the code and the expectation together).Never hand-reconstruct a gas amount by summing fork.gas_costs() constants (NEW_ACCOUNT, CALL_VALUE, COLD_STORAGE_WRITE, VERY_LOW, ...). Re-deriving the schedule duplicates the framework's own calculation and silently breaks when a future fork reprices. Instead:
account_new, value_transfer, address_warm, key_warm/original_value/current_value/new_value, init_code_size, code_deposit_size, new_memory_size, ...) and use bytecode.gas_cost(fork) (execution + state), .execution_cost(fork), .state_cost(fork), or .refund(fork). Link the exact opcode to the behavior — e.g. Op.SELFDESTRUCT(account_new=True).state_cost(fork).fork.transaction_intrinsic_cost_calculator(); fork.transaction_top_frame_state_gas(contract_creation=True) for the created account's NEW_ACCOUNT (under EIP-2780 it is NOT part of the intrinsic — never subtract it from the intrinsic); fork.transaction_data_floor_cost_calculator() (pass contract_creation=True for a creation transaction, or the floor misses any creation adjustment the fork makes); fork.call_value_stipend().fork.transaction_intrinsic_cost_calculator() returns max(standard_intrinsic, calldata_floor), and on a data-heavy transaction the floor wins by a wide margin. Compute both — return_cost_deducted_prior_execution=True for the standard cost, fork.transaction_data_floor_cost_calculator() for the floor — set the gas limit from the threshold under test, assert it is the greater of the two, and expect that threshold's rejection: INTRINSIC_GAS_BELOW_FLOOR_GAS_COST for the floor, INTRINSIC_GAS_TOO_LOW for the standard cost.Op.BALANCE.with_metadata(address_warm=False).gas_cost(fork).before = fork.fork_at(timestamp=...), after = ...) and compare before vs after costs — do not compare raw schedule constants.fork.gas_costs() decomposition of the same fork; they add no coverage over the runtime behavior the test already exercises and only break on repricing.CodeGasMeasure) against fork.gas_costs().OPCODE_*. Even then, never hardcode the literal value.gas_limit. It auto-fills so the transaction executes in full without running out of gas.gas_limit explicitly for gas-sensitive tests (intrinsic-gas boundaries, OOG, code-deposit limits, or gas metering).gas_limit=fork.transaction_gas_limit_cap() boilerplate is now redundant.gas_limit, so calling a contract whose code is GasConsumer.out_of_gas(fork) fixes its gas used at a chosen value without any cost arithmetic.error=TransactionException.INTRINSIC_GAS_TOO_LOW to TransactionGAS_ALLOWANCE_EXCEEDED, NONCE_MISMATCH_TOO_LOW, INSUFFICIENT_ACCOUNT_FUNDSerror=[A, B]. Use a list only when a second violation cannot be avoided and the spec leaves the check order open, with a comment saying why each exception is valid.tests/<fork>/eip<number>/ where <fork> is the fork that introduced the functionalityspec.py with ReferenceSpec(git_path=..., version=...) and test files declaring REFERENCE_SPEC_GIT_PATH / REFERENCE_SPEC_VERSION. version is the EIP file's blob SHA (gh api repos/ethereum/EIPs/contents/EIPS/eip-N.md --jq .sha); uv run check_eip_versions <path> flags stale versions.is_eip_enabled branch, and amend it; write a new test in the new module only when the branches would cost more readability than the extra fork coverage buys.conftest.py for shared fixtures within an EIP directory@pytest.mark.parametrize("name", [pytest.param(val, id="label"), ...]) with descriptive id= stringsif/elif and else: raise ValueError(...); an else that is a real case silently absorbs values added later.with_all_* marker, narrowed with selector= when only part of the set can reach the behaviour (only CALL and CALLCODE carry a value, so only they can fail a sender-balance check). The nearest test proving the same rule for one member usually already carries the marker, so read a model test's decorators and not just its body. If no marker covers a real family, propose a covariant marker (covariant_decorator in packages/testing/src/execution_testing/cli/pytest_commands/plugins/forks/forks.py) in its own change rather than hand-writing the list in the test.Plain pytest. Tests are co-located with each module under packages/testing/src/execution_testing/ in a sibling tests/ directory. When adding a guardrail or validation, verify the tests fail without the change and pass with it.
After writing or modifying tests, ask the user: "Would you like me to load the /fill-tests skill to verify the new tests fill correctly? (This loads an additional skill into context.)" If they agree, run /fill-tests, fill the new tests, then inspect the generated fixture JSON to verify the fixture contents match what the test intends.
See docs/writing_tests/ and docs/writing_tests/opcode_metadata.md for detailed documentation.
© ethereum, CC0-1.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/write-test of ethereum/execution-specs.
Open the folder on GitHubat commit d7a84b8
Write Test next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Write Test this skillethereum/execution-specs | 1.2k | — | ~4.6k | Automated safety check: Pass | CC0-1.0 | |
| Write TestsDataDog/datadog-ci | 161 | — | ~435 | Automated safety check: Pass | Apache-2.0 | |
| Console Testingsynnaxlabs/synnax | 128 | — | ~5.4k | Automated safety check: Pass | Custom licence | |
| Azure App TestingMicrosoftDocs/Agent-Skills | 775 | — | ~3.6k | Automated safety check: Pass | CC-BY-4.0 | |
| Clean PytestLeoYeAI/openclaw-master-skills | 2.2k | — | ~4.2k | Automated safety check: Pass | MIT | |
| Test Design Patternsrevfactory/harness-100 | 1.3k | — | ~1.3k | Automated safety check: Pass | Apache-2.0 |
DataDog/datadog-ci
Write tests for datadog-ci commands and helpers using established repository patterns.
synnaxlabs/synnax
Rules for writing and editing unit tests in the Console (console/src//.spec.ts[x]).
MicrosoftDocs/Agent-Skills
Expert knowledge for Azure App Testing development including troubleshooting, best practices, decision making, architecture & design patterns, limits & quotas, security, configuration, integrations…
LeoYeAI/openclaw-master-skills
Write clean, maintainable pytest tests using Fake-based testing, contract testing, and dependency injection patterns.
revfactory/harness-100
Patterns for effective test design, including boundary value analysis, equivalence partitioning, state transition testing, and other systematic test case derivation methodologies.
JasonMa0012/MooaToon
A skill your agent uses when writing or modifying UE automated tests (Automation, CQTest, Functional, Gauntlet, LowLevel) with Rider MCP available.
ethereum/execution-specs
Run locally filled fixtures against execution clients with a selected Hive simulator and a network client configuration from hive-tests.
ethereum/execution-specs
Track EIP test coverage with the repository checklist system.
ethereum/execution-specs
Fill test fixtures with the repository fill command. An agent skill from ethereum/execution-specs.
ethereum/execution-specs
Audit grammar in documentation and code comments. An agent skill from ethereum/execution-specs.
ethereum/execution-specs
Implement EIP specification changes using repository conventions.
ethereum/execution-specs
Write and run isolated pytester-based plugin tests. An agent skill from ethereum/execution-specs.
Categories
Write consensus tests using repository patterns and fixtures. Write Test is an agent skill from ethereum/execution-specs. Write consensus tests using repository patterns and fixtures.
Write Test fits situations like: tasks that involve Test generation; tasks that involve Design patterns.
Run `npx skills add ethereum/execution-specs --skill write-test -a claude-code`. Or copy the skill folder (.agents/skills/write-test in ethereum/execution-specs) into .claude/skills/write-test in your project. Claude Code loads it when a task matches its description.
Run `npx skills add ethereum/execution-specs --skill write-test -a codex`. Or copy the skill folder (.agents/skills/write-test in ethereum/execution-specs) into .agents/skills/write-test in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add ethereum/execution-specs --skill write-test -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/write-test, .gemini/skills/write-test, .github/skills/write-test and .opencode/skills/write-test in your project.
Going by SKILL.md and its folder, Write Test needs the command-line tools its instructions call (gh and uv). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use gh and uv, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Write Test is published under the CC0-1.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.6k tokens (SKILL.md is roughly 19k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Write Test: Write Tests (DataDog/datadog-ci, 161 stars), Console Testing (synnaxlabs/synnax, 128 stars), Azure App Testing (MicrosoftDocs/Agent-Skills, 775 stars) and Clean Pytest (LeoYeAI/openclaw-master-skills, 2.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
ethereum (a GitHub organization) maintains it in ethereum/execution-specs, which has 1,195 GitHub stars. The repository holds 13 skills in this directory. The repository was last updated on October 7, 2026.
Source: ethereum/execution-specs on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.