Blolabel
pre-registered · 120 paired runs · physical iPhone, iOS 26

Vision Is Worth
100 Points Or Zero.
Never In Between.

We gave three frontier models the same task on a real iPhone, once with a screenshot and once without, and varied only where the answer lived. When it was in the accessibility tree the picture changed nothing. When it existed only as pixels, the picture was the entire task.

See the result →
30/30 with the image 0/30 without it p < 0.0001
100%with the screenshot
0%without it
120paired runs
3frontier models
+35%cost of the image
80public tasks

The result

Every task was run twice by the same model, back to back, with the order alternating. The only thing that differed between the two arms is whether the model was shown the screen.

Where the answer livesWith the image Tree onlyMcNemar exact
Only in the pixels
a word drawn into a picture, no alt text
30/30
100%
0/30
0%
p < 0.0001
In the accessibility tree
the control: same page, same question
29/30
96%
30/30
100%
p = 1.0

The interaction is the finding, not the headline number. The control row shows nothing at all. Same pages, same navigation, same question shape, same resolution, same prompt: the only difference is where the answer sits. So the effect cannot be an artifact of the harness, and a model that scores 100% on one row scores zero on the other.

The same effect in every model

This is a replication check, not a ranking. The task is deliberately binary, so any model that can read gets everything with the image and nothing without it. Identical numbers are the expected result and the point of them: an effect that varied by model would suggest one model’s eyesight rather than a property of the information. For an actual comparison between models see the leaderboard.

ModelWith the imageTree only p
Gemini 3.1 Pro10/100/100.0020
Kimi K310/100/100.0020
GPT-5.110/100/100.0020
WHAT IT COSTS

+35% per task

Carrying the screenshot is a pure token tax. Step counts were unchanged either way, so the model does not work harder with it, only more expensively.

THE RULE

Send it for rendered content

Not as a global setting. On a labelled screen the image buys nothing; on a map tile, a chart, a book cover or a canvas it is the whole task.

THE LIMIT

This shows existence, not degree

A binary task proves the effect crisply and says nothing about size. On a realistic screen the answer is rarely wholly present or wholly absent, and how much vision is worth in between is not measured here.

THE CATCH

Apple labels its own apps well

Across thirteen first-party screens, eleven were fully described by their tree. Third-party apps are a different story: one chat app returns WAMessageBubbleTableViewCell where a button name should be.

Why you can believe it

An earlier version of this experiment reported that vision was worth nothing, and it was wrong. The image had been downscaled to 235×512, so the vision arm was never a test of vision. That retraction is why the method below exists.

01 PRE-REGISTERED

The analysis was fixed first

The design, the primary endpoint, the minimum detectable effect and the falsification condition were committed to git before the run. The sequence is auditable.

02 CONTROLLED STIMULUS

Not found, built

Ten pages, each with one word in HTML and another rendered into an image. Verified on the device: 0 of 10 image words appear anywhere in the tree, 10 of 10 written words do.

03 PAIRED AND INTERLEAVED

Drift cancels

Each task runs both ways back to back with the order alternating, so device state cannot load onto one arm. A real phone changes underneath you.

Leaderboard

Every task runs on a physical iPhone. Nothing is simulated, and no human decides whether a run passed.

ModelPass ratePassedAvg stepsAvg timeCost/task
Kimi K391.7%95% CI 74–98%
22/246.262s$0.023
GPT-5.183.3%95% CI 64–93%
20/246.542s$0.008
Claude Opus 4.883.3%95% CI 64–93%
20/245.846s$0.113
Qwen3-Max83.3%95% CI 64–93%
20/246.339s$0.008
Gemini 3.1 Pro79.2%95% CI 60–91%
19/245.249s$0.022
DeepSeek v3.275.0%95% CI 55–88%
18/248.976s$0.005
None of the 15 pairs of models on this board separate. Every model ran the same 24 tasks, which makes this a paired comparison, and not one pair reaches p<0.05 under McNemar’s exact test. The order of the table above is sorted, not ranked. The widest gap on the board would need about 33 tasks to reach significance, against the 24 it has.

Every pair, tested

Wins are counted only on tasks where the two models disagreed; tasks they both passed or both failed carry no information about which is better. The last column holds each pair’s observed disagreement rate fixed and asks how large the suite would have to be for that gap to be real.

PairWins pTasks needed
Kimi K3 vs DeepSeek v3.24–00.1233 tasks
Kimi K3 vs Gemini 3.1 Pro3–00.2544 tasks
Kimi K3 vs Claude Opus 4.82–00.5066 tasks
Kimi K3 vs GPT-5.12–00.5066 tasks
Kimi K3 vs Qwen3-Max2–00.5066 tasks
GPT-5.1 vs Gemini 3.1 Pro1–01.00132 tasks
Claude Opus 4.8 vs DeepSeek v3.24–20.69148 tasks
GPT-5.1 vs DeepSeek v3.24–20.69148 tasks
Qwen3-Max vs DeepSeek v3.24–20.69148 tasks
Qwen3-Max vs Gemini 3.1 Pro2–11.00295 tasks
Claude Opus 4.8 vs Gemini 3.1 Pro3–21.00485 tasks
Gemini 3.1 Pro vs DeepSeek v3.24–31.00676 tasks
Claude Opus 4.8 vs GPT-5.12–21.00never: the wins are symmetric
Claude Opus 4.8 vs Qwen3-Max2–21.00never: the wins are symmetric
GPT-5.1 vs Qwen3-Max2–21.00never: the wins are symmetric

Of the 24 tasks, 12 were passed by every model and 2 by none. Only 10 tell the models apart, so 58% of the suite is measuring nothing. Harder tasks, not more models, is what this benchmark needs next.

A task passes only if the phone itself ends in the required state. What the agent says it did counts for nothing: an agent that reports “I have enabled that setting” and an agent that enabled it are different things, and only the second one passes.

What it measures

A pass rate says how often a model succeeded. This says at what. Each capability is isolated by at least one short task, so a failure names a missing skill instead of pointing vaguely at a long task that went wrong somewhere in the middle.

CapabilityWhat it takesTasksPassed
app-resolveturning a spoken app name into the right bundle id11/1
backleaving a screen when the way out has no label11/1
context-menuholding a link until its preview menu opens11/1
date-navigatemoving around a calendar rather than a list11/1
edge-gesturea swipe that must start at y=0, off the drawn screen10/1
hierarchygoing up, not just down, through nested screens44/4
icon-only-controla control with a glyph and no text to match on11/1
lifecyclelaunching, backgrounding and returning to an app22/2
pickerreaching a spinning wheel11/1
picker-multiaddressing the right column when several are side by side11/1
picker-setturning a wheel to a value, which a swipe cannot do22/2
precise-tapshitting small targets laid out in a grid11/1
read-fieldreading a value back off the screen, not guessing it22/2
recovernoticing the wrong app is open and fixing it11/1
render-dependent10-
scroll-endreaching something below the fold11/1
search-then-actusing an app's own search instead of navigating55/5
sliderreaching a continuous control11/1
switchreading and setting a toggle11/1
tabbarmoving between tabs in an unfamiliar app33/3
text-exacttyping a string that must match character for character11/1
text-longtyping something long enough for autocorrect to interfere11/1
text-selectselecting text that is already on screen11/1
tree-sufficient10-

How a task works

Three parts. The first and the third involve no model at all, which is what makes a score reproducible.

01 SETUP

Put the phone in a known state

Deterministic steps, no model involved, so every attempt starts identically.

02 INSTRUCTION

Hand over one sentence

The agent sees an accessibility tree and a screenshot, and acts with taps, typing, gestures and picker wheels.

03 CHECKS

Ask the phone, not the agent

Assertions read the device directly and decide pass or fail. The agent never sees them.

A complete task, exactly as it is stored in the repository:

id: calculator.arithmetic
name: Do arithmetic in the Calculator
app: com.apple.calculator
difficulty: easy
tags:
- calculator
- input
- first-party
instruction: Open the Calculator app and compute 47 multiplied by 9. Leave the result on screen.
setup:
- terminate: com.apple.calculator
- home
checks:
- kind: foreground_app
  text: com.apple.calculator
- kind: regex_on_screen
  text: \b423\b
teardown:
- terminate: com.apple.calculator
notes: A precise sequence of taps where every one must land. 47x9=423.

The 80 public tasks

15 easy, 58 medium, 7 hard, all against Apple’s own applications: Settings, Safari, Notes, Reminders, Clock, Calculator, Contacts, Maps, Calendar, Files, Books, Compass, Shortcuts, Voice Memos and the home screen itself. No third-party app is automated, so no third party’s terms are involved.

These are 80 of 96. 16 are held back and are in neither the public repository nor its history: a benchmark whose entire answer key is public becomes training data, and the score then measures memorisation rather than capability. The public 80 cover all 24 capabilities, so a score over them is comparable between models and you can run the whole thing today. Steps and time in the table come from the single-model reference run; solved by comes from the 6-model sweep, which has so far covered 24 of these tasks.

TaskAppDifficultyChecksStepsTimeSolved by
books.search
Open the Books app and search for 'Moby Dick'.
iBooksmedium2655s6/6
calculator.arithmetic
Open the Calculator app and compute 47 multiplied by 9. Leave the result on screen.
calculatoreasy2944spass1 model
calculator.chain
Open the Calculator and compute (12 plus 8) multiplied by 5. Leave the answer on screen.
calculatormedium11280s4/6
calculator.percentage
Open the Calculator and work out what 15 percent of 240 is. Leave the answer on screen.
calculatormedium21163s4/6
calendar.month_view
Open the Calendar app and switch it to the month view, showing a whole month at once.
mobilecalmedium2325s5/6
calendar.today
Open the Calendar app and make sure it is showing today.
mobilecaleasy2319s6/6
clock.alarm.reach_picker
Open the Clock app, go to Alarms, and start adding a new alarm so the time picker is sho
mobiletimermedium2453s6/6
clock.alarm.set_time
Open the Clock app, go to Alarms, start adding a new alarm and set its time to 7:30 in t
mobiletimerhard46187spass1 model
clock.stopwatch.start
Open the Clock app, go to the Stopwatch tab and start it.
mobiletimereasy2448spass1 model
clock.tab.alarms
Open the Clock app and switch to the Alarms tab.
mobiletimereasy2339s6/6
clock.tab.timers
Open the Clock app and switch to the Timers tab.
mobiletimereasy2439spass1 model
clock.timer.set
Open the Clock app and start a timer for 5 minutes.
mobiletimermedium2553s0/6
clock.timer.set_hours_minutes
Open the Clock app, go to Timers, and set the timer to 1 hour and 30 minutes. Do not sta
mobiletimerhard3774s5/6
clock.timer.set_minutes
Open the Clock app, go to Timers, and set the timer duration to 5 minutes. Do not start
mobiletimermedium2652s6/6
clock.worldclock.tab
Open the Clock app and switch to the World Clock tab.
mobiletimereasy2448spass1 model
compass.read_heading
Open the Compass app and tell me which direction the phone is pointing.
compassmedium2321s6/6
contacts.search
Open Contacts and use its search field to search for the letter 'a'. Stop once results s
MobileAddressBookmedium2541spass1 model
files.browse_tab
Open the Files app and go to its Browse tab.
DocumentsAppeasy2430spass1 model
maps.search_place
Open Maps and search for the Eiffel Tower. Stop once the search results show it.
Mapsmedium2547spass1 model
measure.open
Open the Measure app.
measureeasy1325s6/6
multi.app_switch
Open the Calculator, then open Safari, then go back to the Calculator.
springboardmedium1539spass1 model
multi.return_after_detour
Open the Calculator, then open Notes, then come back to the Calculator.
calculatorhard1531spass1 model
multi.three_apps
Open the Calculator, then the Clock, then Settings. End on Settings.
springboardmedium1545s6/6
notes.create_titled
Open the Notes app and create a new note whose first line is exactly "phoneshell benchma
mobilenotesmedium2746spass1 model
notes.search
Open Notes and use search to find the note containing the words 'phoneshell benchmark'.
mobilenotesmedium2956spass1 model
notes.text_select
Open Notes, create a new note, type the word 'anchor', then long press that word so the
mobilenoteshard210101s5/6
notes.type_long
Open Notes, create a new note, and type: the quick brown fox jumps over the lazy dog nin
mobilenotesmedium2645s5/6
notes.type_punctuation
Open Notes, create a new note, and type exactly: benchmark-test (v2).
mobilenotesmedium2636s6/6
probe.image.eight
Open https://blolabel.ai/probe/eight/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.five
Open https://blolabel.ai/probe/five/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.four
Open https://blolabel.ai/probe/four/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.nine
Open https://blolabel.ai/probe/nine/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.one
Open https://blolabel.ai/probe/one/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.seven
Open https://blolabel.ai/probe/seven/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.six
Open https://blolabel.ai/probe/six/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.ten
Open https://blolabel.ai/probe/ten/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.three
Open https://blolabel.ai/probe/three/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.image.two
Open https://blolabel.ai/probe/two/ and tell me the word shown in the picture.
mobilesafarimedium2--not swept
probe.text.eight
Open https://blolabel.ai/probe/eight/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.five
Open https://blolabel.ai/probe/five/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.four
Open https://blolabel.ai/probe/four/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.nine
Open https://blolabel.ai/probe/nine/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.one
Open https://blolabel.ai/probe/one/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.seven
Open https://blolabel.ai/probe/seven/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.six
Open https://blolabel.ai/probe/six/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.ten
Open https://blolabel.ai/probe/ten/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.three
Open https://blolabel.ai/probe/three/ and tell me the written word.
mobilesafarimedium2--not swept
probe.text.two
Open https://blolabel.ai/probe/two/ and tell me the written word.
mobilesafarimedium2--not swept
reminders.create
Open Reminders and add a new reminder called 'collect parcel'.
remindersmedium2652sfail1 model
resilience.deep_start
Open Safari and go to example.com
mobilesafarimedium1329s5/6
resilience.scrolled_list
In Settings, open the General page.
Preferencesmedium2543spass1 model
resilience.wrong_app
Go to the Settings page for Display and Brightness.
Preferencesmedium21369spass1 model
safari.link_menu
Open Safari, go to example.com, and long press the 'More information...' link until its
mobilesafarihard2432s6/6
safari.navigate.example
Open Safari and go to example.com
mobilesafarieasy2340spass1 model
safari.tabs.open_switcher
Open Safari and show the tab switcher, where all the open tabs are listed.
mobilesafarimedium2427s5/6
safari.read.heading
Open Safari, go to example.com, and tell me the exact heading shown on that page.
mobilesafarimedium1322spass1 model
safari.search.web
Open Safari and search the web for 'iso 8601 date format'. Stop once results are showing
mobilesafarimedium2537spass1 model
settings.about.reach
Open Settings and navigate to the About page that shows the iPhone's model number.
Preferenceseasy2638spass1 model
settings.about.serial
Open Settings and find the About page, then tell me the Model Number of this iPhone.
Preferencesmedium2640spass1 model
settings.accessibility.reach
Open Settings and go to the Accessibility page.
Preferenceseasy223109spass1 model
settings.back.twice
Open Settings, go into General, then into About, then go back to the main Settings list.
Preferencesmedium3978s6/6
settings.battery.percentage
Open Settings, go to the Battery screen, and tell me the current battery percentage.
Preferencesmedium21155spass1 model
settings.bluetooth.reach
Open Settings and go to the Bluetooth page.
Preferenceseasy2426spass1 model
settings.datetime.reach
Open Settings and navigate to the Date & Time page under General.
Preferencesmedium21068spass1 model
settings.fonts.reach
Open Settings and navigate to the Fonts page under General.
Preferencesmedium2761spass1 model
settings.keyboard.reach
Open Settings and navigate to the Keyboard page under General.
Preferencesmedium2871spass1 model
settings.scroll.to_bottom
Open Settings and scroll all the way to the very bottom of the main settings list.
Preferencesmedium2769s4/6
settings.search.wifi
Open Settings and use its search field to search for "Wi-Fi", then open the Wi-Fi settin
Preferencesmedium2645spass1 model
settings.search.battery
Open Settings, search for "Battery" using the search field, and open the Battery page fr
Preferencesmedium2649spass1 model
settings.search.bluetooth
Open Settings, search for "Bluetooth" using the search field, and open the Bluetooth pag
Preferencesmedium226199spass1 model
settings.search.storage
Open Settings, search for "Storage" using the search field, and open the Storage page fr
Preferencesmedium2531spass1 model
settings.software_update.reach
Open Settings and navigate to the Software Update screen. Do not install anything.
Preferencesmedium2849spass1 model
settings.storage.reach
Open Settings and navigate to the iPhone Storage screen that shows how much space is use
Preferencesmedium2738spass1 model
settings.textsize.reach
In Settings, reach the screen with the slider that makes text larger. Do not change it.
Preferenceshard223179s6/6
settings.wifi.switch_visible
Open Settings and go to the Wi-Fi page.
Preferenceseasy2429s5/6
system.appstore.open
Open the App Store app. Do not download anything.
AppStoreeasy1322spass1 model
system.notifications.open
Open the iPhone's Notification Centre.
springboardhard124232s0/6
system.spotlight.find_app
Using the iPhone's own search (Spotlight), find the Calculator app and open it.
springboardmedium1754spass1 model
weather.open
Open the Weather app.
weathereasy1--not scored
weather.read_temperature
Open the Weather app and tell me the current temperature where I am.
weathermedium2--not scored

Run it yourself

A Mac, an iPhone, a cable and an Apple developer account. The harness builds and installs the automation runner onto the phone for you.

git clone https://github.com/Blomega/phoneshell
cd phoneshell
bin/phoneshell doctor      # tells you exactly what is missing
bin/phoneshell setup       # builds and installs the runner on your iPhone
bin/phoneshell up          # brings the bridge up

bin/phoneshell bench --list
bin/phoneshell bench --model claude-sonnet-5

Or skip the hardware entirely. Every task definition and every scored run on this page is published as a dataset at huggingface.co/datasets/blolabel/phoneshell-bench, including the paired runs behind the result above, so the statistics can be recomputed from source rather than taken on trust.

Who this is for

Teams running agents against real iPhones

The harness is free and open. What breaks it is not your code: it is an iOS point release, an Xcode update or a change in WebDriverAgent, any of which can stop the bridge working on a Tuesday morning. We keep a tested build working and there is a person to call.

Flows a device farm cannot run

Cloud farms give you clean, ephemeral phones. Some things need a real handset: an OTP to a real SIM, a payment through a local wallet, region-locked content, an account with history behind it.

Labs training phone-use models

Every published mobile-agent number is Android, because Android runs in software and iOS does not. If you want your model measured on iOS rather than assumed to transfer, the suite above is free to run today.