| 1 | # Wails baseline metrics |
| 2 | |
| 3 | Captured with `scripts/desktop-shell-metrics.sh` on the frozen baseline build |
| 4 | (`wails build -platform darwin/arm64`, Apple silicon, macOS 26.6), three runs, |
| 5 | fresh disposable data home each run, `REASONIX_DEV=1`. Medians below; the raw |
| 6 | runs are the JSON files beside this file. Electron builds are measured with the |
| 7 | same script and compared only against these figures. |
| 8 | |
| 9 | | Metric | Median of 3 | |
| 10 | | --- | ---: | |
| 11 | | Go `startup` → lifecycle `ready` | 332 ms | |
| 12 | | Go `startup` → frontend `healthy` (React mounted, bridge heartbeat) | 3692 ms | |
| 13 | | Process-tree RSS, healthy + 2 s | 389 MiB | |
| 14 | | Process-tree RSS, healthy + 10 s | 385 MiB | |
| 15 | | Process-tree RSS, healthy + 30 s | 412 MiB | |
| 16 | | Processes in the tree | 4 (com.apple.WebKit.GPU, com.apple.WebKit.Networking, com.apple.WebKit.WebContent, reasonix-desktop) | |
| 17 | | SIGTERM honoured within 10 s | no (the Wails shell ignores SIGTERM; the script had to SIGKILL it) | |
| 18 | |
| 19 | Run 1 includes first-launch work in a cold data home; runs 2 and 3 reuse the |
| 20 | warm OS file cache. Startup here starts at Go `main`, not at process creation, |
| 21 | and `healthy` is the point where the React app has rendered and the bridge |
| 22 | heartbeat succeeded. Interaction latency (session switch, stop feedback, input) |
| 23 | is captured separately by the frontend benchmarks under `desktop/frontend/bench`. |
| 24 | |
| 25 | ## Electron, same script, same machine |
| 26 | |
| 27 | Development build of the shell (`desktop/electron`, Electron 44.2.0) started |
| 28 | through `desktop/electron/scripts/metrics-launch.sh` with a Go service built |
| 29 | with `-X main.version=v0.0.0-electron`, three runs, fresh data home each run. |
| 30 | Startup starts at the Electron `main` process launch (Chromium initialisation |
| 31 | included), so "ready" is later than the Wails figure, which started at Go |
| 32 | `main`. |
| 33 | |
| 34 | | Metric | Wails (median of 3) | Electron (median of 3) | Delta | |
| 35 | | --- | ---: | ---: | ---: | |
| 36 | | launch → Go lifecycle `ready` | 332 ms | 448 ms | +116 ms | |
| 37 | | launch → frontend `healthy` | 3692 ms | 3742 ms | +50 ms | |
| 38 | | Process-tree RSS, healthy + 2 s | 389 MiB | 665 MiB | +276 MiB | |
| 39 | | Process-tree RSS, healthy + 10 s | 385 MiB | 668 MiB | +283 MiB | |
| 40 | | Process-tree RSS, healthy + 30 s | 412 MiB | 697 MiB | +285 MiB | |
| 41 | | Processes in the tree | 4 | 5 (Electron, Electron Helper, Electron Helper (Renderer), reasonix-desktop-service-versioned) | | |
| 42 | | SIGTERM honoured within 10 s | no | yes (247 ms) | | |
| 43 | |
| 44 | The fixed cost is the Chromium runtime and a second renderer-class process; |
| 45 | time to a healthy frontend is unchanged within noise. The unpackaged shell |
| 46 | loads the UI from `frontend/dist` through the `reasonix://app` handler, the |
| 47 | same path the packaged build uses. Idle growth between 2 s and 30 s is the |
| 48 | same order for both shells and is re-measured over an hour in the phase F |
| 49 | acceptance run. |
| 50 | |
| 51 | The phase F acceptance run on the packaged macOS artifact (startup/idle, |
| 52 | 1/5 browser tabs, 35-cycle tab/session leak loops, one-hour sustained use, |
| 53 | interaction p95 evidence and gaps) is recorded in `PHASE_F_ACCEPTANCE.md` |
| 54 | beside this file. |
| 55 |