From 6eaaa8f5cae75aa31d50fbc20f9fbad556d95067 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Thu, 9 Jul 2026 02:42:12 +0100 Subject: [PATCH] Route world lowering gaps to runtime owners --- docs/eve-migration-roadmap.md | 5 +++++ docs/parity-testing-harness.md | 4 ++++ scripts/run-conformance-consumer-smoke.ps1 | 3 ++- tools/parity/run-parity.mjs | 11 +++++++++-- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index e528b93..fa7e253 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -290,6 +290,11 @@ 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. +- Missing provider-advertised world-surface lowering targets are now assigned + to their pending runtime owner when one exists. `unity-scene` gaps point at + EveUnity's pending `unity-scene` runtime, and `tui` gaps point at EveTui's + pending `tui` runtime. Eve only owns a world-lowering gap when no runtime + target has been declared. - EveUnity now has a pending Unity scene handoff at `runtimes/incubating/eve-unity-scene/eveunity-scene-split-handoff.json`. The active `unity-uitoolkit` runtime remains a semantic UI surface lowerer; diff --git a/docs/parity-testing-harness.md b/docs/parity-testing-harness.md index 1a62a5d..4d96905 100644 --- a/docs/parity-testing-harness.md +++ b/docs/parity-testing-harness.md @@ -100,6 +100,10 @@ Capability gaps are exported as `capabilityGaps[]`. They are derived from missing plugin/provider/runtime evidence, declared unsupported plugin projection, capture gaps, and split blockers. Consumer smokes can assert named gap substrings with `--expect-capability-gap`. +When a provider advertises a world-surface lowering target that no runtime +claims, the gap is assigned to the matching pending runtime owner when one +exists, such as `unity-scene` -> EveUnity or `tui` -> EveTui. Eve only owns the +gap when no runtime target has been declared at all. The conformance export includes runtime `capabilityManifestPath` and `capabilityManifestErrors` fields so external consumers can distinguish a diff --git a/scripts/run-conformance-consumer-smoke.ps1 b/scripts/run-conformance-consumer-smoke.ps1 index b5f70f6..9a64b9e 100644 --- a/scripts/run-conformance-consumer-smoke.ps1 +++ b/scripts/run-conformance-consumer-smoke.ps1 @@ -33,7 +33,8 @@ try { node .\tools\conformance\consume-export.mjs $consumerExport ` --expect-capability-matrix ` --expect-capability-gap runtime:Fensalir:direct2d:capture:missing ` - --expect-capability-gap "runtime:Eve:world-surface-lowering:provider:aetheria:surface:aetheria.daemon.game:world-lowering-target:unity-scene:missing-runtime" ` + --expect-capability-gap "runtime:EveUnity:unity-scene:provider:aetheria:surface:aetheria.daemon.game:world-lowering-target:unity-scene:missing-runtime" ` + --expect-capability-gap "runtime:EveTui:tui:provider:aetheria:surface:aetheria.daemon.game:world-lowering-target:tui:missing-runtime" ` --expect-capability-gap "split-target:EveUnity:EveUnity:proof:Tagged UPM release" ` --expect-conformance-handoff if ($LASTEXITCODE -ne 0) { diff --git a/tools/parity/run-parity.mjs b/tools/parity/run-parity.mjs index 9898dff..98eb597 100644 --- a/tools/parity/run-parity.mjs +++ b/tools/parity/run-parity.mjs @@ -1816,21 +1816,28 @@ function collectCapabilityGaps(report) { } const worldLoweringTargets = new Set(); + const runtimeByWorldTarget = new Map(); for (const runtime of report.runtimes || []) { + if (runtime.id) runtimeByWorldTarget.set(runtime.id, runtime); for (const claim of runtime.worldSurfaceLowering || []) { if (claim.targetId) worldLoweringTargets.add(claim.targetId); + if (claim.targetId) runtimeByWorldTarget.set(claim.targetId, runtime); } } for (const provider of report.providers || []) { for (const surface of provider.surfaceContracts || []) { for (const targetId of surface.worldInteraction?.loweringTargets || []) { if (!worldLoweringTargets.has(targetId)) { + const targetRuntime = runtimeByWorldTarget.get(targetId); addGap({ kind: "runtime", - ownerRepo: "Eve", - subjectId: "world-surface-lowering", + ownerRepo: targetRuntime?.ownerRepo || "Eve", + subjectId: targetRuntime?.id || "world-surface-lowering", gap: `provider:${provider.providerId}:surface:${surface.surfaceId}:world-lowering-target:${targetId}:missing-runtime`, severity: "blocker", + detail: targetRuntime + ? `splitTarget:${targetRuntime.splitTarget || ""}:status:${targetRuntime.status || ""}` + : "no-runtime-target-declared", }); } }