Skip to content

Adds ADR-0075: the Basic HTTP processor record - #352

Merged
johnnyt merged 1 commit into
mainfrom
st-z0wg-basichttp-processor-record
Sep 30, 2026
Merged

johnnyt merged 1 commit into
mainfrom
st-z0wg-basichttp-processor-record

Conversation

@johnnyt

@johnnyt johnnyt commented Sep 30, 2026

Copy link
Copy Markdown
Member

Summary

ADR-0075, at proposed, records the Basic HTTP Event I/O Processor
(SCXML appendix C.2) as a registered send type in this package, written
from the spike's findings on st-lhwd. ADR-0069 gains a dated foot Note
that names its loose "No conformance result moves" clause and points at
ADR-0075 as the answer to its reopen trigger. docs/adr/README.md
indexes the new record. No lib/ or test/ change, and no changelog
fragment (changelog.d/README.md excludes ADRs).

Refs: st-z0wg, st-swl8 (the ADR-0069 Note rides this PR and closes with it)

What ADR-0075 decides

  1. Placement. statifier-ex owns Statifier.Send.BasicHTTP and its
    pure inbound decoder; statifier_router owns the durable-execution
    inbound front, which calls that decoder.
  2. Type strings. The spec's URI and the short form basichttp, both
    registered; neither is a built-in spelling.
  3. _ioprocessors. Both keys, one location (the base URL, /, the
    session id), written through a new optional ioprocessors_entry/2
    callback that receives the session id and the registration's options.
  4. Outbound mapping (C.2.2). event to _scxmleventname, namelist
    and params to form parameters, <content> to the body (the name then
    in the query string), a missing target to error.communication
    planned in deliver/3, a failed delivery to error.communication
    through Statifier.Session.failed_send/3.
  5. Inbound decoder (C.2.1). Statifier.Send.BasicHTTP.decode/1,
    pure, with the status rule a front applies (204, 405 with
    Allow: POST, 400, the front's 404).
  6. Transport. A behaviour whose always-compiled default is OTP
    :httpc with TLS verification set; no new dependency; a host injects
    any other adapter.
  7. Corpus. host.event_io_processors, a closed set whose one member
    is the Basic HTTP URI, allowed on W3C cases (the W3C ban on host
    lifted for that key only). The documents claimed once the processor
    passes them: test509, test510, test518, test519, test520, test522,
    test531, test532, test534, test567, test577. test201 leaves the
    exclusions and enters the corpus unclaimed (an ordering property no
    processor can meet).

The record also decides each contract gap the spike found (its
decision 8 table, with a column saying a session that registers nothing
sees no change for any of them) and dispositions each edge case the
spike listed (its decision 9 table).

Provenance

  • The placement, both type strings with one location, and a host
    declaration in the case schema as a closed-set growth: ruled by the
    operator, 2026-09-29.
  • No req dependency, with an OTP :httpc default transport: the
    spike's finding (st-lhwd), recorded here. It replaces the earlier plan
    of an optional req dependency; the reason is ADR-0062 fact 2, which
    the record answers by adding no optional dependency.
  • The record's own engineering choices, each with its reason in the
    record: the optional ioprocessors_entry/2 over the alternative the
    spike named; a {module, opts} registration value over application
    environment; no effect field for params versus content; the processor
    reporting its own failed delivery through failed_send/3; the text
    rung for inbound form values; the key name event_io_processors and
    the per-key lift of the W3C ban.
  • ADR-0075's Status line declares that it amends ADR-0069 decision 2 and
    ADR-0070 decision 5 in part. Neither file's decisions are edited here;
    ADR-0069 gains only the foot Note.

Direction check (in-turn)

Every claim ADR-0075 and the ADR-0069 Note make about code on main
was read at dc1900d0 (which is origin/main at this PR's base) and
cites by anchor: Statifier.Send.Processor's ioprocessors_entry/1
callback and moduledoc, Statifier.Send.Types.from_send_types/1,
Statifier.Evaluator.SystemVariables.initial/3,
Statifier.Machine.Content.Send's data/3, Statifier.EventData.coerce/1,
Statifier.Session's perform_instruction/3 and failed_send/3 (a
cast), t:Statifier.Session.Effects.instruction/0,
conformance/schema/case.json's W3C allOf branch,
tools/corpus/scxml_w3/exclusions.exs, the Basic HTTP templates in
conf_predicator.xsl, and the corpus files for the test199, test201 and
statifier-suite facts in the Note. Spec text is quoted from the local
spec cache. No Application environment read exists under lib/
(grepped). git diff origin/main -- docs/adr/ shows zero removed
lines: the Note is appended at the foot of ADR-0069 and the README gains
one row.

Gate

mix gate.verify on the committed tree, quoted whole:

Running quality checks...

✓ Format: No changes needed (369ms)
✓ Compile: dev + test compiled (warnings as errors) (342ms)

Running analysis stages in parallel...

○ Gettext: skipped (:gettext not installed)
○ ADR judge: skipped (disabled in .quality.exs)
✓ Doc links: 37 links checked (53ms)
✓ Dependencies: No unused dependencies (893ms)
✓ ADR guard: No likely ADR violations (1.4s)
✓ Sobelow: No findings (2.2s)
✓ Gate guard: No unjustified gate changes (2.2s)
✓ Doctor: Passed (3.9s)
✓ Conformance corpus: Passed (5.2s)
✓ Docs: No warnings (6.6s)
✓ Credo: No issues (10.0s)
✓ Dialyzer: No warnings (12.0s)
✓ Regression ratchet: Passed (15.7s)
✓ Tests: 3,067 of 3,067 passed, 96.3% coverage (19.9s)

✓ All quality checks passed!
Full gate green: scope all, no profile, 16 stages considered.
Not checked by this project at all: Gettext (:gettext not installed), ADR judge (disabled in .quality.exs)

mix adr.check: "No likely ADR violations". mix quality --profile merge (the ADR judge step): green; the judge skipped because no file in
the diff is in a judged ADR scope. The commit was made on the tree the
gate ran green on, with the repository gate lock and a machine slot held
across both.

ADR-0075, at proposed, decides the Basic HTTP Event I/O Processor
(SCXML appendix C.2) as a registered send type in this package:
Statifier.Send.BasicHTTP under the spec's URI and the short form
basichttp; one session-scoped location written through an optional
ioprocessors_entry/2 callback; a {module, opts} registration value for
the base URL and the transport; the outbound POST mapping; a pure
inbound decoder any front calls, with statifier_router owning the
durable-execution front; a transport behaviour whose default is OTP
:httpc, with no new dependency; and a corpus host key,
host.event_io_processors, allowed on W3C cases, under which eleven of
the twelve Basic HTTP documents are claimed and test201 enters the
corpus unclaimed. It is written from the spike's findings on st-lhwd.

ADR-0069 gains a dated foot Note: its "the corpus names no type outside
the built-in set" is loose (test199, test201 and the statifier suite's
library and myapp types), and ADR-0075 answers its reopen trigger. The
Note decides nothing. docs/adr/README.md indexes the new record. No
lib/ or test/ change.

Refs: st-z0wg, st-swl8
@johnnyt
johnnyt merged commit 8c4de7c into main Sep 30, 2026
1 check passed
@johnnyt
johnnyt deleted the st-z0wg-basichttp-processor-record branch September 30, 2026 12:53
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