Skip to content

Curated Value Set Profile

Canonical../StructureDefinition/nexus-valueset
Statusdraft · 1.26.0
BaseValueSet (constraint)
SourceFSH · JSON

A curated pick-list as this estate stores one: the coded options a clinician chooses from in the chart, held per tenant and fetched by the application at the point of use.

Overview

This is not the definitional sense of ValueSet. The sets this guide binds profile elements to are a different population; those are terminology definitions and are not constrained here. This profile describes the lists a tenant's store holds and the application renders.

Resolve one by url, never by id. Each tenant's copy carries a server-minted resource id, so that tenants sharing a store do not collide on it -- which means the id is not stable across tenants and the url is the only durable handle on a given list.

An expansion is required, and that is the point of this profile. A consumer reads expansion.contains to build the picker. A set stored without an expansion does not fail for it -- it renders as an empty list, which looks exactly like a list that legitimately has no members. The same is true one level down: a member without a display renders as a blank selectable row rather than an error. Both failures are silent at the point they matter, so they are pinned here instead.

Order is display order. A producer's member order is what the clinician sees; do not re-sort an expansion on either side.

The coded options a clinician picks from in the chart -- the problem list, the procedure list, the allergen and reaction pickers, the schedule codes -- are stored in each tenant's own FHIR store as ValueSet resources and fetched by the application at the point of use.

Two populations share this type, and only one is described here

This specification uses ValueSet in two unrelated ways.

Most of them are terminology definitions: the sets a profile binds an element to, which say which codes are legal somewhere. Those are not constrained by this profile and never were.

This profile describes the other population -- the curated lists a tenant's store holds, created and updated by the initialization that provisions a tenant and read back by the chart to build a picker. They answer "what may a person choose here", not "what is legal in this element".

Nothing distinguishes the two on the wire. The profile is what says which one you are looking at.

Resolve by url, never by id

Each tenant's copy of a list is created in that tenant's store and carries a server-minted resource id, so two tenants holding the same list hold it under different ids. The url is the same in both, and it is the only durable handle a consumer has.

A reader that caches or hard-codes an id will find the wrong list in another tenant, or none.

Why an expansion is required

A consumer builds the picker from expansion.contains. It does not run an expand operation, and it is not expected to: these lists are stored already resolved.

That makes the two ways a list can be wrong silent at the point they matter:

  • A list stored with no expansion is not an error to a reader -- it is a list with no members. The picker opens and offers nothing, which looks exactly like a list that legitimately has none.
  • A member with no display is not an error either. It renders as a blank row the clinician can select, storing a code nobody could read before choosing it.

Neither surfaces as a fault anyone can act on, which is why both are pinned in the profile rather than left to a producer's judgement. Requiring them takes nothing away from the producer that exists today: tenant initialization already writes the timestamp, the total and a system, code and display for every member.

Order is display order

The order members sit in is the order a person reads them. Producers preserve their source order, and a consumer must not re-sort an expansion -- doing so silently changes what the chart presents.

A member may carry a second code

Where a list member is known by more than one code, the additional one rides expansion.contains.extension as valueset-secondary-coding. That extension was published before this profile existed, and its only context is a path inside this resource.