From 4ab9fa5185424eeb8f23143d5946f076b01cff9a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Fri, 10 Jul 2026 10:20:52 +0100 Subject: [PATCH] Consume Aetheria provider evidence from owner pack --- docs/eve-migration-roadmap.md | 31 ++- docs/parity-testing-harness.md | 13 +- docs/renderer-parity.md | 4 +- .../eve-tui/eve-runtime-capability.json | 6 +- .../eve-tui/test/eve-tui-shell.test.mjs | 4 +- ...un-aetheria-conformance-consumer-smoke.ps1 | 6 - .../run-aetheria-provider-handoff-smoke.ps1 | 125 ---------- scripts/run-conformance-consumer-smoke.ps1 | 2 - scripts/run-evetui-capture-contract-smoke.ps1 | 2 +- scripts/run-evetui-capture-smoke.ps1 | 4 +- scripts/run-parity-harness.ps1 | 1 - ...ntime-owner-conformance-consumer-smoke.ps1 | 6 +- tools/conformance/eveconformance-handoff.json | 1 - tools/evetui/evetui-capture-artifact.test.mjs | 6 +- tools/evetui/evetui-capture-contract.test.mjs | 6 +- tools/parity/parity-manifest.json | 37 ++- tools/parity/run-parity.mjs | 57 ++++- web/eve-runtime-capability.json | 1 - web/fixtures/aetheria-provider-handoff.json | 69 ------ web/fixtures/aetheria-world-scenario.json | 87 ------- .../aetheria-world-surface.conformance.json | 26 -- web/fixtures/aetheria-world-surface.json | 230 ------------------ .../aetheria.provider-advertisement.json | 201 --------------- ...a.unity-playable-world-asset-manifest.json | 21 -- web/local-provider-catalog.json | 13 - web/provider-advertisements.test.mjs | 28 --- 26 files changed, 103 insertions(+), 884 deletions(-) delete mode 100644 scripts/run-aetheria-provider-handoff-smoke.ps1 delete mode 100644 web/fixtures/aetheria-provider-handoff.json delete mode 100644 web/fixtures/aetheria-world-scenario.json delete mode 100644 web/fixtures/aetheria-world-surface.conformance.json delete mode 100644 web/fixtures/aetheria-world-surface.json delete mode 100644 web/fixtures/aetheria.provider-advertisement.json delete mode 100644 web/fixtures/aetheria.unity-playable-world-asset-manifest.json diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index 00b38b7..8f92113 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -286,14 +286,18 @@ Exit criteria: ## Active Work Queue -1. Move Aetheria product fixtures and scenarios behind an owner-repo - conformance pack while retaining only the minimal generic world oracle in - Eve. -2. Split `EveConformance` when owner runtimes can consume its schema catalog, +1. Split `EveConformance` when owner runtimes can consume its schema catalog, packs, witness attachments, and runner without Eve source-layout knowledge. Recently cut: +- Aetheria now owns its Eve provider conformance pack: advertisement, daemon + game/editor surfaces, fixture metadata, command replay scenario, and Unity + asset manifest. Eve's fixture/provider ledger resolves that pack through an + owner `sourceRoot`; browser reference keeps only the generic world-smoke + oracle. The duplicated Aetheria fixtures, local browser entry, provider + handoff, and handoff smoke are deleted from Eve. + - `GameCult/EveFlutter` now owns the Flutter app, Windows/Linux/Android/iOS platform glue, provider picker, command-intent lowering, tests, golden captures, and capture runners. Its owner tests use generic provider documents @@ -772,7 +776,7 @@ Recently cut: remains a split blocker for EveUnity. - Unity UI Toolkit now also has schema-backed semantic projection evidence. `tools/eveunity/eveunity-uitoolkit-capture-artifact.mjs` lowers - `web/fixtures/aetheria-world-surface.json` into + Aetheria's owner-pack world surface into `gamecult.eve.unity_uitoolkit_projection.v1`, writes `artifacts/eveunity-uitoolkit-capture/latest/unity-uitoolkit-projection.json`, and exports it as `runtime.captureArtifacts[]`. The builder also proves Sai, @@ -782,7 +786,7 @@ Recently cut: artifact. - Unity scene capture now has the same semantic artifact boundary as Electron without pretending it is a rendered Unity frame. `tools/eveunity/eveunity-scene-capture-artifact.mjs` - lowers `web/fixtures/aetheria-world-surface.json` into + lowers Aetheria's owner-pack world surface into `gamecult.eve.unity_scene_projection.v1`, writes `artifacts/eveunity-scene-capture/latest/unity-scene-projection.json`, and exports it as `runtime.captureArtifacts[]`. The builder also proves Sai, @@ -899,7 +903,7 @@ Recently cut: `json-grid` artifact satisfies its contract but still needs EveTui ownership. - EveTui capture lifecycle now attaches a typed terminal-grid artifact instead of stopping at a request contract. `tools/evetui/evetui-capture-artifact.mjs` - lowers `web/fixtures/aetheria-world-surface.json` through `EveTuiShell`, + lowers Aetheria's owner-pack world surface through `EveTuiShell`, writes `artifacts/evetui-capture/latest/tui-grid.json`, and stores the paired capture request beside it. Parity validates the artifact schema, provider, surface, and linked request path, then exports it as `runtime.captureArtifacts[]`. @@ -1033,16 +1037,9 @@ Recently cut: a duplicate Norn manifest or handoff document. The plugin currently owns `describe`, `validate`, `project`, and solver-backed `measure`; runtime lowering and provider command acceptance remain outside Norn. -- Aetheria now has a provider handoff manifest at - `web/fixtures/aetheria-provider-handoff.json` and a verifier at - `scripts/run-aetheria-provider-handoff-smoke.ps1`. The handoff names the - advertisement, interactive world fixture, provider scenario, contract inputs, - forbidden imports, and external proofs that must move to Aetheria. The - conformance export carries the handoff path and - `providerHandoffMoveCoverage[]`, and the Aetheria consumer smoke asserts - provider advertisement, interactive world surface, conformance fixture, and - scenario move records so provider ownership does not depend on Eve's source - layout or parity manifest. +- Aetheria crossed its provider handoff boundary. Its owner pack under + `Aetheria/conformance/eve` is validated in place and consumed directly by + Eve; no provider handoff document remains in the kernel. - EveUnity now has a machine-readable split handoff at `packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json` and a verifier at `scripts/run-eveunity-split-handoff-smoke.ps1`. The handoff diff --git a/docs/parity-testing-harness.md b/docs/parity-testing-harness.md index a22d7f6..2dfdbf0 100644 --- a/docs/parity-testing-harness.md +++ b/docs/parity-testing-harness.md @@ -317,17 +317,16 @@ conformance smoke asserts the attached owner witnesses, runtime boundary claims, and exported sidecar fields from the conformance export. -Aetheria provider handoff smoke: +Aetheria provider-pack smoke: ```powershell -powershell -ExecutionPolicy Bypass -File .\scripts\run-aetheria-provider-handoff-smoke.ps1 +node E:\Projects\Aetheria\scripts\verify-eve-conformance-pack.mjs ``` -That script validates `web/fixtures/aetheria-provider-handoff.json` against the -provider advertisement and scenario. The handoff names the advertisement, -interactive world surface fixture, provider scenario, Eve contracts, forbidden -imports, and external proofs that must become Aetheria-owned before the -provider pack leaves Eve incubation. +That owner script validates Aetheria's advertisement, interactive world +surface, fixture metadata, provider scenario, and asset manifest. Eve consumes +those documents through the provider entry's `sourceRoot`; it does not keep a +second product fixture corpus. EveFlutter consumer smoke: diff --git a/docs/renderer-parity.md b/docs/renderer-parity.md index 2d75f12..df7440c 100644 --- a/docs/renderer-parity.md +++ b/docs/renderer-parity.md @@ -47,8 +47,8 @@ provider picker: - `Repixelizer`: loads `web/fixtures/repixelizer.provider-advertisement.json` and `web/fixtures/repixelizer.eve-surface.json`. -- `Aetheria`: loads `web/fixtures/aetheria.provider-advertisement.json` - and `web/fixtures/aetheria-world-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 diff --git a/runtimes/incubating/eve-tui/eve-runtime-capability.json b/runtimes/incubating/eve-tui/eve-runtime-capability.json index 025b8f8..007f12b 100644 --- a/runtimes/incubating/eve-tui/eve-runtime-capability.json +++ b/runtimes/incubating/eve-tui/eve-runtime-capability.json @@ -65,7 +65,7 @@ "runtimes/incubating/eve-tui/src/eve-tui-shell.mjs", "runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs", "web/fixtures/sai-vn-surface.json", - "web/fixtures/aetheria.provider-advertisement.json", + "../Aetheria/conformance/eve/aetheria.provider-advertisement.json", "web/fixtures/eve-world-smoke.provider-advertisement.json" ] } @@ -142,7 +142,7 @@ "targetId": "tui", "requestSchema": "gamecult.eve.runtime_capture_request.v1", "requestBuilder": "tools/evetui/evetui-capture-contract.mjs", - "advertisementPath": "web/fixtures/aetheria.provider-advertisement.json", + "advertisementPath": "../Aetheria/conformance/eve/aetheria.provider-advertisement.json", "captureKind": "terminal-cell-grid", "artifactKind": "json-grid", "artifactPattern": "artifacts/evetui-capture/{stamp}/tui-grid.json", @@ -187,7 +187,7 @@ "path": "artifacts/evetui-capture/latest/tui-grid.json", "providerId": "aetheria", "surfaceId": "aetheria.daemon.game", - "sourceSurfacePath": "web/fixtures/aetheria-world-surface.json", + "sourceSurfacePath": "../Aetheria/conformance/eve/aetheria-world-surface.json", "requestPath": "artifacts/evetui-capture/latest/capture-request.json" } ] diff --git a/runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs b/runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs index 2c63c63..f16d72e 100644 --- a/runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs +++ b/runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs @@ -151,7 +151,7 @@ function advertisement() { { surfaceId: "aetheria.daemon.game", transport: "local-json", - url: "web/fixtures/aetheria-world-surface.json", + url: "conformance/eve/aetheria-world-surface.json", worldInteraction: { projectionKind: "provider-authored-world-surface", commandBoundary: "aetheria.daemon.commands", @@ -162,7 +162,7 @@ function advertisement() { { surfaceId: "aetheria.daemon.editor", transport: "local-json", - url: "web/fixtures/aetheria-world-surface.json", + url: "conformance/eve/aetheria-world-surface.json", worldInteraction: { projectionKind: "provider-authored-world-editor-surface", commandBoundary: "aetheria.daemon.commands", diff --git a/scripts/run-aetheria-conformance-consumer-smoke.ps1 b/scripts/run-aetheria-conformance-consumer-smoke.ps1 index 7f80703..00e9afc 100644 --- a/scripts/run-aetheria-conformance-consumer-smoke.ps1 +++ b/scripts/run-aetheria-conformance-consumer-smoke.ps1 @@ -94,12 +94,6 @@ try { --expect-provider-receipt-state aetheria:accepted ` --expect-provider-receipt-state aetheria:pending ` --expect-provider-receipt-state aetheria:reconciled ` - --expect-provider-handoff aetheria ` - --expect-provider-handoff-move aetheria:provider-advertisement:current:exists:aetheria.provider-advertisement.json ` - --expect-provider-handoff-move aetheria:interactive-world-surface:current:exists:aetheria-world-surface.json ` - --expect-provider-handoff-move aetheria:interactive-world-surface:current:exists:aetheria-world-surface.conformance.json ` - --expect-provider-handoff-move aetheria:unity-playable-world-asset-manifest:current:exists:aetheria.unity-playable-world-asset-manifest.json ` - --expect-provider-handoff-move aetheria:provider-scenario:current:exists:aetheria-world-scenario.json ` --expect-provider-handoff-move aetheria:provider-scenario:current:exists:run-aetheria-conformance-consumer-smoke.ps1 if ($LASTEXITCODE -ne 0) { throw "Aetheria conformance consumer smoke failed with exit code $LASTEXITCODE" diff --git a/scripts/run-aetheria-provider-handoff-smoke.ps1 b/scripts/run-aetheria-provider-handoff-smoke.ps1 deleted file mode 100644 index c35da36..0000000 --- a/scripts/run-aetheria-provider-handoff-smoke.ps1 +++ /dev/null @@ -1,125 +0,0 @@ -param( - [string] $HandoffPath = "web\fixtures\aetheria-provider-handoff.json" -) - -$ErrorActionPreference = "Stop" - -$projectRoot = Split-Path -Parent $PSScriptRoot -$absoluteHandoffPath = if ([System.IO.Path]::IsPathRooted($HandoffPath)) { - $HandoffPath -} else { - Join-Path $projectRoot $HandoffPath -} - -if (-not (Test-Path -LiteralPath $absoluteHandoffPath)) { - throw "Aetheria provider handoff manifest not found: $absoluteHandoffPath" -} - -$handoff = Get-Content -LiteralPath $absoluteHandoffPath -Raw | ConvertFrom-Json - -if ($handoff.schema -ne "gamecult.eve.provider_handoff.v1") { - throw "Unexpected Aetheria provider handoff schema: $($handoff.schema)" -} -if ($handoff.providerId -ne "aetheria") { - throw "Unexpected Aetheria provider handoff provider: $($handoff.providerId)" -} -if ($handoff.ownerRepo -ne "Aetheria") { - throw "Unexpected Aetheria provider handoff owner: $($handoff.ownerRepo)" -} -if ($handoff.currentHostRepo -ne "Eve") { - throw "Unexpected Aetheria provider handoff host: $($handoff.currentHostRepo)" -} - -foreach ($pathProperty in @("advertisementPath", "scenarioPath")) { - $relativePath = $handoff.$pathProperty - if (-not $relativePath) { - throw "Aetheria provider handoff missing $pathProperty" - } - $absolutePath = Join-Path $projectRoot $relativePath - if (-not (Test-Path -LiteralPath $absolutePath)) { - throw "Aetheria provider handoff references missing $($pathProperty): $relativePath" - } -} - -$advertisement = Get-Content -LiteralPath (Join-Path $projectRoot $handoff.advertisementPath) -Raw | ConvertFrom-Json -$scenario = Get-Content -LiteralPath (Join-Path $projectRoot $handoff.scenarioPath) -Raw | ConvertFrom-Json - -if ($advertisement.providerId -ne $handoff.providerId) { - throw "Aetheria handoff provider does not match advertisement provider: $($advertisement.providerId)" -} -if ($scenario.providerId -ne $handoff.providerId) { - throw "Aetheria handoff provider does not match scenario provider: $($scenario.providerId)" -} -if ($scenario.ownerRepo -ne $handoff.ownerRepo) { - throw "Aetheria scenario owner does not match handoff owner: $($scenario.ownerRepo)" -} - -$worldSurfaces = @{} -foreach ($surface in @($advertisement.surfaces)) { - if ($surface.surfaceId -and $surface.worldInteraction) { - $worldSurfaces[$surface.surfaceId] = $surface - } -} -foreach ($requirement in @($scenario.requires.worldSurfaces)) { - if (-not $worldSurfaces.ContainsKey($requirement.surfaceId)) { - throw "Aetheria scenario requires world surface not advertised with worldInteraction: $($requirement.surfaceId)" - } - $advertisedSurface = $worldSurfaces[$requirement.surfaceId] - if ($advertisedSurface.surfaceKind -ne $requirement.surfaceKind) { - throw "Aetheria world surface kind mismatch for $($requirement.surfaceId): $($advertisedSurface.surfaceKind)" - } - foreach ($property in @("projectionKind", "commandBoundary", "receiptSchema")) { - if ($advertisedSurface.worldInteraction.$property -ne $requirement.$property) { - throw "Aetheria world surface $($requirement.surfaceId) $property mismatch: $($advertisedSurface.worldInteraction.$property)" - } - } - if (-not $advertisedSurface.worldInteraction.ownership) { - throw "Aetheria world surface $($requirement.surfaceId) missing ownership rule" - } -} - -foreach ($fixtureId in @($handoff.fixtureIds)) { - if (-not (@($scenario.requires.fixtures) -contains $fixtureId)) { - throw "Aetheria provider handoff fixture is not required by scenario: $fixtureId" - } -} - -$moveSets = @($handoff.moveSets) -foreach ($id in @("provider-advertisement", "interactive-world-surface", "provider-scenario")) { - $moveSet = $moveSets | Where-Object { $_.id -eq $id } | Select-Object -First 1 - if (-not $moveSet) { - throw "Aetheria provider handoff missing move set: $id" - } - if ($moveSet.destinationOwner -ne "Aetheria") { - throw "Aetheria provider handoff move set $id has unexpected destination owner: $($moveSet.destinationOwner)" - } - if (-not $moveSet.replacementProof) { - throw "Aetheria provider handoff move set $id missing replacement proof" - } - foreach ($relativePath in @($moveSet.currentPaths)) { - $absolutePath = Join-Path $projectRoot $relativePath - if (-not (Test-Path -LiteralPath $absolutePath)) { - throw "Aetheria provider handoff move set $id references missing current path: $relativePath" - } - } -} - -foreach ($contract in @( - "gamecult.eve.surface.v1", - "gamecult.eve.command.v1", - "gamecult.eve.provider_advertisement.v1", - "gamecult.eve.provider_scenario.v1", - "gamecult.eve.conformance_export.v1" -)) { - if (-not (@($handoff.contractInputs) -contains $contract)) { - throw "Aetheria provider handoff missing contract input: $contract" - } -} - -foreach ($proof in @($handoff.requiredExternalProofs)) { - if (-not $proof) { - throw "Aetheria provider handoff contains an empty required external proof" - } -} - -Write-Host "Aetheria provider handoff smoke passed: $absoluteHandoffPath" diff --git a/scripts/run-conformance-consumer-smoke.ps1 b/scripts/run-conformance-consumer-smoke.ps1 index a3a0fcc..efb0806 100644 --- a/scripts/run-conformance-consumer-smoke.ps1 +++ b/scripts/run-conformance-consumer-smoke.ps1 @@ -51,11 +51,9 @@ try { --expect-schema gamecult.eve.web_layout_probe.v1 ` --expect-capability-gap runtime:Fensalir:direct2d:capture:missing ` --expect-local-provider-catalog web:valid:local-provider-catalog.json ` - --expect-local-provider-catalog-provider web:aetheria ` --expect-local-provider-catalog-provider web:eve.world-smoke ` --expect-local-provider-catalog-provider web:repixelizer ` --expect-local-provider-catalog-provider web:gamecult.home.vn ` - --expect-local-provider-catalog-advertisement web:aetheria.provider-advertisement.json ` --expect-local-provider-catalog-advertisement web:eve-world-smoke.provider-advertisement.json ` --expect-local-provider-catalog-advertisement web:repixelizer.provider-advertisement.json ` --expect-local-provider-catalog-advertisement web:sai-vn.provider-advertisement.json ` diff --git a/scripts/run-evetui-capture-contract-smoke.ps1 b/scripts/run-evetui-capture-contract-smoke.ps1 index 72c8c5f..49991e4 100644 --- a/scripts/run-evetui-capture-contract-smoke.ps1 +++ b/scripts/run-evetui-capture-contract-smoke.ps1 @@ -1,6 +1,6 @@ param( [string] $CapabilityManifestPath = "runtimes\incubating\eve-tui\eve-runtime-capability.json", - [string] $AdvertisementPath = "web\fixtures\aetheria.provider-advertisement.json", + [string] $AdvertisementPath = "..\Aetheria\conformance\eve\aetheria.provider-advertisement.json", [string] $OutputPath = "artifacts\evetui-capture-contract\latest\capture-request.json", [string] $Stamp = "smoke" ) diff --git a/scripts/run-evetui-capture-smoke.ps1 b/scripts/run-evetui-capture-smoke.ps1 index f7004ac..fe8a52f 100644 --- a/scripts/run-evetui-capture-smoke.ps1 +++ b/scripts/run-evetui-capture-smoke.ps1 @@ -1,7 +1,7 @@ param( [string] $CapabilityManifestPath = "runtimes\incubating\eve-tui\eve-runtime-capability.json", - [string] $AdvertisementPath = "web\fixtures\aetheria.provider-advertisement.json", - [string] $SurfacePath = "web\fixtures\aetheria-world-surface.json", + [string] $AdvertisementPath = "..\Aetheria\conformance\eve\aetheria.provider-advertisement.json", + [string] $SurfacePath = "..\Aetheria\conformance\eve\aetheria-world-surface.json", [string] $OutputPath = "artifacts\evetui-capture\latest\tui-grid.json", [string] $RequestOutputPath = "artifacts\evetui-capture\latest\capture-request.json", [string] $Stamp = "latest", diff --git a/scripts/run-parity-harness.ps1 b/scripts/run-parity-harness.ps1 index 624ccdf..7dbf713 100644 --- a/scripts/run-parity-harness.ps1 +++ b/scripts/run-parity-harness.ps1 @@ -50,7 +50,6 @@ try { "E:\Projects\EvePlugins\artifacts\tex-math\runtime-witness.json" ` ".\artifacts\conformance\latest" & (Join-Path $PSScriptRoot "run-eveconformance-handoff-smoke.ps1") - & (Join-Path $PSScriptRoot "run-aetheria-provider-handoff-smoke.ps1") & (Join-Path $PSScriptRoot "run-eveelectron-owner-smoke.ps1") & (Join-Path $PSScriptRoot "run-evetui-split-handoff-smoke.ps1") & (Join-Path $PSScriptRoot "run-evetui-lifecycle-smoke.ps1") diff --git a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 index 6e062d9..664a161 100644 --- a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 +++ b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 @@ -225,7 +225,7 @@ node $consumerScript $consumerExport ` --expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.targetId:unity-uitoolkit" ` --expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.requestSchema:gamecult.eve.runtime_capture_request.v1" ` --expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.requestBuilder:scripts/build-uitoolkit-capture-request.ps1" ` - --expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.advertisementPath:web/fixtures/aetheria.provider-advertisement.json" ` + --expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.advertisementPath:../Aetheria/conformance/eve/aetheria.provider-advertisement.json" ` --expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.conformanceAttachment:runtime.captureArtifacts[]" ` --expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.requiredProvider:aetheria" ` --expect-runtime-lifecycle-field "unity-uitoolkit:capture:captureContract.requiredSurface:aetheria.daemon.game" ` @@ -258,7 +258,7 @@ node $consumerScript $consumerExport ` --expect-runtime-lifecycle-field "unity-scene:capture:captureContract.targetId:unity-scene" ` --expect-runtime-lifecycle-field "unity-scene:capture:captureContract.requestSchema:gamecult.eve.runtime_capture_request.v1" ` --expect-runtime-lifecycle-field "unity-scene:capture:captureContract.requestBuilder:scripts/build-capture-request.ps1" ` - --expect-runtime-lifecycle-field "unity-scene:capture:captureContract.advertisementPath:GameCult/Aetheria:web/fixtures/aetheria.provider-advertisement.json" ` + --expect-runtime-lifecycle-field "unity-scene:capture:captureContract.advertisementPath:Aetheria:conformance/eve/aetheria.provider-advertisement.json" ` --expect-runtime-lifecycle-field "unity-scene:capture:captureContract.requiredSurface:aetheria.daemon.game" ` --expect-runtime-lifecycle-field "unity-scene:capture:captureContract.additionalProviderSurfaces.0.providerId:eve.world-smoke" ` --expect-runtime-lifecycle-field "unity-scene:capture:captureContract.additionalProviderSurfaces.0.surfaceId:eve.world-smoke.surface" ` @@ -299,7 +299,7 @@ node $consumerScript $consumerExport ` --expect-runtime-lifecycle-field "tui:capture:captureContract.targetId:tui" ` --expect-runtime-lifecycle-field "tui:capture:captureContract.requestSchema:gamecult.eve.runtime_capture_request.v1" ` --expect-runtime-lifecycle-field "tui:capture:captureContract.requestBuilder:tools/evetui/evetui-capture-contract.mjs" ` - --expect-runtime-lifecycle-field "tui:capture:captureContract.advertisementPath:web/fixtures/aetheria.provider-advertisement.json" ` + --expect-runtime-lifecycle-field "tui:capture:captureContract.advertisementPath:../Aetheria/conformance/eve/aetheria.provider-advertisement.json" ` --expect-runtime-lifecycle-field "tui:capture:captureContract.requiredSurface:aetheria.daemon.game" ` --expect-runtime-lifecycle-field "tui:capture:captureContract.additionalProviderSurfaces.0.providerId:eve.world-smoke" ` --expect-runtime-lifecycle-field "tui:capture:captureContract.additionalProviderSurfaces.0.surfaceId:eve.world-smoke.surface" ` diff --git a/tools/conformance/eveconformance-handoff.json b/tools/conformance/eveconformance-handoff.json index 831cbaf..4159a41 100644 --- a/tools/conformance/eveconformance-handoff.json +++ b/tools/conformance/eveconformance-handoff.json @@ -67,7 +67,6 @@ "currentPaths": [ "web/fixtures/cultui-slider-inspector.conformance.json", "web/fixtures/sai-vn-surface.conformance.json", - "web/fixtures/aetheria-world-surface.conformance.json", "web/fixtures/fensalir-direct2d-surface.conformance.json", "web/fixtures/cultui-embedded-surface.conformance.json" ], diff --git a/tools/evetui/evetui-capture-artifact.test.mjs b/tools/evetui/evetui-capture-artifact.test.mjs index fea9dd3..936e90a 100644 --- a/tools/evetui/evetui-capture-artifact.test.mjs +++ b/tools/evetui/evetui-capture-artifact.test.mjs @@ -3,9 +3,9 @@ import { readFileSync } from "node:fs"; import test from "node:test"; import { buildTuiCaptureArtifact } from "./evetui-capture-artifact.mjs"; -const advertisement = JSON.parse(readFileSync(new URL("../../web/fixtures/aetheria.provider-advertisement.json", import.meta.url), "utf8")); +const advertisement = JSON.parse(readFileSync(new URL("../../../Aetheria/conformance/eve/aetheria.provider-advertisement.json", import.meta.url), "utf8")); const capabilityManifest = JSON.parse(readFileSync(new URL("../../runtimes/incubating/eve-tui/eve-runtime-capability.json", import.meta.url), "utf8")); -const surfaceDocument = JSON.parse(readFileSync(new URL("../../web/fixtures/aetheria-world-surface.json", import.meta.url), "utf8")); +const surfaceDocument = JSON.parse(readFileSync(new URL("../../../Aetheria/conformance/eve/aetheria-world-surface.json", import.meta.url), "utf8")); const worldSmokeAdvertisement = JSON.parse(readFileSync(new URL("../../web/fixtures/eve-world-smoke.provider-advertisement.json", import.meta.url), "utf8")); const worldSmokeSurfaceDocument = JSON.parse(readFileSync(new URL("../../web/fixtures/eve-world-smoke-surface.json", import.meta.url), "utf8")); @@ -14,7 +14,7 @@ test("builds TUI JSON grid capture artifact from provider advertisement and surf advertisement, capabilityManifest, surfaceDocument, - advertisementPath: "web/fixtures/aetheria.provider-advertisement.json", + advertisementPath: "conformance/eve/aetheria.provider-advertisement.json", capabilityManifestPath: "runtimes/incubating/eve-tui/eve-runtime-capability.json", stamp: "smoke", width: 72, diff --git a/tools/evetui/evetui-capture-contract.test.mjs b/tools/evetui/evetui-capture-contract.test.mjs index fdec72f..9b19009 100644 --- a/tools/evetui/evetui-capture-contract.test.mjs +++ b/tools/evetui/evetui-capture-contract.test.mjs @@ -3,7 +3,7 @@ import { readFileSync } from "node:fs"; import test from "node:test"; import { buildTuiCaptureRequest } from "./evetui-capture-contract.mjs"; -const advertisement = JSON.parse(readFileSync(new URL("../../web/fixtures/aetheria.provider-advertisement.json", import.meta.url), "utf8")); +const advertisement = JSON.parse(readFileSync(new URL("../../../Aetheria/conformance/eve/aetheria.provider-advertisement.json", import.meta.url), "utf8")); const worldSmokeAdvertisement = JSON.parse(readFileSync(new URL("../../web/fixtures/eve-world-smoke.provider-advertisement.json", import.meta.url), "utf8")); const capabilityManifest = JSON.parse(readFileSync(new URL("../../runtimes/incubating/eve-tui/eve-runtime-capability.json", import.meta.url), "utf8")); @@ -11,7 +11,7 @@ test("builds TUI capture request from provider advertisement", () => { const request = buildTuiCaptureRequest({ advertisement, capabilityManifest, - advertisementPath: "web/fixtures/aetheria.provider-advertisement.json", + advertisementPath: "conformance/eve/aetheria.provider-advertisement.json", capabilityManifestPath: "runtimes/incubating/eve-tui/eve-runtime-capability.json", stamp: "smoke", }); @@ -36,7 +36,7 @@ test("builds TUI capture request for Aetheria editor surface", () => { advertisement, capabilityManifest, captureSurfaceId: "aetheria.daemon.editor", - advertisementPath: "web/fixtures/aetheria.provider-advertisement.json", + advertisementPath: "conformance/eve/aetheria.provider-advertisement.json", capabilityManifestPath: "runtimes/incubating/eve-tui/eve-runtime-capability.json", stamp: "smoke", }); diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index eadfd22..1e1f08c 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -211,11 +211,12 @@ "title": "Aetheria Interactive World", "pack": "provider", "ownerRepo": "Aetheria", + "sourceRoot": "../Aetheria", "surface": { "transport": "local-json", - "path": "web/fixtures/aetheria-world-surface.json" + "path": "conformance/eve/aetheria-world-surface.json" }, - "metadataPath": "web/fixtures/aetheria-world-surface.conformance.json", + "metadataPath": "conformance/eve/aetheria-world-surface.conformance.json", "expect": { "providerId": "aetheria", "componentKinds": ["surface", "card", "text", "metric", "partition", "field.surface2d", "control.button"], @@ -385,11 +386,11 @@ "kind": "game.runtime", "ownerRepo": "Aetheria", "repoRole": "provider-external", + "sourceRoot": "../Aetheria", "graduationTrigger": "Aetheria owns RTS/ARPG world surfaces, generated level state, assets, command receipts, and scenario conformance; Eve keeps contract fixtures only.", "schemaPath": "schemas/gamecult.eve.provider_advertisement.v1.schema.json", - "advertisementPath": "web/fixtures/aetheria.provider-advertisement.json", - "scenarioPath": "web/fixtures/aetheria-world-scenario.json", - "handoffPath": "web/fixtures/aetheria-provider-handoff.json", + "advertisementPath": "conformance/eve/aetheria.provider-advertisement.json", + "scenarioPath": "conformance/eve/aetheria-world-scenario.json", "requiredFixtures": ["aetheria-world"], "expectedSchemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "gamecult.eve.command_invocation.v1", "gamecult.eve.unity_playable_world_asset_manifest.v1", "aetheria.runtime.daemon.frame.v1"], "expectedSurfaces": ["aetheria.daemon.game", "aetheria.daemon.editor"], @@ -399,9 +400,9 @@ }, "expectedCommands": ["aetheria.daemon.commands"], "expectedPaths": [ - "web/fixtures/aetheria-world-scenario.json", - "web/fixtures/aetheria-provider-handoff.json", - "scripts/run-aetheria-provider-handoff-smoke.ps1" + "conformance/eve/provider-pack.json", + "conformance/eve/aetheria-world-scenario.json", + "scripts/verify-eve-conformance-pack.mjs" ] }, { @@ -840,7 +841,7 @@ "runtimeId": "electron-shell", "providerId": "aetheria", "surfaceId": "aetheria.daemon.game", - "sourceSurfacePath": "../Eve/web/fixtures/aetheria-world-surface.json", + "sourceSurfacePath": "../Aetheria/conformance/eve/aetheria-world-surface.json", "requestPath": "artifacts/capture/aetheria-world/runtime-witness.json" } ] @@ -889,7 +890,7 @@ "runtimes/incubating/eve-tui/src/eve-tui-shell.mjs", "runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs", "web/fixtures/sai-vn-surface.json", - "web/fixtures/aetheria.provider-advertisement.json", + "../Aetheria/conformance/eve/aetheria.provider-advertisement.json", "web/fixtures/eve-world-smoke.provider-advertisement.json" ] } @@ -957,7 +958,7 @@ "path": "artifacts/evetui-capture/latest/tui-grid.json", "providerId": "aetheria", "surfaceId": "aetheria.daemon.game", - "sourceSurfacePath": "web/fixtures/aetheria-world-surface.json", + "sourceSurfacePath": "../Aetheria/conformance/eve/aetheria-world-surface.json", "requestPath": "artifacts/evetui-capture/latest/capture-request.json" }, { @@ -1157,7 +1158,7 @@ "targetId": "unity-scene", "requestSchema": "gamecult.eve.runtime_capture_request.v1", "requestBuilder": "scripts/build-capture-request.ps1", - "advertisementPath": "GameCult/Aetheria:web/fixtures/aetheria.provider-advertisement.json", + "advertisementPath": "Aetheria:conformance/eve/aetheria.provider-advertisement.json", "captureKind": "unity-scene-frame-png", "artifactKind": "png", "artifactPattern": "artifacts/eveunity-scene-capture/{stamp}/unity-scene.png", @@ -1197,9 +1198,8 @@ "supportedFeatures": ["embeddedDocuments", "providerAdvertisements", "stateBindings", "styleTokens", "authorityWitnesses"], "localProviderCatalog": { "path": "web/local-provider-catalog.json", - "requiredProviders": ["aetheria", "eve.world-smoke", "repixelizer", "gamecult.home.vn"], + "requiredProviders": ["eve.world-smoke", "repixelizer", "gamecult.home.vn"], "requiredAdvertisements": [ - "web/fixtures/aetheria.provider-advertisement.json", "web/fixtures/eve-world-smoke.provider-advertisement.json", "web/fixtures/repixelizer.provider-advertisement.json", "web/fixtures/sai-vn.provider-advertisement.json" @@ -1229,7 +1229,6 @@ "evidencePaths": [ "web/surface.js", "packages/eve-browser-lowering/src/index.ts", - "web/fixtures/aetheria.provider-advertisement.json", "web/fixtures/eve-world-smoke.provider-advertisement.json" ] } @@ -1245,11 +1244,11 @@ }, { "path": "web/provider-advertisements.test.mjs", - "contains": ["preserves Sai required and optional nested plugin requirements from advertisement", "merges local fixture transport with advertised Aetheria world interaction", "loads Aetheria Unity playable world asset manifest as provider-authored data", "gamecult.eve.unity_playable_world_asset_manifest.v1", "merges generic world fixture transport with advertised world interaction", "requiresPlugins", "worldInteraction", "optional-nested", "aetheria.daemon.commands", "eve.world-smoke.commands"] + "contains": ["preserves Sai required and optional nested plugin requirements from advertisement", "merges generic world fixture transport with advertised world interaction", "requiresPlugins", "worldInteraction", "optional-nested", "eve.world-smoke.commands"] }, { "path": "web/local-provider-catalog.json", - "contains": ["aetheria.provider-advertisement.json", "eve-world-smoke.provider-advertisement.json", "repixelizer.provider-advertisement.json", "sai-vn.provider-advertisement.json"] + "contains": ["eve-world-smoke.provider-advertisement.json", "repixelizer.provider-advertisement.json", "sai-vn.provider-advertisement.json"] }, { "path": "packages/eve-browser-lowering/src/index.ts", @@ -1604,7 +1603,7 @@ "evidencePaths": [ "packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceLowerer.cs", "packages/org.gamecult.eve.unity-uitoolkit/Tests/Editor/EveUiToolkitSurfaceLowererTests.cs", - "../Eve/web/fixtures/aetheria.provider-advertisement.json", + "../Aetheria/conformance/eve/aetheria.provider-advertisement.json", "../Eve/web/fixtures/eve-world-smoke.provider-advertisement.json" ] } @@ -1784,7 +1783,7 @@ "targetId": "unity-uitoolkit", "requestSchema": "gamecult.eve.runtime_capture_request.v1", "requestBuilder": "scripts/build-uitoolkit-capture-request.ps1", - "advertisementPath": "web/fixtures/aetheria.provider-advertisement.json", + "advertisementPath": "../Aetheria/conformance/eve/aetheria.provider-advertisement.json", "captureKind": "unity-editor-or-batchmode-png", "artifactKind": "png", "artifactPattern": "artifacts/eveunity-uitoolkit-capture/{stamp}/unity-uitoolkit.png", diff --git a/tools/parity/run-parity.mjs b/tools/parity/run-parity.mjs index f2e580e..852185d 100644 --- a/tools/parity/run-parity.mjs +++ b/tools/parity/run-parity.mjs @@ -71,7 +71,7 @@ if (conformanceExportErrors.length > 0) process.exitCode = 1; async function evaluateFixture(fixture) { const startedAt = Date.now(); - const state = await loadSurface(fixture.surface); + const state = await loadSurface(fixture, fixture.surface); const root = state.surface?.root; const nodes = root ? flattenSurface(root) : []; const kindCounts = countBy(nodes, node => node.kind || "unknown"); @@ -264,8 +264,8 @@ async function evaluateFixture(fixture) { }; } -async function loadSurface(surface) { - const absolutePath = path.join(repoRoot, surface.path); +async function loadSurface(owner, surface) { + const absolutePath = resolveOwnedPath(owner, surface.path); const source = await readFile(absolutePath, "utf8"); if (surface.transport === "local-eve-dsl") return compileEveDsl(source); if (surface.transport === "local-json") return JSON.parse(source); @@ -795,7 +795,8 @@ async function evaluateFixtureMetadata(fixture) { const errors = []; if (!fixture.metadataPath) return { metadata: null, errors: ["metadataPath:missing"] }; - errors.push(...await validateJsonDocument( + errors.push(...await validateOwnedJsonDocument( + fixture, manifest.schemas?.["gamecult.eve.conformance_fixture.v1"], fixture.metadataPath, { @@ -805,7 +806,7 @@ async function evaluateFixtureMetadata(fixture) { )); if (errors.length) return { metadata: null, errors }; - const metadata = await readJsonDocument(fixture.metadataPath); + const metadata = await readOwnedJsonDocument(fixture, fixture.metadataPath); if (metadata.pack !== fixture.pack) errors.push(`pack:expected ${fixture.pack} got ${metadata.pack}`); if (metadata.ownerRepo !== fixture.ownerRepo) errors.push(`ownerRepo:expected ${fixture.ownerRepo} got ${metadata.ownerRepo}`); if (metadata.surface?.transport !== fixture.surface?.transport) { @@ -821,15 +822,15 @@ async function evaluateFixtureMetadata(fixture) { async function evaluateProvider(provider, fixtureResults, pluginResults) { const expectedPaths = provider.expectedPaths || []; - const missingPaths = expectedPaths.filter(candidate => !existsSync(path.join(repoRoot, candidate))); + const missingPaths = expectedPaths.filter(candidate => !existsSync(resolveOwnedPath(provider, candidate))); const requiredFixtures = provider.requiredFixtures || []; const missingRequiredFixtures = requiredFixtures.filter(id => !fixtureResults.some(fixture => fixture.id === id && fixture.status === "pass")); const missingIncubationFields = requiredIncubationFields(provider).filter(field => !provider[field]); - const advertisementErrors = await validateJsonDocument(provider.schemaPath, provider.advertisementPath, { + const advertisementErrors = await validateOwnedJsonDocument(provider, provider.schemaPath, provider.advertisementPath, { schema: "gamecult.eve.provider_advertisement.v1", providerId: provider.providerId, }); - const advertisement = advertisementErrors.length ? null : await readJsonDocument(provider.advertisementPath); + const advertisement = advertisementErrors.length ? null : await readOwnedJsonDocument(provider, provider.advertisementPath); const schemaIds = advertisement ? extractProviderSchemaIds(advertisement.schemas || []) : []; const advertisedSchemaIds = advertisement ? [...new Set([ ...schemaIds, @@ -848,7 +849,7 @@ async function evaluateProvider(provider, fixtureResults, pluginResults) { const missingSurfaceKinds = validateProviderSurfaceKinds(provider, surfaceKinds); const missingCommands = (provider.expectedCommands || []).filter(command => !commandIds.includes(command)); const scenarioErrors = await validateProviderScenario(provider, advertisement, fixtureResults, advertisedSchemaIds, surfaceIds, commandIds); - const scenario = scenarioErrors.length || !provider.scenarioPath ? null : await readJsonDocument(provider.scenarioPath); + const scenario = scenarioErrors.length || !provider.scenarioPath ? null : await readOwnedJsonDocument(provider, provider.scenarioPath); const handoffErrors = await validateProviderHandoff(provider); const status = missingPaths.length ? "missing-body" @@ -1027,10 +1028,44 @@ async function readJsonDocument(documentPath) { return JSON.parse(await readFile(path.join(repoRoot, documentPath), "utf8")); } +function resolveOwnedPath(owner, candidate) { + return path.resolve(repoRoot, owner?.sourceRoot || ".", candidate); +} + +async function readOwnedJsonDocument(owner, documentPath) { + return JSON.parse(await readFile(resolveOwnedPath(owner, documentPath), "utf8")); +} + +async function validateOwnedJsonDocument(owner, schemaPath, documentPath, expected = {}) { + const errors = []; + if (!schemaPath) errors.push("schemaPath:missing"); + if (!documentPath) errors.push("documentPath:missing"); + if (errors.length) return errors; + + const absoluteSchemaPath = path.join(repoRoot, schemaPath); + const absoluteDocumentPath = resolveOwnedPath(owner, documentPath); + if (!existsSync(absoluteSchemaPath)) errors.push(`${schemaPath}:missing`); + if (!existsSync(absoluteDocumentPath)) errors.push(`${documentPath}:missing`); + if (errors.length) return errors; + + try { + const schema = JSON.parse(await readFile(absoluteSchemaPath, "utf8")); + const document = JSON.parse(await readFile(absoluteDocumentPath, "utf8")); + errors.push(...validateSchemaSubset(schema, document)); + for (const [key, value] of Object.entries(expected)) { + if (document[key] !== value) errors.push(`${documentPath}:${key}:expected ${value} got ${document[key]}`); + } + } catch (error) { + errors.push(`${documentPath}:invalid-json:${error instanceof Error ? error.message : String(error)}`); + } + return errors; +} + async function validateProviderScenario(provider, advertisement, fixtureResults, advertisedSchemaIds, surfaceIds, commandIds) { if (!provider.scenarioPath) return []; - const errors = await validateJsonDocument( + const errors = await validateOwnedJsonDocument( + provider, manifest.schemas?.["gamecult.eve.provider_scenario.v1"], provider.scenarioPath, { @@ -1041,7 +1076,7 @@ async function validateProviderScenario(provider, advertisement, fixtureResults, if (errors.length) return errors; try { - const scenario = await readJsonDocument(provider.scenarioPath); + const scenario = await readOwnedJsonDocument(provider, provider.scenarioPath); if (scenario.ownerRepo !== provider.ownerRepo) { errors.push(`${provider.scenarioPath}:ownerRepo:expected ${provider.ownerRepo} got ${scenario.ownerRepo}`); } diff --git a/web/eve-runtime-capability.json b/web/eve-runtime-capability.json index 275a453..335ca25 100644 --- a/web/eve-runtime-capability.json +++ b/web/eve-runtime-capability.json @@ -58,7 +58,6 @@ "evidencePaths": [ "web/surface.js", "packages/eve-browser-lowering/src/index.ts", - "web/fixtures/aetheria.provider-advertisement.json", "web/fixtures/eve-world-smoke.provider-advertisement.json" ] } diff --git a/web/fixtures/aetheria-provider-handoff.json b/web/fixtures/aetheria-provider-handoff.json deleted file mode 100644 index a2862aa..0000000 --- a/web/fixtures/aetheria-provider-handoff.json +++ /dev/null @@ -1,69 +0,0 @@ -{ - "schema": "gamecult.eve.provider_handoff.v1", - "providerId": "aetheria", - "ownerRepo": "Aetheria", - "currentHostRepo": "Eve", - "advertisementPath": "web/fixtures/aetheria.provider-advertisement.json", - "scenarioPath": "web/fixtures/aetheria-world-scenario.json", - "fixtureIds": [ - "aetheria-world" - ], - "authorityBoundary": "Aetheria owns daemon state, generated world state, assets, command authorization, receipts, and provider scenarios. Eve owns only the provider advertisement, surface, command, and conformance contracts used to consume those surfaces.", - "moveSets": [ - { - "id": "provider-advertisement", - "destinationOwner": "Aetheria", - "currentPaths": [ - "web/fixtures/aetheria.provider-advertisement.json" - ], - "replacementProof": "Aetheria publishes provider advertisements from typed daemon state or CultMesh records." - }, - { - "id": "interactive-world-surface", - "destinationOwner": "Aetheria", - "currentPaths": [ - "web/fixtures/aetheria-world-surface.json", - "web/fixtures/aetheria-world-surface.conformance.json" - ], - "replacementProof": "Aetheria owns RTS/ARPG world surface fixtures, generated level state, and assets." - }, - { - "id": "unity-playable-world-asset-manifest", - "destinationOwner": "Aetheria", - "currentPaths": [ - "web/fixtures/aetheria.unity-playable-world-asset-manifest.json" - ], - "replacementProof": "Aetheria owns provider-authored Unity playable-world asset manifest documents; EveUnity only consumes the typed manifest contract." - }, - { - "id": "provider-scenario", - "destinationOwner": "Aetheria", - "currentPaths": [ - "web/fixtures/aetheria-world-scenario.json", - "scripts/run-aetheria-conformance-consumer-smoke.ps1" - ], - "replacementProof": "Aetheria owns provider scenario conformance, command receipts, and replay fixtures." - } - ], - "contractInputs": [ - "gamecult.eve.surface.v1", - "gamecult.eve.command.v1", - "gamecult.eve.command_invocation.v1", - "gamecult.eve.unity_playable_world_asset_manifest.v1", - "gamecult.eve.provider_advertisement.v1", - "gamecult.eve.provider_scenario.v1", - "gamecult.eve.conformance_export.v1" - ], - "forbiddenImports": [ - "Eve fixture paths as product authority", - "renderer-local Aetheria game state", - "Unity or web client state as daemon truth", - "plugin internals bypassing advertised provider commands" - ], - "requiredExternalProofs": [ - "Aetheria publishes its provider advertisement from owner-owned daemon state.", - "Aetheria exports provider fixtures or conformance packs without depending on Eve source layout.", - "Aetheria command receipts are generated by the daemon command boundary.", - "Unity and web clients consume Aetheria surfaces through provider advertisements and command intents." - ] -} diff --git a/web/fixtures/aetheria-world-scenario.json b/web/fixtures/aetheria-world-scenario.json deleted file mode 100644 index 759e34b..0000000 --- a/web/fixtures/aetheria-world-scenario.json +++ /dev/null @@ -1,87 +0,0 @@ -{ - "schema": "gamecult.eve.provider_scenario.v1", - "scenarioId": "aetheria-world-command-replay", - "providerId": "aetheria", - "ownerRepo": "Aetheria", - "advertisementPath": "web/fixtures/aetheria.provider-advertisement.json", - "surfaceFixture": "aetheria-world", - "purpose": "Proves Aetheria interactive world clients consume provider advertisements, lower provider-owned game surfaces, issue command intents through the daemon boundary, and receive provider-owned receipts.", - "requires": { - "fixtures": ["aetheria-world"], - "surfaces": ["aetheria.daemon.game", "aetheria.daemon.editor"], - "worldSurfaces": [ - { - "surfaceId": "aetheria.daemon.game", - "surfaceKind": "interactive-world", - "projectionKind": "provider-authored-world-surface", - "commandBoundary": "aetheria.daemon.commands", - "receiptSchema": "aetheria.eve_command_acceptance_status.v1" - }, - { - "surfaceId": "aetheria.daemon.editor", - "surfaceKind": "interactive-world-editor", - "projectionKind": "provider-authored-world-editor-surface", - "commandBoundary": "aetheria.daemon.commands", - "receiptSchema": "aetheria.eve_command_acceptance_status.v1" - } - ], - "commands": ["aetheria.daemon.commands"], - "schemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "gamecult.eve.command_invocation.v1", "aetheria.eve_command_acceptance_status.v1"] - }, - "commandIntents": [ - { - "command": "aetheria.daemon.commands", - "commandId": "aetheria.daemon.focus", - "operation": "focus_entity", - "payload": { - "entityId": "GateRelay" - } - }, - { - "command": "aetheria.daemon.commands", - "commandId": "aetheria.daemon.move_intent", - "operation": "set_move_vector", - "payload": { - "vector": [0.28, 0.0, 0.64] - } - }, - { - "command": "aetheria.daemon.commands", - "commandId": "aetheria.daemon.editor.inspect", - "operation": "inspect_world_entity", - "payload": { - "surfaceId": "aetheria.daemon.editor", - "entityId": "GateRelay" - } - } - ], - "expectedReceipts": [ - { - "receiptId": "aetheria.daemon.focus.accepted", - "command": "aetheria.daemon.commands", - "commandId": "aetheria.daemon.focus", - "state": "accepted", - "authority": "AetheriaRuntimeDaemonCommandBoundaryDocument", - "ownerRepo": "Aetheria", - "schema": "aetheria.eve_command_acceptance_status.v1" - }, - { - "receiptId": "aetheria.daemon.move_intent.reconciled", - "command": "aetheria.daemon.commands", - "commandId": "aetheria.daemon.move_intent", - "state": "reconciled", - "authority": "AetheriaRuntimeDaemonCommandBoundaryDocument", - "ownerRepo": "Aetheria", - "schema": "aetheria.eve_command_acceptance_status.v1" - }, - { - "receiptId": "aetheria.daemon.editor.inspect.pending", - "command": "aetheria.daemon.commands", - "commandId": "aetheria.daemon.editor.inspect", - "state": "pending", - "authority": "AetheriaRuntimeDaemonCommandBoundaryDocument", - "ownerRepo": "Aetheria", - "schema": "aetheria.eve_command_acceptance_status.v1" - } - ] -} diff --git a/web/fixtures/aetheria-world-surface.conformance.json b/web/fixtures/aetheria-world-surface.conformance.json deleted file mode 100644 index 881b309..0000000 --- a/web/fixtures/aetheria-world-surface.conformance.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "schema": "gamecult.eve.conformance_fixture.v1", - "fixtureId": "aetheria-world", - "title": "Aetheria Interactive World", - "pack": "provider", - "ownerRepo": "Aetheria", - "surface": { - "transport": "local-json", - "path": "web/fixtures/aetheria-world-surface.json" - }, - "purpose": "Proves Aetheria can expose daemon-owned interactive world surfaces through Eve without moving game truth into Eve.", - "exitCriteria": "Move to Aetheria when generated level state, assets, command receipts, and scenario conformance become product-owned fixtures.", - "asserts": [ - "world.scene3d playable ARPG root", - "world.entity3d provider-authored entity rows", - "field.vector3d world projection", - "daemon asset manifest refs", - "generic Unity playableWorld projection", - "field.surface2d world projection", - "daemon command boundary", - "provider-owned bindings", - "provider-advertised world interaction contract", - "Aetheria style tokens" - ], - "splitTarget": "Aetheria" -} diff --git a/web/fixtures/aetheria-world-surface.json b/web/fixtures/aetheria-world-surface.json deleted file mode 100644 index 86be042..0000000 --- a/web/fixtures/aetheria-world-surface.json +++ /dev/null @@ -1,230 +0,0 @@ -{ - "type": "surface-state", - "schema": "gamecult.eve.surface.v1", - "providerId": "aetheria", - "providerKind": "game.runtime", - "title": "Aetheria Interactive World Surface", - "version": 1, - "updatedAtUtc": "2026-07-08T00:00:00Z", - "surface": { - "id": "aetheria.daemon.game", - "root": { - "id": "aetheria.daemon.game.root", - "kind": "surface", - "props": {}, - "children": [ - { - "id": "aetheria.daemon.game.summary", - "kind": "card", - "props": { - "title": "Daemon World" - }, - "children": [ - { - "id": "aetheria.daemon.game.summary.text", - "kind": "text", - "props": { - "text": "Provider-owned world state projected through Eve. Unity and web clients lower this document; Aetheria keeps the live truth." - }, - "children": [] - }, - { - "id": "aetheria.daemon.game.frame", - "kind": "metric", - "props": { - "label": "Frame", - "bind": "aetheria.daemon.frameId", - "value": "7" - }, - "children": [] - } - ] - }, - { - "id": "aetheria.daemon.game.partition", - "kind": "partition", - "props": { - "direction": "horizontal" - }, - "children": [ - { - "id": "aetheria.daemon.game.playable", - "kind": "world.scene3d", - "props": { - "label": "Daemon ARPG View", - "statePointerId": "cultmesh://aetheria/run/current", - "assetManifest": "cultmesh://aetheria/assets/manifest", - "inputProfile": "arpg-third-person", - "cameraRig": "third-person-orbit", - "playerEntityId": "player-vanguard", - "movementCommand": "aetheria.daemon.move_intent", - "focusCommand": "aetheria.daemon.focus", - "targetCommand": "aetheria.daemon.target", - "actionCommand": "aetheria.daemon.use_equipment" - }, - "stateBindings": [ - { - "target": "run", - "pointerId": "cultmesh://aetheria/run/current" - }, - { - "target": "assets", - "pointerId": "cultmesh://aetheria/assets/manifest" - } - ], - "children": [ - { - "id": "aetheria.daemon.game.entity.player", - "kind": "world.entity3d", - "props": { - "entityId": "player-vanguard", - "entityKind": "player", - "label": "Vanguard", - "faction": "player", - "assetRef": "cultmesh://aetheria/assets/map/entity/player", - "position": "0,0,0", - "rotationY": "35", - "radius": "1.15", - "selectable": "true", - "controllable": "true", - "focusCommand": "aetheria.daemon.focus", - "moveCommand": "aetheria.daemon.move_intent" - }, - "children": [] - }, - { - "id": "aetheria.daemon.game.entity.raider", - "kind": "world.entity3d", - "props": { - "entityId": "raider-scout", - "entityKind": "enemy", - "label": "Raider Scout", - "faction": "raider", - "assetRef": "cultmesh://aetheria/assets/map/entity/ship", - "position": "9,0,14", - "rotationY": "220", - "radius": "0.9", - "selectable": "true", - "targetCommand": "aetheria.daemon.target" - }, - "children": [] - }, - { - "id": "aetheria.daemon.game.entity.station", - "kind": "world.entity3d", - "props": { - "entityId": "anchor-station", - "entityKind": "station", - "label": "Anchor Station", - "faction": "neutral", - "assetRef": "cultmesh://aetheria/assets/map/entity/station", - "position": "-18,0,6", - "rotationY": "0", - "radius": "3.4", - "selectable": "true", - "focusCommand": "aetheria.daemon.focus" - }, - "children": [] - }, - { - "id": "aetheria.daemon.game.flow", - "kind": "field.vector3d", - "props": { - "label": "Volumetric Flow", - "fieldId": "aetheria.zone.flow", - "bind": "aetheria.daemon.soaView.flowField3d", - "visualizer": "particles", - "bounds": "-32,0,-32,32,24,32" - }, - "children": [] - } - ] - }, - { - "id": "aetheria.daemon.game.gravity", - "kind": "field.surface2d", - "props": { - "label": "Current Zone Gravity", - "bind": "aetheria.daemon.soaView.gravityField", - "fieldId": "aetheria.zone.gravity", - "fieldKind": "scalar2d", - "bounds": "-2048,-2048,2048,2048", - "bodies": "Terminus:-620:240:1400;GateRelay:420:-110:760;SurveyDrone:80:560:160", - "objects": "station:-410:120;relay:420:-110;drone:80:560", - "sampleCount": "64", - "visualizer": "isolines" - }, - "children": [] - }, - { - "id": "aetheria.daemon.game.commands", - "kind": "card", - "props": { - "title": "Command Boundary" - }, - "children": [ - { - "id": "aetheria.daemon.game.command.focus", - "kind": "control.button", - "props": { - "label": "Focus Relay", - "command": "aetheria.daemon.commands", - "commandId": "aetheria.daemon.focus", - "action": { - "target": "aetheria.daemon.commands", - "operation": "focus_entity", - "entityId": "GateRelay" - } - }, - "children": [] - }, - { - "id": "aetheria.daemon.game.command.move", - "kind": "control.button", - "props": { - "label": "Issue Move Intent", - "command": "aetheria.daemon.commands", - "commandId": "aetheria.daemon.move_intent", - "action": { - "target": "aetheria.daemon.commands", - "operation": "set_move_vector", - "vector": "0.28,0.0,0.64" - } - }, - "children": [] - }, - { - "id": "aetheria.daemon.game.authority", - "kind": "text", - "props": { - "text": "Commands are intents against Aetheria's typed daemon boundary, not renderer-local game state." - }, - "children": [] - } - ] - } - ] - } - ] - }, - "styles": { - "tokens": { - "colorBackground": "#101318", - "colorPanel": "#1C2526", - "colorText": "#F1F4E8", - "colorMuted": "#A9B3A7", - "colorAccent": "#D6B24A", - "colorDanger": "#C95D63" - } - } - }, - "commands": [ - { - "command": "aetheria.daemon.commands", - "schema": "gamecult.eve.command.v1", - "transport": "cultmesh", - "authority": "AetheriaRuntimeDaemonCommandBoundaryDocument", - "result": "accepted-denied-or-reconciled" - } - ] -} diff --git a/web/fixtures/aetheria.provider-advertisement.json b/web/fixtures/aetheria.provider-advertisement.json deleted file mode 100644 index b108264..0000000 --- a/web/fixtures/aetheria.provider-advertisement.json +++ /dev/null @@ -1,201 +0,0 @@ -{ - "schema": "gamecult.eve.provider_advertisement.v1", - "providerId": "aetheria", - "serviceId": "aetheria.service", - "verseId": "aetheria.local", - "rootVerse": "asgard", - "canonicalService": "aetheria", - "locatedService": "aetheria.local", - "cultMeshAddress": "cultmesh://aetheria.local/eve/providers/aetheria", - "title": "Aetheria", - "kind": "game.runtime", - "updatedAtUtc": "2026-07-08T00:00:00Z", - "freshness": { - "state": "fixture", - "lastSeenAtUtc": "2026-07-08T00:00:00Z", - "maxAgeMs": 15000 - }, - "schemas": [ - "aetheria.world_state.v1", - "aetheria.item_definition.v1", - "aetheria.corporation.v2", - "aetheria.name_file.v2", - "aetheria.trade_value_policy.v1", - "aetheria.player_settings.v1", - "aetheria.loadout_template.v1", - "aetheria.run_state.v1", - "aetheria.zone_state.v1", - "aetheria.entity_snapshot.v1", - "aetheria.verse_host_settings.v1", - "aetheria.runtime_session.v1", - "aetheria.eve_command_acceptance_status.v1", - "aetheria.runtime.daemon.provider_advertisement.v1", - "aetheria.runtime.daemon.frame.v1", - "aetheria.runtime.daemon.soa_view.v1", - "aetheria.runtime.daemon.health.v1", - "aetheria.runtime.daemon.command_boundary.v1", - "aetheria.runtime.daemon.game_surface.v1", - "aetheria.runtime.daemon.editor_surface.v1", - "aetheria.runtime.daemon.command.v1", - "gamecult.eve.surface.v1", - "gamecult.eve.command.v1", - "gamecult.eve.command_invocation.v1", - "gamecult.eve.unity_playable_world_asset_manifest.v1" - ], - "witnesses": [ - { - "kind": "repo", - "ref": "E:\\Projects\\Aetheria", - "summary": "Aetheria owns daemon state, Unity/web clients, assets, receipts, and provider scenarios." - }, - { - "kind": "source", - "ref": "E:\\Projects\\Aetheria\\Aetheria.State\\AetheriaEveSurfaceDocuments.cs", - "summary": "BuildProviderAdvertisement publishes the live provider advertisement from typed Aetheria state." - }, - { - "kind": "cultcache", - "ref": "aetheria-world.cc", - "summary": "Typed Aetheria state file; local fixture stands in for smoke-created path." - }, - { - "kind": "cultmesh-record", - "ref": "AetheriaRuntimeVerseRecordKeys.DaemonGameSurface", - "summary": "Aetheria daemon game Eve GUI surface record." - }, - { - "kind": "cultmesh-record", - "ref": "AetheriaRuntimeVerseRecordKeys.DaemonCommandBoundary", - "summary": "Aetheria daemon typed command boundary record." - }, - { - "kind": "cultmesh-record", - "ref": "cultmesh://aetheria/assets/manifest", - "summary": "Provider-authored Unity playable-world asset manifest consumed by EveUnity without importing Aetheria prefab classes." - } - ], - "surfaces": [ - { - "schema": "gamecult.eve.surface.v1", - "surfaceId": "aetheria.catalog.operator", - "key": "eve:surface:aetheria.catalog.operator", - "transport": "cultmesh-managed", - "status": "available", - "audience": "operator", - "mode": "interactive" - }, - { - "schema": "gamecult.eve.surface.v1", - "surfaceId": "aetheria.operations", - "key": "eve:surface:aetheria.operations", - "transport": "cultmesh-managed", - "status": "available", - "audience": "operator", - "mode": "interactive" - }, - { - "schema": "gamecult.eve.surface.v1", - "surfaceId": "aetheria.daemon.game", - "key": "AetheriaRuntimeVerseRecordKeys.DaemonGameSurface", - "transport": "cultmesh-record", - "status": "available", - "audience": "player", - "mode": "interactive", - "surfaceKind": "interactive-world", - "interactionModel": "provider-command-receipts", - "worldInteraction": { - "projectionKind": "provider-authored-world-surface", - "stateSchemas": [ - "aetheria.world_state.v1", - "aetheria.runtime.daemon.frame.v1", - "aetheria.runtime.daemon.soa_view.v1" - ], - "commandBoundary": "aetheria.daemon.commands", - "receiptSchema": "aetheria.eve_command_acceptance_status.v1", - "loweringTargets": ["web-reference", "unity-uitoolkit", "unity-scene", "electron-shell", "tui"], - "ownership": "provider-owns-world-state-assets-command-acceptance-and-receipts" - }, - "summary": "Authoritative daemon game surface consumed by Unity, Electron, and web lowerers." - }, - { - "schema": "gamecult.eve.surface.v1", - "surfaceId": "aetheria.daemon.game.tui", - "key": "AetheriaRuntimeVerseRecordKeys.DaemonGameTuiSurface", - "transport": "cultmesh-record", - "status": "available", - "audience": "agent", - "mode": "interactive" - }, - { - "schema": "gamecult.eve.surface.v1", - "surfaceId": "aetheria.daemon.editor", - "key": "AetheriaRuntimeVerseRecordKeys.DaemonEditorSurface", - "transport": "cultmesh-record", - "status": "available", - "audience": "operator", - "mode": "interactive", - "surfaceKind": "interactive-world-editor", - "interactionModel": "provider-command-receipts", - "worldInteraction": { - "projectionKind": "provider-authored-world-editor-surface", - "stateSchemas": [ - "aetheria.world_state.v1", - "aetheria.runtime.daemon.editor_surface.v1", - "aetheria.runtime.daemon.command_boundary.v1" - ], - "commandBoundary": "aetheria.daemon.commands", - "receiptSchema": "aetheria.eve_command_acceptance_status.v1", - "loweringTargets": ["web-reference", "unity-uitoolkit", "electron-shell", "tui"], - "ownership": "provider-owns-editor-state-assets-command-acceptance-and-receipts" - } - } - ], - "commands": [ - { - "command": "aetheria.daemon.commands", - "transport": "cultmesh", - "summary": "Aetheria daemon typed command boundary." - }, - { - "command": "aetheria.catalog.refresh", - "transport": "cultmesh", - "summary": "Refresh catalog state." - }, - { - "command": "aetheria.operations.refresh", - "transport": "cultmesh", - "summary": "Refresh operations state." - }, - { - "command": "aetheria.player_settings.refresh", - "transport": "cultmesh", - "summary": "Refresh player settings state." - } - ], - "conformanceScenarios": [ - { - "scenarioId": "aetheria-world-command-replay", - "schema": "gamecult.eve.provider_scenario.v1", - "path": "web/fixtures/aetheria-world-scenario.json", - "summary": "Interactive world replay through provider advertisement, daemon game surface, and provider-owned command receipts." - } - ], - "styleCapabilities": [ - { - "styleProfile": "aetheria.daemon.world", - "preferredLowerings": ["unity-uitoolkit", "web-reference", "electron-shell", "tui"], - "tokenGroups": ["aetheria.world", "aetheria.daemon", "aetheria.commandBoundary"], - "lossiness": { - "web-reference": "proves generic Eve lowering and command/binding shape; does not own Aetheria assets or simulation truth", - "electron-shell": "projects the same Eve surface tree inside a generic Electron shell; does not own Aetheria assets, IPC truth, or simulation truth", - "tui": "dense command/state inspection only" - } - } - ], - "contacts": [ - { - "kind": "repo", - "path": "E:\\Projects\\Aetheria" - } - ] -} diff --git a/web/fixtures/aetheria.unity-playable-world-asset-manifest.json b/web/fixtures/aetheria.unity-playable-world-asset-manifest.json deleted file mode 100644 index 7a0c985..0000000 --- a/web/fixtures/aetheria.unity-playable-world-asset-manifest.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "schema": "gamecult.eve.unity_playable_world_asset_manifest.v1", - "providerId": "aetheria", - "manifestRef": "cultmesh://aetheria/assets/manifest", - "entries": [ - { - "assetRef": "cultmesh://aetheria/assets/map/entity/player", - "entityKind": "player", - "resourcesPath": "resources://Aetheria/Entities/Vanguard.prefab", - "prefabKey": "aetheria.vanguard", - "presentationKind": "provider-asset-ref" - }, - { - "assetRef": "cultmesh://aetheria/assets/map/entity/raider", - "entityKind": "enemy", - "resourcesPath": "resources://Aetheria/Entities/Raider.prefab", - "prefabKey": "aetheria.raider", - "presentationKind": "provider-asset-ref" - } - ] -} diff --git a/web/local-provider-catalog.json b/web/local-provider-catalog.json index dc5ea17..d8c4ac6 100644 --- a/web/local-provider-catalog.json +++ b/web/local-provider-catalog.json @@ -2,19 +2,6 @@ "schema": "gamecult.eve.local_provider_catalog.v1", "purpose": "Browser reference fallback catalog for local provider advertisements and fixture surfaces. This is not live discovery truth.", "providers": [ - { - "providerId": "aetheria", - "title": "Aetheria", - "kind": "game.runtime", - "advertisement": "./fixtures/aetheria.provider-advertisement.json", - "surfaces": [ - { - "transport": "local-json", - "surfaceId": "aetheria.daemon.game", - "url": "./fixtures/aetheria-world-surface.json" - } - ] - }, { "providerId": "eve.world-smoke", "title": "Generic Interactive World Smoke", diff --git a/web/provider-advertisements.test.mjs b/web/provider-advertisements.test.mjs index f72a7aa..bfeac43 100644 --- a/web/provider-advertisements.test.mjs +++ b/web/provider-advertisements.test.mjs @@ -4,37 +4,9 @@ import test from "node:test"; import { findProviderCatalogEntry, mergeProviderAdvertisement } from "./provider-advertisements.mjs"; const catalog = JSON.parse(readFileSync(new URL("./local-provider-catalog.json", import.meta.url), "utf8")); -const aetheriaAdvertisement = JSON.parse(readFileSync(new URL("./fixtures/aetheria.provider-advertisement.json", import.meta.url), "utf8")); -const aetheriaUnityAssetManifest = JSON.parse(readFileSync(new URL("./fixtures/aetheria.unity-playable-world-asset-manifest.json", import.meta.url), "utf8")); const worldSmokeAdvertisement = JSON.parse(readFileSync(new URL("./fixtures/eve-world-smoke.provider-advertisement.json", import.meta.url), "utf8")); const saiAdvertisement = JSON.parse(readFileSync(new URL("./fixtures/sai-vn.provider-advertisement.json", import.meta.url), "utf8")); -test("merges local fixture transport with advertised Aetheria world interaction", () => { - const catalogProvider = findProviderCatalogEntry(catalog, "aetheria"); - const provider = mergeProviderAdvertisement(catalogProvider, aetheriaAdvertisement); - const surface = provider.surfaces.find(candidate => candidate.surfaceId === "aetheria.daemon.game"); - - assert.equal(surface.transport, "local-json"); - assert.equal(surface.url, "./fixtures/aetheria-world-surface.json"); - assert.equal(surface.surfaceKind, "interactive-world"); - assert.equal(surface.worldInteraction.projectionKind, "provider-authored-world-surface"); - assert.equal(surface.worldInteraction.commandBoundary, "aetheria.daemon.commands"); - assert.equal(surface.worldInteraction.receiptSchema, "aetheria.eve_command_acceptance_status.v1"); - assert.equal(provider.localAdvertisement.providerId, "aetheria"); - assert.ok(aetheriaAdvertisement.schemas.includes("gamecult.eve.unity_playable_world_asset_manifest.v1")); -}); - -test("loads Aetheria Unity playable world asset manifest as provider-authored data", () => { - assert.equal(aetheriaUnityAssetManifest.schema, "gamecult.eve.unity_playable_world_asset_manifest.v1"); - assert.equal(aetheriaUnityAssetManifest.providerId, "aetheria"); - assert.equal(aetheriaUnityAssetManifest.manifestRef, "cultmesh://aetheria/assets/manifest"); - - const byKind = new Map(aetheriaUnityAssetManifest.entries.map(entry => [entry.entityKind, entry])); - assert.equal(byKind.get("player").assetRef, "cultmesh://aetheria/assets/map/entity/player"); - assert.equal(byKind.get("player").resourcesPath, "resources://Aetheria/Entities/Vanguard.prefab"); - assert.equal(byKind.get("enemy").prefabKey, "aetheria.raider"); -}); - test("merges generic world fixture transport with advertised world interaction", () => { const catalogProvider = findProviderCatalogEntry(catalog, "eve.world-smoke"); const provider = mergeProviderAdvertisement(catalogProvider, worldSmokeAdvertisement);