accepted

    Deferred work register from the 2026-05-18 implementation push

    Context and Problem Statement

    The 2026-05-18 implementation push shipped:

    • ADRs 0002 + 0003: full migration of 158 pages to bare-slug URLs + idiomatic Astro (build-time chrome composition, typed src/lib/site.ts, src/components/ library, public/ui/site.js deleted).
    • ADR-0001 Wave 1 vocabulary alignment: sidebar restructured into “OPDA’s rules” / “Operating Model” / “Quality & security” groups; PageMeta categories updated on 9 pages.
    • ADR-0001 Wave 2 page scaffolding: four new stub pages at /governance/{data-quality,data-security,accreditation-directory,overlay-attachments} with intros, section headings, and “content pending” callouts.
    • ADR-0004: full spec of the Accreditation Directory artefact.

    What was not done — and explicitly belongs to someone else (a WG, a future session, a contributor with the right access) — needs to be collected somewhere so it doesn’t drift out of sight.

    Things that aren’t named in writing rot. The Wave 1 “DAMA Wheel cross-reference per page” item is exactly the kind of thing that would be forgotten in six months unless somebody can point at it. The handover note from 2026-05-18 already proved this pattern works (the 14→30 chain break was a known item from a prior handover, not a surprise).

    Decision Drivers

    1. Visibility of remaining work. The next contributor should see the whole picture without archaeology.
    2. Named ownership. Each item needs a WG / individual / EC responsibility so accountability is not diffuse.
    3. Triggering conditions. Explicit so items that aren’t ready don’t waste review cycles.
    4. One source of truth. Beats the equivalent information being spread across multiple ADRs, handovers, and project boards.

    Considered Options

    • A — No register; track items in handovers and ADR open-question sections. Minimal new artefact. Risk: items drift across documents and rot when handovers don’t propagate.
    • B — Living register as an ADR (chosen). Single document, ADR-numbered for permanence, with named ownership and explicit triggering conditions. Items leave when promoted / completed / abandoned / superseded.
    • C — External project tracker. GitHub Projects or Linear. Higher fidelity (states, assignees, due dates) but lives outside the published artefact set. Adds tool dependency.

    Decision Outcome

    Chosen option: B — Living register as an ADR, because it sits beside the other ADRs (one place to look), is plain markdown (no tool lock-in), and the discipline of ADR review cycles forces periodic re-evaluation. The register itself follows.

    The register is explicitly a living document — items leave when they ship, get superseded, or get formally abandoned. It is not an immutable record of intent (that’s what the other ADRs are for); it is the to-do list with named ownership. The MADR status: accepted refers to the meta-decision (to maintain a register); the register contents mutate.

    A. Wave 2 content authoring (substantive — months of WG work)

    #ItemOwnerTriggering condition / dependencyNotes
    A1/governance/data-quality contentC&R WGWorkstream kickoff (per ADR-0001 §“Vote and Dissent” newly-resolved #3 — runs in parallel with A2 and A3)Stub has section headings for the 6 DQ dimensions, measurement protocols, AL mapping, reporting. WG fleshes out each section.
    A2/governance/data-security contentC&R WGWorkstream kickoff (parallel with A1, A3)Stub has 5 controls (KYC/KYB, key mgmt, signature verification, revocation, audit logging) + policy / checklist / audit framing.
    A3/governance/accreditation-directory contentC&R WGWorkstream kickoff (parallel with A1, A2); depends on ADR-0004 Phase 1 (skeleton schema)Stub describes the how-it-works flow, scoring, evidence tiers; first publish target is end of quarter following all four Wave 2 ADRs ratified.
    A4/governance/overlay-attachments contentTechnical WG (with C&R WG input on retention + consent)Workstream kickoff (parallel with A1–A3)Stub lists 11 v3 overlay attachment types; sections for file formats / signing / retention / consent.
    A5C&R WG recruitment to support parallel A1–A3Engagement WGBefore A1/A2/A3 kickoff (per ADR-0001 §“Vote and Dissent” newly-resolved #3 pre-condition)Target firms with mature internal DQ / Security functions — see docs/recruitment/cr-wg-candidate-firms.md.

    B. Wave 1 leftover tagging (mechanical, but per-page work)

    #ItemOwnerTriggering condition / dependencyNotes
    B1DAMA Wheel cross-reference per pageWhoever picks up the Wave 1 leftoversOpportunisticFor each existing page, tag the DAMA KA(s) it serves. KAs out of scope (DW/BI, Storage & Ops, Document & Content) explicitly disclaimed once each. ~24+ pages.
    B2Per-KA template applied per pageSameOpportunisticConsistent rubric: Purpose · Activities · Deliverables · Roles · Metrics · Maturity. Apply incrementally; not all pages need every section filled.

    C. Accreditation Directory build pipeline (ADR-0004 Phase 4)

    #ItemOwnerTriggering condition / dependencyNotes
    C1scripts/build-accreditation-directory.mjsTechnical WGMember firms ready to submit first VCs (downstream of A1–A4 shipping capability bundles)Build-time aggregator: reads all current-quarter VCs from source/04-governance-bodies/accreditation/credentials/, validates signatures against Trust Registry, emits src/data/accreditation/current.json for the Directory page render.
    C2Member-firm VC submission toolingTechnical WG + Engagement WGAfter C1 shipsFirms need a clear way to mint and submit their quarterly VCs. CLI helper? Web form? Out of scope for the script itself.
    C3First quarterly publishC&R WG + Technical WGAfter A1–A4 + C1 + C2End-of-quarter milestone for the first time the Directory has real data.
    C4OPDA-listed audit-partner listEngagement WGBefore any firm claims an evidence-tier score 5–6Initial list likely Big 4 + property-data specialists. Scaffold lives at docs/recruitment/opda-listed-audit-partners.md.

    D. Wave 3 watching briefs (per ADR-0001 §“Wave 3”)

    #ItemOwnerTriggering condition / dependencyNotes
    D1GARP for OPDA institutional recordsTBDOpportunisticApply Generally Accepted Recordkeeping Principles to OPDA’s source/ tree. Mostly a published handling policy + retention defaults per subtree.
    D2Storage & Ops — retention/disposal guidanceTBDTrust Registry to production OR consumer-trust narrative needs itMember-firm guidance: how long does a verified claim represented by the PDTF schema or SPDTF live in a firm’s database after a transaction completes? UK GDPR alignment.
    D3AI/ML governance over data represented by the PDTF schema or SPDTFTBDFirst member firm publishes a model trained on those data OR ICO/EU AI Act guidance solidifiesBias/fairness considerations specific to property data (historical red-lining patterns). Data-use governance, not platform engineering.
    D4Data-product discipline for OPDA’s meta-analyticsTBDOpportunisticApply data-product discipline (lineage, release plan, versioning) to Accreditation Directory, Standards Report, Consumer Survey. Extend provenance-map.yaml toward a lineage dictionary as new reports are produced.
    D5Annual Wave 3 review (AGM-adjacent EC meeting)ECEvery AGM-adjacent EC meeting~15-min agenda item walking D1–D4 (and successors): trigger fired? rotted? watching brief continues?

    E. Pre-deploy + ops

    #ItemOwnerTriggering condition / dependencyNotes
    E1Visual smoke test in browserHenrik (next session)Before push to productionTheme toggle, sidebar collapse, tree-folder toggle, mobile menu, Mermaid diagrams across sections, data tables on /modelling/data-dictionary + /modelling/business-glossary.
    E2External materials auditEngagement WGBefore announcing the URL changeOPDA-controlled materials pointing to old /pages/NN-…html URLs will hard-break. Scan briefings PDFs in source/02-policy-and-positioning/briefings-to-government/, openpropdata.org.uk content, propdata.org.uk content, DPMSG decks, member-firm comms, regulator submissions. Checklist at docs/external-materials-audit-checklist.md.
    E3DCAM attribution note in governance.mdTechnical WGWhen time allowsPer ADR-0001 §“Vote and Dissent” newly-resolved #2 (permissive): one-paragraph note in source/03-standards/trust-framework/docs/governance.md defining the “name freely, no verbatim” boundary so future contributors don’t re-litigate.

    F. Open items in other ADRs

    Tracked here so the register is comprehensive; details live in the originating ADRs.

    #ItemOriginating ADRNotes
    F1OPDA-listed audit partnersADR-0004 Q1Same as C4 above; cross-listed.
    F2Conformance Scheme integration with DirectoryADR-0004 Q2The existing /governance/conformance-scheme page needs updating to reference the Directory and explain the AL × Capability relationship. Own ADR when work begins.
    F3Member-firm portal (deferred tier of the Directory)ADR-0004 Q3Private detailed view for firms + OPDA. Triggers on first member-firm request. Requirements stub at docs/specs/member-firm-portal-requirements.md.
    F4Quarterly publishing automationADR-0004 Q4Cron / GitHub Action to refresh the Directory; tooling decision deferred.
    F5Ex-member handling in the DirectoryADR-0004 Q5”Former member, last data YYYY-Qn” vs immediate drop-out. Membership ADR territory — draft scoping at docs/adr/_drafts/membership-lifecycle.md.
    F6Re-anchor forward-looking standards references (claims, VCs, API specs) off legacy propdata.org.uk anchorsADR-0051 Thread 4Partially done: withdrawn versioned draft-scheme references were corrected. SPDTF is the first collaboratively authored scheme draft; the existing PDTF schema and its derived ontology are attributed inputs, not an endorsed predecessor scheme. Remaining: the schema $id namespace (trust.propdata.org.uk/schemas/… — the real committed identifiers in source/03-standards/schemas/) and the JSON-LD context-publishing host await a concrete OPDA-authored target plus the pending Smart Data Guidebook draft chapters and Open Banking Open Finance standards/architecture. Perseus (Open Energy) is open source and reachable. Do not invent alignment before the canon is available.
    F7Transition-bridging tooling + funding askADR-0052 Item 6Keep the recommendation for current→new schema bridging tooling and implementation tooling for industry (endorsed in the stakeholder review). The funding / resource requirement must be surfaced to the stakeholder for a decision against existing project funding, which may have scope to cover it. Surfaced on /strategy/project-roadmap §Risks.

    G. Ontology implementation programme — surfaced by validation discipline

    Per docs/plan/ontology-implementation.md §9.3 + §9.4, every ADR in the ontology programme passes a structural validation gate before moving proposed → accepted. Validation may surface (a) genuine ratified-rules ambiguity needing Council amendment, or (b) named follow-ups that are not blockers but must be explicitly queued. Items below are queued from validation reports under docs/adr/validation/.

    #ItemOwnerTriggering condition / dependencyStatusNotes
    G1Council Author-only session — reconcile term-sourcing precedence between ODR-0004 §7a and ADR-0007 §“Term-sourcing five-line precedence”OPDA Author (per ODR-0001 §“Self-amendment process”)Before any emitter branches on tier == 3 semantics (currently no caller does; safe to defer one cycle)Open (queued 2026-05-27 from ADR-0008 validation)ODR-0004 §7a lists tier 3 as “Other regulatory authorities (contextual, not authoritative)”; ADR-0007 pseudocode places “business glossary” at tier 3 and regulator at tier 5. ADR-0008 implementation follows ADR-0007. Engineering does not silently reconcile — Author-only amendment needed to either reorder ODR-0004 §7a or amend ADR-0007 pseudocode. CLOSED 2026-05-31 (Author-only reconciliation): already consistent. ADR-0007 §“Term-sourcing five-line precedence” (lines 130–167) now formalises ODR-0004 §7a verbatim — slot 3 = Other regulatory authorities (contextual → skos:scopeNote/skos:closeMatch), slot 4 = business glossary, slot 5 = schema-leaf; the resolver takes the primary dct:source from the first match of slots {1,2,4,5} and collects slot 3 separately. The stale glossary-at-3 / regulator-at-5 ordering this row described no longer exists, and no emitter treats tier-3 as primary. Recorded in ODR-0004 §7a.
    G2Prefix-filter heuristic refinement in serialiser/canonical.pyADR-0009 workerADR-0009 implementation start (Phase 1, gated on ADR-0008 acceptance)Closed 2026-05-27 (commit c5629e7)Resolved via option (a): Literal lexical values are now scanned for IRI-shaped strings that match bound namespaces (serialiser/canonical.py:143-148). Two regression tests added (test_literal_iri_lexical_value_retains_prefix, test_non_iri_literals_do_not_pollute_prefix_set). Verified independently by ADR-0009 validator.
    G3check_derived_provenance git-blame implementation + regression test (ODR-0004 §3a clause #5)ADR-0009 workerADR-0009 implementation startClosed 2026-05-27 (commit c5629e7)Implemented at tools/opda-gen/src/opda_gen/ci/three_graph_test.py:138-229 via git log --format=%ae walk over source/03-standards/ontology/derived/; env-var allowlist (OPDA_SERVICE_ACCOUNTS) parameterises the service-account list. Four regression tests (missing-dir, clean-history, non-service-commit, env-var-allowlist) using tmp git-repo fixture. Verified independently.
    G4Split CI workflow comment block by activation ADRADR-0009 or ADR-0014 worker (cosmetic)OpportunisticClosed 2026-05-27 (commit c5629e7).github/workflows/ontology-byte-identity.yml:31-52 now carries two distinct activation markers — one for ADR-0009-activated steps (regenerate / byte-identity diff / ci-three-graph) and one for the ADR-0014-activated validate-exemplar step.
    G5Mirror Section G to /governance/deferred-work Astro pageTechnical WG / next contributor touching the mirrorBefore next quarterly publish OR when next Section G item landsClosed 2026-05-27Astro mirror at src/pages/governance/deferred-work.astro now carries the full G1–G11 table with Status + Linked-artefact columns matching the other Section A–F tables.
    G6Cosmetic ADR-0009 template amendment — document pinning conventionAuthor / opportunisticOpportunisticClosed 2026-05-27ADR-0009 §“foundation.ttl” prose preamble now documents the sentinel pinning convention: angle-bracket placeholders are illustrative, not live-substitution directives; sentinel-pinned to satisfy byte-identity CI per ODR-0004 §6a.
    G7Prefix-filter edge cases for embedded URLs in rdfs:comment / dct:descriptionADR-0010 workerWhen first rdfs:comment containing a URL is emitted as a LiteralClosed 2026-05-27 (ADR-0010 implementation)Closed by ADR-0010 worker because ADR-0010 schemes carry gov.uk URLs inside skos:scopeNote @en Literals — the same surface G7 names. Two regression tests added to tests/test_serialiser.py: (i) test_literal_url_inside_scope_note_does_not_bind_new_prefix (Literal containing a gov.uk URL inside a sentence MUST NOT bind gov.uk); (ii) test_literal_url_lexical_value_does_not_bind_unbound_namespace (Literal lexical value IS exactly a gov.uk URL MUST NOT bind gov.uk). Confirms the existing scan is contractually conservative-safe.
    G8ADR-0010 scope expansion — additional SKOS schemes beyond the named first batchADR-0013 workerWhen a downstream module ADR (ADR-0011+) cites a scheme not in the ADR-0010 §“Scheme catalogue” 16-row tableClosed 2026-05-28 (ADR-0013 implementation)ADR-0013 worker added 7 new SKOS schemes required by BASPI5 overlay coverage: YesNoScheme, YesNoNotApplicableScheme, YesNoNotKnownScheme, YesNoNotRequiredScheme, PropertyTypeScheme, OffMainsDrainageSystemTypeScheme, OwnerTypeScheme. Total scheme count: 23 (was 16). Each new scheme follows ADR-0010’s per-scheme metadata MUST-haves (UFO category + steward + dct:source + scope-note). Further scheme expansions remain opportunistic per the original closure criterion.
    G9Populate data-dictionary enums for MilestoneKind / AssuranceLevel / EvidenceMethod / AddressVariantADR-0013 workerOpportunistic (next dictionary refresh cycle)Closed 2026-05-28 (ADR-0013 implementation)All four schemes now emit real per-member data without the PLACEHOLDER: warning. MilestoneKindScheme cites ODR-0007 §Q2 (transaction-lifecycle pattern) as the per-member dct:source. AssuranceLevelScheme cites eIDAS Article 8 verbatim per ODR-0011 §4a regulator-citation discipline + adds PDTF-Standard member citing ODR-0009 §Q3. EvidenceMethodScheme cites OIDC4IDA verbatim. AddressVariantScheme cites ODR-0015 §Q1 (the ratifying Council anchor for the variant-set). Future data-dictionary refresh can supplement these citations without removing the now-stable per-member structure.
    G10TransactionStatusScheme per-member dct:source URI fabrication auditADR-0013 workerOpportunistic, MUST land before ADR-0014 BASPI5 round-trip (because BASPI5 needs full dct:source traceability)Closed 2026-05-28 (ADR-0013 implementation)Resolved via validator option (a)+(b) hybrid: per-member dct:source now cites the ratifying Council anchor <https://w3id.org/opda/odr/ODR-0011#section-8a-ufo-meta-category>; per-member prov:wasDerivedFrom links each canonical label to the underlying data-dictionary enum value it sources from (Listed ← #status.For%20sale; Offered ← #status.Under%20offer; Accepted ← #status.Sold%20subject%20to%20contract; Exchanged ← #status.Contracts%20exchanged; Completed ← #status.Completed exact). The Member dataclass in vocabularies.py gained an optional derived_from: URIRef | None field. Verified by independent SPARQL: grep -c "data-dictionary#status.Listed|...Offered|...Accepted|...Exchanged" opda-vocabularies.ttl → 0 (fabricated URIs eliminated).
    G11Full Q5a binding-table emission (~44 leaves) into opda-property.ttl + opda-descriptive.ttlADR-0013 worker (bundled with overlay profile emission)Closure tightened per ADR-0011 validator: BEFORE ADR-0014 MVP gate — every leaf BASPI5 round-trip discovers as missing MUST emit, no silent omissionsClosed 2026-05-28 (ADR-0013 implementation)17 additional Property/LegalEstate DatatypeProperties emitted in opda-property.ttl: propertyType, ownershipType, heatingType, centralHeatingFuelType, offMainsDrainageSystemType, areBoundariesUniform, isLocatedOverCommercialPremises, isSharedOwnership, isGroundRentPayable, sellerContributesToServiceCharge, hasSprayFoamInstalled, isSupplyMetered, isInsured, hasBeenFlooded, hasSmartHomeSystems, hasValidGuaranteesOrWarranties, soldWithVacantPossession, riskIndicator. Two additional Agent-domain DatatypeProperties in opda-agent.ttl: ownerType, hasOthersAged17OrOver. Each carries rdfs:domain (per ODR-0008 §Q5a placement) + rdfs:range xsd:string + rdfs:label @en + rdfs:comment @en + dct:source <ODR-0008#section-Q5a>. Bound to schemes via sh:in in profiles/baspi5.ttl per ODR-0010 §Rule 2 (build-step replacement, not entailment). Per-question (not single-predicate) pattern adopted per worker brief recommendation. Further yesNo-flavoured predicates land as downstream overlay demand surfaces. Update 2026-05-30: riskIndicator has since been removed from opda-property.ttl and re-homed onto opda:RiskAssessment (ODR-0008d Category-E model — it bins to Category E, the search/environmental result, not a flat Property attribute); the remaining 16 stand. This §Q5a-vs-ODR-0008d reconciliation supersedes part of this closed item and is flagged for WG ratification (per the §G1 principle that engineering does not silently reconcile ratified-rules disagreements); it is the first reconciliation-register entry in ADR-0031. Ratified 2026-05-31 (Council session-028 Q8 / ODR-0024 R1): the 6 G11∩candidate-G overlap leaves STAND and the riskIndicator re-home is confirmed — the WG-ratification flag is cleared.
    G12Canonical serialiser blank-node deduplication for multi-target shared blank nodesADR-0013 worker (bundled)Cosmetic; opportunisticClosed 2026-05-28 (ADR-0013 implementation)Resolution went beyond the cosmetic scope and fixed a latent byte-identity bug surfaced by the BASPI5 profile emission: serialiser/canonical.py previously sorted multi-object lists by str(o), which for BNodes returns rdflib’s non-deterministic internal label (e.g. Nf3a2...). Profile shapes carrying multiple sh:property blank-node references therefore reordered between runs, breaking byte-identity. Fix: introduced _object_sort_key(obj, blanks) helper that returns the deterministic skolem hex (_:b<hex>) for BNodes and str(obj) for everything else; both the triple-sort and the multi-object-list sort now use it. Regression test test_multi_object_blank_node_list_byte_identical_across_runs in tests/test_serialiser.py exercises 5 fresh Graph() constructions producing byte-identical output. The original cosmetic dedup (named skolemised URIs for shared blanks) is now a future opportunistic improvement — no longer load-bearing.
    G13Housekeeping — confirm G1 status closure in ADR-0005 §GAuthor / 2026-05-27NowClosed 2026-05-27 (this commit)G1 was already closed in commit 5bd0c41 per 2026-05-27 amendment. ADR-0012 validator (commit ae1560f) noted the status column reads “Closed 2026-05-27” so the validator’s G13 concern was a stale-read artefact. No further action needed.
    G14Cat 4 SHACL shape activation trigger — declare opda:hasSpecialCategoryData predicate OR route Council S012 Q3 ratificationCouncil Author-only session (per programme plan §9.4) + ADR-0014 worker engineering closureBefore MVP gate (ADR-0014) demonstrates Cat 4 firing on a real PII caseClosed 2026-05-28 (ADR-0014 implementation; Council route preserved)ADR-0014 worker declared opda:hasSpecialCategoryData as owl:DatatypeProperty in opda-classes.ttl with rdfs:range xsd:boolean + full A9 metadata. dct:source cites ODR-0012 §Q5 (the Cat 4 shape’s ratifying clause); skos:scopeNote preserves the Council S012 Q3 route — Council may rename or refine the canonical predicate name, and the Cat 4 shape + this declaration update in lockstep. Engineering closure is the minimum that lets the Cat 4 shape have a real TBox-level target; semantic refinement (e.g. conditional firing only when the value is true) remains a downstream shape-design Q for Council. Foundation owl:versionIRI bumped 0.4.0 → 1.0.0 as the class-graph extension. Verified by tests/test_g14_special_category_predicate.py (5 regression tests).
    G15Cosmetic ADR-0007 amendment — document __version__ vs owl:versionIRI decoupling ruleAuthor / opportunisticOpportunisticClosed 2026-05-27 (this commit)ADR-0012 worker bumped opda_gen.__version__ 0.3.0 → 0.4.0 (substrate addition: shapes + annotations files) but left foundation owl:versionIRI at <https://w3id.org/opda/0.3.0/> (class-graph unchanged). Rule documented in this commit’s amendment to ADR-0007 §“A9 per-kind discipline output” prose: __version__ tracks the generator package’s emitter capabilities; owl:versionIRI tracks each emitted graph’s content version, bumping only when the graph’s triples change. The two are intentionally decoupled.
    G16ADR-0013 implementation report DatatypeProperty count: 19 → 20 (worker under-counted by 1)ADR-0014 worker (bundled, cosmetic)OpportunisticClosed 2026-05-28 (ADR-0014 implementation)ADR-0013 implementation report § “G11 — 20 new DatatypeProperties” updated; counts 18 property + 2 agent = 20 (was 17+2=19; the property module emits 18 by direct enumeration).
    G17Stale “five foundation classes” doc-comments in foundation.py + opda-classes.ttl headerADR-0014 worker (bundled, cosmetic)OpportunisticClosed 2026-05-28 (ADR-0014 implementation)tools/opda-gen/src/opda_gen/emitters/foundation.py updated: docstrings + extra_lines for opda-classes.ttl + opda-annotations.ttl now name the six foundation classes (DiagnosticExemplar, GeneratorRun, RoleMixin, Role, Relator, ValidationContext) plus the ADR-0014-added foundation DatatypeProperty (opda:hasSpecialCategoryData per G14). Emitted TTL generator-comment headers regenerated.
    G18Declare opda:role as DatatypeProperty in opda-agent.ttl for DASH editor ergonomicsADR-0014 worker (bundled)Before MVP gate (DASH form rendering ergonomics)Closed 2026-05-28 (ADR-0014 implementation)opda:role declared in opda-agent.ttl as owl:DatatypeProperty with rdfs:domain opda:RoleMixin + rdfs:range xsd:string + full A9 metadata. dct:source cites ODR-0006 §Q2. Per-overlay profiles constrain via sh:in over the RoleScheme members (BASPI5 profile already uses this pattern at Baspi5_SellerShape / Baspi5_BuyerShape). The typed encoding (a opda:Seller) remains canonical per ODR-0006 §Q2; the predicate is the notation surface BASPI5 and other JSON-based overlays consume. Verified by tests/test_g18_role_predicate.py (4 regression tests).
    G19Fix 4 BASPI5 profile anchor URL mismatches (A1.8.7, A7.5.1, B1.2, A1)ADR-0014 worker (bundled)Before MVP gate (form-question IRI resolution)Closed 2026-05-28 (ADR-0014 implementation)Four BASPI5 anchors realigned in tools/opda-gen/src/opda_gen/emitters/profiles.py against actual baspi5Ref values in source/03-standards/schemas/src/schemas/v3/overlays/baspi5.json: A1 → A1.1 (Property shape’s primary anchor — no A1-only baspi5Ref exists); A1.8.7 → A1.8.4.1 (sprayFoamInsulation.hasSprayFoamInstalled); A7.5.1 → B4.6.2 (waterAndDrainage.water.mainsWater.waterMeter.isSupplyMetered); B1.2 → B1.1 (namesOfLegalOwners — no participants[].name baspi5Ref). All four now exact-match a baspi5Ref. Verified by test_baspi5_form_question_anchors_exact_match_baspi5_schema in tests/baspi5_round_trip/test_traceability.py + assertions in tests/test_profiles.py::test_baspi5_emits_known_question_anchors.
    G20ADR-0013 implementation report anchor count: 36 → 28 (worker over-counted)ADR-0014 worker (bundled, cosmetic)OpportunisticClosed 2026-05-28 (ADR-0014 implementation)ADR-0013 implementation report § “BASPI5 form-question IRIs” + § “§Confirmation #6” counts updated 36 → 28 distinct anchors (validator’s count is canonical; worker over-counted because anchor-with-duplicate emissions were counted per emission rather than per distinct).
    G21Cat 4 SHACL shape over-firing — SPARQL constraint refactorParent coordinator (engineering bug fix)During ADR-0014 verification (before validator gate)Closed 2026-05-27 (commit df5a165)ADR-0014 worker discovered the Cat 4 SpecialCategoryPIIWithoutLawfulBasisShape (emitted by ADR-0012) fired sh:Violation on 7 of 15 exemplars — any exemplar with a Person instance. The ADR-0012 SHACL template used sh:property + sh:hasValue true + sh:not [sh:minCount 1] which forced every Person to carry opda:hasSpecialCategoryData=true. Engineering bug (the ODR-0013 §Q1 Cat 4 intent — “PII without lawful basis is a Violation” — was correct; the SHACL implementation was wrong). Fixed by switching to SHACL-AF sh:sparql constraint firing only on the conditional intersection ($this opda:hasSpecialCategoryData true . FILTER NOT EXISTS { $this dpv:hasLegalBasis ?b }). Regenerated all 23 TTLs (no change beyond opda-agent-shapes.ttl) + all 15 expected-report.ttl files (7 now conform cleanly; 8 unchanged; 3 of the 7 now surface legitimate Cat 2 prov:wasDerivedFrom MinCount violations on claim evidence exemplars previously masked). Verified by ADR-0014 validator at commit 28dd92a.
    G22Category-G monetary walk — the ~17 monetary leaves (amount, rent, *Price, ground rent, deposits, service charges, fees) emitted as distinct per-economic-kind properties over a value-structured opda:MonetaryAmount (magnitude + ISO-4217 currency), each on its own bearer——Closed 2026-05-31 (executed; ODR-0024 R3)DONE: minted opda:MonetaryAmount (by-value: opda:amount decimal + opda:currency → seeded-extensible ISO-4217 opda:CurrencyScheme GBP/EUR/USD; node shape both-required, currency sh:in scheme, GBP-default via overlay) + 16 per-bearer monetary object properties (LegalEstate / Property / Valuation / Transaction) + opda:amount — reuse the value type, NEVER the bearer (Guizzardi, session-028 Q3). opda:price left a single-currency fixtures interim (not migrated). Coverage 179 → 196/239; all 6 CI gates green; 264 tests. Discharges the ODR-0008d item-3 deferral.
    G23Category-G R5-surfaced follow-on — 40 enum/attribute leaves (constructionType, ofstedRating, transportType, priceQualifier, typeOfConnection, marketingTenure, + substantive yes/no Property/estate facts hasLift/isHMO/loftInsulated/…) the structural C-vs-G categoriser rule surfaced——Closed 2026-05-31 (executed; ODR-0024 R5–R6)DONE: 40 leaves minted as flat datatype properties on their bearers (Property / LegalEstate / NearbyFacility). The 5 R6 SKOS schemes + the existing TenureKindScheme wired to their 6 consuming enum properties via base value shapes (sh:targetSubjectsOf + sh:in, no overlay needed); ownerType re-ranged → OwnerTypeScheme with sh:in wired the same way — closes the pre-existing Proprietor-overlay sh:in gap. Coverage 196 → 236/239; all 6 CI gates green; 265 tests. Only the 3 held opda:Room leaves (§G24) remain uncovered.
    G24opda:Room/opda:Building modelling — emit the roomDimensions.rooms[] model (3 leaves: length, width, roomName)Next descriptive-walk contributor (emitter change via ADR-0030)EXECUTED via ADR-0033 (session-030)Closed 2026-05-31 (emitted; 239/239)DECISION (session-030, Full/8): NEITHER opda:Room (8–0) nor opda:Building (7–1) is a class — no data-realisable IC; Building’s +O IC genuine but latent. Model the repeating group as an anonymous by-value opda:RoomDimension structure (no IC/key — the §G22 opda:MonetaryAmount pattern) on opda:Property via opda:hasRoomDimension: opda:length/opda:width (xsd:decimal, metres-by-comment, no UnitOfLengthScheme), opda:roomName (xsd:string, non-rigid, never a key) + a keyless SHACL shape. DONE 2026-05-31 (ADR-0033): emitted opda:RoomDimension + opda:length/opda:width + opda:roomName + opda:hasRoomDimension + a keyless shape via the ADR-0030 generator → the curated Category-G walk is complete at 239/239 (0 uncovered); all 6 CI gates green; 266 pytest pass; byte-deterministic. Held dissents (re-open on an identity fact): thin Building bearer; UnitOfLengthScheme; Building/Room promotion.
    G25Gated gUFO rdf:type typing pass — assert gufo:Quality / gufo:Mode on the uncontested Property descriptive leaves (EPC/council-tax/built-form Quale-in-Region), in the annotation graph (never the shapes graph — ODR-0010 §Q7a CI-test-3), omitting straddlers (priceQualifier, marketingTenure) + re-sorters (ownershipType) pending a rigid adjudication ruleNext descriptive-walk contributor (emitter change via ADR-0030)When the UFO insight is worth materialising, OR as conjunct (i) of the ODR-0023 R2 re-open triggerClosed 2026-05-31 (EXECUTED — ADR-0034; queued from Council session-029 Q5, 6–0–0)Preserves the Quality/Mode distinction (real-as-typing per Guizzardi/Guarino) without minting the rejected ODR-0008a/b/c namespaces. Running it both materialises the insight AND builds the typed leaf-set that is conjunct (i) of the R2 re-open trigger (the other conjunct being a named query/validator that bites). NOT SHACL (no validator exists). Mechanism minority hold (Allemang: skos:scopeNote prose until a biting query) resolved at execution → gated rdf:type gufo:Quality-now, annotation-graph-isolated + removable.

    Lifecycle — how items leave this register

    1. Promoted to its own ADR. Item gets a dedicated ADR (typical for substantive workstreams). The register entry is updated to point at the new ADR and marked “promoted”. Two reviews later it can be removed.
    2. Completed. Item ships. Entry marked “completed YYYY-MM-DD”, remains for one review cycle as evidence, then removed.
    3. Abandoned. Item is explicitly declared out of scope (new ADR or annual review). Entry marked “abandoned YYYY-MM-DD, rationale: …”, remains permanently as a “considered and rejected” record.
    4. Superseded. Item is replaced by a different approach. Entry marked “superseded by [link]”, remains permanently.

    Items that don’t progress for 12 months get flagged at the annual review (D5) for a “still relevant?” check.

    Consequences

    • Good, because known state of remaining work — the next contributor sees the whole picture without archaeology.
    • Good, because named ownership — accountability is not diffuse. Each item has a WG / individual / EC responsibility.
    • Good, because triggering conditions are explicit, so items that aren’t ready don’t waste review cycles.
    • Good, because one source of truth for “what’s left” — beats the equivalent information being spread across multiple ADRs, handovers, and project boards.
    • Bad, because the register can rot — if the annual review (D5) doesn’t actually walk this register, items become outdated. Mitigation: the review owner reads this ADR top to bottom each year.
    • Bad, because comprehensive lists invite overcommitment — reading the register might create pressure to do all of it. Trigger conditions exist for a reason; respect them.
    • Bad, because some items belong in tickets, not ADRs — the register is for items with architectural / governance weight. Pure implementation tickets (e.g. “fix typo on page X”) belong in a tracker, not here. If the register fills with trivia, prune.
    • Neutral, because the register is mutable by design. Items can be added, edited, removed; rationale changes are part of the normal annual review. No “this ADR is wrong” problem.

    Confirmation

    • Annual Wave 3 EC review (item D5) walks this register top to bottom — the AGM-adjacent EC meeting agenda template includes the review item.
    • “Last review:” date maintained at the top of the register section as it gets revisited; updated on each pass to confirm the register has been re-walked.
    • Inter-review checks: items promoted to ADRs leave a promoted mark with a link; items completed are dated and pruned after one cycle. Auditable by diffing this file against the prior release.

    More Information

    Open questions

    1. Where does pre-deploy item E1 (visual smoke test) actually live operationally? Right now it’s just a register entry. Could become a scripts/smoke-test.mjs Playwright script or stay as a manual checklist in this ADR.
    2. Does B1 + B2 (DAMA Wheel + per-KA template) need its own ADR? Currently a Wave 1 leftover; might warrant a dedicated ADR if anyone is going to systematically apply it. For now, opportunistic / informal.
    3. Should F1–F5 entries be duplicated here or just linked? Duplicating risks drift; linking risks the register feeling incomplete. Current compromise: lightweight cross-reference table with the originating ADR for detail.
    4. Promotion threshold. When does an A/B/C/D item warrant its own ADR vs. staying in this register? Loose rule: if the item has its own sub-decisions to make, promote. If it’s just “do this thing”, leave it.

    References

    Amendments

    • 2026-05-18 — Created as living register for the 2026-05-18 implementation push.
    • 2026-05-25 — Refactored to canonical MADR 4.x format. Bullet-list metadata moved to YAML frontmatter; status changed from “Living register” to accepted with the living-document nature recorded in the introduction and lifecycle subsection. Filename gained the ADR- prefix per the ruflo-adr adr-create skill. Substance unchanged.
    • 2026-05-27 — Added Section G (Ontology implementation programme). Five follow-ups (G1–G5) surfaced by the ADR-0008 validation report; queued as the named-acceptance condition for ADR-0008 moving proposed → accepted. Per programme plan §9.4, item G1 routes to a Council Author-only session (engineering does not silently reconcile ratified-rules disagreements).
    • 2026-05-27 — Section G update from ADR-0009 validation. Marked G2, G3, G4 closed (all resolved by ADR-0009 worker commit c5629e7 and independently verified by the ADR-0009 validation report). Added G6 (cosmetic ADR-0009 template amendment to document pinning convention) and G7 (prefix-filter edge-case regression test deferred to first URL-bearing rdfs:comment emission, expected at ADR-0011). Status column added to the Section G table.
    • 2026-05-27 — Section G update from ADR-0010 implementation + validation. Marked G7 closed (ADR-0010 worker added two regression tests for gov.uk URLs in skos:scopeNote Literals, commit 75337ec). Added G8 (ADR-0010 scope expansion beyond the 16 named first-batch schemes) and G9 (data-dictionary enum population for MilestoneKind / AssuranceLevel / EvidenceMethod / AddressVariant). Added G10 (TransactionStatus per-member dct:source URI fabrication audit; surfaced by ADR-0010 validator at commit 55f09ad; engineering choice, not Council route; MUST land before ADR-0014 BASPI5 round-trip).
    • 2026-05-27 — Section G update from G1/G5/G6 closures + ADR-0011 validation. Marked G1 closed (ADR-0007 §“Term-sourcing five-line precedence” pseudocode + prose amended to match ODR-0004 §7a; code change in lockstep at ADR-0012 worker brief; commit 5bd0c41). Marked G5 closed (Astro mirror at src/pages/governance/deferred-work.astro carries the full G1–G11 table). Marked G6 closed (ADR-0009 §“foundation.ttl” prose preamble documents the sentinel pinning convention; commit 5bd0c41). Added G11 (Q5a binding-table completion; per ADR-0011 validator’s recommendation, closure tightened to MUST land before ADR-0014 MVP gate; bundled with ADR-0013 worker brief). Per the user’s “no deferrals” mandate, G8 / G9 / G10 / G11 are all bundled into the ADR-0013 worker brief for inline closure before the ADR-0014 MVP gate.
    • 2026-05-27 — Section G update from ADR-0012 validation. Added G12 (canonical serialiser blank-node dedup — cosmetic; bundled with ADR-0013 worker). Added G13 (housekeeping — closed immediately; G1 already closed at commit 5bd0c41). Added G14 (Cat 4 SHACL shape activation trigger — Council-routed for S012 Q3 ratification; the only G-item with a genuine ## Rules ambiguity per programme plan §9.4). Added G15 (cosmetic ADR-0007 amendment documenting __version__ vs owl:versionIRI decoupling rule — closed in this commit).
    • 2026-05-27 — Section G update from ADR-0013 validation. G8/G9/G10/G11/G12 all VERIFIED closed by validator (commit 6acdbca). Added G16 (DP count report fix), G17 (stale foundation doc-comment), G18 (declare opda:role DatatypeProperty), G19 (4 BASPI5 anchor URL mismatches), G20 (anchor count report fix). All five bundled into the ADR-0014 worker brief for inline closure before MVP gate.
    • 2026-05-27 — Section G update from ADR-0010 implementation. Marked G7 closed by the ADR-0010 worker (two regression tests added in tests/test_serialiser.py; gov.uk URLs in skos:scopeNote @en Literals correctly do not bind a gov.uk prefix). Added G8 (ADR-0010 scope expansion — admit additional schemes case-by-case per downstream demand) and G9 (data-dictionary enums for MilestoneKind / AssuranceLevel / EvidenceMethod / AddressVariant — currently emitted with PLACEHOLDER: scope-note warnings per the ADR-0010 brief’s option (a) routing).
    • 2026-05-27 — Section G update from ADR-0011 implementation. Added G11 (full Q5a binding-table emission, ~44 descriptive-attribute leaves deferred per-leaf to downstream-consumer trigger). ADR-0011 emits 6 of ~50 Q5a leaves (the minimum needed for the 15 diagnostic exemplars + core opda-property.ttl identity predicates); the remaining ~44 leaves land per downstream BASPI5/TA6/NTS/LPE1 overlay demand. Engineering choice per-leaf, not Council route.
    • 2026-05-28 — Section G update from ADR-0014 implementation (MVP gate). G14 / G16 / G17 / G18 / G19 / G20 ALL marked closed by the ADR-0014 worker. G14 closed engineering-side: opda:hasSpecialCategoryData declared as foundation owl:DatatypeProperty with xsd:boolean range; Council S012 Q3 route preserved via skos:scopeNote (Council may rename or refine the canonical predicate name and ADR-0012 shape updates in lockstep). G18 closed: opda:role declared in opda-agent.ttl as owl:DatatypeProperty with rdfs:domain opda:RoleMixin + rdfs:range xsd:string; typed encoding (a opda:Seller) remains canonical. G19 closed: 4 BASPI5 anchors realigned (A1→A1.1, A1.8.7→A1.8.4.1, A7.5.1→B4.6.2, B1.2→B1.1) against actual baspi5Ref values. G16, G17, G20 cosmetic doc/comment fixes applied. Foundation owl:versionIRI bumped 0.4.0 → 1.0.0 (G14 class-graph extension + MVP-gate release marker per ODR-0003 §Programme retirement criterion). Generator package __version__ bumped 0.5.0 → 1.0.0 (the MVP-gate release).
    • 2026-05-27 — G21 added + closed during ADR-0014 verification. Cat 4 SHACL shape over-firing surfaced during MVP gate testing — the ADR-0012 template used sh:property + sh:hasValue true + sh:not [sh:minCount 1] which forced every Person to carry opda:hasSpecialCategoryData=true, firing sh:Violation on 7 of 15 exemplars. Engineering bug (intent per ODR-0013 §Q1 Cat 4 was correct; SHACL implementation was wrong). Fixed by switching to SHACL-AF sh:sparql conditional constraint at commit df5a165. Verified by ADR-0014 validator at commit 28dd92a.
    • 2026-05-28 — PROGRAMME RETIRED. ADR-0014 validation PASS (commit 28dd92a) closes ODR-0003 §“Programme retirement criterion” — both (i) MVP round-trip cleared and (ii) every linked ODR accepted (17/17) now hold. All 7 ontology-programme ADRs (ADR-0008 through ADR-0014) accepted; all 7 have green validation reports at docs/adr/validation/. The OPDA ontology implementation programme retires at this commit. Subsequent ontology work lands as fresh ADRs without revisiting this programme’s sequencing.
    • 2026-05-30 — G11 riskIndicator re-homed (descriptive-layer follow-on). Applying a WG recommendation (reuse YesNoNotKnownScheme for the RiskAssessment risk indicator) surfaced opda:riskIndicator declared in both opda-property.ttl (the G11 §Q5a flat-Property emission) and opda-descriptive.ttl (the ODR-0008d Category-E RiskAssessment Quale) — conflicting rdfs:domain. Resolved by removing the G11 Property declaration; riskIndicator now lives solely on opda:RiskAssessment (it bins to Category E, not G). Defensible (ODR-0008d is the newer, council-ratified, more-specific model; the categoriser agrees), but it supersedes part of the closed G11 item — flagged for WG ratification, not treated as silent engineering reconciliation (§G1 principle). The broader G11∩candidate-G overlap is the subject of the curated Category-G walk plan, ADR-0031.
    • 2026-05-31 — Section G update from the curated Category-G walk + Council session-028. The ADR-0031 walk executed (185/188 candidate-G emitted-or-collapsed) and was reviewed by Council session-028 (full panel; 2 DA blockers + revises), ratified as ODR-0024 (modelling rules) + ADR-0032 (engineering), and remediated (honest coverage 179/239). Marked the G11 reconciliation ratified (session-028 Q8). Added G22 (the monetary walk → opda:MonetaryAmount), G23 (the ~38 R5-surfaced enum/attribute leaves + the 5 unwired SKOS schemes), and G24 (opda:Room, re-confirmed held). The full leftover (60 uncovered of 239) is named by ci-category-g-coverage.
    • 2026-05-31 — G25 added from Council session-029 (ODR-0023 R2 reconvened). R2 adjudicated the UFO-axis sub-module split (ODR-0008a/b/c) NOT load-bearing (0–6–0) — the walk typed leaves by bearer Kind (rdfs:domain), not UFO meta-category, so the presupposed UFO-typed partition was never built. No spawn; ODR-0008 stays monolithic (no emission, no re-pin). Added G25 — the deferred gated gUFO rdf:type typing pass that both preserves the Quality/Mode insight and serves as conjunct (i) of R2’s sharpened re-open trigger. ODR-0008c struck from the UFO axis (it is rdfs:domain opda:LegalEstate); Kendall’s attachment-class four-way re-routed to its encumbrance-cardinality trigger.
    • 2026-05-31 — G22 monetary walk EXECUTED + closed. Minted opda:MonetaryAmount (a by-value value structure: opda:amount xsd:decimal magnitude + opda:currency → the seeded-extensible ISO-4217 opda:CurrencyScheme, GBP/EUR/USD) and 16 per-economic-kind object properties (each rdfs:range opda:MonetaryAmount on its own bearer — opda:LegalEstate / opda:Property / opda:Valuation / opda:Transaction) + opda:amount, via the ADR-0030 generator (ODR-0024 R3 / Council session-028 Q3 / ODR-0008d item-3). opda:price left a single-currency fixtures interim (not migrated). Coverage 179 → 196/239 (ci-category-g-coverage); all 6 CI gates green; 47 SKOS schemes; 264 tests pass. G22 closed; the remaining 43 uncovered are §G23 (R5 enum/attribute leaves) + §G24 (opda:Room).
    • 2026-05-31 — G23 R5-surfaced follow-on EXECUTED + closed. Minted the 40 R5-surfaced enum + Yes/No Property/estate attributes as flat datatype properties (on opda:Property / opda:LegalEstate / opda:NearbyFacility), via the ADR-0030 generator (ODR-0024 R5–R6). Wired the 5 R6 SKOS schemes + the existing TenureKindScheme to their 6 consuming enum properties (constructionType/priceQualifier/typeOfConnection/transportType/ofstedRating/marketingTenure) via base value shapes (sh:targetSubjectsOf + sh:in); re-ranged ownerType → OwnerTypeScheme and wired its sh:in the same way — closing the pre-existing Proprietor-overlay gap (no overlay needed). Coverage 196 → 236/239 (ci-category-g-coverage); all 6 CI gates green; 265 tests. G23 closed; only the 3 held opda:Room leaves (§G24, held-as-live) remain — the curated Category-G walk is now complete bar the held Room promotion.
    • 2026-05-31 — G25 gated gUFO typing pass EXECUTED + closed (ADR-0034). Asserted rdf:type gufo:Quality (+ dct:source ODR-0008 §Q5a) on the 5 uncontested Quale-in-Region Property leaves (currentEnergyRating, councilTaxBand, builtForm, centralHeatingFuelType, heatingType) in opda-descriptive-annotations.ttl — the annotation graph, never the shapes graph (ODR-0010 §Q7a) — via the ADR-0012/ADR-0030 emitter. Omitted the straddlers (priceQualifier, marketingTenure) + re-sorter (ownershipType) + Substance-Kind label (tenureKind), per session-029 Q5. Preserves the UFO Quality insight without minting ODR-0008a/b/c, and builds conjunct (i) of the ODR-0023 R2 re-open trigger. Allemang’s prose-until-a-biting-query minority recorded (annotation-graph-isolated, removable). Byte-identity re-pinned opda-descriptive-annotations.ttl only; all 6 CI gates green; coverage unchanged 239/239; 267 tests.
    • 2026-05-31 — CI gate reconciliation: BASPI5 G19 vs G3 (recorded per §G1, not silently reconciled). Two pre-existing red workflows were greened. (1) The BASPI5 emitter cited a fabricated form-question anchor A1.1.5.uprn (to disambiguate propertyPack.uprn from address.postcode, which share baspi5Ref A1.1.5); this violated G19 (ADR-0014 — every anchor MUST be a real baspi5Ref). Fixed: the UPRN shape’s dct:source now cites the real ref A1.1.5; the two shapes are distinguished by sh:path, not a fabricated ref. (2) That surfaced a latent conflict with G3 (ODR-0022 §2 — one sh:path per form-question leaf), which then flagged the shared A1.1.5 as “doubly-bound”. Reconciled in favour of G19 (don’t invent refs): G3 now treats a ref baspi5.json itself assigns to >1 schema leaf as legitimate multi-entity coverage, not over-binding (ci/descriptive_roundtrip_test.py _SCHEMA_SANCTIONED_SHARED_REFS; locking test added). (3) Separately, the byte-identity workflow’s full pytest run hit FileNotFoundError on the gitignored data-dictionary-canonical.json (ODR-0024 R12 — local-only); the 8 corpus-loading test_leaf_categoriser.py tests now skipif the dictionary is absent (the 15 literal-input tests still run in CI; opda-gen emit + all CLI gates are dict-independent). All three active workflows green on HEAD.
    • 2026-05-31 — Governance-surface emission defects logged (Council session-033). The A2 council (ODR-0012 lawful-basis/consent/purpose class vocab) surfaced and the Queen verified three emission defects in the accepted, emitted ODR-0012/0018 governance surface — to be cleared by a generator fix (an ADR-0012/0018 emitter change; independent of any new class vocab; all byte-identity-affecting → regenerate + re-pin + tests). D1 (namespace bug): opda:SpecialCategoryPIIWithoutLawfulBasisShape binds PREFIX dpv: <…/dpv/pd#> but queries dpv:hasLegalBasis, which is core dpv: (…/dpv#) — the lone lawful-basis Violation gate checks a non-existent predicate and would miss a real legal-basis triple; fix the binding. D2 (predicate overload): opda:lawfulBasis carries dpv-pd:DateOfBirth/EmailAddress (PD-categories) in opda-agent-annotations.ttl but lawful bases (dpv:PublicTask/Consent/LegitimateInterest) in claim/property annotations; split the predicate (PD-category vs lawful-basis). D3 (highest value): opda:isPIIBearing true is asserted on zero classes (the token occurs only inside PIIWithoutDPVCoAnnotationRule’s own comment + WHERE clause), so the rule fires on the empty set — the Phase-1 PII-co-annotation floor is currently UNENFORCED; emit opda:isPIIBearing true on the PII-bearing Kinds (Person/Address/Organisation/evidence subclasses) so enforcement actually fires. RESOLVED 2026-05-31 (this commit; generator fix, no version bump — completes the existing 1.0.0 PII-floor design). D1: SpecialCategoryPIIWithoutLawfulBasisShape’s sh:select now binds PREFIX dpv: <https://w3id.org/dpv#> (core), so dpv:hasLegalBasis resolves to the real predicate (emitters/shapes.py; only the prefix line changed). D2: the two mis-slotted _add_dpv_variant_refinement calls in build_agent_annotations() are replaced — DateOfBirth now attaches via property-level dpv-pd:hasPersonalDataCategory on opda:dateOfBirth (the predicate IS declared on opda:Person); EmailAddress attaches class-level on opda:Person because no email predicate is declared on Person (the prior opda:hasEmail was a fiction — per-spec fallback, recorded here). Acceptance: every opda:lawfulBasis object across the corpus is now a https://w3id.org/dpv#… term, none in dpv-pd. D3: opda:isPIIBearing is declared as a foundation owl:DatatypeProperty (rdfs:range xsd:boolean, emitters/foundation.py) and emitted true in _add_dpv_baseline() on exactly the six class-level-baseline Kinds — Person, Property, Address, RegisteredTitle, Claim, EPCCertificate (this corrects the log line’s “Person/Address/Organisation/evidence subclasses”: the floor tracks the class-level dpv-pd:hasPersonalDataCategory baseline set, so opda:Organisation is correctly unmarked per ODR-0006 §Q6, and the evidence subclasses carry only opda:lawfulBasis variant refinements, not a class-level baseline). The rule’s target set is now non-empty and equals the baseline set; a regression guard locks count(isPIIBearing true) == count(class-level dpv-pd:hasPersonalDataCategory baseline). All 6 CI gates green; 274 pytest pass; byte-identity re-pinned.
    • 2026-08-22 — Chair-authority terminology correction. Register entries now distinguish the existing PDTF schema and schema-derived ontology from SPDTF, the first collaboratively authored scheme draft. Earlier rebrand/version-successor wording is withdrawn; the programme transition is schema to scheme. Technical source identifiers and historical evidence remain unchanged.

    ← Back to ADR Corpus  |  View source

    ADRs are MADR-format architecture decisions. A superseded ADR is replaced by a later record rather than edited in place.

    Comments

    Loading comments…