Add EveUnity lifecycle split proof

This commit is contained in:
Meta Vens 2026-07-09 01:30:52 +01:00
commit 96f1eb6927
4 changed files with 131 additions and 0 deletions

View file

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

View file

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

View file

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

View file

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