F4.4 — Staleness badging & data-status UX
Make data trustworthiness visible: users should always know how fresh the numbers are, when they're degraded, and which panels aren't real yet. This is the UI half of the pipeline's staleness contract (markStale in MetricsSnapshotS3Store).
Signed off as Done, but zero PRs are attached to this ticket — no GitHub evidence confirms any of the seven staleness/degraded-data UX behaviours (last-sync timestamp, stale badging, silent-staleness detection, hidden v2 panels, demo-QC labelling, fetch-failure indicator, per-state component tests) landed under this ticket. This UI is closely coupled to F4.1's dashboard app, which is a plausible place the work actually shipped, but nothing here confirms that.
- Since last activity
- 11d
- Oldest staged work
- —
- Acceptance criteria covered
- 0/7
- PRs open
- 0
Stories
- Done, unverifiedNo branch or PR yet
1 tracked · 1 done, unverified
Acceptance criteria
- computedAt renders as a visible last-sync timestamp (relative + absolute) on every viewno signal
- A stale:true snapshot shows a degraded-data banner with lastSuccessfulAt, without blanking or erroringno signal
- A computedAt older than 3 cycles without a stale flag shows the same degraded banner client-sideno signal
- Date-derived v2 panels are hidden, not zero-filled, until WPP supplies field datesno signal
- Demo-QC panels carry a clear marker while QC_DATA_MODE=demono signal
- A failed poll keeps the last rendered data with a connection-lost indicator, recovering on the next successful pollno signal
- Component tests cover each state: fresh, stale-flagged, silently-stale, demo-QC, fetch-failedno signal
Gaps
- computedAt renders as a visible last-sync timestamp (relative + absolute) on every view — no ticket or code
- A stale:true snapshot shows a degraded-data banner with lastSuccessfulAt, without blanking or erroring — no ticket or code
- A computedAt older than 3 cycles without a stale flag shows the same degraded banner client-side — no ticket or code
- Date-derived v2 panels are hidden, not zero-filled, until WPP supplies field dates — no ticket or code
- Demo-QC panels carry a clear marker while QC_DATA_MODE=demo — no ticket or code
- A failed poll keeps the last rendered data with a connection-lost indicator, recovering on the next successful poll — no ticket or code
- Component tests cover each state: fresh, stale-flagged, silently-stale, demo-QC, fetch-failed — no ticket or code
Criteria are read from the ticket description on every run. A gap closes on its own once a story or PR matching it appears — nothing here is closed by hand.