"A submitted command is not a visible state change until the engine acknowledges it."
The Little Lie That Feels Like Speed
The fastest-feeling way to build a pause button is to flip your UI the instant the user clicks: set isPaused = true, then tell the engine to pause. It feels instant because it is instant — the UI didn't wait for anything. It also just told a small lie. The engine hasn't paused yet. Usually it will, a few milliseconds later, and nobody notices. Sometimes it won't — a slow frame, an error, a race — and now your button says one thing while the video does another.
Multiply that across pause, seek, track selection, speed, and full screen, and you've built a player whose controls are a story about what you asked for, not a report of what happened. That gap is where the maddening bugs live.
Command Is a Request, Reality Is a Report
The fix is a mindset before it's code: a command you send is a request, and the engine's observed state is the only report. You already built the reporting channel in Track 2 — observed properties. Now you use it for real: send the request, and let the observed property update the UI when the engine's value actually changes. The UI stops predicting and starts reflecting.
The same feature, told as a lie and as the truth:
Pending Is an Honest State
Between request and report there's a real, nameable moment: pending. Ashen Reel is comfortable showing it — a brief hint that the action is in flight — because pending is honest and a false 'done' is not. Naming the in-between state is what lets the UI tell the truth continuously: requested, then pending, then whatever the engine actually reports. No step pretends to be a later step.