R6 Ballot (2nd Draft)

Publish-box (todo)

FHIR Infrastructure icon Work Group Maturity Level: 3 Standards Status: Trial Use

This page describes several issues around lifecycle management for the resources and the content they contain. Specifically, this page describes:

Many FHIR resources have a status element that represents the lifecycle state of the resource or the clinical process represented by the resource. Work groups can specify status values appropriate to the individual resource. Although consistency between resources is not the primary objective, it is helpful to users and developers to have well-crafted value sets that cover all possible states (since the value sets are typically required and non-extensible).

To understand existing status elements, and to help create extensions and resources involving resource states, we note that status value sets follow one of the following life cycles:

  • Clinical workflow process life cycle
  • Request/Order life cycle
  • Entity status life cycle
  • Clinical status life cycle

For additional information about managing resource life cycles, see:

Describes the lifecycle states of complex activities common in healthcare. Typically, these states follow a chronological life cycle that leads from initiation to the conclusion of the action. A characteristic (but non-exhaustive) set of states for the clinical workflow process life cycle include:

  • planned - resources for the activity are being allocated but the activity has not begun
  • cancelled - the planned activity did not start and will not take place
  • in-progress - the activity has begun
  • on-hold (suspended) - the activity has been temporarily interrupted
  • stopped (aborted, failed) - the activity has not been completed but no future action is planned
  • completed (finished) - the activity has been completed

Examples of the clinical workflow life cycle:

  • Communication.status: preparation | in-progress | not-done | on-hold | stopped | completed | entered-in-error | unknown
  • Appointment.status: proposed | pending | booked | arrived | fulfilled | cancelled | noshow | entered-in-error | checked-in | waitlist
  • Encounter.status: planned | in-progress | on-hold | discharged | completed | cancelled | discontinued | entered-in-error | unknown
  • Goal.lifecycleStatus: proposed | planned | accepted | cancelled | entered-in-error | rejected
  • MedicationAdministration.status: in-progress | not-done | on-hold | completed | entered-in-error | stopped | unknown
  • MedicationDispense.status: preparation | in-progress | cancelled | on-hold | completed | entered-in-error | stopped | declined | unknown
  • Procedure.status: preparation | in-progress | not-done | on-hold | stopped | completed | entered-in-error | unknown

Some resources in FHIR represent orders or requests. The request lifecycle can be generalized in terms of four stages: creating the request, sending the request, receiving acceptance or refusal of the request, and fulfillment of the request. A characteristic (but non-exhaustive) set of states for the request/order pattern include:

  • proposed: An actor (e.g. a clinical decision support system) has proposed an action to be requested
  • draft: The request is in preliminary form, prior to being requested
  • requested: The request has been made
  • rejected: The request receiver has declined the request
  • accepted: The request receiver has accepted the request
  • in-progress: Work to fulfill the request has begun
  • on-hold (suspended): Work on the request has been interrupted
  • stopped (aborted): The activity has not been completed but no future action is planned
  • completed: Work on the requested task has been completed, and no further action is required
  • cancelled: The request has been withdrawn

Examples of the request/order life cycle:

The entity availability life cycle indicates if the resource, or the entity described by the resource, is ready for use, not yet ready for use, or has been retired from use. A characteristic (but non-exhaustive) set of states for the entity availability life cycle include:

  • draft: The entity is being prepared but is not yet in use
  • active: The entity is in use
  • suspended: The entity is not in use at the moment, but may return to active status
  • amended: The entity has undergone a revision but is still active
  • retired (superseded): The entity is no longer in use.

Examples of the entity availability life cycle:

Clinical status is somewhat different than the previous status values, since it does not deal with workflow or lifecycle. Instead, it indicates how evidence is affecting a clinical interpretation. Here are two examples:


Many clinical systems maintain current lists of some kind of resources for a patient. Some of the commonly maintained lists include:

  • Current Problem List: a list of the problems that are of concern for care of the patient
  • Current Medication List: a list of the medications that a patient is known to be on at the current time

Because of the way that resources are used, there is no simple way to determine, from examination of a resource, whether it is 'current' or not. Take, as an example, the Condition resource. In a typical EHR, condition resources might be published on the RESTful interface for the following reasons:

  • to represent an item in a patient's curated problem list
  • to represent a complaint or a diagnosis from an encounter record
  • to represent a problem for investigation provided by a diagnostic system as part of a ServiceRequest/DiagnosticReport pair
  • the resources were received from another system as part of a referral package, and were current for that system when they were received

There is no element on the Condition resource that can convey the difference between these usages. In particular, there can be no way to differentiate between current and past resources without having to retrospectively alter resources, which is problematic with regard to integrity and digital signatures.

One consequence of this is that searching the condition resource for a given patient will return more than just the patient's current problems. Though this is somewhat counter-intuitive to some implementers, restricting searches on Condition to only include the patient's current curated problem list excludes all the other - important - uses of the Condition resource.

Determining whether a Condition is an entry on a patient's current problem list is done by checking with the Condition resource is referenced from the correct list.

On the RESTful API, this is done using the list search mechanism:

 GET [base]/AllergyIntolerance?patient=42&_list=$current-allergies

This is a request to fetch all the allergies in the patient 42's "Current Allergy List". Note that the server is not required to actually make a resource representation of the current allergy list available, though doing so assists clients in their audit/integrity tasks. See List Operation "Find" for further information.

In a document, current lists are determined by the code on a Composition section.

FHIR defines the following names for functional lists:

List ResourceType Description Possible LOINC codes in documents / sections
$current-problems Condition The "Current Problem List" - A list of current and active diagnoses as well as past diagnoses relevant to the current care of the patient 46105-3 (Problem conditions Set)
$current-medications MedicationStatement/ MedicationRequest A list of all medications that the patient is taking. The 'current medications list' sometimes may include a mix of prescribed and over-the-counter medications - or only some of them. The list may contain a mix of prescriptions and more general statements, or only one of the two. The list may also correspond to a formal reconciled medication administration schedule, but more often does not 57828-6 (Prescription list), 10160-0 (History of medication)
$current-allergies AllergyIntolerance A list of known or suspected propensities to medications, foods, or environmental agents that is provided to help prevent reactions while care is occurring 18716-1 (Allergy studies (set)), 52472-8 (Allergies and Adverse Drug Reactions), and 48765-2 (Allergies and adverse reactions Document)
$current-drug-allergies AllergyIntolerance A list of known or suspected propensities to medications that is provided to help prevent reactions while care is occurring. This list is a subset of the full allergies list (same as above?)

The entered-in-error state indicates the resource was created accidentally and should be ignored. This state can apply to resources created by manual entry. It is usually not associated with the Clinical Workflow Process life cycle, but can be associated with the Request/Order and the Entity Availability life cycles.

Handling of erroneous data is tightly tied to business processes and thus there are no generic rules for what to do when data is flagged as erroneous. Implementation Guides may define additional guidance about what actions should be taken, such as data redaction, sending of notifications, etc.

This table summarizes what is expected to happen for each resource in the case that the data it contains is subsequently found to be an erroneous entry.

Resource Status
Account .status = entered-in-error
ActivityDefinition .status = retired
ActorDefinition .status = retired
AdministrableProductDefinition .status=entered-in-error
AdverseEvent .status = entered-in-error
AllergyIntolerance .verificationStatus = entered-in-error
Appointment .status=entered-in-error
AppointmentResponse .participantStatus=entered-in-error
ArtifactAssessment .workflowStatus = entered-in-error
AuditEvent Audit Events are recorded, there is no update or delete.
Basic There are no fixed arrangements for Basic - profiles should describe how this works as arrangements will depend on the 'type' of Basic resource
Binary n/a (This would be handled where the binary is linked from)
BiologicallyDerivedProduct .verificationStatus = entered-in-error
BiologicallyDerivedProductDispense .status = entered-in-error
BodyStructure .active = false
Bundle Depends on the type: document - see for Composition; message - see for MessageHeader; transaction / transaction-response / history / searchset - not expected to be stored; collection: just delete it if it's stored, and in error
CapabilityStatement .status = retired
CarePlan .status = entered-in-error
CareTeam .status = entered-in-error
ChargeItem .status = entered-in-error
ChargeItemDefinition .status = retired
Citation .status = retired
Claim .status = entered-in-error
ClaimResponse .status = entered-in-error
ClinicalImpression .status = entered-in-error
ClinicalUseDefinition .status=entered-in-error
CodeSystem .status = retired
Communication .status = entered-in-error
CommunicationRequest .status = entered-in-error
CompartmentDefinition .status = retired
Composition .status = entered-in-error
ConceptMap .status = retired
Condition .verificationStatus = entered-in-error
ConditionDefinition .status = retired
Consent .status = entered-in-error
Contract .status = entered-in-error
Coverage .status = entered-in-error
CoverageEligibilityRequest .status = entered-in-error
CoverageEligibilityResponse .status = entered-in-error
DetectedIssue .status = entered-in-error
Device .status = entered-in-error
DeviceAlert .status = entered-in-error
DeviceAssociation .status = entered-in-error
DeviceDefinition .operationalStatus = entered-in-error
DeviceDispense .status = entered-in-error
DeviceMetric .operationalStatus = entered-in-error
DeviceRequest .status = entered-in-error
DeviceUsage .status = entered-in-error
DiagnosticReport .status = entered-in-error
DocumentReference .status = entered-in-error
Encounter .status=entered-in-error
EncounterHistory .status=entered-in-error
Endpoint .status=entered-in-error
EnrollmentRequest .status = entered-in-error
EnrollmentResponse .status = entered-in-error
EpisodeOfCare .status=entered-in-error
EventDefinition .status = retired
Evidence .status = retired
EvidenceReport .status = retired
EvidenceVariable Delete the instance if it is in error
ExampleScenario .status = retired
ExplanationOfBenefit .status = entered-in-error
FamilyMemberHistory .status = entered-in-error
Flag .status = entered-in-error
FormularyItem .status = entered-in-error
GenomicStudy .status = entered-in-error
Goal .status = entered-in-error
GraphDefinition .status = retired
Group .active = false
GuidanceResponse .status = entered-in-error
HealthcareService .active = false
ImagingSelection .status = entered-in-error
ImagingStudy .status = entered-in-error
Immunization .status = entered-in-error
ImmunizationEvaluation .status = entered-in-error
ImmunizationRecommendation Immunization recommendations are generated on "just in time" and typically are not retained by the system generating them so there isn't an expected workflow where a previous recommendation would be re-evaluated and found to be "in error".
ImplementationGuide .status = retired
Ingredient .status=entered-in-error
InsurancePlan .status = retired
InsuranceProduct .status = retired
InventoryItem .status = entered-in-error
InventoryReport .status = entered-in-error
Invoice .status = entered-in-error
Library .status = retired
Linkage .active = false
List .status = entered-in-error
Location .status = inactive
ManufacturedItemDefinition .status=entered-in-error
Measure Delete the instance if it is in error
MeasureReport Delete the instance if it is in error
Medication .status = entered-in-error
MedicationAdministration .status = entered-in-error
MedicationDispense .status = entered-in-error
MedicationKnowledge .status = entered-in-error
MedicationRequest .status = entered-in-error
MedicationStatement .status = entered-in-error
MedicinalProductDefinition .status=entered-in-error
MessageDefinition mostly n/a, but in the cases where messages are stored in error, they would simply be deleted
MessageHeader mostly n/a, but in the cases where messages are stored in error, they would simply be deleted
MolecularDefinition .status = entered-in-error
MolecularSequence .status = entered-in-error
NamingSystem .status = retired
NutritionIntake .status = entered-in-error
NutritionOrder .status = entered-in-error
NutritionProduct .status = entered-in-error
Observation .status = entered-in-error
ObservationDefinition .status = retired
OperationDefinition .status = retired
OperationOutcome n/a - this resource is not expected to be stored
Organization .active = false
OrganizationAffiliation .active = false
PackagedProductDefinition .status=entered-in-error
Patient .active = false
PaymentNotice .status = entered-in-error
PaymentReconciliation .status = entered-in-error
Permission .status = entered-in-error
Person .active = false
PlanDefinition .status = retired
Practitioner .active = false
PractitionerRole .active = false
Procedure .status = entered-in-error
Provenance Provenance are recorded, there is no update or delete.
Questionnaire .status = retired
QuestionnaireResponse .status = entered-in-error
RegulatedAuthorization .status=entered-in-error
RelatedPerson .active = false
RequestOrchestration .status = entered-in-error
Requirements .status = retired
ResearchStudy .status = entered-in-error
ResearchSubject .status = entered-in-error
RiskAssessment .status = entered-in-error
Schedule .active = false
SearchParameter .status = retired
ServiceRequest .status = entered-in-error
Slot .status = entered-in-error
Specimen .status = entered-in-error
SpecimenDefinition .status = retired
StructureDefinition .status = retired
StructureMap .status = retired
Subscription .status = entered-in-error
SubscriptionStatus .status = entered-in-error
SubscriptionTopic .status = off (just turn it off, maybe update the error message)
Substance .status = entered-in-error
SubstanceDefinition .status=entered-in-error
SubstanceNucleicAcid
SubstancePolymer .status=entered-in-error
SubstanceProtein
SubstanceReferenceInformation
SubstanceSourceMaterial
SupplyDelivery .status = entered-in-error
SupplyRequest .status = entered-in-error
Task .status = entered-in-error
TerminologyCapabilities .status = retired
TestPlan .status = entered-in-error
TestReport .status = entered-in-error
TestScript .status = retired
Transport .status = entered-in-error
ValueSet .status = retired
VerificationResult .status = entered-in-error
VisionPrescription .status = entered-in-error

Note: Resources that are not listed in this table do not have any explicit documentation with regard to being entered in error.