Thing/docs/parity-testing-harness.md
2026-06-05 20:13:38 +01:00

110 lines
4 KiB
Markdown

# Eve Parity Testing Harness
The parity harness is the shared evidence path for Eve runtimes. It does not
try to prove byte-identical pixels. It proves that every runtime is aiming at
the same provider-owned CultUI surface: same fixture, same retained tree, same
style-token expectations, same control anatomy, and explicit capture gaps.
## Authority
- `tools/parity/parity-manifest.json` owns the fixture matrix, runtime list, and
expectations.
- `tools/parity/run-parity.mjs` owns semantic fixture checks and report
generation.
- Runtime capture adapters own screenshots or frame capture for their platform.
- `artifacts/parity/latest.md` and `artifacts/parity/latest.json` are reports,
not source truth.
The manifest is the cut line. If a fixture or runtime is not in the manifest,
it is not part of the parity claim.
## Run
Semantic checks:
```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\run-parity-harness.ps1
```
Hard screenshot smoke:
```powershell
powershell -ExecutionPolicy Bypass -File .\scripts\run-parity-smoke.ps1
```
The smoke expands every resizable renderer across the manifest's responsive
viewport matrix:
- `phone`: 390 x 844
- `tablet`: 768 x 1024
- `desktop`: 1280 x 720
Device runtimes also capture native physical panel cases when the platform
adapter can control orientation without overriding size. Android currently
emits:
- `native-portrait`: Periwinkle at physical portrait resolution
- `native-landscape`: Periwinkle at physical landscape resolution
The semantic runner writes:
- `artifacts/parity/latest.md`
- `artifacts/parity/latest.json`
- `artifacts/parity/<timestamp>/parity-report.md`
- `artifacts/parity/<timestamp>/parity-report.json`
The smoke runner writes:
- `artifacts/parity-smoke/<timestamp>/parity-smoke.md`
- `artifacts/parity-smoke/<timestamp>/parity-smoke.json`
- one PNG per target that has a real capture body.
## Current Checks
The first pass is semantic and fixture-driven:
- compile local CultUI `.eve` fixtures;
- load local JSON surface fixtures;
- check provider id;
- check required component kinds;
- check minimum component counts where useful;
- check required style tokens;
- check required bindings;
- check retained slider skins and control parts.
- record the responsive viewport matrix used by screenshot smoke.
This already catches the most embarrassing class of parity lie: a runtime or
fixture claiming to render CultUI while the retained tree no longer contains
the partitions, bindings, tokens, or slider anatomy the renderer is supposed to
lower.
## Runtime Status
The harness tracks every target runtime:
- Web reference: active semantic and screenshot target through Chrome headless
using the provider query parameter.
- Web responsive layout: Chrome headless emits phone, tablet, and desktop PNGs.
- iOS / UIKit: screenshot target through SSH and EveCanvas'
`/var/mobile/Library/EveCanvas/capture-request` service. Current iOS capture
is fixed-device until a simulator or device-resize adapter exists.
- Android / Kotlin: screenshot target through `adb install`, activity launch,
optional `adb shell wm size`, orientation control, and `adb exec-out
screencap`; the script restores device size and rotation after each viewport.
- Windows / Flutter: screenshot target through the Flutter parity golden smoke,
with phone, tablet, and desktop goldens.
- Linux / Flutter: requires a Linux runner. A Windows host must fail this
target instead of pretending to be Linux.
- Fensalir Direct2D: specialized native target, adapter/capture still missing.
Pending runtimes are allowed. Silent fake parity is not.
## Next Cuts
1. Move the Flutter parity renderer from hardcoded inspector anatomy to the
compiled `gamecult.eve.surface.v1` fixture.
2. Wire iOS and Android capture to select a manifest fixture before capture,
instead of only launching the current app body.
3. Add a Linux runner or WSL/Linux desktop capture body for Flutter.
4. Add Direct2D frame capture once the Eve-to-`AquariumUiDocument` adapter
exists.