From 8767acedb262a4c5dd76a3e65d83ed45e2957b17 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 01:28:43 +0100 Subject: [PATCH] Add EveFlutter lifecycle split proof --- docs/eve-migration-roadmap.md | 8 ++ flutter/eve_parity/README.md | 13 ++++ flutter/eve_parity/eveflutter-lifecycle.json | 56 +++++++++++++ scripts/run-eveflutter-lifecycle-smoke.ps1 | 82 ++++++++++++++++++++ tools/parity/parity-manifest.json | 13 +++- 5 files changed, 171 insertions(+), 1 deletion(-) create mode 100644 flutter/eve_parity/eveflutter-lifecycle.json create mode 100644 scripts/run-eveflutter-lifecycle-smoke.ps1 diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index b1a3fda..2164f5d 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -280,6 +280,14 @@ Exit criteria: Recently cut: +- 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 + lifecycle document, checks release/test/capture evidence paths, runs Dart + analysis from the bundled SDK, and consumes the exported conformance pack from + inside `flutter/eve_parity`. The split-readiness blocker is now narrower: + tagged release, test runner ownership, and capture runner ownership must move + to `EveFlutter`, rather than pretending the lifecycle shape is still unknown. - EveFlutter now has a provider-catalog picker primitive. `EveProviderCatalog` parses conformance-export provider entries, including Sai/Norn/TeX plugin requirements, and `EveProviderPicker` selects those provider ids without diff --git a/flutter/eve_parity/README.md b/flutter/eve_parity/README.md index e1ba69b..80b9ce2 100644 --- a/flutter/eve_parity/README.md +++ b/flutter/eve_parity/README.md @@ -21,3 +21,16 @@ powershell -ExecutionPolicy Bypass -File .\scripts\capture-flutter-parity.ps1 -T Linux capture requires running the same harness on a Linux host. The Windows host must not pretend to be a Linux renderer. + +Split lifecycle evidence lives in `eveflutter-lifecycle.json`. From the +repository root, run: + +```powershell +powershell -ExecutionPolicy Bypass -File .\scripts\run-eveflutter-lifecycle-smoke.ps1 +``` + +That smoke validates the lifecycle document, checks release/test/capture +evidence paths, runs the Dart analyzer through the bundled Dart SDK, and consumes +the exported conformance pack from inside `flutter/eve_parity`. The document is +incubation evidence only: tagged release, test runner ownership, and capture +runner ownership still graduate to the `EveFlutter` repo. diff --git a/flutter/eve_parity/eveflutter-lifecycle.json b/flutter/eve_parity/eveflutter-lifecycle.json new file mode 100644 index 0000000..ee0c417 --- /dev/null +++ b/flutter/eve_parity/eveflutter-lifecycle.json @@ -0,0 +1,56 @@ +{ + "schema": "gamecult.eve.runtime_lifecycle.v1", + "splitTarget": "EveFlutter", + "ownerRepo": "EveFlutter", + "currentHostRepo": "Eve", + "status": "incubating", + "runtimes": [ + "windows-flutter", + "linux-flutter", + "android-flutter" + ], + "release": { + "ownerRepo": "EveFlutter", + "status": "incubating-flutter-app", + "evidencePaths": [ + "flutter/eve_parity/pubspec.yaml", + "flutter/eve_parity/README.md" + ], + "pendingProofs": [ + "Tagged EveFlutter release is cut from EveFlutter rather than Eve incubation." + ] + }, + "test": { + "ownerRepo": "EveFlutter", + "status": "dart-analyze-and-widget-smoke", + "commands": [ + "tools/deps/flutter/bin/cache/dart-sdk/bin/dart.exe analyze lib test", + "powershell -ExecutionPolicy Bypass -File scripts/run-eveflutter-conformance-consumer-smoke.ps1" + ], + "evidencePaths": [ + "flutter/eve_parity/lib/main.dart", + "flutter/eve_parity/test/parity_smoke_test.dart", + "scripts/run-eveflutter-conformance-consumer-smoke.ps1" + ], + "pendingProofs": [ + "Flutter test runner is owned by EveFlutter rather than Eve incubation." + ] + }, + "capture": { + "ownerRepo": "EveFlutter", + "status": "windows-linux-android-capture-smokes", + "evidencePaths": [ + "scripts/capture-flutter-parity.ps1", + "scripts/capture-linux-flutter-parity.ps1", + "scripts/capture-android-flutter-parity.ps1" + ], + "pendingProofs": [ + "Flutter capture runners are owned by EveFlutter rather than Eve incubation." + ] + }, + "remainingSplitBlockers": [ + "Tagged EveFlutter release is cut from EveFlutter rather than Eve incubation.", + "Flutter test runner is owned by EveFlutter rather than Eve incubation.", + "Flutter capture runners are owned by EveFlutter rather than Eve incubation." + ] +} diff --git a/scripts/run-eveflutter-lifecycle-smoke.ps1 b/scripts/run-eveflutter-lifecycle-smoke.ps1 new file mode 100644 index 0000000..b97435b --- /dev/null +++ b/scripts/run-eveflutter-lifecycle-smoke.ps1 @@ -0,0 +1,82 @@ +param( + [string] $LifecyclePath = "flutter\eve_parity\eveflutter-lifecycle.json", + [switch] $SkipAnalyze +) + +$ErrorActionPreference = "Stop" + +$projectRoot = Split-Path -Parent $PSScriptRoot +$absoluteLifecyclePath = if ([System.IO.Path]::IsPathRooted($LifecyclePath)) { + $LifecyclePath +} else { + Join-Path $projectRoot $LifecyclePath +} + +if (-not (Test-Path $absoluteLifecyclePath)) { + throw "EveFlutter lifecycle document not found: $absoluteLifecyclePath" +} + +$lifecycle = Get-Content -LiteralPath $absoluteLifecyclePath -Raw | ConvertFrom-Json + +if ($lifecycle.schema -ne "gamecult.eve.runtime_lifecycle.v1") { + throw "Unexpected lifecycle schema: $($lifecycle.schema)" +} +if ($lifecycle.splitTarget -ne "EveFlutter") { + throw "Unexpected split target: $($lifecycle.splitTarget)" +} +if ($lifecycle.ownerRepo -ne "EveFlutter") { + throw "Unexpected owner repo: $($lifecycle.ownerRepo)" +} +if ($lifecycle.currentHostRepo -ne "Eve") { + throw "Unexpected current host repo: $($lifecycle.currentHostRepo)" +} + +$expectedRuntimes = @("windows-flutter", "linux-flutter", "android-flutter") +foreach ($runtimeId in $expectedRuntimes) { + if (-not ($lifecycle.runtimes -contains $runtimeId)) { + throw "EveFlutter lifecycle missing runtime: $runtimeId" + } +} + +foreach ($stage in @("release", "test", "capture")) { + $stageDocument = $lifecycle.$stage + if ($null -eq $stageDocument) { + throw "EveFlutter lifecycle missing stage: $stage" + } + if ($stageDocument.ownerRepo -ne "EveFlutter") { + throw "EveFlutter lifecycle stage $stage has unexpected owner: $($stageDocument.ownerRepo)" + } + if (-not $stageDocument.status) { + throw "EveFlutter lifecycle stage $stage missing status" + } + foreach ($evidencePath in $stageDocument.evidencePaths) { + $absoluteEvidencePath = Join-Path $projectRoot $evidencePath + if (-not (Test-Path $absoluteEvidencePath)) { + throw "EveFlutter lifecycle stage $stage missing evidence path: $evidencePath" + } + } +} + +if (-not $SkipAnalyze) { + $dart = Join-Path $projectRoot "tools\deps\flutter\bin\cache\dart-sdk\bin\dart.exe" + if (-not (Test-Path $dart)) { + throw "Dart SDK not found: $dart" + } + + Push-Location (Join-Path $projectRoot "flutter\eve_parity") + try { + & $dart analyze lib test + if ($LASTEXITCODE -ne 0) { + throw "EveFlutter Dart analyzer failed with exit code $LASTEXITCODE" + } + } finally { + Pop-Location + } +} + +& (Join-Path $projectRoot "scripts\run-eveflutter-conformance-consumer-smoke.ps1") +if ($LASTEXITCODE -ne 0) { + throw "EveFlutter conformance consumer smoke failed with exit code $LASTEXITCODE" +} + +Write-Host "EveFlutter lifecycle smoke passed: $absoluteLifecyclePath" diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index 19d3bef..c66d0dc 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -458,10 +458,21 @@ "tools/conformance/consume-export.mjs", "tools/parity/run-parity.mjs" ] + }, + { + "description": "Flutter lifecycle evidence is declared and smoke-checked for EveFlutter incubation.", + "status": "passed", + "evidencePaths": [ + "flutter/eve_parity/eveflutter-lifecycle.json", + "scripts/run-eveflutter-lifecycle-smoke.ps1", + "scripts/capture-flutter-parity.ps1", + "scripts/capture-linux-flutter-parity.ps1", + "scripts/capture-android-flutter-parity.ps1" + ] } ], "pendingProofs": [ - "Flutter build, release, and capture lifecycle can run from EveFlutter." + "Tagged EveFlutter release, test runner, and capture runners are owned by EveFlutter rather than Eve incubation." ] }, {