simple-transaction-with-milestones
simple-transaction-with-milestones
Summary
Single freehold sale with five canonical milestones (instruction / offer accepted / exchange / completion / registration). Tests Q1 Transaction-as-Relator + Q2 hybrid PROV-O (instants for offer-accepted + exchange; intervals for completion-process + registration-process) + Q3 status as Phase + Q6 expected-vs-actual variance via PROV-O Plan-vs-Activity reification.
Cross-link: Concept tier — Transaction hard cases.
Exemplar Turtle
# Diagnostic exemplar — ODR-0004 §8a, IC-only — input to ODR-0007 (Transactions & Lifecycle).
# Situation: straightforward freehold sale; one transaction with all five canonical milestones
# (instruction, offer accepted, exchange of contracts, completion, registration). No chain.
# Tests Q1 Transaction-as-Relator framing; Q2 hybrid PROV-O milestones (instants for offer-accepted
# and exchange; intervals for completion-process and registration-process); Q6 expected-vs-actual
# milestone times via PROV-O Plan-vs-Activity reification (planned-time-on-Plan; actual-time-on-Activity).
# Status: post-S007 amendment + post-003b namespace ratification. ODR-0007 status: accepted (council: session-007);
# ODR-0004 status: accepted (council: session-004; wg-decision: session-003b).
# Amended 2026-05-27 post-S007 close: (i) Q6 refactor to strict `prov:Plan` resource carrying
# opda:plannedAtTime with `prov:qualifiedAssociation` linkage from Activity; (ii) Q2 refactor of
# completion + registration milestones to interval form (`prov:startedAtTime` + `prov:endedAtTime`).
@prefix opda: <https://opda.org.uk/pdtf/> .
@prefix opda-x: <https://opda.org.uk/pdtf/harness/data/exemplar/simple-transaction-with-milestones/> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix dct: <http://purl.org/dc/terms/> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
opda-x:exemplar
a opda:DiagnosticExemplar ;
dct:title "Simple freehold sale — Transaction Relator with five milestones; no chain" ;
dct:status "ratified" ;
dct:references <ODR-0007> , <ODR-0006> , <ODR-0005> , <ODR-0004> ;
skos:scopeNote
"Tests Q1 Transaction-as-Relator: one opda:Transaction mediating Seller (Person via Role) + Buyer (Person via Role) + the LegalEstate being conveyed (per S005 3-class commitment). Q2 hybrid PROV-O milestones — instants for offer-accepted + exchange; intervals (`prov:startedAtTime` + `prov:endedAtTime`) for completion-process + registration-process per Moreau W3C-grade discipline. Q3 status as Phase — proposed/active/exchanged/completed; per S011 Phase label scheme. Q6 expected-vs-actual via strict PROV-O Plan-vs-Activity reification — each milestone Activity has a `prov:Plan` companion carrying `opda:plannedAtTime`; `prov:qualifiedAssociation` links Activity to Plan; Cagle's `opda:MilestoneVarianceRule` (ODR-0017 8th citing site candidate) materialises variance at `sh:Info` (<14d) or `sh:Warning` (>14d or overdue)." .
# Property (S005 3-class)
opda-x:property
a opda:Property ;
rdfs:label "Physical dwelling at 88 Forest Drive, Norwich" ;
opda:uprn "100070444000" .
opda-x:estate
a opda:LegalEstate ;
rdfs:label "Freehold estate in 88 Forest Drive" ;
opda:tenureKind "freehold" .
opda-x:title
a opda:RegisteredTitle ;
rdfs:label "HMLR title NK445566 (freehold)" ;
opda:titleNumber "NK445566" .
opda-x:title opda:identifiesSameProperty opda-x:property .
opda-x:estate opda:identifiesSameProperty opda-x:property .
# Persons + Roles
opda-x:seller-person a opda:Person ; rdfs:label "Diana Foster (seller)" .
opda-x:buyer-person a opda:Person ; rdfs:label "Robert Khan (buyer)" .
opda-x:seller-role
a opda:Seller ;
rdfs:label "Seller Role borne by Diana Foster in this transaction" ;
opda:rolePlayer opda-x:seller-person .
opda-x:buyer-role
a opda:Buyer ;
rdfs:label "Buyer Role borne by Robert Khan in this transaction" ;
opda:rolePlayer opda-x:buyer-person .
# Transaction (UFO Relator per Q1; S007 §Rules Transaction-as-Relator IC over 5 hard cases)
opda-x:transaction
a opda:Transaction ;
rdfs:label "Freehold sale of 88 Forest Drive (Foster → Khan, 2024)" ;
opda:status "completed" ; # S011 Phase label scheme
opda:mediates opda-x:seller-role , opda-x:buyer-role ;
opda:concerns opda-x:estate .
# Milestones — Q2 hybrid PROV-O (instants for instantaneous events; intervals for processes).
# Q6 PROV-O Plan-vs-Activity — each Activity has a paired prov:Plan; prov:qualifiedAssociation links them.
# Instruction milestone — instant; no prior plan (start of the transaction by definition).
opda-x:milestone-instruction
a prov:Activity , opda:Milestone ;
rdfs:label "Instruction milestone (Activity)" ;
opda:milestoneKind "instruction" ;
prov:atTime "2024-04-10T09:00:00Z"^^xsd:dateTime ;
opda:partOfTransaction opda-x:transaction .
# Offer accepted milestone — instant. Q6: planned-time on Plan; actual-time on Activity.
opda-x:milestone-offer-accepted-plan
a prov:Plan ;
rdfs:label "Offer accepted milestone (Plan)" ;
opda:milestoneKind "offerAccepted" ;
opda:plannedAtTime "2024-04-25T00:00:00Z"^^xsd:dateTime .
opda-x:milestone-offer-accepted
a prov:Activity , opda:Milestone ;
rdfs:label "Offer accepted milestone (Activity)" ;
opda:milestoneKind "offerAccepted" ;
prov:atTime "2024-05-02T16:30:00Z"^^xsd:dateTime ;
prov:qualifiedAssociation [
a prov:Association ;
prov:hadPlan opda-x:milestone-offer-accepted-plan
] ;
opda:partOfTransaction opda-x:transaction .
# MilestoneVarianceRule (ODR-0017 8th citing site candidate): planned 2024-04-25 → actual 2024-05-02
# (delta +7 days) → sh:Info (under 14d threshold). Materialised in opda-annotations.ttl.
# Exchange of contracts — instant. Q6 Plan-vs-Activity.
opda-x:milestone-exchange-plan
a prov:Plan ;
rdfs:label "Exchange of contracts milestone (Plan)" ;
opda:milestoneKind "exchange" ;
opda:plannedAtTime "2024-06-15T00:00:00Z"^^xsd:dateTime .
opda-x:milestone-exchange
a prov:Activity , opda:Milestone ;
rdfs:label "Exchange of contracts milestone (Activity)" ;
opda:milestoneKind "exchange" ;
prov:atTime "2024-06-18T14:00:00Z"^^xsd:dateTime ;
prov:qualifiedAssociation [
a prov:Association ;
prov:hadPlan opda-x:milestone-exchange-plan
] ;
opda:partOfTransaction opda-x:transaction .
# MilestoneVarianceRule: planned 2024-06-15 → actual 2024-06-18 (delta +3 days) → sh:Info.
# Completion process — Q2 INTERVAL FORM (process spans hours: key release, funds transfer, post-completion
# notifications). prov:startedAtTime + prov:endedAtTime per Moreau.
opda-x:milestone-completion-plan
a prov:Plan ;
rdfs:label "Completion milestone (Plan)" ;
opda:milestoneKind "completion" ;
opda:plannedAtTime "2024-07-12T00:00:00Z"^^xsd:dateTime .
opda-x:milestone-completion
a prov:Activity , opda:Milestone ;
rdfs:label "Completion milestone (Activity — interval)" ;
opda:milestoneKind "completion" ;
prov:startedAtTime "2024-07-12T09:30:00Z"^^xsd:dateTime ;
prov:endedAtTime "2024-07-12T15:45:00Z"^^xsd:dateTime ;
prov:qualifiedAssociation [
a prov:Association ;
prov:hadPlan opda-x:milestone-completion-plan
] ;
opda:partOfTransaction opda-x:transaction .
# MilestoneVarianceRule: planned 2024-07-12 (date) → actual interval started same date → sh:Info.
# Registration at HMLR — Q2 INTERVAL FORM (submission → priority-search → register entry; days-to-weeks).
opda-x:milestone-registration-plan
a prov:Plan ;
rdfs:label "Registration milestone (Plan)" ;
opda:milestoneKind "registration" ;
opda:plannedAtTime "2024-07-26T00:00:00Z"^^xsd:dateTime .
opda-x:milestone-registration
a prov:Activity , opda:Milestone ;
rdfs:label "Registration at HMLR milestone (Activity — interval)" ;
opda:milestoneKind "registration" ;
prov:startedAtTime "2024-07-15T10:00:00Z"^^xsd:dateTime ;
prov:endedAtTime "2024-08-30T10:15:00Z"^^xsd:dateTime ;
prov:qualifiedAssociation [
a prov:Association ;
prov:hadPlan opda-x:milestone-registration-plan
] ;
opda:partOfTransaction opda-x:transaction .
# MilestoneVarianceRule: planned 2024-07-26 → actual ended 2024-08-30 (delta +35 days) → sh:Warning
# (over 14d threshold). Materialised in opda-annotations.ttl.
Expected report Turtle
# simple-transaction-with-milestones-expected-report.ttl
@prefix dct: <http://purl.org/dc/terms/> .
@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/data/exemplar-reports/report>
rdf:type sh:ValidationReport ;
dct:source <https://opda.org.uk/pdtf/harness/data/exemplar/simple-transaction-with-milestones> ;
sh:conforms "true"^^xsd:boolean .
SHACL outcome
sh:conforms true. All identity-key shapes satisfied:
opda:TransactionIdentityKeyShape(Cat 1): noopda:occurredAtTime— admissibleopda:MilestoneIdentityKeyShape(Cat 1): each Milestone Plan carries singleopda:plannedAtTimexsd:dateTimeopda:PropertyIdentityKeyShape+opda:LegalEstateIdentityKeyShape(Cat 1): satisfied
SHACL-AF rules materialise:
opda:MilestoneVarianceRule→ for each milestone with bothopda:occurredAtTime+opda:plannedAtTime: variance days computed;opda:hasVarianceStatusmaterialised (“info-flagged” for <14d slips, “warning-flagged” for the registration milestone’s +35-day slip)opda:LeaseTermSuccessionRule→ does not fire (no LeaseTerm instances)
Comments