Design a Health Dashboard That Exposes Uncertainty and Connection Errors A developer proposes a health dashboard design that explicitly separates data source state from data meaning to avoid misleading users with ambiguous 'no data' messages. The pattern, illustrated with TypeScript types and accessible HTML, distinguishes states like stale, disconnected, partial, and error to ensure uncertainty is not hidden behind false certainty. A lab card says “No data,” but that phrase could mean no matching record, a disconnected source, a delayed refresh, a filter mismatch, or a request failure. Collapsing those states into an empty chart makes uncertainty look like certainty. The interface needs two layers: what the source reports and what the application currently knows about that report. OpenAI’s July 23, 2026 announcement says Health in ChatGPT is rolling out on web and iOS to eligible logged-in US users age 18 and older. According to the announcement https://openai.com/index/health-in-chatgpt/ , supported connections include medical records and Apple Health, while the dashboard can cover labs, medications, activity, sleep, and other health information. OpenAI states connected data and relevant conversations are not used to train foundation models or target ads. This article treats those as attributed statements and proposes a generic UI pattern, not a reconstruction of that interface. Do not make color carry the entire message. A card can use this unexecuted TypeScript model : type SourceState = | { kind: "current"; observedAt: string; sourceLabel: string } | { kind: "stale"; lastSuccessAt: string; sourceLabel: string } | { kind: "disconnected"; sourceLabel: string } | { kind: "partial"; available: number; expected?: number } | { kind: "error"; retryable: boolean; reference: string }; type MeaningState = | { kind: "reported"; display: string; unit?: string } | { kind: "missing"; reason: "none found" | "filtered" | "unknown" } | { kind: "unsupported"; explanation: string }; type HealthCard = { title: string; source: SourceState; meaning: MeaningState }; SourceState answers whether retrieval is trustworthy enough to display. MeaningState answers what can honestly be said about the value. Keeping them separate prevents a successful network response from implying interpretation and prevents an error from being shown as a zero.