rapp-playwright/docs/evidence/2026-10-13-independent-local-consumer.md
tegwick ccf46d8c59 Implement bounded browser service, consumer evidence and managed package
Assistant: codex
Assistant-Model: gpt-6-astra
Assistant-Session: 01a13590-a16f-7f60-be60-fd71627bc99d
2026-10-13 19:23:29 +02:00

9.2 KiB
Raw Permalink Blame History

Independent local consumer trial — 2026-10-13

The fresh consumer agent completed the documented Python/HTTP trial against http://127.0.0.1:18081 without installing Playwright or a browser, reading provider source, or copying sibling fixtures. This proves the local Docker container consumer path only. Preflight and every receipt identify execution_location: workstation-container, release: development, service 0.1.0, Playwright 1.64.0 and Chromium 156.0.8078.4. It does not prove a Railiance deployment or accept content-explorer's own task.

The agent first read the repository instructions and consumer contract, then ran:

python3 client/rapp_playwright.py preflight
python3 client/rapp_playwright.py trial --out .local/independent-trial-01

The fresh output directory was created by the documented client. Preflight reported browser availability; the retained follow-up preflight records the same runtime identity. The successful run 6b97d75c-0c39-415f-9cf4-f1813c205066 ran from 2026-10-13T16:43:17.124Z to 16:43:30.498Z.

Evidence

Check Observed result
Keyboard and assertions All 14 steps passed across desktop and narrow contexts: visible heading, count 0, Tab, focused increment button, Enter, count 1, screenshot.
PNG dimensions Both desktop files are 1280×800; both narrow files are 390×844. Parsed the PNG IHDR directly and independently recomputed each download SHA-256.
Screenshot inspection Narrow final image visibly shows Count: 1 and an orange focus outline around Increment; no horizontal overflow is visible. This is inspection, not automated visual-baseline acceptance.
Capability boundary GET of the successful run with a deliberately incorrect bearer token returned HTTP 404 and not_found.
Deliberate UI failure Run d6b71146-4f82-4d9c-bf72-4d2b672080d2 expected impossible count 99999: ui_assertion_failed, client exit 2, failed desktop step index 1/action text, one prior screenshot preserved.
Target failure Run 57b03fc8-4947-43a9-8c9b-058f1c46a9e0 navigated to an intentionally missing path on allowed http://host.docker.internal:3300: target_unreachable, client exit 3, zero completed steps/artifacts. Receipt does not distinguish HTTP status, connection, DNS or timeout cause.
Service connection failure Preflight against unused local service port 18089 returned service_unreachable: establish the documented tunnel and retry, exit 3. The real service was not stopped.
Private handles Each client-created output directory is 0700 and its run.json is 0600. No run handles or bearer capabilities are copied into retained evidence.

Retained evidence:

Usability findings

  1. The first-command path worked without source inspection or dependency setup. Error categories distinguish assertion, target and service connection failure.
  2. At trial time, the contract's general “Client exit codes” wording did not explain that status --handle returns 0 when successfully retrieving a failed run. Both failed runs above reproduced this. A script must inspect JSON status; clarify that command-specific behavior or align its exit codes.
  3. Target diagnosis identifies the correct failure category but supplies no sanitized reason such as HTTP status or connection failure. The documentation points to browser-network reachability; more precise safe diagnostics would reduce operator round trips. This test makes no claim about which transport cause produced the observed error.
  4. At initial reading, SCOPE.md, AGENTS.md and workplans/README.md still described a planning-only repository despite the working client and service. The parent delivery session was informed; those status statements need reconciliation before publishing managed availability.

This report does not establish lifecycle cleanup, cancellation, restart recovery, cross-run browser state isolation, hostile-page safety, a managed endpoint, or consumer application acceptance; those require separate evidence.

Final release verification — 2026-10-13, 17:14–17:16 UTC

Repeated the independent client trial against the corrected immutable release at http://127.0.0.1:18083, using fresh client output directories:

python3 client/rapp_playwright.py --url http://127.0.0.1:18083 preflight
python3 client/rapp_playwright.py --url http://127.0.0.1:18083 trial --out .local/independent-final-01
python3 client/rapp_playwright.py --url http://127.0.0.1:18083 run --spec .local/independent-final-01/failure-spec.json --out .local/independent-final-ui-failure-01

The release recorded by preflight and both receipts is sha256:8d6fd5a8172cf906bb503642ed620761945c5138b86f6396c36f65cbe6def441. Execution location is workstation-release-check; service 0.1.0, Playwright 1.64.0 and Chromium 156.0.8078.4 remain unchanged. Preflight lists no allowed external origins, and this repeat used only the provider fixture. No external target, redirect diagnosis or target-unreachable probe was attempted against this fixture-only container.

Run 35124424-950a-4339-adea-45525b470cab passed all 14 steps, from 2026-10-13T17:14:50.055Z through 17:15:01.861Z, and the client exited 0. Independent PNG header/hash checks again confirmed four screenshots: two at 1280×800 and two at 390×844. Their hashes match the initial successful trial. The run-token rejection probe again returned HTTP 404 / not_found. The new output directory is 0700 and its private handle is 0600.

Run 75c6b50e-94a1-467f-98fc-7e8937f4362e deliberately failed the count assertion at desktop step index 1 with ui_assertion_failed, client exit 2, and the prior 1280×800 screenshot preserved with a verified hash. Preflight against unused service port 18089 again produced service_unreachable and exit 3. Retrieving the failed run with --url http://127.0.0.1:18083 status --handle succeeded with exit 0, now explicitly documented in the consumer contract. AGENTS.md and README.md now describe implemented verification commands and distinguish local evidence from managed availability.

Recovery usability detail: --url must also be repeated on status for a nondefault endpoint. The first status invocation omitted it, queried the default 18081 service and returned HTTP 404 / exit 3; repeating with the correct 18083 override returned the expected failed-run receipt / exit 0. The private handle does not automatically select the originating service URL.

Retained final evidence:

These are local final-release consumer checks. Read-only root configuration, worker temporary-directory isolation and crash cleanup were reported by the provider; this consumer trial does not independently inspect or establish those properties. Managed platform admission remains pending, and no Railiance deployment or content-explorer acceptance is claimed.