`gov` is the ROOT of governance, governability and government — not an abbreviation of one of them; an id names structure and a door names audience; a provided domain gets ONE root in its provider's spine; and the rule that says so is checked by a validator that lives in the module, not in a carrier
Accepted
Context
FOUR PARTS, ONE PREMISE. This ADR carries the axis rule, the rename, the domain-content layout and the validator together because separating them would reproduce the exact defect each of them closes: a rule stated where nothing can check it. The rename without the axis rule is a preference; the axis rule without the validator is a carrier; the layout without the rename has no first inhabitant.
THE SELF-DOMAIN WAS BORN WITH A PLACEHOLDER NAME, AND SAID SO. `domains/project-management/domain.ncl` records it in its own header: the id was «already governed, not chosen here» — `domains/schema.ncl` had pre-announced the file by name inside its 'Protocol exemption («Once that self-domain exists, project-management is the only domain this covers»). That was the correct move at the time: taking a name that already existed rather than inventing one. It was never a claim that the name was right.
WHAT THE NAME GETS WRONG IS NOT PRECISION, IT IS EXTENSION. Measured against what the domain actually carries: four ADRs (adr-048, adr-062, adr-068, adr-077), seven modes (governed-delivery, coordinated-delivery, ordinary-act, coder-workflow, release, create-pr, constellation-sync) and two commands (scope, layers). «Project management» names the modes and leaves the ADRs outside — constellation layout, member taxonomy and spine-repo witness are not project management, they are the arrangement itself.
ENGLISH DOES NOT COLLAPSE THE THREE, AND THAT WAS THE MISTAKE IN THE ROOM. The drafting session first read the choice as English-has-one-word-Spanish-has- three, then measured that it does not:
governance ↔ gobernanza the ARRANGEMENT — boundaries, members, what is published governability ↔ gobernabilidad the CAPACITY — whether the subject admits government government ↔ gobierno the EXERCISE and the organ
Electing `governance` names the arrangement and drops the capacity; electing `government` names the seven modes and drops the four ADRs; electing `governability` names a property of the protocol, not of the domain. Each election is a pole-collapse on a question that has three referents, and the domain carries at least two of them.
`gov` PRECEDES THE THREE RATHER THAN ABBREVIATING ONE. It is the shared root, not a shortening, so it elects nothing and leaves all three available in the glossary for their three referents. Verified free: `gov` is not an alias of any domain (`short_alias` across the six) and not a verb in the wrapper.
AND ONE HOMOGRAPH IS REAL AND MUST BE DECLARED RATHER THAN INHERITED. The verb `ontoref governs <path>` already exists. Mechanically there is no collision — dispatch compares argv[1] exactly and `governs` ≠ `gov` — but a reader meets `ontoref gov scope` beside `ontoref governs code/crates/` and they are different acts. With `gov` read as the root rather than as an abbreviation, `governs` is the same trunk: coherence, not collision. Either way the glossary states it, because adr-091 is that a glossed word declares which door is open.
THE SECOND AXIS WAS ALREADY BROKEN AND NOBODY HAD NAMED THE RULE. ADR-064 fixed four marketing DOORS and five domains; the doors name AUDIENCES and the domain ids name STRUCTURE. The `developer` door is a measured failure of that axis: a project manager is served by the governance surface and is not a developer, so the door excludes by audience someone the surface serves. The defect is not imprecision — it is that a door key was chosen on the id's axis. Once the rule is stated the door's defect is DERIVABLE and does not need its own ADR.
THE CONTENT LAYOUT IS A HOLE ADR-098 LEFT OPEN AND MEASURED HERE 2026-08-26. adr-098 established that a domain page resolves from the PROVIDER and lands at `<provider_root>/.ontoref/pages/<stem>.html`. What it did not establish is what happens when one provider provides more than one domain: `pages/` is flat and provider-wide, while the daemon namespaces the same templates in memory as `domain_pages/{domain}/{stem}.html` (`ui/handlers/pages.rs:972`). A namespace in memory over a flat directory on disk. And nothing at all names where the REST of a domain's provider-side material lives — one HTML stem is the only thing with an address.
THE COST OF FIXING IT IS ZERO TODAY AND GROWS ONE PROVIDER AT A TIME. Measured across the nineteen ontoref-adopted projects on this machine: `ls */.ontoref/pages` returns nothing. Not one provider has written a page — provisioning's absence is the state adr-098 shipped deliberately and reports by name. There are no files to move, and there will be for as long as this stays undecided.
THE RENAME BREAKS NO CONSUMER, AND THAT WAS MEASURED, NOT ASSUMED. The bonded carriers on this machine are DD7pasos/.domains-ontoref/htmx-site, ontoref/.domains-ontoref/{htmx-site,provisioning,rustelo} and website-htmx-rustelo/.domains-ontoref/rustelo. None cites `project-management`, because every project reaches this domain by repo_kind = 'Framework — which only ontoref declares — and not one has bonded to it yet.
AND THE PREVIOUS SESSION LEFT A RESIDUE THAT PART FOUR IS THE ANSWER TO. The orient hook and its regression test live in ~/.claude/hooks/ — user level, outside every repository, versioned by nothing. Its own author named the contradiction: the lesson of that session was that a validator goes IN the mechanism and is versioned, and that hook satisfies the first half and not the second. A layout rule whose only enforcement were a carrier would repeat it exactly.
Decision
FOUR PARTS.
1 — THE AXIS RULE. A name is chosen on the axis of the thing it names: an identifier names STRUCTURE, a door names AUDIENCE.
THE TWO AXES MAY USE THE SAME WORD. That is coexistence, not collision — `gov` is the domain id AND the door key, `personal` is a domain id AND a door key, and neither is a defect. The sentence that used to stand here said the opposite («a word belongs to one of them»), was enforced as a lexical check, and was refuted the same day; the amendment records how.
Consequence, derived: the `developer` door was on the wrong axis. It named a PROFESSION, and a project manager served by this surface is not a developer — the exclusion was in the word's axis, never in its collision with anything (no `developer` domain exists).
2 — THE RENAME. `project-management` → `gov`, one word in three places:
id = "gov" what lives in the tree short_alias = "gov" what you type: ontoref gov scope host = gov.ontoref.dev what you visit (its own ADR, later)
`gov` is the ROOT of governance / governability / government and abbreviates none of them. The three words enter the glossary with their three referents, and `ontoref governs` is declared alongside them as the same trunk.
The directory becomes `code/domains/gov/`. `short_alias` moves from `pm` to `gov`. `domains/schema.ncl`'s 'Protocol exemption is re-worded to name `gov`. The frozen glossary term `domain` is corrected from five domains to SIX — a count that has been wrong since the self-domain was created, independently of this rename.
Migration 0078 ships with it: `code/domains/` is installed into the consumer data dir and a domain id is consumer-visible surface. It ships DELTA-LESS. The protocol version is a release decision and is not touched here.
3 — THE CONTENT LAYOUT. A provided domain gets ONE root in its provider's spine:
<provider_root>/.ontoref/domains/<id>/
`pages/` moves inside it: `<provider_root>/.ontoref/domains/<id>/pages/<stem>.html`. The flat `<provider_root>/.ontoref/pages/` is retired before it has an inhabitant.
adr-098's CLAIM is untouched — the page still resolves from the provider, still by an enum that names a root and never a path, still with a named diagnostic and still fail-closed on a contested route. Only the join changes. Per adr-097 supersession is a property of the SUBJECT, not of the claim, so this lands as an AMENDMENT to adr-098 and adr-098 stays Accepted.
The 'Protocol root does NOT change: `<templates_dir>/pages/<stem>.html`. That tree is ontoref's own UI template directory, shared by twenty-four pages, and the self-domain is the only case the exemption covers — namespacing it by domain would create a directory of one.
The root is declared with ONE inhabitant. A second subdirectory under it requires a field in the domain contract that declares what it is for. Convention does not create addresses here; declaration does.
4 — THE VALIDATOR. `ontoref domain validate`, an export of `.ontoref/reflection/modules/domain.nu` — the module adr-101 established as where domain policy lives, so the check is reachable from the CLI, the daemon and MCP alike and not only from a terminal. It is the authority-and-provider sibling of `ontoref bond validate`, which already checks the consumer edge.
It reports, per domain: a. authority completeness — domain.ncl, commands.nu, repo_kinds.txt present b. every declared page resolves against its declared root c. no route claimed by two domains d. the axis rule — no domain id equal to a positioning door key e. required_extensions present on the Layer-1 activation path
A provider whose root does not resolve, or who has not written a declared template, is reported as SKIP and is NOT red. That is adr-098's rule carried into the checker: absence on day one is the ordinary state and must stay distinguishable from a defect.
Constraints
- Hard The self-domain's id, short_alias and host root MUST be the same word: `gov`. None of the three may carry a variant, an expansion, or a category suffix.
- Hard A name MUST be chosen on the axis of the thing it names: an id names STRUCTURE, a door names AUDIENCE. Two axes may use the SAME WORD — that is coexistence, not collision.
- Hard A domain's provider-side material MUST live under `<provider_root>/.ontoref/domains/<id>/`. A page template resolves at `<provider_root>/.ontoref/domains/<id>/pages/<stem>.html`. The flat `<provider_root>/.ontoref/pages/` MUST NOT be read.
- Hard The 'Provider page join is stated in `resolve_page_template` (Rust, authoritative) and in `domain-page-path` (nu, tier-0). The two MUST name the same ordered segments; neither may move alone.
- Hard The 'Protocol variant MUST keep joining `<templates_dir>/pages/<stem>.html`. It may not be namespaced by domain.
- Hard A subdirectory under `<provider_root>/.ontoref/domains/<id>/` other than `pages/` MUST be introduced by a field in the domain contract that declares what it holds. Convention MUST NOT create an address there.
- Hard The domain-layout validator MUST be an export of `.ontoref/reflection/modules/domain.nu`. It may not live in a hook, a carrier, or a user-level file.
- Hard `domain validate` MUST report an unresolvable provider root, and a declared page whose template does not exist, as SKIP — distinguishable in its output from both PASS and FAIL, and not counted as a failure.
- Hard The rename MUST ship with a migration under `.ontoref/reflection/migrations/`. It MUST NOT carry a protocol_version delta.
- Hard The glossary MUST carry governance/gobernanza, governability/gobernabilidad and government/gobierno with their three distinct referents, and MUST declare the `gov` / `ontoref governs` homograph.
- Hard The frozen glossary term `domain` MUST report the number of domains that exist. It currently reports five where there are six.
Alternatives considered
- Name the domain `governance` — rejected: Names the ARRANGEMENT and drops the CAPACITY and the EXERCISE. Concretely: it covers the four ADRs and leaves the seven modes — release, governed-delivery, ordinary-act, create-pr — outside their own domain's name. It is also the pole-collapse ondaod names directly: a question with three referents answered by electing one, with nothing recording what was collapsed.
- Name the domain `government` or `governability` — rejected: `government` is the mirror error — it names the seven modes and drops the four ADRs. `governability` names a property of the PROTOCOL (whether a subject admits government at all), not of the domain; if `ontoref gov check` ever answers «does this project admit government?», that is the protocol answering, and the domain's name would have moved for a question that was never its own.
- Name the domain `gov-domain` or `gov-ontoref-domain` — rejected: Puts the CATEGORY inside the reference, which adr-090 refuses in its own title, and which none of the six peers does. `gov-ontoref-domain` additionally puts `ontoref` inside an id in ontoref's tree — the exact thing `domains/schema.ncl` decided against when it explained why the id was project-management and not ontoref.
- Keep `project-management` and fix only the layout and the validator — rejected: The cheapest option, and it leaves a placeholder name governing a domain whose ADRs it does not describe. It also loses the moment: the rename costs nothing today (no bonded carrier cites the id) and its cost rises with the first consumer that bonds to it. Deferring converts a free correction into a migration with consumers.
- Rename the `developer` door in this ADR — rejected: Bundles a positioning decision — ADR-064's four-door funnel, its narrative and its copy — into a domain ADR, and makes the axis rule look like the justification for a rename someone already wanted rather than a rule the rename follows from. The rule makes the defect derivable; the new name is the door owner's decision.
- Keep `.ontoref/pages/` flat and namespace by stem convention (`<domain>-<stem>.html`) — rejected: Encodes the namespace in filenames, where nothing can check it, while the daemon already carries the real namespace in its registration path. The first provider to forget the prefix collides silently with the second, and the collision surfaces as a template rendering under the wrong domain rather than as an error.
- Fold the 'Protocol root into `.ontoref/domains/gov/pages/` too, for symmetry — rejected: The 'Protocol tree is ontoref's own UI template directory holding twenty-four pages that belong to no domain. Namespacing it would create a directory of one and would move twenty-four unrelated templates to serve a symmetry no resolver needs — the enum already distinguishes the two roots, which is why it is an enum.
- Supersede adr-098 rather than amend it — rejected: Reports that the decision stopped holding, when its claim, its enum, its diagnostics and its fail-closed contested route all hold unchanged. adr-097 makes supersession a property of the subject; using it for a changed path would make the corpus unable to distinguish a frame that broke from a detail that moved.
- Enforce the axis rule in a hook or in CLAUDE.md — rejected: A carrier. ADR-074 makes context-provision a governed surface a carrier invokes and never replicates, and the previous session ended with a live instance of the cost: a validator in ~/.claude, versioned by nothing, written by the same session that concluded a validator belongs in the mechanism.
Anti-patterns
- The root quietly becomes short for one of the three — Someone writes «gov (governance)» in a heading, a nav label, or a page title. The gloss looks helpful and it re-decides the election the root exists to avoid — from that point the domain is named after the arrangement and the exercise has no name. English usage helps it along: .gov and gov.uk both mean government, which is the third word and the one furthest from the arrangement.
- A funnel door takes a role name — A door is named for the people expected to walk through it — developer, PM, founder — because that is how audiences are usually described. It then excludes by audience everyone the surface serves who does not carry that role, and the exclusion is invisible from inside the funnel: the door looks precise, and the people it turns away never appear in its metrics.
- The judgement is replaced by the grep that stands in for it — The axis rule is about which axis a name was chosen ON, and that is a judgement. Someone needs it gateable, restates it as «the two sets of names must be disjoint», and ships the restatement as the rule. It then fails on correct data — one word can honestly name an audience and a structure — and the analysis that follows enumerates ways to PAY for the failure (rename this, rename that, declare an exemption) instead of returning to the premise. Both halves are named in ondaod: `derived-criterion-enforced-as-given`, whose detectable tell is the `lesser-evil menu` that follows it.
- A directory appears and becomes a contract — A provider needs somewhere to put a fragment, creates `<provider_root>/.ontoref/domains/<id>/partials/`, and it works. A second provider copies it. Nothing declared it, nothing checks it, and it is now a layout rule enforced by imitation — the shape ADR-074 refuses for carriers, arriving one directory at a time.
- The validator reports two states where there are three — The checker is wired into CI, SKIP is awkward to represent in a pass/fail gate, and it is folded into one of the two — green because «nothing is wrong», or red because «it is not verified». Either way a provider who has not written a template becomes indistinguishable from a provider whose page works, or from one whose page is broken.
- A consumer-visible id moves inside the tree only — The rename is mechanical, every occurrence in this repository is updated, the tests pass, and no migration is written because nothing here broke. The id is installed into every consumer data dir, so the next consumer to bond finds a domain whose name changed with no record of when or from what.
Related ADRs
ADR-012 · ADR-064 · ADR-069 · ADR-074 · ADR-076 · ADR-090 · ADR-091 · ADR-096 · ADR-097 · ADR-098 · ADR-101