@openwop/spec-artifacts 2.45.25 → 2.45.27

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 CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "_comment": "Provenance of @openwop/spec-artifacts (RFC 0168 §D.2). files: SHA-256 per file; the conformance suite compares the installed peer against dist/spec-artifacts.lock.json at start.",
3
3
  "package": "@openwop/spec-artifacts",
4
- "version": "2.45.25",
5
- "corpusTag": "v2.45.25",
4
+ "version": "2.45.27",
5
+ "corpusTag": "v2.45.27",
6
6
  "files": {
7
7
  "api/.redocly.lint-ignore.yaml": "bf5a8350b88a72fa43f59605ed8d903ed24b6cfccda5e45509c9f6ed9ee4e712",
8
8
  "api/asyncapi.yaml": "d5ecb9ee6114582be3b1f662c84bfac9ae96dae7bacb853e461168f70a8e1c7d",
9
9
  "api/grpc/openwop.proto": "c3e72bb17cba514ee98feb6434e6c9b6ea6795bfd086489ec69fd882dd1ad977",
10
10
  "api/openapi.yaml": "ac6de5303872664b78ff419c035915593e01599e02835e777a0123de1baeb398",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "0692397ec226e29431dbb2f0d7e645d42ac76a3e4f851f1342136186e55ede78",
13
- "api/v2/asyncapi.yaml": "416a78c622b4b2bad33cc73d4f2676e53685d1ee99ab6576338dd426a5a0e0fb",
14
- "api/v2/openapi.yaml": "907a0bbf13669b0db55effd35eae67bafc2df0a496f11de37d876f69cc7fbe98",
12
+ "api/seams-v2.yaml": "9b9455816461b5fc267d1f9a1624667f9f6bd81d2e251731767cca142cd9d0e0",
13
+ "api/v2/asyncapi.yaml": "ec80cec238dcb350f741b49138ed92c9d60f110fcb8ad4bdff2cf44c83c8e1d8",
14
+ "api/v2/openapi.yaml": "e3cff1191d97def0575096d0ec450622a39c1126ca4baaa72c24079ab3b50774",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "276fc1d51eb08e14e9127b9fd27761d7046ee33c12000f3a64a801322db8bf58",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -152,7 +152,7 @@
152
152
  "schemas/v2/goal.schema.json": "ad104ed5a3866736b8fed9d7c0b23dc82af526b5bef4afe848f01fc3af2161e9",
153
153
  "schemas/v2/heartbeat-evaluated.schema.json": "c897b0792fd518d6e12879851027252af1529f5e420c3eaf434ad7af284ecc05",
154
154
  "schemas/v2/heartbeat-state-changed.schema.json": "eb68d0082aa996650e3a6b8ccf32457f959cebc7e6728cc7c331b9d171a4bef6",
155
- "schemas/v2/host-event.schema.json": "d2e2233d6464442c761ca985b0302c8350cabe2d694d3894f65d1696d80bdc98",
155
+ "schemas/v2/host-event.schema.json": "655b5475b1aeb41c8fc4ff7b6fc7e31a0fcc18fd59f368336ccbc138e6ba395e",
156
156
  "schemas/v2/ids.schema.json": "65cfaa193be0ca9cf48af39c18c553979e3ec1f7fc04509aaa513b322d7b7e4a",
157
157
  "schemas/v2/localized-content-language-settings.schema.json": "3c8350a178037a460f5d87466ccaf9ed5fe3d41497786d2504cc66e42152c8cc",
158
158
  "schemas/v2/localized-content-page-response.schema.json": "ef48329749758afb21e4d3cbc3f017abb911f75726819457f35b9f1390332c75",
@@ -208,14 +208,14 @@
208
208
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
209
209
  "spec/v1/alias-detectors.json": "22444c22bb88c568339ef512553f9fc38146e22b566d11ab8608f655d688d19c",
210
210
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
211
- "spec/v1/core-standard-manifest.json": "53a46c4dc0224f13f06c4aa6f07ac6aaa0db84407c4ef2127a9d9d5652255b9e",
211
+ "spec/v1/core-standard-manifest.json": "7e44d633d25ceae4d0d8de5462337e666c3a827c1a003e27b7005edd915fc909",
212
212
  "spec/v1/deprecations.json": "e723bc11d7272c71789ad1303bb7f21809a8a024abf57594f9d5c35dc199ece9",
213
213
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
214
214
  "spec/v1/end-of-support.json": "35f0bf3b70fe78b16e2a2fd81a153fc27e703f6c16376c6fe7cdf1f4f2c4e6d4",
215
215
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
216
216
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
217
217
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
218
- "spec/v1/gaps.json": "a97d03cce8f59be6f84c66eeeacc56e01e500c7a32845afc95f4d4c4d91b4bfd",
218
+ "spec/v1/gaps.json": "a0aec8f5ddf1002d46a461a9c7d930c8f0656a19b68bb1f52d183b97cc1962cf",
219
219
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
220
220
  "spec/v1/migrations.json": "4c50760be70cb644d02427bcaf5749606700edf4513f423903cf3b1d12f5c300",
221
221
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -228,10 +228,10 @@
228
228
  "spec/v2/core/connection-packs.md": "c80f95bd6a03698f35c72cdb2b46bd973f49203bbd786c26760e35fa86e6f23d",
229
229
  "spec/v2/core/conversation.md": "8d6abedf6af408a74577753bfca24719d318e2632e10b45ff5d63bdcf31a8aaa",
230
230
  "spec/v2/core/errors.md": "e48838701b86bbfe0ffee77b18a8ffc4e5f04724b4318507d9771da653f8da0f",
231
- "spec/v2/core/events.md": "3eb297c1ca8a4c20017248051fbe9c5319bb51ef1ba4cb476e29840cbbe141a6",
231
+ "spec/v2/core/events.md": "d0f902edc080e9789e4fd05850a1264d905ebe5b06045b6a7a22486e22ef3091",
232
232
  "spec/v2/core/execution.md": "8a0c9db1bbfb97c008ab9328b7333c1cc3318196e78bfbefb49e781bdf4f9d44",
233
233
  "spec/v2/core/form-content-packs.md": "02931227899676fd4581a27017be2a6c4953904717be9b81c29d12f87ab3917d",
234
- "spec/v2/core/headers.md": "18e52477898e67b0b3778d1fdd22e07bc43d561c03b501573404cd53245edef6",
234
+ "spec/v2/core/headers.md": "f69fe81e4a3ad21879bb85948660c16860eb05bf152928c31aa4898f6d7d1887",
235
235
  "spec/v2/core/host-services.md": "168a40935a03867ee82461b5d83d05578be25ee3e5af4eb080587b891231e242",
236
236
  "spec/v2/core/i18n.md": "882904b7d59f992ab1e5f7346167161a54cf665b8fee47e64a3862cf9133a580",
237
237
  "spec/v2/core/idempotency.md": "adbd317a6ebb57c2759c076297b31f67def9e391576bccd0bbea787b13e85872",
@@ -310,12 +310,12 @@
310
310
  "spec/v2/interop-map.schema.json": "0017c882df34ee215e2e0729de051490e09d43aac3d2c949285698ed51832f12",
311
311
  "spec/v2/migrations.json": "651954938a1e154c0b6f1e3dd6e105889d30de3bb65789f21de7f77a12869e9e",
312
312
  "spec/v2/migrations.schema.json": "b91ade6320ad1b1185c9495b9424f3aa63438ed8e412c45171c227d82c0afd86",
313
- "spec/v2/path-manifest.json": "50fc251f296b06ec5fad35724f5c63b1a32e0e8fc222a85cd29b785cebdb9c98",
313
+ "spec/v2/path-manifest.json": "7b5679a4dad98c80d855361d88a98c8a4e045af15e310862a05b285b815dc9fc",
314
314
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
315
315
  "spec/v2/profiles.json": "180beb9ef2d161766fa23b2987e7e829851e3d316273147cf6a4a3f324befd6b",
316
- "spec/v2/release.json": "0fdc846e4aacfad6b0fe7a255002c4ad167bc41f14174ba6f2dcf2498cb540f3",
316
+ "spec/v2/release.json": "5edf0eb76b4b2d61addd3ebda82c0fa7cbfe9228665050da798cf1f26962cdbe",
317
317
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
318
- "spec/v2/surface-baseline.json": "91233acd0e69f99afbe4319260298ede7bddc2bd665d30305ecd443bef65ab58"
318
+ "spec/v2/surface-baseline.json": "d75c8f150df9625594cb6405b603e4f6f4d0e8d0d62ce198d0028c1133e9cbfd"
319
319
  },
320
- "corpusCommit": "f204da96cb286ba47bed89d4f66d70bbfdcda5a4"
320
+ "corpusCommit": "4bf2cc5a47102975d8710f50f619b3e4f1fcd9d8"
321
321
  }
package/api/seams-v2.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP conformance seams profile (openwop-conformance-seams-v2)
4
- version: 2.45.25
4
+ version: 2.45.27
5
5
  description: 'The OpenWOP conformance seams profile (`openwop-conformance-seams-v2`): test-only operations in their own
6
6
  path space, `/conformance/seams/…`. The profile is versioned and validated against the canonical v2 schemas with no tolerance
7
7
  path. It is not a capability: a host advertises the profile, never a `testSeams` flag.
@@ -1,7 +1,7 @@
1
1
  asyncapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 event streams
4
- version: 2.45.25
4
+ version: 2.45.27
5
5
  description: 'OpenWOP v2 event streams over SSE. The run-events channel''s address is the OpenAPI path key, and the server
6
6
  pathname is empty (bare origin). `streamMode` is a stream mode from the closed set, or a comma-separated combination of
7
7
  them; `values` never combines. `hostEvents` has a default address, `/host/events`; a host MAY declare another under `heartbeat.deliveryChannel`.
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 API
4
- version: 2.45.25
4
+ version: 2.45.27
5
5
  summary: REST surface for declaring, executing, suspending, resuming, and observing multi-step workflows.
6
6
  description: 'The OpenWOP v2 REST API. Paths are unversioned and served at the bare origin; a client selects a version with
7
7
  the `OpenWOP-Version` header from the host''s `protocolVersions[]`. Conformance seams and test-mode operations are not
@@ -3559,6 +3559,78 @@ paths:
3559
3559
  - runs:read
3560
3560
  - OpenIdConnect:
3561
3561
  - runs:read
3562
+ /host/events/test:
3563
+ post:
3564
+ tags:
3565
+ - host
3566
+ operationId: emitTestHostEvent
3567
+ summary: Emit one test host event to the caller's tenant
3568
+ description: 'Bound on a host listing `host-test.durable-triggered` or `host-test.ephemeral-triggered` in `hostEvents.types[]`,
3569
+ served for each listed class and otherwise answered `404`. Emits one event of the requested class''s reserved type,
3570
+ with an empty payload, through the ordinary host-event path: envelope, `/host/events`, `{ hostEvent }` webhooks, delivery
3571
+ class and tenant gate. It belongs to the caller''s tenant and to `workspaceId` when given, and MUST NOT reach another.
3572
+ A `delivery` whose type is not listed is `400 validation_error`; another tenant''s `workspaceId` is `403 id_tenant_mismatch`,
3573
+ an unknown one `404`. A host SHOULD rate-limit it more tightly than reads.'
3574
+ parameters:
3575
+ - $ref: '#/components/parameters/IdempotencyKey'
3576
+ - $ref: '#/components/parameters/OpenWOPVersion'
3577
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3578
+ requestBody:
3579
+ required: true
3580
+ content:
3581
+ application/json:
3582
+ schema:
3583
+ type: object
3584
+ additionalProperties: false
3585
+ required:
3586
+ - delivery
3587
+ properties:
3588
+ delivery:
3589
+ type: string
3590
+ enum:
3591
+ - durable
3592
+ - ephemeral
3593
+ workspaceId:
3594
+ $ref: ../../schemas/v2/ids.schema.json#/$defs/workspaceId
3595
+ responses:
3596
+ '202':
3597
+ description: Emitted; `eventId` is the envelope's.
3598
+ content:
3599
+ application/json:
3600
+ schema:
3601
+ type: object
3602
+ additionalProperties: false
3603
+ required:
3604
+ - eventId
3605
+ - type
3606
+ properties:
3607
+ eventId:
3608
+ $ref: ../../schemas/v2/ids.schema.json#/$defs/eventId
3609
+ type:
3610
+ type: string
3611
+ enum:
3612
+ - host-test.durable-triggered
3613
+ - host-test.ephemeral-triggered
3614
+ headers:
3615
+ OpenWOP-Version:
3616
+ $ref: '#/components/headers/OpenWOPVersion'
3617
+ '400':
3618
+ $ref: '#/components/responses/ValidationError'
3619
+ '401':
3620
+ $ref: '#/components/responses/Unauthenticated'
3621
+ '403':
3622
+ $ref: '#/components/responses/Forbidden'
3623
+ '404':
3624
+ $ref: '#/components/responses/NotFound'
3625
+ '429':
3626
+ $ref: '#/components/responses/RateLimited'
3627
+ security:
3628
+ - ApiKeyAuth:
3629
+ - webhooks:manage
3630
+ - OAuth2:
3631
+ - webhooks:manage
3632
+ - OpenIdConnect:
3633
+ - webhooks:manage
3562
3634
  components:
3563
3635
  securitySchemes:
3564
3636
  ApiKeyAuth:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.45.25",
3
+ "version": "2.45.27",
4
4
  "description": "The OpenWOP machine-readable contract: api/ (OpenAPI, AsyncAPI, the seams profile), schemas/ (v1 and v2 JSON Schemas), the spec/v1 and spec/v2 registries (errors, event codemap, declaration, deprecations, migrations, gaps) and CORPUS-STAMP.json — published from the openwop/openwop corpus tag; the peer dependency @openwop/openwop-conformance digest-checks at start (RFC 0168 §D.2).",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -64,6 +64,48 @@
64
64
  }
65
65
  }
66
66
  }
67
+ },
68
+ {
69
+ "if": {
70
+ "properties": {
71
+ "type": {
72
+ "const": "host-test.durable-triggered"
73
+ }
74
+ }
75
+ },
76
+ "then": {
77
+ "properties": {
78
+ "delivery": {
79
+ "const": "durable"
80
+ },
81
+ "payload": {
82
+ "type": "object",
83
+ "maxProperties": 0,
84
+ "description": "RFC 0241 §A: a caller-triggered test event (`emitTestHostEvent`) carries no payload."
85
+ }
86
+ }
87
+ }
88
+ },
89
+ {
90
+ "if": {
91
+ "properties": {
92
+ "type": {
93
+ "const": "host-test.ephemeral-triggered"
94
+ }
95
+ }
96
+ },
97
+ "then": {
98
+ "properties": {
99
+ "delivery": {
100
+ "const": "ephemeral"
101
+ },
102
+ "payload": {
103
+ "type": "object",
104
+ "maxProperties": 0,
105
+ "description": "RFC 0241 §A: a caller-triggered test event (`emitTestHostEvent`) carries no payload."
106
+ }
107
+ }
108
+ }
67
109
  }
68
110
  ],
69
111
  "examples": [
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.45.25"
7
+ "version": "2.45.27"
8
8
  },
9
9
  "note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
10
10
  },
@@ -426,5 +426,5 @@
426
426
  "$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
427
427
  }
428
428
  ],
429
- "digest": "332ef8dcb45f71f1833d861b847e0c448b008c4a98c55149e14d18a25ec036af"
429
+ "digest": "505909e2f4a22ed1c5603f9640130096da98c4e8254f5a92627161c6cdcb0c66"
430
430
  }
package/spec/v1/gaps.json CHANGED
@@ -14300,8 +14300,8 @@
14300
14300
  "surface": "No host installs `conformance-nondeterminism` or lists `nondeterminismPolicy.sources`.",
14301
14301
  "witness": "unclassified",
14302
14302
  "requirementId": null,
14303
- "disposition": "externally-gated",
14304
- "target": "v2-reference-nondeterminism-fixture",
14303
+ "disposition": "closed",
14304
+ "target": null,
14305
14305
  "sources": [
14306
14306
  {
14307
14307
  "file": "RFCS/registers/0237-nondeterminism-sources.gaps.md",
@@ -14317,8 +14317,8 @@
14317
14317
  "surface": "No host bundle records the two `openwop.requirement.0237.*` ids yet; the legs shipped in suite 2.45.23.",
14318
14318
  "witness": "unclassified",
14319
14319
  "requirementId": null,
14320
- "disposition": "carried",
14321
- "target": "openwop.gap.0237.2",
14320
+ "disposition": "closed",
14321
+ "target": null,
14322
14322
  "sources": [
14323
14323
  {
14324
14324
  "file": "RFCS/registers/0237-nondeterminism-sources.gaps.md",
@@ -14428,6 +14428,40 @@
14428
14428
  }
14429
14429
  ]
14430
14430
  },
14431
+ {
14432
+ "id": "openwop.gap.0241.1",
14433
+ "rfc": "0241",
14434
+ "local": "G1",
14435
+ "section": "§B, §D",
14436
+ "surface": "No host serves `POST /host/events/test` or lists the §A types, so no production host can witness RFC 0236's event-causing legs.",
14437
+ "witness": "unclassified",
14438
+ "requirementId": null,
14439
+ "disposition": "externally-gated",
14440
+ "target": "host-event-test-trigger-host",
14441
+ "sources": [
14442
+ {
14443
+ "file": "RFCS/registers/0241-host-event-test-trigger.gaps.md",
14444
+ "token": "G1"
14445
+ }
14446
+ ]
14447
+ },
14448
+ {
14449
+ "id": "openwop.gap.0241.2",
14450
+ "rfc": "0241",
14451
+ "local": "G2",
14452
+ "section": "§D",
14453
+ "surface": "No host bundle records the six `openwop.requirement.0236.*` ids with §B as the cause.",
14454
+ "witness": "unclassified",
14455
+ "requirementId": null,
14456
+ "disposition": "carried",
14457
+ "target": "openwop.gap.0241.2",
14458
+ "sources": [
14459
+ {
14460
+ "file": "RFCS/registers/0241-host-event-test-trigger.gaps.md",
14461
+ "token": "G2"
14462
+ }
14463
+ ]
14464
+ },
14431
14465
  {
14432
14466
  "id": "openwop.gap.spec.a2a-integration.g1",
14433
14467
  "rfc": "0152",
@@ -32,7 +32,7 @@ A run is its append-only event log. Every snapshot, stream, poll, fork and diff
32
32
  ^(?!openwop\.)[a-z][a-z0-9]*(-[a-z0-9]+)*\.[a-z][a-z0-9]*(-[a-z0-9]+)*(\.[a-z][a-z0-9]*(-[a-z0-9]+)*)?$
33
33
  ```
34
34
 
35
- - **Naming.** A protocol type is `domain.verb-ed`: kebab-case, exactly two segments, past tense for a transition (`run.started`, `node.suspend-failed`, `run.resume-started`). `domain.noun` is permitted only for an emitted artifact (`output.chunk`, `provider.usage`, `channel.presence`, `agent.handoff`, `envelope.refusal`, `agent.reasoning-delta`, `voice.synthesis-chunk`, `voice.endpoint-candidate`); each exception is recorded in the codemap.
35
+ - **Naming.** A protocol type is `domain.verb-ed`: kebab-case, exactly two segments, past tense for a transition (`run.started`, `node.suspend-failed`). `domain.noun` is permitted only for an emitted artifact (`output.chunk`, `channel.presence`); each exception is recorded in the codemap.
36
36
  - **Reserved prefix.** `openwop.` is the only reserved prefix. `core.`, `community.`, `vendor.`, `private.` and `local.` are pack namespaces, not event namespaces; a type under them is invalid.
37
37
  - **Vendor events.** A vendor type's first segment MUST be an org registered in the `extensions` object of `spec/v2/declaration.json` (the org registry, not the `extensions` metadata key a host publishes in discovery). An unregistered org fails validation. An org in `reservedOrgs` is forbidden and never registered. `extensionsKeyPattern` is the shape a vendor type must have, not a permission to use it. `example` is held by the protocol for documentation and conformance and is never assignable to a vendor.
38
38
  - **Growth.** The registry grows by the closed-enum rule in [overview.md](overview.md) §0. A producer MUST NOT emit an unregistered protocol type. A consumer MUST accept an unknown registered member and MUST NOT act on it.
@@ -127,10 +127,11 @@ With `bufferMs` (0..5000) the host accumulates events into one `event: batch` fr
127
127
 
128
128
  #### `hostEvents`
129
129
 
130
- A host event belongs to no run: its envelope (`schemas/v2/host-event.schema.json`) has no `runId` or `sequence`. `hostEvents.types[]` lists each emitted type and its `delivery`, `durable` or `ephemeral`. A host advertising it:
130
+ A host event's envelope (`schemas/v2/host-event.schema.json`) has no `runId` or `sequence`. `hostEvents.types[]` lists each emitted type with its `delivery` class. A host advertising it:
131
131
 
132
132
  - MUST deliver each listed type here, `event:` being the type and `data:` the envelope, and MUST emit no other type or class;
133
- - MUST confine an event naming a `workspaceId` to that workspace, and an ephemeral event to subscribers it is visible to.
133
+ - MUST confine an event naming a `workspaceId` to that workspace, and an ephemeral event to subscribers it is visible to;
134
+ - MUST emit each listed `host-test.*` type, only through `emitTestHostEvent`, to the caller's tenant.
134
135
 
135
136
  An ephemeral event MUST NOT be persisted, redelivered on reconnection, or sent through webhooks, A2A push or any sink; its frame has no `id:`. A durable event's `id:` is its `eventId`, and a host SHOULD honour `Last-Event-ID` for it within retention. A vendor payload MUST NOT carry secrets.
136
137
 
@@ -13,13 +13,13 @@ Standard headers keep their standard names: `Idempotency-Key`, `ETag`, `If-None-
13
13
  | Header | Operations | Meaning |
14
14
  | --- | --- | --- |
15
15
  | `Accept-Language` | 1 | BCP-47 preference list; authoritative for locale selection (i18n.md). A malformed value MUST NOT produce a 400. |
16
- | `Idempotency-Key` | 15 | Per-mutation idempotency token (`idempotency.md` Layer 1). The server caches `(tenantId, endpoint, key)` → response for ≥24h. A duplicate request returns the cached response with `OpenWOP-Idempotent-Replay: true`. |
16
+ | `Idempotency-Key` | 16 | Per-mutation idempotency token (`idempotency.md` Layer 1). The server caches `(tenantId, endpoint, key)` → response for ≥24h. A duplicate request returns the cached response with `OpenWOP-Idempotent-Replay: true`. |
17
17
  | `If-None-Match` | 2 | Conditional request on the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot). A value that matches the current `ETag` (runs.md §Caching and encoding) MUST yield `304 Not Modified` with no body. The 304 carries `OpenWOP-Version` like every response (versioning.md §1.4). |
18
18
  | `Last-Event-ID` | 1 | Resume from sequence after this ID. |
19
- | `OpenWOP-Client-Version` | 60 | The protocol version the client implements (versioning.md §1.5). Compared with `minClientVersion` on major.minor. A malformed value is treated as absent and MUST NOT produce a 400. Never selects a contract. |
19
+ | `OpenWOP-Client-Version` | 61 | The protocol version the client implements (versioning.md §1.5). Compared with `minClientVersion` on major.minor. A malformed value is treated as absent and MUST NOT produce a 400. Never selects a contract. |
20
20
  | `OpenWOP-Dedup` | 1 | When set, the host's cross-host claim system rejects a duplicate `(tenantId, scopeId)` pair with `409 Conflict`. |
21
21
  | `OpenWOP-Force-Engine-Version` | 1 | Test keys only. The server emits this run's events as if it ran the given engine version, which must be within `Capabilities.testing.forceEngineVersionRange`. Servers MUST reject it on production API keys with `403 force_engine_version_forbidden`. |
22
- | `OpenWOP-Version` | 60 | Selects one of the host's listed major.minor versions. Absent, `/.well-known/openwop` uses `preferredVersion` and every other unversioned path is v2; an unlisted value is 406 protocol_version_unsupported. |
22
+ | `OpenWOP-Version` | 61 | Selects one of the host's listed major.minor versions. Absent, `/.well-known/openwop` uses `preferredVersion` and every other unversioned path is v2; an unlisted value is 406 protocol_version_unsupported. |
23
23
 
24
24
  ## Cross-origin preflight
25
25
 
@@ -36,9 +36,9 @@ A host that answers a CORS preflight for an operation by granting the requesting
36
36
  | `ETag` | 3 | Standard HTTP validator (RFC 9110 §8.8.3). The obligation is per operation: MUST on the discovery document (capabilities.md §1), SHOULD on the run snapshot (runs.md §Snapshot), a content hash on a prompt template (getPromptTemplate); see each operation. |
37
37
  | `Location` | 1 | Canonical URI of the new template. |
38
38
  | `OpenWOP-Idempotent-Replay` | 1 | Set when the response was served from the idempotency cache. |
39
- | `OpenWOP-Version` | 60 | The contract that produced this response. It MUST equal the one used. |
40
- | `Retry-After` | 1 | Seconds until the active claim is stale-eligible. |
41
- | `WWW-Authenticate` | 53 | A `Bearer` challenge. On a host with an oauth2 or oidc lane it carries `resource_metadata` and `error="invalid_token"`. Never sent on a non-disclosure 404. |
39
+ | `OpenWOP-Version` | 61 | The contract that produced this response. It MUST equal the one used. |
40
+ | `Retry-After` | 2 | Seconds until the active claim is stale-eligible. |
41
+ | `WWW-Authenticate` | 54 | A `Bearer` challenge. On a host with an oauth2 or oidc lane it carries `resource_metadata` and `error="invalid_token"`. Never sent on a non-disclosure 404. |
42
42
 
43
43
  ## Webhook delivery headers
44
44
 
@@ -240,6 +240,18 @@
240
240
  "authenticated": true,
241
241
  "requestBody": false
242
242
  },
243
+ {
244
+ "method": "POST",
245
+ "path": "/host/events/test",
246
+ "operationId": "emitTestHostEvent",
247
+ "requestHeaders": [
248
+ "Idempotency-Key",
249
+ "OpenWOP-Client-Version",
250
+ "OpenWOP-Version"
251
+ ],
252
+ "authenticated": true,
253
+ "requestBody": true
254
+ },
243
255
  {
244
256
  "method": "GET",
245
257
  "path": "/host/ui-plugins/{packName}/{pluginId}/frame",
@@ -699,7 +711,7 @@
699
711
  }
700
712
  ],
701
713
  "counts": {
702
- "operations": 60,
714
+ "operations": 61,
703
715
  "channels": 2
704
716
  }
705
717
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$comment": "RFC 0172 §D.1 — the one release identity the v2 artifacts derive from. `version` is the next corpus tag `v<version>` (the publish workflow's coordinated-release tag pattern `v*`; RFC 0172's `openwop/v2.<minor>.<patch>` spelling is amended to this at its flip). api/v2/*.yaml info.version, the suite's 2.x version and @openwop/spec-artifacts read it. Bumped by the release PR that cuts the tag, never by hand elsewhere.",
3
- "version": "2.45.25",
4
- "corpusTag": "v2.45.25",
5
- "updated": "2026-10-07"
3
+ "version": "2.45.27",
4
+ "corpusTag": "v2.45.27",
5
+ "updated": "2026-10-08"
6
6
  }
@@ -4,7 +4,7 @@
4
4
  "schemas/v2/**/*.json",
5
5
  "spec/v2/path-manifest.json"
6
6
  ],
7
- "release": "2.45.25",
7
+ "release": "2.45.27",
8
8
  "kinds": {
9
9
  "union": [
10
10
  "channel",
@@ -18,7 +18,7 @@
18
18
  "type"
19
19
  ]
20
20
  },
21
- "count": 8760,
21
+ "count": 8761,
22
22
  "surfaces": [
23
23
  "schemas/v2/a2a-task-state.schema.json#/contextId|type|string",
24
24
  "schemas/v2/a2a-task-state.schema.json#/interruptKind|enum-member|\"approval\"",
@@ -8762,6 +8762,7 @@
8762
8762
  "spec/v2/path-manifest.json#|operation|GET /workflows/{workflowId}",
8763
8763
  "spec/v2/path-manifest.json#|operation|POST /agents/{agentId}/deployments",
8764
8764
  "spec/v2/path-manifest.json#|operation|POST /content/pages",
8765
+ "spec/v2/path-manifest.json#|operation|POST /host/events/test",
8765
8766
  "spec/v2/path-manifest.json#|operation|POST /host/ui-plugins/{packName}/{pluginId}/rpc",
8766
8767
  "spec/v2/path-manifest.json#|operation|POST /interrupts/{token}",
8767
8768
  "spec/v2/path-manifest.json#|operation|POST /prompts",