Stop Being the One Who Clicks Around


You are the last step in the loop

You know this loop. You ask for a change, the agent writes it, the suite comes back green, and then you switch to the browser and click around to find out whether the thing actually works.

That last step is you. Open the preview, click the flow, look, decide. Ten seconds. Forty times an afternoon, and somewhere around the fortieth you have stopped looking carefully. I ran this loop for a year without ever deciding to.

Everybody optimizes the terminal: prompts, skills, models. Nobody optimizes the window below it, because it does not look like tooling. It looks like diligence. It is your eyes on your own app, re-checking work that was already reported as finished.

And it refuses to scale. Two agents means two streams of screens. Four means you are a QA department. Agent setups exist to run more work in parallel, and this one step caps all of it at one human.

fable 5 · northwind
>add a remove button to each cart line
Update(src/cart/CartLine.tsx)
2 additions
31+<button onClick={() => remove(line.id)}>
32+ Remove
Bash(npm test -- cart)
PASS 18 tests, 0 failures
Done. Remove drops the line and the totals recompute.
>
Northwind · cart
http://localhost:3050/cart
Northwind
Field Notes, 3-pack
Ruled · qty 1
$12.00
Total$12.00
Order placed. Confirmation sent.

Green suite, broken page

Nothing in that terminal changed. Same prompt, same diff, same eighteen passing tests. I clicked Remove, the cart emptied out with the total still reading twelve dollars, and when I pressed Checkout the page told me my payment had failed because there was nothing in my cart.

The unit test passed because the function it covers is correct. The total was seeded into component state once, at mount, and removing a line never touched it. There is no bad function here to catch. The bug lives in a sequence: render, remove, look.

The agent cannot see this, and I mean that literally rather than as criticism. It wrote the code, ran the suite, read the output, and every signal available to it says done. The one signal that would have caught the bug is a picture of the page after a click, and nothing in its loop takes pictures.

So I catch it, or nobody does. And catching it is only half the job. Then I go back to the terminal and type up what I saw, in my own words, in the box at the bottom of the window: what I clicked, what broke, which number is wrong. I am the tester and I am also the bug report. That is the deal, and I never actually agreed to it. I just kept clicking.

You should not be the one giving your agent its feedback.
fable 5 · northwind
>add a remove button to each cart line
Update(src/cart/CartLine.tsx)
2 additions
31+<button onClick={() => remove(line.id)}>
32+ Remove
Bash(npm test -- cart)
PASS 18 tests, 0 failures
Done. Remove drops the line and the totals recompute.
>
Northwind · cart
http://localhost:3050/cart
Northwind
Field Notes, 3-pack
Ruled · qty 1
$12.00
Total$12.00
Order placed. Confirmation sent.

Hand the checking to another agent

The fix is not a better prompt. It is a second agent whose whole job is to open the thing, use it the way a person would, and say what it saw. Same change as before, same page. One step added, and the step is not mine. Nobody presses Checkout by hand this time, and nobody types up what happened when they did.

Watch the order. The builder finishes and, instead of handing the work to me, shells out to Codex with computer use enabled. Codex opens the page in a real browser, clicks Remove, takes a screenshot, reads it, and writes a report that says FAIL and names the number that is wrong. The builder reads that report, fixes the line, and asks for another run. The second run is green.

Two things make that worth doing rather than just asking the builder to check its own work. The verifier did not write the code, so it has no stake in the code being right. And it has hands. It is not reasoning about what the page probably renders. It is looking at what the page rendered.

My part of the loop is now reading a verdict. That is a thing I can do for four agents at once, on a phone, between other work. The loop that used to end at my eyes now closes between two machines, and I find out about it afterwards.

The line that makes it automatic

I never type any of this into a prompt. It is one rule in my global CLAUDE.md, so every session reads it before I say a word: “If computer use is helpful for completing or verifying work, shell out to codex for it.” The orchestrator decides when a change deserves the browser treatment, and I find out from the report.

Instead, have an agent do it for you.
fable 5 · northwind
>before you call it done, have codex check the cart flow in the browser
Skill(codex-computer-use)
artifacts /tmp/codex-computer-use.7f3a2c/
codex exec -s danger-full-access · no source edits
Verifying (waiting on the report)
>
codex exec · computer use
Bash(open -a "Google Chrome" http://localhost:3050/cart)
mcp__computer_use__get_app_state(Google Chrome)
cart · 1 line · Total $12.00 · Checkout enabled
mcp__computer_use__screenshot(cart-initial.png)
/tmp/codex-computer-use.7f3a2c/cart-initial.png
mcp__computer_use__click("Remove")
clicked · list is now empty
mcp__computer_use__screenshot(cart-empty.png)
/tmp/codex-computer-use.7f3a2c/cart-empty.png
Removing the last line leaves Total at $12.00 and Checkout enabled.
Write(report.md)
FAIL · 2 of 4 checks passed
Northwind · cart
http://localhost:3050/cart
Northwind
Field Notes, 3-pack
Ruled · qty 1
$12.00
Total$12.00
Order placed. Confirmation sent.

Codex is the one that drives a computer

I will say this plainly. Right now Codex is simply the best tool I have used at driving a computer. Not marginally, not arguably. It navigates apps, recovers from weird UI states, notices things it was not told to look for, and comes back with evidence rather than a story. The models I reach for first on taste do not match it there today.

That is the jagged frontier doing exactly what it always does, and it is why my whole setup routes work by capability rather than by loyalty. I wrote the long version of that argument in the post about mixing labs. This is the sharpest single instance of it: one lab is meaningfully ahead at one thing, and that one thing happens to be the step I most want off my desk.

The report is the artifact. Four checks, two screenshots, one verdict, each screenshot described in words so the report stands on its own without me opening a single image. I read the failing line and the sentence under it, and I know more about the state of my app than I did after clicking around, because the checks are written down and the same four run again next time.

The trade is real and worth naming: this costs a couple of minutes and a pile of tokens per run, so it belongs on the flows that matter rather than on every keystroke. But the alternative is not free either. It costs me, and I am the expensive part.

what I read instead of the pixels
report.mdcodex-computer-use · run 7f3a2c
targethttp://localhost:3050/cart
sandboxdanger-full-access · no source edits
toolsmcp__computer_use__* · Chrome
checks
cart lists one line at $12.00cart-initial.png
Remove clears the linecart-empty.png
empty cart shows Total $0.00cart-empty.png
Checkout disabled when emptycart-empty.png
verdictFAILempty cart · 2 of 4
screenshots
cart-initial.png · One line item, Total $12.00, Checkout solid. Matches the spec.
cart-empty.png · List area blank, no empty state, Total still $12.00, Checkout still solid.

Steal the skill

None of it is secret sauce , so here is the whole file, exactly as my agent loads it. Copy it into ~/.claude/skills/codex-computer-use/SKILL.md, or paste it to your agent and ask it to install the skill, which is what I would do. Claude Code reads the description at startup and loads the rest only when a task matches it.

Most of the file is about stance rather than commands. When to use a real verification run and when a typecheck would have done. Which sandbox level the run gets. Where screenshots and the report land. What the report has to contain before I will believe it.

The section worth reading twice is the one about whose cursor gets used. GUI runs also need full machine access, which is a real thing to say yes to. I run them on my own projects, on a machine where that is the deal I have already made with my agents, and I would think twice before pointing one at anything holding real accounts or real customer data.

The rest of the setup this belongs to, the rubric that routes work to the right lab and the two sibling skills that hand off implementation and review, lives in the multi-lab post. This skill is the one I would install first.

~
.claude/skills/codex-computer-use/SKILL.md
1---
2name: codex-computer-use
3description: Ask Codex CLI (OpenAI's coding agent; model comes from ~/.codex/config.toml, currently the gpt-5.6 family) to run local app verification that needs computer use, browser automation, simulators, screenshots, app launching, or independent runtime inspection. This is how OpenAI models are invoked for computer-use work. Use when the user asks Claude to have Codex, gpt, or an OpenAI model test a flow, verify UI behavior, inspect a running app, capture screenshots, or report confirmation and feedback about implemented behavior that benefits from computer use functionality.
4---
5
6# Codex Computer Use
7
8Use Codex as a separate local verification agent when the task needs real UI interaction, screenshots, simulator/browser/device state, or an independent runtime check outside Claude's current context.
9
10Do not use this for ordinary code reading, typechecking, linting, or tests Claude can run directly. Launching apps, simulators, or browsers to verify the requested work is fine without asking; ask first only if the run could disrupt the user's environment beyond that (closing their apps, changing system settings, acting on real accounts or data).
11
12## Workflow
13
141. Create a temporary artifact directory.
152. Give Codex a self-contained prompt with the repo path, exact flow, constraints, artifact directory, and report format.
163. Run `codex exec` non-interactively.
174. Read Codex's report and summarize the result for the user, citing screenshot paths. Rely on Codex's written screenshot descriptions rather than opening the images; only Read a screenshot yourself when the report is ambiguous or a claim needs direct visual confirmation.
18
19Use this command shape:
20
21```bash
22ARTIFACT_DIR="$(mktemp -d "${TMPDIR:-/tmp}/codex-computer-use.XXXXXX")"
23REPORT="$ARTIFACT_DIR/report.md"
24PROMPT="$ARTIFACT_DIR/prompt.md"
25
26# Computer Use plugin dir, derived from config so plugin updates can't
27# stale-path this (the [mcp_servers.computer-use] entry ships with relative
28# paths that only resolve from this cwd).
29CUA_DIR="$(dirname "$(grep -o 'SKY_CUA_SERVICE_PATH = ".*"' ~/.codex/config.toml | cut -d'"' -f2)")"
30
31# Write a self contained prompt to $PROMPT, then run:
32codex exec \
33 -C "$PWD" \
34 --add-dir "$ARTIFACT_DIR" \
35 -s danger-full-access \
36 -c 'mcp_servers.computer-use.enabled=true' \
37 -c "mcp_servers.computer-use.cwd=\"$CUA_DIR\"" \
38 -o "$REPORT" \
39 - < "$PROMPT"
40```
41
42Use `-s danger-full-access` for GUI automation, iOS simulators, desktop app launching, screenshots, or access outside the repo. For non-GUI checks that only need the repo and artifact directory, prefer `-s workspace-write` and drop the two `computer-use` overrides. Add `--skip-git-repo-check` when the working directory is not a git repository.
43
44## Own cursor, not the user's
45
46The two `-c mcp_servers.computer-use.*` overrides load OpenAI's bundled
47Computer Use plugin (SkyComputerUseClient) into the run. Its MCP tools
48(`mcp__computer_use__click` / `drag` / `scroll` / `type_text` / `press_key` /
49`set_value` / `get_app_state` / `list_apps`, …) drive macOS apps through
50their own input session with a virtual pointer — the user's physical cursor
51stays free. Without them, Codex falls back to `cliclick`/AppleScript-style
52automation that hijacks the real mouse; that is not acceptable for GUI runs.
53
54Always add to GUI prompts: "Use the computer-use MCP tools
55(mcp__computer_use__*) for ALL GUI interaction — never cliclick, CGEvent, or
56AppleScript mouse control, so the user's cursor is not taken over. If the
57computer-use tools are unavailable, mark the interactive steps BLOCKED
58instead of falling back to cursor hijacking." Headless paths (`xcrun simctl`
59launch args + screenshots, CLI commands) need no pointer and stay preferred
60where they suffice; Chrome flows should use the Chrome plugin, per the
61config's own guidance.
62
63Per-app consent gotcha: the Sky service keeps its own per-app allowlist
64("Computer Use was not approved to use <App>"), granted via an interactive
65overlay prompt — headless runs cannot approve it. If a run reports that
66denial, tell the user to approve the target app once via an interactive
67Computer Use action on it (ChatGPT/Codex app, or an interactive `codex`
68session with the same overrides); consent then persists for headless runs.
69
70## Prompt Requirements
71
72Tell Codex:
73
74- The exact behavior to verify.
75- The platform and app type, such as iOS, web, Electron, CLI, or desktop.
76- Known launch commands, test credentials, seed data, deep links, or fixtures.
77- Whether source edits are allowed. Default is no edits.
78- Where screenshots, logs, and the final report should be saved.
79- To return pass, fail or blocked, plus steps performed, observed behavior, screenshot paths, and actionable feedback.
80- To describe each screenshot in the report: what it shows and how it supports the pass/fail verdict, so the report stands on its own without opening the images.
81
82Keep the prompt specific enough that Codex does not need the surrounding Claude conversation.
83
84If `codex` is not installed, the command fails, or rate limits have been hit, report the error and offer alternatives: the `verify` or `run` skills, or browser automation (c11-browser or chrome-devtools) depending on the app type.

The general shape, past this one skill: every time you find yourself doing something repeatedly to check an agent’s work, that is a job description, and somebody should be hired for it. Usually not you. You want to be the one moving the project forward, not the one running the same five clicks for the fortieth time to find out whether the machine told you the truth.

If you found this helpful, share it:

Share on X