Changelog
This file tracks changes to the ethdebug/format specification: the schemas
under schemas/. Those schemas ship inside the @ethdebug/format package,
whose build generates its distributed copies from schemas/, so the spec
version is that package's version and this file is keyed by it. Each published
package that implements the spec (@ethdebug/pointers, @ethdebug/evm, and so
on) has its own CHANGELOG.md under packages/<name>/; this file covers only
the spec itself.
Each entry gives a summary of what changed. Three sub-items follow:
Schemas:the fully qualified name(s) of the schema(s) the change touches.Producers:what the change means for an emitter ofethdebug/formatdata (a compiler such as solc or bugc).Consumers:what the change means for a reader ofethdebug/formatdata (a debugger such as soldb).
Each Producers: and Consumers: sub-item starts with one of three prefixes:
no change needed.Nothing that was valid becomes invalid, and nothing changes meaning for this party. One short reason may follow.optional:The change adds a capability. Nothing that was valid in the previous published version changes. No party is obliged to do anything. The sub-item says what the party may now do.required:Output that was valid in the previous published version no longer validates, or the specification adds or changes a normative must, or the meaning of data that was already valid changes. The sub-item names the schema keyword, or quotes the specification prose, that imposes the obligation. Prose that says should or "preferred" is neverrequired:.
A consumer has an obligation only where producers can now emit something that a conforming consumer would otherwise misread or reject, or where the meaning of data that was already valid changed. A consumer that does not use a new optional feature has no obligation.
A new branch in a closed oneOf that a consumer must interpret to read the data
at all (for example a new pointer expression or collection) is required: for
consumers, because producers may start to emit it at any time. An addition that
a consumer can skip without misreading anything else (for example a new kind of
context) is optional:.
Each impact line states the net effect for a party that moves from the previous
published version to the version of the section. A change inside a schema that
is new in that version obliges nobody, so its lines are optional: or
no change needed. and describe how the new schema works. An obligation that a
later change in the same version reverses does not appear in an impact line; the
summary may tell the history.
Each version has at most two sections. ### Added holds a new schema, or a new
keyword or capability. ### Changed holds a change to something that exists.
The sections do not signal obligations; the prefixes do.
Unreleased
0.1.0-draft.2 — 2026-10-07
Changed
-
The format's own vocabulary inside pointer expressions uses the sigil
~instead of$, which leaves$free for source-language names (Solidity allows a name to start with$). The terms are the constants and references~wordsizeand~this, and the operators~sum,~difference,~product,~quotient,~remainder,~read,~keccak256,~concat,~wordsized, and~sized<N>. An identifier still must not start with~(#323).- Schemas: ethdebug/format/pointer/expression, ethdebug/format/pointer/identifier, ethdebug/format/pointer, ethdebug/format/pointer/collection/group, ethdebug/format/pointer/collection/scope, ethdebug/format/pointer/region/stack, ethdebug/format/pointer/region/storage, ethdebug/format/pointer/region/transient, ethdebug/format/pointer/scheme/segment, ethdebug/format/info, ethdebug/format/info/resources
- Producers: required: emit
~for the operators, constants and the~thisreference; the$forms no longer validate. ethdebug/format/pointer/expression names the operators inproperties(~sum,~read,~keccak256, and so on) andpatternProperties(^~sized([1-9]+[0-9]*)$,^~wordsized$), the constant inenum(~wordsize), and the reference inconst(~this). - Consumers: required: read the
~operators, constants and reference named by ethdebug/format/pointer/expression'sproperties,patternProperties,enumandconst. The$spellings, such as"$wordsize"and{ "$sum": [...] }, are no longer format terms.
-
An identifier may now start with
$, so a compiler can use a source-language name such as Solidity's$balanceas it is. This relies on the~sigil of #323: a name that starts with$cannot be confused with a format term (#325).- Schemas: ethdebug/format/pointer/identifier
- Producers: optional: a name may now start with
$(ethdebug/format/pointer/identifierpattern^[a-zA-Z$_\-]+[a-zA-Z0-9$_\-]*$). - Consumers: required: accept a name that starts with
$, which ethdebug/format/pointer/identifier'spatternnow allows. Such a string is a name, not a format term:"$wordsize"is a variable and{ ".offset": "$this" }looks up a region named$this.
-
The variables of a scope (
define/in) are visible only within itsin. Pointers outside the scope, such as later members of an enclosing group, do not see them, and a variable defined with an outer variable's identifier shadows it only withinin. The description now says so (#318