diff --git a/docs/plugin-architecture.md b/docs/plugin-architecture.md index 097d822..c102a7b 100644 --- a/docs/plugin-architecture.md +++ b/docs/plugin-architecture.md @@ -58,6 +58,13 @@ Providers own: - reconciliation; - side effects. +Command delivery returns `gamecult.eve.command_result.v1`. The generic result +always contains the provider's persisted receipt and may carry a transient Eve +projection. A single optional plugin payload names its plugin id and schema; +only that plugin's renderer adapter may consume it. The payload cannot accept a +provider command or mutate provider state, so plugin rendering never becomes a +shadow authority. + Odin/CultMesh owns: - provider advertisement discovery; diff --git a/docs/surface-contract-v1.md b/docs/surface-contract-v1.md index bb7b9aa..b8a7039 100644 --- a/docs/surface-contract-v1.md +++ b/docs/surface-contract-v1.md @@ -247,14 +247,20 @@ invocations use `gamecult.eve.command_invocation.v1`: ```json { - "type": "surface-command", "schema": "gamecult.eve.command_invocation.v1", "providerId": "gamecult.home.vn", "surfaceId": "sai.visual_novel.surface", - "command": "story.choose", + "operation": { + "operationId": "story.choose", + "schemaId": "sai.story_choice.v1", + "idempotencyKey": "21a816d5-7ed5-4513-afb0-0a9bc9aa334b", + "routeHint": { "sourceVersion": 41 } + }, "payload": { "index": 0, "targetPath": "eve" }, "issuedAt": "2026-05-31T00:00:00.000Z", - "clientId": "browser.reference" + "clientId": "browser.reference", + "commandBoundary": "sai.commands", + "receiptSchema": "gamecult.eve.command_receipt.v1" } ``` @@ -283,6 +289,13 @@ are not the authoritative live command model and should not appear as public runtime construction APIs. Renderer command requests carry `CultMeshOperationInvocationDescriptor` values. +Editable controls remain state bindings rather than form-shaped command DTOs. +Bindings may additionally name their document and field, value kind, access +mode, authority, stable `bindingName`, and optional `writeCommand`. Renderers +keep unaccepted edits as local drafts. Operations declare `captureBindings` and +receive those values under `payload.bindings`; accepted command results may +request that exact bindings be cleared. HTML form elements are an accessibility +lowering detail, not part of Eve's public ontology. That invocation descriptor is the canonical operation identity at click/change time and preserves request schema, preferred route, and optional idempotency. Renderer command requests also carry `CultMeshOperationPayload`, a shared diff --git a/packages/eve-browser-lowering/README.md b/packages/eve-browser-lowering/README.md index ffe883f..f776573 100644 --- a/packages/eve-browser-lowering/README.md +++ b/packages/eve-browser-lowering/README.md @@ -7,9 +7,13 @@ This package owns the shared browser renderer contract: - `renderEveSurface(surface, host, options)` lowers an Eve surface document into a DOM host. - `renderEveComponent(component, options)` lowers a single component tree. - `applyEveSurfaceStyles(styles, body)` maps portable Eve style tokens to CSS custom properties. -- `createEveCommandIntent(commandId, props, options)` creates the browser command envelope for host daemons and carries the provider-advertised `commandBoundary` / `receiptSchema` when the active surface exposes `worldInteraction`. +- `createEveCommandIntent(commandId, props, options)` emits the canonical `gamecult.eve.command_invocation.v1` operation descriptor, including the provider-advertised command boundary and receipt schema, a source-version route hint, and a fresh idempotency key. - `EveBrowserProviderHost` owns advertisement-backed surface selection and uses one provider-neutral embedded-document resolver; provider schema dispatch stays behind the host transport boundary. +- Editable string, textarea, number, select, and choice controls use named Eve state bindings. The renderer preserves draft values by provider/surface/binding identity and an operation may capture those bindings atomically under `payload.bindings`. +- `gamecult.eve.command_result.v1` carries the persisted receipt, an optional one-time Eve projection, a binding-clear directive, and at most one plugin-scoped payload. Only the matching plugin adapter may consume that payload. Host applications own transport and command delivery. Providers own command acceptance and receipts through their advertisements. For example, Eir resolves surfaces through Odin/CultMesh and posts commands to `/eir/command`; Aetheria resolves surfaces through Electron IPC. Neither host should duplicate DOM lowering or import provider internals to find a command route. +An HTML `