In a trading interface a wrong value is worse than a missing one. How making “unavailable” a first-class state shaped the architecture of the Trade Sider terminal.
Most dashboards fail quietly. A feed stalls, a request times out, and the interface keeps showing the last value it had — or worse, a placeholder that looks like data. In most products that is an annoyance. In a trading terminal it is a decision made on a number that is not real.
When we built the Trade Sider terminal, we started from one rule: every value on screen is either real, sourced and timestamped — or it is explicitly unavailable. Nothing in between.
Unavailable is a state, not an error
The rule only holds if it is enforced by the architecture rather than by discipline. So "not connected" is not an exception path; it is a value that flows through the same pipeline as a live quote.
Every data category — FX, crypto, rates, positioning, calendars — is resolved through a single provider registry with normalized types. Widgets never call a provider directly. When a category has no free, official source, the registry returns an unconfigured provider whose only possible answer is an honest status. The widget renders it with the same components it uses for live data.
type DataStatus = "LIVE" | "DELAYED" | "STALE" | "HISTORICAL" | "CALCULATED" | "UNAVAILABLE" | "OFFLINE";
interface Sourced<T> {
value: T | null;
status: DataStatus;
source: string;
asOf: string | null; // the provider's own timestamp, never ours
}Because the status travels with the value, the interface cannot forget it.
Freshness comes from the source
A quote labelled live should mean the provider says it is live. Freshness is therefore derived from each provider's own last-updated timestamp, and degrades automatically — live, then delayed, then stale. A daily central-bank reference rate is labelled historical, because that is what it is, even though it is the most recent value available.
Disclose the method
Several views in the terminal show statistics the app computes itself: seasonality, realized volatility, trade analytics. Each of them states that it is calculated, the sample it was calculated on, and the method. A seasonality chart built on fifteen years of daily closes says so; a pair with too few observations reports that it cannot produce a meaningful result instead of drawing a thin, confident line.
What it cost, and what it bought
The cost is mostly visual: some panels show "not connected" where a mock-up would have shown an attractive chart. The benefit is that every number a trader sees can be trusted to be what it claims to be — and that connecting a paid data source later requires no interface changes at all, only a new provider behind the registry.
The same principle now runs through the AI layer. Alfred, the terminal's analyst, reads data through the same registry, so a failed lookup becomes an honest answer rather than an invented one.
Honesty, it turns out, is an architecture decision.