State Machine — history
The dated record of how State Machine got here, moved out of the spec on 2026-10-20 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/state-machine.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, the declaration’s ten well-formedness checks raised to a
Declaration 1 through 17family of their own, every success effect conditioned on a declared admitted instantiate, admitted fire or admitted history (Hard invariant 16), [Fire]’s seven-step rejection precedence kept beside the rules as an eight-row case space with the ordering carried byONLY IFguards rather than by a prose rejection priority line repeated in two sections, the six acceptance areas opened intoCheck 1.1 through 8.2with threeExternal checks for what the store cannot answer, the Non-goals-and-edge-cases prose split into aNon-goal 1 through 21family and four edge-case families (String,Clock semantics,Concurrency,Atomic writes), the Composition notes prose raised toComposition note 1 through 10. Over: the prose spec. Because: the migration plan;cites.py --into state-machinefound nothing in the corpus citing this atom by label. 78.8 KB → 67.0 KB. -
2026-09-12 — The within-workflow temporal bound is a precedence, not a
≥. Chose:Operation 20— IF the resolved firing instant precedes the workflow’s instantiation instant THEN [Fire] MUST answer invalid-request. Over:IF fired_at EXCEEDS instantiated_at OR fired_at = instantiated_at, the two-arm spelling the condition operator set forces on a≥. Because: that spelling is a watched class at five sites across two specs (council read 29), and this atom would have been the third. A bound that admits its own boundary is a precedes prohibition in one arm — the boundary case (a transition firing at the instant of instantiation) is legal, and one arm says so. The class may still earn an operator; it does not need this atom’s vote. -
2026-09-12 — Four propositions had two owners each. Chose:
Invariant 2owns exactly-one-current-state and theStatefamily no longer restates it;Operation 21owns one entry per admitted fire andInvariant 5no longer does;State 4owns the history entry’s field set andInvariant 9no longer does;Invariant 8.2owns the atom does not evaluate a guard and theNon-goalfamily no longer does. Over: keeping each pair for emphasis. Because: Authority 3. All four were found byW-duplicate-proposition, which is the check earning its keep on the largest atom migrated so far — 192 rules, where a reader cannot hold the whole surface at once and a duplicate is invisible by construction.
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).