From dabea374b1ee89d084e93f95f05f56c1cadb8b14 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Fri, 10 Jul 2026 16:28:10 +0100 Subject: [PATCH] Complete fields ABI evidence --- plugins/eve-plugin-fields/plugin-abi-fixture.json | 6 +++--- plugins/eve-plugin-fields/src/plugin.mjs | 1 + plugins/eve-plugin-fields/test/plugin.test.mjs | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/plugins/eve-plugin-fields/plugin-abi-fixture.json b/plugins/eve-plugin-fields/plugin-abi-fixture.json index d75aba9..c98a2a8 100644 --- a/plugins/eve-plugin-fields/plugin-abi-fixture.json +++ b/plugins/eve-plugin-fields/plugin-abi-fixture.json @@ -8,9 +8,9 @@ "responseSchema": "gamecult.eve.plugin_abi.response.v1", "authority": "EvePlugins owns field semantics; providers own sampled field state and runtimes own native projection.", "operations": [ - { "operation": "describe", "input": {}, "expect": { "pluginId": "fields.surface", "componentKinds": ["field.surface2d", "gravity.surface"], "commands": [] } }, - { "operation": "validate", "input": { "componentKinds": ["field.surface2d", "world.scene3d"], "document": { "schema": "gamecult.fields.surface2d.v1", "bounds": { "minX": -1, "minY": -1, "maxX": 1, "maxY": 1 } } }, "expect": { "acceptedComponentKinds": ["field.surface2d"], "rejectedComponentKinds": ["world.scene3d"], "validDocument": true } }, + { "operation": "describe", "input": {}, "expect": { "pluginId": "fields.surface", "componentKinds": ["field.surface2d", "gravity.surface"], "commands": [], "capabilities": ["field.surface2d", "gravity.surface", "field.scalar", "field.vector", "field.objects"] } }, + { "operation": "validate", "input": { "componentKinds": ["field.surface2d", "gravity.surface", "world.scene3d"], "document": { "schema": "gamecult.fields.surface2d.v1", "bounds": { "minX": -1, "minY": -1, "maxX": 1, "maxY": 1 } } }, "expect": { "acceptedComponentKinds": ["field.surface2d", "gravity.surface"], "rejectedComponentKinds": ["world.scene3d"], "validDocument": true } }, { "operation": "project", "input": { "document": { "schema": "gamecult.fields.surface2d.v1", "fieldId": "fixture.field", "bounds": { "minX": -1, "minY": -1, "maxX": 1, "maxY": 1 }, "channels": [{ "channelId": "height", "kind": "scalar", "documentId": "cultmesh://fixture/height", "schemaId": "gamecult.fields.scalar.v1" }] } }, "expect": { "projectionKind": "semantic-field-surface", "ownedComponentKinds": ["field.surface2d", "gravity.surface"], "providerStateMutated": false } }, - { "operation": "measure", "input": { "document": { "schema": "gamecult.fields.surface2d.v1", "fieldId": "fixture.field", "bounds": { "minX": -1, "minY": -2, "maxX": 3, "maxY": 2 }, "channels": [] } }, "expect": { "measurementKind": "field-domain-metrics", "width": 4, "height": 4, "preservesProviderAuthority": true } } + { "operation": "measure", "input": { "document": { "schema": "gamecult.fields.surface2d.v1", "fieldId": "fixture.field", "bounds": { "minX": -1, "minY": -2, "maxX": 3, "maxY": 2 }, "channels": [] } }, "expect": { "measurementKind": "field-domain-metrics", "measurementOutputs": ["width", "height", "channelCount"], "width": 4, "height": 4, "preservesProviderAuthority": true } } ] } diff --git a/plugins/eve-plugin-fields/src/plugin.mjs b/plugins/eve-plugin-fields/src/plugin.mjs index 1659e7e..1fb84b7 100644 --- a/plugins/eve-plugin-fields/src/plugin.mjs +++ b/plugins/eve-plugin-fields/src/plugin.mjs @@ -62,6 +62,7 @@ export function measure(input) { const projection = project(input); return { measurementKind: "field-domain-metrics", + measurementOutputs: ["width", "height", "channelCount"], width: projection.bounds.maxX - projection.bounds.minX, height: projection.bounds.maxY - projection.bounds.minY, channelCount: projection.channels.length, diff --git a/plugins/eve-plugin-fields/test/plugin.test.mjs b/plugins/eve-plugin-fields/test/plugin.test.mjs index b1d1c27..528ca11 100644 --- a/plugins/eve-plugin-fields/test/plugin.test.mjs +++ b/plugins/eve-plugin-fields/test/plugin.test.mjs @@ -38,6 +38,7 @@ test("measures field domains without mutating provider state", () => { assert.equal(result.width, 20); assert.equal(result.height, 10); assert.equal(result.channelCount, 1); + assert.deepEqual(result.measurementOutputs, ["width", "height", "channelCount"]); assert.equal(result.preservesProviderAuthority, true); });