{
  "_comment": "TOP v0.7.0 reference graph intermediate (strawman). v0.7.0 lift (2026-05-09) adds Event as the ninth and final OOUX-locked top-level. Per FIRST-PRINCIPLES universal-foundation posture, Event is a single container covering all clinical-trial occurrences requiring tracking, reporting, or escalation \u2014 Adverse Event, Serious Adverse Event, Deviation, Discrepancy, Safety Signal, Safety Report, Other Clinical Event \u2014 discriminated by eventCategory enum. Specialization is content (causality, expectedness, MedDRA term, CTCAE grade, protocolDeviationCategory); not entity shape. Per ICH E2A / E2B(R3) and 21 CFR 312.32, regulatory reportability is a first-class attribute with submission tracking. Per ICH E6(R3) Section 6, deviations carry category + impact. Un-flag-misses Participant.hasAdverseEvent, Visit.hasAdverseEvent, VisitObservation.escalatedTo. Per temporal+PROV native: Event declares provType: prov:Activity (the event IS the thing that happened); reportedBy \u2192 Person carries provSemantics: wasAssociatedWith; derivedFrom \u2192 VisitObservation carries provSemantics: wasInformedBy (escalation chain). Per the taxonomy migration table, Event is destined to split into topc:Event (universal primitive shape \u2014 every regulated workflow has Events) + topcr:Event (clinical-research specialization adding causality, MedDRA, CTCAE, IP causality, protocol-deviation discipline) in the upcoming namespace refactor. For v0.7 this lift co-locates both concerns under the existing top: prefix; the refactor PR will perform the split with no shape changes. Top-level count: 9 of 9 OOUX-locked top-levels scaffolded (Sponsor, Study, Site, Participant, Recruit, Visit, OversightBody, InvestigationalProduct, Event). v0.7.0 SHACL adds 5 Event domain invariants (4 hard + 1 soft).",
  "version": "0.7.0-strawman",
  "prefix": "top",
  "horizontal_prefix": "topc",
  "namespaces": {
    "top": "https://top.scientix.ai/onto/clinical/v1#",
    "topc": "https://top.scientix.ai/onto/commons/v1#",
    "prov": "http://www.w3.org/ns/prov#"
  },
  "top_levels": [
    {
      "id": "Sponsor",
      "role": "operator-facing entity that captures one Organization's role on one Study",
      "description": "A Sponsor is an entity responsible for some aspect of a clinical trial: initiation, regulatory accountability, financing, or operational conduct. A study has at least one sponsor of record, who carries regulatory responsibility, and may have additional Sponsor entities for operational delegation (a CRO acting as proxy), financial backing (an academic medical center on an investigator-initiated trial), or co-sponsorship. The Sponsor entity is what the site, the study team, and the regulator interact with day to day. Corporate identity and parent/child structure live on the linked Organization.",
      "ooux_editor_note": "v0.2: type vocabulary expanded to include CRO_AS_SPONSOR; added duns and orcid identifiers; added regulatory and finance contact relationships rather than embedded fields. Investigator-Sponsor (academic single-PI sponsor) is supported via sponsorType. v0.2-TOP additions (post-community-input, post-Gemini analysis): Sponsor is now per Organization-per-Study (one Sponsor entity per Org's role on one Study). Added belongsToOrganization (1..1, USDM-aligned) on the Organization horizontal. Added five boolean responsibility flags absorbing Gemini's responsibility-matrix pattern (isSponsorOfRecord, hasRegulatoryResponsibility, hasFinancialResponsibility, hasOperationalResponsibility, isInitiator). Added actsOnBehalfOf self-ref for CRO-as-proxy delegation. Added regulatoryAuthorityScope for multi-jurisdictional sponsor-of-record cases (Pfizer US + Pfizer Ireland on the same trial). Added validFrom and validUntil temporal attributes for M&A sponsor transfers (NGSI-LD-native temporal properties). Changed runs cardinality from 1..N to 1..1 to reflect per-study scoping; the enterprise-level 'all studies Org X sponsors' view is served from Organization.playsSponsorRole. v0.1.1 cardinality realism pass (Q9): all aspirational 1..N relationships relaxed to 0..N. The Sponsor invariant is 'belongs to exactly one Organization, runs exactly one Study'; everything else (Contracts, Submissions, Audits, Documents, IP, etc.) accumulates over the Study lifecycle and may legitimately be empty for a freshly-created or low-activity Sponsor record. Investigator-sponsor IITs may never accrue Audits or CAPAs. The 1..N constraints were aspirational, not operationally true; SHACL was firing on valid records. v0.1.2 polysemous-verb split (Q7): 'publishes' was fired against both Document and Publication; 'operates' was fired against both TrainingProgram and System. JSON-LD @context is a flat term map and SHACL property paths must be unambiguous, so duplicate predicate names silently overwrite or muddle. Renamed to publishesDocument, publishesPublication, operatesTrainingProgram, operatesSystem. This is the path USDM and FHIR took for the same reason; it preserves clean one-pass projection from TOP into either standard without query-time gymnastics. v0.1.3 verification-question closures (Bo, 2026-05-07): Q3 added parentSponsor (0..1 self-ref) for M&A successor lineage, lead/co-sponsor co-development, and EU CTR Article 74 legal-rep parents \u2014 distinct from belongsToOrganization (corporate identity) and actsOnBehalfOf (operational delegation). Q4 added primaryTherapeuticArea (single, optional) on Sponsor for the per-Study TA lens; pushed corporate-scope facts (employeeSizeBand, fiscalYearEnd, primaryTherapeuticAreas) onto the Organization horizontal where they belong. Q4 'regulatory authority of record' left unchanged \u2014 already covered by isSponsorOfRecord boolean + regulatoryAuthorityScope relationship; adding a denormalized attribute would create drift. Q8 added three CTAs: Reassign Primary Contact, Transfer Studies Between Programs, Request Public Listing on ClinicalTrials.gov. System ownership / use three-layer pattern remains parked for the Study spec; Sponsor.operatesSystem stays as the per-Study operational ownership view. v0.1.4 boolean-flag invariants (Bo, 2026-05-07): four SHACL-SPARQL constraints emitted by build_shacl.py. (1) Soft warning when isSponsorOfRecord=true and hasRegulatoryResponsibility=false \u2014 permitted under FDA 21 CFR 312.52 (transfer of obligations) but unusual; surfaces to a human reviewer. (2) Hard violation when a Study has no Sponsor flagged isSponsorOfRecord=true. (3) Hard violation when a Study has more than one isSponsorOfRecord=true Sponsor under the same regulatoryAuthorityScope (or with no explicit scope, treated as the implicit single-jurisdiction bucket). (4) Hard violation when a Study has no Sponsor with hasOperationalResponsibility=true. The Pfizer-IQVIA worked example was enriched with regulatoryAuthorityScope triples on both SoR Sponsor entities (FDA, EMA) so the multi-jurisdictional pattern actually validates rather than just being claimed in a comment.",
      "crosswalks": {
        "fhir": "fhir:Organization",
        "usdm": "usdm:Sponsor",
        "odm": "odm:Study/GlobalVariables/StudyName"
      },
      "attributes": [
        {
          "name": "sponsorId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "sponsorName",
          "type": "xsd:string",
          "doc": "Display name."
        },
        {
          "name": "legalName",
          "type": "xsd:string",
          "doc": "Registered legal name."
        },
        {
          "name": "sponsorType",
          "type": "xsd:string",
          "enum": [
            "PHARMACEUTICAL",
            "BIOTECH",
            "ACADEMIC",
            "GOVERNMENT",
            "INVESTIGATOR_SPONSOR",
            "CRO_AS_SPONSOR",
            "OTHER"
          ],
          "doc": "Sponsor type taxonomy. CRO_AS_SPONSOR covers CROs acting as legal sponsor. INVESTIGATOR_SPONSOR covers academic single-PI sponsorship."
        },
        {
          "name": "duns",
          "type": "xsd:string",
          "optional": true,
          "doc": "Dun & Bradstreet DUNS number."
        },
        {
          "name": "orcid",
          "type": "xsd:string",
          "optional": true,
          "doc": "ORCID identifier when sponsor is an individual investigator-sponsor."
        },
        {
          "name": "address",
          "type": "xsd:object",
          "doc": "Headquarters address (line1, line2, city, region, postalCode)."
        },
        {
          "name": "country",
          "type": "xsd:string",
          "doc": "ISO 3166-1 alpha-3 country code of registration."
        },
        {
          "name": "phone",
          "type": "xsd:string",
          "doc": "Primary phone."
        },
        {
          "name": "email",
          "type": "xsd:string",
          "doc": "Primary email."
        },
        {
          "name": "website",
          "type": "xsd:anyURI",
          "doc": "Sponsor website."
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "ACTIVE",
            "INACTIVE",
            "MERGED",
            "ACQUIRED"
          ],
          "doc": "Lifecycle state.",
          "_temporalProperty": true
        },
        {
          "name": "isSponsorOfRecord",
          "type": "xsd:boolean",
          "doc": "True if this Sponsor entity holds regulatory accountability per 21 CFR 312 (or equivalent in other jurisdictions). Exactly one Sponsor entity per (Study \u00d7 RegulatoryAuthorityScope) carries this flag set true; SHACL constraint enforces the rule per jurisdiction."
        },
        {
          "name": "hasRegulatoryResponsibility",
          "type": "xsd:boolean",
          "doc": "True if this Sponsor entity carries regulatory accountability for the Study. Often the same as isSponsorOfRecord but separated for the rare case where regulatory submission is delegated without transfer of legal sponsor-of-record status."
        },
        {
          "name": "hasFinancialResponsibility",
          "type": "xsd:boolean",
          "doc": "True if this Sponsor entity provides funding for the Study. Distinct from sponsor-of-record: an academic medical center may be the financial sponsor while a PI is the legal sponsor of an IIT."
        },
        {
          "name": "hasOperationalResponsibility",
          "type": "xsd:boolean",
          "doc": "True if this Sponsor entity manages day-to-day operational conduct of the Study. Most common case where a CRO acts as proxy for the sponsor of record."
        },
        {
          "name": "isInitiator",
          "type": "xsd:boolean",
          "doc": "True if this Sponsor entity initiated the Study (the entity that triggered the trial). Often the same as the financial sponsor for IITs; often the same as sponsor of record for industry-sponsored trials."
        },
        {
          "name": "validFrom",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "Datetime from which this Sponsor relationship is operationally valid. Empty for the initial Sponsor record on a Study. Populated when sponsor transfers occur (M&A, divestiture, asset sale). Uses NGSI-LD's validFrom temporal property semantics."
        },
        {
          "name": "validUntil",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "Datetime through which this Sponsor relationship was operationally valid. Empty for currently-active Sponsor records. Populated when this Sponsor record is superseded by a new one (M&A transfer, sponsor handoff). Acquiring entities in M&A often do not move all studies at once; the temporal bounds are how this gets modeled honestly."
        },
        {
          "name": "primaryTherapeuticArea",
          "type": "xsd:string",
          "optional": true,
          "doc": "The therapeutic area this Sponsor entity's role on this Study is focused on (oncology, cardiology, infectious disease, rare disease, etc.). Per-Study lens: the Sponsor entity's TA focus for this specific Study, which may be a single area even when the parent Organization's portfolio spans many. The corporate TA spread lives on Organization.primaryTherapeuticAreas. Optional because not every Study has a single dominant TA (basket trials, platform trials)."
        }
      ],
      "relationships": [
        {
          "name": "belongsToOrganization",
          "target": "Organization",
          "cardinality": "1..1",
          "doc": "The Organization (corporate / legal entity) this Sponsor entity is backed by. USDM models Sponsor as a type on Organization; TOP keeps Sponsor as an operator-grade top-level and uses this relationship to anchor it to the corporate truth. J&J Innovative Medicine (Sponsor) \u2192 belongsToOrganization \u2192 Organization{name: 'J&J Innovative Medicine', parentOrganization: J&J}."
        },
        {
          "name": "actsOnBehalfOf",
          "target": "Sponsor",
          "cardinality": "0..1",
          "doc": "Self-ref: this Sponsor entity acts as proxy for another Sponsor entity (typically a CRO operational sponsor pointing to the sponsor of record). Empty when this Sponsor is itself the principal. The IQVIA-Sponsor entity that operationally runs Pfizer's Study X has actsOnBehalfOf \u2192 Pfizer-Sponsor entity. Distinct from parentSponsor: actsOnBehalfOf is operational delegation, parentSponsor is structural lineage.",
          "provSemantics": "actedOnBehalfOf"
        },
        {
          "name": "parentSponsor",
          "target": "Sponsor",
          "cardinality": "0..1",
          "doc": "Self-ref: this Sponsor entity has a structural parent Sponsor entity. Use only when the per-Org-per-Study lineage is meaningfully different from what Organization.parentOrganization expresses. Three operational cases: (1) M&A successor lineage, where Sponsor B supersedes Sponsor A on the same Study after corporate transfer, B.parentSponsor \u2192 A captures the lineage handoff alongside validFrom/validUntil. (2) Lead/co-sponsor in co-development, where the co-sponsor entity points at the lead-sponsor entity. (3) EU CTR Article 74 legal representatives, where a non-EU principal Sponsor designates an EU Sponsor entity as their legal rep, with the EU rep's parentSponsor \u2192 principal. Distinct from belongsToOrganization (corporate identity) and actsOnBehalfOf (operational proxy).",
          "provSemantics": "wasDerivedFrom"
        },
        {
          "name": "regulatoryAuthorityScope",
          "target": "RegulatoryAuthority",
          "cardinality": "0..N",
          "doc": "Regulatory authorities this Sponsor entity is the sponsor of record under. Used for multi-jurisdictional studies where different legal entities act as sponsor of record in different jurisdictions (Pfizer Inc under FDA, Pfizer Ireland under EMA, on the same trial). Empty for single-jurisdiction studies; the SHACL 'exactly one sponsor of record per Study' constraint relaxes to per-jurisdiction.",
          "_targetMissing": "RegulatoryAuthority is a flagged-missing object in OOUX v0.2 (#60)."
        },
        {
          "name": "runs",
          "target": "Study",
          "cardinality": "1..1",
          "doc": "The Study this Sponsor entity is scoped to. Each Sponsor entity is per-Organization-per-Study. A company that sponsors many studies has many Sponsor entities, one per study, all linked through belongsToOrganization to the same Organization. The enterprise-level 'all studies Pfizer sponsors' view is served from Organization.playsSponsorRole, not from a single Sponsor entity."
        },
        {
          "name": "employs",
          "target": "Person",
          "cardinality": "0..N",
          "doc": "Employees and contractors. 0..N at the per-Study Sponsor scope: a Sponsor record may be created before staffing assignments are linked. Enterprise-level employee counts roll up via Organization."
        },
        {
          "name": "engages",
          "target": "Site",
          "cardinality": "0..N",
          "doc": "Sites the sponsor has contracted on this Study. 0..N because Sponsor records exist before site selection completes."
        },
        {
          "name": "contractsWith",
          "target": "CRO",
          "cardinality": "0..N",
          "doc": "Contracted CROs.",
          "_targetMissing": "CRO is a flagged-missing object in OOUX v0.2; needs its own catalog entry."
        },
        {
          "name": "holds",
          "target": "Contract",
          "cardinality": "0..N",
          "doc": "All sponsor-side contracts on this Study. 0..N because contracts get signed over time, not at Sponsor-record creation."
        },
        {
          "name": "authors",
          "target": "Budget",
          "cardinality": "0..N",
          "doc": "Budgets the sponsor maintains for this Study. 0..N because budgets may be authored downstream."
        },
        {
          "name": "publishesDocument",
          "target": "Document",
          "cardinality": "0..N",
          "doc": "Sponsor-controlled documents on this Study (TMF and beyond). 0..N because TMF accumulates over the Study lifecycle. Split from the polysemous 'publishes' verb in v0.1.2 so each predicate carries one target type, preserving clean projection to USDM and FHIR."
        },
        {
          "name": "publishesPublication",
          "target": "Publication",
          "cardinality": "0..N",
          "doc": "Resulting publications (peer-reviewed, conference, preprint). 0..N because most Studies have not produced publications yet at any given moment. Split from the polysemous 'publishes' verb in v0.1.2 so each predicate carries one target type, preserving clean projection to USDM and FHIR.",
          "_targetMissing": "Publication is not in OOUX v0.2 catalog; treat as Document subtype until specified."
        },
        {
          "name": "files",
          "target": "RegulatorySubmission",
          "cardinality": "0..N",
          "doc": "Submissions filed by the sponsor on this Study. 0..N because submissions accumulate; a brand-new Sponsor record has zero filings yet."
        },
        {
          "name": "commissions",
          "target": "Audit",
          "cardinality": "0..N",
          "doc": "Sponsor-commissioned audits. 0..N: small IITs and academic-sponsored studies may never commission a sponsor-level audit."
        },
        {
          "name": "operatesTrainingProgram",
          "target": "TrainingProgram",
          "cardinality": "0..N",
          "doc": "Sponsor training programs on this Study. 0..N at per-Study Sponsor scope. Split from the polysemous 'operates' verb in v0.1.2 so each predicate carries one target type, preserving clean projection to USDM and FHIR.",
          "_targetMissing": "TrainingProgram is not in OOUX v0.2 catalog; TrainingRecord (#77) covers individual completions; TrainingProgram needs its own entry."
        },
        {
          "name": "maintains",
          "target": "SOP",
          "cardinality": "0..N",
          "doc": "Standard operating procedures attached to this Study. 0..N: SOPs are typically maintained at the Organization level and inherited.",
          "_targetMissing": "SOP is not in OOUX v0.2 catalog; treat as Document subtype until specified."
        },
        {
          "name": "operatesSystem",
          "target": "System",
          "cardinality": "0..N",
          "doc": "Sponsor-owned systems on this Study (EDC, CTMS, eTMF, IRT, safety database). 0..N because system attachment happens during Study startup, not at Sponsor creation. Split from the polysemous 'operates' verb in v0.1.2 so each predicate carries one target type, preserving clean projection to USDM and FHIR."
        },
        {
          "name": "produces",
          "target": "Report",
          "cardinality": "0..N",
          "doc": "Reports authored by the sponsor on this Study. 0..N because reports accumulate."
        },
        {
          "name": "plans",
          "target": "Milestone",
          "cardinality": "0..N",
          "doc": "Program-level milestones. 0..N because milestones get planned downstream of Sponsor record creation."
        },
        {
          "name": "conducts",
          "target": "RiskAssessment",
          "cardinality": "0..N",
          "doc": "Risk assessments owned by the sponsor on this Study. 0..N because risk assessment is a workflow that produces records over time."
        },
        {
          "name": "executes",
          "target": "CAPA",
          "cardinality": "0..N",
          "doc": "Sponsor-driven CAPAs. 0..N: most Sponsor records have zero CAPAs at any given snapshot."
        },
        {
          "name": "interfacesWith",
          "target": "OversightBody",
          "cardinality": "0..N",
          "doc": "IRB, EC, DSMB, IDMC engagement. 0..N because oversight engagement gets established during startup, not at Sponsor creation."
        },
        {
          "name": "signs",
          "target": "DataTransferAgreement",
          "cardinality": "0..N",
          "doc": "Data transfer agreements. 0..N because DTAs are signed downstream of Sponsor record creation.",
          "_targetMissing": "DataTransferAgreement is a Contract subtype not separately enumerated in OOUX v0.2."
        },
        {
          "name": "supplies",
          "target": "InvestigationalProduct",
          "cardinality": "0..N",
          "doc": "IP the sponsor supplies on this Study. 0..N because IP supply chain attaches downstream, and observational studies may not involve IP at all."
        },
        {
          "name": "organizes",
          "target": "Tag",
          "cardinality": "0..N",
          "doc": "User-defined organizational tags."
        }
      ],
      "ctas": [
        {
          "action": "Create Sponsor",
          "persona": "Platform Admin",
          "note": "Register a new sponsor."
        },
        {
          "action": "Update Sponsor Details",
          "persona": "Sponsor Admin",
          "note": "Maintain sponsor profile."
        },
        {
          "action": "Activate or Deactivate Sponsor",
          "persona": "Platform Admin",
          "note": "Toggle status."
        },
        {
          "action": "Associate or Remove Study",
          "persona": "Sponsor PM",
          "note": "Link studies to the sponsor."
        },
        {
          "action": "Manage Sponsor Contacts",
          "persona": "Sponsor Admin",
          "note": "Add or update key contacts."
        },
        {
          "action": "Review Sponsor Performance",
          "persona": "Sponsor Exec",
          "note": "Run portfolio dashboards."
        },
        {
          "action": "Generate Sponsor Report",
          "persona": "Sponsor Analytics",
          "note": "Produce sponsor-level performance report."
        },
        {
          "action": "Audit Sponsor",
          "persona": "Quality",
          "note": "Trigger a sponsor-level audit."
        },
        {
          "action": "Transfer Sponsorship",
          "persona": "Sponsor PM / Legal",
          "note": "Initiate sponsor-of-record handoff (M&A, divestiture, asset transfer). Creates a new Sponsor entity with validFrom set to the transfer datetime; sets validUntil on the superseded record. Both records remain queryable for audit."
        },
        {
          "action": "Reassign Primary Contact",
          "persona": "Sponsor Admin",
          "note": "Update the Person flagged as the Sponsor's primary regulatory or medical-monitor contact for this Study. Common after personnel changes mid-trial; preserves the audit chain by recording the prior assignment."
        },
        {
          "action": "Transfer Studies Between Programs",
          "persona": "Sponsor PM",
          "note": "Move this Sponsor entity's Study from one program/portfolio bucket to another (e.g., reorg from Oncology Phase II to Oncology Phase III). Operates at the Sponsor-runs-Study scope; does not touch the Organization-level portfolio."
        },
        {
          "action": "Request Public Listing on ClinicalTrials.gov",
          "persona": "Sponsor Regulatory",
          "note": "Initiate or update the public registration entry on ClinicalTrials.gov (or EU CTIS, ANZCTR, ChiCTR, etc., per regulatoryAuthorityScope). Generates the RegulatorySubmission record and links it to this Sponsor's filings."
        }
      ],
      "provType": "prov:Agent"
    },
    {
      "id": "Study",
      "role": "trial design and definition \u2014 the central organizing entity for clinical research",
      "description": "A Study is a research project intended to evaluate the effects of an intervention (interventional), to characterize a population or natural history (observational), or to provide expanded access to an investigational product. The Study entity is the central organizing concept of the clinical-trials reference graph: every other top-level relates to Study somehow. Study is reached upstream from Sponsor (via Sponsor.runs, 1..1) and from StudySite (via StudySite.forStudy, 1..1). Study itself owns the definition-side chain (Protocol, Arms, Schedule of Assessments, Endpoints, Inclusion/Exclusion Criteria) as sub-objects. Operational facts (per-Site participation, per-Participant data, per-Visit-occurrence events) are reached through StudySite, Participant, and Visit-occurrence \u2014 not as direct edges on Study, per the direct-vs-traversed discipline established in the Site spec.",
      "ooux_editor_note": "v0.3.0 lift (2026-05-08): expanded from 4 attributes / 2 relationships / 2 thin sub-objects to 35 attributes / 16 relationships / 6 sub-objects. USDM v3 verified: USDM's Study is thin (id, name, description, label, versions, documentedBy) with the actual content in StudyVersion \u2192 StudyDesign. TOP flattens this nesting for operator UX: a single Study entity carries the design content directly via sub-objects (Protocol, Arm, ScheduleOfAssessments, Endpoint, InclusionCriterion, ExclusionCriterion). The studyVersion attribute carries the simple-version case; a StudyVersion sub-object can lift in v0.4 if richer multi-version semantics become operationally needed. Per the operational hierarchy Site \u2192 StudySite \u2192 Study \u2192 Protocol \u2192 SOA \u2192 Visit \u2192 Activity, Study is the pivot between operator-side (StudySite reaches in) and definition-side (Protocol/SOA/Visit-template reach out).",
      "crosswalks": {
        "fhir": "fhir:ResearchStudy",
        "usdm": "usdm:Study (with the StudyVersion + StudyDesign nesting collapsed; TOP carries the design content directly as sub-objects)",
        "cdash": "cdash:DM",
        "ctgov": "ClinicalTrials.gov ProtocolSection",
        "omop": "no direct OMOP equivalent (trial-side; OMOP CDM is observational/research-warehouse-shaped). Per-Participant data flowing through this Study projects to OMOP via StudySite \u2192 Participant traversal."
      },
      "attributes": [
        {
          "name": "studyId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "sponsorProtocolId",
          "type": "xsd:string",
          "doc": "Sponsor's internal protocol identifier (e.g., 'ONCO-423-001'). Distinct from registry IDs (NCT, EudraCT)."
        },
        {
          "name": "studyTitle",
          "type": "xsd:string",
          "optional": true,
          "doc": "Official long title of the study (e.g., 'A Phase 3 Randomized Double-Blind Placebo-Controlled Study of Drug X in Patients with Advanced Non-Small Cell Lung Cancer'). Optional at strawman; required when Study is registered with ClinicalTrials.gov / EU CTIS."
        },
        {
          "name": "studyShortTitle",
          "type": "xsd:string",
          "optional": true,
          "doc": "Operator-friendly short title used in dashboards and conversation."
        },
        {
          "name": "studyAcronym",
          "type": "xsd:string",
          "optional": true,
          "doc": "Single-token acronym (e.g., 'ONCO-423')."
        },
        {
          "name": "studyDescription",
          "type": "xsd:string",
          "optional": true,
          "doc": "Narrative description of the study's purpose and design."
        },
        {
          "name": "studyType",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "INTERVENTIONAL",
            "OBSERVATIONAL",
            "EXPANDED_ACCESS",
            "PATIENT_REGISTRY"
          ],
          "doc": "Study category. Optional at strawman to accommodate PLANNED-state Studies. Aligned with ClinicalTrials.gov StudyType and USDM StudyDesign.studyType."
        },
        {
          "name": "studyPhase",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "PHASE_0",
            "PHASE_1",
            "PHASE_1_2",
            "PHASE_2",
            "PHASE_2_3",
            "PHASE_3",
            "PHASE_4",
            "NOT_APPLICABLE"
          ],
          "doc": "Trial phase per ICH E8 / ClinicalTrials.gov / USDM. NOT_APPLICABLE for observational and registry studies."
        },
        {
          "name": "interventionModel",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "SINGLE_GROUP",
            "PARALLEL",
            "CROSSOVER",
            "FACTORIAL",
            "SEQUENTIAL"
          ],
          "doc": "ClinicalTrials.gov interventional model assignment."
        },
        {
          "name": "allocation",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "RANDOMIZED",
            "NON_RANDOMIZED",
            "NOT_APPLICABLE"
          ],
          "doc": "Allocation model per ClinicalTrials.gov / ICH E8."
        },
        {
          "name": "masking",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "OPEN_LABEL",
            "SINGLE_BLIND",
            "DOUBLE_BLIND",
            "TRIPLE_BLIND",
            "QUADRUPLE_BLIND"
          ],
          "doc": "Blinding/masking level. Aligned with ClinicalTrials.gov Masking and USDM."
        },
        {
          "name": "primaryPurpose",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "TREATMENT",
            "PREVENTION",
            "DIAGNOSTIC",
            "SUPPORTIVE_CARE",
            "SCREENING",
            "HEALTH_SERVICES_RESEARCH",
            "BASIC_SCIENCE",
            "DEVICE_FEASIBILITY",
            "OTHER"
          ],
          "doc": "ClinicalTrials.gov primary purpose classification."
        },
        {
          "name": "studyStatus",
          "type": "xsd:string",
          "enum": [
            "PLANNED",
            "RECRUITING",
            "ENROLLING_BY_INVITATION",
            "ACTIVE_NOT_RECRUITING",
            "COMPLETED",
            "SUSPENDED",
            "TERMINATED",
            "WITHDRAWN",
            "UNKNOWN_STATUS"
          ],
          "doc": "Lifecycle state. Aligned with ClinicalTrials.gov OverallStatus and FHIR ResearchStudy.status. Distinct from per-StudySite status (which lives on StudySite.studySiteStatus).",
          "_temporalProperty": true
        },
        {
          "name": "conditionStudied",
          "type": "xsd:string",
          "optional": true,
          "doc": "Primary condition or disease being studied (e.g., 'Advanced Non-Small Cell Lung Cancer'). Free text or SNOMED-coded; comma-separated for multiple conditions."
        },
        {
          "name": "therapeuticArea",
          "type": "xsd:string",
          "optional": true,
          "doc": "Therapeutic area classification (e.g., ONCOLOGY, CARDIOLOGY, NEUROLOGY, IMMUNOLOGY). Per-Study TA; corporate-portfolio TA spread lives on the linked Sponsor's Organization."
        },
        {
          "name": "targetEnrollment",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Target enrollment across all sites for the entire study. Aggregate; per-StudySite enrollment targets live on StudySite.enrollmentTarget."
        },
        {
          "name": "actualEnrollment",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Current actual enrollment across all sites. Aggregate; computable as SUM over StudySite.actualEnrollment but stored for view-speed."
        },
        {
          "name": "enrollmentType",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "ANTICIPATED",
            "ACTUAL"
          ],
          "doc": "Whether targetEnrollment is anticipated or actual. Aligned with ClinicalTrials.gov EnrollmentType."
        },
        {
          "name": "minAge",
          "type": "xsd:string",
          "optional": true,
          "doc": "Minimum age for participant eligibility (e.g., '18 Years', '6 Months'). String to preserve unit."
        },
        {
          "name": "maxAge",
          "type": "xsd:string",
          "optional": true,
          "doc": "Maximum age for participant eligibility."
        },
        {
          "name": "sexEligibility",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "ALL",
            "MALE",
            "FEMALE"
          ],
          "doc": "Sex eligibility per ClinicalTrials.gov."
        },
        {
          "name": "acceptsHealthyVolunteers",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "Whether the study accepts healthy volunteers."
        },
        {
          "name": "plannedStartDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Planned date of first patient first visit."
        },
        {
          "name": "actualStartDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Actual date of first patient first visit (FPI). Empty until FPI is achieved."
        },
        {
          "name": "primaryCompletionDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date of last primary outcome measure assessment per ClinicalTrials.gov. Distinct from actualCompletionDate (last visit, all outcomes)."
        },
        {
          "name": "plannedCompletionDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "actualCompletionDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date of last patient last visit (LPLV). Empty until LPLV is achieved."
        },
        {
          "name": "responsibleParty",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "SPONSOR",
            "INVESTIGATOR_SPONSOR",
            "SPONSOR_INVESTIGATOR",
            "OTHER"
          ],
          "doc": "Who is responsible for the study per ClinicalTrials.gov ResponsibleParty.type. INVESTIGATOR_SPONSOR for IITs where the PI is the sponsor of record; SPONSOR_INVESTIGATOR for industry-sponsored with sub-investigator named."
        },
        {
          "name": "studyVersion",
          "type": "xsd:string",
          "optional": true,
          "doc": "Current version identifier for the study definition (e.g., '3.2.1'). Mirrors USDM StudyVersion.versionIdentifier; richer multi-version semantics (separate StudyVersion sub-object) lifts in v0.4 if operationally needed. Amendments are tracked via the hasAmendment relationship."
        },
        {
          "name": "clinicalTrialsGovId",
          "type": "xsd:string",
          "optional": true,
          "doc": "ClinicalTrials.gov NCT identifier (e.g., 'NCT99999423'). Optional: IITs and early-phase trials may not have NCT IDs at time of Study creation; populated when ClinicalTrials.gov registration completes."
        },
        {
          "name": "eudraCT",
          "type": "xsd:string",
          "optional": true,
          "doc": "EudraCT (EU Clinical Trials Register) identifier (e.g., '2026-001234-56'). For studies submitted under the EU Clinical Trials Regulation; replaced by EU CTIS identifier for new submissions."
        },
        {
          "name": "euCtisId",
          "type": "xsd:string",
          "optional": true,
          "doc": "EU Clinical Trials Information System (CTIS) identifier; the EU CTR Article 80 register identifier replacing EudraCT for new submissions."
        },
        {
          "name": "isrctn",
          "type": "xsd:string",
          "optional": true,
          "doc": "ISRCTN registry identifier (UK)."
        },
        {
          "name": "nciId",
          "type": "xsd:string",
          "optional": true,
          "doc": "NCI Clinical Trials ID (oncology studies)."
        },
        {
          "name": "otherRegistryIds",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated additional registry identifiers (ANZCTR, ChiCTR, JPRN, etc.). Free-form for registries not enumerated above."
        },
        {
          "name": "tags",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated user-defined tags."
        }
      ],
      "relationships": [
        {
          "name": "hasProtocol",
          "target": "Protocol",
          "cardinality": "1..1",
          "doc": "The current effective Protocol for this Study. Sub-object. Protocol amendments are tracked via the hasAmendment relationship; the hasProtocol points at the current effective version."
        },
        {
          "name": "hasArm",
          "target": "Arm",
          "cardinality": "1..N",
          "doc": "Study arms (treatment groups). Sub-object. Single-arm studies have one Arm entity. Multi-arm studies (parallel, crossover, factorial) have multiple. Aligned with USDM StudyDesign.arms."
        },
        {
          "name": "hasSchedule",
          "target": "ScheduleOfAssessments",
          "cardinality": "0..N",
          "doc": "Schedule(s) of Assessments. Sub-object. 0..N because PLANNED-state Studies may not yet have an SOA; SHACL invariant enforces presence once Study is ACTIVE. 0..N also handles the case where SOA versions across protocol amendments are tracked separately. Aligned with USDM StudyDesign.scheduleTimelines."
        },
        {
          "name": "hasEndpoint",
          "target": "Endpoint",
          "cardinality": "0..N",
          "doc": "Study endpoints (primary, secondary, exploratory, safety). Sub-object. 0..N because PLANNED-state Studies may not yet have endpoints defined; SHACL invariant enforces presence once Study is ACTIVE. Aligned with USDM StudyDesign.objectives.endpoints."
        },
        {
          "name": "hasInclusionCriterion",
          "target": "InclusionCriterion",
          "cardinality": "0..N",
          "doc": "Inclusion criteria for participant eligibility. Sub-object. 0..N because PLANNED-state Studies may not yet have criteria; SHACL invariant enforces presence once Study is RECRUITING. Aligned with USDM StudyDesign.eligibilityCriteria (subset of inclusion type)."
        },
        {
          "name": "hasExclusionCriterion",
          "target": "ExclusionCriterion",
          "cardinality": "0..N",
          "doc": "Exclusion criteria for participant eligibility. Sub-object. 0..N because rare cases (some registries) may have no formal exclusion criteria. Aligned with USDM StudyDesign.eligibilityCriteria (subset of exclusion type)."
        },
        {
          "name": "hasAmendment",
          "target": "Amendment",
          "cardinality": "0..N",
          "doc": "Protocol amendments tracked over the Study lifecycle. Each Amendment captures the change history; the current effective Protocol is reached via hasProtocol.",
          "_targetMissing": "Amendment is in OOUX v0.2 catalog but not yet in TOP source."
        },
        {
          "name": "hasMilestone",
          "target": "Milestone",
          "cardinality": "0..N",
          "doc": "Study-level milestones (FPI, LPI, DBL, CSR, IND submission, etc.). Site-level milestones live on StudySite.activationDate / deactivationDate.",
          "_targetMissing": "Milestone is in OOUX v0.2 catalog but not yet in TOP source."
        },
        {
          "name": "suppliesInvestigationalProduct",
          "target": "InvestigationalProduct",
          "cardinality": "0..N",
          "doc": "IPs supplied for this Study. 0..N because observational studies may have none. Mirrors Sponsor.supplies (the per-Sponsor IP list)."
        },
        {
          "name": "hasOversightBody",
          "target": "OversightBody",
          "cardinality": "0..N",
          "doc": "Study-level oversight bodies (DSMB, IDMC). Per-Site IRB/EC of record lives on StudySite.hasIRB."
        },
        {
          "name": "hasStudyStartupPackage",
          "target": "StudyStartupPackage",
          "cardinality": "0..1",
          "doc": "The Study Startup Package containing essential documents and templates distributed to sites during initiation.",
          "_targetMissing": "StudyStartupPackage is in OOUX v0.2 catalog but not yet in TOP source."
        },
        {
          "name": "usesSystem",
          "target": "System",
          "cardinality": "0..N",
          "doc": "Per-Study Systems (the EDC, CTMS, IRT, eTMF, safety database used for this Study). Sites and Sponsors using these Systems reach them via the System's three-axis relationships (operatedBy, usedBy, oversightHeldBy)."
        },
        {
          "name": "hasStatisticalAnalysisPlan",
          "target": "Document",
          "cardinality": "0..1",
          "doc": "The Statistical Analysis Plan (SAP) document. Document.documentType=SOP or a future SAP-specific subtype."
        },
        {
          "name": "hasStudyTeam",
          "target": "Person",
          "cardinality": "0..N",
          "doc": "Study team members (Sponsor PM, Biostatistician, Medical Monitor, Pharmacovigilance Lead, etc.). Orthogonal to per-StudySite delegation (which is on StudySite.delegatesAuthorityTo). The same Person can be on multiple Studies' teams."
        },
        {
          "name": "hasTag",
          "target": "Tag",
          "cardinality": "0..N",
          "doc": "User-defined tags applied to this Study.",
          "_targetMissing": "Tag is in OOUX v0.2 catalog but not yet in TOP source."
        },
        {
          "name": "hasRiskAssessment",
          "target": "RiskAssessment",
          "cardinality": "0..N",
          "doc": "Risk assessments owned at the Study level (per ICH E8(R1) quality-by-design). Per-StudySite risk-tier is captured on StudySite.oversightTier.",
          "_targetMissing": "RiskAssessment is in OOUX v0.2 catalog but not yet in TOP source."
        }
      ],
      "ctas": [
        {
          "action": "Create Study",
          "persona": "Sponsor PM",
          "note": "Create a new Study record."
        },
        {
          "action": "Update Study Details",
          "persona": "Sponsor PM",
          "note": "Maintain Study identity and design attributes."
        },
        {
          "action": "Submit for Approval",
          "persona": "Sponsor Regulatory",
          "note": "Submit Study for IRB/regulatory approval; transitions Study from PLANNED to under-review."
        },
        {
          "action": "Activate Study",
          "persona": "Sponsor PM",
          "note": "Open the Study for enrollment; transitions to RECRUITING. SHACL invariant: requires at least one ACTIVE StudySite."
        },
        {
          "action": "Put Study on Hold",
          "persona": "Sponsor PM / Regulatory",
          "note": "Suspend enrollment temporarily (safety hold, regulatory pause); transitions to SUSPENDED. Existing enrolled participants continue per protocol."
        },
        {
          "action": "Terminate Study",
          "persona": "Sponsor PM",
          "note": "End the Study before planned completion (safety, futility, business). Transitions to TERMINATED. Distinct from COMPLETED (planned end) and WITHDRAWN (never started)."
        },
        {
          "action": "Complete Study",
          "persona": "Sponsor PM",
          "note": "Mark Study as having reached planned completion; transitions to COMPLETED after LPLV."
        },
        {
          "action": "Amend Protocol",
          "persona": "Sponsor PM / Medical Monitor",
          "note": "Initiate a protocol amendment; creates Amendment entity and updates studyVersion. Cascades to ICF re-consent if required."
        },
        {
          "action": "Register on ClinicalTrials.gov",
          "persona": "Sponsor Regulatory",
          "note": "Submit registration to ClinicalTrials.gov; populates clinicalTrialsGovId. Similar CTAs for EudraCT, EU CTIS, ISRCTN, NCI."
        },
        {
          "action": "Generate Study Report",
          "persona": "Sponsor Analytics",
          "note": "Generate Study-level reports (interim analysis, CSR, safety report)."
        }
      ],
      "sub_objects": [
        {
          "id": "Protocol",
          "role": "the canonical study-design document",
          "description": "The Protocol is the formal document defining the study's design, methodology, statistical plan, and conduct procedures. Sub-object of Study. Protocol amendments are tracked via Study.hasAmendment; this Protocol points at the current effective version.",
          "crosswalks": {
            "fhir": "fhir:PlanDefinition",
            "usdm": "usdm:StudyProtocolDocumentVersion",
            "ctgov": "ClinicalTrials.gov ProtocolDocument"
          },
          "attributes": [
            {
              "name": "protocolId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "protocolNumber",
              "type": "xsd:string",
              "optional": true,
              "doc": "Sponsor's protocol identifier (often duplicates Study.sponsorProtocolId; kept distinct because the protocol-as-document has its own identity separate from the Study-as-trial)."
            },
            {
              "name": "protocolTitle",
              "type": "xsd:string",
              "optional": true,
              "doc": "Protocol document title (often duplicates Study.studyTitle for consistency, but kept as separate field for cases where the document title differs)."
            },
            {
              "name": "protocolVersion",
              "type": "xsd:string",
              "doc": "Semver-style version (e.g., '3.0.0', '3.2.1'). Each amendment increments."
            },
            {
              "name": "protocolStatus",
              "type": "xsd:string",
              "enum": [
                "DRAFT",
                "IN_REVIEW",
                "APPROVED",
                "EFFECTIVE",
                "AMENDED",
                "SUPERSEDED",
                "RETIRED"
              ],
              "doc": "Lifecycle state. EFFECTIVE means currently in force; AMENDED means a successor version exists; SUPERSEDED means replaced; RETIRED means Study closed and Protocol archived.",
              "_temporalProperty": true
            },
            {
              "name": "approvalDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date of regulatory or IRB approval of this Protocol version."
            },
            {
              "name": "effectiveDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date this Protocol version became effective at sites."
            },
            {
              "name": "protocolDocumentRef",
              "type": "xsd:anyURI",
              "optional": true,
              "doc": "URI of the actual Protocol PDF (typically in eTMF). Distinct from the JSON-LD/RDF representation."
            },
            {
              "name": "ddfDocumentRef",
              "type": "xsd:anyURI",
              "optional": true,
              "doc": "URI of the USDM Digital Definition Format JSON document (machine-readable protocol). Aligned with USDM v3 DDF deliverable."
            },
            {
              "name": "studyDesignRationale",
              "type": "xsd:string",
              "optional": true,
              "doc": "Narrative rationale for the chosen study design. Aligned with USDM StudyDesign.rationale."
            }
          ],
          "provType": "prov:Entity"
        },
        {
          "id": "Arm",
          "role": "study arm (treatment group, comparator, or observational cohort)",
          "description": "An Arm is a group of Participants who receive a specific intervention (or no intervention) per the protocol. Sub-object of Study. Single-arm studies have one Arm; multi-arm studies (parallel, crossover, factorial) have multiple. Each Participant is assigned to exactly one Arm at randomization (or is unassigned in pre-randomization phases).",
          "crosswalks": {
            "fhir": "fhir:ResearchStudy.arm",
            "usdm": "usdm:StudyArm",
            "cdash": "cdash:DM.ARM",
            "ctgov": "ClinicalTrials.gov ArmGroup"
          },
          "attributes": [
            {
              "name": "armId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "armName",
              "type": "xsd:string",
              "doc": "Display name (e.g., 'Drug X 200mg', 'Standard of Care', 'Placebo')."
            },
            {
              "name": "armShortName",
              "type": "xsd:string",
              "optional": true,
              "doc": "Abbreviated label for charts and dashboards."
            },
            {
              "name": "armType",
              "type": "xsd:string",
              "enum": [
                "EXPERIMENTAL",
                "ACTIVE_COMPARATOR",
                "PLACEBO_COMPARATOR",
                "NO_INTERVENTION",
                "SHAM_COMPARATOR",
                "OTHER"
              ],
              "doc": "Arm type per ClinicalTrials.gov ArmType."
            },
            {
              "name": "armDescription",
              "type": "xsd:string",
              "optional": true,
              "doc": "Narrative description of what participants in this arm receive."
            },
            {
              "name": "armSize",
              "type": "xsd:integer",
              "optional": true,
              "doc": "Planned number of Participants for this arm."
            },
            {
              "name": "interventionDescription",
              "type": "xsd:string",
              "optional": true,
              "doc": "One-line summary of the intervention (e.g., 'Drug X 200mg PO QD for 12 weeks')."
            },
            {
              "name": "isPlaceboArm",
              "type": "xsd:boolean",
              "optional": true
            },
            {
              "name": "isControlArm",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "True if this arm serves as the control (placebo, active comparator, or no-intervention)."
            }
          ],
          "provType": "prov:Entity"
        },
        {
          "id": "ScheduleOfAssessments",
          "role": "the visit-by-procedure matrix that defines what happens when at each visit",
          "description": "The Schedule of Assessments (SOA) defines the visit-by-procedure matrix for the study: which procedures, assessments, samples, and data collections happen at which protocol-defined visit. Sub-object of Study. The SOA anchors the Visit-template chain: each row is a procedure or assessment; each column is a Visit-template. The cell at (procedure, visit) tells the operator whether that procedure is performed at that visit.",
          "ooux_editor_note": "v0.3.0 introduction (2026-05-08): lifted from OOUX SOA object. Sub-object of Study because SOA is a canonical study-design artifact (lifecycle bound to Study). 1..N cardinality on Study.hasSchedule for cases where SOA versions across protocol amendments are tracked separately. Visit-templates and Activity-templates are reachable via the SOA via future relationships (when Visit lifts). The OOUX has SOA as a top-level candidate; TOP keeps it as a Study sub-object because its lifecycle is bound to the Study and it's not operationally useful outside that context.",
          "crosswalks": {
            "usdm": "usdm:ScheduleTimeline",
            "ctgov": "(implicit in ProtocolSection)",
            "cdash": "cdash:VS / VISIT"
          },
          "attributes": [
            {
              "name": "soaId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "soaName",
              "type": "xsd:string",
              "doc": "Display name (e.g., 'ONCO-423 Schedule of Assessments v3.0')."
            },
            {
              "name": "soaVersion",
              "type": "xsd:string",
              "doc": "Version identifier; tracks alongside Protocol version through amendments."
            },
            {
              "name": "soaStatus",
              "type": "xsd:string",
              "enum": [
                "DRAFT",
                "APPROVED",
                "EFFECTIVE",
                "SUPERSEDED"
              ],
              "doc": "Lifecycle state. EFFECTIVE means currently in force at activated sites.",
              "_temporalProperty": true
            },
            {
              "name": "approvalDate",
              "type": "xsd:date",
              "optional": true
            },
            {
              "name": "effectiveDate",
              "type": "xsd:date",
              "optional": true
            },
            {
              "name": "soaDocumentRef",
              "type": "xsd:anyURI",
              "optional": true,
              "doc": "URI of the SOA artifact (typically a table embedded in the Protocol PDF or a separate Excel/PDF file)."
            },
            {
              "name": "description",
              "type": "xsd:string",
              "optional": true,
              "doc": "Narrative description; useful when the SOA covers complex multi-arm or crossover designs."
            }
          ],
          "provType": "prov:Entity"
        },
        {
          "id": "Endpoint",
          "role": "study endpoint (primary, secondary, exploratory, or safety)",
          "description": "An Endpoint is a measurable outcome used to evaluate the study's intervention or natural history. Sub-object of Study. Endpoints are categorized as PRIMARY (the main outcome the study is powered to detect), SECONDARY (additional pre-specified outcomes), EXPLORATORY (hypothesis-generating), or SAFETY (adverse event-driven). Each endpoint has a measurement type, a time frame, and an associated statistical approach.",
          "ooux_editor_note": "v0.3.0 introduction (2026-05-08): lifted from OOUX Endpoint object. Sub-object of Study (lifecycle bound to Study). USDM models endpoints inside StudyDesign.objectives.endpoints; TOP flattens this nesting for operator UX, with the implicit assumption that each Endpoint belongs to one Objective (which is captured via endpointType and statisticalApproach for v0.3.0; explicit Objective sub-object lifts in v0.4 if richer multi-objective semantics become operationally needed).",
          "crosswalks": {
            "fhir": "fhir:ResearchStudy.objective",
            "usdm": "usdm:Endpoint",
            "ctgov": "ClinicalTrials.gov OutcomeMeasure"
          },
          "attributes": [
            {
              "name": "endpointId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "endpointName",
              "type": "xsd:string",
              "doc": "Short name for dashboards (e.g., 'Overall Survival', 'PFS at 12 months', 'C-max')."
            },
            {
              "name": "endpointDescription",
              "type": "xsd:string",
              "doc": "Full text definition of the endpoint, including how it is measured and at what time points."
            },
            {
              "name": "endpointType",
              "type": "xsd:string",
              "enum": [
                "PRIMARY",
                "SECONDARY",
                "EXPLORATORY",
                "SAFETY"
              ],
              "doc": "Endpoint category."
            },
            {
              "name": "endpointMeasurementType",
              "type": "xsd:string",
              "optional": true,
              "enum": [
                "BINARY",
                "CONTINUOUS",
                "ORDINAL",
                "TIME_TO_EVENT",
                "COUNT",
                "RATE",
                "OTHER"
              ],
              "doc": "Statistical type of the measurement."
            },
            {
              "name": "measurementUnit",
              "type": "xsd:string",
              "optional": true,
              "doc": "Unit of measurement (e.g., 'months', 'mg/dL', '%')."
            },
            {
              "name": "timeFrame",
              "type": "xsd:string",
              "optional": true,
              "doc": "Time window over which the endpoint is assessed (e.g., 'Up to 24 weeks', 'From randomization to death from any cause')."
            },
            {
              "name": "statisticalApproach",
              "type": "xsd:string",
              "optional": true,
              "doc": "Statistical method used to analyze this endpoint (e.g., 'Cox proportional hazards model', 'Kaplan-Meier survival analysis', 'Mixed-effects model for repeated measures')."
            }
          ],
          "provType": "prov:Entity"
        },
        {
          "id": "InclusionCriterion",
          "role": "study inclusion criterion for participant eligibility",
          "description": "An InclusionCriterion is a specific characteristic that potential Participants must have to be eligible for the Study. Sub-object of Study. Eligibility is determined per-Participant during screening; failed inclusion criteria result in screen failure.",
          "ooux_editor_note": "v0.3.0 introduction (2026-05-08): lifted from OOUX Inclusion Criteria object. Sub-object of Study because criteria are study-design-bound. USDM models eligibility via EligibilityCriterion with a code distinguishing inclusion from exclusion; TOP splits into two sub-objects (InclusionCriterion + ExclusionCriterion) for operator UX clarity (operators read inclusion and exclusion as distinct lists).",
          "crosswalks": {
            "fhir": "fhir:Group.characteristic (with exclude=false)",
            "usdm": "usdm:EligibilityCriterion (with code=inclusion)",
            "ctgov": "ClinicalTrials.gov EligibilityCriteria.criteria"
          },
          "attributes": [
            {
              "name": "criterionId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "criterionNumber",
              "type": "xsd:string",
              "doc": "Display number/code (e.g., 'I1', 'I2', '1.a'). Operator-readable identifier within the protocol."
            },
            {
              "name": "criterionText",
              "type": "xsd:string",
              "doc": "Full text of the criterion as written in the Protocol."
            },
            {
              "name": "criterionCategory",
              "type": "xsd:string",
              "optional": true,
              "enum": [
                "AGE",
                "SEX",
                "DIAGNOSIS",
                "DISEASE_STAGE",
                "LAB_VALUES",
                "MEDICAL_HISTORY",
                "PRIOR_TREATMENT",
                "MEDICATIONS",
                "PERFORMANCE_STATUS",
                "GENETIC",
                "OTHER"
              ],
              "doc": "Categorization for SFQ-style filtering and feasibility analysis."
            },
            {
              "name": "waiverAllowed",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "Whether deviations from this criterion are allowed via medical monitor approval (most criteria do NOT allow waivers)."
            },
            {
              "name": "waiverConditions",
              "type": "xsd:string",
              "optional": true,
              "doc": "Conditions under which a waiver may be granted (if waiverAllowed=true)."
            }
          ],
          "provType": "prov:Entity"
        },
        {
          "id": "ExclusionCriterion",
          "role": "study exclusion criterion for participant eligibility",
          "description": "An ExclusionCriterion is a specific characteristic that disqualifies potential Participants from the Study. Sub-object of Study. A Participant who meets ANY exclusion criterion is ineligible.",
          "crosswalks": {
            "fhir": "fhir:Group.characteristic (with exclude=true)",
            "usdm": "usdm:EligibilityCriterion (with code=exclusion)",
            "ctgov": "ClinicalTrials.gov EligibilityCriteria.criteria"
          },
          "attributes": [
            {
              "name": "criterionId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "criterionNumber",
              "type": "xsd:string",
              "doc": "Display number/code (e.g., 'E1', 'E2', '2.b')."
            },
            {
              "name": "criterionText",
              "type": "xsd:string",
              "doc": "Full text of the criterion."
            },
            {
              "name": "criterionCategory",
              "type": "xsd:string",
              "optional": true,
              "enum": [
                "AGE",
                "SEX",
                "DIAGNOSIS",
                "DISEASE_STAGE",
                "LAB_VALUES",
                "MEDICAL_HISTORY",
                "PRIOR_TREATMENT",
                "MEDICATIONS",
                "PERFORMANCE_STATUS",
                "GENETIC",
                "PREGNANCY",
                "OTHER"
              ],
              "doc": "Categorization. PREGNANCY appears in exclusion category list because pregnancy/lactation is a near-universal exclusion in interventional studies but rarely an inclusion criterion."
            },
            {
              "name": "waiverAllowed",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "Whether deviations from this criterion are allowed via medical monitor approval."
            },
            {
              "name": "waiverConditions",
              "type": "xsd:string",
              "optional": true
            }
          ],
          "provType": "prov:Entity"
        },
        {
          "id": "VisitDefinition",
          "role": "the protocol-defined visit template",
          "description": "VisitDefinition captures what the protocol says happens at a given visit (template-side). It carries the visit window, expected duration, day-relative-to-anchor scheduling, and references to ActivityTemplates that should be performed. Distinct from Visit (the operational occurrence). USDM-ingest-derivable from StudyDesign.encounters[]; the operational-side Visit is created by EDC/scheduling/eVisit systems at runtime.",
          "ooux_editor_note": "v0.5.0 introduction (2026-05-09): seventh Study sub-object. Lifts as USDM-ingest target per Visit planning Decision 1 (separate VisitDefinition + Visit entities). Visit.definedBy \u2192 VisitDefinition (0..1; UNSCHEDULED visits don't have a corresponding template). Per FIRST-PRINCIPLES universal-foundation posture, VisitDefinition stays universal; therapeutic-area diversity is in content (visitName, biomedicalConceptCode references on linked ActivityTemplates), not entity shape.",
          "provType": "prov:Entity",
          "crosswalks": {
            "fhir": "fhir:PlanDefinition (or fhir:Encounter at template profile level)",
            "usdm": "usdm:Encounter (template, design-side)",
            "sdtm": "sdtm:TV (Trial Visits \u2014 design-side reference)",
            "cdash": "cdash:VISIT (template fields)"
          },
          "attributes": [
            {
              "name": "visitDefinitionId",
              "type": "ngsi-ld:URI",
              "unique": true,
              "doc": "Globally unique NGSI-LD identifier. Mints from USDM Encounter.id under the urn:top:study:{usdm_study_id}/visit-definition:{usdm_encounter_id} URI policy."
            },
            {
              "name": "visitNumber",
              "type": "xsd:string",
              "doc": "Display number/code (e.g., 'V1', 'Visit 4', 'Day 28'). Operator-readable identifier within the protocol."
            },
            {
              "name": "visitName",
              "type": "xsd:string",
              "doc": "Operator-friendly name (e.g., 'Screening Visit', 'Baseline / Day 1', 'End of Treatment')."
            },
            {
              "name": "visitDay",
              "type": "xsd:integer",
              "optional": true,
              "doc": "Days from study anchor (typically randomization or first dose). Negative for screening (Day -7), 0 for baseline, positive for follow-up. Maps to SDTM VISITDY."
            },
            {
              "name": "visitWindowMinDays",
              "type": "xsd:integer",
              "optional": true,
              "doc": "Minimum days from visitDay the visit can occur and still be in-window. Negative offset (e.g., -3 means 'up to 3 days early')."
            },
            {
              "name": "visitWindowMaxDays",
              "type": "xsd:integer",
              "optional": true,
              "doc": "Maximum days from visitDay the visit can occur and still be in-window. Positive offset (e.g., +3 means 'up to 3 days late')."
            },
            {
              "name": "expectedDurationMinutes",
              "type": "xsd:integer",
              "optional": true,
              "doc": "Expected duration of the visit in minutes (operational scheduling input)."
            },
            {
              "name": "description",
              "type": "xsd:string",
              "optional": true,
              "doc": "Narrative description. Useful when the visit's purpose isn't obvious from name + day."
            },
            {
              "name": "visitDefinitionStatus",
              "type": "xsd:string",
              "enum": [
                "DRAFT",
                "EFFECTIVE",
                "SUPERSEDED"
              ],
              "_temporalProperty": true,
              "doc": "Lifecycle of the template. EFFECTIVE means currently in force; SUPERSEDED if a protocol amendment introduced a new VisitDefinition. NGSI-LD temporal property."
            },
            {
              "name": "tags",
              "type": "xsd:string",
              "optional": true,
              "doc": "Comma-separated user-defined tags."
            }
          ],
          "relationships": [
            {
              "name": "appearsInSchedule",
              "target": "ScheduleOfAssessments",
              "cardinality": "0..N",
              "doc": "The Schedule(s) of Assessments this VisitDefinition appears in. 0..N because protocol amendments can reference the same VisitDefinition across multiple SOA versions."
            },
            {
              "name": "hasExpectedActivityTemplate",
              "target": "Activity",
              "cardinality": "0..N",
              "doc": "ActivityTemplates expected at this visit per the SOA. Flagged-missing for now: ActivityTemplate as a separate entity defers to v0.6+; v0.5 carries this as a forward reference for future lift.",
              "_targetMissing": "ActivityTemplate is a v0.6+ entity; for v0.5 the SOA grid is referenced indirectly via this relationship. Visit-occurrences carry runtime Activity sub-objects directly."
            }
          ]
        }
      ],
      "provType": "prov:Entity"
    },
    {
      "id": "Site",
      "role": "where conduct happens \u2014 the physical/operational research site, study-independent",
      "description": "A Site is the location or set of locations where trial-related activities are conducted and/or coordinated under the investigator's/institution's oversight (ICH E6(R3) Annex 1 Section 2). Site captures the operational reality and stable feasibility profile of a research site. Per-Study facts (siteNumber, enrollmentTarget, IRB approval status, oversight tier, per-Study staff delegation, per-Study Systems and Contracts) live on the StudySite horizontal, which captures Site's role on a specific Study. Site itself is study-independent: a Site exists with its staff, equipment, IRB-of-record default, qualifications, and infrastructure regardless of which Studies are active.",
      "ooux_editor_note": "v0.2.0 lift (2026-05-08): expanded from 3 attributes / 5 relationships to full operational + feasibility coverage. Site/StudySite split adopted: per-Study facts moved to StudySite horizontal; Site retains study-independent identity, contact, qualifications, feasibility, and staff capacity. Anchored to ICH E6(R3) Annex 1 Site definition. Crosswalk corrected from usdm:StudySite to usdm:Organization (with type=Code(Site)) \u2014 USDM has no operational Site entity; what USDM calls StudySite is the per-Study participation record, which TOP models as the StudySite horizontal. Investigator-Initiated Trial pattern: same Organization plays both managesSite and playsSponsorRole; same Person is hasPrincipalInvestigator on StudySite and primary contact on Sponsor; no special schema relationship required. SFQ feasibility lens lifted in this pass (~30 attributes covering therapeutic area experience, past trial experience, infrastructure, regulatory/ethics defaults, insurance, staff capacity).",
      "crosswalks": {
        "fhir": "fhir:Organization",
        "usdm": "usdm:Organization (with type=Code(Site))",
        "cdash": "cdash:DM.SITEID",
        "omop": "omop:CARE_SITE + omop:LOCATION"
      },
      "attributes": [
        {
          "name": "siteId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "siteName",
          "type": "xsd:string",
          "doc": "Display name."
        },
        {
          "name": "siteAlias",
          "type": "xsd:string",
          "optional": true,
          "doc": "Operating name when distinct from legal Site name."
        },
        {
          "name": "siteType",
          "type": "xsd:string",
          "enum": [
            "HOSPITAL",
            "CLINIC",
            "ACADEMIC_MEDICAL_CENTER",
            "RESEARCH_CENTER",
            "COMMUNITY_PRACTICE",
            "DECENTRALIZED_HUB",
            "VIRTUAL"
          ],
          "doc": "Site type taxonomy. DECENTRALIZED_HUB and VIRTUAL cover R3 Annex 2 non-traditional modalities."
        },
        {
          "name": "address",
          "type": "xsd:object",
          "optional": true,
          "doc": "Primary address. For DECENTRALIZED_HUB sites this may be 0..N when the hub serves multiple geographic locations; the strawman emits as a single object and the broker layer normalizes to multi-valued when needed."
        },
        {
          "name": "city",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "state",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "country",
          "type": "xsd:string",
          "doc": "ISO 3166-1 alpha-3 country code."
        },
        {
          "name": "postalCode",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "phone",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "email",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "website",
          "type": "xsd:anyURI",
          "optional": true
        },
        {
          "name": "gcpQualified",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "Site holds a current GCP qualification at the institution level (R3 Section 2.1). Per-Study GCP currency for individual staff lives on Person.gcpTrainingStatus."
        },
        {
          "name": "facilitiesAdequate",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "General facilities adequacy for clinical research (R3 Section 2.2). Per-Study/per-protocol facilities adequacy lives on StudySite.staffingAdequate and is protocol-dependent."
        },
        {
          "name": "therapeuticAreasExperienced",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated array of therapeutic areas the Site has experience in (oncology, cardiology, neurology, immunology, infectious disease, rare disease, etc.). Drives feasibility-questionnaire matching."
        },
        {
          "name": "indicationExperience",
          "type": "xsd:object",
          "optional": true,
          "doc": "Array of structured records: {indication, totalTrials, totalPatientsEnrolled}. Captures past indication-specific experience for SFQ matching."
        },
        {
          "name": "patientPopulationAccess",
          "type": "xsd:object",
          "optional": true,
          "doc": "Array of {populationDescription, estimatedReach, sourceType}. SFQ feasibility input."
        },
        {
          "name": "patientReferralSources",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated array of recruitment sources the Site uses (HOSPITAL_OWN, EMR_DATABASE, ADVERTISING, REFERRAL_NETWORK, REGISTRY, PATIENT_ADVOCACY, OTHER). Stored as comma-separated string for the strawman; native NGSI-LD multi-value once the broker layer is in place."
        },
        {
          "name": "totalTrialsConducted",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Lifetime count of trials conducted at this Site."
        },
        {
          "name": "trialsByPhase",
          "type": "xsd:object",
          "optional": true,
          "doc": "Array of {phase, count} for past trial experience by phase."
        },
        {
          "name": "averageEnrollmentRate",
          "type": "xsd:decimal",
          "optional": true,
          "doc": "Average patients enrolled per month across past trials. SFQ benchmark."
        },
        {
          "name": "firstPatientInToActivationDays",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Average days from contract execution to first patient enrolled."
        },
        {
          "name": "queryResponseTimeHours",
          "type": "xsd:decimal",
          "optional": true,
          "doc": "Average hours to respond to data queries; data-quality SFQ signal."
        },
        {
          "name": "sponsorRetentionRate",
          "type": "xsd:decimal",
          "optional": true,
          "doc": "Percentage of past sponsors that have run multiple trials at this Site (0.0-1.0)."
        },
        {
          "name": "freezerCapacity",
          "type": "xsd:object",
          "optional": true,
          "doc": "Array of {tempRange (e.g. '-80C', '-20C', '4C'), volume, units}. Storage feasibility for biological samples."
        },
        {
          "name": "imagingCapabilities",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated array of on-site imaging modalities (XRAY, CT, MRI, ULTRASOUND, PET, SPECT, ECHO, NUCLEAR_MEDICINE, MAMMOGRAPHY). Stored as comma-separated string for the strawman; native NGSI-LD multi-value once the broker layer is in place."
        },
        {
          "name": "labCapabilities",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated array of lab certifications/types available (CLIA, CAP, CENTRAL, POINT_OF_CARE, SPECIALTY). Stored as comma-separated string for the strawman; native NGSI-LD multi-value once the broker layer is in place."
        },
        {
          "name": "pharmacyOnSite",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "Site has a pharmacy on-site capable of IP handling."
        },
        {
          "name": "dctCapable",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "Site supports decentralized trial activities (remote visits, home health, telehealth)."
        },
        {
          "name": "econsentCapable",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "Site supports electronic informed consent."
        },
        {
          "name": "eproCapable",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "Site supports electronic patient-reported outcomes."
        },
        {
          "name": "edcVendorExperience",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated array of EDC vendors the Site has experience with (Medidata Rave, Veeva CDMS, Castor, REDCap, etc.). SFQ technology-readiness signal."
        },
        {
          "name": "irbType",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "CENTRAL",
            "LOCAL",
            "HYBRID"
          ],
          "doc": "Default IRB type the Site uses; per-Study IRB-of-record assignment lives on StudySite.hasIRB."
        },
        {
          "name": "typicalIrbApprovalDays",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Average days from IRB submission to approval. SFQ timeline signal."
        },
        {
          "name": "regulatoryAuthorityExperience",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated array of regulatory authorities the Site has filed under (FDA, EMA, PMDA, NMPA, MHRA, HSA, ANVISA, etc.)."
        },
        {
          "name": "sopsAvailable",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "Site maintains its own SOP library."
        },
        {
          "name": "sopLibrarySize",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Count of distinct SOPs in the Site's library."
        },
        {
          "name": "insuranceCarrier",
          "type": "xsd:string",
          "optional": true,
          "doc": "Name of the insurance carrier providing professional liability / clinical-trial insurance for the Site."
        },
        {
          "name": "insuranceCoverageAmount",
          "type": "xsd:decimal",
          "optional": true
        },
        {
          "name": "insuranceCurrency",
          "type": "xsd:string",
          "optional": true,
          "doc": "ISO 4217 currency code."
        },
        {
          "name": "insuranceExpiry",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "subInvestigatorCount",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Aggregate count of available sub-investigators. The actual Person roster lives on hasStaff."
        },
        {
          "name": "coordinatorCount",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Aggregate count of available study coordinators."
        },
        {
          "name": "regulatoryCoordinatorCount",
          "type": "xsd:integer",
          "optional": true
        },
        {
          "name": "studyNurseCount",
          "type": "xsd:integer",
          "optional": true
        },
        {
          "name": "labTechCount",
          "type": "xsd:integer",
          "optional": true
        },
        {
          "name": "languagesSupported",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated ISO 639-1 codes; languages staff can support for participant interactions."
        },
        {
          "name": "gcpTrainingCurrencyRate",
          "type": "xsd:decimal",
          "optional": true,
          "doc": "Percentage of staff with current GCP training (0.0-1.0). SFQ signal; per-Person training currency lives on Person."
        },
        {
          "name": "tags",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated array of user-defined tags (per OOUX Tag pattern)."
        }
      ],
      "relationships": [
        {
          "name": "belongsToOrganization",
          "target": "Organization",
          "cardinality": "1..1",
          "doc": "The legal Organization that owns or operates this Site (e.g., MSKCC's Organization for the MSKCC main-campus Site). USDM Organization.managedSites is the inverse."
        },
        {
          "name": "partOfSiteNetwork",
          "target": "Organization",
          "cardinality": "0..1",
          "doc": "An Organization with organizationType=SITE_NETWORK or SMO that this Site is part of. Elevate Research is an Organization; each of its locations is a Site with partOfSiteNetwork pointing to Elevate Research."
        },
        {
          "name": "parentSite",
          "target": "Site",
          "cardinality": "0..1",
          "doc": "Self-reference for satellite-of-main-site structure. A satellite clinic Site references the main hospital Site as its parent. Use when the relationship is operationally a parent-child pair, not just network membership."
        },
        {
          "name": "hasStaff",
          "target": "Person",
          "cardinality": "0..N",
          "doc": "Persons employed/affiliated at this Site, study-independent. The roster of people who CAN be delegated to per-Study; actual delegation per-Study lives on StudySite.delegatesAuthorityTo."
        },
        {
          "name": "headOfClinicalResearch",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "Administrative/institutional contact for the Site's clinical-research operations. NOT the per-Study Principal Investigator (which lives on StudySite.hasPrincipalInvestigator)."
        },
        {
          "name": "hostsEquipment",
          "target": "Equipment",
          "cardinality": "0..N",
          "doc": "Site-bound equipment. Equipment.equipmentBinding=SITE_BOUND points back here."
        },
        {
          "name": "hasStorageLocation",
          "target": "StorageLocation",
          "cardinality": "0..N",
          "doc": "Site-bound storage locations (freezer slots, refrigerator shelves, secure cabinet drawers, ambient pharmacy shelves, offsite vaults). The Equipment/StorageLocation split: a freezer is Equipment that provides multiple StorageLocations."
        },
        {
          "name": "hasInstitutionalDocument",
          "target": "Document",
          "cardinality": "0..N",
          "doc": "Site-level essential records that are study-independent: institutional licenses, CLIA certifications, lab accreditations, GCP training records (Site-level), institutional SOPs. Per-Study essential records live on StudySite.hasEssentialRecord."
        },
        {
          "name": "hasInstitutionalCredential",
          "target": "Credential",
          "cardinality": "0..N",
          "doc": "Site-level credentials (CLIA, JCAHO, ISO 9001, lab accreditations, etc.)."
        },
        {
          "name": "usesSystem",
          "target": "System",
          "cardinality": "0..N",
          "doc": "Site-operational Systems (the Site's EMR, the Site's source-document repository, the Site's local pharmacy management system) that exist regardless of any specific Study. Per-Study System usage (Sponsor-provisioned EDC, per-Study IRT, etc.) lives on StudySite.usesSystem."
        }
      ],
      "ctas": [
        {
          "action": "Create Site",
          "persona": "Platform Admin",
          "note": "Register a new Site in the system."
        },
        {
          "action": "Update Site Details",
          "persona": "Site Admin",
          "note": "Maintain Site identity, contact info, and feasibility profile."
        },
        {
          "action": "Activate or Deactivate Site",
          "persona": "Platform Admin",
          "note": "Toggle Site operational status (e.g., when a Site closes its research program). Per-Study activation/deactivation lives on StudySite."
        },
        {
          "action": "Initiate Site for Study",
          "persona": "Sponsor PM",
          "note": "Begin Site Initiation for a specific Study; creates a StudySite record."
        },
        {
          "action": "Monitor Site",
          "persona": "Sponsor CRA",
          "note": "Schedule or conduct a monitoring visit at the Site for a specific StudySite."
        },
        {
          "action": "Close Site",
          "persona": "Site Admin",
          "note": "Close out the Site's clinical-research program; cascades to closing all StudySite records."
        },
        {
          "action": "Update Feasibility Profile",
          "persona": "Site Admin",
          "note": "Update the Site's SFQ-derived feasibility attributes (therapeutic areas, infrastructure, staff capacity). Triggers a versioned feasibility snapshot for sponsor SFQ matching."
        }
      ],
      "provType": "prov:Agent"
    },
    {
      "id": "Participant",
      "role": "the human subject in the trial-conduct realm",
      "description": "A Participant is a real human enrolled in a Study at a StudySite. Per FIRST-PRINCIPLES (operator-grounded foundation, ephemeral projections), Participant is the trial-conduct-realm role-entity for the underlying human; the same human is a Patient in their care realm, a Claimant in their claims realm, an RWE-Patient in research-warehouse projections \u2014 those are projection targets, not TOP entities. The operational hierarchy: Site -> StudySite -> Study -> Protocol -> SOA -> Visit -> Activity, with Participant anchored at StudySite (1..1; multi-Study participation is modeled as separate Participant entities). Lifecycle events (Consent, Screening, Enrollment, Withdrawal) are sub-objects under Participant \u2014 the SDTM DS-record pattern; operators see workflow events, the projection adapters emit DS rows. participantStatus is a NGSI-LD temporal property (validFrom/validUntil) so trajectory is queryable for downstream digital-twin synthesis (key enabler for twin-for-enrollment in v0.5+).",
      "ooux_editor_note": "v0.4.0 introduction (2026-05-09): lifted from OOUX Participant object with the Site->StudySite anchoring correction (OOUX has Participant->1 Site; should be Participant->1 StudySite). Participant lifecycle starts at SCREENING (post-consent); pre-consent Recruit lifts as a separate top-level (per planning-note Decision 9). Demographics are identification-status-agnostic (per planning-note Decision 2): same fields exist; deployment populates real values for operator-facing systems and Datavant/de-identified values for research-facing systems. participantStatus carries 11 operationally-distinct states with documented FHIR ResearchSubjectStatus + SDTM DSDECOD projection mapping (cross-walks below the line, per FIRST-PRINCIPLES). Sub-objects: InformedConsent (re-consent supported via 0..N), ScreeningRecord (re-screening supported), EnrollmentRecord (1 typically, multi if re-enrolled), WithdrawalRecord (1 per withdrawal event). USDM v4 has no per-subject runtime entity; cross-walk targets for Participant runtime are FHIR R5 ResearchSubject, SDTM DM/DS/IE, CDASH DM. Participant is operational-side of the USDM/M11 ingest boundary: created at runtime by EDC/eConsent/IRT/CTMS, NOT by USDM ingest. Twin-queryability discipline (planning-note Decision 10): every participantStatus transition produces a queryable record \u2014 sub-objects for canonical events plus temporal-property semantics for mid-trial states. PMDT (Patient Medical Digital Twin, El Gammal et al.) is prior art for ontology-driven twin foundation; TOP carries the contract, downstream synthesizers fulfill it.",
      "crosswalks": {
        "fhir": "fhir:ResearchSubject",
        "sdtm": "sdtm:DM (Demographics) + sdtm:DS (Disposition) + sdtm:IE (Inclusion/Exclusion Exceptions)",
        "cdash": "cdash:DM",
        "usdm": "usdm:N/A (no per-subject runtime entity; design-side connections via Study/Arm/EligibilityCriterion)",
        "omop": "omop:PERSON (RWE-realm projection)"
      },
      "attributes": [
        {
          "name": "participantId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier. Operators type the parts (screeningNumber + randomizationNumber); USUBJID = STUDYID-SITEID-SUBJID concatenation is a SDTM-projection-time derivation, not a TOP attribute."
        },
        {
          "name": "screeningNumber",
          "type": "xsd:string",
          "doc": "Site-assigned screening identifier (operator-facing). Maps to SDTM SUBJID. CDASH SUBJID. Operator types this when registering a new Participant after consent.",
          "mapsTo": {
            "sdtm": "DM.SUBJID",
            "cdash": "DM.SUBJID",
            "fhir": "ResearchSubject.identifier (use=secondary)"
          }
        },
        {
          "name": "randomizationNumber",
          "type": "xsd:string",
          "optional": true,
          "doc": "Sponsor-assigned identifier issued at randomization. Often used for IP kit assignment. Empty until randomization. SDTM has no canonical column; carried in SUPPDM or kit-level records.",
          "mapsTo": {
            "sdtm": "(SUPPDM or kit-level qualifier)",
            "fhir": "ResearchSubject.identifier (use=secondary)"
          }
        },
        {
          "name": "randomizationDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date of randomization. Empty until randomization. Required when participantStatus=RANDOMIZED (SHACL hard violation)."
        },
        {
          "name": "firstName",
          "type": "xsd:string",
          "optional": true,
          "doc": "Operator-grounded; populated with real value for site-coordinator UX or empty/de-identified for research-warehouse projections per deployment-side identification policy."
        },
        {
          "name": "middleName",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "lastName",
          "type": "xsd:string",
          "optional": true,
          "doc": "Operator-grounded; same de-identification posture as firstName."
        },
        {
          "name": "dateOfBirth",
          "type": "xsd:date",
          "optional": true,
          "doc": "Real DOB, or year-only approximation, or shifted date depending on deployment. Maps to SDTM BRTHDTC (ISO 8601). FHIR Patient.birthDate.",
          "mapsTo": {
            "sdtm": "DM.BRTHDTC",
            "fhir": "Patient.birthDate (linked via ResearchSubject.subject)",
            "cdash": "DM.BRTHDAT"
          }
        },
        {
          "name": "sex",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "MALE",
            "FEMALE",
            "INTERSEX",
            "UNKNOWN",
            "NOT_REPORTED"
          ],
          "doc": "Biological sex per ICH E5 / FDA guidance. Operator-meaningful enum; SDTM projection emits the terser M/F/U/UNDIFFERENTIATED codes (INTERSEX -> UNDIFFERENTIATED per CDISC controlled term). Gender identity is a separate concern when needed.",
          "mapsTo": {
            "sdtm": "DM.SEX",
            "fhir": "Patient.gender",
            "cdash": "DM.SEX"
          }
        },
        {
          "name": "race",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated for multiracial. Maps to SDTM RACE (CDISC controlled term); SDTM uses MULTIPLE + SUPPDM RACEMUL for multiracial.",
          "mapsTo": {
            "sdtm": "DM.RACE",
            "fhir": "Patient.extension[us-core-race]",
            "cdash": "DM.RACE"
          }
        },
        {
          "name": "ethnicity",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "HISPANIC_OR_LATINO",
            "NOT_HISPANIC_OR_LATINO",
            "NOT_REPORTED",
            "UNKNOWN"
          ],
          "doc": "CDISC controlled term.",
          "mapsTo": {
            "sdtm": "DM.ETHNIC",
            "fhir": "Patient.extension[us-core-ethnicity]",
            "cdash": "DM.ETHNIC"
          }
        },
        {
          "name": "primaryLanguage",
          "type": "xsd:string",
          "optional": true,
          "doc": "ISO 639-1 code (en, es, fr, zh, etc.). Operator-grounded for site-coordinator UX (preferred language for visit interactions). Not in SDTM DM core.",
          "mapsTo": {
            "fhir": "Patient.communication.language"
          }
        },
        {
          "name": "country",
          "type": "xsd:string",
          "optional": true,
          "doc": "ISO 3166-1 alpha-3 country code. For multi-region trials.",
          "mapsTo": {
            "sdtm": "DM.COUNTRY",
            "fhir": "Patient.address.country",
            "cdash": "DM.COUNTRY"
          }
        },
        {
          "name": "participantStatus",
          "type": "xsd:string",
          "enum": [
            "SCREENING",
            "SCREEN_FAILED",
            "CONSENTED",
            "ENROLLED",
            "RANDOMIZED",
            "ON_TREATMENT",
            "IN_FOLLOW_UP",
            "COMPLETED",
            "WITHDRAWN",
            "DISCONTINUED",
            "LOST_TO_FOLLOW_UP"
          ],
          "doc": "Operationally-distinct lifecycle states (11). Operator-meaningful; standards projections live below the line. NGSI-LD temporal property (validFrom/validUntil bracketing each value) so trajectory is queryable downstream (Decision 10 twin-queryability discipline).",
          "mapsTo": {
            "fhir": "ResearchSubject.status (many-to-one collapse to: screening / ineligible / pending-on-study / on-study / on-study-intervention / follow-up / off-study / withdrawn)",
            "sdtm": "DS.DSDECOD per state-change event (in DS records, not as a Participant column)"
          },
          "_temporalProperty": true
        },
        {
          "name": "enrollmentDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date of enrollment (single canonical Sponsor-assigned moment). Distinct from randomizationDate (later) and consent date (on InformedConsent sub-object). Maps to SDTM RFSTDTC.",
          "mapsTo": {
            "sdtm": "DM.RFSTDTC (or close)",
            "fhir": "ResearchSubject.period.start"
          }
        },
        {
          "name": "completionDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date the Participant completed protocol participation (LPLV-equivalent for this Participant). SOFT SHACL: should be populated when participantStatus=COMPLETED.",
          "mapsTo": {
            "sdtm": "DM.RFENDTC (or close)",
            "fhir": "ResearchSubject.period.end"
          }
        },
        {
          "name": "withdrawalDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Most recent withdrawal event date (canonical query convenience; full history lives on WithdrawalRecord sub-objects)."
        },
        {
          "name": "tags",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated user-defined tags (per OOUX Tag pattern)."
        },
        {
          "name": "validFrom",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD-native temporal property: datetime from which this Participant record is operationally valid. Pattern parallels Sponsor and StudySite."
        },
        {
          "name": "validUntil",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD-native temporal property: datetime through which this Participant record was operationally valid. Empty for currently-active Participants."
        }
      ],
      "relationships": [
        {
          "name": "forStudySite",
          "target": "StudySite",
          "cardinality": "1..1",
          "doc": "The StudySite where this Participant is enrolled. Per the operational hierarchy correction (Site -> StudySite -> Study), Participant anchors at StudySite, not Site directly. The OOUX Participant->1 Site direct edge is a correction surfaced during the Site spec lift; tracked."
        },
        {
          "name": "forStudy",
          "target": "Study",
          "cardinality": "1..1",
          "doc": "The Study this Participant is enrolled in. Reachable via forStudySite.forStudy traversal but kept as a direct edge for query convenience and SHACL invariant simplicity (Participant.assignedToArm.forStudy == Participant.forStudy)."
        },
        {
          "name": "assignedToArm",
          "target": "Arm",
          "cardinality": "0..1",
          "doc": "The Study Arm the Participant is assigned to. 0 in pre-randomization phases; 1..1 once randomized. Hard SHACL: when participantStatus=RANDOMIZED, assignedToArm must be populated AND the Arm must belong to the same Study as Participant.forStudy (cross-entity consistency)."
        },
        {
          "name": "hasInformedConsent",
          "target": "InformedConsent",
          "cardinality": "0..N",
          "doc": "Informed consent event records. 0..N to support re-consent (after protocol amendment, ICF version change, lapse-and-re-establish). Each InformedConsent sub-object is one consent event with its own date, consenter, witness, document reference, lifecycle status."
        },
        {
          "name": "hasScreeningRecord",
          "target": "ScreeningRecord",
          "cardinality": "0..N",
          "doc": "Screening event records. 0..N to support re-screening attempts. Hard SHACL: when participantStatus=SCREEN_FAILED, at least one ScreeningRecord with screeningOutcome=SCREEN_FAILED must exist."
        },
        {
          "name": "hasEnrollmentRecord",
          "target": "EnrollmentRecord",
          "cardinality": "0..N",
          "doc": "Enrollment event records. Typically 1 per Participant; multi-enrollment supported for re-enrollment scenarios."
        },
        {
          "name": "hasWithdrawalRecord",
          "target": "WithdrawalRecord",
          "cardinality": "0..N",
          "doc": "Withdrawal event records. Hard SHACL: when participantStatus=WITHDRAWN, at least one WithdrawalRecord must exist with withdrawalCategory=CONSENT_WITHDRAWN."
        },
        {
          "name": "convertedFromRecruit",
          "target": "Recruit",
          "cardinality": "0..1",
          "doc": "The Recruit entity that converted to this Participant when consent was obtained. Empty when Participant was registered without going through a tracked recruitment funnel (direct site walk-in). The InformedConsent sub-object's existence IS the conversion event; this relationship is the operational-funnel-side trace.",
          "provSemantics": "wasDerivedFrom"
        },
        {
          "name": "hasVisit",
          "target": "Visit",
          "cardinality": "0..N",
          "doc": "Visit-occurrences for this Participant. Inverse of Visit.atParticipant (when Visit lifts).",
          "_targetMissing": "Visit is a top-level in OOUX (one of the locked 8) but not yet in TOP source; lifts post-Participant per planning sequencing."
        },
        {
          "name": "hasAdverseEvent",
          "target": "Event",
          "cardinality": "0..N",
          "doc": "Adverse-event records linked to this Participant. The relationship is named for AE/SAE category Events (the operator vocabulary); the broader Event entity also covers Deviations, Discrepancies, Safety Signals, etc., reachable via Event.forParticipant inverse."
        },
        {
          "name": "hasTag",
          "target": "Tag",
          "cardinality": "0..N",
          "doc": "User-defined tags applied to this Participant.",
          "_targetMissing": "Tag is in OOUX v0.2 catalog but not yet in TOP source."
        }
      ],
      "ctas": [
        {
          "action": "Register Participant",
          "persona": "Site Coordinator",
          "note": "Create a new Participant record after consent is obtained. Triggered by InformedConsent sub-object creation."
        },
        {
          "action": "Screen Participant",
          "persona": "Site Coordinator / PI",
          "note": "Conduct eligibility screening; creates ScreeningRecord. Outcomes route the Participant to ENROLLED or SCREEN_FAILED states."
        },
        {
          "action": "Enroll Participant",
          "persona": "Site Coordinator",
          "note": "Create EnrollmentRecord; transitions participantStatus to ENROLLED. Eligibility is confirmed by the PI per ICH E6(R3) Section 2.4."
        },
        {
          "action": "Randomize Participant",
          "persona": "Site Coordinator (via IRT)",
          "note": "Assign Participant to an Arm via the Sponsor-provisioned IRT system; transitions to RANDOMIZED; populates assignedToArm + randomizationDate + randomizationNumber."
        },
        {
          "action": "Begin Treatment",
          "persona": "Site Coordinator / PI",
          "note": "First IP administration; transitions participantStatus to ON_TREATMENT."
        },
        {
          "action": "Move to Follow-Up",
          "persona": "Site Coordinator",
          "note": "Treatment phase complete; transitions to IN_FOLLOW_UP."
        },
        {
          "action": "Complete Participation",
          "persona": "Site Coordinator / PI",
          "note": "Last visit completed per protocol; transitions to COMPLETED; populates completionDate."
        },
        {
          "action": "Withdraw Participant",
          "persona": "Site Coordinator / PI / Participant-initiated",
          "note": "Subject-initiated withdrawal; creates WithdrawalRecord with withdrawalCategory=CONSENT_WITHDRAWN; transitions to WITHDRAWN. Distinct from Discontinue (investigator-initiated)."
        },
        {
          "action": "Discontinue Participant",
          "persona": "PI / Medical Monitor",
          "note": "Investigator-initiated discontinuation (safety, non-compliance); creates WithdrawalRecord with appropriate withdrawalCategory; transitions to DISCONTINUED."
        },
        {
          "action": "Mark Lost to Follow-Up",
          "persona": "Site Coordinator",
          "note": "Unable to contact for required follow-up procedures despite documented attempts; transitions to LOST_TO_FOLLOW_UP."
        },
        {
          "action": "Re-Screen Participant",
          "persona": "Site Coordinator / PI",
          "note": "After a screen failure, conduct a new screening attempt (per protocol re-screening rules); creates a new ScreeningRecord."
        },
        {
          "action": "Re-Consent Participant",
          "persona": "Site Coordinator",
          "note": "After a protocol amendment requiring re-consent or an ICF version update, obtain new consent; creates a new InformedConsent sub-object with reconsentRequired=true."
        }
      ],
      "sub_objects": [
        {
          "id": "InformedConsent",
          "role": "an informed-consent event under GCP",
          "description": "An InformedConsent sub-object captures one consent event for a Participant: the moment the participant (or LAR) signed an ICF acknowledging the study's purpose, procedures, risks, and benefits. ICH E6(R3) Section 2.4 GCP-required. Re-consent (after amendment, ICF version change, or lapse) creates additional InformedConsent records under the same Participant \u2014 full event history. Maps to FHIR Consent resource (one per record) and SDTM DS records with DSDECOD=INFORMED CONSENT OBTAINED / WITHDRAWAL OF CONSENT.",
          "crosswalks": {
            "fhir": "fhir:Consent",
            "sdtm": "sdtm:DS (DSDECOD=INFORMED CONSENT OBTAINED, WITHDRAWAL OF CONSENT)",
            "usdm": "usdm:N/A (runtime, not design-time)"
          },
          "attributes": [
            {
              "name": "consentId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "consentVersion",
              "type": "xsd:string",
              "doc": "ICF document version (e.g., 'v3.2'). Tracks which Protocol/ICF revision the consent was given against."
            },
            {
              "name": "consentDate",
              "type": "xsd:date",
              "doc": "Date consent was obtained. Maps to SDTM DSSTDTC for the corresponding DS record."
            },
            {
              "name": "consentTime",
              "type": "xsd:time",
              "optional": true,
              "doc": "Time of day consent was obtained, if recorded (eConsent typically captures this; paper consent often does not)."
            },
            {
              "name": "consentMethod",
              "type": "xsd:string",
              "enum": [
                "PAPER",
                "ELECTRONIC",
                "ELECTRONIC_REMOTE"
              ],
              "doc": "Method of consent capture. ELECTRONIC_REMOTE supports DCT/decentralized-trial workflows (telehealth consent)."
            },
            {
              "name": "consenterRelationship",
              "type": "xsd:string",
              "enum": [
                "SELF",
                "LEGALLY_AUTHORIZED_REPRESENTATIVE",
                "PARENT_GUARDIAN",
                "OTHER"
              ],
              "doc": "Who is consenting on the Participant's behalf. SELF for adult competent participants; LAR for incapacitated adults; PARENT_GUARDIAN for pediatric."
            },
            {
              "name": "language",
              "type": "xsd:string",
              "optional": true,
              "doc": "ISO 639-1 code of the language the ICF was presented in. Maps to FHIR Consent.language."
            },
            {
              "name": "translatorUsed",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "Whether a translator/interpreter was used. FHIR represents this as Consent.actor with role=interpreter."
            },
            {
              "name": "consentStatus",
              "type": "xsd:string",
              "enum": [
                "OBTAINED",
                "WITHDRAWN",
                "EXPIRED",
                "RECONSENTED"
              ],
              "doc": "Lifecycle of this specific consent record. OBTAINED on creation; WITHDRAWN if subject withdraws; EXPIRED if ICF expires; RECONSENTED if a new InformedConsent supersedes this one (the new record points back via reconsentReason).",
              "_temporalProperty": true
            },
            {
              "name": "reconsentRequired",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "True if this consent record was created because a reconsent was required (e.g., after a protocol amendment changed risk profile)."
            },
            {
              "name": "reconsentReason",
              "type": "xsd:string",
              "optional": true,
              "doc": "Reason for reconsent (e.g., 'Protocol Amendment v3.2 added a new procedure'). Free text or coded."
            },
            {
              "name": "withdrawalDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date this specific consent was withdrawn (if applicable). Distinct from Participant.withdrawalDate (which is the most-recent across all WithdrawalRecords)."
            }
          ],
          "relationships": [
            {
              "name": "consentingPerson",
              "target": "Person",
              "cardinality": "0..1",
              "doc": "The Person who consented (often the Participant themselves; or the LAR / parent / guardian). 0..1 because the Participant entity itself is the most common case and TOP doesn't always model the human-as-Person entity.",
              "provSemantics": "wasAttributedTo"
            },
            {
              "name": "personObtainingConsent",
              "target": "Person",
              "cardinality": "1..1",
              "doc": "The site staff member (Person, drawn from forStudySite.delegatesAuthorityTo) who obtained the consent. ICH E6(R3) Section 2.4 GCP-required attribution.",
              "provSemantics": "wasAssociatedWith"
            },
            {
              "name": "consentWitness",
              "target": "Person",
              "cardinality": "0..1",
              "doc": "Witness to the consent process, where required by jurisdictional regulation or sponsor SOP.",
              "provSemantics": "wasAssociatedWith"
            },
            {
              "name": "consentDocument",
              "target": "Document",
              "cardinality": "0..1",
              "doc": "The signed ICF document in the eTMF/ISF.",
              "_targetMissing": "Document is a horizontal in TOP source; relationship valid."
            }
          ],
          "provType": "prov:Activity"
        },
        {
          "id": "ScreeningRecord",
          "role": "an eligibility-screening event",
          "description": "A ScreeningRecord captures one screening attempt for a Participant against the Study's inclusion/exclusion criteria. ICH E6(R3) Section 2.5 GCP-anchored. Re-screening (after a screen failure, per protocol re-screening rules) creates additional ScreeningRecords. Maps to FHIR ResearchSubject.progress entries with subjectState=screening / off-study and SDTM DS records with DSDECOD=SCREEN FAILURE (when failed) plus SDTM IE records (Inclusion/Exclusion Not Met) for failed criteria.",
          "crosswalks": {
            "fhir": "fhir:ResearchSubject.progress (subjectState=screening / off-study)",
            "sdtm": "sdtm:DS (DSDECOD=SCREEN FAILURE) + sdtm:IE (failed criteria)",
            "usdm": "usdm:N/A (runtime)"
          },
          "attributes": [
            {
              "name": "screeningRecordId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "screeningStartDate",
              "type": "xsd:date",
              "doc": "Date screening began (often consent date or shortly after)."
            },
            {
              "name": "screeningEndDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date screening concluded (with outcome). Empty for in-progress screening."
            },
            {
              "name": "screeningOutcome",
              "type": "xsd:string",
              "enum": [
                "IN_PROGRESS",
                "ENROLLED",
                "SCREEN_FAILED",
                "RE_SCREENING_PENDING",
                "WITHDREW_BEFORE_DECISION"
              ],
              "doc": "Final outcome of this screening attempt. IN_PROGRESS while open; one of the terminal states once concluded.",
              "_temporalProperty": true
            },
            {
              "name": "screenFailReason",
              "type": "xsd:string",
              "optional": true,
              "doc": "Verbatim reason for screen failure (free text or coded). Maps to SDTM DSTERM (verbatim) and DSDECOD."
            },
            {
              "name": "failedInclusionCriteria",
              "type": "xsd:string",
              "optional": true,
              "doc": "Comma-separated list of inclusion criterion numbers (e.g., 'I1, I3') the Participant failed. SDTM IE domain is the canonical projection (one IE record per failed criterion)."
            },
            {
              "name": "failedExclusionCriteria",
              "type": "xsd:string",
              "optional": true,
              "doc": "Comma-separated list of exclusion criterion numbers (e.g., 'E2, E5') the Participant met. SDTM IE domain is the canonical projection."
            },
            {
              "name": "reScreeningEligibility",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "Whether the Participant is eligible to be re-screened (per protocol re-screening rules; some screen failures are permanent disqualifications)."
            }
          ],
          "relationships": [
            {
              "name": "screenedBy",
              "target": "Person",
              "cardinality": "0..1",
              "doc": "The site staff member (PI or sub-investigator, drawn from forStudySite.delegatesAuthorityTo) who conducted/signed-off-on the screening.",
              "provSemantics": "wasAssociatedWith"
            }
          ],
          "provType": "prov:Activity"
        },
        {
          "id": "EnrollmentRecord",
          "role": "an enrollment event",
          "description": "An EnrollmentRecord captures the moment a Participant was enrolled into the Study (eligibility confirmed; assigned to the trial). Distinct from RANDOMIZED (which may follow). Typically 1 per Participant; multi-enrollment supported for re-enrollment scenarios where a previously withdrawn Participant rejoins (rare; some long-running registries). Maps to FHIR ResearchSubject.progress (milestone=Enrolled) and SDTM DS DSDECOD=ENROLLED.",
          "crosswalks": {
            "fhir": "fhir:ResearchSubject.progress (milestone=Enrolled)",
            "sdtm": "sdtm:DS (DSDECOD=ENROLLED)",
            "usdm": "usdm:N/A (runtime)"
          },
          "attributes": [
            {
              "name": "enrollmentRecordId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "enrollmentDate",
              "type": "xsd:date",
              "doc": "Date of enrollment. Maps to SDTM RFSTDTC and DS DSSTDTC for DSDECOD=ENROLLED."
            },
            {
              "name": "enrollmentMethod",
              "type": "xsd:string",
              "optional": true,
              "enum": [
                "ON_SITE",
                "REMOTE",
                "HYBRID"
              ],
              "doc": "Method of enrollment. ON_SITE is traditional; REMOTE supports DCT (decentralized trial) workflows; HYBRID for partial-DCT designs."
            },
            {
              "name": "enrollmentNumber",
              "type": "xsd:string",
              "optional": true,
              "doc": "Sponsor-assigned enrollment number (often sequential, distinct from screeningNumber and randomizationNumber)."
            },
            {
              "name": "protocolVersionAtEnrollment",
              "type": "xsd:string",
              "optional": true,
              "doc": "Protocol version in force at time of enrollment. References the USDM StudyVersion identifier in force; useful for audit when amendments cascade."
            }
          ],
          "relationships": [
            {
              "name": "eligibilityConfirmedBy",
              "target": "Person",
              "cardinality": "1..1",
              "doc": "The Principal Investigator (Person, drawn from forStudySite.hasPrincipalInvestigator typically) who confirmed eligibility per ICH E6(R3) Section 2.4 GCP-required attribution.",
              "provSemantics": "wasAssociatedWith"
            }
          ],
          "provType": "prov:Activity"
        },
        {
          "id": "WithdrawalRecord",
          "role": "a withdrawal/discontinuation event",
          "description": "A WithdrawalRecord captures the moment a Participant left the Study (subject-initiated withdrawal of consent, investigator-initiated discontinuation, lost-to-follow-up, etc.). Each event is a separate record so the full lifecycle is auditable. Maps to FHIR ResearchSubject.progress (milestone=Withdrawn) and SDTM DS records with DSDECOD per CDISC controlled term.",
          "crosswalks": {
            "fhir": "fhir:ResearchSubject.progress (milestone=Withdrawn) + ResearchSubject.period.end",
            "sdtm": "sdtm:DS (DSDECOD per controlled term: WITHDRAWAL OF CONSENT / DISCONTINUED / LOST TO FOLLOW-UP / etc.)",
            "usdm": "usdm:N/A (runtime)"
          },
          "attributes": [
            {
              "name": "withdrawalRecordId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "withdrawalDate",
              "type": "xsd:date",
              "doc": "Date of withdrawal/discontinuation. Maps to SDTM DSSTDTC."
            },
            {
              "name": "withdrawalCategory",
              "type": "xsd:string",
              "enum": [
                "CONSENT_WITHDRAWN",
                "INVESTIGATOR_DECISION",
                "ADVERSE_EVENT",
                "LOST_TO_FOLLOW_UP",
                "PROTOCOL_DEVIATION",
                "NON_COMPLIANCE",
                "DEATH",
                "OTHER"
              ],
              "doc": "Category of the withdrawal event. Maps to SDTM DSDECOD: CONSENT_WITHDRAWN -> WITHDRAWAL OF CONSENT; INVESTIGATOR_DECISION -> DISCONTINUED; etc."
            },
            {
              "name": "withdrawalReason",
              "type": "xsd:string",
              "optional": true,
              "doc": "Verbatim reason for withdrawal (free text or coded). Maps to SDTM DSTERM."
            },
            {
              "name": "continueDataCollection",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "True if the Participant withdrew from active treatment but data collection (follow-up visits) continues per protocol. FHIR represents as continued ResearchSubject without period.end despite withdrawn status."
            },
            {
              "name": "withdrawnFromAllProcedures",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "True if the Participant withdrew consent for all study procedures including data use (full withdrawal). When true, deployment-side data-handling policies apply (data deletion, retention exception, etc.)."
            },
            {
              "name": "notes",
              "type": "xsd:string",
              "optional": true,
              "doc": "Free-text notes (often used by site coordinators for context that doesn't fit the controlled fields)."
            }
          ],
          "relationships": [
            {
              "name": "documentedBy",
              "target": "Person",
              "cardinality": "0..1",
              "doc": "The site staff member (Person) who documented the withdrawal event. Required by GCP audit; relationship optional in TOP source because some legacy data may lack the attribution.",
              "provSemantics": "wasAssociatedWith"
            }
          ],
          "provType": "prov:Activity"
        }
      ],
      "provType": "prov:Entity"
    },
    {
      "id": "Recruit",
      "role": "the human in the recruitment-realm, pre-consent",
      "description": "A Recruit is a person who has responded to or been identified by a recruitment funnel for a Study but has NOT yet given informed consent. The recruitment realm has its own operator (recruitment coordinator / outreach lead) and its own workflow (advertising response, pre-screening calls, eligibility pre-check, scheduling, contact attempts). Per FIRST-PRINCIPLES, Recruit is a separate top-level entity rather than a pre-consent state on Participant: the recruiter's workflow is operationally distinct from the coordinator's, the data shape is lighter (no consent, often just contact info + light eligibility pre-check), and PHI handling differs (recruiter does not need full demographics or medical history). When a Recruit consents, they convert to a Participant via Participant.convertedFromRecruit. Recruit data persists as recruitment-funnel analytics (conversion rates per source) regardless of whether conversion occurred.",
      "ooux_editor_note": "v0.4.0 introduction (2026-05-09): lifted as a separate top-level alongside Participant per planning-note Decision 9. The OOUX-locked-8 boundary moves to 9 (or Recruit lifts as a horizontal alternative \u2014 chosen as top-level here because the recruiter is a distinct operator role with first-class workflow). Recruit -> Participant transition: when Recruit.recruitStatus=CONVERTED_TO_PARTICIPANT, a Participant entity is created with convertedFromRecruit pointing back. The InformedConsent sub-object's existence on the Participant is the canonical conversion event; the Recruit -> Participant linkage is the operational-funnel-side trace. Recruit-for-twin: the deferred twin-for-enrollment use case (planning-note 'twin-for-enrollment' subsection) uses Recruit as the operational counterpart to synthetic-Recruit twin generation; foundation decisions made now preserve that option.",
      "crosswalks": {
        "fhir": "fhir:Person (or no canonical resource; some sponsors model as Patient pre-trial)",
        "sdtm": "sdtm:N/A (no canonical pre-consent SDTM domain; sponsor-internal recruitment systems)",
        "usdm": "usdm:N/A (no recruitment modeling)"
      },
      "attributes": [
        {
          "name": "recruitId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "firstName",
          "type": "xsd:string",
          "optional": true,
          "doc": "Operator-grounded; populated when recruitment coordinator has captured contact info. Identification-status-agnostic posture (same as Participant)."
        },
        {
          "name": "lastName",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "phone",
          "type": "xsd:string",
          "optional": true,
          "doc": "Phone number for recruiter contact. Often the only identifier captured at first response (radio ad call-in, web-form submission)."
        },
        {
          "name": "email",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "preferredContactMethod",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "PHONE",
            "EMAIL",
            "TEXT",
            "PORTAL",
            "OTHER"
          ],
          "doc": "Recruit's stated preferred contact method."
        },
        {
          "name": "recruitStatus",
          "type": "xsd:string",
          "enum": [
            "RESPONDED",
            "CONTACTED",
            "PRE_SCREENING_SCHEDULED",
            "PRE_SCREENED",
            "QUALIFIED_PENDING_CONSENT",
            "CONVERTED_TO_PARTICIPANT",
            "DECLINED",
            "NO_SHOW",
            "NOT_QUALIFIED",
            "DROPPED"
          ],
          "doc": "Recruitment-funnel state. CONVERTED_TO_PARTICIPANT terminates the Recruit lifecycle (Participant record now exists). DECLINED / NO_SHOW / NOT_QUALIFIED / DROPPED are terminal failure states. NGSI-LD temporal property (validFrom/validUntil) for trajectory queryability (parallel to Participant.participantStatus).",
          "_temporalProperty": true
        },
        {
          "name": "recruitmentSource",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "SITE_DATABASE",
            "EMR_OUTREACH",
            "ADVERTISING_DIGITAL",
            "ADVERTISING_PRINT",
            "ADVERTISING_RADIO",
            "REFERRAL_PROVIDER",
            "REFERRAL_PARTICIPANT",
            "REGISTRY",
            "PATIENT_ADVOCACY",
            "WALK_IN",
            "OTHER"
          ],
          "doc": "How the Recruit entered the funnel. Drives recruitment-channel ROI analysis."
        },
        {
          "name": "recruitmentSourceDetails",
          "type": "xsd:string",
          "optional": true,
          "doc": "Free-text detail (e.g., specific ad campaign ID, specific registry name, referring physician)."
        },
        {
          "name": "responseDate",
          "type": "xsd:date",
          "doc": "Date the Recruit first entered the funnel (responded to ad / referred / identified by EMR mining)."
        },
        {
          "name": "preScreeningOutcome",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "QUALIFIED",
            "NOT_QUALIFIED",
            "DEFERRED",
            "PENDING"
          ],
          "doc": "Outcome of the recruiter's pre-screening assessment (NOT formal protocol screening; that happens post-consent on the Participant via ScreeningRecord). PENDING while in progress; QUALIFIED proceeds to consent scheduling."
        },
        {
          "name": "preScreeningNotes",
          "type": "xsd:string",
          "optional": true,
          "doc": "Free-text notes from pre-screening conversation (high-level eligibility flags, concerns, motivations). Limited PHI by design \u2014 full medical history not captured here."
        },
        {
          "name": "contactAttempts",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Count of contact attempts made by the recruiter (calls, emails, texts). Operational metric; drives recruiter follow-up cadence."
        },
        {
          "name": "lastContactDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Most recent contact attempt date (successful or not)."
        },
        {
          "name": "consentScheduled",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "True if a consent appointment is scheduled. Bridges to Participant creation."
        },
        {
          "name": "consentAppointmentDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "country",
          "type": "xsd:string",
          "optional": true,
          "doc": "ISO 3166-1 alpha-3. Useful for multi-country recruitment funnel analytics."
        },
        {
          "name": "primaryLanguage",
          "type": "xsd:string",
          "optional": true,
          "doc": "ISO 639-1. Drives recruiter language-matching."
        },
        {
          "name": "tags",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated user-defined tags."
        },
        {
          "name": "validFrom",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD temporal property for recruit-record validity."
        },
        {
          "name": "validUntil",
          "type": "xsd:dateTime",
          "optional": true
        }
      ],
      "relationships": [
        {
          "name": "forStudy",
          "target": "Study",
          "cardinality": "1..1",
          "doc": "The Study this Recruit was identified for. Recruits are scoped per-Study (a person responding to two trial ads is two Recruits, even if same human; cross-Study identity resolution is federation, not foundation)."
        },
        {
          "name": "forStudySite",
          "target": "StudySite",
          "cardinality": "0..1",
          "doc": "The StudySite the Recruit was funneled to (often known by recruitment-source channel). 0..1 because some Recruits enter the funnel before site assignment is finalized (multi-site studies with central-recruitment-then-site-routing)."
        },
        {
          "name": "recruitedBy",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "The recruitment coordinator (Person) handling this Recruit. From forStudySite.delegatesAuthorityTo with role=recruitment-coordinator (when delegation is per-Study) or from a sponsor-side recruitment team.",
          "provSemantics": "wasAssociatedWith"
        },
        {
          "name": "convertedToParticipant",
          "target": "Participant",
          "cardinality": "0..1",
          "doc": "The Participant entity that was created when this Recruit consented. Empty until conversion. Inverse of Participant.convertedFromRecruit."
        }
      ],
      "ctas": [
        {
          "action": "Capture Recruit",
          "persona": "Recruitment Coordinator",
          "note": "Register a new Recruit from any source (ad response, web-form, EMR list, referral)."
        },
        {
          "action": "Pre-Screen Recruit",
          "persona": "Recruitment Coordinator",
          "note": "Conduct light pre-screening conversation (high-level eligibility flags); records preScreeningOutcome."
        },
        {
          "action": "Schedule Consent Appointment",
          "persona": "Recruitment Coordinator",
          "note": "Schedule the formal consent appointment at the StudySite. Transition to QUALIFIED_PENDING_CONSENT."
        },
        {
          "action": "Convert Recruit to Participant",
          "persona": "Site Coordinator",
          "note": "After consent is obtained at the appointment, create a Participant entity with convertedFromRecruit pointing here; transitions Recruit.recruitStatus to CONVERTED_TO_PARTICIPANT."
        },
        {
          "action": "Mark Recruit Declined",
          "persona": "Recruitment Coordinator",
          "note": "Recruit declines participation (or fails pre-screening); transitions to DECLINED / NOT_QUALIFIED / DROPPED."
        },
        {
          "action": "Log Contact Attempt",
          "persona": "Recruitment Coordinator",
          "note": "Increment contactAttempts; update lastContactDate. Used for follow-up-cadence dashboards."
        }
      ],
      "provType": "prov:Entity"
    },
    {
      "id": "Visit",
      "role": "the operational visit occurrence \u2014 when a Participant attended a real visit",
      "description": "A Visit is an actual visit-occurrence: a Participant attended at a StudySite on a specific date. Distinct from VisitDefinition (the protocol-template). Visits carry actual datetimes, status, mode (in-person / telehealth / remote / async), Activities performed, Tasks captured, and any Observations the operator noted. Per FIRST-PRINCIPLES universal-foundation posture, the Visit > Activity > Task hierarchy handles ANY assessment without modeling specifics \u2014 a DICOM imaging Activity and a blood-draw Activity are the same TOP shape. The OOUX Visit->Site direct edge is corrected: Visit.forStudySite -> StudySite (1..1).",
      "ooux_editor_note": "v0.5.0 introduction (2026-05-09): sixth TOP top-level. Visit-occurrences are runtime-created by EDC/scheduling/eVisit systems, NOT USDM-ingest-derivable (template-side is VisitDefinition; runtime-side is Visit). Per Visit planning Decision 4 (revised), Activity + Task are universal sub-objects under Visit; specialization is content (taskValue polymorphism + biomedicalConceptCode), never entity shape. visitStatus is a NGSI-LD temporal property for trajectory queryability (parallel to Participant.participantStatus). visitMode 6-state enum per ICH E6(R3) Annex 2 DCT framing. Three Visit sub-objects: Activity (universal work unit), Task (universal leaf data-capture, with polymorphic taskValue), VisitObservation (operator-narrative escalation-to-Event sub-object per OOUX Path C). FHIR Questionnaire projection is the canonical EHR-rendering target: VisitDefinition + Activity-templates + Task-templates project to FHIR Questionnaire JSON (consumable by Epic, Cerner, SMART on FHIR apps); Visit + Activities + Tasks project to FHIR QuestionnaireResponse.",
      "provType": "prov:Activity",
      "crosswalks": {
        "fhir": "fhir:Encounter (operational); fhir:QuestionnaireResponse (data-capture projection)",
        "sdtm": "sdtm:SV (Subject Visits)",
        "cdash": "cdash:VISIT",
        "omop": "omop:VISIT_OCCURRENCE",
        "usdm": "usdm:N/A (no per-visit-occurrence runtime entity)"
      },
      "attributes": [
        {
          "name": "visitId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "visitNumber",
          "type": "xsd:string",
          "optional": true,
          "doc": "Numeric ordering per protocol (matches VisitDefinition.visitNumber when definedBy is populated). Maps to SDTM VISITNUM."
        },
        {
          "name": "visitName",
          "type": "xsd:string",
          "optional": true,
          "doc": "Operator-friendly name. For UNSCHEDULED visits, free text describing the reason. Maps to SDTM VISIT."
        },
        {
          "name": "visitMode",
          "type": "xsd:string",
          "enum": [
            "IN_PERSON_CLINIC",
            "IN_PERSON_HOME",
            "REMOTE_VIDEO",
            "REMOTE_PHONE",
            "REMOTE_ASYNC",
            "HYBRID"
          ],
          "doc": "Visit modality per ICH E6(R3) Annex 2 DCT framing. IN_PERSON_CLINIC for traditional clinic visits; IN_PERSON_HOME for home health; REMOTE_VIDEO for telehealth; REMOTE_PHONE for phone visits; REMOTE_ASYNC for ePRO/eDiary capture without live interaction; HYBRID for mixed-modality visits. FHIR Encounter.virtualService + Encounter.location are the projection targets."
        },
        {
          "name": "visitStatus",
          "type": "xsd:string",
          "enum": [
            "SCHEDULED",
            "IN_PROGRESS",
            "COMPLETED",
            "PARTIALLY_COMPLETED",
            "MISSED",
            "RESCHEDULED",
            "CANCELLED",
            "OUT_OF_WINDOW",
            "UNSCHEDULED"
          ],
          "_temporalProperty": true,
          "doc": "Visit lifecycle state. NGSI-LD temporal property (validFrom/validUntil per value) for trajectory queryability. SCHEDULED for booked-but-not-started; IN_PROGRESS during active visit; COMPLETED for per-protocol completion; PARTIALLY_COMPLETED when some Activities not performed (rescheduled separately); MISSED for didn't-happen-no-makeup; OUT_OF_WINDOW when actual datetime falls outside visitDefinition.visitWindow; UNSCHEDULED for ad-hoc (urgent care, AE workup, sponsor-requested). FHIR Encounter.status is the projection target."
        },
        {
          "name": "plannedStartDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Planned visit date per SOA / scheduling system. What the operator/coordinator booked."
        },
        {
          "name": "plannedEndDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Planned end date (typically same day; multi-day visits possible for inpatient procedures or PK time-courses)."
        },
        {
          "name": "actualStartDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Actual visit start date. Empty for SCHEDULED visits not yet started. Maps to SDTM SVSTDTC."
        },
        {
          "name": "actualStartTime",
          "type": "xsd:time",
          "optional": true,
          "doc": "Actual start time-of-day where captured. Operational completeness."
        },
        {
          "name": "actualEndDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Actual visit end date. Maps to SDTM SVENDTC."
        },
        {
          "name": "actualEndTime",
          "type": "xsd:time",
          "optional": true,
          "doc": "Actual end time-of-day where captured."
        },
        {
          "name": "visitDay",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Days from study anchor (typically randomization or first dose). Computed from actualStartDate when definedBy is populated. Maps to SDTM VISITDY."
        },
        {
          "name": "protocolDeviationCode",
          "type": "xsd:string",
          "optional": true,
          "doc": "Sponsor-defined deviation code when visitStatus=OUT_OF_WINDOW or other deviation. Free text or coded; aligns with sponsor deviation taxonomy."
        },
        {
          "name": "unscheduledReason",
          "type": "xsd:string",
          "optional": true,
          "doc": "Reason for an unscheduled visit (urgent care, AE workup, sponsor-requested follow-up). Required when visitStatus=UNSCHEDULED. Maps to SDTM SVUPDES."
        },
        {
          "name": "tags",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated user-defined tags."
        },
        {
          "name": "validFrom",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD temporal property: when this Visit record became operationally valid."
        },
        {
          "name": "validUntil",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD temporal property: when this Visit record was superseded or closed."
        }
      ],
      "relationships": [
        {
          "name": "forParticipant",
          "target": "Participant",
          "cardinality": "1..1",
          "doc": "The Participant whose visit this is. PROV: this Visit Activity is wasAttributedTo this Participant. Maps to FHIR Encounter.subject (via ResearchSubject.subject linkage)."
        },
        {
          "name": "forStudySite",
          "target": "StudySite",
          "cardinality": "1..1",
          "doc": "The StudySite hosting this visit (operational owner regardless of physical location \u2014 telehealth visits still have a StudySite of record). OOUX Visit->Site corrected to Visit->StudySite per the operational hierarchy. Maps to FHIR Encounter.serviceProvider + Encounter.location."
        },
        {
          "name": "definedBy",
          "target": "VisitDefinition",
          "cardinality": "0..1",
          "doc": "The VisitDefinition (protocol template) this Visit instantiates. 0..1 because UNSCHEDULED visits don't have a corresponding template. PROV: wasInformedBy semantics \u2014 the template informed the actual visit's expected scope.",
          "provSemantics": "wasInformedBy"
        },
        {
          "name": "hasActivity",
          "target": "Activity",
          "cardinality": "0..N",
          "doc": "Activities performed at this Visit (universal sub-objects: vitals, MRI, ePRO, biopsy, IP-admin, etc.). Per FIRST-PRINCIPLES universal-foundation posture, Activity is the same TOP shape regardless of activity type."
        },
        {
          "name": "hasTask",
          "target": "Task",
          "cardinality": "0..N",
          "doc": "Tasks (leaf data-capture units) performed at this Visit. Each Task has belongsToActivity referencing its parent Activity within the same Visit. Polymorphic taskValue handles all data shapes (numeric, text, coded, URI references, structured)."
        },
        {
          "name": "hasVisitObservation",
          "target": "VisitObservation",
          "cardinality": "0..N",
          "doc": "Operator-narrative observations captured during the visit that don't fit a structured Activity slot (per OOUX Path C reportability handoff). May escalate to Event when relevant."
        },
        {
          "name": "partOf",
          "target": "Visit",
          "cardinality": "0..1",
          "doc": "Parent Visit this Visit is part of (multi-part visits, follow-up linkage). Maps to FHIR Encounter.partOf and OMOP preceding_visit_occurrence_id (linked-list)."
        },
        {
          "name": "hasAdverseEvent",
          "target": "Event",
          "cardinality": "0..N",
          "doc": "Adverse events identified at or attributed to this Visit. Inverse of Event.duringVisit. As with Participant.hasAdverseEvent, the relationship label is operator-vocabulary; Event with category in {DEVIATION, DISCREPANCY, OTHER_CLINICAL_EVENT} arising during a Visit reach back through Event.duringVisit."
        },
        {
          "name": "hasTag",
          "target": "Tag",
          "cardinality": "0..N",
          "doc": "User-defined tags.",
          "_targetMissing": "Tag flagged-missing as before."
        }
      ],
      "ctas": [
        {
          "action": "Schedule Visit",
          "persona": "Site Coordinator",
          "note": "Create a new Visit record with visitStatus=SCHEDULED for an upcoming participant visit. Populates plannedStartDate, definedBy, forParticipant, forStudySite."
        },
        {
          "action": "Start Visit",
          "persona": "Site Coordinator / PI",
          "note": "Transition visitStatus from SCHEDULED to IN_PROGRESS. Captures actualStartDate/Time."
        },
        {
          "action": "Complete Visit",
          "persona": "Site Coordinator / PI",
          "note": "Transition to COMPLETED after all expected Activities performed; captures actualEndDate/Time."
        },
        {
          "action": "Reschedule Visit",
          "persona": "Site Coordinator",
          "note": "Move a SCHEDULED visit to a new date; original visit transitions to RESCHEDULED, new SCHEDULED Visit created with partOf reference."
        },
        {
          "action": "Cancel Visit",
          "persona": "Site Coordinator / PI",
          "note": "Cancel a SCHEDULED visit (early termination, withdrawal, etc.); transitions to CANCELLED."
        },
        {
          "action": "Mark Missed",
          "persona": "Site Coordinator",
          "note": "Mark a Visit as MISSED when it didn't happen and no make-up is currently scheduled."
        },
        {
          "action": "Mark Out-of-Window",
          "persona": "Site Coordinator",
          "note": "When a Visit's actual datetime falls outside the visitDefinition.visitWindow, transition to OUT_OF_WINDOW and populate protocolDeviationCode."
        },
        {
          "action": "Create Unscheduled Visit",
          "persona": "Site Coordinator / PI",
          "note": "Create a Visit not in the SOA (urgent care, AE workup, sponsor-requested); visitStatus=UNSCHEDULED; populates unscheduledReason."
        },
        {
          "action": "Record Activity",
          "persona": "Site Coordinator / PI / Phlebotomist / Technologist",
          "note": "Add an Activity sub-object to the Visit (Vitals, Blood Draw, MRI, ePRO session, IP administration, etc.)."
        },
        {
          "action": "Capture Task",
          "persona": "Site Coordinator / PI / etc.",
          "note": "Add a Task sub-object capturing a single data point (BP, MRI Study reference, PHQ-9 item, drug dose). Task references its parent Activity via belongsToActivity."
        },
        {
          "action": "Record Observation",
          "persona": "CRA / Site Coordinator",
          "note": "Add a VisitObservation sub-object for operator-narrative items that don't fit structured Activities."
        },
        {
          "action": "Escalate Observation",
          "persona": "CRA",
          "note": "Flag a VisitObservation as escalated; populates escalatedTo when Event lifts."
        }
      ],
      "sub_objects": [
        {
          "id": "Activity",
          "role": "the universal work unit performed at a Visit",
          "description": "Activity is the universal work unit at a Visit \u2014 Vitals, Blood Draw, MRI, ePRO session, IP administration, ECG, biopsy, sequencing draw, ADAS-Cog session, anything. Per FIRST-PRINCIPLES universal-foundation posture, the SAME entity shape handles all activity types; specialization is content (biomedicalConceptCode + activityType for filter/sort + linked Equipment + governing Document), never entity shape. activityStatus is a NGSI-LD temporal property. PROV: each Activity is a prov:Activity with wasAssociatedWith Person agents, used Equipment, governed-by Documents.",
          "provType": "prov:Activity",
          "crosswalks": {
            "fhir": "fhir:Procedure (procedural Activities); fhir:Observation (assessment Activities); resource selection by activityType",
            "sdtm": "varies by activityType: VS / EX / PR / LB / EG / IE / CM (each domain row corresponds to Activity + its Tasks)",
            "usdm": "usdm:Activity (template-side; runtime-side has no USDM analog)"
          },
          "attributes": [
            {
              "name": "activityId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "activityName",
              "type": "xsd:string",
              "doc": "Operator-friendly name (e.g., 'Vital Signs', 'MRI Brain', 'ECOG Performance Status', 'Drug X Administration', 'EQ-5D-5L')."
            },
            {
              "name": "activityType",
              "type": "xsd:string",
              "enum": [
                "PROCEDURE",
                "ASSESSMENT",
                "IP_ADMINISTRATION",
                "SAMPLE_COLLECTION",
                "QUESTIONNAIRE",
                "IMAGING",
                "OTHER"
              ],
              "doc": "Coarse categorization for operator sort/filter, NOT for specialization. Per FIRST-PRINCIPLES universal-foundation posture, the entity shape is the same for all types \u2014 activityType is a hint, not a discriminator that changes structure."
            },
            {
              "name": "activityStatus",
              "type": "xsd:string",
              "enum": [
                "PERFORMED",
                "NOT_PERFORMED",
                "PARTIALLY_PERFORMED",
                "RESCHEDULED"
              ],
              "_temporalProperty": true,
              "doc": "Lifecycle of this Activity. NGSI-LD temporal property."
            },
            {
              "name": "notPerformedReason",
              "type": "xsd:string",
              "optional": true,
              "doc": "When activityStatus=NOT_PERFORMED, the reason (subject refused, equipment failure, scheduling conflict, etc.). Required by SHACL when status indicates non-performance."
            },
            {
              "name": "biomedicalConceptCode",
              "type": "xsd:string",
              "optional": true,
              "doc": "NCIt C-code (or LOINC where applicable) identifying what the Activity IS. References COSMoS BC catalog. The discriminator that operators (and downstream systems) use to know 'this is a Vital Signs activity' vs 'this is an MRI Brain activity' \u2014 content, not shape."
            },
            {
              "name": "validFrom",
              "type": "xsd:dateTime",
              "optional": true,
              "doc": "NGSI-LD temporal property: operational start time of the Activity within the Visit."
            },
            {
              "name": "validUntil",
              "type": "xsd:dateTime",
              "optional": true,
              "doc": "NGSI-LD temporal property: operational end time."
            }
          ],
          "relationships": [
            {
              "name": "performedBy",
              "target": "Person",
              "cardinality": "1..N",
              "doc": "Person(s) who performed the Activity. PROV: prov:wasAssociatedWith. Drawn from forStudySite.delegatesAuthorityTo for delegated tasks.",
              "provSemantics": "wasAssociatedWith"
            },
            {
              "name": "usedEquipment",
              "target": "Equipment",
              "cardinality": "0..N",
              "doc": "Equipment used to perform the Activity (centrifuge, MRI scanner, infusion pump, ECG machine, etc.). PROV: prov:used. The Equipment's calibration/credential chain is queryable from here.",
              "provSemantics": "used"
            },
            {
              "name": "governedBy",
              "target": "Document",
              "cardinality": "0..N",
              "doc": "Document(s) that govern how this Activity should be performed (protocol section, SOP, lab manual). Document carries the section anchor. Per the chain-of-custody mock-up: 'Per shipping SOP-2026-CL-019' is a governedBy reference."
            }
          ]
        },
        {
          "id": "Task",
          "role": "the universal leaf data-capture unit",
          "description": "Task is the universal leaf data-capture unit at a Visit (one Task per measurement / response / dose / observation). Per FIRST-PRINCIPLES universal-foundation posture, Task handles ANY captured data via polymorphic taskValue (NUMERIC / TEXT / CODED / URI_REFERENCE / STRUCTURED / DATE / IMAGE_REFERENCE). A BP measurement, an MRI Study Instance UID reference, a PHQ-9 item response, a drug dose record, a tumor lesion measurement \u2014 all the same TOP entity shape. The specialization lives in content. Each Task carries observedAt as Property metadata on taskValue (NOT a separate flat performedDateTime attribute) per NGSI-LD temporal conventions. Maps to FHIR Observation (one Observation per Task) and per-domain SDTM rows (VS/LB/EX/etc.).",
          "provType": "prov:Activity",
          "crosswalks": {
            "fhir": "fhir:Observation (one per Task); fhir:QuestionnaireResponse.item.answer (when in a Questionnaire context)",
            "sdtm": "varies by domain: VS / LB / EX / EG / IE / etc. \u2014 each Task projects to a domain row keyed by USUBJID + VISITNUM + TEST",
            "cdash": "fhir:QuestionnaireResponse.item; CDASH form items"
          },
          "attributes": [
            {
              "name": "taskId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "taskName",
              "type": "xsd:string",
              "doc": "Operator-friendly name (e.g., 'Systolic BP', 'MRI Study Instance UID', 'PHQ-9 Item 1', 'Drug X dose')."
            },
            {
              "name": "taskValueType",
              "type": "xsd:string",
              "enum": [
                "NUMERIC",
                "TEXT",
                "CODED",
                "URI_REFERENCE",
                "STRUCTURED",
                "DATE",
                "IMAGE_REFERENCE"
              ],
              "doc": "Discriminates the shape of taskValue. NUMERIC for numeric measurements; TEXT for free text; CODED for enum/concept-code values; URI_REFERENCE for URIs to external artifacts (DICOM PACS, S3, lab LIS); STRUCTURED for nested object values (lesion measurements with components, BP with sys/dia/MAP); DATE for captured dates; IMAGE_REFERENCE for radiology/pathology image URIs."
            },
            {
              "name": "taskValue",
              "type": "xsd:string",
              "doc": "The captured value, polymorphic per taskValueType. NUMERIC values held as string for SHACL flexibility; deployment-side typing applies at projection time. NGSI-LD observedAt Property metadata captures when the value was measured/observed (NOT a separate performedDateTime attribute)."
            },
            {
              "name": "taskUnit",
              "type": "xsd:string",
              "optional": true,
              "doc": "UCUM unit where applicable (e.g., '[mmHg]', 'cm', 'mg', 'beats/min'). Empty for taskValueType=TEXT/CODED/URI_REFERENCE/etc. where unit doesn't apply."
            },
            {
              "name": "biomedicalConceptCode",
              "type": "xsd:string",
              "optional": true,
              "doc": "NCIt or LOINC C-code identifying what the Task IS (the BC catalog lookup). e.g., NCIt:C25298 for Systolic BP, LOINC:44261-6 for PHQ-9 Q1, NCIt:C16809 for MRI Brain."
            },
            {
              "name": "taskStatus",
              "type": "xsd:string",
              "enum": [
                "COMPLETED",
                "NOT_PERFORMED",
                "PARTIALLY_COMPLETED"
              ],
              "_temporalProperty": true,
              "doc": "Lifecycle of the Task. NGSI-LD temporal property."
            },
            {
              "name": "notPerformedReason",
              "type": "xsd:string",
              "optional": true,
              "doc": "When taskStatus=NOT_PERFORMED. Required by SHACL."
            },
            {
              "name": "observedAt",
              "type": "xsd:dateTime",
              "optional": true,
              "doc": "When the value was observed/measured. Canonical NGSI-LD Property metadata for measurement timestamps. Maps to FHIR Observation.effectiveDateTime and SDTM per-domain DTC fields."
            }
          ],
          "relationships": [
            {
              "name": "belongsToActivity",
              "target": "Activity",
              "cardinality": "1..1",
              "doc": "The parent Activity within the same Visit. Tasks group under Activities for operator sort/filter and projection-adapter routing (e.g., all VS-domain Tasks in one Vitals Activity)."
            },
            {
              "name": "performedBy",
              "target": "Person",
              "cardinality": "1..1",
              "doc": "The Person who captured this Task. PROV: prov:wasAssociatedWith.",
              "provSemantics": "wasAssociatedWith"
            }
          ]
        },
        {
          "id": "VisitObservation",
          "role": "operator-narrative observation captured during a visit",
          "description": "VisitObservation captures something the operator notices during a visit that doesn't fit a structured Activity / Task slot \u2014 observational notes, unexpected events, patient-reported context. Per OOUX Path C, may escalate to a categorized Event (when Event lifts) via escalatedTo. Distinct from Task (which is structured data capture). PROV: each VisitObservation is a prov:Activity that wasInformedBy by the parent Visit; if escalated, the resulting Event was wasInformedBy this VisitObservation.",
          "provType": "prov:Activity",
          "crosswalks": {
            "fhir": "fhir:Observation (with category=note) or fhir:Encounter.note[]",
            "sdtm": "varies: NV (Non-Standard Variables), DV (Protocol Deviations), or domain-specific note fields"
          },
          "attributes": [
            {
              "name": "observationId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "observationText",
              "type": "xsd:string",
              "doc": "The operator's narrative observation."
            },
            {
              "name": "observationCategory",
              "type": "xsd:string",
              "enum": [
                "PROTOCOL_DEVIATION",
                "SAFETY_SIGNAL",
                "DATA_DISCREPANCY",
                "OPERATIONAL_NOTE",
                "OTHER"
              ],
              "doc": "Coarse categorization. SAFETY_SIGNAL escalates to AE workflow; PROTOCOL_DEVIATION goes to deviation tracking; DATA_DISCREPANCY into query workflow; OPERATIONAL_NOTE for routine notes; OTHER for catch-all."
            },
            {
              "name": "observationDate",
              "type": "xsd:date",
              "doc": "When the observation was recorded."
            },
            {
              "name": "observationTime",
              "type": "xsd:time",
              "optional": true,
              "doc": "Time-of-day the observation was recorded."
            },
            {
              "name": "escalated",
              "type": "xsd:boolean",
              "optional": true,
              "doc": "True if this observation has been escalated to a categorized Event. SHACL soft warning: escalated=true should have escalatedTo populated."
            },
            {
              "name": "escalationDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date the escalation occurred."
            }
          ],
          "relationships": [
            {
              "name": "recordedBy",
              "target": "Person",
              "cardinality": "1..1",
              "doc": "The Person who recorded the observation (typically a CRA, coordinator, or PI). PROV: prov:wasAssociatedWith.",
              "provSemantics": "wasAssociatedWith"
            },
            {
              "name": "escalatedTo",
              "target": "Event",
              "cardinality": "0..1",
              "doc": "When escalated, the categorized Event that resulted from this observation. PROV: the Event was wasInformedBy this observation. Inverse of Event.derivedFrom (operator-meaningful escalation chain).",
              "provSemantics": "wasInformedBy"
            }
          ]
        }
      ]
    },
    {
      "id": "OversightBody",
      "role": "regulatory / ethics / safety committee with review authority over a Study or StudySite",
      "description": "An OversightBody is a committee that holds review authority over a Study or StudySite \u2014 IRB (Institutional Review Board) for site-level ethics review, EC (Ethics Committee) for the EU equivalent, DSMB / IDMC (Data Safety Monitoring Board / Independent Data Monitoring Committee) for sponsor-level interim safety review, Steering Committee for cross-site governance, CEC (Clinical Events Committee) for endpoint adjudication. Per FIRST-PRINCIPLES universal-foundation posture, OversightBody is a foundation primitive (every regulated trial has oversight bodies regardless of therapeutic area). The oversight body holds authority; the review activities happen through ReviewDecision sub-objects.",
      "ooux_editor_note": "v0.5.1 introduction (2026-05-09): seventh TOP top-level. Per OOUX-locked-9 sequencing. Un-flag-misses three existing relationships: Sponsor.interfacesWith, StudySite.hasIRB, Study.hasOversightBody. Per the temporal+PROV native commitment, OversightBody is prov:Agent (it bears responsibility); ReviewDecision sub-object is prov:Activity (the review event). reviewType enum carries the operator-grounded discrimination (IRB / EC / DSMB / IDMC / STEERING_COMMITTEE / CEC / OTHER) without splitting into specialized entities \u2014 universal foundation posture preserved. The cross-jurisdictional reality is that the same human committee can play different oversightBodyType roles on different studies (a hospital IRB can act as central IRB for some studies and local IRB for others); each role is a separate OversightBody record per the per-Org-per-Role pattern from Sponsor.",
      "provType": "prov:Agent",
      "crosswalks": {
        "fhir": "fhir:Organization (with type=committee or type=ethics-board)",
        "usdm": "usdm:Organization (with type=Code for committee subtype)",
        "ich": "ICH E6(R3) Section 5 (IRB/EC); ICH E9 (DSMB/IDMC); ICH E2A (Safety Reporting)"
      },
      "attributes": [
        {
          "name": "oversightBodyId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "oversightBodyName",
          "type": "xsd:string",
          "doc": "Display name (e.g., 'Memorial Sloan Kettering Cancer Center IRB', 'ONCO-423 Independent Data Monitoring Committee')."
        },
        {
          "name": "oversightBodyType",
          "type": "xsd:string",
          "enum": [
            "IRB",
            "EC",
            "DSMB",
            "IDMC",
            "STEERING_COMMITTEE",
            "CEC",
            "OTHER"
          ],
          "doc": "Type of oversight body. IRB for US institutional review boards; EC for European ethics committees; DSMB / IDMC are interchangeable terms for sponsor-level interim safety review boards; STEERING_COMMITTEE for cross-site governance; CEC for clinical events committees doing endpoint adjudication; OTHER for catch-all."
        },
        {
          "name": "scope",
          "type": "xsd:string",
          "enum": [
            "LOCAL",
            "CENTRAL",
            "SPONSOR",
            "REGULATORY",
            "OTHER"
          ],
          "doc": "Scope of authority. LOCAL for site-specific (typical IRB at a single institution); CENTRAL for multi-site coverage (a single IRB serving multiple sites); SPONSOR for sponsor-level (DSMB/IDMC); REGULATORY for regulator-affiliated; OTHER for catch-all."
        },
        {
          "name": "registrationNumber",
          "type": "xsd:string",
          "optional": true,
          "doc": "Registration identifier (e.g., FDA OHRP IRB registration number IRB00000123, FWA00001234, EU EC reference)."
        },
        {
          "name": "registrationAuthority",
          "type": "xsd:string",
          "optional": true,
          "doc": "The authority that issued the registration (e.g., 'FDA OHRP', 'EU CTIS', 'NHS HRA')."
        },
        {
          "name": "registrationCountry",
          "type": "xsd:string",
          "optional": true,
          "doc": "ISO 3166-1 alpha-3 country code where the body is registered."
        },
        {
          "name": "address",
          "type": "xsd:object",
          "optional": true,
          "doc": "Mailing address (line1, city, region, postalCode, country)."
        },
        {
          "name": "phone",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "email",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "website",
          "type": "xsd:anyURI",
          "optional": true
        },
        {
          "name": "operatingProcedure",
          "type": "xsd:anyURI",
          "optional": true,
          "doc": "URI to the body's published operating procedure / charter / SOP. References a Document horizontal entity for full lineage when uploaded."
        },
        {
          "name": "establishedDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date the body was established."
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "ACTIVE",
            "SUSPENDED",
            "DISBANDED"
          ],
          "_temporalProperty": true,
          "doc": "Lifecycle state. NGSI-LD temporal property \u2014 bodies can be suspended (regulatory hold) or disbanded after study completion."
        },
        {
          "name": "validFrom",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD temporal property: when this OversightBody record became operationally valid for the trial."
        },
        {
          "name": "validUntil",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD temporal property: when this OversightBody record was superseded or closed."
        }
      ],
      "relationships": [
        {
          "name": "belongsToOrganization",
          "target": "Organization",
          "cardinality": "0..1",
          "doc": "The Organization that hosts / sponsors / convened the oversight body. 0..1 because some bodies (especially DSMBs) are convened ad-hoc without a hosting Organization. PROV: the Organization is a higher-order Agent."
        },
        {
          "name": "hasMember",
          "target": "Person",
          "cardinality": "0..N",
          "doc": "Committee members. Each Person has expertise relevant to the body's mandate (clinical, statistical, ethical, patient advocacy). PROV: each member is a prov:Agent acting on behalf of the OversightBody.",
          "provSemantics": "actedOnBehalfOf"
        },
        {
          "name": "chair",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "The committee chair. 0..1 because some bodies operate with co-chairs or rotating chairs."
        },
        {
          "name": "reviewsStudy",
          "target": "Study",
          "cardinality": "0..N",
          "doc": "Studies this body has review authority over. 0..N: an IRB reviews many studies; a DSMB typically reviews one."
        },
        {
          "name": "reviewsStudySite",
          "target": "StudySite",
          "cardinality": "0..N",
          "doc": "StudySites this body has review authority over. Site-level IRBs typically review per-StudySite; central IRBs review multiple StudySites under one Study.",
          "_targetMissing": "StudySite is a horizontal but the relationship target resolves correctly; no flag needed in v0.5.1."
        }
      ],
      "ctas": [
        {
          "action": "Register OversightBody",
          "persona": "Sponsor Regulatory / Site Admin",
          "note": "Create a new OversightBody record with registration number, scope, and member list."
        },
        {
          "action": "Update Member Roster",
          "persona": "Committee Coordinator",
          "note": "Add or remove Person members; track validFrom/validUntil for membership terms."
        },
        {
          "action": "Record Review Decision",
          "persona": "Committee Coordinator / Chair",
          "note": "Create a ReviewDecision record (sub-object when lifted) with decision, decision date, conditions, next review date."
        },
        {
          "action": "Suspend OversightBody",
          "persona": "Regulatory / Sponsor",
          "note": "Transition status to SUSPENDED (regulatory hold or institutional suspension)."
        },
        {
          "action": "Disband OversightBody",
          "persona": "Sponsor / Site Admin",
          "note": "Transition status to DISBANDED after study close-out and document retention period ends."
        }
      ]
    },
    {
      "id": "InvestigationalProduct",
      "role": "the drug, biologic, device, or combination product under investigation",
      "description": "An InvestigationalProduct (IP) is the substance, biologic, medical device, or combination being studied in a Study. Per FIRST-PRINCIPLES universal-foundation posture, IP is a single entity covering all product types \u2014 drugs, biologics, devices, diagnostics, combination products \u2014 discriminated by investigationalProductType enum. Specialization is content (productCode, dosageForm, mechanismOfAction, regulatorySource); not entity shape. Per ICH E6(R3) Section 2.7 and 21 CFR 312.6, IPs require lot tracking, blinded kit packaging (when applicable), and dispensation accountability. TOP models these via two sub-objects: Lot (per-batch manufacturing identity) and Kit (per-blinded-packaging-unit). Dispensation events live as Visit Activities (activityType=IP_ADMINISTRATION) per the universal Visit > Activity > Task foundation; no separate Dispensation entity needed.",
      "ooux_editor_note": "v0.6.0 introduction (2026-05-09): eighth TOP top-level. Per OOUX-locked-9 sequencing. Un-flag-misses Sponsor.supplies + Study.suppliesInvestigationalProduct. Per FIRST-PRINCIPLES universal-foundation posture, single IP entity with investigationalProductType enum discriminator (DRUG / BIOLOGIC / DEVICE / DIAGNOSTIC / COMBINATION_PRODUCT / OTHER). The Lot sub-object captures per-batch facts (manufacturedDate, expirationDate, retestDate, lotStatus); the Kit sub-object captures blinded-packaging-unit facts (kitNumber, treatmentAssignment for blinded studies, assignmentDate). Dispensation tracking happens via the Visit Activity (activityType=IP_ADMINISTRATION) with STRUCTURED taskValue carrying dose/route/lot/kit references \u2014 the universal foundation covers IP administration without specialized Dispensation entity.",
      "provType": "prov:Entity",
      "crosswalks": {
        "fhir": "fhir:MedicationKnowledge (for drugs/biologics); fhir:DeviceDefinition (for devices); fhir:Substance (for raw substances)",
        "usdm": "usdm:StudyIntervention + usdm:AdministrableProduct (USDM separates the intervention from the administrable product; TOP collapses for operator UX)",
        "sdtm": "sdtm:EX (Exposure \u2014 captures per-dose dispensation; the IP definition is an SDTM define.xml SUPPDM or vendor extension)",
        "cdash": "cdash:EX",
        "ich": "ICH E6(R3) Section 2.7 (IP Management); 21 CFR 312.6 (Labeling); ICH M11 IP fields"
      },
      "attributes": [
        {
          "name": "investigationalProductId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "investigationalProductName",
          "type": "xsd:string",
          "doc": "Operator-friendly name (e.g., 'Drug X', 'BioCar-T-001', 'NeuroMonitor v2')."
        },
        {
          "name": "genericName",
          "type": "xsd:string",
          "optional": true,
          "doc": "Generic / non-proprietary name (when applicable)."
        },
        {
          "name": "brandName",
          "type": "xsd:string",
          "optional": true,
          "doc": "Brand / proprietary name (when commercially available, e.g., for active comparators or reformulations)."
        },
        {
          "name": "investigationalProductType",
          "type": "xsd:string",
          "enum": [
            "DRUG",
            "BIOLOGIC",
            "DEVICE",
            "DIAGNOSTIC",
            "COMBINATION_PRODUCT",
            "OTHER"
          ],
          "doc": "Coarse type discriminator. DRUG for small-molecule pharmaceuticals; BIOLOGIC for biologics including monoclonal antibodies, vaccines, cell/gene therapies; DEVICE for medical devices; DIAGNOSTIC for in vitro diagnostics; COMBINATION_PRODUCT for drug-device or biologic-device combinations; OTHER for catch-all. Per FIRST-PRINCIPLES universal-foundation posture, this is a category discriminator for sort/filter, NOT a shape discriminator \u2014 the entity is the same shape regardless of type."
        },
        {
          "name": "mechanismOfAction",
          "type": "xsd:string",
          "optional": true,
          "doc": "Brief description of how the product works (e.g., 'PD-1 checkpoint inhibitor', 'CAR-T cell therapy targeting CD19')."
        },
        {
          "name": "dosageForm",
          "type": "xsd:string",
          "optional": true,
          "doc": "Dosage form (TABLET / CAPSULE / SOLUTION / SUSPENSION / INJECTION / INFUSION / TOPICAL / IMPLANT / DEVICE \u2014 free text accepts NCIt or FHIR Medication.form codes)."
        },
        {
          "name": "routeOfAdministration",
          "type": "xsd:string",
          "optional": true,
          "doc": "Primary route of administration (ORAL / IV / IM / SC / TOPICAL / INTRATHECAL / etc.)."
        },
        {
          "name": "strength",
          "type": "xsd:string",
          "optional": true,
          "doc": "Strength / concentration (e.g., '200 mg', '50 mg/mL', '10^7 cells/dose')."
        },
        {
          "name": "isBlinded",
          "type": "xsd:boolean",
          "doc": "Whether this IP is dispensed under blinding (true requires Kit sub-objects with treatmentAssignment for IRT-managed kit assignment; false means open-label)."
        },
        {
          "name": "regulatoryStatus",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "INVESTIGATIONAL",
            "APPROVED_OFF_LABEL",
            "EXPANDED_ACCESS",
            "MARKETED_COMPARATOR",
            "OTHER"
          ],
          "doc": "Regulatory status of the product. INVESTIGATIONAL for true IND/IDE products; APPROVED_OFF_LABEL when an approved drug is investigated for a new indication; EXPANDED_ACCESS for compassionate-use frameworks; MARKETED_COMPARATOR for active comparator arms using approved drugs; OTHER for catch-all."
        },
        {
          "name": "regulatorySource",
          "type": "xsd:string",
          "optional": true,
          "doc": "Regulatory authority and identifier (e.g., 'FDA IND #123456', 'EMA EudraCT 2024-001234-56', 'PMDA Notification #...')."
        },
        {
          "name": "biomedicalConceptCode",
          "type": "xsd:string",
          "optional": true,
          "doc": "NCIt C-code for the substance / device. References COSMoS BC catalog or external substance registries (UNII, RxNorm)."
        },
        {
          "name": "investigationalProductStatus",
          "type": "xsd:string",
          "enum": [
            "PLANNED",
            "IN_DEVELOPMENT",
            "IN_USE",
            "DISCONTINUED",
            "WITHDRAWN"
          ],
          "_temporalProperty": true,
          "doc": "Lifecycle of the IP across all studies that use it. PLANNED for pre-IND; IN_DEVELOPMENT for pre-first-in-human; IN_USE for actively-administered; DISCONTINUED for development paused; WITHDRAWN for safety-driven removal. NGSI-LD temporal property."
        },
        {
          "name": "validFrom",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD temporal property: when this IP record became operationally valid."
        },
        {
          "name": "validUntil",
          "type": "xsd:dateTime",
          "optional": true
        }
      ],
      "relationships": [
        {
          "name": "suppliedBySponsor",
          "target": "Sponsor",
          "cardinality": "1..1",
          "doc": "The Sponsor that supplies / manufactures / imports this IP. Per 21 CFR 312.6 the IP supplier is regulatorily accountable for product labeling, lot tracking, and dispensation oversight."
        },
        {
          "name": "forStudy",
          "target": "Study",
          "cardinality": "0..N",
          "doc": "The Studies that use this IP. 0..N because some IPs are used across multiple studies (platform trials, basket trials, expanded-access programs)."
        },
        {
          "name": "hasLot",
          "target": "Lot",
          "cardinality": "0..N",
          "doc": "Manufacturing lots / batches of this IP. Each Lot has its own manufacturing date, expiration, release status, and accountability chain."
        },
        {
          "name": "hasKit",
          "target": "Kit",
          "cardinality": "0..N",
          "doc": "Blinded packaging units (kits) prepared from this IP. Required when isBlinded=true (SHACL invariant). Each Kit ties to a Lot and is assigned to a Participant via IRT."
        },
        {
          "name": "governedByDocument",
          "target": "Document",
          "cardinality": "0..N",
          "doc": "Documents governing this IP \u2014 Investigator's Brochure, IP handling instructions, product label, Certificate of Analysis (lot-specific), IP destruction record. Per ICH E6(R3) Section 2.7."
        }
      ],
      "ctas": [
        {
          "action": "Register IP",
          "persona": "Sponsor Regulatory / IP Manager",
          "note": "Create a new IP record with type, regulatory source (IND #), mechanism of action, blinding status."
        },
        {
          "action": "Add Lot",
          "persona": "Sponsor Manufacturing / IP Manager",
          "note": "Create a Lot sub-object with lotNumber, manufacturedDate, expirationDate, releaseDate. Required for any actual dispensation."
        },
        {
          "action": "Package Kits",
          "persona": "Sponsor Packaging / IRT Vendor",
          "note": "Create Kit sub-objects from a Lot for blinded studies; each Kit has kitNumber + treatmentAssignment (the IRT randomization code)."
        },
        {
          "action": "Update IP Status",
          "persona": "Sponsor Regulatory",
          "note": "Transition investigationalProductStatus across the development lifecycle (PLANNED \u2192 IN_DEVELOPMENT \u2192 IN_USE \u2192 DISCONTINUED / WITHDRAWN)."
        },
        {
          "action": "Recall Lot",
          "persona": "Sponsor Regulatory / Pharmacovigilance",
          "note": "When a manufacturing or safety issue surfaces, transition Lot.lotStatus to RECALLED; cascades to Kit reconciliation workflow at Sites."
        }
      ],
      "sub_objects": [
        {
          "id": "Lot",
          "role": "a manufacturing batch of the InvestigationalProduct",
          "description": "A Lot represents a single manufacturing batch of an InvestigationalProduct. Per ICH E6(R3) Section 2.7, IP must be tracked at lot level for accountability, expiry management, and recall response. The Lot carries manufacturing date, release date, expiration date, retest date (when applicable), manufacturer / facility identifiers, and lot status. Dispensation events at Visits reference the Lot used (via Visit's STRUCTURED taskValue or via Kit assignment for blinded studies).",
          "provType": "prov:Entity",
          "crosswalks": {
            "fhir": "fhir:Medication (with batch / lot identifier)",
            "sdtm": "sdtm:EX (lot tracked per dispensation row)",
            "ich": "ICH E6(R3) Section 2.7; 21 CFR 312.62 (Investigator records \u2014 drug disposition)"
          },
          "attributes": [
            {
              "name": "lotId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "lotNumber",
              "type": "xsd:string",
              "doc": "Sponsor-assigned lot identifier (e.g., 'DRX-2026-0117'). Operator-grounded \u2014 what gets printed on the IP label and tracked in pharmacy."
            },
            {
              "name": "manufacturedDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date the lot was manufactured."
            },
            {
              "name": "releaseDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date the lot was released for clinical use (post-QC / post-Certificate-of-Analysis)."
            },
            {
              "name": "expirationDate",
              "type": "xsd:date",
              "doc": "Expiration date. Hard SHACL: lots cannot be administered after expiration; lotStatus=EXPIRED requires this date <= today."
            },
            {
              "name": "retestDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date by which the lot must be re-tested (for stability-extension lots). Optional \u2014 only applies when stability data supports retest extension."
            },
            {
              "name": "manufacturer",
              "type": "xsd:string",
              "optional": true,
              "doc": "Name of the manufacturer (when distinct from suppliedBySponsor \u2014 e.g., contract manufacturer)."
            },
            {
              "name": "manufacturingFacility",
              "type": "xsd:string",
              "optional": true,
              "doc": "Manufacturing facility identifier or address."
            },
            {
              "name": "quantityProduced",
              "type": "xsd:integer",
              "optional": true,
              "doc": "Number of units produced in this lot (kits, vials, tablets \u2014 unit depends on dosageForm)."
            },
            {
              "name": "lotStatus",
              "type": "xsd:string",
              "enum": [
                "MANUFACTURING",
                "RELEASED",
                "IN_DISTRIBUTION",
                "DISTRIBUTED",
                "EXPIRED",
                "RECALLED",
                "DESTROYED"
              ],
              "_temporalProperty": true,
              "doc": "Lot lifecycle. NGSI-LD temporal property. MANUFACTURING during production; RELEASED after QC sign-off; IN_DISTRIBUTION during shipment; DISTRIBUTED when arrived at sites; EXPIRED past expiration date; RECALLED for safety / quality recall; DESTROYED post-reconciliation."
            }
          ],
          "relationships": [
            {
              "name": "governedByDocument",
              "target": "Document",
              "cardinality": "0..N",
              "doc": "Documents governing this lot \u2014 Certificate of Analysis (lot-specific), lot release record, lot destruction record."
            }
          ]
        },
        {
          "id": "Kit",
          "role": "a blinded packaging unit assigned to a Participant",
          "description": "A Kit is a single blinded packaging unit prepared from a Lot, assigned to a Participant via IRT (Interactive Response Technology). Required for blinded studies where treatment assignment is masked at the dispensation level. Each Kit carries the kit number (printed on the label), its source Lot, the treatment assignment code (the IRT-issued randomization code; the unblinding key is held separately by the IRT vendor), and lifecycle status (PACKAGED \u2192 IN_INVENTORY \u2192 DISPENSED \u2192 RETURNED \u2192 RECONCILED).",
          "provType": "prov:Entity",
          "crosswalks": {
            "fhir": "fhir:Medication (with batch + kit identifier extension)",
            "sdtm": "sdtm:EX (kit number tracked per dispensation row)",
            "ich": "ICH E6(R3) Section 2.7; ICH E9 Section 2.3 (Randomization and Blinding)"
          },
          "attributes": [
            {
              "name": "kitId",
              "type": "ngsi-ld:URI",
              "unique": true
            },
            {
              "name": "kitNumber",
              "type": "xsd:string",
              "doc": "Sponsor / IRT-assigned kit identifier (e.g., 'KIT-00042'). Operator-grounded \u2014 what gets scanned at dispensation."
            },
            {
              "name": "packagedDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date the kit was packaged from its Lot."
            },
            {
              "name": "treatmentAssignment",
              "type": "xsd:string",
              "optional": true,
              "doc": "IRT-issued treatment-assignment code. For blinded studies, this is a coded label (e.g., 'A', 'B', 'PLACEBO_GROUP_2') whose unblinding key is held separately by the IRT vendor; the foundation carries the code without the unblinding map."
            },
            {
              "name": "assignmentDate",
              "type": "xsd:date",
              "optional": true,
              "doc": "Date the kit was assigned to a Participant (typically the randomization or dispensation date)."
            },
            {
              "name": "kitStatus",
              "type": "xsd:string",
              "enum": [
                "PACKAGED",
                "IN_INVENTORY",
                "ASSIGNED",
                "DISPENSED",
                "RETURNED",
                "RECONCILED",
                "DESTROYED"
              ],
              "_temporalProperty": true,
              "doc": "Kit lifecycle. NGSI-LD temporal property. PACKAGED at packaging facility; IN_INVENTORY at site pharmacy; ASSIGNED when IRT issues to Participant (pre-dispensation); DISPENSED when handed to Participant; RETURNED when unused returned to pharmacy; RECONCILED at end-of-trial reconciliation; DESTROYED per IP destruction record."
            }
          ],
          "relationships": [
            {
              "name": "belongsToLot",
              "target": "Lot",
              "cardinality": "1..1",
              "doc": "The Lot this Kit was packaged from. Each Kit traces back to exactly one Lot for accountability."
            },
            {
              "name": "assignedToParticipant",
              "target": "Participant",
              "cardinality": "0..1",
              "doc": "The Participant the Kit is assigned to (post-IRT-assignment). 0..1 because Kits in IN_INVENTORY haven't been assigned yet. SHACL: kitStatus=ASSIGNED or DISPENSED requires this to be populated."
            }
          ]
        }
      ]
    },
    {
      "id": "Event",
      "role": "container for clinical-trial occurrences requiring tracking, reporting, or escalation",
      "description": "An Event is a single container holding occurrences related to a Study lifecycle: Adverse Event (AE), Serious Adverse Event (SAE), Protocol Deviation, Data Discrepancy, Safety Signal, Safety Report, Other Clinical Event. Per FIRST-PRINCIPLES universal-foundation posture, Event is one entity for all categories — discriminated by eventCategory enum rather than split into specialized classes. Per ICH E2A / E2B(R3) and 21 CFR 312.32, regulatory reportability is a first-class attribute with submission timeline tracking. Per ICH E6(R3) Section 6, protocol deviations carry category and impact. Other Clinical Event carries derivedFrom back to a VisitObservation when a routine observation escalates to a tracked Event.",
      "ooux_editor_note": "v0.7.0 introduction (2026-05-09): ninth and final TOP top-level. Per OOUX-locked-9 sequencing, Event closes the OOUX top-level set. Single Event entity with eventCategory enum discriminator (ADVERSE_EVENT / SERIOUS_ADVERSE_EVENT / DEVIATION / DISCREPANCY / SAFETY_SIGNAL / SAFETY_REPORT / OTHER_CLINICAL_EVENT). Universal-grade attributes (eventId, eventCategory, eventType, eventDate, description, severity, status, detectionSource, reportedBy/Date) live alongside clinical-research-specific attributes (causality, expectedness, MedDRA terms, CTCAE grade, protocolDeviationCategory, regulatoryReportable, regulatoryReportSubmitted, actionTakenWithIp, outcome) in this single shape; the upcoming namespace-refactor PR splits this into topc:Event (universal) + topcr:Event (specialization). Un-flag-misses Participant.hasAdverseEvent, Visit.hasAdverseEvent, VisitObservation.escalatedTo. Per temporal+PROV native: Event is prov:Activity (the event IS what happened); reportedBy → Person carries wasAssociatedWith; derivedFrom → VisitObservation carries wasInformedBy (operator escalation chain). Five SHACL-SPARQL domain invariants emitted by build_shacl.py (4 hard + 1 soft): SAE requires regulatoryReportable=true; ctcaeGrade only valid for AE/SAE; protocolDeviationCategory only valid for DEVIATION; regulatoryReportSubmitted=true requires regulatoryReportSubmittedDate; soft warning when regulatoryReportable=true and regulatoryReportDeadline is past with regulatoryReportSubmitted=false (overdue).",
      "provType": "prov:Activity",
      "crosswalks": {
        "fhir": "fhir:AdverseEvent (for AE/SAE) · fhir:DetectedIssue (for DISCREPANCY) · fhir:Communication (for SAFETY_REPORT) · fhir:ResearchSubject.progress (for status transitions)",
        "usdm": "usdm:Event",
        "sdtm": "sdtm:AE (Adverse Events) · sdtm:DV (Protocol Deviations) · sdtm:DD (Data Discrepancies)",
        "cdash": "cdash:AE · cdash:DV",
        "ich": "ICH E2A (Safety Reporting) · ICH E2B(R3) (Individual Case Safety Reports) · ICH E6(R3) Section 6 (Deviations) · 21 CFR 312.32 (IND Safety Reporting) · ICH E9(R1) (Estimands and missing-data discipline interacts with deviations)"
      },
      "attributes": [
        {
          "name": "eventId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "eventCategory",
          "type": "xsd:string",
          "enum": [
            "ADVERSE_EVENT",
            "SERIOUS_ADVERSE_EVENT",
            "DEVIATION",
            "DISCREPANCY",
            "SAFETY_SIGNAL",
            "SAFETY_REPORT",
            "OTHER_CLINICAL_EVENT"
          ],
          "doc": "Discriminator across the Event categories. ADVERSE_EVENT for any untoward medical occurrence; SERIOUS_ADVERSE_EVENT for SAEs (death, life-threatening, hospitalization, persistent disability, congenital anomaly, medically important — ICH E2A definition); DEVIATION for protocol deviations (ICH E6 Section 6); DISCREPANCY for data discrepancies surfaced during cleaning; SAFETY_SIGNAL for aggregate safety signals (cross-participant trends); SAFETY_REPORT for E2B(R3) Individual Case Safety Reports submitted to regulators; OTHER_CLINICAL_EVENT for catch-all escalations (e.g., an unusual VisitObservation that doesn't fit AE but warrants tracking)."
        },
        {
          "name": "eventType",
          "type": "xsd:string",
          "optional": true,
          "doc": "Free-form workflow-domain term for the specific occurrence (e.g., 'Grade 3 nausea', 'Missed visit window', 'Lab discrepancy: alkaline phosphatase'). Not a controlled vocabulary at this layer; controlled vocabulary lives in meddraPreferredTerm (for AE/SAE) or protocolDeviationCategory (for DEVIATION)."
        },
        {
          "name": "eventDate",
          "type": "xsd:dateTime",
          "doc": "When the event occurred (or, for ongoing events, when it began). NGSI-LD temporal property — events have a real-world timeline distinct from when they were reported. PROV: this is the prov:atTime of the prov:Activity.",
          "_temporalProperty": true,
          "provSemantics": "atTime"
        },
        {
          "name": "detectedDate",
          "type": "xsd:dateTime",
          "optional": true,
          "_temporalProperty": true,
          "doc": "When the event was detected (which may be later than when it occurred — e.g., a Grade 1 AE noticed retroactively at the next visit, or a discrepancy surfaced during data cleaning weeks after data entry)."
        },
        {
          "name": "reportedDate",
          "type": "xsd:dateTime",
          "optional": true,
          "_temporalProperty": true,
          "doc": "When the event was formally reported into the trial system. For SAEs, this anchors the 24-hour / 7-day / 15-day reporting clocks."
        },
        {
          "name": "description",
          "type": "xsd:string",
          "doc": "Operator-grounded narrative description. For AE/SAE this is the verbatim term; for DEVIATION the deviation narrative; for DISCREPANCY the specific data quality issue."
        },
        {
          "name": "severity",
          "type": "xsd:string",
          "enum": [
            "MILD",
            "MODERATE",
            "SEVERE",
            "LIFE_THREATENING",
            "FATAL",
            "LOW",
            "MEDIUM",
            "HIGH",
            "CRITICAL"
          ],
          "optional": true,
          "doc": "Severity grading. MILD/MODERATE/SEVERE/LIFE_THREATENING/FATAL for AE/SAE per CTCAE/ICH E2A; LOW/MEDIUM/HIGH/CRITICAL for non-clinical event categories (DEVIATION, DISCREPANCY). Mutually-exclusive scales kept in one enum for foundation simplicity; controlled-vocabulary projection at the adapter layer enforces the right scale per category."
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "REPORTED",
            "UNDER_REVIEW",
            "ASSESSED",
            "RESOLVED",
            "ONGOING",
            "CLOSED"
          ],
          "_temporalProperty": true,
          "doc": "Lifecycle state. NGSI-LD temporal property — Events transition REPORTED → UNDER_REVIEW → ASSESSED → (RESOLVED|ONGOING) → CLOSED with full audit trail."
        },
        {
          "name": "detectionSource",
          "type": "xsd:string",
          "enum": [
            "VISIT_OBSERVATION",
            "SELF_REPORT",
            "EXTERNAL_REPORT",
            "MONITORING",
            "ROUTINE_LAB",
            "DATA_CLEANING",
            "AGGREGATE_REVIEW",
            "OTHER"
          ],
          "optional": true,
          "doc": "How the Event was detected. VISIT_OBSERVATION pairs with derivedFrom (the routine observation that escalated); SELF_REPORT is participant-initiated; EXTERNAL_REPORT covers ER visits, hospitalizations reported by family/caregiver; MONITORING surfaces during CRA review; ROUTINE_LAB for lab-flagged values; DATA_CLEANING for query-driven discrepancies; AGGREGATE_REVIEW for cross-participant safety signals."
        },
        {
          "name": "identifier",
          "type": "xsd:string",
          "optional": true,
          "doc": "Workflow-issued identifier (e.g., 'AE-2026-0014', 'DEV-MSKCC-008'). Distinct from eventId (URI); identifier is the human-meaningful reference operators use in narratives and CAPAs."
        },
        {
          "name": "causality",
          "type": "xsd:string",
          "enum": [
            "UNRELATED",
            "UNLIKELY",
            "POSSIBLY",
            "PROBABLY",
            "DEFINITELY",
            "NOT_ASSESSABLE"
          ],
          "optional": true,
          "doc": "Investigator's causality assessment relative to the InvestigationalProduct. Required field for AE/SAE per ICH E2A; not applicable to DEVIATION or DISCREPANCY. The action taken with IP (actionTakenWithIp) often correlates with causality but is recorded separately."
        },
        {
          "name": "expectedness",
          "type": "xsd:string",
          "enum": [
            "EXPECTED",
            "UNEXPECTED"
          ],
          "optional": true,
          "doc": "Whether the event is expected per the Investigator's Brochure (IB). UNEXPECTED + SERIOUS + IP-related = SUSAR (Suspected Unexpected Serious Adverse Reaction) — the highest-priority regulatory reporting category per ICH E2A."
        },
        {
          "name": "regulatoryReportable",
          "type": "xsd:boolean",
          "doc": "Whether this event triggers a regulatory submission (e.g., to FDA via E2B, to EMA via EudraVigilance). SHACL invariant: SERIOUS_ADVERSE_EVENT must have regulatoryReportable=true."
        },
        {
          "name": "regulatoryReportDeadline",
          "type": "xsd:dateTime",
          "optional": true,
          "_temporalProperty": true,
          "doc": "Deadline for regulatory submission. SUSARs: 7 days for fatal/life-threatening, 15 days for other; non-SUSAR SAEs: 15 days; periodic safety reports vary. SHACL soft warning when this is in the past and regulatoryReportSubmitted is still false (overdue)."
        },
        {
          "name": "regulatoryReportSubmitted",
          "type": "xsd:boolean",
          "_temporalProperty": true,
          "doc": "Whether the regulatory report has been submitted. NGSI-LD temporal property — flips from false to true once submission lands. SHACL invariant: when true, regulatoryReportSubmittedDate must be populated."
        },
        {
          "name": "regulatoryReportSubmittedDate",
          "type": "xsd:dateTime",
          "optional": true,
          "_temporalProperty": true,
          "doc": "Date/time the regulatory report was submitted. Anchors compliance audit trails — comparing this to eventDate validates timeline compliance."
        },
        {
          "name": "meddraPreferredTerm",
          "type": "xsd:string",
          "optional": true,
          "doc": "MedDRA Preferred Term (PT) for AE/SAE coding. Controlled vocabulary; CDISC-pipeline manifest carries the active MedDRA version. Required for AE/SAE that submit to E2B."
        },
        {
          "name": "meddraSystemOrganClass",
          "type": "xsd:string",
          "optional": true,
          "doc": "MedDRA System Organ Class (SOC). Highest level in the MedDRA hierarchy; derived from PT but stored separately for query convenience and aggregate reporting."
        },
        {
          "name": "ctcaeGrade",
          "type": "xsd:string",
          "enum": [
            "GRADE_1",
            "GRADE_2",
            "GRADE_3",
            "GRADE_4",
            "GRADE_5"
          ],
          "optional": true,
          "doc": "CTCAE grading per CTCAE 5.0 (NCI Common Terminology Criteria for Adverse Events). 1=Mild, 2=Moderate, 3=Severe, 4=Life-threatening, 5=Death. SHACL invariant: ctcaeGrade only valid when eventCategory IN {ADVERSE_EVENT, SERIOUS_ADVERSE_EVENT}."
        },
        {
          "name": "actionTakenWithIp",
          "type": "xsd:string",
          "enum": [
            "NONE",
            "DOSE_REDUCED",
            "DOSE_INTERRUPTED",
            "DOSE_DISCONTINUED",
            "NEW_TREATMENT_INITIATED",
            "NOT_APPLICABLE",
            "UNKNOWN"
          ],
          "optional": true,
          "doc": "Action taken with the InvestigationalProduct in response to the event. Per ICH E2A required AE field. NOT_APPLICABLE for DEVIATION / DISCREPANCY events."
        },
        {
          "name": "outcome",
          "type": "xsd:string",
          "enum": [
            "RECOVERED",
            "RECOVERING",
            "NOT_RECOVERED",
            "RECOVERED_WITH_SEQUELAE",
            "FATAL",
            "UNKNOWN"
          ],
          "optional": true,
          "doc": "Clinical outcome of the event. Required for AE/SAE per E2A; not applicable to DEVIATION."
        },
        {
          "name": "protocolDeviationCategory",
          "type": "xsd:string",
          "enum": [
            "INCLUSION_VIOLATION",
            "EXCLUSION_VIOLATION",
            "INFORMED_CONSENT",
            "MISSED_VISIT",
            "MISSED_PROCEDURE",
            "OUT_OF_WINDOW_VISIT",
            "IP_NONCOMPLIANCE",
            "RANDOMIZATION_ERROR",
            "BLINDING_BREAK",
            "OTHER"
          ],
          "optional": true,
          "doc": "Categorization of protocol deviations per ICH E6(R3) Section 6. SHACL invariant: protocolDeviationCategory only valid when eventCategory=DEVIATION."
        },
        {
          "name": "protocolDeviationImpact",
          "type": "xsd:string",
          "enum": [
            "NONE",
            "MINOR",
            "MAJOR",
            "CRITICAL"
          ],
          "optional": true,
          "doc": "Impact assessment for DEVIATION events per ICH E6(R3). MAJOR/CRITICAL deviations require root-cause analysis and CAPA."
        },
        {
          "name": "validFrom",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD temporal property: when this Event record became operationally valid."
        },
        {
          "name": "validUntil",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "NGSI-LD temporal property: when this Event record was superseded or invalidated (e.g., reclassified after assessment)."
        }
      ],
      "relationships": [
        {
          "name": "forStudy",
          "target": "Study",
          "cardinality": "1..1",
          "doc": "The Study this Event belongs to. Required — every Event ties to exactly one Study lifecycle."
        },
        {
          "name": "forParticipant",
          "target": "Participant",
          "cardinality": "0..1",
          "doc": "The Participant the Event concerns (when applicable). 0..1 because some DEVIATION events (e.g., procedural failures, system outages) don't map to a single Participant; aggregate SAFETY_SIGNAL events may span participants and are queried via causedBy."
        },
        {
          "name": "forStudySite",
          "target": "StudySite",
          "cardinality": "0..1",
          "doc": "The StudySite where the Event occurred or was detected. Critical for site-level monitoring and CAPA scoping."
        },
        {
          "name": "duringVisit",
          "target": "Visit",
          "cardinality": "0..1",
          "doc": "The Visit during which the Event was detected (when applicable). Pairs with derivedFrom when detection happened via VisitObservation escalation."
        },
        {
          "name": "relatedToInvestigationalProduct",
          "target": "InvestigationalProduct",
          "cardinality": "0..1",
          "doc": "The IP suspected of causing or being relevant to the Event. Required for AE/SAE events where causality is being assessed; populated alongside causality and actionTakenWithIp."
        },
        {
          "name": "relatedToLot",
          "target": "Lot",
          "cardinality": "0..1",
          "doc": "Specific Lot of IP relevant to the Event. Critical for safety signals tied to a manufacturing batch (e.g., a recall trigger)."
        },
        {
          "name": "relatedToKit",
          "target": "Kit",
          "cardinality": "0..1",
          "doc": "Specific Kit involved in the Event (for blinded studies). Pairs with IP_NONCOMPLIANCE deviations and BLINDING_BREAK events."
        },
        {
          "name": "reportedBy",
          "target": "Person",
          "cardinality": "1..1",
          "doc": "The Person who reported the Event into the trial system. For AE/SAE typically the investigator or coordinator; for DEVIATION the monitor or coordinator. PROV: the event was wasAssociatedWith this Person.",
          "provSemantics": "wasAssociatedWith"
        },
        {
          "name": "assignedTo",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "The Person responsible for assessing/closing the Event (e.g., investigator for AE causality assessment, sponsor safety lead for SAE workup). PROV: prov:wasAssociatedWith with prov:hadRole assessor.",
          "provSemantics": "wasAssociatedWith"
        },
        {
          "name": "derivedFrom",
          "target": "VisitObservation",
          "cardinality": "0..1",
          "doc": "The VisitObservation this Event was escalated from (when detectionSource=VISIT_OBSERVATION). PROV: this Event was wasInformedBy that observation. The escalation chain is operator-meaningful: a routine vital-sign observation escalates to a tracked AE Event with explicit lineage.",
          "provSemantics": "wasInformedBy"
        },
        {
          "name": "partOf",
          "target": "Event",
          "cardinality": "0..1",
          "doc": "Parent Event when this Event is a sub-component (e.g., an SAE that aggregates multiple precursor AEs; a Safety Signal aggregating individual AEs). Self-reference for nesting."
        },
        {
          "name": "causedBy",
          "target": "Event",
          "cardinality": "0..N",
          "doc": "Causal predecessor Events (e.g., a SAFETY_SIGNAL caused by a cluster of AEs; a SAFETY_REPORT caused by one or more SAEs). PROV: this Event was wasInformedBy these Events.",
          "provSemantics": "wasInformedBy"
        },
        {
          "name": "reviewedBy",
          "target": "OversightBody",
          "cardinality": "0..N",
          "doc": "OversightBodies that reviewed this Event. DSMB/IDMC review SAEs and Safety Signals; IRB reviews aggregate safety reports per submitted updates; CEC adjudicates endpoint events."
        },
        {
          "name": "documentedIn",
          "target": "Document",
          "cardinality": "0..N",
          "doc": "Supporting documents — MedWatch 3500A forms, narrative documents, CIOMS forms, CAPA records, deviation reports."
        }
      ],
      "ctas": [
        {
          "action": "Report Adverse Event",
          "persona": "Investigator / Coordinator",
          "note": "Create an Event with eventCategory=ADVERSE_EVENT or SERIOUS_ADVERSE_EVENT, populate severity, eventDate, MedDRA term, CTCAE grade, causality, action with IP, outcome."
        },
        {
          "action": "Escalate to SAE",
          "persona": "Investigator / Safety Lead",
          "note": "Reclassify an existing AE Event to SERIOUS_ADVERSE_EVENT, set regulatoryReportable=true, populate regulatoryReportDeadline per E2B timeline, link parent AE via partOf."
        },
        {
          "action": "Document Protocol Deviation",
          "persona": "Coordinator / Monitor",
          "note": "Create an Event with eventCategory=DEVIATION, populate protocolDeviationCategory and protocolDeviationImpact, link to the affected Visit via duringVisit."
        },
        {
          "action": "Submit Regulatory Report",
          "persona": "Sponsor Safety / Regulatory",
          "note": "Set regulatoryReportSubmitted=true and regulatoryReportSubmittedDate; attach E2B XML or CIOMS PDF via documentedIn."
        },
        {
          "action": "Aggregate Safety Signal",
          "persona": "Sponsor Safety / Pharmacovigilance",
          "note": "Create a SAFETY_SIGNAL Event, link the constituent AE Events via causedBy, attach DSMB review via reviewedBy."
        },
        {
          "action": "Close Event",
          "persona": "Investigator / Safety",
          "note": "Transition status to CLOSED after outcome is final and any required regulatory report has been submitted. NGSI-LD temporal history preserves the lifecycle."
        }
      ]
    }
  ],
  "horizontals": [
    {
      "id": "Organization",
      "role": "corporate identity and legal hierarchy",
      "description": "The legal/business entity. Sponsor and Site (TOP top-levels) reference Organization for their corporate identity and roll-up structure. Modeled after USDM v3 Organization, with the addition of parentOrganization for explicit corporate hierarchy. Cross-industry: Organizations also represent operating companies in energy (refiners, EPCs), manufacturing (parent corp, plants, contract manufacturers), and other domains.",
      "ooux_editor_note": "Introduced in v0.2 to resolve the multi-business-unit problem (J&J vs Janssen R&D vs Innovative Medicine) and the site-network problem (Elevate Research vs its locations). USDM keeps Sponsor as a Code type on Organization; TOP keeps Sponsor as a top-level for operator UX while backing it with Organization for corporate truth.",
      "crosswalks": {
        "fhir": "fhir:Organization",
        "usdm": "usdm:Organization"
      },
      "attributes": [
        {
          "name": "organizationId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "organizationName",
          "type": "xsd:string",
          "doc": "Display name."
        },
        {
          "name": "legalName",
          "type": "xsd:string",
          "doc": "Registered legal name."
        },
        {
          "name": "organizationType",
          "type": "xsd:string",
          "enum": [
            "PARENT_CORPORATION",
            "OPERATING_COMPANY",
            "SPONSOR",
            "CRO",
            "SITE",
            "SITE_NETWORK",
            "SMO",
            "REGULATORY_AUTHORITY",
            "OVERSIGHT_BODY",
            "VENDOR",
            "LABORATORY",
            "CONTRACT_MANUFACTURER",
            "ACADEMIC_INSTITUTION",
            "GOVERNMENT",
            "OTHER"
          ],
          "doc": "Role classification (multi-valued in practice via separate role assignments). Aligns with USDM Organization.type Code."
        },
        {
          "name": "identifierScheme",
          "type": "xsd:string",
          "enum": [
            "DUNS",
            "ORCID",
            "GLN",
            "GS1",
            "FDA_FEI",
            "EMA_EUD",
            "OTHER"
          ],
          "doc": "Scheme for the identifier value. USDM-aligned."
        },
        {
          "name": "identifier",
          "type": "xsd:string",
          "doc": "Identifier value scoped by identifierScheme."
        },
        {
          "name": "legalAddress",
          "type": "xsd:object",
          "optional": true,
          "doc": "Headquarters/registered address (line1, line2, city, region, postalCode)."
        },
        {
          "name": "country",
          "type": "xsd:string",
          "doc": "ISO 3166-1 alpha-3 country code of registration."
        },
        {
          "name": "website",
          "type": "xsd:anyURI",
          "optional": true,
          "doc": "Organization website."
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "ACTIVE",
            "INACTIVE",
            "MERGED",
            "ACQUIRED",
            "DISSOLVED"
          ],
          "doc": "Lifecycle state."
        },
        {
          "name": "employeeSizeBand",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "1-10",
            "11-50",
            "51-200",
            "201-500",
            "501-1000",
            "1001-5000",
            "5001-10000",
            "10001-50000",
            "50001-100000",
            "100001+"
          ],
          "doc": "Banded employee count for the Organization. Corporate-scope fact; does not vary per Study, so lives here rather than on the per-Study Sponsor entity. Bands rather than exact counts because exact headcount is volatile and rarely needed for Sponsor portfolio analysis."
        },
        {
          "name": "fiscalYearEnd",
          "type": "xsd:string",
          "optional": true,
          "doc": "Fiscal year end as MM-DD (e.g., '12-31' for calendar year, '03-31' for many UK/Asian companies, '09-30' for US federal). Corporate-scope fact; useful for budget alignment, contract renewal cycles, and forecasting."
        },
        {
          "name": "primaryTherapeuticAreas",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated or JSON array of the Organization's portfolio therapeutic areas (oncology, cardiology, infectious disease, rare disease, etc.). Corporate-scope: Pfizer's TA spread is many; J&J Innovative Medicine's TA spread is a subset. The per-Study TA focus lives on Sponsor.primaryTherapeuticArea. Multi-value semantics: native NGSI-LD multi-value once the broker layer is in place; for the strawman emission, comma-separated string is the lowest-risk encoding."
        }
      ],
      "relationships": [
        {
          "name": "parentOrganization",
          "target": "Organization",
          "cardinality": "0..1",
          "doc": "Self-reference for corporate hierarchy. J&J Innovative Medicine.parentOrganization = J&J. Empty for root-level entities."
        },
        {
          "name": "hasChildOrganization",
          "target": "Organization",
          "cardinality": "0..N",
          "doc": "Inverse of parentOrganization. Convenience relationship for downward traversal."
        },
        {
          "name": "managesSite",
          "target": "Site",
          "cardinality": "0..N",
          "doc": "Sites operationally managed by this Organization. USDM Organization.managedSites."
        },
        {
          "name": "playsSponsorRole",
          "target": "Sponsor",
          "cardinality": "0..N",
          "doc": "Sponsor entities backed by this Organization in specific Studies."
        },
        {
          "name": "isLocatedIn",
          "target": "Country",
          "cardinality": "1..1",
          "doc": "Country of registration; flagged-missing object in OOUX v0.2.",
          "_targetMissing": "Country is a flagged-missing object in OOUX v0.2 (#57)."
        }
      ],
      "provType": "prov:Agent"
    },
    {
      "id": "Document",
      "role": "TMF / eTMF / ISF document or essential record",
      "description": "Document represents any file or formal record associated with the trial. ICH E6(R3) Appendix C is the canonical record taxonomy: records are categorized by purpose (what they contribute to under GCP) and by responsible party. The TMF Reference Model and the ISF section taxonomy are the legacy operational views that map onto R3 purposes. TOP carries both axes: essentialRecordPurpose (R3 primary) and isfSection (legacy operational view).",
      "ooux_editor_note": "v0.2.0 expansion (2026-05-08): added essentialRecordPurpose (R3 Appendix C purpose taxonomy \u2014 currently placeholder enum, full enum requires Appendix C transcription pending PDF access), responsibleParty (R3 record-owner discriminator), isfSection (legacy operational view), and richer documentType enum aligned to ISF section identifiers. R3 anchors are canonical; ISF section taxonomy is a secondary mapping for operational continuity.",
      "crosswalks": {
        "fhir": "fhir:DocumentReference",
        "usdm": "usdm:TMFDocument"
      },
      "attributes": [
        {
          "name": "documentId",
          "type": "ngsi-ld:URI",
          "unique": true
        },
        {
          "name": "documentTitle",
          "type": "xsd:string"
        },
        {
          "name": "documentType",
          "type": "xsd:string",
          "enum": [
            "PROTOCOL",
            "INVESTIGATOR_BROCHURE",
            "ICF",
            "FORM_1572",
            "IRB_APPROVAL_LETTER",
            "REGULATORY_SUBMISSION",
            "CTA",
            "CDA",
            "MTA",
            "DTA",
            "INSURANCE_CERTIFICATE",
            "SOURCE_DOCUMENT",
            "IP_HANDLING_INSTRUCTIONS",
            "IP_DESTRUCTION_RECORD",
            "BLINDING_PROCEDURES",
            "LAB_NORMAL_RANGES",
            "LAB_CERTIFICATION",
            "SAMPLE_HANDLING_MANUAL",
            "RECRUITMENT_AD",
            "TRANSLATION_CERTIFICATE",
            "DELEGATION_LOG",
            "SIGNATURE_SHEET",
            "CV",
            "TRAINING_RECORD",
            "MONITORING_REPORT",
            "AUDIT_REPORT",
            "VALIDATION_RECORD",
            "SECURITY_ASSESSMENT",
            "PROCEDURES_MANUAL",
            "SOP",
            "ESSENTIAL_RECORD_OTHER",
            "OTHER"
          ],
          "doc": "Document subtype taxonomy aligned to ISF section identifiers and TMF Reference Model zones. Operational/UX label."
        },
        {
          "name": "documentVersion",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "documentStatus",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "DRAFT",
            "IN_REVIEW",
            "APPROVED",
            "EFFECTIVE",
            "SUPERSEDED",
            "WITHDRAWN",
            "ARCHIVED"
          ],
          "doc": "Lifecycle state.",
          "_temporalProperty": true
        },
        {
          "name": "essentialRecordPurpose",
          "type": "xsd:string",
          "optional": true,
          "_partialEnum": "ICH E6(R3) Appendix C purpose taxonomy. Full enum requires Appendix C PDF transcription; placeholder values cover the seven purposes named in R3 extracts.",
          "enum": [
            "QUALIFICATION",
            "DELEGATION",
            "TRAINING",
            "IP_MANAGEMENT",
            "MONITORING",
            "DATA_HANDLING",
            "SYSTEMS_VALIDATION",
            "OTHER"
          ],
          "doc": "R3 Appendix C purpose: what this record contributes to under GCP."
        },
        {
          "name": "responsibleParty",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "INVESTIGATOR_INSTITUTION",
            "SPONSOR",
            "IRB_IEC",
            "REGULATORY_AUTHORITY",
            "VENDOR",
            "OTHER"
          ],
          "doc": "R3 Appendix C: party responsible for creating and maintaining this record."
        },
        {
          "name": "isfSection",
          "type": "xsd:string",
          "optional": true,
          "doc": "Legacy operational view: ISF section identifier (e.g., '11.1' for Signature Sheet, '14.3' for IP Accountability Log, '22.1' for Sponsor correspondences). Free-text rather than enum because ISF flavors vary (Singapore HSA, FDA, EMA all have variations)."
        },
        {
          "name": "etmfLocation",
          "type": "xsd:anyURI",
          "optional": true,
          "doc": "URI of the document in its eTMF/ISF system."
        },
        {
          "name": "creationDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "effectiveDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "expirationDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "retentionUntil",
          "type": "xsd:date",
          "optional": true,
          "doc": "Retention end date per regulatory/contractual requirements."
        },
        {
          "name": "language",
          "type": "xsd:string",
          "optional": true,
          "doc": "ISO 639-1 code."
        }
      ],
      "provType": "prov:Entity"
    },
    {
      "id": "StudySite",
      "role": "per-Study Site participation pivot \u2014 the operational join entity for Site x Study",
      "description": "StudySite captures a Site's role on a specific Study. Every per-Site-per-Study fact (siteNumber, enrollmentTarget, IRB approval status, oversight tier, activation/deactivation dates, per-Study staff delegation, per-Study Systems, per-Study contracts) lives here. StudySite is the entry point for Participants enrolled at this Site for this Study and Visit-occurrences happening at this Site for this Study. The operational hierarchy runs Site -> StudySite -> Study -> Protocol -> SOA -> Visit -> Activity. StudySite is reached by the operator clicking 'this Site on this Study' and is where most of the day-to-day workflow lives.",
      "ooux_editor_note": "v0.2.0 introduction (2026-05-08): introduced as a new horizontal under TOP commons to resolve the Site-operational-vs-per-Study-participation tension. Crosswalks to usdm:StudySite (which is itself thin in USDM v3 \u2014 id+name+description+country only). TOP carries substantially more on StudySite because the operational pivot needs the relationships USDM doesn't model. See site-planning.md for the architectural discussion. The OOUX Visit->Site and Participant->Site direct edges are corrections that surface when those top-levels lift; both should point at StudySite, not Site directly.",
      "crosswalks": {
        "usdm": "usdm:StudySite",
        "fhir": "fhir:ResearchStudy.site"
      },
      "attributes": [
        {
          "name": "studySiteId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier for this Site-Study pair."
        },
        {
          "name": "siteNumber",
          "type": "xsd:string",
          "doc": "Site number assigned by the sponsor for this Study. Distinct from Site.siteId (which is global)."
        },
        {
          "name": "studySiteStatus",
          "type": "xsd:string",
          "enum": [
            "PLANNED",
            "IN_QUALIFICATION",
            "ACTIVE",
            "ON_HOLD",
            "CLOSED"
          ],
          "doc": "Per-Study lifecycle state. R3 Section 2.6 grounds the termination/suspension framing.",
          "_temporalProperty": true
        },
        {
          "name": "activationDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date the Site was activated for this Study (Site Initiation Visit completed; first patient can be enrolled)."
        },
        {
          "name": "deactivationDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date the Site was deactivated for this Study (close-out completed). Empty for currently-active StudySite records."
        },
        {
          "name": "enrollmentTarget",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Target number of Participants for this Site for this Study."
        },
        {
          "name": "actualEnrollment",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Current count of Participants enrolled at this Site for this Study. Could be a derived attribute via SPARQL aggregation; surfaced as a stored attribute for operational view speed."
        },
        {
          "name": "lastMonitoringVisitDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "oversightTier",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "LOW",
            "MEDIUM",
            "HIGH"
          ],
          "doc": "R3 Section 3.10 risk-based monitoring tier for this Site on this Study. Drives Sponsor monitoring frequency and Audit prioritization. The same Site can be HIGH on a complex oncology trial and LOW on a simple registry \u2014 hence per-StudySite, not per-Site."
        },
        {
          "name": "recruitmentPotential",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Per-protocol estimate of recruitable Participants. Distinct from Site.totalTrialsConducted (lifetime) and Site.averageEnrollmentRate (cross-trial). R3 Section 2.2 grounds the requirement."
        },
        {
          "name": "staffingAdequate",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "Per-protocol staffing adequacy. R3 Section 2.2 \u2014 adequacy depends on protocol complexity, so per-StudySite."
        },
        {
          "name": "essentialRecordsRetentionUntil",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date until which essential records for this StudySite must be retained. Per-Study because retention requirements vary by jurisdiction x Study type."
        },
        {
          "name": "irbApprovalStatus",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "PENDING",
            "APPROVED",
            "WITH_CONDITIONS",
            "EXPIRED",
            "WITHDRAWN",
            "DENIED"
          ],
          "doc": "Current IRB approval status for this StudySite."
        },
        {
          "name": "irbApprovalDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "regulatoryAuthorizationStatus",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "NOT_REQUIRED",
            "PENDING",
            "APPROVED",
            "EXPIRED",
            "WITHDRAWN",
            "DENIED"
          ],
          "doc": "Per-Study regulatory authorization status (FDA, EMA, etc., per jurisdiction)."
        },
        {
          "name": "validFrom",
          "type": "xsd:dateTime",
          "optional": true,
          "doc": "Datetime from which this StudySite participation is operationally valid. Mirrors Sponsor's NGSI-LD-native temporal property for relationship handoffs (e.g., when a Site changes Principal Investigator mid-study)."
        },
        {
          "name": "validUntil",
          "type": "xsd:dateTime",
          "optional": true
        }
      ],
      "relationships": [
        {
          "name": "forSite",
          "target": "Site",
          "cardinality": "1..1",
          "doc": "The Site this StudySite participation belongs to."
        },
        {
          "name": "forStudy",
          "target": "Study",
          "cardinality": "1..1",
          "doc": "The Study this Site is participating in."
        },
        {
          "name": "hasPrincipalInvestigator",
          "target": "Person",
          "cardinality": "1..1",
          "doc": "The per-Study Principal Investigator at this Site. R3 Section 2.1 GCP-required. The Person must be drawn from forSite.hasStaff (SHACL invariant). Temporal handoffs use validFrom/validUntil on the relationship."
        },
        {
          "name": "delegatesAuthorityTo",
          "target": "Person",
          "cardinality": "1..N",
          "doc": "Per-Study Delegation of Authority Log roster. R3 Section 2.3.3 GCP-required. Each delegation carries role (sub-investigator, study coordinator, regulatory coordinator, pharmacist, etc.), scope, validFrom, validUntil. Each Person must be drawn from forSite.hasStaff."
        },
        {
          "name": "hasIRB",
          "target": "OversightBody",
          "cardinality": "1..N",
          "doc": "Per-Study IRB(s)/IEC(s) of record for this StudySite. 1..N for multi-IRB cases."
        },
        {
          "name": "submitsTo",
          "target": "RegulatoryAuthority",
          "cardinality": "0..N",
          "doc": "Per-jurisdiction regulatory authorities this StudySite files with. R3 Section 2.3.5 inspection right anchored here.",
          "_targetMissing": "RegulatoryAuthority is a flagged-missing horizontal in OOUX v0.2."
        },
        {
          "name": "hasContract",
          "target": "Contract",
          "cardinality": "0..N",
          "doc": "Site-level contracts for this StudySite participation: CTA, CDA, MTA, DTA, etc.",
          "_targetMissing": "Contract is a flagged-missing horizontal in OOUX v0.2."
        },
        {
          "name": "hasStudyStartupPackage",
          "target": "StudyStartupPackage",
          "cardinality": "0..1",
          "doc": "The Study Startup Package distributed to this Site for this Study.",
          "_targetMissing": "StudyStartupPackage is in OOUX v0.2 catalog but not yet in TOP source."
        },
        {
          "name": "hostsVisit",
          "target": "Visit",
          "cardinality": "0..N",
          "doc": "Visit-occurrences at this Site for this Study. Inverse of Visit.atStudySite (when Visit lifts).",
          "_targetMissing": "Visit is a top-level in OOUX (one of the locked 8) but not yet in TOP source."
        },
        {
          "name": "hasParticipant",
          "target": "Participant",
          "cardinality": "0..N",
          "doc": "Participants enrolled at this Site for this Study. The OOUX Participant->Site direct edge is a correction: should be Participant->StudySite when Participant lifts.",
          "_targetMissing": "Participant is a top-level in OOUX (one of the locked 8) but not yet in TOP source."
        },
        {
          "name": "hasMonitoringVisit",
          "target": "MonitoringVisit",
          "cardinality": "0..N",
          "doc": "Per-Study monitoring visits at this Site.",
          "_targetMissing": "MonitoringVisit is in OOUX v0.2 catalog but not yet in TOP source."
        },
        {
          "name": "hasAudit",
          "target": "Audit",
          "cardinality": "0..N",
          "doc": "Per-Study audits at this Site.",
          "_targetMissing": "Audit is in OOUX v0.2 catalog but not yet in TOP source."
        },
        {
          "name": "engagesVendor",
          "target": "Organization",
          "cardinality": "0..N",
          "doc": "Per-Study Site-engaged vendors (R3 Section 2.3.4 documented agreements). Sponsor-engaged vendors are different \u2014 those are the Sponsor's; this is the Site's per-Study direct engagement (after R3 Section 2.3 Investigator's right of acceptance/refusal)."
        },
        {
          "name": "usesLaboratory",
          "target": "Organization",
          "cardinality": "0..N",
          "doc": "Per-Study Site-engaged laboratories (Organization with organizationType=LABORATORY). Distinct from Site.usesSystem for the Site's own internal lab system."
        },
        {
          "name": "usesSystem",
          "target": "System",
          "cardinality": "0..N",
          "doc": "Per-Study Systems used at this Site participation: Sponsor-provisioned EDC, per-Study IRT, per-Study eTMF, etc. The System's three-axis pattern (operatedBy / usedBy / oversightHeldBy) on the System entity captures the GCP responsibility allocation."
        },
        {
          "name": "reportsTo",
          "target": "Sponsor",
          "cardinality": "0..N",
          "doc": "Per-Study reporting target (R3 Sections 2.7, 2.13: safety, data, noncompliance reporting from Site to Sponsor)."
        },
        {
          "name": "hasEssentialRecord",
          "target": "Document",
          "cardinality": "0..N",
          "doc": "Per-Study essential records (with Document.essentialRecordPurpose set per R3 Appendix C and Document.responsibleParty=INVESTIGATOR_INSTITUTION). Distinct from Site.hasInstitutionalDocument (study-independent institutional records)."
        },
        {
          "name": "hasEnrollment",
          "target": "Enrollment",
          "cardinality": "0..N",
          "doc": "Enrollment records at this StudySite.",
          "_targetMissing": "Enrollment is in OOUX v0.2 catalog but not yet in TOP source."
        }
      ],
      "provType": "prov:Agent"
    },
    {
      "id": "Person",
      "role": "individual involved in clinical trials",
      "description": "Person represents any individual involved in trial conduct: principal investigators, sub-investigators, study coordinators, regulatory coordinators, pharmacists, study nurses, lab techs, monitors, sponsor staff, regulators, IRB members. Persons exist independently of any specific Site or Study; their roles in specific contexts are captured via relationship targets and PersonRole assignments. USDM models AssignedPerson as nested inside StudyRole \u2014 TOP makes Person a horizontal so it can be referenced consistently across the operational chain (Site.hasStaff, StudySite.hasPrincipalInvestigator, StudySite.delegatesAuthorityTo, Sponsor.employs, OversightBody.members, Audit.auditors).",
      "ooux_editor_note": "v0.2.0 introduction (2026-05-08): lifted from OOUX Person object. Required by both Site and StudySite person relationships; could not be flagged-missing for the Site spec (R3 Section 2.3.3 GCP-required Delegation of Authority Log needs real Person targets). USDM crosswalk: usdm:AssignedPerson (the operational/participation lens) plus usdm:StudyRole (the role-typing lens). PersonRole is currently embedded as a per-relationship attribute (role enum on delegatesAuthorityTo); a separate PersonRole sub-object lifts in v0.3 if the role taxonomy grows beyond what an enum can carry.",
      "crosswalks": {
        "fhir": "fhir:Practitioner",
        "usdm": "usdm:AssignedPerson",
        "omop": "omop:PROVIDER"
      },
      "attributes": [
        {
          "name": "personId",
          "type": "ngsi-ld:URI",
          "unique": true,
          "doc": "Globally unique NGSI-LD identifier."
        },
        {
          "name": "firstName",
          "type": "xsd:string"
        },
        {
          "name": "middleName",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "lastName",
          "type": "xsd:string"
        },
        {
          "name": "title",
          "type": "xsd:string",
          "optional": true,
          "doc": "Professional title (Dr., Prof., MD, RN, PharmD, etc.)."
        },
        {
          "name": "jobTitle",
          "type": "xsd:string",
          "optional": true,
          "doc": "USDM AssignedPerson.jobTitle. The functional role at the employing Organization (e.g., Director of Clinical Research, Senior CRA, Study Coordinator)."
        },
        {
          "name": "email",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "phone",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "orcid",
          "type": "xsd:string",
          "optional": true,
          "doc": "ORCID identifier."
        },
        {
          "name": "npi",
          "type": "xsd:string",
          "optional": true,
          "doc": "US National Provider Identifier (where applicable)."
        },
        {
          "name": "preferredLanguages",
          "type": "xsd:string",
          "optional": true,
          "doc": "Comma-separated ISO 639-1 codes."
        },
        {
          "name": "gcpTrainingStatus",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "CURRENT",
            "EXPIRED",
            "NOT_REQUIRED"
          ],
          "doc": "GCP training currency. Per-Person fact independent of any Site or Study."
        },
        {
          "name": "gcpTrainingExpiry",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "ACTIVE",
            "INACTIVE",
            "RETIRED",
            "DECEASED"
          ],
          "doc": "Lifecycle state."
        }
      ],
      "relationships": [
        {
          "name": "employedBy",
          "target": "Organization",
          "cardinality": "0..1",
          "doc": "Primary employing Organization. USDM AssignedPerson.organizationId. A Person can have multiple StudySite/Sponsor relationships independent of where they're employed."
        },
        {
          "name": "hasCredential",
          "target": "Credential",
          "cardinality": "0..N",
          "doc": "Credentials this Person holds (medical license, specialty board certifications, GCP certificate, etc.)."
        },
        {
          "name": "hasTrainingRecord",
          "target": "TrainingRecord",
          "cardinality": "0..N",
          "doc": "Training records for this Person (study-specific GCP, study-specific protocol training, etc.).",
          "_targetMissing": "TrainingRecord is in OOUX v0.2 (#77) but not yet in TOP source."
        }
      ],
      "provType": "prov:Agent"
    },
    {
      "id": "System",
      "role": "computerised system used in clinical trial conduct",
      "description": "System represents a computerised system used in trial conduct: EDC, CTMS, eTMF/ISF, IRT/RTSM, safety database, EMR, ELN, eCOA/ePRO platform, eConsent platform, sample management system, etc. Systems carry their R3 Section 4.3 governance attributes (validation, security, access controls, release status, contingency plans, support) and a three-axis role pattern (operatedBy / usedBy / oversightHeldBy) that captures GCP responsibility allocation.",
      "ooux_editor_note": "v0.2.0 introduction (2026-05-08): lifted from OOUX System object. R3-aligned attribute set per Section 4.3 (procedures, training, security, validation, release, contingencies, support, user/access management). Three-axis role pattern resolves the System ownership/use/visibility question: visibility follows from oversight under R3 Section 3.9 (Sponsor) and Section 2.12 (Site); the schema captures who is GCP-responsible, and presentation follows. The System horizontal earns a dedicated v0.3 spec eventually; in v0.2 it serves Site/StudySite/Sponsor.",
      "crosswalks": {
        "fhir": "fhir:Device (where the System is a medical-device-class platform; otherwise no direct FHIR equivalent)"
      },
      "attributes": [
        {
          "name": "systemId",
          "type": "ngsi-ld:URI",
          "unique": true
        },
        {
          "name": "vendor",
          "type": "xsd:string",
          "doc": "Vendor name (e.g., 'Veeva', 'Medidata', 'Oracle', 'Castor')."
        },
        {
          "name": "productName",
          "type": "xsd:string",
          "doc": "Product name (e.g., 'Vault eTMF', 'Rave EDC', 'Siebel CTMS', 'CDMS')."
        },
        {
          "name": "instanceId",
          "type": "xsd:string",
          "optional": true,
          "doc": "Tenant or instance identifier (e.g., 'mskcc-prod', 'pfizer-tenant-7')."
        },
        {
          "name": "baseUrl",
          "type": "xsd:anyURI",
          "optional": true,
          "doc": "Base URL for the System instance. May be unpopulated when the consumer of the System record does not have access to the instance details (R3 Section 3.9 oversight-as-relationship framing)."
        },
        {
          "name": "systemType",
          "type": "xsd:string",
          "enum": [
            "EDC",
            "CTMS",
            "ETMF",
            "ISF",
            "IRT",
            "RTSM",
            "SAFETY_DB",
            "EMR",
            "ELN",
            "ECOA",
            "EPRO",
            "ECONSENT",
            "SAMPLE_TRACKING",
            "LABORATORY_INFORMATION",
            "PHARMACY_MANAGEMENT",
            "OTHER"
          ],
          "doc": "Functional system type."
        },
        {
          "name": "version",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "validatedFor21CfrPart11",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "FDA 21 CFR Part 11 validation status."
        },
        {
          "name": "validatedForEuAnnex11",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "EU EudraLex Annex 11 validation status."
        },
        {
          "name": "validationStatus",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "NOT_VALIDATED",
            "IN_VALIDATION",
            "VALIDATED",
            "REVALIDATING",
            "RETIRED"
          ],
          "doc": "R3 Section 4.3.4 validation lifecycle state."
        },
        {
          "name": "validationApproach",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "RISK_BASED",
            "FULL_VALIDATION",
            "VENDOR_QUALIFICATION_ONLY"
          ],
          "doc": "R3 Section 4.3.4 risk-based validation approach."
        },
        {
          "name": "lastValidationDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "releaseStatus",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "DEVELOPMENT",
            "UAT",
            "PRODUCTION",
            "REVALIDATING",
            "RETIRED"
          ],
          "doc": "R3 Section 4.3.5 release lifecycle."
        },
        {
          "name": "auditTrailEnabled",
          "type": "xsd:boolean",
          "optional": true,
          "doc": "R3 Section 4.2.2 audit-trail capability."
        }
      ],
      "relationships": [
        {
          "name": "operatedBy",
          "target": "Organization",
          "cardinality": "1..1",
          "doc": "The Organization that operates this System and is responsible for its R3 Section 4.3 obligations (validation, security, access controls, release, contingency, support). A Sponsor's EDC has operatedBy -> Pfizer (or Pfizer's CRO under documented agreement); a Site's local source-document repository has operatedBy -> MSKCC."
        },
        {
          "name": "usedBy",
          "target": "Organization",
          "cardinality": "0..N",
          "doc": "Organizations that use this System for trial activities. A Sponsor-operated EDC is used by both Sponsor staff and authorized Site staff; the same System has multiple usedBy triples."
        },
        {
          "name": "oversightHeldBy",
          "target": "Organization",
          "cardinality": "1..1",
          "doc": "The Organization holding GCP-mandated oversight responsibility for this System's use in trial conduct. R3 Section 3.9 (Sponsor for trial-critical Sponsor-delegated Systems) or Section 2.12 (Site for Site-internal records). For sponsor-critical Systems (EDC, CTMS, IRT, SAFETY_DB), oversightHeldBy must be a Sponsor (SHACL invariant); the IIT case where Site=Sponsor exempts via the Site.belongsToOrganization == Sponsor.belongsToOrganization equality test."
        },
        {
          "name": "proceduresDocumentRef",
          "target": "Document",
          "cardinality": "0..1",
          "doc": "R3 Section 4.3.1 procedures document."
        },
        {
          "name": "securityAssessmentRef",
          "target": "Document",
          "cardinality": "0..1",
          "doc": "R3 Section 4.3.3 security assessment."
        },
        {
          "name": "accessControlPolicyRef",
          "target": "Document",
          "cardinality": "0..1",
          "doc": "R3 Section 4.3.8 access control policy."
        },
        {
          "name": "contingencyPlanRef",
          "target": "Document",
          "cardinality": "0..1",
          "doc": "R3 Section 4.3.6 contingency / disaster-recovery plan."
        },
        {
          "name": "supportContact",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "R3 Section 4.3.7 technical support point of contact."
        }
      ],
      "provType": "prov:Entity"
    },
    {
      "id": "Log",
      "role": "operational record of events, actions, or observations",
      "description": "Log represents records of events, actions, or observations that occur during trial conduct. Logs are append-only by GCP discipline (R3 Section 4.2.2) \u2014 entries cannot be retroactively edited. Logs are distinct from Documents in that they have lifecycle behavior (entry, review, sign-off) and are inherently temporal sequences. Covers Subject Logs (ISF section 13), IP Accountability Logs (14.3), IP Storage Temperature Logs (14.5), Site Visit Logs (16.1), Sample Handling Logs (18.1), SAE Tracking Logs (19.1), Communication Logs (22), and others.",
      "ooux_editor_note": "v0.2.0 introduction (2026-05-08): lifted from OOUX Log object. Required by Site spec because ISF sections 13/14.3/14.5/16.1/18.1/19.1/22 are all log-shaped. CommunicationLog (ISF section 22 correspondences) folds in as logType=COMMUNICATION rather than as a separate horizontal \u2014 saves an entity, exercises the polysemous-verb-split discipline by keeping logType discriminator clean.",
      "crosswalks": {
        "fhir": "fhir:AuditEvent (for system-generated audit-trail logs); fhir:DocumentReference (for archival-form logs)"
      },
      "attributes": [
        {
          "name": "logId",
          "type": "ngsi-ld:URI",
          "unique": true
        },
        {
          "name": "logType",
          "type": "xsd:string",
          "enum": [
            "SUBJECT_SCREENING",
            "SUBJECT_ENROLLMENT",
            "SUBJECT_IDENTIFICATION",
            "SUBJECT_VISIT_TRACKING",
            "IP_DISPENSING",
            "IP_ACCOUNTABILITY",
            "IP_TEMPERATURE",
            "IP_STORAGE_TEMPERATURE",
            "SITE_VISIT",
            "MONITORING_VISIT",
            "SAMPLE_HANDLING",
            "SAMPLE_SHIPPING",
            "SAE_TRACKING",
            "COMMUNICATION",
            "TRAINING",
            "AUDIT_TRAIL",
            "DELEGATION",
            "TEMPERATURE_DEVIATION",
            "OTHER"
          ],
          "doc": "The log's discriminator. CommunicationLog folds in as COMMUNICATION; AuditTrail folds in as AUDIT_TRAIL."
        },
        {
          "name": "logTitle",
          "type": "xsd:string",
          "doc": "Human-readable title of the log (e.g., 'IP Storage Temperature \u2014 Freezer F-12 \u2014 2026 Q1')."
        },
        {
          "name": "openedDate",
          "type": "xsd:date"
        },
        {
          "name": "closedDate",
          "type": "xsd:date",
          "optional": true,
          "doc": "Empty for currently-active logs."
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "ACTIVE",
            "CLOSED",
            "ARCHIVED"
          ],
          "doc": "Lifecycle state."
        },
        {
          "name": "entryCount",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Count of entries in this log; aggregate signal."
        },
        {
          "name": "retentionUntil",
          "type": "xsd:date",
          "optional": true,
          "doc": "Date until which this log must be retained per regulatory/contractual requirements."
        }
      ],
      "relationships": [
        {
          "name": "forStudySite",
          "target": "StudySite",
          "cardinality": "0..1",
          "doc": "The StudySite this log belongs to. Most operational logs are per-StudySite. Empty for Site-wide logs (e.g., institutional audit trail) which use forSite instead."
        },
        {
          "name": "forSite",
          "target": "Site",
          "cardinality": "0..1",
          "doc": "The Site this log belongs to, when the log is study-independent (e.g., institutional GCP training log)."
        },
        {
          "name": "forStudy",
          "target": "Study",
          "cardinality": "0..1",
          "doc": "The Study this log belongs to, when the log is Sponsor-side and not Site-scoped."
        },
        {
          "name": "forSystem",
          "target": "System",
          "cardinality": "0..1",
          "doc": "The System this log records (e.g., audit-trail logs are System-scoped under R3 Section 4.2.2)."
        },
        {
          "name": "owner",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "The Person responsible for maintaining this log."
        },
        {
          "name": "correspondent",
          "target": "Organization",
          "cardinality": "0..N",
          "doc": "For logType=COMMUNICATION: the parties this correspondence log captures exchanges with (Sponsor, IRB, RegulatoryAuthority, central lab, vendor). 0..N because some correspondence logs aggregate across multiple parties."
        },
        {
          "name": "forEquipment",
          "target": "Equipment",
          "cardinality": "0..1",
          "doc": "The Equipment this log is about (e.g., a temperature log for freezer F-12). Distinct from forSystem which captures the monitoring System; logs about Equipment with IoT monitoring will populate both forEquipment and forSystem."
        }
      ],
      "provType": "prov:Activity"
    },
    {
      "id": "Equipment",
      "role": "physical device, instrument, or apparatus used in trial conduct",
      "description": "Equipment represents physical devices used in clinical-trial conduct: refrigerators, freezers, centrifuges, scales, ECG machines, ultrasound, blood pressure devices, glucometers, pulse oximeters, etc. Equipment is distinct from System (computerised systems): a freezer with IoT temperature monitoring is Equipment + a System (the monitoring platform), linked via Equipment.monitoredBySystem. Under R3, Equipment carries qualification, calibration, maintenance, and training discipline; computerised-systems aspects (validation, audit trails, access controls per R3 Section 4.3) live on the linked System.",
      "ooux_editor_note": "v0.2.0 introduction (2026-05-08): lifted from OOUX Equipment object. equipmentBinding enum locked from OOUX hierarchy boundary decision (SITE_BOUND, VENDOR_OWNED, PARTICIPANT_LOANED). Added equipmentClass enum to discriminate freezer vs centrifuge vs ECG vs participant-loaned wearable, etc. Added monitoredBySystem to capture the Equipment+System interaction for IoT-monitored Equipment (the freezer-with-cloud-temp-monitor pattern, ISF section 14.5). Equipment is the physical asset (calibration, maintenance, qualification); System is the computerised layer (R3 Section 4.3 obligations); Log captures the temporal trail (R3 Section 4.2.2 audit trail).",
      "crosswalks": {
        "fhir": "fhir:Device",
        "omop": "omop:DEVICE_EXPOSURE (per-use event at Visit-occurrence; Equipment entity itself has no direct OMOP table)",
        "obo": "obi:device (partial; OBI covers some equipment classes but coverage is fragmentary)"
      },
      "attributes": [
        {
          "name": "equipmentId",
          "type": "ngsi-ld:URI",
          "unique": true
        },
        {
          "name": "equipmentName",
          "type": "xsd:string",
          "doc": "Display name (e.g., 'Freezer F-12 Pharmacy', 'Eppendorf 5810R Centrifuge')."
        },
        {
          "name": "equipmentClass",
          "type": "xsd:string",
          "enum": [
            "FREEZER",
            "REFRIGERATOR",
            "CENTRIFUGE",
            "SCALE",
            "ECG_MACHINE",
            "ULTRASOUND",
            "BP_DEVICE",
            "THERMOMETER",
            "INCUBATOR",
            "AUTOCLAVE",
            "MICROSCOPE",
            "PIPETTE",
            "PH_METER",
            "SPIROMETER",
            "GLUCOMETER",
            "PULSE_OXIMETER",
            "WEARABLE",
            "INFUSION_PUMP",
            "COMPUTER",
            "PRINTER",
            "OTHER"
          ],
          "doc": "Equipment class taxonomy. Covers most clinical-trial Equipment classes including participant-loaned wearables."
        },
        {
          "name": "equipmentBinding",
          "type": "xsd:string",
          "enum": [
            "SITE_BOUND",
            "VENDOR_OWNED",
            "PARTICIPANT_LOANED"
          ],
          "doc": "OOUX-locked binding pattern: SITE_BOUND for institution-owned equipment at a Site; VENDOR_OWNED for sponsor- or vendor-supplied equipment used at a Site; PARTICIPANT_LOANED for equipment loaned to a participant (wearables, BP cuff, glucometer)."
        },
        {
          "name": "manufacturer",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "model",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "serialNumber",
          "type": "xsd:string",
          "optional": true
        },
        {
          "name": "purchaseDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "installationDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "lastCalibrationDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "nextCalibrationDueDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "calibrationFrequency",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "DAILY",
            "WEEKLY",
            "MONTHLY",
            "QUARTERLY",
            "SEMIANNUAL",
            "ANNUAL",
            "BIANNUAL",
            "ON_USE",
            "NOT_REQUIRED"
          ]
        },
        {
          "name": "lastMaintenanceDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "maintenanceSchedule",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "DAILY",
            "WEEKLY",
            "MONTHLY",
            "QUARTERLY",
            "SEMIANNUAL",
            "ANNUAL",
            "ON_DEMAND",
            "NOT_REQUIRED"
          ]
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "OPERATIONAL",
            "UNDER_MAINTENANCE",
            "OUT_OF_SERVICE",
            "RETIRED",
            "QUARANTINED"
          ],
          "doc": "Lifecycle state."
        },
        {
          "name": "locationDescription",
          "type": "xsd:string",
          "optional": true,
          "doc": "Free-text location (e.g., 'Pharmacy Room 3, second shelf'). For structured location, use atStorageLocation relationship via the StorageLocation horizontal."
        },
        {
          "name": "temperatureRange",
          "type": "xsd:object",
          "optional": true,
          "doc": "For temperature-controlled Equipment: {minTempC, maxTempC, units}. Distinct from monitored temperature readings, which live in Log entries."
        }
      ],
      "relationships": [
        {
          "name": "atSite",
          "target": "Site",
          "cardinality": "0..1",
          "doc": "The Site where this Equipment is located. Inverse of Site.hostsEquipment. 0..1 because VENDOR_OWNED equipment may move between sites; PARTICIPANT_LOANED equipment is at a Participant."
        },
        {
          "name": "atStudySite",
          "target": "StudySite",
          "cardinality": "0..N",
          "doc": "The StudySites this Equipment is dedicated to. Empty for Site-shared Equipment (a general-purpose centrifuge); populated for per-Study dedicated Equipment (a study-specific freezer)."
        },
        {
          "name": "vendor",
          "target": "Organization",
          "cardinality": "0..1",
          "doc": "The Organization that manufactured or supplies this Equipment. Organization with organizationType=VENDOR."
        },
        {
          "name": "monitoredBySystem",
          "target": "System",
          "cardinality": "0..N",
          "doc": "Computerised System(s) that monitor or control this Equipment. A pharmacy-grade freezer with cloud-based temperature logging has monitoredBySystem pointing to the IoT temperature monitor System. The Equipment-System split keeps R3 Section 4.3 obligations on the System and Equipment-qualification obligations on the Equipment."
        },
        {
          "name": "responsiblePerson",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "The Person responsible for maintaining/operating this Equipment."
        },
        {
          "name": "hasCredential",
          "target": "Credential",
          "cardinality": "0..N",
          "doc": "Equipment-level credentials: calibration certificates, validation certificates, vendor certifications."
        },
        {
          "name": "hasUserManual",
          "target": "Document",
          "cardinality": "0..1",
          "doc": "User manual document."
        }
      ],
      "provType": "prov:Entity"
    },
    {
      "id": "StorageLocation",
      "role": "addressable storage point at a Site",
      "description": "StorageLocation represents an addressable storage point: a slot in a freezer rack, a shelf in a refrigerator, a position in a sample matrix, a drawer in a secure cabinet, an offsite vault location. StorageLocation is distinct from Equipment: an Equipment freezer provides multiple StorageLocations (its slots/shelves/racks); a secure cabinet (Equipment) provides drawer StorageLocations. Some StorageLocations are not inside Equipment (an ambient-temperature shelf in a controlled-access pharmacy room).",
      "ooux_editor_note": "v0.2.0 introduction (2026-05-08): lifted from OOUX-flagged sub-object 'Storage Location (site-bound)' under the Site OOUX entry. Modeled as a horizontal because it's also referenced from Sample and InvestigationalProduct holdings; sub-object-under-Site would be too narrow. The Equipment/StorageLocation split lets a freezer (Equipment) provide many slots (StorageLocations) without conflating the two.",
      "crosswalks": {
        "fhir": "fhir:Location"
      },
      "attributes": [
        {
          "name": "storageLocationId",
          "type": "ngsi-ld:URI",
          "unique": true
        },
        {
          "name": "locationName",
          "type": "xsd:string",
          "doc": "Display name (e.g., 'Freezer F-12, Rack 3, Slot A4')."
        },
        {
          "name": "storageType",
          "type": "xsd:string",
          "enum": [
            "FREEZER_SLOT",
            "REFRIGERATOR_SHELF",
            "AMBIENT_SHELF",
            "SECURE_CABINET_DRAWER",
            "OFFSITE_VAULT",
            "PHARMACY_SHELF",
            "BIOREPOSITORY_RACK",
            "OTHER"
          ]
        },
        {
          "name": "temperatureRangeC",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "MINUS_80",
            "MINUS_20",
            "FOUR",
            "FIFTEEN",
            "ROOM_TEMP",
            "AMBIENT",
            "OTHER"
          ],
          "doc": "Standard temperature ranges in Celsius. For non-standard ranges document via the linked Equipment.temperatureRange."
        },
        {
          "name": "capacity",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Total capacity (count or volume)."
        },
        {
          "name": "capacityUnit",
          "type": "xsd:string",
          "optional": true,
          "doc": "Unit of capacity (slots, mL, etc.)."
        },
        {
          "name": "currentOccupancy",
          "type": "xsd:integer",
          "optional": true,
          "doc": "Current count of items stored."
        },
        {
          "name": "accessRestriction",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "UNRESTRICTED",
            "AUTHORIZED_ONLY",
            "PI_ONLY",
            "PHARMACY_ONLY",
            "OTHER"
          ]
        },
        {
          "name": "securityLevel",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "LOW",
            "MEDIUM",
            "HIGH"
          ]
        },
        {
          "name": "gpsCoordinates",
          "type": "xsd:string",
          "optional": true,
          "doc": "Lat/long for offsite vaults (e.g., '40.7128,-74.0060')."
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "ACTIVE",
            "DECOMMISSIONED",
            "QUARANTINED"
          ],
          "doc": "Lifecycle state."
        }
      ],
      "relationships": [
        {
          "name": "atSite",
          "target": "Site",
          "cardinality": "1..1",
          "doc": "The Site this StorageLocation belongs to. Inverse of Site.hasStorageLocation."
        },
        {
          "name": "inEquipment",
          "target": "Equipment",
          "cardinality": "0..1",
          "doc": "The Equipment this StorageLocation is housed in (when applicable). A slot in freezer F-12 has inEquipment pointing to Freezer F-12; an ambient pharmacy shelf has no inEquipment."
        },
        {
          "name": "monitoredBySystem",
          "target": "System",
          "cardinality": "0..N",
          "doc": "Computerised systems that monitor this StorageLocation (inventory tracking, slot-level temperature monitoring)."
        }
      ],
      "provType": "prov:Entity"
    },
    {
      "id": "Credential",
      "role": "qualification, certification, or accreditation held by a Person, Site, or Equipment",
      "description": "Credential represents a qualification, certification, license, or accreditation. Credentials apply polymorphically to Persons (medical licenses, GCP certificates, board certifications), Sites (CLIA certification, JCAHO accreditation, ISO 9001), and Equipment (calibration certificates, validation certificates). Each Credential carries an issuing authority, an issue/expiry window, and a verification status, plus an optional reference to the certificate Document.",
      "ooux_editor_note": "v0.2.0 introduction (2026-05-08): lifted from OOUX Credential object. Polymorphic targets (Person, Site, Equipment) modeled as separate optional relationships rather than a single polymorphic 'forSubject'; matches OOUX (Credential has 0-1 Person + 0-1 Site) and adds Equipment for equipment-level credentials (calibration certificates). SHACL invariant enforces exactly-one-target.",
      "crosswalks": {
        "fhir": "fhir:Credential (Practitioner.qualification for person-credentials)"
      },
      "attributes": [
        {
          "name": "credentialId",
          "type": "ngsi-ld:URI",
          "unique": true
        },
        {
          "name": "credentialType",
          "type": "xsd:string",
          "enum": [
            "MEDICAL_LICENSE",
            "BOARD_CERTIFICATION",
            "GCP_CERTIFICATE",
            "CITI_CERTIFICATE",
            "ACLS",
            "BLS",
            "CV",
            "CLIA_CERTIFICATION",
            "CAP_CERTIFICATION",
            "JCAHO_ACCREDITATION",
            "ISO_9001",
            "ISO_15189",
            "CALIBRATION_CERTIFICATE",
            "VALIDATION_CERTIFICATE",
            "VENDOR_CERTIFICATION",
            "INSTITUTIONAL_LICENSE",
            "OTHER"
          ]
        },
        {
          "name": "credentialNumber",
          "type": "xsd:string",
          "optional": true,
          "doc": "Identifier issued by the issuing authority."
        },
        {
          "name": "issuingAuthorityName",
          "type": "xsd:string",
          "doc": "Free-text name when the issuing authority is not modeled as an Organization (e.g., 'Texas Medical Board'); use issuingAuthorityOrg relationship for modeled authorities."
        },
        {
          "name": "issueDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "expirationDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "status",
          "type": "xsd:string",
          "enum": [
            "ACTIVE",
            "PENDING_VERIFICATION",
            "EXPIRED",
            "REVOKED",
            "SUSPENDED"
          ],
          "doc": "Lifecycle state."
        },
        {
          "name": "verificationStatus",
          "type": "xsd:string",
          "optional": true,
          "enum": [
            "NOT_VERIFIED",
            "IN_PROGRESS",
            "VERIFIED",
            "FAILED_VERIFICATION"
          ]
        },
        {
          "name": "verificationDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "lastReviewDate",
          "type": "xsd:date",
          "optional": true
        },
        {
          "name": "nextReviewDate",
          "type": "xsd:date",
          "optional": true
        }
      ],
      "relationships": [
        {
          "name": "forPerson",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "Person this Credential is held by (medical license, GCP certificate, etc.). Mutually exclusive with forSite and forEquipment in operational practice; SHACL invariant enforces exactly-one-target."
        },
        {
          "name": "forSite",
          "target": "Site",
          "cardinality": "0..1",
          "doc": "Site this Credential is held by (CLIA, JCAHO, etc.)."
        },
        {
          "name": "forEquipment",
          "target": "Equipment",
          "cardinality": "0..1",
          "doc": "Equipment this Credential is held by (calibration certificate, validation certificate)."
        },
        {
          "name": "issuingAuthorityOrg",
          "target": "Organization",
          "cardinality": "0..1",
          "doc": "The Organization issuing this Credential, when modeled (e.g., American Board of Internal Medicine). Use when the issuing authority is also referenced elsewhere; otherwise use issuingAuthorityName free-text."
        },
        {
          "name": "verifiedBy",
          "target": "Person",
          "cardinality": "0..1",
          "doc": "Person who verified this Credential."
        },
        {
          "name": "referenceDocument",
          "target": "Document",
          "cardinality": "0..1",
          "doc": "The certificate / license / attestation document file."
        }
      ],
      "provType": "prov:Entity"
    }
  ]
}
