@openwop/spec-artifacts 2.43.2 → 2.44.1

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.43.2",
5
- "corpusTag": "v2.43.2",
4
+ "version": "2.44.1",
5
+ "corpusTag": "v2.44.1",
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": "69464bc0e1e71ef3b543a73d4fa4f67202343d2603c80af8033f6c3619ef1b30",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "987123ecfbfbc906c5655538b9380021ac0bcbfd93a467a67818e855d624ed0e",
13
- "api/v2/asyncapi.yaml": "76474704b7a8e829588abec30d31f09e11557ee5daacad301c3be7e77affe7ce",
14
- "api/v2/openapi.yaml": "f4af9e7fddad438d3a70753af29e5738ea48d15d1abd214a3fbeec97260cea9d",
12
+ "api/seams-v2.yaml": "6f9780f7751804b6dd9f57cb5474728326de805fcca667979f6b4f39c9c97336",
13
+ "api/v2/asyncapi.yaml": "ec6520792f7c4661403053003de7669430178597b5e0250ba5264b65dc82dbef",
14
+ "api/v2/openapi.yaml": "46314e02c9aeb4cb7a4ca0cfd5997dc24bd11c3971341e505cd0b7bef3150cd8",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -116,7 +116,7 @@
116
116
  "schemas/v2/artifact.schema.json": "85b9dc284d39b99d2a66fa8cbf47f2dd3d8526d3bd6cc411ad315b372de38975",
117
117
  "schemas/v2/audit-verify-result.schema.json": "14af8e9283510f0a40e48a2059c929ee44e0fc9fa3cc66a95bfbe90b17c48297",
118
118
  "schemas/v2/budget-policy.schema.json": "c7449daeb6e1d95e7a047b8c2814d3d54748697c27046972834874867d9b5f4c",
119
- "schemas/v2/capabilities.schema.json": "ae6f60641d6ed680351b2710df945257c401f1ed83534f7e44fa2e651dc401ab",
119
+ "schemas/v2/capabilities.schema.json": "a76db7fbb18a98821c0ee4dfe51f615e59bb26c3d458bafd373fd3b6f7af4afe",
120
120
  "schemas/v2/certification-bundle.schema.json": "82ce31a1ed6c7e21b0ba88ff62a7b8b768fc3b176b1d06fce023203830b94725",
121
121
  "schemas/v2/channel-presence-payload.schema.json": "4eeb224910e6f7eee3ab5e7c3899559c25c83a26d0022e0ad195c4672611977a",
122
122
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
@@ -142,7 +142,7 @@
142
142
  "schemas/v2/envelopes/schema.request.schema.json": "be2c5f7aa881cdd252ccff47ac02193659e1393633a1541f4297383205d384a2",
143
143
  "schemas/v2/envelopes/schema.response.schema.json": "d049a081267c06c28879c331b147f3ed821b14ccfd93005c67aff64db0a8c68e",
144
144
  "schemas/v2/envelopes/ui.a2ui-surface.schema.json": "e92a2548ba65454c9e0a34f72ea6768d18f59e61fa5da7668d0b2d5baddaddc8",
145
- "schemas/v2/error-envelope.schema.json": "d1a6862930e7c3fbc8ec334ef17953ac7b716525c6c82769edf89d0809d0c94b",
145
+ "schemas/v2/error-envelope.schema.json": "34f467d5775618f740059dab0aa49bf26247101feb0cdae3403560b6baf5eda9",
146
146
  "schemas/v2/eval-summary.schema.json": "2f384daf05b8f3b4f604688cae504d6d9971ba41b8c771e55fe9a17e09e86b7a",
147
147
  "schemas/v2/export-bundle.schema.json": "bd28905a7729437ab7f2ad8bb33e13a371b2bf5605a7eb2962a0d246de312d69",
148
148
  "schemas/v2/form-content-pack-manifest.schema.json": "a1942a124e250a6e9fbdb6b811c5a125e78fbcbcaa46dfc71d0636f24710a339",
@@ -204,58 +204,59 @@
204
204
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
205
205
  "spec/v1/alias-detectors.json": "29f21e0fb2c7a232a92a5c19b4cba3a86bc3b5e16f06780452f0421c66c6ec38",
206
206
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
207
- "spec/v1/core-standard-manifest.json": "0be2c8da837ddb170866303ab4640c8e8a8b2554d8c2bb9ac3d1bd9780bede5a",
207
+ "spec/v1/core-standard-manifest.json": "b6efb5d51e1432088bfeff049f310ae0095f3852a59e877e9d628a30782f5580",
208
208
  "spec/v1/deprecations.json": "46df807fb4adf0aae24671c20f69975cf3496e3bc3a521cb7e6ea556bdce563c",
209
209
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
210
210
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
211
211
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
212
212
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
213
- "spec/v1/gaps.json": "7eefa3aa02e978a41e1e5948818961718d23cb0cbe29a4a491524360feb9fd6f",
213
+ "spec/v1/gaps.json": "07b0f5a206a015336307dd343b75adec647f06a9bae59ee08dbbfac851c503d5",
214
214
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
215
215
  "spec/v1/migrations.json": "2efcd9064b2bc65a84a3b3d281aa86a91efd002690c1f4f14e8335c4a18194d1",
216
216
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
217
217
  "spec/v1/operation-path-manifest.json": "fada0342815fb129c1ae61f1829bd6e34417717408ce86fcc54280f373c19e74",
218
218
  "spec/v1/spec-gaps.json": "ea9612af55bea9dae3e82223d4f714243f8f590b0193f1188257b13491a38afc",
219
- "spec/v2/README.md": "4fa067d377580495e60baf08a4eafc3214b8ca48d8fb270bf91fc5066fad7186",
219
+ "spec/v2/README.md": "377639de1dad1ed71aba6dae8d34fdb6ee954fb23106e89454fe8d29cdde6349",
220
220
  "spec/v2/core/capabilities.md": "ad728e8a761153b55d036ece55043ff62d0982121e2e629e5e7cdf560fca3c03",
221
221
  "spec/v2/core/conformance.md": "0cfceb926eed87055550a5c23e640210c795fc8cf9dd1b2544db0e2b3842c564",
222
222
  "spec/v2/core/connection-packs.md": "1ee129d792c537bfe82393ccb92555d8e6ddc342b1aa781a13f101b27ec38171",
223
223
  "spec/v2/core/conversation.md": "354fa57c73d11062e523a44aa75a6353c5c81aefaf306d30c42416a228c82c86",
224
- "spec/v2/core/errors.md": "bcb62944d8a482b1b6d5ac08a692ad7e4aaadf6165746c7ba7fa39157be2a300",
224
+ "spec/v2/core/errors.md": "6d5a67389de84556f81e2558a30d83959c9283c8c5481ce7c759021e486d84fd",
225
225
  "spec/v2/core/events.md": "604abb6f9e2259a04103e1cb76d728712c3701c0d84dd915d4dc2949c912ee5e",
226
226
  "spec/v2/core/form-content-packs.md": "02931227899676fd4581a27017be2a6c4953904717be9b81c29d12f87ab3917d",
227
227
  "spec/v2/core/headers.md": "5cb1624fa63acc81992b6a6d842ec392cf7271aaf2f65d1f83c8c4fa286e6730",
228
- "spec/v2/core/host-services.md": "15923cceb95cba148a32e0944f6a2d1d25e9cc36b0c169b67ee42d483bcac800",
229
- "spec/v2/core/i18n.md": "846c6d2878fc8454c2ae0a1576f6b6e6c8958d47187a6c96cc5826ca3c3e2e91",
228
+ "spec/v2/core/host-services.md": "8b920bf2e9335ab04452068429b0c37d6eb8872b380a4d53368f2600d4afa241",
229
+ "spec/v2/core/i18n.md": "2d5a67bd3b9b956d1144acab2fbc3646cdb50b3621f97d772087eaa953798286",
230
230
  "spec/v2/core/idempotency.md": "2084d756789c1faf5121593fb39e67ca36a4c227178e175004742e403178ea49",
231
231
  "spec/v2/core/identity.md": "2dceb1c2697015e4a4fa8a9b28f4fbd25fa44a76ca5a919c752e2a8163c819db",
232
232
  "spec/v2/core/interop.md": "e72e25dff864c83b2980d7366b34054cffa072af0225821199f260f6228d260e",
233
- "spec/v2/core/interrupt.md": "2c8a4026930ec40ba47d7415dd02b6eda997a03d7a084e5084fec6f1261aba1c",
233
+ "spec/v2/core/interrupt.md": "4c825634acac72900ebd3c5ac5941f55648fa33d2df92913ef16371dcb700a34",
234
234
  "spec/v2/core/node-pack-runtimes.md": "e1088cb69b8c3c67256c494063328916c2980ab1aa97a7063de25bab82fdb1e5",
235
235
  "spec/v2/core/oauth.md": "c96483a44b62978c596945fbb7d7c863cf6056cd980fdb4cf4e97555e3e10b72",
236
- "spec/v2/core/overview.md": "4087f171b00a3907551f508fec32fb9b0b3ccec8c0ac1b0c7c6d32cd2c0e3ff8",
237
- "spec/v2/core/packs.md": "b472a583211d466d6ab8e00c414c225b246e678043fe6283a710c899fadde913",
236
+ "spec/v2/core/overview.md": "c8c3bedb8e02dd8ce244b8a7a75d23af1c30dc92a343af912489424a89674d70",
237
+ "spec/v2/core/packs.md": "5929e708bd4e79f6e1beea570af583c80f3b63bb21dec78a5df03c235e73364a",
238
238
  "spec/v2/core/persistence.md": "711874f74cb08b03cd118d683056db10a063517762fcea73ec70feb5d983e6a4",
239
239
  "spec/v2/core/portability.md": "87c4327f674f714fda6217fd79b99d2ba219ad47dc02f9751bb56c200fb2c17a",
240
240
  "spec/v2/core/replay.md": "4d379494057746c6883f6047972e93e621863b998ed291b9a691d3aa57c1ff43",
241
241
  "spec/v2/core/runs.md": "55e21292ae4b41d0d104199a6c2634ecb3f787c4a671f9ebc37084be38ceef03",
242
242
  "spec/v2/core/security-defaults.md": "153884da7a2d54c30c81b5e649cfdef31e151b3a2a19dee1bc5a16c35d60a3aa",
243
+ "spec/v2/core/storage.md": "598ad4f3775c297c698a20daf72a7d15a6836c1231ddbca5961865c704f765b5",
243
244
  "spec/v2/core/tool-catalog.md": "d16a9004418719c48301804aefa4d7ab6f41112a4ed83727f552aa1b92b418b0",
244
245
  "spec/v2/core/versioning.md": "e3b3ab6d76e51035039a32173e9b412628a52c8fe7b16687ff58a2d0d983faa0",
245
- "spec/v2/core/webhooks.md": "6fc2fb7d9a993a682765ebc68e5c5bb215046ee599234ca7a660465279444eff",
246
+ "spec/v2/core/webhooks.md": "d2d33c6be777f217ade3e15dd369849e5c6ce67e1a4417216f0aa6ec5bdecc56",
246
247
  "spec/v2/core/workflow-chain-packs.md": "fdce7a8477e269950a2bac05ee6eddbd66eb0b670b464d00054f7196ec05d29c",
247
248
  "spec/v2/corrections.json": "59f647f4d22477f6c2b06dcf913b682dde5d51dd5e607a5d0cf648ab60864d6e",
248
249
  "spec/v2/corrections.schema.json": "46bbffb954d13bd9995aebc912ceeb2544f7064331abf25fd6ab85c81a5cec94",
249
- "spec/v2/declaration.json": "184b83919e56d2f12bda73c7772905810a441cbab53fc42ad0b3135937fac3e5",
250
+ "spec/v2/declaration.json": "56c85c6d49f93d08d3bd48ccf1c049191cfbc4d4c22a1cd5202c1b6252759aca",
250
251
  "spec/v2/declaration.schema.json": "ef951633e4070899f64828f5cf1b5f4870270a0360f81dbb49b5b4d6cd407550",
251
- "spec/v2/errors.json": "dc1a846abe3e888acb0ce4a33cf9d1fb98e41fcc8b49f42b3682fd65deca2eb2",
252
+ "spec/v2/errors.json": "fa650cbbdf25a140fdaf82ec5269f95b4585ac4bdde1fa6b0b3ffe48a3f7943c",
252
253
  "spec/v2/errors.schema.json": "47404ad53e6147cf9017b813483712466573e419fb33e6c4b6c12d3e7deba1bc",
253
254
  "spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
254
255
  "spec/v2/event-codemap.schema.json": "b173f2a9bcc0bf9b62a474ce3b91e1431d597e64fd1560fc58662cd8606eaf9c",
255
256
  "spec/v2/ext/README.md": "e2731ebb5156ece1840ed3b96e7a347f6345e73071ff4e54df0f21c1585c5027",
256
257
  "spec/v2/ext/a2uiSurface/README.md": "5518c7f355262eb7cc584422f4ff8e548f066b211878f969274a3a578127622d",
257
258
  "spec/v2/ext/brand/README.md": "82989c018d7965bab029bcce7a67b1d76ffc433d08971a4cac91befcccc09438",
258
- "spec/v2/ext/canvas/README.md": "0e91b68566d2be90319feedfaebe2cd2db0bd8f72fb59c958fa723c05e38023f",
259
+ "spec/v2/ext/canvas/README.md": "00ca0856e3a0146f1eeaec87209d450e2900ed2748dc7520cc60250a0d3ffbeb",
259
260
  "spec/v2/ext/chat/README.md": "f59b6706162abbfff96f8bccd4c0e1aeed721047cf62e9af58c875727a38d716",
260
261
  "spec/v2/ext/coordination/README.md": "c7fe0884f52405fdd02c5f9ec309ac6b585685ee06ec5f338fff7acf03c07148",
261
262
  "spec/v2/ext/dataIntegration/README.md": "286dec8aa29e4d3225cbd8b3a361f5a438c3288e759966b9415ecbb99c576e70",
@@ -268,7 +269,7 @@
268
269
  "spec/v2/ext/portability/README.md": "c59423ee446638b748a911b9e97e803c4786157be6120f656f0a060586bc7b82",
269
270
  "spec/v2/ext/provider-idempotency/README.md": "9d1bccef0ec16a19a3370ae79c2f5a1726ce0d1d25a51352907f288a2ccb15d7",
270
271
  "spec/v2/ext/provider-idempotency/registry.json": "5b5fecad604fb4ab38da39f5abe697a4e57b05406c398f8afeb377331b2bd965",
271
- "spec/v2/ext/restTransport/README.md": "a8115faefeab01b7c85d516de60ebfc99b8e89552d16ba654456224518447b28",
272
+ "spec/v2/ext/restTransport/README.md": "c875fd7ae4818a5d5e93ab9b21e569de8700bb07c4dafacd60a46a46e4022ddb",
272
273
  "spec/v2/ext/sandbox-runtime-notes/README.md": "0d1290fb1e20b2e35c0b15051541ab6546e4e2a6f693b4f912cb3f7d6a65e92c",
273
274
  "spec/v2/ext/webResearch/README.md": "b675e6f6646128d781b661f754c2393eed86e5935d16c3a22df582a5ce025b9b",
274
275
  "spec/v2/facets/a2a.schema.json": "b68bf5e29e455e46c2ad7cfcccf5963730ec2310ff9db81884550d8df30fd6ef",
@@ -286,7 +287,7 @@
286
287
  "spec/v2/facets/sandbox.schema.json": "e75f54486d387b2d089791aa93b5093cd1450f1920753a0f97fc23acdfe978ed",
287
288
  "spec/v2/facets/schemaVersions.schema.json": "890d3416c4b66511d51f329abc68e6f467f4338f16807e489fe682999b2b56b9",
288
289
  "spec/v2/facets/supportedEnvelopes.schema.json": "644f22cc2236e30a611b5b7f1ba0458ff1925d68b94c514d9672583224e126bd",
289
- "spec/v2/facets/webhooks.schema.json": "2fac635ee5fbc10a14a1a46cf512a11bac660bfbabe0aea79f6c7b657ecb9e4e",
290
+ "spec/v2/facets/webhooks.schema.json": "54b576f1d150e28e1642693d846ce471c118e9c521bdf3924185305fbd1d0de4",
290
291
  "spec/v2/facets/workflowChainPacks.schema.json": "ea625ce818fbeb746478f00f31f96ee9613d538e4409c258c1bfb517acdeaba9",
291
292
  "spec/v2/harness-trust-anchors.json": "6007b92eae16a070fbc3777424efb0abfe865fda89d096963109b96282b91205",
292
293
  "spec/v2/harness-trust-anchors.schema.json": "372b5d92337c893d3449eff3f6bfd009ac09fdac285296d8bdbe0a08fff9e34c",
@@ -298,9 +299,9 @@
298
299
  "spec/v2/path-manifest.json": "17298a245c5da9a70aa7ab0b7f2db4277e06209d6fcdd7187a8b4cea179c08f3",
299
300
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
300
301
  "spec/v2/profiles.json": "180beb9ef2d161766fa23b2987e7e829851e3d316273147cf6a4a3f324befd6b",
301
- "spec/v2/release.json": "ec99d76b53fba89d3d8788206c649a782774b55acf5284b75cab38b79ecf1d61",
302
+ "spec/v2/release.json": "af448fd044ab5b990a21945905f109dbbb9b0df9ab7f1105e79aa7d1e0f35a33",
302
303
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
303
- "spec/v2/surface-baseline.json": "3d3d0fc7c0b48e7d7339e5d8ada0640487908f37220b2de65ccc9bff093f876a"
304
+ "spec/v2/surface-baseline.json": "2f79e3283946dd8a401db039109d403b9c386e6b91a4780cbcb1440e8d3a6ffe"
304
305
  },
305
- "corpusCommit": "6612868966f2ecb9672d0a64382cb7067491c004"
306
+ "corpusCommit": "bf414c875dba212893f0230d44f2b4a2e226311d"
306
307
  }
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.43.2
4
+ version: 2.44.1
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.43.2
4
+ version: 2.44.1
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.43.2
4
+ version: 2.44.1
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.43.2",
3
+ "version": "2.44.1",
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": {
@@ -5329,6 +5329,11 @@
5329
5329
  "fixed",
5330
5330
  "exponential"
5331
5331
  ]
5332
+ },
5333
+ "maxElapsedMs": {
5334
+ "type": "integer",
5335
+ "minimum": 1,
5336
+ "description": "RFC 0225 — OPTIONAL. The longest, in ms, from a delivery's first attempt starting to its routing to the dead-letter sink when every attempt fails. A host advertising it MUST dead-letter an exhausted delivery within that bound (webhooks.md §Delivery)."
5332
5337
  }
5333
5338
  },
5334
5339
  "description": "spec/v2/core/webhooks.md §Delivery — the policy a host retries a failed attempt under. The webhooks family carries it at v2; `triggerBridge.retryPolicy` is the v1 carrier and stays through the overlap."
@@ -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). 108 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). 111 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": [
@@ -96,6 +96,9 @@
96
96
  "workspace_too_large",
97
97
  "unsupported_media_type",
98
98
  "approval_rejected",
99
+ "node_config_invalid",
100
+ "sandbox_invocation_error",
101
+ "mcp_error",
99
102
  "capability_not_provided",
100
103
  "capability_required",
101
104
  "credential_required",
@@ -369,6 +372,9 @@
369
372
  "workspace_too_large": 413,
370
373
  "unsupported_media_type": 415,
371
374
  "approval_rejected": 422,
375
+ "node_config_invalid": 422,
376
+ "sandbox_invocation_error": 422,
377
+ "mcp_error": 502,
372
378
  "capability_not_provided": 422,
373
379
  "capability_required": 422,
374
380
  "credential_required": 422,
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.43.2"
7
+ "version": "2.44.1"
8
8
  },
9
9
  "note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
10
10
  },
@@ -421,5 +421,5 @@
421
421
  "$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
422
422
  }
423
423
  ],
424
- "digest": "a8b5948aab2aa9da287f28920d6106d784d33e41a441146ee50a5cf79022d6f6"
424
+ "digest": "69235de4e9c3b6575530596ba2539d8f042f5f512a8e179ec5f9b239c3a1463e"
425
425
  }
package/spec/v1/gaps.json CHANGED
@@ -13076,8 +13076,8 @@
13076
13076
  "surface": "No v2 SDK sends the header today (`openwop-sdks`: `sdk/typescript-v2`, `sdk/python-v2`, Go).",
13077
13077
  "witness": "unclassified",
13078
13078
  "requirementId": null,
13079
- "disposition": "transferred",
13080
- "target": "rfc-0219",
13079
+ "disposition": "closed",
13080
+ "target": null,
13081
13081
  "sources": [
13082
13082
  {
13083
13083
  "file": "RFCS/registers/0219-client-version-header.gaps.md",
@@ -13085,6 +13085,40 @@
13085
13085
  }
13086
13086
  ]
13087
13087
  },
13088
+ {
13089
+ "id": "openwop.gap.0219.7",
13090
+ "rfc": "0219",
13091
+ "local": "G7",
13092
+ "section": "§Conformance",
13093
+ "surface": "`openwop.requirement.0219.no-floor-no-refusal` has no positive witness. All three measured hosts (the v2 reference host, MyndHyve, openwop-app) advertise `minClientVersion`, so every committed bundle records the row `inapplicable` with the reason \"this leg is for a host with no floor\".",
13094
+ "witness": "unclassified",
13095
+ "requirementId": null,
13096
+ "disposition": "externally-gated",
13097
+ "target": "host-without-min-client-version",
13098
+ "sources": [
13099
+ {
13100
+ "file": "RFCS/registers/0219-client-version-header.gaps.md",
13101
+ "token": "G7"
13102
+ }
13103
+ ]
13104
+ },
13105
+ {
13106
+ "id": "openwop.gap.0219.8",
13107
+ "rfc": "0219",
13108
+ "local": "G8",
13109
+ "section": "§A / upgrade",
13110
+ "surface": "A browser preflights the new request header. A host whose `Access-Control-Allow-Headers` is an explicit list, and which serves browsers cross-origin, fails every request from a client that sends it. Found at the SDK 2.5.0 release: openwop-app's list omitted it (as it once omitted `OpenWOP-Version`), and so did MyndHyve's public pack reads (fixed in myndhyve#549). v2 says nothing about CORS.",
13111
+ "witness": "unclassified",
13112
+ "requirementId": null,
13113
+ "disposition": "transferred",
13114
+ "target": "openwop#1763",
13115
+ "sources": [
13116
+ {
13117
+ "file": "RFCS/registers/0219-client-version-header.gaps.md",
13118
+ "token": "G8"
13119
+ }
13120
+ ]
13121
+ },
13088
13122
  {
13089
13123
  "id": "openwop.gap.0220.1",
13090
13124
  "rfc": "0220",
@@ -13161,8 +13195,8 @@
13161
13195
  "surface": "`canvas` has no tier-2 path yet. MyndHyve serves the canvas host service (myndhyve #547), but its claim depends on the `vendor.myndhyve.canvas` pack. The only v2-admissible version (1.0.1, `registry/v2/`) is signed with `signing.scheme: ed25519-canonical-json` (RFC 0177 §A), and MyndHyve's pack publish route and resolver do not implement that scheme. The v1-tree 1.0.0 pins `engines.openwop <2.0.0`, which a v2 host MUST refuse. This is a general v2 pack-signing gap at the host, not canvas-specific.",
13162
13196
  "witness": "unclassified",
13163
13197
  "requirementId": null,
13164
- "disposition": "transferred",
13165
- "target": "myndhyve/services/workflow-runtime",
13198
+ "disposition": "closed",
13199
+ "target": null,
13166
13200
  "sources": [
13167
13201
  {
13168
13202
  "file": "RFCS/registers/0220-ext-families-graduate-on-evidence.gaps.md",
@@ -13277,11 +13311,11 @@
13277
13311
  "rfc": "0223",
13278
13312
  "local": "G4",
13279
13313
  "section": "§Implementation notes",
13280
- "surface": "openwop-app records no `action` on single reject or timeout, emits no `interrupt.resolved` on quorum reject, never emits `approval.rejected`, and emits no `node.failed` / `failedNodeId` on either reject path.",
13314
+ "surface": "openwop-app recorded no `action` on single reject or timeout, emitted no `interrupt.resolved` on quorum reject, never emitted `approval.rejected`, and emitted no `node.failed` / `failedNodeId` on either reject path.",
13281
13315
  "witness": "unclassified",
13282
13316
  "requirementId": null,
13283
- "disposition": "externally-gated",
13284
- "target": "openwop-app-followup",
13317
+ "disposition": "closed",
13318
+ "target": null,
13285
13319
  "sources": [
13286
13320
  {
13287
13321
  "file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
@@ -13375,36 +13409,36 @@
13375
13409
  ]
13376
13410
  },
13377
13411
  {
13378
- "id": "openwop.gap.0223.9",
13412
+ "id": "openwop.gap.0223.10",
13379
13413
  "rfc": "0223",
13380
- "local": "G9",
13414
+ "local": "G10",
13381
13415
  "section": "§Conformance",
13382
- "surface": "`openwop.requirement.0223.reject-loopback-reasks` (openwop #1697) has no positive witness on any host. The v2 reference host does not run cycles. MyndHyve runs request-changes loops over condition edges on a successful gate output, and does not route a failed node over `any_failed` (its Cloud Run executor has no `triggerRule` handling), so the row stays `inapplicable` there. openwop-app rejects cycles. The row exists and is negatively controlled: registering the fixture on a host that does not loop records `executed-fail`.",
13416
+ "surface": "`openwop.requirement.0223.timeout-rejects` and `0223.timeout-never-grants` had no certified witness, and have no MyndHyve witness: its `core.approvalGate` has no timeout configuration.",
13383
13417
  "witness": "unclassified",
13384
13418
  "requirementId": null,
13385
- "disposition": "externally-gated",
13386
- "target": "host-routes-failed-gate-over-cycle",
13419
+ "disposition": "closed",
13420
+ "target": null,
13387
13421
  "sources": [
13388
13422
  {
13389
13423
  "file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
13390
- "token": "G9"
13424
+ "token": "G10"
13391
13425
  }
13392
13426
  ]
13393
13427
  },
13394
13428
  {
13395
- "id": "openwop.gap.0223.10",
13429
+ "id": "openwop.gap.0223.11",
13396
13430
  "rfc": "0223",
13397
- "local": "G10",
13431
+ "local": "G11",
13398
13432
  "section": "§Conformance",
13399
- "surface": "`openwop.requirement.0223.timeout-rejects` and `0223.timeout-never-grants` had no certified witness, and have no MyndHyve witness: its `core.approvalGate` has no timeout configuration.",
13433
+ "surface": "*(Renumbered from a second `G9` on 2026-09-28: two rows shared the local ID, so `spec/v1/gaps.json` carried `openwop.gap.0223.9` twice.)* `openwop.requirement.0223.reject-loopback-reasks` (openwop #1697) has no positive witness on any host. The v2 reference host does not run cycles. MyndHyve runs request-changes loops over condition edges on a successful gate output, and does not route a failed node over `any_failed` (its Cloud Run executor has no `triggerRule` handling), so the row stays `inapplicable` there. openwop-app rejects cycles. The row exists and is negatively controlled: registering the fixture on a host that does not loop records `executed-fail`.",
13400
13434
  "witness": "unclassified",
13401
13435
  "requirementId": null,
13402
- "disposition": "closed",
13403
- "target": null,
13436
+ "disposition": "externally-gated",
13437
+ "target": "host-routes-failed-gate-over-cycle",
13404
13438
  "sources": [
13405
13439
  {
13406
13440
  "file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
13407
- "token": "G10"
13441
+ "token": "G11"
13408
13442
  }
13409
13443
  ]
13410
13444
  },
@@ -13442,6 +13476,40 @@
13442
13476
  }
13443
13477
  ]
13444
13478
  },
13479
+ {
13480
+ "id": "openwop.gap.0225.1",
13481
+ "rfc": "0225",
13482
+ "local": "G1",
13483
+ "section": "§Implementation notes",
13484
+ "surface": "No host advertises `retryPolicy.maxElapsedMs` yet, so the new row has no witness.",
13485
+ "witness": "unclassified",
13486
+ "requirementId": null,
13487
+ "disposition": "externally-gated",
13488
+ "target": "host-advertises-max-elapsed",
13489
+ "sources": [
13490
+ {
13491
+ "file": "RFCS/registers/0225-webhook-retry-max-elapsed.gaps.md",
13492
+ "token": "G1"
13493
+ }
13494
+ ]
13495
+ },
13496
+ {
13497
+ "id": "openwop.gap.0226.1",
13498
+ "rfc": "0226",
13499
+ "local": "G1",
13500
+ "section": "§Unresolved questions",
13501
+ "surface": "Whether `mcp_unreachable` (an MCP peer that cannot be reached) needs its own registered code.",
13502
+ "witness": "unclassified",
13503
+ "requirementId": null,
13504
+ "disposition": "closed",
13505
+ "target": null,
13506
+ "sources": [
13507
+ {
13508
+ "file": "RFCS/registers/0226-shared-run-failure-codes.gaps.md",
13509
+ "token": "G1"
13510
+ }
13511
+ ]
13512
+ },
13445
13513
  {
13446
13514
  "id": "openwop.gap.spec.a2a-integration.g1",
13447
13515
  "rfc": "0152",
package/spec/v2/README.md CHANGED
@@ -32,7 +32,7 @@ when v1 ends.
32
32
  | --- | --- |
33
33
  | Foundation | [`overview`](./core/overview.md), [`versioning`](./core/versioning.md), [`headers`](./core/headers.md), [`identity`](./core/identity.md), [`oauth`](./core/oauth.md), [`capabilities`](./core/capabilities.md), [`i18n`](./core/i18n.md) |
34
34
  | Execution | [`runs`](./core/runs.md), [`events`](./core/events.md), [`interrupt`](./core/interrupt.md), [`conversation`](./core/conversation.md), [`persistence`](./core/persistence.md), [`idempotency`](./core/idempotency.md), [`replay`](./core/replay.md) |
35
- | Integration | [`webhooks`](./core/webhooks.md), [`interop`](./core/interop.md), [`host services`](./core/host-services.md), [`tool catalog`](./core/tool-catalog.md), [`portability`](./core/portability.md), [`packs`](./core/packs.md), [`node-pack runtimes`](./core/node-pack-runtimes.md), [`connection packs`](./core/connection-packs.md), [`form-content packs`](./core/form-content-packs.md), [`workflow-chain packs`](./core/workflow-chain-packs.md) |
35
+ | Integration | [`webhooks`](./core/webhooks.md), [`interop`](./core/interop.md), [`host services`](./core/host-services.md), [`storage`](./core/storage.md), [`tool catalog`](./core/tool-catalog.md), [`portability`](./core/portability.md), [`packs`](./core/packs.md), [`node-pack runtimes`](./core/node-pack-runtimes.md), [`connection packs`](./core/connection-packs.md), [`form-content packs`](./core/form-content-packs.md), [`workflow-chain packs`](./core/workflow-chain-packs.md) |
36
36
  | Reliability | [`errors`](./core/errors.md), [`security defaults`](./core/security-defaults.md), [`conformance`](./core/conformance.md) |
37
37
 
38
38
  ## Source-of-truth map
@@ -4,11 +4,11 @@
4
4
 
5
5
  ## Why this exists
6
6
 
7
- Every error a v2 host returns is a row in one registry. A client routes on `error`, never on `message`. A code that is not registered is not a protocol error. The registry is the single source for the envelope schema, the HTTP status and retriability.
7
+ Every error a v2 host returns is a row in one registry. A client routes on `error`, never on `message`. A code that is not registered is not a protocol error.
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 **108** 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 **111** 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.
@@ -47,7 +47,7 @@ The idempotency mismatch code is `idempotency_key_mismatch` only ([idempotency.m
47
47
 
48
48
  ## Codes by HTTP status
49
49
 
50
- Generated from `spec/v2/errors.json` (108 codes; `retriable` and `statusSource` are in the registry).
50
+ Generated from `spec/v2/errors.json` (111 codes; `retriable` and `statusSource` are in the registry).
51
51
 
52
52
  Code | Status
53
53
  --- | ---
@@ -141,10 +141,12 @@ Code | Status
141
141
  `fork_point_invalid` | 422
142
142
  `loop_limit_exceeded` | 422
143
143
  `mcp_mrtr_rounds_exceeded` | 422
144
+ `node_config_invalid` | 422
144
145
  `pack_runtime_requirement_unmet` | 422
145
146
  `recursion_limit_exceeded` | 422
146
147
  `residency_unavailable` | 422
147
148
  `run_timeout` | 422
149
+ `sandbox_invocation_error` | 422
148
150
  `sandbox_memory_exceeded` | 422
149
151
  `sandbox_timeout` | 422
150
152
  `token_budget_exceeded` | 422
@@ -157,6 +159,7 @@ Code | Status
157
159
  `pack_load_failure` | 500
158
160
  `payload_unprojectable` | 500
159
161
  `credential_unavailable` | 501
162
+ `mcp_error` | 502
160
163
  `pack_registry_unreachable` | 503
161
164
  `runner_unavailable` | 503
162
165
 
@@ -1,7 +1,7 @@
1
1
  # Host services
2
2
 
3
3
  > **Status: Stable.**
4
- > **Normative home:** `aiEnvelope`, `promptLibrary`, `agentRuntime`, `mcp`.
4
+ > **Normative home:** `aiEnvelope`, `promptLibrary`, `agentRuntime`, `mcp`, `workspace`.
5
5
 
6
6
  ## Why this exists
7
7
 
@@ -38,4 +38,17 @@ Each rejects only for an unknown `serverId` (`not_found`), an MCP error response
38
38
  - `readResource` resolves to the `ReadResourceResult` unaltered.
39
39
  - `serverHealth` MUST report `reachable`, `unreachable` or `incompatible` from a `server/discover` probe no older than its `ttlMs`, with the `DiscoverResult` when one was received. It MUST NOT report a connection or session state, which MCP 2026-07-28 does not have.
40
40
 
41
- *Sources: RFC 0144.*
41
+ ## `workspace`
42
+
43
+ A host advertising `workspace` keeps agent files (`schemas/v2/workspace-file.schema.json`) scoped to one `{tenant, workspace}`; no protocol path is defined for them. The host:
44
+
45
+ - MUST make each write atomic, bumping `version`, and emit `workspace.updated` on each write or delete; a versioned delete leaves a tombstone;
46
+ - MUST refuse a stale `If-Match` etag with `409 workspace_conflict` (`details.currentVersion`), and content over `maxFileBytes` with `workspace_too_large`;
47
+ - with `versioned`, MUST serve the latest and any retained version, retaining best-effort up to `maxVersions`; `maxFiles` caps the file count;
48
+ - MUST give a run, through `ctx.workspace`, an immutable snapshot taken at `run.started`, so a replay on any host sees the same files; its writes reach later runs only;
49
+ - MUST derive the scope from the authenticated identity and MUST NOT return or disclose another scope's file; `404` MAY stand for `403` (invariant `workspace-cross-tenant-isolation`);
50
+ - MUST persist `[REDACTED:<secretId>]` for any value the run's vault resolved at user, tenant or run scope (longest first, 8-character minimum).
51
+
52
+ A workflow calling `ctx.workspace` MUST NOT register on a host without the family. The memory-index manifest is the workspace file `MEMORY-INDEX.json`.
53
+
54
+ *Sources: RFCs 0059, 0144.*
@@ -1,7 +1,7 @@
1
1
  # Internationalization
2
2
 
3
3
  > **Status: Stable.**
4
- > **Normative home:** `i18n`.
4
+ > **Normative home:** `i18n`, `content`.
5
5
 
6
6
  ## Why this exists
7
7
 
@@ -57,8 +57,18 @@ A host that negotiates locale SHOULD advertise `i18n`. A host advertising it hon
57
57
 
58
58
  Locale is chosen at request time. `Content-Language` is request-scoped and not recorded in the event log, so a replay re-projects the recorded text and does not re-render it. A fork localizes by its own request's `Accept-Language`, not the parent run's.
59
59
 
60
+ ## Localized content
61
+
62
+ A host advertising `content` serves authored pages (`schemas/v2/localized-content-*.schema.json`) on the `/content/*` operations. A section is one record, base `data` plus sparse `localizations`, never one per locale.
63
+
64
+ - A host advertising `content` MUST advertise `i18n`, with `content.baseLocale` equal to `i18n.defaultLocale` and every locale in `baseLocale` ∪ `supportedLocales` also in `i18n.supportedLocales`. It SHOULD advertise only locales it delivers, in the case §Language tags recommends.
65
+ - Delivery negotiates locale only by `Accept-Language` (§Fallback); a `?locale=` parameter is not defined. A section negotiated to `baseLocale` resolves to `data`; otherwise to `data` shallowly overlaid by the first `localizations` entry for the exact tag, its `ll-Ssss` script family, or its language, else `data` alone. Every host MUST resolve identically.
66
+ - A write names its locale in the body: `baseLocale` upserts `data`, any other its overlay.
67
+ - Publication is atomic across locales. Public delivery MUST serve published content only and MUST NOT cache a draft in a shared entry.
68
+ - Every read and write MUST be tenant-scoped; another tenant's id MUST get the same `404` as a missing one. Anonymous tenant resolution is host-defined, so identical resolution holds per resolved `(tenant, locale)`.
69
+
60
70
  ## Clients
61
71
 
62
72
  A client that wants localized content MUST check discovery for `i18n` before sending `Accept-Language`. A host that does not advertise it ignores the header and returns its default locale.
63
73
 
64
- *Sources: RFC 0206.*
74
+ *Sources: RFCs 0103, 0206.*
@@ -124,7 +124,11 @@ A `reject` exits the suspend. The host MUST record `action: "reject"` and `decis
124
124
  - A rejected gate is a failed source. It MUST NOT satisfy an `all_success`, `any_success` or `none_failed` edge. The run continues past it only over an edge whose `triggerRule` admits a failed source (`all_complete` or `any_failed`).
125
125
  - When no such edge exists, the run MUST terminate `failed` with `run.failed.error.code` `approval_rejected` and `failedNodeId` naming the gate.
126
126
  - The gate resolves rejected on one eligible `reject` under `single-veto`, or when rejects exceed half of `requiredApprovals` under `majority`. A vote that does not decide the gate MUST NOT emit `interrupt.resolved`.
127
- - When a non-zero `timeoutMs` elapses with no resolution, the host MUST resolve the gate rejected, recording `action: "timeout"`, `decision: "rejected"` and `reason: "timeout"`, whatever `onTimeout` holds, and MUST apply the rules above. A timeout MUST NOT grant a gate. A host MUST treat `onTimeout: "approve"` as `reject` and SHOULD NOT emit it. `escalate` MAY notify a host-defined target but MUST NOT extend or grant the gate. A host MUST NOT accept `timeout` on a resume request.
127
+ - When a non-zero `timeoutMs` elapses with no resolution:
128
+ - the host MUST resolve the gate rejected, recording `action: "timeout"`, `decision: "rejected"` and `reason: "timeout"`, whatever `onTimeout` holds, and MUST apply the rules above;
129
+ - a timeout MUST NOT grant a gate. A host MUST treat `onTimeout: "approve"` as `reject` and SHOULD NOT emit it;
130
+ - `escalate` MAY notify a host-defined target but MUST NOT extend or grant the gate;
131
+ - a host MUST NOT accept `timeout` on a resume request.
128
132
  - On replay the failure MUST be derived from the recorded `interrupt.resolved`, never re-decided.
129
133
 
130
134
  ## Approver enforcement
@@ -16,7 +16,7 @@
16
16
  6. [`events.md`](events.md), [`errors.md`](errors.md), [`headers.md`](headers.md) — event `oneOf`, payload and error registries, `OpenWOP-*` headers
17
17
  7. [`interrupt.md`](interrupt.md), [`idempotency.md`](idempotency.md), [`replay.md`](replay.md), [`conversation.md`](conversation.md) — run-side surfaces
18
18
  8. [`persistence.md`](persistence.md) — era key, v1 reader rule, pinned runs
19
- 9. [`security-defaults.md`](security-defaults.md), [`webhooks.md`](webhooks.md), [`interop.md`](interop.md), [`host-services.md`](host-services.md), [`tool-catalog.md`](tool-catalog.md), [`i18n.md`](i18n.md), [`portability.md`](portability.md) — surface obligations, signatures, A2A and MCP, host services, locale, estate export
19
+ 9. [`security-defaults.md`](security-defaults.md), [`webhooks.md`](webhooks.md), [`interop.md`](interop.md), [`host-services.md`](host-services.md), [`storage.md`](storage.md), [`tool-catalog.md`](tool-catalog.md), [`i18n.md`](i18n.md), [`portability.md`](portability.md) — surface obligations, signatures, A2A and MCP, host services, storage, locale, estate export
20
20
  10. [`packs.md`](packs.md), [`node-pack-runtimes.md`](node-pack-runtimes.md), [`connection-packs.md`](connection-packs.md), [`form-content-packs.md`](form-content-packs.md), [`workflow-chain-packs.md`](workflow-chain-packs.md) — pack identity, engines ceiling
21
21
  11. [`conformance.md`](conformance.md) — requirement ids, witness classes, bundle v3, seams profile
22
22
 
@@ -1,7 +1,7 @@
1
1
  # Packs
2
2
 
3
3
  > **Status: Stable.**
4
- > **Normative home:** `packs`.
4
+ > **Normative home:** `packs`, `uiPlugins`.
5
5
 
6
6
  ## Why this exists
7
7
 
@@ -113,9 +113,24 @@ A registry MUST validate submissions against vendored copies of these schemas pi
113
113
  | `pack_peer_dependency_undefined` | a peer-dependency key is not a declaration-file key or an overlap alias |
114
114
  | `pack_signature_invalid` | the signature, key, or namespace check fails |
115
115
 
116
+ ## Front-end plugin packs
117
+
118
+ A `frontend-plugin` pack (`schemas/v2/frontend-plugin-manifest.schema.json`) ships opaque UI bundles that reach the host only over `ui-plugin/1` (`schemas/v2/ui-plugin-message.schema.json`); both schemas' rules bind. A host advertising `uiPlugins`:
119
+
120
+ - MUST verify the pack signature before loading, failing closed;
121
+ - MUST run every entry sandboxed from host context, DOM, origin storage and credentials, whatever `uiPlugins.isolation` names; never in-process, same-origin or federated (invariant `frontend-plugin-isolation`);
122
+ - MUST serve a deny-egress policy apart from declared `connectSrc` (invariant `frontend-plugin-egress`), and let no BYOK material cross the boundary (invariant `frontend-plugin-no-byok`);
123
+ - MUST ignore a message whose version tag it does not know, and refuse a method outside both allowlists with `method_not_allowed`, authorizing every call itself;
124
+ - with `artifact.write`, MUST return an opaque `version` from each read and write and refuse a stale one with `artifact_conflict`, persisting nothing;
125
+ - MUST treat a plugin needing an unadvertised `surfaces` or `hostApi` entry as inert there, not an error.
126
+
127
+ A host without `uiPlugins` MUST reject the pack and render its own way.
128
+
129
+ A breaking method change is `ui-plugin/2`. `host.announce` MUST be length-capped (SHOULD ≤ 400 characters) and SHOULD be rate-limited; `host.documentChanged` SHOULD be debounced, and a plugin MUST treat the latest as authoritative and tolerate unknown `host.selectionChanged` kinds. `maxEntryBytes` caps an entry bundle.
130
+
116
131
  ## During the v1 overlap
117
132
 
118
133
  - The v1 registry tree is frozen through the overlap, behind the v2 tree.
119
134
  - `testMode` advertises the v1 `/v1/packs-test/*` mirror, a conformance seam ([conformance.md §"The seams profile"](conformance.md)). It remains advertisable through the overlap and is removed at 3.0.
120
135
 
121
- *Sources: RFCs 0177, 0212, 0222.*
136
+ *Sources: RFCs 0117, 0119, 0130, 0177, 0212, 0222.*
@@ -0,0 +1,73 @@
1
+ # Storage
2
+
3
+ > **Status: Stable.**
4
+ > **Normative home:** `fs`, `kvStorage`, `tableStorage`, `sql`, `nosql`, `vectorStore`, `searchIndex`, `blobStorage`, `cache`.
5
+
6
+ ## Why this exists
7
+
8
+ A node pack keeps files, records and indexes in storage services the host provides, reached through `ctx` ([host-services.md](host-services.md)). This document states what a host takes on by advertising one.
9
+
10
+ ## Operations
11
+
12
+ A host advertising a family MUST expose each of its operations to pack code, returning at least the fields shown; it MAY return more. An operation marked † is required only when the named facet is `true`.
13
+
14
+ | Family | Operations |
15
+ | --- | --- |
16
+ | `fs` (`ctx.fs`) | `read(path) → bytes, contentType?` · `write(path, bytes, contentType?) → path, sizeBytes` · `delete(path) → deleted` · `stat(path) → sizeBytes, modifiedAt, contentType?` · `list(prefix?, cursor?, limit?) → entries[path, sizeBytes], nextCursor?` |
17
+ | `kvStorage` (`ctx.storage.kv`) | `get(key) → value?, expiresAt?` · `put(key, value, ttlSeconds?) → ok` · `delete(key) → deleted` · `list(prefix?, cursor?, limit?) → entries[key], nextCursor?` · † `atomicIncrement(key, delta?) → value` · † `compareAndSwap(key, expectedValue, newValue) → swapped` |
18
+ | `tableStorage` (`ctx.storage.table`) | `createTable(name, schema) → ok` · `insert(table, row) → rowId` · `get(table, rowId) → row?` · `query(table, filter?, cursor?, limit?) → rows, nextCursor?` · `update(table, rowId, patch) → ok` · `delete(table, rowId) → deleted` |
19
+ | `sql` (`ctx.db.sql`) | `query(datasourceId, sql, params) → rows, rowCount` · `execute(datasourceId, sql, params) → rowsAffected` · † `transaction(datasourceId, operations[sql, params]) → committed` |
20
+ | `nosql` (`ctx.db.nosql`) | `insert(datasourceId, collection, doc) → id` · `get(…, id) → doc?` · `query(…, filter, cursor?, limit?) → docs, nextCursor?` · `update(…, id, patch) → ok` · `delete(…, id) → deleted` |
21
+ | `vectorStore` (`ctx.db.vector`) | `upsert(collection, vectors[id, embedding, metadata?]) → upserted` · `query(collection, embedding, k, filter?) → matches[id, score, metadata?]` · `delete(collection, ids) → deleted` |
22
+ | `searchIndex` (`ctx.db.search`) | `index(index, docs[id, fields]) → indexed` · `query(index, q, k?, filter?) → hits[id, score, fields?]` · `delete(index, ids) → deleted` |
23
+ | `blobStorage` (`ctx.storage.blob`) | `put(bucket, key, bytes, contentType?) → url, sizeBytes` · `get(bucket, key) → bytes, contentType?` · `delete(bucket, key) → deleted` · `list(bucket, prefix?, cursor?) → entries[key, sizeBytes], nextCursor?` · † `presign(bucket, key, expiresInSeconds, method) → url, expiresAt` |
24
+ | `cache` (`ctx.storage.cache`) | `get(key) → value?, expiresAt?` · `put(key, value, ttlSeconds) → ok` · `delete(key) → deleted` |
25
+
26
+ The facets are `kvStorage.atomicIncrement` and `kvStorage.compareAndSwap`, `sql.transactions`, and `blobStorage.presignSupported`. `presign` takes `method` `GET` or `PUT`, and `…` in a `nosql` row repeats `datasourceId, collection`.
27
+
28
+ ## Shared rules
29
+
30
+ - **Tenant isolation.** A read for one tenant MUST NOT return data another tenant wrote, even under an identical key or name: `kvStorage` `get` and `list`, `tableStorage` `get` and `query`, `vectorStore` and `searchIndex` `query`, `blobStorage` and `cache` `get`.
31
+ - **Datasources.** `sql` and `nosql` datasources are scoped per tenant, and access to another tenant's datasource MUST be refused.
32
+ - **Backend-invariant.** The operation shapes of `sql` and `nosql` MUST NOT vary with the advertised `drivers`, nor those of `vectorStore` and `searchIndex` with the advertised `backends`. A host MAY back `sql` with any driver it advertises.
33
+ - **Size limits.** A key over `kvStorage.maxKeyBytes`, and a write over `fs.maxFileSizeBytes`, `kvStorage.maxValueBytes`, `blobStorage.maxObjectBytes` or `cache.maxValueBytes`, MUST be refused. A `tableStorage` insert MUST be refused once `maxRowsPerTable` is reached.
34
+ - **Expiry.** `kvStorage` and `cache` MUST honour an entry's expiry, as a read sees it, with at most one second of drift. `maxTtlSeconds` caps `ttlSeconds` for each.
35
+
36
+ What a family advertises also names its targets: `sql.datasources`, `nosql.datasources`, `vectorStore.collections`, `searchIndex.indexes` and `blobStorage.buckets`. `tableStorage` advertises `maxColumnsPerRow`, `indexable` and `fullTextSearch` as limits and features, with no further rule.
37
+
38
+ No error code specific to these families is registered; [errors.md](errors.md) governs the code a refused call carries.
39
+
40
+ ## `fs`
41
+
42
+ - Every `path` MUST be normalized and resolved relative to `fs.sandboxRoot`.
43
+ - A path that escapes the root, whether absolute, through `..` segments or through a symlink, MUST be refused. The host MUST NOT follow such a link partially.
44
+ - A permission denial MUST fail the call, never succeed silently or fall through.
45
+ - A read of a file over `maxFileSizeBytes` MAY fail rather than stream.
46
+ - The `image` (with its `formats`), `pdf` and `transport` (`ftp`, `sftp`, `ssh`) sub-surfaces are optional, and gate the pack delegates that use them.
47
+
48
+ ## `kvStorage`
49
+
50
+ - When `atomicIncrement` is `true`, increments MUST be atomic across concurrent callers.
51
+ - When `compareAndSwap` is `true`, a swap MUST be atomic, with no read-modify-write race. A stale `expectedValue` returns `swapped: false` without mutation.
52
+
53
+ ## `tableStorage`
54
+
55
+ - Rows MUST conform to the table's declared schema: an insert or update whose column types diverge from it MUST be refused.
56
+ - `query` MUST support cursor pagination, and `nextCursor` MUST be opaque and stable across calls.
57
+
58
+ ## `sql` and `nosql`
59
+
60
+ - `sql` MUST be treated as a parametric template: bound values MUST flow through `params`, never through string interpolation. A host SHOULD verify parameter binding before execution, and a pack MUST NOT concatenate user input into `sql`.
61
+ - When `sql.transactions` is `true`, a partial failure inside `transaction` MUST roll back the whole batch.
62
+ - `nosql` filter operators MUST NOT permit injection. Server-side script evaluation, such as MongoDB `$where`, MUST be refused unless an explicit allowlist is configured.
63
+
64
+ ## `vectorStore` and `searchIndex`
65
+
66
+ - `vectorStore`: an `upsert` followed by a `query` with the same embedding MUST return the inserted ids in the top `k` matches when `k` is at least the number inserted.
67
+ - `searchIndex`: an `index` followed by a `query` with a substring of an indexed field MUST return the indexed id with `score` above 0.
68
+
69
+ ## `blobStorage`
70
+
71
+ Presigned URLs MUST expire at the advertised TTL. A presigned request after expiry MUST fail at the storage layer, not after an authorization skip.
72
+
73
+ *Sources: RFCs 0014, 0015, 0016, 0018, 0019.*
@@ -1,7 +1,7 @@
1
1
  # Webhooks
2
2
 
3
3
  > **Status: Stable.**
4
- > **Normative home:** `webhooks`.
4
+ > **Normative home:** `webhooks`, `triggerBridge`.
5
5
 
6
6
  ## Why this exists
7
7
 
@@ -9,7 +9,7 @@ A client registers a URL and an event filter once; the host POSTs matching event
9
9
 
10
10
  ## Surfaces
11
11
 
12
- A host that advertises `webhooks` ([capabilities.md](capabilities.md)) serves `registerWebhook` (`POST /webhooks`) and `unregisterWebhook` (`DELETE /webhooks/{webhookId}`) from `api/v2/openapi.yaml`. The facet (`spec/v2/facets/webhooks.schema.json`) is `{ signatureAlgorithms[] }`, which MUST list `"v1"`.
12
+ A host that advertises `webhooks` ([capabilities.md](capabilities.md)) serves `registerWebhook` (`POST /webhooks`) and `unregisterWebhook` (`DELETE /webhooks/{webhookId}`) from `api/v2/openapi.yaml`. The facet (`spec/v2/facets/webhooks.schema.json`) carries `signatureAlgorithms[]`, which MUST list `"v1"`.
13
13
 
14
14
  | Operation | Request | Response |
15
15
  | --- | --- | --- |
@@ -77,7 +77,7 @@ A subscriber MUST reject an unrecognized `OpenWOP-Signature-Algorithm` value, an
77
77
 
78
78
  Durable delivery is an obligation of the `webhooks` surface ([security-defaults.md](security-defaults.md)). A host MUST:
79
79
 
80
- - retry a failed attempt per its advertised `retryPolicy` (`maxAttempts`, `backoff ∈ none | fixed | exponential`) with backoff between attempts;
80
+ - retry a failed attempt per its advertised `retryPolicy` (`maxAttempts`, `backoff ∈ none | fixed | exponential`, optional `maxElapsedMs`) with backoff between attempts, and when it advertises `maxElapsedMs`, dead-letter an exhausted delivery within that many milliseconds of the first attempt's start;
81
81
  - route a delivery whose retries are exhausted to the dead-letter sink (§Dead letters), rather than drop it;
82
82
  - deliver each matching event at least once; a receiver MAY observe the same event more than once;
83
83
  - not make the start of an attempt to one subscription wait for an attempt to a *different* subscription to finish (answered, failed, or timed out) (§Delivery isolation);
@@ -108,7 +108,7 @@ This sink is the delivery sink; the `deadLetter` family is the run sink and is a
108
108
 
109
109
  ## Replay
110
110
 
111
- A host MUST NOT deliver events a `replay` fork re-emits as fixed history; replay-ness is read from the run, never from the event type (replay.md). A `branch` fork's events are new facts and are delivered.
111
+ A `replay` fork's re-emitted history is never delivered ([replay.md](replay.md) §Suppression); a `branch` fork's events are.
112
112
 
113
113
  ## Egress
114
114
 
@@ -122,6 +122,24 @@ Address classification:
122
122
 
123
123
  At delivery time a host MUST re-resolve the hostname, validate every resolved address against the same denied ranges plus its own denylist, connect to the validated address without re-resolving, and refuse to follow redirects (invariant `webhook-delivery-egress-revalidation`, reference-impl tier). These delivery-time rules bind an A2A push identically (interop.md §"A2A push delivery").
124
124
 
125
+ ## Inbound triggers
126
+
127
+ A host advertising `triggerBridge` runs inbound work through subscriptions (`schemas/v2/trigger-subscription.schema.json`) that are `active`, `paused` (not delivering; a schedule skips ticks), `failed`, or `dead-lettered` (deliveries in the `deadLetter` sink); `subscriptionStates` lists those it implements. On an `active` subscription the host:
128
+
129
+ - with `dedup`, MUST answer a `dedupKey` repeated within retention (at least 24 hours) with the prior `runId`;
130
+ - retries per `retryPolicy`, then dead-letters, starting no run;
131
+ - MUST set the delivery id as `causationId` on `run.started`.
132
+
133
+ A source in `triggerBridge.sources` MUST run through these states and emit `trigger.subscription-state-changed` and `trigger.delivery-attempted`, which MUST NOT carry inbound content or credentials (`schemas/v2/run-event-payloads.schema.json`).
134
+
135
+ With `triggerBridge.ingestion`, each `externalSources` entry MUST turn an external event into a `TriggerEvent` (`schemas/v2/trigger-event.schema.json`, whose rules bind) and start a run. The host:
136
+
137
+ - MUST verify per `verification` before delivery; a failed `required` check dead-letters with reason `signature-invalid`;
138
+ - returns a binding secret or URL once; `stream` and `change` bindings are empty;
139
+ - MUST pass the event only as `ctx.triggerData`, never in an event, and replay it from cache (invariant `trigger-ingestion-content-redaction`);
140
+ - 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`);
141
+ - SHOULD key `stream` by topic, partition and offset, `change` by table and changelog id; a key MUST survive broker redelivery.
142
+
125
143
  See also: events.md, replay.md, persistence.md, security-defaults.md.
126
144
 
127
- *Sources: RFCs 0053, 0165, 0171, 0173, 0176, 0188, 0196, 0201, 0215, 0217.*
145
+ *Sources: RFCs 0053, 0083, 0099, 0127, 0165, 0171, 0173, 0176, 0188, 0196, 0201, 0215, 0217.*
@@ -819,7 +819,7 @@
819
819
  {
820
820
  "key": "fs",
821
821
  "kind": "family",
822
- "normativeText": ["spec/v1/host-capabilities.md"],
822
+ "normativeText": ["spec/v2/core/storage.md"],
823
823
  "anchor": "core",
824
824
  "section": "core/capabilities.md#fs",
825
825
  "peerDependencyId": "fs",
@@ -842,7 +842,7 @@
842
842
  {
843
843
  "key": "kvStorage",
844
844
  "kind": "family",
845
- "normativeText": ["spec/v1/host-capabilities.md"],
845
+ "normativeText": ["spec/v2/core/storage.md"],
846
846
  "anchor": "core",
847
847
  "section": "core/capabilities.md#kvStorage",
848
848
  "peerDependencyId": "kvStorage",
@@ -865,7 +865,7 @@
865
865
  {
866
866
  "key": "tableStorage",
867
867
  "kind": "family",
868
- "normativeText": ["spec/v1/host-capabilities.md"],
868
+ "normativeText": ["spec/v2/core/storage.md"],
869
869
  "anchor": "core",
870
870
  "section": "core/capabilities.md#tableStorage",
871
871
  "peerDependencyId": "tableStorage",
@@ -1162,7 +1162,7 @@
1162
1162
  {
1163
1163
  "key": "triggerBridge",
1164
1164
  "kind": "family",
1165
- "normativeText": ["spec/v1/trigger-bridge.md"],
1165
+ "normativeText": ["spec/v2/core/webhooks.md"],
1166
1166
  "anchor": "core",
1167
1167
  "section": "core/capabilities.md#triggerBridge",
1168
1168
  "peerDependencyId": "triggerBridge",
@@ -1254,7 +1254,7 @@
1254
1254
  {
1255
1255
  "key": "workspace",
1256
1256
  "kind": "family",
1257
- "normativeText": ["spec/v1/agent-workspace.md"],
1257
+ "normativeText": ["spec/v2/core/host-services.md"],
1258
1258
  "anchor": "core",
1259
1259
  "section": "core/capabilities.md#workspace",
1260
1260
  "peerDependencyId": "workspace",
@@ -1276,7 +1276,7 @@
1276
1276
  {
1277
1277
  "key": "uiPlugins",
1278
1278
  "kind": "family",
1279
- "normativeText": ["spec/v1/frontend-plugin-packs.md"],
1279
+ "normativeText": ["spec/v2/core/packs.md"],
1280
1280
  "anchor": "core",
1281
1281
  "section": "core/capabilities.md#uiPlugins",
1282
1282
  "peerDependencyId": "uiPlugins",
@@ -1298,7 +1298,7 @@
1298
1298
  {
1299
1299
  "key": "sql",
1300
1300
  "kind": "family",
1301
- "normativeText": ["spec/v1/host-capabilities.md"],
1301
+ "normativeText": ["spec/v2/core/storage.md"],
1302
1302
  "anchor": "core",
1303
1303
  "section": "core/capabilities.md#sql",
1304
1304
  "peerDependencyId": "sql",
@@ -1319,7 +1319,7 @@
1319
1319
  {
1320
1320
  "key": "nosql",
1321
1321
  "kind": "family",
1322
- "normativeText": ["spec/v1/host-capabilities.md"],
1322
+ "normativeText": ["spec/v2/core/storage.md"],
1323
1323
  "anchor": "core",
1324
1324
  "section": "core/capabilities.md#nosql",
1325
1325
  "peerDependencyId": "nosql",
@@ -1339,7 +1339,7 @@
1339
1339
  {
1340
1340
  "key": "vectorStore",
1341
1341
  "kind": "family",
1342
- "normativeText": ["spec/v1/host-capabilities.md"],
1342
+ "normativeText": ["spec/v2/core/storage.md"],
1343
1343
  "anchor": "core",
1344
1344
  "section": "core/capabilities.md#vectorStore",
1345
1345
  "peerDependencyId": "vectorStore",
@@ -1359,7 +1359,7 @@
1359
1359
  {
1360
1360
  "key": "searchIndex",
1361
1361
  "kind": "family",
1362
- "normativeText": ["spec/v1/host-capabilities.md"],
1362
+ "normativeText": ["spec/v2/core/storage.md"],
1363
1363
  "anchor": "core",
1364
1364
  "section": "core/capabilities.md#searchIndex",
1365
1365
  "peerDependencyId": "searchIndex",
@@ -1379,7 +1379,7 @@
1379
1379
  {
1380
1380
  "key": "blobStorage",
1381
1381
  "kind": "family",
1382
- "normativeText": ["spec/v1/host-capabilities.md"],
1382
+ "normativeText": ["spec/v2/core/storage.md"],
1383
1383
  "anchor": "core",
1384
1384
  "section": "core/capabilities.md#blobStorage",
1385
1385
  "peerDependencyId": "blobStorage",
@@ -1400,7 +1400,7 @@
1400
1400
  {
1401
1401
  "key": "cache",
1402
1402
  "kind": "family",
1403
- "normativeText": ["spec/v1/host-capabilities.md"],
1403
+ "normativeText": ["spec/v2/core/storage.md"],
1404
1404
  "anchor": "core",
1405
1405
  "section": "core/capabilities.md#cache",
1406
1406
  "peerDependencyId": "cache",
@@ -1669,7 +1669,7 @@
1669
1669
  {
1670
1670
  "key": "content",
1671
1671
  "kind": "family",
1672
- "normativeText": ["spec/v1/localized-content.md"],
1672
+ "normativeText": ["spec/v2/core/i18n.md"],
1673
1673
  "anchor": "core",
1674
1674
  "section": "core/capabilities.md#content",
1675
1675
  "peerDependencyId": "content",
@@ -1821,8 +1821,8 @@
1821
1821
  "extensionName": "canvas",
1822
1822
  "witness": "claims-check",
1823
1823
  "maturity": {
1824
- "technical": "experimental",
1825
- "adoption": "single-witness"
1824
+ "technical": "stable",
1825
+ "adoption": "multi-witness"
1826
1826
  },
1827
1827
  "facets": [],
1828
1828
  "floorScenarios": [],
@@ -849,9 +849,39 @@
849
849
  "since": "2.43",
850
850
  "source": "RFC 0223; spec/v2/core/interrupt.md §Rejection"
851
851
  },
852
+ {
853
+ "code": "node_config_invalid",
854
+ "meaning": "A node's configuration is missing a required value or holds one the node cannot use, so the node failed.",
855
+ "httpStatus": 422,
856
+ "statusSource": "v2 decision",
857
+ "retriable": false,
858
+ "details": null,
859
+ "since": "2.44",
860
+ "source": "RFC 0226 §A (measured: openwop-app `invalid_config` ×13, MyndHyve `CONFIG_INVALID`)"
861
+ },
862
+ {
863
+ "code": "sandbox_invocation_error",
864
+ "meaning": "A pack node running in the sandbox threw an error outside the canonical sandbox catalog, so the node failed.",
865
+ "httpStatus": 422,
866
+ "statusSource": "v2 decision",
867
+ "retriable": false,
868
+ "details": null,
869
+ "since": "2.44",
870
+ "source": "RFC 0226 §A; spec/v1/host-sample-test-seams.md:340 already names it (the suite's sandbox probe emits it)"
871
+ },
872
+ {
873
+ "code": "mcp_error",
874
+ "meaning": "An MCP server the host called answered with a JSON-RPC error, so the node failed.",
875
+ "httpStatus": 502,
876
+ "statusSource": "v2 decision",
877
+ "retriable": false,
878
+ "details": null,
879
+ "since": "2.44",
880
+ "source": "RFC 0226 §A (a v2 decision: the host acted as a gateway to the MCP peer, whose answer was an error)"
881
+ },
852
882
  {
853
883
  "code": "capability_not_provided",
854
- "meaning": "The host does not provide a capability the request or pack requires.",
884
+ "meaning": "The host does not provide a capability the request or pack requires, including a node type it cannot execute.",
855
885
  "httpStatus": 422,
856
886
  "statusSource": "v1 convention",
857
887
  "retriable": false,
@@ -1,14 +1,14 @@
1
1
  # `canvas` extension
2
2
 
3
- > **Status: Draft.**
3
+ > **Status: Stable.**
4
4
 
5
5
  `canvas` names a host service that reads and writes canvas state. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
6
6
 
7
7
  | Field | Value |
8
8
  | --- | --- |
9
9
  | **witness:** | `claims-check` |
10
- | **technical:** | `experimental` |
11
- | **adoption:** | `single-witness` |
10
+ | **technical:** | `stable` |
11
+ | **adoption:** | `multi-witness` |
12
12
  | **peer-dependency id** | `canvas` |
13
13
  | **advertised as** | `extensions.<org>.canvas` |
14
14
  | **declared facets** | none defined |
@@ -32,7 +32,7 @@ For each coding listed in `contentEncodings`, a request that names only that cod
32
32
 
33
33
  A client MUST NOT infer anything else from the record.
34
34
 
35
- The claim describes what a client receives at the host's advertised base URL, so a CDN or proxy in front of the host is part of it. A front that drops or rewrites a coding the origin produces makes the claim false. This is the most common way it goes wrong in deployment: one host's CDN served `zstd` as identity while its origin produced `zstd`. A host behind a front should list only the codings measured through that front.
35
+ The claim describes what a client receives at the host's advertised base URL, so a CDN or proxy in front of the host is part of it. A front that drops or rewrites a coding the origin produces makes the claim false. A host behind a front should list only the codings measured through that front.
36
36
 
37
37
  ## Conformance
38
38
 
@@ -35,6 +35,11 @@
35
35
  "fixed",
36
36
  "exponential"
37
37
  ]
38
+ },
39
+ "maxElapsedMs": {
40
+ "type": "integer",
41
+ "minimum": 1,
42
+ "description": "RFC 0225 \u2014 OPTIONAL. The longest, in ms, from a delivery's first attempt starting to its routing to the dead-letter sink when every attempt fails. A host advertising it MUST dead-letter an exhausted delivery within that bound (webhooks.md \u00a7Delivery)."
38
43
  }
39
44
  },
40
45
  "description": "spec/v2/core/webhooks.md \u00a7Delivery \u2014 the policy a host retries a failed attempt under. The webhooks family carries it at v2; `triggerBridge.retryPolicy` is the v1 carrier and stays through the overlap."
@@ -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.43.2",
4
- "corpusTag": "v2.43.2",
3
+ "version": "2.44.1",
4
+ "corpusTag": "v2.44.1",
5
5
  "updated": "2026-09-28"
6
6
  }
@@ -4,7 +4,7 @@
4
4
  "schemas/v2/**/*.json",
5
5
  "spec/v2/path-manifest.json"
6
6
  ],
7
- "release": "2.43.2",
7
+ "release": "2.44.1",
8
8
  "kinds": {
9
9
  "union": [
10
10
  "channel",
@@ -18,7 +18,7 @@
18
18
  "type"
19
19
  ]
20
20
  },
21
- "count": 8552,
21
+ "count": 8557,
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\"",
@@ -3521,9 +3521,11 @@
3521
3521
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy/backoff|enum-member|\"none\"",
3522
3522
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy/backoff|type|string",
3523
3523
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy/maxAttempts|type|integer",
3524
+ "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy/maxElapsedMs|type|integer",
3524
3525
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy|closed|true",
3525
3526
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy|property|backoff",
3526
3527
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy|property|maxAttempts",
3528
+ "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy|property|maxElapsedMs",
3527
3529
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy|required|backoff",
3528
3530
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy|required|maxAttempts",
3529
3531
  "schemas/v2/capabilities.schema.json#/webhooks/retryPolicy|type|object",
@@ -5365,8 +5367,10 @@
5365
5367
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"interrupt_token_invalid\"",
5366
5368
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"key_revoked\"",
5367
5369
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"loop_limit_exceeded\"",
5370
+ "schemas/v2/error-envelope.schema.json#/error|enum-member|\"mcp_error\"",
5368
5371
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"mcp_mrtr_rounds_exceeded\"",
5369
5372
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"mock_provider_forbidden\"",
5373
+ "schemas/v2/error-envelope.schema.json#/error|enum-member|\"node_config_invalid\"",
5370
5374
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"not_found\"",
5371
5375
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"oauth_provider_unsupported\"",
5372
5376
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"oauth_scope_unsupported\"",
@@ -5405,6 +5409,7 @@
5405
5409
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"runner_unavailable\"",
5406
5410
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"sandbox_capability_denied\"",
5407
5411
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"sandbox_escape_attempt\"",
5412
+ "schemas/v2/error-envelope.schema.json#/error|enum-member|\"sandbox_invocation_error\"",
5408
5413
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"sandbox_memory_exceeded\"",
5409
5414
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"sandbox_timeout\"",
5410
5415
  "schemas/v2/error-envelope.schema.json#/error|enum-member|\"schedule_horizon_exceeded\"",