Record Aetheria Unity consumer boundary

This commit is contained in:
Meta Vens 2026-07-09 15:40:38 +01:00
commit 7e18a3e067
7 changed files with 94 additions and 7 deletions

View file

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

View file

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

View file

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

View file

@ -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."
]
}

View file

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

View file

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

View file

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