Add EveElectron split boundary
This commit is contained in:
parent
c232f1453e
commit
edf1af7ece
6 changed files with 153 additions and 8 deletions
|
|
@ -290,6 +290,13 @@ Recently cut:
|
|||
`packs/runtime.json`, the runtime-owner smoke asserts them, and the generic
|
||||
conformance smoke now reports the advertised but unclaimed `unity-scene`
|
||||
lowering target as an explicit capability gap.
|
||||
- EveElectron now has a pending split target and handoff at
|
||||
`runtimes/incubating/eve-electron/eveelectron-split-handoff.json`. It does
|
||||
not claim an Electron runtime body yet. The handoff draws the line between a
|
||||
future provider-agnostic Electron shell and Aetheria's Starbridge RTS product
|
||||
client, and the split-target consumer smoke keeps the missing shell,
|
||||
provider-advertisement consumption, command transport, and capture proofs
|
||||
visible as blockers.
|
||||
- Aetheria interactive world surfaces now carry a structured provider-owned
|
||||
`worldInteraction` contract. The provider advertisement names projection
|
||||
kind, provider state schemas, daemon command boundary, receipt schema,
|
||||
|
|
|
|||
|
|
@ -199,11 +199,14 @@ Split-target consumer smoke:
|
|||
powershell -ExecutionPolicy Bypass -File .\scripts\run-split-target-conformance-consumer-smoke.ps1
|
||||
```
|
||||
|
||||
That script asserts that EveFlutter and EveUnity are exported as incubating
|
||||
split targets, that their current split-readiness proofs are passed, and that
|
||||
their graduation blockers remain visible to consumers. A target being present
|
||||
is not enough; future owner repos must be able to consume why it is or is not
|
||||
ready to leave Eve incubation.
|
||||
That script asserts that EveFlutter, EveUnity, and EveElectron are exported as
|
||||
incubating split targets, that their current split-readiness proofs are passed,
|
||||
and that their graduation blockers remain visible to consumers. A target being
|
||||
present is not enough; future owner repos must be able to consume why it is or
|
||||
is not ready to leave Eve incubation. EveElectron is intentionally pending: its
|
||||
handoff names the generic Electron shell boundary, while the Starbridge RTS
|
||||
client remains Aetheria-owned product code until a provider-agnostic shell
|
||||
exists.
|
||||
|
||||
The Flutter widget smoke also exercises `EveProviderCatalog` and
|
||||
`EveProviderPicker` against a conformance-export-shaped provider list. That is
|
||||
|
|
|
|||
|
|
@ -0,0 +1,66 @@
|
|||
{
|
||||
"schema": "gamecult.eve.runtime_split_handoff.v1",
|
||||
"splitTarget": "EveElectron",
|
||||
"ownerRepo": "EveElectron",
|
||||
"currentHostRepo": "Eve",
|
||||
"runtimeId": "electron-shell",
|
||||
"packageName": "eve-electron",
|
||||
"sourcePackageRoot": "runtimes/incubating/eve-electron",
|
||||
"destinationPackageRoot": "packages/eve-electron",
|
||||
"authorityBoundary": "EveElectron owns generic Electron shell projection, window lifecycle, packaged app build glue, provider advertisement consumption, command transport, capture, and shell-level plugin projection adapters. Aetheria owns Starbridge state, product-specific RTS flows, assets, command authorization, receipts, and authored provider surfaces. Eve keeps the surface, command, provider advertisement, plugin advertisement, and conformance contracts.",
|
||||
"moveSets": [
|
||||
{
|
||||
"id": "electron-shell-runtime",
|
||||
"stage": "runtime-body",
|
||||
"currentPaths": [],
|
||||
"observedProviderPaths": [
|
||||
"E:\\Projects\\Aetheria\\Aetheria.Rts.Web\\Electron",
|
||||
"E:\\Projects\\Aetheria\\Aetheria.Rts.Web\\Client",
|
||||
"E:\\Projects\\Aetheria\\Aetheria.Rts.Web\\tsconfig.electron.json"
|
||||
],
|
||||
"destinationOwner": "EveElectron",
|
||||
"replacementProof": "EveElectron hosts a provider-agnostic Electron shell that loads provider advertisements and lowers Eve surfaces without importing Aetheria client modules."
|
||||
},
|
||||
{
|
||||
"id": "electron-command-transport",
|
||||
"stage": "command",
|
||||
"currentPaths": [],
|
||||
"observedProviderPaths": [
|
||||
"E:\\Projects\\Aetheria\\Aetheria.Rts.Web\\Client\\app.ts",
|
||||
"E:\\Projects\\Aetheria\\Aetheria.Rts.Web\\Electron\\preload.cjs",
|
||||
"E:\\Projects\\Aetheria\\Aetheria.Rts.Web\\Electron\\aetheria-cultmesh.ts"
|
||||
],
|
||||
"destinationOwner": "EveElectron",
|
||||
"replacementProof": "Electron emits gamecult.eve.command.v1 intents through the provider-advertised command boundary and receives provider receipts instead of mutating local product state."
|
||||
},
|
||||
{
|
||||
"id": "electron-capture-lifecycle",
|
||||
"stage": "capture",
|
||||
"currentPaths": [],
|
||||
"destinationOwner": "EveElectron",
|
||||
"replacementProof": "EveElectron attaches desktop-window capture artifacts to conformance output for at least one non-Aetheria provider and one Aetheria scenario."
|
||||
}
|
||||
],
|
||||
"contractInputs": [
|
||||
"gamecult.eve.surface.v1",
|
||||
"gamecult.eve.command.v1",
|
||||
"gamecult.eve.provider_advertisement.v1",
|
||||
"gamecult.eve.plugin_advertisement.v1",
|
||||
"gamecult.eve.plugin.v1",
|
||||
"gamecult.eve.conformance_export.v1"
|
||||
],
|
||||
"forbiddenImports": [
|
||||
"Aetheria RTS client modules as EveElectron runtime authority",
|
||||
"Aetheria Starbridge state as Electron shell truth",
|
||||
"provider-specific IPC contracts that bypass gamecult.eve.command.v1",
|
||||
"plugin semantic internals",
|
||||
"renderer-local product state as daemon truth"
|
||||
],
|
||||
"requiredExternalProofs": [
|
||||
"EveElectron publishes a runtime capability manifest with provider advertisement consumption and command transport.",
|
||||
"EveElectron lowers at least one generic Eve provider surface that is not Aetheria.",
|
||||
"EveElectron lowers Aetheria world/editor surfaces through provider advertisements without importing Aetheria internals.",
|
||||
"Aetheria keeps Starbridge-specific UI, assets, authored flows, and receipts in the Aetheria repo.",
|
||||
"EveElectron attaches Electron capture artifacts to conformance output."
|
||||
]
|
||||
}
|
||||
|
|
@ -43,7 +43,12 @@ try {
|
|||
--expect-split-target-proof "EveUnity:EveUnity split handoff is machine-readable" `
|
||||
--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"
|
||||
--expect-split-target-blocker "EveUnity:Unity batchmode or editor capture artifact" `
|
||||
--expect-split-target EveElectron `
|
||||
--expect-split-target-status EveElectron:incubating `
|
||||
--expect-split-target-proof "EveElectron:EveElectron split handoff is machine-readable" `
|
||||
--expect-split-target-blocker "EveElectron:runtime:electron-shell:status:pending" `
|
||||
--expect-split-target-blocker "EveElectron:Electron shell runtime body exists outside Aetheria product code"
|
||||
if ($LASTEXITCODE -ne 0) {
|
||||
throw "Split target conformance consumer smoke failed with exit code $LASTEXITCODE"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -580,9 +580,71 @@
|
|||
"Unity batchmode EditMode runner is owned by EveUnity rather than Eve incubation.",
|
||||
"Unity batchmode or editor capture artifact is attached to the runtime conformance report."
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "EveElectron",
|
||||
"ownerRepo": "EveElectron",
|
||||
"repoRole": "runtime-target",
|
||||
"status": "pending",
|
||||
"runtimes": ["electron-shell"],
|
||||
"requiredRuntimeStatuses": ["active"],
|
||||
"requiredFeatures": ["providerAdvertisements", "embeddedDocuments"],
|
||||
"requiredPlugins": [],
|
||||
"proofs": [
|
||||
{
|
||||
"description": "EveElectron split handoff is machine-readable.",
|
||||
"status": "passed",
|
||||
"evidencePaths": [
|
||||
"runtimes/incubating/eve-electron/eveelectron-split-handoff.json",
|
||||
"docs/eve-migration-roadmap.md",
|
||||
"docs/parity-testing-harness.md"
|
||||
]
|
||||
}
|
||||
],
|
||||
"pendingProofs": [
|
||||
"Electron shell runtime body exists outside Aetheria product code.",
|
||||
"Electron consumes provider advertisements without Aetheria source-layout knowledge.",
|
||||
"Electron emits gamecult.eve.command.v1 through provider command boundaries.",
|
||||
"Electron capture artifacts are attached to conformance output."
|
||||
]
|
||||
}
|
||||
],
|
||||
"runtimes": [
|
||||
{
|
||||
"id": "electron-shell",
|
||||
"title": "Electron shell",
|
||||
"kind": "pending",
|
||||
"ownerRepo": "EveElectron",
|
||||
"repoRole": "runtime-target",
|
||||
"splitTarget": "EveElectron",
|
||||
"graduationTrigger": "Split when Electron has a provider-agnostic shell body, provider advertisement consumption, command transport, packaged app lifecycle, and capture evidence independent of Aetheria product code.",
|
||||
"splitHandoffPath": "runtimes/incubating/eve-electron/eveelectron-split-handoff.json",
|
||||
"requiredFixtures": ["embedded-surface", "aetheria-world"],
|
||||
"pluginFixtures": [],
|
||||
"supportedFeatures": [],
|
||||
"supportedPlugins": [],
|
||||
"unsupportedPlugins": [
|
||||
{
|
||||
"pluginId": "sai.vn",
|
||||
"reason": "Electron has no generic runtime body yet; Sai projection belongs behind provider/plugin advertisements once EveElectron exists."
|
||||
},
|
||||
{
|
||||
"pluginId": "norn.graph",
|
||||
"reason": "Electron has no generic runtime body yet; Norn graph projection belongs behind provider/plugin advertisements once EveElectron exists."
|
||||
},
|
||||
{
|
||||
"pluginId": "tex.math",
|
||||
"reason": "Electron has no generic runtime body yet; TeX projection belongs behind provider/plugin advertisements once EveElectron exists."
|
||||
}
|
||||
],
|
||||
"expectedPaths": [
|
||||
"runtimes/incubating/eve-electron/eveelectron-split-handoff.json"
|
||||
],
|
||||
"capture": {
|
||||
"status": "missing",
|
||||
"note": "Electron capture is a split blocker until EveElectron owns a provider-agnostic shell."
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "web",
|
||||
"title": "Web reference",
|
||||
|
|
|
|||
|
|
@ -303,7 +303,7 @@ async function evaluateRuntime(runtime, fixtureResults) {
|
|||
}
|
||||
const commandTransportSmokeErrors = await validateRuntimeCommandTransportSmoke(runtime);
|
||||
const capabilityManifestErrors = await validateRuntimeCapabilityManifest(runtime);
|
||||
const splitHandoffPath = await readRuntimeSplitHandoffPath(runtime.capabilityManifest);
|
||||
const splitHandoffPath = await readRuntimeSplitHandoffPath(runtime);
|
||||
const localProviderCatalogErrors = await validateRuntimeLocalProviderCatalog(runtime);
|
||||
const missingIncubationFields = requiredIncubationFields(runtime).filter(field => !runtime[field]);
|
||||
const pluginCapabilityGaps = collectPluginCapabilityGaps(runtime, fixtureResults);
|
||||
|
|
@ -407,7 +407,9 @@ async function validateRuntimeLocalProviderCatalog(runtime) {
|
|||
return errors;
|
||||
}
|
||||
|
||||
async function readRuntimeSplitHandoffPath(capabilityManifest) {
|
||||
async function readRuntimeSplitHandoffPath(runtime) {
|
||||
if (runtime?.splitHandoffPath) return runtime.splitHandoffPath;
|
||||
const capabilityManifest = runtime?.capabilityManifest;
|
||||
if (!capabilityManifest?.manifestPath) return "";
|
||||
const documentPath = path.join(repoRoot, capabilityManifest.manifestPath);
|
||||
if (!existsSync(documentPath)) return "";
|
||||
|
|
|
|||
Loading…
Reference in a new issue