The worst bug I've seen in a test suite wasn't a failure. It was a pass.

A login test tapped a button labeled "Continue". The app then shipped a second "Continue" inside a consent sheet, and the recorded test — which resolved its selector by taking the first match — started tapping the wrong one. It stayed green for two weeks, because the flow still ended up somewhere plausible, and a passing test is not something anyone goes back and reads.

So that became the rule for tapflow's flow runner: anywhere the tooling has to choose for you, it has to say so. Finding those places took longer than fixing them — there were four.

Last time I wrote about getting an accessibility tree out of a simulator that has no window, on both iOS and Android, in one schema. This post is about what that tree is for.

The automation axis here — the flow runner and the MCP server — is experimental. The manual browser QA path is the mature one.