From 8fee12fc6b6752acb87158f4149cf7aaeff9bd3a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 01:18:19 +0100 Subject: [PATCH] Add Fensalir runtime surface fixture --- docs/eve-migration-roadmap.md | 7 + docs/parity-testing-harness.md | 4 +- docs/renderer-parity.md | 8 +- tools/parity/parity-manifest.json | 36 +++- ...fensalir-direct2d-surface.conformance.json | 21 +++ web/fixtures/fensalir-direct2d-surface.json | 160 ++++++++++++++++++ web/local-provider-catalog.json | 4 +- 7 files changed, 228 insertions(+), 12 deletions(-) create mode 100644 web/fixtures/fensalir-direct2d-surface.conformance.json create mode 100644 web/fixtures/fensalir-direct2d-surface.json diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index a159532..6aaefc0 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -280,6 +280,13 @@ Exit criteria: Recently cut: +- Fensalir now has a recorded runtime-pack + `gamecult.eve.surface.v1` adapter fixture at + `web/fixtures/fensalir-direct2d-surface.json`. The browser local catalog uses + that contract-shaped surface instead of the older dashboard-state sketch, and + the parity harness validates embedded-slot preservation, command descriptors, + runtime authority witnesses, and style tokens. Direct2D capture and + runtime-owned command smoke remain the activation blockers. - UIKit and Kotlin device-edge runtimes now declare unsupported Sai/Norn/TeX plugin projection explicitly. They remain generic embedded-document and device-edge proofs; plugin projection authority belongs to EveFlutter, diff --git a/docs/parity-testing-harness.md b/docs/parity-testing-harness.md index d82f507..7283c9a 100644 --- a/docs/parity-testing-harness.md +++ b/docs/parity-testing-harness.md @@ -235,7 +235,9 @@ The harness tracks every target runtime: Required nested-surface evidence: `cargo test -p cultnet-rs rust_preserves_cultui_embedded_surface_slots_through_typed_document_sync` in CultLib. -- Fensalir Direct2D: specialized native target, adapter/capture still missing. +- Fensalir Direct2D: specialized native target with a runtime-pack + `gamecult.eve.surface.v1` adapter fixture; runtime-owned command smoke and + Direct2D capture are still missing. Pending runtimes are allowed. Silent fake parity is not. diff --git a/docs/renderer-parity.md b/docs/renderer-parity.md index 0f7dfad..19af8e6 100644 --- a/docs/renderer-parity.md +++ b/docs/renderer-parity.md @@ -38,7 +38,7 @@ proves the same contract at the CultMesh typed document sync layer. | iOS / UIKit | Active native screenshot target | SSH capture stages selected fixture JSON, EveCanvas renders it, and emits a PNG from `/var/mobile/Library/EveCanvas/latest-screenshot.png`; `embedded-surface` is part of the required fixture matrix | Plugin projection is explicitly unsupported until EveIOS owns adapters; still needs provider picker and command transport | | Android / Kotlin device edge | Active lightweight renderer | Native APK consumes CultMesh dashboard/sensor documents and preserves `surface.slot` / `embeddedDocuments` identity in the dashboard renderer | Plugin projection is explicitly unsupported; full graphical parity belongs to Flutter 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, and lowers into `AquariumUiDocument` / `DirectWriteOverlay` | Needs recorded `gamecult.eve.surface.v1` fixture replay, command emission through the advertised boundary, DirectWrite/Direct2D token lowering, frame capture, and a clear reason to stay separate from Flutter for desktop UI | +| 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 @@ -51,8 +51,10 @@ provider picker: and `web/fixtures/aetheria-world-surface.json`. - `Sai VN Surface`: loads `web/fixtures/sai-vn.provider-advertisement.json` and `web/fixtures/sai-vn-surface.json`. -- `Fensalir Direct2D`: loads `web/fixtures/fensalir-client-surface.json`, a - recorded surface describing the Direct2D client lowering path. +- `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` diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index ebe9a61..da96769 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -201,6 +201,30 @@ "commandReferencesDeclared": true } }, + { + "id": "fensalir-direct2d", + "title": "Fensalir Direct2D Adapter", + "pack": "runtime", + "ownerRepo": "Fensalir", + "surface": { + "transport": "local-json", + "path": "web/fixtures/fensalir-direct2d-surface.json" + }, + "metadataPath": "web/fixtures/fensalir-direct2d-surface.conformance.json", + "expect": { + "providerId": "fensalir.direct2d", + "componentKinds": ["surface", "card", "text", "metric", "partition", "surface.slot", "control.button"], + "styleTokens": ["colorBackground", "colorPanel", "colorText", "colorMuted", "colorAccent"], + "bindings": ["fensalir.overlay.phase"], + "embeddedDocuments": ["fensalir.adapter.detail"], + "commandDescriptors": ["fensalir.overlay.commands"], + "commandDescriptorSchema": "gamecult.eve.command.v1", + "commandReferencesDeclared": true, + "authorityStates": ["fresh"], + "authorityOwners": ["runtime"], + "witnessRefs": 1 + } + }, { "id": "authority-staleness", "title": "Authority And Staleness Witness", @@ -910,16 +934,16 @@ "splitTarget": "Fensalir or EveDirect2D if it earns a separate body", "graduationTrigger": "Do not graduate until the Eve-to-AquariumUiDocument adapter and Direct2D frame capture exist.", "adapterSpike": "external", - "demotionReason": "Fensalir has an external Aquarium.EveSurface adapter spike, but Eve has no Direct2D frame capture and the local fensalir fixture is still legacy dashboard-state instead of gamecult.eve.surface.v1 conformance input.", + "demotionReason": "Fensalir has an external Aquarium.EveSurface adapter spike and a recorded gamecult.eve.surface.v1 adapter fixture, but Eve still has no Direct2D frame capture or runtime-owned command smoke.", "activationCriteria": [ "Fensalir runs recorded gamecult.eve.surface.v1 fixtures without provider-specific renderer knowledge.", "Fensalir emits gamecult.eve.command.v1 intents through the advertised provider command boundary.", "Direct2D capture artifacts are produced and attached to the parity report." ], - "requiredFixtures": ["embedded-surface"], - "pluginFixtures": ["sai-vn"], - "supportedFeatures": [], - "expectedPaths": ["web/fixtures/fensalir-client-surface.json"], + "requiredFixtures": ["fensalir-direct2d"], + "pluginFixtures": [], + "supportedFeatures": ["embeddedDocuments"], + "expectedPaths": ["web/fixtures/fensalir-direct2d-surface.json"], "expectedExternalPaths": [ "E:\\Projects\\Fensalir\\src\\Aquarium.EveSurface\\EveSurfaceRuntime.cs", "E:\\Projects\\Fensalir\\docs\\eve-direct2d-client-surface.md" @@ -938,7 +962,7 @@ ], "capture": { "status": "missing", - "note": "External Fensalir adapter spike exists; Eve still needs recorded surface replay and Direct2D frame capture before this runtime can become active." + "note": "External Fensalir adapter spike and recorded surface fixture exist; Eve still needs runtime-owned command smoke and Direct2D frame capture before this runtime can become active." } } ] diff --git a/web/fixtures/fensalir-direct2d-surface.conformance.json b/web/fixtures/fensalir-direct2d-surface.conformance.json new file mode 100644 index 0000000..8301974 --- /dev/null +++ b/web/fixtures/fensalir-direct2d-surface.conformance.json @@ -0,0 +1,21 @@ +{ + "schema": "gamecult.eve.conformance_fixture.v1", + "fixtureId": "fensalir-direct2d", + "title": "Fensalir Direct2D Adapter", + "pack": "runtime", + "ownerRepo": "Fensalir", + "surface": { + "transport": "local-json", + "path": "web/fixtures/fensalir-direct2d-surface.json" + }, + "purpose": "Proves Fensalir has a recorded gamecult.eve.surface.v1 runtime-adapter fixture before Direct2D capture becomes active evidence.", + "exitCriteria": "Move to Fensalir when AquariumUiDocument lowering, command emission, embedded-slot preservation, and Direct2D frame capture are runtime-owned.", + "asserts": [ + "runtime adapter surface contract", + "AquariumUiDocument lowering target", + "command descriptor and command references", + "embedded document slot preservation", + "Direct2D style tokens" + ], + "splitTarget": "Fensalir" +} diff --git a/web/fixtures/fensalir-direct2d-surface.json b/web/fixtures/fensalir-direct2d-surface.json new file mode 100644 index 0000000..c889497 --- /dev/null +++ b/web/fixtures/fensalir-direct2d-surface.json @@ -0,0 +1,160 @@ +{ + "type": "surface-state", + "schema": "gamecult.eve.surface.v1", + "providerId": "fensalir.direct2d", + "providerKind": "runtime.adapter", + "title": "Fensalir Direct2D Adapter Surface", + "version": 1, + "updatedAtUtc": "2026-07-09T00:00:00Z", + "surface": { + "id": "fensalir.direct2d.adapter", + "root": { + "id": "fensalir.direct2d.root", + "kind": "surface", + "props": { + "runtimeTarget": "Fensalir", + "loweringTarget": "AquariumUiDocument" + }, + "children": [ + { + "id": "fensalir.direct2d.summary", + "kind": "card", + "props": { + "title": "Direct2D Runtime Boundary", + "authorityOwner": "runtime", + "authorityState": "fresh", + "witnessRef": "E:\\Projects\\Fensalir\\src\\Aquarium.EveSurface\\EveSurfaceRuntime.cs" + }, + "children": [ + { + "id": "fensalir.direct2d.summary.text", + "kind": "text", + "props": { + "text": "Fensalir owns DirectWrite/Direct2D projection, focus, pointer dispatch, frame timing, and capture. Eve owns the contract this surface exercises." + }, + "children": [] + } + ] + }, + { + "id": "fensalir.direct2d.pipeline", + "kind": "partition", + "props": { + "direction": "horizontal" + }, + "children": [ + { + "id": "fensalir.direct2d.aquarium", + "kind": "card", + "props": { + "title": "AquariumUiDocument" + }, + "children": [ + { + "id": "fensalir.direct2d.aquarium.metric", + "kind": "metric", + "props": { + "label": "Overlay Phase", + "value": "D3D12 scene -> D2D overlay", + "bind": "fensalir.overlay.phase" + }, + "children": [] + }, + { + "id": "fensalir.direct2d.aquarium.detail", + "kind": "text", + "props": { + "text": "The adapter lowers Eve components into Aquarium UI panels without importing provider game state." + }, + "children": [] + } + ] + }, + { + "id": "fensalir.direct2d.commands", + "kind": "card", + "props": { + "title": "Command Boundary" + }, + "children": [ + { + "id": "fensalir.direct2d.command.focus", + "kind": "control.button", + "props": { + "label": "Focus Adapter Node", + "command": "fensalir.overlay.commands", + "commandId": "fensalir.overlay.focus", + "action": { + "schema": "gamecult.eve.command.v1", + "command": "fensalir.overlay.commands", + "operation": "focus_node", + "nodeId": "aquarium-ui" + } + }, + "children": [] + }, + { + "id": "fensalir.direct2d.command.capture", + "kind": "control.button", + "props": { + "label": "Request Frame Capture", + "command": "fensalir.overlay.commands", + "commandId": "fensalir.overlay.capture", + "action": { + "schema": "gamecult.eve.command.v1", + "command": "fensalir.overlay.commands", + "operation": "capture_frame", + "target": "direct2d-overlay" + } + }, + "children": [] + } + ] + } + ] + }, + { + "id": "fensalir.direct2d.embedded-slot", + "kind": "surface.slot", + "props": { + "slotId": "fensalir.adapter.detail", + "documentId": "cultmesh://fensalir/eve/adapter/detail", + "schemaId": "gamecult.eve.surface.v1", + "presentationKind": "runtime.detail" + }, + "children": [], + "embeddedDocuments": [ + { + "slotId": "fensalir.adapter.detail", + "documentId": "cultmesh://fensalir/eve/adapter/detail", + "schemaId": "gamecult.eve.surface.v1", + "presentationKind": "runtime.detail", + "routeHint": { + "kind": "CultMesh", + "description": "Fensalir runtime detail surface" + } + } + ] + } + ] + }, + "styles": { + "tokens": { + "colorBackground": "#090D10", + "colorPanel": "#182024", + "colorText": "#EDF7F2", + "colorMuted": "#9FB6B1", + "colorAccent": "#67D3B0" + } + } + }, + "commands": [ + { + "command": "fensalir.overlay.commands", + "schema": "gamecult.eve.command.v1", + "transport": "cultmesh", + "authority": "FensalirOverlayCommandBoundary", + "result": "accepted-denied-or-replayed" + } + ] +} diff --git a/web/local-provider-catalog.json b/web/local-provider-catalog.json index f0a5a9e..78c087e 100644 --- a/web/local-provider-catalog.json +++ b/web/local-provider-catalog.json @@ -50,8 +50,8 @@ "surfaces": [ { "transport": "local-json", - "surfaceId": "fensalir.direct2d.fixture", - "url": "./fixtures/fensalir-client-surface.json" + "surfaceId": "fensalir.direct2d.adapter", + "url": "./fixtures/fensalir-direct2d-surface.json" } ] },