OPDA Knowledge base
Physical — deployment

BASPI5

BASPI5

Summary

Authority: British Association of Surveyors Property Information (BASPI). Form version: 5.0.3 (per opda:Baspi5ValidationContext in the profile TTL). Production status: deployed; MVP gate active. BASPI5 round-trip success closes the ontology-implementation programme’s MVP gate per ADR-0014 + ODR-0010 §Q7 + ODR-0003 §“Programme retirement criterion” condition (i).

Source profile TTL

  • profiles/baspi5.ttl (Physical-Ontology tier →)
  • Named graph IRI: https://opda.org.uk/pdtf/shape/profiles/baspi5
  • Version IRI: https://opda.org.uk/pdtf/shape/profiles/baspi5/0.1.0/
  • Triple count: 488 (HEAD; bytes 23 520; sha256 c647c45e00ca…)

The profile emits seven per-class sh:NodeShapes targeting Property, Address, LegalEstate, Seller, Buyer, EPCCertificate, plus the discriminator shape Baspi5_SellersCapacityShape for the nested sellersCapacity oneOf. Every shape carries dct:source <https://www.basp.uk/forms/baspi5#…> form-question IRIs per ODR-0010 §Q3. DASH UI predicates (dash:viewer, dash:editor, dash:propertyRole, sh:order, sh:group) ride on each sh:property per ODR-0010 §Q4.

ValidationContext reification

The profile carries one opda:Baspi5ValidationContext instance per ODR-0010 §Q1:

PredicateValue
rdf:typeopda:ValidationContext
opda:profileURIhttps://opda.org.uk/pdtf/shape/profiles/baspi5
opda:requiresopda:Address, opda:Buyer, opda:EPCCertificate, opda:LegalEstate, opda:Property, opda:Seller, opda:Survey
opda:overlaysContexthttps://opda.org.uk/pdtf/shape/profiles/foundation
opda:sourcedFromhttps://www.basp.uk/forms/baspi5
opda:formVersion5.0.3
dct:sourcehttps://opda.org.uk/pdtf/harness/odr/ODR-0010/section-Q1

Deployable composition

--- config: layout: elk elk: mergeEdges: false nodePlacementStrategy: BRANDES_KOEPF --- %%{init: {"theme": "base", "themeVariables": {"primaryColor": "#FFF8E1", "primaryTextColor": "#E65100", "primaryBorderColor": "#F57F17", "lineColor": "#37474F"}}}%% flowchart LR accTitle: BASPI5 deployable composition accDescr: Shows how the BASPI5 profile composes over the foundation vocabularies classes shapes and module-shape graphs to produce a deployable validation graph for pyshacl. classDef data fill:#FFF8E1,stroke:#F57F17,stroke-width:2px,color:#E65100 classDef process fill:#E1F5FE,stroke:#0277BD,stroke-width:2px,color:#01579B classDef service fill:#E8F5E9,stroke:#2E7D32,stroke-width:2px,color:#1B5E20 foundation["foundation.ttl
opda.org.uk/pdtf/"]:::data vocabularies["opda-vocabularies.ttl"]:::data classes["opda-classes.ttl"]:::data shapesf["opda-shapes.ttl"]:::data moduleclasses["opda-MODULE.ttl × 6"]:::data moduleshapes["opda-MODULE-shapes.ttl × 6"]:::data baspi5["profiles/baspi5.ttl
488 triples"]:::data composer["opda-gen compose"]:::process output["Deployable BASPI5
validation graph"]:::data pyshacl["pyshacl validator"]:::service foundation --> composer vocabularies --> composer classes --> composer shapesf --> composer moduleclasses --> composer moduleshapes --> composer baspi5 --> composer composer --> output output --> pyshacl

Round-trip pipeline

The three-layer harness at tests/baspi5_round_trip/ drives a BASPI5 JSON instance through JSON-to-RDF, SHACL validation, RDF-to-JSON, and an equivalence check. The sequence below shows the layer-1 round-trip path; layer 2 (per-exemplar matrix) and layer 3 (expected-report byte-identity) run as separate CI jobs.

%%{init: {"theme": "base", "themeVariables": {"primaryColor": "#E8F5E9", "primaryTextColor": "#1B5E20", "primaryBorderColor": "#2E7D32", "lineColor": "#37474F"}}}%% sequenceDiagram autonumber accTitle: BASPI5 round-trip pipeline accDescr: Shows the layer-1 round-trip pipeline JSON to RDF to SHACL validation back to JSON with an equivalence check at the end. participant J as BASPI5 JSON instance participant R as JSON to RDF converter participant S as pyshacl + deployable BASPI5 graph participant Q as RDF to JSON converter participant E as Equivalence check J->>R: BASPI5 JSON payload R->>S: Turtle (with dct:source URIs) S-->>R: SHACL validation report
(matches expected-report.ttl) R->>Q: Validated Turtle Q->>E: Round-tripped JSON J->>E: Original JSON E-->>E: assert structural + value equality
(test_round_trip.py)

A consumer running BASPI5 validation loads:

  1. Foundation: foundation.ttl + opda-classes.ttl + opda-shapes.ttl (default-graph union).
  2. Vocabularies: opda-vocabularies.ttl (resolves sh:in value bindings against SKOS schemes).
  3. Module TBox graphs: all six opda-<module>.ttl (so sh:targetClass resolves to declared classes).
  4. Module shape graphs: all six opda-<module>-shapes.ttl (so foundation identity + IC-breach shapes fire).
  5. Overlay: profiles/baspi5.ttl (the per-form cardinality + enum subsets + DASH UI).

The composer (pending; see derived-profiles/README.md §“Activation status”) will eventually emit a single source/03-standards/ontology/derived/baspi5-deployable.ttl representing this graph union. Until composer activation, consumers fetch the seven graphs above and merge in their triplestore.

Round-trip status

Per the three-layer harness (ADR-0014, tests/baspi5_round_trip/):

Last measured 2026-05-28: 27 of 27 tests passing.

Breakdown:

LayerTest fileTestsResult
1 — Round-trip equivalencetest_round_trip.pyper Confirmation #3 + #6PASS
1 — dct:source traceabilitytest_traceability.pyper Confirmation #5PASS
1 — Exemplar regression (combined)test_exemplar_regression.pyper Confirmation #4PASS
2 — Per-exemplar matrixeach exemplar validated in isolation15 exemplarsPASS (covered in matrix CI)
3 — Expected-report byte-identityopda-gen emit-exemplar-reports regeneration15 expected-report filesPASS

The CI matrix at .github/workflows/baspi5-round-trip.yml runs Layer 2 per-exemplar, fail-fast disabled, so a single exemplar failure isolates to its row in the matrix dashboard.

To reproduce locally:

cd /Users/henrik/source/opda
/Users/henrik/source/opda/tools/opda-gen/.venv/bin/python -m pytest tests/baspi5_round_trip -v

Expected tail: 27 passed.

Three-rule interface contract status

Per ADR-0013 §“Three-rule interface contract — CI enforcement”:

RuleCI testStatus
sh:in semantics (overlay enums are subset-of-foundation)opda-gen ci-profile-contractPASS
sh:Violation floor (overlay severity ≥ foundation)opda-gen ci-profile-contractPASS
No-identity-override (overlay MUST NOT redefine foundation identity keys)opda-gen ci-profile-contract (Cat 3 NoIdentityOverride meta-shape)PASS

Reproduce locally:

cd /Users/henrik/source/opda
/Users/henrik/source/opda/tools/opda-gen/.venv/bin/opda-gen ci-profile-contract --ontology-dir source/03-standards/ontology

Expected output: profile contract CI: PASS (all 3 rules).

See operations/round-trip-ci.md for end-to-end CI gate documentation.

Source ADR + ODR

Comments

Loading comments…