Methodology
UIBenchmark records every Run under one versioned protocol. Runs are recorded under workflow-subscription-v2 or its successor workflow-subscription-v3, which keeps the same rules and gives every tool the same sandbox and the same browser. It evaluates a coding workflow — a tool, a model, and the settings that tool exposes — not a model in isolation. Claude Code and Codex CLI orchestrate work differently, and freezing the inputs does not make those surfaces identical. Runs recorded under the launch protocol workflow-subscription-v1 keep that label. Runs of different protocol versions are not one comparison cohort, so the site shows one protocol at a time (§4) and the compare view flags a mix.
- A · Frozen inputs
Challenge Version
Instructions, rules, starter files, assets, numbered requirements, and the capture profile. Hashes are recorded.
- B · Configurations
One Run per Configuration
Tool, displayed model, and exposed settings. Each Run starts in a fresh session from the same starter.
- C · Outputs
Published Revisions
Every buildable result is published. Repairs are kept as their own linked Revisions.
§1Frozen inputs
A Challenge is the durable identity of a UI task. Every execution binds a Challenge Version: an immutable set of instructions, rules, starter files, assets, numbered requirements, and the capture profile. Once a version is frozen, its inputs cannot change; a correction becomes a new version, so older Runs stay readable against exactly the brief they were given. Starter and asset hashes are recorded and published so two Runs can be shown to have received the same bytes.
§2One Run per Configuration
A Configuration is an immutable snapshot of the coding tool, the model identity it displayed, the settings it exposed, and the capabilities that participated. A Run binds one Challenge Version, one protocol version, one Configuration, and a repetition number. Each Run starts from a fresh copy of the same frozen starter in a new session, with no continuation from a competing Run and no external research; local preview and the provider’s own inference remain allowed. Human contribution is limited to operational approvals — no design direction and no code edits. If a tool version or an exposed setting changes, it becomes a new Configuration rather than an edit to the old one.
§3Model settings and tools
Tool defaults change silently with updates, so they never choose the model. Each Configuration fixes an exact model ID and a reasoning effort from the values the tool accepts, for example high. Both are passed to the tool when the session starts, and the model and effort the tool reports in its session log are checked against the Configuration. A mismatch is a technical failure: the attempt is discarded and repeated. A different effort, or a model ID with a context variant, is a different Configuration. Runs under workflow-subscription-v1 used the tool’s default reasoning settings and record only what the tool exposed.
Both tools get the same rules, launch prompt, and Challenge files; they do not get the same tools. The benchmark measures a workflow, so each tool keeps its native tools, and only what breaks a rule or brings in personal context is removed:
- Removed from both. Personal skills, rules, and instruction files, installed or account-synced plugins and connectors, and memory. Each Run starts under a dedicated benchmark OS account.
- Subagents are prohibited. The shared rules require the work to happen in one session, and a Run under v2 or v3 can only be allocated for a Configuration that records
subagents_enabled: false. Claude Code runs without its agent and workflow tools; Codex CLI runs with multi-agent disabled. - No web research and no image generation. The shared rules prohibit both. Under v2, Claude Code runs without its web search and web fetch tools, but its shell commands are not network-sandboxed. Codex CLI runs with web search and image generation disabled and without network access from its sandbox. Under v3 all three tools run in the same sandbox, Codex without its own (§4). It blocks the operator’s services on the machine but not the internet, so for every tool the ban rests on the shared rules and on the log review: after each Run, network commands and web or image tool calls in the session log are flagged for the operator to review.
- Violations are recorded, not hidden. A confirmed rule violation is recorded as a protocol deviation in the Revision manifest. It does not by itself make the Run invalid.
§4Protocols v2 and v3
A protocol fixes what the agent may use while it works and how it is isolated. Every Run is bound to exactly one protocol version, fixed when its Challenge Version is frozen. v3 keeps every v2 rule and changes the environment around the agent:
- Protocol ID
- v2workflow-subscription-v2v3workflow-subscription-v3
- Model and reasoning
- v2An exact model ID and reasoning setting per Configuration, passed at launch and checked against the session log.v3Same as v2.
- Subagents
- v2Prohibited.v3Prohibited.
- Sandbox
- v2Not the same for every tool. Codex CLI ran inside its own sandbox. Claude Code and OpenCode ran without an OS sandbox until 2026-09-24; from then on in a separate filesystem sandbox of the runner, without network isolation.v3One identical bubblewrap sandbox for Claude Code, Codex CLI, and OpenCode. Codex runs inside it without its own sandbox.
- Browser for checking the work
- v2None provided. Some Claude Code Runs took screenshots with a Firefox found on the machine; the Codex sandbox blocked the network, local servers, and browsers.v3A provided Playwright headless Chromium, the same for every tool.
- What the browser may open
- v2Not defined by the protocol.v3Only the agent’s own local preview: the browser itself blocks every address except localhost, 127.0.0.1, and [::1].
- Network
- v2Codex CLI had no network from its sandbox. Claude Code and OpenCode were not network-isolated.v3The internet stays reachable for the tools’ model APIs; operator services are blocked. The sandbox has no separate network.
- Operator services on the machine
- v2Not blocked: the operator’s local and tailnet services were reachable.v3Blocked for the runner account by a host firewall rule: local ports, tailnet, and LAN.
Why Runs compare only within one protocol. Under v2 the tools did not work in the same environment. Some Claude Code Runs checked their pages in a Firefox they found on the machine, while the Codex sandbox blocked local servers and browsers, so Codex could not look at its own page. v3 removes that asymmetry. A difference between a v2 output and a v3 output can therefore come from the environment rather than from the workflow, so every page that lists Runs side by side shows one protocol at a time and offers a switch between them, and the compare view flags a mix.
Earlier results stay published. A new protocol never rewrites or withdraws the Runs of an earlier one. The launch cohort ran under workflow-subscription-v1, where the model and reasoning settings could be the tool’s defaults and subagents were not ruled out; it stays available as v1 · launch and is compared only with itself.
§5Time, failures, and repairs
- No time cap. The agent works until it declares completion, or the operator records an interruption or abort. The operator-measured elapsed time is published as recorded.
- Technical failures are discarded and repeated. A crash, an authentication drop, or an outage is not a result. The attempt is archived locally and repeated under the same allocated Run, and the cumulative discarded-attempt count is published on the Run. A discarded attempt never becomes a public Revision and never counts as a second Run.
- Every buildable result is published. Missed requirements, rough layouts, and unfinished interactions are results, not failures. Retrying because the output looked weak is prohibited.
- Repairs are uncapped and public. A mechanical repair — fixing a build break without design direction — is preserved as its own linked Revision with its own prompt record and duration. Revision zero is frozen before any intervention and is preserved unchanged. Repairs are discoverable, but they are never counted as independent Runs.
§6Capture profile
1440×900 · 390×844Screenshots and checks are produced locally against the frozen compiled files through a static server with production-equivalent routing and security policy. Captures use a pinned Chromium at device pixel ratio 1, a fresh context per test group, en-US, UTC, light appearance, and reduced motion.
| Profile | Viewport |
|---|---|
| Desktop | 1440 × 900 CSS px |
| Mobile | 390 × 844 CSS px |
§7What is recorded
For each Revision the archive records the build outcome, page load and runtime errors, declared routes and fallback behaviour, responsive overflow, the requirement interactions that could be exercised, axe findings, keyboard observations, and security-policy compatibility. Each check is pass, fail, inconclusive, not_run, or error. Only pass means observed success; a broken selector is inconclusive until a human reviews it. Tests target semantic roles, accessible names, and visible state, so they do not reward one visual style. The operator may attach an attributed qualitative note; it is editorial commentary.
§8Limitations
Operator-attested: the Configuration, tool version, displayed model, and elapsed time were recorded by the operator from what the tool showed at Run time. They are not independently verified. An exact model ID appears only when the tool exposed one; it is never inferred.
Tool-self-reported: token counts come from the coding tool’s own output, imported from a labeled local source. Category names are kept as the tool reports them and are not normalized between tools. Missing usage stays unknown. Nothing here claims equal compute or equal token budgets.
Generation cost: Not separately metered. Runs were executed on the operator’s personal tool subscriptions, which do not itemize a per-Run charge. No amount is attributed, and no zero-cost claim is made.
Automated checks are not an accessibility certification. Recorded axe findings describe what the tooling observed at capture time, on a pinned browser and viewport. A check that reports no violation is not proof that the interface is accessible, and a selector problem is inconclusive rather than an implementation failure.
Conversation evidence is not provided. Raw transcripts and operator notes stay on local storage: they routinely contain incidental private material, and publishing them is not required to read the artifact. What is published instead is the frozen input, the frozen output, the hashes tying them together, and the recorded execution facts.
The launch cohort is deliberately small, so nothing here supports a general claim about a tool’s capability. One Challenge, executed once per Configuration, is an observation, not a sample.
Related: About this project and Terms and privacy.