DSP-FHIR IG — outline

The IG packages the mapping decisions into a shippable, validatable artifact: profiles that constrain R4 resources for DSP, extensions for the gaps, value sets for the enumerated DSP fields, DSP logical models + directional FML maps for executable transformation, and a canonical $graphql query that is the DSP read contract.

Download the draft IG package

Full source tree — sushi-config, FSH (profiles, extensions, logical models, value sets), all DSP ↔ FHIR FML mapping skeletons, CapabilityStatement, OperationDefinition, narrative pages, and a worked example Bundle. Ready to run through sushi + the HL7 IG Publisher.

⬇ dsp-fhir-ig.zip (draft v0.1.0)

Draft / exploratory. Not an HL7 ballot artifact. Not affiliated with Microsoft or Nuance. Released under CC0.

IG metadata

Profiles

ProfileBaseKey constraints
DspEncounterUS Core Encounter+ payload-version, external-callback-url, recording-locale, timezone extensions.
DspPatientUS Core PatientMust-support MRN; reuse USCDI genderIdentity/pronouns. (NPI is a Practitioner identifier, not a Patient one.)
DspPractitionerUS Core PractitionerMust-support NPI via identifier system http://hl7.org/fhir/sid/us-npi; qualification VS from HL7 v2-0360.
DspCompositionComposition (optionally bound to US Core Clinical Notes conventions via type)Section slicing for common DSP sections (HPI, ROS, A&P, Plan). Companion DspDocumentReference profile handles the addressable wrapper.
DspConditionUS Core Condition-Encounter-Diagnosis / Problems+ spoken-forms, transcript-turn-refs, confidence-score.
DspMedicationRequestUS Core MedicationRequest+ rendered-dosage-instruction (R5 xver), confidence-score.
DspServiceRequest-LabUS Core ServiceRequest (Lab)+ abbreviation.
DspServiceRequest-ImagingServiceRequest+ imaging-modality, imaging-views, imaging-contrast, bodysite-laterality.
DspServiceRequest-ProcedureServiceRequest+ procedure-devices.
DspServiceRequest-ReferralServiceRequestcategory=referral; performerType required.
DspServiceRequest-FollowUpServiceRequest+ return-in Duration, approximation, prn.
DspDocumentReference-TranscriptDocumentReferenceJSON attachment with structured turn array; speaker-count extension.
DspMedia-RecordingMediaAudio content; recording-source (DAXAPP/DAXKIT/…) extension.
DspProvenanceProvenanceAgent: Dragon Copilot / EHR integration / extension; activity coded.

Extensions

ExtensionContextType
payload-versionEncounter / BundleComplex: major, minor, revision, quality, metadata (key/value).
external-callback-urlEncountervalueUrl
spoken-formsAny Resource / Composition.sectionRepeating valueString (form).
transcript-turn-refsAny ResourceRepeating valueInteger (turn index) + optional valueReference to DocumentReference#turn.
confidence-scoreAny ResourcevalueDecimal 0..1.
recording-locale / timezoneEncountervalueCode / valueString.
imaging-modality / imaging-views / imaging-contrastServiceRequestCoded / string / code.
bodysite-lateralityCodeableConcept (bodySite)valueCode: right / left / bilateral / unilateral.
return-inServiceRequest (follow-up)valueDuration.
approximationDurationvalueBoolean.
procedure-devicesServiceRequestRepeating valueString (device).
rendered-dosage-instructionMedicationRequestR5 xver → valueString.
linkage-confidenceAny resourceComplex: score + level.
concept-idCodeableConceptvalueString — Dragon internal concept identity.

Logical models & FML maps

DSP is modelled as FHIR StructureDefinition(kind=logical)DspPayload, DspContext, DspTranscript, DspResource, and per-content_type submodels (DspConditionResource, DspOrderMedicationResource, DspOrderImagingResource, etc.). This makes DSP FHIR-native enough that $validate works on incoming DSP, and gives FML maps a typed source.

The draft ships executable FHIR Mapping Language skeletons for every resource mapping in both directions. Forward maps live under input/maps/dsp-to-fhir/; reverse reconstruction maps live under input/maps/fhir-to-dsp/. Partners compile with sushi or the FML compiler and execute via StructureMap/$transform on matchbox / HAPI — no bespoke per-partner converter needed.

The IG download also includes all resource profile definitions in input/fsh/profiles.fsh plus a profile catalog at input/profiles/README.md. Grounding state (R1) remains controller logic rather than FML.

ValueSets / CodeSystems

Operations & transport

  • Read: canonical $graphql query published as an IG artifact (see graphql), with Encounter/$everything and REST _include as documented fallbacks. IPS Patient/$summary is the spiritual ancestor of the canonical query — adopters should read both.
  • Write: transaction Bundle at POST [fhir-base]; entries carry ifMatch for optimistic concurrency and Provenance. $validate (against IG profiles) SHOULD be run pre-commit.
  • Standard ops the IG relies on: $validate, Encounter/$everything, CodeSystem/$lookup, ValueSet/$expand, PlanDefinition/$apply / ActivityDefinition/$apply, Patient/$match (and IG-profiled RelatedPerson/$match), Composition/$document, US Core $docref, Bulk Data $export?_since=. See operations for the full audit and worked examples.
  • Push: SubscriptionTopic (R4B/R5) https://dsp-fhir.org/SubscriptionTopic/dsp-ready triggers on encounter finalization; payload URL fires the canonical query. Use Subscription R5 Backport $events / $status for replay and liveness.
  • Callbacks: external_callback_url is the partner-supplied endpoint. The DSP spec does not prescribe an auth scheme; the IG recommends SMART on FHIR Backend Services (client-credentials with a signed JWT), mirroring Bulk Data conventions.
  • Custom operations: only one — $ground (transcript turn-join). Everything else previously drafted as a custom op resolved to an existing FHIR or IG operation. See operations.

Normative rules (the load-bearing ones)

These are the rules that protect DSP semantics from silently drifting. Unlike the operations page — which is all optional — these are SHALL.

R1 · Transcript turn-index stability

Turn indices SHALL be immutable within a DocumentReference.meta.versionId of the transcript. A re-transcription (correction, alternate model, redaction) SHALL create a new version of the DocumentReference. Any clinical resource carrying transcript-turn-refs SHALL either (a) reference the specific transcript version (DocumentReference/xyz/_history/3), or (b) be re-emitted with updated indices against the new transcript version.

Why: without this rule, integer turn-refs can silently point to different content after a transcript revision. Grounding becomes unprovable. This is the only DSP semantic that cannot survive naively.

R2 · Recording content binding

Recordings SHALL be served from a FHIR Binary endpoint on the same server that issued the Media / DocumentReference resource, and that endpoint SHALL enforce SMART on FHIR scopes appropriate to the recording's patient compartment. External signed URLs (e.g. CDN hand-offs) are permitted only via a server-issued redirect that validates the caller's token first.

Why: PHI-bearing audio sitting behind a stable public URL is a data breach waiting to happen. The rule keeps recording access within the auth boundary the rest of the resources already live in.

R3 · Payload-version negotiation

Servers SHALL advertise accepted and emitted DSP payload-version values in CapabilityStatement via the dsp-payload-versions extension on CapabilityStatement.rest. Servers SHALL NOT auto-upgrade a payload's version on read; clients ask for a specific version or accept the server default. On write, servers SHALL reject with 422 if the declared payload-version isn't in the accepted set.

Why: DSP will evolve. Silent version coercion is the fastest way to break partners in production.

R4 · Provenance per ingest

Every $dsp-ingest (or equivalent transaction) SHALL produce at least one Provenance resource whose target lists every clinical resource created or updated, and whose entity references the source transcript DocumentReference (and recording, if present). This is the traceability substrate DSP already assumes.

Conformance levels

LevelRequiresUse case
DSP-CoreProfiles + extensions + R1–R4; Read: $graphql canonical query or Encounter/$everything; Write: transaction Bundle + $validate; Terminology: $lookup + $expandFull DSP read+write partners.
DSP-ReadProfiles + extensions + R1–R3; Read: $graphql or $everythingAnalytics / downstream consumers.
DSP-PushDSP-Core + SubscriptionTopic + Subscription Backport $events/$statusReal-time partners.
DSP-BulkDSP-Read + Bulk Data $export?_since= on the patient compartmentCross-encounter analytics, CDC re-sync.