ADR-015 — Semantic Model Specification¶
Status: Accepted
Date: 2026-07-05
Owner: Architecture Board
Decision Type: Normative Extension
Supersedes: —
Complements: ADR-003 (Canonical Knowledge Model), ADR-004 (Ontology Modularization)
Context¶
UC-BoK v0.6-alpha is the first release where all major catalog layers — Business Objects, Capabilities, Processes, Domains, Applications, APIs, Events — have rich detail pages with full bidirectional cross-references.
The review of v0.6-alpha identified a gap.
The catalog has 17 canonical relationship verbs (defined in specifications/007-ontology/relationships.md). These verbs are used consistently across 46 Business Objects. But the vocabulary specification stops at naming — it does not declare:
- Cardinality: how many targets a given verb implies (1:1, 1:N, N:M, 0:N)
- Lifecycle coupling: whether deleting the source invalidates the target
- Composition grammar: which BO classifications may compose which, through which verbs
- Dependency types: whether a relationship is structurally, behaviorally, or temporally coupled
Additionally, the catalog has two rule catalogs — constraints.yaml and validation-rules.yaml — that are frequently confused in practice. Authors writing new catalog entries often placed domain invariants into validation-rules and process guards into constraints.
The gap in one sentence¶
The vocabulary existed. The grammar did not.
A vocabulary says: these verbs exist.
A grammar says: these verbs have these properties and these constraints on their use.
Without a grammar, the graph is navigable but not formally reasoned-about. Relationships can be added inconsistently. The distinction between "always true" and "true at runtime" is advisory at best.
What the v0.6 review identified¶
Three layers were already emerging implicitly across the specifications:
| Layer | Examples |
|---|---|
| Ontology | business-object.md, aggregate-root.md, entity.md |
| Catalogs | constraints.yaml, validation-rules.yaml, business-objects/*.yaml |
| Rules | validation-rules.yaml (process guards), constraints.yaml (invariants) |
These three layers are correct. What was missing was their formal declaration, which would:
- Prevent cardinality violations in future catalog entries
- Enable machine-enforceable composition checks in the validator
- Give catalog authors a decision tree for where to place a rule
- Establish the semantic foundation needed before a query engine or UX projection layer can be built
Decision¶
Create specifications/015-semantic-model/ as a new normative module containing four documents:
| Document | Governs |
|---|---|
cardinality.md |
Multiplicity constraints for all 17 canonical relationship verbs |
composition-rules.md |
6 composition rules by BO classification (AR / Entity / VO) |
dependency-taxonomy.md |
3 dependency types: Structural, Behavioral, Temporal |
constraint-vs-rule.md |
Formal distinction between constraints.yaml and validation-rules.yaml |
Key Decisions Within This Specification¶
1. Cardinality is a property of the verb, not the instance¶
An individual catalog author cannot declare contains with 1:1 cardinality. contains always implies 1:N. This is normative.
This prevents a class of subtle modeling errors where authors use contains for singular relationships that should be owns or references.
2. Composition is classification-driven¶
Whether BO A may relate to BO B through verb V depends on the classifications of A and B — not on the author's judgment.
Specifically:
- Only aggregate-root may use contains and owns as source
- value-object may never be a source for structural or operational verbs
- Maximum composition depth: 3 levels from an aggregate-root
3. Three dependency types, not two¶
The industry commonly distinguishes "structural" from "reference" dependencies. UC-BoK declares a third:
- Structural — lifecycle coupled (
contains,owns,fulfills,settles) - Behavioral — process-activated, no lifecycle coupling (
uses,applies-to,creates,results-in,allocates,reserves,issues,derives-from,supports) - Temporal / Contextual — referential only (
references,belongs-to,appears-on,located-at)
This distinction has direct implications for event propagation design. Structural dependencies propagate state change events downward. Behavioral dependencies activate only in process context. Temporal dependencies do not propagate.
4. Constraints and Validation Rules are formally separated¶
The authoritative decision rule for authors:
If the rule is always true, regardless of any running process →
constraints.yaml
If the rule must be true before or after a specific operation →validation-rules.yaml
This is now normative, not advisory. Future validators will enforce placement.
What This ADR Does NOT Decide¶
- KPI vocabulary: KPI relationships (
measured-by) are noted in006-relationship-model.mdas "when modeled". The semantic model does not yet formalize KPI cardinality. - UX Semantic Model: The Experience Projection layer (Task, Interaction, Screen) is deferred to a future EXP-series specification.
- Cross-specification relationships: How the BO-level semantic model relates to the meta-level relationship model (
006-relationship-model.md) is noted but not fully formalized. A future SPEC may consolidate both.
Consequences¶
Positive¶
- Catalog authors have a complete grammar reference — vocabulary + cardinality + composition + dependency
- Machine-enforceable cardinality rules can now be added to the BO schema validator
- The constraint/rule distinction is normative — audit of existing catalogs is now possible
- The semantic foundation is in place for a query engine or UX projection layer
- The three dependency types provide a principled basis for event-driven design patterns
Negative¶
- Existing catalog entries should be audited against the new cardinality rules (particularly
containssource classification enforcement) - The depth limit (3 levels from AR) may surface violations in complex catalog entries
- Authors must now learn the decision tree before placing a rule
Neutral¶
- No existing files are modified by this ADR — it extends the specification set
- No
maketargets are affected - The constraint/rule split already exists; this ADR makes it normative, not structural
Implementation¶
- ✅ Create
specifications/015-semantic-model/README.md - ✅ Create
specifications/015-semantic-model/cardinality.md - ✅ Create
specifications/015-semantic-model/composition-rules.md - ✅ Create
specifications/015-semantic-model/dependency-taxonomy.md - ✅ Create
specifications/015-semantic-model/constraint-vs-rule.md - ⬜ Update
specifications/007-ontology/relationships.mdto reference SPEC-015 for cardinality - ⬜ Add cardinality enforcement to
scripts/validate_ontology.py(future task) - ⬜ Audit existing
catalogs/business-objects/*.yamlagainst composition rules (future task)
Design Principles Established¶
The vocabulary names the verbs. The grammar governs their use.
Inverses are derived, never stored.
Constraints are domain truth. Rules are process guards.
Composition is a property of classification, not author choice.