@openwop/spec-artifacts 2.0.9 → 2.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CORPUS-STAMP.json +57 -57
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +1 -1
- package/package.json +1 -1
- package/schemas/v2/a2ui-surface-delta-frame.schema.json +1 -1
- package/schemas/v2/agent-deployment-transition.schema.json +1 -1
- package/schemas/v2/agent-deployment.schema.json +1 -1
- package/schemas/v2/agent-eval-suite.schema.json +1 -1
- package/schemas/v2/agent-inventory-response.schema.json +3 -3
- package/schemas/v2/agent-manifest.schema.json +1 -1
- package/schemas/v2/agent-org-chart.schema.json +1 -1
- package/schemas/v2/agent-roster-entry.schema.json +2 -2
- package/schemas/v2/agent-roster-response.schema.json +1 -1
- package/schemas/v2/annotation-create.schema.json +1 -1
- package/schemas/v2/annotation.schema.json +1 -1
- package/schemas/v2/audit-verify-result.schema.json +1 -1
- package/schemas/v2/capabilities.schema.json +19 -19
- package/schemas/v2/compact-tool-descriptor.schema.json +1 -1
- package/schemas/v2/eval-summary.schema.json +2 -2
- package/schemas/v2/localized-content-page-response.schema.json +1 -1
- package/schemas/v2/localized-content-page.schema.json +1 -1
- package/schemas/v2/org-chart-responsibility-view.schema.json +1 -1
- package/schemas/v2/prompt-pack-manifest.schema.json +2 -2
- package/schemas/v2/residency.schema.json +1 -1
- package/schemas/v2/run-ancestry-response.schema.json +1 -1
- package/schemas/v2/run-diff-response.schema.json +1 -1
- package/schemas/v2/run-event-payloads.schema.json +4 -4
- package/schemas/v2/run-options.schema.json +1 -1
- package/schemas/v2/run-snapshot.schema.json +1 -1
- package/schemas/v2/tool-descriptor.schema.json +1 -1
- package/schemas/v2/trigger-subscription-registration.schema.json +1 -1
- package/schemas/v2/workflow-definition.schema.json +1 -1
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v2/README.md +1 -1
- package/spec/v2/core/capabilities.md +5 -1
- package/spec/v2/core/conformance.md +1 -1
- package/spec/v2/core/connection-packs.md +1 -1
- package/spec/v2/core/errors.md +1 -1
- package/spec/v2/core/events.md +1 -1
- package/spec/v2/core/form-content-packs.md +1 -1
- package/spec/v2/core/headers.md +1 -1
- package/spec/v2/core/idempotency.md +1 -1
- package/spec/v2/core/identity.md +6 -2
- package/spec/v2/core/interop.md +1 -1
- package/spec/v2/core/interrupt.md +1 -1
- package/spec/v2/core/overview.md +1 -1
- package/spec/v2/core/packs.md +1 -1
- package/spec/v2/core/persistence.md +1 -1
- package/spec/v2/core/replay.md +1 -1
- package/spec/v2/core/runs.md +1 -1
- package/spec/v2/core/security-defaults.md +1 -1
- package/spec/v2/core/versioning.md +10 -10
- package/spec/v2/core/webhooks.md +1 -1
- package/spec/v2/core/workflow-chain-packs.md +1 -1
- package/spec/v2/release.json +2 -2
|
@@ -894,7 +894,7 @@
|
|
|
894
894
|
},
|
|
895
895
|
"endpointsSupported": {
|
|
896
896
|
"type": "boolean",
|
|
897
|
-
"description": "RFC 0028 §A. When `true`, the host serves the `/
|
|
897
|
+
"description": "RFC 0028 §A. When `true`, the host serves the `/prompts*` REST surface — at minimum the read endpoints (`listPromptTemplates`, `getPromptTemplate`, `renderPromptTemplate`). The mutating endpoints additionally require `mutableLibrary: true`; the pack-install path additionally requires `packsSupported: true`. False or absent = every `/prompts*` request returns `501 capability_not_provided`. Independent of `supported` — a host MAY advertise `supported: true, endpointsSupported: false` (composition without library REST) or `supported: false, endpointsSupported: true` (library REST against an external resolver, e.g., a façade host)."
|
|
898
898
|
},
|
|
899
899
|
"templateKinds": {
|
|
900
900
|
"type": "array",
|
|
@@ -922,7 +922,7 @@
|
|
|
922
922
|
"type": "integer",
|
|
923
923
|
"minimum": 1,
|
|
924
924
|
"maximum": 65536,
|
|
925
|
-
"description": "Host limit on PromptTemplate.text length. MUST NOT exceed the schema cap (65536). When advertised, the host MUST reject larger bodies on install + on `POST /
|
|
925
|
+
"description": "Host limit on PromptTemplate.text length. MUST NOT exceed the schema cap (65536). When advertised, the host MUST reject larger bodies on install + on `POST /prompts` (RFC 0028)."
|
|
926
926
|
},
|
|
927
927
|
"observability": {
|
|
928
928
|
"type": "string",
|
|
@@ -935,11 +935,11 @@
|
|
|
935
935
|
},
|
|
936
936
|
"packsSupported": {
|
|
937
937
|
"type": "boolean",
|
|
938
|
-
"description": "RFC 0028 §C. When `true`, the host installs `kind: \"prompt\"` registry packs and exposes their templates at `GET /
|
|
938
|
+
"description": "RFC 0028 §C. When `true`, the host installs `kind: \"prompt\"` registry packs and exposes their templates at `GET /prompts` with `meta.source: \"pack\"` + `meta.packName` + `meta.packVersion`. When `false` or absent, packs are not loaded; only host built-ins and (when `mutableLibrary: true`) user-created templates are visible."
|
|
939
939
|
},
|
|
940
940
|
"mutableLibrary": {
|
|
941
941
|
"type": "boolean",
|
|
942
|
-
"description": "RFC 0028 §C. When `true`, the host honors the mutating endpoints `POST /
|
|
942
|
+
"description": "RFC 0028 §C. When `true`, the host honors the mutating endpoints `POST /prompts`, `PUT /prompts/{templateId}`, `DELETE /prompts/{templateId}`. When `false` or absent, those endpoints return 501. Pack-sourced and host-built-in templates remain read-only even under `mutableLibrary: true` — deletion of those returns 403 per RFC 0028 §A."
|
|
943
943
|
},
|
|
944
944
|
"library": {
|
|
945
945
|
"type": "object",
|
|
@@ -948,17 +948,17 @@
|
|
|
948
948
|
"properties": {
|
|
949
949
|
"id": {
|
|
950
950
|
"type": "string",
|
|
951
|
-
"description": "Host's library identifier exposed at `GET /
|
|
951
|
+
"description": "Host's library identifier exposed at `GET /prompts` (filterable via the structured `PromptRef.libraryId` field). Single-library hosts MAY omit this."
|
|
952
952
|
},
|
|
953
953
|
"renderEndpoint": {
|
|
954
954
|
"type": "string",
|
|
955
955
|
"format": "uri-reference",
|
|
956
|
-
"description": "Absolute or relative URI of the `:render` endpoint. Defaults to `/
|
|
956
|
+
"description": "Absolute or relative URI of the `:render` endpoint. Defaults to `/prompts:render`. Useful for hosts mounting the surface under a prefix."
|
|
957
957
|
},
|
|
958
958
|
"maxRenderRequestBytes": {
|
|
959
959
|
"type": "integer",
|
|
960
960
|
"minimum": 1,
|
|
961
|
-
"description": "Hard cap on `POST /
|
|
961
|
+
"description": "Hard cap on `POST /prompts:render` request body size."
|
|
962
962
|
}
|
|
963
963
|
}
|
|
964
964
|
},
|
|
@@ -2463,7 +2463,7 @@
|
|
|
2463
2463
|
},
|
|
2464
2464
|
"crossHostCausation": {
|
|
2465
2465
|
"type": "object",
|
|
2466
|
-
"description": "RFC 0040 §D — Phase 3 cross-host causation linking. When advertised, the host honors the cross-host `causationId` extension (a `causationHostId` field on event payloads pointing at the originating host), W3C `traceparent` propagation across MCP + A2A composition boundaries, and (when `ancestryEndpointSupported: true`) the `GET /
|
|
2466
|
+
"description": "RFC 0040 §D — Phase 3 cross-host causation linking. When advertised, the host honors the cross-host `causationId` extension (a `causationHostId` field on event payloads pointing at the originating host), W3C `traceparent` propagation across MCP + A2A composition boundaries, and (when `ancestryEndpointSupported: true`) the `GET /runs/{runId}/ancestry` cross-host parent-chain endpoint. Hosts advertising `version: 3` MUST advertise this sub-block with `supported: true` and a stable `hostId`.",
|
|
2467
2467
|
"additionalProperties": false,
|
|
2468
2468
|
"properties": {
|
|
2469
2469
|
"hostId": {
|
|
@@ -2473,7 +2473,7 @@
|
|
|
2473
2473
|
},
|
|
2474
2474
|
"ancestryEndpointSupported": {
|
|
2475
2475
|
"type": "boolean",
|
|
2476
|
-
"description": "Host serves `GET /
|
|
2476
|
+
"description": "Host serves `GET /runs/{runId}/ancestry` returning the cross-host parent chain per RFC 0040 §C. Optional even when crossHostCausation.supported is true — hosts that emit `causationHostId` but don't expose the ancestry-walking endpoint still satisfy the per-event chaining contract; this flag advertises the additional endpoint."
|
|
2477
2477
|
}
|
|
2478
2478
|
}
|
|
2479
2479
|
},
|
|
@@ -3003,7 +3003,7 @@
|
|
|
3003
3003
|
"tenant"
|
|
3004
3004
|
],
|
|
3005
3005
|
"default": "host",
|
|
3006
|
-
"description": "RFC 0074. Scope at which manifest agents are installed/approved and therefore enumerated by GET /v1/agents. 'host' (default): a single host-global inventory; the endpoint returns the same set for every caller (RFC 0072's original behavior). 'tenant': agents are installed per tenant·workspace (RFC 0048 owner triple); GET /
|
|
3006
|
+
"description": "RFC 0074. Scope at which manifest agents are installed/approved and therefore enumerated by GET /v1/agents. 'host' (default): a single host-global inventory; the endpoint returns the same set for every caller (RFC 0072's original behavior). 'tenant': agents are installed per tenant·workspace (RFC 0048 owner triple); GET /agents returns ONLY the agents available to the authenticated principal's workspace, and an unapproved/unknown agent 404s — the surface never discloses another tenant's inventory. Does not change dispatch (RFC 0072 §B, owner-triple-scoped POST /runs) or any floor safety guarantee (toolAllowlist/systemPromptRef/SR-1 stay mandatory regardless of scope)."
|
|
3007
3007
|
}
|
|
3008
3008
|
}
|
|
3009
3009
|
},
|
|
@@ -3031,13 +3031,13 @@
|
|
|
3031
3031
|
"chat-mention"
|
|
3032
3032
|
]
|
|
3033
3033
|
},
|
|
3034
|
-
"description": "Which invocation entry points the host exposes for live manifest dispatch. `workflow-node`: an agent step inside a workflow run (RFC 0072 §B); `run-api`: an agent as the root of POST /
|
|
3034
|
+
"description": "Which invocation entry points the host exposes for live manifest dispatch. `workflow-node`: an agent step inside a workflow run (RFC 0072 §B); `run-api`: an agent as the root of POST /runs; `chat-mention`: a chat @agent invocation mapped onto the run surface. Enum membership is NOT mandatory — a host with no chat surface simply omits `chat-mention`. Absent ⇒ `['workflow-node']` (the RFC 0072 §B normative path). All advertised sources MUST emit the identical `agent.invocation.*` + `agent.*` event family."
|
|
3035
3035
|
}
|
|
3036
3036
|
}
|
|
3037
3037
|
},
|
|
3038
3038
|
"evalSuite": {
|
|
3039
3039
|
"type": "object",
|
|
3040
|
-
"description": "RFC 0081. The host runs portable `agent-eval-suite.schema.json` suites as eval runs (a `mode: \"eval\"` projection over POST /
|
|
3040
|
+
"description": "RFC 0081. The host runs portable `agent-eval-suite.schema.json` suites as eval runs (a `mode: \"eval\"` projection over POST /runs, RFC 0081 §B), emits the `eval.started`/`eval.scored`/`eval.completed` content-free family, and terminates with an `eval-summary.schema.json` scorecard. Composes RFC 0026 (per-task cost), RFC 0054 (regression baseline diff), RFC 0056 (human override of an auto-score). Hosts that omit this block reject `mode: \"eval\"` with 501; the behavioral conformance scenario soft-skips. The summary + events are content-free (SECURITY invariant `eval-summary-no-content-leak`).",
|
|
3041
3041
|
"additionalProperties": false,
|
|
3042
3042
|
"properties": {
|
|
3043
3043
|
"modes": {
|
|
@@ -3069,7 +3069,7 @@
|
|
|
3069
3069
|
},
|
|
3070
3070
|
"deployment": {
|
|
3071
3071
|
"type": "object",
|
|
3072
|
-
"description": "RFC 0082. The host implements an agent deployment lifecycle: per-(agentId, version) deployment records with the seven-state machine (draft/test/staged/active/paused/deprecated/rolled-back), named-channel binding (`agentId@channel` / `@latest` resolved + pinned per-(run, agentId, channel) at first resolution per §B), optional canary traffic-split, a rollback pointer, the content-free `deployment.*` audit events, and the `POST /
|
|
3072
|
+
"description": "RFC 0082. The host implements an agent deployment lifecycle: per-(agentId, version) deployment records with the seven-state machine (draft/test/staged/active/paused/deprecated/rolled-back), named-channel binding (`agentId@channel` / `@latest` resolved + pinned per-(run, agentId, channel) at first resolution per §B), optional canary traffic-split, a rollback pointer, the content-free `deployment.*` audit events, and the `POST /agents/{agentId}/deployments` promotion contract composing RFC 0049 (`deploy:*` fail-closed scopes) + RFC 0051 (approvalGate) + RFC 0081 (`requiredEval`). Hosts that omit this block reject a `channel`-bearing `AgentRef` with `validation_error` and 501 the deployment endpoint. The promotion endpoint + behavioral lifecycle scenario + reference-host store land at Active → Accepted.",
|
|
3073
3073
|
"additionalProperties": false,
|
|
3074
3074
|
"properties": {
|
|
3075
3075
|
"channels": {
|
|
@@ -3110,7 +3110,7 @@
|
|
|
3110
3110
|
},
|
|
3111
3111
|
"roster": {
|
|
3112
3112
|
"type": "object",
|
|
3113
|
-
"description": "RFC 0086. The host maintains a standing agent roster: named, tenant-scoped agent INSTANCES (the 'digital-twin employee') that reference a manifest/deployment and own a workflow portfolio, discoverable via GET /
|
|
3113
|
+
"description": "RFC 0086. The host maintains a standing agent roster: named, tenant-scoped agent INSTANCES (the 'digital-twin employee') that reference a manifest/deployment and own a workflow portfolio, discoverable via GET /agents/roster, with trigger-fired portfolio runs attributed to the member via the content-free `roster.run.initiated` event. REQUIRES `agents.manifestRuntime.supported: true` (a roster entry instantiates a manifest agent). Triggers compose RFC 0052 (schedule) + RFC 0083 (durable work-item bridge) — no new WorkflowTrigger.type; the concrete work surface (a Kanban board) stays a host/vendor extension (§E). Hosts that omit this block do not maintain a roster (the roster reads 501). The roster-management endpoints + behavioral attribution scenario + reference-host store land at Active → Accepted.",
|
|
3114
3114
|
"additionalProperties": false,
|
|
3115
3115
|
"properties": {
|
|
3116
3116
|
"installScope": {
|
|
@@ -3119,7 +3119,7 @@
|
|
|
3119
3119
|
"host",
|
|
3120
3120
|
"tenant"
|
|
3121
3121
|
],
|
|
3122
|
-
"description": "RFC 0074 carry-forward. `host`: a single global roster. `tenant`: roster entries are scoped per owner triple; GET /
|
|
3122
|
+
"description": "RFC 0074 carry-forward. `host`: a single global roster. `tenant`: roster entries are scoped per owner triple; GET /agents/roster returns only the caller's entries and a cross-tenant entry 404s. MUST equal `agents.manifestRuntime.installScope` (a roster cannot be host-global while its manifests are tenant-scoped, or vice-versa)."
|
|
3123
3123
|
},
|
|
3124
3124
|
"portfolioTriggerSources": {
|
|
3125
3125
|
"type": "array",
|
|
@@ -3134,7 +3134,7 @@
|
|
|
3134
3134
|
},
|
|
3135
3135
|
"orgChart": {
|
|
3136
3136
|
"type": "object",
|
|
3137
|
-
"description": "RFC 0087. The host maintains a tenant-scoped, DESCRIPTIVE org-chart over RFC 0086 roster members: departments + roles with acyclic `reportsTo` edges + a derived responsibility roll-up, discoverable via GET /
|
|
3137
|
+
"description": "RFC 0087. The host maintains a tenant-scoped, DESCRIPTIVE org-chart over RFC 0086 roster members: departments + roles with acyclic `reportsTo` edges + a derived responsibility roll-up, discoverable via GET /agents/org-chart. The load-bearing guarantee (§B `org-position-no-authority-escalation`): an org edge confers NO authority — it MUST NOT widen `toolAllowlist` (RFC 0002 §A14), grant an RBAC scope (RFC 0049), or bypass an approval gate (RFC 0051); org position MUST NOT be an authorization input. The schema carries no authority-bearing field, and a conformant host MUST NOT derive authority from position out-of-band. REQUIRES `agents.roster.supported: true` (the chart's members are roster entries). Hosts that omit this block have no org-chart surface (the read 501s). The org-chart-management endpoints + behavioral non-authority scenario + reference-host store land at Active → Accepted.",
|
|
3138
3138
|
"additionalProperties": false,
|
|
3139
3139
|
"properties": {
|
|
3140
3140
|
"installScope": {
|
|
@@ -3143,7 +3143,7 @@
|
|
|
3143
3143
|
"host",
|
|
3144
3144
|
"tenant"
|
|
3145
3145
|
],
|
|
3146
|
-
"description": "RFC 0074 carry-forward. `host`: a single global chart. `tenant`: charts are scoped per owner triple; GET /
|
|
3146
|
+
"description": "RFC 0074 carry-forward. `host`: a single global chart. `tenant`: charts are scoped per owner triple; GET /agents/org-chart returns only the caller's chart. SHOULD equal `agents.roster.installScope` (the members are roster entries)."
|
|
3147
3147
|
},
|
|
3148
3148
|
"departmentNesting": {
|
|
3149
3149
|
"type": "boolean",
|
|
@@ -4367,7 +4367,7 @@
|
|
|
4367
4367
|
},
|
|
4368
4368
|
"compactView": {
|
|
4369
4369
|
"type": "boolean",
|
|
4370
|
-
"description": "RFC 0112. `true` ⇒ the host honors `GET /
|
|
4370
|
+
"description": "RFC 0112. `true` ⇒ the host honors `GET /tools?view=compact` + `GET /tools/{toolId}?view=compact`, returning the `{ tools: CompactToolDescriptor[] }` projection (`compact-tool-descriptor.schema.json`): the heavy descriptor fields (`outputSchema`/`auth`/`egress`/`approval`/`replayPolicy`/`costHint`/`latencyHint`) are dropped and any `inputSchema` is bounded to the compact structural subset. The compact `tools[]` carries the same `toolId` set as the standard view for the same principal. Absent ⇒ the host treats `view=compact` as an unknown query param (standard view)."
|
|
4371
4371
|
}
|
|
4372
4372
|
},
|
|
4373
4373
|
"allOf": [
|
|
@@ -5269,7 +5269,7 @@
|
|
|
5269
5269
|
},
|
|
5270
5270
|
"registrationEndpoint": {
|
|
5271
5271
|
"type": "boolean",
|
|
5272
|
-
"description": "`true` ⇒ the host serves `POST /
|
|
5272
|
+
"description": "`true` ⇒ the host serves `POST /trigger-subscriptions` (RFC 0099 §F.2) for portable external-event subscription creation."
|
|
5273
5273
|
}
|
|
5274
5274
|
}
|
|
5275
5275
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/compact-tool-descriptor.schema.json",
|
|
4
4
|
"title": "CompactToolDescriptor",
|
|
5
|
-
"description": "RFC 0112. A lossy, model-facing projection of `ToolDescriptor` (tool-descriptor.schema.json) returned by `GET /
|
|
5
|
+
"description": "RFC 0112. A lossy, model-facing projection of `ToolDescriptor` (tool-descriptor.schema.json) returned by `GET /tools?view=compact` + `GET /tools/{toolId}?view=compact` when the host advertises `capabilities.toolCatalog.compactView: true`. Heavy descriptive fields (`outputSchema`, `auth`, `egress`, `approval`, `replayPolicy`, `costHint`, `latencyHint`) are dropped, and any `inputSchema` is bounded to the self-contained compact structural subset (top-level `type: \"object\"` with `properties`; no `$ref`/`oneOf`/`allOf`/`anyOf`/`not`/`patternProperties`/`dependentSchemas`). The subset is the stable structural core of RFC 0030 Tier-1, cited as rationale but pinned HERE so conformance is machine-checkable and immune to that informative table's drift. Like the full descriptor, a CompactToolDescriptor never carries credential material (SR-1) and is not an invocation path.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/eval-summary.schema.json",
|
|
4
4
|
"title": "EvalSummary",
|
|
5
|
-
"description": "RFC 0081 \u00a7C. The terminal scorecard of an eval run (the `mode: \"eval\"` projection over `POST /
|
|
5
|
+
"description": "RFC 0081 \u00a7C. The terminal scorecard of an eval run (the `mode: \"eval\"` projection over `POST /runs`, RFC 0081 \u00a7B): the aggregate + per-task scores, cost, latency, schema-validity, and safety findings, plus the suite provenance and (for `regression` mode) the score delta vs a baseline. Set as the eval run's output and served by `GET /runs/{runId}/eval-summary`. SECURITY invariant `eval-summary-no-content-leak`: the summary carries scores, ids, counts, and redaction-safe safety descriptors only \u2014 NEVER task output bodies, rubric prose, model completions, prompts, or credential material (SR-1). A consumer reads the run's normal projection for any body.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
},
|
|
165
165
|
"diffRef": {
|
|
166
166
|
"type": "string",
|
|
167
|
-
"description": "MAY. A pointer to `GET /
|
|
167
|
+
"description": "MAY. A pointer to `GET /runs/{runId}:diff?against={baselineRunId}` (RFC 0054) for the structural delta."
|
|
168
168
|
}
|
|
169
169
|
}
|
|
170
170
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/localized-content-page-response.schema.json",
|
|
4
4
|
"title": "LocalizedContentPageResponse",
|
|
5
|
-
"description": "RFC 0103 (spec/v1/localized-content.md §D). The resolved delivery response for `GET /
|
|
5
|
+
"description": "RFC 0103 (spec/v1/localized-content.md §D). The resolved delivery response for `GET /content/pages/{slug}`. `locale` is the negotiated locale (equals the `Content-Language` response header). `sections[]` carry the ALREADY-MERGED section bodies — resolution (the per-section field merge §C) happened server-side, so no `localizations` map appears in the response. Only `published`, `enabled` sections are present, in render order.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
"slug": {
|
|
22
22
|
"type": "string",
|
|
23
23
|
"pattern": "^[a-z][a-z0-9-]*$",
|
|
24
|
-
"description": "URL slug for public delivery (`GET /
|
|
24
|
+
"description": "URL slug for public delivery (`GET /content/pages/{slug}`). Lowercase, hyphen-separated."
|
|
25
25
|
},
|
|
26
26
|
"name": {
|
|
27
27
|
"type": "string",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/org-chart-responsibility-view.schema.json",
|
|
4
4
|
"title": "OrgChartResponsibilityView",
|
|
5
|
-
"description": "RFC 0087 §D. Response body for `GET /
|
|
5
|
+
"description": "RFC 0087 §D. Response body for `GET /agents/org-chart/{departmentId}` — one department's subtree + the derived responsibility roll-up (the union of its members' RFC 0086 workflow portfolios, recursively through sub-departments unless `?recursive=false`). A read-only VIEW computed from live roster entries: it grants nothing (§B `org-position-no-authority-escalation`) and stores nothing. Tenant-scoped per RFC 0074.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/prompt-pack-manifest.schema.json",
|
|
4
4
|
"title": "PromptPackManifest",
|
|
5
|
-
"description": "Manifest for a published OpenWOP prompt pack — `pack.json` at the pack root with `kind: \"prompt\"`. Peer to `node-pack-manifest.schema.json` (RFC 0003) and `workflow-chain-pack-manifest.schema.json` (RFC 0013); disjoint from both via the `kind` discriminator. See `spec/v1/prompts.md` §\"Discovery & distribution\" for the canonical contract and RFC 0028 §B for the rationale.\n\nPrompt packs distribute curated PromptTemplate collections via the same signed-tarball + Ed25519 + SRI pipeline that already serves node and workflow-chain packs. When a host installs a prompt pack and advertises `capabilities.prompts.packsSupported: true`, the templates appear in `GET /
|
|
5
|
+
"description": "Manifest for a published OpenWOP prompt pack — `pack.json` at the pack root with `kind: \"prompt\"`. Peer to `node-pack-manifest.schema.json` (RFC 0003) and `workflow-chain-pack-manifest.schema.json` (RFC 0013); disjoint from both via the `kind` discriminator. See `spec/v1/prompts.md` §\"Discovery & distribution\" for the canonical contract and RFC 0028 §B for the rationale.\n\nPrompt packs distribute curated PromptTemplate collections via the same signed-tarball + Ed25519 + SRI pipeline that already serves node and workflow-chain packs. When a host installs a prompt pack and advertises `capabilities.prompts.packsSupported: true`, the templates appear in `GET /prompts` with `meta.source: \"pack\"` + `meta.packName` + `meta.packVersion`.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"name",
|
|
@@ -84,7 +84,7 @@
|
|
|
84
84
|
"items": {
|
|
85
85
|
"$ref": "./prompt-template.schema.json"
|
|
86
86
|
},
|
|
87
|
-
"description": "PromptTemplate entries per RFC 0027 §A. Each MUST have a unique `(templateId, version)` pair within the pack. Hosts installing this pack expose the templates at `GET /
|
|
87
|
+
"description": "PromptTemplate entries per RFC 0027 §A. Each MUST have a unique `(templateId, version)` pair within the pack. Hosts installing this pack expose the templates at `GET /prompts` with `meta.source: \"pack\"` + `meta.packName: <this pack's name>` + `meta.packVersion: <this pack's version>` populated automatically (RFC 0028 §C)."
|
|
88
88
|
},
|
|
89
89
|
"signing": {
|
|
90
90
|
"type": "object",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/residency.schema.json",
|
|
4
4
|
"title": "Residency",
|
|
5
|
-
"description": "RFC 0129 — an OPTIONAL data-residency constraint on a run-creation request (`POST /
|
|
5
|
+
"description": "RFC 0129 — an OPTIONAL data-residency constraint on a run-creation request (`POST /runs`). A host advertising `capabilities.dataResidency` MUST honor-or-reject: accept iff `region` is in the advertised `dataResidency.regions[]`, else reject `residency_unavailable` (HTTP one-of 400/404/422) and create no run — it MUST NOT silently accept-and-ignore. Absent ⇒ no constraint (host default region). Physical byte-confinement of the accepted run is a declared operator SHOULD (RFC 0129 §4), not a wire guarantee.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/run-ancestry-response.schema.json",
|
|
4
4
|
"title": "RunAncestryResponse",
|
|
5
|
-
"description": "RFC 0040 §C — response shape for `GET /
|
|
5
|
+
"description": "RFC 0040 §C — response shape for `GET /runs/{runId}/ancestry`. Returns the cross-host parent chain for a run. When the parent is on the same host, `parent.wellKnownUrl` is absent (existing single-host case). When the parent is on a different host, `parent.wellKnownUrl` MUST be set so a client can resolve the chain by walking the URLs. `parent: null` means the current run is a top-level run (not dispatched from another host). Hosts advertising `capabilities.multiAgent.executionModel.crossHostCausation.ancestryEndpointSupported: true` MUST serve this shape on a 200 response.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/run-diff-response.schema.json",
|
|
4
4
|
"title": "RunDiffResponse",
|
|
5
|
-
"description": "RFC 0054 — deterministic, replay-aware structured diff of two runs' event sequences and terminal states, returned by GET /
|
|
5
|
+
"description": "RFC 0054 — deterministic, replay-aware structured diff of two runs' event sequences and terminal states, returned by GET /runs/{runId}:diff?against={otherRunId}. The diff is a pure function of the two event logs (see spec/v1/replay.md determinism contract).",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"a",
|
|
@@ -966,7 +966,7 @@
|
|
|
966
966
|
},
|
|
967
967
|
"_inputsObject": {
|
|
968
968
|
"type": "object",
|
|
969
|
-
"description": "Caller-supplied workflow inputs (from POST /
|
|
969
|
+
"description": "Caller-supplied workflow inputs (from POST /runs body).",
|
|
970
970
|
"additionalProperties": true
|
|
971
971
|
},
|
|
972
972
|
"_outputsObject": {
|
|
@@ -1422,7 +1422,7 @@
|
|
|
1422
1422
|
},
|
|
1423
1423
|
"contextSummarized": {
|
|
1424
1424
|
"type": "object",
|
|
1425
|
-
"description": "RFC 0111. Emitted when the host replaces older in-window orchestrator transcript turns with a host-produced summary to honor `multiAgent.executionModel.contextBudget.transcriptTokenBudget`. CONTENT-FREE: the summary text is NEVER inlined \u2014 `summaryRef` is an artifactId resolved via `GET /
|
|
1425
|
+
"description": "RFC 0111. Emitted when the host replaces older in-window orchestrator transcript turns with a host-produced summary to honor `multiAgent.executionModel.contextBudget.transcriptTokenBudget`. CONTENT-FREE: the summary text is NEVER inlined \u2014 `summaryRef` is an artifactId resolved via `GET /runs/{runId}/artifacts/{artifactId}`. The summary is a NONDETERMINISTIC host output governed like an RFC 0041 envelope: on `:fork mode:replay` the host MUST reuse this recorded `summaryRef` and MUST NOT re-summarize (see multi-agent-execution.md \u00a7\"Context economy (RFC 0111)\"). `replacedTurns` lists the event ids the summary stands in for, so a replay engine reconstructs the exact transcript.",
|
|
1426
1426
|
"required": [
|
|
1427
1427
|
"iteration",
|
|
1428
1428
|
"replacedTurns",
|
|
@@ -1448,7 +1448,7 @@
|
|
|
1448
1448
|
"summaryRef": {
|
|
1449
1449
|
"type": "string",
|
|
1450
1450
|
"minLength": 1,
|
|
1451
|
-
"description": "ArtifactId of the persisted summary (read via `GET /
|
|
1451
|
+
"description": "ArtifactId of the persisted summary (read via `GET /runs/{runId}/artifacts/{artifactId}`). The summary text is NOT on the wire. MUST be persisted/readable as-of the iteration's event-log index; a host that cannot serve it at the requested `fromSeq` MUST refuse the fork (mirrors `replay_memory_snapshot_unavailable`)."
|
|
1452
1452
|
},
|
|
1453
1453
|
"tokenCounter": {
|
|
1454
1454
|
"type": "string",
|
|
@@ -3360,7 +3360,7 @@
|
|
|
3360
3360
|
},
|
|
3361
3361
|
"evalCompleted": {
|
|
3362
3362
|
"type": "object",
|
|
3363
|
-
"description": "RFC 0081 \u00a7C. Emitted ONCE, after all tasks and before `run.completed`. Content-free: aggregate scalars only. A recorded-fact event. The full scorecard is the run's output (`eval-summary.schema.json`), served by `GET /
|
|
3363
|
+
"description": "RFC 0081 \u00a7C. Emitted ONCE, after all tasks and before `run.completed`. Content-free: aggregate scalars only. A recorded-fact event. The full scorecard is the run's output (`eval-summary.schema.json`), served by `GET /runs/{runId}/eval-summary`.",
|
|
3364
3364
|
"required": [
|
|
3365
3365
|
"aggregateScore",
|
|
3366
3366
|
"passed",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/run-options.schema.json",
|
|
4
4
|
"title": "RunOptions",
|
|
5
|
-
"description": "Per-run parameter overlay supplied by the caller in `POST /
|
|
5
|
+
"description": "Per-run parameter overlay supplied by the caller in `POST /runs`. See `run-options.md` for full semantics. Reserved keys are typed; unknown keys in `configurable` pass through to the engine. RFC 0094 §A: this schema is OPEN at its own root (no `additionalProperties: false`) because it participates in the composed `createRun` request body in `api/openapi.yaml`; the closure (`unevaluatedProperties: false`) lives at that composition site, the only place JSON Schema 2020-12 can express closure over an `allOf`.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|
|
8
8
|
"configurable": {
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"failed",
|
|
48
48
|
"manual"
|
|
49
49
|
],
|
|
50
|
-
"description": "RFC 0151 \u00a7D \u2014 the run's compensation (unwind) rollup, kept separate from `status` on purpose: `status` is the FORWARD execution state and a closed union exported by the SDK, so RFC 0151 forbids reinterpreting it (there is deliberately no `compensating` run status). OPTIONAL and capability-gated \u2014 a host that does not advertise `capabilities.compensation` MUST omit this field; a host that advertises it MUST include it on every snapshot, `none` when no compensation was ever requested for the run. Presence is therefore a wire witness of the advert, and a `none` cannot be read as \"unwind is monitored here\" from a host that would never unwind. Values are the deterministic fold of the six `compensation.*` events over the persisted plan, defined normatively in `spec/v1/compensation.md \u00a7\"Run rollup: compensationStatus\"`: `none` (no `compensation.requested`), `pending` (requested, no `started`), `running` (started, plan active \u2014 a \u00a7E approval pause does NOT change it; the run's own `status: waiting-approval` carries the wait), `completed` (every inverse action completed), `partial` (plan inactive; some completed and some did not \u2014 reported, never rounded), `failed` (plan inactive; none completed), `manual` (`manual_intervention_required` recorded and unresolved; takes precedence over `partial`/`failed` while unresolved). Content-free by construction. Resolves RFC 0151 UQ3: `RunSnapshot` (`GET /
|
|
50
|
+
"description": "RFC 0151 \u00a7D \u2014 the run's compensation (unwind) rollup, kept separate from `status` on purpose: `status` is the FORWARD execution state and a closed union exported by the SDK, so RFC 0151 forbids reinterpreting it (there is deliberately no `compensating` run status). OPTIONAL and capability-gated \u2014 a host that does not advertise `capabilities.compensation` MUST omit this field; a host that advertises it MUST include it on every snapshot, `none` when no compensation was ever requested for the run. Presence is therefore a wire witness of the advert, and a `none` cannot be read as \"unwind is monitored here\" from a host that would never unwind. Values are the deterministic fold of the six `compensation.*` events over the persisted plan, defined normatively in `spec/v1/compensation.md \u00a7\"Run rollup: compensationStatus\"`: `none` (no `compensation.requested`), `pending` (requested, no `started`), `running` (started, plan active \u2014 a \u00a7E approval pause does NOT change it; the run's own `status: waiting-approval` carries the wait), `completed` (every inverse action completed), `partial` (plan inactive; some completed and some did not \u2014 reported, never rounded), `failed` (plan inactive; none completed), `manual` (`manual_intervention_required` recorded and unresolved; takes precedence over `partial`/`failed` while unresolved). Content-free by construction. Resolves RFC 0151 UQ3: `RunSnapshot` (`GET /runs/{runId}`) is the sole owner; debug bundles and the AsyncAPI `run.snapshot` reuse it by `$ref`."
|
|
51
51
|
},
|
|
52
52
|
"owner": {
|
|
53
53
|
"type": "object",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/tool-descriptor.schema.json",
|
|
4
4
|
"title": "ToolDescriptor",
|
|
5
|
-
"description": "RFC 0078. A portable, read-only description of one tool, unifying the five openwop tool surfaces (node-pack / workflow / MCP / connector / host-extension) behind one stable shape. Returned by `GET /
|
|
5
|
+
"description": "RFC 0078. A portable, read-only description of one tool, unifying the five openwop tool surfaces (node-pack / workflow / MCP / connector / host-extension) behind one stable shape. Returned by `GET /tools` + `GET /tools/{toolId}` when the host advertises `capabilities.toolCatalog.supported: true`. The descriptor DESCRIBES a tool; it never carries credential material (SR-1) and is not an invocation path (tools are invoked on their existing surfaces).",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/trigger-subscription-registration.schema.json",
|
|
4
4
|
"title": "TriggerSubscriptionRegistration",
|
|
5
|
-
"description": "RFC 0099 §F.2. The portable create request for an external-event trigger subscription, served by `POST /
|
|
5
|
+
"description": "RFC 0099 §F.2. The portable create request for an external-event trigger subscription, served by `POST /trigger-subscriptions`. Binds an external source (`webhook`/`email`/`form`) to a Workflow to start, with a dedup config and a source-authenticity verification policy. This is the unified create surface RFC 0083 UQ1 left per-source. The response returns the created `TriggerSubscription` (RFC 0083 §B) plus a source-specific `binding`; the binding secret/URL is returned ONCE at creation and is not re-fetchable in cleartext (SR-1).",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
}
|
|
106
106
|
},
|
|
107
107
|
"configurableSchema": {
|
|
108
|
-
"description": "Optional JSON Schema 2020-12 declaring which RunOptions.configurable keys this workflow accepts. When present, hosts MUST validate POST /
|
|
108
|
+
"description": "Optional JSON Schema 2020-12 declaring which RunOptions.configurable keys this workflow accepts. When present, hosts MUST validate POST /runs `configurable` payloads against this schema and reject mismatches with `validation_error`. Hosts MUST surface this schema on GET /workflows/{workflowId} so clients can pre-flight-validate. See run-options.md \u00a7'Per-workflow configurableSchema'. Additive in v1.1.",
|
|
109
109
|
"type": "object",
|
|
110
110
|
"additionalProperties": true
|
|
111
111
|
},
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"provenance": {
|
|
5
5
|
"suite": {
|
|
6
6
|
"package": "@openwop/openwop-conformance",
|
|
7
|
-
"version": "2.0.
|
|
7
|
+
"version": "2.0.11"
|
|
8
8
|
},
|
|
9
9
|
"note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
|
|
10
10
|
},
|
|
@@ -419,5 +419,5 @@
|
|
|
419
419
|
"$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
|
|
420
420
|
}
|
|
421
421
|
],
|
|
422
|
-
"digest": "
|
|
422
|
+
"digest": "a5a27f917052a56c3353182318724c751f89afe7561091c3535414504c92907e"
|
|
423
423
|
}
|
package/spec/v2/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# `spec/v2/` — the OpenWOP v2 tree (the current protocol major)
|
|
2
2
|
|
|
3
|
-
> **Status: released.** v2 is the current protocol major — `v2.0.0` was tagged 2026-09-05 and this tree is at corpus `v2.0.
|
|
3
|
+
> **Status: released.** v2 is the current protocol major — `v2.0.0` was tagged 2026-09-05 and this tree is at corpus `v2.0.11` (`release.json`). Everything under `spec/v2/`, `schemas/v2/` and `api/v2/` is normative, is vendored into `@openwop/spec-artifacts`, and is what `@openwop/openwop-conformance` 2.x measures. A new integration targets v2.
|
|
4
4
|
>
|
|
5
5
|
> **v1 is not retired.** Through the overlap a host advertises both majors and `preferredVersion` MUST remain a `1.x` member (`core/versioning.md` §1.1); v1 clients keep working unchanged on `/v1/…`. v1 end-of-support is the later of two clocks in `core/overview.md`, earliest 2026-12-04, and until then `spec/v1/` stays the maintained parallel track. A `1.x` conformance tarball still excludes this tree (`conformance/scripts/pack-vendor.sh`).
|
|
6
6
|
>
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Discovery and Capabilities
|
|
2
2
|
|
|
3
|
-
> **Status: Stable · v2.0.
|
|
3
|
+
> **Status: Stable · v2.0.11 (2026-09-10) · RFC 0169, 0176, 0179.**
|
|
4
4
|
|
|
5
5
|
## Why this exists
|
|
6
6
|
|
|
@@ -265,6 +265,8 @@ Witness `witnessable-gated`; owner RFC 0083.
|
|
|
265
265
|
|
|
266
266
|
Witness `seam-gated`; owner RFC 0152; facets `versions`, `preferredVersion`, `minimumVersion`, `refreshedAt`, `profiles`, `agentCardUrl`, `streaming`, `pushNotifications`, `durableTasks`.
|
|
267
267
|
|
|
268
|
+
**A facet MAY name a URL on another origin; that is a claim about the facet, not the origin.** `agentCardUrl` (and `mcp.serverUrls[]`) are `format: uri` with no origin constraint. The advertiser claims to know where the card is — not that the named origin serves `/.well-known/openwop`, speaks any major, or is measured by its bundle; the suite exercises the advertiser only. Certification is per origin: a second origin with its own discovery document is a second host. Open gap (2026-09-10): whether a facet naming an origin that does not answer SHOULD be withdrawn, and how a client learns that origin's major.
|
|
269
|
+
|
|
268
270
|
### § budget
|
|
269
271
|
|
|
270
272
|
Witness `witnessable-gated`; owner RFC 0084.
|
|
@@ -317,6 +319,8 @@ Witness `claims-check`; owner RFC 0025.
|
|
|
317
319
|
|
|
318
320
|
Witness `seam-gated`; owner RFC 0153; facets `revisions`, `preferredVersion`, `minimumRevision`, `refreshedAt`, `profiles`, `features`, `serverUrls`, `serverMount`, `mrtr`.
|
|
319
321
|
|
|
322
|
+
`serverUrls[]` MAY name other origins; § a2a's off-origin paragraph applies.
|
|
323
|
+
|
|
320
324
|
### § sandbox
|
|
321
325
|
|
|
322
326
|
Witness `witnessable-gated`; owner RFC 0035; facets `isolationModel`, `allowedHostCalls`, `memoryLimitBytes`, `wallClockLimitMs`.
|
package/spec/v2/core/errors.md
CHANGED
package/spec/v2/core/events.md
CHANGED
package/spec/v2/core/headers.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Headers
|
|
2
2
|
|
|
3
|
-
> **Status: Stable · v2.0.
|
|
3
|
+
> **Status: Stable · v2.0.11 (2026-09-10) · RFC 0171 §C.1, RFC 0172 §A.3–§A.4.** GENERATED by `scripts/derive-v2-api.py` from `api/v2/openapi.yaml`; do not edit.
|
|
4
4
|
|
|
5
5
|
## Why this exists
|
|
6
6
|
|
package/spec/v2/core/identity.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Identity
|
|
2
2
|
|
|
3
|
-
> **Status: Stable · v2.0.
|
|
3
|
+
> **Status: Stable · v2.0.11 (2026-09-10) · RFC 0170, 0165, 0176.**
|
|
4
4
|
|
|
5
5
|
## Why this exists
|
|
6
6
|
|
|
@@ -114,7 +114,11 @@ This obligation is enforced by `scripts/check-id-kinds-bound.mjs` against `spec/
|
|
|
114
114
|
|
|
115
115
|
The `typeId` grammar admits `_` because `node-pack-manifest.schema.json`'s `name` pattern does and a pack's node type ids are derived from its name — a pack legally named `vendor.acme.my_tools` MUST be able to declare `vendor.acme.my_tools.echo`. A kind that rejects an id a legal name generates is a constraint that cannot express a legitimate value.
|
|
116
116
|
|
|
117
|
-
A host MUST reject a tenant-bound id whose tenant segment is not the caller's with `403` `id_tenant_mismatch`. A host-minted opaque segment MUST match `^[A-Za-z0-9._~-]{16,128}$`: no `@`, no whitespace, no `/`.
|
|
117
|
+
A host MUST reject a tenant-bound id whose tenant segment is not the caller's with `403` `id_tenant_mismatch`. A host-minted opaque segment MUST match `^[A-Za-z0-9._~-]{16,128}$`: no `@`, no whitespace, no `/`.
|
|
118
|
+
|
|
119
|
+
**On the wire a tenant-bound id is one percent-encoded path segment** (`tenant%2Fopaque`); a host MUST decode before matching the grammar and MUST accept the bound form on every tenant-bound parameter.
|
|
120
|
+
|
|
121
|
+
**Through the overlap the bare form is admitted on a major-2 path parameter** — a stated affordance with an expiry, not a legacy branch of the grammar. A parameter carrying only the opaque segment (the spelling a `/v1/` create hands out) MUST resolve under the caller's tenant and never another's, and the response MUST name the resource bound (`versioning.md` §5); the credential supplies the segment the `403` check would read. Once a host advertises no `1.x` member it MUST refuse the bare form `400 validation_error` (not `id_tenant_mismatch`, not `not_found`). Ids in documents and bodies are bound, always. Errata 2026-09-10: stated after six scenarios had measured it since rc.44; a same-day "refuse now" draft was withdrawn against them. A client MAY bind at its request seam. Handle grammars (`memoryRef`, workspace `path`/`etag`, the plugin version token) and their `resolvability` class are specified where each handle is used; an importer MUST re-mint every `host`-scoped handle (`spec/v2/ext/portability/`).
|
|
118
122
|
|
|
119
123
|
## 6. Identity error codes (`spec/v2/errors.json`)
|
|
120
124
|
|
package/spec/v2/core/interop.md
CHANGED
package/spec/v2/core/overview.md
CHANGED
package/spec/v2/core/packs.md
CHANGED