@openwop/spec-artifacts 2.45.19 → 2.45.20

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,19 +1,19 @@
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.19",
5
- "corpusTag": "v2.45.19",
4
+ "version": "2.45.20",
5
+ "corpusTag": "v2.45.20",
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": "f240b4205e4f1205b80278806db17fff394e5b4ef21a7ad1d2c3bda8ee080b5a",
13
- "api/v2/asyncapi.yaml": "525ed38e2e0c5c0cb0785fb940f97ee3335c837f5797351ee954c3e312174bdb",
14
- "api/v2/openapi.yaml": "9971c6250f45f8ea6f8b16d3f3e1a86556d65968342e9ec370f23018c118c872",
12
+ "api/seams-v2.yaml": "3d62475a6e5d2f0e005aa58b95c197f8846104d8cb7753c2161d7b6948cb89b4",
13
+ "api/v2/asyncapi.yaml": "44ea76f380b18c54ccdb51eaa091289212cd044e656c4d97e94df7bf048972e9",
14
+ "api/v2/openapi.yaml": "4ebf762aabf5d25318923ac0c8a2b865e11d7e07b2a2456ab6b535d91e56da33",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
- "schemas/README.md": "bd1c00fae7b6fda506a75aff841bbdc438d4ce092642a72041203bee999b88de",
16
+ "schemas/README.md": "a829e3208413062388e52ab6ba714d35889c9c7645db38a290b0c4f4992cd3da",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
18
18
  "schemas/a2ui-surface-delta-frame.schema.json": "970d434e4fdcb925de64aaace91eb83bfbcfd8f76757a9ce9f339eda5fb3f4e8",
19
19
  "schemas/agent-deployment-transition.schema.json": "1ac987fed0f380fa5b4e9a40e8e13316e5ae42d03a0ff42db4be6273e1bfe9f4",
@@ -117,9 +117,9 @@
117
117
  "schemas/v2/artifact.schema.json": "85b9dc284d39b99d2a66fa8cbf47f2dd3d8526d3bd6cc411ad315b372de38975",
118
118
  "schemas/v2/audit-verify-result.schema.json": "14af8e9283510f0a40e48a2059c929ee44e0fc9fa3cc66a95bfbe90b17c48297",
119
119
  "schemas/v2/budget-policy.schema.json": "1de68095db0beb5c7a4be629de26e79f62ebbe748a88d46f36e768edfd1f0d68",
120
- "schemas/v2/capabilities.schema.json": "c7a01b2f569139f99ba5e1a5329a42556fbd82bc743f8fd96963304395fc9ef0",
120
+ "schemas/v2/capabilities.schema.json": "a24c99d07971dde0e4596eba0bf5616e3df4459dc2174e8aebb2c544f964337c",
121
121
  "schemas/v2/certification-bundle.schema.json": "9a3c67860f3b0867ff4733d3f8ae0f5d5d747b815ab39b6c255589f103119fa6",
122
- "schemas/v2/channel-presence-payload.schema.json": "9a5227f8bcdb2ecd6c606938c8d835781f4654b88a7a30b0d7e8cd4dde1975ad",
122
+ "schemas/v2/channel-presence-payload.schema.json": "fc03df0c20cc12a25f7ee6a47503a4c5931d79fe3d5ff24815e8fd7c1bcb9a87",
123
123
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
124
124
  "schemas/v2/chat-card-pack-manifest.schema.json": "92a57db2fd4b2463f14ef155fef8e3f18afc78960b646459dcf32efc79ff6bf5",
125
125
  "schemas/v2/compact-tool-descriptor.schema.json": "b5c418d72082d5b713bf318212a83397e5be98e56d25ca056302b41b8dd8273b",
@@ -152,6 +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
156
  "schemas/v2/ids.schema.json": "65cfaa193be0ca9cf48af39c18c553979e3ec1f7fc04509aaa513b322d7b7e4a",
156
157
  "schemas/v2/localized-content-language-settings.schema.json": "3c8350a178037a460f5d87466ccaf9ed5fe3d41497786d2504cc66e42152c8cc",
157
158
  "schemas/v2/localized-content-page-response.schema.json": "ef48329749758afb21e4d3cbc3f017abb911f75726819457f35b9f1390332c75",
@@ -192,8 +193,8 @@
192
193
  "schemas/v2/trigger-subscription-registration.schema.json": "5f7959f3e13f49399783e47f73101d6af95e5abccea1af2f0014ccbe3e51006c",
193
194
  "schemas/v2/trigger-subscription.schema.json": "06abe021712a4bfc5a107a067053cd3cc9704f47ae7066d8449a508c368a0ab2",
194
195
  "schemas/v2/ui-plugin-message.schema.json": "879d65867c01656b3962d64283e66364dcb8f626ad26c5fcf2d2d55a79ae0ce9",
195
- "schemas/v2/webhook-dead-letter-page.schema.json": "543f5ccc26d8f777684a037172ab7b9fdf70735e5394eeb42e5fa6569503f528",
196
- "schemas/v2/webhook-delivery.schema.json": "4e8ab3b722ad1731adf0548c1217f0de62da40de14e8abf77533aee4ace4c079",
196
+ "schemas/v2/webhook-dead-letter-page.schema.json": "78f3284722c2b42d52ff8a1e6d9b9092ba1ac35c2dbe036f3ff2470b34086d1e",
197
+ "schemas/v2/webhook-delivery.schema.json": "5f5361ede12098b5c2d685f0aa70fcb07219fd6b68c6ad6af393ca8dd266d56a",
197
198
  "schemas/v2/webhook-verification.schema.json": "76e4e0d81143ffd2649bc7adba2aa34f2525e2c4e9f0300a425d908b3163196b",
198
199
  "schemas/v2/workflow-chain-pack-manifest.schema.json": "c0e38aa96b029c539415fb7e8a793fd770c3eb5a1b44a818661f9c127c99191b",
199
200
  "schemas/v2/workflow-definition.schema.json": "cb1194631d2b96b0975940b916be43a70363b78b1b6716f9cd84b162d3c96615",
@@ -207,14 +208,14 @@
207
208
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
208
209
  "spec/v1/alias-detectors.json": "0b2f28808ffe0b9d98a187775038c3406bb70919747a788a6e4f866e293ae6d3",
209
210
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
210
- "spec/v1/core-standard-manifest.json": "806e07cd5de0684b09db910394d8713d0f6f45dc318803374a183cc57d07bf86",
211
+ "spec/v1/core-standard-manifest.json": "d7c4865e30b6eed18c932ca0c4e4bbcbcb3f4cfedfdd560876a436d0ed774ba0",
211
212
  "spec/v1/deprecations.json": "a3293072ea951857395d05f0437264e88965f1e9019ff61c55bacfa9c1aaa17c",
212
213
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
213
214
  "spec/v1/end-of-support.json": "35f0bf3b70fe78b16e2a2fd81a153fc27e703f6c16376c6fe7cdf1f4f2c4e6d4",
214
215
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
215
216
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
216
217
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
217
- "spec/v1/gaps.json": "9271f9796be51dc5182ad7ed00445b50c67e1c3d33fc76b47f080a985dd647d7",
218
+ "spec/v1/gaps.json": "b745aa2620ae8c9f79e7df7bd7c81559b8929f0bdfae62a7ea15debc29e8f19a",
218
219
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
219
220
  "spec/v1/migrations.json": "4c50760be70cb644d02427bcaf5749606700edf4513f423903cf3b1d12f5c300",
220
221
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -222,12 +223,12 @@
222
223
  "spec/v1/spec-gaps.json": "ea9612af55bea9dae3e82223d4f714243f8f590b0193f1188257b13491a38afc",
223
224
  "spec/v2/README.md": "ddea90d7cf14aefffe1a43eeeecd4222dadad1d1e5ac64dceb073990eb93d9ef",
224
225
  "spec/v2/core/artifact-type-packs.md": "f734740cc3963f86c9f273a7dace26291bba2855161ddd3540618131a2c8d13e",
225
- "spec/v2/core/capabilities.md": "ed4664a38f53cee32d0082d9fe99091ce13a9874081150fdc72b9b41d4ef9e72",
226
+ "spec/v2/core/capabilities.md": "503fd78ce55aca2cf83b872a5d6086f016470df2d9bcd7fb427b8f16fb9d044a",
226
227
  "spec/v2/core/conformance.md": "3ca291e63bc70a6ef829ae8759ad0ded3741ea7aa507bbbdffc57de443ab2ae2",
227
228
  "spec/v2/core/connection-packs.md": "c80f95bd6a03698f35c72cdb2b46bd973f49203bbd786c26760e35fa86e6f23d",
228
- "spec/v2/core/conversation.md": "354fa57c73d11062e523a44aa75a6353c5c81aefaf306d30c42416a228c82c86",
229
+ "spec/v2/core/conversation.md": "e0351883a57e90f13d2e9f6f5d3e80080b46be4988617448cb7a0e0c7c0bfbad",
229
230
  "spec/v2/core/errors.md": "91f46acc9c9a5532a98cf62c69285d68575c100ff6064f0b1bf94731a087e34a",
230
- "spec/v2/core/events.md": "c1a20e3aa6736119ea07aa2cf66faa808a1874d2cde4933033b65506d1742883",
231
+ "spec/v2/core/events.md": "00746062621ec98052ee323755fbdb10f4fb070439058039e44feb6bb19b073a",
231
232
  "spec/v2/core/execution.md": "8a0c9db1bbfb97c008ab9328b7333c1cc3318196e78bfbefb49e781bdf4f9d44",
232
233
  "spec/v2/core/form-content-packs.md": "02931227899676fd4581a27017be2a6c4953904717be9b81c29d12f87ab3917d",
233
234
  "spec/v2/core/headers.md": "24b0d84ab5521e20f2669fca8006a11f9faf5c2311199e57375b8fa64ce763ed",
@@ -249,11 +250,11 @@
249
250
  "spec/v2/core/storage.md": "dc94b985847c1341c7a064f04a6010f0fdbe6c3ab3e555d4362878c81d764c18",
250
251
  "spec/v2/core/tool-catalog.md": "d16a9004418719c48301804aefa4d7ab6f41112a4ed83727f552aa1b92b418b0",
251
252
  "spec/v2/core/versioning.md": "348a6dc5bd3425efc0016bb6772d5d04ebf578b73eebcdfec6c2d82346a8577e",
252
- "spec/v2/core/webhooks.md": "daf6ec03092f4b3fde1eb74a5e2e801ec48db5139a13fcc0fd7fb4a004635ae3",
253
+ "spec/v2/core/webhooks.md": "b3be00624d07466606c81ff5069744428d16761e16d79807517b171d8293c262",
253
254
  "spec/v2/core/workflow-chain-packs.md": "fdce7a8477e269950a2bac05ee6eddbd66eb0b670b464d00054f7196ec05d29c",
254
255
  "spec/v2/corrections.json": "3a8d93e33865b692d26a3b6bfd3819766e206b2e0c2a69669baa4bf833d05a49",
255
256
  "spec/v2/corrections.schema.json": "46bbffb954d13bd9995aebc912ceeb2544f7064331abf25fd6ab85c81a5cec94",
256
- "spec/v2/declaration.json": "e963d3aa73892ee08281227c8a01aa6c06f1b825cdcb26aab029b1ab3f4155bf",
257
+ "spec/v2/declaration.json": "5ae9b7c84ab841930dd2885f048d99342ee81ba08cf6a6c07015070f8e17b9d1",
257
258
  "spec/v2/declaration.schema.json": "ef951633e4070899f64828f5cf1b5f4870270a0360f81dbb49b5b4d6cd407550",
258
259
  "spec/v2/eos-override.json": "4c72d2f6a658943b01c1de1643cf294642091933af7832f38ee5495df684cb2d",
259
260
  "spec/v2/errors.json": "83f048b0a06952b4af6f125fb66c4212acab51056b411390f1010acd6ab9cdc0",
@@ -287,6 +288,7 @@
287
288
  "spec/v2/facets/connections.schema.json": "f998bb206a5814183bb4720cc34fa43b7ab64d61e39a79437b009c589ce8b78e",
288
289
  "spec/v2/facets/envelopeStrictness.schema.json": "28be0a27f880bd45ec1222a16155f5e9167bbca57bf0322970fe1eb2654562aa",
289
290
  "spec/v2/facets/heartbeat.schema.json": "81d7fa1895a8b0241bd07cf00a7e7905bef0fd14eb3427325261c62eee5746a6",
291
+ "spec/v2/facets/hostEvents.schema.json": "973ff452cb91356b4c625d0b06c8d2ef335e18183de09e1afde8acead22290b3",
290
292
  "spec/v2/facets/interrupt.schema.json": "2110ef32c3f880bf706475ef4cf8ddf97ff06871b8e6003a5edbcf4439f1fb70",
291
293
  "spec/v2/facets/mcp.schema.json": "7060657dfcff170f079beed160e3db7c1d3cc4410cd3cf64863baf6459f781cd",
292
294
  "spec/v2/facets/oauth.schema.json": "3a0cbe249d3bd5a5982349ae7ba2534776cc958e4a57e0fbeabf2bdab6e99e69",
@@ -309,9 +311,9 @@
309
311
  "spec/v2/path-manifest.json": "b84c7561f50c7df0cb61b202bd6595acad3ee7edca7a45f711949bea3c69bd27",
310
312
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
311
313
  "spec/v2/profiles.json": "180beb9ef2d161766fa23b2987e7e829851e3d316273147cf6a4a3f324befd6b",
312
- "spec/v2/release.json": "9e25694dc4997c4291d86a3e65346a9db37af36cff411155de29b9619a169c90",
314
+ "spec/v2/release.json": "84c88ee17dd416060ba7d564fb3d47fdb528c4efa9cd8e483749b77557dac816",
313
315
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
314
- "spec/v2/surface-baseline.json": "97a0dc8dc715ed872d766aceb91f991e031b0bd160421037d6927fa21e9646b5"
316
+ "spec/v2/surface-baseline.json": "11600f3b5d689962b34aaa1bdfa4c3e2a47632b914a945b356b825dd494ec9db"
315
317
  },
316
- "corpusCommit": "d1ece01b982dd1ad4eee4bd29b144e4a82b0db22"
318
+ "corpusCommit": "d6b2495ddf9ac4b82580a9e0f055f29beccfe24a"
317
319
  }
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.19
4
+ version: 2.45.20
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.
@@ -1327,6 +1327,102 @@ paths:
1327
1327
  $ref: '#/components/responses/Unauthenticated'
1328
1328
  '404':
1329
1329
  $ref: '#/components/responses/NotFound'
1330
+ /conformance/seams/sample/channel-presence/snapshot:
1331
+ post:
1332
+ tags:
1333
+ - Seams
1334
+ operationId: snapshotChannelPresence
1335
+ summary: Read one live channel.presence snapshot as a given observer would receive it
1336
+ description: 'Transiently joins `member` to the channel conversation `conversationId`, then returns the `channel.presence`
1337
+ payload the host would deliver to `observer` (default: `member`). It MUST route through the same membership gate and
1338
+ closed payload the host applies in production, and MUST NOT branch on the seam.
1339
+
1340
+
1341
+ When `observer` is not a current member, the host MUST refuse as its production delivery gate does (`403` or `404`)
1342
+ and MUST NOT answer `200`: presence is never delivered to a non-member (conversation.md §channelPresence). An unwired
1343
+ seam answers `404`/`405`; a scenario tells the two apart by first asking as `member`.'
1344
+ requestBody:
1345
+ required: true
1346
+ content:
1347
+ application/json:
1348
+ schema:
1349
+ type: object
1350
+ additionalProperties: false
1351
+ required:
1352
+ - conversationId
1353
+ - member
1354
+ properties:
1355
+ conversationId:
1356
+ type: string
1357
+ minLength: 1
1358
+ member:
1359
+ type: string
1360
+ pattern: ^(user|agent):.+
1361
+ description: The subject transiently joined, so `present` is non-vacuous.
1362
+ observer:
1363
+ type: string
1364
+ pattern: ^(user|agent):.+
1365
+ description: The subject the snapshot is delivered to; default `member`.
1366
+ responses:
1367
+ '200':
1368
+ description: The snapshot delivered to `observer`, who is a member.
1369
+ content:
1370
+ application/json:
1371
+ schema:
1372
+ $ref: ../schemas/v2/channel-presence-payload.schema.json
1373
+ '400':
1374
+ $ref: '#/components/responses/ValidationError'
1375
+ '401':
1376
+ $ref: '#/components/responses/Unauthenticated'
1377
+ '403':
1378
+ $ref: '#/components/responses/Forbidden'
1379
+ '404':
1380
+ $ref: '#/components/responses/NotFound'
1381
+ /conformance/seams/sample/host-events/emit:
1382
+ post:
1383
+ tags:
1384
+ - Seams
1385
+ operationId: emitHostEvent
1386
+ summary: Produce one host event of an advertised type
1387
+ description: Produces one host event of `type`, which MUST be a type the host advertises in its `hostEvents` record,
1388
+ under the caller's tenant (and `workspaceId`, when given). The host MUST produce it through its production path, delivery
1389
+ class and tenant gate included, and MUST NOT branch on the seam. A host serving the seams profile advertises an `example.*`
1390
+ durable type and an `example.*` ephemeral type for the suite to drive. An unadvertised `type` is `400 validation_error`;
1391
+ an unwired seam answers `404`/`405`.
1392
+ requestBody:
1393
+ required: true
1394
+ content:
1395
+ application/json:
1396
+ schema:
1397
+ type: object
1398
+ additionalProperties: false
1399
+ required:
1400
+ - type
1401
+ properties:
1402
+ type:
1403
+ type: string
1404
+ minLength: 1
1405
+ workspaceId:
1406
+ $ref: ../schemas/v2/ids.schema.json#/$defs/workspaceId
1407
+ responses:
1408
+ '202':
1409
+ description: Produced; `eventId` is the envelope's.
1410
+ content:
1411
+ application/json:
1412
+ schema:
1413
+ type: object
1414
+ additionalProperties: false
1415
+ required:
1416
+ - eventId
1417
+ properties:
1418
+ eventId:
1419
+ $ref: ../schemas/v2/ids.schema.json#/$defs/eventId
1420
+ '400':
1421
+ $ref: '#/components/responses/ValidationError'
1422
+ '401':
1423
+ $ref: '#/components/responses/Unauthenticated'
1424
+ '404':
1425
+ $ref: '#/components/responses/NotFound'
1330
1426
  components:
1331
1427
  securitySchemes:
1332
1428
  ApiKeyAuth:
@@ -1,7 +1,7 @@
1
1
  asyncapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 event streams
4
- version: 2.45.19
4
+ version: 2.45.20
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`.
@@ -29,12 +29,14 @@ channels:
29
29
  $ref: '#/components/messages/RunEvent'
30
30
  hostEvents:
31
31
  address: /host/events
32
- title: Host-scoped events (`heartbeat.*`)
32
+ title: Host-scoped events (`heartbeat.*` and host events)
33
33
  messages:
34
34
  heartbeatEvaluated:
35
35
  $ref: '#/components/messages/HeartbeatEvaluated'
36
36
  heartbeatStateChanged:
37
37
  $ref: '#/components/messages/HeartbeatStateChanged'
38
+ hostEvent:
39
+ $ref: '#/components/messages/HostEvent'
38
40
  operations:
39
41
  subscribeRunEvents:
40
42
  action: receive
@@ -445,6 +447,15 @@ components:
445
447
  contentType: application/json
446
448
  payload:
447
449
  $ref: '#/components/schemas/RunEventDoc'
450
+ HostEvent:
451
+ name: hostEvent
452
+ title: Host event
453
+ contentType: text/event-stream
454
+ payload:
455
+ $ref: ../../schemas/v2/host-event.schema.json
456
+ description: 'One SSE frame per host event (RFC 0236): `event:` is the host-event `type`, `data:` the envelope. A durable
457
+ event''s frame carries `id:` = `eventId`; an ephemeral event''s frame carries no `id:` and is never redelivered. Every
458
+ message on this channel is delivered only within the subscriber''s tenant.'
448
459
  RunEvent:
449
460
  name: runEvent
450
461
  title: Run event
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 API
4
- version: 2.45.19
4
+ version: 2.45.20
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
@@ -3411,9 +3411,9 @@ paths:
3411
3411
  tags:
3412
3412
  - host
3413
3413
  operationId: streamHostEvents
3414
- summary: Stream host-scoped events (`heartbeat.*`) as SSE
3415
- description: The default `hostEvents` address; a host MAY declare another under `heartbeat.deliveryChannel`. Carries
3416
- no run data.
3414
+ summary: Stream host-scoped events (`heartbeat.*` and host events) as SSE
3415
+ description: The default `hostEvents` address; a host MAY declare another under `heartbeat.deliveryChannel`. Every message
3416
+ is delivered only within the caller's tenant (RFC 0236 §D). Carries no run data.
3417
3417
  responses:
3418
3418
  '200':
3419
3419
  description: '`text/event-stream` of `hostEvents` messages.'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.45.19",
3
+ "version": "2.45.20",
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": {
package/schemas/README.md CHANGED
@@ -40,7 +40,7 @@
40
40
  | `audit-verify-result.schema.json` | `auth-profiles.md` §`openwop-audit-log-integrity` | Response payload from `GET /v1/audit/verify` — chain-validity verdict + checkpoints + anomalies |
41
41
  | `capabilities.schema.json` | `capabilities.md` | `/.well-known/openwop` response — protocolVersion + supportedEnvelopes + schemaVersions + limits + optional v1 discovery surface |
42
42
  | `channel-written-payload.schema.json` | `channels-and-reducers.md` §Channel write event | Payload of the `channel.written` RunEvent — write input + reducer name |
43
- | `channel-presence-payload.schema.json` | RFC 0110 | Payload of the OPTIONAL `channel.presence` RunEvent — ephemeral channel presence (online + typing), membership-gated, non-persisted |
43
+ | `channel-presence-payload.schema.json` | RFC 0110 | Payload of the `channel.presence` ephemeral host event (RFC 0236 §F) — ephemeral channel presence (online + typing), membership-gated, non-persisted |
44
44
  | `chat-card-pack-manifest.schema.json` | `chat-card-packs.md` + RFC 0071 | DRAFT — manifest for `kind: "card"` registry packs (RFC 0071 Phase 2). Peer to the node/workflow-chain/prompt/artifact-type pack manifests; disjoint via the `kind` discriminator. Distributes AI chat cards: a prompt template + typed input subset bound to a typed `outputArtifactType`. |
45
45
  | `form-content-pack-manifest.schema.json` | `form-content-packs.md` + RFC 0137 | DRAFT — manifest for `kind: "form-content"` registry packs (RFC 0137). Peer to the node/workflow-chain/prompt/artifact-type/chat-card pack manifests; disjoint via the `kind` discriminator. Distributes form templates: a versioned, ordered list of typed fields a host instantiates through its normal create path. `fields[].type` reuses the RFC 0071 portable subset verbatim rather than defining a second vocabulary. |
46
46
  | `connection-pack-manifest.schema.json` | `connection-packs.md` + RFC 0095 | DRAFT — manifest for `kind: "connection"` registry packs (RFC 0095). Peer to the node/workflow-chain/prompt/artifact-type/chat-card pack manifests; disjoint via the `kind` discriminator. Distributes a portable provider definition — auth endpoints, read/write scope groups, exactly-one reach (`mcp`/`openapi`/`integration`) — that the RFC 0045/0047 `provider` string resolves against. Carries NO credential material (`connection-pack-no-credential-material`). |
@@ -4485,6 +4485,105 @@
4485
4485
  "description": "core/capabilities.md#heartbeat — witness: witnessable-gated; maturity experimental/none; RFC 0060",
4486
4486
  "x-openwop-facets-from": "spec/v2/facets/heartbeat.schema.json"
4487
4487
  },
4488
+ "hostEvents": {
4489
+ "type": "object",
4490
+ "additionalProperties": false,
4491
+ "required": [
4492
+ "status",
4493
+ "since",
4494
+ "witness",
4495
+ "types"
4496
+ ],
4497
+ "properties": {
4498
+ "status": {
4499
+ "enum": [
4500
+ "stable",
4501
+ "experimental",
4502
+ "deprecated"
4503
+ ]
4504
+ },
4505
+ "since": {
4506
+ "type": "string",
4507
+ "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$",
4508
+ "description": "The minor of THIS HOST's own contract at which it began serving the family — a point on its protocolVersions[] timeline, not the corpus minor that introduced the family. The corpus states no per-family since (spec/v2/declaration.json carries witness and maturity and no since), and `status`/`until` are the host's stability claim absorbed from v1 tier/experimentalUntil, so all three describe the host's offering and `witness` is the record's one corpus-derived field. A since naming a minor absent from protocolVersions[] puts adjacent same-grammar fields on two different timelines and is a defect. Ruled 2026-09-11."
4509
+ },
4510
+ "until": {
4511
+ "type": "string",
4512
+ "pattern": "^((0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)|\\d{4}-\\d{2}-\\d{2})$"
4513
+ },
4514
+ "witness": {
4515
+ "enum": [
4516
+ "witnessable-unaided",
4517
+ "witnessable-gated",
4518
+ "seam-gated",
4519
+ "claims-check",
4520
+ "negative-existence"
4521
+ ]
4522
+ },
4523
+ "types": {
4524
+ "type": "array",
4525
+ "minItems": 1,
4526
+ "items": {
4527
+ "type": "object",
4528
+ "additionalProperties": false,
4529
+ "required": [
4530
+ "type",
4531
+ "delivery"
4532
+ ],
4533
+ "properties": {
4534
+ "type": {
4535
+ "type": "string",
4536
+ "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9]*(-[a-z0-9]+)*$"
4537
+ },
4538
+ "delivery": {
4539
+ "type": "string",
4540
+ "enum": [
4541
+ "durable",
4542
+ "ephemeral"
4543
+ ]
4544
+ }
4545
+ }
4546
+ }
4547
+ }
4548
+ },
4549
+ "allOf": [
4550
+ {
4551
+ "if": {
4552
+ "properties": {
4553
+ "status": {
4554
+ "const": "stable"
4555
+ }
4556
+ }
4557
+ },
4558
+ "then": {
4559
+ "not": {
4560
+ "required": [
4561
+ "until"
4562
+ ]
4563
+ }
4564
+ }
4565
+ },
4566
+ {
4567
+ "if": {
4568
+ "properties": {
4569
+ "status": {
4570
+ "enum": [
4571
+ "experimental",
4572
+ "deprecated"
4573
+ ]
4574
+ }
4575
+ }
4576
+ },
4577
+ "then": {
4578
+ "required": [
4579
+ "until"
4580
+ ]
4581
+ }
4582
+ }
4583
+ ],
4584
+ "description": "core/capabilities.md#hostEvents — witness: witnessable-gated; maturity experimental/none; RFC 0236",
4585
+ "x-openwop-facets-from": "spec/v2/facets/hostEvents.schema.json"
4586
+ },
4488
4587
  "toolHooks": {
4489
4588
  "type": "object",
4490
4589
  "additionalProperties": false,
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/channel-presence-payload.schema.json",
4
4
  "title": "ChannelPresencePayload",
5
- "description": "Payload of the OPTIONAL `channel.presence` RunEvent (RFC 0110). EPHEMERAL live presence for a `type:'channel'` conversation — who is currently present + (optionally) who is typing. A host MUST NOT persist this event to the replayable event log / transcript, and it MUST NOT affect replay or `:fork` determinism (presence is live state, the load-bearing distinction from the persisted `conversation.exchanged` turn — see replay.md). Membership-gated: every ref MUST be a current channel participant and the event MUST NOT be delivered to a non-member (the same DEFAULT-DENY visibility as the channel's messages; cross-tenant delivery is forbidden, CTI-1). NON-PII: subject refs are the opaque RFC 0041 vocabulary only — no IP/location/device. A host MAY emit; if it advertises `channelPresence` it MUST. Gated on the host advertising `channelPresence` (capabilities.schema.json). See RFC 0110.",
5
+ "description": "Payload of the `channel.presence` ephemeral host event (RFC 0110; RFC 0236 §F: a host event, not a run event, so it has no log position). EPHEMERAL live presence for a `type:'channel'` conversation — who is currently present + (optionally) who is typing. A host MUST NOT persist this event to the replayable event log / transcript, and it MUST NOT affect replay or `:fork` determinism (presence is live state, the load-bearing distinction from the persisted `conversation.exchanged` turn — see replay.md). Membership-gated: every ref MUST be a current channel participant and the event MUST NOT be delivered to a non-member (the same DEFAULT-DENY visibility as the channel's messages; cross-tenant delivery is forbidden, CTI-1). NON-PII: subject refs are the opaque RFC 0041 vocabulary only — no IP/location/device. A host MAY emit; if it advertises `channelPresence` it MUST. Gated on the host advertising `channelPresence` (capabilities.schema.json). See RFC 0110.",
6
6
  "type": "object",
7
7
  "required": [
8
8
  "conversationId",
@@ -53,6 +53,5 @@
53
53
  ]
54
54
  }
55
55
  ],
56
- "$comment": "RFC 0110 NEGATIVE (not validatable as an examples[] entry, which must be VALID): a payload carrying any field beyond conversationId/present/typing (e.g. `ip`, `location`) MUST FAIL validation via `additionalProperties: false` — the no-PII guard; see conformance/src/scenarios/channel-presence-shape.test.ts.",
57
- "x-openwop-seeded-from": "v1"
56
+ "$comment": "RFC 0110 NEGATIVE (not validatable as an examples[] entry, which must be VALID): a payload carrying any field beyond conversationId/present/typing (e.g. `ip`, `location`) MUST FAIL validation via `additionalProperties: false` — the no-PII guard; see conformance/src/scenarios/channel-presence-shape.test.ts."
58
57
  }
@@ -0,0 +1,81 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/host-event.schema.json",
4
+ "title": "HostEvent",
5
+ "description": "RFC 0236 §A — an event that belongs to no run. It carries no `runId` and no `sequence`, and no run's log contains it. Delivered on the `hostEvents` channel and, when durable, through webhooks (`events.md` §Host events, `webhooks.md` §Delivery). `delivery` MUST equal the class the host advertises for `type` in its `hostEvents` record.",
6
+ "type": "object",
7
+ "required": [
8
+ "eventId",
9
+ "type",
10
+ "timestamp",
11
+ "delivery",
12
+ "payload"
13
+ ],
14
+ "additionalProperties": false,
15
+ "properties": {
16
+ "eventId": {
17
+ "$ref": "ids.schema.json#/$defs/eventId",
18
+ "description": "Unique per host; identical on every delivery attempt of this event."
19
+ },
20
+ "type": {
21
+ "type": "string",
22
+ "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9]*(-[a-z0-9]+)*$",
23
+ "description": "A protocol host-event type (`channel.presence`) or a vendor type `org.name` whose org is registered (`events.md` §Naming)."
24
+ },
25
+ "timestamp": {
26
+ "type": "string",
27
+ "format": "date-time",
28
+ "description": "When the host produced the event (RFC 3339)."
29
+ },
30
+ "delivery": {
31
+ "type": "string",
32
+ "enum": [
33
+ "durable",
34
+ "ephemeral"
35
+ ],
36
+ "description": "`ephemeral`: never persisted, never redelivered, never fanned out. `durable`: resumable by `eventId` and webhook-deliverable."
37
+ },
38
+ "workspaceId": {
39
+ "$ref": "ids.schema.json#/$defs/workspaceId",
40
+ "description": "Present exactly when the event belongs to a workspace (`identity.md` §1)."
41
+ },
42
+ "payload": {
43
+ "type": "object",
44
+ "additionalProperties": true,
45
+ "description": "For a protocol type, its registered payload schema. A vendor payload MUST NOT carry secret material (SR-1)."
46
+ }
47
+ },
48
+ "allOf": [
49
+ {
50
+ "if": {
51
+ "properties": {
52
+ "type": {
53
+ "const": "channel.presence"
54
+ }
55
+ }
56
+ },
57
+ "then": {
58
+ "properties": {
59
+ "delivery": {
60
+ "const": "ephemeral"
61
+ },
62
+ "payload": {
63
+ "$ref": "channel-presence-payload.schema.json"
64
+ }
65
+ }
66
+ }
67
+ }
68
+ ],
69
+ "examples": [
70
+ {
71
+ "eventId": "hev-01J9ZK3Q8W2M4N6P7R8S",
72
+ "type": "example.thing-happened",
73
+ "timestamp": "2026-10-05T12:00:00Z",
74
+ "delivery": "durable",
75
+ "workspaceId": "ws-acme",
76
+ "payload": {
77
+ "thingId": "t-1"
78
+ }
79
+ }
80
+ ]
81
+ }
@@ -10,7 +10,7 @@
10
10
  "deliveries": {
11
11
  "type": "array",
12
12
  "description": "Dead-lettered deliveries, newest first. Empty when the subscription has none within `retentionDays`.",
13
- "items": { "$ref": "#/$defs/deadLetteredDelivery" }
13
+ "items": { "oneOf": [{ "$ref": "#/$defs/deadLetteredDelivery" }, { "$ref": "#/$defs/deadLetteredHostDelivery" }] }
14
14
  },
15
15
  "nextCursor": {
16
16
  "type": "string",
@@ -20,6 +20,23 @@
20
20
  }
21
21
  },
22
22
  "$defs": {
23
+ "deadLetteredHostDelivery": {
24
+ "description": "RFC 0236 §E — a dead-lettered delivery of a durable host event. It names no run, so it carries no `runId`; `eventId` is the host event's. Only a subscription whose `events[]` names a host-event type can have one.",
25
+ "type": "object",
26
+ "additionalProperties": false,
27
+ "required": ["deliveryId", "webhookId", "eventId", "eventType", "attempts", "deadLetteredAt", "expiresAt", "reason"],
28
+ "properties": {
29
+ "deliveryId": { "$ref": "ids.schema.json#/$defs/deliveryId" },
30
+ "webhookId": { "$ref": "ids.schema.json#/$defs/subscriptionId" },
31
+ "eventId": { "$ref": "ids.schema.json#/$defs/eventId" },
32
+ "eventType": { "$ref": "#/$defs/deadLetteredDelivery/properties/eventType" },
33
+ "attempts": { "$ref": "#/$defs/deadLetteredDelivery/properties/attempts" },
34
+ "deadLetteredAt": { "$ref": "#/$defs/deadLetteredDelivery/properties/deadLetteredAt" },
35
+ "expiresAt": { "$ref": "#/$defs/deadLetteredDelivery/properties/expiresAt" },
36
+ "reason": { "$ref": "#/$defs/deadLetteredDelivery/properties/reason" },
37
+ "lastStatus": { "$ref": "#/$defs/deadLetteredDelivery/properties/lastStatus" }
38
+ }
39
+ },
23
40
  "deadLetteredDelivery": {
24
41
  "type": "object",
25
42
  "additionalProperties": false,
@@ -2,25 +2,52 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/webhook-delivery.schema.json",
4
4
  "title": "Webhook delivery envelope (webhooks.md §Delivery)",
5
- "description": "The body of an outbound webhook delivery. Written 2026-09-04 because it did not exist: the envelope was specified by one sentence in webhooks.md §Delivery ('the body is `{ runId, workspaceId, event }` where `event` is the verbatim run event') and no artifact bound it, while the NESTED event.runId was bound all along through run-event.schema.json. Two production hosts arrived at that asymmetry independently — one asking what major an outbound payload speaks, the other answering from the $ref graph — and both concluded the gap was a missing artifact rather than a missing paragraph. An emitter that projects correctly could be asserted but not checked, which is the wrong way round.",
6
- "type": "object",
7
- "additionalProperties": false,
8
- "required": [
9
- "runId",
10
- "event"
11
- ],
12
- "properties": {
13
- "runId": {
14
- "$ref": "ids.schema.json#/$defs/runId",
15
- "description": "The run this delivery is about, tenant-bound per identity.md §5. An outbound emission is not a response to a versioned request, so nothing about the request cycle supplies the form — the grammar does, and it is the same grammar everywhere a v2 runId is rendered. A host that projects on responses and not on emissions hands the subscriber an id the client never saw: the correlation filter matches nothing, with no error, no 4xx and no log line. A tier-1 host hit exactly that, and the silence is why this field is bound here rather than left to the prose. A host that projects on responses and not on emissions hands the subscriber an identifier the client has never seen, and the failure is silent: the correlation matches nothing, with no error, no 4xx and no log line. Until 2026-09-04 the nested `event.runId` was bound by run-event.schema.json while the envelope's own was carried by one paragraph of prose, which is how a real host shipped the split (webhooks.md §Delivery)."
5
+ "description": "The body of an outbound webhook delivery. Written 2026-09-04 because it did not exist: the envelope was specified by one sentence in webhooks.md §Delivery ('the body is `{ runId, workspaceId, event }` where `event` is the verbatim run event') and no artifact bound it, while the NESTED event.runId was bound all along through run-event.schema.json. Two production hosts arrived at that asymmetry independently — one asking what major an outbound payload speaks, the other answering from the $ref graph — and both concluded the gap was a missing artifact rather than a missing paragraph. An emitter that projects correctly could be asserted but not checked, which is the wrong way round. RFC 0236 §E adds a second body, for a durable host event; the run body is unchanged.",
6
+ "oneOf": [
7
+ {
8
+ "$ref": "#/$defs/runDelivery"
16
9
  },
17
- "workspaceId": {
18
- "$ref": "ids.schema.json#/$defs/workspaceId",
19
- "description": "The workspace the run belongs to. OPTIONAL, and present exactly when RunSnapshot.owner.workspace is (identity.md §1: owner is { tenant, workspace?, subject }). This field was REQUIRED for the first six hours of the schema's life, which made the envelope tighter than the identity model it renders: a run in a single-workspace tenant has no workspace, and the only way a host could satisfy the envelope was to put its tenant id in this field. A tier-1 host proposed exactly that — `owner.workspace ?? tenantId` — and asked for a veto. This is the veto. A tenant id in a workspace field is two facts wearing one name, and every consumer downstream would have to know which host lied."
10
+ {
11
+ "$ref": "#/$defs/hostDelivery"
12
+ }
13
+ ],
14
+ "$defs": {
15
+ "runDelivery": {
16
+ "description": "A run event delivery: `{ runId, workspaceId?, event }`. Unchanged by RFC 0236.",
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "required": [
20
+ "runId",
21
+ "event"
22
+ ],
23
+ "properties": {
24
+ "runId": {
25
+ "$ref": "ids.schema.json#/$defs/runId",
26
+ "description": "The run this delivery is about, tenant-bound per identity.md §5. An outbound emission is not a response to a versioned request, so nothing about the request cycle supplies the form — the grammar does, and it is the same grammar everywhere a v2 runId is rendered. A host that projects on responses and not on emissions hands the subscriber an id the client never saw: the correlation filter matches nothing, with no error, no 4xx and no log line. A tier-1 host hit exactly that, and the silence is why this field is bound here rather than left to the prose. A host that projects on responses and not on emissions hands the subscriber an identifier the client has never seen, and the failure is silent: the correlation matches nothing, with no error, no 4xx and no log line. Until 2026-09-04 the nested `event.runId` was bound by run-event.schema.json while the envelope's own was carried by one paragraph of prose, which is how a real host shipped the split (webhooks.md §Delivery)."
27
+ },
28
+ "workspaceId": {
29
+ "$ref": "ids.schema.json#/$defs/workspaceId",
30
+ "description": "The workspace the run belongs to. OPTIONAL, and present exactly when RunSnapshot.owner.workspace is (identity.md §1: owner is { tenant, workspace?, subject }). This field was REQUIRED for the first six hours of the schema's life, which made the envelope tighter than the identity model it renders: a run in a single-workspace tenant has no workspace, and the only way a host could satisfy the envelope was to put its tenant id in this field. A tier-1 host proposed exactly that — `owner.workspace ?? tenantId` — and asked for a veto. This is the veto. A tenant id in a workspace field is two facts wearing one name, and every consumer downstream would have to know which host lied."
31
+ },
32
+ "event": {
33
+ "$ref": "run-event.schema.json",
34
+ "description": "The verbatim run event (events.md). 'Verbatim' is load-bearing: the envelope is one of the three renderings generated from a single payload definition (RFC 0171 §A.4), so this is the event as persisted, not a re-serialization. Its own runId is bound by run-event.schema.json to the same $def as the envelope's, which is what made the envelope's omission survivable for as long as it did — and invisible for just as long."
35
+ }
36
+ }
20
37
  },
21
- "event": {
22
- "$ref": "run-event.schema.json",
23
- "description": "The verbatim run event (events.md). 'Verbatim' is load-bearing: the envelope is one of the three renderings generated from a single payload definition (RFC 0171 §A.4), so this is the event as persisted, not a re-serialization. Its own runId is bound by run-event.schema.json to the same $def as the envelope's, which is what made the envelope's omission survivable for as long as it did — and invisible for just as long."
38
+ "hostDelivery": {
39
+ "description": "RFC 0236 §E — a durable host event delivery. Sent only to a subscription whose `events[]` names the host-event type, so no subscription registered before host events existed receives it. The workspace, when there is one, is inside the envelope.",
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": [
43
+ "hostEvent"
44
+ ],
45
+ "properties": {
46
+ "hostEvent": {
47
+ "$ref": "host-event.schema.json",
48
+ "description": "The host event, verbatim; `delivery` is always `durable` here (an ephemeral host event is never fanned out)."
49
+ }
50
+ }
24
51
  }
25
52
  }
26
53
  }
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.45.19"
7
+ "version": "2.45.20"
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": "902047907690f4c43c35cc77a9f6d55db02412faed058da8c052a95f8730426f"
429
+ "digest": "e75839d9f2c59d0ca85c572fbbaafcb8dbc304bfa3bff904fb99f11938ca9c00"
430
430
  }
package/spec/v1/gaps.json CHANGED
@@ -14207,6 +14207,91 @@
14207
14207
  }
14208
14208
  ]
14209
14209
  },
14210
+ {
14211
+ "id": "openwop.gap.0236.1",
14212
+ "rfc": "0236",
14213
+ "local": "G1",
14214
+ "section": "§G, §A–§E",
14215
+ "surface": "The v2 reference host serves `/host/events` and durable webhooks but no host-event envelope, tenant gate on the stream, emit seam or webhook host body.",
14216
+ "witness": "unclassified",
14217
+ "requirementId": null,
14218
+ "disposition": "externally-gated",
14219
+ "target": "v2-reference-host-events",
14220
+ "sources": [
14221
+ {
14222
+ "file": "RFCS/registers/0236-host-events.gaps.md",
14223
+ "token": "G1"
14224
+ }
14225
+ ]
14226
+ },
14227
+ {
14228
+ "id": "openwop.gap.0236.2",
14229
+ "rfc": "0236",
14230
+ "local": "G2",
14231
+ "section": "§Conformance",
14232
+ "surface": "No host bundle records the six `openwop.requirement.0236.*` ids, because the legs are not written yet.",
14233
+ "witness": "unclassified",
14234
+ "requirementId": null,
14235
+ "disposition": "carried",
14236
+ "target": "openwop.gap.0236.2",
14237
+ "sources": [
14238
+ {
14239
+ "file": "RFCS/registers/0236-host-events.gaps.md",
14240
+ "token": "G2"
14241
+ }
14242
+ ]
14243
+ },
14244
+ {
14245
+ "id": "openwop.gap.0236.3",
14246
+ "rfc": "0236",
14247
+ "local": "G3",
14248
+ "section": "§B",
14249
+ "surface": "The two heartbeat messages keep their bare shape on the `hostEvents` channel and are not §A envelopes; `heartbeat.stateChanged` also breaks the `events.md` §Naming grammar.",
14250
+ "witness": "unclassified",
14251
+ "requirementId": null,
14252
+ "disposition": "externally-gated",
14253
+ "target": "next-major",
14254
+ "sources": [
14255
+ {
14256
+ "file": "RFCS/registers/0236-host-events.gaps.md",
14257
+ "token": "G3"
14258
+ }
14259
+ ]
14260
+ },
14261
+ {
14262
+ "id": "openwop.gap.0236.4",
14263
+ "rfc": "0236",
14264
+ "local": "G4",
14265
+ "section": "§F",
14266
+ "surface": "`channel.presence` stays in the v2 run-event union, deprecated.",
14267
+ "witness": "unclassified",
14268
+ "requirementId": null,
14269
+ "disposition": "externally-gated",
14270
+ "target": "next-major",
14271
+ "sources": [
14272
+ {
14273
+ "file": "RFCS/registers/0236-host-events.gaps.md",
14274
+ "token": "G4"
14275
+ }
14276
+ ]
14277
+ },
14278
+ {
14279
+ "id": "openwop.gap.0236.5",
14280
+ "rfc": "0236",
14281
+ "local": "G5",
14282
+ "section": "Motivation",
14283
+ "surface": "openwop-app delivers runless host events to major-2 webhooks under a pseudo `runId` and three-segment type names.",
14284
+ "witness": "unclassified",
14285
+ "requirementId": null,
14286
+ "disposition": "externally-gated",
14287
+ "target": "openwop-app-adr-0812",
14288
+ "sources": [
14289
+ {
14290
+ "file": "RFCS/registers/0236-host-events.gaps.md",
14291
+ "token": "G5"
14292
+ }
14293
+ ]
14294
+ },
14210
14295
  {
14211
14296
  "id": "openwop.gap.spec.a2a-integration.g1",
14212
14297
  "rfc": "0152",
@@ -111,7 +111,7 @@ These keys are not part of the v2 root:
111
111
 
112
112
  Operation paths live in `spec/v2/path-manifest.json` ([`versioning.md`](versioning.md)). The declaration is generated from nothing and checked against everything (`scripts/check-declaration.mjs`).
113
113
 
114
- ## 5. Core families (73)
114
+ ## 5. Core families (74)
115
115
 
116
116
  Each heading below is a `spec/v2/declaration.json` row with `anchor: core`. `scripts/check-declaration.mjs` MUST fail when a heading here, a root key in the generated schema, or a pack peer-dependency identifier names a family the declaration does not. The peer-dependency identifier is identical to the key ([`packs.md`](packs.md)).
117
117
 
@@ -261,6 +261,10 @@ Witness `witnessable-gated`.
261
261
 
262
262
  Witness `witnessable-gated`.
263
263
 
264
+ ### § hostEvents
265
+
266
+ Witness `witnessable-gated`; see [events.md](events.md) §Host events.
267
+
264
268
  ### § toolHooks
265
269
 
266
270
  Witness `witnessable-gated`.
@@ -17,10 +17,12 @@ A host advertising `multiPartyConversation`:
17
17
 
18
18
  ## `channelPresence`
19
19
 
20
- A host advertising `channelPresence` MUST report present members as a subset of the channel's roster, and MUST NOT include a subject that is not a member. The payload is closed: it carries opaque, non-PII subject references and nothing else.
20
+ A host advertising `channelPresence` MUST emit `channel.presence`; otherwise it omits it. The closed payload carries only opaque, non-PII references to roster members. A host MUST NOT include a non-member, deliver to one, or deliver across tenants.
21
+
22
+ A host MUST list it under `hostEvents` as ephemeral ([events.md](events.md) §Host events) and MUST NOT emit it as a run event.
21
23
 
22
24
  ## `conversationTurnModelProvenance`
23
25
 
24
26
  A host that stamps model provenance on an agent turn MUST advertise `conversationTurnModelProvenance`. The stamp is non-secret and non-PII (provider and model identifiers only), and a host MUST NOT place prompt or completion content in it.
25
27
 
26
- *Sources: RFCs 0101, 0109, 0110.*
28
+ *Sources: RFCs 0101, 0109, 0110, 0236.*
@@ -1,7 +1,7 @@
1
1
  # Events
2
2
 
3
3
  > **Status: Stable.**
4
- > **Normative home:** `heartbeat`, `envelopeContracts`, `envelopes`, `feedback`, `providerUsage`, `supportedEnvelopes`, `schemaVersions`, `envelopeStrictness`.
4
+ > **Normative home:** `heartbeat`, `hostEvents`, `envelopeContracts`, `envelopes`, `feedback`, `providerUsage`, `supportedEnvelopes`, `schemaVersions`, `envelopeStrictness`.
5
5
 
6
6
  ## Why this exists
7
7
 
@@ -123,7 +123,16 @@ With `bufferMs` (0..5000) the host accumulates events into one `event: batch` fr
123
123
 
124
124
  ### Host events
125
125
 
126
- `hostEvents` carries the heartbeat messages (`schemas/v2/heartbeat-evaluated.schema.json`, `schemas/v2/heartbeat-state-changed.schema.json`) at the default address `/host/events` (`streamHostEvents`). A host MAY declare another address under `heartbeat.deliveryChannel` ([capabilities.md](capabilities.md)); every channel has an address. The channel carries no run data.
126
+ `hostEvents` carries the heartbeat messages (`schemas/v2/heartbeat-evaluated.schema.json`, `schemas/v2/heartbeat-state-changed.schema.json`) and host events at the default address `/host/events` (`streamHostEvents`). A host MAY declare another address under `heartbeat.deliveryChannel` ([capabilities.md](capabilities.md)); every channel has an address. The channel carries no run data. Every host event, and every heartbeat a tenant owns, MUST reach only that tenant's subscribers.
127
+
128
+ #### `hostEvents`
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:
131
+
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.
134
+
135
+ 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.
127
136
 
128
137
  #### `heartbeat`
129
138
 
@@ -241,4 +250,4 @@ Under `reliability.completion.distinguishesTruncation`, an envelope is complete
241
250
  - On exhaustion the host MUST emit `envelope.retry-exhausted` with that `finalReason` and `cap.breached` `kind: "schema"`, and fail the node with `envelope_truncation_unrecoverable` or `envelope_invalid`.
242
251
  - Lenient-parse recovery consumes no retry. It emits `envelope.recovery-applied` once per recovery, carrying only the path and an optional byte offset.
243
252
 
244
- *Sources: RFCs 0026, 0030, 0032, 0033, 0056, 0060, 0171, 0172, 0176, 0185, 0194, 0213.*
253
+ *Sources: RFCs 0026, 0030, 0032, 0033, 0056, 0060, 0171, 0172, 0176, 0185, 0194, 0213, 0236.*
@@ -16,17 +16,17 @@ A host that advertises `webhooks` ([capabilities.md](capabilities.md)) serves `r
16
16
  | `registerWebhook` | `{ url, events[], secret?, tags?, signatureAlgorithms? }` | `201 { webhookId, secret? }` |
17
17
  | `unregisterWebhook` | path `webhookId` | `204`; `404` when unknown; `403` when the caller is outside the subscription's tenant |
18
18
 
19
- On `registerWebhook`, `url` MUST be `https://` and `events[]` MUST be non-empty v2 event type names ([events.md](events.md)).
19
+ On `registerWebhook`, `url` MUST be `https://` and `events[]` MUST be non-empty v2 event type names ([events.md](events.md)). `events[]` MAY name a durable host-event type the host advertises; an ephemeral or unadvertised one MUST be refused `400 validation_error`.
20
20
 
21
21
  When `registerWebhook` omits `secret`, the host MUST generate one and return it as `secret` in the `201`. That response is the only one that carries it. A supplied secret MUST NOT be echoed.
22
22
 
23
23
  A `204` from `unregisterWebhook` ends the subscription's deliveries, including retries already scheduled (§Durability).
24
24
 
25
- A subscription MUST receive only events from runs within its tenant scope; cross-tenant delivery is a protocol violation whatever the filter says (invariant `webhook-cross-tenant-isolation`). `tags` narrows delivery to runs whose options carry an overlapping tag.
25
+ A subscription MUST receive only events from runs within its tenant scope, and only host events of its tenant; cross-tenant delivery is a protocol violation whatever the filter says (invariant `webhook-cross-tenant-isolation`). `tags` narrows delivery to runs whose options carry an overlapping tag.
26
26
 
27
27
  ## Delivery
28
28
 
29
- The delivery envelope is generated from the event's payload definition (events.md §Payloads). The body is `{ runId, workspaceId?, event }`, where `event` is the verbatim run event.
29
+ The delivery envelope is generated from the event's payload definition (events.md §Payloads). The body is `{ runId, workspaceId?, event }`, where `event` is the verbatim run event. A durable host event's body is `{ hostEvent }`, deduplicated on `(OpenWOP-Webhook-Id, eventId)`; its `webhook-id` MUST NOT change across attempts.
30
30
 
31
31
  - The body MUST validate against `schemas/v2/webhook-delivery.schema.json`.
32
32
  - `workspaceId` is present exactly when `RunSnapshot.owner.workspace` is ([identity.md §1](identity.md)); a host MUST NOT substitute its tenant id for an absent workspace.
@@ -162,4 +162,4 @@ With `triggerBridge.ingestion`, each `externalSources` entry MUST turn an extern
162
162
  - MUST refuse private, link-local and loopback targets and cap the body on any ingestion fetch, and never hand the run a URL (invariant `trigger-ingestion-ssrf`);
163
163
  - SHOULD key `stream` by topic, partition and offset, `change` by table and changelog id; a key MUST survive broker redelivery.
164
164
 
165
- *Sources: RFCs 0053, 0083, 0099, 0127, 0165, 0171, 0173, 0176, 0188, 0196, 0201, 0215, 0217, 0230, 0232.*
165
+ *Sources: RFCs 0053, 0083, 0099, 0127, 0165, 0171, 0173, 0176, 0188, 0196, 0201, 0215, 0217, 0230, 0232, 0236.*
@@ -957,6 +957,26 @@
957
957
  "owningRfc": "0060",
958
958
  "facetsFrom": "spec/v2/facets/heartbeat.schema.json"
959
959
  },
960
+ {
961
+ "key": "hostEvents",
962
+ "kind": "family",
963
+ "normativeText": ["spec/v2/core/events.md"],
964
+ "anchor": "core",
965
+ "section": "core/capabilities.md#hostEvents",
966
+ "peerDependencyId": "hostEvents",
967
+ "witness": "witnessable-gated",
968
+ "maturity": {
969
+ "technical": "experimental",
970
+ "adoption": "none"
971
+ },
972
+ "facets": [
973
+ "types"
974
+ ],
975
+ "floorScenarios": [],
976
+ "requirementIds": [],
977
+ "owningRfc": "0236",
978
+ "facetsFrom": "spec/v2/facets/hostEvents.schema.json"
979
+ },
960
980
  {
961
981
  "key": "toolHooks",
962
982
  "kind": "family",
@@ -0,0 +1,33 @@
1
+ {
2
+ "$comment": "RFC 0236 §B — every host-event type the host emits, with its delivery class; a type's class never varies",
3
+ "properties": {
4
+ "types": {
5
+ "type": "array",
6
+ "minItems": 1,
7
+ "items": {
8
+ "type": "object",
9
+ "additionalProperties": false,
10
+ "required": [
11
+ "type",
12
+ "delivery"
13
+ ],
14
+ "properties": {
15
+ "type": {
16
+ "type": "string",
17
+ "pattern": "^[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9]*(-[a-z0-9]+)*$"
18
+ },
19
+ "delivery": {
20
+ "type": "string",
21
+ "enum": [
22
+ "durable",
23
+ "ephemeral"
24
+ ]
25
+ }
26
+ }
27
+ }
28
+ }
29
+ },
30
+ "required": [
31
+ "types"
32
+ ]
33
+ }
@@ -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.19",
4
- "corpusTag": "v2.45.19",
3
+ "version": "2.45.20",
4
+ "corpusTag": "v2.45.20",
5
5
  "updated": "2026-10-05"
6
6
  }
@@ -4,7 +4,7 @@
4
4
  "schemas/v2/**/*.json",
5
5
  "spec/v2/path-manifest.json"
6
6
  ],
7
- "release": "2.45.19",
7
+ "release": "2.45.20",
8
8
  "kinds": {
9
9
  "union": [
10
10
  "channel",
@@ -18,7 +18,7 @@
18
18
  "type"
19
19
  ]
20
20
  },
21
- "count": 8705,
21
+ "count": 8746,
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\"",
@@ -2023,6 +2023,39 @@
2023
2023
  "schemas/v2/capabilities.schema.json#/heartbeat|required|until",
2024
2024
  "schemas/v2/capabilities.schema.json#/heartbeat|required|witness",
2025
2025
  "schemas/v2/capabilities.schema.json#/heartbeat|type|object",
2026
+ "schemas/v2/capabilities.schema.json#/hostEvents/since|type|string",
2027
+ "schemas/v2/capabilities.schema.json#/hostEvents/status|enum-member|\"deprecated\"",
2028
+ "schemas/v2/capabilities.schema.json#/hostEvents/status|enum-member|\"experimental\"",
2029
+ "schemas/v2/capabilities.schema.json#/hostEvents/status|enum-member|\"stable\"",
2030
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]/delivery|enum-member|\"durable\"",
2031
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]/delivery|enum-member|\"ephemeral\"",
2032
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]/delivery|type|string",
2033
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]/type|type|string",
2034
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]|closed|true",
2035
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]|property|delivery",
2036
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]|property|type",
2037
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]|required|delivery",
2038
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]|required|type",
2039
+ "schemas/v2/capabilities.schema.json#/hostEvents/types/[]|type|object",
2040
+ "schemas/v2/capabilities.schema.json#/hostEvents/types|type|array",
2041
+ "schemas/v2/capabilities.schema.json#/hostEvents/until|type|string",
2042
+ "schemas/v2/capabilities.schema.json#/hostEvents/witness|enum-member|\"claims-check\"",
2043
+ "schemas/v2/capabilities.schema.json#/hostEvents/witness|enum-member|\"negative-existence\"",
2044
+ "schemas/v2/capabilities.schema.json#/hostEvents/witness|enum-member|\"seam-gated\"",
2045
+ "schemas/v2/capabilities.schema.json#/hostEvents/witness|enum-member|\"witnessable-gated\"",
2046
+ "schemas/v2/capabilities.schema.json#/hostEvents/witness|enum-member|\"witnessable-unaided\"",
2047
+ "schemas/v2/capabilities.schema.json#/hostEvents|closed|true",
2048
+ "schemas/v2/capabilities.schema.json#/hostEvents|property|since",
2049
+ "schemas/v2/capabilities.schema.json#/hostEvents|property|status",
2050
+ "schemas/v2/capabilities.schema.json#/hostEvents|property|types",
2051
+ "schemas/v2/capabilities.schema.json#/hostEvents|property|until",
2052
+ "schemas/v2/capabilities.schema.json#/hostEvents|property|witness",
2053
+ "schemas/v2/capabilities.schema.json#/hostEvents|required|since",
2054
+ "schemas/v2/capabilities.schema.json#/hostEvents|required|status",
2055
+ "schemas/v2/capabilities.schema.json#/hostEvents|required|types",
2056
+ "schemas/v2/capabilities.schema.json#/hostEvents|required|until",
2057
+ "schemas/v2/capabilities.schema.json#/hostEvents|required|witness",
2058
+ "schemas/v2/capabilities.schema.json#/hostEvents|type|object",
2026
2059
  "schemas/v2/capabilities.schema.json#/httpClient/egressPolicy/decisions/[]|enum-member|\"allowed\"",
2027
2060
  "schemas/v2/capabilities.schema.json#/httpClient/egressPolicy/decisions/[]|enum-member|\"approval-required\"",
2028
2061
  "schemas/v2/capabilities.schema.json#/httpClient/egressPolicy/decisions/[]|enum-member|\"denied\"",
@@ -3685,6 +3718,7 @@
3685
3718
  "schemas/v2/capabilities.schema.json#|property|forms",
3686
3719
  "schemas/v2/capabilities.schema.json#|property|fs",
3687
3720
  "schemas/v2/capabilities.schema.json#|property|heartbeat",
3721
+ "schemas/v2/capabilities.schema.json#|property|hostEvents",
3688
3722
  "schemas/v2/capabilities.schema.json#|property|httpClient",
3689
3723
  "schemas/v2/capabilities.schema.json#|property|i18n",
3690
3724
  "schemas/v2/capabilities.schema.json#|property|idempotency",
@@ -5951,6 +5985,25 @@
5951
5985
  "schemas/v2/heartbeat-state-changed.schema.json#|required|heartbeatId",
5952
5986
  "schemas/v2/heartbeat-state-changed.schema.json#|required|to",
5953
5987
  "schemas/v2/heartbeat-state-changed.schema.json#|type|object",
5988
+ "schemas/v2/host-event.schema.json#/delivery|enum-member|\"durable\"",
5989
+ "schemas/v2/host-event.schema.json#/delivery|enum-member|\"ephemeral\"",
5990
+ "schemas/v2/host-event.schema.json#/delivery|type|string",
5991
+ "schemas/v2/host-event.schema.json#/payload|type|object",
5992
+ "schemas/v2/host-event.schema.json#/timestamp|type|string",
5993
+ "schemas/v2/host-event.schema.json#/type|type|string",
5994
+ "schemas/v2/host-event.schema.json#|closed|true",
5995
+ "schemas/v2/host-event.schema.json#|property|delivery",
5996
+ "schemas/v2/host-event.schema.json#|property|eventId",
5997
+ "schemas/v2/host-event.schema.json#|property|payload",
5998
+ "schemas/v2/host-event.schema.json#|property|timestamp",
5999
+ "schemas/v2/host-event.schema.json#|property|type",
6000
+ "schemas/v2/host-event.schema.json#|property|workspaceId",
6001
+ "schemas/v2/host-event.schema.json#|required|delivery",
6002
+ "schemas/v2/host-event.schema.json#|required|eventId",
6003
+ "schemas/v2/host-event.schema.json#|required|payload",
6004
+ "schemas/v2/host-event.schema.json#|required|timestamp",
6005
+ "schemas/v2/host-event.schema.json#|required|type",
6006
+ "schemas/v2/host-event.schema.json#|type|object",
5954
6007
  "schemas/v2/ids.schema.json#|closed|true",
5955
6008
  "schemas/v2/ids.schema.json#|type|object",
5956
6009
  "schemas/v2/localized-content-language-settings.schema.json#/autoTranslateOnPublish|type|boolean",
@@ -7943,7 +7996,6 @@
7943
7996
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]/reason|enum-member|\"payload_unprojectable\"",
7944
7997
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]/reason|enum-member|\"retries_exhausted\"",
7945
7998
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]/reason|type|string",
7946
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|closed|true",
7947
7999
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|property|attempts",
7948
8000
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|property|deadLetteredAt",
7949
8001
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|property|deliveryId",
@@ -7954,15 +8006,6 @@
7954
8006
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|property|reason",
7955
8007
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|property|runId",
7956
8008
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|property|webhookId",
7957
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|attempts",
7958
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|deadLetteredAt",
7959
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|deliveryId",
7960
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|eventId",
7961
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|eventType",
7962
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|expiresAt",
7963
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|reason",
7964
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|runId",
7965
- "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|required|webhookId",
7966
8009
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries/[]|type|object",
7967
8010
  "schemas/v2/webhook-dead-letter-page.schema.json#/deliveries|type|array",
7968
8011
  "schemas/v2/webhook-dead-letter-page.schema.json#/nextCursor|type|string",
@@ -7971,12 +8014,10 @@
7971
8014
  "schemas/v2/webhook-dead-letter-page.schema.json#|property|nextCursor",
7972
8015
  "schemas/v2/webhook-dead-letter-page.schema.json#|required|deliveries",
7973
8016
  "schemas/v2/webhook-dead-letter-page.schema.json#|type|object",
7974
- "schemas/v2/webhook-delivery.schema.json#|closed|true",
7975
8017
  "schemas/v2/webhook-delivery.schema.json#|property|event",
8018
+ "schemas/v2/webhook-delivery.schema.json#|property|hostEvent",
7976
8019
  "schemas/v2/webhook-delivery.schema.json#|property|runId",
7977
8020
  "schemas/v2/webhook-delivery.schema.json#|property|workspaceId",
7978
- "schemas/v2/webhook-delivery.schema.json#|required|event",
7979
- "schemas/v2/webhook-delivery.schema.json#|required|runId",
7980
8021
  "schemas/v2/webhook-delivery.schema.json#|type|object",
7981
8022
  "schemas/v2/webhook-verification.schema.json#/challenge|type|string",
7982
8023
  "schemas/v2/webhook-verification.schema.json#/type|enum-member|\"openwop.webhook.verification\"",