Single canonical UFO typing axis
Status note. Draft, pending ratification (directing authority = acting ratifier). Council session-049 deliberated this; its verdict — adopt the single-axis invariant, NOT a corpus-wide re-typing — matches hm ODR-0100 and stands.
Context and Problem Statement
OPDA types classes ontologically in a partial, mixed way: gUFO typing gated to a few descriptive Quality leaves (ADR-0034/0045); Roles/Relators via opda:Role/RoleMixin/Relator meta-classes; OntoClean meta-property markup (ADR-0046). The proposition asked: adopt a single canonical UFO typing axis corpus-wide to make OntoClean rigidity decidable and “unlock an anti-rigid-subsumption CI gate” — vs keep the gated/partial typing.
Council session-049 found the proposition’s headline was stale and its expensive demand wrong, and converged (4–0) on a smaller, correct disposition. This matches prior art hm ODR-0100 (single canonical UFO typing axis) + ODR-0092 (layer/stereotype SKOS schemes).
Decision Drivers
- Decidable OntoClean rigidity — the precondition for any anti-rigid-subsumption gate (checker totality, not reasoner decidability).
- Single source of truth — one axis for a class’s ontological nature; any second axis a derived view.
- Cost / YAGNI — corpus-wide re-typing manufactures unconsumed axioms (ODR-0101 “a latent liability, not a free asset”).
- Honesty — keep the upper-ontology anchor inert (no entailment, no unmet conformance claim).
Considered Options
- (A) Corpus-wide rigidity-vector re-typing of all ~41 classes — REJECTED 4–0 (manufactures ~31 unconsumed axioms; coerces ±R onto non-sortal categories).
- (B) Keep gated/partial typing, do nothing — insufficient (leaves the single-valued-ness invariant unstated/unenforced + a real emitter defect, below).
- (C) Adopt the single-axis invariant + gates (hm ODR-0100) — CHOSEN. State the invariant, enforce it, fix the derivation; do NOT re-type.
Decision Outcome
REVISE → adopt the single-axis invariant, not corpus-wide re-typing (Council session-049, 4–0; matches hm ODR-0100). Two stale premises were rejected: (i) the anti-rigid-subsumption gate “to unlock” already ships green (ADR-0046 checks 8/9, TBox-only); (ii) the single category axis (opda:ufoCategory, owl:AnnotationProperty, closed UFOCategoryScheme) already exists on 39/40 classes (opda:SpecialCategoryScheme, a skos:ConceptScheme, correctly exempt — scope the invariant to first-order universals, not “endurants”).
Adopt (all atomic — ships green or not at all):
- State the invariant —
ufoCategoryis the single canonical typing axis (scoped to first-order universals; scheme/meta artefacts exempt);ontoCleanRigidity/Identity/Dependenceare a derived view (a function ofufoCategory), never an independent assertion; thegufo:rdf:typealignment (ADR-0034) is a derived view viaskos:closeMatch, not a second axis. - Axis-consistency meta-shape over the 8 rigidity-tagged classes — fails CI if a class’s rigidity/identity contradicts its
ufoCategorysignature. - Edge-targeted growth-frontier guard — fails CI when an intra-
opda:rdfs:subClassOfedge has an endpoint lacking a rigidity projection (catches the silent-false-green at edge-authoring time, without pre-typing edgeless classes).
Recommended (not a soundness precondition): automate g(ufoCategory) to replace the hand-table (fixes the lying docstring; makes single-valued-ness hold by construction). Reuse ufoCategory/UFOCategoryScheme; do NOT mint a parallel scheme.
Decline: corpus-wide rigidity-vector population (~31 unread tags); any minted parallel scheme; ±R coercion on non-sortal categories (Information Object, Quality, Quality Value, Collective).
Consequences
- Good — makes single-valued ontological typing an enforced, prospective invariant (sound for class N+1), at near-zero cost; matches hm ODR-0100.
- Good — surfaces and fixes a real generator defect (below).
- Neutral — the ~31 untyped-for-rigidity classes stay untyped (by design).
- Bad — adds 2–3 CI gates + an emitter change to maintain.
Confirmation
- The axis-consistency + edge-targeted meta-shapes ship green, atomically, over the tagged set; full
make ci; byte-identity.
Council sessions and findings
- session-049 (Council B — Queen Guizzardi, DA Davis, panel Guarino + Allemang;
working/session-049/): REVISE 4–0 — adopt the invariant + gates, reject corpus-wide re-typing. The formal core (Guarino): rigidity must denote a functionType → {+R,−R,~R,non-R}; two unconstrained parallel axes make it a relation → the SHACL gate’s−R⋣+Rcheck becomes ill-typed (checker totality, inside OPDA’s gate — not reasoner decidability). - VERIFIED BUG (Allemang’s find, Guarino+Davis confirmed, Queen re-verified):
_ONTOCLEAN_TAGS(tools/opda-gen/src/opda_gen/emitters/ufo_categories.py:298-315) is a hand-maintained 8-row dict keyed by class local-name; the_RIGIDITY_COMMENT/_IDENTITY_COMMENT(:323/:334) claim “Derived from each type’sopda:ufoCategorysignature” but nothing computes it. The 8 values are correct today (gate green) — so the docstring is true in extension, false in mechanism: a latent session-047-class defect that bites when a sortal subkind edge is added through an untyped middle class. Fix: automateg(ufoCategory)(the 9UFOCategorySchemesignatures already hold the table as data) — REQUIRED is the edge-targeted guard; RECOMMENDED is the automation. - Empirical anchors (verified at file:line): ADR-0046 checks 8/9 green (
three_graph_test.py:348/:417);ufoCategoryon 39/40 classes;ontoCleanRigidityon exactly 8 domain classes; only 5 intra-opda:rdfs:subClassOfedges (lattice flat by ODR-0027; all other supers external). - Held dissent — Davis (DA), non-blocking: the rigidity projection stays edge-participant-scoped (never on a class in no intra-
opda:subsumption edge); ships green-or-nothing. Re-open trigger: a rigidity vector authored on an edgeless class, OR the rule shipped as ODR prose without a consuming gate → flat REJECT.
Outstanding work and open tasks
ALL DONE (2026-06-17, commits 4589bb3 + the records): implemented, verified, full make ci green. Items 1–7 below all landed — the invariant is stated (this ADR §Decision Outcome); g(ufoCategory) replaces the hand-table (values derived, docstring no longer lies; byte-identity held — the emitted 8 tags unchanged, proven by the .py-only commit); the axis-consistency check (three-graph check 10) + edge-targeted growth-frontier guard (check 11) ship green with positive controls; SpecialCategoryScheme exemption recorded; session-049 record + adoption.md row written. The corpus-wide rigidity-vector population stays REJECTED (Davis’s edge-participant scope held).
- State the single-axis invariant (scoped to first-order universals) in the doctrine ODR / ADR.
- Add the axis-consistency meta-shape over the 8 tagged classes.
- Add the edge-targeted growth-frontier guard (required for soundness).
- Automate
g(ufoCategory)in the emitter — replace the_ONTOCLEAN_TAGShand-table (recommended; fixes the lying docstring). - Confirm
SpecialCategorySchemeexemption is recorded (first-order-universals scoping). - Proof obligations: gates ship green atomically; byte-identity; full
make ci. - Write the session-049 record +
adoption.mdtrack-record row.
More Information
- Working brief:
docs/HANDOVER-2026-06-17-entailment-doctrine-domain-range-as-signal-relationship-layer-rework.md(Part C5; Part E decision 3). - Related: ADR-0034 (gUFO typing), ADR-0045 (ufocategory/gUFO scheme), ADR-0046 (OntoClean meta-property markup); ODR-0027 (classification-over-inheritance).
- Prior art adopted (cite here only; strip from normative ODR text):
~/source/hm/semantic-modellingODR-0100 (single canonical UFO typing axis), ODR-0092 (layer/stereotype schemes), ODR-0101 (BFO backbone kept inert).
Amendments
- 2026-06-17 (a) — created in Draft; decision OPEN pending Council B.
- 2026-06-17 (b) — Council B (session-049): REVISE 4–0 → adopt the single-axis invariant + 2 gates + the emitter-derivation fix; REJECT corpus-wide re-typing; matches hm ODR-0100. Davis held dissent (edge-scope, non-blocking) recorded.
Comments
Loading comments…
Sign in to post a comment