Blolabel
← Notes
analysis 7 min read

MobiFlow's own text and its own table disagree about which model scores 60.4; phoneshell never needs the trajectory graph MobiFlow builds to referee that argument

MobiFlow's introduction and its Table 3 agree that UI-TARS-1.5 scores 60.4% and GUI-Owl scores 55.7%. Section 5.2 of the same paper instead credits that 60.4 figure to GUI-Owl, under a different metric than the one Table 3 defines. The two readings cannot both be right, and the paper does not say which one is. phoneshell never has to adjudicate a result like this, because it never needs the trajectory-fusion graph MobiFlow built to get a result in the first place.

MobiFlow, posted to arXiv as 2604.09587 by a team including researchers at Shanghai Jiao Tong University, starts from a real constraint: AndroidWorld-style benchmarks score a task by reading system-level emulator state, and most third-party apps simply do not expose that state the way the handful of open-source reference apps those benchmarks lean on do. MobiFlow's answer is to record multiple human trajectories through the same task on a real third-party app (the paper's own example: 7 recorded paths cover every valid way to complete a roughly 15-step Weibo-comment task) and fuse them into a single state-transition graph, which becomes the thing a model's run is checked against. Across 20 third-party apps and 240 real-world tasks, the paper reports UI-TARS-1.5 at 60.4% and GUI-Owl at 55.7% success rate in its base scenario, in both the introduction and Table 3.

Abstract technical illustration on a dark grid: seven thin divergent lines representing separate recorded paths converging and merging into one thick braided graph structure with branching nodes, labeled with a highlighted number that appears twice in two different colored boxes pointing to two different small model-icon squares, with a separate, isolated single phone-outline icon off to one side with a direct straight line to a small checkmark and no graph behind it at all, cool blues and teals with one amber accent on the ambiguous duplicated number

What changed, and when

Section 5.2 of the same paper states that "GUI-Owl attains the highest completion rate (CR) of 60.4." That sentence assigns the number 60.4 to GUI-Owl and to a metric called completion rate. But Table 3 lists 60.4 as UI-TARS-1.5's success rate (SR), and gives GUI-Owl's own completion-rate column a different value entirely, 77.9. Read literally, the paper's prose and its own table disagree about both which model earns the 60.4 figure and which metric it belongs to. We read this from the sections of the HTML version available to this check on 24 October 2026 and could not find a correction or an explanation for the mismatch elsewhere in the text; it may be a labeling slip in the prose, a table that was updated after the prose was written, or something else, and we are stating that plainly rather than picking the reading that makes a cleaner headline.

MobiFlow Table 3 vs. Section 5.2's own description 0 25 50 75 100 60.4UI-TARS-1.5, Table 3 SR 55.7GUI-Owl, Table 3 SR 77.9GUI-Owl, Table 3 CR 60.4"GUI-Owl's CR" (§5.2 text) Source: arXiv:2604.09587, Table 3 and Section 5.2, read 24 October 2026. SR = success rate, CR = completion rate.

Fusing trajectories to see state phoneshell just reads off the phone

MobiFlow's graph-fusion method exists for a specific reason: an emulator running a third-party app usually cannot tell a benchmark whether a task actually succeeded, because the app's own internal database is opaque from outside. Recording several real completions of the same task and fusing them into a state-transition graph gives the benchmark something to check a new run against, without needing the app's cooperation. phoneshell's checks (phoneshell/bench/schema.py's Check class) do not face this problem the same way, because phoneshell is not driving an emulator against an app that might hide its state. It drives one physical iPhone and reads the operating system's own signals directly: which app is in the foreground, what a Settings toggle's value is, what text is on screen, each as a named check kind rather than an inferred position in a fused graph. Where MobiFlow has to reconstruct what "done" looks like from multiple recordings because the app itself won't say, phoneshell can usually just ask the phone.

Checking task success: MobiFlow vs. phoneshell MobiFlow 7 recorded human trajectories → fused state-transition graph → new run checked against graph needed because the app's own state is opaque to an emulator 20 apps, 240 tasks phoneshell one physical iPhone, iOS 26.6 → Check reads OS state directly (foreground app, settings, text) no graph, no fused trajectories, no app cooperation needed 80 tasks, 1 device Source: arXiv:2604.09587, Section 4.1; github.com/Blomega/phoneshell/blob/main/phoneshell/bench/schema.py, read 24 October 2026.
DimensionMobiFlowphoneshellSource
How task success is checkedState-transition graph fused from multiple recorded human trajectories (7 covered one 15-step task)Named Check objects reading OS-level device state directly (foreground app, settings value, on-screen text)arXiv:2604.09587; phoneshell/bench/schema.py
Scale20 third-party apps, 240 real-world tasks80 public tasks, one physical iPhone 17 Pro Max, iOS 26.6arXiv:2604.09587; blolabel.ai houseFacts
Reported model scores (base scenario)UI-TARS-1.5 60.4% SR; GUI-Owl 55.7% SR / 77.9% CR (Table 3); §5.2 text instead calls 60.4 GUI-Owl's CRNot comparable; phoneshell reports one pass/fail per task, not SR/CR splitarXiv:2604.09587 Table 3 and §5.2
Why the method existsMost third-party apps do not expose system-level state an emulator can readNot applicable; checks read the real device's own OS signals, no app cooperation neededarXiv:2604.09587; phoneshell/bench/schema.py

What it means for anyone reading a benchmark's own numbers

Check it yourself

# MobiFlow's own Table 3 vs. its Section 5.2 description
curl -s https://arxiv.org/html/2604.09587 | grep -i "60.4\|UI-TARS-1.5\|GUI-Owl\|completion rate"

git clone https://github.com/Blomega/phoneshell && cd phoneshell
grep -n "class Check\|kind:" phoneshell/bench/schema.py          # named check kinds, no fused graph
grep -rn "foreground_app\|settings" phoneshell/bench/ | head -5  # checks read OS state directly

What would prove this wrong

We claim MobiFlow's Table 3 and its Section 5.2 text assign the number 60.4 to two different models under two different metrics, with no reconciliation in the sections we read. That is wrong if a later revision of arXiv:2604.09587 corrects or explains the mismatch, which we will check by 30 April 2027. We also claim phoneshell's checks read real device OS state directly rather than inferring state from a fused trajectory graph; that is wrong the moment any check in phoneshell/bench/schema.py or its verifier does the latter, and we found none as of 24 October 2026.

Sources

  1. MobiFlow: Real-World Mobile Agent Benchmarking through Trajectory Fusion, arXiv:2604.09587, submitted 28 February 2026, read 24 October 2026.
  2. Full text with Table 3 and Section 5.2: arxiv.org/html/2604.09587, read 24 October 2026.
  3. Blolabel, phoneshell/bench/schema.py, read 24 October 2026.