{
  "resourceType": "StructureDefinition",
  "id": "digidot-Observation-no",
  "url": "https://novari.no/fhir/digidot/StructureDefinition/digidot-Observation-no",
  "version": "0.4.0-test",
  "name": "DigidotObservationNo",
  "title": "DigiDot Observation (NO)",
  "status": "draft",
  "date": "2026-09-08",
  "publisher": "Novari AS - DigiDOT",
  "description": "Draft profile for dental measurements, assessments and calculated results. The shared inline Dental BodySite fields identify the result site. A SNOMED CT primary coding with a known site requires a matching SCTpost expression; governed local Observation codes remain an explicit mapping exception.",
  "purpose": "Use this profile for dental measurements, assessment results, patient-reported scores and calculated indicators. Record the result together with the patient and required Encounter context, plus time, performer, method and referenced anatomy when known. Use Condition for a clinically significant finding, diagnosis or problem; an Observation can provide the measurement or assessment evidence for that Condition. Generate bodySite and the anatomical portion of SCTpost from the same anatomical input and validate equal scope before accepting the dual representation. Local Observation codes await a governed SNOMED mapping and explicitly do not claim dual representation.",
  "fhirVersion": "4.0.1",
  "kind": "resource",
  "abstract": false,
  "type": "Observation",
  "baseDefinition": "http://hl7.org/fhir/StructureDefinition/Observation",
  "derivation": "constraint",
  "differential": {
    "element": [
      {
        "id": "Observation",
        "path": "Observation",
        "short": "Dental measurement, assessment result, patient-reported score or calculated indicator",
        "constraint": [
          {
            "key": "obs-result-or-absent-reason",
            "severity": "error",
            "human": "A DigiDOT Observation must contain one result value or one standard data absent reason.",
            "expression": "value.exists() or dataAbsentReason.exists()"
          },
          {
            "key": "observation-anatomy-requires-expression",
            "severity": "error",
            "human": "Known anatomy requires an actual anatomical SCTpost expression for a SNOMED CT primary coding. A local Observation code is a documented mapping exception, not postcoordination.",
            "expression": "bodySite.empty() or code.coding.where(id = 'primary').system != 'http://snomed.info/sct' or code.coding.where(id = 'SCTpost').code.matches('[:=]|[{}]')"
          },
          {
            "key": "observation-anatomy-same-release",
            "severity": "error",
            "human": "When bodySite is populated, SNOMED CT clinical codings use the same release as the inline anatomical value.",
            "expression": "bodySite.empty() or code.coding.where(system = 'http://snomed.info/sct').all(version = 'http://snomed.info/sct/51000202101/version/20260715')"
          }
        ]
      },
      {
        "id": "Observation.implicitRules",
        "path": "Observation.implicitRules",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "The Central Storage representation follows the published DigiDOT profile and does not use resource-specific implicit rules."
      },
      {
        "id": "Observation.contained",
        "path": "Observation.contained",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "Central Storage uses independently identifiable and searchable resources. Supporting resources must be stored separately and referenced through an agreed profile relationship."
      },
      {
        "id": "Observation.extension",
        "path": "Observation.extension",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "No named and governed Observation extension is in scope. A future extension requires a documented use case and an explicit profile change."
      },
      {
        "id": "Observation.modifierExtension",
        "path": "Observation.modifierExtension",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "Modifier extensions can change the meaning of an Observation and require every consumer to understand them. No modifier extension is defined for the current DigiDOT scope."
      },
      {
        "id": "Observation.identifier",
        "path": "Observation.identifier",
        "short": "Business identifier for the observation",
        "definition": "Use identifier to retain a stable source EHR business identifier when it exists. It supports traceability, de-duplication and idempotent import; it is not the local FHIR resource id.",
        "mustSupport": true
      },
      {
        "id": "Observation.basedOn",
        "path": "Observation.basedOn",
        "short": "Planned or requested service that this observation fulfils",
        "definition": "Use basedOn when the observation fulfils a planned, proposed or requested dental service, examination or assessment. When known, reference DigiDOT ServiceRequest.",
        "type": [
          {
            "code": "Reference",
            "targetProfile": [
              "https://novari.no/fhir/digidot/StructureDefinition/digidot-ServiceRequest-no"
            ]
          }
        ],
        "mustSupport": true
      },
      {
        "id": "Observation.partOf",
        "path": "Observation.partOf",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "Use Encounter for the dental contact and DiagnosticReport.result for an agreed imaging or diagnostic report relationship. No Observation.partOf relationship is currently modelled for Central Storage."
      },
      {
        "id": "Observation.status",
        "path": "Observation.status",
        "min": 1,
        "max": "1",
        "short": "Lifecycle status for the observation",
        "definition": "Use final for a stable clinical result. Other valid FHIR Observation statuses remain available for preliminary, corrected, entered-in-error or migrated data when that lifecycle is known.",
        "mustSupport": true
      },
      {
        "id": "Observation.category",
        "path": "Observation.category",
        "min": 0,
        "max": "1",
        "short": "Optional standard category marker for the observation",
        "definition": "Use Observation.category as an optional standard marker for searching, sorting, display and comparison across systems. It is not the clinical observation code and does not replace Observation.code.",
        "binding": {
          "strength": "required",
          "description": "When Observation.category is included, use one code from the standard FHIR Observation category value set.",
          "valueSet": "http://terminology.hl7.org/ValueSet/observation-category"
        }
      },
      {
        "id": "Observation.category.extension",
        "path": "Observation.category.extension",
        "max": "0",
        "short": "No extensions on the observation category",
        "definition": "The category is a single standard interoperable marker. Extensions on Observation.category are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.category.coding",
        "path": "Observation.category.coding",
        "min": 1,
        "max": "1",
        "short": "Standard FHIR Observation category coding",
        "definition": "When Observation.category is populated, use exactly one coding from the standard FHIR Observation category code system.",
        "patternCoding": {
          "system": "http://terminology.hl7.org/CodeSystem/observation-category"
        }
      },
      {
        "id": "Observation.code",
        "path": "Observation.code",
        "short": "Observable entity",
        "definition": "Record what was measured, assessed or calculated. Include one primary coding and one SCTpost slot. Prefer a SNOMED CT observable entity; only the specific governed local Observation codes are also allowed. With a SNOMED CT primary code and populated bodySite, SCTpost must be an actual SNOMED CT expression with exactly the same anatomical scope. If no site or further refinement is represented, the SNOMED primary may be copied as the fallback. For a governed local primary, SCTpost repeats that local coding and is explicitly not SNOMED postcoordination; a governed mapping remains necessary before claiming dual representation.",
        "min": 1,
        "constraint": [
          {
            "key": "obs-sctpost-expression-or-fallback",
            "severity": "error",
            "human": "SCTpost must contain a versioned postcoordinated SNOMED CT expression paired with a precoordinated SNOMED CT primary coding, or repeat the primary system, version and code exactly.",
            "expression": "(coding.where(id = 'SCTpost').code.matches('[:=]|[{}]') and coding.where(id = 'primary').system = 'http://snomed.info/sct' and coding.where(id = 'primary').code.matches('^[0-9]{6,18}$') and coding.where(id = 'SCTpost').system = 'http://snomed.info/sct' and coding.where(id = 'SCTpost').version.matches('^http://snomed[.]info/sct/.*/version/[0-9]{8}$')) or (coding.where(id = 'SCTpost').system = coding.where(id = 'primary').system and coding.where(id = 'SCTpost').code = coding.where(id = 'primary').code and coding.where(id = 'SCTpost').version.exists() = coding.where(id = 'primary').version.exists() and (coding.where(id = 'SCTpost').version.empty() or coding.where(id = 'SCTpost').version = coding.where(id = 'primary').version))"
          }
        ],
        "binding": {
          "strength": "extensible",
          "description": "Use a SNOMED CT observable entity when it covers the intended observation. The value set also includes the small, governed DigiDOT code list for specific calculated and local observation concepts.",
          "valueSet": "https://novari.no/fhir/digidot/ValueSet/digidot-observation-codes"
        },
        "mustSupport": true
      },
      {
        "id": "Observation.code.extension",
        "path": "Observation.code.extension",
        "max": "0",
        "short": "No extensions on the clinical observation code",
        "definition": "Additional SNOMED CT precision is represented by the agreed SCTpost coding in Observation.code.coding. Extensions on Observation.code are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.code.coding",
        "path": "Observation.code.coding",
        "slicing": {
          "discriminator": [
            {
              "type": "value",
              "path": "id"
            }
          ],
          "rules": "closed"
        },
        "min": 2,
        "max": "2",
        "short": "Exactly one primary coding and one required SCTpost or fallback coding",
        "definition": "Exactly two codings are required. The primary slice contains a directly usable SNOMED CT observable entity or one approved DigiDOT local observation code. SCTpost contains a valid SNOMED CT compositional-grammar expression when a SNOMED CT primary coding exists and the expression adds material precision. Otherwise SCTpost repeats the primary system, version and code exactly. The coding element ids identify the two slots for validation; they do not change clinical meaning."
      },
      {
        "id": "Observation.code.coding:primary",
        "path": "Observation.code.coding",
        "sliceName": "primary",
        "min": 1,
        "max": "1",
        "short": "Required primary observation coding",
        "definition": "Use a precoordinated SNOMED CT observable entity whenever SNOMED CT represents what was observed. A governed DigiDOT local code is permitted only for a specific calculated or local observation concept included in the DigiDOT Observation codes ValueSet. A SNOMED CT primary coding must contain the SNOMED CT system, published edition release URI and a numeric concept identifier.",
        "type": [
          {
            "code": "Coding"
          }
        ],
        "constraint": [
          {
            "key": "obs-primary-governed-code",
            "severity": "error",
            "human": "The primary coding must be a versioned precoordinated SNOMED CT concept or one governed DigiDOT local observation code.",
            "expression": "(system = 'http://snomed.info/sct' and version.matches('^http://snomed[.]info/sct/.*/version/[0-9]{8}$') and code.matches('^[0-9]{6,18}$')) or (system = 'https://novari.no/fhir/digidot/CodeSystem/digidot-observation-codes' and (code = 'dmft-index' or code = 'dmfs-index' or code = 'dental-pain-score' or code = 'dental-radiographic-assessment'))"
          }
        ],
        "mustSupport": true,
        "binding": {
          "strength": "extensible",
          "description": "Use a SNOMED CT observable entity when it covers the intended observation. Otherwise use only one of the specific governed DigiDOT local observation codes in this ValueSet.",
          "valueSet": "https://novari.no/fhir/digidot/ValueSet/digidot-observation-codes"
        }
      },
      {
        "id": "Observation.code.coding:primary.id",
        "path": "Observation.code.coding.id",
        "short": "Primary slot identifier",
        "definition": "Fixed technical identifier for the primary coding slot. It enables unambiguous slicing when SCTpost repeats the same coding as fallback. When bodySite is populated with a SNOMED CT primary coding, the anatomy invariant requires a real SCTpost expression and the shared terminology check requires exact anatomical scope. A local Observation coding is a documented mapping exception.",
        "min": 1,
        "fixedString": "primary"
      },
      {
        "id": "Observation.code.coding:primary.extension",
        "path": "Observation.code.coding.extension",
        "short": "No extensions on the primary coding",
        "definition": "The primary coding meaning is represented directly by system, version and code.",
        "max": "0"
      },
      {
        "id": "Observation.code.coding:primary.system",
        "path": "Observation.code.coding.system",
        "short": "SNOMED CT or governed DigiDOT code system",
        "definition": "Use SNOMED CT for an observable entity, or the DigiDOT Observation code system only for an approved local concept.",
        "min": 1
      },
      {
        "id": "Observation.code.coding:primary.version",
        "path": "Observation.code.coding.version",
        "short": "SNOMED CT edition release when SNOMED CT is used",
        "definition": "Required for a SNOMED CT primary coding and omitted only when the governed DigiDOT local code system does not state a coding version. Use the published SNOMED CT edition-release URI."
      },
      {
        "id": "Observation.code.coding:primary.code",
        "path": "Observation.code.coding.code",
        "short": "Primary observation code",
        "definition": "Record the numeric SNOMED CT concept identifier or one approved DigiDOT local observation code.",
        "min": 1
      },
      {
        "id": "Observation.code.coding:primary.userSelected",
        "path": "Observation.code.coding.userSelected",
        "short": "User-selection marker is not used",
        "definition": "User selection is a source-system interaction detail and does not identify the primary slot.",
        "max": "0"
      },
      {
        "id": "Observation.code.coding:SCTpost",
        "path": "Observation.code.coding",
        "sliceName": "SCTpost",
        "min": 1,
        "max": "1",
        "short": "Required postcoordinated expression or primary-code fallback",
        "definition": "A real clinical SNOMED CT expression is required when the primary code is SNOMED CT and bodySite is populated. Its anatomical scope must equal the main structure and all qualifiers recorded there. For a governed local Observation primary, copy that coding as the existing fallback and record the unresolved SNOMED mapping; this is not postcoordination. Without structured anatomy or further refinement, the primary-code copy is only a structural fallback. Use the same SNOMED edition release for the clinical code and anatomical fields. Validate syntax, MRCM, the clinical template and exact anatomy through the shared terminology contract.",
        "type": [
          {
            "code": "Coding"
          }
        ],
        "mustSupport": true
      },
      {
        "id": "Observation.code.coding:SCTpost.id",
        "path": "Observation.code.coding.id",
        "short": "SCTpost slot identifier",
        "definition": "Fixed technical identifier for the required postcoordination-or-fallback slot. It distinguishes this coding from the primary coding even when system, version and code are repeated. When bodySite is populated with a SNOMED CT primary coding, the anatomy invariant requires a real SCTpost expression and the shared terminology check requires exact anatomical scope. A local Observation coding is a documented mapping exception.",
        "min": 1,
        "fixedString": "SCTpost"
      },
      {
        "id": "Observation.code.coding:SCTpost.extension",
        "path": "Observation.code.coding.extension",
        "short": "No extensions on the SCTpost slot",
        "definition": "The slot meaning and fallback rule are defined by the profile. Coding extensions are not used. When bodySite is populated with a SNOMED CT primary coding, the anatomy invariant requires a real SCTpost expression and the shared terminology check requires exact anatomical scope. A local Observation coding is a documented mapping exception.",
        "max": "0"
      },
      {
        "id": "Observation.code.coding:SCTpost.system",
        "path": "Observation.code.coding.system",
        "short": "SNOMED CT or repeated local code system",
        "definition": "Use SNOMED CT for a postcoordinated expression or repeated SNOMED CT fallback. If the primary coding is an approved DigiDOT local code, repeat that local system exactly. When bodySite is populated with a SNOMED CT primary coding, the anatomy invariant requires a real SCTpost expression and the shared terminology check requires exact anatomical scope. A local Observation coding is a documented mapping exception.",
        "min": 1
      },
      {
        "id": "Observation.code.coding:SCTpost.version",
        "path": "Observation.code.coding.version",
        "short": "SNOMED CT edition release or repeated local version",
        "definition": "A real postcoordinated SNOMED CT expression must identify the published SNOMED CT edition release. In fallback mode, repeat the primary version exactly, including omitting it when the governed local primary coding has no version. When bodySite is populated with a SNOMED CT primary coding, the anatomy invariant requires a real SCTpost expression and the shared terminology check requires exact anatomical scope. A local Observation coding is a documented mapping exception."
      },
      {
        "id": "Observation.code.coding:SCTpost.code",
        "path": "Observation.code.coding.code",
        "short": "Postcoordinated expression or repeated primary code",
        "definition": "Use SNOMED CT compositional grammar when a valid postcoordinated expression adds precision to a SNOMED CT primary coding. Otherwise repeat the primary code exactly.",
        "min": 1
      },
      {
        "id": "Observation.code.coding:SCTpost.display",
        "path": "Observation.code.coding.display",
        "short": "Readable expression or code display",
        "definition": "Include a readable rendering when available. For a fallback, the display should be consistent with the primary coding; for an expression, it must represent the expression. When bodySite is populated with a SNOMED CT primary coding, the anatomy invariant requires a real SCTpost expression and the shared terminology check requires exact anatomical scope. A local Observation coding is a documented mapping exception."
      },
      {
        "id": "Observation.code.coding:SCTpost.userSelected",
        "path": "Observation.code.coding.userSelected",
        "short": "User-selection marker is not used",
        "definition": "User selection is a source-system interaction detail and does not distinguish the two required coding slots.",
        "max": "0"
      },
      {
        "id": "Observation.subject",
        "path": "Observation.subject",
        "min": 1,
        "short": "Patient the observation belongs to",
        "definition": "Reference the no-basis Patient that owns the dental observation. External data must be mapped to this agreed patient representation before it becomes a canonical DigiDOT Observation in Central Storage.",
        "type": [
          {
            "code": "Reference",
            "targetProfile": [
              "http://hl7.no/fhir/StructureDefinition/no-basis-Patient"
            ]
          }
        ],
        "mustSupport": true
      },
      {
        "id": "Observation.focus",
        "path": "Observation.focus",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "Condition.evidence.detail is the authoritative explicit relationship from a clinical condition to its supporting Observation. Observation.bodySite references the patient-specific DigiDOT Dental BodyStructure when anatomy is known. Observation.focus is not used as an alternative link to Condition or BodyStructure."
      },
      {
        "id": "Observation.encounter",
        "path": "Observation.encounter",
        "min": 1,
        "max": "1",
        "short": "Encounter where the observation was made",
        "definition": "Reference the DigiDOT Encounter during which the observation was measured, assessed or reported. Location and organisation context are resolved through the Encounter.",
        "type": [
          {
            "code": "Reference",
            "targetProfile": [
              "https://novari.no/fhir/digidot/StructureDefinition/digidot-Encounter-no"
            ]
          }
        ],
        "mustSupport": true
      },
      {
        "id": "Observation.effective[x]",
        "path": "Observation.effective[x]",
        "min": 0,
        "max": "1",
        "short": "Time when the observed value was true",
        "definition": "Use effectiveDateTime for the clinically relevant time of a simple dental observation. This is normally when it was measured, assessed or reported, and may differ from when the record was created or imported.",
        "type": [
          {
            "code": "dateTime"
          }
        ],
        "mustSupport": true
      },
      {
        "id": "Observation.issued",
        "path": "Observation.issued",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "Use Observation.effectiveDateTime for the clinically relevant time. Source import, publication and record-history times are handled by resource metadata and Provenance rather than Observation.issued."
      },
      {
        "id": "Observation.performer",
        "path": "Observation.performer",
        "min": 0,
        "max": "*",
        "short": "Person responsible for the observation",
        "definition": "Use a literal reference to a no-basis Practitioner resource when the actor is an individual practitioner. Identifier-only HPR/FNR references are not permitted. Official practitioner identifiers belong on the referenced Practitioner resource. Other explicitly allowed resource target types retain their own clinical responsibility.",
        "constraint": [
          {
            "key": "obs-performer-reference-1",
            "severity": "error",
            "human": "Use a literal resource reference; identifier-only practitioner references are not permitted.",
            "expression": "reference.exists() and identifier.empty()"
          },
          {
            "key": "obs-performer-reference-2",
            "severity": "error",
            "human": "A Norwegian national identity number must contain exactly 11 digits.",
            "expression": "identifier.where(system = 'urn:oid:2.16.578.1.12.4.1.4.1').empty() or identifier.where(system = 'urn:oid:2.16.578.1.12.4.1.4.1').value.matches('^[0-9]{11}$')"
          }
        ],
        "type": [
          {
            "code": "Reference",
            "targetProfile": [
              "http://hl7.no/fhir/StructureDefinition/no-basis-Practitioner",
              "http://hl7.no/fhir/StructureDefinition/no-basis-Patient",
              "http://hl7.no/fhir/StructureDefinition/no-basis-RelatedPerson"
            ]
          }
        ],
        "mustSupport": true
      },
      {
        "id": "Observation.performer.reference",
        "path": "Observation.performer.reference",
        "min": 1,
        "max": "1"
      },
      {
        "id": "Observation.performer.identifier",
        "path": "Observation.performer.identifier",
        "min": 0,
        "max": "0"
      },
      {
        "id": "Observation.value[x]",
        "path": "Observation.value[x]",
        "slicing": {
          "discriminator": [
            {
              "type": "type",
              "path": "$this"
            }
          ],
          "rules": "closed"
        },
        "short": "Result value",
        "definition": "The single result of the observation. Use valueQuantity for a measured quantity, valueCodeableConcept for a coded categorical result, valueInteger for a score or calculated count, valueBoolean for a true/false result, and valueString only when no structured result can faithfully represent the source content. Do not use valueString to repeat structured codes, anatomy, status or method. When no result is available, use dataAbsentReason instead of leaving both elements empty.",
        "min": 0,
        "max": "1",
        "mustSupport": true
      },
      {
        "id": "Observation.value[x]:valueBoolean",
        "path": "Observation.value[x]",
        "sliceName": "valueBoolean",
        "min": 0,
        "max": "1",
        "type": [
          {
            "code": "boolean"
          }
        ],
        "mustSupport": true,
        "short": "True or false result",
        "definition": "Use valueBoolean for a clinically meaningful true/false result. Do not use it for a coded category with more than two possible results."
      },
      {
        "id": "Observation.value[x]:valueInteger",
        "path": "Observation.value[x]",
        "sliceName": "valueInteger",
        "min": 0,
        "max": "1",
        "type": [
          {
            "code": "integer"
          }
        ],
        "mustSupport": true,
        "short": "Whole-number score or count",
        "definition": "Use valueInteger for a discrete score, count or calculated index with no physical unit, such as DMFT or DMFS. Use valueQuantity when a unit of measure is required."
      },
      {
        "id": "Observation.value[x]:valueString",
        "path": "Observation.value[x]",
        "sliceName": "valueString",
        "min": 0,
        "max": "1",
        "type": [
          {
            "code": "string"
          }
        ],
        "mustSupport": true,
        "short": "Source result without a faithful structured representation",
        "definition": "Use valueString only when the source result cannot faithfully be represented as a quantity, coded result, integer or Boolean. It is a controlled fallback, not a default result type. Record a mapping gap when the same unstructured result recurs and needs a governed representation."
      },
      {
        "id": "Observation.value[x]:valueCodeableConcept",
        "path": "Observation.value[x]",
        "sliceName": "valueCodeableConcept",
        "min": 0,
        "max": "1",
        "type": [
          {
            "code": "CodeableConcept"
          }
        ],
        "mustSupport": true,
        "short": "Coded categorical result",
        "definition": "Use valueCodeableConcept for a categorical result that has a faithful code. The applicable code system and ValueSet depend on Observation.code. This field remains open for agreed SNOMED CT, national and other governed code systems; it is not restricted to one generic result ValueSet."
      },
      {
        "id": "Observation.value[x]:valueCodeableConcept.extension",
        "path": "Observation.value[x].extension",
        "max": "0",
        "short": "No extensions on the coded result",
        "definition": "The coded result is represented by its coding and optional source text. Extensions are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.value[x]:valueCodeableConcept.coding",
        "path": "Observation.value[x].coding",
        "min": 1,
        "short": "Coded observation result",
        "definition": "When valueCodeableConcept is used, record at least one coded result. Use the code system and ValueSet that are appropriate for Observation.code; text may supplement but must not be the only result representation. When a coding uses SNOMED CT, it must be a direct precoordinated concept with the selected SNOMED CT edition release.",
        "constraint": [
          {
            "key": "obs-result-snomed-pre",
            "severity": "error",
            "human": "A SNOMED CT coded result must use a direct numeric concept identifier and state the SNOMED CT edition release.",
            "expression": "system != 'http://snomed.info/sct' or (version.exists() and code.matches('^[0-9]{6,18}$'))"
          }
        ]
      },
      {
        "id": "Observation.value[x]:valueCodeableConcept.coding.extension",
        "path": "Observation.value[x].coding.extension",
        "max": "0",
        "short": "No extensions on the coded result coding",
        "definition": "A coded result uses the agreed code system directly. Extensions on the coding are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.value[x]:valueCodeableConcept.coding.system",
        "path": "Observation.value[x].coding.system",
        "min": 1,
        "short": "Code system for the coded result"
      },
      {
        "id": "Observation.value[x]:valueCodeableConcept.coding.code",
        "path": "Observation.value[x].coding.code",
        "min": 1,
        "short": "Code for the coded result"
      },
      {
        "id": "Observation.value[x]:valueCodeableConcept.coding.userSelected",
        "path": "Observation.value[x].coding.userSelected",
        "max": "0",
        "short": "Not used for the coded result",
        "definition": "The code is the agreed exchange representation. userSelected is not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.value[x]:valueCodeableConcept.text",
        "path": "Observation.value[x].text",
        "short": "Supplementary source display text",
        "definition": "Text may preserve a useful source display, but it does not replace the required coding and must not introduce a different clinical result."
      },
      {
        "id": "Observation.value[x]:valueQuantity",
        "path": "Observation.value[x]",
        "sliceName": "valueQuantity",
        "min": 0,
        "max": "1",
        "type": [
          {
            "code": "Quantity"
          }
        ],
        "mustSupport": true,
        "short": "Measured quantity",
        "definition": "Use valueQuantity for a numeric observation with a physical unit. The value, UCUM system and UCUM code are required."
      },
      {
        "id": "Observation.value[x]:valueQuantity.extension",
        "path": "Observation.value[x].extension",
        "max": "0",
        "short": "No extensions on the measured quantity",
        "definition": "The measured quantity is represented by the standard Quantity fields. Extensions are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.value[x]:valueQuantity.value",
        "path": "Observation.value[x].value",
        "min": 1,
        "short": "Measured value"
      },
      {
        "id": "Observation.value[x]:valueQuantity.comparator",
        "path": "Observation.value[x].comparator",
        "short": "Measurement comparator when recorded",
        "definition": "Use the comparator only when it is part of the source measurement meaning, such as less than or greater than a stated value. Do not use it as a replacement for a coded qualitative result."
      },
      {
        "id": "Observation.value[x]:valueQuantity.unit",
        "path": "Observation.value[x].unit",
        "short": "Human-readable UCUM unit display",
        "definition": "Populate unit when the source provides a human-readable display. UCUM system and code remain the authoritative machine-readable unit representation."
      },
      {
        "id": "Observation.value[x]:valueQuantity.system",
        "path": "Observation.value[x].system",
        "min": 1,
        "fixedUri": "http://unitsofmeasure.org",
        "short": "UCUM unit system"
      },
      {
        "id": "Observation.value[x]:valueQuantity.code",
        "path": "Observation.value[x].code",
        "min": 1,
        "short": "UCUM unit code"
      },
      {
        "id": "Observation.dataAbsentReason",
        "path": "Observation.dataAbsentReason",
        "min": 0,
        "max": "1",
        "short": "Reason a simple result is absent",
        "definition": "Use the standard FHIR data-absent-reason coding when an expected simple result is unavailable. Do not use it together with Observation.value[x]. This distinguishes an unavailable result from an omitted value.",
        "binding": {
          "strength": "required",
          "description": "Use one standard FHIR data absent reason code.",
          "valueSet": "http://hl7.org/fhir/ValueSet/data-absent-reason"
        },
        "mustSupport": true
      },
      {
        "id": "Observation.dataAbsentReason.extension",
        "path": "Observation.dataAbsentReason.extension",
        "max": "0",
        "short": "No extensions on the absent-result reason",
        "definition": "The absent-result reason is represented by one standard FHIR code. Extensions on Observation.dataAbsentReason are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.dataAbsentReason.coding",
        "path": "Observation.dataAbsentReason.coding",
        "min": 1,
        "max": "1",
        "short": "Coded reason the result is absent",
        "definition": "When dataAbsentReason is used, record exactly one standard FHIR data absent reason code."
      },
      {
        "id": "Observation.dataAbsentReason.coding.extension",
        "path": "Observation.dataAbsentReason.coding.extension",
        "max": "0",
        "short": "No extensions on the absent-result coding",
        "definition": "The absent-result coding uses the standard FHIR code system directly. Extensions on the coding are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.dataAbsentReason.coding.system",
        "path": "Observation.dataAbsentReason.coding.system",
        "min": 1,
        "fixedUri": "http://terminology.hl7.org/CodeSystem/data-absent-reason",
        "short": "Code system for the absent-result reason"
      },
      {
        "id": "Observation.dataAbsentReason.coding.code",
        "path": "Observation.dataAbsentReason.coding.code",
        "min": 1,
        "short": "Code for the absent-result reason"
      },
      {
        "id": "Observation.dataAbsentReason.coding.userSelected",
        "path": "Observation.dataAbsentReason.coding.userSelected",
        "max": "0",
        "short": "Not used for the absent-result reason",
        "definition": "The standard absent-result reason is the agreed exchange code. userSelected is not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.dataAbsentReason.text",
        "path": "Observation.dataAbsentReason.text",
        "max": "0",
        "short": "No free text for the absent-result reason",
        "definition": "Use the standard coded reason. Free text is not used as a second absent-result representation."
      },
      {
        "id": "Observation.interpretation",
        "path": "Observation.interpretation",
        "min": 0,
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "No governed dental interpretation terminology or cross-system mapping is agreed. Record a coded clinical result in valueCodeableConcept when that is the observation result; use a Condition for a clinically significant finding or diagnosis."
      },
      {
        "id": "Observation.note",
        "path": "Observation.note",
        "min": 0,
        "max": "*"
      },
      {
        "id": "Observation.bodySite",
        "path": "Observation.bodySite",
        "min": 0,
        "max": "1",
        "type": [
          {
            "code": "CodeableConcept",
            "profile": [
              "https://novari.no/fhir/digidot/StructureDefinition/digidot-DentalBodySite-no"
            ]
          }
        ],
        "mustSupport": true,
        "short": "Inline Xt-EHR anatomy group",
        "definition": "One inline anatomical group in the shared DentalBodySite format: a complex extension containing location, repeated locationQualifier, laterality, morphology and description, matching the Xt-EHR logical field model. No independent BodyStructure resource is required. Clinical coding and dental workflow rules apply separately.",
        "comment": "The two inline qualifier extensions are explicitly defined DigiDOT R4 extensions. The FHIR structure stays directly coded; shared terminology tooling composes and compares the SCTpost anatomy. See DentalBodySite-use for the supplier contract."
      },
      {
        "id": "Observation.method",
        "path": "Observation.method",
        "min": 0,
        "max": "1",
        "short": "How the observation was made or calculated",
        "definition": "Use method only when it adds information that is not already implicit in Observation.code. If the source records a clinically relevant method, it shall be populated. Prefer an agreed SNOMED CT or national code where available. The small DigiDOT method ValueSet is a local draft aid, not a national terminology decision.",
        "binding": {
          "strength": "preferred",
          "description": "The DigiDOT method ValueSet is a preferred local draft list. Use an agreed SNOMED CT or national method code when available.",
          "valueSet": "https://novari.no/fhir/digidot/ValueSet/digidot-observation-method"
        },
        "mustSupport": true
      },
      {
        "id": "Observation.method.extension",
        "path": "Observation.method.extension",
        "max": "0",
        "short": "No extensions on the observation method",
        "definition": "Method is represented by its coded value. Extensions on Observation.method are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.method.coding",
        "path": "Observation.method.coding",
        "min": 1,
        "max": "1",
        "short": "Coded observation method",
        "definition": "When Observation.method is populated, use exactly one coded method. The code can come from the DigiDOT method ValueSet, SNOMED CT or another agreed national code system."
      },
      {
        "id": "Observation.method.coding.extension",
        "path": "Observation.method.coding.extension",
        "max": "0",
        "short": "No extensions on the observation method coding",
        "definition": "The observation method is represented by one agreed coding. Extensions on Observation.method.coding are not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.method.coding.system",
        "path": "Observation.method.coding.system",
        "min": 1,
        "short": "Code system for the observation method"
      },
      {
        "id": "Observation.method.coding.code",
        "path": "Observation.method.coding.code",
        "min": 1,
        "short": "Code for the observation method"
      },
      {
        "id": "Observation.method.coding.userSelected",
        "path": "Observation.method.coding.userSelected",
        "max": "0",
        "short": "Not used for the observation method",
        "definition": "The coded method is the agreed exchange representation. userSelected is not used in the current DigiDOT draft."
      },
      {
        "id": "Observation.method.text",
        "path": "Observation.method.text",
        "max": "0",
        "short": "No free text method",
        "definition": "Use the coded method. Free text is not used as a second method representation."
      },
      {
        "id": "Observation.specimen",
        "path": "Observation.specimen",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "Specimen-based laboratory observations require a separate agreed model and are outside the current dental Observation scope."
      },
      {
        "id": "Observation.device",
        "path": "Observation.device",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "The current profile does not model device-generated measurements. Imaging and device context must use their own agreed resources and relationships."
      },
      {
        "id": "Observation.referenceRange",
        "path": "Observation.referenceRange",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "No dental reference-range terminology or cross-system calculation model is agreed for the current scope."
      },
      {
        "id": "Observation.hasMember",
        "path": "Observation.hasMember",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "Use separate DigiDOT Observation resources when results need separate codes, anatomy, times or lifecycle states. Grouping and questionnaire modelling require separate agreed profiles."
      },
      {
        "id": "Observation.derivedFrom",
        "path": "Observation.derivedFrom",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "No governed target profiles and source-document relationship model are agreed for Observation.derivedFrom. Imaging, document and questionnaire relationships are deferred to their dedicated resources and profiles."
      },
      {
        "id": "Observation.component",
        "path": "Observation.component",
        "max": "0",
        "short": "Not used in the current DigiDOT Observation draft",
        "definition": "The current Central Storage draft represents one result per Observation. A multi-component dental index or assessment requires a governed component terminology and mapping model before Observation.component is reopened."
      }
    ]
  }
}