Corrections¶
Introduction¶
Under PHIPA an individual who has been given access to their record may ask a custodian to correct information in it. The custodian may accept, partly accept, or refuse — and the obligations differ in each case.
The prior access is part of the right rather than a formality: the individual is disputing information they have seen, and the access request that showed it to them is an ordinary clinical Task recorded exactly the way this one is.
The requirement has five parts: strike out incorrect information in a way that does not obliterate the record, label information as incorrect, sever it, store it separately with a traceable link, and notify users where information is incorrect so they are directed to the corrected version.
Nothing in this estate yet performs any of them beyond retaining prior versions. See What is not implemented at the foot of this page.
A correction is an ordinary clinical Task, with one narrowing¶
A correction request is a clinical Task like any other, and it appears in the same worklist, in the same bin, sorted the same way. Since 1.26.0 it also has a profile of its own, correction task, which narrows one element and changes nothing else.
A profile costs nothing in reachability. A worklist searches Task?owner=…, and every Task comes
back whatever meta.profile says; nothing in this estate filters a task query by profile. Earlier
releases said this guide would publish no correction Task profile because a second Task shape would
put statutory work somewhere nobody looks. That reasoning did not hold: the reachability it was
protecting is not affected by a profile.
What the profile buys is a vocabulary a code cannot close. The correction lifecycle is the
statutory record of a decision about someone's chart, and it needs a set of business statuses that is
closed and is not available to ordinary work. The base profile's binding admits both vocabularies,
because a FHIR binding cannot be conditional on a sibling element; the correction profile narrows it
to the correction half. Ordinary tasks are held off the correction codes from the other direction, by
the nexus-task-bizstatus-scope invariant on the base.
A writer must declare it. meta.profile carries no weight unless it is written, and nothing in
this estate stamps a profile onto a Task today. Until a producer does, an instance is held to the
base profile alone — which still blocks a correction code on a non-privacy task, but does not hold a
privacy task to the correction vocabulary.
| Element | Carries |
|---|---|
Task.code |
privacy-request — the worklist bin. Optionally a second coding, medRecCxReq, from the correction task types |
Task.restriction.period |
The response clock. Its end is the statutory deadline |
Task.businessStatus |
Where the request has reached — correction business status |
Task.status |
The lifecycle. completed on a refusal |
Task.for |
The individual |
Task.focus |
The disputed record |
Task.requester |
The staff member who logged the request |
Task.statusReason |
Why, on a refusal |
A refused request is a completed task carrying a businessStatus of denied, never a failed
one. Somebody reviewed it and decided. A failed task says the system broke, which loses the only
fact the law cares about.
The terminal states, stated once as a progression. A refusal ends at businessStatus = denied.
If the individual then files a statement of disagreement it moves to disagreement-logged. Only a
formal rebuttal from the custodian reaches completed. So completed is the rarest of the three,
not the ordinary end state, and a request that was simply accepted and amended never passes through
any of them — it ends at amendment-completed.
Note that completed occurs twice in this model with different meanings: as a Task.status (the
work item is closed) and as a businessStatus (a rebuttal was provided). They are different
elements and they are not synchronised.
The individual cannot be Task.requester — that element is constrained to a practitioner. The
request itself is a Communication from the individual; the Task is the clinic's work item raised
from it. That separation is honest about who is accountable for the work.
The response clock has a home: restriction.period¶
The statutory deadline is carried as an ordinary task due date — restriction.period.end, the end of
the fulfillment window, whose base definition is "the time by which the task should be completed."
There is no privacy-specific deadline element and none is needed, which also means the deadline is
visible to any worklist that already sorts on a due date.
Do not write it on Task.executionPeriod, which means when the work is being or was done. The
fuller treatment, including what does and does not watch this element, is on
access requests.
Which duration applies is a separate question from where the date goes, and it is answered below for records held elsewhere.
Why the vocabulary is adopted but the profiles are not¶
HL7 published Patient Request for Corrections 1.0.0 (STU1, R4, July 2025): a Task/Communication
workflow with a $correction-request operation and a business-status vocabulary.
This guide adopts its codes and not its profiles, for the worklist reason above. Adopting a vocabulary keeps the workflow legible to an outside reader; adopting the profiles would import an operation, a search-parameter set, and a second Task shape competing with the one this estate already routes work through. The package is deliberately not a dependency, so terminology-aware validators will report that these codes cannot be verified against their system. That is expected.
Three details of that vocabulary carry traps:
completeddoes not mean "finished". HL7 defines it as the state where the disagreement has been logged and a formal rebuttal provided — see the progression above.disagreement-loggedcloses an administrative step only. The statement it refers to must still travel with the disputed information for as long as the record exists.partial-acceptships with a typo in its published display ("Partail Acceptance"). It is carried as HL7 publishes it, so that a validator does not flag a mismatch. Render your own text.
Two codes appearing in HL7's narrative — inform-rebuttal-option and partial-amendment-completed —
are absent from the published code system and are not carried.
Applying the correction to the record¶
The workflow is one thing; changing the clinical record is another, and R4 already has per-resource mechanisms for most of it:
| Resource | Correction | Invalidation |
|---|---|---|
Observation |
status = corrected |
status = entered-in-error |
Condition, AllergyIntolerance |
Amend in place with provenance | verificationStatus = entered-in-error |
DocumentReference |
docStatus for the document; relatesTo replaces for a new version |
status = entered-in-error, with a status reason |
Composition |
Amendment status plus a replacement policy | — |
Patient demographics |
Versioned field change with provenance | No generic error status exists |
A clinical correction and invalidating an erroneous entry are different acts. Do not use
resolved or inactive to pretend an erroneous diagnosis or allergy clinically ended — it did not;
it was never true.
Version history retains what the record used to say. Provenance records who changed it and why.
The two gaps R4 leaves, and how this guide fills them¶
There is no portable pointer from a wrong record to its replacement. DocumentReference has
relatesTo; Observation, Condition, AllergyIntolerance and Patient have nothing equivalent in
R4. So a reader holding the wrong record cannot reach the right one — and the requirement is
explicitly to direct users to corrected information, which needs an address.
The Corrected By extension carries it. It
points forward, from wrong to right, which is the opposite of relatesTo. The direction is chosen
for the reader who needs help: they are holding the stale record and need somewhere to go.
Severing has no representation at all. Severed content stays retrievable — a correction has to be auditable — while ceasing to be presented as part of the clinical picture. That is an instruction about visibility, and no status code expresses it: status is about whether content is true.
The Record Severed extension carries the date, the reason, and the basis on which the content is still retained. That last sub-extension exists because a severed record raises the obvious question of why it is still here, and the answer belongs on the record rather than in somebody's memory — it is also what tells a later retention sweep whether the content may now go.
Records held by another custodian¶
A correction request about information that came from somewhere else is routed to the custodian responsible for it. A local user cannot rewrite another custodian's authoritative record, and a user interface that implies otherwise is making a promise the estate cannot keep.
Capture receipt, decision, any extension of the response period and its justification, and the
notification dates. The deadline itself goes where every other deadline goes, on
restriction.period.end; what has to be established with the holding custodian is which duration
applies — theirs may not be ours, an extension may move it, and inheriting a period from an
international example is how a request is answered late while looking on time.
Regulatory reporting comes out of the same query¶
A custodian reports counts: requests received in a period, requests refused, and the provisions
invoked. That is not a new artifact. It is a query over the request Tasks, grouped by
Task.businessStatus, where refusals are the denied bucket and the provision relied on is on
Task.statusReason. Task.code = privacy-request selects privacy work and Task.authoredOn bounds
the period.
Because the buckets are HL7's published vocabulary rather than a private status column, the report is
portable: a denied count means the same thing in any store carrying that vocabulary, and nobody
needs a mapping table from this estate's local names to produce or read it. That is a second reason
not to extend the vocabulary locally. The same query covers access requests; see
access requests.
What is not implemented¶
- Nothing labels a record as incorrect in ordinary clinical views, so
nexus-corrected-byis written by nothing and read by nothing. - No severing workflow exists; no protected retention location exists.
- No user is notified when information they have seen is later corrected.
- Nothing tracks who a record was previously disclosed to, so prior recipients cannot be notified.
- No
$correction-requestoperation and no correction search parameters are exposed. - Nothing watches
restriction.period, so a statutory deadline recorded on a request is a date and not a reminder: no escalation, no extension record, no overdue view. - No reporting query is built or exposed. The grouping above describes what the model supports, not something the estate produces.