Skip to content

0.34.0

Choose a tag to compare

@github-actions github-actions released this 26 Sep 10:19
· 2332 commits to main since this release

Added

  • 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.