From 96839ad34c8d464ef622d8bbdd5d277e1ca9d825 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Wed, 26 Aug 2026 20:58:26 +0200 Subject: [PATCH] Align EveUnity ownership verifier --- docs/eve-migration-roadmap.md | 16 ++++----- docs/plugin-architecture.md | 2 +- .../org.gamecult.eve.surface/package.json | 2 +- scripts/run-eveunity-owner-smoke.ps1 | 35 ++++++++++++------- 4 files changed, 31 insertions(+), 24 deletions(-) diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index ec944c9..ec4fa43 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -51,17 +51,15 @@ advertisements and typed command/receipt documents are the boundary. movement, targeting, and fire command receipts. - EveUnity's clean `TestProject` owns generic scene and UI Toolkit package verification; ordinary runtime tests no longer open or mutate Aetheria. -- EveUnity publishes immutable `0.1.0` Git package tags for surface and UI - Toolkit plus scene `0.1.4`, whose generic CultMesh composition root discovers - playable worlds without product identifiers. Its release-only consumer - resolves those tags plus CultLib's assembled Unity package and passes 30 - Unity EditMode tests without sibling package paths. Aetheria pins the same - released sources. -- The same released-package consumer cold-starts from Aetheria's CultMesh +- Eve owns the renderer-neutral surface package. EveUnity publishes the Unity + UI Toolkit and scene lowerers from one immutable repository commit; its + isolated consumer resolves those packages plus CultLib without borrowing a + provider's source tree. Aetheria pins the same owner commits. +- The same isolated-package consumer cold-starts from Aetheria's CultMesh rendezvous endpoint with no configured provider or surface ID, discovers the daemon's `interactive-world`, loads provider-owned assets, and reconciles movement, targeting, and action receipts without importing Aetheria code. -- Aetheria pins the same scene `0.1.4` release; no Aetheria Unity component +- Aetheria pins the same EveUnity commit; no Aetheria Unity component constructs the generic CultMesh client transport used by that witness. - EveUnity can start from one CultMesh rendezvous endpoint, discover a Verse, select an advertised `interactive-world` surface, and connect without @@ -124,7 +122,7 @@ advertisements and typed command/receipt documents are the boundary. resources, asset overlays, and capability-gap reporting. The general CultUI lowerer dispatches plugin component kinds without field-specific branches. - EvePlugins publishes runtime-neutral C# fields contracts as UPM and .NET - packages. EveUnity scene `0.1.4` owns the second native adapter: structured + packages. EveUnity scene owns the second native adapter: structured splat buffers, RenderTexture rasterization, layer texture allocation, and the generic fields shader. Aetheria implements the plugin interfaces and retains only a MonoScript-GUID diff --git a/docs/plugin-architecture.md b/docs/plugin-architecture.md index c102a7b..4cb6288 100644 --- a/docs/plugin-architecture.md +++ b/docs/plugin-architecture.md @@ -646,7 +646,7 @@ Long-term renderer/client bodies should split out when they become real apps: - `EveElectron2D` or Aetheria-owned Electron client for RTS/editor/operator 2D. - `EveUnityUIToolkit` for Unity UI Toolkit 2D lowering. -- `EveUnityScene` or Aetheria-owned Unity scene frontend for full game 2D/3D. +- `EveUnityScene` for provider-agnostic full-game 2D/3D lowering. - `EveGodot` for Godot lowering. - `Fensalir` for Direct2D/native runtime lowering if Fensalir remains the body. - `EveWebReference` can stay in Eve core as the canonical reference renderer diff --git a/packages/org.gamecult.eve.surface/package.json b/packages/org.gamecult.eve.surface/package.json index fdbc322..a85cf5b 100644 --- a/packages/org.gamecult.eve.surface/package.json +++ b/packages/org.gamecult.eve.surface/package.json @@ -5,7 +5,7 @@ "unity": "2021.3", "description": "Renderer-neutral C# contracts and builders for gamecult.eve.surface.v1 documents.", "dependencies": { - "org.gamecult.cultlib": "1.0.45" + "org.gamecult.cultlib": "1.0.56" }, "files": [ "Runtime", diff --git a/scripts/run-eveunity-owner-smoke.ps1 b/scripts/run-eveunity-owner-smoke.ps1 index e256fa4..ab2caec 100644 --- a/scripts/run-eveunity-owner-smoke.ps1 +++ b/scripts/run-eveunity-owner-smoke.ps1 @@ -1,12 +1,12 @@ param( [string] $EveUnityRoot = "E:\Projects\EveUnity", - [string] $AetheriaRoot = "E:\Projects\Aetheria" + [string] $AetheriaRoot = "E:\Projects\AetheriaEve" ) $ErrorActionPreference = "Stop" +$projectRoot = Split-Path -Parent $PSScriptRoot $requiredOwnerPaths = @( - "packages\org.gamecult.eve.surface\package.json", "packages\org.gamecult.eve.unity-uitoolkit\package.json", "packages\org.gamecult.eve.unity-uitoolkit\eve-runtime-capability.json", "packages\org.gamecult.eve.unity-scene\package.json", @@ -25,18 +25,27 @@ foreach ($relativePath in $requiredOwnerPaths) { } } -$aetheriaManifest = Get-Content (Join-Path $AetheriaRoot "Packages\manifest.json") -Raw | ConvertFrom-Json -$expectedDependencies = @{ - "org.gamecult.eve.surface" = "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.surface#eveunity-surface-v0.1.0" - "org.gamecult.eve.unity-uitoolkit" = "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-uitoolkit#eveunity-uitoolkit-v0.1.0" - "org.gamecult.eve.plugin-fields" = "https://github.com/GameCult/EvePlugins.git?path=/plugins/eve-plugin-fields/unity/org.gamecult.eve.plugin-fields#eve-plugin-fields-unity-v0.1.1" - "org.gamecult.eve.unity-scene" = "https://github.com/GameCult/EveUnity.git?path=/packages/org.gamecult.eve.unity-scene#eveunity-scene-v0.1.4" +$deletedSurfacePackage = Join-Path $EveUnityRoot "packages\org.gamecult.eve.surface" +if (Test-Path -LiteralPath $deletedSurfacePackage) { + throw "EveUnity must consume Eve's renderer-neutral surface package instead of vendoring it: $deletedSurfacePackage" } -foreach ($entry in $expectedDependencies.GetEnumerator()) { - $actual = $aetheriaManifest.dependencies.($entry.Key) - if ($actual -ne $entry.Value) { - throw "Aetheria dependency $($entry.Key) resolves to '$actual', expected '$($entry.Value)'." +$eveSurface = Get-Content (Join-Path $projectRoot "packages\org.gamecult.eve.surface\package.json") -Raw | ConvertFrom-Json +$unityScene = Get-Content (Join-Path $EveUnityRoot "packages\org.gamecult.eve.unity-scene\package.json") -Raw | ConvertFrom-Json +$unityToolkit = Get-Content (Join-Path $EveUnityRoot "packages\org.gamecult.eve.unity-uitoolkit\package.json") -Raw | ConvertFrom-Json +if ($eveSurface.dependencies.'org.gamecult.cultlib' -ne '1.0.56') { + throw "Eve surface must declare the admitted CultLib 1.0.56 contract." +} +if ($unityScene.dependencies.'org.gamecult.eve.surface' -ne $eveSurface.version -or + $unityToolkit.dependencies.'org.gamecult.eve.surface' -ne $eveSurface.version) { + throw "Every EveUnity package must declare Eve surface $($eveSurface.version)." +} + +$aetheriaManifest = Get-Content (Join-Path $AetheriaRoot "Aetheria.Unity\Packages\manifest.json") -Raw | ConvertFrom-Json +foreach ($packageName in @('org.gamecult.eve.surface', 'org.gamecult.eve.unity-scene', 'org.gamecult.eve.unity-uitoolkit')) { + $actual = $aetheriaManifest.dependencies.$packageName + if ($actual -notmatch '^https://github\.com/GameCult/(Eve|EveUnity)\.git\?path=/.+#[0-9a-f]{40}$') { + throw "Aetheria dependency $packageName must resolve from its owner repository at an immutable commit, found '$actual'." } } @@ -45,4 +54,4 @@ if ($LASTEXITCODE -ne 0) { throw "EveUnity UI Toolkit package smoke failed." } -Write-Host "EveUnity owns tagged Unity packages and Aetheria consumes their immutable releases." +Write-Host "Eve owns the surface contract; EveUnity owns Unity lowering; Aetheria consumes both at immutable commits."