@openwop/spec-artifacts 2.46.22 → 2.46.23

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.46.22",
5
- "corpusTag": "v2.46.22",
4
+ "version": "2.46.23",
5
+ "corpusTag": "v2.46.23",
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": "e509737646754f61866e3eb5646ad293fda2110e71d3b2542dafed901d1d97eb",
13
- "api/v2/asyncapi.yaml": "665cb9540a8b8765a8cdd6bbcc1421b1c51b52e0eff5106e63ff99bbaa15a99b",
14
- "api/v2/openapi.yaml": "88e204c54cba6b11d44eff7a3c18528e218ffde01b1167702691522fef017fa7",
12
+ "api/seams-v2.yaml": "52382aca8c66e0682ecd314bfc3eb5696481ea5ae82f4707f7d15ae971667832",
13
+ "api/v2/asyncapi.yaml": "e5f747b10c1b518f5db8b26158bbe09b006f4854742fefc5b7d3f5be1e2cd71d",
14
+ "api/v2/openapi.yaml": "e35c8fd7e1b5aaad265b2d6a3ca7378661139930895cb8b931a0e7d365db4a3f",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "276fc1d51eb08e14e9127b9fd27761d7046ee33c12000f3a64a801322db8bf58",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -117,7 +117,7 @@
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": "9d5b222dcd2003141b7f09e9b836744a1b63defc01bffea5d10c1da7747bc2d8",
120
+ "schemas/v2/capabilities.schema.json": "6ca940cc38ec7f4b582def52c18337fd1e9ea03d627a5446766230a19af1a8ab",
121
121
  "schemas/v2/certification-bundle.schema.json": "5cfa7fb5247160333e33a58b60d42bcd4e5269d8391d6a112d301e14828892ed",
122
122
  "schemas/v2/channel-presence-payload.schema.json": "fc03df0c20cc12a25f7ee6a47503a4c5931d79fe3d5ff24815e8fd7c1bcb9a87",
123
123
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
@@ -144,7 +144,7 @@
144
144
  "schemas/v2/envelopes/schema.request.schema.json": "be2c5f7aa881cdd252ccff47ac02193659e1393633a1541f4297383205d384a2",
145
145
  "schemas/v2/envelopes/schema.response.schema.json": "d049a081267c06c28879c331b147f3ed821b14ccfd93005c67aff64db0a8c68e",
146
146
  "schemas/v2/envelopes/ui.a2ui-surface.schema.json": "e92a2548ba65454c9e0a34f72ea6768d18f59e61fa5da7668d0b2d5baddaddc8",
147
- "schemas/v2/error-envelope.schema.json": "0b15d6a3a2baad6bf314a66a4a8da4756460574887b929b3b06cb23a6c02f0bd",
147
+ "schemas/v2/error-envelope.schema.json": "f8eff3b5affa29513935632d99ad2d717e76791dc853152d03afa9d907cd5338",
148
148
  "schemas/v2/eval-summary.schema.json": "d07f4d116c5410997a81d0bc5387545fb61933a6333c360a26ab8a71c749336b",
149
149
  "schemas/v2/export-bundle.schema.json": "bd28905a7729437ab7f2ad8bb33e13a371b2bf5605a7eb2962a0d246de312d69",
150
150
  "schemas/v2/form-content-pack-manifest.schema.json": "a1942a124e250a6e9fbdb6b811c5a125e78fbcbcaa46dfc71d0636f24710a339",
@@ -212,14 +212,14 @@
212
212
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
213
213
  "spec/v1/alias-detectors.json": "22444c22bb88c568339ef512553f9fc38146e22b566d11ab8608f655d688d19c",
214
214
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
215
- "spec/v1/core-standard-manifest.json": "b2ce72fe0aa6de2c3c2de0ae613cfde7154528d9445699548d89b5546c2cecc7",
215
+ "spec/v1/core-standard-manifest.json": "9e67cef74ab08d445a80e5066a47c04f0cc86a6e426ed3d2a407ace31fc8dfe5",
216
216
  "spec/v1/deprecations.json": "e723bc11d7272c71789ad1303bb7f21809a8a024abf57594f9d5c35dc199ece9",
217
217
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
218
218
  "spec/v1/end-of-support.json": "35f0bf3b70fe78b16e2a2fd81a153fc27e703f6c16376c6fe7cdf1f4f2c4e6d4",
219
219
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
220
220
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
221
221
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
222
- "spec/v1/gaps.json": "563f4f0d436770e6994c039d4181a8eb48394a213bbab9e71197863a1e8546b7",
222
+ "spec/v1/gaps.json": "622cc6c1d2f789f54f7ace1c754a06cb3a70f9f39e5b623c73d0730b3af42f0e",
223
223
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
224
224
  "spec/v1/migrations.json": "4c50760be70cb644d02427bcaf5749606700edf4513f423903cf3b1d12f5c300",
225
225
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -231,8 +231,8 @@
231
231
  "spec/v2/core/conformance.md": "3ca291e63bc70a6ef829ae8759ad0ded3741ea7aa507bbbdffc57de443ab2ae2",
232
232
  "spec/v2/core/connection-packs.md": "c80f95bd6a03698f35c72cdb2b46bd973f49203bbd786c26760e35fa86e6f23d",
233
233
  "spec/v2/core/conversation.md": "8d6abedf6af408a74577753bfca24719d318e2632e10b45ff5d63bdcf31a8aaa",
234
- "spec/v2/core/errors.md": "e932dd663ec7434480038ca9cdbe8fe37f6e422350ce95574522af4006b8a356",
235
- "spec/v2/core/events.md": "c3dcece6f1b1aa43e1e01c5ece23b2df075a505d5f6c2f37de0801aeaa486b62",
234
+ "spec/v2/core/errors.md": "39845bf7a65f9accaae63f84091eee5978b61bbe35d753e35138a9bbc0a2ad98",
235
+ "spec/v2/core/events.md": "fd1d95f77565b0b0a747544f4f2126bd02ae4f7cf837ead1da4d89e580b7f694",
236
236
  "spec/v2/core/execution.md": "4218dbb397534940f83ca5d46561f02bf8f3fdf68d2ae7fefe7f2eb2ed771103",
237
237
  "spec/v2/core/form-content-packs.md": "02931227899676fd4581a27017be2a6c4953904717be9b81c29d12f87ab3917d",
238
238
  "spec/v2/core/headers.md": "dae37c2b3980099272e5b9581107c0410d6b23aac95ea6c5a0890c34f0e51c8f",
@@ -258,10 +258,10 @@
258
258
  "spec/v2/core/workflow-chain-packs.md": "fdce7a8477e269950a2bac05ee6eddbd66eb0b670b464d00054f7196ec05d29c",
259
259
  "spec/v2/corrections.json": "3a8d93e33865b692d26a3b6bfd3819766e206b2e0c2a69669baa4bf833d05a49",
260
260
  "spec/v2/corrections.schema.json": "46bbffb954d13bd9995aebc912ceeb2544f7064331abf25fd6ab85c81a5cec94",
261
- "spec/v2/declaration.json": "5ccdcf9865ca02022c01a551583e1f343a4b7c73fd228049f1be620858a60ad5",
261
+ "spec/v2/declaration.json": "c914e17b8be18ffd186dbd63556c5a06816562b949029413ba46f556e1cd0d54",
262
262
  "spec/v2/declaration.schema.json": "ef951633e4070899f64828f5cf1b5f4870270a0360f81dbb49b5b4d6cd407550",
263
263
  "spec/v2/eos-override.json": "4c72d2f6a658943b01c1de1643cf294642091933af7832f38ee5495df684cb2d",
264
- "spec/v2/errors.json": "33f9b4e450c51dfb1046bb00b327ee88163fb53360b0b43bcd204061ec966a13",
264
+ "spec/v2/errors.json": "6ae05aec11be85711f207122d2b978a27f1b06cb3ba5a31b6b9b0fc5af4776e5",
265
265
  "spec/v2/errors.schema.json": "47404ad53e6147cf9017b813483712466573e419fb33e6c4b6c12d3e7deba1bc",
266
266
  "spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
267
267
  "spec/v2/event-codemap.schema.json": "b173f2a9bcc0bf9b62a474ce3b91e1431d597e64fd1560fc58662cd8606eaf9c",
@@ -292,7 +292,7 @@
292
292
  "spec/v2/facets/connections.schema.json": "f998bb206a5814183bb4720cc34fa43b7ab64d61e39a79437b009c589ce8b78e",
293
293
  "spec/v2/facets/envelopeStrictness.schema.json": "28be0a27f880bd45ec1222a16155f5e9167bbca57bf0322970fe1eb2654562aa",
294
294
  "spec/v2/facets/heartbeat.schema.json": "81d7fa1895a8b0241bd07cf00a7e7905bef0fd14eb3427325261c62eee5746a6",
295
- "spec/v2/facets/hostEvents.schema.json": "973ff452cb91356b4c625d0b06c8d2ef335e18183de09e1afde8acead22290b3",
295
+ "spec/v2/facets/hostEvents.schema.json": "8834c2fde7bc2ba9eb433f22c9d6ec3f9739f44049eecdbf0a05baf2bfa0bb7d",
296
296
  "spec/v2/facets/interrupt.schema.json": "2110ef32c3f880bf706475ef4cf8ddf97ff06871b8e6003a5edbcf4439f1fb70",
297
297
  "spec/v2/facets/limits.schema.json": "218fcbd34dd2cdf7548c29c8c76e1a6aea2b7d7df1ba32fbe201bd40917bc66f",
298
298
  "spec/v2/facets/mcp.schema.json": "7060657dfcff170f079beed160e3db7c1d3cc4410cd3cf64863baf6459f781cd",
@@ -307,7 +307,7 @@
307
307
  "spec/v2/facets/uiPlugins.schema.json": "1fd3f8440cfb6e4422553a7c4b5f091eb3e10a40da0d43e8b977a18929116758",
308
308
  "spec/v2/facets/webhooks.schema.json": "54b576f1d150e28e1642693d846ce471c118e9c521bdf3924185305fbd1d0de4",
309
309
  "spec/v2/facets/workflowChainPacks.schema.json": "ea625ce818fbeb746478f00f31f96ee9613d538e4409c258c1bfb517acdeaba9",
310
- "spec/v2/generated/error-codes.md": "e8441e944d2a8856a9112c1de8175e5bfae8bb36b8f389dce9dfa838702c21b6",
310
+ "spec/v2/generated/error-codes.md": "c024fb18264724cd0d88f33d9b3d509b8fc8c3f16a18f120f2fea069dc04a43d",
311
311
  "spec/v2/harness-trust-anchors.json": "6007b92eae16a070fbc3777424efb0abfe865fda89d096963109b96282b91205",
312
312
  "spec/v2/harness-trust-anchors.schema.json": "372b5d92337c893d3449eff3f6bfd009ac09fdac285296d8bdbe0a08fff9e34c",
313
313
  "spec/v2/id-field-bindings.json": "97e96b6c35c405d0408b5a877c5859714dbbf4507853de9aab381163371ac098",
@@ -318,9 +318,9 @@
318
318
  "spec/v2/path-manifest.json": "20f598f56df460ad3ed50aba3d6bc2933ea16a3c96ce125da1c5dd6989d4155c",
319
319
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
320
320
  "spec/v2/profiles.json": "b382b261c7844798575f7c1b37c934f0da19846016a2337d883d4f5ef6e05479",
321
- "spec/v2/release.json": "322b7088bd2832238392a88f4201c4841c42a928971941a9e11958bac3ddfb2e",
321
+ "spec/v2/release.json": "144826ee9c8d37e14bbe13262748b0dc6109d84a9d457a93ef2f7cc6f7675396",
322
322
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
323
- "spec/v2/surface-baseline.json": "570b381e6199689e5c9f9daca49d8d056e45d7d55d64f3bac3808ed2605492d6"
323
+ "spec/v2/surface-baseline.json": "4c847211a7eb32a7b76dd38d15ebb5fa80e78f3e82cd2c4ee000a74f708c6341"
324
324
  },
325
- "corpusCommit": "297d53ea4225c9675007b5561add94e692b20e6f"
325
+ "corpusCommit": "2db5b3ce931febf665ae21cea429e4d8632aeeb9"
326
326
  }
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.46.22
4
+ version: 2.46.23
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.46.22
4
+ version: 2.46.23
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.46.22
4
+ version: 2.46.23
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
@@ -3560,6 +3560,15 @@ paths:
3560
3560
  $ref: '#/components/headers/OpenWOPVersion'
3561
3561
  '401':
3562
3562
  $ref: '#/components/responses/Unauthenticated'
3563
+ '409':
3564
+ description: '`host_event_resync_required`: the `replay=required` cursor cannot be resumed (RFC 0250).'
3565
+ content:
3566
+ application/json:
3567
+ schema:
3568
+ $ref: ../../schemas/v2/error-envelope.schema.json
3569
+ headers:
3570
+ OpenWOP-Version:
3571
+ $ref: '#/components/headers/OpenWOPVersion'
3563
3572
  parameters:
3564
3573
  - in: query
3565
3574
  name: resumable
@@ -3570,6 +3579,16 @@ paths:
3570
3579
  event, so a host advertising `limits.maxStreamAgeSec` MAY end it early (a bounded close, never terminal). Absent
3571
3580
  or `false`, the host MUST hold a live stream open (events.md §Resuming with `Last-Event-ID`). A consumer that sends
3572
3581
  it MUST resume with `resumable=true` and `Last-Event-ID`.
3582
+ - name: replay
3583
+ in: query
3584
+ required: false
3585
+ schema:
3586
+ type: string
3587
+ enum:
3588
+ - required
3589
+ description: RFC 0250. Send only when `hostEvents.replay` is advertised, with `Last-Event-ID` naming a durable event.
3590
+ The host replays every visible durable event after it, in commit order, then continues live; a cursor it cannot
3591
+ resume is refused `409 host_event_resync_required` before any SSE byte, identically in every case.
3573
3592
  - $ref: '#/components/parameters/OpenWOPVersion'
3574
3593
  - $ref: '#/components/parameters/OpenWOPClientVersion'
3575
3594
  security:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.46.22",
3
+ "version": "2.46.23",
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": {
@@ -4662,6 +4662,21 @@
4662
4662
  }
4663
4663
  }
4664
4664
  }
4665
+ },
4666
+ "replay": {
4667
+ "type": "object",
4668
+ "additionalProperties": false,
4669
+ "required": [
4670
+ "minRetentionSeconds"
4671
+ ],
4672
+ "description": "RFC 0250. Strict replay on `streamHostEvents`, opted into per request with `replay=required` and a `Last-Event-ID` naming a durable event. A host advertising it MUST, for a cursor naming a durable event the caller can see that was emitted less than `minRetentionSeconds` ago, replay every durable event visible to the caller committed after it, each once and in the order the host committed them (events whose commits were concurrent have no defined order), never the cursor event itself and never an ephemeral event, then continue live with no gap. With `replay=required` and an absent or empty `Last-Event-ID`, the stream opens live and replays nothing. A cursor older than `minRetentionSeconds` MAY be resumed or refused. For any cursor it does not resume (unknown, another tenant's, an ephemeral event's, older than the bound, or one whose event was removed) it MUST answer `409 host_event_resync_required` before any SSE byte, with a status and body byte-identical across those cases. An event removed by lawful deletion, tenant removal or revoked visibility is left out of replay. Without `replay=required` behaviour is unchanged; a host that omits this member MAY ignore the parameter, and a client MUST NOT send it unless the host advertises the member.",
4673
+ "properties": {
4674
+ "minRetentionSeconds": {
4675
+ "type": "integer",
4676
+ "minimum": 1,
4677
+ "description": "How long after emission a durable event stays resumable as a cursor, across ordinary process replacement and whatever the volume of newer events."
4678
+ }
4679
+ }
4665
4680
  }
4666
4681
  },
4667
4682
  "allOf": [
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/error-envelope.schema.json",
4
4
  "title": "ErrorEnvelope (v2)",
5
- "description": "GENERATED from spec/v2/errors.json by scripts/generate-error-envelope.mjs (RFC 0171 §B.1). 125 registered codes; vendor codes match ^(?!openwop\\.)[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9_]*$. Consumers MUST accept an unknown registered member and MUST NOT act on it (RFC 0171 §A.5).",
5
+ "description": "GENERATED from spec/v2/errors.json by scripts/generate-error-envelope.mjs (RFC 0171 §B.1). 126 registered codes; vendor codes match ^(?!openwop\\.)[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9_]*$. Consumers MUST accept an unknown registered member and MUST NOT act on it (RFC 0171 §A.5).",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -139,7 +139,8 @@
139
139
  "conversation_roster_exceeded",
140
140
  "proposal_state_conflict",
141
141
  "proposal_stale",
142
- "proposal_install_conflict"
142
+ "proposal_install_conflict",
143
+ "host_event_resync_required"
143
144
  ]
144
145
  },
145
146
  {
@@ -817,7 +818,8 @@
817
818
  "conversation_roster_exceeded": 422,
818
819
  "proposal_state_conflict": 409,
819
820
  "proposal_stale": 409,
820
- "proposal_install_conflict": 409
821
+ "proposal_install_conflict": 409,
822
+ "host_event_resync_required": 409
821
823
  },
822
824
  "x-openwop-retriable": [
823
825
  "residency_unavailable",
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.46.22"
7
+ "version": "2.46.23"
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": "0e1987ad303a3834d8466302554886144025df13513c74d1e6ba9b4728e4c155"
429
+ "digest": "14211d070e9eaa57443622d4ba7769998b6a878cb0acebee5b1f8dd1d61659b1"
430
430
  }
package/spec/v1/gaps.json CHANGED
@@ -14946,8 +14946,8 @@
14946
14946
  "surface": "Facet/query/error names and status",
14947
14947
  "witness": "unclassified",
14948
14948
  "requirementId": null,
14949
- "disposition": "transferred",
14950
- "target": "TODO.md",
14949
+ "disposition": "closed",
14950
+ "target": null,
14951
14951
  "sources": [
14952
14952
  {
14953
14953
  "file": "RFCS/registers/0250-opt-in-host-event-replay-and-resync.gaps.md",
@@ -14963,8 +14963,8 @@
14963
14963
  "surface": "Retention and lawful deletion/revocation exceptions",
14964
14964
  "witness": "unclassified",
14965
14965
  "requirementId": null,
14966
- "disposition": "transferred",
14967
- "target": "TODO.md",
14966
+ "disposition": "closed",
14967
+ "target": null,
14968
14968
  "sources": [
14969
14969
  {
14970
14970
  "file": "RFCS/registers/0250-opt-in-host-event-replay-and-resync.gaps.md",
@@ -14980,8 +14980,8 @@
14980
14980
  "surface": "Stable replay order and atomic live handoff",
14981
14981
  "witness": "unclassified",
14982
14982
  "requirementId": null,
14983
- "disposition": "transferred",
14984
- "target": "TODO.md",
14983
+ "disposition": "closed",
14984
+ "target": null,
14985
14985
  "sources": [
14986
14986
  {
14987
14987
  "file": "RFCS/registers/0250-opt-in-host-event-replay-and-resync.gaps.md",
@@ -14997,8 +14997,8 @@
14997
14997
  "surface": "Causable restart/trim/oversize tests without public backdoor",
14998
14998
  "witness": "unclassified",
14999
14999
  "requirementId": null,
15000
- "disposition": "transferred",
15001
- "target": "TODO.md",
15000
+ "disposition": "closed",
15001
+ "target": null,
15002
15002
  "sources": [
15003
15003
  {
15004
15004
  "file": "RFCS/registers/0250-opt-in-host-event-replay-and-resync.gaps.md",
@@ -15023,6 +15023,23 @@
15023
15023
  }
15024
15024
  ]
15025
15025
  },
15026
+ {
15027
+ "id": "openwop.gap.0250.6",
15028
+ "rfc": "0250",
15029
+ "local": "G6",
15030
+ "section": "Conformance",
15031
+ "surface": "No host advertises `hostEvents.replay`.",
15032
+ "witness": "unclassified",
15033
+ "requirementId": null,
15034
+ "disposition": "externally-gated",
15035
+ "target": "a",
15036
+ "sources": [
15037
+ {
15038
+ "file": "RFCS/registers/0250-opt-in-host-event-replay-and-resync.gaps.md",
15039
+ "token": "G6"
15040
+ }
15041
+ ]
15042
+ },
15026
15043
  {
15027
15044
  "id": "openwop.gap.spec.a2a-integration.g1",
15028
15045
  "rfc": "0152",
@@ -8,7 +8,7 @@ Every error a v2 host returns is a row in one registry. A client routes on `erro
8
8
 
9
9
  ## The registry
10
10
 
11
- `spec/v2/errors.json` holds one row per code, defined by `spec/v2/errors.schema.json`. It registers **125** codes. `schemas/v2/error-envelope.schema.json` is GENERATED from it and MUST NOT be edited by hand.
11
+ `spec/v2/errors.json` holds one row per code, defined by `spec/v2/errors.schema.json`. It registers **126** codes. `schemas/v2/error-envelope.schema.json` is GENERATED from it and MUST NOT be edited by hand.
12
12
 
13
13
  - A host MUST emit a registered code, or a vendor code, wherever it emits an error code: the `error` of every error response, and `error.code` on `run.failed`, `node.failed` and the snapshot's `error` (overview.md §0). A recorded event re-emitted by replay or `:fork` is carried as recorded ([replay.md](replay.md)).
14
14
  - A vendor code MUST match `^(?!openwop\.)[a-z][a-z0-9]*(-[a-z0-9]+)*\.[a-z][a-z0-9_]*$`, with its first segment an org registered in `spec/v2/declaration.json`. `openwop.` is reserved.
@@ -59,6 +59,6 @@ An operation gated on a family or facet the host does not advertise MUST answer
59
59
 
60
60
  ## Codes by HTTP status
61
61
 
62
- Every registered code, by HTTP status, is listed in [error-codes.md](../generated/error-codes.md), generated from `spec/v2/errors.json` (125 codes).
62
+ Every registered code, by HTTP status, is listed in [error-codes.md](../generated/error-codes.md), generated from `spec/v2/errors.json` (126 codes).
63
63
 
64
64
  *Sources: RFCs 0171, 0213, 0227, 0228.*
@@ -68,7 +68,7 @@ The five contracts:
68
68
 
69
69
  ## The events channel
70
70
 
71
- `api/v2/asyncapi.yaml` declares one channel, `runEvents`, at `/runs/{runId}/events`, and `api/v2/openapi.yaml` declares the same path (`streamRunEvents`). The two MUST resolve to the same absolute path.
71
+ `api/v2/asyncapi.yaml` declares one channel, `runEvents`, at `/runs/{runId}/events`, and `api/v2/openapi.yaml` the same path (`streamRunEvents`); both MUST resolve to one absolute path.
72
72
 
73
73
  ### Stream modes
74
74
 
@@ -139,7 +139,7 @@ A host event's envelope (`schemas/v2/host-event.schema.json`) has no `runId` or
139
139
 
140
140
  `negotiation.decided` is reserved and durable ([interop.md](interop.md)).
141
141
 
142
- 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.
142
+ 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`; a host SHOULD honour `Last-Event-ID` for it within retention, and MUST under `hostEvents.replay`. A vendor payload MUST NOT carry secrets.
143
143
 
144
144
  #### `heartbeat`
145
145
 
@@ -963,7 +963,7 @@
963
963
  {
964
964
  "key": "hostEvents",
965
965
  "kind": "family",
966
- "normativeText": ["spec/v2/core/events.md"],
966
+ "normativeText": ["spec/v2/core/events.md", "spec/v2/facets/hostEvents.schema.json"],
967
967
  "anchor": "core",
968
968
  "section": "core/capabilities.md#hostEvents",
969
969
  "peerDependencyId": "hostEvents",
@@ -973,7 +973,8 @@
973
973
  "adoption": "none"
974
974
  },
975
975
  "facets": [
976
- "types"
976
+ "types",
977
+ "replay"
977
978
  ],
978
979
  "floorScenarios": [],
979
980
  "requirementIds": [],
@@ -1469,6 +1469,16 @@
1469
1469
  },
1470
1470
  "since": "2.46",
1471
1471
  "source": "spec/v2/facets/agents.schema.json §proposals; RFC 0249"
1472
+ },
1473
+ {
1474
+ "code": "host_event_resync_required",
1475
+ "meaning": "A replay=required host-event cursor cannot be resumed: it is unknown, another tenant's, an ephemeral event's, expired or removed. The body is identical in every case; the consumer reconciles through its own entity reads and opens a fresh stream.",
1476
+ "httpStatus": 409,
1477
+ "statusSource": "v2 decision",
1478
+ "retriable": false,
1479
+ "details": null,
1480
+ "since": "2.46",
1481
+ "source": "spec/v2/facets/hostEvents.schema.json §replay; RFC 0250"
1472
1482
  }
1473
1483
  ]
1474
1484
  }
@@ -25,6 +25,21 @@
25
25
  }
26
26
  }
27
27
  }
28
+ },
29
+ "replay": {
30
+ "type": "object",
31
+ "additionalProperties": false,
32
+ "required": [
33
+ "minRetentionSeconds"
34
+ ],
35
+ "description": "RFC 0250. Strict replay on `streamHostEvents`, opted into per request with `replay=required` and a `Last-Event-ID` naming a durable event. A host advertising it MUST, for a cursor naming a durable event the caller can see that was emitted less than `minRetentionSeconds` ago, replay every durable event visible to the caller committed after it, each once and in the order the host committed them (events whose commits were concurrent have no defined order), never the cursor event itself and never an ephemeral event, then continue live with no gap. With `replay=required` and an absent or empty `Last-Event-ID`, the stream opens live and replays nothing. A cursor older than `minRetentionSeconds` MAY be resumed or refused. For any cursor it does not resume (unknown, another tenant's, an ephemeral event's, older than the bound, or one whose event was removed) it MUST answer `409 host_event_resync_required` before any SSE byte, with a status and body byte-identical across those cases. An event removed by lawful deletion, tenant removal or revoked visibility is left out of replay. Without `replay=required` behaviour is unchanged; a host that omits this member MAY ignore the parameter, and a client MUST NOT send it unless the host advertises the member.",
36
+ "properties": {
37
+ "minRetentionSeconds": {
38
+ "type": "integer",
39
+ "minimum": 1,
40
+ "description": "How long after emission a durable event stays resumable as a cursor, across ordinary process replacement and whatever the volume of newer events."
41
+ }
42
+ }
28
43
  }
29
44
  },
30
45
  "required": [
@@ -2,7 +2,7 @@
2
2
 
3
3
  > **Status: Stable.** Generated from `spec/v2/errors.json` by `scripts/generate-error-envelope.mjs`; do not edit.
4
4
 
5
- Every registered code (125 codes), by HTTP status. The registry is normative; this table restates it for reading. `retriable` and `statusSource` are in the registry. The rules are in [errors.md](../core/errors.md).
5
+ Every registered code (126 codes), by HTTP status. The registry is normative; this table restates it for reading. `retriable` and `statusSource` are in the registry. The rules are in [errors.md](../core/errors.md).
6
6
 
7
7
  Code | Status
8
8
  --- | ---
@@ -68,6 +68,7 @@ Code | Status
68
68
  `protocol_version_unsupported` | 406
69
69
  `connection_provider_conflict` | 409
70
70
  `envelope_correlation_conflict` | 409
71
+ `host_event_resync_required` | 409
71
72
  `idempotency_in_flight` | 409
72
73
  `idempotency_key_mismatch` | 409
73
74
  `interrupt_already_resolved` | 409
@@ -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.46.22",
4
- "corpusTag": "v2.46.22",
3
+ "version": "2.46.23",
4
+ "corpusTag": "v2.46.23",
5
5
  "updated": "2026-10-24"
6
6
  }
@@ -4,7 +4,7 @@
4
4
  "schemas/v2/**/*.json",
5
5
  "spec/v2/path-manifest.json"
6
6
  ],
7
- "release": "2.46.22",
7
+ "release": "2.46.23",
8
8
  "kinds": {
9
9
  "union": [
10
10
  "channel",
@@ -18,7 +18,7 @@
18
18
  "type"
19
19
  ]
20
20
  },
21
- "count": 9024,
21
+ "count": 9031,
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\"",
@@ -2127,6 +2127,11 @@
2127
2127
  "schemas/v2/capabilities.schema.json#/heartbeat|required|until",
2128
2128
  "schemas/v2/capabilities.schema.json#/heartbeat|required|witness",
2129
2129
  "schemas/v2/capabilities.schema.json#/heartbeat|type|object",
2130
+ "schemas/v2/capabilities.schema.json#/hostEvents/replay/minRetentionSeconds|type|integer",
2131
+ "schemas/v2/capabilities.schema.json#/hostEvents/replay|closed|true",
2132
+ "schemas/v2/capabilities.schema.json#/hostEvents/replay|property|minRetentionSeconds",
2133
+ "schemas/v2/capabilities.schema.json#/hostEvents/replay|required|minRetentionSeconds",
2134
+ "schemas/v2/capabilities.schema.json#/hostEvents/replay|type|object",
2130
2135
  "schemas/v2/capabilities.schema.json#/hostEvents/since|type|string",
2131
2136
  "schemas/v2/capabilities.schema.json#/hostEvents/status|enum-member|\"deprecated\"",
2132
2137
  "schemas/v2/capabilities.schema.json#/hostEvents/status|enum-member|\"experimental\"",
@@ -2149,6 +2154,7 @@
2149
2154
  "schemas/v2/capabilities.schema.json#/hostEvents/witness|enum-member|\"witnessable-gated\"",
2150
2155
  "schemas/v2/capabilities.schema.json#/hostEvents/witness|enum-member|\"witnessable-unaided\"",
2151
2156
  "schemas/v2/capabilities.schema.json#/hostEvents|closed|true",
2157
+ "schemas/v2/capabilities.schema.json#/hostEvents|property|replay",
2152
2158
  "schemas/v2/capabilities.schema.json#/hostEvents|property|since",
2153
2159
  "schemas/v2/capabilities.schema.json#/hostEvents|property|status",
2154
2160
  "schemas/v2/capabilities.schema.json#/hostEvents|property|types",
@@ -5621,6 +5627,7 @@
5621
5627
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"forbidden\"",
5622
5628
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"force_engine_version_forbidden\"",
5623
5629
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"fork_point_invalid\"",
5630
+ "schemas/v2/error-envelope.schema.json#/error|enum-member|\"host_event_resync_required\"",
5624
5631
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"id_tenant_mismatch\"",
5625
5632
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"idempotency_in_flight\"",
5626
5633
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"idempotency_key_invalid\"",