<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>ESS Blog</title>
        <link>https://beyond10x.github.io/ess/releases</link>
        <description>ESS Blog</description>
        <lastBuildDate>Tue, 03 Nov 2026 11:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[0.85 — Every witness reads back its effect, and the mutation audit covers grants]]></title>
            <link>https://beyond10x.github.io/ess/releases/every-witness-reads-back-and-the-audit-covers-grants</link>
            <guid>https://beyond10x.github.io/ess/releases/every-witness-reads-back-and-the-audit-covers-grants</guid>
            <pubDate>Tue, 03 Nov 2026 11:00:00 GMT</pubDate>
            <description><![CDATA[0.85.0 adds format ess/34, in which a compensating refusal may delete its row and a named refusal requires the row it addressed unchanged. The mutation audit gains two grant classes, lists the sites it could not mutate and runs on the scenario clock. Go synthesis, the clap target and the generated explorers fix six defects.
]]></description>
            <content:encoded><![CDATA[<p>0.85.0 adds one source format, <code>ess/34</code>, and moves the mutation report to <code>ess-mutation-report/8</code>
and the manifest to <code>ess-mutation-manifest/7</code> where they list something new. A model with nothing
new keeps its bytes. The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a>
lists every change; this note covers each of them.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="every-witness-reads-back-its-effect">Every witness reads back its effect<a href="https://beyond10x.github.io/ess/releases/every-witness-reads-back-and-the-audit-covers-grants#every-witness-reads-back-its-effect" class="hash-link" aria-label="Direct link to Every witness reads back its effect" title="Direct link to Every witness reads back its effect" translate="no">​</a></h2>
<ul>
<li class="">From <code>ess/34</code> a compensating refusal (<code>compensates: true</code> beside <code>external:</code>) may delete its
addressed row with <code>deletes:</code> and <code>instance:</code>. Its scenario requires the error, no event and the
row absent from every immediate view.</li>
<li class="">From <code>ess/34</code> a named <code>when:</code> or <code>when_related:</code> refusal of a command addressing an existing row
snapshots that row completely and requires it unchanged. Below it, suites keep their bytes.</li>
<li class="">At every format, a further witness of a deleting branch requires the deleted row absent, and a
guard's boundary row for a <code>deletes:</code> branch is sent for a row of its own.</li>
<li class="">A non-refusing <code>unknown_instance:</code> branch must store no row with the identity it was sent.</li>
<li class="">A view row field set from an <code>Optional&lt;T&gt;</code> input through its declared conversion is asserted at
the value sent.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-mutation-audit-covers-grants-and-lists-its-gaps">The mutation audit covers grants and lists its gaps<a href="https://beyond10x.github.io/ess/releases/every-witness-reads-back-and-the-audit-covers-grants#the-mutation-audit-covers-grants-and-lists-its-gaps" class="hash-link" aria-label="Direct link to The mutation audit covers grants and lists its gaps" title="Direct link to The mutation audit covers grants and lists its gaps" translate="no">​</a></h2>
<ul>
<li class="">Two new classes audit actor grants: <code>grant-drop</code> removes one command from one actor's <code>may:</code>,
<code>grant-add</code> gives an actor one served command it lacks
(<a href="https://github.com/beyond10x/ess/issues/710" target="_blank" rel="noopener noreferrer" class="">#710</a>). Where either is selected, the baseline
and every mutant's suite keep their <code>&lt;command&gt;/grant/denied</code> scenarios.</li>
<li class="">Each site a selected class excluded or could not mutate is listed with its reason under
<code>unmutated_sites</code>, in the text, the report and the manifest
(<a href="https://github.com/beyond10x/ess/issues/711" target="_blank" rel="noopener noreferrer" class="">#711</a>). The summary says how many of the sites
considered were scored. <code>--fail-on-unmutated</code> makes such a site block exit 0; the default exit
status is unchanged.</li>
<li class=""><code>error-swap</code> mutates a refusal that carries its error's payload, re-keying the entry to the
error swapped in (<a href="https://github.com/beyond10x/ess/issues/709" target="_blank" rel="noopener noreferrer" class="">#709</a>).</li>
<li class=""><code>--target interpreted</code> runs synthesized scenarios on the scenario clock <code>run</code> uses, so a model
with a <code>now</code> guard is scored.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="go-synthesis-and-the-generated-explorers">Go synthesis and the generated explorers<a href="https://beyond10x.github.io/ess/releases/every-witness-reads-back-and-the-audit-covers-grants#go-synthesis-and-the-generated-explorers" class="hash-link" aria-label="Direct link to Go synthesis and the generated explorers" title="Direct link to Go synthesis and the generated explorers" translate="no">​</a></h2>
<ul>
<li class="">Go synthesis copies a required event field into an <code>Optional</code> command input as a pointer, and
writes a served component named <code>server</code> or <code>wire</code> under a repaired file name instead of
panicking.</li>
<li class=""><code>--target clap</code> generates one tree with every group of the components that share a
<code>cli.binary</code>; validation refuses a group, command or view two of them both declare.</li>
<li class="">The generated explorers agree with the interpreter on an <code>external:</code> branch for a stored row,
fail an answer that leaves out a required response member, and explore only the scoped
component's commands and views.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.84 — Generated servers refuse what their OpenAPI refuses, and generated UIs call their binding's routes]]></title>
            <link>https://beyond10x.github.io/ess/releases/generated-servers-refuse-what-their-openapi-refuses</link>
            <guid>https://beyond10x.github.io/ess/releases/generated-servers-refuse-what-their-openapi-refuses</guid>
            <pubDate>Tue, 03 Nov 2026 08:00:00 GMT</pubDate>
            <description><![CDATA[0.84.0 adds no format: generated Rust servers refuse a malformed Timestamp and an undeclared JSON member at decode, authored success acts assert that no error came back, denied-grant scenarios reach ranked views and every ungranted actor, and a generated UI calls the routes its HTTP binding serves.
]]></description>
            <content:encoded><![CDATA[<p>0.84.0 adds no source, scenario or suite format. It changes what generated servers admit, what an
authored success step checks, which denied-grant scenarios synthesis writes, and how generated UIs
reach a server. The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists every
change; this note covers each of them.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generated-servers-refuse-what-their-openapi-refuses">Generated servers refuse what their OpenAPI refuses<a href="https://beyond10x.github.io/ess/releases/generated-servers-refuse-what-their-openapi-refuses#generated-servers-refuse-what-their-openapi-refuses" class="hash-link" aria-label="Direct link to Generated servers refuse what their OpenAPI refuses" title="Direct link to Generated servers refuse what their OpenAPI refuses" translate="no">​</a></h2>
<ul>
<li class="">The generated Rust codecs refuse at decode, before anything is stored, a <code>Timestamp</code> that is not
an RFC 3339 <code>date-time</code> and a member a closed JSON object does not declare. The server answers
<code>400</code>, or the binding's <code>refusals.malformed</code>, naming the member's path
(<a href="https://github.com/beyond10x/ess/issues/707" target="_blank" rel="noopener noreferrer" class="">#707</a>).</li>
<li class="">Before, the server stored the text or dropped the member, while the OpenAPI document it serves
already refused the body. A struct declaring <code>undeclared_fields: ignored</code> and a <code>Json</code> value stay
open.</li>
<li class="">The same decoders read the log, so <code>decode_system_event</code> refuses an envelope an older server
wrote with a free-text <code>Timestamp</code> or an extra member in a closed struct.</li>
<li class="">The generated Go server refuses a top-level JSON command member no input field names, on bound
and derived routes, and reads a <code>Timestamp</code> with the same grammar as the Rust server.</li>
<li class="">Known limit: an <code>Optional</code> member sent as <code>null</code> is still taken as absent by the generated Rust
server, while its served OpenAPI refuses the body. It is tracked as a backlog story.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-authored-success-act-asserts-no-error">An authored success act asserts no error<a href="https://beyond10x.github.io/ess/releases/generated-servers-refuse-what-their-openapi-refuses#an-authored-success-act-asserts-no-error" class="hash-link" aria-label="Direct link to An authored success act asserts no error" title="Direct link to An authored success act asserts no error" translate="no">​</a></h2>
<ul>
<li class="">An authored act whose <code>outcome:</code> names a branch that declares no error now also requires that no
error came back. A target answering the success branch under its own name with an error fails the
step; it used to pass on the outcome name alone.</li>
<li class="">No suite format moves. A library caller assembling an authored suite by hand selects the format
with <code>select_fresh_format_for</code> and runs it with <code>Runner::run_admitted</code>, as the CLI does.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="denied-grant-scenarios">Denied-grant scenarios<a href="https://beyond10x.github.io/ess/releases/generated-servers-refuse-what-their-openapi-refuses#denied-grant-scenarios" class="hash-link" aria-label="Direct link to Denied-grant scenarios" title="Direct link to Denied-grant scenarios" translate="no">​</a></h2>
<ul>
<li class="">Synthesis writes <code>&lt;command&gt;/grant/denied</code> for a command acting on an existing row beside a view
ranked by <code>order_by</code> (<a href="https://github.com/beyond10x/ess/issues/712" target="_blank" rel="noopener noreferrer" class="">#712</a>).</li>
<li class=""><code>&lt;view&gt;/grant/read/denied</code> reads the view as every ungranted actor of the view's own domain, then
as no actor. Before, it read one actor of any domain, so a target admitting an ungranted actor of
the view's domain passed.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generated-uis-call-their-bindings-routes">Generated UIs call their binding's routes<a href="https://beyond10x.github.io/ess/releases/generated-servers-refuse-what-their-openapi-refuses#generated-uis-call-their-bindings-routes" class="hash-link" aria-label="Direct link to Generated UIs call their binding's routes" title="Direct link to Generated UIs call their binding's routes" translate="no">​</a></h2>
<ul>
<li class=""><code>ess generate ui</code> and <code>ess ui run --tui</code> take <code>--http &lt;binding&gt;</code>: the generated route table
carries the method and path the <code>ess-http/1</code> binding declares, so the UI calls the routes the
server generated for the same binding serves
(<a href="https://github.com/beyond10x/ess/issues/713" target="_blank" rel="noopener noreferrer" class="">#713</a>).</li>
<li class="">A command served on <code>get</code> is sent without a body, and React refuses a path value of <code>.</code> or <code>..</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="renderer-fixes">Renderer fixes<a href="https://beyond10x.github.io/ess/releases/generated-servers-refuse-what-their-openapi-refuses#renderer-fixes" class="hash-link" aria-label="Direct link to Renderer fixes" title="Direct link to Renderer fixes" translate="no">​</a></h2>
<ul>
<li class="">The terminal renderer addresses a row action's confirm by the view's row key, and a record's
actions see the row the record shows.</li>
<li class="">An account menu entry keeps its <code>sets</code> and <code>navigate</code> in React. <code>ess ui check</code> refuses an entry a
renderer would drop, an entry that does not read as an action, and <code>sets</code> beside <code>does</code>,
<code>navigate</code> or <code>opens</code>.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.83 — Optional list appends, binding refusals that check event identities, and refusals that tell states apart]]></title>
            <link>https://beyond10x.github.io/ess/releases/optional-appends-and-refusals-that-tell-states-apart</link>
            <guid>https://beyond10x.github.io/ess/releases/optional-appends-and-refusals-that-tell-states-apart</guid>
            <pubDate>Mon, 02 Nov 2026 13:00:00 GMT</pubDate>
            <description><![CDATA[0.83.0 adds no format: the interpreted target appends null for an absent optional list element, binding refusal scenarios compare their trigger event's identities, a row-set guard beside named rows is witnessed on every refusal order, and no-view input refusals tell the record's state apart.
]]></description>
            <content:encoded><![CDATA[<p>0.83.0 adds no source, scenario or suite format, and every change in it is a fix. One is in the
interpreted target, and the others are in the conformance suites synthesis writes. The
<a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists every change; this note
covers each of them.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="appending-an-absent-optional-element">Appending an absent optional element<a href="https://beyond10x.github.io/ess/releases/optional-appends-and-refusals-that-tell-states-apart#appending-an-absent-optional-element" class="hash-link" aria-label="Direct link to Appending an absent optional element" title="Direct link to Appending an absent optional element" translate="no">​</a></h2>
<ul>
<li class="">The interpreted target appends <code>null</code> for an absent or <code>null</code> element of
<code>{append: input.&lt;field&gt;}</code> over a <code>List&lt;Optional&lt;T&gt;&gt;</code>, as generated Rust and Go already append
<code>None</code> and <code>nil</code>. Synthesis expects that <code>null</code> in the view row.</li>
<li class="">Before, the interpreted target refused the command as unsupported.</li>
<li class="">An element over a list of required elements is unchanged.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="binding-refusal-scenarios-compare-event-identities">Binding refusal scenarios compare event identities<a href="https://beyond10x.github.io/ess/releases/optional-appends-and-refusals-that-tell-states-apart#binding-refusal-scenarios-compare-event-identities" class="hash-link" aria-label="Direct link to Binding refusal scenarios compare event identities" title="Direct link to Binding refusal scenarios compare event identities" translate="no">​</a></h2>
<ul>
<li class="">A synthesized binding refusal scenario covers a refusal the binding's policy drops, escalates or
retries a bounded number of times. It now compares the identity fields of the trigger's event with
the instances its invocation was sent, as the other binding scenarios do since 0.82.0.</li>
<li class="">It also compares them with each id the invocation was sent as a literal for a field of an
entity's identity type, such as the id a trigger naming no related row is sent. That holds where
it sends another publisher of the event, or a trigger naming a row arranged so the predicate
refuses it.</li>
<li class="">Before, it expected that event by shape alone, so a target publishing a wrong id there passed.</li>
<li class="">The suite bytes of seven fixture models move; the changelog names them.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-row-set-beside-named-rows-on-every-refusal-order">A row set beside named rows, on every refusal order<a href="https://beyond10x.github.io/ess/releases/optional-appends-and-refusals-that-tell-states-apart#a-row-set-beside-named-rows-on-every-refusal-order" class="hash-link" aria-label="Direct link to A row set beside named rows, on every refusal order" title="Direct link to A row set beside named rows, on every refusal order" translate="no">​</a></h2>
<ul>
<li class="">A command guarding on a row set beside rows its input names (<code>ess/32</code>) is witnessed on every
refusal order.</li>
<li class="">A refusal over a named row that also carries a <code>when:</code> is held beside the row set's rows with a
send that holds that <code>when:</code>. Where the <code>when:</code> equates two inputs, that send names one row twice.
Where no such send stands, the refusal is witnessed on its related row alone, so its row-set
branch is no longer refused.</li>
<li class="">A row-set refusal is held beside a later refusal whose <code>when:</code> compares the named rows. Where only
a creator sent one row twice lays the selected row, that is how it is laid.</li>
<li class="">A <code>forall</code> on the accepting branch is held on a selected row the <code>forall</code> passes, and its default
refusal on a selected row naming the send's own rows. A target refusing on any selected row now
fails, at <code>ess/31</code> too.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="no-view-input-refusals-tell-the-records-state-apart">No-view input refusals tell the record's state apart<a href="https://beyond10x.github.io/ess/releases/optional-appends-and-refusals-that-tell-states-apart#no-view-input-refusals-tell-the-records-state-apart" class="hash-link" aria-label="Direct link to No-view input refusals tell the record's state apart" title="Direct link to No-view input refusals tell the record's state apart" translate="no">​</a></h2>
<ul>
<li class="">These are input refusals on a command that addresses an existing record, on a model where no
identity view shows the row.</li>
<li class="">The arranged half of such a refusal tells the arranged state apart from every other state. Where
the first branch addressing the record from that state also runs from other states, the scenario
sends the shortest sequence a bounded search finds that does tell them apart. Where the bound
stops the search first, that sequence is extended one send at a time past it. It is drawn from
the command's branches and from other commands whose input names only that record, with a
<code>wrong_state:</code> refusal among the answers. A free-text input beside the identity names no record.</li>
<li class="">A refusal beside held-state branches reads the record back after each held-state send, through
sends from that state that tell it apart from every other state. The command's own branches come
first, its held-state refusals among them.</li>
<li class="">A target that moves the record on refusal and publishes nothing now fails both. Before, they
required only the error and no event, and such a target passed.</li>
<li class="">Where the sends tried leave states untold, the scenario is withdrawn and refused as
<code>ESS-SYNTH-001</code>, naming the states left. Where no send has a valid input, it names every branch
tried.</li>
<li class="">A model with an identity view keeps its suite bytes. The test model <code>occurrence-clock-offers.yaml</code>,
which has none, moves its suite bytes: its <code>AcceptOffer/outcome/malformed</code> scenario reads the
offer back in each of its three states, with its scenario count and refusals unchanged.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.82 — Binding scenarios that check event identities, refusals that probe the record, and validation that names the file]]></title>
            <link>https://beyond10x.github.io/ess/releases/event-identities-and-file-cited-refusals</link>
            <guid>https://beyond10x.github.io/ess/releases/event-identities-and-file-cited-refusals</guid>
            <pubDate>Sun, 01 Nov 2026 21:00:00 GMT</pubDate>
            <description><![CDATA[0.82.0 adds no format: synthesized binding scenarios compare the identity fields of their trigger event, the arranged half of a refusal without an identity view probes the record through the command, and ess specify validate names the file a refusal was read from.
]]></description>
            <content:encoded><![CDATA[<p>0.82.0 adds no source, scenario or suite format, and every change in it is a fix. Two are in the
conformance suites synthesis writes, and one is in what <code>ess specify validate</code> cites. The
<a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists every change; this note
covers each of them.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="binding-scenarios-compare-event-identities">Binding scenarios compare event identities<a href="https://beyond10x.github.io/ess/releases/event-identities-and-file-cited-refusals#binding-scenarios-compare-event-identities" class="hash-link" aria-label="Direct link to Binding scenarios compare event identities" title="Direct link to Binding scenarios compare event identities" translate="no">​</a></h2>
<ul>
<li class="">Synthesized binding scenarios compare the identity fields of the trigger's event with the
instances its invocation was sent, or with the row it acts on. That covers flow, mapping,
delivery, on-failure, a bounded retry's attempts and final failure, an unbounded retry selected
per refusal, and a condition's negative witnesses.</li>
<li class="">The comparison also holds where the binding arranges a row before it, as command scenarios have
done since beyond10x/ess#273.</li>
<li class="">A target that publishes another identity in the event now fails these scenarios. Before, it
passed them.</li>
<li class="">A model whose binding triggers carry no captured instance into their event keeps its suite bytes.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-arranged-half-of-a-refusal-probes-the-record">The arranged half of a refusal probes the record<a href="https://beyond10x.github.io/ess/releases/event-identities-and-file-cited-refusals#the-arranged-half-of-a-refusal-probes-the-record" class="hash-link" aria-label="Direct link to The arranged half of a refusal probes the record" title="Direct link to The arranged half of a refusal probes the record" translate="no">​</a></h2>
<ul>
<li class="">This is the arranged half of an input refusal, on a command that addresses an existing record,
where no identity view shows the arranged row. After the refused send, the scenario sends a valid
input for that record. That input belongs to the first branch that addresses the record from the
state it was arranged in, and the scenario requires that branch to answer.</li>
<li class="">A target that moves the record out of every state that branch runs from on refusal, or otherwise
changes what it answers, and publishes nothing, now fails. Before, the scenario required only the
error and no event, and such a target passed. A move between two states that branch runs from is
still not seen.</li>
<li class="">Where no such branch has a valid send, the scenario is withdrawn and refused as <code>ESS-SYNTH-001</code>,
naming the branches tried (beyond10x/ess#209).</li>
<li class="">A model with an identity view keeps its suite bytes.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation-names-the-file">Validation names the file<a href="https://beyond10x.github.io/ess/releases/event-identities-and-file-cited-refusals#validation-names-the-file" class="hash-link" aria-label="Direct link to Validation names the file" title="Direct link to Validation names the file" translate="no">​</a></h2>
<ul>
<li class=""><code>ess specify validate</code> on a specification of several files names the file a refusal was read
from. Before, it named <code>&lt;document&gt;</code> whenever the refused declaration's name was written in more
than one file, as a name declared in two files is.</li>
<li class="">A refusal made while a file is read is cited in that file. One checked after assembly is cited in
the file of the copy assembly kept, which is the second when the first does not convert. A name
written twice in one file names the file and no line.</li>
<li class="">The library's <code>Specification::assemble_traced</code> and <code>resolve::diagnose_traced</code> return and read that
record; <code>diagnose_locating</code> is unchanged.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.81 — Nullable Binary64 fields in generated types, name aliases in the schema, and synthesis that follows bindings]]></title>
            <link>https://beyond10x.github.io/ess/releases/nullable-binary64-and-binding-aware-synthesis</link>
            <guid>https://beyond10x.github.io/ess/releases/nullable-binary64-and-binding-aware-synthesis</guid>
            <pubDate>Sun, 01 Nov 2026 15:00:00 GMT</pubDate>
            <description><![CDATA[0.81.0 adds no format: ess generate types realizes a nullable optional Binary64 field and refuses the response root of a command without a response by name, the published schema admits the id: and component: name aliases, and synthesis sends related-row and wrong-state scenarios to rows that keep their branch.
]]></description>
            <content:encoded><![CDATA[<p>0.81.0 adds no source, scenario or suite format, and every change in it is a fix. Two are in
<code>ess generate types</code>, one is in the published document schema, and three are in how synthesis picks
the rows a scenario is sent to. The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a>
lists every change; this note covers each of them.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generated-types">Generated types<a href="https://beyond10x.github.io/ess/releases/nullable-binary64-and-binding-aware-synthesis#generated-types" class="hash-link" aria-label="Direct link to Generated types" title="Direct link to Generated types" translate="no">​</a></h2>
<ul>
<li class="">An <code>Optional&lt;Binary64&gt;</code> field declared <code>presence: null_when_absent</code> or <code>omitted_or_null</code> is
realized as Rust and Go, in a declared struct and in a command's input or response root. Its
Binary64 location is the number member of the field's <code>anyOf [number, null]</code>; before, it was the
property, and realization was refused as <code>model_binary64_layout</code>.</li>
<li class="">The TypeScript report names its <code>model_binary64</code> obligation at that member.</li>
<li class=""><code>--root &lt;command&gt;.response</code> on a command that declares no response is refused as <code>unknown_root</code>,
naming the command and saying it declares no response, as <code>--all-commands</code> leaves it out. Before,
it generated an empty object type.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="name-aliases-in-the-published-schema">Name aliases in the published schema<a href="https://beyond10x.github.io/ess/releases/nullable-binary64-and-binding-aware-synthesis#name-aliases-in-the-published-schema" class="hash-link" aria-label="Direct link to Name aliases in the published schema" title="Direct link to Name aliases in the published schema" translate="no">​</a></h2>
<ul>
<li class=""><code>schemas/generated/ess.schema.json</code> admits a binding's name written <code>id:</code> and a component's
written <code>component:</code>, the aliases the parser already reads, each with the same charset as <code>name:</code>.
Before, it refused every document that spelt a name that way.</li>
<li class="">Writing both spellings, or neither, is refused, as the parser refuses it. Parsing is unchanged.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="synthesis">Synthesis<a href="https://beyond10x.github.io/ess/releases/nullable-binary64-and-binding-aware-synthesis#synthesis" class="hash-link" aria-label="Direct link to Synthesis" title="Direct link to Synthesis" translate="no">​</a></h2>
<ul>
<li class="">A <code>when_related:</code> branch is no longer sent for a related row that only a step setting off a
binding selects, where that binding's command writes a field or the state the guard reads, or
removes the row. Such a row is passed over for one no binding rewrites; where none is found, the
branch is refused as <code>ESS-SYNTH-003</code> naming the step, the binding and the command it invokes.</li>
<li class="">A <code>when_related:</code> command whose input is chosen for an external branch, where the precedence plan
reads the related row's <code>exists: false</code> before the addressed row's existence or held state, sends
its unknown-identity scenario and its held-state refusals beside a present related row. Before, it
sent a reference no row carries and the target answered <code>exists: false</code> instead of the refusal.</li>
<li class="">A model with such a command and no <code>wrong_state:</code> moves its suite bytes: its held-state refusals
now name a present row, so the held state is what refuses them. Every other model keeps its bytes.</li>
<li class="">A wrong-state scenario of a command reading stored fields is sent to a row its moving branch's own
<code>when_subject:</code> holds on, and to a row holding a value in every field a sibling's stored guard
reads, so no absent field stops selection before the wrong-state answer. Where no reachable row
serves, the scenario is refused as <code>ESS-SYNTH-003</code> naming the guard.</li>
<li class="">A model whose bindings write nothing a related guard reads keeps its suite bytes.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.80 — HTTP-bound inputs and short names in generated types, and input-type rules in Entity Runtime]]></title>
            <link>https://beyond10x.github.io/ess/releases/http-bound-inputs-and-short-names</link>
            <guid>https://beyond10x.github.io/ess/releases/http-bound-inputs-and-short-names</guid>
            <pubDate>Sun, 01 Nov 2026 11:00:00 GMT</pubDate>
            <description><![CDATA[0.80.0 adds no format: ess generate types takes --http, so a command's input type is the request body its bound OpenAPI document publishes, --names short combines with --all-commands and --all-views, and Entity Runtime lowering keeps an unstored input type's rules.
]]></description>
            <content:encoded><![CDATA[<p>0.80.0 adds no source, scenario or suite format. It changes what <code>ess generate types</code> writes under
two flags, what Entity Runtime lowering does with a command input's type, and how synthesis decides
an identity guard. The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists
every change; this note covers each of them.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generated-types-for-an-http-binding">Generated types for an HTTP binding<a href="https://beyond10x.github.io/ess/releases/http-bound-inputs-and-short-names#generated-types-for-an-http-binding" class="hash-link" aria-label="Direct link to Generated types for an HTTP binding" title="Direct link to Generated types for an HTTP binding" translate="no">​</a></h2>
<ul>
<li class=""><code>ess generate types</code> takes <code>--http &lt;binding&gt;</code> (and <code>--refines</code>), compiled as
<code>ess generate --kind openapi --http</code> compiles it (beyond10x/ess#656).</li>
<li class="">Under it each <code>&lt;command&gt;.input</code> is the request body the bound OpenAPI document publishes, without
the fields its route carries in the path, so the Rust, Go and TypeScript types decode that body.</li>
<li class="">A command whose route publishes no body (encoded <code>query</code>, or every field in the path) has no input
root: <code>--root &lt;command&gt;.input</code> is refused as <code>unpublished_body</code>, naming the command and why, and
<code>--all-commands</code> leaves it out.</li>
<li class="">Responses and view rows are unchanged, and without <code>--http</code> every generated file keeps its bytes.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="short-names-for-every-command-and-view">Short names for every command and view<a href="https://beyond10x.github.io/ess/releases/http-bound-inputs-and-short-names#short-names-for-every-command-and-view" class="hash-link" aria-label="Direct link to Short names for every command and view" title="Direct link to Short names for every command and view" translate="no">​</a></h2>
<ul>
<li class=""><code>ess generate types --names short</code> combines with <code>--all-commands</code> and <code>--all-views</code>
(beyond10x/ess#409).</li>
<li class="">A command's input or response and a view's row are named by their owner's last segment and the
member: <code>demo.notes.Create.input</code> is <code>CreateInput</code> and <code>demo.notes.ByOwner.row</code> is <code>ByOwnerRow</code>.
Before, every input shortened to <code>Input</code> and every row to <code>Row</code>, and two commands or views were
refused as <code>short_name_collision</code>.</li>
<li class="">Declared type and event short names are unchanged, and two commands of one name in two domains
are still refused, naming both.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="input-type-rules-in-entity-runtime">Input-type rules in Entity Runtime<a href="https://beyond10x.github.io/ess/releases/http-bound-inputs-and-short-names#input-type-rules-in-entity-runtime" class="hash-link" aria-label="Direct link to Input-type rules in Entity Runtime" title="Direct link to Input-type rules in Entity Runtime" translate="no">​</a></h2>
<ul>
<li class="">Entity Runtime lowering no longer drops the <code>invariants:</code> and <code>prefix:</code> of a command input's type
unless every accepting branch stores the input in a field of that type.</li>
<li class="">An update holds them as operation preconditions over <code>$args.input.&lt;field&gt;</code>, lowered as a guard is,
so an ordering over a <code>Timestamp</code> becomes <code>before</code>/<code>after</code>.</li>
<li class="">A creation, which has no precondition in entity-core, and an ordering over text, which entity-core
cannot decide, are refused as <code>InputInvariantUnsupported</code>, naming the input.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="synthesis-fix">Synthesis fix<a href="https://beyond10x.github.io/ess/releases/http-bound-inputs-and-short-names#synthesis-fix" class="hash-link" aria-label="Direct link to Synthesis fix" title="Direct link to Synthesis fix" translate="no">​</a></h2>
<ul>
<li class="">A <code>when:</code> guard on the identity input of a row a branch is sent for, below a non-creating
<code>unknown_instance:</code> or on the subject the branch acts on, is decided on the identity of the row
the scenario arranges, a compound guard by its identity parts (beyond10x/ess#645,
beyond10x/ess#693).</li>
<li class="">The row's creator is steered onto an identity that keeps the branch; where none does, the branch
is refused as <code>ESS-SYNTH-003</code> naming the guard. Before, the scenario was sent a row of another
identity and the target answered another branch.</li>
<li class="">A related row's boundary run that would create a second row under such an identity gives way to
the next branch answering there, where the whole scenario was refused as <code>ESS-SYNTH-001</code>.</li>
<li class="">A boundary run that sends such an identity input another value, or follows a branch that deleted
the row, is sent a row of that identity, or is refused naming the guard and not sent. Before, it
was sent an identity no row carries and the target answered <code>unknown</code>.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.79 — Nested-member claims, Binary64 in conformance suites, and typed authored inputs]]></title>
            <link>https://beyond10x.github.io/ess/releases/nested-claims-and-binary64</link>
            <guid>https://beyond10x.github.io/ess/releases/nested-claims-and-binary64</guid>
            <pubDate>Sun, 01 Nov 2026 00:30:00 GMT</pubDate>
            <description><![CDATA[0.79.0 adds scenario format ess-scenario/6 and suite pair ess-conformance/62 and /63: an authored claim may name a nested member by its path, an authored literal input is held to its type, and a model that reaches a finite Binary64 runs a conformance suite.
]]></description>
            <content:encoded><![CDATA[<p>0.79.0 adds no source format: a specification keeps its meaning, its IR bytes and its compiled
digest. It adds scenario format <code>ess-scenario/6</code> and suite pair <code>ess-conformance/62</code> (ordinary) and
<code>/63</code> (coverage). The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists
every change; this note covers what the new formats carry and the fixes that came with them.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="nested-member-claims">Nested-member claims<a href="https://beyond10x.github.io/ess/releases/nested-claims-and-binary64#nested-member-claims" class="hash-link" aria-label="Direct link to Nested-member claims" title="Direct link to Nested-member claims" translate="no">​</a></h2>
<ul>
<li class="">From <code>ess-scenario/6</code> a claim in an act's <code>response:</code>, an event's <code>payload:</code>, an error's
<code>fields:</code> or a row may name one member of a nested value by its dotted path,
<code>checkpoint.checkpoint_id: cp-1</code>, under one rule on all four surfaces: a field is claimed whole or
by its paths, not both.</li>
<li class="">A response path is carried by <code>ess-conformance/62</code> and <code>/63</code>; event, error and row paths compile
to dotted keys older suites already read, so those suites keep their format.</li>
<li class="">A partial nested literal in a <code>response:</code> is refused as <code>ESS-AUTHOR-014</code>, naming each member it
leaves out at its path.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="binary64-through-a-conformance-suite">Binary64 through a conformance suite<a href="https://beyond10x.github.io/ess/releases/nested-claims-and-binary64#binary64-through-a-conformance-suite" class="hash-link" aria-label="Direct link to Binary64 through a conformance suite" title="Direct link to Binary64 through a conformance suite" translate="no">​</a></h2>
<ul>
<li class="">A model that reaches a <code>Binary64</code> in an entity's fields, a command's input or response, an
event's or error's fields, or a view now synthesizes, authors and runs a suite at
<code>ess-conformance/62</code> (coverage <code>/63</code>).</li>
<li class="">Rust, Go and TypeScript compare it by its nearest binary64 under IEEE equality (<code>-0</code> equals <code>0</code>);
a token with no finite image, such as <code>1e400</code>, is refused by name. An authored <code>Binary64</code> literal
of magnitude 2^53 or more is refused as <code>ESS-AUTHOR-015</code>, because view and event assertions
compare an integer token exactly.</li>
<li class="">A <code>Binary64</code> reached through an entity identity, a view parameter, an actor attribute, a binding
or a conversion is still refused (<code>ESS-AUTHOR-036</code>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="authored-inputs-meet-their-type">Authored inputs meet their type<a href="https://beyond10x.github.io/ess/releases/nested-claims-and-binary64#authored-inputs-meet-their-type" class="hash-link" aria-label="Direct link to Authored inputs meet their type" title="Direct link to Authored inputs meet their type" translate="no">​</a></h2>
<ul>
<li class="">From <code>ess-scenario/6</code> an act's literal input that its declared type refuses, at any depth and
beside an <code>$instance</code> reference, is refused as <code>ESS-AUTHOR-015</code> at its member path.</li>
<li class="">A refusal guard that only out-of-type inputs meet is refused as <code>ESS-SYNTH-003</code>, naming the field,
the type and the constraint.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="synthesis-fixes">Synthesis fixes<a href="https://beyond10x.github.io/ess/releases/nested-claims-and-binary64#synthesis-fixes" class="hash-link" aria-label="Direct link to Synthesis fixes" title="Direct link to Synthesis fixes" translate="no">​</a></h2>
<ul>
<li class="">Both branches of a <code>!=</code> or <code>==</code> guard that compares an input with its own <code>example:</code> are written,
for text, <code>Uuid</code>, <code>Timestamp</code>, <code>Duration</code> and <code>Bytes</code>, and for a struct member a structured example
reaches.</li>
<li class="">An input-guarded refusal beside exhaustive held-state branches, and the byte-length children of an
<code>any</code> over alphabet-bounded texts, are witnessed where they were refused.</li>
<li class="">An accepting branch read after <code>unknown_instance:</code> is arranged with its row stored first; guards
on related identities, parent rows and cascades get the rows they read.</li>
<li class="">An authored scenario that repeats a key in a mapping is refused as <code>ESS-AUTHOR-047</code>.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.78 — Structured input examples, rows a deployment provides, and lifecycle summaries]]></title>
            <link>https://beyond10x.github.io/ess/releases/structured-examples-and-provided-rows</link>
            <guid>https://beyond10x.github.io/ess/releases/structured-examples-and-provided-rows</guid>
            <pubDate>Sat, 31 Oct 2026 15:00:00 GMT</pubDate>
            <description><![CDATA[0.78.0 adds source format ess/33: a struct, map or Json input may carry an example, an entity may declare that the deployment provides its rows, and lifecycle transitions and states may carry a summary.
]]></description>
            <content:encoded><![CDATA[<p>0.78.0 adds source format <code>ess/33</code>. A model that does not use its new keys keeps its meaning, its IR
bytes and its compiled digest. The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a>
lists every change; this note covers what <code>ess/33</code> adds and the fixes that came with it.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="structured-input-examples">Structured input examples<a href="https://beyond10x.github.io/ess/releases/structured-examples-and-provided-rows#structured-input-examples" class="hash-link" aria-label="Direct link to Structured input examples" title="Direct link to Structured input examples" translate="no">​</a></h2>
<ul>
<li class="">An input typed as a struct (open or closed), a <code>Map&lt;…&gt;</code> or <code>Json</code>, through any newtype or
<code>Optional</code>, may carry an <code>example:</code>. Synthesis sends it at the plain instance; a struct example
reaches synthesis through its declared members, so a guard reading one keeps the scenario that
refutes it.</li>
<li class="">An open struct's example keeps the members it does not declare, and the interpreted target now
admits those members in a command input at every format.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rows-a-deployment-provides">Rows a deployment provides<a href="https://beyond10x.github.io/ess/releases/structured-examples-and-provided-rows#rows-a-deployment-provides" class="hash-link" aria-label="Direct link to Rows a deployment provides" title="Direct link to Rows a deployment provides" translate="no">​</a></h2>
<ul>
<li class="">An entity may declare <code>provided: true</code>: the deployment holds its rows, and no command of the
specification need create one.</li>
<li class="">Where a <code>when_related: {via: input.&lt;field&gt;}</code> guard reads such a row and no declared outcome
creates it, the scenario resolves an entity fixture <code>{name, type, entity, state}</code> before it runs
(suite formats <code>ess-conformance/60</code> and <code>/61</code>). The interpreted target creates the row; the Go and
TypeScript runtimes pass the entity and state to their fixture provider.</li>
<li class=""><code>fixture_inputs:</code> is refused over every input a guard reads, including the identity a related-row
guard reads.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="lifecycle-summaries">Lifecycle summaries<a href="https://beyond10x.github.io/ess/releases/structured-examples-and-provided-rows#lifecycle-summaries" class="hash-link" aria-label="Direct link to Lifecycle summaries" title="Direct link to Lifecycle summaries" translate="no">​</a></h2>
<ul>
<li class="">A transition may carry a one-line <code>summary:</code>, and a state may carry one in its mapping form,
<code>{name, wire?, summary?}</code>. <code>ess verify diff</code> reports a moved transition summary as
<code>transition-summary-changed</code> (<code>ess-diff/22</code>), compatible.</li>
<li class="">A flat <code>summary:</code>, <code>wire:</code>, <code>display:</code> or <code>code:</code> on a named type is refused with a message naming
<code>naming: {summary: …}</code>.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.77 — Alike HTTP outcomes, wider OpenAPI import, and branches an earlier refusal hides]]></title>
            <link>https://beyond10x.github.io/ess/releases/alike-outcomes-and-unreachable-branches</link>
            <guid>https://beyond10x.github.io/ess/releases/alike-outcomes-and-unreachable-branches</guid>
            <pubDate>Thu, 29 Oct 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[0.77.0 lets an HTTP route answer two outcomes alike, imports open objects from OpenAPI, keeps declared field order in generated types on request, and refuses a branch an earlier refusal always answers first.
]]></description>
            <content:encoded><![CDATA[<p>0.77.0 is a feature release with no new source format: every model keeps its meaning, its IR bytes
and its compiled digest. The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a>
lists every change since 0.70.0; this note covers 0.77.0 and the releases since the last note.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="http-bindings">HTTP bindings<a href="https://beyond10x.github.io/ess/releases/alike-outcomes-and-unreachable-branches#http-bindings" class="hash-link" aria-label="Direct link to HTTP bindings" title="Direct link to HTTP bindings" translate="no">​</a></h2>
<ul>
<li class="">A route may declare <code>alike:</code> groups of outcomes whose answers are equal, so two outcomes share a
status and a body instead of being refused as indistinguishable; OpenAPI writes one response
naming every member (<a href="https://github.com/beyond10x/ess/issues/652" target="_blank" rel="noopener noreferrer" class="">#652</a>).</li>
<li class="">An outcome may answer a <code>String</code> field as <code>text/plain</code> with <code>encoding: text</code>. A route may declare
its own <code>refusals:</code>, a literal or empty body for <code>empty</code>, and <code>body: array</code> for a view that is not
paged (<a href="https://github.com/beyond10x/ess/issues/673" target="_blank" rel="noopener noreferrer" class="">#673</a>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="import-and-generated-types">Import and generated types<a href="https://beyond10x.github.io/ess/releases/alike-outcomes-and-unreachable-branches#import-and-generated-types" class="hash-link" aria-label="Direct link to Import and generated types" title="Direct link to Import and generated types" translate="no">​</a></h2>
<ul>
<li class="">OpenAPI import admits open objects, the empty and <code>true</code> schemas as JSON values, and a nullable
<code>anyOf</code>/<code>oneOf</code> pair as an optional value
(<a href="https://github.com/beyond10x/ess/issues/647" target="_blank" rel="noopener noreferrer" class="">#647</a>).</li>
<li class=""><code>ess generate schema types-bundle --integer-format-widths</code> realizes <code>int32</code> and <code>int64</code> at native
width (<a href="https://github.com/beyond10x/ess/issues/648" target="_blank" rel="noopener noreferrer" class="">#648</a>).</li>
<li class=""><code>ess generate types --declared-field-order</code> keeps the order the specification declares, and
<code>--rust-box-only-recursion</code> boxes only the references that close a cycle
(<a href="https://github.com/beyond10x/ess/issues/661" target="_blank" rel="noopener noreferrer" class="">#661</a>). Without these options the output keeps
its bytes.</li>
<li class="">Rust and web synthesis accept a response field that shares a name with an input field
(<a href="https://github.com/beyond10x/ess/issues/659" target="_blank" rel="noopener noreferrer" class="">#659</a>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="validation-and-mutation">Validation and mutation<a href="https://beyond10x.github.io/ess/releases/alike-outcomes-and-unreachable-branches#validation-and-mutation" class="hash-link" aria-label="Direct link to Validation and mutation" title="Direct link to Validation and mutation" translate="no">​</a></h2>
<ul>
<li class=""><code>ess specify validate</code> refuses a <code>when:</code> branch whose input guard implies the guard of an
input-guarded refusal answered before it, as <code>unreachable_branch</code>
(<a href="https://github.com/beyond10x/ess/issues/702" target="_blank" rel="noopener noreferrer" class="">#702</a>). Before, only synthesis reported it.</li>
<li class=""><code>ess verify conform mutate</code> scores a precedence swap of two guards no input selects together as
<code>equivalent</code>, also for wide enums, membership lists and disjunctions
(<a href="https://github.com/beyond10x/ess/issues/703" target="_blank" rel="noopener noreferrer" class="">#703</a>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="since-0700">Since 0.70.0<a href="https://beyond10x.github.io/ess/releases/alike-outcomes-and-unreachable-branches#since-0700" class="hash-link" aria-label="Direct link to Since 0.70.0" title="Direct link to Since 0.70.0" translate="no">​</a></h2>
<ul>
<li class="">0.76.0: schemas publish entity invariants and <code>Binary64</code>, text length and distinct-list bounds as
keywords; a <code>defined</code> / <code>not defined</code> pair of branches is exhaustive without a default;
<code>ess-composition/5</code> compares events, commands, constraints and variant attributes; HTTP bindings
name operation ids and servers.</li>
<li class="">0.75.0: the workspace builds on its declared minimum Rust version again, and seeded synthesis
explains the seeds it cannot use.</li>
<li class="">0.74.0: seeds are admitted for models whose actors declare caller attributes.</li>
<li class="">0.71.0 to 0.73.0: synthesis covers more set updates, deletes, bindings and related-row guards that
it refused before.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.70 — Named rows beside a row set, state wire spellings, and replays that finish]]></title>
            <link>https://beyond10x.github.io/ess/releases/named-rows-beside-a-row-set</link>
            <guid>https://beyond10x.github.io/ess/releases/named-rows-beside-a-row-set</guid>
            <pubDate>Mon, 26 Oct 2026 19:00:00 GMT</pubDate>
            <description><![CDATA[0.70.0 adds source format `ess/32`: one command may guard on rows its input names beside a row-set guard, a struct may declare no fields, and a lifecycle state may declare its wire spelling.
]]></description>
            <content:encoded><![CDATA[<p>0.70.0 is a feature release. It adds the source format <code>ess/32</code> and the suite formats
<code>ess-conformance/58</code> and <code>/59</code>. A model below <code>ess/32</code> keeps its meaning, its IR bytes and its
compiled digest. The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists
every change since 0.63.0.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rows-the-input-names-beside-a-row-set">Rows the input names, beside a row set<a href="https://beyond10x.github.io/ess/releases/named-rows-beside-a-row-set#rows-the-input-names-beside-a-row-set" class="hash-link" aria-label="Direct link to Rows the input names, beside a row set" title="Direct link to Rows the input names, beside a row set" translate="no">​</a></h2>
<p>From <code>ess/32</code> one command may guard on rows its input names, <code>when_related: {via: input.&lt;field&gt;, …}</code>, beside a row-set guard, <code>when_related: {entity, where, …}</code>. "Connect two ports
that exist and face the right way, unless a wire already leaves the source" is one command. A
missing named row answers first, then every refusal over a present named row or a row set in
declaration order, then the accepting branches
(<a href="https://github.com/beyond10x/ess/issues/554" target="_blank" rel="noopener noreferrer" class="">#554</a>).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-in-ess32">More in <code>ess/32</code><a href="https://beyond10x.github.io/ess/releases/named-rows-beside-a-row-set#more-in-ess32" class="hash-link" aria-label="Direct link to more-in-ess32" title="Direct link to more-in-ess32" translate="no">​</a></h2>
<ul>
<li class="">A struct may declare <code>fields: []</code>, open or closed
(<a href="https://github.com/beyond10x/ess/issues/649" target="_blank" rel="noopener noreferrer" class="">#649</a>).</li>
<li class="">A lifecycle state may declare its wire spelling, <code>states: [{name: Indexing, wire: indexing}]</code>,
and two variants of one enum spelled alike on the wire are refused
(<a href="https://github.com/beyond10x/ess/issues/639" target="_blank" rel="noopener noreferrer" class="">#639</a>).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conformance-and-generated-code">Conformance and generated code<a href="https://beyond10x.github.io/ess/releases/named-rows-beside-a-row-set#conformance-and-generated-code" class="hash-link" aria-label="Direct link to Conformance and generated code" title="Direct link to Conformance and generated code" translate="no">​</a></h2>
<ul>
<li class=""><code>ess verify conform synthesize</code> no longer stops with <code>InvalidReplay</code> at <code>ess/26</code> and later.</li>
<li class="">A view may publish a <code>Decimal</code>, compared by value; such a suite is <code>ess-conformance/58</code> or <code>/59</code>.</li>
<li class="">A create-or-update command beside a related-row refusal gets a scenario for every branch
(<a href="https://github.com/beyond10x/ess/issues/641" target="_blank" rel="noopener noreferrer" class="">#641</a>).</li>
<li class="">The synthesized Rust server decodes published events and returns the events a call published.</li>
<li class="">A variant's <code>code:</code> names its generated identifier, and a dotted label such as <code>call.started</code>
synthesizes (<a href="https://github.com/beyond10x/ess/issues/662" target="_blank" rel="noopener noreferrer" class="">#662</a>).</li>
<li class=""><code>ess generate types --check</code> compares what it would write with <code>--out</code>
(<a href="https://github.com/beyond10x/ess/issues/654" target="_blank" rel="noopener noreferrer" class="">#654</a>).</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.63 — Values computed by typed expressions, and one precedence order for guards]]></title>
            <link>https://beyond10x.github.io/ess/releases/typed-expressions-and-one-precedence-order</link>
            <guid>https://beyond10x.github.io/ess/releases/typed-expressions-and-one-precedence-order</guid>
            <pubDate>Mon, 19 Oct 2026 10:00:00 GMT</pubDate>
            <description><![CDATA[0.63.0 adds source format `ess/27`: a value may be computed by a typed expression, a guard may read a digest of its input, and every command's guards answer in one precedence order.
]]></description>
            <content:encoded><![CDATA[<p>0.63.0 is a feature release. It adds the source format <code>ess/27</code>, the suite formats
<code>ess-conformance/52</code> and <code>/53</code>, the delta format <code>ess-diff/20</code> and the suite comparison
<code>ess-suite-diff/1</code>. A model below <code>ess/27</code> keeps its meaning, its IR bytes and its compiled digest.
The <a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists every change since
0.59.0.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="values-computed-by-typed-expressions">Values computed by typed expressions<a href="https://beyond10x.github.io/ess/releases/typed-expressions-and-one-precedence-order#values-computed-by-typed-expressions" class="hash-link" aria-label="Direct link to Values computed by typed expressions" title="Direct link to Values computed by typed expressions" translate="no">​</a></h2>
<p>From <code>ess/27</code> a value in <code>sets:</code>, an event's <code>payload:</code> or an error's <code>payload:</code> may be computed by
an expression, <code>{expr: "&lt;expression&gt;"}</code>, and a view field may be computed from its source row, such
as <code>expr: "ended_at - started_at"</code>. Arithmetic over Integer and Decimal is exact, <code>/</code> is an
<code>Optional&lt;Decimal&gt;</code> that is absent at a zero divisor, <code>round</code> rounds a quotient once, and
<code>Timestamp - Timestamp</code> is a <code>Duration</code>. Synthesis runs the branch again on inputs worth checking
the figure on: a zero divisor and a rounding tie either way
(<a href="https://github.com/beyond10x/ess/issues/560" target="_blank" rel="noopener noreferrer" class="">#560</a>).</p>
<p>A guard may read a fact through a digest or encoding function: <code>challenge != base64url(sha256(ascii(input.verifier)))</code> states a PKCE <code>S256</code> check as a held-row predicate
(<a href="https://github.com/beyond10x/ess/issues/584" target="_blank" rel="noopener noreferrer" class="">#584</a>).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-precedence-order">One precedence order<a href="https://beyond10x.github.io/ess/releases/typed-expressions-and-one-precedence-order#one-precedence-order" class="hash-link" aria-label="Direct link to One precedence order" title="Direct link to One precedence order" translate="no">​</a></h2>
<p>Under <code>ess/27</code> a branch answers in the order of what it must read: the request alone, then whether
the addressed record exists, then what it holds, then the rows around it, then the accepting
branches (<a href="https://github.com/beyond10x/ess/issues/554" target="_blank" rel="noopener noreferrer" class="">#554</a>). Every guard pair once refused for
want of an order now validates, such as <code>when_related:</code> beside <code>when_subject:</code> or <code>wrong_state:</code>
(<a href="https://github.com/beyond10x/ess/issues/282" target="_blank" rel="noopener noreferrer" class="">#282</a>).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="more-in-ess27">More in <code>ess/27</code><a href="https://beyond10x.github.io/ess/releases/typed-expressions-and-one-precedence-order#more-in-ess27" class="hash-link" aria-label="Direct link to more-in-ess27" title="Direct link to more-in-ess27" translate="no">​</a></h2>
<ul>
<li class=""><code>shorthand: &lt;field&gt;</code> on a struct type lets a value be written as that one field
(<a href="https://github.com/beyond10x/ess/issues/594" target="_blank" rel="noopener noreferrer" class="">#594</a>).</li>
<li class="">An <code>each:</code> entry of <code>affects:</code> may move or delete the row each element names
(<a href="https://github.com/beyond10x/ess/issues/596" target="_blank" rel="noopener noreferrer" class="">#596</a>).</li>
<li class="">A binding condition may compare a <code>Boolean</code> leaf with <code>true</code> or <code>false</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conformance">Conformance<a href="https://beyond10x.github.io/ess/releases/typed-expressions-and-one-precedence-order#conformance" class="hash-link" aria-label="Direct link to Conformance" title="Direct link to Conformance" translate="no">​</a></h2>
<ul>
<li class=""><code>ess verify conform diff --from &lt;suite&gt; --to &lt;suite&gt;</code> says which scenarios two suites add,
remove and change, and <code>--format json</code> writes an <code>ess-suite-diff/1</code> document
(<a href="https://github.com/beyond10x/ess/issues/572" target="_blank" rel="noopener noreferrer" class="">#572</a>).</li>
<li class=""><code>ess verify conform synthesize --check</code> compares what it would write with what is committed
(<a href="https://github.com/beyond10x/ess/issues/571" target="_blank" rel="noopener noreferrer" class="">#571</a>).</li>
<li class="">Suites <code>ess-conformance/52</code> and <code>/53</code> state the event catalog once at the root instead of in
every scenario, check a value type's invariants inside a view's lists, maps, optionals and
unions, and await a command the system issues itself
(<a href="https://github.com/beyond10x/ess/issues/570" target="_blank" rel="noopener noreferrer" class="">#570</a>,
<a href="https://github.com/beyond10x/ess/issues/542" target="_blank" rel="noopener noreferrer" class="">#542</a>).</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.59 — An authored act states the caller its command is sent as]]></title>
            <link>https://beyond10x.github.io/ess/releases/authored-caller-attributes</link>
            <guid>https://beyond10x.github.io/ess/releases/authored-caller-attributes</guid>
            <pubDate>Sun, 11 Oct 2026 00:30:00 GMT</pubDate>
            <description><![CDATA[0.59.0 lets an authored scenario state the caller attributes its command reads, and fixes two cases where synthesis refused or mis-chose a scenario.
]]></description>
            <content:encoded><![CDATA[<p>0.59.0 is a feature release. It adds the authored scenario format <code>ess-scenario/5</code>; specifications,
suites and deltas keep their formats. The
<a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists every change since 0.55.0.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-authored-act-states-its-caller">An authored act states its caller<a href="https://beyond10x.github.io/ess/releases/authored-caller-attributes#an-authored-act-states-its-caller" class="hash-link" aria-label="Direct link to An authored act states its caller" title="Direct link to An authored act states its caller" translate="no">​</a></h2>
<p>An act in an <code>ess-scenario/5</code> document states the caller its command is sent as, under <code>caller:</code>.
Each attribute value is a literal of its declared type, or <code>{$instance: name}</code> for an instance
arranged with <code>setup:</code>. A command that records <code>{caller: account_id}</code> now runs from an authored
scenario on the <code>interpreted</code> target and the generated Go and TypeScript runners.</p>
<ul>
<li class=""><code>ess verify conform author</code> refuses an attribute the act's <code>actor:</code> does not declare
(<code>ESS-AUTHOR-013</code>), a required attribute the command reads that the act leaves unstated
(<code>ESS-AUTHOR-014</code>), and an instance captured at run time (<code>ESS-AUTHOR-015</code>), naming the attribute
and the command.</li>
<li class="">An act with no <code>caller:</code> sends none, and its suite keeps its bytes. <code>ess-scenario/1</code> to <code>/4</code>
refuse the key.</li>
<li class="">A suite step that reaches a caller attribute nothing supplied is still <code>unsupported</code>, now with a
reason naming the attribute and <code>caller:</code>.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="synthesis">Synthesis<a href="https://beyond10x.github.io/ess/releases/authored-caller-attributes#synthesis" class="hash-link" aria-label="Direct link to Synthesis" title="Direct link to Synthesis" translate="no">​</a></h2>
<ul>
<li class="">A command whose branches a stored field of its subject selects (<code>when_subject:</code>) gets its
scenarios even when no view observes that field; synthesis used to refuse each with
<code>ESS-SYNTH-001</code>. A model with an immediate view covering the guarded fields keeps its suite byte
for byte (<a href="https://github.com/beyond10x/ess/issues/496" target="_blank" rel="noopener noreferrer" class="">#496</a>).</li>
<li class="">A <code>when_related:</code> guard that reads a member of a struct input is decided against the key the
subject was created under, where it used to choose a row against a key the search made up. A
struct sent as a literal keeps its scenarios byte for byte (<a href="https://github.com/beyond10x/ess/issues/521" target="_blank" rel="noopener noreferrer" class="">#521</a>).</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.55 — Json in CLI results, and optional values an implementation supplies]]></title>
            <link>https://beyond10x.github.io/ess/releases/json-cli-results-and-optional-generator-ports</link>
            <guid>https://beyond10x.github.io/ess/releases/json-cli-results-and-optional-generator-ports</guid>
            <pubDate>Tue, 06 Oct 2026 20:00:00 GMT</pubDate>
            <description><![CDATA[0.55.0 lets a CLI result carry a JSON document as JSON, and routes an optional generated value through a port the implementation answers.
]]></description>
            <content:encoded><![CDATA[<p>0.55.0 is a feature release. Specifications, suites and deltas keep their formats. It follows
0.54.0, released the same day with source format <code>ess/23</code>; the
<a href="https://github.com/beyond10x/ess/blob/main/CHANGELOG.md" target="_blank" rel="noopener noreferrer" class="">changelog</a> lists both.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-cli-result-carries-json-as-json">A CLI result carries JSON as JSON<a href="https://beyond10x.github.io/ess/releases/json-cli-results-and-optional-generator-ports#a-cli-result-carries-json-as-json" class="hash-link" aria-label="Direct link to A CLI result carries JSON as JSON" title="Direct link to A CLI result carries JSON as JSON" translate="no">​</a></h2>
<p>A CLI result field may now be typed <code>Json</code>, alone or under <code>Optional</code>, <code>List</code> or a <code>String</code>-keyed
<code>Map</code>. The generated adapter writes the value as JSON, so a caller parses the answer once instead
of decoding JSON text out of a JSON answer.</p>
<ul>
<li class="">The result check accepts any JSON value in that field and refuses a reply outside the declared
shape as <code>cli_result</code>.</li>
<li class="">A <code>Json</code> input field is refused: an argv word has no JSON spelling a binding declares. A <code>Json</code>
error field is refused too.</li>
<li class="">Generated CLI packages carry new <code>src/wire.rs</code> bytes, so <code>ess generate cli --check</code> reports drift
until they are regenerated (beyond10x/ess#468).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-optional-generated-value-comes-from-the-implementation">An optional generated value comes from the implementation<a href="https://beyond10x.github.io/ess/releases/json-cli-results-and-optional-generator-ports#an-optional-generated-value-comes-from-the-implementation" class="hash-link" aria-label="Direct link to An optional generated value comes from the implementation" title="Direct link to An optional generated value comes from the implementation" translate="no">​</a></h2>
<p><code>{generated: true}</code> on a value of type <code>Optional&lt;T&gt;</code> used to be filled absent every time. From
0.55.0 the generated Rust and Go behaviours read it from a context port that answers an optional
<code>T</code>, so a value that is absent only when there is nothing to report can reach the event.</p>
<ul>
<li class="">The port is <code>generate_optional_&lt;t&gt;</code> returning <code>Option&lt;T&gt;</code> in Rust and <code>GenerateOptional&lt;T&gt;</code>
returning <code>*T</code> in Go. A context that implements the port adds the method; the generated
demonstration context answers it absent.</li>
<li class="">A field nothing sets stays absent and asks no port (beyond10x/ess#467).</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.51 — Branches selected by existence, and output that regenerates anywhere]]></title>
            <link>https://beyond10x.github.io/ess/releases/existence-lookup-and-portable-output</link>
            <guid>https://beyond10x.github.io/ess/releases/existence-lookup-and-portable-output</guid>
            <pubDate>Thu, 01 Oct 2026 21:30:00 GMT</pubDate>
            <description><![CDATA[0.51.0 generates the existence lookup a Rust server needs to choose between creating and refusing, and lets committed generated output regenerate in another checkout.
]]></description>
            <content:encoded><![CDATA[<p>0.51.0 is a feature and fix release. Specifications, suites and deltas keep their formats.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="branches-selected-by-whether-the-record-exists">Branches selected by whether the record exists<a href="https://beyond10x.github.io/ess/releases/existence-lookup-and-portable-output#branches-selected-by-whether-the-record-exists" class="hash-link" aria-label="Direct link to Branches selected by whether the record exists" title="Direct link to Branches selected by whether the record exists" translate="no">​</a></h2>
<p>A command with an <code>existing_instance:</code> refusal beside a creation, or a creating
<code>unknown_instance:</code> branch beside an update, needs to know whether the record is already stored.
Until now the generated Rust server owed such a command as an obligation. From 0.51.0 it looks the
input identity up in the storage port before dispatch and selects the branch itself.</p>
<ul>
<li class="">A command whose lookup would not match its creations (another entity, another input field, an
identity that is not an input) stays an obligation.</li>
<li class="">Go, Web and Clap still refuse both forms by name.</li>
<li class="">If your realization implemented one of these commands' <code>…Behavior</code> obligation, <code>Generated&lt;P&gt;</code>
now runs the generated behaviour and no longer forwards that command to it
(beyond10x/ess#310).</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="committed-output-regenerates-in-another-checkout">Committed output regenerates in another checkout<a href="https://beyond10x.github.io/ess/releases/existence-lookup-and-portable-output#committed-output-regenerates-in-another-checkout" class="hash-link" aria-label="Direct link to Committed output regenerates in another checkout" title="Direct link to Committed output regenerates in another checkout" translate="no">​</a></h2>
<p>Generated output committed with its <code>.ess-output</code> now regenerates in a clone, a second worktree or
CI, under any umask, when its owned files still have their recorded bytes:</p>
<ul>
<li class="">a regeneration that changes nothing leaves <code>state.json</code> byte-identical, and the first one that
writes records the new root;</li>
<li class="">a state carried without matching files refuses, lists them, and prints the steps to re-enroll
with <code>ess generate output adopt</code>;</li>
<li class="">a root replaced by a copy mid-transaction refuses recovery there (beyond10x/ess#306).</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.50 — Aggregates over rows a when_related guard admits]]></title>
            <link>https://beyond10x.github.io/ess/releases/aggregates-over-related-guards</link>
            <guid>https://beyond10x.github.io/ess/releases/aggregates-over-related-guards</guid>
            <pubDate>Thu, 01 Oct 2026 20:00:00 GMT</pubDate>
            <description><![CDATA[0.50.0 is one synthesis fix: an aggregate view whose creating command has a when_related guard gets its aggregate scenario instead of being refused with ESS-SYNTH-017.
]]></description>
            <content:encoded><![CDATA[<p>0.50.0 is a fix release. Specifications, suites and deltas keep their formats.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="aggregates-over-a-when_related-guarded-creator">Aggregates over a <code>when_related</code>-guarded creator<a href="https://beyond10x.github.io/ess/releases/aggregates-over-related-guards#aggregates-over-a-when_related-guarded-creator" class="hash-link" aria-label="Direct link to aggregates-over-a-when_related-guarded-creator" title="Direct link to aggregates-over-a-when_related-guarded-creator" translate="no">​</a></h2>
<p>Until now, an aggregate view over rows created by a command with a <code>when_related</code> guard was
refused with ESS-SYNTH-017: synthesis could not create the rows the view counts, because each
needed a related row the guard would accept. From 0.50.0 the view gets its <code>&lt;view&gt;/aggregate</code>
scenario:</p>
<ul>
<li class="">each row's related row is arranged first, and rows given one value of the guard's input share
it;</li>
<li class="">every input a guard predicate compares with the related row's owner link names an owner that
is arranged too;</li>
<li class="">a group key read from a related row's owner link holds one owner per value, so a target that
groups under the wrong owner fails.</li>
</ul>
<p>Where a row still cannot be arranged, the refusal names the reason (beyond10x/ess#272).</p>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.49 — Served surfaces enforce actor grants, and a related row's state]]></title>
            <link>https://beyond10x.github.io/ess/releases/actor-grants-and-related-state</link>
            <guid>https://beyond10x.github.io/ess/releases/actor-grants-and-related-state</guid>
            <pubDate>Thu, 01 Oct 2026 16:00:00 GMT</pubDate>
            <description><![CDATA[0.49.0 makes generated servers refuse a caller the specification does not grant a command, with suites that witness the refusal, adds ess/20 for a related row's lifecycle state in a when_related guard, and closes six synthesis and diff gaps.
]]></description>
            <content:encoded><![CDATA[<p>0.49.0 adds the source format <code>ess/20</code>, described in
<a class="" href="https://beyond10x.github.io/ess/docs/reference/spec-versions">the format history</a>. It changes the signature of generated
servers in a specification that declares actors, so a caller of <code>dispatch</code>, <code>handle</code> or <code>serve</code>
has one change to make.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="served-surfaces-enforce-actor-grants">Served surfaces enforce actor grants<a href="https://beyond10x.github.io/ess/releases/actor-grants-and-related-state#served-surfaces-enforce-actor-grants" class="hash-link" aria-label="Direct link to Served surfaces enforce actor grants" title="Direct link to Served surfaces enforce actor grants" translate="no">​</a></h2>
<p>In a specification that declares actors, the generated server's <code>dispatch</code> and <code>handle</code> (Rust)
and <code>dispatch</code> (Go) take the caller your realization authenticated the request as, and <code>serve</code> /
<code>Serve&lt;Component&gt;</code> take an <code>authenticate</code> function that returns it. <code>admit</code> (Rust) and <code>Admit</code>
(Go) expose the check on its own.</p>
<p>Before a command runs, a request with no caller, or with an actor the specification does not
grant the command, gets <code>403 {"refused": "not granted", "actor": &lt;name or null&gt;}</code>. A command no
actor is granted is refused to every caller; views are not grant-checked. The OpenAPI contract of
a served component declares the refusal on every command.</p>
<p>For served components the synthesized suite adds <code>&lt;command&gt;/grant/denied</code>, which borrows a
scenario whose send the command accepts and requires that the target's event log grows by nothing, and
<code>&lt;command&gt;/grant/admitted/&lt;actor&gt;</code> where a granted actor would otherwise never send its command.
Authored scenarios can expect the refusal with <code>refused: not_granted</code>. How a request proves its
actor stays the realization's job.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-related-rows-state-in-when_related">A related row's state in <code>when_related</code><a href="https://beyond10x.github.io/ess/releases/actor-grants-and-related-state#a-related-rows-state-in-when_related" class="hash-link" aria-label="Direct link to a-related-rows-state-in-when_related" title="Direct link to a-related-rows-state-in-when_related" translate="no">​</a></h2>
<p>From <code>ess/20</code>, a <code>when_related</code> predicate may read the related row's held lifecycle state as
<code>state</code>, as a <code>when_subject</code> predicate reads the subject's:
<code>when_related: {via: input.candidate, predicate: state != Accepted}</code>. Earlier formats refuse the
path with <code>unsupported_format_version</code> naming <code>ess/20</code>. Synthesis arranges a related row of an
entity already being arranged one level deep, in its initial state; suites for earlier formats
are unchanged.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="synthesis-and-diff-fixes">Synthesis and diff fixes<a href="https://beyond10x.github.io/ess/releases/actor-grants-and-related-state#synthesis-and-diff-fixes" class="hash-link" aria-label="Direct link to Synthesis and diff fixes" title="Direct link to Synthesis and diff fixes" translate="no">​</a></h2>
<ul>
<li class="">A value copied from a related row through the input a <code>when_related</code> guard reads gets its
success scenario, between other accepted rows, so a target copying from the wrong one fails.</li>
<li class="">An aggregate view grouped by a key copied from a related row gets its <code>&lt;view&gt;/aggregate</code>
scenario.</li>
<li class="">A <code>when_related</code> guard over the <code>via</code> field of an <code>owns</code> relation is witnessed on both sides.</li>
<li class="">A scenario sending a command that reads the caller also runs with the callers swapped and a
fresh caller-supplied identity.</li>
<li class="">A branch with a <code>when:</code> beside a <code>when_subject:</code> gets its scenarios when a later sibling shares
its <code>when:</code>.</li>
<li class=""><code>ess verify diff</code> reports a declaration added or removed on one side only as that addition or
removal, not <code>unclassified-changed</code>.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.48 — UI tests by node path, and reports from an outside runner]]></title>
            <link>https://beyond10x.github.io/ess/releases/ui-tests-and-supplied-results</link>
            <guid>https://beyond10x.github.io/ess/releases/ui-tests-and-supplied-results</guid>
            <pubDate>Wed, 30 Sep 2026 21:00:00 GMT</pubDate>
            <description><![CDATA[0.48.0 runs ess-ui-test/1 tests against the terminal renderer and emits a Playwright spec from the same file, turns an outside runner's per-scenario results into a conformance report, and marks a served 501 whose effect was committed.
]]></description>
            <content:encoded><![CDATA[<p>0.48.0 adds three formats, <code>ess-ui-test/1</code>, <code>ess-ui-test-report/1</code> and
<code>ess-conformance-results/1</code>, described in <a class="" href="https://beyond10x.github.io/ess/docs/reference/formats">the formats reference</a>.
Specifications, suites and deltas keep their earlier formats.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ui-tests-by-node-path">UI tests by node path<a href="https://beyond10x.github.io/ess/releases/ui-tests-and-supplied-results#ui-tests-by-node-path" class="hash-link" aria-label="Direct link to UI tests by node path" title="Direct link to UI tests by node path" translate="no">​</a></h2>
<p>An <code>ess-ui-test/1</code> file tests an <code>ess-ui/1</code> document. Each step is one line: open a page, select
a node by its canonical node path (a row by its key), type, choose, act, page, expect text, rows
or a section's state, play a live event, advance time, or expect a command with given input.
A test can replace the document's fixtures.</p>
<p><code>ess ui test --path &lt;document&gt; &lt;tests…&gt;</code> runs the tests headless against the terminal renderer
and writes <code>ess-ui-test-report/1</code>. <code>--playwright &lt;out&gt;</code> writes a Playwright spec for the
generated React project from the same file; it selects <code>[data-ui-path]</code>, and a step the terminal
cannot check is <code>test.fixme</code> in the spec with the same reason, so one file has one verdict. The
<a class="" href="https://beyond10x.github.io/ess/docs/reference/ess-ui-test">reference</a> compares the language with selector-based browser
tests.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reports-from-an-outside-runner">Reports from an outside runner<a href="https://beyond10x.github.io/ess/releases/ui-tests-and-supplied-results#reports-from-an-outside-runner" class="hash-link" aria-label="Direct link to Reports from an outside runner" title="Direct link to Reports from an outside runner" translate="no">​</a></h2>
<p><code>ess verify conform report --suite &lt;suite&gt; --results &lt;results.json&gt; --implementation &lt;name&gt; --report-out &lt;path&gt;</code> writes an <code>ess-conformance-report/2</code> from the per-scenario results of a
runner written in any language. Coverage, the suite reference and policy come from ESS's own
admission of the suite; the producer profile, <code>external-scenario-status/1</code>, says ESS executed
nothing. aep 0.66.0 records such a report as evidence.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-served-501-says-whether-the-effect-was-committed">A served 501 says whether the effect was committed<a href="https://beyond10x.github.io/ess/releases/ui-tests-and-supplied-results#a-served-501-says-whether-the-effect-was-committed" class="hash-link" aria-label="Direct link to A served 501 says whether the effect was committed" title="Direct link to A served 501 says whether the effect was committed" translate="no">​</a></h2>
<p>Every served <code>501</code> body carries <code>committed</code>: <code>false</code> for an unmet obligation, where nothing was
written, and <code>true</code> when the command took effect and delivering what it published failed. Rust
shells see the second case as <code>Refused::Undelivered</code>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="also">Also<a href="https://beyond10x.github.io/ess/releases/ui-tests-and-supplied-results#also" class="hash-link" aria-label="Direct link to Also" title="Direct link to Also" translate="no">​</a></h2>
<ul>
<li class=""><code>ess ui check --model &lt;dir&gt;</code> reads the specification through the directory's <code>ess-inputs.yaml</code>.</li>
<li class="">An <code>ess</code> that delegates to a pinned release says so on stderr for every command
(<code>ESS_TOOLCHAIN_QUIET=1</code> silences it).</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.47 — UI documents, and generated servers that answer with what a command published]]></title>
            <link>https://beyond10x.github.io/ess/releases/ui-documents-and-published-answers</link>
            <guid>https://beyond10x.github.io/ess/releases/ui-documents-and-published-answers</guid>
            <pubDate>Wed, 30 Sep 2026 16:00:00 GMT</pubDate>
            <description><![CDATA[0.47.0 adds ess-ui/1, a renderer-neutral UI document that loads, checks, runs in the terminal and generates a React project, and makes the generated Rust and Go servers answer with the events a command published, deliver each binding on its own, and keep request headers.
]]></description>
            <content:encoded><![CDATA[<p>0.47.0 adds two formats, <code>ess-ui/1</code> and <code>ess-ui-check/1</code>, described in
<a class="" href="https://beyond10x.github.io/ess/docs/reference/formats">the formats reference</a>. Specifications, suites and deltas keep their
earlier formats.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ui-documents">UI documents<a href="https://beyond10x.github.io/ess/releases/ui-documents-and-published-answers#ui-documents" class="hash-link" aria-label="Direct link to UI documents" title="Direct link to UI documents" translate="no">​</a></h2>
<p>An <code>ess-ui/1</code> document describes an application's shells, pages, sections, widgets, reads,
commands, live channels and where each piece of state is held, without naming a renderer. Its
schema is data, <code>schemas/ui/ess-ui.schema.yaml</code>, and the <a class="" href="https://beyond10x.github.io/ess/docs/reference/ess-ui">reference</a>
is rendered from it by <code>ess ui docs</code>.</p>
<ul>
<li class=""><code>ess ui load --path &lt;document&gt;</code> loads a document and prints how many pages and addressed nodes
it holds, or names the node that refuses it.</li>
<li class=""><code>ess ui check --path &lt;document&gt; [--model &lt;specification&gt;]</code> runs every check the schema declares
and, with a model, checks that each view, command and event the document names exists and that
some actor may read each section. Each finding names its canonical node path; any error exits 1.</li>
<li class=""><code>ess ui run --tui --path &lt;document&gt;</code> runs the document in the terminal, answering reads from
its fixtures and playing live events from a fixture script.</li>
<li class=""><code>ess generate ui --target react</code> writes a Vite + React + TypeScript project.</li>
</ul>
<p><code>examples/partner-portal/</code> is a complete document to start from.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="generated-servers-answer-with-what-a-command-published">Generated servers answer with what a command published<a href="https://beyond10x.github.io/ess/releases/ui-documents-and-published-answers#generated-servers-answer-with-what-a-command-published" class="hash-link" aria-label="Direct link to Generated servers answer with what a command published" title="Direct link to Generated servers answer with what a command published" translate="no">​</a></h2>
<p>A served command's answer now lists <code>published</code>: the events it emitted, in emit order, each as
<code>{event, payload}</code>. The OpenAPI contract types the list item by item. <code>SystemEvent::name</code> and
<code>wire::encode_system_event</code> name and encode any system event, so a runner needs no hand-kept
table. <code>Request.headers</code> keeps the request's headers in arrival order; a shell that builds a
<code>Request</code> literal must add the field.</p>
<p>Delivery is tracked per binding. A binding whose obligation is unmet holds the event in its own
list and tries again on a later pump; every other binding receives the event once, and an
<code>at_most_once</code> binding is never delivered twice. A command whose effect is committed but whose
events could not be delivered is answered 501, now declared on every command, and must not be
retried. The generated Go server serialises dispatch, so concurrent requests are safe.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="fixed">Fixed<a href="https://beyond10x.github.io/ess/releases/ui-documents-and-published-answers#fixed" class="hash-link" aria-label="Direct link to Fixed" title="Direct link to Fixed" translate="no">​</a></h2>
<p><code>ess verify diff</code> no longer reports <code>unclassified-changed</code> beside an added or regrouped aggregate
view (beyond10x/ess#256).</p>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.43 — instance references inside structured values, one refusal order, and unstated external answers]]></title>
            <link>https://beyond10x.github.io/ess/releases/instance-references-in-structured-values</link>
            <guid>https://beyond10x.github.io/ess/releases/instance-references-in-structured-values</guid>
            <pubDate>Tue, 29 Sep 2026 20:00:00 GMT</pubDate>
            <description><![CDATA[0.43.0 lets an authored step name a created instance inside a list, a map or a struct, puts every command's refusals in one declared order, refuses an authored claim that holds only on an external answer the act does not state, and lets synthesis witness guards it refused before.
]]></description>
            <content:encoded><![CDATA[<p>0.43.0 adds the suite formats <code>ess-conformance/32</code> and <code>ess-conformance/33</code>, described in
<a class="" href="https://beyond10x.github.io/ess/docs/reference/spec-versions">the version history</a>. A suite that does not use what they add
keeps its earlier format, and committed suites regenerate byte for byte.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="instance-references-inside-structured-values">Instance references inside structured values<a href="https://beyond10x.github.io/ess/releases/instance-references-in-structured-values#instance-references-inside-structured-values" class="hash-link" aria-label="Direct link to Instance references inside structured values" title="Direct link to Instance references inside structured values" translate="no">​</a></h2>
<p><code>{$instance: …}</code> may now sit inside a list, a map value, a struct member or a union payload of an
authored step, at any depth, wherever the declared type at that position is the instance's
identity type. <code>ring_sequence: [{$instance: a}, {$instance: b}]</code> is accepted for a list of
identities, so a command taking several identities can be authored. A reference at a position of
another type is refused as <code>ESS-AUTHOR-022</code>, naming the position, such as <code>labels[1]</code> or
<code>pair.note</code>. Inside an event payload or an error it is refused as <code>ESS-AUTHOR-021</code>.</p>
<p>A suite that carries such a value is written as <code>ess-conformance/32</code>, or <code>/33</code> with coverage. The
Rust runner resolves it; Go and TypeScript generation refuse such a suite and name the Rust runner.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="an-external-answer-the-act-does-not-state">An external answer the act does not state<a href="https://beyond10x.github.io/ess/releases/instance-references-in-structured-values#an-external-answer-the-act-does-not-state" class="hash-link" aria-label="Direct link to An external answer the act does not state" title="Direct link to An external answer the act does not state" translate="no">​</a></h2>
<p>An authored act that names an <code>external:</code> branch under <code>outcome:</code> now tells the target which answer
to give for that one call, as a synthesized scenario does. Before, no target could satisfy the act
reliably.</p>
<p>An act whose error, response or event claims hold only on an <code>external:</code> answer it does not state
is refused with <code>ESS-AUTHOR-037</code>, which names every such branch as <code>command/branch</code>. That includes
answers reached through a binding's call to another command, which an act cannot state; those
claims are left to synthesis.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="one-order-for-refusals">One order for refusals<a href="https://beyond10x.github.io/ess/releases/instance-references-in-structured-values#one-order-for-refusals" class="hash-link" aria-label="Direct link to One order for refusals" title="Direct link to One order for refusals" translate="no">​</a></h2>
<p>A refusal guarded only by the input may sit beside branches that depend on the record's held
state, so "this value is refused whatever the record's state" can be written on a command that acts
on an existing record. One order now answers every command: a related row's existence checks;
then refusals guarded by the input, first declared first; then the existence of the addressed row;
then the held state; then accepting and external branches in declaration order. The interpreter,
synthesis and the seeded explorer in the Go and TypeScript packages all follow it, as Entity
Runtime does, so a target that refuses a bad input in any state no longer disagrees with the
explorer.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="synthesis">Synthesis<a href="https://beyond10x.github.io/ess/releases/instance-references-in-structured-values#synthesis" class="hash-link" aria-label="Direct link to Synthesis" title="Direct link to Synthesis" translate="no">​</a></h2>
<p>Synthesis now witnesses several guards it refused before with <code>ESS-SYNTH-003</code>:</p>
<ul>
<li class="">a guard over an optional field the creating command leaves absent, read as absent until a later
command sets it;</li>
<li class=""><code>exists</code> and <code>forall</code> over a stored map's values, and over a stored list compared with an input,
on rows that hold several entries, so a target reading only the first or last entry fails;</li>
<li class="">invariants over the members of a struct input, which every input synthesis sends now meets;</li>
<li class="">equality between one input and a member of another.</li>
</ul>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
        <item>
            <title><![CDATA[0.42 — unkillable mutants scored apart, overlap precedence, and counter limits]]></title>
            <link>https://beyond10x.github.io/ess/releases/unkillable-mutants</link>
            <guid>https://beyond10x.github.io/ess/releases/unkillable-mutants</guid>
            <pubDate>Tue, 29 Sep 2026 18:00:00 GMT</pubDate>
            <description><![CDATA[0.42.0 scores a mutant no scenario could kill apart from a survivor, gives two overlapping accepting guards a declared answer, witnesses a stored counter at its limit and a guard over a link field, and lets a relation ride on the identity.
]]></description>
            <content:encoded><![CDATA[<p>0.42.0 adds <code>ess-diff/11</code>, <code>ess-mutation-report/3</code> and <code>ess-mutation-manifest/3</code>, described in
<a class="" href="https://beyond10x.github.io/ess/docs/reference/spec-versions">the version history</a>.</p>
<!-- -->
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mutants-no-scenario-could-kill">Mutants no scenario could kill<a href="https://beyond10x.github.io/ess/releases/unkillable-mutants#mutants-no-scenario-could-kill" class="hash-link" aria-label="Direct link to Mutants no scenario could kill" title="Direct link to Mutants no scenario could kill" translate="no">​</a></h2>
<p>A guard mutant that leaves its outcome's guard satisfied by no input is <code>equivalent</code>
(<code>ESS-MUTATE-005</code>) and names the guard it left dead. A mutant on an outcome whose scenario the
baseline already refused at synthesis is <code>unwitnessed</code> and names that refusal. Neither is scored
<code>survived</code> any more.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="overlapping-guards">Overlapping guards<a href="https://beyond10x.github.io/ess/releases/unkillable-mutants#overlapping-guards" class="hash-link" aria-label="Direct link to Overlapping guards" title="Direct link to Overlapping guards" translate="no">​</a></h2>
<p>Of two accepting guarded branches that both hold, the first declared answers; input-guarded
refusals are still taken first, and an <code>external:</code> branch takes its place in the same order. The
interpreter answers this way, and synthesis sends each overlap and requires the first branch.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="synthesis">Synthesis<a href="https://beyond10x.github.io/ess/releases/unkillable-mutants#synthesis" class="hash-link" aria-label="Direct link to Synthesis" title="Direct link to Synthesis" translate="no">​</a></h2>
<p>Synthesis witnesses a guard comparing a link field with an input, and a branch selected by a stored
counter at its limit, each side of it, so an off-by-one limit fails. A suite from a model whose
actors declare <code>attributes:</code> records that model's digests.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="relations-and-deltas">Relations and deltas<a href="https://beyond10x.github.io/ess/releases/unkillable-mutants#relations-and-deltas" class="hash-link" aria-label="Direct link to Relations and deltas" title="Direct link to Relations and deltas" translate="no">​</a></h2>
<p><code>via:</code> may name the entity's own identity, a one-to-one link keyed by the same id. <code>ess verify diff</code> names a newtype's <code>prefix:</code> added, removed or changed.</p>]]></content:encoded>
            <category>release</category>
            <category>ess</category>
        </item>
    </channel>
</rss>