Driving and judging
Driving happens by sight; judging happens by log. Moving the verdict off the pixels was the biggest improvement.
With no handles on the screen, the path has to look like this.
The best improvement was moving the verdict
I started out certain that logs couldn’t tell me anything about game state, because the standard log channel was suppressed.
Wrong. Only that one channel was suppressed. The engine writes its own file log on the device, and it contains the full state-machine transitions and every RPC sent and received.
That set the evidence order.
Received RPC > state transition > screen
Why the screen comes last
Pixels cannot separate two things.
- A loading spinner from a frozen frame — both are “a picture that’s animating”
- Two states that render identically — a screen showing a request in flight and one that already failed and returned can look the same
Logs separate them. If there’s a record of the request going out and a record of the response arriving, the state is determined regardless of what’s on screen.
And only after the verdict moved from pixels to logs did unattended long runs become possible. Vision-based judging calls a human on an ambiguous screen — and unattended, there is nobody to call.
Vision stayed on the driving side
Removing it from judging didn’t mean discarding it. Driving still has nothing but vision.
It’s the only way to know where a button is. But driving and judging have different requirements.
- Driving recovers from being wrong. Tap the wrong place and the screen doesn’t change; noticing that, it looks again.
- Judging becomes the result when it’s wrong. A case wrongly marked PASS is never revisited.
So vision sits where being wrong is survivable, and logs sit where it isn’t. Using one tool for both purposes while demanding different reliability from each doesn’t hold up.
Where it still bites
- A silent freeze doesn’t trip the error counter. Nothing fails; it just stops. So screen-change magnitude is tracked as its own axis, with staged recovery and a hard cut when nothing moves
- Capture before you tap — a fresh process has no screen-scale state yet
- After a restart, the previous session’s log resurfaces before rotation. Delete it and read from offset zero
- The auto-connect chain runs straight through on remembered credentials, so first-screen cases are only measurable from a cleared-data cold boot