Thing/docs/renderer-parity.md
2026-08-25 03:57:20 +02:00

5.7 KiB

Eve Renderer Parity

Parity is currently uneven by design. The shared surface contract is forming, but the browser reference is the first renderer that can be used as a practical comparison oracle.

See runtime-app-parity-roadmap.md for the generic Eve app plan across web, Flutter, Fensalir Direct2D, iOS/UIKit, and the Android Flutter device body. Repixelizer is the first style-parity target.

Pixel parity is not byte-identical screenshot parity. Text rasterization, antialiasing, GPU backends, and device scale will differ. The target is recognizable CultUI fidelity: the same partitions, fonts, colors, panel treatments, spacing, image sampling intent, and control anatomy lower cleanly enough that Repixelizer remains itself across runtimes.

The shared fixture/report path lives in parity-testing-harness.md. That harness is the current evidence surface for semantic parity and runtime capture gaps. The nested CultUI surface feature is tracked as fixture embedded-surface, loaded from web/fixtures/cultui-embedded-surface.json, and must be understood by every renderer that claims gamecult.eve.surface.v1 GUI parity. Runtime discovery for the feature is in tools/parity/parity-manifest.json: active GUI runtimes advertise supportedFeatures: ["embeddedDocuments"] and require the embedded-surface fixture. Native Android/Kotlin makes a narrower active claim: it preserves and displays embedded slot identity in its dashboard renderer while Android Flutter remains the responsive screenshot target. Rust proves the same contract at the CultMesh typed document sync layer.

Current State

Renderer Status Proof Gap
Web reference Active reference/debug renderer web/ renders local provider advertisements and fixture surfaces through the provider picker; compiles indentation CultUI; lowers partitions, field rows, slider anatomy, and surface.slot; Chrome headless capture emits phone/tablet/desktop PNGs Needs live Odin/CultMesh provider feed and command round-trip tests
Windows / Flutter Active owner runtime EveFlutter consumes supplied gamecult.eve.surface.v1 documents and emits phone/tablet/desktop golden PNGs through its owner capture runner Needs native window capture and tighter text/style normalization
Linux / Flutter Active shared graphical smoke target Nightwing runs the Flutter parity goldens, including embedded surface slots, over SSH and returns phone/tablet/desktop PNGs Needs native window capture and runner health checks
Android / Flutter Active shared graphical smoke target The same Flutter parity app is built as an APK, installed on Periwinkle, and captured at phone/tablet/desktop plus native physical-panel orientations Needs live provider picker and command transport beyond fixture assets
iOS / UIKit Active native Gjallar runtime and screenshot target EveCanvas reads gjallar.overview through Hermodr, lowers its weighted-bisect aggregate with UIKit, and emits a device PNG from /var/mobile/Library/EveCanvas/latest-screenshot.png; fixture capture remains available as an offline parity oracle Live aggregate is only as populated as Odin's readable provider surface-state records; command receipts and plugin projection acceptance remain
Android / Kotlin device edge Active lightweight renderer Native APK consumes CultMesh dashboard/sensor documents and preserves surface.slot / embeddedDocuments identity in the dashboard renderer Not a plugin projection acceptance target; Android Flutter owns full graphical/plugin parity unless EveAndroid grows adapters
Rust / CultMesh Document-sync contract runtime CultLib replicates the gamecult.eve.surface.v1 embedded slot contract through typed document sync Not a pixel renderer
Fensalir Direct2D External adapter spike, not active parity runtime Fensalir has src/Aquarium.EveSurface/EveSurfaceRuntime.cs, reads an Eve broker, lowers into AquariumUiDocument / DirectWriteOverlay, and now has a runtime-pack gamecult.eve.surface.v1 fixture in Eve Needs runtime-owned command smoke, DirectWrite/Direct2D frame capture, and a clear reason to stay separate from Flutter for desktop UI

Spawned Surfaces

The browser reference runner now exposes local advertisements through the provider picker:

  • Repixelizer: loads web/fixtures/repixelizer.provider-advertisement.json and web/fixtures/repixelizer.eve-surface.json.
  • Aetheria: consumes the provider-owned advertisement and world surface from Aetheria/conformance/eve.
  • Sai VN Surface: loads web/fixtures/sai-vn.provider-advertisement.json and web/fixtures/sai-vn-surface.json.
  • Fensalir Direct2D: loads web/fixtures/fensalir-direct2d-surface.json, a recorded gamecult.eve.surface.v1 runtime-adapter surface for the Direct2D lowering path.
  • Huginn .cc: compiles web/fixtures/huginn-cc-surface.eve.
  • Reactive DSL: compiles web/fixtures/reactive-composition.eve.
  • CultUI Inspector: compiles web/fixtures/cultui-slider-inspector.eve and proves partition/field-row/slider-anatomy lowering in the web reference.

The local fallback provider list now lives in web/local-provider-catalog.json instead of renderer code. That catalog is fixture discovery data for the browser oracle; live discovery still belongs to CultMesh/Odin advertisements. The runtime app target is the same picker fed by live gamecult.eve.provider_advertisement.v1 documents through CultMesh/Odin; the browser reference no longer opens live providers by dialing Mimir's deck broker directly.

Start it with:

powershell -ExecutionPolicy Bypass -File .\scripts\start-browser-reference.ps1

Then open:

http://127.0.0.1:8798/