Plan: Semantic versioning for ontology documents

Unit ID: ontology-semantic-versioning Status: Proposed, awaiting human review before implementation Trigger: human request, 2026-09-25 Sketch: ontology-semantic-versioning.md Status record: ontology-semantic-versioning.md ADR: ADR-A86, Proposed

Problem and corrected scope

Every owl:Ontology document under ontology/ carries an ungoverned owl:versionIRI, or none, with no documented rule for when it changes. This unit adopts SemVer 2.0.0 for ontology documents (ADR-A86), documents the MAJOR/MINOR/PATCH classification for a human or agentic contributor to apply, resets every in-scope document to one common baseline, and adds a narrow mechanical check that a version literal actually moved when content did. It does not build an automatic change-classifier, does not touch shapes/*.ttl or projection/*.ttl versioning independence, and does not change what any layer’s ontology says.

Governing decision

ADR-A86 (Proposed) records: SemVer 2.0.0 per owl:Ontology document; spec/*.ttl and vocab/*.ttl remain independently versioned; the PATCH/MINOR/MAJOR mapping table; import-pinning retained as-is with a same-change cascade obligation; the 0.2.0 baseline reset target; and the versionIRI base-URI normalisation bundled into that same reset. No implementation slice below starts until this ADR, the mapping table, the versioning unit, and the baseline number are confirmed at ratification.

Deliverables

1. Governance records (this slice’s own output)

2. Developer and agent guidance

3. Baseline reset

A single mechanical pass across every document the sketch’s inventory table names:

4. Narrow enforcement tooling

Slice plan

Slice Scope Test level Gate Status
1 ADR-A86, sketch, plan, status record, ADR-index and INDEX.md entries L0 Human review of the mapping table, versioning unit, and 0.2.0 baseline number Done
2 ontology-versioning-policy.md, CONTRIBUTING.md and ontology-architecture.md §2 cross-references L0 mise run topology:links finds no broken cross-reference; a second reader can classify a change using only the new document Done
3 Baseline reset (version numbers, base-URI normalisation, owl:imports cascade, per-layer changelog notes) L0, L3 Every affected README’s turtle-spec block still extracts cleanly (tools/literate_extract.py --check); every owl:imports target IRI resolves to a document that exists in the tree; reuse lint still passes Done, with one recorded deviation (see status record)
4 The “changed but not bumped” check, wired into mise L0 The check fires against a fixture with content changed and version literal held constant, and stays silent against a fixture with both changed together (mutation probe) Done

Slice 3 touched every file the sketch’s inventory named plus one additional reference-implementation constant (tools/surface/src/surface/namespaces.py) discovered while enumerating importers. See the status record for the full account, including the one place this slice deviated from the plan’s literal text (it did not run tools/literate_extract.py in write mode, because doing so would have overwritten large amounts of unrelated, already-drifted content that predates this unit).

Acceptance and validation

The single command, once Slice 4 lands:

mise run check:ontology-versioning

Until then, Slices 1–3 validate via mise run topology:links, tools/literate_extract.py --check (run per affected layer), and reuse lint, all of which already exist.

Deliberate non-coverage

Checked documents with no planned change

docs/architecture/solution-design-specification.md, docs/GOVERNANCE.md, the root README.md, and GENAI_CONTRIBUTION.md were checked and contain no ontology-version-specific mechanism this unit must synchronise. This remains an explicit assumption for human review, not a claim the files are permanently out of scope.