# P6 capacity results — `<host label>`

> Copy this file to `RESULTS-<host label>.md`, then fill it from `out/<run-id>/SUMMARY.md`
> and `out/<run-id>/host.json`. Most cells can be pasted verbatim — the harness already
> computed them. **Fill one of these per host** (the live EC2 sandbox box and the hosted
> 8-core/32-GiB server are the two PLAN.md names) so the two are directly comparable.
>
> Phase-0 proof output. NOT a production SLA. A cell you did not measure stays
> `UNMEASURED` — never `0`, never an estimate, never a number carried over from the other
> host.

## 0. Run identity

| field | value |
|---|---|
| Host label | `<ec2-sandbox / hostinger-kvm8 / ...>` |
| Run id (`out/<run-id>`) | |
| Date (UTC) | |
| Operator | |
| Harness commit | |
| Command run | `python3 run_capacity.py ...` |
| Completeness verdict from SUMMARY.md | `COMPLETE` / `INCOMPLETE` |
| Was the host otherwise idle? | |

## 1. Host shape (paste from `host.json`)

| field | value |
|---|---|
| Cloud / provider | |
| Instance type | |
| Burstable (t2/t3/t4g)? | |
| vCPU | |
| RAM | |
| Disk (type, size, IOPS/throughput) | |
| Network (Gbps, monthly allowance) | |
| GPU (model, driver, NVENC sessions) | `none` / |
| Kernel / distro | |
| Containerised? cgroup cpu.max / memory.max | |

## 2. Image and tool versions

| component | version |
|---|---|
| Chromium (Playwright bundle) | |
| Playwright (python) | |
| Browser worker image (`P6_BROWSER_IMAGE`) | |
| Selkies image (`P6_SELKIES_IMAGE`) | |
| Sandbox image (`P6_SANDBOX_IMAGE`) | |
| ffmpeg / encoder | |
| coTURN (`P6_TURN_URL`) | |

## 3. Per-class capacity — the answer

The number PLAN.md's admission control consumes. `Per-node limit` is
`floor(0.70 × first failure level)`, computed by the harness.

| capacity class | binding workload | first failure level | last passing level | **per-node admission limit** | fleet limit (`--nodes N`) |
|---|---|---:|---:|---:|---:|
| browser_unstreamed (warm, unstreamed workers) | | | | | |
| streamed_browser (interactive 1080p) | | | | | |
| full_ui_sandbox (sandbox + streamed browser) | | | | | |
| burst (simultaneous restore/start) | | | | | |

**Comparison to PLAN.md's planning envelope** (the table in §Capacity model). Say plainly
whether the measurement is above, below, or inside the estimate:

| class | PLAN.md envelope for this shape | measured | verdict |
|---|---|---|---|
| warm unstreamed workers | | | |
| concurrent software-encoded streams | | | |
| full UI sandbox + browser/stream | | | |

## 4. Per-workload detail

One block per workload. Paste the table straight out of `SUMMARY.md`.

### Workload 1 — idle authenticated tab
| conc | CPU p95 | steal p95 | mem p95 | disk util p95 | RSS/unit p95 | start p95 | action p50/p95/p99 | crashes |
|---:|---:|---:|---:|---:|---:|---:|---|---:|
| | | | | | | | | |

Binding guardrail: · Notes:

### Workload 2 — ordinary navigation/form work
(same table)

### Workload 3 — heavy modern web app, multiple tabs
(same table)

### Workload 4 — 1080p interactive stream (x264, then hardware)
Add: encoder utilisation p95, bitrate p50/p95, **input latency p95**.
If skipped, state what was missing and what would make it runnable.

### Workload 5 — full sandbox plus streamed browser
(same, plus sandbox image and per-sandbox CPU/RAM)

### Workload 6 — restore/start storm, and TURN-relayed streams
Storm: concurrent starts, restore latency p50/p95, start latency p50/p95, failures.
TURN: relayed input latency p95, bitrate, relay CPU/egress. If skipped, say so.

## 5. Burstable soak (T3 credit behaviour)

Required by PLAN.md on t2/t3/t4g: **≥ 6 hours** at a steady level, credit balance recorded
beside CPU.

| field | value |
|---|---|
| Ran? | |
| Workload / concurrency / hours | |
| CPU p50 / p95 over the soak | |
| **Steal p50 / p95** (non-zero ⇒ throttling) | |
| Credit balance start → end (`source: cloudwatch`) | |
| Credit source if not CloudWatch | `steal_proxy` — a proxy, not a balance |
| Did any guardrail cross only after credits ran out? | |
| Verdict: can this shape hold the measured level for a full day? | |

## 6. Noisy-neighbour impact

From the action-latency-vs-baseline column: how much does one tenant's latency degrade at
the admission limit versus alone?

| workload | p95 alone | p95 at admission limit | degradation | acceptable? |
|---|---:|---:|---|---|

## 7. What is still OUTSTANDING on this host

List every skipped workload, every `UNMEASURED` guardrail, and what would close it.

| gap | why | what closes it |
|---|---|---|

## 8. Recommendation for Browser Manager

- Per-class admission limits to configure: …
- Queue-vs-reject behaviour above the limit: …
- Host shape recommended for the next size up (PLAN.md names `r6i.4xlarge` /
  `r6i.8xlarge` as benchmark shapes, not preselected instances): …
- Anything measured here that contradicts PLAN.md and needs a DECISIONS.md entry: …
