Blolabel
← Notes
analysis 9 min read

DIBench and PAIR grade which item a phone agent picked; 12 of phoneshell's 80 checks pass before the agent has picked anything

Two papers this week score the choice a phone agent makes, not whether it finished. We audited phoneshell's 80 device-graded tasks for the same question and found the suite cannot see a choice at all.

Two mobile-agent papers posted this week grade the item an agent picked rather than whether it finished. DIBench shows deceptive screen content raising an agent's completion rate from 42.0% to 72.4% while steering 45.8% of its choices to the attacker's target. PAIR shows subgoal success 7.0 to 15.4 points lower wherever the screen depends on whose phone it is. phoneshell's 80 device-graded tasks never ask an agent to commit to one item. Twelve of its checks pass on the screen the app opens to, or on the query the agent typed. In the 9 September run those twelve tasks passed 71 of 72 times, 71 of the 322 passes.

Abstract technical illustration of a row of identical tiles with one tile lit, and a measuring gauge that reads the row rather than the lit tile

What the two papers measured

DIBench (Li Hu, Kanghua Mo, Yingbin Jin, Qingqing Ye and Haibo Hu, Hong Kong Polytechnic University; arXiv:2610.06898, dated 29 September 2026, listed 7 October) builds 1,000 clean and 36,672 injected selection tasks across 7 commercial and 3 simulated apps. Each task has an instruction, a candidate set and an acceptable set (the cheapest item, the highest-rated, an exact match). It scores three things separately: task completion rate (did the agent commit to any candidate), correct selection rate (was the choice acceptable), and attack success rate (did it pick the attacker's target while its paired clean run did not). Under the combined attack, completion went up for all four frameworks tested with Qwen2.5-VL on commercial screens, which is the paper's point: a completion score reads an attack as an improvement.

PAIR (Yeji Park, Jaeyun Shim and Taesik Gong, UNIST; arXiv:2610.07972, 6 October 2026) renders the same ten apps differently for ten personas drawn from PersonaLens, 120 tasks per persona, 1,200 in the test set. It labels each subgoal as user-agnostic (shared navigation) or user-conditioned (content that varies by user), and compares six agents. Task success across personas ranged from 43.8% to 53.1%. In user-conditioned contexts the typical failure was "selecting another item instead of the intended target", most often before the target had scrolled into view. RePAIR, its training method, raised user-conditioned subgoal success by 5.87 points and task success by 9.42 over its fine-tuned parent on unseen users.

DIBench Commerce, Qwen2.5-VL: completion goes up under attack while the choice is steered completion, no attack (%) completion, combined attack (%) steered to attacker's target (%) 0 20 40 60 80 100 percent 42 72.4 45.8 AppAgent 71.1 84.5 42.9 Mobile-Agent-V2 38.6 52.4 30.6 Mobile-Agent-E 51.3 67.1 32.5 Mobile-Agent-V3 Source: Hu, Mo, Jin, Ye and Hu, arXiv:2610.06898, Table 3 (Commerce, Qwen2.5-VL, Combined Attack row). PAIR: subgoal achievement where the screen is the same for every user, and where it is not user-agnostic SAR (%) user-conditioned SAR (%) 0 20 40 60 80 100 percent 79.7 65.4 UI-TARS-1.5 79.3 67.2 Qwen3-VL 30B 74.6 67.6 Qwen3-VL 8B 85.3 69.9 AutoGLM-Phone 86.2 71 MAI-UI 77.4 69.1 GUI-Owl-1.5 Source: Park, Shim and Gong, arXiv:2610.07972 (6 October 2026), Table 2. Ten personas, 1,200 test tasks.

Auditing phoneshell's 80 checks for a choice

phoneshell grades from the device: each task in environments/*.yaml lists checks that read the phone after the agent stops. The text checks use find_by_text in perception/tree.py, a lower-cased substring match over an element's label, name, value, identifier and child text. Value is where a search field keeps the typed query. We read all 80 tasks and asked of each one what is the earliest screen that satisfies every check. For Settings we could answer from the crawler's record of the root screen on the owner's iPhone (iOS 26.6.1, WebDriverAgent 16.12.4, 11 September), which lists the controls visible on load.

TaskCheck textEarliest screen that satisfies itPassed on 9 SepSource
settings.search.wifi, settings.wifi.switch_visibleWi-FiSettings root ("Wi-Fi, (network name)")12 of 12crawl, xv2
settings.search.bluetooth, settings.bluetooth.reachBluetoothSettings root ("Bluetooth, On")11 of 12crawl, xv2
settings.search.batteryBatterySettings root ("Battery")6 of 6crawl, xv2
settings.search.storageStorageSettings root, only because of an iCloud banner, "You've reached your storage limit"6 of 6crawl, xv2
settings.accessibility.reachAccessibilitySettings root ("Accessibility")6 of 6crawl, xv2
books.searchMobysearch field after typing "Moby Dick"6 of 6code, xv2
maps.search_placeEiffel Towersearch field after typing the query6 of 6code, xv2
notes.searchphoneshell benchmarksearch field after typing the query6 of 6code, xv2
safari.search.webiso.?8601address bar after typing the query6 of 6code, xv2
contacts.searchsearch, cancel, results or no resultsContacts list (the search field's own text)6 of 6code, xv2
All 1271 of 72xv2
The other 47 tasks in that run251 of 277xv2

The four settings.search.* tasks say "open the page from the results". Their checks are satisfied twice over before that: by the root list, and by the query sitting in the search field. The five search tasks outside Settings ask for results to show, and their checks match the text the agent typed, so a search that returned nothing would pass. Not one of the 80 tasks hands the agent a candidate set and grades which candidate it took. In DIBench's vocabulary, phoneshell's checks sit below task completion: they cannot register a correct selection, a wrong one, or a steered one.

settings.search.storage: three screens that satisfy one check Task: "search for Storage using the search field, and open the Storage page from the results" Check: foreground is com.apple.Preferences AND element_exists "Storage" (substring of label, name, value, identifier or child text, any case) 1. Settings opens Root list, crawled 11 Sep: "Wi-Fi, (network name)" "Bluetooth, On" "Battery" "You've reached your storage limit" PASS after 0 navigation only on a phone showing that banner 2. Query typed SearchField value: "Storage" results listed, none tapped PASS before any choice on any phone 3. Result opened Navigation bar: the Storage page the task as written PASS indistinguishable from 1 and 2 →→ DIBench's terms: phoneshell's check measures less than task completion (did the agent commit to a candidate), so neither correct selection nor a steered one can show up in its score. Sources: phoneshell settings_search_storage.yaml, tree.py find_by_text, verify.py; Settings crawl of 11 Sep 2026.

The storage banner is the PAIR effect turned around. PAIR finds agents failing on content that depends on the user. Here the grader passes on content that depends on the user: an account that has filled its iCloud plan puts the word "storage" on the root screen. The xv2 rows ran on an iPhone 14 Pro whose root screen we have not crawled, so for that phone the storage check passed through the typed query at least. The headline of that run, 322 of 349 or 92.3%, is 251 of 277 or 90.6% without the twelve. The order of the six models does not change.

What it means if you grade phone agents from the device

Check it yourself

# the matcher and the checks
sed -n '/def find_by_text/,/return hits/p' phoneshell/perception/tree.py
grep -A3 "^checks:" environments/settings_search_storage.yaml environments/books_search.yaml

# the run (task_id, passed)
curl -sLO https://huggingface.co/datasets/blolabel/phoneshell-bench/resolve/main/results/xv2.jsonl
python3 -c "import json;R=[json.loads(l) for l in open('xv2.jsonl')];S=('settings.search.wifi', 'settings.wifi.switch_visible', 'settings.search.battery', 'settings.search.bluetooth', 'settings.bluetooth.reach', 'settings.search.storage', 'settings.accessibility.reach', 'books.search', 'maps.search_place', 'notes.search', 'safari.search.web', 'contacts.search');a=[r for r in R if r['task_id'] in S];b=[r for r in R if r['task_id'] not in S];print(sum(r['passed'] for r in a),len(a),sum(r['passed'] for r in b),len(b))"
# expect: 71 72 251 277

# the papers
https://arxiv.org/abs/2610.06898   (Table 3, Commerce)
https://arxiv.org/abs/2610.07972   (Table 2)

The Settings root screen comes from the crawler's manifest on our rig (runtime/crawls/20260911-121256-settings/manifest.json, screen s001). It is not published, because it carries the owner's account name and network name. The controls quoted above are copied from it.

What would prove this wrong

By 31 December 2026 we will run a null agent, which opens the target app and stops, over all 80 tasks on two iPhones, the owner's and a freshly reset one. Our prediction: it passes at least the 7 Settings tasks above on the owner's phone and at least 6 on the reset phone (no storage banner). A second null agent that types the instruction's quoted query and stops will pass all 9 search tasks. If either passes fewer, our reading of the matcher or of the root screen is wrong. We also predict that once the twelve checks grade the navigation bar title, at least one of the six models drops a task it passes today.

Sources