Records the after_step: driver seam as a proposed ADR-0008 amendment - #89
Conversation
Appends a dated amendment at the end of docs/adr/0008 stating the driver callback a host needs to keep its own append-only run-events record in step with what this package steps on its behalf: Driver.new/3 takes after_step:, a 3-arity (run_id, machine_state, effects) function stored on the struct and nil by default; it fires after every Runs entry point the driver calls - the driven run's own steps and the parent's step on the answer path alike, including Runs.fail/4's driver: path - with the id of the run that was stepped; after the persist, in order, outside that run's own exclusion; its return is ignored and a raise propagates; and it is neither a telemetry event nor a way to alter the step. Proposed, not accepted: no lib/ change ships with it. sp-c48 implements the callback and sp-nhl flips the status line once that has landed - the same posture the sp-n8g amendment records for itself. Additive only: zero removed lines in docs/adr/, every decision and every earlier note untouched, appended after the sp-y7n note it extends. Every code cite in the new text names a function-head anchor and the SHA it was read at (4e3e2c8). 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-sli
16d982e to
fd6a37e
Compare
|
Direction review pass 1 (head 16d982e): QUALIFIED, 1 finding, 0 blocking. Finding (RECORD-PROSE, NON-BLOCKING): the new text credited the sp-y7n Note with describing campaign 031's fan-out proof working around the seam host-side; that sentence is in the sp-n8g amendment ( Cured in-branch at fd6a37e: the sentence now credits the sp-n8g amendment for the 031 description and the sp-y7n Note for |
|
Direction review pass 2 (scope-frozen re-review, head fd6a37e): UNQUALIFIED, 0 findings, 0 blocking, no new surface. The pass-1 cure was verified from both sides and the misattribution is fixed rather than moved. Scope, append-at-end (189 insertions / 0 deletions), heading and status shape against the sp-n8g amendment, S1-S5 plus the worked example, no contradiction with ADR-0004 d6 / ADR-0008 d3 / ADR-0009 / ADR-0010, every code anchor present at the PR head with its Two non-qualifying advisories carry as residue rather than a cure (after UNQUALIFIED nothing is cured): this body's provenance section says 188 insertions where the cured diff is 189, and the section says "decision 5 below" where its other self-references say "clause N". Merging under the campaign-SF039 grant: full gate not applicable (docs-only, per the CLAUDE.md authority table), CI green on fd6a37e, firewall clean with a constructed positive control, direction verdict UNQUALIFIED within budget. |
Bead
sp-sli(campaign-SF039 lane P, plan key pr1). Records theafter_step:driver seam as a proposed amendment at the end ofdocs/adr/0008-durable-subchart-child-runs.md, per the operator'scampaign-SF039 ruling
RQ-SF039-13.What the amendment says
Driver.new/3takesafter_step:, a 3-arity(run_id, machine_state, effects)function, stored on the struct andnilby default. The third argument is the step's whole effect list, asRuns' persist tail was handed it, not the executable subset thedriver's own executor sees; the seam that carries it out of
Runsissp-c48's, with a widened publicRunsreturn ruled out.Runsentry point the driver calls -Runs.create/4and the privatestep/5'sRuns.step/5, reached fromthe answer loop and from both late-answer doors - with the id of the run
that was stepped. That covers the parent's step on the answer path,
including
Runs.fail/4'sdriver:path, and it reaches nested drivesfor free because a child driver and a resolved parent driver are both
built as
%{driver | machine: ...}.Runs.cascade_cancel/3stepsnothing and fires nothing.
exclusion of the run it reports. The section states the scope of that
guarantee explicitly: decision 3's single child is created from inside
the parent's step, so a child's callback can fire while the parent's
exclusion is held; what is promised is that a run's callback never runs
inside that run's own exclusion.
cost (a part-taken drive, recovered by the same at-least-once re-drive
as every other window in the record) is stated.
seams' opposite failure semantics are why both exist - and not a way to
alter the step.
A worked example (the outside fail of a child answering its parent, the
host appending one row per parent step) and a "what this does not decide"
paragraph close the section.
Status
Proposed, with a status line so there is a line to flip.
sp-c48implements it;
sp-nhlflips this section once that has landed. Nolib/change ships here - the same posture the
sp-n8gamendment above recordsfor itself.
Provenance and checks
sp-y7nnote it extends.git diff origin/main -- docs/adr/is 188 insertions, 0 deletions.(
4e3e2c8); all were re-verified by anchor immediately before thisrequest was opened.
under
docs/adr/and no Elixir code, which is theCLAUDE.mdauthoritytable's "a change touching no Elixir code has no gate to run and may
commit on review of the diff alone". CI runs the full gate on this
branch regardless.
changelog.d/README.mdlists documentationand ADRs on its "do not write a fragment" side.
body, with a constructed positive control: clean, control fired.