@openwop/spec-artifacts 2.23.0 → 2.25.0

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.23.0",
5
- "corpusTag": "v2.23.0",
4
+ "version": "2.25.0",
5
+ "corpusTag": "v2.25.0",
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": "39081c59fb696159806b0f2f9a42e7e9ff830d622fcf2ad4159b21357580a955",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "3d800d8f6845460af75a6f96db40a3b1419c9b7471e671e2bc44090871a02d68",
13
- "api/v2/asyncapi.yaml": "f37bbe960632be29c8a86f0678fe39c16640a99bf91d767c02ce4a093c7004db",
14
- "api/v2/openapi.yaml": "f2168eb8552cd21a0aaab004da4257578601867e73755e99de20ad9b771d9a72",
12
+ "api/seams-v2.yaml": "f8a8a952166e13505d28e6859788f3269493fe4c440433442214b282334fef72",
13
+ "api/v2/asyncapi.yaml": "b165823a2a95a9bbefcb1d71d7768b2031342297077e0c89e414c69eec917ed6",
14
+ "api/v2/openapi.yaml": "b131c9fbde1e2d39dca11287f277ee9d51d1b83b684f5713f9c6e277f07636ce",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
@@ -115,8 +115,8 @@
115
115
  "schemas/v2/artifact-type-pack-manifest.schema.json": "85630d1b760d0b41cf5a6fad2acfada39abaf7f0befd95cc4334e1e883e9615d",
116
116
  "schemas/v2/audit-verify-result.schema.json": "a748dfadb5155adfde8a91045e76b0db6695005fe559035d71670fdd55edb3ba",
117
117
  "schemas/v2/budget-policy.schema.json": "c7449daeb6e1d95e7a047b8c2814d3d54748697c27046972834874867d9b5f4c",
118
- "schemas/v2/capabilities.schema.json": "213c5cbe7ae7a337418c9183ed8ec39f1bc4dc39650a9b3c06cea9780dca3f24",
119
- "schemas/v2/certification-bundle.schema.json": "9afcd16cf018d9b0d3b31e3b7e2e844d9289fe7b912a363d0df5a78e4fdfc054",
118
+ "schemas/v2/capabilities.schema.json": "50d3f90d6f92637e2f16956c99bc4826f69f28d935fb75fb06ab6fb910078706",
119
+ "schemas/v2/certification-bundle.schema.json": "be5de0cc4362207c27885c51165c92c9541a545c5bd2c59da1d5c28fc265c162",
120
120
  "schemas/v2/channel-presence-payload.schema.json": "1c20ad810cb311d47aa0b95d928490826b2468fd161f884cd29e867053e6782f",
121
121
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
122
122
  "schemas/v2/chat-card-pack-manifest.schema.json": "8df0d9d273ae22efc6876d5586833f1d4c2e551edc3ac6cf6e8f0719329f03dd",
@@ -141,7 +141,7 @@
141
141
  "schemas/v2/envelopes/schema.request.schema.json": "be2c5f7aa881cdd252ccff47ac02193659e1393633a1541f4297383205d384a2",
142
142
  "schemas/v2/envelopes/schema.response.schema.json": "d049a081267c06c28879c331b147f3ed821b14ccfd93005c67aff64db0a8c68e",
143
143
  "schemas/v2/envelopes/ui.a2ui-surface.schema.json": "0a06fbbdc8ba797a6818c79336a98e211ac5ba5747945b4e4098072cd3974d79",
144
- "schemas/v2/error-envelope.schema.json": "b2c6b673c14dd7c0603d0862f4bf0dad00e401c88c418914753bcd744d8400f5",
144
+ "schemas/v2/error-envelope.schema.json": "bb3e6c487dafa951a56ff224a7c029c462f0f1b754a7f51f6729609b4f43a438",
145
145
  "schemas/v2/eval-summary.schema.json": "9d31025752d0f67ad3b8a32e82a5314972c530ef9f780dd82e484ae8c5131198",
146
146
  "schemas/v2/export-bundle.schema.json": "bd28905a7729437ab7f2ad8bb33e13a371b2bf5605a7eb2962a0d246de312d69",
147
147
  "schemas/v2/form-content-pack-manifest.schema.json": "461529e4287ec3b15a9fbcde57226a1c6f17ea3ae71b33b418e6f595ff0619fe",
@@ -201,7 +201,7 @@
201
201
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
202
202
  "spec/v1/alias-detectors.json": "40069d5976eeb6ba1384a648e57e5cfd673db3fce36175115fb8293bee9664d4",
203
203
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
204
- "spec/v1/core-standard-manifest.json": "4b924e0e83fb85b9a4ec9400b34239bca6826a3bd2aad0ff44eaf1e7aa23e6e5",
204
+ "spec/v1/core-standard-manifest.json": "c17bb554c788d68fafc3413593dc6686aef0ad65864e925a9d19c4c3833bd0f5",
205
205
  "spec/v1/deprecations.json": "307083ce29c23fd406015951f99a30d78d6187ff061d38dc9732f62191b40f3f",
206
206
  "spec/v1/deprecations.schema.json": "18c87e78bedc210431f795ae44c5b5d202f2f3317850d5cf86867d4f1fa1cdfb",
207
207
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
@@ -218,8 +218,8 @@
218
218
  "spec/v2/core/conformance.md": "a451c0a2ba79d93c55e540ccef480eba7de9602d59bbb03eead05daafde0beac",
219
219
  "spec/v2/core/connection-packs.md": "466bdb9dde79d85615ad8281dacfb7bf923ca22d7fb3ed219749e59574c753ed",
220
220
  "spec/v2/core/conversation.md": "e425887c4ba199b8cdc5c99e792689f7bd7d46de492f28670de2e402fa6d9506",
221
- "spec/v2/core/errors.md": "6b6a1480ed889013172d8ce8c6985e321d2f4f73e1d9fae0bac9b961d0dd1a8c",
222
- "spec/v2/core/events.md": "6fa2b5c43f096636d6d14e4a811aff396b51e9d56743fec21b750f6a224bbb62",
221
+ "spec/v2/core/errors.md": "0dff4a0ae102a86f6a17a9a3b16a203292588a0f422ed19d1c0d9213995aa01d",
222
+ "spec/v2/core/events.md": "c98742f5a310eee8287ca8135493502152e88b479200a6544bb3340fed1e4efe",
223
223
  "spec/v2/core/form-content-packs.md": "af3517dd7125106088249c0e32220b0b9fc3e9304c10378a6327cc8ad84b6bf1",
224
224
  "spec/v2/core/headers.md": "14cdf4ae9ee7d80eebfd426d7c3552e577baea0300915cd4bb3a68e8588195a8",
225
225
  "spec/v2/core/host-services.md": "3753f1e034d325bb4bd5751ae6d321fbb16700d4e28032ab4e273d25eb134fc4",
@@ -233,12 +233,12 @@
233
233
  "spec/v2/core/replay.md": "b980a66e2543107240e3dc4f58131b9f4ff52478737e79ade6d5777b26ad1119",
234
234
  "spec/v2/core/runs.md": "136319842bacbbb300178980e4b83444917d5b193cc5fdd92e39a4902ba8d3c0",
235
235
  "spec/v2/core/security-defaults.md": "2a54ceaa4cef02c26ee0fbcf44f822ceeea79537c7d5a51ed300f21aa4fea576",
236
- "spec/v2/core/versioning.md": "27b88cde88f9060567ef7e46f4897b6be8892ade9f4a46c2ab16e314c515eabd",
236
+ "spec/v2/core/versioning.md": "56c1e273c790bcb0a2c3c760ffc7595afc9f5d4a745965e57f36aefcd456da76",
237
237
  "spec/v2/core/webhooks.md": "46c1311c1897236f9bf9db5025c8af31dd84cd19208da3e5e9ff69eec9436965",
238
238
  "spec/v2/core/workflow-chain-packs.md": "df78b76dd79f2267fb6b72c08e0911e5f9d5bb1925c6efdd6deda62fe8a51dc8",
239
- "spec/v2/declaration.json": "ac333c957815380fe263bf22c58cf3a0a896ef29c2bb5a995f3aad670ecf83f7",
239
+ "spec/v2/declaration.json": "0f35205af96f29cacced435d1b606e9e8292c74a5509444bec78f17d315d63bf",
240
240
  "spec/v2/declaration.schema.json": "c86e3083fb9789c1958ecb4576cc6f71aa90e6f339521139238543ed08211dd4",
241
- "spec/v2/errors.json": "aac91b12f954cc90574d310070ae3c651b131055d4389d2c6155242763765195",
241
+ "spec/v2/errors.json": "296117235d21ce4a393371c2f80caf03a4ae93d1f80a89f87cd3f56902cf5b01",
242
242
  "spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
243
243
  "spec/v2/event-codemap.schema.json": "b173f2a9bcc0bf9b62a474ce3b91e1431d597e64fd1560fc58662cd8606eaf9c",
244
244
  "spec/v2/ext/README.md": "ff91a503e0795e1b898e37d9e445add2d5975529723f7b32b2599b60a24c1ae3",
@@ -263,6 +263,7 @@
263
263
  "spec/v2/facets/a2a.schema.json": "6b0bceddec6d18d5115aa7d04720a0cc1ad7a9a0a78f53c208b34becaba5d16e",
264
264
  "spec/v2/facets/aiProviders.schema.json": "0c76e48e5d487b5be3b3ab1f6512a4e206c840ee5087d1336c7d7e2853b58d03",
265
265
  "spec/v2/facets/auth.schema.json": "73440c944ad12c41aab0618aeb799a90a0b59e97fc685527f248afb7d015381a",
266
+ "spec/v2/facets/envelopeStrictness.schema.json": "28be0a27f880bd45ec1222a16155f5e9167bbca57bf0322970fe1eb2654562aa",
266
267
  "spec/v2/facets/heartbeat.schema.json": "81d7fa1895a8b0241bd07cf00a7e7905bef0fd14eb3427325261c62eee5746a6",
267
268
  "spec/v2/facets/interrupt.schema.json": "c76c58c0abd99de619f8c8afad246568f5bc9cce3b7a0d097d16d87eba84be3a",
268
269
  "spec/v2/facets/mcp.schema.json": "f56609fe24ba6160ad29ae31aa16043354ff005e5cb6a0f3871c4d226087cc08",
@@ -270,14 +271,16 @@
270
271
  "spec/v2/facets/replay.schema.json": "0a5aefb0108c708c6794fadd533cf256709704c4f16dbf44cd63fa8980c78018",
271
272
  "spec/v2/facets/runList.schema.json": "6223e1baaebbb9f4faa71bfe968f8d22b4aa88046d0e43e8d5f56409e7f86e90",
272
273
  "spec/v2/facets/sandbox.schema.json": "e75f54486d387b2d089791aa93b5093cd1450f1920753a0f97fc23acdfe978ed",
274
+ "spec/v2/facets/schemaVersions.schema.json": "890d3416c4b66511d51f329abc68e6f467f4338f16807e489fe682999b2b56b9",
275
+ "spec/v2/facets/supportedEnvelopes.schema.json": "644f22cc2236e30a611b5b7f1ba0458ff1925d68b94c514d9672583224e126bd",
273
276
  "spec/v2/facets/webhooks.schema.json": "4bf3f8eb3161a43910efac4c44ccaf9567060c9da52d4cf09bcf3888d1b92192",
274
277
  "spec/v2/facets/workflowChainPacks.schema.json": "cd30907ac92396866a524e4db8d8c1537e3818cfff455d780efd72bcd0ebdac1",
275
278
  "spec/v2/id-field-bindings.json": "e73c06f3055ad30173507ac817a458b96362c8f26209ba105c53653292cf63d3",
276
279
  "spec/v2/path-manifest.json": "c123c9fd77dc1b3f9c2e9346ace80cdae007e6511138894956abda01e61ec1c6",
277
280
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
278
281
  "spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
279
- "spec/v2/release.json": "bdc9e689a96e66a06be04c38674d23a98d7947ca1fa93439f052a9268a3ab193",
282
+ "spec/v2/release.json": "c315b1ff1a7b15dce5e0a0fda70abe67067f39ac5f171668ba8d637867133c51",
280
283
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
281
284
  },
282
- "corpusCommit": "be9c4d375782d69004e55b14bd5fe3b6550d8c72"
285
+ "corpusCommit": "f0ab0fc3a632d984a9cac159b349e908d54b6919"
283
286
  }
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.23.0
4
+ version: 2.25.0
5
5
  description: 'GENERATED by scripts/derive-v2-api.py. RFC 0168 §C: the seams are a versioned conformance profile with their
6
6
  own document and path space (/conformance/seams/…), validated against the canonical v2 schemas with no tolerance path,
7
7
  forbidden from the capability namespace (a host advertises the profile, never a testSeams flag). This document carries
@@ -1,7 +1,7 @@
1
1
  asyncapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 event streams
4
- version: 2.23.0
4
+ version: 2.25.0
5
5
  description: GENERATED by scripts/derive-v2-api.py (RFC 0171 §E.1, RFC 0172 §C.2). One run-events channel whose address
6
6
  is the OpenAPI path key; the server pathname is empty (bare origin). streamMode is a pattern over the closed set and its
7
7
  comma-separated combinations (`values` never combines). hostEvents has a real address (RFC 0171 §E.1) — the documented
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 API
4
- version: 2.23.0
4
+ version: 2.25.0
5
5
  summary: REST surface for declaring, executing, suspending, resuming, and observing multi-step workflows.
6
6
  description: GENERATED by scripts/derive-v2-api.py from api/openapi.yaml and the RFC 0167 children (v2 charter Phase 3,
7
7
  P3-C). Bare origin, unversioned path keys, negotiation by `OpenWOP-Version` + `protocolVersions[]` (RFC 0172 §A). No seam
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.23.0",
3
+ "version": "2.25.0",
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": {
@@ -339,6 +339,16 @@
339
339
  "claims-check",
340
340
  "negative-existence"
341
341
  ]
342
+ },
343
+ "kinds": {
344
+ "type": "array",
345
+ "uniqueItems": true,
346
+ "items": {
347
+ "type": "string",
348
+ "minLength": 1,
349
+ "maxLength": 256
350
+ },
351
+ "description": "The envelope `type` strings this host recognizes, as in v1 `Capabilities.supportedEnvelopes`. Universal kinds (`clarification.request`, `schema.request`, `schema.response`, `error`) are always allowed and need not be listed. Every other member MUST be namespaced under the `<org>.` rule (`events.md`). ABSENT IS NOT `[]` AND IS NOT `all`: an engine MUST refuse every non-universal kind with `unknown_envelope_kind` when this seat is absent (`events.md` §\"The envelope-kind catalog\"). The refusal is what makes the protocol-tier invariant `prompt-injection-envelope-typecheck` enforceable at major 2."
342
352
  }
343
353
  },
344
354
  "allOf": [
@@ -376,8 +386,8 @@
376
386
  }
377
387
  }
378
388
  ],
379
- "description": "core/capabilities.md#supportedEnvelopes — witness: witnessable-gated; maturity stable/none",
380
- "x-openwop-seeded-from": "v1"
389
+ "description": "core/capabilities.md#supportedEnvelopes — witness: witnessable-gated; maturity stable/none; RFC 0193",
390
+ "x-openwop-facets-from": "spec/v2/facets/supportedEnvelopes.schema.json"
381
391
  },
382
392
  "schemaVersions": {
383
393
  "type": "object",
@@ -412,6 +422,19 @@
412
422
  "claims-check",
413
423
  "negative-existence"
414
424
  ]
425
+ },
426
+ "kinds": {
427
+ "type": "object",
428
+ "propertyNames": {
429
+ "type": "string",
430
+ "minLength": 1,
431
+ "maxLength": 256
432
+ },
433
+ "additionalProperties": {
434
+ "type": "integer",
435
+ "minimum": 0
436
+ },
437
+ "description": "Active schema version per envelope kind, as in v1 `Capabilities.schemaVersions` (e.g. `{\"vendor.acme.prd.create\": 2}`). A kind absent from this map has no advertised floor; an emitted `schemaVersion` is then compared against 0. An emitted version HIGHER than the advertised floor MUST be refused with `unknown_schema_version` regardless of strictness; LOWER is governed by `envelopeStrictness.mode` (`events.md` §\"The envelope-kind catalog\")."
415
438
  }
416
439
  },
417
440
  "allOf": [
@@ -449,8 +472,8 @@
449
472
  }
450
473
  }
451
474
  ],
452
- "description": "core/capabilities.md#schemaVersions — witness: witnessable-gated; maturity stable/none",
453
- "x-openwop-seeded-from": "v1"
475
+ "description": "core/capabilities.md#schemaVersions — witness: witnessable-gated; maturity stable/none; RFC 0193",
476
+ "x-openwop-facets-from": "spec/v2/facets/schemaVersions.schema.json"
454
477
  },
455
478
  "limits": {
456
479
  "type": "object",
@@ -606,6 +629,13 @@
606
629
  "claims-check",
607
630
  "negative-existence"
608
631
  ]
632
+ },
633
+ "mode": {
634
+ "enum": [
635
+ "warn",
636
+ "strict"
637
+ ],
638
+ "description": "Schema-version drift handling. `warn` (the default when this seat is absent, as in v1): an engine MUST attempt validation against the advertised version and log `envelope_schema_version_drift`. `strict`: the same condition MUST refuse with `unknown_schema_version`. Drift ABOVE the advertised floor refuses under both (`events.md` §\"The envelope-kind catalog\")."
609
639
  }
610
640
  },
611
641
  "allOf": [
@@ -643,8 +673,8 @@
643
673
  }
644
674
  }
645
675
  ],
646
- "description": "core/capabilities.md#envelopeStrictness — witness: claims-check; maturity experimental/none",
647
- "x-openwop-seeded-from": "v1"
676
+ "description": "core/capabilities.md#envelopeStrictness — witness: claims-check; maturity experimental/none; RFC 0193",
677
+ "x-openwop-facets-from": "spec/v2/facets/envelopeStrictness.schema.json"
648
678
  },
649
679
  "envelopeContracts": {
650
680
  "type": "object",
@@ -259,7 +259,7 @@
259
259
  "properties": {
260
260
  "id": {
261
261
  "type": "string",
262
- "pattern": "^openwop\\.(?!it\\.(?:artifact-schema-compile-bounded|artifact-type-legacy-ids|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|multi-region-effect-vocabulary|normative-example-extraction|openapi-asyncapi-sdk-parity|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-result-trust-monotone|v2-alias-covers-reword|v2-bundle-signature-attributable|v2-corpus-tag-pinned|v2-declaration-parity|v2-eos-clock|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-facet-advertisement|v2-id-kinds-bound|v2-normative-home-gate|v2-one-signing-scheme|v2-path-parity|v2-release-identity|v2-req-only-assertions|v2-retention-floors|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-threat-model-template|v2-umbrella-alias-covered|v2-umbrella-child-parts|v2-umbrella-codemod-at-active|v2-umbrella-codemod-legs|v2-umbrella-migration-deprecation|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
262
+ "pattern": "^openwop\\.(?!it\\.(?:artifact-schema-compile-bounded|artifact-type-legacy-ids|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|multi-region-effect-vocabulary|normative-example-extraction|openapi-asyncapi-sdk-parity|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-result-trust-monotone|v2-alias-covers-reword|v2-bundle-signature-attributable|v2-corpus-tag-pinned|v2-declaration-parity|v2-envelope-catalog|v2-eos-clock|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-facet-advertisement|v2-id-kinds-bound|v2-normative-home-gate|v2-one-signing-scheme|v2-path-parity|v2-release-identity|v2-req-only-assertions|v2-retention-floors|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-threat-model-template|v2-umbrella-alias-covered|v2-umbrella-child-parts|v2-umbrella-codemod-at-active|v2-umbrella-codemod-legs|v2-umbrella-migration-deprecation|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
263
263
  "description": "RFC 0168 §A.1 — `openwop.<area>.<slug>`. The suite mints six areas: `requirement` (an explicit `req()` id), `it` (a per-test id from the scenario file and title), `scenario` and `floor` (per-file rows), `profile` (a claimed-profile row) and `family` (a capability gate). The lookahead refuses every id minted from a corpus-coherence file: those run in the spec repo’s CI and MUST NOT appear in a host bundle (conformance.md §\"Two products, two ledgers\"; RFC 0168 §D.1). `scripts/check-req-only.mjs` fails when the list drifts from `conformance/src/coherence/`."
264
264
  },
265
265
  "scenario": {
@@ -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). 99 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). 101 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": [
@@ -113,7 +113,9 @@
113
113
  "pack_load_failure",
114
114
  "credential_unavailable",
115
115
  "pack_registry_unreachable",
116
- "runner_unavailable"
116
+ "runner_unavailable",
117
+ "unknown_envelope_kind",
118
+ "unknown_schema_version"
117
119
  ]
118
120
  },
119
121
  {
@@ -302,7 +304,9 @@
302
304
  "pack_load_failure": 500,
303
305
  "credential_unavailable": 501,
304
306
  "pack_registry_unreachable": 503,
305
- "runner_unavailable": 503
307
+ "runner_unavailable": 503,
308
+ "unknown_envelope_kind": 422,
309
+ "unknown_schema_version": 422
306
310
  },
307
311
  "x-openwop-retriable": [
308
312
  "residency_unavailable",
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.23.0"
7
+ "version": "2.25.0"
8
8
  },
9
9
  "note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
10
10
  },
@@ -419,5 +419,5 @@
419
419
  "$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
420
420
  }
421
421
  ],
422
- "digest": "bffe6b840b0bcaabf41fd1d546bd2a32e7b9e6ff9740aafdd8d6dba8d336b094"
422
+ "digest": "81a04572ec44c2a31ca6d65a0b4f992fc3fc504393c540694cca77ca1e076a03"
423
423
  }
@@ -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: `{ code, httpStatus, retriable, details, since, deprecated? }` plus the provenance fields `statusSource` and `source`. It registers **99** 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: `{ code, httpStatus, retriable, details, since, deprecated? }` plus the provenance fields `statusSource` and `source`. It registers **101** 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 return a registered code, or a vendor code, in every error response. 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. The registry grows by the closed-enum rule in overview.md §0: a producer MUST NOT emit an unregistered member, and a consumer MUST accept an unknown registered member and MUST NOT act on it.
14
14
 
@@ -28,7 +28,7 @@ An interrupt has one code per state: a token or run-scoped resolve against an in
28
28
 
29
29
  ## Codes by HTTP status
30
30
 
31
- Generated from `spec/v2/errors.json` (99 codes; `retriable` and `statusSource` are in the registry).
31
+ Generated from `spec/v2/errors.json` (101 codes; `retriable` and `statusSource` are in the registry).
32
32
 
33
33
  Code | Status
34
34
  --- | ---
@@ -122,6 +122,8 @@ Code | Status
122
122
  `sandbox_memory_exceeded` | 422
123
123
  `sandbox_timeout` | 422
124
124
  `token_budget_exceeded` | 422
125
+ `unknown_envelope_kind` | 422
126
+ `unknown_schema_version` | 422
125
127
  `client_version_unsupported` | 426
126
128
  `rate_limited` | 429
127
129
  `event_type_unmapped` | 500
@@ -1,7 +1,7 @@
1
1
  # Events
2
2
 
3
3
  > **Status: Stable · RFC 0171 §A, §E; RFC 0176 §A.**
4
- > **Normative home:** `heartbeat`, `envelopeContracts`, `envelopes`, `feedback`, `providerUsage`.
4
+ > **Normative home:** `heartbeat`, `envelopeContracts`, `envelopes`, `feedback`, `providerUsage`, `supportedEnvelopes`, `schemaVersions`, `envelopeStrictness`.
5
5
 
6
6
  ## Why this exists
7
7
 
@@ -114,6 +114,30 @@ The response is `{ runId, events, lastSequence, status, isTerminal }` (closed):
114
114
 
115
115
  An `eventLogSchemaVersion` of `2` means v1-written. Every reader (poll, stream, fork, diff, debug bundle) MUST translate each event through `spec/v2/event-codemap.json` at storage — `type` is mapped, the payload projected; `sequence` (including `0`), `eventId`, `timestamp`, `causationId` pass through. A type the codemap does not name, carrying no vendor org, MUST fail the read `500 event_type_unmapped`. A host MUST NOT carry a private mapping, nor rewrite era-2 rows in place. **A projection MUST NOT silently drop a property**: carry or fail `500 payload_unprojectable` (hatch `^(openwop-|x-|vendor\.)`; RFC 0185). Fork and replay over an era-2 parent: replay.md.
116
116
 
117
+ ## The envelope-kind catalog
118
+
119
+ `supportedEnvelopes`, `schemaVersions` and `envelopeStrictness` are one flow, read in
120
+ that order on every inbound envelope. v1 carried them as an array, a map and an enum;
121
+ a v2 capability record is an object, so each holds its value in a named seat.
122
+
123
+ `supportedEnvelopes.kinds` is the catalog. A host advertising it MUST refuse an
124
+ emitted `type` that is neither universal nor a member, with `unknown_envelope_kind`.
125
+ **An absent `kinds` is not an empty catalog and is not an unrestricted one**: a host
126
+ advertising `supportedEnvelopes` without it has made no catalog claim, and an engine
127
+ MUST refuse every non-universal kind rather than admit it unchecked. Absence that
128
+ reads as "unrestricted" would let a record claiming `stable` admit any kind an
129
+ attacker can name, which is precisely what `prompt-injection-envelope-typecheck`
130
+ forbids.
131
+
132
+ `schemaVersions.kinds` maps a kind to its advertised floor; a kind absent from the map
133
+ has a floor of `0`. An emitted `schemaVersion` ABOVE the floor MUST be refused with
134
+ `unknown_schema_version` whatever the strictness.
135
+
136
+ `envelopeStrictness.mode` governs drift BELOW the floor only. Under `warn` — the value
137
+ when the seat is absent — an engine MUST validate against the advertised version and
138
+ log `envelope_schema_version_drift`. Under `strict` the same condition MUST refuse with
139
+ `unknown_schema_version`. A host MUST NOT read an absent `mode` as "no checking".
140
+
117
141
  ## Envelope contracts
118
142
 
119
143
  `envelopeContracts` advertises that a host enforces per-node envelope permission
@@ -77,7 +77,7 @@ by `minClientVersion` and the additive-change rules.
77
77
  | 3 | `engineVersion` | unify: integer everywhere; codemod `openwop.codemod.engine-version-unify` | `integer, minimum 0` | this document |
78
78
  | 4 | `eventLogSchemaVersion` | first-class, the era key | integer; v2 writes `3` | `persistence.md` |
79
79
  | 5 | per-event `schemaVersion` | first-class; §0 growth rule | integer | `events.md` |
80
- | 6 | `schemaVersions` map | first-class; keys = envelope-kind grammar | `additionalProperties: false` over declared kinds | `events.md` |
80
+ | 6 | `schemaVersions` map | first-class; the map moves into the record's `kinds` seat (RFC 0193) | `propertyNames` = the envelope-kind grammar, values `integer, minimum 0`; NOT a closed enum — a vendor kind is host-published and never corpus-declared | `events.md` |
81
81
  | 7 | `version.pinned` | first-class; the v1-pinned-run disposition | integer min/max | `persistence.md` |
82
82
  | 8 | `contractProvenance` | delete | — | `capabilities.md` |
83
83
  | 9 | `minimumSuiteVersion` | retire into `spec/v2/declaration.json` | semver | `capabilities.md` |
@@ -172,7 +172,7 @@
172
172
  {
173
173
  "key": "supportedEnvelopes",
174
174
  "kind": "family",
175
- "normativeText": ["spec/v1/ai-envelope.md"],
175
+ "normativeText": ["spec/v2/core/events.md"],
176
176
  "anchor": "core",
177
177
  "section": "core/capabilities.md#supportedEnvelopes",
178
178
  "peerDependencyId": "supportedEnvelopes",
@@ -181,15 +181,15 @@
181
181
  "technical": "stable",
182
182
  "adoption": "none"
183
183
  },
184
- "facets": [],
184
+ "facets": ["kinds"],
185
185
  "floorScenarios": [],
186
186
  "requirementIds": [],
187
- "owningRfc": null
187
+ "owningRfc": "0193"
188
188
  },
189
189
  {
190
190
  "key": "schemaVersions",
191
191
  "kind": "family",
192
- "normativeText": ["spec/v1/capabilities.md"],
192
+ "normativeText": ["spec/v2/core/events.md"],
193
193
  "anchor": "core",
194
194
  "section": "core/capabilities.md#schemaVersions",
195
195
  "peerDependencyId": "schemaVersions",
@@ -198,10 +198,10 @@
198
198
  "technical": "stable",
199
199
  "adoption": "none"
200
200
  },
201
- "facets": [],
201
+ "facets": ["kinds"],
202
202
  "floorScenarios": [],
203
203
  "requirementIds": [],
204
- "owningRfc": null
204
+ "owningRfc": "0193"
205
205
  },
206
206
  {
207
207
  "key": "limits",
@@ -233,7 +233,7 @@
233
233
  {
234
234
  "key": "envelopeStrictness",
235
235
  "kind": "family",
236
- "normativeText": ["spec/v1/ai-envelope.md"],
236
+ "normativeText": ["spec/v2/core/events.md"],
237
237
  "anchor": "core",
238
238
  "section": "core/capabilities.md#envelopeStrictness",
239
239
  "peerDependencyId": "envelopeStrictness",
@@ -242,10 +242,10 @@
242
242
  "technical": "experimental",
243
243
  "adoption": "none"
244
244
  },
245
- "facets": [],
245
+ "facets": ["mode"],
246
246
  "floorScenarios": [],
247
247
  "requirementIds": [],
248
- "owningRfc": null
248
+ "owningRfc": "0193"
249
249
  },
250
250
  {
251
251
  "key": "envelopeContracts",
@@ -957,6 +957,24 @@
957
957
  "details": null,
958
958
  "since": "1.0",
959
959
  "source": "spec/v1/rest-endpoints.md §Error response shape"
960
+ },
961
+ {
962
+ "code": "unknown_envelope_kind",
963
+ "httpStatus": 422,
964
+ "statusSource": "v1 prose",
965
+ "retriable": false,
966
+ "details": null,
967
+ "since": "1.0",
968
+ "source": "spec/v1/ai-envelope.md §\"Refusal taxonomy\" (unknown type, not in supportedEnvelopes)"
969
+ },
970
+ {
971
+ "code": "unknown_schema_version",
972
+ "httpStatus": 422,
973
+ "statusSource": "v1 prose",
974
+ "retriable": false,
975
+ "details": null,
976
+ "since": "1.0",
977
+ "source": "spec/v1/ai-envelope.md §\"Schema version advertisement\" (emitted schemaVersion above the advertised floor)"
960
978
  }
961
979
  ]
962
980
  }
@@ -0,0 +1,9 @@
1
+ {
2
+ "$comment": "RFC 0193 §B — the seat for the v1 enum. v1 default-when-absent was `warn`; the v2 record keeps that default, so an advertised record with no `mode` means `warn` and not `unset`.",
3
+ "properties": {
4
+ "mode": {
5
+ "enum": ["warn", "strict"],
6
+ "description": "Schema-version drift handling. `warn` (the default when this seat is absent, as in v1): an engine MUST attempt validation against the advertised version and log `envelope_schema_version_drift`. `strict`: the same condition MUST refuse with `unknown_schema_version`. Drift ABOVE the advertised floor refuses under both (`events.md` §\"The envelope-kind catalog\")."
7
+ }
8
+ }
9
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "$comment": "RFC 0193 §B — the seat for the v1 map. `versioning.md` axis 6 rules this axis first-class with its own grammar; the generated record had the `retire` shape instead. propertyNames is the kind grammar rather than a closed enum: axis 6 says `additionalProperties: false over declared kinds`, but a vendor kind is host-published and never corpus-declared (`ai-envelope.schema.json` requires exactly that), so a literal enum would forbid the entries the catalog exists to carry. RFC 0193 §D corrects the axis row to match.",
3
+ "properties": {
4
+ "kinds": {
5
+ "type": "object",
6
+ "propertyNames": {
7
+ "type": "string",
8
+ "minLength": 1,
9
+ "maxLength": 256
10
+ },
11
+ "additionalProperties": {
12
+ "type": "integer",
13
+ "minimum": 0
14
+ },
15
+ "description": "Active schema version per envelope kind, as in v1 `Capabilities.schemaVersions` (e.g. `{\"vendor.acme.prd.create\": 2}`). A kind absent from this map has no advertised floor; an emitted `schemaVersion` is then compared against 0. An emitted version HIGHER than the advertised floor MUST be refused with `unknown_schema_version` regardless of strictness; LOWER is governed by `envelopeStrictness.mode` (`events.md` §\"The envelope-kind catalog\")."
16
+ }
17
+ }
18
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "$comment": "RFC 0193 §B — the seat for the v1 array. `supportedEnvelopes` was an array of kind strings in v1; the v2 record is an object, so the catalog needs a name. OPTIONAL, not required: MyndHyve's live v2 document already publishes this record without one, and the v2 root is additionalProperties:false, so a required seat would invalidate a published closed record with no host change (the same rule that kept observability.testSeams). §C makes the absence fail CLOSED instead.",
3
+ "properties": {
4
+ "kinds": {
5
+ "type": "array",
6
+ "uniqueItems": true,
7
+ "items": {
8
+ "type": "string",
9
+ "minLength": 1,
10
+ "maxLength": 256
11
+ },
12
+ "description": "The envelope `type` strings this host recognizes, as in v1 `Capabilities.supportedEnvelopes`. Universal kinds (`clarification.request`, `schema.request`, `schema.response`, `error`) are always allowed and need not be listed. Every other member MUST be namespaced under the `<org>.` rule (`events.md`). ABSENT IS NOT `[]` AND IS NOT `all`: an engine MUST refuse every non-universal kind with `unknown_envelope_kind` when this seat is absent (`events.md` §\"The envelope-kind catalog\"). The refusal is what makes the protocol-tier invariant `prompt-injection-envelope-typecheck` enforceable at major 2."
13
+ }
14
+ }
15
+ }
@@ -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.23.0",
4
- "corpusTag": "v2.23.0",
3
+ "version": "2.25.0",
4
+ "corpusTag": "v2.25.0",
5
5
  "updated": "2026-09-18"
6
6
  }