TOP / InvestigationalProduct / spec / v1
2026-05-09 · backed by source/top-strawman.json (v0.6.0-strawman) · eighth top-level · universal IP for DRUG / BIOLOGIC / DEVICE / DIAGNOSTIC / COMBINATION_PRODUCT / OTHER · Lot + Kit sub-objects · 4 new SHACL invariants (40 total)

1.TL;DR universal IP entity · Lot + Kit sub-objects · dispensation lives as Visit Activity

InvestigationalProduct (IP) is the substance, biologic, device, or combination under investigation. Per first-principles.md universal-foundation posture, IP is one TOP entity covering all product types — investigationalProductType enum (DRUG / BIOLOGIC / DEVICE / DIAGNOSTIC / COMBINATION_PRODUCT / OTHER) is the operator-grounded discriminator, NOT a shape discriminator. IP supply chain modeled via two sub-objects: Lot (per-batch manufacturing identity, expiration, release status) and Kit (per-blinded-packaging-unit, IRT-assigned to Participant). Dispensation events live as Visit Activities (activityType=IP_ADMINISTRATION with STRUCTURED taskValue carrying dose/lot/kit references) — no separate Dispensation entity needed; the universal Visit > Activity > Task foundation from v0.5 covers it cleanly. PROV: IP / Lot / Kit are prov:Entity (defined artifacts). Un-flag-misses Sponsor.supplies + Study.suppliesInvestigationalProduct.

2.Architectural anchor

Sponsor (supplies) │ ▼ InvestigationalProduct ├─ hasLot → Lot[*] (manufacturing batches) │ │ │ └─ governedByDocument → Document (Certificate of Analysis, etc.) │ ├─ hasKit → Kit[*] (blinded packaging units) │ ├─ belongsToLot → Lot │ └─ assignedToParticipant → Participant (when IRT-assigned) │ └─ governedByDocument → Document (Investigator's Brochure, IP handling instructions, label) Dispensation events (where IP gets administered) live as: Visit > Activity (activityType=IP_ADMINISTRATION) > Task (STRUCTURED taskValue with dose/route/lot/kit references) — universal foundation, no specialization.

The IP's responsibility chain runs from Sponsor (supplies, regulatorily accountable per 21 CFR 312.6) → Lot (manufacturing batch with expiry / release / lot status) → Kit (blinded packaging unit assigned to a Participant via IRT). Per ICH E6(R3) Section 2.7 and 21 CFR 312.62, this chain is required for IP accountability and recall response.

3.Universal IP — one shape for all product types

Per FIRST-PRINCIPLES universal-foundation posture, the same TOP entity shape handles drugs, biologics, devices, diagnostics, and combination products. Specialization is content (investigationalProductType + biomedicalConceptCode + dosageForm + routeOfAdministration + mechanismOfAction), never entity shape.

investigationalProductTypeExamplebiomedicalConceptCodedosageFormroute
DRUGAspirin 100mg tabletNCIt:C287 (Aspirin)TABLETORAL
BIOLOGICDrug X (anti-PD-L1 mAb)NCIt:C172310INFUSIONIV
BIOLOGICBioCar-T (CD19 CAR-T)NCIt:C147156INFUSIONIV
DEVICECardiac Monitor v3SNOMED:706687002DEVICE
DIAGNOSTICCompanion IVD assay(LOINC)
COMBINATION_PRODUCTDrug-eluting stentSNOMED:715974005DEVICE+DRUG

The foundation doesn't know the type-specific specifics. External systems (electronic Drug Master Files, device databases, IRT systems) hold implementation specifics; TOP holds the universal trial-conduct-realm reference and the supply-chain accountability (Lot, Kit, Sponsor).

4.Model summary

InvestigationalProduct attributes (~16)

AttributeTypeNotes
investigationalProductIdNGSI-LD URIGlobally unique
investigationalProductNamestringOperator-friendly name
genericName / brandNamestring · optionalWhen applicable
investigationalProductTypeenum (6) — DRUG / BIOLOGIC / DEVICE / DIAGNOSTIC / COMBINATION_PRODUCT / OTHEROperator-grounded discriminator (sort/filter only, NOT a shape discriminator)
mechanismOfActionstring · optionale.g., "PD-L1 checkpoint inhibitor"
dosageFormstring · optionalTABLET / INJECTION / INFUSION / DEVICE / etc.
routeOfAdministrationstring · optionalORAL / IV / IM / SC / TOPICAL / etc.
strengthstring · optionale.g., "200 mg/vial"
isBlindedbooleanTrue requires hasKit (SHACL #37)
regulatoryStatusenum (5) — INVESTIGATIONAL / APPROVED_OFF_LABEL / EXPANDED_ACCESS / MARKETED_COMPARATOR / OTHER
regulatorySourcestring · optionale.g., "FDA IND #154321"
biomedicalConceptCodestring · optionalNCIt / SNOMED / RxNorm / UNII reference
investigationalProductStatusenum (5) — PLANNED / IN_DEVELOPMENT / IN_USE / DISCONTINUED / WITHDRAWNNGSI-LD temporal property
validFrom / validUntildateTime · optionalOperational validity bracket

InvestigationalProduct relationships (5)

RelationshipTargetCard.Notes
suppliedBySponsorSponsor1..1Per 21 CFR 312.6: the Sponsor is regulatorily accountable for IP labeling, lot tracking, and dispensation oversight
forStudyStudy0..N0..N for platform / basket / expanded-access products used across multiple studies
hasLotLot0..NManufacturing batches
hasKitKit0..NRequired when isBlinded=true (SHACL #37)
governedByDocumentDocument0..NIB, IP handling instructions, label, lot CoA

Sub-object: Lot (~10 attrs)

AttributeTypeNotes
lotIdNGSI-LD URI
lotNumberstringSponsor-assigned (e.g., "DRX-2026-0117")
manufacturedDate / releaseDate / expirationDate / retestDatedateManufacturing lifecycle dates
manufacturer / manufacturingFacilitystring · optionalManufacturer identification
quantityProducedinteger · optionalNumber of units
lotStatusenum (7) — MANUFACTURING / RELEASED / IN_DISTRIBUTION / DISTRIBUTED / EXPIRED / RECALLED / DESTROYEDNGSI-LD temporal property; SHACL #39 (soft) and #40 (hard) enforce expiry consistency

Sub-object: Kit (~7 attrs / 2 rels)

AttributeTypeNotes
kitIdNGSI-LD URI
kitNumberstringSponsor / IRT-assigned
packagedDatedate · optional
treatmentAssignmentstring · optionalIRT-issued treatment-assignment code (e.g., "TREATMENT_A"); the unblinding key is held separately by the IRT vendor
assignmentDatedate · optionalDate IRT assigned the kit to a Participant
kitStatusenum (7) — PACKAGED / IN_INVENTORY / ASSIGNED / DISPENSED / RETURNED / RECONCILED / DESTROYEDNGSI-LD temporal property; SHACL #38 enforces ASSIGNED/DISPENSED → assignedToParticipant populated
belongsToLot → Lot (1..1)relationshipEach Kit traces to exactly one Lot
assignedToParticipant → Participant (0..1)relationshipEmpty until IRT assignment

5.Architectural decisions

Decision 1 — Single IP entity with type discriminator (universal foundation)

Per FIRST-PRINCIPLES universal-foundation posture: don't split into separate Drug / Biologic / Device entities. One TOP entity with investigationalProductType enum carries the operator-grounded discrimination. Same architectural moat as Activity + Task in v0.5 and OversightBody in v0.5.1: standards-up vendors model N entity types per product family; TOP carries one universal pattern.

Decision 2 — Lot + Kit as sub-objects (not separate horizontals)

Lot and Kit lifecycles are bound to the parent IP. Their identity is hierarchical: IP / Lot / Kit. Per the established sub-object pattern (consistent with Sponsor's Lot / Study's Arm / Visit's Activity), they live as sub-objects under IP. A Lot can't exist without an IP; a Kit can't exist without a Lot.

Decision 3 — No separate Dispensation entity

Dispensation events (where IP gets administered to a Participant) live in the universal Visit > Activity > Task foundation from v0.5: an Activity with activityType=IP_ADMINISTRATION, plus a Task with taskValueType=STRUCTURED carrying the dose/route/lot/kit reference. Per universal-foundation posture, no specialized DispensationRecord entity. The Task can reference Lot and Kit by URI for accountability.

Decision 4 — Blinding handled via Kit sub-object + IRT integration

IP.isBlinded=true requires the Kit sub-object pattern (SHACL #37). Each Kit carries the IRT-issued treatmentAssignment code; the unblinding key is held separately by the IRT vendor (TOP doesn't carry the unblinding map — that's a deployment-edge security boundary). For open-label studies, isBlinded=false and dispensation Activities reference Lot directly via Task.taskValue without Kit indirection.

Decision 5 — PROV typing: prov:Entity for IP / Lot / Kit (defined artifacts)

IP is the artifact under investigation; Lot is a manufacturing batch; Kit is a packaging unit. All are prov:Entity in PROV terms. The dispensation Activity (in Visit) is prov:Activity that prov:used the Lot/Kit (the kit is consumed in the act of dispensation). PROV chain queries: "which kits did Maria receive at which visits, from which lots, manufactured when?" assemble cleanly from foundation triples.

6.SHACL invariants 4 new (40 total)

#SeverityConstraint
37HardBlinded IP requires kits. IP with isBlinded=true must have at least one hasKit. Blinded studies require kit-level packaging for masking.
38HardAssigned/dispensed kit needs participant. Kit with kitStatus in {ASSIGNED, DISPENSED} must have assignedToParticipant populated.
39SoftPast-expiry lot should be flagged. Lot with expirationDate in the past should have lotStatus in {EXPIRED, RECALLED, DESTROYED}.
40HardEXPIRED status requires past expiry. Lot with lotStatus=EXPIRED must have expirationDate populated and in the past.

7.Cross-walks FHIR / SDTM / USDM · projection-edge documentation

TOP entityFHIR R5SDTMUSDMICH
InvestigationalProductMedicationKnowledge (drugs/biologics); DeviceDefinition (devices); Substance (raw substances)(define.xml SUPPDM or vendor extension)StudyIntervention + AdministrableProductICH E6(R3) §2.7; 21 CFR 312.6
LotMedication (with batch lotNumber + expirationDate)EX (lot tracked per dispensation row)(implicit in StudyIntervention's batch tracking)21 CFR 312.62 (Investigator records — drug disposition)
KitMedication (with batch + kit identifier extension)EX (kit number tracked per dispensation row)(implicit; IRT manages kit-to-treatment mapping)ICH E9 §2.3 (Randomization and Blinding)
Dispensation eventMedicationAdministrationEX (Exposure)(captured at runtime, not in USDM)ICH E6(R3) §2.7

Key insight: TOP doesn't have a separate Dispensation entity because the universal Visit > Activity > Task foundation handles it. The Activity (activityType=IP_ADMINISTRATION) projects to FHIR MedicationAdministration and SDTM EX rows; the Task carries the structured dose/route/lot/kit data. The PROV chain assembles automatically.

8.Stress-test scenarios

Blinded biologic with IRT kit assignment
Common case

Drug X (anti-PD-L1 mAb, IV infusion) is blinded; kits assigned via IRT to Maria at C1D1.

IP (investigationalProductType=BIOLOGIC, isBlinded=true) with one Lot (DRX-2026-0117, lotStatus=DISTRIBUTED, expirationDate=2027-07-15) and one Kit (KIT-00042, treatmentAssignment="TREATMENT_A", kitStatus=DISPENSED, assignedToParticipant=Maria, belongsToLot=DRX-2026-0117). The dispensation Activity at Maria's C1D1 Visit (activityType=IP_ADMINISTRATION) carries a Task with STRUCTURED taskValue containing dose=200mg, route=IV, lot reference, kit reference. SHACL #37 + #38 satisfied. (Mirrored in worked example.)
Open-label drug, no kits required
Open-label

An open-label Phase 2 study uses Drug Y (oral tablet); no blinding, no IRT kit assignment.

IP (investigationalProductType=DRUG, isBlinded=false) with one or more Lots; NO Kit sub-objects (SHACL #37 doesn't apply because isBlinded=false). Dispensation Activities reference the Lot directly via Task.taskValue STRUCTURED content (dose, lot reference, no kit).
Lot recall — safety-driven retirement
Recall

Manufacturing investigation surfaces a contamination issue with Lot DRX-2026-0117. Sponsor recalls.

Lot.lotStatus transitions DISTRIBUTED → RECALLED. NGSI-LD temporal property captures the trajectory (validFrom for the new RECALLED state). All Kits packaged from this Lot need reconciliation: Kit.kitStatus transitions to RETURNED for unused kits, RECONCILED for accountability sign-off. Cross-Lot query "show me all Kits from this Lot and their current status" is a foundation traversal.
PROV chain — chain of custody for a single dispensation
Provenance

A regulator asks: "show me the full chain of custody for the Drug X dose Maria received at C1D1."

SPARQL traverses: Visit.hasActivity (IP_ADMINISTRATION) → Activity.prov:wasAssociatedWith (administering Person) + Activity.prov:used (infusion equipment, with calibration credential) → Activity.hasTask → Task with STRUCTURED taskValue → kit reference → Kit.belongsToLot → Lot (with manufacturedDate, releaseDate, expirationDate, manufacturer) → Lot back to IP (suppliedBySponsor). Full chain assembles from foundation triples — no audit-log join. This is the v0.5 chain-of-custody view extended to IP supply chain.

9.Open issues

  1. IRT system integration. Kit.treatmentAssignment is a free-text code; the unblinding key is held by the IRT vendor outside TOP. When IRT integration becomes operational, an adapter projects TOP Kit ↔ IRT API for assignment events.
  2. IP destruction record (Document linkage). Lot.lotStatus=DESTROYED implies an IP destruction record exists; the governedByDocument relationship links it to a Document with documentType=IP_DESTRUCTION_RECORD. SHACL invariant could enforce this when needed (deferred).
  3. Multi-IP combination products. Combination products (drug-eluting stents, drug-device combinations) have multiple component IPs. Currently a single IP entity carries the combination; explicit component-IP relationships could lift in v0.7+ if combination-product workflows force it.
  4. Storage temperature / cold-chain integration. Per the v0.4.1 chain-of-custody mock-up, cold-chain monitoring (temperature logs during shipment and at site) is the Equipment + Log foundation. IP doesn't directly carry storage requirements — they live on the linked Equipment / StorageLocation entities. When the Equipment.calibrationStatus enrichment lands, IP storage requirements become queryable via foundation traversal.