From 80dae63a57e7feba85f2bbea3a44a691a8523e07 Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Fri, 10 Jul 2026 04:03:05 +0100 Subject: [PATCH] Separate command descriptors from invocations --- docs/eve-migration-roadmap.md | 6 + docs/surface-contract-v1.md | 5 +- flutter/eve_parity/lib/main.dart | 2 +- .../eve_parity/test/parity_smoke_test.dart | 2 +- packages/eve-browser-lowering/dist/index.d.ts | 2 +- packages/eve-browser-lowering/dist/index.js | 2 +- packages/eve-browser-lowering/src/index.ts | 4 +- .../Runtime/EveProviderDocuments.cs | 261 ++++++++++++++++++ .../Runtime/EveProviderDocuments.cs.meta | 2 + .../Runtime/EveSurfaceDocument.cs | 35 ++- .../eve-runtime-capability.json | 2 +- .../eveunity-split-handoff.json | 1 + .../incubating/sai-vn.plugin-abi-fixture.json | 2 +- .../sai-vn.plugin-advertisement.json | 2 +- plugins/incubating/sai-vn.plugin.json | 2 +- .../tex-math.plugin-advertisement.json | 2 +- plugins/incubating/tex-math.plugin.json | 2 +- .../eve-electron/eve-runtime-capability.json | 2 +- .../eve-electron/src/eve-electron-shell.mjs | 2 +- .../test/eve-electron-shell.test.mjs | 2 +- .../eve-tui/eve-runtime-capability.json | 2 +- .../incubating/eve-tui/src/eve-tui-shell.mjs | 2 +- .../eve-tui/test/eve-tui-shell.test.mjs | 2 +- schemas/gamecult.eve.command.v1.schema.json | 33 +-- ...cult.eve.command_invocation.v1.schema.json | 39 +++ ...amecult.eve.command_receipt.v1.schema.json | 10 +- ....eve.provider_advertisement.v1.schema.json | 12 + scripts/run-eveelectron-lifecycle-smoke.ps1 | 2 +- ...-eveflutter-conformance-consumer-smoke.ps1 | 2 +- scripts/run-evetui-lifecycle-smoke.ps1 | 2 +- scripts/run-eveunity-lifecycle-smoke.ps1 | 2 +- ...lugin-owner-conformance-consumer-smoke.ps1 | 2 +- ...ntime-owner-conformance-consumer-smoke.ps1 | 12 +- tools/conformance/consume-export.mjs | 6 +- tools/conformance/eveconformance-handoff.json | 1 + tools/parity/parity-manifest.json | 37 +-- tools/parity/run-parity.mjs | 6 +- web/eve-runtime-capability.json | 2 +- web/fixtures/aetheria-provider-handoff.json | 1 + web/fixtures/aetheria-world-scenario.json | 2 +- .../aetheria.provider-advertisement.json | 1 + web/fixtures/eve-world-smoke-scenario.json | 2 +- ...ve-world-smoke.provider-advertisement.json | 3 +- .../sai-vn.provider-advertisement.json | 1 + 44 files changed, 438 insertions(+), 86 deletions(-) create mode 100644 packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs create mode 100644 packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs.meta create mode 100644 schemas/gamecult.eve.command_invocation.v1.schema.json diff --git a/docs/eve-migration-roadmap.md b/docs/eve-migration-roadmap.md index 060962e..0c47f9c 100644 --- a/docs/eve-migration-roadmap.md +++ b/docs/eve-migration-roadmap.md @@ -292,6 +292,12 @@ Exit criteria: Recently cut: +- Eve core now publishes typed CultCache wire documents for provider + advertisement, command invocation, and provider receipt. Command descriptors + remain `gamecult.eve.command.v1`; executable intents are the distinct + `gamecult.eve.command_invocation.v1` contract. Receipts carry the provider's + source version, and EveUnity withholds terminal receipts until that version + is actually lowered. - EveUnity now owns a minimal clean `TestProject` that installs CultLib, Eve surface contracts, and the EveUnity scene package without Aetheria code. Its generic `eve.world-smoke` PlayMode test lowers a world, routes a command diff --git a/docs/surface-contract-v1.md b/docs/surface-contract-v1.md index 1e9f30a..ef182be 100644 --- a/docs/surface-contract-v1.md +++ b/docs/surface-contract-v1.md @@ -232,12 +232,13 @@ report the degradation. ## Commands -Commands use `gamecult.eve.command.v1`: +Authored command descriptors use `gamecult.eve.command.v1`. Runtime command +invocations use `gamecult.eve.command_invocation.v1`: ```json { "type": "surface-command", - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "providerId": "gamecult.home.vn", "surfaceId": "sai.visual_novel.surface", "command": "story.choose", diff --git a/flutter/eve_parity/lib/main.dart b/flutter/eve_parity/lib/main.dart index 5229eec..5c8cd74 100644 --- a/flutter/eve_parity/lib/main.dart +++ b/flutter/eve_parity/lib/main.dart @@ -323,7 +323,7 @@ EveCommandIntent createEveCommandIntent( ) { return EveCommandIntent( type: 'surface-command', - schema: 'gamecult.eve.command.v1', + schema: 'gamecult.eve.command_invocation.v1', providerId: state.providerId, surfaceId: state.surfaceId, command: command, diff --git a/flutter/eve_parity/test/parity_smoke_test.dart b/flutter/eve_parity/test/parity_smoke_test.dart index 3ece18c..dc6c993 100644 --- a/flutter/eve_parity/test/parity_smoke_test.dart +++ b/flutter/eve_parity/test/parity_smoke_test.dart @@ -114,7 +114,7 @@ void main() { await tester.pump(); expect(intents, hasLength(1)); - expect(intents.single.schema, 'gamecult.eve.command.v1'); + expect(intents.single.schema, 'gamecult.eve.command_invocation.v1'); expect(intents.single.providerId, 'aetheria'); expect(intents.single.surfaceId, 'aetheria.daemon.game'); expect(intents.single.command, 'aetheria.daemon.commands'); diff --git a/packages/eve-browser-lowering/dist/index.d.ts b/packages/eve-browser-lowering/dist/index.d.ts index 046831e..20df7f8 100644 --- a/packages/eve-browser-lowering/dist/index.d.ts +++ b/packages/eve-browser-lowering/dist/index.d.ts @@ -35,7 +35,7 @@ export type EveSurfaceStyles = { }>; export interface EveCommandIntent { type: "surface-command"; - schema: "gamecult.eve.command.v1"; + schema: "gamecult.eve.command_invocation.v1"; providerId: string; surfaceId: string; command: string; diff --git a/packages/eve-browser-lowering/dist/index.js b/packages/eve-browser-lowering/dist/index.js index 32b9bce..821f65e 100644 --- a/packages/eve-browser-lowering/dist/index.js +++ b/packages/eve-browser-lowering/dist/index.js @@ -1847,7 +1847,7 @@ export function createEveCommandIntent(commandId, props = {}, options = currentO const receiptSchema = firstString(worldInteraction.receiptSchema, props.receiptSchema, action.receiptSchema); const intent = { type: "surface-command", - schema: "gamecult.eve.command.v1", + schema: "gamecult.eve.command_invocation.v1", providerId, surfaceId, command: commandId || stringProp(action.type, "invoke"), diff --git a/packages/eve-browser-lowering/src/index.ts b/packages/eve-browser-lowering/src/index.ts index b94a177..760ca0a 100644 --- a/packages/eve-browser-lowering/src/index.ts +++ b/packages/eve-browser-lowering/src/index.ts @@ -33,7 +33,7 @@ export type EveSurfaceStyles = export interface EveCommandIntent { type: "surface-command"; - schema: "gamecult.eve.command.v1"; + schema: "gamecult.eve.command_invocation.v1"; providerId: string; surfaceId: string; command: string; @@ -2200,7 +2200,7 @@ export function createEveCommandIntent( const receiptSchema = firstString(worldInteraction.receiptSchema, props.receiptSchema, action.receiptSchema); const intent: EveCommandIntent = { type: "surface-command", - schema: "gamecult.eve.command.v1", + schema: "gamecult.eve.command_invocation.v1", providerId, surfaceId, command: commandId || stringProp(action.type, "invoke"), diff --git a/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs b/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs new file mode 100644 index 0000000..e9bb1da --- /dev/null +++ b/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs @@ -0,0 +1,261 @@ +using System; +using System.Collections.Generic; +using GameCult.Caching; +using MessagePack; + +#nullable enable + +namespace GameCult.Eve.Surface +{ + [CultDocument("gamecult.eve.provider_advertisement", SchemaId)] + [MessagePackObject] + public sealed class EveProviderAdvertisementDocument + { + public const string SchemaId = "gamecult.eve.provider_advertisement.v1"; + + public EveProviderAdvertisementDocument( + string providerId, + string serviceId, + string verseId, + string title, + string kind, + string cultMeshAddress, + string updatedAtUtc, + EveProviderFreshness freshness, + IReadOnlyList schemas, + IReadOnlyList witnesses, + IReadOnlyList surfaces, + IReadOnlyList commands) + : this(SchemaId, providerId, serviceId, verseId, title, kind, cultMeshAddress, updatedAtUtc, freshness, schemas, witnesses, surfaces, commands) + { + } + + [SerializationConstructor] + public EveProviderAdvertisementDocument( + string schema, + string providerId, + string serviceId, + string verseId, + string title, + string kind, + string cultMeshAddress, + string updatedAtUtc, + EveProviderFreshness freshness, + IReadOnlyList schemas, + IReadOnlyList witnesses, + IReadOnlyList surfaces, + IReadOnlyList commands) + { + Schema = string.IsNullOrWhiteSpace(schema) ? SchemaId : schema; + ProviderId = providerId ?? ""; + ServiceId = serviceId ?? ""; + VerseId = verseId ?? ""; + Title = title ?? ""; + Kind = kind ?? ""; + CultMeshAddress = cultMeshAddress ?? ""; + UpdatedAtUtc = updatedAtUtc ?? ""; + Freshness = freshness ?? new EveProviderFreshness("unknown", "", 0); + Schemas = schemas ?? Array.Empty(); + Witnesses = witnesses ?? Array.Empty(); + Surfaces = surfaces ?? Array.Empty(); + Commands = commands ?? Array.Empty(); + } + + [Key(0)] public string Schema { get; } + [Key(1)] public string ProviderId { get; } + [Key(2)] public string ServiceId { get; } + [Key(3)] public string VerseId { get; } + [Key(4)] public string Title { get; } + [Key(5)] public string Kind { get; } + [Key(6)] public string CultMeshAddress { get; } + [Key(7)] public string UpdatedAtUtc { get; } + [Key(8)] public EveProviderFreshness Freshness { get; } + [Key(9)] public IReadOnlyList Schemas { get; } + [Key(10)] public IReadOnlyList Witnesses { get; } + [Key(11)] public IReadOnlyList Surfaces { get; } + [Key(12)] public IReadOnlyList Commands { get; } + } + + [MessagePackObject] + public sealed class EveProviderFreshness + { + [SerializationConstructor] + public EveProviderFreshness(string state, string lastSeenAtUtc, long maxAgeMs) + { + State = state ?? ""; + LastSeenAtUtc = lastSeenAtUtc ?? ""; + MaxAgeMs = maxAgeMs; + } + + [Key(0)] public string State { get; } + [Key(1)] public string LastSeenAtUtc { get; } + [Key(2)] public long MaxAgeMs { get; } + } + + [MessagePackObject] + public sealed class EveProviderWitness + { + [SerializationConstructor] + public EveProviderWitness(string kind, string reference, string summary) + { + Kind = kind ?? ""; + Reference = reference ?? ""; + Summary = summary ?? ""; + } + + [Key(0)] public string Kind { get; } + [Key(1)] public string Reference { get; } + [Key(2)] public string Summary { get; } + } + + [MessagePackObject] + public sealed class EveAdvertisedSurface + { + [SerializationConstructor] + public EveAdvertisedSurface( + string surfaceId, + string schema, + string recordRef, + string transport, + string status, + string surfaceKind, + EveWorldInteractionAdvertisement? worldInteraction = null) + { + SurfaceId = surfaceId ?? ""; + Schema = schema ?? ""; + RecordRef = recordRef ?? ""; + Transport = transport ?? ""; + Status = status ?? ""; + SurfaceKind = surfaceKind ?? ""; + WorldInteraction = worldInteraction; + } + + [Key(0)] public string SurfaceId { get; } + [Key(1)] public string Schema { get; } + [Key(2)] public string RecordRef { get; } + [Key(3)] public string Transport { get; } + [Key(4)] public string Status { get; } + [Key(5)] public string SurfaceKind { get; } + [Key(6)] public EveWorldInteractionAdvertisement? WorldInteraction { get; } + } + + [MessagePackObject] + public sealed class EveWorldInteractionAdvertisement + { + [SerializationConstructor] + public EveWorldInteractionAdvertisement( + string projectionKind, + IReadOnlyList stateSchemas, + string commandBoundary, + string commandRecordRef, + string receiptSchema, + string receiptRecordRef, + string assetManifestRecordRef, + IReadOnlyList loweringTargets, + string ownership) + { + ProjectionKind = projectionKind ?? ""; + StateSchemas = stateSchemas ?? Array.Empty(); + CommandBoundary = commandBoundary ?? ""; + CommandRecordRef = commandRecordRef ?? ""; + ReceiptSchema = receiptSchema ?? ""; + ReceiptRecordRef = receiptRecordRef ?? ""; + AssetManifestRecordRef = assetManifestRecordRef ?? ""; + LoweringTargets = loweringTargets ?? Array.Empty(); + Ownership = ownership ?? ""; + } + + [Key(0)] public string ProjectionKind { get; } + [Key(1)] public IReadOnlyList StateSchemas { get; } + [Key(2)] public string CommandBoundary { get; } + [Key(3)] public string CommandRecordRef { get; } + [Key(4)] public string ReceiptSchema { get; } + [Key(5)] public string ReceiptRecordRef { get; } + [Key(6)] public string AssetManifestRecordRef { get; } + [Key(7)] public IReadOnlyList LoweringTargets { get; } + [Key(8)] public string Ownership { get; } + } + + [MessagePackObject] + public sealed class EveAdvertisedCommand + { + [SerializationConstructor] + public EveAdvertisedCommand(string command, string surfaceId, string transport, string summary) + { + Command = command ?? ""; + SurfaceId = surfaceId ?? ""; + Transport = transport ?? ""; + Summary = summary ?? ""; + } + + [Key(0)] public string Command { get; } + [Key(1)] public string SurfaceId { get; } + [Key(2)] public string Transport { get; } + [Key(3)] public string Summary { get; } + } + + [CultDocument("gamecult.eve.command_receipt", SchemaId)] + [MessagePackObject] + public sealed class EveCommandReceiptDocument + { + public const string SchemaId = "gamecult.eve.command_receipt.v1"; + + public EveCommandReceiptDocument( + string receiptId, + string commandId, + string command, + string state, + string ownerRepo, + string authority, + string providerId, + string surfaceId, + string message, + string issuedAtUtc, + long sourceVersion) + : this(SchemaId, receiptId, commandId, command, state, ownerRepo, authority, providerId, surfaceId, message, issuedAtUtc, sourceVersion) + { + } + + [SerializationConstructor] + public EveCommandReceiptDocument( + string schema, + string receiptId, + string commandId, + string command, + string state, + string ownerRepo, + string authority, + string providerId, + string surfaceId, + string message, + string issuedAtUtc, + long sourceVersion) + { + Schema = string.IsNullOrWhiteSpace(schema) ? SchemaId : schema; + ReceiptId = receiptId ?? ""; + CommandId = commandId ?? ""; + Command = command ?? ""; + State = state ?? ""; + OwnerRepo = ownerRepo ?? ""; + Authority = authority ?? ""; + ProviderId = providerId ?? ""; + SurfaceId = surfaceId ?? ""; + Message = message ?? ""; + IssuedAtUtc = issuedAtUtc ?? ""; + SourceVersion = sourceVersion; + } + + [Key(0)] public string Schema { get; } + [Key(1)] public string ReceiptId { get; } + [Key(2)] public string CommandId { get; } + [Key(3)] public string Command { get; } + [Key(4)] public string State { get; } + [Key(5)] public string OwnerRepo { get; } + [Key(6)] public string Authority { get; } + [Key(7)] public string ProviderId { get; } + [Key(8)] public string SurfaceId { get; } + [Key(9)] public string Message { get; } + [Key(10)] public string IssuedAtUtc { get; } + [Key(11)] public long SourceVersion { get; } + } +} diff --git a/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs.meta b/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs.meta new file mode 100644 index 0000000..f29c875 --- /dev/null +++ b/packages/org.gamecult.eve.surface/Runtime/EveProviderDocuments.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f7ea0cd07c4d5da4099b5acf8d44ca2e \ No newline at end of file diff --git a/packages/org.gamecult.eve.surface/Runtime/EveSurfaceDocument.cs b/packages/org.gamecult.eve.surface/Runtime/EveSurfaceDocument.cs index 6068e68..a6e9138 100644 --- a/packages/org.gamecult.eve.surface/Runtime/EveSurfaceDocument.cs +++ b/packages/org.gamecult.eve.surface/Runtime/EveSurfaceDocument.cs @@ -269,9 +269,11 @@ namespace GameCult.Eve.Surface public string Transport => Operation.RouteHint.Description ?? ""; } + [CultDocument("gamecult.eve.command", SchemaId)] + [MessagePackObject] public sealed class EveSurfaceCommandRequest { - public const string SchemaId = "gamecult.eve.command.v1"; + public const string SchemaId = "gamecult.eve.command_invocation.v1"; public EveSurfaceCommandRequest( string providerId, @@ -282,7 +284,23 @@ namespace GameCult.Eve.Surface string clientId, string commandBoundary = "", string receiptSchema = "") + : this(SchemaId, providerId, surfaceId, operation, payload, issuedAt, clientId, commandBoundary, receiptSchema) { + } + + [SerializationConstructor] + public EveSurfaceCommandRequest( + string schema, + string providerId, + string surfaceId, + CultMeshOperationInvocationDescriptor operation, + CultMeshOperationPayload payload, + DateTimeOffset issuedAt, + string clientId, + string commandBoundary, + string receiptSchema) + { + Schema = string.IsNullOrWhiteSpace(schema) ? SchemaId : schema; ProviderId = providerId; SurfaceId = surfaceId; Operation = operation ?? throw new ArgumentNullException(nameof(operation)); @@ -293,24 +311,37 @@ namespace GameCult.Eve.Surface ReceiptSchema = receiptSchema ?? ""; } - public string Schema => SchemaId; + [Key(0)] + public string Schema { get; } + [Key(1)] public string ProviderId { get; } + [Key(2)] public string SurfaceId { get; } + [Key(3)] public CultMeshOperationInvocationDescriptor Operation { get; } + [IgnoreMember] public string Command => Operation.OperationId; + [Key(4)] public CultMeshOperationPayload Payload { get; } + [Key(5)] public DateTimeOffset IssuedAt { get; } + [Key(6)] public string ClientId { get; } + [Key(7)] public string CommandBoundary { get; } + [Key(8)] public string ReceiptSchema { get; } + + [IgnoreMember] + public string CommandId => Operation.IdempotencyKey ?? ""; } } diff --git a/packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json b/packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json index e1a9061..b9ae1f4 100644 --- a/packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json +++ b/packages/org.gamecult.eve.unity-uitoolkit/eve-runtime-capability.json @@ -46,7 +46,7 @@ ], "unsupportedPlugins": [], "commandTransport": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "emitter": "EveUiToolkitSurfaceLowerer.EmitCommand", "clientId": "unity-uitoolkit" }, diff --git a/packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json b/packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json index ec97556..0620e43 100644 --- a/packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json +++ b/packages/org.gamecult.eve.unity-uitoolkit/eveunity-split-handoff.json @@ -75,6 +75,7 @@ "contractInputs": [ "gamecult.eve.surface.v1", "gamecult.eve.command.v1", + "gamecult.eve.command_invocation.v1", "gamecult.eve.provider_advertisement.v1", "gamecult.eve.plugin_advertisement.v1", "gamecult.eve.plugin.v1", diff --git a/plugins/incubating/sai-vn.plugin-abi-fixture.json b/plugins/incubating/sai-vn.plugin-abi-fixture.json index 3819b7f..7b8e5b3 100644 --- a/plugins/incubating/sai-vn.plugin-abi-fixture.json +++ b/plugins/incubating/sai-vn.plugin-abi-fixture.json @@ -56,7 +56,7 @@ "loweringKind": "runtime-neutral-stage-parts", "preservedComponentKinds": ["vn.stage", "panel.dialogue", "text.dialogue", "rail.actions"], "delegatedPlugins": ["norn.graph", "tex.math"], - "commandEnvelope": "gamecult.eve.command.v1" + "commandEnvelope": "gamecult.eve.command_invocation.v1" } }, { diff --git a/plugins/incubating/sai-vn.plugin-advertisement.json b/plugins/incubating/sai-vn.plugin-advertisement.json index a19bda9..c364189 100644 --- a/plugins/incubating/sai-vn.plugin-advertisement.json +++ b/plugins/incubating/sai-vn.plugin-advertisement.json @@ -19,7 +19,7 @@ "requestSchema": "gamecult.eve.plugin_abi.request.v1", "responseSchema": "gamecult.eve.plugin_abi.response.v1", "operations": ["describe", "validate", "project", "lower", "measure", "apply"], - "commandEnvelope": "gamecult.eve.command.v1", + "commandEnvelope": "gamecult.eve.command_invocation.v1", "receiptSchema": "gamecult.eve.command_receipt.v1", "stateAuthority": "proposes-plugin-state-only-provider-accepts" } diff --git a/plugins/incubating/sai-vn.plugin.json b/plugins/incubating/sai-vn.plugin.json index 8fece20..38841ee 100644 --- a/plugins/incubating/sai-vn.plugin.json +++ b/plugins/incubating/sai-vn.plugin.json @@ -47,7 +47,7 @@ "requestSchema": "gamecult.eve.plugin_abi.request.v1", "responseSchema": "gamecult.eve.plugin_abi.response.v1", "operations": ["describe", "validate", "project", "lower", "measure", "apply"], - "commandEnvelope": "gamecult.eve.command.v1", + "commandEnvelope": "gamecult.eve.command_invocation.v1", "receiptSchema": "gamecult.eve.command_receipt.v1", "stateAuthority": "proposes-plugin-state-only-provider-accepts" } diff --git a/plugins/incubating/tex-math.plugin-advertisement.json b/plugins/incubating/tex-math.plugin-advertisement.json index 17ca946..5baee6f 100644 --- a/plugins/incubating/tex-math.plugin-advertisement.json +++ b/plugins/incubating/tex-math.plugin-advertisement.json @@ -19,7 +19,7 @@ "requestSchema": "gamecult.eve.plugin_abi.request.v1", "responseSchema": "gamecult.eve.plugin_abi.response.v1", "operations": ["describe", "validate", "project", "lower", "measure", "apply"], - "commandEnvelope": "gamecult.eve.command.v1", + "commandEnvelope": "gamecult.eve.command_invocation.v1", "receiptSchema": "gamecult.eve.plugin_receipt.v1", "stateAuthority": "emits-render-results-only-provider-owns-source-state" } diff --git a/plugins/incubating/tex-math.plugin.json b/plugins/incubating/tex-math.plugin.json index 95baec4..645ed32 100644 --- a/plugins/incubating/tex-math.plugin.json +++ b/plugins/incubating/tex-math.plugin.json @@ -28,7 +28,7 @@ "requestSchema": "gamecult.eve.plugin_abi.request.v1", "responseSchema": "gamecult.eve.plugin_abi.response.v1", "operations": ["describe", "validate", "project", "lower", "measure", "apply"], - "commandEnvelope": "gamecult.eve.command.v1", + "commandEnvelope": "gamecult.eve.command_invocation.v1", "receiptSchema": "gamecult.eve.plugin_receipt.v1", "stateAuthority": "emits-render-results-only-provider-owns-source-state" } diff --git a/runtimes/incubating/eve-electron/eve-runtime-capability.json b/runtimes/incubating/eve-electron/eve-runtime-capability.json index e93038a..51282ee 100644 --- a/runtimes/incubating/eve-electron/eve-runtime-capability.json +++ b/runtimes/incubating/eve-electron/eve-runtime-capability.json @@ -66,7 +66,7 @@ } ], "commandTransport": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "status": "provider-shell-contract-skeleton", "emitter": "EveElectronShell.createCommandIntent", "clientId": "electron-shell", diff --git a/runtimes/incubating/eve-electron/src/eve-electron-shell.mjs b/runtimes/incubating/eve-electron/src/eve-electron-shell.mjs index 49be2da..6a91bfd 100644 --- a/runtimes/incubating/eve-electron/src/eve-electron-shell.mjs +++ b/runtimes/incubating/eve-electron/src/eve-electron-shell.mjs @@ -61,7 +61,7 @@ export class EveElectronShell { const intent = { type: "surface-command", - schema: "gamecult.eve.command.v1", + schema: "gamecult.eve.command_invocation.v1", providerId: selected.providerId, surfaceId: selected.surfaceId, command, diff --git a/runtimes/incubating/eve-electron/test/eve-electron-shell.test.mjs b/runtimes/incubating/eve-electron/test/eve-electron-shell.test.mjs index 892471f..ebdd486 100644 --- a/runtimes/incubating/eve-electron/test/eve-electron-shell.test.mjs +++ b/runtimes/incubating/eve-electron/test/eve-electron-shell.test.mjs @@ -38,7 +38,7 @@ test("command intents carry provider-advertised boundaries over component fallba }, ); - assert.equal(intent.schema, "gamecult.eve.command.v1"); + assert.equal(intent.schema, "gamecult.eve.command_invocation.v1"); assert.equal(intent.providerId, "aetheria"); assert.equal(intent.surfaceId, "aetheria.daemon.game"); assert.equal(intent.commandBoundary, "aetheria.daemon.commands"); diff --git a/runtimes/incubating/eve-tui/eve-runtime-capability.json b/runtimes/incubating/eve-tui/eve-runtime-capability.json index 26bdd3d..025b8f8 100644 --- a/runtimes/incubating/eve-tui/eve-runtime-capability.json +++ b/runtimes/incubating/eve-tui/eve-runtime-capability.json @@ -71,7 +71,7 @@ } ], "commandTransport": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "status": "provider-shell-contract-skeleton", "emitter": "EveTuiShell.createCommandIntent", "clientId": "tui", diff --git a/runtimes/incubating/eve-tui/src/eve-tui-shell.mjs b/runtimes/incubating/eve-tui/src/eve-tui-shell.mjs index 1d358a9..4870604 100644 --- a/runtimes/incubating/eve-tui/src/eve-tui-shell.mjs +++ b/runtimes/incubating/eve-tui/src/eve-tui-shell.mjs @@ -39,7 +39,7 @@ export class EveTuiShell { ); const intent = { type: "surface-command", - schema: "gamecult.eve.command.v1", + schema: "gamecult.eve.command_invocation.v1", providerId: selected.providerId, surfaceId: selected.surfaceId, command, diff --git a/runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs b/runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs index cdc4530..2c63c63 100644 --- a/runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs +++ b/runtimes/incubating/eve-tui/test/eve-tui-shell.test.mjs @@ -38,7 +38,7 @@ test("command intents carry provider-advertised boundaries", () => { }, ); - assert.equal(intent.schema, "gamecult.eve.command.v1"); + assert.equal(intent.schema, "gamecult.eve.command_invocation.v1"); assert.equal(intent.providerId, "aetheria"); assert.equal(intent.surfaceId, "aetheria.daemon.game"); assert.equal(intent.commandBoundary, "aetheria.daemon.commands"); diff --git a/schemas/gamecult.eve.command.v1.schema.json b/schemas/gamecult.eve.command.v1.schema.json index ad46a52..f66b28d 100644 --- a/schemas/gamecult.eve.command.v1.schema.json +++ b/schemas/gamecult.eve.command.v1.schema.json @@ -5,31 +5,14 @@ "type": "object", "required": ["schema", "command"], "properties": { - "schema": { - "const": "gamecult.eve.command.v1" - }, - "command": { - "type": "string", - "minLength": 1 - }, - "label": { - "type": "string" - }, - "surfaceId": { - "type": "string" - }, - "transport": { - "type": "string" - }, - "authority": { - "type": "string" - }, - "result": { - "type": "string" - }, - "payloadSchema": { - "type": "string" - } + "schema": { "const": "gamecult.eve.command.v1" }, + "command": { "type": "string", "minLength": 1 }, + "label": { "type": "string" }, + "surfaceId": { "type": "string" }, + "transport": { "type": "string" }, + "authority": { "type": "string" }, + "result": { "type": "string" }, + "payloadSchema": { "type": "string" } }, "additionalProperties": true } diff --git a/schemas/gamecult.eve.command_invocation.v1.schema.json b/schemas/gamecult.eve.command_invocation.v1.schema.json new file mode 100644 index 0000000..e3697fb --- /dev/null +++ b/schemas/gamecult.eve.command_invocation.v1.schema.json @@ -0,0 +1,39 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "gamecult.eve.command_invocation.v1", + "title": "Eve Command Invocation", + "type": "object", + "required": [ + "schema", + "providerId", + "surfaceId", + "operation", + "payload", + "issuedAt", + "clientId", + "commandBoundary", + "receiptSchema" + ], + "properties": { + "schema": { "const": "gamecult.eve.command_invocation.v1" }, + "providerId": { "type": "string", "minLength": 1 }, + "surfaceId": { "type": "string", "minLength": 1 }, + "operation": { + "type": "object", + "required": ["operationId"], + "properties": { + "operationId": { "type": "string", "minLength": 1 }, + "schemaId": { "type": "string" }, + "idempotencyKey": { "type": "string" }, + "routeHint": { "type": "object" } + }, + "additionalProperties": true + }, + "payload": { "type": "object" }, + "issuedAt": { "type": "string" }, + "clientId": { "type": "string", "minLength": 1 }, + "commandBoundary": { "type": "string", "minLength": 1 }, + "receiptSchema": { "type": "string", "minLength": 1 } + }, + "additionalProperties": false +} diff --git a/schemas/gamecult.eve.command_receipt.v1.schema.json b/schemas/gamecult.eve.command_receipt.v1.schema.json index 161cd27..c307f1c 100644 --- a/schemas/gamecult.eve.command_receipt.v1.schema.json +++ b/schemas/gamecult.eve.command_receipt.v1.schema.json @@ -6,10 +6,14 @@ "required": [ "schema", "receiptId", + "commandId", "command", "state", "ownerRepo", - "authority" + "authority", + "providerId", + "surfaceId", + "sourceVersion" ], "properties": { "schema": { @@ -60,6 +64,10 @@ }, "issuedAtUtc": { "type": "string" + }, + "sourceVersion": { + "type": "integer", + "minimum": 0 } }, "additionalProperties": true diff --git a/schemas/gamecult.eve.provider_advertisement.v1.schema.json b/schemas/gamecult.eve.provider_advertisement.v1.schema.json index 22b09d0..cf66b82 100644 --- a/schemas/gamecult.eve.provider_advertisement.v1.schema.json +++ b/schemas/gamecult.eve.provider_advertisement.v1.schema.json @@ -125,6 +125,9 @@ "key": { "type": "string" }, + "recordRef": { + "type": "string" + }, "url": { "type": "string" }, @@ -170,10 +173,19 @@ "type": "string", "minLength": 1 }, + "commandRecordRef": { + "type": "string" + }, "receiptSchema": { "type": "string", "minLength": 1 }, + "receiptRecordRef": { + "type": "string" + }, + "assetManifestRecordRef": { + "type": "string" + }, "loweringTargets": { "type": "array", "items": { diff --git a/scripts/run-eveelectron-lifecycle-smoke.ps1 b/scripts/run-eveelectron-lifecycle-smoke.ps1 index 1e0615c..dff9f0b 100644 --- a/scripts/run-eveelectron-lifecycle-smoke.ps1 +++ b/scripts/run-eveelectron-lifecycle-smoke.ps1 @@ -96,7 +96,7 @@ foreach ($pluginId in $expectedPlugins.Keys) { } } -if ($manifest.commandTransport.schema -ne "gamecult.eve.command.v1") { +if ($manifest.commandTransport.schema -ne "gamecult.eve.command_invocation.v1") { throw "Unexpected EveElectron command schema: $($manifest.commandTransport.schema)" } if ($manifest.commandTransport.status -ne "provider-shell-contract-skeleton") { diff --git a/scripts/run-eveflutter-conformance-consumer-smoke.ps1 b/scripts/run-eveflutter-conformance-consumer-smoke.ps1 index cfe3986..36c16ff 100644 --- a/scripts/run-eveflutter-conformance-consumer-smoke.ps1 +++ b/scripts/run-eveflutter-conformance-consumer-smoke.ps1 @@ -51,7 +51,7 @@ try { --expect-runtime android-flutter ` --expect-runtime-status windows-flutter:active ` --expect-runtime-feature windows-flutter:embeddedDocuments ` - --expect-runtime-command-schema windows-flutter:gamecult.eve.command.v1 ` + --expect-runtime-command-schema windows-flutter:gamecult.eve.command_invocation.v1 ` --expect-runtime-capture-status windows-flutter:golden ` --expect-split-target EveFlutter if ($LASTEXITCODE -ne 0) { diff --git a/scripts/run-evetui-lifecycle-smoke.ps1 b/scripts/run-evetui-lifecycle-smoke.ps1 index ddf52d5..6147732 100644 --- a/scripts/run-evetui-lifecycle-smoke.ps1 +++ b/scripts/run-evetui-lifecycle-smoke.ps1 @@ -93,7 +93,7 @@ foreach ($pluginId in $expectedPlugins.Keys) { } } -if ($manifest.commandTransport.schema -ne "gamecult.eve.command.v1") { +if ($manifest.commandTransport.schema -ne "gamecult.eve.command_invocation.v1") { throw "Unexpected EveTui command schema: $($manifest.commandTransport.schema)" } if ($manifest.commandTransport.status -ne "provider-shell-contract-skeleton") { diff --git a/scripts/run-eveunity-lifecycle-smoke.ps1 b/scripts/run-eveunity-lifecycle-smoke.ps1 index 2989d5f..f7fddaa 100644 --- a/scripts/run-eveunity-lifecycle-smoke.ps1 +++ b/scripts/run-eveunity-lifecycle-smoke.ps1 @@ -65,7 +65,7 @@ foreach ($claim in @( } } -if ($manifest.commandTransport.schema -ne "gamecult.eve.command.v1") { +if ($manifest.commandTransport.schema -ne "gamecult.eve.command_invocation.v1") { throw "Unexpected EveUnity command schema: $($manifest.commandTransport.schema)" } diff --git a/scripts/run-plugin-owner-conformance-consumer-smoke.ps1 b/scripts/run-plugin-owner-conformance-consumer-smoke.ps1 index ce9a328..26d5afe 100644 --- a/scripts/run-plugin-owner-conformance-consumer-smoke.ps1 +++ b/scripts/run-plugin-owner-conformance-consumer-smoke.ps1 @@ -86,7 +86,7 @@ node $consumerScript $consumerExport ` --expect-plugin-runtime-field sai.vn:sidecar.requestSchema:gamecult.eve.plugin_abi.request.v1 ` --expect-plugin-runtime-field sai.vn:sidecar.responseSchema:gamecult.eve.plugin_abi.response.v1 ` --expect-plugin-runtime-field sai.vn:sidecar.stateAuthority:proposes-plugin-state-only-provider-accepts ` - --expect-plugin-abi-field sai.vn:lower:expect.commandEnvelope:gamecult.eve.command.v1 ` + --expect-plugin-abi-field sai.vn:lower:expect.commandEnvelope:gamecult.eve.command_invocation.v1 ` --expect-plugin-abi-field sai.vn:apply:expect.receiptSchema:gamecult.eve.command_receipt.v1 ` --expect-plugin-runtime norn.graph:executable-sidecar ` --expect-plugin-runtime-transport norn.graph:stdio ` diff --git a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 index 0e96e03..66dc877 100644 --- a/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 +++ b/scripts/run-runtime-owner-conformance-consumer-smoke.ps1 @@ -151,12 +151,12 @@ node $consumerScript $consumerExport ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:tui:norn.graph:optional-supported:EveTui ` --expect-provider-runtime-plugin-projection gamecult.home.vn:sai.visual_novel.surface:tui:tex.math:optional-supported:EveTui ` --expect-runtime-handoff unity-uitoolkit ` - --expect-runtime-command-schema web:gamecult.eve.command.v1 ` - --expect-runtime-command-schema windows-flutter:gamecult.eve.command.v1 ` - --expect-runtime-command-schema unity-uitoolkit:gamecult.eve.command.v1 ` - --expect-runtime-command-schema unity-scene:gamecult.eve.command.v1 ` - --expect-runtime-command-schema electron-shell:gamecult.eve.command.v1 ` - --expect-runtime-command-schema tui:gamecult.eve.command.v1 ` + --expect-runtime-command-schema web:gamecult.eve.command_invocation.v1 ` + --expect-runtime-command-schema windows-flutter:gamecult.eve.command_invocation.v1 ` + --expect-runtime-command-schema unity-uitoolkit:gamecult.eve.command_invocation.v1 ` + --expect-runtime-command-schema unity-scene:gamecult.eve.command_invocation.v1 ` + --expect-runtime-command-schema electron-shell:gamecult.eve.command_invocation.v1 ` + --expect-runtime-command-schema tui:gamecult.eve.command_invocation.v1 ` --expect-runtime-capture-status web:chrome-headless ` --expect-runtime-capture-status windows-flutter:golden ` --expect-runtime-capture-status linux-flutter:ssh-golden ` diff --git a/tools/conformance/consume-export.mjs b/tools/conformance/consume-export.mjs index 92f7a0e..37e7cf5 100644 --- a/tools/conformance/consume-export.mjs +++ b/tools/conformance/consume-export.mjs @@ -850,7 +850,7 @@ function validateIndex(index, directory, expectations, errors) { if (!providers.some(provider => provider.providerId === "aetheria" && provider.scenarioPath)) { errors.push("providers:aetheria:scenarioPath:missing"); } - if (!runtimes.some(runtime => runtime.runtimeId === "unity-uitoolkit" && runtime.commandTransportSchema === "gamecult.eve.command.v1")) { + if (!runtimes.some(runtime => runtime.runtimeId === "unity-uitoolkit" && runtime.commandTransportSchema === "gamecult.eve.command_invocation.v1")) { errors.push("runtimes:unity-uitoolkit:commandTransportSchema:missing"); } if (!splitTargets.some(target => target.id === "EveUnity")) { @@ -1061,8 +1061,8 @@ function validateCommandBoundaryCoverage(records, errors) { for (const field of ["providerId", "providerOwnerRepo", "surfaceId", "targetId", "runtimeId", "runtimeOwnerRepo", "status", "severity", "commandBoundary", "receiptSchema"]) { if (!record?.[field]) errors.push(`commandBoundaryCoverage:${index}:${field}:missing`); } - if (record?.status === "covered" && record.runtimeCommandSchema !== "gamecult.eve.command.v1") { - errors.push(`commandBoundaryCoverage:${index}:runtimeCommandSchema:expected gamecult.eve.command.v1 got ${record.runtimeCommandSchema || ""}`); + if (record?.status === "covered" && record.runtimeCommandSchema !== "gamecult.eve.command_invocation.v1") { + errors.push(`commandBoundaryCoverage:${index}:runtimeCommandSchema:expected gamecult.eve.command_invocation.v1 got ${record.runtimeCommandSchema || ""}`); } } } diff --git a/tools/conformance/eveconformance-handoff.json b/tools/conformance/eveconformance-handoff.json index f979f44..888c80b 100644 --- a/tools/conformance/eveconformance-handoff.json +++ b/tools/conformance/eveconformance-handoff.json @@ -76,6 +76,7 @@ "contractInputs": [ "gamecult.eve.surface.v1", "gamecult.eve.command.v1", + "gamecult.eve.command_invocation.v1", "gamecult.eve.command_receipt.v1", "gamecult.eve.conformance_export.v1", "gamecult.eve.conformance_handoff.v1", diff --git a/tools/parity/parity-manifest.json b/tools/parity/parity-manifest.json index 20e7769..ee55cc1 100644 --- a/tools/parity/parity-manifest.json +++ b/tools/parity/parity-manifest.json @@ -11,6 +11,7 @@ "gamecult.eve.conformance_export.v1": "schemas/gamecult.eve.conformance_export.v1.schema.json", "gamecult.eve.capability_matrix.v1": "schemas/gamecult.eve.capability_matrix.v1.schema.json", "gamecult.eve.command.v1": "schemas/gamecult.eve.command.v1.schema.json", + "gamecult.eve.command_invocation.v1": "schemas/gamecult.eve.command_invocation.v1.schema.json", "gamecult.eve.command_receipt.v1": "schemas/gamecult.eve.command_receipt.v1.schema.json", "gamecult.eve.plugin.v1": "schemas/gamecult.eve.plugin.v1.schema.json", "gamecult.eve.plugin_receipt.v1": "schemas/gamecult.eve.plugin_receipt.v1.schema.json", @@ -372,7 +373,7 @@ "schemaPath": "schemas/gamecult.eve.provider_advertisement.v1.schema.json", "advertisementPath": "web/fixtures/sai-vn.provider-advertisement.json", "requiredFixtures": [], - "expectedSchemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "sai.vn.story_session.v1"], + "expectedSchemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "gamecult.eve.command_invocation.v1", "sai.vn.story_session.v1"], "expectedSurfaces": ["sai.visual_novel.surface"], "expectedCommands": ["story.continue", "story.choose", "story.jump", "style.patch"] }, @@ -388,7 +389,7 @@ "scenarioPath": "web/fixtures/aetheria-world-scenario.json", "handoffPath": "web/fixtures/aetheria-provider-handoff.json", "requiredFixtures": ["aetheria-world"], - "expectedSchemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "gamecult.eve.unity_playable_world_asset_manifest.v1", "aetheria.runtime.daemon.frame.v1"], + "expectedSchemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "gamecult.eve.command_invocation.v1", "gamecult.eve.unity_playable_world_asset_manifest.v1", "aetheria.runtime.daemon.frame.v1"], "expectedSurfaces": ["aetheria.daemon.game", "aetheria.daemon.editor"], "expectedSurfaceKinds": { "aetheria.daemon.game": "interactive-world", @@ -412,7 +413,7 @@ "advertisementPath": "web/fixtures/eve-world-smoke.provider-advertisement.json", "scenarioPath": "web/fixtures/eve-world-smoke-scenario.json", "requiredFixtures": ["eve-world-smoke"], - "expectedSchemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "eve.world_smoke.frame.v1", "eve.world_smoke.command_receipt.v1"], + "expectedSchemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "gamecult.eve.command_invocation.v1", "eve.world_smoke.frame.v1", "eve.world_smoke.command_receipt.v1"], "expectedSurfaces": ["eve.world-smoke.surface"], "expectedSurfaceKinds": { "eve.world-smoke.surface": "interactive-world" @@ -446,7 +447,7 @@ "protocol": "cultmesh-rpc-with-stdio-dev-transport", "requestSchema": "gamecult.eve.plugin_abi.request.v1", "responseSchema": "gamecult.eve.plugin_abi.response.v1", - "commandEnvelope": "gamecult.eve.command.v1", + "commandEnvelope": "gamecult.eve.command_invocation.v1", "receiptSchema": "gamecult.eve.command_receipt.v1", "stateAuthority": "proposes-plugin-state-only-provider-accepts" } @@ -472,6 +473,8 @@ "kind": "external-owner", "ownerRepo": "Norn", "repoRole": "plugin-owner", + "splitTarget": "Norn", + "graduationTrigger": "Graduated: Norn owns graph semantics, fixtures, ABI sidecar, and release lifecycle.", "capabilities": ["embed.norn", "graph.node.activate"], "expectedRuntime": { "invocationModel": "executable-sidecar", @@ -483,7 +486,7 @@ "protocol": "stdio-ndjson", "requestSchema": "gamecult.eve.plugin_abi.request.v1", "responseSchema": "gamecult.eve.plugin_abi.response.v1", - "commandEnvelope": "gamecult.eve.command.v1", + "commandEnvelope": "gamecult.eve.command_invocation.v1", "receiptSchema": "gamecult.eve.command_receipt.v1", "stateAuthority": "proposes-plugin-state-only-provider-accepts" } @@ -520,7 +523,7 @@ "protocol": "cultmesh-rpc-with-stdio-dev-transport", "requestSchema": "gamecult.eve.plugin_abi.request.v1", "responseSchema": "gamecult.eve.plugin_abi.response.v1", - "commandEnvelope": "gamecult.eve.command.v1", + "commandEnvelope": "gamecult.eve.command_invocation.v1", "receiptSchema": "gamecult.eve.plugin_receipt.v1", "stateAuthority": "emits-render-results-only-provider-owns-source-state" } @@ -1281,12 +1284,12 @@ } ], "commandTransportSmoke": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "expectedPaths": ["packages/eve-browser-lowering/src/index.ts", "packages/eve-browser-lowering/test/browser-lowering.test.mjs", "web/surface.js"], "expectedSourceSymbols": [ { "path": "packages/eve-browser-lowering/src/index.ts", - "contains": ["EveCommandIntent", "createEveCommandIntent", "schema: \"gamecult.eve.command.v1\"", "clientId", "commandBoundary", "receiptSchema", "activeSurfaceId"] + "contains": ["EveCommandIntent", "createEveCommandIntent", "schema: \"gamecult.eve.command_invocation.v1\"", "clientId", "commandBoundary", "receiptSchema", "activeSurfaceId"] }, { "path": "packages/eve-browser-lowering/test/browser-lowering.test.mjs", @@ -1404,12 +1407,12 @@ } ], "commandTransportSmoke": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "expectedPaths": ["flutter/eve_parity/lib/main.dart", "flutter/eve_parity/test/parity_smoke_test.dart"], "expectedSourceSymbols": [ { "path": "flutter/eve_parity/lib/main.dart", - "contains": ["EveCommandIntent", "createEveCommandIntent", "resolveComponentCommandId", "commandSink", "gamecult.eve.command.v1", "flutter-parity"] + "contains": ["EveCommandIntent", "createEveCommandIntent", "resolveComponentCommandId", "commandSink", "gamecult.eve.command_invocation.v1", "flutter-parity"] }, { "path": "flutter/eve_parity/test/parity_smoke_test.dart", @@ -1459,12 +1462,12 @@ } ], "commandTransportSmoke": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "expectedPaths": ["flutter/eve_parity/lib/main.dart", "flutter/eve_parity/test/parity_smoke_test.dart"], "expectedSourceSymbols": [ { "path": "flutter/eve_parity/lib/main.dart", - "contains": ["EveCommandIntent", "createEveCommandIntent", "resolveComponentCommandId", "commandSink", "gamecult.eve.command.v1", "flutter-parity"] + "contains": ["EveCommandIntent", "createEveCommandIntent", "resolveComponentCommandId", "commandSink", "gamecult.eve.command_invocation.v1", "flutter-parity"] }, { "path": "flutter/eve_parity/test/parity_smoke_test.dart", @@ -1538,12 +1541,12 @@ } ], "commandTransportSmoke": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "expectedPaths": ["flutter/eve_parity/lib/main.dart", "flutter/eve_parity/test/parity_smoke_test.dart"], "expectedSourceSymbols": [ { "path": "flutter/eve_parity/lib/main.dart", - "contains": ["EveCommandIntent", "createEveCommandIntent", "resolveComponentCommandId", "commandSink", "gamecult.eve.command.v1", "flutter-parity"] + "contains": ["EveCommandIntent", "createEveCommandIntent", "resolveComponentCommandId", "commandSink", "gamecult.eve.command_invocation.v1", "flutter-parity"] }, { "path": "flutter/eve_parity/test/parity_smoke_test.dart", @@ -1675,7 +1678,7 @@ } ], "commandTransportSmoke": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "expectedPaths": [ "packages/org.gamecult.eve.surface/Runtime/EveSurfaceDocument.cs", "packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceLowerer.cs" @@ -1683,7 +1686,7 @@ "expectedSourceSymbols": [ { "path": "packages/org.gamecult.eve.surface/Runtime/EveSurfaceDocument.cs", - "contains": ["EveSurfaceCommandRequest", "SchemaId", "gamecult.eve.command.v1", "ClientId"] + "contains": ["EveSurfaceCommandRequest", "SchemaId", "gamecult.eve.command_invocation.v1", "ClientId"] }, { "path": "packages/org.gamecult.eve.unity-uitoolkit/Runtime/EveUiToolkitSurfaceLowerer.cs", @@ -1895,7 +1898,7 @@ "demotionReason": "Fensalir has an external Aquarium.EveSurface adapter spike and a recorded gamecult.eve.surface.v1 adapter fixture, but Eve still has no Direct2D frame capture or runtime-owned command smoke.", "activationCriteria": [ "Fensalir runs recorded gamecult.eve.surface.v1 fixtures without provider-specific renderer knowledge.", - "Fensalir emits gamecult.eve.command.v1 intents through the advertised provider command boundary.", + "Fensalir emits gamecult.eve.command_invocation.v1 intents through the advertised provider command boundary.", "Direct2D capture artifacts are produced and attached to the parity report." ], "requiredFixtures": ["fensalir-direct2d"], diff --git a/tools/parity/run-parity.mjs b/tools/parity/run-parity.mjs index 20660e3..e691535 100644 --- a/tools/parity/run-parity.mjs +++ b/tools/parity/run-parity.mjs @@ -1400,8 +1400,8 @@ async function validateRuntimeCommandTransportSmoke(runtime) { if (!smoke) return []; const errors = []; - if (smoke.schema !== "gamecult.eve.command.v1") { - errors.push(`schema:expected gamecult.eve.command.v1 got ${smoke.schema || ""}`); + if (smoke.schema !== "gamecult.eve.command_invocation.v1") { + errors.push(`schema:expected gamecult.eve.command_invocation.v1 got ${smoke.schema || ""}`); } for (const candidate of smoke.expectedPaths || []) { @@ -3261,7 +3261,7 @@ function collectCommandBoundaryCoverage(report) { status = "missing-runtime-claim"; } else if (missingProviderBoundary) { status = "missing-provider-boundary"; - } else if (runtimeCommandSchema !== "gamecult.eve.command.v1") { + } else if (runtimeCommandSchema !== "gamecult.eve.command_invocation.v1") { status = "missing-command-transport"; } coverage.push({ diff --git a/web/eve-runtime-capability.json b/web/eve-runtime-capability.json index e4a5416..275a453 100644 --- a/web/eve-runtime-capability.json +++ b/web/eve-runtime-capability.json @@ -44,7 +44,7 @@ ], "unsupportedPlugins": [], "commandTransport": { - "schema": "gamecult.eve.command.v1", + "schema": "gamecult.eve.command_invocation.v1", "emitter": "createEveCommandIntent", "clientId": "browser.reference" }, diff --git a/web/fixtures/aetheria-provider-handoff.json b/web/fixtures/aetheria-provider-handoff.json index be84dac..a2862aa 100644 --- a/web/fixtures/aetheria-provider-handoff.json +++ b/web/fixtures/aetheria-provider-handoff.json @@ -48,6 +48,7 @@ "contractInputs": [ "gamecult.eve.surface.v1", "gamecult.eve.command.v1", + "gamecult.eve.command_invocation.v1", "gamecult.eve.unity_playable_world_asset_manifest.v1", "gamecult.eve.provider_advertisement.v1", "gamecult.eve.provider_scenario.v1", diff --git a/web/fixtures/aetheria-world-scenario.json b/web/fixtures/aetheria-world-scenario.json index dc895c5..759e34b 100644 --- a/web/fixtures/aetheria-world-scenario.json +++ b/web/fixtures/aetheria-world-scenario.json @@ -26,7 +26,7 @@ } ], "commands": ["aetheria.daemon.commands"], - "schemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "aetheria.eve_command_acceptance_status.v1"] + "schemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "gamecult.eve.command_invocation.v1", "aetheria.eve_command_acceptance_status.v1"] }, "commandIntents": [ { diff --git a/web/fixtures/aetheria.provider-advertisement.json b/web/fixtures/aetheria.provider-advertisement.json index 5c39370..b108264 100644 --- a/web/fixtures/aetheria.provider-advertisement.json +++ b/web/fixtures/aetheria.provider-advertisement.json @@ -39,6 +39,7 @@ "aetheria.runtime.daemon.command.v1", "gamecult.eve.surface.v1", "gamecult.eve.command.v1", + "gamecult.eve.command_invocation.v1", "gamecult.eve.unity_playable_world_asset_manifest.v1" ], "witnesses": [ diff --git a/web/fixtures/eve-world-smoke-scenario.json b/web/fixtures/eve-world-smoke-scenario.json index 0fd3d68..b06c6f4 100644 --- a/web/fixtures/eve-world-smoke-scenario.json +++ b/web/fixtures/eve-world-smoke-scenario.json @@ -19,7 +19,7 @@ } ], "commands": ["eve.world-smoke.commands"], - "schemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "eve.world_smoke.command_receipt.v1"] + "schemas": ["gamecult.eve.surface.v1", "gamecult.eve.command.v1", "gamecult.eve.command_invocation.v1", "eve.world_smoke.command_receipt.v1"] }, "commandIntents": [ { diff --git a/web/fixtures/eve-world-smoke.provider-advertisement.json b/web/fixtures/eve-world-smoke.provider-advertisement.json index 9d7a93c..2dfc760 100644 --- a/web/fixtures/eve-world-smoke.provider-advertisement.json +++ b/web/fixtures/eve-world-smoke.provider-advertisement.json @@ -19,7 +19,8 @@ "eve.world_smoke.frame.v1", "eve.world_smoke.command_receipt.v1", "gamecult.eve.surface.v1", - "gamecult.eve.command.v1" + "gamecult.eve.command.v1", + "gamecult.eve.command_invocation.v1" ], "witnesses": [ { diff --git a/web/fixtures/sai-vn.provider-advertisement.json b/web/fixtures/sai-vn.provider-advertisement.json index 1b6e315..1075429 100644 --- a/web/fixtures/sai-vn.provider-advertisement.json +++ b/web/fixtures/sai-vn.provider-advertisement.json @@ -18,6 +18,7 @@ "schemas": [ "gamecult.eve.surface.v1", "gamecult.eve.command.v1", + "gamecult.eve.command_invocation.v1", "sai.vn.story_session.v1", "sai.vn.visual_manifest.v1", "norn.graph.document.v1",