# Device Lab test protocol

> Every Device Lab test id with its duration, the harness pages it uses in each harness version, and the behaviour topics it feeds, plus the run rules.

import LabTestIndex from '@components/lab/LabTestIndex.astro';
import LabProvenance from '@components/lab/LabProvenance.astro';

A test is a short, numbered procedure (T0, T1, and so on) that runs on one device against published harness pages. Results that answer the same question are collected on a [behaviour page](/lab/behaviour/). A suffix marks a variant: `-WI` needs a Mac with Web Inspector attached, `T4b` is the status-bar style variant of T4, and `T5b` repeats the Add to Home Screen check from a third-party browser.

## How a test is structured

Before running a step, record its expected result and the source of that expectation. Then record what the screen and page showed. A difference from the expectation counts as a finding. The protocol keeps each test under five minutes and a whole checklist under an hour; a test that runs long is stopped and recorded as `incomplete` with the reason.

### Fresh state

A test that says "fresh state" starts with no trace of an earlier run. The [protocol](https://openpwa.net/research/2026-10-ios18-home-screen-web-apps/data/PROTOCOL.md) gives the steps for an iPhone: remove the Home Screen icon (touch and hold, **Remove App**, **Delete**) before adding it again, and clear the site's data in Settings > Apps > Safari > Advanced > Website Data (older releases put it under Settings > Safari > Advanced). Apple describes the Website Data control in [Delete your Safari history, cache, and cookies on iPhone](https://support.apple.com/en-us/105082) (apple.com). A test that depends on earlier state, such as a cookie written in Safari before Add to Home Screen, says which state it needs.

### Tab and Home Screen app

A page in a Safari tab and the same page launched from its Home Screen icon can behave differently. In the 2026-10-20 run, a Home Screen web app with a manifest ran in its own process, apart from Safari, with its own storage, while a page with no manifest and no icon opened from the Home Screen in Safari's process with Safari's storage ([findings](https://openpwa.net/research/2026-10-ios18-home-screen-web-apps/data/FINDINGS.md), F1). Each read is labelled with its context, `tab` or `app`, and a result says which context it covers. Harness versions are listed on [Harness](/lab/harness/).

### Recording and confidence

Record each test with the same fields: result (`as-expected`, `differs`, `could-not-run` with the reason, or `incomplete` with the reason), what was observed in one or two factual sentences with on-screen text quoted in the UI language, the key values, the screenshot file names and the time taken. Each result carries a confidence label, as defined in the study [report](https://openpwa.net/research/2026-10-ios18-home-screen-web-apps/data/REPORT.md) (section 5.4): A for an agent-measured instrumented read stored in `raw/` (a Web Inspector read, or a WebDriver read for some tab values), S for a screenshot or recording captured by the operator and analysed afterwards, and O for the operator's verbal report alone. A combination such as A+S means independent sources agree.

## Test list

Tests are indexed by id, duration, platform, harness page for each version, and related behaviours. Harness v1 pages sit under `/lab/device-tests/` and are `noindex`; open them on the device under test.

<LabTestIndex locale="en" />

## Before and after a run

Compare the files you load with the published hashes. Harness v1 lists the SHA-256 of each file as served in [/lab/harness/v1/SHA256SUMS.txt](/lab/harness/v1/SHA256SUMS.txt). The study report asks rerunners to compare served files with recorded hashes because the lab can change, and it records one change during the 2026-10-20 run: a deploy at about 08:28 UTC changed `lab.js`, and pages that were already open kept the cached earlier copy (section 10, harness drift). The [iPhone and iPad guide](/lab/guides/iphone-ipad/) has a script for the comparison.

<LabProvenance locale="en" />