repixelizer/docs/eve-surface-lowering.md
2026-06-04 01:57:19 +01:00

83 lines
3.4 KiB
Markdown

# Repixelizer Eve Surface Lowering
Repixelizer now emits a read-only `gamecult.eve.surface.v1` projection for its
front page, single-page app workflow, runtime config, auth projection, queue
summary, and command intents.
## Authority Map
- Owner: `repixelizer.gui` still owns hosted config, route policy, queue state,
job ownership, uploads, solver execution, and browser assets.
- Inputs: `HostedDemoConfig`, `AccessController.public_payload()`, and
`GuiJobManager.get_queue_summary()`.
- Output: `repixelizer.eve_surface.build_repixelizer_eve_surface()` emits the
retained Eve surface tree, style tokens, command descriptors, and renderer
comparison notes.
- Derived state: `/eve/surface`, `repixelize eve-surface`, and
`docs/fixtures/repixelizer.eve-surface.json` are projections. They do not
decide queue truth.
- Forbidden writers: Eve renderers, Odin, Periwinkle, and fixtures must route
commands back through `/api/jobs`, `/api/jobs/{job_id}`, or `/app/`; they do
not mutate Repixelizer jobs directly.
- Shared paths: browser GUI, CLI fixture export, hosted `/eve/surface`, and
provider advertisement all name the same surface and route authority.
- Cut line: no parallel status-card service, no renderer-owned queue summary,
and no fake native canvas authority until Eve can lower upload and image-edit
controls coherently.
## Published Surface
Generate the deterministic fixture:
```powershell
repixelize eve-surface --out docs/fixtures/repixelizer.eve-surface.json --updated-at 2026-06-04T00:00:00Z --public-base-url https://repixelizer.gamecult.org
```
The hosted GUI serves the live projection at:
```text
/eve/surface
```
The provider advertisement now marks `repixelizer.operator.surface` as
`available` with an HTTP JSON lowering at `/eve/surface`.
## Retro Style Contract
The Eve style profile is `repixelizer.retro.pixel`. The tokens intentionally
mirror the browser CSS instead of flattening the app into generic dashboard
chrome:
- title font: `Press Start 2P`
- body/mono font: `VT323`
- dark shell gradient and blue panel surfaces
- warm yellow/orange accent tokens
- chunky pixel borders, lower border weight, corner accents, scanline overlay,
dashed inner frame, and pixelated image sampling
The browser lowering remains the visual oracle for this pass because it already
implements the full upload, solver inspection, comparison canvas, editor, and
retro CSS.
## Periwinkle Comparison
Periwinkle's Android Kotlin lowerer currently has useful structural support:
it connects to the Eve dashboard broker, traverses `surface.root`, renders
pane/card/text hierarchies, supports basic metric progress bars, and attaches
some command handlers.
The current gap is style and control parity. `MainActivity.kt` still hard-codes
`toneColor`, `textColorFor`, and `textSizeFor`; it does not consume
`surface.styles.tokens`, does not load Repixelizer's pixel fonts, does not
render image assets from the surface tree, and does not lower the upload picker,
comparison canvas, pan/zoom inspection, eyedropper, or paint controls.
Minimum Periwinkle parity work:
- map provider style tokens before applying fallback tone/text/font rules
- package or cache `Press Start 2P` and `VT323`
- render `assetUri` / `assetRef` as pixelated `ImageView` content
- lower Repixelizer command controls to Android document picker and job route
calls
- add native canvas controls only after ownership remains routed through the
existing Repixelizer job and editor command paths