diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index f1d7e23..96d08b8 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -195,9 +195,10 @@ Work: - Move `tex.math` to EvePlugins when TeX source, macro, baseline, cached render, and fallback fixtures are stable. - Treat nested plugin placement as composition, not custody. A Sai surface may - deploy with nested Norn or TeX surfaces when those plugin sidecars are - available, but Norn and TeX remain independent plugin owners with their own - ABI manifests, capability claims, and conformance packs. + deploy with nested Norn or TeX surfaces when those independent plugin + sidecars are available, but Sai does not depend on them for VN authority and + does not own their graph or math semantics. Norn and TeX keep their own ABI + manifests, capability claims, and conformance packs. Exit criteria: @@ -207,6 +208,9 @@ Exit criteria: - Unsupported required plugin capabilities appear as visible gaps. - Optional nested plugin gaps degrade the nested surface; they do not transfer graph, math, or renderer semantics into the parent plugin. +- A provider may mark a nested plugin slot as optional or required for a + specific surface, but that availability policy is provider composition, not + Sai ownership of Norn or TeX. ## Phase 4: Graduate Runtime Bodies @@ -840,6 +844,15 @@ Recently cut: 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. +- 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 + client, and Unity smoke as provider-owned pressure sources that prove a real + game consumes EveUnity without making those Aetheria paths EveUnity source. + `scripts/run-eveunity-split-handoff-smoke.ps1`, + `scripts/run-split-target-conformance-consumer-smoke.ps1`, and + `scripts/run-aetheria-conformance-consumer-smoke.ps1` assert that boundary + from the manifest/export. - Unity UI Toolkit now has a first-party `norn.graph` projection-adapter proof for `embed.norn`. `NornGraphUiToolkitProjectionAdapter` owns the native embedded graph shell and graph command emission path, while the Norn sidecar @@ -874,8 +887,10 @@ Recently cut: Eve's parity manifest or dirtying the Aetheria worktree. - The Aetheria consumer smoke now also asserts frontend extraction boundaries: web, Unity UI Toolkit, Unity scene, and Electron shell are covered generic - lowerings, while the observed Aetheria Electron shell/client paths remain - split-handoff evidence to replace with a provider-agnostic EveElectron body. + lowerings. Observed Aetheria Unity and Electron product paths remain + provider-owned split-handoff evidence to replace with provider-agnostic + EveUnity/EveElectron bodies where runtime code still lives in the wrong + place. - The parity harness now runs a conformance consumer smoke against a copied `artifacts/conformance/latest` layout, proving the export can be consumed through `index.json` and `packs/*.json` without reading Eve's parity manifest. diff --git a/docs/parity-testing-harness.md b/docs/parity-testing-harness.md index 491ad70..734638d 100644 --- a/docs/parity-testing-harness.md +++ b/docs/parity-testing-harness.md @@ -328,6 +328,12 @@ a narrow provider-advertised surface-tree command surface and exposes a typed capture request contract plus a schema-backed JSON shell projection artifact. It preserves embedded document slot identity in the generic shell projection, while packaged rendering and actual window PNG capture remain blockers. +EveUnity's UI Toolkit handoff does the same for Aetheria's Unity consumer +boundary: Aetheria's Unity `Packages/manifest.json`, generated +`GameCult.Eve.UnityUIToolkit.csproj`, assets root, daemon catalog client, and +Unity smoke are exported as `observed-provider` paths. That proves a real game +consumes the generic EveUnity package/contract while keeping product state, +assets, generated projects, scenes, and receipts in Aetheria. EveTui is now an active incubating runtime: it claims a lossy provider-advertised terminal-grid command surface, preserves embedded document slot identity in the grid artifact, projects Sai/Norn/TeX fallback shells, and diff --git a/docs/plugin-architecture.md b/docs/plugin-architecture.md index 3b72062..1c02050 100644 --- a/docs/plugin-architecture.md +++ b/docs/plugin-architecture.md @@ -459,6 +459,11 @@ Sai surface deploys with nested Norn or TeX, Sai composes the slots and keeps VN stage authority; Norn and TeX still publish, validate, lower, and receive commands through their own plugin contracts. +Nested availability is a composition fact, not a Sai dependency story. A Sai +surface can be deployed with a nested Norn or TeX surface only when that other +plugin is available or when the provider deliberately accepts degraded nested +fallback behavior. + Norn plugin responsibilities: - define `embed.norn` semantics; diff --git a/packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json b/packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json index c1d48a4..b02c913 100644 --- a/packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json +++ b/packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json @@ -7,7 +7,7 @@ "packageName": "org.gamecult.eve.unity-uitoolkit", "sourcePackageRoot": "packages/org.gamecult.eve.unity-uitoolkit", "destinationPackageRoot": "packages/org.gamecult.eve.unity-uitoolkit", - "authorityBoundary": "EveUnity owns native Unity projection, UPM package lifecycle, Unity test runners, Unity capture, and projection adapters for advertised plugin capabilities. Eve keeps the surface, command, provider advertisement, plugin advertisement, and conformance contracts.", + "authorityBoundary": "EveUnity owns native Unity projection, UPM package lifecycle, Unity test runners, Unity capture, and projection adapters for advertised plugin capabilities. Eve keeps the surface, command, provider advertisement, plugin advertisement, and conformance contracts. Provider Unity projects such as Aetheria consume EveUnity through those contracts while keeping product state, assets, scenes, generated project files, and daemon clients in the provider repo.", "moveSets": [ { "id": "upm-package", @@ -47,6 +47,23 @@ ], "destinationOwner": "EveUnity", "replacementProof": "Unity batchmode or editor capture artifact attached to the runtime conformance report." + }, + { + "id": "aetheria-unity-consumer-boundary", + "stage": "provider-consumer", + "currentPaths": [ + "scripts/run-aetheria-unity-package-smoke.ps1", + "scripts/run-aetheria-unity-editmode-tests.ps1" + ], + "observedProviderPaths": [ + "E:\\Projects\\Aetheria\\Packages\\manifest.json", + "E:\\Projects\\Aetheria\\GameCult.Eve.UnityUIToolkit.csproj", + "E:\\Projects\\Aetheria\\Assets", + "E:\\Projects\\Aetheria\\Aetheria.State.Unity\\AetheriaRuntimeCatalogClient.cs", + "E:\\Projects\\Aetheria\\Aetheria.State.Unity.Smoke\\Program.cs" + ], + "destinationOwner": "EveUnity", + "replacementProof": "Aetheria consumes EveUnity through package and conformance contracts while keeping Unity product project files, generated projects, assets, scenes, daemon catalog clients, and provider receipts in Aetheria." } ], "contractInputs": [ @@ -67,6 +84,7 @@ "EveUnity publishes a tagged UPM release.", "EveUnity owns the Unity batchmode EditMode runner.", "EveUnity attaches Unity editor or batchmode capture artifacts to conformance output.", - "Aetheria consumes EveUnity through the package contract without importing Eve source layout." + "Aetheria consumes EveUnity through the package contract without importing Eve source layout.", + "Aetheria Unity product paths remain provider-owned observed-provider evidence, not EveUnity source authority." ] } diff --git a/scripts/run-aetheria-conformance-consumer-smoke.ps1 b/scripts/run-aetheria-conformance-consumer-smoke.ps1 index 2d4cb5e..52241c8 100644 --- a/scripts/run-aetheria-conformance-consumer-smoke.ps1 +++ b/scripts/run-aetheria-conformance-consumer-smoke.ps1 @@ -89,6 +89,9 @@ try { --expect-split-handoff-move EveUnity:unity-scene:unity-scene-runtime-body:current:exists:EveUnitySceneSurfaceLowerer.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-world-surface-lowering:current:exists:EveUnitySceneSurfaceLowerer.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-command-transport:current:exists:EveUnitySceneSurfaceLowerer.cs ` + --expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:Packages/manifest.json ` + --expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:GameCult.Eve.UnityUIToolkit.csproj ` + --expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:Aetheria.State.Unity/AetheriaRuntimeCatalogClient.cs ` --expect-split-handoff-move EveElectron:electron-shell:electron-shell-runtime:current:exists:eve-electron-shell.mjs ` --expect-split-handoff-move EveElectron:electron-shell:electron-command-transport:current:exists:eve-electron-shell.mjs ` --expect-split-handoff-move EveElectron:electron-shell:electron-world-surface-lowering:current:exists:eve-electron-shell.mjs ` diff --git a/scripts/run-eveunity-split-handoff-smoke.ps1 b/scripts/run-eveunity-split-handoff-smoke.ps1 index d6efbf1..38a75a2 100644 --- a/scripts/run-eveunity-split-handoff-smoke.ps1 +++ b/scripts/run-eveunity-split-handoff-smoke.ps1 @@ -80,6 +80,43 @@ foreach ($stage in $expectedStages) { } } +$consumerBoundary = $moveSets | Where-Object { $_.id -eq "aetheria-unity-consumer-boundary" } | Select-Object -First 1 +if (-not $consumerBoundary) { + throw "EveUnity split handoff missing Aetheria Unity consumer-boundary move set" +} +if ($consumerBoundary.stage -ne "provider-consumer") { + throw "Aetheria Unity consumer-boundary move set has unexpected stage: $($consumerBoundary.stage)" +} +if ($consumerBoundary.destinationOwner -ne "EveUnity") { + throw "Aetheria Unity consumer-boundary has unexpected destination owner: $($consumerBoundary.destinationOwner)" +} +if (-not $consumerBoundary.replacementProof) { + throw "Aetheria Unity consumer-boundary missing replacement proof" +} +foreach ($relativePath in @($consumerBoundary.currentPaths)) { + $absolutePath = Join-Path $projectRoot $relativePath + if (-not (Test-Path -LiteralPath $absolutePath)) { + throw "Aetheria Unity consumer-boundary references missing current path: $relativePath" + } +} +foreach ($providerPath in @($consumerBoundary.observedProviderPaths)) { + if (-not ([System.IO.Path]::IsPathRooted($providerPath))) { + throw "Aetheria Unity observed provider path must be absolute: $providerPath" + } + if (-not (Test-Path -LiteralPath $providerPath)) { + throw "Aetheria Unity observed provider path is missing: $providerPath" + } +} +foreach ($requiredObservedPath in @( + "E:\Projects\Aetheria\Packages\manifest.json", + "E:\Projects\Aetheria\GameCult.Eve.UnityUIToolkit.csproj", + "E:\Projects\Aetheria\Assets" +)) { + if (-not (@($consumerBoundary.observedProviderPaths) -contains $requiredObservedPath)) { + throw "Aetheria Unity consumer-boundary missing required observed provider path: $requiredObservedPath" + } +} + foreach ($contract in @( "gamecult.eve.surface.v1", "gamecult.eve.command.v1", diff --git a/scripts/run-split-target-conformance-consumer-smoke.ps1 b/scripts/run-split-target-conformance-consumer-smoke.ps1 index 3497c37..b1d8c2a 100644 --- a/scripts/run-split-target-conformance-consumer-smoke.ps1 +++ b/scripts/run-split-target-conformance-consumer-smoke.ps1 @@ -53,6 +53,9 @@ try { --expect-split-handoff-move EveUnity:unity-scene:unity-scene-tex-plugin-projection:current:exists:TeXMathUnitySceneProjectionAdapter.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-command-transport:current:exists:EveUnitySceneSurfaceLowerer.cs ` --expect-split-handoff-move EveUnity:unity-scene:unity-scene-capture-lifecycle:current:exists:eveunity-capture-contract.mjs ` + --expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:Packages/manifest.json ` + --expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:GameCult.Eve.UnityUIToolkit.csproj ` + --expect-split-handoff-move EveUnity:unity-uitoolkit:aetheria-unity-consumer-boundary:observed-provider:exists:Aetheria.State.Unity/AetheriaRuntimeCatalogClient.cs ` --expect-split-target-blocker "EveUnity:Tagged UPM release" ` --expect-split-target-blocker "EveUnity:Unity batchmode EditMode runner" ` --expect-split-target-blocker "EveUnity:Unity batchmode or editor capture artifact" `