Route world lowering gaps to runtime owners

This commit is contained in:
Meta Vens 2026-07-09 02:42:12 +01:00
commit 6eaaa8f5ca
4 changed files with 20 additions and 3 deletions

View file

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

View file

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

View file

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

View file

@ -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",
});
}
}