Approval Step — history
The dated record of how Approval Step got here, moved out of the spec on 2026-10-19 because a reader does not need it to use the spec today. The spec keeps every section spec-format.md requires and its Deleted: tombstones; everything smaller is in git log -- atoms/approval-step.md.
Decisions
Entries that record a migration or a repair rather than a turn the pattern took.
-
2026-09-12 — Rewritten in GRACE lang v0.40; nothing but language changed. Chose: the five actions as a signature block, Invariant 1 through 10 keeping their numbers, every success effect conditioned on a declared admitted submit, admitted resolve or admitted read (Hard invariant 16), the six-step rejection precedence — repeated verbatim in four places in the prose, once per resolving action and once in the state table — collapsed to one seven-row case space with the ordering carried by
ONLY IFguards, the three resolving actions unified under declared resolving action, deciding reference and decision instant terms so [Approve], [Reject] and [Withdraw] state their shared guards once instead of three times, the six acceptance areas opened intoCheck 1.1 through 6.3with fourExternal checks, the Non-goals-and-edge-cases prose split into aNon-goal 1 through 20family and five edge-case families (String,Clock semantics,Concurrency,Atomic writes,Indeterminate outcome). Over: the prose spec. Because: the migration plan;cites.py --into approval-stepfound nothing citing this atom by label. 81.1 KB → 62.7 KB. -
2026-09-12 — Three propositions had two owners each. Chose:
Invariant 2.1owns membership exclusivity and theStatefamily no longer restates it;Operation 8owns an admitted submit stands the step in pending;Identity 12owns the atom does not confirm a subject reference. Over: keeping each pair. Because: Authority 3, and all three were found byW-duplicate-propositionrather than by reading — the same pattern as State Machine, where the duplicates a 169-rule surface hides are exactly the ones no reader finds. -
2026-09-12 — A cross-spec citation was written in the local form. Chose:
Selective Disclosure Invariant 5.1, the qualified form Hard invariant 28 declares. Over:[Selective Disclosure](/atoms/selective-disclosure.html) states as its \Invariant 5``, which reads as a citation of this spec’s Invariant 5 — submitter exclusivity, an unrelated rule. Because: the citation-aim audit resolved it against the local registry and the aim was wrong. Nothing enforces the qualified form, and a census over the corpus returns 24 candidates of which nearly all are local citations that merely sit near a spec link — so the class is docketed rather than instrumented.
Migration notes
- 2026-09-15 — Capability requirement 1, moved from Operation. What the deployment supplies, which is what the family means. The rule stood under
Operation— one action’s rules — while naming no action, because this spec was migrated before the standard family had a home in an atom; the five atoms migrated a day later put the same obligation here. The words are the words the rule carried (council read 76).