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.

Every model, independently

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 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
Claude Sonnet 594.8%
55/587.258s$0.177

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 60 of 76. Sixteen are held back and are not in the public repository or its history: a benchmark whose entire answer key is public becomes training data, and the score then measures memorisation rather than capability. The public 60 cover all 22 capabilities, so a score over them is comparable between models and you can run the whole thing today.

TaskAppDifficultyChecksStepsTimeResult
books.search
Open the Books app and search for 'Moby Dick'.
iBooksmedium2655spass
calculator.arithmetic
Open the Calculator app and compute 47 multiplied by 9. Leave the result on screen.
calculatoreasy2944spass
calculator.chain
Open the Calculator and compute (12 plus 8) multiplied by 5. Leave the answer on screen.
calculatormedium11280spass
calculator.percentage
Open the Calculator and work out what 15 percent of 240 is. Leave the answer on screen.
calculatormedium21163spass
calendar.month_view
Open the Calendar app and switch it to the month view, showing a whole month at once.
mobilecalmedium2325spass
calendar.today
Open the Calendar app and make sure it is showing today.
mobilecaleasy2319spass
clock.alarm.reach_picker
Open the Clock app, go to Alarms, and start adding a new alarm so the time picker is sho
mobiletimermedium2453spass
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
mobiletimerhard46187spass
clock.stopwatch.start
Open the Clock app, go to the Stopwatch tab and start it.
mobiletimereasy2448spass
clock.tab.alarms
Open the Clock app and switch to the Alarms tab.
mobiletimereasy2339spass
clock.tab.timers
Open the Clock app and switch to the Timers tab.
mobiletimereasy2439spass
clock.timer.set
Open the Clock app and start a timer for 5 minutes.
mobiletimermedium2553sfail
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
mobiletimerhard3774spass
clock.timer.set_minutes
Open the Clock app, go to Timers, and set the timer duration to 5 minutes. Do not start
mobiletimermedium2652spass
clock.worldclock.tab
Open the Clock app and switch to the World Clock tab.
mobiletimereasy2448spass
compass.read_heading
Open the Compass app and tell me which direction the phone is pointing.
compassmedium2321spass
contacts.search
Open Contacts and use its search field to search for the letter 'a'. Stop once results s
MobileAddressBookmedium2541spass
files.browse_tab
Open the Files app and go to its Browse tab.
DocumentsAppeasy2430spass
maps.search_place
Open Maps and search for the Eiffel Tower. Stop once the search results show it.
Mapsmedium2547spass
measure.open
Open the Measure app.
measureeasy1325spass
multi.app_switch
Open the Calculator, then open Safari, then go back to the Calculator.
springboardmedium1539spass
multi.return_after_detour
Open the Calculator, then open Notes, then come back to the Calculator.
calculatorhard1531spass
multi.three_apps
Open the Calculator, then the Clock, then Settings. End on Settings.
springboardmedium1545spass
notes.create_titled
Open the Notes app and create a new note whose first line is exactly "phoneshell benchma
mobilenotesmedium2746spass
notes.search
Open Notes and use search to find the note containing the words 'phoneshell benchmark'.
mobilenotesmedium2956spass
notes.text_select
Open Notes, create a new note, type the word 'anchor', then long press that word so the
mobilenoteshard210101spass
notes.type_long
Open Notes, create a new note, and type: the quick brown fox jumps over the lazy dog nin
mobilenotesmedium2645spass
notes.type_punctuation
Open Notes, create a new note, and type exactly: benchmark-test (v2).
mobilenotesmedium2636spass
probe.image.eight
Open https://blolabel.ai/probe/eight/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.five
Open https://blolabel.ai/probe/five/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.four
Open https://blolabel.ai/probe/four/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.nine
Open https://blolabel.ai/probe/nine/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.one
Open https://blolabel.ai/probe/one/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.seven
Open https://blolabel.ai/probe/seven/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.six
Open https://blolabel.ai/probe/six/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.ten
Open https://blolabel.ai/probe/ten/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.three
Open https://blolabel.ai/probe/three/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.image.two
Open https://blolabel.ai/probe/two/ and tell me the word shown in the picture.
mobilesafarimedium2--not run
probe.text.eight
Open https://blolabel.ai/probe/eight/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.five
Open https://blolabel.ai/probe/five/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.four
Open https://blolabel.ai/probe/four/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.nine
Open https://blolabel.ai/probe/nine/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.one
Open https://blolabel.ai/probe/one/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.seven
Open https://blolabel.ai/probe/seven/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.six
Open https://blolabel.ai/probe/six/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.ten
Open https://blolabel.ai/probe/ten/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.three
Open https://blolabel.ai/probe/three/ and tell me the written word.
mobilesafarimedium2--not run
probe.text.two
Open https://blolabel.ai/probe/two/ and tell me the written word.
mobilesafarimedium2--not run
reminders.create
Open Reminders and add a new reminder called 'collect parcel'.
remindersmedium2652sfail
resilience.deep_start
Open Safari and go to example.com
mobilesafarimedium1329spass
resilience.scrolled_list
In Settings, open the General page.
Preferencesmedium2543spass
resilience.wrong_app
Go to the Settings page for Display and Brightness.
Preferencesmedium21369spass
safari.link_menu
Open Safari, go to example.com, and long press the 'More information...' link until its
mobilesafarihard2432spass
safari.navigate.example
Open Safari and go to example.com
mobilesafarieasy2340spass
safari.tabs.open_switcher
Open Safari and show the tab switcher, where all the open tabs are listed.
mobilesafarimedium2427spass
safari.read.heading
Open Safari, go to example.com, and tell me the exact heading shown on that page.
mobilesafarimedium1322spass
safari.search.web
Open Safari and search the web for 'iso 8601 date format'. Stop once results are showing
mobilesafarimedium2537spass
settings.about.reach
Open Settings and navigate to the About page that shows the iPhone's model number.
Preferenceseasy2638spass
settings.about.serial
Open Settings and find the About page, then tell me the Model Number of this iPhone.
Preferencesmedium2640spass
settings.accessibility.reach
Open Settings and go to the Accessibility page.
Preferenceseasy223109spass
settings.back.twice
Open Settings, go into General, then into About, then go back to the main Settings list.
Preferencesmedium3978spass
settings.battery.percentage
Open Settings, go to the Battery screen, and tell me the current battery percentage.
Preferencesmedium21155spass
settings.bluetooth.reach
Open Settings and go to the Bluetooth page.
Preferenceseasy2426spass
settings.datetime.reach
Open Settings and navigate to the Date & Time page under General.
Preferencesmedium21068spass
settings.fonts.reach
Open Settings and navigate to the Fonts page under General.
Preferencesmedium2761spass
settings.keyboard.reach
Open Settings and navigate to the Keyboard page under General.
Preferencesmedium2871spass
settings.scroll.to_bottom
Open Settings and scroll all the way to the very bottom of the main settings list.
Preferencesmedium2769spass
settings.search.wifi
Open Settings and use its search field to search for "Wi-Fi", then open the Wi-Fi settin
Preferencesmedium2645spass
settings.search.battery
Open Settings, search for "Battery" using the search field, and open the Battery page fr
Preferencesmedium2649spass
settings.search.bluetooth
Open Settings, search for "Bluetooth" using the search field, and open the Bluetooth pag
Preferencesmedium226199spass
settings.search.storage
Open Settings, search for "Storage" using the search field, and open the Storage page fr
Preferencesmedium2531spass
settings.software_update.reach
Open Settings and navigate to the Software Update screen. Do not install anything.
Preferencesmedium2849spass
settings.storage.reach
Open Settings and navigate to the iPhone Storage screen that shows how much space is use
Preferencesmedium2738spass
settings.textsize.reach
In Settings, reach the screen with the slider that makes text larger. Do not change it.
Preferenceshard223179spass
settings.wifi.switch_visible
Open Settings and go to the Wi-Fi page.
Preferenceseasy2429spass
system.appstore.open
Open the App Store app. Do not download anything.
AppStoreeasy1322spass
system.notifications.open
Open the iPhone's Notification Centre.
springboardhard124232sfail
system.spotlight.find_app
Using the iPhone's own search (Spotlight), find the Calculator app and open it.
springboardmedium1754spass
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

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.