作者见过的测试套件里最糟的 bug 不是失败,而是通过。一个登录测试点击标着"Continue"的按钮,后来应用在同意页里又加了一个"Continue",录制测试(通过取第一个匹配来解析选择器)开始点错那个。它连续两周保持绿色,因为流程还是走到了某个看似合理的地方,而通过测试没人会回头读。于是这成了 tapflow 流运行器的铁律:凡是要工具替你选择的地方,它都必须明说。这类位置有四个。测试流用 YAML 定义,tapflow flow run 回放,全程零 LLM 调用——同样的输入永远产生同样的步骤和顺序。整个词汇表只有十步:clearState、launchApp、tapOn、inputText、pressKey、swipe、scroll、openUrl、assertVisible、assertNotVisible。核心原则是"歧义就是选择器里的 bug":裸字符串按固定顺序解析,多个元素存活于某阶段时当场失败并告诉你找到了什么。