Skip to content

Accepts ADR-0075 and its two Amendments - #356

Merged
johnnyt merged 1 commit into
mainfrom
st-mgxq-accept-adr-0075
Sep 30, 2026
Merged

johnnyt merged 1 commit into
mainfrom
st-mgxq-accept-adr-0075

Conversation

@johnnyt

@johnnyt johnnyt commented Sep 30, 2026 •

Copy link
Copy Markdown
Member

Accepts ADR-0075 (the Basic HTTP Event I/O Processor) and its two Amendments of 2026-09-30: every POST carries the send's dedup key, and a registration's options reach only the planning callbacks. Their code shipped in statifier 2.10.0, which is published; the tag v2.10.0 is at c8894aea. main is at 39942820, which differs from the tag only by the second Amendment.

What changes

  • docs/adr/0075-basichttp-event-io-processor.md: the record's Status word and both Amendments' Status words flip from proposed to accepted in place. One dated acceptance Note goes at the foot, after the second Amendment.
  • docs/adr/README.md: the 0075 row's status cell reads accepted.
  • git diff origin/main -- docs/adr/ removes four lines: the three Status lines and the README row, each changed only in its status word.

Per-record paragraph

ADR-0075 and its two Amendments, statifier 2.10.0, verified at 39942820. The Context was checked at dc1900d0, where it says it was read. Every Decision, Consequence and Amendment claim was checked at 39942820, which is the v2.10.0 tag (c8894aea) plus the second Amendment. No file under lib/, test/, tools/ or conformance/ differs from the tag. The claims checked, each with its anchor:

Claim Anchor at c8894aea Result
Context: the twelve documents are excluded as :needs_basichttp in both exclusion files, and none is in the corpus or the ratchet tools/corpus/scxml_w3/exclusions.exs, conformance/exclusions.json, conformance/corpus/w3c.json, test/passing_tests.json, all at dc1900d0 holds
Context: ioprocessors_entry/1 receives the type alone; a :send_types value is a bare module; no Application environment is read under lib/ Statifier.Send.Processor, Statifier.Send.Types.from_send_types/1's spec at dc1900d0; no Application.get_env under lib/statifier holds
Context: params and content are folded into data; the session ignores perform/2's return; failed_send/3 is a cast; the case schema refuses host on w3c Statifier.Machine.Content.Send's private data/3, Statifier.Session's private perform_instruction/3, Statifier.Session.failed_send/3, conformance/schema/case.json, all at dc1900d0 holds
1: the processor is Statifier.Send.BasicHTTP, shipped here; the decoder is pure; the durable front is statifier_router's Statifier.Send.BasicHTTP, decode/1 holds (the router front is not built yet; nothing contradicts it)
2: the URI and basichttp are both registered; a built-in spelling is refused when the session starts Statifier.Send.BasicHTTP moduledoc "Registering it"; Statifier.Session.start_link/2's built-in refusal holds
3: both _ioprocessors keys hold one location, the base URL, / and the session id Statifier.Send.BasicHTTP.ioprocessors_entry/2; the test "both registered keys carry one location" holds
3: optional ioprocessors_entry/2 with the session id and the options; the registered set keeps module and options; SystemVariables.initial/3 asks /2, else the /1 entry Statifier.Send.Processor, Statifier.Send.Types, Statifier.Evaluator.SystemVariables.initial/3 holds
3: entries written once at start; a persisted position carries them in the datamodel; a resumed session reads the location it started with Statifier.Evaluator.SystemVariables moduledoc; Statifier.Position drops send_types only holds
4: _scxmleventname and the parameters as a POST form body; content as the body, the name in the query; the shape of data decides; last duplicate wins; no target plans error.communication with the send id; a failed POST reaches the sender Statifier.Send.BasicHTTP's deliver/3 and private post/2 and post_now/2; Statifier.EventData.coerce/1's params rung holds
5: the decoder's inputs and result; first _scxmleventname, query before body, else HTTP.POST; form parameters and a text body through the text rung; origintype is the URI; 204 / 405 with Allow: POST / 400 / the front's 404 Statifier.Send.BasicHTTP.decode/1; Mix.Statifier.BasicHTTPFront holds
6: a transport behaviour with one callback; an :httpc default that verifies the peer, uses the system CA store and checks the host name, and starts :inets and :ssl itself; no new dependency; the req recipe as text Statifier.Send.BasicHTTP.Transport, Statifier.Send.BasicHTTP.Transport.Httpc; mix.exs (no req, extra_applications unchanged); docs/basichttp.md holds
7: host.event_io_processors with a closed item set of one URI; allowed on w3c cases as the only host key; scion carries no host conformance/schema/case.json holds
7: the twelve leave both exclusion files; eleven are claimed and in the ratchet; test201 is in the corpus and unclaimed; the XSL template emits the IRP spelling conformance/corpus/w3c.json, conformance/registry.json, test/passing_tests.json, tools/corpus/scxml_w3/conf_predicator.xsl holds
8 a Statifier.Evaluator.SystemVariables.initial/3 with send_types nil; Statifier.Position holds
8 b: options reach "the plan context a processor's callbacks receive" read with the second Amendment holds as that Amendment states it: :opts reaches deliver/3 and cancel/2, not perform/2
8 b: :base_url is required and its absence refuses the start; :transport defaults to the :httpc adapter; the recording writes options as strings ioprocessors_entry/2's ArgumentError; post/2; Statifier.Session.Recording holds
8 c, e, f, g Statifier.Send.BasicHTTP's private post/2 and data/2; the corpus entries holds
8 d: one attempt; a miss is reported through failed_send/3 via Statifier.Registry; with no live session, {:error, reason} only Statifier.Send.BasicHTTP's private report/3 and whereis/1 holds
9: each "decided here" row is implemented and tested test/statifier/send/basic_http_test.exs, test/statifier/send/basic_http_session_test.exs; mix adr.check green with the delayed-send timer holds
Consequences: what moved in lib/ and with the corpus; the sentences made stale are rewritten; a slow location holds the session, bounded by a timeout; four documents assert less, and test567 keeps its check Statifier.Testing.Case.test_scxml/5's :send_types; Mix.Statifier.Corpus.HostCase; Statifier.Send.Target.supported_type?/1; tools/corpus/README.md; Statifier.Effect.Send; the 5-second timeouts in the :httpc adapter; the XSL's stubbed templates holds
Consequences: "It stays proposed until the code that implements it ships in a published version" statifier 2.10.0 met in the acceptance Note, not reworded
First Amendment: header scxml-send-key; eight fields in ADR-0054 decision 3 / ADR-0059 order joined by /; scope and send id percent-encoded over RFC 3986 unreserved; counters decimal; owner spellings; missing component empty Statifier.Send.BasicHTTP's private send_key/2, escape/1, field/1, owner/1 holds
Second Amendment: a {module, opts} registration's options reach deliver/3's and cancel/2's context under :opts Statifier.Session.Effects's private processor_for/2 holds
Second Amendment: perform/2 receives the session's plan context without :opts, since a handler instruction names no registration Statifier.Session's private perform_instruction/3 and plan_context/1 holds
Second Amendment: a processor carries perform-time configuration in the payload; Statifier.Send.BasicHTTP carries its transport so; the moduledoc names deliver/3 and cancel/2; a bare module gets no :opts Statifier.Send.BasicHTTP's private post/2; Statifier.Send.Processor moduledoc "Registration options" holds
First Amendment: at-least-once; the processor keeps no memory across perform/2 calls perform/2 holds
First Amendment: decode/1 takes optional :send_key, sets no event field from it (sendid stays unset); a malformed key is {:error, {:malformed_send_key, value}}, answered 400; the loopback front does not deduplicate decode/1's private check_send_key/1; Mix.Statifier.BasicHTTPFront holds

Provenance

  • Cure after direction pass 1 (QUALIFIED, one blocking finding): the first version of this PR carried a foot Note reading decision 8 point b as naming the planning callbacks only. That Note narrowed the record, so it was an Amendment, not a Note. The narrowing landed as the second Amendment at proposed in PR 357, and this branch was rebuilt on that main without the Note. The acceptance Note cites the Amendment by its date.
  • Decision 5 does not say what happens to query parameters other than the event name. The decoder adds them to _event.data next to a form body's parameters. For any other body it uses only the event name from the query. Since the record makes no claim here, nothing fails, and this PR adds no Note about it.

Gate

Docs only: no Elixir code changes. mix adr.check and mix quality --profile merge ran green on this tree. The ADR judge skipped: no file in this diff is in one of its judged scopes.

Flips in place the record's Status word and the Status words of its
two Amendments (the dedup-key header, and which callbacks receive
:opts), and the index row's status cell with them. A dated Note goes at
the foot, and no other line is removed.

The Note records the acceptance: the code shipped in statifier 2.10.0
(tag v2.10.0 at c8894ae), and every claim was verified against main at
3994282, which differs from the tag only by the second Amendment. It
reads decision 8 point b with that Amendment. The Context was checked at
dc1900d, where it says it was read.

Docs only: no Elixir code is touched. mix adr.check and
mix quality --profile merge ran green on this tree.

Refs: st-mgxq
@johnnyt
johnnyt force-pushed the st-mgxq-accept-adr-0075 branch from 6313339 to 12db633 Compare September 30, 2026 16:11
@johnnyt johnnyt changed the title Accepts ADR-0075 and its dedup-key Amendment Accepts ADR-0075 and its two Amendments Sep 30, 2026
@johnnyt
johnnyt merged commit 2a44288 into main Sep 30, 2026
1 check passed
@johnnyt
johnnyt deleted the st-mgxq-accept-adr-0075 branch September 30, 2026 16:14
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