"A spinner that never resolves is a lie with an animation. Show the real state, even when the real state is 'waiting'."
The UI Must Not Out-Confident the System
Honest offline isn't only a data rule; it's a UI rule. The interface must never claim more certainty than the system actually has. If a turn is pending because you're offline, the screen must say waiting — not show a spinner that implies work is happening, and definitely not show a checkmark that implies it's done. The four internal states from Track 2 aren't just for the code; each one deserves a distinct, truthful surface the user can read at a glance.
Four States, Four Honest Faces
- Pending — captured, not yet sent (often offline). Say so: "Saved. Waiting to reach Pippa." This is a calm, safe state, and the UI should feel calm, not alarmed.
- Sending — actively delivering. A spinner is honest here, because work really is happening right now.
- Answered — a real reply materialized from a canonical call. Only now does the answer appear.
- Failed — delivery attempted and errored. Show it plainly with a retry affordance; the turn is safe and re-sendable, and the UI should convey exactly that, not panic.
The discipline is one-to-one: no UI state should exist that doesn't correspond to a real system state, and no system state should be invisible. When those line up, the user's trust is earned continuously — what they see is always what's true.
Why Visible Beats Optimistic
Optimistic UI — showing success before it's confirmed — is popular because it feels fast. But for a client whose whole value is trust under bad conditions, optimism is a small lie that compounds. Show a message as "sent" before it's delivered and, on a flaky link, the user builds a false model of what got through. Pippa Go prefers visible over optimistic: a slightly less snappy pending badge that's always true beats a satisfying checkmark that's sometimes false. The badge is the promise, rendered.