Unit ID: vocabulary-temporal-binding
Status: Closed (2026-09-25). Superseded by the plan, status record, and validation pack; retained for historical context. Follow-on hardening items are tracked separately under temporal-binding-consumer-hardening.
Trigger: commit 65ac4a85e11cc1f8616e3e0c24efd59bf4ca410d ([vocabulary] time-bound binding)
Source of truth: ontology/vocabulary/README.md and the extracted spec/vocabulary.ttl.
Vocabulary now supports more than one permanently unscoped scheme per contract. A
voc:SchemeBinding reifies the relationship between a voc:SchemeContract and a
specific voc:ConceptScheme edition. A binding is temporally scoped through
fnd:TemporallyScoped, may apply in one or more opaque voc:BindingScope
contexts, and can be recorded on a versioned record with voc:resolvedUnder.
The ontology states the resolution law in prose but the repository does not yet provide the artefacts needed to make that law reviewable or executable. In particular, there are no vocabulary examples, SHACL constraints, resolution fixtures, executable tests, or cross-layer provenance checks.
voc:bindingScope values are conjunctive. Separate binding nodes
express alternatives. No scope means all contexts.voc:boundScheme is the
unscoped fallback where present.voc:boundScheme for the same contract must name the
same scheme.voc:resolvedUnder preserves the binding that gave historical concept values
their meaning. It must not be re-resolved against today’s bindings.docs/architecture/ontology-architecture.md with the layer
README, including the implementation table, DL encoding, axiom index, worked
pattern, and deferred work.Add a small, domain-neutral fixture set under ontology/vocabulary/examples/:
voc:resolvedUnderforContractbindsSchemeboundSchemeFixtures should include the minimum Foundation and SKOS terms needed to validate meaning, without inventing a Vocabulary-owned business scheme or scope catalogue.
Populate ontology/vocabulary/shapes/constraints.ttl with structural and
SHACL-SPARQL constraints for cardinality, temporal interval sanity, fallback
agreement, equal-specificity conflicts, and historical provenance. Keep the
constraints explicit about the input graph and resolution context. A static
ontology graph cannot by itself infer an arbitrary runtime context or time, so
context/time-dependent checks may use fixture metadata or a documented validation
profile rather than pretending to be OWL axioms.
Use structural.ttl for reusable node shapes and rules.ttl only if a rule is
needed for validation. Do not add a rule that silently chooses a winning binding.
Add a small reference resolver in the repository’s established tooling area, with tests covering:
boundSchemeresolvedUnder without current-state re-resolutionThe resolver is a conformance/reference implementation for the law in the layer README. It must not become a domain-specific runtime or a fuzzy concept matcher.
Add fixtures or contract checks showing how a consumer such as Surface or
Eligibility resolves a concept-valued property before reading the selected
scheme. Check that existing boundScheme behaviour remains valid for unscoped
inputs and that a historical resolvedUnder assertion is retained through a
versioned record path. Do not change Surface or Eligibility semantics in this
unit beyond the smallest adapter or fixture needed to prove the boundary.
docs/developer/validation/.docs/developer/status/vocabulary-temporal-binding.md after every
material action.docs/developer/INDEX.md when the plan, fixtures, tests, or validation
pack changes state.| Slice | Scope | Validation level | Completion gate |
|---|---|---|---|
| 1 | ADR-A85, architecture sync, fixture vocabulary and traceability skeleton | L0, L2 | Human review of semantic parity and ADR |
| 2 | Examples and structural/SHACL-SPARQL validation | L1, L3, L4 | Positive and negative fixtures produce expected conformance |
| 3 | Reference resolver and deterministic test suite | L1, L2 | Conflict and precedence mutations fail the tests |
| 4 | Consumer and historical provenance integration checks, final docs | L3, L4 | Cross-layer contract passes and validation pack is complete |
Each slice should stay within one or two implementation modules. If the resolver, SHACL work, or consumer checks exceed that boundary, split the slice before implementation rather than weakening the validation.