Clinical patterns

Clinical timeline

A trend chart shows one quantity changing. A timeline shows unlike things happening — a dose, an observation, a phone call, a transfer — and its central problem is that the spaces between them look like calm and are actually the absence of a record.

Stable · v1.0 NightBrief IEC 62366-1 WCAG 2.2 AA
The rule

A gap means nothing was recorded. It does not mean nothing happened, and a timeline that does not say so is asserting the difference away.

And: recorded time and event time are different quantities. A timeline plots one of them and must say which.

What this is, and what it is not

Trend over time handles one measurement repeated: same units, same method, an axis with a meaning. Everything on it is comparable to everything else on it, which is what makes a line legitimate.

A timeline has none of that. Its items are heterogeneous, its density is set by how busy the ward was rather than by the patient, and there is no quantity on the vertical axis at all. It is a reading surface, not a measurement surface, and almost every visual convention borrowed from charting is wrong on it — starting with the line connecting the points, which asserts continuity between a blood test and a ward round.

It is also the source material for Composed output: a handover brief is a timeline flattened into prose, and every failure below survives that flattening in a less visible form.

The gap problem

Six hours with nothing on the timeline can mean the patient was stable and unremarkable, or that observations were due and not taken, or that a device was disconnected, or that the ward was short-staffed, or that the feed from another system was down. These are wildly different clinical situations and they render identically as empty space.

A timeline cannot resolve them. What it can do is stop presenting the ambiguity as information:

Gaps stated, not left to be interpreted
  • 21:00 Observations recorded — NEWS 3 K. Osei, nurse
  • 21:00 – 02:15 No entries. Observations were due at 01:00 and are not recorded. 5 h 15 min
  • 02:15 Pain score 7 recorded K. Osei, nurse
  • 02:15 – 06:30 No entries. Nothing was scheduled in this period. 4 h 15 min

The two gaps look the same and are not the same. The first is a missing observation, which is a fact about the record and possibly about the care. The second is an ordinary quiet night. A timeline that can distinguish them — because it knows what was scheduled — owes the reader that distinction, and one that cannot should say so rather than let the blank space imply the reassuring reading.

This is the Key–value pair discipline applied to a duration: not-recorded and nothing-happened are different states, and collapsing them is the system claiming knowledge it does not have.

Two times, and only one of them is on the axis

Every entry has at least two timestamps: when the thing happened, and when somebody wrote it down. In a busy shift these differ by minutes routinely and by hours often — notes are written at the end, a verbal result is entered when someone gets to a terminal, a drug given at 02:40 is charted at 03:20.

Order is not always known

Two entries stamped 02:15 have no established order. Rendering them stacked puts one above the other and the reader will read that as sequence, because a vertical list is a sequence everywhere else in the interface.

So: entries within the resolution of their timestamps are shown as simultaneous — grouped under one time, not listed as though ordered. Where sequence actually matters clinically and is genuinely unknown, the timeline says it is unknown rather than picking the order that arrived first from the database, which is an artefact of the query.

The one case where order is known without timestamps supporting it is an explicitly recorded causal relation — a drug given in response to an observation. That is a stated link, not an inference from adjacency, and adjacency is never used to imply it.

Compression is lossy, and says so

A week of an admission does not fit on a screen, so a timeline compresses, and compression drops things. The rule is not that it must not; it is that it must never do so silently.

What the timeline can see

A timeline drawn from three of a hospital's seven systems looks exactly like a timeline drawn from all seven. So it declares its sources and its period, in the same terms and for the same reason as Composed output: the reader cannot detect an absent source by looking harder at what is present.

Scope declared with the timeline, not in a settings panel

Drawn from: observations, medication administration, results, clinical notes · 15 Aug 08:00 – 17 Aug 06:30.
Not included: theatre record — system unreachable at 06:41. Retry

States

StateRendering
Populated Entries at event time, gaps stated, sources and period declared.
Gap with an expectation "No entries. Observations were due at 01:00." A fact about the record, stated neutrally — it is not an alarm and does not become one here.
Gap with no expectation "No entries. Nothing was scheduled." Distinguished from the above, because the reassuring reading is only available for one of them.
Source unreachable Named, with the period it would have covered, and a retry. Never omitted quietly, which would render as an unusually calm admission.
Compressed Counts at each position, and the visible window written out.
Empty An Empty state that proves it looked: which sources, which period, and that both returned nothing.
Still loading a source The timeline is not shown as complete while a source is outstanding. A partial timeline presented as whole is worse than a wait.

Who holds each rule

A timeline is a list before it is a graphic, and the list is now something the package ships. The graphic is not.

RuleHeld by Where
The timeline is a list before it is a graphicEvent log An ordered list with its order stated, which is what a screen reader receives whatever is drawn beside it.
Asserted: EventLog: the order is stated and the list is ordered markup
Nothing is ever back-dated invisibly; retrospective entries are visible as retrospectiveEvent log An entry cannot be edited into an earlier position. A correction is a new entry that says what it corrects.
Asserted: EventLog: a superseded entry stays, and says it was superseded
A compressed position states its countEvent log A view showing part of the record says how much it is not showing.
Asserted: EventLog: a shortened view says how much of the record it is showing
The count at a compressed position is exactBadge A badge cannot be capped, so “12 events” cannot become “9+”.
Asserted: Badge: an exact count, never capped
Filtering is not compression, and says what it hidesFilter A filtered timeline states how many entries the filter is hiding.
Asserted: FilterBar: what is hidden is counted on screen
The timeline plots event time and says so; a large gap between the two is shownThe implementer The log renders one time per entry. Plotting event time rather than record time, and showing the gap, is your chart.
Compression is never selective by importanceThe implementer Your compression algorithm.
Zoom states its windowThe implementer Viewer state, rendered as a string you compose.
Gaps are list items, not empty spaceThe implementer A gap is an entry you write into the list. The log will render it; it will not notice one is missing.
Entry type is not carried by the marker aloneThe implementer The marker is drawn by you. The log carries the type in words if you put it in the action.
Why this is written down

A pattern page has no component underneath it, so a rule stated here is held by whoever builds against it unless a component already holds it. Of these 10 rules, 5 are held by a component this package ships, and 5 are the implementer’s. Five held, five not. The list half of a timeline is now trustworthy by construction; the graphic half is entirely yours.

Do's and don'ts

Do

21:00 – 02:15 · No entries. Observations were due at 01:00 and are not recorded.

The gap is a statement about the record. The reader can act on it — which is impossible when it is white space.

Don't

21:00  ·  ·  ·  02:15

Five hours of empty track. It reads as an uneventful night and is equally consistent with observations nobody took.

Do

02:40 · Analgesia given — charted 03:20

Placed at event time, with the recording delay visible so the reader can weight it.

Don't

03:20 · Analgesia given

Plots when someone reached a keyboard. The forty-minute error lands in exactly the reasoning — did the pain score precede the dose? — that the timeline exists to support.

Do

02:15 · 2 entries, order not recorded
  Pain score 7 · Antiemetic given

Groups what is simultaneous as simultaneous. The reader is not handed a sequence the data does not contain.

Don't

02:15 · Antiemetic given
02:15 · Pain score 7

A vertical list is a sequence everywhere else on screen. This one is database return order, and it reads as the drug preceding the assessment.

Do

14:00 · 6 entries — zoom to separate
Showing 15 Aug 08:00 – 17 Aug 06:30

Compression declares what it absorbed, and the window is written out rather than inferred from tick spacing.

Don't

14:00 · Three marks, evenly spaced.

There were six. The reader counts what is drawn, and half the afternoon has been dropped by a layout algorithm.

Accessibility

Outcomes of use

What this contributes to, in the terms of Usability & context of use. These are attributes believed to contribute to an outcome; the outcome itself is settled by observing real use in a specified context, not by this page.

Clinical safety notes

Risk controls this pattern specifies, and what checks each

Trace these in your risk file (ISO 14971) and usability engineering file (IEC 62366-1). Each bullet says what checks it: a component that holds the rule, a test in your verification file, deployment configuration, post-market surveillance, or a design review where no test can see it. A control checked by nothing is a sentence.

NotJustAnyMed.Tech Design System · Clinical timeline · v1.0 · draft for review
Reference applications named in this system are fictional, as are all clinicians, patients, timestamps and record entries shown above.