Repository navigation
0.77.0
HTTP bindings group alike outcomes, OpenAPI import widens, and validate refuses unreachable branches.
6 added, 2 changed, 2 fixed.
Changed
- An
ess-http/1route may declarealike:groups of outcomes whose answers are equal, so two outcomes share a status and body instead of being refused as ESS-HTTP-025; OpenAPI writes one response naming every member inx-ess-outcomes(#652). A group is still refused when the wire tells its members apart, including error objects whose errors carry different fields and a header readingerror.wireover different error wire names. - An outcome may answer a
Stringresponse field astext/plainwithencoding: text(#673). ess-http/1routes may declare their ownrefusals:(on that route in place of the top-level ones),empty.body(noneor a literal object), andbody: arrayfor a view that is not paged; OpenAPI and the Rust and Go servers write all three, and existing bindings keep their bytes (#673).- OpenAPI import admits open objects, the empty and
trueschemas as JSON values, and a nullableanyOf/oneOfpair as an optional value; the import envelopes stay/1(#647). ess generate schema types-bundle --integer-format-widthsrealizesint32/int64formats at native width in every target (#648). It is off by default and the default output is unchanged; with it, the TypeScript report leaves the format range to the consumer (typescript_integer_range).ess generate typestakes--declared-field-orderfor Rust, Go and TypeScript and--rust-box-only-recursionfor Rust (#661). The first emits a model type's fields in the order the specification declares them, so Rust also encodes members in that order and a derivedPartialOrd/Ordcompares them in it; a bundle carries no declaration order and is refused. The second holds a named type by value and boxes a reference only where it closes a cycle of by-value fields, such asOptional<Self>; a reference inside aListorMapis not boxed. The report's configuration records each option given. Without them the generated bytes and the report are unchanged.ess specify validaterefuses awhen:branch whose input guard implies the guard of an input-guarded refusal the precedence order answers before it, equal guards included, asunreachable_branchat the later branch, naming both branches and both guards in the ESS-SYNTH-003 wording (#702). Implication is decided by the finite prover; where it declines a guard, validation stays silent and synthesis keeps ESS-SYNTH-003.- 3 more in the changelog.
Every change: CHANGELOG.md § 0.77.0
Replay before release (local, run by ess)
- The release head was replayed against the 0.76.0 binary on 23 runs of neutral reduced reproductions of adopter reports. No scenario count, refusal count, refusal code or interpreted result moved.
- The ESS commands of five adopter repositories (validate, compile, synthesize, schema, conformance, types and cli) ran on their main branches with both binaries. No exit code moved and no drift against a committed projection moved.
- No adopter is refused by the new
unreachable_branchcheck of #702, so it ships as a refusal rather than a warning.