Skip to content

Releases 2.15.0 - #458

Merged
johnnyt merged 3 commits into
mainfrom
st-3tmk-release-2-15-0
Oct 12, 2026
Merged

johnnyt merged 3 commits into
mainfrom
st-3tmk-release-2-15-0

Conversation

@johnnyt

@johnnyt johnnyt commented Oct 12, 2026

Copy link
Copy Markdown
Member

Release prep for statifier 2.15.0. The prep only: the desk merges, tags v2.15.0 at the merge SHA and pushes the tag; release.yml publishes on the tag push.

The version and why

2.15.0, a minor. The release adds the :function_providers and :function_names options (ADR-0078), and Statifier.Compiler.Error's closed reason union, t:reason/0, grows by {:unknown_function, name, source}: a chart whose expressions call a function that is not In, a predicator builtin or a declared host function is refused at compile time, where it compiled and raised error.execution at every evaluation of the call. The check stays at compile time as built, ruled by the operator, 2026-10-12, who named this release the same day. The fragment carries the refusal under Changed; none is a Removed or Deprecated entry.

The closed-set answer

Read from git diff v2.14.0..origin/main -- lib and the fragment, for a new member of a closed vocabulary a host pattern-matches:

  • Statifier.Compiler.Error t:reason/0 gains {:unknown_function, name :: String.t(), source :: String.t()}. This is the one new member of a closed union.
  • Statifier.Session.start_link/2 can answer {:error, {:function_providers, reason}} for a provider list that does not resolve, before it starts anything.
  • Statifier.MachineState gains a functions field and put_function_providers/2; Statifier.Position drops the field as it drops invoke_types and send_types.
  • Statifier.Chart.from_binary/1 answers :not_a_statifier_blob for a blob carrying :function_providers or a :function_names that is not a list of strings, an existing answer.
  • A recording with no provider is byte-identical to one written before this change, so the recording format version does not move.

No runtime dependency requirement or lock line moves since v2.14.0, and the conformance corpus does not change.

Fragments promoted

Into ## [2.15.0] 2026-10-12, each bullet byte for byte, then deleted (changelog.d/README.md stays):

  • Added and Changed: changelog.d/st-g648.md

The heading carries no dash and the file gains no link reference (.claude/wurk/release.md step B). The lead paragraph names the new option and the compile refusal; it makes no "registers nothing" claim, as no send type changes.

The upgrading page

A separate commit, as docs/upgrading.md is outside the release commit's files. The title and the intro's range move to 2.15.0, and a new intro sentence names the hosts 2.15.0's changed answer reaches. The 2.15.0 section, written from the fragment's host-facing sentences:

  • must change: only where the compile refusal of an undeclared function reaches a host (register it with :function_providers, or declare its name with :function_names; add a clause for the new reason where the compiler's reasons are matched exhaustively). A ~> 2.14 requirement already accepts 2.15.0.
  • may start: registering host functions, with the purity contract, the resume and replay re-stamp, and the note that a child started for an <invoke> does not inherit the list. Requires ~> 2.15.
  • the corpus: unchanged.

The commits

  1. Carries the upgrading page to 2.15.0 (above).
  2. Releases 2.15.0: exactly .claude/wurk/release.md's files, mix.exs @version "2.15.0", the README pin {:statifier, "~> 2.15"}, the CHANGELOG.md section and the deleted fragment. Committed on the staged tree the full mix quality and mix quality --profile merge ran green on, with no change between the green runs and the commit, the repository's gate lock and a machine slot held across both runs and the commit.
  3. Addresses review of the 2.15.0 upgrading page (the review round below); documentation only.

Gate

Full mix quality green and attested on the final tree (3,329 of 3,329 tests, 96.3% coverage, Dialyzer clean, regression ratchet and conformance corpus passed, README stage green), and mix quality --profile merge green; its ADR judge skipped, as no file in this diff is in a judged scope. Earlier runs on the same tree, on a heavily loaded machine, failed only on Basic HTTP timing cases (the regression ratchet's optional Basic HTTP cases and Statifier.Send.BasicHTTPSessionTest's delayed-send cases), which pass when run alone; this diff touches no code.

Review round: wurk-diff-critic, one fresh round over origin/main...f7525a3, returned 3 findings (none must-fix). All 3 fixed in acea473, on the upgrading page only: the intro now says why the compile refusal is listed under Changed and not as a Breaking entry (it refuses only a chart whose call raised error.execution whenever it was evaluated; the fragment bullet is carried byte for byte and minor follows the 2.14.0 precedent); the must-change bullet names a chart stored before 2.15.0 and recompiled under it; and the may-start steps say that compile/2 and MachineState.new/2 raise ArgumentError for a bad provider list and that a chart given as <invoke> content cannot call a host function. Head reviewed: f7525a3; head after fixes: acea473. The full gate and mix quality --profile merge ran green again on acea473.

After the merge

The desk merges, pulls main, tags v2.15.0 at the merge SHA and pushes the tag; release.yml publishes on that tag push. Nothing in this PR tags or publishes.

The title and the intro's range move from 2.14.0 to 2.15.0, and the
intro gains one sentence naming the hosts 2.15.0's changed answer
reaches. A 2.15.0 section closes the page in the house shape, written
from the fragment's host-facing sentences:

- a host must change only where the new compile refusal reaches it: a
  chart that calls a function that is not In, a predicator builtin or a
  declared host function is refused with {:unknown_function, name,
  source}, where it compiled and raised error.execution at each call;
- a host may start registering host functions with :function_providers
  (or declaring names with :function_names), with the purity contract,
  the resume and replay re-stamp, and the invoke non-inheritance;
- the conformance corpus does not change.

Documentation only: no changelog.d fragment, as changelog.d/README.md
excludes documentation.

Refs: st-3tmk
Assembles the host function providers fragment into a 2.15.0 section and
deletes it, moves mix.exs @Version to 2.15.0, and moves the README
requirement to ~> 2.15. The lead paragraph names the new option and the
compile refusal. Every bullet is carried byte for byte.

ADR-0066's SemVer commitment makes this a minor release: the release adds
the :function_providers and :function_names options, and the
undeclared-function check stays at compile time as built (ruled by the
operator, 2026-10-12). Statifier.Compiler.Error's closed reason union
grows by {:unknown_function, name, source}, which the Changed section
carries: a chart refused by it used to compile and raise error.execution
at every evaluation of the call. No runtime dependency requirement moves
and the conformance corpus does not change.

Committed on the staged tree the full mix quality and mix quality
--profile merge ran green on (write-tree e0431c6 before the commit).
Prep only: the tag and the publish are not part of this commit.

Refs: st-3tmk
- The intro says why 2.15.0's compile refusal is listed under Changed
  and not as a Breaking entry: it refuses only a chart whose call raised
  error.execution whenever it was evaluated.
- The must-change bullet names a chart stored before 2.15.0 and
  recompiled under it, from its source or a Statifier.Chart blob.
- Step 2 says that compile/2 and MachineState.new/2 raise ArgumentError
  for a provider list that does not resolve, where start_link/2 refuses.
- Step 5 adds, as the guide says, that a chart given as <invoke> content
  cannot call a host function.

Refs: st-3tmk
@johnnyt
johnnyt merged commit 99e7427 into main Oct 12, 2026
1 check passed
@johnnyt
johnnyt deleted the st-3tmk-release-2-15-0 branch October 12, 2026 21:05
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant