TOP / Sponsor / spec / v1
2026-05-07 · backed by source/top-strawman.json (v0.1.3-strawman) · pyshacl on the Pfizer-IQVIA worked example: Conforms: True
Sections: 1. TL;DR 2. Model summary 3. Architectural decisions 4. Stress-test scenarios 5. Query patterns 6. NLP-to-NGSI-LD 7. SHACL invariants 8. Cross-walks 9. Open issues

1.TL;DR the per-Org-per-Study insight, the three architectural decisions, the multi-jurisdictional pattern

The Sponsor entity in TOP is per Organization, per Study. One Sponsor entity captures one Organization's role on one Study. A company that sponsors fifty Studies has fifty Sponsor entities, all anchored through belongsToOrganization to the same corporate Organization. The "all studies Pfizer sponsors" enterprise view is served from Organization.playsSponsorRole, not from a single Sponsor entity. This shape resolves the cases the OOUX map's enterprise-level Sponsor cannot: CRO-as-proxy on a single Study, multi-jurisdictional sponsor of record (Pfizer Inc under FDA, Pfizer Ireland under EMA on the same trial), M&A transfer of one Study without moving the rest of the portfolio, and the academic IIT where the legal sponsor is a single PI.

What you see if you query the model: three boolean responsibility flags per Sponsor (regulatory, financial, operational) plus an isInitiator flag plus an isSponsorOfRecord flag, a 1..1 link to the corporate Organization, a 1..1 link to the Study, an optional self-reference (actsOnBehalfOf) for delegation chains, an optional self-reference (parentSponsor) for structural lineage, an optional 0..N link to RegulatoryAuthority for jurisdiction scoping, and validFrom / validUntil temporal bounds for handoffs and transfers. That set is the entire architectural payload. Everything else (Contracts, Documents, Audits, Submissions, IP, Sites, Systems, Persons) hangs off the Sponsor through standard relationships and accumulates over the Study lifecycle.

The shape lets a regulator query "show me the legal Sponsor of record on Study ONCO-423 in my jurisdiction" and get exactly one entity back. It lets a site query "who do I call when the eTMF goes down on this Study" and get a Sponsor entity with operational responsibility. It lets a sponsor portfolio analyst query "show me every Sponsor entity backed by Pfizer Inc that is the SoR under FDA and is currently in active enrollment" without crossing layer boundaries. The model preserves clean projection into USDM and FHIR because every predicate carries one target type and every entity sits at one architectural scope.

2.Model summary attributes and key relationships · full set in source/top-strawman.json

Attributes (twenty fields)

AttributeTypeOptionalDoc
sponsorIdngsi-ld:URInoGlobally unique NGSI-LD identifier
sponsorNamexsd:stringnoDisplay name
legalNamexsd:stringnoRegistered legal name
sponsorTypeenumnoPHARMACEUTICAL, BIOTECH, ACADEMIC, GOVERNMENT, INVESTIGATOR_SPONSOR, CRO_AS_SPONSOR, OTHER
dunsxsd:stringyesDun & Bradstreet DUNS number
orcidxsd:stringyesORCID, populated for investigator-sponsors
addressxsd:objectnoPer-Study contact address (line1, city, region, postalCode)
countryxsd:stringnoISO 3166-1 alpha-3
phonexsd:stringnoPrimary phone
emailxsd:stringnoPrimary email
websitexsd:anyURInoSponsor website
statusenumnoACTIVE, INACTIVE, MERGED, ACQUIRED
isSponsorOfRecordxsd:booleannoTrue if this Sponsor entity holds regulatory accountability per 21 CFR 312 (or jurisdictional equivalent). Exactly one Sponsor per (Study × jurisdiction) carries this true.
hasRegulatoryResponsibilityxsd:booleannoOften coincident with isSponsorOfRecord; separated for the rare case where regulatory submission is delegated without transfer of legal SoR status.
hasFinancialResponsibilityxsd:booleannoTrue if this Sponsor provides funding. Distinct from SoR (an academic medical center may be the financial sponsor while a PI is the legal sponsor of an IIT).
hasOperationalResponsibilityxsd:booleannoTrue if this Sponsor manages day-to-day conduct. The CRO-as-proxy case.
isInitiatorxsd:booleannoTrue if this Sponsor initiated the Study.
validFromxsd:dateTimeyesNGSI-LD temporal: from when this Sponsor relationship is operationally valid.
validUntilxsd:dateTimeyesNGSI-LD temporal: through when this Sponsor relationship was operationally valid.
primaryTherapeuticAreaxsd:stringyesPer-Study TA focus from this Sponsor's role view (oncology, cardiology, rare disease, etc.). Corporate TA spread lives on Organization.primaryTherapeuticAreas.

Key relationships (selected; full set in source/top-strawman.json)

PredicateTargetCardinalityOperational meaning
belongsToOrganizationOrganization1..1The corporate Organization this Sponsor is backed by; carries the parentOrganization hierarchy for J&J / Janssen / Innovative Medicine cases.
runsStudy1..1The single Study this Sponsor entity is scoped to (per-Org-per-Study pattern).
actsOnBehalfOfSponsor0..1Self-ref for operational delegation; CRO operational sponsor → sponsor of record.
parentSponsorSponsor0..1Self-ref for structural lineage: M&A successor, lead/co-sponsor, EU CTR Article 74 legal-rep parent. Distinct from actsOnBehalfOf (operational) and belongsToOrganization (corporate).
regulatoryAuthorityScopeRegulatoryAuthority0..NJurisdictional scoping for multi-jurisdictional sponsor of record.
engagesSite0..NSites engaged for this Study (accumulates over startup).
suppliesInvestigationalProduct0..NIP supplied for this Study (observational studies have none).
interfacesWithOversightBody0..NIRB, EC, DSMB, IDMC for this Study.
filesRegulatorySubmission0..NSubmissions filed under this sponsorship (accumulates over lifecycle).
operatesSystemSystem0..NPer-Study operational ownership of Systems (the "who do you call when the EDC breaks on this Study" view). Distinct from corporate tenancy at Organization.operatesSystem.
publishesDocumentDocument0..NSponsor-controlled documents on this Study (TMF and beyond).
publishesPublicationPublication0..NResulting publications. Split from "publishes" for clean projection.

3.Why this shape — architectural decisions

Three decisions shape the Sponsor model. Each was made in dialogue and is reversible if downstream evidence argues against it.

Decision 1. Sponsor is per Organization, per Study.

The OOUX map's original Sponsor was implicitly enterprise-level (one Sponsor entity = one company; runs: Study (1..N)). We flipped this in v0.2-TOP to per-Organization-per-Study (runs: Study (1..1)). Reason: the operator's mental model of "the Sponsor of this study" is per-study contextual. The "all studies Pfizer sponsors" enterprise view is served from Organization.playsSponsorRole, not from a single Sponsor entity. This matches USDM's ProductOrganizationRole pattern and resolves Gemini's "show me trials where Org X is the payer but not the regulator" query cleanly. Trade-off: the per-Study scope means a company sponsoring fifty trials has fifty Sponsor entities. That is fine; they are cheap, they index well, and they make the SHACL invariants crisp.

Decision 2. Boolean responsibility flags absorb the responsibility-matrix pattern.

Each Sponsor entity carries five booleans: isSponsorOfRecord, hasRegulatoryResponsibility, hasFinancialResponsibility, hasOperationalResponsibility, isInitiator. Gemini originally proposed a junction class to model the five-way Sponsor-role matrix; we collapsed it into flags after stress-testing the IIT case (PI = legal sponsor, AMC = financial sponsor, no separate initiator) and the CRO-as-proxy case (Pfizer = SoR + regulatory + financial; IQVIA = operational only). The flags express the matrix without introducing a junction-class indirection that would slow every query and confuse operators reading the entity. Trade-off: the flags require explicit SHACL invariants to encode the rule "exactly one isSponsorOfRecord = true per Study × jurisdiction." That invariant lives in §7.

Decision 3. Multi-jurisdictional sponsor of record via regulatoryAuthorityScope.

Pfizer Inc is the SoR under FDA on Study ONCO-423. Pfizer Ireland is the SoR under EMA on the same Study. Two different legal entities, two different Sponsor entities, both carrying isSponsorOfRecord = true, distinguished by regulatoryAuthorityScope (the FDA entry vs the EMA entry). The SHACL invariant relaxes from "exactly one SoR per Study" to "exactly one SoR per Study × jurisdiction." This matches how multi-region clinical trials actually file and how regulators read the entity at audit. Trade-off: the RegulatoryAuthority horizontal is currently flagged-missing in OOUX v0.2; the relationship resolves through the target-missing minCount-zero pattern until the horizontal is specified.

4.Stress-test scenarios seven cases, plain English to graph shape

A. Industry-sponsored trial, single jurisdiction, no CRO
canonical

Pfizer Inc sponsors Study ONCO-423 under FDA. Pfizer runs ops in-house. No CRO, no co-sponsor, no academic involvement at the sponsorship layer.

Sponsor:pfizer-onco423-fda
  belongsToOrganization → Organization:pfizer
  runs → Study:ONCO-423
  regulatoryAuthorityScope → RegulatoryAuthority:fda
  isSponsorOfRecord = true · hasRegulatoryResponsibility = true
  hasFinancialResponsibility = true · hasOperationalResponsibility = true
  isInitiator = true
B. CRO acting as operational proxy
delegation

Pfizer is the legal SoR under FDA. IQVIA runs day-to-day operations as proxy. Two Sponsor entities, both linked to the same Study, related by actsOnBehalfOf.

Sponsor:pfizer-onco423-fda · isSponsorOfRecord=true · hasOperational=false
Sponsor:iqvia-onco423-ops · isSponsorOfRecord=false · hasOperational=true
  actsOnBehalfOf → Sponsor:pfizer-onco423-fda
C. Multi-jurisdictional sponsor of record, dual SoR
multi-region

Pfizer Inc is SoR under FDA. Pfizer Ireland is SoR under EMA on the same Study. IQVIA operates the trial globally as proxy for both. Three Sponsor entities, two SoRs, one operational sponsor.

Sponsor:pfizer-onco423-fda · regulatoryAuthorityScope → fda · isSoR=true
Sponsor:pfizer-ireland-onco423-ema · regulatoryAuthorityScope → ema · isSoR=true
Sponsor:iqvia-onco423-ops · actsOnBehalfOf → Sponsor:pfizer-onco423-fda · hasOperational=true
SHACL invariant: exactly one isSponsorOfRecord=true per (Study × RegulatoryAuthority) — satisfied.
D. Investigator-initiated trial at MD Anderson
academic IIT

PI Dr. Smith at MD Anderson runs IIT-001 with departmental funds. Smith is the legal sponsor (sponsorType = INVESTIGATOR_SPONSOR, orcid populated, duns empty). MD Anderson is the financial sponsor and the operational owner.

Sponsor:smith-iit001-fda · belongsToOrganization → Organization:smith-individual
  sponsorType=INVESTIGATOR_SPONSOR · orcid=populated · duns=empty
  isSoR=true · hasRegulatoryResponsibility=true · isInitiator=true
  hasFinancialResponsibility=false · hasOperationalResponsibility=false
Sponsor:mdanderson-iit001-ops · belongsToOrganization → Organization:mdanderson
  hasFinancialResponsibility=true · hasOperationalResponsibility=true
E. CRO contracted as legal sponsor
CRO_AS_SPONSOR

Parexel is contracted as legal sponsor on a Phase I study for a small biotech that lacks the regulatory capacity to file IND themselves. Parexel is SoR; the biotech retains financial responsibility and IP ownership.

Sponsor:parexel-bio001-fda · sponsorType=CRO_AS_SPONSOR · isSoR=true
  belongsToOrganization → Organization:parexel
Sponsor:smallbio-bio001-fin · hasFinancialResponsibility=true · isInitiator=true
  belongsToOrganization → Organization:smallbio
F. M&A transfer mid-conduct
temporal

Pfizer acquires Arena Pharmaceuticals on 2026-03-15. Arena's Study ARENA-LEGACY-001 transfers to Pfizer sponsorship on the IND-transfer effective date 2026-04-01. The Arena Sponsor entity gets validUntil = 2026-04-01T00:00:00Z; a new Pfizer Sponsor entity is created with validFrom = 2026-04-01T00:00:00Z. Both records remain queryable for audit. The successor links via parentSponsor.

Sponsor:arena-legacy001-fda · validFrom=2024-06-01 · validUntil=2026-04-01
Sponsor:pfizer-legacy001-fda · validFrom=2026-04-01 · validUntil=null
  parentSponsor → Sponsor:arena-legacy001-fda
  belongsToOrganization → Organization:pfizer
G. SMO portfolio view across studies
enterprise lens

Elevate Research is an SMO running sites across many Studies for many sponsors. Question: "show me every Sponsor entity whose engaged sites include any Elevate location, grouped by Sponsor parent Organization." This is a graph traversal, not a Sponsor-attribute query.

Site → partOfSiteNetwork → Organization:elevate-research
  ←(engages)— Sponsor → belongsToOrganization → Organization (parent)
  Group by parent Organization · count per group · result: SMO portfolio map.

5.Query patterns six perspectives, NGSI-LD HTTP shape

Site (CRA at a hospital)
"Who do I call when the eTMF goes down on Study ONCO-423?"
GET /entities?type=Sponsor
  &q=runs=="urn:ngsi-ld:Study:ONCO-423"
  &q=hasOperationalResponsibility==true
  &options=keyValues
Returns the Sponsor entity (or entities) flagged as the operational owner of this Study. The CRA reads phone, email, and the employs link to find the named contact.
Patient (or patient advocate)
"Who is legally responsible for this trial in the US?"
GET /entities?type=Sponsor
  &q=runs=="urn:ngsi-ld:Study:ONCO-423"
  &q=isSponsorOfRecord==true
  &q=regulatoryAuthorityScope=="urn:ngsi-ld:RegulatoryAuthority:fda"
Returns exactly one Sponsor entity (per the SHACL invariant). The patient reads legalName and website to verify accountability.
Regulator (FDA reviewer)
"For Study ONCO-423, who holds the IND in our jurisdiction?"
GET /entities?type=Sponsor
  &q=runs=="urn:ngsi-ld:Study:ONCO-423"
  &q=isSponsorOfRecord==true
  &q=regulatoryAuthorityScope=="urn:ngsi-ld:RegulatoryAuthority:fda"
  &options=sysAttrs
Returns the SoR entity with full audit metadata (createdAt, modifiedAt, validFrom, validUntil). Multi-jurisdictional studies return one entity per regulator's regulatoryAuthorityScope.
SMO operations lead
"Across our 12 site locations, which Sponsors are we currently engaged with?"
GET /entities?type=Sponsor
  &q=engages.partOfSiteNetwork=="urn:ngsi-ld:Organization:elevate-research"
  &options=keyValues
Returns the Sponsor entities with at least one engaged Site that is part of the Elevate Research SMO. Group client-side by belongsToOrganization for the parent-Organization roll-up.
Sponsor portfolio analyst (Pfizer side)
"Show me every Pfizer-led Sponsor entity where we hold the SoR under FDA and the Study is in active enrollment."
GET /entities?type=Sponsor
  &q=belongsToOrganization=="urn:ngsi-ld:Organization:pfizer"
  &q=isSponsorOfRecord==true
  &q=regulatoryAuthorityScope=="urn:ngsi-ld:RegulatoryAuthority:fda"
  &q=runs.studyStatus=="active"
Returns the active Pfizer Sponsor entities under FDA. Hierarchy children (Pfizer Ireland, Janssen, Innovative Medicine) reachable by traversing Organization.parentOrganization with belongsToOrganization.
Compliance officer (post-M&A audit)
"For Study ARENA-LEGACY-001, show me the full Sponsor lineage with effective dates."
GET /temporal/entities?type=Sponsor
  &q=runs=="urn:ngsi-ld:Study:ARENA-LEGACY-001"
  &timerel=between
  &timeAt=2024-01-01T00:00:00Z
  &endTimeAt=2026-12-31T23:59:59Z
  &options=temporalValues
Returns every Sponsor entity that has been the SoR on this Study, ordered by validFrom. The parentSponsor chain links successors to predecessors; validFrom / validUntil bracket each tenure.

6.NLP-to-NGSI-LD translation how operator language maps to graph predicates

Most Sponsor-related questions an operator types into a search bar collapse to a small number of structural patterns. The translation table below shows how natural-language phrasings rewrite into NGSI-LD query shapes, and how the boolean responsibility flags carry the discriminating logic.

Operator phrasingTranslated query shapeDiscriminating predicate
"Who's the sponsor of Study X?"type=Sponsor & runs==X & isSponsorOfRecord==trueisSponsorOfRecord
"Who's running the trial day-to-day?"type=Sponsor & runs==X & hasOperationalResponsibility==truehasOperationalResponsibility
"Who's funding it?"type=Sponsor & runs==X & hasFinancialResponsibility==truehasFinancialResponsibility
"Who started this trial?"type=Sponsor & runs==X & isInitiator==trueisInitiator
"Who holds the IND in the US?"type=Sponsor & runs==X & isSponsorOfRecord==true & regulatoryAuthorityScope==fdaregulatoryAuthorityScope
"Show me Pfizer's active oncology trials"type=Sponsor & belongsToOrganization==pfizer & primaryTherapeuticArea==oncology & runs.studyStatus==activeprimaryTherapeuticArea + studyStatus
"Who replaced Arena as sponsor?"type=Sponsor & parentSponsor==Sponsor:arena-* & validFrom!=nullparentSponsor + validFrom
"Who's the CRO running this trial?"type=Sponsor & runs==X & sponsorType==CRO_AS_SPONSOR (legal CRO sponsor) OR & actsOnBehalfOf!=null (operational proxy)sponsorType vs actsOnBehalfOf
"Who's responsible for this Study's safety reporting?"type=Sponsor & runs==X & hasRegulatoryResponsibility==true (then traverse to RegulatorySubmission)hasRegulatoryResponsibility
"Has this Study had a sponsor change?"temporal/entities, type=Sponsor & runs==X & count>1 OR any record where validUntil!=nullvalidUntil + temporal endpoint

The pattern that earns its keep: every operator question reduces to a Sponsor-entity query plus one or two boolean-flag or scoped-relationship constraints. No junction-class hops, no derived-view materializations. The verb is always runs for "what Study" and the discriminator is always a flag, an enum, or a scoped relationship. This is what makes NLP-to-NGSI-LD translation tractable for a thin LLM layer.

7.SHACL invariants what the validator catches

The SHACL shapes in shapes/clinical-trials-shapes.ttl are emitted from the source intermediate by tools/build_shacl.py. The Sponsor NodeShape has 47 attribute property shapes and 24 relationship property shapes covering Sponsor and the Organization horizontal it backs; the full graph (Sponsor + Study + Site + Organization + Document) emits 84 property shapes total.

Invariants encoded today

InvariantSHACL mechanismStatus
Every Sponsor must belong to exactly one Organization.sh:minCount 1 ; sh:maxCount 1 on belongsToOrganization, plus sh:class topc:OrganizationEncoded
Every Sponsor must run exactly one Study.sh:minCount 1 ; sh:maxCount 1 on runs, plus sh:class top:StudyEncoded
Required attributes (sponsorId, sponsorName, legalName, sponsorType, address, country, phone, email, website, status, the five booleans) must all be present.sh:minCount 1 ; sh:maxCount 1 on each, plus sh:datatype for typed literals.Encoded
sponsorType, status, identifierScheme are bounded by enum.sh:in (...)Encoded
Aspirational relationships (Audits, Submissions, IP, Documents, etc.) accumulate over time and may legitimately be empty.0..N cardinalities on every aspirational relationship, set via the v0.1.1 cardinality realism pass.Encoded
Relationships pointing at flagged-missing target classes (RegulatoryAuthority, CRO, Country, Publication, SOP, TrainingProgram, DataTransferAgreement) automatically relax minCount to zero until the target is specified.build_shacl.py forces minCount=0 when _targetMissing is set; emits a Turtle comment recording the relaxation.Encoded (v0.1.1)
Predicate names are unambiguous within a focus class (no polysemous verbs).Pre-emission guard check_no_polysemous_verbs in both build_context.py and build_shacl.py raises ValueError if a focus class has duplicate relationship or attribute names.Encoded (v0.1.2)

Domain invariants (encoded as SHACL-SPARQL constraints by tools/build_shacl.py, validated by pyshacl in --advanced mode):

InvariantSeverityStatus
Soft warning: isSponsorOfRecord = true should imply hasRegulatoryResponsibility = true. The rare 21 CFR 312.52 transfer-of-obligations case is permitted; surfaces to a human reviewer rather than blocking validation.sh:WarningEncoded (v0.1.4)
Hard violation: every Study must have at least one Sponsor with isSponsorOfRecord = true.sh:ViolationEncoded (v0.1.4)
Hard violation: at most one Sponsor with isSponsorOfRecord = true per (Study × RegulatoryAuthority). Sponsors lacking explicit regulatoryAuthorityScope group together as the implicit single-jurisdiction bucket, so two unscoped SoRs on the same Study correctly fire.sh:ViolationEncoded (v0.1.4)
Hard violation: every Study must have at least one Sponsor with hasOperationalResponsibility = true. If nobody is running it day-to-day, the trial cannot be conducted.sh:ViolationEncoded (v0.1.4)

Invariants pending

InvariantSHACL mechanismStatus
Temporal coverage continuity: no gaps in Sponsor coverage across handoffs (the Sponsor at validUntil=T1 should be succeeded by a Sponsor with validFrom=T1).Custom SPARQL constraint or post-validation check.Optional, low priority

8.Cross-walks how Sponsor projects into other vocabularies

StandardEquivalent class / propertyNotes
FHIR R5fhir:OrganizationFHIR collapses sponsor into a generic Organization with no sponsor-specific role discriminator. TOP's per-Org-per-Study Sponsor projects onto FHIR by populating Organization.type with codes for the sponsor role and binding the Study via ResearchStudy.sponsor.
USDM v3usdm:SponsorUSDM models Sponsor as a Code type on Organization (one of several roles an Organization can play). TOP keeps Sponsor as an operator-grade top-level and uses belongsToOrganization to anchor it back to the corporate truth USDM expresses. Projection is two-hop: Sponsor → belongsToOrganization → Organization (USDM-shaped).
CDISC ODM-XMLodm:Study/GlobalVariables/StudyNameODM-XML's Sponsor representation is shallow (a study-name attribute and a contact block). TOP's full Sponsor entity projects forward into ODM as a flattened Study-level metadata block.
CDASH v2.1(not directly mapped)CDASH is a clinical data acquisition standard at the case-report-form level; Sponsor lives above its scope.
W3C PROVprov:Agent with role prov:OrganizationPROV models Sponsor as an Agent involved in the activity (Study). The boolean responsibility flags map onto PROV qualified-association roles.
NCItNCIT:C70793 (Trial Sponsor)NCIt's Trial Sponsor concept is the closest single-term match.

9.Open issues tracked, not hidden

Items called out for resolution before v0.1 of the clinical-research reference graph publishes. Each is tracked; none block the architectural decisions in §3.

IssueStatusOwner
Cardinality realism pass (1..N → 0..N on aspirational Sponsor relationships).Closed in v0.1.1-strawman. Eighteen aspirational 1..N relationships relaxed to 0..N. The Sponsor invariant is: belongs to exactly one Organization, runs exactly one Study. Everything else accumulates over the Study lifecycle. Worked example validates clean against pyshacl.Bo (Q9), shipped
Target-missing minCount handling in build_shacl.py.Closed in v0.1.1-strawman. When a relationship's target class is flagged with _targetMissing the emitter relaxes minCount to 0 and emits a Turtle comment recording the relaxation. Constraints restore automatically once the target class lands.Shipped
Polysemous verb split: "publishes" against Document and Publication; "operates" against TrainingProgram and System.Closed in v0.1.2-strawman. Renamed to publishesDocument, publishesPublication, operatesTrainingProgram, operatesSystem. Path B (split, not collapse-with-sh:or) chosen to preserve clean projection into USDM and FHIR. Pre-emission guard check_no_polysemous_verbs added to both emitters; regression cannot slip back in.Bo (Q7), shipped
Q3 parentSponsor (keep with note).Closed in v0.1.3-strawman. Added parentSponsor (0..1) self-ref for structural lineage cases (M&A successor, lead/co-sponsor in co-development, EU CTR Article 74 legal-rep parent). Distinct from actsOnBehalfOf (operational delegation) and belongsToOrganization (corporate identity).Bo (Q3), shipped
Q4 attribute completeness.Closed in v0.1.3-strawman. primaryTherapeuticArea added on Sponsor (per-Study TA lens). employeeSizeBand, fiscalYearEnd, primaryTherapeuticAreas added on the Organization horizontal (corporate-scope facts). Regulatory authority of record left unchanged: already covered by isSponsorOfRecord + regulatoryAuthorityScope.Bo (Q4), shipped
Q8 CTAs (operator-grade gaps).Closed in v0.1.3-strawman. Added: Reassign Primary Contact, Transfer Studies Between Programs, Request Public Listing on ClinicalTrials.gov.Bo (Q8), shipped
System ownership vs system use, three-layer modeling. Bo's eTMF insight (2026-05-07): a Sponsor may own multiple eTMFs but the operationally meaningful binding is per-Study; ownership matters because that is who you call when the system breaks.Resolved architecturally; parked for Study spec implementation. Three layers: (1) corporate tenancy at Organization.operatesSystem (0..N), the master-contract view; (2) per-Org-per-Study operational ownership at Sponsor.operatesSystem (0..N), the call-when-it-breaks view (already in v0.1.2); (3) per-Study use binding at Study.usesEtmfSystem / usesEdcSystem / usesCtmsSystem / usesIrtSystem / usesSafetyDatabaseSystem / usesRandomizationSystem / usesEproSystem (0..1 each), the which-instance-is-this-Study-on view. System becomes a horizontal carrying vendor (→ Organization with type=VENDOR), productName, instanceId, baseUrl, systemType. The Sponsor v0.1.3 source does not change.Parked for Study spec; tracked. Logged 2026-05-07.
RegulatoryAuthority horizontal needs full spec (currently flagged-missing in OOUX v0.2 #60).ParkedWorking group
CRO horizontal needs full spec (currently flagged-missing in OOUX v0.2).ParkedWorking group
USDM parentOrganization equivalent needs verification with David Iverson Hurst.Outreach pendingBo
SHACL "exactly one isSponsorOfRecord per (Study × jurisdiction)".Closed in v0.1.4-strawman. Encoded as SHACL-SPARQL constraint via sh:SPARQLConstraint. The implementation uses OPTIONAL on regulatoryAuthorityScope so unscoped SoRs group together as the implicit single-jurisdiction bucket, correctly catching dual-SoR-without-scoping. Pfizer-IQVIA worked example was enriched with regulatoryAuthorityScope triples (FDA, EMA) so the multi-jurisdictional pattern actually validates rather than just being claimed in a comment. Required pyshacl --advanced mode for SHACL-SPARQL.Shipped
Boolean responsibility flag combinations: "isSponsorOfRecord implies hasRegulatoryResponsibility" and the cross-entity invariants (Study must have ≥1 SoR, ≥1 operational sponsor).Closed in v0.1.4-strawman (Bo, soft-warning chosen). Implication encoded as sh:Warning; cross-entity rules encoded as sh:Violation. Plus a related fix: build_shacl.py now also suppresses sh:class when the target class is _targetMissing, on the same logic as the minCount relaxation (cannot validly assert a class against a class that does not yet exist).Shipped
Temporal coverage continuity SHACL invariant (no gaps across handoffs).Optional, low priorityTranslator scaffold v3