Skip to content

Accepts the after_step: ADR-0008 amendment - #93

Merged
johnnyt merged 1 commit into
mainfrom
sp-nhl-flip-adr-0008-after-step
Sep 8, 2026
Merged

Accepts the after_step: ADR-0008 amendment#93
johnnyt merged 1 commit into
mainfrom
sp-nhl-flip-adr-0008-after-step

Conversation

@johnnyt

@johnnyt johnnyt commented Sep 8, 2026

Copy link
Copy Markdown
Member

Flips the 2026-09-08 after_step: amendment in
docs/adr/0008-durable-subchart-child-runs.md from proposed to accepted,
now that sp-c48 is on main at e3209bd (PR 91). Docs-only: one
Markdown file under docs/adr/, no lib/, no test/, no fragment.

What changed

  • The amendment's Status line flips in place: proposed -> accepted (2026-09-08, sp-nhl; ... flipped once sp-c48 landed). Those two lines
    are the only removed lines in git diff origin/main -- docs/adr/.
  • A dated Note at the foot of the file records the merge and what was
    re-read against main at 3fd45f7 before the flip. Amend-by-addition:
    nothing above it is reworded.

Verified before the flip (against main at 3fd45f7 = e3209bd + the 0.11.0 prep)

Every clause of the amendment, its worked example and its "what this
section does not decide" hold as written. By anchor:

  • Clause 1, the whole effect list. report_step/3 is reached from
    defp persist_tail(store, run_id, machine_state, effects, executor, write, reporter) in runs.ex with that function's own effects
    parameter; Enum.split_with/2 never rebinds it, so the reporter gets
    the pre-split list. DriverTest's "hands over the whole effect list,
    lifecycle effects included" asserts a {:done, _} reaches the callback
    and not the executor.
  • Clause 1, no public return widened. The seam landed as a
    package-internal step_reporter: option in StatifierPersistence.Runs'
    t:opt/0 union, documented there as this package's own and never a
    host's. No public Runs function's return changed; the arity changes
    are all private (persist_tail/6 -> /7, stepped/6 -> /7).
  • Clause 2, two entry points. The driver calls exactly three Runs
    functions - Runs.create/4 from create/3, Runs.step/5 from defp step(driver, run_id, opts, event, ref), and Runs.cascade_cancel/3,
    which steps nothing. The two step-taking ones are the two the clause
    names, and the driver drains the reporter's buffer and fires the host's
    callback from those two sites after the entry point returns.
  • Clause 3's ordering and clause 4's propagating raise hold, the
    latter with a test ("a raise inside the callback propagates to the
    caller").
  • Every function-head anchor the amendment cites still resolves in
    driver.ex and runs.ex. The one cite whose spelling moved is clause
    1's persist_tail head, which gained the reporter argument; the Note
    says so.

Recorded in the Note rather than edited into the text

  • The per-call override landed as Keyword.get(opts, :after_step, driver.after_step), not the Keyword.put_new/3 spelling the closing
    section named - the same rule ("the caller's option outranks the
    driver's field") written from the other end, since the default lives on
    the struct.
  • A discarded delivery fires nothing, refused on both sides of the
    seam, with a test whose recorded sabotage needed both halves broken.
  • Clause 3's lock statement holds by construction and no test asserts
    it
    : serialized/5 closes before the entry point returns and the
    callback fires after that return. Said plainly rather than papered over.
  • The amendment's own "this section carries no lib/ change and no test,
    and waits for one" is falsified by the flip; per the record-flip rule it
    is met in the Note, not reworded.
  • The seam section's "decision 5 below says why" reads as clause 5 -
    the amendment's own fifth clause. This record's decision 5 is the
    cascade, and the section's other self-references say "clause N". Left as
    written, corrected in the Note (residue the pass-2 reviewer of PR 89
    left).

Gate

Not run, and none applies: the diff touches one Markdown file under
docs/adr/ and no Elixir code - the authority table's "a change touching
no Elixir code has no gate to run and may commit on review of the diff
alone". No changelog fragment: changelog.d/README.md puts documentation
and ADRs on its "do not write a fragment" side.

Closes sp-nhl.

sp-c48 landed at e3209bd on main (PR 91), so the 2026-09-08 amendment's
status line flips in place from proposed to accepted and a dated Note at
the foot of docs/adr/0008 records the merge and the five things re-read
against main at 3fd45f7 before the flip.

Every clause holds as written. Clause 1's whole effect list: persist_tail
reports the list it was handed, never the executable subset, and
DriverTest's "hands over the whole effect list" holds it. Clause 2's two
entry points: the driver still calls Runs.create/4, Runs.step/5 and
Runs.cascade_cancel/3 and no other, and only the first two step. Clause
3's ordering. Clause 4's propagating raise, with its test. Clause 5's
observer posture.

What the Note records rather than edits into the text: the seam clause 1
left open landed as a package-internal step_reporter: option in Runs'
t:opt/0 union, so no public return widened; the per-call override landed
as Keyword.get(opts, :after_step, driver.after_step) rather than the
Keyword.put_new/3 spelling the closing section named, which is the same
rule from the other end; the discarded delivery fires nothing, refused on
both sides of the seam and tested; clause 3's "outside that run's own
exclusion" holds by construction and no test asserts it, which is said
plainly; the amendment's own "carries no lib/ change and no test, and
waits for one" is now false and is met here, not edited; and the seam
section's "decision 5 below says why" reads as clause 5, the amendment's
own fifth clause, since this record's decision 5 is the cascade.

Additive: the only removed lines in docs/adr/ are the two the status text
occupied, and the Note is appended at the end of the file.

Gate: not run, and no gate applies - the diff touches one Markdown file
under docs/adr/ and no Elixir code, which is the authority table's "a
change touching no Elixir code has no gate to run and may commit on
review of the diff alone". No changelog fragment: changelog.d/README.md
lists documentation and ADRs on its "do not write a fragment" side.

sp-nhl
@johnnyt
johnnyt merged commit d72bbf6 into main Sep 8, 2026
1 check passed
@johnnyt
johnnyt deleted the sp-nhl-flip-adr-0008-after-step branch September 8, 2026 22:58
@johnnyt

johnnyt commented Sep 8, 2026

Copy link
Copy Markdown
Member Author

Direction review pass 1: UNQUALIFIED, 0 findings. Merged --rebase at d72bbf6.

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