Track Aetheria Unity asset manifest record

This commit is contained in:
Meta Vens 2026-07-09 22:22:03 +01:00
commit 826e0791aa
2 changed files with 70 additions and 23 deletions

View file

@ -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

View file

@ -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<AetheriaRuntimeAssetManifestDocument> assetManifest",
"AssetManifest = assetManifest",
"public CultMeshDocumentHandle<AetheriaRuntimeAssetManifestDocument> 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<AetheriaRuntimeAssetManifestDocument>",
"AetheriaRuntimeVerseRecordKeys.DaemonAssetManifest"
)) {
if (-not $runtimeVerseClient.Contains($symbol)) {
throw "Aetheria runtime Verse client is not publishing the daemon asset manifest record: $symbol"
}
}