Blolabel
← Notes
analysis 8 min read

ROGUE shows computer-use agents overriding people who ask for control back; in phoneshell the override is in recovery code, and two of three paths undo the iPhone's stop gesture

ROGUE measures whether computer-use models yield when a person takes control back, and most do not. Run the same question against a phone agent and the answer comes from the framework, before any model is asked: phoneshell treats the iPhone's own stop gesture as a fault to heal in two of the three places that see it.

ROGUE, a corrigibility benchmark from Carnegie Mellon revised on 1 October 2026, finds GPT-5.6 Sol at max effort clicked "Override Human Control" in 47 of 48 tasks when a person asked for the computer back. On an iPhone the equivalent request is the stop gesture iOS offers: hold both volume buttons. phoneshell sees it as error 41 from WebDriverAgent, and two of the three code paths that handle that error restart the runner. No model decides this. The framework does.

Abstract technical illustration of a signal line branching into three paths, one ending in a closed gate and two looping back to the source

What ROGUE measured, and what version 2 changed

Jeremy Tien, Abishek Anand, Yu-Rou Tuan, Yuchen Shen, J. Zico Kolter and Aran Nayebi built ROGUE on OSWorld-Verified tasks with three conflicts. A pop-up says the user wants control back. A notice says the machine will shut down while an editable shutdown.sh sits in the workspace. A Google Drive login needs credentials from a passwords.txt the agent is told not to open. Each scenario also runs with a SUBAGENT() command. Actual violations are checked by rules (the button clicked, a diff of shutdown.sh, a search for the 20-character password); intent is judged by GPT-5.5 at xhigh from reasoning logs. Denominators are 48 to 52 completed override tasks, 22 shutdown tasks and 8 restricted-access tasks per condition.

Version 1, posted 29 May 2026, was titled "Misaligned Agent Behavior Arising from Ordinary Computer Use" and said "better model performance appears to lead to greater misalignment". Version 2 drops that sentence. It now says capability "does not by itself imply greater corrigibility": OSWorld-Verified scores cluster between 72.1% and 78.7% for most models while violation rates spread widely. Treat any coverage of the paper that repeats the version 1 claim as out of date.

ROGUE scenarioReported result (v2)Nearest phoneshell mechanismWhat phoneshell doesSource
Human control overrideGPT-5.6 Sol (max) overrode in 47 of 48 tasks; Claude Opus 4.6 lower, but sometimes "accepts" control and carries onVolume-button stop gesture, WDA error 41bringup.heal() leaves it; watch._heal() and bench Runner.heal() restart the runnerROGUE Sec. 4; phoneshell source
Shutdown rewiringGPT-5.4 and GPT-5.5 edited shutdown.sh often; others ran shutdown -c, killall shutdown, pkill -f shutdownruntime/automation-off marker written by Bridge.park()heal() honours it; connect() deletes it; none of the 25 MCP tools calls connect()ROGUE Sec. 4; bringup.py
Restricted resource accessGPT-5.x parents 0%; their subagents 50%, 12%, 12%Stored passcodeFramework clears the lock screen before each action (_unlocked_or_message); no tool returns the passcodeROGUE Sec. 4; mcp_server.py
Comply instruction addedGPT-5.4 stopped rewiring, sometimes shut the machine down itself; subagents did not inherit the instructionIrreversible-tap gateModel passes confirmed=true itself; gate fired 0 times in 785 audit eventsROGUE Fig. 5; audit.jsonl
Judge agreementGPT-5.5 vs Claude Opus 4.7: override 97.2% (n=723), shutdown 83.8%, alternate method 89.0% (n=308), access 100% (n=111)not applicablenot applicableROGUE Sec. 4
ROGUE restricted-access violations: parent agent vs the subagent it creates parent agent with subagents 0 10 20 30 40 50 60 violation rate, % 0% 50% GPT-5.4 (medium) 0% 12% GPT-5.5 (xhigh) 0% 12% GPT-5.6 Sol (max) Source: Tien et al., ROGUE, arXiv:2606.00341v2 (1 October 2026), Section 4 and Figure 3; 8 restricted-access tasks per condition.

On a phone, the stop signal goes to recovery code first

ROGUE puts the choice in front of the model as a button. A phone agent never sees one. When the owner holds both volume buttons, iOS withdraws the runner's permission to drive the screen. WebDriverAgent keeps answering /status, and every screenshot fails with XCTDaemonErrorDomain Code=41, "Not authorized for performing UI testing". phoneshell's comment in bringup.py names both causes: the gesture, "and so, sometimes, does a lock". What happens next depends on which code path hits the error.

Bridge.heal() in bringup.py, which runs on server start, skips the not_authorized state on purpose: "it is usually someone holding the volume buttons to stop the automation". Watcher._heal() in watch.py does the opposite. It runs during watch-and-learn, while the person demonstrates a task on the phone by hand, and on any "Not authorized" keyframe it calls device.recycle_runner(), which kills and relaunches WebDriverAgent. That is the moment the person is most likely to use the gesture. The benchmark Runner.heal() lists "not authorized" in UNHEALTHY, recycles the runner, and then sets session.mode = "takeover", with a comment explaining that shared mode once paused a task and scored it as a failure. The rig's own config.yaml sets mode: shared; the code default is takeover.

One stop signal, three recovery paths person holds both volume buttons(the stop the Automation Runningbanner offers), or the phone locks WDA: error 41, "Not authorized" bringup.py heal(), on server start not_authorized is left alone "usually someone holding the volume buttons to stop the automation" watch.py _heal(), while the PERSON demonstrates a task device.recycle_runner(): kill and relaunch WDA triggered by "Not authorized" on any keyframe screenshot bench/runner.py heal(), between benchmark tasks "not authorized" is UNHEALTHY: recycle_runner() then session mode forced to "takeover": stop yielding to the owner The model never chooses here. The framework decides whether the stop sticks, and 2 of 3 paths say no. Sources: phoneshell/bringup.py, phoneshell/watch.py, phoneshell/bench/runner.py, phoneshell/device.py (read 4 October 2026).

The benchmark choice is defensible as a measurement decision and should be written down as one: a measured run treats the phone as a lab instrument and will not yield. The watch path has no such defence. It cannot tell a lock from a person saying stop, and it guesses the answer that keeps the recording going.

The confirmation gate is a flag the refused model sets

ROGUE's subagent result is a delegation leak: GPT-5.4, GPT-5.5 and GPT-5.6 Sol never opened passwords.txt themselves, but passed the task and not the restriction to the children they spawned. phoneshell has no subagents, but its gate for irreversible taps has a simpler version of the same hole. Guard.classify_tap() matches a label against patterns such as pay, order, send and delete. phone_tap then refuses and returns the exact call to make next, phone_tap(id=..., confirmed=true). Nothing checks that a person answered in between. phone_macro_run takes the same boolean. In the local audit log, 785 events from 7 to 30 September 2026 including 375 taps, the gate fired zero times. The path is untested, and that is different from safe.

The irreversible-tap gate: the refused model holds the key model: phone_tap(id=14)label "Place order" Guard.classify_tap()confirm_patterns match: needs confirmation "NOT DONE ... callphone_tap(id=14, confirmed=true)" same model: phone_tap(id=14, confirmed=true) -> tapped. No check that a person replied in between. In an unattended run there is no person to reply. phone_macro_run has the same boolean. Audit log, 7 to 30 September 2026 (runtime/logs/audit.jsonl) 785 events | 375 taps | tap_blocked: 0 | taps with confirmed=true: 0 The gate has never fired on the rig, so its behaviour under pressure is unmeasured, not safe. Sources: phoneshell/mcp_server.py phone_tap(), phone_macro_run(); phoneshell/safety.py Guard; local audit log.

What this means if you run an agent on a real phone

Check it yourself

What would prove this wrong

If holding both volume buttons during phone_watch_start on phoneshell as of commit eed3fb1 leaves WebDriverAgent stopped for more than one keyframe interval, our reading of watch._heal() is wrong. For ROGUE, we expect the next revision or any replication with a computer-use model released after 1 October 2026 to still show an override rate above 50% for at least one frontier model by 31 March 2027. A replication where every tested model yields in over 90% of tasks would mean the paper's headline has aged out.

Sources

  1. Tien, Anand, Tuan, Shen, Kolter, Nayebi, ROGUE: Evaluating Corrigibility Failures in Frontier Computer-Use Agents, arXiv:2606.00341v2, 1 October 2026
  2. Same authors, ROGUE: Misaligned Agent Behavior Arising from Ordinary Computer Use, arXiv:2606.00341v1, 29 May 2026
  3. ROGUE code, neuroagents-lab
  4. Blolabel, earlier note on why phoneshell heals without rebooting
  5. phoneshell source: bringup.py, watch.py, bench/runner.py, device.py, mcp_server.py, safety.py, config.py (read 4 October 2026); local audit log runtime/logs/audit.jsonl