Blolabel
← Notes
analysis 9 min read

MyPCBench's zero-score trajectories still average 22 to 85 steps per task; phoneshell's fix for a lock screen that ends a run, built after losing four of them, is wired into one feature and not the benchmark

MyPCBench's six agents average 43.7 to 69.2 steps per task, and even the runs that score zero do not quit quickly: failed trajectories from three models still average 22 to 31 steps before giving up, and two others average 52 to 85. phoneshell already has code for the one thing a long, idle-heavy run risks on a real iPhone, the screen locking mid-task, built because "this project has lost four runs that way." That fix is called from exactly one feature. It is never called from the code that runs phoneshell's own 80 scored tasks.

MyPCBench (arXiv:2606.16748, Lawrence Keunho Jang, Andrew Keunwoo Jang, Jing Yu Koh and Ruslan Salakhutdinov, submitted 15 June 2026) builds 184 tasks around one persona, Michael Scott, seeded consistently across 17 simulated web applications on a Linux desktop. Its Table 2 reports both a "Perfect" rate, the share of tasks every rubric item passed, and average steps per task; its best model, Claude Opus 4.6, needs 46.5 steps on average and solves 55.4% of tasks perfectly. Every model tested needs dozens of steps per task, and the paper's own zero-score breakdown shows that failing is not a fast process either. phoneshell runs its own 80 tasks with a 240-second timeout and no step count anywhere near MyPCBench's, but it shares the one physical property every long automated session on a real phone has to survive: the screen has to stay on.

Abstract technical illustration on a dark grid: a long glowing path winding across the full width of the frame representing a long task trajectory, crossing over a thin horizontal seam partway through rendered as a hairline crack, with the path continuing unbroken on one lane but visibly severed and dimming on a second, parallel lane just above it, cool blues and teal with one amber accent on the unbroken lane, no icons or text

How long MyPCBench's tasks actually run, including the ones that fail

MyPCBench grades two ways: "Perfect," a full rubric pass, and a weighted "Rubric score" giving partial credit, alongside average steps and a trajectory-efficiency figure, rubric points per step. The six models tested span a wide range on all four. What stands out for a question about session length is the step counts on the zero-score end: the paper's own text states that zero-score trajectories from GPT-5.5, GPT-5.4 mini and Claude Sonnet 4.6 average about 22 to 31 steps, meaning those models quit early, while Opus 4.6 and the two Qwen 3.5 models average 52 to 85 steps on their own zero-score runs, quitting late or not at all before the task's own cap. Figure 6 in the paper plots a 100-step budget curve on which Opus is still rising at the cap.

ModelPerfectRubric scoreAvg stepsTraj. Eff.
Claude Opus 4.655.4%81.8%46.53.61
Claude Sonnet 4.639.1%65.4%45.83.03
GPT-5.529.3%54.1%45.81.45
GPT-5.4 mini19.0%48.8%43.71.65
Qwen 3.5 35B-A3B7.6%42.5%66.01.41
Qwen 3.5 9B2.7%7.0%69.20.65

Source: arXiv:2606.16748, Table 2, read 28 October 2026. 184 tasks, Linux desktop, 17 simulated web apps seeded with one persona's accounts and history.

Average steps per task, MyPCBench Table 2 0 20 40 60 75 46.5Opus 4.6 45.8Sonnet 4.6 45.8GPT-5.5 43.7GPT-5.4 mini 66.0Qwen 35B-A3B 69.2Qwen 9B Source: arXiv:2606.16748, Table 2 and Figure 6, read 28 October 2026.

The fix phoneshell built, and the one place it is called from

phoneshell/autolock.py states its reason for existing in its own opening lines: "A lock ends a scan. iOS refuses to launch apps from the lock screen, so the run stops producing screenshots and reports a failure that is really just a phone doing its job. This project has lost four runs that way." Its fix, a context manager called KeepAwake, reads the phone's current Auto-Lock setting off the Display & Brightness row text (no need to open the Auto-Lock screen itself), sets it to Never for the length of a scan if it is not already there, and restores the original value on every exit, including a crash, because leaving someone's personal phone set to never sleep "would be a rude thing to do with their battery." The class verifies the change took by reading the setting back rather than trusting the tap, the same principle autolock.py's own docstring states for reading it: "a tap that reports success and changes nothing is the normal failure in this stack, not the unusual one."

A repository-wide search for KeepAwake finds exactly two files: its own definition in autolock.py, and one call site, in phoneshell/crawl.py, where it wraps the app-crawling feature's own scan. phoneshell/bench/runner.py, the module that actually executes phoneshell's 80 scored tasks against a model, one at a time, up to 240 seconds each, contains no reference to KeepAwake or autolock at all, and neither does cli.py, server.py or mcp_server.py. No task YAML, no setup step and no documentation we found tells an operator to set Auto-Lock to Never by hand before running the benchmark either. The fix built specifically because of four lost runs protects a different feature than the one phoneshell measures itself by.

KeepAwake: built for lost runs, called from one feature autolock.py class KeepAwake, context manager reads, sets, verifies, restores "lost four runs that way" crawl.py the app-crawling feature the one caller bench/runner.py runs all 80 scored tasks 0 references to KeepAwake no doc or setup step tells an operator to set Auto-Lock to Never by hand Sources: phoneshell/autolock.py, phoneshell/crawl.py, phoneshell/bench/runner.py, read 28 October 2026.

What it means for a benchmark that has already lost runs to this

Check it yourself

# the reason KeepAwake exists, in its own words
sed -n '1,14p' phoneshell/autolock.py

# every file that references it
grep -rn "KeepAwake" --include="*.py" .

# confirm bench/runner.py has no reference at all
grep -c "KeepAwake\|autolock" phoneshell/bench/runner.py

# phoneshell's fixed per-task timeout, applied to all 80 tasks
grep -n "timeout_seconds" phoneshell/bench/schema.py
grep -h "timeout_seconds" environments/*.yaml | sort -u || echo "no task overrides the default"

# MyPCBench's own step and zero-score figures
curl -s https://arxiv.org/html/2606.16748 | grep -iE "average steps|zero-score|Table 2"

What would prove this wrong

We claim KeepAwake is called from exactly one place in phoneshell's own source, crawl.py, and never from bench/runner.py, so phoneshell's own 80 scored benchmark tasks run with no automatic protection against the same lock-screen failure mode the class exists to prevent. That is wrong if a later commit wires it into the runner and we checked a stale copy of the source. We also claim this is a real, not theoretical, exposure given phoneshell's own 240-second timeout and the range of iOS Auto-Lock intervals. That claim is falsified the day someone runs phoneshell's benchmark suite with Auto-Lock deliberately left at a short interval, say 30 seconds, across enough tasks to see whether any fail specifically because the screen locked mid-task, a test nothing in the current results schema would currently let anyone attribute correctly even if it happened. We will treat either event, a code change or a reproduced lock-related failure, as grounds to revisit this piece by 30 April 2027.

Sources