# iOS run 2026-10-25 on EAS (/docs/bench/ios-2026-10-25)













The run behind the 2026-10-25 iOS dataset on the [comparison page](/docs/bench/comparison). Everything below comes from the four workers' artifacts, merged into one report; nothing was measured on a developer machine.

## How it was run [#how-it-was-run]

|                         |                                                                                                                                                                                                                                                                                                                                                                                            |
| ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| Workflow                | `apps/example/.eas/workflows/bench-baseline.yml`, EAS Workflows run [`01a172f5-fdee-7992-b66c-a2173338eb32`](https://expo.dev/accounts/delacour/projects/warden/workflows/01a172f5-fdee-7992-b66c-a2173338eb32), inputs `runs=5`, `frameworks=warden,argent,agent-device,tester-army`, `max_minutes=55`                                                                                    |
| Code                    | warden commit `5ffd64f2` (branch `feature/devboxes`), every suite under `packages/e2e-bench/suites/`                                                                                                                                                                                                                                                                                       |
| Workers                 | One EAS `macos-large` worker per framework, four in all, two at a time on this plan. VM template `macos-tahoe-26.5-xcode-26.6`: VirtualMac2,1, Apple M4 Pro (Virtual), 10 cores, 40 GB, macOS 26.5.2 (25F84), Xcode 26.6 (17F113)                                                                                                                                                          |
| Simulator               | Each worker claims its own headless simulator with `warden claim ios --headless` (iPhone 17, iOS 26.5, named `warden-iphone-17-1`), created fresh for the job and shut down at the end. Nothing one framework leaves behind can reach another                                                                                                                                              |
| App                     | The same build on every worker: `nz.co.delacour.warden.example`, EAS `bench` profile (Release, simulator), sha256 `2d35643eda49`, 101.1 MB, reused by fingerprint (`build_ios` skipped), installed with `simctl install` before the bench                                                                                                                                                  |
| Runs                    | 5 runs of the 8-test suite per framework. Run 1 is cold; warm numbers are the median of runs 2 to 5. `retries=0`, fresh app launch per test, `caffeinate -dims` held                                                                                                                                                                                                                       |
| Before the bench        | `bun install`, `warden-simd` built from source (Swift release), the framework installed (`bun add -g @swmansion/argent@0.30.1` / `agent-device@0.21.31`; tester.army's `e2e` 0.20.0 comes with `bun install`, Node 22.23.1), then the job waits for the 1-minute load average to drop under the core count and records a 60 s idle control of the simulator with the app in the foreground |
| Deep-link sheet         | iOS shows "Open in …?" for the first custom-scheme link after a boot and never again, so the harness opens one link and answers the sheet before every framework's prepare. No suite handles the sheet itself                                                                                                                                                                              |
| Hard stop               | A watchdog stops the bench at `max_minutes`; it did not fire on any worker (the longest job ran 28 min)                                                                                                                                                                                                                                                                                    |
| Isolation per framework | Helpers of every framework stopped, driver apps uninstalled before the run (cold cost measured), residue listed after teardown                                                                                                                                                                                                                                                             |
| Sampling                | Host and simulator processes sampled every 500 ms from `ps`; the CPU headline is CPU-seconds of the framework's own process tree during the timed run, warm median                                                                                                                                                                                                                         |
| Evidence on exit        | Each job screenshots the simulator and lists the apps still running, releases the lease even when a step failed, and uploads an `eas-ios-<framework>` artifact                                                                                                                                                                                                                             |
| Versions                | bun 1.3.14, warden 0.1.1, Argent 0.30.1, agent-device 0.21.31, tester.army e2e 0.20.0 (bundled agent-device 0.21.25), Node 22.23.1                                                                                                                                                                                                                                                         |

Hosted workers idle hotter than a Mac and share their host, so these numbers compare only with other `macos-large` runs, never with runs on other hardware.

## Results [#results]

### Summary [#summary]

| Framework    | Status | Version                 | Suite median (warm) | p95      | Ratio | Cold rep 1 | Cold-start cost | Prepare | Teardown | Overhead | Pass rate | Flake | Residue                 | Footprint (LOC / deps) |
| ------------ | ------ | ----------------------- | ------------------- | -------- | ----- | ---------- | --------------- | ------- | -------- | -------- | --------- | ----- | ----------------------- | ---------------------- |
| warden       | ok     | bun 1.3.14 + warden-e2e | 97.04 s             | 98.63 s  | 1.06× | 98.33 s    | 1.94 s          | 652 ms  | 85 ms    | 80 ms    | 100%      | 0%    | 0 proc / 0 app / 0 path | 379 LOC / 0 B          |
| argent       | ok     | 0.30.1                  | 131.81 s            | 132.14 s | 1.44× | 132.43 s   | 2.35 s          | 1.73 s  | 511 ms   | 168 ms   | 100%      | 0%    | 0 proc / 0 app / 1 path | 161 LOC / 0 B          |
| agent-device | ok     | agent-device 0.21.31    | **91.77 s**         | 91.93 s  | 1.00× | 92.86 s    | 18.41 s         | 17.32 s | 322 ms   | 223 ms   | 100%      | 0%    | 0 proc / 1 app / 1 path | 158 LOC / 0 B          |
| tester-army  | ok     | e2e 0.20.0              | 132.34 s            | 133.43 s | 1.44× | 151.03 s   | 18.69 s         | 0 ms    | 523 ms   | 2.21 s   | 100%      | 0%    | 0 proc / 1 app / 1 path | 307 LOC / 0 B          |

### Per-test medians (ms) [#per-test-medians-ms]

| Test                                                       | warden            | argent        | agent-device      | tester-army   |
| ---------------------------------------------------------- | ----------------- | ------------- | ----------------- | ------------- |
| onboarding steps through to sign-in                        | **3136 (1.00×)**  | 8220 (2.62×)  | 3867 (1.23×)      | 6032 (1.92×)  |
| invalid email and short password show field errors         | 17987 (1.09×)     | 17962 (1.09×) | **16549 (1.00×)** | 20867 (1.26×) |
| a locked account shows the form alert                      | 11046 (1.14×)     | 14040 (1.45×) | **9671 (1.00×)**  | 12799 (1.32×) |
| valid credentials land on todos                            | 10937 (1.12×)     | 14982 (1.53×) | **9771 (1.00×)**  | 14889 (1.52×) |
| add, complete and filter todos                             | 16997 (1.10×)     | 20867 (1.35×) | **15503 (1.00×)** | 21196 (1.37×) |
| open a todo, mark it done, then delete it                  | **12015 (1.00×)** | 18881 (1.57×) | 12491 (1.04×)     | 18171 (1.51×) |
| deep link opens a todo by id                               | 11791 (1.13×)     | 17367 (1.67×) | **10417 (1.00×)** | 18056 (1.73×) |
| settings shows the account, toggles switches and signs out | **13018 (1.00×)** | 19116 (1.47×) | 13228 (1.02×)     | 18070 (1.39×) |

### Per-step latency [#per-step-latency]

| Framework    | Steps | Median | p95    | Max    |
| ------------ | ----- | ------ | ------ | ------ |
| warden       | 504   | 170 ms | 3.93 s | 5.00 s |
| argent       | 1192  | 318 ms | 1.82 s | 2.82 s |
| agent-device | 632   | 479 ms | 1.62 s | 1.90 s |
| tester-army  | 592   | 494 ms | 3.18 s | 3.98 s |

### Untraced time [#untraced-time]

| Framework | Untraced / rep | Share of test time | Largest (test)                              |
| --------- | -------------- | ------------------ | ------------------------------------------- |
| warden    | 3.35 s         | 3.5%               | settings/account-switches-sign-out (718 ms) |

Test wall time that no step and no span of the framework's own trace covers (warden: `trace.jsonl`; nested steps and spans count once). Runner overhead, hooks, sleeps and calls nobody wrapped end up here.

### Resources [#resources]

| Framework    | Scope | CPU-s / rep | CPU-s (whole) | CPU avg | CPU peak | RSS avg  | RSS peak |
| ------------ | ----- | ----------- | ------------- | ------- | -------- | -------- | -------- |
| warden       | host  | 9.12 s      | 46.25 s       | 8.1%    | 59.4%    | 147.8 MB | 184.9 MB |
| warden       | sim   | —           | 563.94 s      | 102.7%  | 292.5%   | 36.4 GB  | 36.5 GB  |
| argent       | host  | 2.79 s      | 14.69 s       | 1.7%    | 39.7%    | 182.0 MB | 261.8 MB |
| argent       | sim   | —           | 956.48 s      | 131.3%  | 788.2%   | 36.3 GB  | 36.5 GB  |
| agent-device | host  | 10.30 s     | 73.33 s       | 12.9%   | 532.8%   | 745.9 MB | 2.4 GB   |
| agent-device | sim   | —           | 683.96 s      | 125.8%  | 380.0%   | 36.8 GB  | 37.0 GB  |
| tester-army  | host  | 17.01 s     | 107.19 s      | 13.9%   | 508.1%   | 599.5 MB | 2.0 GB   |
| tester-army  | sim   | —           | 914.59 s      | 118.9%  | 560.4%   | 36.8 GB  | 37.0 GB  |

Sampled every 500 ms from `ps`. `host` = the framework's own process tree; `sim` = every process of the simulator's `launchd_sim` tree, or on Android the app under test plus every framework's on-device helpers from `top` (every 2 s). RSS is a per-process sum, so shared framework pages are counted once per process: compare the numbers across frameworks, not against physical memory.

`CPU-s / rep` (the CPU headline) is the CPU time of the timed run only, median over the warm reps (over every rep, cold included, when a framework has no warm rep, as with `--runs 1`), from per-process deltas of `ps time`; the other columns are whole-framework (prepare, every rep, the per-rep housekeeping and teardown), so their averages move with suite length. `CPU avg` / `CPU peak` are `ps %cpu`, a decaying average on macOS, kept for comparison with older runs. Android `sim` has no CPU-seconds (`top` only). CPU-seconds undercount: CPU a process uses after the last 500 ms tick, and processes living between ticks, are only recovered for children the bench ran itself (their rusage at exit); daemons and processes a framework spawns and never waits for are not, so frameworks that fan out to many short-lived tools read low. An exit charge is booked to its root's group, so in the per-group split the unseen CPU of a descendant of another group (a `bun test` under a `warden` root) shows under the root. procps (Linux) `ps time` has 1 s resolution.

#### Host by process group [#host-by-process-group]

| Framework    | Group       | CPU-s (whole) | RSS avg  | RSS peak |
| ------------ | ----------- | ------------- | -------- | -------- |
| warden       | bun-test    | 10.27 s       | 92.0 MB  | 129.3 MB |
| warden       | warden-simd | 35.39 s       | 55.7 MB  | 56.2 MB  |
| warden       | warden-cli  | 0.13 s        | 82.2 KB  | 77.7 MB  |
| warden       | other       | 0.47 s        | 21.7 KB  | 20.5 MB  |
| argent       | other       | 14.69 s       | 182.0 MB | 261.8 MB |
| agent-device | other       | 73.33 s       | 745.9 MB | 2.4 GB   |
| tester-army  | other       | 107.19 s      | 599.5 MB | 2.0 GB   |

`bun-test` the spec process, `warden-simd` the resident iOS helper, `warden-cli` the `warden` commands the bench spawned, `adb` / `emulator` the Android tools, `other` the rest (another framework's runner, `xcrun`, java). Each group's RSS average counts 0 for ticks without a process, so the groups add up to the host.

### Where the CPU goes [#where-the-cpu-goes]

#### warden [#warden]

| Process                            | Scope | CPU-s   | Share | RSS avg  | RSS peak | Spawns |
| ---------------------------------- | ----- | ------- | ----- | -------- | -------- | ------ |
| warden-simd                        | host  | 7.03 s  | 77.2% | 55.9 MB  | 56.0 MB  | 1      |
| bun test                           | host  | 1.15 s  | 12.6% | 92.2 MB  | 107.1 MB | 1      |
| bun test (exit charge)             | host  | 0.69 s  | 7.5%  | 0 B      | 0 B      | 0      |
| simctl                             | host  | 0.24 s  | 2.7%  | 277.4 KB | 20.7 MB  | 3      |
| (PlistBuddy)                       | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| (bash)                             | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| (simctl)                           | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| bun cli.ts                         | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| iOS                                | sim   | 75.30 s | 64.7% | 34.8 GB  | 34.8 GB  | 286    |
| wardenexample                      | sim   | 30.57 s | 26.3% | 374.9 MB | 432.8 MB | 8      |
| SimulatorFrameworkBridge-iOS serve | sim   | 6.04 s  | 5.2%  | 197.7 MB | 210.2 MB | 12     |
| bun cli.ts                         | sim   | 2.01 s  | 1.7%  | 235.0 MB | 241.7 MB | 1      |
| CoreSimulatorBridge                | sim   | 0.94 s  | 0.8%  | 83.7 MB  | 83.9 MB  | 1      |
| launchd\_sim                       | sim   | 0.39 s  | 0.3%  | 52.2 MB  | 52.2 MB  | 1      |
| xpcproxy\_sim                      | sim   | 0.26 s  | 0.2%  | 390.5 KB | 11.4 MB  | 8      |
| mlhostd                            | sim   | 0.24 s  | 0.2%  | 129.7 KB | 14.4 MB  | 2      |
| ps                                 | sim   | 0.15 s  | 0.1%  | 1.9 MB   | 1.9 MB   | 191    |
| (launchctl)                        | sim   | 0.14 s  | 0.1%  | 93.2 KB  | 17.4 MB  | 1      |
| storekitd                          | sim   | 0.14 s  | 0.1%  | 127.9 MB | 127.9 MB | 1      |
| triald                             | sim   | 0.13 s  | 0.1%  | 96.6 MB  | 96.6 MB  | 1      |
| other                              | sim   | 0.00 s  | 0.0%  | 443.9 MB | 443.9 MB | 6      |

#### argent [#argent]

| Process                   | Scope | CPU-s   | Share | RSS avg  | RSS peak | Spawns |
| ------------------------- | ----- | ------- | ----- | -------- | -------- | ------ |
| simulator-server          | host  | 2.50 s  | 92.0% | 96.6 MB  | 96.7 MB  | 1      |
| node argent               | host  | 0.21 s  | 7.8%  | 85.7 MB  | 87.9 MB  | 1      |
| node argent (exit charge) | host  | 0.01 s  | 0.2%  | 0 B      | 0 B      | 0      |
| (node)                    | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| node tool-server.cjs      | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| simctl                    | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| system\_profiler          | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| iOS                       | sim   | 98.77 s | 74.0% | 34.8 GB  | 34.9 GB  | 287    |
| wardenexample             | sim   | 29.50 s | 22.1% | 375.5 MB | 435.1 MB | 8      |
| bun cli.ts                | sim   | 2.78 s  | 2.1%  | 298.6 MB | 308.0 MB | 1      |
| simctl                    | sim   | 0.41 s  | 0.3%  | 363.8 KB | 20.5 MB  | 7      |
| CoreSimulatorBridge       | sim   | 0.40 s  | 0.3%  | 117.8 MB | 118.2 MB | 1      |
| launchd\_sim              | sim   | 0.37 s  | 0.3%  | 52.2 MB  | 52.2 MB  | 1      |
| ps                        | sim   | 0.29 s  | 0.2%  | 1.9 MB   | 2.0 MB   | 260    |
| (mlhostd)                 | sim   | 0.26 s  | 0.2%  | 222.5 KB | 40.5 MB  | 2      |
| triald                    | sim   | 0.20 s  | 0.1%  | 96.7 MB  | 96.7 MB  | 1      |
| storekitd                 | sim   | 0.19 s  | 0.1%  | 128.4 MB | 128.4 MB | 1      |
| (managedappdistri)        | sim   | 0.14 s  | 0.1%  | 214.5 KB | 54.5 MB  | 1      |
| mlhostd                   | sim   | 0.13 s  | 0.1%  | 119.3 KB | 15.7 MB  | 2      |
| other                     | sim   | 0.05 s  | 0.0%  | 444.5 MB | 453.2 MB | 9      |

#### agent-device [#agent-device]

| Process                         | Scope | CPU-s   | Share | RSS avg  | RSS peak | Spawns |
| ------------------------------- | ----- | ------- | ----- | -------- | -------- | ------ |
| xcodebuild                      | host  | 7.50 s  | 73.3% | 218.0 MB | 218.7 MB | 1      |
| bun cli.ts                      | host  | 1.77 s  | 17.3% | 268.7 MB | 273.3 MB | 1      |
| snapshot-bridge                 | host  | 0.77 s  | 7.5%  | 116.3 MB | 116.4 MB | 1      |
| node agent-device               | host  | 0.15 s  | 1.5%  | 61.0 MB  | 66.8 MB  | 1      |
| ps                              | host  | 0.02 s  | 0.2%  | 1.9 MB   | 1.9 MB   | 182    |
| simctl                          | host  | 0.02 s  | 0.2%  | 20.4 MB  | 20.4 MB  | 1      |
| node agent-device (exit charge) | host  | 0.01 s  | 0.1%  | 0 B      | 0 B      | 0      |
| (simctl)                        | host  | 0.00 s  | 0.0%  | 96.9 KB  | 17.2 MB  | 1      |
| DTServiceHub                    | host  | 0.00 s  | 0.0%  | 16.7 MB  | 16.7 MB  | 1      |
| caffeinate                      | host  | 0.00 s  | 0.0%  | 7.3 MB   | 7.3 MB   | 1      |
| (bash)                          | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| (clang)                         | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| other                           | host  | 0.00 s  | 0.0%  | 0 B      | 0 B      | 0      |
| iOS                             | sim   | 89.31 s | 65.7% | 35.5 GB  | 35.5 GB  | 291    |
| wardenexample                   | sim   | 35.81 s | 26.3% | 371.9 MB | 438.3 MB | 8      |
| AgentDeviceRunnerUITests-Runner | sim   | 9.14 s  | 6.7%  | 268.2 MB | 268.2 MB | 1      |
| CoreSimulatorBridge             | sim   | 0.51 s  | 0.4%  | 80.6 MB  | 80.7 MB  | 1      |
| simctl                          | sim   | 0.48 s  | 0.4%  | 676.7 KB | 20.5 MB  | 7      |
| launchd\_sim                    | sim   | 0.31 s  | 0.2%  | 52.4 MB  | 52.4 MB  | 1      |
| triald                          | sim   | 0.13 s  | 0.1%  | 96.7 MB  | 96.7 MB  | 1      |
| storekitd                       | sim   | 0.13 s  | 0.1%  | 128.3 MB | 128.3 MB | 1      |
| xpcproxy\_sim                   | sim   | 0.09 s  | 0.1%  | 176.0 KB | 9.1 MB   | 4      |
| mlhostd                         | sim   | 0.08 s  | 0.1%  | 34.2 KB  | 6.1 MB   | 1      |
| (wardenexample)                 | sim   | 0.00 s  | 0.0%  | 2.4 MB   | 433.2 MB | 1      |
| assetsd                         | sim   | 0.00 s  | 0.0%  | 163.2 MB | 163.2 MB | 1      |
| other                           | sim   | 0.00 s  | 0.0%  | 274.3 MB | 274.3 MB | 4      |

#### tester-army [#tester-army]

| Process                         | Scope | CPU-s    | Share | RSS avg  | RSS peak | Spawns |
| ------------------------------- | ----- | -------- | ----- | -------- | -------- | ------ |
| xcodebuild                      | host  | 14.26 s  | 84.0% | 217.0 MB | 218.2 MB | 1      |
| node entry.js                   | host  | 1.05 s   | 6.2%  | 84.9 MB  | 92.8 MB  | 1      |
| snapshot-bridge                 | host  | 0.63 s   | 3.7%  | 116.2 MB | 116.3 MB | 1      |
| (node) (exit charge)            | host  | 0.62 s   | 3.7%  | 0 B      | 0 B      | 0      |
| node e2e                        | host  | 0.35 s   | 2.1%  | 109.4 MB | 132.3 MB | 1      |
| (node)                          | host  | 0.03 s   | 0.2%  | 0 B      | 0 B      | 0      |
| other (exit charge)             | host  | 0.03 s   | 0.2%  | 0 B      | 0 B      | 0      |
| (ps)                            | host  | 0.01 s   | 0.1%  | 27.9 KB  | 1.7 MB   | 5      |
| simctl                          | host  | 0.00 s   | 0.0%  | 20.5 MB  | 20.5 MB  | 1      |
| DTServiceHub                    | host  | 0.00 s   | 0.0%  | 16.8 MB  | 16.8 MB  | 1      |
| (pgrep)                         | host  | 0.00 s   | 0.0%  | 0 B      | 0 B      | 0      |
| (simctl)                        | host  | 0.00 s   | 0.0%  | 0 B      | 0 B      | 0      |
| other                           | host  | 0.00 s   | 0.0%  | 0 B      | 0 B      | 0      |
| iOS                             | sim   | 107.48 s | 60.4% | 35.1 GB  | 35.2 GB  | 289    |
| wardenexample                   | sim   | 49.85 s  | 28.0% | 380.4 MB | 441.8 MB | 9      |
| AgentDeviceRunnerUITests-Runner | sim   | 15.86 s  | 8.9%  | 271.0 MB | 271.2 MB | 1      |
| bun cli.ts                      | sim   | 2.56 s   | 1.4%  | 254.0 MB | 264.4 MB | 1      |
| CoreSimulatorBridge             | sim   | 0.57 s   | 0.3%  | 80.6 MB  | 80.6 MB  | 1      |
| simctl                          | sim   | 0.54 s   | 0.3%  | 534.1 KB | 20.8 MB  | 8      |
| launchd\_sim                    | sim   | 0.46 s   | 0.3%  | 51.8 MB  | 51.8 MB  | 1      |
| mlhostd                         | sim   | 0.24 s   | 0.1%  | 135.3 KB | 14.3 MB  | 3      |
| triald                          | sim   | 0.16 s   | 0.1%  | 96.6 MB  | 96.7 MB  | 1      |
| storekitd                       | sim   | 0.15 s   | 0.1%  | 128.2 MB | 128.2 MB | 1      |
| launchctl                       | sim   | 0.10 s   | 0.1%  | 36.7 KB  | 9.4 MB   | 1      |
| ps                              | sim   | 0.06 s   | 0.0%  | 1.9 MB   | 1.9 MB   | 263    |
| other                           | sim   | 0.07 s   | 0.0%  | 446.4 MB | 870.8 MB | 8      |

One table per framework, from the warm-median rep's timed run (the rep whose host CPU-seconds is the lower median). Rows are processes grouped by label (top 12 per scope, the rest in `other`); `host` is the framework's own process tree, `sim` the simulator's `launchd_sim` tree (iOS only). `Share` is of the scope's CPU-seconds. `RSS` is the label's summed RSS per 500 ms tick (0 where it had no process). `Spawns` counts distinct pids a tick saw: a process that lives between two ticks is only seen through the `(exit charge)` rows (CPU of a child the bench ran, booked at its exit), so many short-lived `xcrun simctl` calls read low in `Spawns` and in CPU.

### Residue [#residue]

* **warden:** none
* **argent:** paths: /Users/expo/.argent (328.0 KB)
* **agent-device:** driver apps: com.callstack.agentdevice.runner.uitests.xctrunner; paths: /Users/expo/.agent-device-bench/agent-device (2.9 MB)
* **tester-army:** driver apps: com.callstack.agentdevice.runner.uitests.xctrunner; paths: /Users/expo/.agent-device-bench/tester-army (4.9 MB)

## Artifacts [#artifacts]

Each worker uploaded its results directory as one archive. The viewable files are copied here; the archives hold everything, including the per-rep `resources.ndjson` ticks and the 60 s idle control. To re-render one: download the archive, `tar -xzf` it, then `bun run bench report Users/expo/bench-results` from the warden repo.

### Merged run [#merged-run]

The four results merged into one run, `bench-2026-10-25-ios-eas`, ratios recomputed across the four: [report.html](/bench/ios-2026-10-25/merged/report.html), [report.md](/bench/ios-2026-10-25/merged/report.md), [bench-results.json](/bench/ios-2026-10-25/merged/bench-results.json), [summary.json](/bench/ios-2026-10-25/merged/summary.json) (the comparison page's dataset).

### warden [#warden-1]

Worker job `bench_warden`, bun 1.3.14 + warden-e2e (this commit). [Download the whole artifact](/bench/ios-2026-10-25/warden.tar.gz) (the EAS `eas-ios-warden` archive, unpacks to `Users/expo/bench-results`).

* [report.html](/bench/ios-2026-10-25/warden/report.html) (self-contained, with charts) and [report.md](/bench/ios-2026-10-25/warden/report.md)
* [bench-results.json](/bench/ios-2026-10-25/warden/bench-results.json) (schema v1, every rep, every test, every step, the 500 ms resource ticks per rep are in the archive) and [summary.json](/bench/ios-2026-10-25/warden/summary.json)
* [bench-run.log](/bench/ios-2026-10-25/warden/bench-run.log) (the harness), [fw-install.log](/bench/ios-2026-10-25/warden/fw-install.log), [simd-build.log](/bench/ios-2026-10-25/warden/simd-build.log), [host-facts.txt](/bench/ios-2026-10-25/warden/host-facts.txt)
* Framework logs: [bench.log](/bench/ios-2026-10-25/warden/logs/bench.log), [warden.prepare.log](/bench/ios-2026-10-25/warden/logs/warden.prepare.log), [warden.rep-1.log](/bench/ios-2026-10-25/warden/logs/warden.rep-1.log), [warden.rep-2.log](/bench/ios-2026-10-25/warden/logs/warden.rep-2.log), [warden.rep-3.log](/bench/ios-2026-10-25/warden/logs/warden.rep-3.log), [warden.rep-4.log](/bench/ios-2026-10-25/warden/logs/warden.rep-4.log), [warden.rep-5.log](/bench/ios-2026-10-25/warden/logs/warden.rep-5.log), [warden.teardown.log](/bench/ios-2026-10-25/warden/logs/warden.teardown.log)
* The simulator as the job left it, after teardown:

<img alt="The warden worker's simulator at exit" src="__img0" />

### Argent [#argent-1]

Worker job `bench_argent`, @swmansion/argent 0.30.1. [Download the whole artifact](/bench/ios-2026-10-25/argent.tar.gz) (the EAS `eas-ios-argent` archive, unpacks to `Users/expo/bench-results`).

* [report.html](/bench/ios-2026-10-25/argent/report.html) (self-contained, with charts) and [report.md](/bench/ios-2026-10-25/argent/report.md)
* [bench-results.json](/bench/ios-2026-10-25/argent/bench-results.json) (schema v1, every rep, every test, every step, the 500 ms resource ticks per rep are in the archive) and [summary.json](/bench/ios-2026-10-25/argent/summary.json)
* [bench-run.log](/bench/ios-2026-10-25/argent/bench-run.log) (the harness), [fw-install.log](/bench/ios-2026-10-25/argent/fw-install.log), [simd-build.log](/bench/ios-2026-10-25/argent/simd-build.log), [host-facts.txt](/bench/ios-2026-10-25/argent/host-facts.txt)
* Framework logs: [bench.log](/bench/ios-2026-10-25/argent/logs/bench.log)
* The simulator as the job left it, after teardown:

<img alt="The Argent worker's simulator at exit" src="__img1" />

### agent-device [#agent-device-1]

Worker job `bench_agent_device`, agent-device 0.21.31. [Download the whole artifact](/bench/ios-2026-10-25/agent-device.tar.gz) (the EAS `eas-ios-agent-device` archive, unpacks to `Users/expo/bench-results`).

* [report.html](/bench/ios-2026-10-25/agent-device/report.html) (self-contained, with charts) and [report.md](/bench/ios-2026-10-25/agent-device/report.md)
* [bench-results.json](/bench/ios-2026-10-25/agent-device/bench-results.json) (schema v1, every rep, every test, every step, the 500 ms resource ticks per rep are in the archive) and [summary.json](/bench/ios-2026-10-25/agent-device/summary.json)
* [bench-run.log](/bench/ios-2026-10-25/agent-device/bench-run.log) (the harness), [fw-install.log](/bench/ios-2026-10-25/agent-device/fw-install.log), [simd-build.log](/bench/ios-2026-10-25/agent-device/simd-build.log), [host-facts.txt](/bench/ios-2026-10-25/agent-device/host-facts.txt)
* Framework logs: [agent-device.prepare.log](/bench/ios-2026-10-25/agent-device/logs/agent-device.prepare.log), [bench.log](/bench/ios-2026-10-25/agent-device/logs/bench.log)
* The simulator as the job left it, after teardown:

<img alt="The agent-device worker's simulator at exit" src="__img2" />

### tester.army [#testerarmy]

Worker job `bench_tester_army`, e2e 0.20.0, bundling agent-device 0.21.25. [Download the whole artifact](/bench/ios-2026-10-25/tester-army.tar.gz) (the EAS `eas-ios-tester-army` archive, unpacks to `Users/expo/bench-results`).

* [report.html](/bench/ios-2026-10-25/tester-army/report.html) (self-contained, with charts) and [report.md](/bench/ios-2026-10-25/tester-army/report.md)
* [bench-results.json](/bench/ios-2026-10-25/tester-army/bench-results.json) (schema v1, every rep, every test, every step, the 500 ms resource ticks per rep are in the archive) and [summary.json](/bench/ios-2026-10-25/tester-army/summary.json)
* [bench-run.log](/bench/ios-2026-10-25/tester-army/bench-run.log) (the harness), [fw-install.log](/bench/ios-2026-10-25/tester-army/fw-install.log), [simd-build.log](/bench/ios-2026-10-25/tester-army/simd-build.log), [host-facts.txt](/bench/ios-2026-10-25/tester-army/host-facts.txt)
* Framework logs: [bench.log](/bench/ios-2026-10-25/tester-army/logs/bench.log), [tester-army.rep-1.log](/bench/ios-2026-10-25/tester-army/logs/tester-army.rep-1.log), [tester-army.rep-2.log](/bench/ios-2026-10-25/tester-army/logs/tester-army.rep-2.log), [tester-army.rep-3.log](/bench/ios-2026-10-25/tester-army/logs/tester-army.rep-3.log), [tester-army.rep-4.log](/bench/ios-2026-10-25/tester-army/logs/tester-army.rep-4.log), [tester-army.rep-5.log](/bench/ios-2026-10-25/tester-army/logs/tester-army.rep-5.log), [tester-army.teardown.log](/bench/ios-2026-10-25/tester-army/logs/tester-army.teardown.log)
* The simulator as the job left it, after teardown:

<img alt="The tester.army worker's simulator at exit" src="__img3" />

## Follow-up: warden after the helper fix [#follow-up-warden-after-the-helper-fix]

The profile in [`docs/bench/cpu-profile-2026-10-25.md`](https://github.com/delacournz/warden/blob/main/docs/bench/cpu-profile-2026-10-25.md) put 74 % of `warden-simd`'s CPU in idb's generic `Codable` decode of every accessibility frame. The helper now links idb with a single-pass frame decoder (fork commit [`1768a0d`](https://github.com/UrbanChrisy/idb/commit/1768a0d1006ff528c2fd78f335d9e3ee2f01596d) on v1.7.2, library package [`idb-v1.7.2-warden.1`](https://github.com/delacournz/warden/releases/tag/idb-v1.7.2-warden.1)). Same workflow, same worker type and simulator, warden only, 5 runs: run [`01a1739d`](https://expo.dev/accounts/delacour/projects/warden/workflows/01a1739d-2f5f-70bb-9c22-715197980e70) at commit `a87b04cc`. The bench app was rebuilt by EAS for this run (sha256 `c283eae41c7a`, same source as the run above), so the comparison page keeps the four-framework run above as its dataset and this run stands beside it.

| warden, per rep (warm) | Run above (`01a172f5`) | After (`01a1739d`) | Delta           |
| ---------------------- | ---------------------- | ------------------ | --------------- |
| Host CPU-seconds       | 9.12 s                 | 3.79 s             | -5.33 s (-58 %) |
| of which `warden-simd` | 7.03 s                 | 1.83 s             | -5.20 s (-74 %) |
| Host RSS peak          | 184.9 MB               | 177.6 MB           | -7.3 MB         |
| Suite median           | 97.04 s                | 91.89 s            | -5.15 s (-5 %)  |
| Pass rate / flakes     | 100 % / 0              | 100 % / 0          |                 |

The simulator's own CPU over the whole job (every process under `launchd_sim`, prepare and all five reps) read higher on this worker (821 CPU-s against 564 CPU-s) while both simulators idled alike before the run (idle control in the artifacts); the host is now out of the way, so the in-simulator readers are the next thing to profile.

Worker job `bench_warden`. [Download the whole artifact](/bench/ios-2026-10-25/warden-after/warden.tar.gz) (the EAS `eas-ios-warden` archive, unpacks to `Users/expo/bench-results`).

* [report.html](/bench/ios-2026-10-25/warden-after/report.html) and [report.md](/bench/ios-2026-10-25/warden-after/report.md)
* [bench-results.json](/bench/ios-2026-10-25/warden-after/bench-results.json) and [summary.json](/bench/ios-2026-10-25/warden-after/summary.json)
* [host-facts.txt](/bench/ios-2026-10-25/warden-after/host-facts.txt), harness and framework logs under [`logs/`](/bench/ios-2026-10-25/warden-after/logs/bench.log)
* The simulator as the job left it, after teardown:

<img alt="The warden worker's simulator at exit, after the helper fix" src="__img4" />
