ClutchView / React Native case study

Live match state without duplicate goals.

A React Native match interface that separates event delivery from accepted state. Late, duplicate, and out-of-order events should not become duplicate feedback.

Match replay

This browser replay is the short version. The mobile app adds disconnect buffering, delayed delivery, duplicates, and reversed event pairs through its Fault lab.

48:00
NLA 0:1 MC
Ready
4× demo speed

Projection watchlist

Marcus Bennett Shots 0 / 2
Alejandro Fernández Shots on target 0 / 1
Christopher Montgomery-Wells Assists 0 / 1

Accepted events

No accepted events. Start the fixture.

See the iOS app
ClutchView live match screen showing a score, player watchlist, match tape, and replay controls.
iOS simulator capture. Expo + React Native.

Accept the event before showing the goal.

At the critical moment, the score, player projection, match tape, haptic, animation, and VoiceOver announcement all need to agree. ClutchView triggers that feedback only after the domain accepts the event, not when the transport happens to deliver it.

That one boundary prevents a duplicate packet from becoming a duplicate celebration.

The recovery contract

Failure states are part of the product surface, not hidden test scaffolding.

Duplicate Ignore the known ID No extra progress or feedback
Sequence gap Buffer the future event Show stale until the gap closes
Disconnect Keep source time moving Catch up in order on reconnect
Wrong match Reject explicitly Never fabricate success
15 to 7

Fewer projection renders across the same match.

A value-aware component boundary cut projection-row renders by 53% across the deterministic fixture. A render-budget test protects the result.

The documented simulator run held 60 UI and 60 JS FPS in Expo Go development mode. It is evidence for this fixture, not a production-device benchmark.

Engineering notes

Scope and next steps

ClutchView is a deliberately narrow vertical slice. It has no authentication, wagering flow, or production sports feed. That scope made room to go deep on live-event correctness, accessibility, failure recovery, testing, and measured rendering behavior.

Next: a versioned WebSocket contract, a persisted reconnect cursor, and production-build profiling across representative physical devices.