@openwop/spec-artifacts 2.43.0 → 2.43.2
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 +47 -47
- package/api/seams-v2.yaml +57 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +1 -1
- package/package.json +1 -1
- package/schemas/v2/run-event-payloads.schema.json +2 -1
- package/schemas/v2/suspend-request.schema.json +2 -2
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/gaps.json +137 -18
- package/spec/v2/core/capabilities.md +1 -1
- package/spec/v2/core/conformance.md +1 -1
- package/spec/v2/core/connection-packs.md +1 -1
- package/spec/v2/core/conversation.md +1 -1
- package/spec/v2/core/errors.md +3 -3
- package/spec/v2/core/events.md +1 -1
- package/spec/v2/core/form-content-packs.md +1 -1
- package/spec/v2/core/idempotency.md +1 -1
- package/spec/v2/core/identity.md +1 -1
- package/spec/v2/core/interop.md +1 -1
- package/spec/v2/core/interrupt.md +12 -9
- package/spec/v2/core/node-pack-runtimes.md +1 -1
- package/spec/v2/core/oauth.md +1 -1
- package/spec/v2/core/overview.md +1 -1
- package/spec/v2/core/packs.md +4 -4
- package/spec/v2/core/persistence.md +1 -1
- package/spec/v2/core/portability.md +1 -1
- package/spec/v2/core/replay.md +4 -4
- package/spec/v2/core/runs.md +5 -3
- package/spec/v2/core/security-defaults.md +1 -1
- package/spec/v2/core/tool-catalog.md +1 -1
- package/spec/v2/core/versioning.md +1 -1
- package/spec/v2/core/webhooks.md +1 -1
- package/spec/v2/core/workflow-chain-packs.md +1 -1
- package/spec/v2/declaration.json +13 -13
- package/spec/v2/ext/brand/README.md +3 -3
- package/spec/v2/ext/canvas/README.md +1 -1
- package/spec/v2/ext/chat/README.md +1 -1
- package/spec/v2/ext/dataIntegration/README.md +3 -3
- package/spec/v2/ext/kanban/README.md +1 -1
- package/spec/v2/ext/knowledge/README.md +1 -1
- package/spec/v2/ext/launchStudio/README.md +3 -3
- package/spec/v2/ext/messaging/README.md +3 -3
- package/spec/v2/ext/restTransport/README.md +3 -1
- package/spec/v2/ext/webResearch/README.md +1 -1
- package/spec/v2/release.json +3 -3
- package/spec/v2/surface-baseline.json +1 -1
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.
|
|
5
|
-
"corpusTag": "v2.43.
|
|
4
|
+
"version": "2.43.2",
|
|
5
|
+
"corpusTag": "v2.43.2",
|
|
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": "
|
|
13
|
-
"api/v2/asyncapi.yaml": "
|
|
14
|
-
"api/v2/openapi.yaml": "
|
|
12
|
+
"api/seams-v2.yaml": "987123ecfbfbc906c5655538b9380021ac0bcbfd93a467a67818e855d624ed0e",
|
|
13
|
+
"api/v2/asyncapi.yaml": "76474704b7a8e829588abec30d31f09e11557ee5daacad301c3be7e77affe7ce",
|
|
14
|
+
"api/v2/openapi.yaml": "f4af9e7fddad438d3a70753af29e5738ea48d15d1abd214a3fbeec97260cea9d",
|
|
15
15
|
"api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
|
|
16
16
|
"schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
|
|
17
17
|
"schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
"schemas/v2/residency.schema.json": "3fd23c9732beb140504e81560fc426eb6764d547e56da5fb92c5a5c7bf04db3a",
|
|
172
172
|
"schemas/v2/run-ancestry-response.schema.json": "334c17f2062dea62726ca1d07b8be3f169cdc422af843c1def5fb317039814c9",
|
|
173
173
|
"schemas/v2/run-diff-response.schema.json": "8bdb2045c274580038bd74781f7d062f5049839797c164a89de4ed89edc53a74",
|
|
174
|
-
"schemas/v2/run-event-payloads.schema.json": "
|
|
174
|
+
"schemas/v2/run-event-payloads.schema.json": "f8518f366ad4379356eaf94063817ea0e75975873b883f75e42d98bef6eb4565",
|
|
175
175
|
"schemas/v2/run-event.schema.json": "2f0d7416bd376c56affe97b6b2b49981532e8e9ff45c0a162cf806c78b3e7fb7",
|
|
176
176
|
"schemas/v2/run-list-response.schema.json": "c2dbc34768dcf64528914a213aa3cb55952e8e3e90a64b04a9423b2a19749d38",
|
|
177
177
|
"schemas/v2/run-options.schema.json": "f0e9f494d80086c2ed2cf9fe87df54e5b4e66601699c4a1089f4edbc7ba58867",
|
|
@@ -183,7 +183,7 @@
|
|
|
183
183
|
"schemas/v2/self-hosted-runner-result-frame.schema.json": "8e739a721f350226f3ffb4af752b4fe0a72016042a7b6f42e16c0487c3c58983",
|
|
184
184
|
"schemas/v2/subject-link.schema.json": "1fc941d6c14af886534009f2ffa6611e2035eb07e30b1df918c50d6bafff026c",
|
|
185
185
|
"schemas/v2/subject.schema.json": "094e981fb20052a911393e219ea5f2065d8b8417b65080a70c5ea99fd960a8fe",
|
|
186
|
-
"schemas/v2/suspend-request.schema.json": "
|
|
186
|
+
"schemas/v2/suspend-request.schema.json": "368d9932efb08f85b4520cac44b3c553876209f55bada93b5fcac93cc890b411",
|
|
187
187
|
"schemas/v2/tool-descriptor.schema.json": "8c98fb5e93bc649dff859d3d1dde8075db929efd6c49c496252d0a88cccc73e1",
|
|
188
188
|
"schemas/v2/trigger-event.schema.json": "710ecca8b3ecdad3a532a96768177f062192b24a589a4f798c7eb24bab64b30a",
|
|
189
189
|
"schemas/v2/trigger-subscription-registration.schema.json": "04bc314a07c7e8b565577cb8df5821d968ce2af915900dfdccd4a24e928d20db",
|
|
@@ -204,49 +204,49 @@
|
|
|
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": "
|
|
207
|
+
"spec/v1/core-standard-manifest.json": "0be2c8da837ddb170866303ab4640c8e8a8b2554d8c2bb9ac3d1bd9780bede5a",
|
|
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": "
|
|
213
|
+
"spec/v1/gaps.json": "7eefa3aa02e978a41e1e5948818961718d23cb0cbe29a4a491524360feb9fd6f",
|
|
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
219
|
"spec/v2/README.md": "4fa067d377580495e60baf08a4eafc3214b8ca48d8fb270bf91fc5066fad7186",
|
|
220
|
-
"spec/v2/core/capabilities.md": "
|
|
221
|
-
"spec/v2/core/conformance.md": "
|
|
222
|
-
"spec/v2/core/connection-packs.md": "
|
|
223
|
-
"spec/v2/core/conversation.md": "
|
|
224
|
-
"spec/v2/core/errors.md": "
|
|
225
|
-
"spec/v2/core/events.md": "
|
|
226
|
-
"spec/v2/core/form-content-packs.md": "
|
|
220
|
+
"spec/v2/core/capabilities.md": "ad728e8a761153b55d036ece55043ff62d0982121e2e629e5e7cdf560fca3c03",
|
|
221
|
+
"spec/v2/core/conformance.md": "0cfceb926eed87055550a5c23e640210c795fc8cf9dd1b2544db0e2b3842c564",
|
|
222
|
+
"spec/v2/core/connection-packs.md": "1ee129d792c537bfe82393ccb92555d8e6ddc342b1aa781a13f101b27ec38171",
|
|
223
|
+
"spec/v2/core/conversation.md": "354fa57c73d11062e523a44aa75a6353c5c81aefaf306d30c42416a228c82c86",
|
|
224
|
+
"spec/v2/core/errors.md": "bcb62944d8a482b1b6d5ac08a692ad7e4aaadf6165746c7ba7fa39157be2a300",
|
|
225
|
+
"spec/v2/core/events.md": "604abb6f9e2259a04103e1cb76d728712c3701c0d84dd915d4dc2949c912ee5e",
|
|
226
|
+
"spec/v2/core/form-content-packs.md": "02931227899676fd4581a27017be2a6c4953904717be9b81c29d12f87ab3917d",
|
|
227
227
|
"spec/v2/core/headers.md": "5cb1624fa63acc81992b6a6d842ec392cf7271aaf2f65d1f83c8c4fa286e6730",
|
|
228
228
|
"spec/v2/core/host-services.md": "15923cceb95cba148a32e0944f6a2d1d25e9cc36b0c169b67ee42d483bcac800",
|
|
229
229
|
"spec/v2/core/i18n.md": "846c6d2878fc8454c2ae0a1576f6b6e6c8958d47187a6c96cc5826ca3c3e2e91",
|
|
230
|
-
"spec/v2/core/idempotency.md": "
|
|
231
|
-
"spec/v2/core/identity.md": "
|
|
232
|
-
"spec/v2/core/interop.md": "
|
|
233
|
-
"spec/v2/core/interrupt.md": "
|
|
234
|
-
"spec/v2/core/node-pack-runtimes.md": "
|
|
235
|
-
"spec/v2/core/oauth.md": "
|
|
236
|
-
"spec/v2/core/overview.md": "
|
|
237
|
-
"spec/v2/core/packs.md": "
|
|
238
|
-
"spec/v2/core/persistence.md": "
|
|
239
|
-
"spec/v2/core/portability.md": "
|
|
240
|
-
"spec/v2/core/replay.md": "
|
|
241
|
-
"spec/v2/core/runs.md": "
|
|
242
|
-
"spec/v2/core/security-defaults.md": "
|
|
243
|
-
"spec/v2/core/tool-catalog.md": "
|
|
244
|
-
"spec/v2/core/versioning.md": "
|
|
245
|
-
"spec/v2/core/webhooks.md": "
|
|
246
|
-
"spec/v2/core/workflow-chain-packs.md": "
|
|
230
|
+
"spec/v2/core/idempotency.md": "2084d756789c1faf5121593fb39e67ca36a4c227178e175004742e403178ea49",
|
|
231
|
+
"spec/v2/core/identity.md": "2dceb1c2697015e4a4fa8a9b28f4fbd25fa44a76ca5a919c752e2a8163c819db",
|
|
232
|
+
"spec/v2/core/interop.md": "e72e25dff864c83b2980d7366b34054cffa072af0225821199f260f6228d260e",
|
|
233
|
+
"spec/v2/core/interrupt.md": "2c8a4026930ec40ba47d7415dd02b6eda997a03d7a084e5084fec6f1261aba1c",
|
|
234
|
+
"spec/v2/core/node-pack-runtimes.md": "e1088cb69b8c3c67256c494063328916c2980ab1aa97a7063de25bab82fdb1e5",
|
|
235
|
+
"spec/v2/core/oauth.md": "c96483a44b62978c596945fbb7d7c863cf6056cd980fdb4cf4e97555e3e10b72",
|
|
236
|
+
"spec/v2/core/overview.md": "4087f171b00a3907551f508fec32fb9b0b3ccec8c0ac1b0c7c6d32cd2c0e3ff8",
|
|
237
|
+
"spec/v2/core/packs.md": "b472a583211d466d6ab8e00c414c225b246e678043fe6283a710c899fadde913",
|
|
238
|
+
"spec/v2/core/persistence.md": "711874f74cb08b03cd118d683056db10a063517762fcea73ec70feb5d983e6a4",
|
|
239
|
+
"spec/v2/core/portability.md": "87c4327f674f714fda6217fd79b99d2ba219ad47dc02f9751bb56c200fb2c17a",
|
|
240
|
+
"spec/v2/core/replay.md": "4d379494057746c6883f6047972e93e621863b998ed291b9a691d3aa57c1ff43",
|
|
241
|
+
"spec/v2/core/runs.md": "55e21292ae4b41d0d104199a6c2634ecb3f787c4a671f9ebc37084be38ceef03",
|
|
242
|
+
"spec/v2/core/security-defaults.md": "153884da7a2d54c30c81b5e649cfdef31e151b3a2a19dee1bc5a16c35d60a3aa",
|
|
243
|
+
"spec/v2/core/tool-catalog.md": "d16a9004418719c48301804aefa4d7ab6f41112a4ed83727f552aa1b92b418b0",
|
|
244
|
+
"spec/v2/core/versioning.md": "e3b3ab6d76e51035039a32173e9b412628a52c8fe7b16687ff58a2d0d983faa0",
|
|
245
|
+
"spec/v2/core/webhooks.md": "6fc2fb7d9a993a682765ebc68e5c5bb215046ee599234ca7a660465279444eff",
|
|
246
|
+
"spec/v2/core/workflow-chain-packs.md": "fdce7a8477e269950a2bac05ee6eddbd66eb0b670b464d00054f7196ec05d29c",
|
|
247
247
|
"spec/v2/corrections.json": "59f647f4d22477f6c2b06dcf913b682dde5d51dd5e607a5d0cf648ab60864d6e",
|
|
248
248
|
"spec/v2/corrections.schema.json": "46bbffb954d13bd9995aebc912ceeb2544f7064331abf25fd6ab85c81a5cec94",
|
|
249
|
-
"spec/v2/declaration.json": "
|
|
249
|
+
"spec/v2/declaration.json": "184b83919e56d2f12bda73c7772905810a441cbab53fc42ad0b3135937fac3e5",
|
|
250
250
|
"spec/v2/declaration.schema.json": "ef951633e4070899f64828f5cf1b5f4870270a0360f81dbb49b5b4d6cd407550",
|
|
251
251
|
"spec/v2/errors.json": "dc1a846abe3e888acb0ce4a33cf9d1fb98e41fcc8b49f42b3682fd65deca2eb2",
|
|
252
252
|
"spec/v2/errors.schema.json": "47404ad53e6147cf9017b813483712466573e419fb33e6c4b6c12d3e7deba1bc",
|
|
@@ -254,23 +254,23 @@
|
|
|
254
254
|
"spec/v2/event-codemap.schema.json": "b173f2a9bcc0bf9b62a474ce3b91e1431d597e64fd1560fc58662cd8606eaf9c",
|
|
255
255
|
"spec/v2/ext/README.md": "e2731ebb5156ece1840ed3b96e7a347f6345e73071ff4e54df0f21c1585c5027",
|
|
256
256
|
"spec/v2/ext/a2uiSurface/README.md": "5518c7f355262eb7cc584422f4ff8e548f066b211878f969274a3a578127622d",
|
|
257
|
-
"spec/v2/ext/brand/README.md": "
|
|
258
|
-
"spec/v2/ext/canvas/README.md": "
|
|
259
|
-
"spec/v2/ext/chat/README.md": "
|
|
257
|
+
"spec/v2/ext/brand/README.md": "82989c018d7965bab029bcce7a67b1d76ffc433d08971a4cac91befcccc09438",
|
|
258
|
+
"spec/v2/ext/canvas/README.md": "0e91b68566d2be90319feedfaebe2cd2db0bd8f72fb59c958fa723c05e38023f",
|
|
259
|
+
"spec/v2/ext/chat/README.md": "f59b6706162abbfff96f8bccd4c0e1aeed721047cf62e9af58c875727a38d716",
|
|
260
260
|
"spec/v2/ext/coordination/README.md": "c7fe0884f52405fdd02c5f9ec309ac6b585685ee06ec5f338fff7acf03c07148",
|
|
261
|
-
"spec/v2/ext/dataIntegration/README.md": "
|
|
261
|
+
"spec/v2/ext/dataIntegration/README.md": "286dec8aa29e4d3225cbd8b3a361f5a438c3288e759966b9415ecbb99c576e70",
|
|
262
262
|
"spec/v2/ext/entities/README.md": "956d4a9a2aedb8cb9c79ce8145580480920474cc6943f0e33ede32d7b20414dc",
|
|
263
263
|
"spec/v2/ext/grpc-transport/README.md": "6ba378e3c6d1f2e3269b392cfdf0c40565ee9bfa259d1baaa9ee1d350e38e792",
|
|
264
|
-
"spec/v2/ext/kanban/README.md": "
|
|
265
|
-
"spec/v2/ext/knowledge/README.md": "
|
|
266
|
-
"spec/v2/ext/launchStudio/README.md": "
|
|
267
|
-
"spec/v2/ext/messaging/README.md": "
|
|
264
|
+
"spec/v2/ext/kanban/README.md": "bfc386dc0f874a4afa1e3ec6a2f99084b547dcce9bd363da3b8ebd8786b9c184",
|
|
265
|
+
"spec/v2/ext/knowledge/README.md": "cbe1f945a757791dedac0fd542a68c86c5b457778b831d58d9ae44a2baa270f2",
|
|
266
|
+
"spec/v2/ext/launchStudio/README.md": "a941ef1d2401438a412eaea48d2d6ca807a032b44ea08719fea33120daf088a0",
|
|
267
|
+
"spec/v2/ext/messaging/README.md": "949f350e35294f52ad490e42699f8c560cd154549516fbaa1805f06312b7f342",
|
|
268
268
|
"spec/v2/ext/portability/README.md": "c59423ee446638b748a911b9e97e803c4786157be6120f656f0a060586bc7b82",
|
|
269
269
|
"spec/v2/ext/provider-idempotency/README.md": "9d1bccef0ec16a19a3370ae79c2f5a1726ce0d1d25a51352907f288a2ccb15d7",
|
|
270
270
|
"spec/v2/ext/provider-idempotency/registry.json": "5b5fecad604fb4ab38da39f5abe697a4e57b05406c398f8afeb377331b2bd965",
|
|
271
|
-
"spec/v2/ext/restTransport/README.md": "
|
|
271
|
+
"spec/v2/ext/restTransport/README.md": "a8115faefeab01b7c85d516de60ebfc99b8e89552d16ba654456224518447b28",
|
|
272
272
|
"spec/v2/ext/sandbox-runtime-notes/README.md": "0d1290fb1e20b2e35c0b15051541ab6546e4e2a6f693b4f912cb3f7d6a65e92c",
|
|
273
|
-
"spec/v2/ext/webResearch/README.md": "
|
|
273
|
+
"spec/v2/ext/webResearch/README.md": "b675e6f6646128d781b661f754c2393eed86e5935d16c3a22df582a5ce025b9b",
|
|
274
274
|
"spec/v2/facets/a2a.schema.json": "b68bf5e29e455e46c2ad7cfcccf5963730ec2310ff9db81884550d8df30fd6ef",
|
|
275
275
|
"spec/v2/facets/aiProviders.schema.json": "81fb39b6698564d9d07a0d10525ecb6360c152fe3f3a5ea0439112509ca130e2",
|
|
276
276
|
"spec/v2/facets/auditLogIntegrity.schema.json": "9a7f81320c8f940c6f4129bc7dd895a4063231c5458a717a08c2cbf9bb886c46",
|
|
@@ -298,9 +298,9 @@
|
|
|
298
298
|
"spec/v2/path-manifest.json": "17298a245c5da9a70aa7ab0b7f2db4277e06209d6fcdd7187a8b4cea179c08f3",
|
|
299
299
|
"spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
|
|
300
300
|
"spec/v2/profiles.json": "180beb9ef2d161766fa23b2987e7e829851e3d316273147cf6a4a3f324befd6b",
|
|
301
|
-
"spec/v2/release.json": "
|
|
301
|
+
"spec/v2/release.json": "ec99d76b53fba89d3d8788206c649a782774b55acf5284b75cab38b79ecf1d61",
|
|
302
302
|
"spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
|
|
303
|
-
"spec/v2/surface-baseline.json": "
|
|
303
|
+
"spec/v2/surface-baseline.json": "3d3d0fc7c0b48e7d7339e5d8ada0640487908f37220b2de65ccc9bff093f876a"
|
|
304
304
|
},
|
|
305
|
-
"corpusCommit": "
|
|
305
|
+
"corpusCommit": "6612868966f2ecb9672d0a64382cb7067491c004"
|
|
306
306
|
}
|
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.
|
|
4
|
+
version: 2.43.2
|
|
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.
|
|
@@ -801,6 +801,62 @@ paths:
|
|
|
801
801
|
$ref: '#/components/responses/ValidationError'
|
|
802
802
|
'401':
|
|
803
803
|
$ref: '#/components/responses/Unauthenticated'
|
|
804
|
+
/conformance/seams/sample/webhooks/rotation-overlap:
|
|
805
|
+
post:
|
|
806
|
+
tags:
|
|
807
|
+
- Seams
|
|
808
|
+
operationId: shortenRotationOverlap
|
|
809
|
+
summary: Shorten the rotation overlap in progress on one subscription — RFC 0201 §E.20 witness
|
|
810
|
+
description: 'Sets the subscription''s `previousSecretExpiresAt` to the time the request was received plus `overlapSeconds`,
|
|
811
|
+
and reports the stored value. The seam MUST write the same stored expiry `rotateWebhookSecret` wrote and the production
|
|
812
|
+
signer reads; the signer MUST NOT branch on the seam, so which secret signs after the new expiry is production''s
|
|
813
|
+
decision. It changes only the overlap in progress and MUST NOT lengthen it: an expiry at or after the current one,
|
|
814
|
+
no overlap in progress, or a subscription that did not opt into `standard-webhooks-1` answers `400 validation_error`.
|
|
815
|
+
Tenant checks are those of `rotateWebhookSecret` (`403 id_tenant_mismatch` before the lookup; `404` when unknown).
|
|
816
|
+
OPTIONAL, and never served outside the seams profile; consumed by `v2-webhook-secret-rotation` when the advertised
|
|
817
|
+
overlap outlasts the wait cap. An unserved seam leaves that leg a partial witness, never `blocked`.'
|
|
818
|
+
requestBody:
|
|
819
|
+
required: true
|
|
820
|
+
content:
|
|
821
|
+
application/json:
|
|
822
|
+
schema:
|
|
823
|
+
type: object
|
|
824
|
+
additionalProperties: false
|
|
825
|
+
required:
|
|
826
|
+
- webhookId
|
|
827
|
+
- overlapSeconds
|
|
828
|
+
properties:
|
|
829
|
+
webhookId:
|
|
830
|
+
$ref: ../schemas/v2/ids.schema.json#/$defs/subscriptionId
|
|
831
|
+
overlapSeconds:
|
|
832
|
+
type: integer
|
|
833
|
+
minimum: 1
|
|
834
|
+
maximum: 60
|
|
835
|
+
responses:
|
|
836
|
+
'200':
|
|
837
|
+
description: The overlap is shortened.
|
|
838
|
+
content:
|
|
839
|
+
application/json:
|
|
840
|
+
schema:
|
|
841
|
+
type: object
|
|
842
|
+
additionalProperties: false
|
|
843
|
+
required:
|
|
844
|
+
- webhookId
|
|
845
|
+
- previousSecretExpiresAt
|
|
846
|
+
properties:
|
|
847
|
+
webhookId:
|
|
848
|
+
$ref: ../schemas/v2/ids.schema.json#/$defs/subscriptionId
|
|
849
|
+
previousSecretExpiresAt:
|
|
850
|
+
type: string
|
|
851
|
+
format: date-time
|
|
852
|
+
'400':
|
|
853
|
+
$ref: '#/components/responses/ValidationError'
|
|
854
|
+
'401':
|
|
855
|
+
$ref: '#/components/responses/Unauthenticated'
|
|
856
|
+
'403':
|
|
857
|
+
$ref: '#/components/responses/Forbidden'
|
|
858
|
+
'404':
|
|
859
|
+
$ref: '#/components/responses/NotFound'
|
|
804
860
|
/conformance/seams/sample/webhooks/receive:
|
|
805
861
|
post:
|
|
806
862
|
tags:
|
package/api/v2/asyncapi.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
asyncapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: OpenWOP v2 event streams
|
|
4
|
-
version: 2.43.
|
|
4
|
+
version: 2.43.2
|
|
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`.
|
package/api/v2/openapi.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
openapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: OpenWOP v2 API
|
|
4
|
-
version: 2.43.
|
|
4
|
+
version: 2.43.2
|
|
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.
|
|
3
|
+
"version": "2.43.2",
|
|
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": {
|
|
@@ -948,7 +948,8 @@
|
|
|
948
948
|
"properties": {
|
|
949
949
|
"code": {
|
|
950
950
|
"type": "string",
|
|
951
|
-
"minLength": 1
|
|
951
|
+
"minLength": 1,
|
|
952
|
+
"description": "A registered code from spec/v2/errors.json or a vendor code (errors.md §The registry, corrected by openwop#1698): the producer rule binds run.failed, node.failed and the snapshot error exactly as it binds an error response. Kept an open string on purpose — a consumer MUST accept an unknown code (overview.md §0) — so this schema does not enforce the rule; the suite's event-code-registered leg does."
|
|
952
953
|
},
|
|
953
954
|
"message": {
|
|
954
955
|
"type": "string",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
},
|
|
28
28
|
"key": {
|
|
29
29
|
"type": "string",
|
|
30
|
-
"description": "
|
|
30
|
+
"description": "The deterministic re-entry key of ONE invocation of an interrupt (interrupt.md §Re-entry and resume values; corrected 2026-09-28 by openwop#1697). A host MUST derive it from at least the run, the node and the node's visit index; the spelling is host-defined. Recommended: ${runId}:${nodeId}:${interruptCount}, where interruptCount is the visit index — the number of interrupts this node raised in this run whose resolution was consumed before the current execution of the node began (plus an ordinal when one execution raises several). A replay or recovery of the same execution re-derives the same key and returns the recorded resume value; a later execution of the node (a loop back over an edge) derives a new key and raises a new interrupt.requested.",
|
|
31
31
|
"minLength": 1,
|
|
32
32
|
"maxLength": 256
|
|
33
33
|
},
|
|
@@ -299,7 +299,7 @@
|
|
|
299
299
|
"approve",
|
|
300
300
|
"escalate"
|
|
301
301
|
],
|
|
302
|
-
"description": "RFC 0186 §A.3 — the
|
|
302
|
+
"description": "RFC 0186 §A.3, corrected by RFC 0223 (openwop#1696) — a hint recorded with the gate; it does not choose the outcome. Whatever it holds, when a non-zero `timeoutMs` elapses with no resolution the host MUST resolve the gate rejected (`action: timeout`, `decision: rejected`, `reason: timeout`) and the node and run fail with `approval_rejected` unless an edge routes the failure (interrupt.md §Rejection). A timeout never grants a gate: a host MUST treat `approve` as `reject` and SHOULD NOT emit it (RFC 0093 ruled fail-open non-conformant; the value stays in the enum only so recorded payloads validate). `escalate` MAY notify a host-defined target but MUST NOT extend or grant the gate. Absent means `reject`. A `timeoutMs` of `0` means no timer. Two production hosts recorded this as a bare key on `approval.requested` (280 rows on one) before the seat existed. No JSON-Schema `default` is declared, because a validator that fills defaults would write a value the host never recorded."
|
|
303
303
|
},
|
|
304
304
|
"description": {
|
|
305
305
|
"type": "string"
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"provenance": {
|
|
5
5
|
"suite": {
|
|
6
6
|
"package": "@openwop/openwop-conformance",
|
|
7
|
-
"version": "2.43.
|
|
7
|
+
"version": "2.43.2"
|
|
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": "
|
|
424
|
+
"digest": "a8b5948aab2aa9da287f28920d6106d784d33e41a441146ee50a5cf79022d6f6"
|
|
425
425
|
}
|
package/spec/v1/gaps.json
CHANGED
|
@@ -7271,6 +7271,23 @@
|
|
|
7271
7271
|
}
|
|
7272
7272
|
]
|
|
7273
7273
|
},
|
|
7274
|
+
{
|
|
7275
|
+
"id": "openwop.gap.0140.10",
|
|
7276
|
+
"rfc": "0140",
|
|
7277
|
+
"local": "G10",
|
|
7278
|
+
"section": "§Conformance",
|
|
7279
|
+
"surface": "`openwop.requirement.replay.suppression-execution-ordinal` (openwop#1718) has no witness on any host, positive or negative. `conformance-replay-ordinal-loop` needs a host that both runs cycles and suppresses a side-effecting node in replay. The v2 reference host does neither for this fixture: it does not loop, it does not execute `core.conformance.side-effect`, and its `effectOutcome` (`store.ts:586` at openwop-examples `f56f092`) selects the latest outcome regardless of ordinal, which would fail the row if it looped. openwop-app does not index by ordinal (`nodeAttempts` is never reset), and MyndHyve does not seed `replaySourceOutcomes` from the prefix.",
|
|
7280
|
+
"witness": "unclassified",
|
|
7281
|
+
"requirementId": null,
|
|
7282
|
+
"disposition": "externally-gated",
|
|
7283
|
+
"target": "host-loops-with-replay-suppression",
|
|
7284
|
+
"sources": [
|
|
7285
|
+
{
|
|
7286
|
+
"file": "RFCS/registers/0140-replay-side-effect-suppression.gaps.md",
|
|
7287
|
+
"token": "G10"
|
|
7288
|
+
}
|
|
7289
|
+
]
|
|
7290
|
+
},
|
|
7274
7291
|
{
|
|
7275
7292
|
"id": "openwop.gap.0141.0",
|
|
7276
7293
|
"rfc": "0141",
|
|
@@ -9804,6 +9821,57 @@
|
|
|
9804
9821
|
}
|
|
9805
9822
|
]
|
|
9806
9823
|
},
|
|
9824
|
+
{
|
|
9825
|
+
"id": "openwop.gap.0171.6",
|
|
9826
|
+
"rfc": "0171",
|
|
9827
|
+
"local": "G6",
|
|
9828
|
+
"section": "§B.1",
|
|
9829
|
+
"surface": "openwop-app emits error codes on `run.failed` / `node.failed` that are neither registered nor vendor codes (22 codes measured at openwop-app `0cfb264c9`, e.g. `invalid_config`, `host_capability_missing`); `errors.md` §The registry binds them since openwop#1698.",
|
|
9830
|
+
"witness": "unclassified",
|
|
9831
|
+
"requirementId": null,
|
|
9832
|
+
"disposition": "externally-gated",
|
|
9833
|
+
"target": "openwop-app-code-remap",
|
|
9834
|
+
"sources": [
|
|
9835
|
+
{
|
|
9836
|
+
"file": "RFCS/registers/0171-v2-wire-envelope.gaps.md",
|
|
9837
|
+
"token": "G6"
|
|
9838
|
+
}
|
|
9839
|
+
]
|
|
9840
|
+
},
|
|
9841
|
+
{
|
|
9842
|
+
"id": "openwop.gap.0171.7",
|
|
9843
|
+
"rfc": "0171",
|
|
9844
|
+
"local": "G7",
|
|
9845
|
+
"section": "§B.1",
|
|
9846
|
+
"surface": "MyndHyve emitted about 56 UPPER_CASE run-failure codes that were neither registered nor vendor codes.",
|
|
9847
|
+
"witness": "unclassified",
|
|
9848
|
+
"requirementId": null,
|
|
9849
|
+
"disposition": "closed",
|
|
9850
|
+
"target": null,
|
|
9851
|
+
"sources": [
|
|
9852
|
+
{
|
|
9853
|
+
"file": "RFCS/registers/0171-v2-wire-envelope.gaps.md",
|
|
9854
|
+
"token": "G7"
|
|
9855
|
+
}
|
|
9856
|
+
]
|
|
9857
|
+
},
|
|
9858
|
+
{
|
|
9859
|
+
"id": "openwop.gap.0171.8",
|
|
9860
|
+
"rfc": "0171",
|
|
9861
|
+
"local": "G8",
|
|
9862
|
+
"section": "§B.1",
|
|
9863
|
+
"surface": "The v2 reference host emitted unregistered run-failure codes that were not vendor codes.",
|
|
9864
|
+
"witness": "unclassified",
|
|
9865
|
+
"requirementId": null,
|
|
9866
|
+
"disposition": "closed",
|
|
9867
|
+
"target": null,
|
|
9868
|
+
"sources": [
|
|
9869
|
+
{
|
|
9870
|
+
"file": "RFCS/registers/0171-v2-wire-envelope.gaps.md",
|
|
9871
|
+
"token": "G8"
|
|
9872
|
+
}
|
|
9873
|
+
]
|
|
9874
|
+
},
|
|
9807
9875
|
{
|
|
9808
9876
|
"id": "openwop.gap.0172.1",
|
|
9809
9877
|
"rfc": "0172",
|
|
@@ -13085,6 +13153,23 @@
|
|
|
13085
13153
|
}
|
|
13086
13154
|
]
|
|
13087
13155
|
},
|
|
13156
|
+
{
|
|
13157
|
+
"id": "openwop.gap.0220.5",
|
|
13158
|
+
"rfc": "0220",
|
|
13159
|
+
"local": "G5",
|
|
13160
|
+
"section": "§B",
|
|
13161
|
+
"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
|
+
"witness": "unclassified",
|
|
13163
|
+
"requirementId": null,
|
|
13164
|
+
"disposition": "transferred",
|
|
13165
|
+
"target": "myndhyve/services/workflow-runtime",
|
|
13166
|
+
"sources": [
|
|
13167
|
+
{
|
|
13168
|
+
"file": "RFCS/registers/0220-ext-families-graduate-on-evidence.gaps.md",
|
|
13169
|
+
"token": "G5"
|
|
13170
|
+
}
|
|
13171
|
+
]
|
|
13172
|
+
},
|
|
13088
13173
|
{
|
|
13089
13174
|
"id": "openwop.gap.0221.1",
|
|
13090
13175
|
"rfc": "0221",
|
|
@@ -13141,11 +13226,11 @@
|
|
|
13141
13226
|
"rfc": "0223",
|
|
13142
13227
|
"local": "G1",
|
|
13143
13228
|
"section": "§Conformance",
|
|
13144
|
-
"surface": "The routed case (a rejected gate followed over an `all_complete` or `any_failed` edge)
|
|
13229
|
+
"surface": "The routed case (a rejected gate followed over an `all_complete` or `any_failed` edge) had no witness.",
|
|
13145
13230
|
"witness": "unclassified",
|
|
13146
13231
|
"requirementId": null,
|
|
13147
|
-
"disposition": "
|
|
13148
|
-
"target":
|
|
13232
|
+
"disposition": "closed",
|
|
13233
|
+
"target": null,
|
|
13149
13234
|
"sources": [
|
|
13150
13235
|
{
|
|
13151
13236
|
"file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
|
|
@@ -13158,11 +13243,11 @@
|
|
|
13158
13243
|
"rfc": "0223",
|
|
13159
13244
|
"local": "G2",
|
|
13160
13245
|
"section": "§Conformance",
|
|
13161
|
-
"surface": "The timeout disposition
|
|
13246
|
+
"surface": "The timeout disposition had no witness.",
|
|
13162
13247
|
"witness": "unclassified",
|
|
13163
13248
|
"requirementId": null,
|
|
13164
|
-
"disposition": "
|
|
13165
|
-
"target":
|
|
13249
|
+
"disposition": "closed",
|
|
13250
|
+
"target": null,
|
|
13166
13251
|
"sources": [
|
|
13167
13252
|
{
|
|
13168
13253
|
"file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
|
|
@@ -13175,11 +13260,11 @@
|
|
|
13175
13260
|
"rfc": "0223",
|
|
13176
13261
|
"local": "G3",
|
|
13177
13262
|
"section": "§Implementation notes",
|
|
13178
|
-
"surface": "The v2 reference host
|
|
13263
|
+
"surface": "The v2 reference host did not record `action` on `interrupt.resolved`, did not emit `approval.rejected`, failed the run directly rather than through the scheduler, and had no timeout disposition.",
|
|
13179
13264
|
"witness": "unclassified",
|
|
13180
13265
|
"requirementId": null,
|
|
13181
|
-
"disposition": "
|
|
13182
|
-
"target":
|
|
13266
|
+
"disposition": "closed",
|
|
13267
|
+
"target": null,
|
|
13183
13268
|
"sources": [
|
|
13184
13269
|
{
|
|
13185
13270
|
"file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
|
|
@@ -13209,11 +13294,11 @@
|
|
|
13209
13294
|
"rfc": "0223",
|
|
13210
13295
|
"local": "G5",
|
|
13211
13296
|
"section": "§Implementation notes",
|
|
13212
|
-
"surface": "MyndHyve
|
|
13297
|
+
"surface": "MyndHyve failed the gate with the unregistered `APPROVAL_REJECTED`.",
|
|
13213
13298
|
"witness": "unclassified",
|
|
13214
13299
|
"requirementId": null,
|
|
13215
|
-
"disposition": "
|
|
13216
|
-
"target":
|
|
13300
|
+
"disposition": "closed",
|
|
13301
|
+
"target": null,
|
|
13217
13302
|
"sources": [
|
|
13218
13303
|
{
|
|
13219
13304
|
"file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
|
|
@@ -13243,11 +13328,11 @@
|
|
|
13243
13328
|
"rfc": "0223",
|
|
13244
13329
|
"local": "G7",
|
|
13245
13330
|
"section": "§Unresolved questions",
|
|
13246
|
-
"surface": "`onTimeout: approve` re-
|
|
13331
|
+
"surface": "`onTimeout: approve` re-legalised the fail-open timeout RFC 0093 ruled non-conformant.",
|
|
13247
13332
|
"witness": "unclassified",
|
|
13248
13333
|
"requirementId": null,
|
|
13249
|
-
"disposition": "
|
|
13250
|
-
"target":
|
|
13334
|
+
"disposition": "closed",
|
|
13335
|
+
"target": null,
|
|
13251
13336
|
"sources": [
|
|
13252
13337
|
{
|
|
13253
13338
|
"file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
|
|
@@ -13260,11 +13345,11 @@
|
|
|
13260
13345
|
"rfc": "0223",
|
|
13261
13346
|
"local": "G8",
|
|
13262
13347
|
"section": "§A",
|
|
13263
|
-
"surface": "A gate re-entered over a reject loop
|
|
13348
|
+
"surface": "A gate re-entered over a reject loop collided with the one-interrupt-per-key rule (`interrupt.md` §Re-entry); v2 had no per-iteration key derivation.",
|
|
13264
13349
|
"witness": "unclassified",
|
|
13265
13350
|
"requirementId": null,
|
|
13266
|
-
"disposition": "
|
|
13267
|
-
"target":
|
|
13351
|
+
"disposition": "closed",
|
|
13352
|
+
"target": null,
|
|
13268
13353
|
"sources": [
|
|
13269
13354
|
{
|
|
13270
13355
|
"file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
|
|
@@ -13289,6 +13374,40 @@
|
|
|
13289
13374
|
}
|
|
13290
13375
|
]
|
|
13291
13376
|
},
|
|
13377
|
+
{
|
|
13378
|
+
"id": "openwop.gap.0223.9",
|
|
13379
|
+
"rfc": "0223",
|
|
13380
|
+
"local": "G9",
|
|
13381
|
+
"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`.",
|
|
13383
|
+
"witness": "unclassified",
|
|
13384
|
+
"requirementId": null,
|
|
13385
|
+
"disposition": "externally-gated",
|
|
13386
|
+
"target": "host-routes-failed-gate-over-cycle",
|
|
13387
|
+
"sources": [
|
|
13388
|
+
{
|
|
13389
|
+
"file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
|
|
13390
|
+
"token": "G9"
|
|
13391
|
+
}
|
|
13392
|
+
]
|
|
13393
|
+
},
|
|
13394
|
+
{
|
|
13395
|
+
"id": "openwop.gap.0223.10",
|
|
13396
|
+
"rfc": "0223",
|
|
13397
|
+
"local": "G10",
|
|
13398
|
+
"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.",
|
|
13400
|
+
"witness": "unclassified",
|
|
13401
|
+
"requirementId": null,
|
|
13402
|
+
"disposition": "closed",
|
|
13403
|
+
"target": null,
|
|
13404
|
+
"sources": [
|
|
13405
|
+
{
|
|
13406
|
+
"file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
|
|
13407
|
+
"token": "G10"
|
|
13408
|
+
}
|
|
13409
|
+
]
|
|
13410
|
+
},
|
|
13292
13411
|
{
|
|
13293
13412
|
"id": "openwop.gap.0224.1",
|
|
13294
13413
|
"rfc": "0224",
|
|
@@ -467,4 +467,4 @@ A profile is a predicate over the declaration file, published in `spec/v2/profil
|
|
|
467
467
|
|
|
468
468
|
Rows `C2.1`–`C2.10` are `spec/v1/migrations.json` entries. `openwop.codemod.discovery-document-v2` transforms `C2.2`–`C2.8`: it drops a family with `supported: false` and promotes a dotted-only declared family to its plain key. Certification bundles naming `openwop-core` are never upgraded; they remain valid v1 evidence at their version.
|
|
469
469
|
|
|
470
|
-
*Sources:
|
|
470
|
+
*Sources: RFCs 0144, 0169, 0175, 0176, 0179, 0197. Each family's owning RFC is its `owningRfc` in [`declaration.json`](../declaration.json).*
|
|
@@ -145,4 +145,4 @@ This proves the arithmetic and that recovery ran once inside the bound. It does
|
|
|
145
145
|
|
|
146
146
|
An RFC whose acceptance criteria are corpus gates rather than host scenarios records the evidence label **corpus gate — no host tier** in its `Updated` line. For such an RFC the accepted-predicate check reads `(corpus)` rows from `evidence/corpus-ledger.json` and MUST NOT require a host bundle.
|
|
147
147
|
|
|
148
|
-
*Sources:
|
|
148
|
+
*Sources: RFCs 0158, 0168, 0212, 0216.*
|
|
@@ -35,4 +35,4 @@ A host advertising `connections.packsSupported` MUST resolve a connector's `auth
|
|
|
35
35
|
|
|
36
36
|
Both codes are in `spec/v2/errors.json`: `connection_provider_conflict` (two claimants for one bare id) and `connection_provider_unresolved` (no definition for the referenced id).
|
|
37
37
|
|
|
38
|
-
*Sources:
|
|
38
|
+
*Sources: RFCs 0095, 0177.*
|
|
@@ -23,4 +23,4 @@ A host advertising `channelPresence` MUST report present members as a subset of
|
|
|
23
23
|
|
|
24
24
|
A host that stamps model provenance on an agent turn MUST advertise `conversationTurnModelProvenance`. The stamp is non-secret and non-PII (provider and model identifiers only), and a host MUST NOT place prompt or completion content in it.
|
|
25
25
|
|
|
26
|
-
*Sources:
|
|
26
|
+
*Sources: RFCs 0101, 0109, 0110.*
|
package/spec/v2/core/errors.md
CHANGED
|
@@ -8,9 +8,9 @@ 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
|
|
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.
|
|
12
12
|
|
|
13
|
-
- A host MUST
|
|
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.
|
|
15
15
|
- The registry grows by [overview.md](overview.md) §0.
|
|
16
16
|
|
|
@@ -160,4 +160,4 @@ Code | Status
|
|
|
160
160
|
`pack_registry_unreachable` | 503
|
|
161
161
|
`runner_unavailable` | 503
|
|
162
162
|
|
|
163
|
-
*Sources:
|
|
163
|
+
*Sources: RFCs 0171, 0213.*
|
package/spec/v2/core/events.md
CHANGED
|
@@ -188,4 +188,4 @@ An absent `kinds` is not an empty catalog and is not an unrestricted one: a host
|
|
|
188
188
|
- **`feedback.targets`** names the resources an annotation may be attached to. A host MUST refuse an annotation whose target is outside the advertised set, and MUST NOT write it to the replayable run event log.
|
|
189
189
|
- **`providerUsage.costEstimates`** advertises that the host stamps a derived cost on the `provider.usage` event. That figure is an estimate from the host's own rate table; a consumer MUST NOT treat it as a billed amount.
|
|
190
190
|
|
|
191
|
-
*Sources:
|
|
191
|
+
*Sources: RFCs 0171, 0172, 0176, 0185, 0194, 0213.*
|
|
@@ -40,4 +40,4 @@ A form instantiated from a pack advertised through `forms.contentPacks` MUST be
|
|
|
40
40
|
|
|
41
41
|
The five spec-reserved `format` values are the core set. A host that recognizes a format SHOULD apply it; one that does not MUST ignore it and accept plain text. A host MUST ignore `format` on any type other than `text` or `longtext`.
|
|
42
42
|
|
|
43
|
-
*Sources:
|
|
43
|
+
*Sources: RFCs 0137, 0177.*
|
|
@@ -68,4 +68,4 @@ Layer 1 deduplicates the caller's request; Layer 2 deduplicates the run's effect
|
|
|
68
68
|
- `multiRegion` is the behavioural claim. When a host advertises it, both layers MUST hold across regions: an `Idempotency-Key` replayed into a second region MUST resolve to the first region's response rather than starting new work, and effect identity MUST collapse a duplicate effect wherever it is observed.
|
|
69
69
|
- A host that does not advertise `multiRegion` makes no cross-region promise, and a client MUST NOT infer one from `crossRegion` alone.
|
|
70
70
|
|
|
71
|
-
*Sources:
|
|
71
|
+
*Sources: RFCs 0170, 0171, 0173, 0213.*
|
package/spec/v2/core/identity.md
CHANGED
|
@@ -222,4 +222,4 @@ Every code below is a row with `retriable: false` and no `details` contract; the
|
|
|
222
222
|
|
|
223
223
|
The identity invariants are registered in `SECURITY/invariants.yaml` with their scenarios. An invariant without a witness is demoted from `protocol` tier.
|
|
224
224
|
|
|
225
|
-
*Sources:
|
|
225
|
+
*Sources: RFCs 0132, 0165, 0170, 0176, 0184, 0200, 0210.*
|
package/spec/v2/core/interop.md
CHANGED
|
@@ -162,4 +162,4 @@ A receiver prefers the in-message value, ignores a malformed one, and MUST NOT d
|
|
|
162
162
|
|
|
163
163
|
`SECURITY/threat-model-interop.md` is the threat model for this document; its invariants are rows of `SECURITY/invariants.yaml`. Peer identity and authorization at the boundary are governed by security-defaults.md; a peer MUST NOT gain authority the caller's Subject does not hold.
|
|
164
164
|
|
|
165
|
-
*Sources:
|
|
165
|
+
*Sources: RFCs 0175, 0198, 0207, 0208, 0211, 0214.*
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
## Why this exists
|
|
7
7
|
|
|
8
|
-
`interrupt` is
|
|
8
|
+
`interrupt` is how a run waits for something outside itself: a decision, an answer, an event, a conversation turn. Every kind shares one payload shape, event pair, resolve contract and token scheme, so a client that resolves an approval can resolve anything.
|
|
9
9
|
|
|
10
10
|
## Payload
|
|
11
11
|
|
|
@@ -35,8 +35,11 @@ Per-kind rules:
|
|
|
35
35
|
|
|
36
36
|
### Re-entry and resume values
|
|
37
37
|
|
|
38
|
-
`key` is the deterministic re-entry key.
|
|
38
|
+
`key` is the deterministic re-entry key of one invocation. A host MUST derive it from at least the run, the node and the node's visit index: the number of that node's interrupts in this run whose resolution was consumed before this execution began. Its spelling is host-defined.
|
|
39
39
|
|
|
40
|
+
- A replay or recovery of the same execution MUST re-derive the same key.
|
|
41
|
+
- A later execution of the node, reached over an edge, MUST derive a different key, MUST raise a new `interrupt.requested`, and MUST NOT return an earlier visit's `resumeValue`.
|
|
42
|
+
- Two interrupts raised in one execution MUST have distinct keys.
|
|
40
43
|
- A host MUST invoke an interrupt with key `K` at most once for the lifetime of the run.
|
|
41
44
|
- On recovery the engine MUST consult the event log, find the prior `interrupt.resolved`, and return the persisted `resumeValue` without emitting a second `interrupt.requested`.
|
|
42
45
|
- An in-memory cache MAY serve in-process replays but MUST NOT replace the event log for cross-process replays.
|
|
@@ -51,7 +54,7 @@ Every kind uses two registered types ([events.md](events.md)):
|
|
|
51
54
|
- `interrupt.requested` — the payload is the `InterruptPayload` verbatim.
|
|
52
55
|
- `interrupt.resolved` — the closed payload is `interruptResolved`. Resolving an approval-kind interrupt MUST record the applied `action` there, with the field §Approval requires.
|
|
53
56
|
|
|
54
|
-
The kind-specific `approval.*` and `clarification.*` types remain registered. Their payload definitions in `schemas/v2/run-event-payloads.schema.json` are `$ref` aliases of `interruptRequested` and `interruptResolved
|
|
57
|
+
The kind-specific `approval.*` and `clarification.*` types remain registered. Their payload definitions in `schemas/v2/run-event-payloads.schema.json` are `$ref` aliases of `interruptRequested` and `interruptResolved`. A host emitting `interrupt.requested` SHOULD also emit the kind-specific type until its consumers migrate.
|
|
55
58
|
|
|
56
59
|
Both events are durable and appear in the `updates` and `debug` stream modes. While suspended, `RunSnapshot.currentNodeId` names the node and `status` is `waiting-approval`, `waiting-input` or `waiting-external`.
|
|
57
60
|
|
|
@@ -115,18 +118,18 @@ The token grammar and the `interrupt.tokenAlgs[]` / `kid` check are [identity.md
|
|
|
115
118
|
|
|
116
119
|
### Rejection
|
|
117
120
|
|
|
118
|
-
A `reject` exits the suspend. The host MUST record `action: "reject"` and `decision: "rejected"` on `interrupt.resolved`, and
|
|
121
|
+
A `reject` exits the suspend. The host MUST record `action: "reject"` and `decision: "rejected"` on `interrupt.resolved`, and MAY also emit `approval.rejected`. The resume value returns to the raising node (§Re-entry and resume values).
|
|
119
122
|
|
|
120
|
-
- A node that does not turn the rejection into an output MUST fail with `approval_rejected`
|
|
123
|
+
- A node that does not turn the rejection into an output MUST fail with `approval_rejected` and `retryable: false` on the `node.failed` error, and MUST NOT be retried.
|
|
121
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`).
|
|
122
125
|
- When no such edge exists, the run MUST terminate `failed` with `run.failed.error.code` `approval_rejected` and `failedNodeId` naming the gate.
|
|
123
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`.
|
|
124
|
-
- When a non-zero `timeoutMs` elapses with no resolution
|
|
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.
|
|
125
128
|
- On replay the failure MUST be derived from the recorded `interrupt.resolved`, never re-decided.
|
|
126
129
|
|
|
127
130
|
## Approver enforcement
|
|
128
131
|
|
|
129
|
-
|
|
132
|
+
The facet `spec/v2/facets/interrupt.schema.json` carries `tokenAlgs[]` (REQUIRED) and `refKinds[]` ⊆ `principal`, `group`, `role`.
|
|
130
133
|
|
|
131
134
|
- **`approversList`** (explicit principals) binds everywhere: a host advertising `interrupt` MUST refuse a resolver not in the list.
|
|
132
135
|
- **`approverGroupRefs`** binds only where `refKinds` includes `group`: the host MUST surface the field unchanged and MUST resolve and enforce its members as eligible approvers.
|
|
@@ -136,10 +139,10 @@ Enforcement is an obligation of the fields, not a discovery flag. The facet `spe
|
|
|
136
139
|
|
|
137
140
|
Eligibility binds every writer of the suspension record, not every route. A host whose durable store is writable by a principal other than the engine MUST enforce the same eligibility at the store, or MUST NOT expose the record to that principal for write.
|
|
138
141
|
|
|
139
|
-
Refs are opaque to the engine; the host resolves them
|
|
142
|
+
Refs are opaque to the engine; the host resolves them. Membership MUST be resolved at decision time and MUST NOT be re-resolved during replay or `forkRun`: the recorded eligibility decision is fixed history ([replay.md](replay.md)).
|
|
140
143
|
|
|
141
144
|
## During the v1 overlap
|
|
142
145
|
|
|
143
146
|
The v1 interrupt-token drain is [identity.md](identity.md) §4.
|
|
144
147
|
|
|
145
|
-
*Sources:
|
|
148
|
+
*Sources: RFCs 0170, 0171, 0173, 0187, 0196, 0223.*
|
|
@@ -31,4 +31,4 @@ It has no `packages[]`, `headers`, `variables` or `_meta`, so it carries no inst
|
|
|
31
31
|
- A host SHOULD NOT treat `name` as a verified identity: an inline record carries no proof of namespace ownership.
|
|
32
32
|
- A host that authenticates to the server does so through the node's `requiredCredentials` or `auth`.
|
|
33
33
|
|
|
34
|
-
*Sources:
|
|
34
|
+
*Sources: RFCs 0008, 0203.*
|
package/spec/v2/core/oauth.md
CHANGED
|
@@ -63,4 +63,4 @@ Then:
|
|
|
63
63
|
- `declined` fails the node with `connector_auth_declined`.
|
|
64
64
|
- A host that binds a node to one credential reference (for example, a connection) reads "resolves" as that reference resolving with the node's scopes, carries it as `credentialRef`, and still completes `connectUrl` only for the initiating Subject.
|
|
65
65
|
|
|
66
|
-
*Sources:
|
|
66
|
+
*Sources: RFCs 0046, 0047, 0199.*
|
package/spec/v2/core/overview.md
CHANGED
|
@@ -96,4 +96,4 @@ These rules bind any public conformance statement:
|
|
|
96
96
|
|
|
97
97
|
Every MUST, SHOULD, and MAY in `core/` is a requirement with an id in `requirements.json` and a `witness` from `witnessable-unaided | witnessable-gated | seam-gated | claims-check | negative-existence`. A seam-gated MUST is governed by [`conformance.md`](conformance.md) §"Witness class".
|
|
98
98
|
|
|
99
|
-
*Sources:
|
|
99
|
+
*Sources: RFCs 0155, 0167, 0168, 0169, 0171, 0174, 0190, 0197.*
|
package/spec/v2/core/packs.md
CHANGED
|
@@ -26,12 +26,12 @@ Each conjunct keeps its own refusal code. A mechanical ceiling bump is not a ver
|
|
|
26
26
|
|
|
27
27
|
## The `packs` capability
|
|
28
28
|
|
|
29
|
-
A host advertises `packs` when it serves the registry surface above
|
|
29
|
+
A host advertises `packs` when it serves the registry surface above:
|
|
30
30
|
|
|
31
31
|
- A host MUST NOT advertise `packs` unless it resolves pack references through a registry reachable from its discovery document.
|
|
32
|
-
- A client MUST treat an absent record as "
|
|
32
|
+
- A client MUST treat an absent record as "no registry resolution", not as an unknown. It says nothing about pack validation or execution, which `sandbox` and §"The engine range" bind.
|
|
33
33
|
|
|
34
|
-
`testMode` is DEPRECATED and MUST NOT be relied on by a client (
|
|
34
|
+
`testMode` is DEPRECATED and MUST NOT be relied on by a client (§"During the v1 overlap"). A host mounting a test catalog SHOULD advertise the seams profile instead, and MUST NOT treat `testMode` as a second way to claim one.
|
|
35
35
|
|
|
36
36
|
## The registry tree
|
|
37
37
|
|
|
@@ -118,4 +118,4 @@ A registry MUST validate submissions against vendored copies of these schemas pi
|
|
|
118
118
|
- The v1 registry tree is frozen through the overlap, behind the v2 tree.
|
|
119
119
|
- `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
120
|
|
|
121
|
-
*Sources:
|
|
121
|
+
*Sources: RFCs 0177, 0212, 0222.*
|
|
@@ -143,4 +143,4 @@ A host MAY claim a qualification rung (`durable-single-instance`, `durable-multi
|
|
|
143
143
|
|
|
144
144
|
See also: [overview.md](overview.md), [events.md](events.md), [replay.md](replay.md), [identity.md](identity.md), [webhooks.md](webhooks.md).
|
|
145
145
|
|
|
146
|
-
*Sources:
|
|
146
|
+
*Sources: RFCs 0041, 0158, 0170, 0171, 0172, 0176, 0180, 0185, 0186, 0187.*
|
|
@@ -41,4 +41,4 @@ An applied import emits `import.applied` (`schemas/v2/run-event-payloads.schema.
|
|
|
41
41
|
|
|
42
42
|
No protocol path is defined for export or import: a host serves them on routes of its own. A host-private migration from an anonymous sandbox into a signed-in tenant fits this contract, because its response is a subset of the import outcome.
|
|
43
43
|
|
|
44
|
-
*Sources:
|
|
44
|
+
*Sources: RFCs 0043, 0096, 0098.*
|
package/spec/v2/core/replay.md
CHANGED
|
@@ -63,7 +63,7 @@ When a replayed node produces an event different from the source at the same seq
|
|
|
63
63
|
Divergence codes (`spec/v2/errors.json`):
|
|
64
64
|
|
|
65
65
|
- **`replay_diverged_at_refusal`** (fork fails, `409`) — the source obtained a valid envelope and the replay a refusal, or the reverse. The host MUST NOT substitute silently; it MUST emit `replay.diverged-at-refusal` naming the node and both envelope kinds and fail the replay with this code.
|
|
66
|
-
- **`replay_source_missing`** (`node.failed` payload; the fork request still returns `201`) — a side-effecting node reached with no recorded source outcome
|
|
66
|
+
- **`replay_source_missing`** (`node.failed` payload; the fork request still returns `201`) — a side-effecting node reached with no recorded source outcome (§Suppression).
|
|
67
67
|
- **`replay_memory_snapshot_unavailable`** (fork refused, `409`) — the host cannot serve memory state as-of `fromSeq`. It MUST refuse rather than substitute current memory; `details.fromSeq` SHOULD name the index.
|
|
68
68
|
- **`replay_context_summary_unavailable`** (fork refused, `409`) — the host advertises `multiAgent.executionModel.contextBudget.summarization` and cannot serve, as-of `fromSeq`, a summary artifact (`context.summarized.summaryRef`) the replay would reuse. It MUST refuse rather than re-summarize; `details.fromSeq` SHOULD name the index.
|
|
69
69
|
|
|
@@ -74,7 +74,7 @@ Suppression is an obligation of the `replay` surface: advertising `replay` binds
|
|
|
74
74
|
For a fork with `mode: replay`:
|
|
75
75
|
|
|
76
76
|
1. A node that performs an external side effect — any operation observable outside the run's own event log — MUST NOT perform it.
|
|
77
|
-
2. The host MUST resolve the node's outcome from the source run's recorded terminal outcome
|
|
77
|
+
2. The host MUST resolve the node's outcome from the source run's recorded terminal outcome keyed on `(sourceRunId, nodeId, n)`, never on the fork's own `runId`, where `n` counts the node's `node.started` events through this execution, including retries, later visits and the fork's inherited prefix.
|
|
78
78
|
3. Absent a recorded outcome, the host MUST fail the node closed with `replay_source_missing`, MUST NOT perform the effect, and MUST NOT substitute a synthesized or empty success.
|
|
79
79
|
4. A node whose pack manifest declares `role: "side-effect"` MUST be treated as side-effecting; a host classifier MAY add nodes and MUST NOT remove any. A throwing seam satisfies rule 1 only.
|
|
80
80
|
5. The guarantee is whole-run and requires both classification before execution and a default-deny guard at every effect seam.
|
|
@@ -102,7 +102,7 @@ A host advertising `replay` MUST publish `schemas/v2/effect-seam-manifest.schema
|
|
|
102
102
|
1. Load the source run's events with `sequence < fromSeq` through the storage boundary, where an era-`2` log is translated (persistence.md).
|
|
103
103
|
2. Fold them to a projected state.
|
|
104
104
|
3. Initialize the new run with that state, copy-on-write into its own log.
|
|
105
|
-
4. For `replay`, resolve side-effecting nodes from the source run's recorded outcomes keyed on `(sourceRunId, nodeId,
|
|
105
|
+
4. For `replay`, resolve side-effecting nodes from the source run's recorded outcomes keyed on `(sourceRunId, nodeId, n)`; LLM invocations additionally consult the invocation log via the content-addressed invocation key.
|
|
106
106
|
5. For `branch`, executor invocations create new invocation-log entries keyed on the new `runId`.
|
|
107
107
|
|
|
108
108
|
## Forking a v1 run
|
|
@@ -132,4 +132,4 @@ A host advertising `replay` MUST document retention for source snapshots, source
|
|
|
132
132
|
|
|
133
133
|
See also: events.md, runs.md, persistence.md, security-defaults.md.
|
|
134
134
|
|
|
135
|
-
*Sources:
|
|
135
|
+
*Sources: RFCs 0036, 0039, 0041, 0057, 0104, 0111, 0140, 0173, 0176, 0194.*
|
package/spec/v2/core/runs.md
CHANGED
|
@@ -63,7 +63,7 @@ The `createRun` body is closed (`unevaluatedProperties: false`). Its fields:
|
|
|
63
63
|
The `201` response is `{ runId, status, eventsUrl, statusUrl? }`. `status` is one of `pending`, `running`, `waiting-approval`, `waiting-input`, `waiting-external`.
|
|
64
64
|
|
|
65
65
|
- `eventsUrl` and `statusUrl` MUST resolve under the origin the request was made to — a relative path, or an absolute URL on the same origin — and MUST NOT downgrade the scheme. A link naming a different host, or `http://` on an `https://` origin, is non-conformant.
|
|
66
|
-
- The base that minted `runId` MUST resolve it: `GET /runs/{runId}` and `GET /runs/{runId}/events/poll` at that base MUST answer `200` for the returned id, percent-encoded per [identity.md](identity.md) §5.
|
|
66
|
+
- The base that minted `runId` MUST resolve it: `GET /runs/{runId}` and `GET /runs/{runId}/events/poll` at that base MUST answer `200` for the returned id, percent-encoded per [identity.md](identity.md) §5.
|
|
67
67
|
|
|
68
68
|
### Refusals
|
|
69
69
|
|
|
@@ -191,7 +191,7 @@ Per-entry errors ([errors.md](errors.md)):
|
|
|
191
191
|
`drainPolicy` is one of:
|
|
192
192
|
|
|
193
193
|
- `drain-current-node` (default) — the executing node reaches a terminal first.
|
|
194
|
-
- `immediate` — the run is snapshotted between events. The executing attempt is cut: it has no terminal node event, a host MUST NOT record `node.failed` (or any terminal node event) for it, and the resumed run's `node.started` begins a fresh attempt. `run.paused` itself records the interruption; its payload MAY carry `interruptedNodeId` and `interruptedAttempt
|
|
194
|
+
- `immediate` — the run is snapshotted between events. The executing attempt is cut: it has no terminal node event, a host MUST NOT record `node.failed` (or any terminal node event) for it, and the resumed run's `node.started` begins a fresh attempt. `run.paused` itself records the interruption; its payload MAY carry `interruptedNodeId` and `interruptedAttempt`.
|
|
195
195
|
|
|
196
196
|
`resumeRun` accepts `{ reason? }`, answers `202 { runId, status: 'running', resumedAt? }`, and emits `run.resumed`.
|
|
197
197
|
|
|
@@ -224,6 +224,8 @@ The `201` response is `{ runId, sourceRunId, fromSeq?, mode, status, eventsUrl }
|
|
|
224
224
|
|
|
225
225
|
`getRunAncestry` returns `schemas/v2/run-ancestry-response.schema.json` (`runId`, `hostId`, `parent` or `null`). A client walks the chain one hop at a time via `parent.wellKnownUrl`.
|
|
226
226
|
|
|
227
|
+
`parent` is the dispatching run, `cause` its composition mechanism. A fork is not dispatched (its lineage is `parentRunId`): its `parent` MUST be `null`.
|
|
228
|
+
|
|
227
229
|
## Annotations, artifacts, eval summary
|
|
228
230
|
|
|
229
231
|
### Annotations
|
|
@@ -264,4 +266,4 @@ A host that does not advertise `dataResidency` MAY ignore or reject a `residency
|
|
|
264
266
|
|
|
265
267
|
A non-terminal run inherited from v1 continues, or is cancelled `v1_pin_unsupported`, per [persistence.md](persistence.md) §"Runs pinned to v1".
|
|
266
268
|
|
|
267
|
-
*Sources:
|
|
269
|
+
*Sources: RFCs 0170, 0171, 0176, 0182.*
|
|
@@ -142,4 +142,4 @@ Rows `C6.1`–`C6.9` are `spec/v1/migrations.json` entries.
|
|
|
142
142
|
|
|
143
143
|
See also: identity.md, replay.md, webhooks.md, capabilities.md, conformance.md.
|
|
144
144
|
|
|
145
|
-
*Sources:
|
|
145
|
+
*Sources: RFCs 0150, 0163, 0164, 0170, 0173, 0214, 0218, 0224.*
|
|
@@ -42,4 +42,4 @@ A host advertising `toolCatalog.compactView` MUST answer `?view=compact` on both
|
|
|
42
42
|
|
|
43
43
|
A host advertising `toolCatalog.sessionLifecycle` MAY bracket calls with content-free `tool.session.opened` and `tool.session.closed`; a consumer MUST tolerate their absence.
|
|
44
44
|
|
|
45
|
-
*Sources:
|
|
45
|
+
*Sources: RFCs 0078, 0112, 0204.*
|
|
@@ -192,4 +192,4 @@ Every vendor namespace — capability records ([capabilities.md](capabilities.md
|
|
|
192
192
|
|
|
193
193
|
Rows `C5.1`–`C5.9` are `spec/v1/migrations.json` entries (`C5.2` is owned by `events.md`). The persisted-data disposition for each is `not-persisted`, except `C5.1` (legacy-stamped) and `C5.7` (never-upgraded).
|
|
194
194
|
|
|
195
|
-
*Sources:
|
|
195
|
+
*Sources: RFCs 0167, 0168, 0172, 0176, 0179, 0181, 0193, 0219.*
|
package/spec/v2/core/webhooks.md
CHANGED
|
@@ -124,4 +124,4 @@ At delivery time a host MUST re-resolve the hostname, validate every resolved ad
|
|
|
124
124
|
|
|
125
125
|
See also: events.md, replay.md, persistence.md, security-defaults.md.
|
|
126
126
|
|
|
127
|
-
*Sources:
|
|
127
|
+
*Sources: RFCs 0053, 0165, 0171, 0173, 0176, 0188, 0196, 0201, 0215, 0217.*
|
|
@@ -36,4 +36,4 @@ Fragment edges carry the same `condition` and `triggerRule` shapes as a top-leve
|
|
|
36
36
|
|
|
37
37
|
A host MUST carry both fields through expansion verbatim and MUST honor them on expanded edges as on authored ones. [form-content-packs.md](form-content-packs.md) reuses this operator set for field visibility.
|
|
38
38
|
|
|
39
|
-
*Sources:
|
|
39
|
+
*Sources: RFCs 0133, 0177.*
|
package/spec/v2/declaration.json
CHANGED
|
@@ -1803,8 +1803,8 @@
|
|
|
1803
1803
|
"extensionName": "brand",
|
|
1804
1804
|
"witness": "claims-check",
|
|
1805
1805
|
"maturity": {
|
|
1806
|
-
"technical": "
|
|
1807
|
-
"adoption": "
|
|
1806
|
+
"technical": "stable",
|
|
1807
|
+
"adoption": "single-witness"
|
|
1808
1808
|
},
|
|
1809
1809
|
"facets": [],
|
|
1810
1810
|
"floorScenarios": [],
|
|
@@ -1822,7 +1822,7 @@
|
|
|
1822
1822
|
"witness": "claims-check",
|
|
1823
1823
|
"maturity": {
|
|
1824
1824
|
"technical": "experimental",
|
|
1825
|
-
"adoption": "
|
|
1825
|
+
"adoption": "single-witness"
|
|
1826
1826
|
},
|
|
1827
1827
|
"facets": [],
|
|
1828
1828
|
"floorScenarios": [],
|
|
@@ -1840,7 +1840,7 @@
|
|
|
1840
1840
|
"witness": "claims-check",
|
|
1841
1841
|
"maturity": {
|
|
1842
1842
|
"technical": "stable",
|
|
1843
|
-
"adoption": "
|
|
1843
|
+
"adoption": "multi-witness"
|
|
1844
1844
|
},
|
|
1845
1845
|
"facets": [],
|
|
1846
1846
|
"floorScenarios": [],
|
|
@@ -1875,8 +1875,8 @@
|
|
|
1875
1875
|
"extensionName": "data-integration",
|
|
1876
1876
|
"witness": "claims-check",
|
|
1877
1877
|
"maturity": {
|
|
1878
|
-
"technical": "
|
|
1879
|
-
"adoption": "
|
|
1878
|
+
"technical": "stable",
|
|
1879
|
+
"adoption": "single-witness"
|
|
1880
1880
|
},
|
|
1881
1881
|
"facets": [],
|
|
1882
1882
|
"floorScenarios": [],
|
|
@@ -1912,7 +1912,7 @@
|
|
|
1912
1912
|
"witness": "claims-check",
|
|
1913
1913
|
"maturity": {
|
|
1914
1914
|
"technical": "stable",
|
|
1915
|
-
"adoption": "
|
|
1915
|
+
"adoption": "multi-witness"
|
|
1916
1916
|
},
|
|
1917
1917
|
"facets": [],
|
|
1918
1918
|
"floorScenarios": [],
|
|
@@ -1930,7 +1930,7 @@
|
|
|
1930
1930
|
"witness": "claims-check",
|
|
1931
1931
|
"maturity": {
|
|
1932
1932
|
"technical": "stable",
|
|
1933
|
-
"adoption": "
|
|
1933
|
+
"adoption": "multi-witness"
|
|
1934
1934
|
},
|
|
1935
1935
|
"facets": [],
|
|
1936
1936
|
"floorScenarios": [],
|
|
@@ -1947,8 +1947,8 @@
|
|
|
1947
1947
|
"extensionName": "launch-studio",
|
|
1948
1948
|
"witness": "claims-check",
|
|
1949
1949
|
"maturity": {
|
|
1950
|
-
"technical": "
|
|
1951
|
-
"adoption": "
|
|
1950
|
+
"technical": "stable",
|
|
1951
|
+
"adoption": "multi-witness"
|
|
1952
1952
|
},
|
|
1953
1953
|
"facets": [],
|
|
1954
1954
|
"floorScenarios": [],
|
|
@@ -1965,8 +1965,8 @@
|
|
|
1965
1965
|
"extensionName": "messaging",
|
|
1966
1966
|
"witness": "claims-check",
|
|
1967
1967
|
"maturity": {
|
|
1968
|
-
"technical": "
|
|
1969
|
-
"adoption": "
|
|
1968
|
+
"technical": "stable",
|
|
1969
|
+
"adoption": "single-witness"
|
|
1970
1970
|
},
|
|
1971
1971
|
"facets": [],
|
|
1972
1972
|
"floorScenarios": [],
|
|
@@ -1984,7 +1984,7 @@
|
|
|
1984
1984
|
"witness": "claims-check",
|
|
1985
1985
|
"maturity": {
|
|
1986
1986
|
"technical": "stable",
|
|
1987
|
-
"adoption": "
|
|
1987
|
+
"adoption": "multi-witness"
|
|
1988
1988
|
},
|
|
1989
1989
|
"facets": [],
|
|
1990
1990
|
"floorScenarios": [],
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# `brand` extension
|
|
2
2
|
|
|
3
|
-
> **Status:
|
|
3
|
+
> **Status: Stable.**
|
|
4
4
|
|
|
5
5
|
`brand` names a host service for brand artifacts: themes and personas. 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:** | `
|
|
11
|
-
| **adoption:** | `
|
|
10
|
+
| **technical:** | `stable` |
|
|
11
|
+
| **adoption:** | `single-witness` |
|
|
12
12
|
| **peer-dependency id** | `brand` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.brand` |
|
|
14
14
|
| **declared facets** | none defined |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| --- | --- |
|
|
9
9
|
| **witness:** | `claims-check` |
|
|
10
10
|
| **technical:** | `experimental` |
|
|
11
|
-
| **adoption:** | `
|
|
11
|
+
| **adoption:** | `single-witness` |
|
|
12
12
|
| **peer-dependency id** | `canvas` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.canvas` |
|
|
14
14
|
| **declared facets** | none defined |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| --- | --- |
|
|
9
9
|
| **witness:** | `claims-check` |
|
|
10
10
|
| **technical:** | `stable` |
|
|
11
|
-
| **adoption:** | `
|
|
11
|
+
| **adoption:** | `multi-witness` |
|
|
12
12
|
| **peer-dependency id** | `chat` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.chat` |
|
|
14
14
|
| **declared facets** | none defined |
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# `dataIntegration` extension
|
|
2
2
|
|
|
3
|
-
> **Status:
|
|
3
|
+
> **Status: Stable.**
|
|
4
4
|
|
|
5
5
|
`dataIntegration` names typed data-source operations: fetches from configured external sources, transforms and run-scoped variables. 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:** | `
|
|
11
|
-
| **adoption:** | `
|
|
10
|
+
| **technical:** | `stable` |
|
|
11
|
+
| **adoption:** | `single-witness` |
|
|
12
12
|
| **peer-dependency id** | `dataIntegration` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.data-integration` |
|
|
14
14
|
| **declared facets** | none defined |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| --- | --- |
|
|
9
9
|
| **witness:** | `claims-check` |
|
|
10
10
|
| **technical:** | `stable` |
|
|
11
|
-
| **adoption:** | `
|
|
11
|
+
| **adoption:** | `multi-witness` |
|
|
12
12
|
| **peer-dependency id** | `kanban` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.kanban` |
|
|
14
14
|
| **declared facets** | none defined |
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| --- | --- |
|
|
9
9
|
| **witness:** | `claims-check` |
|
|
10
10
|
| **technical:** | `stable` |
|
|
11
|
-
| **adoption:** | `
|
|
11
|
+
| **adoption:** | `multi-witness` |
|
|
12
12
|
| **peer-dependency id** | `knowledge` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.knowledge` |
|
|
14
14
|
| **declared facets** | none defined |
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# `launchStudio` extension
|
|
2
2
|
|
|
3
|
-
> **Status:
|
|
3
|
+
> **Status: Stable.**
|
|
4
4
|
|
|
5
5
|
`launchStudio` names launch-studio operations for the multi-canvas launch workflow. 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:** | `
|
|
11
|
-
| **adoption:** | `
|
|
10
|
+
| **technical:** | `stable` |
|
|
11
|
+
| **adoption:** | `multi-witness` |
|
|
12
12
|
| **peer-dependency id** | `launchStudio` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.launch-studio` |
|
|
14
14
|
| **declared facets** | none defined |
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# `messaging` extension
|
|
2
2
|
|
|
3
|
-
> **Status:
|
|
3
|
+
> **Status: Stable.**
|
|
4
4
|
|
|
5
5
|
`messaging` names outbound chat-egress dispatch through host-owned connectors. 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:** | `
|
|
11
|
-
| **adoption:** | `
|
|
10
|
+
| **technical:** | `stable` |
|
|
11
|
+
| **adoption:** | `single-witness` |
|
|
12
12
|
| **peer-dependency id** | `messaging` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.messaging` |
|
|
14
14
|
| **declared facets** | none defined |
|
|
@@ -32,12 +32,14 @@ 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.
|
|
36
|
+
|
|
35
37
|
## Conformance
|
|
36
38
|
|
|
37
39
|
`conformance/src/scenarios/v2-ext-rest-transport.test.ts` (major 2) records the witness under `openwop.family.restTransport`:
|
|
38
40
|
|
|
39
41
|
- **Conditional GET:** runs the `conformance-approval` fixture to `waiting-approval`. It checks for a strong `ETag`, a `304` with no body on a matching `If-None-Match`, and a changed `ETag` once the run completes.
|
|
40
|
-
- **Codings:** for each advertised coding, the decoded body is byte-identical to the identity body.
|
|
42
|
+
- **Codings:** for each advertised coding, the decoded body is byte-identical to the identity body. The probe goes through the base URL it is given, so it measures any front in the path.
|
|
41
43
|
|
|
42
44
|
A host without the claim records `inapplicable`. A host that makes the claim but lacks the fixture records `blocked`.
|
|
43
45
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
| --- | --- |
|
|
9
9
|
| **witness:** | `claims-check` |
|
|
10
10
|
| **technical:** | `stable` |
|
|
11
|
-
| **adoption:** | `
|
|
11
|
+
| **adoption:** | `multi-witness` |
|
|
12
12
|
| **peer-dependency id** | `webResearch` |
|
|
13
13
|
| **advertised as** | `extensions.<org>.web-research` |
|
|
14
14
|
| **declared facets** | none defined |
|
package/spec/v2/release.json
CHANGED
|
@@ -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.
|
|
4
|
-
"corpusTag": "v2.43.
|
|
5
|
-
"updated": "2026-09-
|
|
3
|
+
"version": "2.43.2",
|
|
4
|
+
"corpusTag": "v2.43.2",
|
|
5
|
+
"updated": "2026-09-28"
|
|
6
6
|
}
|