E5.17.4badge-state consistencydesign

Badge logic must match the actual state exactly

Aliases: stale unread · false red dot

What it is

A navigation badge is internal state leaking onto the destination. The rule that lights it must match the real state: nothing unfinished inside, stay dark; still unfinished, stay lit; the number must match the objects. When it does not, people walk in and find nothing, or walk past a dark door and miss work. This is not habituation (a long-lit mark going numb). It is truth on every frame.

Why it happens

Badges are usually a cached aggregate: a count on the unread table, a queue length, cart rows. If the aggregate is written apart from the source table, the two fork — a read writes back to the source and the count does not decrement; a push increments the count and the source has no row. Users take the navigation as true, find a mismatch inside, and demote every badge to untrusted. Multiple devices fork more easily: read on the phone, still lit on the desktop. An aggregate query written loosely (“ever had unread, stay lit”) produces systematic false positives.

False negatives are as bad: filtered, archived, or handled by someone else, the source is already empty, and the navigation still demands a visit. False positives train ignore; false negatives train people not to trust navigation and to spot-check instead; the badge is then unemployed as a choice cue.

Where it stops holding

A short network delay may leave the badge a beat behind, but entering the destination should correct to the source immediately; a wrong count must not hang for the rest of the session. An intentional optimistic +1 must roll back on failure. When permission can see only some objects, the badge must count the visible ones; counting invisible unread will not match what is inside. Demo data and coach-mark fake unread mixed into the real channel dirty consistency for good.

Applying it

  • Aggregate the badge from the same source as the list. Read, handle, and delete decrement the count on that same write path.
  • Across devices, the source is authority. Align when the navigation is shown or the destination is entered; do not let each device keep its own count for long.
  • Treat “list empty, badge on” and “unfinished in the list, badge off” as defects, not visual issues.
  • How to check: handle one item on one device; the other device’s nav should clear or decrement the next time it is visible. Fork source and cache on purpose; the UI should correct to the source. Compare list length with the badge number; a mismatch is an aggregate to fix, not a colour to tweak.

Related

  • Within the group: E5.17.1 A nav badge signals unfinished work inside that destination · E5.17.2 Large counts on badges need a compacted display · E5.17.3 A badge that never clears dulls sensitivity to new items
  • Adjacent: E5.16 Shortcuts and Pinned Items · E6.11 Badges and Dots
  • Search terms: badge consistency · unread source of truth · stale count

Cards in the same group

Quick Actions

Share

Share this page

ios_share

https://hci.top/en/handbook/E5.17.4