From fd18b7e8c3b1a8595d9be629465fde321532beae Mon Sep 17 00:00:00 2001 From: JohnnyT Date: Wed, 30 Sep 2026 10:51:29 -0600 Subject: [PATCH] Prepares 0.9.0 The bump and the changelog promotion, and nothing else: `mix.exs`'s `@version`, which `StatifierRouter.version/0` and the docs' `source_ref` both read; the one `changelog.d/` fragment on main (sr-xgi8) assembled into a `## [0.9.0] 2026-09-30` section under a lead paragraph and an upgrading paragraph, and deleted in the same commit, every bullet carried over byte for byte; the header's `changelog.d/` link moved to `blob/v0.9.0`; and the README install pin moved from `~> 0.8.0` to `~> 0.9.0`, as a minor moves it. A minor, because the release adds public surface and removes or narrows none: `StatifierRouter.BasicHTTP`, `StatifierRouter.BasicHTTP.Front`, `StatifierRouter.Schema.Location` and `StatifierRouter.Migrations.V04` are new modules; `up_locations/1` and `down_locations/1` are new functions; `:basichttp` is a new configuration key, which `new/1` refused as unknown before, so every refusal it brings (the reserved `basichttp` binding id, `{:exclusive_keys, :basichttp, :send_types}`, `{:declared_send_types, type}` for either processor string) reaches only a configuration that sets it. `up/1` and `down/1` walk the same versions as in 0.8.0. The statifier floor moves from `~> 2.9` to `~> 2.10`; the upgrading paragraph says a host still on statifier 2.9 upgrades statifier to take this release. The statifier_persistence floor does not move. No tag and no publish: the merge and the tag are the conductor's, the publish the operator's. `mix hex.build` builds 0.9.0; the tar it wrote was deleted before this commit. Full `mix quality` green under the repo gate lock and a machine slot on this exact tree (write-tree 54f485d8 before and after the run), held across this commit: format, compile, isolated tests, doc links, deps, credo, docs, 420 of 420 tests at 97.7% coverage, dialyzer. Refs: sr-gffo --- CHANGELOG.md | 16 +++++++++++++++- README.md | 2 +- changelog.d/sr-xgi8.md | 7 ------- mix.exs | 2 +- 4 files changed, 17 insertions(+), 10 deletions(-) delete mode 100644 changelog.d/sr-xgi8.md diff --git a/CHANGELOG.md b/CHANGELOG.md index c45d920..ce6c4e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,10 +6,24 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Entries for unreleased work are not written here directly. Each issue drops a -fragment in [`changelog.d/`](https://github.com/riddler/statifier_router/blob/v0.8.0/changelog.d/README.md); the fragments are assembled +fragment in [`changelog.d/`](https://github.com/riddler/statifier_router/blob/v0.9.0/changelog.d/README.md); the fragments are assembled into a version section at release. See that README for the format and for when a change warrants an entry at all. +## [0.9.0] 2026-09-30 + +Feature release: a durable execution can take events at an HTTP location of its own, through the W3C Basic HTTP Event I/O Processor. A configuration that sets the new `:basichttp` key gives each execution created under a new address row a location the router mints, `StatifierRouter.BasicHTTP` reads and rotates it, and `StatifierRouter.BasicHTTP.Front` decodes a POST at it and delivers the event through the existing delivery path. A location is a bearer capability. A configuration without the key behaves exactly as before. + +Upgrading: the statifier floor moves from `~> 2.9` to `~> 2.10`, the release that ships the processor and its decoder, so a host still on statifier 2.9 upgrades statifier to take this release, whether or not it sets `:basichttp`. A host that does not set `:basichttp` changes nothing else: no migration version is added, and `StatifierRouter.Migrations.up/1` and `down/1` behave exactly as before. A host that wants the front sets `:basichttp` and adds one migration of its own calling `StatifierRouter.Migrations.up_locations/1`, with `down_locations/1` on rollback, which creates the location table `StatifierRouter.Migrations.V04` describes; the README's "Upgrading the tables" and "A BasicHTTP front" show both. The statifier_persistence floor does not move. + +### Added + +- `StatifierRouter.BasicHTTP`, the W3C Basic HTTP Event I/O Processor for durable executions: a configuration that sets the new `:basichttp` key (`base_url:` required, `transport:` optional) registers it under the processor's URI and `basichttp`, and each execution created under a new address row gets a location, the base URL and a 43-character token the router mints, never the execution id, which the chart reads in `_ioprocessors`. +- `StatifierRouter.BasicHTTP.location/2` reads an execution's current location and `StatifierRouter.BasicHTTP.rotate_location/2` replaces its token, after which the old location answers 404; the chart's own `_ioprocessors` keeps the location it started with. +- `StatifierRouter.BasicHTTP.Front`, a Plug-shaped front: `handle/3` decodes a POST at a location with statifier's decoder and delivers it through the existing delivery path, deduplicating per execution on the `scxml-send-key` header, and `response/1` answers 204, 404, 405 with `Allow: POST`, 400 or 500. A location is a bearer capability: the front authenticates nothing beyond possession of it. +- `StatifierRouter.Migrations.up_locations/1` and `down_locations/1` create and drop the location table (`StatifierRouter.Migrations.V04`, `locations`), which only a host that sets `:basichttp` needs; it is opt-in and outside the version walk, so `up/1` and `down/1` behave exactly as before. On a configuration with `:basichttp`, a binding whose `id` is `basichttp` is refused as reserved. +- statifier is required at `~> 2.10`, the release that ships the Basic HTTP processor and its decoder. + ## [0.8.0] 2026-09-27 Feature release: a host can build the router's tables with a primary key of its own, and the subscription table's unique index gets a name that fits in a Postgres identifier under the default table prefix. `StatifierRouter.Migrations.up/1` takes `:primary_key`, which builds the `id` of every table a version creates with the host's key type and database default; the schemas read the id back through the new `StatifierRouter.Schema.Id`, and `StatifierRouter.Addresses.reap/2` sweeps a text-keyed table. The README gains a guide, "A transactional outbox, end to end". diff --git a/README.md b/README.md index ae7b771..3eb80a6 100644 --- a/README.md +++ b/README.md @@ -1441,7 +1441,7 @@ decision record that fixes it, in [docs/adr/](https://github.com/riddler/statifi ```elixir def deps do [ - {:statifier_router, "~> 0.8.0"} + {:statifier_router, "~> 0.9.0"} ] end ``` diff --git a/changelog.d/sr-xgi8.md b/changelog.d/sr-xgi8.md deleted file mode 100644 index 7553946..0000000 --- a/changelog.d/sr-xgi8.md +++ /dev/null @@ -1,7 +0,0 @@ -### Added - -- `StatifierRouter.BasicHTTP`, the W3C Basic HTTP Event I/O Processor for durable executions: a configuration that sets the new `:basichttp` key (`base_url:` required, `transport:` optional) registers it under the processor's URI and `basichttp`, and each execution created under a new address row gets a location, the base URL and a 43-character token the router mints, never the execution id, which the chart reads in `_ioprocessors`. -- `StatifierRouter.BasicHTTP.location/2` reads an execution's current location and `StatifierRouter.BasicHTTP.rotate_location/2` replaces its token, after which the old location answers 404; the chart's own `_ioprocessors` keeps the location it started with. -- `StatifierRouter.BasicHTTP.Front`, a Plug-shaped front: `handle/3` decodes a POST at a location with statifier's decoder and delivers it through the existing delivery path, deduplicating per execution on the `scxml-send-key` header, and `response/1` answers 204, 404, 405 with `Allow: POST`, 400 or 500. A location is a bearer capability: the front authenticates nothing beyond possession of it. -- `StatifierRouter.Migrations.up_locations/1` and `down_locations/1` create and drop the location table (`StatifierRouter.Migrations.V04`, `locations`), which only a host that sets `:basichttp` needs; it is opt-in and outside the version walk, so `up/1` and `down/1` behave exactly as before. On a configuration with `:basichttp`, a binding whose `id` is `basichttp` is refused as reserved. -- statifier is required at `~> 2.10`, the release that ships the Basic HTTP processor and its decoder. diff --git a/mix.exs b/mix.exs index 71f8dd7..e8c4044 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule StatifierRouter.MixProject do use Mix.Project - @version "0.8.0" + @version "0.9.0" @source_url "https://github.com/riddler/statifier_router" def project do