Interop & layering

DSP-FHIR is the write-side: ambient conversation → DSP payload → FHIR R4 artefacts. A downstream canonical patient-context store is the read-side: FHIR → copilot runtime / EHR of record. This page is the contract that keeps the two layers clean — identifiers, references, extensions, profile base, provenance, and the namespaces DSP-FHIR reserves so a downstream model can compose on top without collision.

Where DSP-FHIR sits in the stack

DSP-FHIR resources are complete-on-their-own R4 artefacts. They do not depend on any particular downstream model, and they compose cleanly into any canonical patient-context store that consumes standard FHIR.

  1. Ambient capture — microphone, speaker turns, transcript.
  2. DSP payload — Dragon Standard Payload 1.0 JSON envelope.
  3. DSP-FHIR Bundle — R4 Bundle of Encounter, Composition, orders, DocumentReferences, Provenance.
  4. Downstream canonical patient-context store — dedupes, reconciles, joins with the longitudinal record.
  5. EHR of record — persistent clinical system.

Each boundary in that chain is a standard FHIR exchange. DSP-FHIR's job is to emit resources that the next hop can ingest without custom glue — and to not quietly occupy namespaces a downstream layer will later need.

Identifier guidance

Every DSP-emitted resource SHOULD carry a stable identifier so a downstream store can dedupe across replays, re-posts, and version bumps. DSP-FHIR reserves an identifier system family under https://dsp-fhir.org/identifier/....

System URICarriesAppears on
https://dsp-fhir.org/identifier/session DSP session_id Provenance, session-scoped resources
https://dsp-fhir.org/identifier/payload DSP payload GUID (one per envelope) Bundle.identifier
https://dsp-fhir.org/identifier/source-ref Optional passthrough of an upstream source-of-truth identifier Any resource that has an upstream pedigree

Patient identifiers supplied by upstream DSP inputs (MRN, tenant-specific IDs, visit numbers) SHOULD be preserved verbatim on Patient.identifier with their original system and type. The downstream canonical store owns the mapping to its internal MRN / tenant identifier space; DSP-FHIR does not invent or normalise those.

Passthrough Patient identifier:

{
  "resourceType": "Patient",
  "id": "pat-67890",
  "identifier": [
    {
      "use": "usual",
      "type": {
        "coding": [{
          "system": "http://terminology.hl7.org/CodeSystem/v2-0203",
          "code": "MR", "display": "Medical record number"
        }]
      },
      "system": "urn:ehr:mrn:example-health",
      "value": "MRN-67890"
    },
    {
      "use": "secondary",
      "system": "https://dsp-fhir.org/identifier/source-ref",
      "value": "dsp-upstream-ref-9f3e"
    }
  ]
}

Reference style

Inside a DSP-FHIR Bundle we reference resources by urn:uuid:* so the Bundle is self-contained and order-independent. When the Bundle is POSTed to a FHIR server, the server rewrites those to relative or absolute references.

StyleExampleWhen
urn:uuid:* urn:uuid:5b9c...e3 Inside a DSP-FHIR Bundle before server ingest. Matches Bundle.entry.fullUrl.
Relative Patient/pat-67890 After server ingest, within the same FHIR base.
Absolute https://fhir.example.org/Patient/pat-67890 Cross-server reference from the downstream store to the write server.

A downstream canonical store SHOULD accept all three and normalise internally. It MUST NOT assume a DSP-FHIR Bundle has already been posted to its own FHIR base.

Extension namespace

DSP-FHIR reserves https://dsp-fhir.org/StructureDefinition/* for profiles and extensions. A downstream canonical patient-context model SHOULD NOT mint extensions under this namespace; it should carry its own canonical and either pass DSP extensions through verbatim or map them into its own shape.

ExtensionValue typePurpose
payload-versioncomplex (major/minor/revision/quality)DSP payload version carried on Bundle.meta and Encounter. Also denormalised to meta.tag.
external-callback-urlvalueUrlDSP callback endpoint on Encounter.
update-statusvalueCodeOptional DSP NEW/UPDATED/DELETED; prefer Provenance.
confidence-scorevalueDecimal (0–1)ASR / extraction confidence on orders (and any clinical assertion).
transcript-turn-refscomplex (repeating turn valueInteger)Grounding — turn indices in the referenced transcript.
spoken-formscomplex (repeating form valueString)Voice aliases for conditions, sections, orders.
search-termscomplex (repeating valueString)Synonyms / search surface for an assertion.
speaker-countvaluePositiveIntNumber of distinct speakers on a transcript DocumentReference.
recording-localevalueCode (BCP-47)Locale of the recording / transcript.
dsp-timezonevalueStringIANA timezone of the session.
dsp-tenant-organizationvalueReference(Organization)DSP tenant org (distinct from Encounter.serviceProvider).
legacy-idvalueStringDSP legacy_id on Composition.section.
rendered-dosage-instructionvalueStringR5 back-port on MedicationRequest.
abbreviationvalueStringOrder abbreviation (e.g. "CBC", "CMP") on lab ServiceRequest.
bodysite-lateralityvalueCodeLaterality on ServiceRequest.bodySite.
imaging-modalityvalueCoding (DCM)Imaging modality on ServiceRequest.
imaging-viewsvalueStringView count / description on imaging order.
imaging-contrastvalueCodeWith / without / with-and-without.
procedure-devicescomplex (repeating device valueString)Devices mentioned on a procedure order.
return-invalueDurationFollow-up window (alt to occurrenceTiming.boundsDuration).
approximationvalueBooleanMarks a Duration as approximate ("in about 2 weeks").
prnvalueBooleanPRN flag on follow-up ServiceRequest.
weight-limitcomplex (Quantity)Weight-bearing / lifting limit on activity restrictions.
linkage-confidencevalueDecimalCross-resource linkage confidence (e.g. order↔condition).
approximate-matchvalueBooleanMarks a resolved match (e.g. accompanying person) as approximate.
dsp-payload-versionscomplexAdvertised on CapabilityStatement.rest.resource.

Profile base

DSP-FHIR profiles derive from base FHIR R4, not US Core, IPA, or any other jurisdictional family. The rationale is layering: downstream consumers routinely need to stack US Core, IPA, or a national profile on top, and a formal inheritance chain through a jurisdictional profile would force double-constraint work and collide with regional variants.

In practice DSP-FHIR remains compatible with US Core on the vast majority of elements (names, identifiers, codings, must-supports), but does not formally inherit from it. Jurisdictional layering is the downstream store's concern.

Self-tagging provenance

Every DSP-originated resource carries meta.source = "dsp://..." and is referenced by a Provenance resource tied to the session. Together with the cross-cutting extensions (confidence-score, transcript-turn-refs, spoken-forms, search-terms), this is the downstream audit surface: any assertion can be filtered by confidence, re-verified against its originating transcript turn, or routed for human review without the downstream model inventing its own audit shape.

payload-version rides as a meta.tag (as well as a structured extension) so downstream stores can filter by DSP release — GET [base]/Encounter?_tag=https://dsp-fhir.org/CodeSystem/payload-version|1.0.0 — and evolve in step with DSP.

Recording payload — Media + optional Binary

DSP-FHIR references audio recordings via Media.content.url, typically an external blob URL governed by the write side. A downstream server MAY inline or re-host the payload as a Binary resource referenced by the same Media. Both patterns are conformant; the choice is an operational one about custody and retention.

  • External URL: Media.content.url = "https://blob.example.org/rec/abc.wav"
  • Re-hosted: Media.content.url = "Binary/bin-001" (or an absolute reference to the downstream server).

Out of scope for DSP-FHIR 1.0

The following resources are intentionally not emitted by DSP-FHIR 1.0. They are the downstream store's responsibility, either because they are reconciliation-shaped (not capture-shaped) or because they represent state that lives in the EHR of record.

ResourceWhy out of scope
ObservationVitals and discrete results are not dictated by DSP 1.0; they belong in the downstream EHR / context store.
DiagnosticReportLab / imaging / pathology report finalisation is downstream. DSP emits the order (ServiceRequest), not the report.
AllergyIntoleranceAllergy reconciliation is a downstream concern. Transcript-mentioned allergies ride as narrative in the Composition section and are surfaced for downstream reconciliation.
MedicationStatementDSP emits MedicationRequest (prescribing intent). "Patient reports taking X" without prescribing intent is out of scope for 1.0.
RelatedPersonCaregivers mentioned in dictation are narrative-only in 1.0; resolution to a typed resource is a downstream $match concern.
CoverageInsurance details are out of scope.
Schedule, TaskWorkflow state is a downstream concern; DSP emits the clinical intent, not the workflow tracking.
BasicDSP uses typed extensions on the appropriate resource; it never falls back to Basic.

Namespace registry

The complete set of canonical URI namespaces DSP-FHIR owns. A downstream canonical patient-context model MUST NOT mint artefacts under these paths.

NamespaceContents
https://dsp-fhir.org/StructureDefinition/*DSP extensions and profiles.
https://dsp-fhir.org/CodeSystem/*DSP code systems (terminology appendix).
https://dsp-fhir.org/ValueSet/*DSP value sets.
https://dsp-fhir.org/ConceptMap/*DSP concept maps.
https://dsp-fhir.org/StructureMap/*FML maps (DSP → FHIR transforms).
https://dsp-fhir.org/SearchParameter/*DSP search parameters (operations).
https://dsp-fhir.org/OperationDefinition/*DSP operations (currently just $ground, and an IG-profiled RelatedPerson/$match).
https://dsp-fhir.org/ActivityDefinition/*DSP-published $apply templates (e.g. dsp-follow-up-appointment).
https://dsp-fhir.org/identifier/*DSP identifier systems (see #identifiers).
The https://dsp-fhir.org base is illustrative. A real publication would mint these under an HL7-managed or vendor-owned canonical that commits to long-term resolution — but the shape of the reservation (one namespace per artefact kind, identifier systems separated from StructureDefinition) is the part a downstream model needs to respect.