Recruit is the human in the recruitment realm — pre-consent. Separate top-level (top-level count moves 8 → 9), not a pre-consent state on Participant. Recruiter is a distinct operator role with its own workflow (ad response, pre-screening calls, eligibility pre-check, scheduling, contact attempts). Data shape is lighter than Participant — no consent, often only contact info + light eligibility flags. PHI handling differs (no full medical history; HIPAA Safe Harbor easier to maintain). Recruit→Participant transition: when Recruit consents, a Participant entity is created with convertedFromRecruit pointing back. Recruit data persists post-conversion as recruitment-funnel analytics (conversion rates per source, channel ROI).
Per first-principles.md, each operator role with a distinct workflow gets a first-class entity. The recruiter's day is operationally different from the coordinator's:
Folding the Recruit into a pre-consent participantStatus state would mean:
Separate entity solves all four.
Recruit is anchored at forStudy (1..1) and optionally at forStudySite (0..1; some Recruits enter the funnel before site assignment is finalized in multi-site studies with central recruitment routing). The Recruit→Participant transition is via convertedToParticipant (and the inverse Participant.convertedFromRecruit). The InformedConsent sub-object's existence on the Participant IS the canonical conversion event; the Recruit→Participant linkage is the operational-funnel-side trace.
| Attribute | Type | Notes |
|---|---|---|
| recruitId | NGSI-LD URI | Globally unique. |
| firstName / lastName | string · optional | Operator-grounded; identification-status-agnostic posture (same as Participant). |
| phone / email | string · optional | Often the only identifiers captured at first response. |
| preferredContactMethod | enum (5) | PHONE / EMAIL / TEXT / PORTAL / OTHER. |
| recruitStatus | enum (10) | Funnel state (NGSI-LD temporal property for trajectory queryability). See Section 5. |
| recruitmentSource | enum (11) · optional | How the Recruit entered the funnel; drives channel ROI analysis. |
| recruitmentSourceDetails | string · optional | Free-text detail (campaign ID, registry name, referring physician). |
| responseDate | date | Date Recruit first entered the funnel. |
| preScreeningOutcome | enum (4) · optional | QUALIFIED / NOT_QUALIFIED / DEFERRED / PENDING. Light recruiter assessment, not formal protocol screening. |
| preScreeningNotes | string · optional | High-level eligibility flags. Limited PHI by design. |
| contactAttempts | integer · optional | Operational metric for follow-up cadence. |
| lastContactDate | date · optional | Most recent contact attempt. |
| consentScheduled / consentAppointmentDate | boolean · date · optional | Bridges to Participant creation. |
| country / primaryLanguage | ISO codes · optional | Useful for multi-country recruitment funnel analytics + recruiter language-matching. |
| validFrom / validUntil | dateTime · optional | NGSI-LD temporal-property semantics on the entity record. |
| Relationship | Target | Card. | Notes |
|---|---|---|---|
| forStudy | Study | 1..1 | Recruits are scoped per-Study. |
| forStudySite | StudySite | 0..1 | Site assignment may not be finalized in multi-site studies with central recruitment routing. |
| recruitedBy | Person | 0..1 | The recruitment coordinator (Person) handling this Recruit. |
| convertedToParticipant | Participant | 0..1 | Inverse of Participant.convertedFromRecruit. Empty until conversion. Required when recruitStatus=CONVERTED_TO_PARTICIPANT (SHACL hard, Inv. #24). |
The recruiter's day moves Recruits along this funnel. Each state transition produces a NGSI-LD temporal-property change on recruitStatus (validFrom/validUntil bracketing) so the trajectory is queryable for funnel analytics and twin-for-enrollment downstream.
Conversion-rate analytics (a recruiter's primary metric) compute as: count(CONVERTED_TO_PARTICIPANT) / count(all Recruits with same recruitmentSource), grouped by source. Channel ROI emerges directly from the foundation.
Recruit is the operational counterpart to twin-for-enrollment — the highest-value digital-twin use case for clinical trials. Enrollment is the most expensive bottleneck (80%+ of trials miss timelines; ~30% of trial cost is recruitment-related). A patient-twin foundation enables:
Real Recruits + synthetic-Recruits-from-twin populations + historical Participants from completed trials feed a unified twin synthesizer that predicts cohort composition, recruitment timeline, and drop-out risk before the trial opens. TOP's foundation decisions made now (Recruit-as-separate-entity + twin-queryability discipline on participantStatus) are the load-bearing pre-conditions; twin synthesis itself is computational infrastructure for v0.5+ when Visit / Activity / Observation lift expands the queryability surface.
See the Participant spec § 5 (digital-twin posture) for the foundation contract and PMDT prior-art context.
| # | Severity | Constraint |
|---|---|---|
| 24 | Hard | Converted recruit needs participant. Recruit with recruitStatus=CONVERTED_TO_PARTICIPANT must have convertedToParticipant relationship populated. The terminal-funnel-success status requires the operational link to the created Participant. |
| 25 | Soft | Stalled recruit (many attempts). Recruit with contactAttempts > 5 still in {RESPONDED, CONTACTED} states should probably transition to DROPPED. Surfaces stale recruits to the recruiter for funnel hygiene. |
Mary responded to a digital ad, qualified at pre-screening, attended consent appointment. Coordinator obtained consent.
Robert qualified at pre-screening but declined at consent appointment (concerns about randomization).
Jennifer responded to an ad; recruiter has tried 6 times to reach her with no response.
"Who do I need to follow up with today?"
GET /ngsi-ld/v1/entities?type=Recruit&q=recruitedBy=="urn:ngsi-ld:Person:jones";recruitStatus=="CONTACTED","PRE_SCREENING_SCHEDULED","QUALIFIED_PENDING_CONSENT"
"Which recruitment sources are converting at the highest rate?"
GET /ngsi-ld/v1/entities?type=Recruit&q=forStudy=="urn:ngsi-ld:Study:ONCO-423" [group by recruitmentSource client-side; count CONVERTED_TO_PARTICIPANT vs total]
Client-side aggregation in v0.4; SPARQL backing query later for direct GROUP BY.
"What recruit-population characteristics for studies in this therapeutic area / geography?"
[Federated query across Studies — defer until federation lifts in v0.6+] [For now, single-Study recruit population queryable per-Study]