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
- Canonical:
https://dsp-fhir.org/ImplementationGuide/dsp-fhir - FHIR version: 4.0.1 (R4) — core
- Cross-version dependencies:
hl7.fhir.uv.extensions.r5,hl7.fhir.uv.xver-r5.r4 - US Core: 7.0.0 — derive where USCDI v3 profiles apply (Patient, Practitioner, Encounter, Condition, MedicationRequest, ServiceRequest, DocumentReference)
- Publishing: HL7 IG Publisher, FSH (fsh-sushi)
Profiles
| Profile | Base | Key constraints |
|---|---|---|
DspEncounter | US Core Encounter | + payload-version, external-callback-url, recording-locale, timezone extensions. |
DspPatient | US Core Patient | Must-support MRN; reuse USCDI genderIdentity/pronouns. (NPI is a Practitioner identifier, not a Patient one.) |
DspPractitioner | US Core Practitioner | Must-support NPI via identifier system http://hl7.org/fhir/sid/us-npi; qualification VS from HL7 v2-0360. |
DspComposition | Composition (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. |
DspCondition | US Core Condition-Encounter-Diagnosis / Problems | + spoken-forms, transcript-turn-refs, confidence-score. |
DspMedicationRequest | US Core MedicationRequest | + rendered-dosage-instruction (R5 xver), confidence-score. |
DspServiceRequest-Lab | US Core ServiceRequest (Lab) | + abbreviation. |
DspServiceRequest-Imaging | ServiceRequest | + imaging-modality, imaging-views, imaging-contrast, bodysite-laterality. |
DspServiceRequest-Procedure | ServiceRequest | + procedure-devices. |
DspServiceRequest-Referral | ServiceRequest | category=referral; performerType required. |
DspServiceRequest-FollowUp | ServiceRequest | + return-in Duration, approximation, prn. |
DspDocumentReference-Transcript | DocumentReference | JSON attachment with structured turn array; speaker-count extension. |
DspMedia-Recording | Media | Audio content; recording-source (DAXAPP/DAXKIT/…) extension. |
DspProvenance | Provenance | Agent: Dragon Copilot / EHR integration / extension; activity coded. |
Extensions
| Extension | Context | Type |
|---|---|---|
payload-version | Encounter / Bundle | Complex: major, minor, revision, quality, metadata (key/value). |
external-callback-url | Encounter | valueUrl |
spoken-forms | Any Resource / Composition.section | Repeating valueString (form). |
transcript-turn-refs | Any Resource | Repeating valueInteger (turn index) + optional valueReference to DocumentReference#turn. |
confidence-score | Any Resource | valueDecimal 0..1. |
recording-locale / timezone | Encounter | valueCode / valueString. |
imaging-modality / imaging-views / imaging-contrast | ServiceRequest | Coded / string / code. |
bodysite-laterality | CodeableConcept (bodySite) | valueCode: right / left / bilateral / unilateral. |
return-in | ServiceRequest (follow-up) | valueDuration. |
approximation | Duration | valueBoolean. |
procedure-devices | ServiceRequest | Repeating valueString (device). |
rendered-dosage-instruction | MedicationRequest | R5 xver → valueString. |
linkage-confidence | Any resource | Complex: score + level. |
concept-id | CodeableConcept | valueString — 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
DspOrderCategory—follow-up,referral, and aliases mapped to SNOMED.DspResourceSource—dragon_copilot,ehr_integration,extension.DspRecordingSource—DAXAPP,DAXKIT.haiku,DAXKIT.teams,PMM.DspPayloadQuality— the 5-value quality enum.DspSpeakerRole—clinician,other.
Operations & transport
- Read: canonical
$graphqlquery published as an IG artifact (see graphql), withEncounter/$everythingand REST_includeas documented fallbacks. IPSPatient/$summaryis the spiritual ancestor of the canonical query — adopters should read both. - Write:
transactionBundle atPOST [fhir-base]; entries carryifMatchfor optimistic concurrency andProvenance.$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-profiledRelatedPerson/$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-readytriggers on encounter finalization; payload URL fires the canonical query. Use Subscription R5 Backport$events/$statusfor replay and liveness. - Callbacks:
external_callback_urlis 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
| Level | Requires | Use case |
|---|---|---|
| DSP-Core | Profiles + extensions + R1–R4; Read: $graphql canonical query or Encounter/$everything; Write: transaction Bundle + $validate; Terminology: $lookup + $expand | Full DSP read+write partners. |
| DSP-Read | Profiles + extensions + R1–R3; Read: $graphql or $everything | Analytics / downstream consumers. |
| DSP-Push | DSP-Core + SubscriptionTopic + Subscription Backport $events/$status | Real-time partners. |
| DSP-Bulk | DSP-Read + Bulk Data $export?_since= on the patient compartment | Cross-encounter analytics, CDC re-sync. |