Each constitutive ontology concern lives in its own file, and no file carries another's
Accepted
Context
The ontology of an onboarded project has been split since its first commit into three files: core.ncl (what the project IS — nodes and edges, invariant axioms and named tensions), state.ncl (where it IS against where it wants to BE — dimensions and their transitions) and gate.ncl (when it is READY to cross a boundary — membranes). The practice node ontology-three-file-split describes it, and every other surface assumes it: substrate-freshness reconciles core.ncl alone, `validate ontology` reads core.ncl alone, state transitions are edited in state.ncl alone.
Nothing decided it. The on+re update of 2026-03-14 asked which ADR covered the split, found that none of adr-001..005 did, and proposed one that was never written. adr-032 fixes WHERE the files live, adr-020 requires that core.ncl EXISTS, adr-025 decides WHO holds authority over state; none says what each file may carry. On 2026-09-29 `validate ontology --warrant` reported the node as the last practice in this graph with no recorded provenance.
Surveyed the same day across every consumer ontology that exports standalone (20 projects): all keep the three concerns apart. One extends a concern within its own file — jpl/personal adds active_journey and couplings to state.ncl and fundamental_distinction to gate.ncl — and two workspaces declare no gate.ncl at all. The directory itself now holds thirteen files (manifest, connections, constellation, glossary, lexicon, registry…), so «three files» no longer describes it; three CONCERNS still do.
Decision
The three constitutive concerns of an ontology each live in their own file under the ontology directory. core.ncl carries what the project IS (nodes, edges). state.ncl carries where it is against where it wants to be (dimensions). gate.ncl carries when it is ready to cross a boundary (membranes). A file may extend its own concern with further top-level keys; it never carries a top-level key of another concern. core.ncl is required (adr-020); state.ncl and gate.ncl may be absent, and absence is not a violation. The other files of the directory are outside this decision.
Constraints
- Hard core.ncl exports nodes and carries neither dimensions nor membranes at top level.
- Hard state.ncl, when present, carries neither nodes, edges nor membranes at top level.
- Hard gate.ncl, when present, carries neither nodes, edges nor dimensions at top level.
Alternatives considered
- One ontology file carrying nodes, edges, dimensions and membranes — rejected: Mixes three change rates and three authorities in one diff, and every file-scoped mechanism (substrate-freshness, validate ontology) would read all concerns or need to parse out one.
- An exact key set per file — rejected: Rejects jpl/personal's in-concern extensions of state and gate, which are correct; the defect to prevent is a key of another concern, not an unknown key.
- Leave it as a practice node without a decision — rejected: That was the state from 2026-03-14 to 2026-09-29: an ADR proposed and never written, nothing checking the split, and the warrant audit reporting the node as unrecorded.
Anti-patterns
- Concern folded into the open file — A dimension, a membrane or a node is declared in whichever ontology file the author has open, because the export still succeeds and nothing reads the key there.
Perspectives