ADR 0015 — Derive a decision's stage from the floor it sits on, never from a flag
ga · floor-software-engineer
Decision
Derive a decision's stage from the floor it sits on, never from a flag
Why
A feature-flag list kept beside the work drifts from it: the flag says beta while the code shipped a month ago, and nothing disagrees because nothing compares them. Deriving the stage from where the decision actually sits makes 'claims a stage it has not reached' unrepresentable. Promotion becomes a move between floors, which is a mailroom event, append-only and reviewable.
Measured
stageFor is total over DecisionFloor, so a new floor is a compile error rather than an undefined badge. 12 decisions seeded at research-preview because none had merged. The generator's --check catches a hand edit, a stale page, and an orphan page with no row.
Inputs and outputs
This decision declares none. Every name in this section, when present, resolves against the capability vocabulary or the floor registry -- a typo fails the generator rather than rendering.
Where it is
| Floor | floor-software-engineer |
| Stage | ga |
| Pull request | akwlabs-ai/akw-factory-floors#6 |
| Routed | 2026-09-02 |
| Id | b1092254794d3be1 |