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…