Exemplar BASPI5 round-trip paired report

    baspi5-transaction-conformant

    A fully conformant BASPI5 transaction — the positive arm of the ci-baspi5-roundtrip gate.

    Input instance (ABox)

    # baspi5-transaction-conformant.ttl — BASPI5 round-trip exemplar (conformant)
    # Hand-authored ABox fixture (ODR-0003 termination signal 1 / ODR-0010 §Rules (a)).
    # The transaction-side complement to the profile-side G3 coverage check: a
    # minimal conformant BASPI5 transaction validated against
    #   base shapes + the loaded BASPI5 overlay profile + the class TBox
    # (with rdfs inference) by the `ci-baspi5-roundtrip` gate
    # (tools/opda-gen/src/opda_gen/ci/baspi5_roundtrip_test.py) — it MUST conform
    # with zero SHACL violations.
    #
    # Contents: an opda:Property carrying the BASPI5-required leaves (uprn, address,
    # propertyType, builtForm, currentEnergyRating, heatingType), an opda:Address
    # (line1 + postcode), an opda:Seller acting as "Legal Owner" (branch (a) of the
    # sellersCapacity sh:xone — no evidenced authority required), an opda:Buyer, and
    # an opda:LegalEstate (ownershipType + tenureKind). Every enum value is an exact
    # member of the BASPI5 sh:in list for its leaf.
    #
    # NOTE — EPCCertificate is modelled by-attribute on the Property
    # (opda:currentEnergyRating), NOT as a separate opda:EPCCertificate node. The
    # emitted Baspi5_EPCCertificateShape binds opda:currentEnergyRating, but that
    # predicate has rdfs:domain opda:Property in the TBox; under rdfs inference an
    # EPCCertificate node carrying currentEnergyRating is inferred to ALSO be an
    # opda:Property and then trips every Baspi5_PropertyShape minCount on that node.
    # That is a latent BASPI5-profile defect (a Property-domain predicate reused on a
    # non-Property target shape), reported as a B2 follow-up — NOT modelled around
    # silently. The conformant transaction therefore carries the energy rating where
    # the domain places it (on the Property); the profile does not require a separate
    # EPCCertificate instance to exist.
    #
    # This is instance data (ABox); it changes no emitted TBox/profile, and is not
    # paired with an expected-report.ttl (it is validated against the BASPI5 profile
    # by ci-baspi5-roundtrip, not against the foundation shapes by the ADR-0014
    # exemplar-regression layer).
    @prefix opda: <https://opda.org.uk/pdtf/> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    @prefix vcard: <http://www.w3.org/2006/vcard/ns#> .
    
    <https://opda.org.uk/pdtf/harness/data/baspi5-conformant/property>
        a opda:Property ;
        rdfs:label "BASPI5 conformant transaction — property"@en ;
        opda:hasUPRN "100023336956" ;
        opda:hasAddress <https://opda.org.uk/pdtf/harness/data/baspi5-conformant/address> ;
        opda:propertyType <https://opda.org.uk/pdtf/scheme/propertyType/House> ;
        opda:builtForm <https://opda.org.uk/pdtf/scheme/builtForm/Detached> ;
        opda:currentEnergyRating <https://opda.org.uk/pdtf/scheme/currentEnergyRating/C> ;
        opda:heatingType <https://opda.org.uk/pdtf/scheme/heatingType/Central-heating> .
    
    <https://opda.org.uk/pdtf/harness/data/baspi5-conformant/address>
        a opda:Address ;
        vcard:street-address "1 Conformant Way, Testville" ;
        vcard:postal-code "TE1 1ST" .
    
    <https://opda.org.uk/pdtf/harness/data/baspi5-conformant/seller>
        a opda:Person, opda:Seller ;
        vcard:fn "Alex Vendor" ;
        vcard:email "alex.vendor@example.org" ;
        opda:roleNotation <https://opda.org.uk/pdtf/scheme/role/Seller> ;
        opda:hasAssertedCapacity <https://opda.org.uk/pdtf/scheme/sellersCapacity/Legal-Owner> .
    
    <https://opda.org.uk/pdtf/harness/data/baspi5-conformant/buyer>
        a opda:Person, opda:Buyer ;
        vcard:fn "Sam Purchaser" ;
        vcard:email "sam.purchaser@example.org" ;
        opda:roleNotation <https://opda.org.uk/pdtf/scheme/role/Buyer> .
    
    <https://opda.org.uk/pdtf/harness/data/baspi5-conformant/estate>
        a opda:LegalEstate ;
        opda:ownershipType <https://opda.org.uk/pdtf/scheme/ownershipType/Freehold> ;
        opda:tenureKind <https://opda.org.uk/pdtf/scheme/tenureKind/Freehold> .
    

    Expected SHACL validation report

    # baspi5-transaction-conformant-expected-report.ttl — paired SHACL validation report
    # Generated by opda-gen 1.0.2; DO NOT HAND-EDIT.
    # Specification: https://opda.org.uk/pdtf/harness/adr/ADR-0007-ontology-generator-specification
    # Implementation: https://opda.org.uk/pdtf/harness/adr/ADR-0014-baspi5-round-trip-mvp-harness
    # Ratifying ODR: ODR-0004 §8a (diagnostic exemplar pairing).
    # Comparison is semantic-equivalence (focusNode, resultPath, severity, constraint, message) per tests/baspi5_round_trip/compare_reports.py.
    
    @prefix dct: <http://purl.org/dc/terms/> .
    @prefix opda: <https://opda.org.uk/pdtf/> .
    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix sh: <http://www.w3.org/ns/shacl#> .
    @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
    
    <https://opda.org.uk/pdtf/harness/data/exemplar-reports/report>
        rdf:type sh:ValidationReport ;
        dct:source <https://opda.org.uk/pdtf/harness/data/exemplar/baspi5-transaction-conformant> ;
        sh:conforms "true"^^xsd:boolean .
    

    The full exemplar catalogue and round-trip contract: Exemplars; the shapes this graph validates against: SHACL shapes; the overlay profiles it loads: Overlay profiles.