diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index 98c1707..b0c1285 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -249,8 +249,8 @@ Work: - Repixelizer owns job/session/artifact/operator fixtures once they carry real product state or receipts. -- Aetheria owns RTS/ARPG world surfaces, assets, generated level state, command - receipts, and scenario conformance. +- Aetheria owns RTS/ARPG world surfaces, daemon-published asset manifest + records, generated level state, command receipts, and scenario conformance. - Huginn owns `.cc` and Persona-state inspection fixture packs when they depend on runtime stewardship details. - Mimir owns sensor/media/control surfaces that depend on live stream timing or @@ -679,11 +679,16 @@ Recently cut: document needs: surface kind, projection kind, command boundary, receipt schema, ownership, lowering targets, state schemas, and record pointer. The Aetheria Unity bridge now selects that provider-owned advertisement instead of - fabricating the Unity scene metadata locally. The next blocker is concrete - CultMesh/CultCache live reading: provider surface and asset manifest documents - must be consumed through real live record readers, then provider receipts plus - daemon snapshots must drive rendered Unity frames rather than renderer-local - simulation. + fabricating the Unity scene metadata locally. The asset manifest leg is now a + first-class live transport proof rather than a local catalog projection: + Aetheria client state exposes `AssetManifest`, the provider bridge reads + `runtimeState.AssetManifest.Latest()`, and the Unity manifest document points + at `AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest`. EveUnity still + consumes only the generic provider/plugin contracts and sidecar transport + ports; Aetheria keeps the gameplay and asset authority. The remaining blocker + is rendered-frame proof from the future EveUnity owner repo, with provider + receipts plus daemon snapshots driving Unity frames rather than + renderer-local simulation. - EveElectron capture lifecycle now carries the same kind of structured pending capture contract. `captureContract` names the Electron shell runtime, capture kind, PNG artifact pattern, conformance attachment point, required Aetheria @@ -1007,10 +1012,11 @@ Recently cut: - Aetheria now also carries the real provider-side proof for the target shape: a generic `EveUnityPlayableWorldRuntime` lowers the daemon-published 3D ARPG world surface through the Aetheria Eve provider bridge, resolves - provider-owned playable-world asset refs, submits movement through the - advertised `gamecult.eve.command.v1` boundary, observes provider-owned - receipts, and refreshes from daemon snapshots without importing Aetheria - product authority into EveUnity. Eve records this as the + provider-owned playable-world asset refs through the daemon-published + `AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest` record, submits movement + through the advertised `gamecult.eve.command.v1` boundary, observes + provider-owned receipts, and refreshes from daemon snapshots without + importing Aetheria product authority into EveUnity. Eve records this as the `aetheria-playable-world-consumer-proof` observed-provider move set in `runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json`, and the split-target plus Aetheria consumer smokes assert it from the conformance @@ -1018,10 +1024,13 @@ Recently cut: the future EveUnity owner repo, not whether the Unity client is generic. - Aetheria now has repeatable Unity package consumer-build evidence for the Eve UI Toolkit runtime. `scripts/run-aetheria-unity-package-smoke.ps1` - verifies Aetheria's Unity `Packages/manifest.json` consumes Eve's surface and - UI Toolkit packages by file reference, checks the generated - `GameCult.Eve.UnityUIToolkit.csproj` includes all current runtime files, and - builds the package through Aetheria's Unity-generated project. + verifies Aetheria's Unity `Packages/manifest.json` consumes Eve's surface, + Unity scene, and UI Toolkit packages by file reference, checks the generated + Unity projects include all current runtime files, asserts the Aetheria Unity + bridge reads `runtimeState.AssetManifest.Latest()` from client state + `AssetManifest` and publishes the + `AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest` pointer, then builds the + packages through Aetheria's Unity-generated projects. - The EveUnity UI Toolkit split handoff now records Aetheria's Unity consumer boundary as `observed-provider` evidence. The handoff names Aetheria's package manifest, generated Unity project, assets root, daemon catalog diff --git a/scripts/run-aetheria-unity-package-smoke.ps1 b/scripts/run-aetheria-unity-package-smoke.ps1 index b6ed95c..60c95b2 100644 --- a/scripts/run-aetheria-unity-package-smoke.ps1 +++ b/scripts/run-aetheria-unity-package-smoke.ps1 @@ -17,9 +17,12 @@ $aetheriaEveRuntimePackage = Join-Path $AetheriaRoot "Packages\org.gamecult.aeth $aetheriaEveRuntimeAsmdef = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.eve-runtime\Runtime\GameCult.Aetheria.EveRuntime.asmdef" $aetheriaSceneBridge = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.eve-runtime\Runtime\AetheriaEveUnitySceneProviderBridge.cs" $aetheriaSceneProviderComponent = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.eve-runtime\Runtime\AetheriaEveUnitySceneProviderComponent.cs" +$aetheriaClientState = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.state\Runtime\AetheriaClientState.cs" $aetheriaSurfaceCatalog = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeEveSurfaceCatalog.cs" $aetheriaGameSurfaceBuilder = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeDaemonGameSurfaceBuilder.cs" $aetheriaDaemonOperationsClient = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeDaemonOperationsClient.cs" +$aetheriaDaemonDocuments = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeDaemonDocuments.cs" +$aetheriaRuntimeVerseClient = Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeVerseClient.cs" if (-not (Test-Path $manifestPath)) { throw "Aetheria Unity package manifest not found: $manifestPath" } @@ -44,6 +47,9 @@ if (-not (Test-Path $aetheriaSceneBridge)) { if (-not (Test-Path $aetheriaSceneProviderComponent)) { throw "Aetheria Eve Unity scene provider component not found: $aetheriaSceneProviderComponent" } +if (-not (Test-Path $aetheriaClientState)) { + throw "Aetheria client state not found: $aetheriaClientState" +} if (-not (Test-Path $aetheriaSurfaceCatalog)) { throw "Aetheria Eve surface catalog not found: $aetheriaSurfaceCatalog" } @@ -53,6 +59,12 @@ if (-not (Test-Path $aetheriaGameSurfaceBuilder)) { if (-not (Test-Path $aetheriaDaemonOperationsClient)) { throw "Aetheria daemon operations client not found: $aetheriaDaemonOperationsClient" } +if (-not (Test-Path $aetheriaDaemonDocuments)) { + throw "Aetheria daemon documents not found: $aetheriaDaemonDocuments" +} +if (-not (Test-Path $aetheriaRuntimeVerseClient)) { + throw "Aetheria runtime Verse client not found: $aetheriaRuntimeVerseClient" +} $manifest = Get-Content -Raw -LiteralPath $manifestPath | ConvertFrom-Json $requiredDependencies = @{ @@ -136,7 +148,11 @@ foreach ($symbol in @( "Disconnect", "SubmitCommand", "ReadAdvertisedSurface", + "ReadAssetManifest", "runtimeState.ProviderAdvertisement.Latest", + "runtimeState.AssetManifest.Latest", + "AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest", + "ToUnityPlayableWorldAssetManifest", "WorldInteraction", "AetheriaEveRuntimeUnityHooks.RequireControl", "ToReceipt(request, daemonEnvelope)", @@ -198,6 +214,7 @@ foreach ($symbol in @( '"world.entity3d"', '"movementCommand"', '"assetManifest"', + '["assetManifest"] = AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest.ToString()', '"arpg.pointer-keyboard.v1"', '"arpg.orbital-follow.v1"', 'SetMoveVector', @@ -227,16 +244,37 @@ foreach ($symbol in @( } } -$aetheriaAssets = Get-Content -Raw -LiteralPath (Join-Path $AetheriaRoot "Packages\org.gamecult.aetheria.state\Runtime\AetheriaRuntimeAssets.cs") +$clientState = Get-Content -Raw -LiteralPath $aetheriaClientState foreach ($symbol in @( - '"prefab.entity.player"', - '"Prefabs/Ships/Djinni"', - '"prefab.entity.station"', - '"Prefabs/Stations/AsteroidOutpost"', - '"resourcesPath"' + "CultMeshDocumentHandle assetManifest", + "AssetManifest = assetManifest", + "public CultMeshDocumentHandle AssetManifest" )) { - if (-not $aetheriaAssets.Contains($symbol)) { - throw "Aetheria asset manifest is not publishing Unity playable world asset symbol: $symbol" + if (-not $clientState.Contains($symbol)) { + throw "Aetheria client state is not exposing provider-published asset manifest state: $symbol" + } +} + +$daemonDocuments = Get-Content -Raw -LiteralPath $aetheriaDaemonDocuments +foreach ($symbol in @( + "AssetManifestRecordRef", + "AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest.ToString()", + "AetheriaRuntimeDaemonSchemas.AssetManifest" +)) { + if (-not $daemonDocuments.Contains($symbol)) { + throw "Aetheria daemon documents are not advertising the asset manifest record: $symbol" + } +} + +$runtimeVerseClient = Get-Content -Raw -LiteralPath $aetheriaRuntimeVerseClient +foreach ($symbol in @( + "DaemonAssetManifest", + 'new CultRecordKey("daemon:aetheria.asset_manifest.latest.v1")', + "Document", + "AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest" +)) { + if (-not $runtimeVerseClient.Contains($symbol)) { + throw "Aetheria runtime Verse client is not publishing the daemon asset manifest record: $symbol" } }