From 96f1eb6927c1efd2e590c92d7df62b45230ee52a Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 01:30:52 +0100 Subject: [PATCH] Add EveUnity lifecycle split proof --- docs/eve-migration-roadmap.md | 8 ++ .../README.md | 12 +++ scripts/run-eveunity-lifecycle-smoke.ps1 | 99 +++++++++++++++++++ tools/parity/parity-manifest.json | 12 +++ 4 files changed, 131 insertions(+) create mode 100644 scripts/run-eveunity-lifecycle-smoke.ps1 diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index 2164f5d..f688113 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -280,6 +280,14 @@ Exit criteria: Recently cut: +- EveUnity now has a split lifecycle smoke at + `scripts/run-eveunity-lifecycle-smoke.ps1`. It validates the existing + `packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json` + lifecycle claims directly instead of duplicating them, checks evidence paths, + and runs the Aetheria Unity package consumer-build smoke. `-RunUnityEditMode` + is available for the heavier Unity batchmode path. EveUnity remains + incubating until tagged UPM release, batchmode runner ownership, and capture + artifacts live under the `EveUnity` repo. - EveFlutter now has explicit lifecycle incubation evidence at `flutter/eve_parity/eveflutter-lifecycle.json` and a smoke runner at `scripts/run-eveflutter-lifecycle-smoke.ps1`. The smoke validates the diff --git a/packages/org.gamecult.eve.unity-uitoolkit/README.md b/packages/org.gamecult.eve.unity-uitoolkit/README.md index 49f4edf..4d971b0 100644 --- a/packages/org.gamecult.eve.unity-uitoolkit/README.md +++ b/packages/org.gamecult.eve.unity-uitoolkit/README.md @@ -45,6 +45,18 @@ evidence: Those lifecycle claims are validated by the parity harness. A missing evidence path is a runtime capability error, not a README footnote. +From the repository root, run the split lifecycle smoke with: + +```powershell +powershell -ExecutionPolicy Bypass -File .\scripts\run-eveunity-lifecycle-smoke.ps1 +``` + +That smoke validates `eve-runtime-capability.json`, checks lifecycle evidence +paths, and runs the Aetheria Unity package consumer-build smoke. Pass +`-RunUnityEditMode` when the local Unity editor should also execute the +incubating batchmode EditMode test runner. The final tagged UPM release, +batchmode runner ownership, and capture artifact still graduate to `EveUnity`. + For Aetheria, the Unity evidence path is: - `powershell -ExecutionPolicy Bypass -File ..\..\scripts\run-aetheria-unity-package-smoke.ps1` diff --git a/scripts/run-eveunity-lifecycle-smoke.ps1 b/scripts/run-eveunity-lifecycle-smoke.ps1 new file mode 100644 index 0000000..4401f8c --- /dev/null +++ b/scripts/run-eveunity-lifecycle-smoke.ps1 @@ -0,0 +1,99 @@ +param( + [string] $CapabilityManifestPath = "packages\org.gamecult.eve.unity-uitoolkit\eve-runtime-capability.json", + [switch] $RunUnityEditMode +) + +$ErrorActionPreference = "Stop" + +$projectRoot = Split-Path -Parent $PSScriptRoot +$absoluteManifestPath = if ([System.IO.Path]::IsPathRooted($CapabilityManifestPath)) { + $CapabilityManifestPath +} else { + Join-Path $projectRoot $CapabilityManifestPath +} + +if (-not (Test-Path -LiteralPath $absoluteManifestPath)) { + throw "EveUnity runtime capability manifest not found: $absoluteManifestPath" +} + +$manifest = Get-Content -LiteralPath $absoluteManifestPath -Raw | ConvertFrom-Json + +if ($manifest.schema -ne "gamecult.eve.runtime_capability.v1") { + throw "Unexpected EveUnity manifest schema: $($manifest.schema)" +} +if ($manifest.runtimeId -ne "unity-uitoolkit") { + throw "Unexpected EveUnity runtime id: $($manifest.runtimeId)" +} +if ($manifest.owner -ne "EveUnity") { + throw "Unexpected EveUnity owner: $($manifest.owner)" +} +if ($manifest.incubation.ownerRepo -ne "EveUnity") { + throw "Unexpected EveUnity incubation owner: $($manifest.incubation.ownerRepo)" +} +if ($manifest.incubation.currentHostRepo -ne "Eve") { + throw "Unexpected EveUnity current host repo: $($manifest.incubation.currentHostRepo)" +} +if ($manifest.incubation.splitTarget -ne "EveUnity") { + throw "Unexpected EveUnity split target: $($manifest.incubation.splitTarget)" +} + +foreach ($feature in @("embeddedDocuments")) { + if (-not ($manifest.supportedFeatures -contains $feature)) { + throw "EveUnity manifest missing supported feature: $feature" + } +} + +$pluginClaims = @{} +foreach ($plugin in $manifest.supportedPlugins) { + $pluginClaims[$plugin.pluginId] = @($plugin.capabilities) +} +foreach ($claim in @( + @{ pluginId = "sai.vn"; capabilities = @("vn.stage", "story.choose", "story.continue", "story.jump") }, + @{ pluginId = "norn.graph"; capabilities = @("embed.norn") } +)) { + if (-not $pluginClaims.ContainsKey($claim.pluginId)) { + throw "EveUnity manifest missing plugin claim: $($claim.pluginId)" + } + foreach ($capability in $claim.capabilities) { + if (-not ($pluginClaims[$claim.pluginId] -contains $capability)) { + throw "EveUnity manifest missing plugin capability: $($claim.pluginId):$capability" + } + } +} + +if ($manifest.commandTransport.schema -ne "gamecult.eve.command.v1") { + throw "Unexpected EveUnity command schema: $($manifest.commandTransport.schema)" +} + +foreach ($stage in @("release", "test", "capture")) { + $stageDocument = $manifest.lifecycle.$stage + if ($null -eq $stageDocument) { + throw "EveUnity lifecycle missing stage: $stage" + } + if ($stageDocument.ownerRepo -ne "EveUnity") { + throw "EveUnity lifecycle stage $stage has unexpected owner: $($stageDocument.ownerRepo)" + } + if (-not $stageDocument.status) { + throw "EveUnity lifecycle stage $stage missing status" + } + foreach ($evidencePath in $stageDocument.evidencePaths) { + $absoluteEvidencePath = Join-Path $projectRoot $evidencePath + if (-not (Test-Path -LiteralPath $absoluteEvidencePath)) { + throw "EveUnity lifecycle stage $stage missing evidence path: $evidencePath" + } + } +} + +& (Join-Path $projectRoot "scripts\run-aetheria-unity-package-smoke.ps1") +if ($LASTEXITCODE -ne 0) { + throw "Aetheria Unity package smoke failed with exit code $LASTEXITCODE" +} + +if ($RunUnityEditMode) { + & (Join-Path $projectRoot "scripts\run-aetheria-unity-editmode-tests.ps1") + if ($LASTEXITCODE -ne 0) { + throw "Aetheria Unity EditMode smoke failed with exit code $LASTEXITCODE" + } +} + +Write-Host "EveUnity lifecycle smoke passed: $absoluteManifestPath" diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index c66d0dc..8304323 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -493,6 +493,18 @@ "capabilities": ["embed.norn"] } ], + "proofs": [ + { + "description": "Unity lifecycle evidence is declared and smoke-checked for EveUnity incubation.", + "status": "passed", + "evidencePaths": [ + "packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json", + "scripts/run-eveunity-lifecycle-smoke.ps1", + "scripts/run-aetheria-unity-package-smoke.ps1", + "scripts/run-aetheria-unity-editmode-tests.ps1" + ] + } + ], "pendingProofs": [ "Tagged UPM release is cut from EveUnity rather than Eve incubation.", "Unity batchmode EditMode runner is owned by EveUnity rather than Eve incubation.",