Blolabel
← Notes
analysis 6 min read

Qwen-UI-Agent runs bash commands from its GUI action space on 100+ real phones; phoneshell has never issued a shell command to one

One action in Qwen-UI-Agent's tool set drops straight to a bash shell. phoneshell's entire action module, read line by line, never leaves the accessibility tree and the touchscreen. The gap is not capability, it is scope: one project is a foundation agent for four environments, the other is a grading harness for one phone.

Qwen-UI-Agent's technical report, submitted to arXiv on 30 July 2026 by Hanzhang Zhou and 15 co-authors, gives its agent a cli_command action, described in the paper as enabling "direct bash command execution" from the same unified action space as its GUI taps and batched actions. That action space trains across what the report calls "a real-device mobile environment comprising over 100 physical devices" plus "up to 10,000 isolated sandbox environments running in parallel," on trajectories the authors say exceed 100 interaction steps under online reinforcement learning. phoneshell's own action module, phoneshell/actions.py, defines roughly thirty methods an agent can call, every one of them a WDA call: tap_element, type_text, swipe, press_key, open_app, open_url, and so on. None of them opens a shell, because phoneshell drives exactly one device and was built to measure what a model can do through the screen alone.

Abstract technical illustration on a dark grid: a single glowing action-space node splitting into two parallel paths, one labelled with a touchscreen-tap glyph and one with a terminal-prompt glyph, both feeding into a wide fan of many small device icons and a dense grid of sandbox squares, beside a single narrow path with only a touchscreen-tap glyph feeding one small device icon, cool blues with one amber accent

One action space, two execution surfaces

The report's own framing is that Qwen-UI-Agent is "a foundation GUI agent for mobile, computer-use, web, and DeepSearch environments," and the unified action space is what lets one model move between them: GUI operations for tapping and typing, cli_command for anything better expressed as a shell call, and batched actions for issuing several steps at once. The paper gives no example syntax for cli_command beyond naming it, but it is explicit that the action executes in "the active CLI environment," meaning the model can choose, mid-task, whether the next step is a tap or a command. Training that action space at scale needed two kinds of rollout capacity: sandboxes, up to 10,000 running in parallel, with virtual screens the authors say increase throughput "approximately 20x" relative to the same cluster without them, and the real-device runtime itself, over 100 physical phones used for "trajectory collection, online reinforcement learning, and evaluation on real devices," with a VLM-based judge checking each completed trajectory before validated ones are kept for training. Online RL was then scaled to trajectories the report says exceed 100 interaction steps, an order of magnitude past what a single phoneshell task is allowed to take.

Nothing in phoneshell's actions.py has a shell-adjacent equivalent. The closest thing to a non-GUI action in the whole module is open_url, which opens a deeplink through the existing GUI session rather than executing anything outside it; runner.py does call subprocess.run, but only to launch the Claude Code CLI harness itself, not as an action the agent under test can choose to invoke. Every one of the roughly thirty callable methods in actions.py, from tap_point to scroll_to_text to set_picker, bottoms out in a WebDriverAgent call against the one iPhone phoneshell has open. There is no step in any phoneshell task where the model can decide to do anything other than touch the glass.

Qwen-UI-Agent's unified action space vs phoneshell's Qwen-UI-Agent action space GUI operations cli_command: direct bash execution batched actions up to 10,000 parallel sandboxes virtual screens: ≈20x throughput 100+ real physical devices trajectories exceed 100 turns, online RL VLM judge validates trajectories retained for training phoneshell/actions.py (~30 methods) tap_element, tap_point, long_press, type_text swipe, scroll_to_text, press_key, set_picker open_app, open_url, accept_alert, wait_for_text every one is a WebDriverAgent call; no shell action one iPhone 17 Pro Max iOS 26.6, max_steps ≤ 60 Source: arXiv:2607.28227 §2.1.2, §3; phoneshell/actions.py, read 15 October 2026.
DimensionQwen-UI-AgentphoneshellSource
Action types available to the agentGUI ops, cli_command (bash), batched actionsGUI ops only (WDA tap/type/swipe/picker, ~30 methods)arXiv:2607.28227 §2.1.2; phoneshell/actions.py
Real physical devicesover 1001 (iPhone 17 Pro Max, iOS 26.6)arXiv:2607.28227 §3; phoneshell houseFacts
Parallel sandbox capacityup to 10,000, ≈20x throughput via virtual screens0; tasks run sequentially against the one rigarXiv:2607.28227 §3; phoneshell/bench/runner.py
Trajectory length trained onexceeds 100 interaction steps (online RL)capped at 60 (config.py), default 25 per taskarXiv:2607.28227 §3; phoneshell/config.py
Project purposetrain a foundation agent across 4 environmentsgrade a supplied model on one iPhonearXiv:2607.28227 abstract; phoneshell README

The scores it reports, and the one we can check independently

Qwen-UI-Agent's abstract reports seven benchmark figures: 82.1% on MobileWorld, 92.2% on MobileWorld-Real, 97.5% on AndroidDaily, 79.5% on OSWorld-Verified, 40.0% partial progress on OSWorld-v2, 73.6% on WebArena, and 81.5% on ScreenSpot-Pro. Of those seven, AndroidDaily is the one this site has already independently sourced: AndroidDaily (arXiv:2605.27761) is a verifiable benchmark for mobile GUI agents on real-world closed-source applications, released 26 May 2026, and already carries a grade-A entry in the Blomega registry. That does not independently confirm Qwen-UI-Agent's 97.5% score on it, which still rests on the report's own self-reported number, but it does confirm AndroidDaily itself is a real, checkable benchmark rather than an invented one, which is more than can be said for several figures in papers this site has had to discount in past entries.

Qwen-UI-Agent's seven self-reported scores 0 25 50 75 100 82.1MobileWorld 92.2MobileWorld-Real 97.5AndroidDaily★ 79.5OSWorld-Verified 40.0OSWorld-v2 73.6WebArena 81.5ScreenSpot-Pro Source: arXiv:2607.28227 abstract, read 15 October 2026. ★ AndroidDaily (arXiv:2605.27761) is independently grade-A in the Blomega registry; the 97.5% score itself is self-reported.

What it means for anyone sizing up a gap

Check it yourself

# every action phoneshell exposes to an agent, and confirm none executes a shell
grep -nE "^    def [a-z_]+\(" phoneshell/actions.py
grep -rliE "subprocess|os\.system|shell=True" phoneshell/actions.py || echo "no shell execution in actions.py"
grep -n "subprocess.run" phoneshell/bench/runner.py   # infra only, not an agent-callable action

# phoneshell's hard step cap, for comparison against Qwen-UI-Agent's >100-turn RL trajectories
grep -n "max_steps" phoneshell/config.py phoneshell/bench/schema.py

# Qwen-UI-Agent's own numbers
curl -s https://arxiv.org/abs/2607.28227 | grep -i "cli_command\|physical devices\|interaction steps"
# full report with examples: https://arxiv.org/html/2607.28227

What would prove this wrong

We claim phoneshell's action module has no action that executes outside the GUI, specifically nothing that opens a shell or runs an arbitrary command. That is wrong if any method added to phoneshell/actions.py wraps subprocess, os.system, or an equivalent, and is exposed as a callable action rather than internal plumbing. We also report Qwen-UI-Agent's seven benchmark scores as self-reported from its own abstract; that framing is wrong, in Qwen-UI-Agent's favor, if an independent third party reproduces those scores on the cited benchmarks and publishes matching numbers. We will check both, phoneshell's own commit history and any independent reproduction of Qwen-UI-Agent's results, by 30 April 2027.

Sources