A number on a screen has not changed for ten minutes. There are two explanations. Nothing traded, or the pipe that delivers the number broke. From the screen alone they look the same, and they call for opposite responses.

Why they look alike

A display shows the last value it received. When the market goes quiet, no new value arrives and the last one stays. When the feed stops, no new value arrives and the last one stays. A flat line is all the screen can draw in either case.

Quiet is common and legitimate. A stock token’s supply does not change over a weekend when no one mints or redeems. A thin market can go minutes without a trade. So an unchanged value cannot be treated as an alarm.

What tells them apart

The difference lies in the timestamps. Every reading has two times: when the source last produced a value, and when the system last successfully asked. In a quiet market the second keeps advancing while the first stays put. The system is checking and the answer is the same. In a stopped feed both freeze. Two timestamps covers the pair in more depth.

So the test is whether checks are still succeeding. A value that is old but was confirmed a few seconds ago is quiet. A value that nobody has been able to confirm is unknown. How to tell whether market data is stale sets out the wider version of this test.

Other evidence

Neighbors help. If one market is flat and every other market from the same source is updating, the market is probably quiet. If everything from one source froze at the same second, the source is the problem. Markets do not go quiet in unison.

The clock helps too. Flat during a session that should be busy is suspicious. Flat on a Sunday in an instrument tied to stock market hours is expected.

What a system should show

A dashboard that cannot tell the two apart should say so. The honest states are three: fresh, quiet but confirmed, and not confirmed. The third should look different on the screen. A stale value drawn in the same color as a live one is the failure that matters, because the reader has no way to discount it.

For anything that draws a history, an outage should appear as a gap. Joining the points on either side with a line invents readings for a period that was not observed.

What a consumer should do

A program reading a feed should check age before using a value and treat an error differently from an empty answer. An error means the source could not look. An empty answer means it looked and found nothing. A source that returns empty when it is broken makes those indistinguishable, which is why absent is not empty. A background signal that the pipe is alive, covered in what a heartbeat is for, closes the remaining hole.

Where NoVo stands

Every reading on the MCP & API carries as_of, age_seconds and as_of_kind. A stopped feed answers with an error and a retry time, never an empty result. That lets a client separate a quiet market from a broken pipe without guessing.