You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
String predicate operators starts_with, ends_with and contains (map form, String and its
newtypes, byte-wise and case-sensitive) in every predicate position, source format ess/8.
Synthesis witnesses both branches; suites carrying one take ess-conformance/14/15; Rust and Go
evaluate them, TypeScript and the browser refuse them by version. entity-core is pinned by rev to 718a702 (beyond10x/entity-runtime#40). (#95)
when_subject: {predicate: …} guards an outcome by a predicate over the addressed entity's stored
fields, source format ess/9; refusals read the sibling subject; conformance arranges the row
through sets: mappings, adds rows refuting one conjunct at a time and an absent-subject witness. {field, equals} keeps ess/6 and its bytes. Timestamp orderings lower to entity-core before/after; text orderings are refused at lowering. (#75)
Aggregate views: group_by: and field aggregate: (count, count_distinct, sum, min, max, avg), source format ess/10, ess-conformance/16/17, ess-diff/7, ESS-SYNTH-016/017.
Empty groups are absent; avg is Optional<Decimal>, 6 places half-even. Models without aggregate
views keep their IR bytes. (#96)
Synthesis gives both sides of a presence guard a scenario by omitting the optional; command-input
lists publish .count and their elements, and .count, exists, forall and positional guards
are synthesized. (#93, #94)
website/docs/reference/predicates.md lists every predicate form, where it is accepted and what
synthesis can witness; a test runs every example on it. (#92)
A String newtype may declare alphabet:, a command input example:, and .count on a String
is its length in Unicode scalar values in every predicate position (source format ess/11).
Synthesis draws text from the alphabet, starts from the example and tries lengths either side of a .count literal up to 1024, for text and lists; beyond that ESS-SYNTH-018. ess-diff/8 reports alphabet-changed and input-example-changed. (#103, #104)
outcome_groups: declares one external refusal once for a command list or an actor:/domain:
selector (with except:), source format ess/12; it expands before validation and compiles to the
same IR as copying the outcome by hand. A same-named outcome is refused as ESS-COMMAND-006. (#105)
ess-inputs/2 adds optional requires: ess X.Y[.Z]: an older ess refuses naming the release and b10x upgrade, a newer one warns once, --strict-requires refuses. ess-output-state/2 records the
producer, and a regeneration by another release prints a note. (#106)
A literal in sets: or payload: may be an unquoted YAML boolean or integer, compiling to the
quoted form's bytes; over text or an enum it is refused with quote it. (#113)
An unknown instance has a declared answer: a moves:/updates: command whose instance: names no
record answers its wrong_state outcome, witnessed once per such command with a fresh identity.
The generated Rust and Go seams gain <WrongState>UnknownInstance for it, served as 409 without
a payload; models where the case cannot arise keep their generated bytes. (#113)
ess verify conform mutate: a mutation audit over nine specification mutant classes against the
built-in targets, writing ess-mutation-report/1 (ESS-MUTATE-001/003). The TypeScript and Go
conformance packages carry a seeded random-walk explorer over the IR model, bound to spec_digest
through ir.json, with shrinking and a hard failure on unreached outcomes. (#114)
A release note for 0.31–0.33 (website/blog/2026-09-26-1200-a-secret-is-only-present.md): the
Entity Runtime lowering, OBS-BIND-008 and acknowledged containers, and Secret presence. Without
it the newest note trails 0.34.0 by four minors and cargo xtask docs refuses the tree.
Changed
ess specify validate compiles the authored scenarios ess-inputs.yaml lists and fails on their ESS-AUTHOR-* refusals, counting them in its summary; ESS-COMMAND-018 refuses an invariant that
reads a required field a creates: outcome leaves unset. The bundled examples set such fields. (#112)
Synthesized suites assert the target state of every transition whose view projects state, run a
multi-source transition from every source, give updates a value different from what the row holds,
and probe numeric and timestamp guard boundaries on both sides. Committed suites gain scenarios;
no format change. (#111)
ess generate --kind openapi|asyncapi names every domain no component owns; --strict refuses. (#102)
Go and TypeScript runners that write ess-conformance-report/1 with a skipped scenario point once
at report/2, which carries passed, failed and skipped counts; the guide says where they live. (#110)
An unquoted x == null / != null (and ~, Null, NULL) is refused with ESS-SPEC-017,
naming defined(x); a quoted "null" is text. Ordering a Duration and an unquoted compact
operand containing && or || are refused. Artifacts written by 0.32.x that carry such literals
must be regenerated. (#93)
Text orders byte-wise in every evaluator; Timestamps order as instants wherever declared types are
known. (#94)
A create's omitted Optional input leaves its mapped field null in generated suites.
Fixed
The Go conformance runtime compares numbers by value whatever Go type carries them (int…uint64, float32, float64, json.Number), with Rust's exact semantics. (#101)
The ess-mutation-report/1 row of the formats reference sat above the page's front matter; it
is in the change and conformance records table.