@openwop/spec-artifacts 2.45.17 → 2.45.19

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.45.17",
5
- "corpusTag": "v2.45.17",
4
+ "version": "2.45.19",
5
+ "corpusTag": "v2.45.19",
6
6
  "files": {
7
7
  "api/.redocly.lint-ignore.yaml": "bf5a8350b88a72fa43f59605ed8d903ed24b6cfccda5e45509c9f6ed9ee4e712",
8
8
  "api/asyncapi.yaml": "d5ecb9ee6114582be3b1f662c84bfac9ae96dae7bacb853e461168f70a8e1c7d",
9
9
  "api/grpc/openwop.proto": "c3e72bb17cba514ee98feb6434e6c9b6ea6795bfd086489ec69fd882dd1ad977",
10
10
  "api/openapi.yaml": "ac6de5303872664b78ff419c035915593e01599e02835e777a0123de1baeb398",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "d963b75d8b3b689a67e276f29024d7d2b58a4b4a79c11b9f2c112b30c5173156",
13
- "api/v2/asyncapi.yaml": "a1d8826c7a8c6bc64361a1db69b607025988fc7fb64a2cb52cca0a79f9ace7c5",
14
- "api/v2/openapi.yaml": "d9c1a78a13a32c653d148126c7dd086bd25e1394cac2f4a35db6290ffdc7fa3b",
12
+ "api/seams-v2.yaml": "f240b4205e4f1205b80278806db17fff394e5b4ef21a7ad1d2c3bda8ee080b5a",
13
+ "api/v2/asyncapi.yaml": "525ed38e2e0c5c0cb0785fb940f97ee3335c837f5797351ee954c3e312174bdb",
14
+ "api/v2/openapi.yaml": "9971c6250f45f8ea6f8b16d3f3e1a86556d65968342e9ec370f23018c118c872",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "bd1c00fae7b6fda506a75aff841bbdc438d4ce092642a72041203bee999b88de",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -103,11 +103,11 @@
103
103
  "schemas/v2/a2ui-surface-delta-frame.schema.json": "6889c5da3fe7e76cb614038c0eea6774776fa640448558b258eb87fb50cb9b64",
104
104
  "schemas/v2/agent-deployment-transition.schema.json": "93a334ff042d51378c89fdd7134664271bf9592419bb5e3e00821ed06bc1904e",
105
105
  "schemas/v2/agent-deployment.schema.json": "d59b43fb62b522005ee22bc3bc53775a6777493e5e42d71812abc347625fa7fe",
106
- "schemas/v2/agent-eval-suite.schema.json": "41caa4f3177ecc15f1c55b040eba8ddebf9490e0f113269b0d9bf2cba1442e45",
107
- "schemas/v2/agent-inventory-response.schema.json": "a10aaa896b8d0bc0f6159232095c4ee120947d51bf5b993181b9a576d3c98759",
108
- "schemas/v2/agent-manifest.schema.json": "0e6927f1d19ca404dffeb545faf81fa5b1acbaeb1c99b48dd5179071316407ce",
106
+ "schemas/v2/agent-eval-suite.schema.json": "b565c9af1fd665e11884e57525a581914deaa80a86e7a186a6c6623b207a55d0",
107
+ "schemas/v2/agent-inventory-response.schema.json": "5f74c3da946dfc3114624567a989717748081ab947b4d2af3f49034d67f4306b",
108
+ "schemas/v2/agent-manifest.schema.json": "004ff150e955deebb9e64273de5093f5144b9b3895b09953e65aa74b61140778",
109
109
  "schemas/v2/agent-org-chart.schema.json": "113b079e1dce95908467cbef7f83e076fdb82aab5b0678fc1a43e32bfc9cbadf",
110
- "schemas/v2/agent-ref.schema.json": "e0aedf6b3c3325024d3f0a6a8a2c3ffc26e61a0dfb992a3f757df54a1d42a060",
110
+ "schemas/v2/agent-ref.schema.json": "3d94801d76f6d4726a1c4f9c7ffc7456d5d73dd054eb0be134f6b1a9cbb7c5e9",
111
111
  "schemas/v2/agent-roster-entry.schema.json": "72132a80a3eb305e83727fbf6e105d7bd1790b481231d6ff864fd18d5554fc27",
112
112
  "schemas/v2/agent-roster-response.schema.json": "f646b8a5af9ee884e1a86a9c84ec29f10dd3dbb275711ce79db27bee981d4a1d",
113
113
  "schemas/v2/ai-envelope.schema.json": "0dc7dfbf032a37239ffd81fc2d67f999a40782ff5074866a56e414164cdee809",
@@ -118,8 +118,8 @@
118
118
  "schemas/v2/audit-verify-result.schema.json": "14af8e9283510f0a40e48a2059c929ee44e0fc9fa3cc66a95bfbe90b17c48297",
119
119
  "schemas/v2/budget-policy.schema.json": "1de68095db0beb5c7a4be629de26e79f62ebbe748a88d46f36e768edfd1f0d68",
120
120
  "schemas/v2/capabilities.schema.json": "c7a01b2f569139f99ba5e1a5329a42556fbd82bc743f8fd96963304395fc9ef0",
121
- "schemas/v2/certification-bundle.schema.json": "012c0176fbe05425507a8096412344388c0e2e1884c5fe1bc189ef1af0532997",
122
- "schemas/v2/channel-presence-payload.schema.json": "4eeb224910e6f7eee3ab5e7c3899559c25c83a26d0022e0ad195c4672611977a",
121
+ "schemas/v2/certification-bundle.schema.json": "9a3c67860f3b0867ff4733d3f8ae0f5d5d747b815ab39b6c255589f103119fa6",
122
+ "schemas/v2/channel-presence-payload.schema.json": "9a5227f8bcdb2ecd6c606938c8d835781f4654b88a7a30b0d7e8cd4dde1975ad",
123
123
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
124
124
  "schemas/v2/chat-card-pack-manifest.schema.json": "92a57db2fd4b2463f14ef155fef8e3f18afc78960b646459dcf32efc79ff6bf5",
125
125
  "schemas/v2/compact-tool-descriptor.schema.json": "b5c418d72082d5b713bf318212a83397e5be98e56d25ca056302b41b8dd8273b",
@@ -128,8 +128,8 @@
128
128
  "schemas/v2/configurable.schema.json": "33a6884047e2490f723733bf8b74d3b9164e00374cfea6dc3eac5a70dc368861",
129
129
  "schemas/v2/connection-pack-manifest.schema.json": "8d019de6bd0c5b14ea3b227580734ec792521493b396a850f7f9217aa7a6a547",
130
130
  "schemas/v2/connection-provider-registry.schema.json": "5b404da328a95c45808929e233ee766ebd635cf0df6f5d15d4c19354dfd7e75d",
131
- "schemas/v2/conversation-event.schema.json": "51dce69b33e3eb1913b9b2a0fcc0bee3dcf86761faf0c56dd004f4c580c95d39",
132
- "schemas/v2/conversation-turn.schema.json": "75bb6a4a03072a958feb5b34e2a1f40471e9e3996a81fa430b65717f0773c9a4",
131
+ "schemas/v2/conversation-event.schema.json": "c256a7da75b45beefa00d74c9a10efd91b6141cb9b35937f213310287b62bf7f",
132
+ "schemas/v2/conversation-turn.schema.json": "cdc75aa46aab8801ce0c08cee19056d039aa787e7fb09dcd817a8a992368169d",
133
133
  "schemas/v2/credential-provenance.schema.json": "f86b09e94b1c524dec7d1c6353965665ae8891e9517faef6e742d639c5578c99",
134
134
  "schemas/v2/credential-reference.schema.json": "ea699ce30f58fb2c32d4279158b3f730f70be7b2dc8c3037693a76e66eb3e001",
135
135
  "schemas/v2/debug-bundle.schema.json": "0ec1e0bca9c0a359cc6cf3448e5200a1c3d3d5b1e5efaa6605231477daaf3fee",
@@ -148,9 +148,9 @@
148
148
  "schemas/v2/eval-summary.schema.json": "2f384daf05b8f3b4f604688cae504d6d9971ba41b8c771e55fe9a17e09e86b7a",
149
149
  "schemas/v2/export-bundle.schema.json": "bd28905a7729437ab7f2ad8bb33e13a371b2bf5605a7eb2962a0d246de312d69",
150
150
  "schemas/v2/form-content-pack-manifest.schema.json": "a1942a124e250a6e9fbdb6b811c5a125e78fbcbcaa46dfc71d0636f24710a339",
151
- "schemas/v2/frontend-plugin-manifest.schema.json": "fed6b8ddb3056c53b1bfc91525410a4445a3c37a8bf9eb9f6f9964ffea26d993",
151
+ "schemas/v2/frontend-plugin-manifest.schema.json": "b279da288d542906a72b8cb4e872e001de632eaff539e0259b9cce287f82bf8f",
152
152
  "schemas/v2/goal.schema.json": "ad104ed5a3866736b8fed9d7c0b23dc82af526b5bef4afe848f01fc3af2161e9",
153
- "schemas/v2/heartbeat-evaluated.schema.json": "4086b1ba1d0547c08b038dfb263ac89416a3e406430db1250156fb2f9b74f8d6",
153
+ "schemas/v2/heartbeat-evaluated.schema.json": "c897b0792fd518d6e12879851027252af1529f5e420c3eaf434ad7af284ecc05",
154
154
  "schemas/v2/heartbeat-state-changed.schema.json": "eb68d0082aa996650e3a6b8ccf32457f959cebc7e6728cc7c331b9d171a4bef6",
155
155
  "schemas/v2/ids.schema.json": "65cfaa193be0ca9cf48af39c18c553979e3ec1f7fc04509aaa513b322d7b7e4a",
156
156
  "schemas/v2/localized-content-language-settings.schema.json": "3c8350a178037a460f5d87466ccaf9ed5fe3d41497786d2504cc66e42152c8cc",
@@ -158,8 +158,8 @@
158
158
  "schemas/v2/localized-content-page.schema.json": "72560563cc2956ecc9aa4c04fceaf1f7f08d2c6520b7d1b2fa8e52f9b825d8e7",
159
159
  "schemas/v2/localized-content-section.schema.json": "b52cfe36c857c2800f71c480dcd7323e1a29783ecdc9f2440bc8e75a5a034346",
160
160
  "schemas/v2/memory-entry.schema.json": "290576ae84f4fef4cdf975932b87963283b11c50ea3d2654b32cd96aa6537c3d",
161
- "schemas/v2/memory-list-options.schema.json": "f66703bccb68efb28391c273abb66aa117ee5b5ce475c477846ed700c336afcd",
162
- "schemas/v2/node-pack-manifest.schema.json": "6e25106c647d58ff6b11c198a83de7f1f988e47c8e3bf9f28ac5f84eef900f5d",
161
+ "schemas/v2/memory-list-options.schema.json": "01ceb7370c4eacd227d2c9b7e1951ee16650abe26a32dc9d6a8e46a07a39093f",
162
+ "schemas/v2/node-pack-manifest.schema.json": "3eb2db1d84f0b8dbde917686c72c121788a4ce6e42cf13d497a3b68564546d0e",
163
163
  "schemas/v2/orchestrator-decision.schema.json": "4d4b4c5fe73c22a1f42242b403650206ad58fd981f8fd45795894cebe3a514ae",
164
164
  "schemas/v2/org-chart-responsibility-view.schema.json": "8a2565e4cdc6737a3946a70799f93642808b92f9c8d56dcdff3a0782053b89a1",
165
165
  "schemas/v2/pack-lockfile.schema.json": "2685417702c105146b780cd99154296a46578fbb10d81c8c713348ee26fea898",
@@ -173,7 +173,7 @@
173
173
  "schemas/v2/residency.schema.json": "3fd23c9732beb140504e81560fc426eb6764d547e56da5fb92c5a5c7bf04db3a",
174
174
  "schemas/v2/run-ancestry-response.schema.json": "334c17f2062dea62726ca1d07b8be3f169cdc422af843c1def5fb317039814c9",
175
175
  "schemas/v2/run-diff-response.schema.json": "8bdb2045c274580038bd74781f7d062f5049839797c164a89de4ed89edc53a74",
176
- "schemas/v2/run-event-payloads.schema.json": "942d6f65a765f6b574922a54d1e531ab66bc8d5c673a006ec68f8d75f3f0aec9",
176
+ "schemas/v2/run-event-payloads.schema.json": "cb331e0b5adf8374124426a77a4f5c915df62b944e97cdaf3107cfe44733a629",
177
177
  "schemas/v2/run-event.schema.json": "2f0d7416bd376c56affe97b6b2b49981532e8e9ff45c0a162cf806c78b3e7fb7",
178
178
  "schemas/v2/run-list-response.schema.json": "c2dbc34768dcf64528914a213aa3cb55952e8e3e90a64b04a9423b2a19749d38",
179
179
  "schemas/v2/run-options.schema.json": "f0e9f494d80086c2ed2cf9fe87df54e5b4e66601699c4a1089f4edbc7ba58867",
@@ -186,7 +186,7 @@
186
186
  "schemas/v2/subject-link.schema.json": "1fc941d6c14af886534009f2ffa6611e2035eb07e30b1df918c50d6bafff026c",
187
187
  "schemas/v2/subject.schema.json": "094e981fb20052a911393e219ea5f2065d8b8417b65080a70c5ea99fd960a8fe",
188
188
  "schemas/v2/suspend-request.schema.json": "368d9932efb08f85b4520cac44b3c553876209f55bada93b5fcac93cc890b411",
189
- "schemas/v2/tool-descriptor.schema.json": "8c98fb5e93bc649dff859d3d1dde8075db929efd6c49c496252d0a88cccc73e1",
189
+ "schemas/v2/tool-descriptor.schema.json": "9bfe8a1ee5ea55d1c23e383d97234d9d6545d833996d7bc30caf075e0a6294bb",
190
190
  "schemas/v2/trigger-dead-letter-page.schema.json": "571f8c39b64571bff20d391a6e6e829d4ce470ab790b2b7f810cc4aa40edcbc1",
191
191
  "schemas/v2/trigger-event.schema.json": "710ecca8b3ecdad3a532a96768177f062192b24a589a4f798c7eb24bab64b30a",
192
192
  "schemas/v2/trigger-subscription-registration.schema.json": "5f7959f3e13f49399783e47f73101d6af95e5abccea1af2f0014ccbe3e51006c",
@@ -195,8 +195,8 @@
195
195
  "schemas/v2/webhook-dead-letter-page.schema.json": "543f5ccc26d8f777684a037172ab7b9fdf70735e5394eeb42e5fa6569503f528",
196
196
  "schemas/v2/webhook-delivery.schema.json": "4e8ab3b722ad1731adf0548c1217f0de62da40de14e8abf77533aee4ace4c079",
197
197
  "schemas/v2/webhook-verification.schema.json": "76e4e0d81143ffd2649bc7adba2aa34f2525e2c4e9f0300a425d908b3163196b",
198
- "schemas/v2/workflow-chain-pack-manifest.schema.json": "0816c6c59a91452d6fa1931394b766780eaf90949c9f7cd0ced522dadd32ff81",
199
- "schemas/v2/workflow-definition.schema.json": "3f031c0cb1644ac21f203945a0860e04dcea4bd1ab722f280bdcdc788edd0a22",
198
+ "schemas/v2/workflow-chain-pack-manifest.schema.json": "c0e38aa96b029c539415fb7e8a793fd770c3eb5a1b44a818661f9c127c99191b",
199
+ "schemas/v2/workflow-definition.schema.json": "cb1194631d2b96b0975940b916be43a70363b78b1b6716f9cd84b162d3c96615",
200
200
  "schemas/v2/workload-identity.schema.json": "1f589debfac6d70e0908da511550ec69a27b4bcc8314551cd843b6d923605efc",
201
201
  "schemas/v2/workspace-file-create.schema.json": "b6b5260857318c3b67de0231ed15e3a746f525880a763e7b36a7854178dd10d0",
202
202
  "schemas/v2/workspace-file.schema.json": "d2ed39e8c229dde33b56905c8df6f8b2ff056c97e1c5f615e3124baa54a6254f",
@@ -207,14 +207,14 @@
207
207
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
208
208
  "spec/v1/alias-detectors.json": "0b2f28808ffe0b9d98a187775038c3406bb70919747a788a6e4f866e293ae6d3",
209
209
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
210
- "spec/v1/core-standard-manifest.json": "2ad9ad7d0d478da17f8b9829997c4fc9b905162e3c2b0c6e4828f50470f7f4e0",
210
+ "spec/v1/core-standard-manifest.json": "806e07cd5de0684b09db910394d8713d0f6f45dc318803374a183cc57d07bf86",
211
211
  "spec/v1/deprecations.json": "a3293072ea951857395d05f0437264e88965f1e9019ff61c55bacfa9c1aaa17c",
212
212
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
213
213
  "spec/v1/end-of-support.json": "35f0bf3b70fe78b16e2a2fd81a153fc27e703f6c16376c6fe7cdf1f4f2c4e6d4",
214
214
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
215
215
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
216
216
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
217
- "spec/v1/gaps.json": "68e23cccf787f77e31710671baa3618ca24ee6eada68df84a7b55dc746762a2a",
217
+ "spec/v1/gaps.json": "9271f9796be51dc5182ad7ed00445b50c67e1c3d33fc76b47f080a985dd647d7",
218
218
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
219
219
  "spec/v1/migrations.json": "4c50760be70cb644d02427bcaf5749606700edf4513f423903cf3b1d12f5c300",
220
220
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -222,7 +222,7 @@
222
222
  "spec/v1/spec-gaps.json": "ea9612af55bea9dae3e82223d4f714243f8f590b0193f1188257b13491a38afc",
223
223
  "spec/v2/README.md": "ddea90d7cf14aefffe1a43eeeecd4222dadad1d1e5ac64dceb073990eb93d9ef",
224
224
  "spec/v2/core/artifact-type-packs.md": "f734740cc3963f86c9f273a7dace26291bba2855161ddd3540618131a2c8d13e",
225
- "spec/v2/core/capabilities.md": "04feda1747ca8f97443176cbf82d7d69891322a7bbf9a9bed88f519b8fb574fe",
225
+ "spec/v2/core/capabilities.md": "ed4664a38f53cee32d0082d9fe99091ce13a9874081150fdc72b9b41d4ef9e72",
226
226
  "spec/v2/core/conformance.md": "3ca291e63bc70a6ef829ae8759ad0ded3741ea7aa507bbbdffc57de443ab2ae2",
227
227
  "spec/v2/core/connection-packs.md": "c80f95bd6a03698f35c72cdb2b46bd973f49203bbd786c26760e35fa86e6f23d",
228
228
  "spec/v2/core/conversation.md": "354fa57c73d11062e523a44aa75a6353c5c81aefaf306d30c42416a228c82c86",
@@ -230,11 +230,11 @@
230
230
  "spec/v2/core/events.md": "c1a20e3aa6736119ea07aa2cf66faa808a1874d2cde4933033b65506d1742883",
231
231
  "spec/v2/core/execution.md": "8a0c9db1bbfb97c008ab9328b7333c1cc3318196e78bfbefb49e781bdf4f9d44",
232
232
  "spec/v2/core/form-content-packs.md": "02931227899676fd4581a27017be2a6c4953904717be9b81c29d12f87ab3917d",
233
- "spec/v2/core/headers.md": "60aee0768bb1b15cf8ff783170ba6541c8c106da417c8a066c8f85cb6a5b1ba1",
233
+ "spec/v2/core/headers.md": "24b0d84ab5521e20f2669fca8006a11f9faf5c2311199e57375b8fa64ce763ed",
234
234
  "spec/v2/core/host-services.md": "73f26ea32891044131d63f9861d2cbddccb5d08bf76e29e47afef9bb5b646791",
235
235
  "spec/v2/core/i18n.md": "882904b7d59f992ab1e5f7346167161a54cf665b8fee47e64a3862cf9133a580",
236
236
  "spec/v2/core/idempotency.md": "adbd317a6ebb57c2759c076297b31f67def9e391576bccd0bbea787b13e85872",
237
- "spec/v2/core/identity.md": "f61dc646f56fc1c07016c3acec9e8eb8c51051c55ecbedc986de793669fb6e6b",
237
+ "spec/v2/core/identity.md": "02656ffa413b5546342b8580ae928a74e621460746df74d7db50ff4df41d2310",
238
238
  "spec/v2/core/interop.md": "fb1d72bb76afda1c2b4394daf019982c207dbb490087ab141daf6eb2446e2eef",
239
239
  "spec/v2/core/interrupt.md": "10f15dfe30baa0fc748aea0a067f9b271bea316fde6b598d78f77edc296f698a",
240
240
  "spec/v2/core/node-pack-runtimes.md": "e1088cb69b8c3c67256c494063328916c2980ab1aa97a7063de25bab82fdb1e5",
@@ -244,7 +244,7 @@
244
244
  "spec/v2/core/persistence.md": "249a1de353f421cdf92b9006a13a10afdb002f4029eb6a13520cc95252edb2ec",
245
245
  "spec/v2/core/portability.md": "ab13a6ca43544b9a6a91edfb377ec680c768d14be841c84fb79125b231426891",
246
246
  "spec/v2/core/replay.md": "4a8b53325e18aa53400ece81168c76b4402b932e5e304a391754f293b126eabf",
247
- "spec/v2/core/runs.md": "bee5da861b31a583257f3d6020fbd245c36ba5ec40340d54ae6741f0c6f50ede",
247
+ "spec/v2/core/runs.md": "1c292c0ab4a3119aeff3a6e9b6e99cff69782df78c3872179f9f0661b6204f23",
248
248
  "spec/v2/core/security-defaults.md": "887d8c4bc592094e3b931c23f1c2175c18ebbd47528b074016f9d2091bc513b2",
249
249
  "spec/v2/core/storage.md": "dc94b985847c1341c7a064f04a6010f0fdbe6c3ab3e555d4362878c81d764c18",
250
250
  "spec/v2/core/tool-catalog.md": "d16a9004418719c48301804aefa4d7ab6f41112a4ed83727f552aa1b92b418b0",
@@ -309,9 +309,9 @@
309
309
  "spec/v2/path-manifest.json": "b84c7561f50c7df0cb61b202bd6595acad3ee7edca7a45f711949bea3c69bd27",
310
310
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
311
311
  "spec/v2/profiles.json": "180beb9ef2d161766fa23b2987e7e829851e3d316273147cf6a4a3f324befd6b",
312
- "spec/v2/release.json": "5b6e531003a3c47ed176f1f4fa1777b3b597cb386f31b1bfe4ac962df16ae4a3",
312
+ "spec/v2/release.json": "9e25694dc4997c4291d86a3e65346a9db37af36cff411155de29b9619a169c90",
313
313
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
314
- "spec/v2/surface-baseline.json": "273566823eac3465b9f692c9cb795eca669e753bd0e733575b4722d176e115ce"
314
+ "spec/v2/surface-baseline.json": "97a0dc8dc715ed872d766aceb91f991e031b0bd160421037d6927fa21e9646b5"
315
315
  },
316
- "corpusCommit": "725db8ec383cc3d61068846def2d5b90771b8933"
316
+ "corpusCommit": "d1ece01b982dd1ad4eee4bd29b144e4a82b0db22"
317
317
  }
package/api/seams-v2.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP conformance seams profile (openwop-conformance-seams-v2)
4
- version: 2.45.17
4
+ version: 2.45.19
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.45.17
4
+ version: 2.45.19
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.45.17
4
+ version: 2.45.19
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
@@ -75,8 +75,8 @@ paths:
75
75
  schema:
76
76
  type: string
77
77
  description: Conditional request on the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot).
78
- A value matching the `ETag` the host sent MUST yield `304 Not Modified` with no body. The 304 carries `OpenWOP-Version`
79
- like every response (versioning.md §1.4).
78
+ A value that matches the current `ETag` (runs.md §Caching and encoding) MUST yield `304 Not Modified` with no body.
79
+ The 304 carries `OpenWOP-Version` like every response (versioning.md §1.4).
80
80
  - $ref: '#/components/parameters/OpenWOPVersion'
81
81
  - $ref: '#/components/parameters/OpenWOPClientVersion'
82
82
  responses:
@@ -90,8 +90,8 @@ paths:
90
90
  ETag:
91
91
  schema:
92
92
  type: string
93
- description: Strong validator for the discovery document (capabilities.md §1). A v2 host MUST send it and MUST
94
- honor `If-None-Match` with `304`. A host that changes semantics without changing the bytes is non-conformant.
93
+ description: Validator for the discovery document (capabilities.md §1). A v2 host MUST send it and MUST honor
94
+ `If-None-Match` with `304`. A host that changes semantics without changing the bytes is non-conformant.
95
95
  OpenWOP-Version:
96
96
  $ref: '#/components/headers/OpenWOPVersion'
97
97
  content:
@@ -439,8 +439,8 @@ paths:
439
439
  schema:
440
440
  type: string
441
441
  description: Conditional request on the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot).
442
- A value matching the `ETag` the host sent MUST yield `304 Not Modified` with no body. The 304 carries `OpenWOP-Version`
443
- like every response (versioning.md §1.4).
442
+ A value that matches the current `ETag` (runs.md §Caching and encoding) MUST yield `304 Not Modified` with no body.
443
+ The 304 carries `OpenWOP-Version` like every response (versioning.md §1.4).
444
444
  - $ref: '#/components/parameters/OpenWOPVersion'
445
445
  - $ref: '#/components/parameters/OpenWOPClientVersion'
446
446
  responses:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.45.17",
3
+ "version": "2.45.19",
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": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/agent-eval-suite.schema.json",
4
4
  "title": "AgentEvalSuite",
5
- "description": "RFC 0081 §A. A portable, host-agnostic evaluation suite for a manifest agent (RFC 0003/0070): the tasks, the expected outputs or rubrics, the deterministic tool/memory fixtures, the allowed model classes, and the pass/fail thresholds that answer \"is this agent good enough to deploy?\". Distributed inside a pack tarball and referenced by URI exactly like `systemPromptRef` / `handoff.*SchemaRef` (RFC 0003 §C/§D) — NOT embedded in `AgentManifest`. A host advertising `capabilities.agents.evalSuite.supported: true` executes a suite as an eval run (a `mode: \"eval\"` projection over `POST /runs`, RFC 0081 §B) and terminates with an `eval-summary.schema.json` scorecard. The suite carries NO secret material and NO host-internal identifiers (it is authored offline and shipped in a signed pack).",
5
+ "description": "RFC 0081 §A. A portable, host-agnostic evaluation suite for a manifest agent (RFC 0003/0070): the tasks, the expected outputs or rubrics, the deterministic tool/memory fixtures, the allowed model classes, and the pass/fail thresholds that answer \"is this agent good enough to deploy?\". Distributed inside a pack tarball and referenced by URI exactly like `systemPromptRef` / `handoff.*SchemaRef` (RFC 0003 §C/§D) — NOT embedded in `AgentManifest`. A host advertising `agents.evalSuite` executes a suite as an eval run (a `mode: \"eval\"` projection over `POST /runs`, RFC 0081 §B) and terminates with an `eval-summary.schema.json` scorecard. The suite carries NO secret material and NO host-internal identifiers (it is authored offline and shipped in a signed pack).",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/agent-inventory-response.schema.json",
4
4
  "title": "AgentInventoryResponse",
5
- "description": "Response body for `GET /agents` (RFC 0072 §A). A read-only projection of the manifest agents a host has installed into its AgentRegistry (RFC 0003 / RFC 0070). Served only when the host advertises `capabilities.agents.manifestRuntime.supported: true`. Each entry MUST NOT carry the agent's system-prompt body, resolved handoff schemas, or any credential material (SR-1).",
5
+ "description": "Response body for `GET /agents` (RFC 0072 §A). A read-only projection of the manifest agents a host has installed into its AgentRegistry (RFC 0003 / RFC 0070). Served only when the host advertises `agents.manifestRuntime`. Each entry MUST NOT carry the agent's system-prompt body, resolved handoff schemas, or any credential material (SR-1).",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -133,7 +133,7 @@
133
133
  "roster": {
134
134
  "type": "array",
135
135
  "uniqueItems": true,
136
- "description": "RFC 0086 §B. OPTIONAL/additive. The standing roster INSTANCES of this manifest agent visible to the caller (tenant-scoped per RFC 0074), each with its persona + owned workflow portfolio — so a single GET /agents call surfaces responsibilities without a second round-trip. Present only when the host advertises `capabilities.agents.roster.supported: true`; absent ⇒ no roster surface (today's default).",
136
+ "description": "RFC 0086 §B. OPTIONAL/additive. The standing roster INSTANCES of this manifest agent visible to the caller (tenant-scoped per RFC 0074), each with its persona + owned workflow portfolio — so a single GET /agents call surfaces responsibilities without a second round-trip. Present only when the host advertises `agents.roster`; absent ⇒ no roster surface (today's default).",
137
137
  "items": {
138
138
  "type": "object",
139
139
  "additionalProperties": false,
@@ -44,7 +44,7 @@
44
44
  },
45
45
  "evalSuiteRef": {
46
46
  "type": "string",
47
- "description": "RFC 0081 §A. MAY. URI-reference to an `agent-eval-suite.schema.json` file inside the pack tarball (e.g., `evals/support-resolver.json`), resolved at install exactly like `systemPromptRef` / `handoff.*SchemaRef`. Declares the agent's portable evaluation suite (golden/rubric/adversarial/regression/live-shadow tasks + thresholds) so a host advertising `capabilities.agents.evalSuite.supported: true` can run it as a `mode: \"eval\"` run. Absent ⇒ the agent ships no suite (a suite MAY still be authored independently and pointed at this `agentId` at run time). Does NOT embed the suite in the manifest — the suite evolves on its own cadence and is often authored by a different role.",
47
+ "description": "RFC 0081 §A. MAY. URI-reference to an `agent-eval-suite.schema.json` file inside the pack tarball (e.g., `evals/support-resolver.json`), resolved at install exactly like `systemPromptRef` / `handoff.*SchemaRef`. Declares the agent's portable evaluation suite (golden/rubric/adversarial/regression/live-shadow tasks + thresholds) so a host advertising `agents.evalSuite` can run it as a `mode: \"eval\"` run. Absent ⇒ the agent ships no suite (a suite MAY still be authored independently and pointed at this `agentId` at run time). Does NOT embed the suite in the manifest — the suite evolves on its own cadence and is often authored by a different role.",
48
48
  "minLength": 1
49
49
  },
50
50
  "toolAllowlist": {
@@ -47,7 +47,7 @@
47
47
  "type": "string",
48
48
  "minLength": 1,
49
49
  "maxLength": 64,
50
- "description": "RFC 0082 §A. Optional NAMED deployment-channel binding (e.g. `stable`, `canary`, or the reserved `latest` = highest active semver), as an alternative to the exact `version` pin. A host advertising `capabilities.agents.deployment.supported: true` resolves the channel to a concrete version and pins it per-(run, agentId, channel) at first resolution (RFC 0082 §B) — the resolved version is a recorded fact carried on `agent.invocation.started.resolvedAgentVersion`, re-read on replay and NEVER re-resolved against a moved channel. Mutually exclusive with `version` (the `not` clause below). A channel that resolves to no `active` version is refused at run creation with `validation_error`, or fails the run with `not_found` (`details.service: agents`). Hosts that omit `agents.deployment` MUST reject a `channel`-bearing ref with `validation_error` (the channel has nowhere to resolve)."
50
+ "description": "RFC 0082 §A. Optional NAMED deployment-channel binding (e.g. `stable`, `canary`, or the reserved `latest` = highest active semver), as an alternative to the exact `version` pin. A host advertising `agents.deployment` resolves the channel to a concrete version and pins it per-(run, agentId, channel) at first resolution (RFC 0082 §B) — the resolved version is a recorded fact carried on `agent.invocation.started.resolvedAgentVersion`, re-read on replay and NEVER re-resolved against a moved channel. Mutually exclusive with `version` (the `not` clause below). A channel that resolves to no `active` version is refused at run creation with `validation_error`, or fails the run with `not_found` (`details.service: agents`). Hosts that omit `agents.deployment` MUST reject a `channel`-bearing ref with `validation_error` (the channel has nowhere to resolve)."
51
51
  },
52
52
  "sourceManifestId": {
53
53
  "type": "string",
@@ -266,7 +266,7 @@
266
266
  "properties": {
267
267
  "id": {
268
268
  "type": "string",
269
- "pattern": "^openwop\\.(?!it\\.(?:a2a-parts-schemas|a2ui-v09-profile|artifact-schema-compile-bounded|artifact-type-legacy-ids|bundle-maturity-gate|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|locale-key-grammar|multi-region-effect-vocabulary|node-pack-mcp-server-record|normative-example-extraction|openapi-asyncapi-sdk-parity|openapi-security-declared|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|removal-dates-minor|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-descriptor-annotations|tool-result-trust-monotone|v1-webhook-rotation-contract|v1-webhook-unregister-contract|v2-alias-covers-reword|v2-bundle-signature-attributable|v2-bundle-witness-preimage|v2-colocated-companion|v2-conversation-payload-mirrors|v2-corpus-tag-pinned|v2-declaration-parity|v2-envelope-catalog|v2-eos-clock|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-facet-advertisement|v2-front-door-counts|v2-id-kinds-bound|v2-interop-map-coherent|v2-lane-exp-only-schema|v2-normative-home-gate|v2-one-signing-scheme|v2-path-parity|v2-push-credential-coherent|v2-release-identity|v2-req-only-assertions|v2-retention-floors|v2-retirement-gate|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-surface-monotone-gate|v2-threat-model-template|v2-umbrella-alias-covered|v2-umbrella-child-parts|v2-umbrella-codemod-at-active|v2-umbrella-codemod-legs|v2-umbrella-migration-deprecation|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
269
+ "pattern": "^openwop\\.(?!it\\.(?:a2a-parts-schemas|a2ui-v09-profile|artifact-schema-compile-bounded|artifact-type-legacy-ids|bundle-maturity-gate|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|locale-key-grammar|multi-region-effect-vocabulary|node-pack-mcp-server-record|normative-example-extraction|openapi-asyncapi-sdk-parity|openapi-security-declared|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|removal-dates-minor|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-descriptor-annotations|tool-result-trust-monotone|v1-webhook-rotation-contract|v1-webhook-unregister-contract|v2-ai-envelope-shape-static|v2-alias-covers-reword|v2-artifact-created-static|v2-bundle-signature-attributable|v2-bundle-witness-preimage|v2-colocated-companion|v2-conversation-payload-mirrors|v2-corpus-tag-pinned|v2-declaration-parity|v2-envelope-catalog|v2-envelope-tier-one-universal-static|v2-envelope-variant-discriminator-static|v2-eos-clock|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-export-bundle-static|v2-externally-gated-never-stable|v2-facet-advertisement|v2-front-door-counts|v2-id-kinds-bound|v2-interop-map-coherent|v2-lane-exp-only-schema|v2-media-inline-cap-static|v2-normative-home-gate|v2-one-signing-scheme|v2-path-parity|v2-provider-usage-payload-static|v2-push-credential-coherent|v2-release-identity|v2-req-only-assertions|v2-retention-floors|v2-retirement-gate|v2-seams-not-in-canonical|v2-security-defaults-table|v2-self-hosted-runner-frames-static|v2-spec-artifacts-digest|v2-surface-monotone-gate|v2-threat-model-template|v2-umbrella-alias-covered|v2-umbrella-child-parts|v2-umbrella-codemod-at-active|v2-umbrella-codemod-legs|v2-umbrella-migration-deprecation|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
270
270
  "description": "RFC 0168 §A.1 — `openwop.<area>.<slug>`. The suite mints six areas: `requirement` (an explicit `req()` id), `it` (a per-test id from the scenario file and title), `scenario` and `floor` (per-file rows), `profile` (a claimed-profile row) and `family` (a capability gate). The lookahead refuses every id minted from a corpus-coherence file: those run in the spec repo’s CI and MUST NOT appear in a host bundle (conformance.md §\"Two products, two ledgers\"; RFC 0168 §D.1). `scripts/check-req-only.mjs` fails when the list drifts from `conformance/src/coherence/`."
271
271
  },
272
272
  "scenario": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/channel-presence-payload.schema.json",
4
4
  "title": "ChannelPresencePayload",
5
- "description": "Payload of the OPTIONAL `channel.presence` RunEvent (RFC 0110). EPHEMERAL live presence for a `type:'channel'` conversation — who is currently present + (optionally) who is typing. A host MUST NOT persist this event to the replayable event log / transcript, and it MUST NOT affect replay or `:fork` determinism (presence is live state, the load-bearing distinction from the persisted `conversation.exchanged` turn — see replay.md). Membership-gated: every ref MUST be a current channel participant and the event MUST NOT be delivered to a non-member (the same DEFAULT-DENY visibility as the channel's messages; cross-tenant delivery is forbidden, CTI-1). NON-PII: subject refs are the opaque RFC 0041 vocabulary only — no IP/location/device. A host MAY emit; if it advertises `channelPresence.supported` it MUST. Gated on `channelPresence.supported` (capabilities.schema.json). See RFC 0110.",
5
+ "description": "Payload of the OPTIONAL `channel.presence` RunEvent (RFC 0110). EPHEMERAL live presence for a `type:'channel'` conversation — who is currently present + (optionally) who is typing. A host MUST NOT persist this event to the replayable event log / transcript, and it MUST NOT affect replay or `:fork` determinism (presence is live state, the load-bearing distinction from the persisted `conversation.exchanged` turn — see replay.md). Membership-gated: every ref MUST be a current channel participant and the event MUST NOT be delivered to a non-member (the same DEFAULT-DENY visibility as the channel's messages; cross-tenant delivery is forbidden, CTI-1). NON-PII: subject refs are the opaque RFC 0041 vocabulary only — no IP/location/device. A host MAY emit; if it advertises `channelPresence` it MUST. Gated on the host advertising `channelPresence` (capabilities.schema.json). See RFC 0110.",
6
6
  "type": "object",
7
7
  "required": [
8
8
  "conversationId",
@@ -111,7 +111,7 @@
111
111
  },
112
112
  "model": {
113
113
  "type": "object",
114
- "description": "RFC 0109 — OPTIONAL provenance: which model produced this `role: 'agent'` turn. NON-SECRET, NON-PII: provider + model identifiers ONLY (`additionalProperties: false` forbids any credential/endpoint/prompt leaking in — the SR-1 secret-redaction guard). Stamped at emit; read VERBATIM on `:fork` (never re-resolved). A host that stamps it MUST advertise `conversationTurnModelProvenance.supported: true`. Absent ⇒ no advertisement; clients MUST tolerate its absence.",
114
+ "description": "RFC 0109 — OPTIONAL provenance: which model produced this `role: 'agent'` turn. NON-SECRET, NON-PII: provider + model identifiers ONLY (`additionalProperties: false` forbids any credential/endpoint/prompt leaking in — the SR-1 secret-redaction guard). Stamped at emit; read VERBATIM on `:fork` (never re-resolved). A host that stamps it MUST advertise `conversationTurnModelProvenance`. Absent ⇒ no advertisement; clients MUST tolerate its absence.",
115
115
  "additionalProperties": false,
116
116
  "required": [
117
117
  "provider",
@@ -191,7 +191,7 @@
191
191
  "items": {
192
192
  "$ref": "#/$defs/AgentRef"
193
193
  },
194
- "description": "RFC 0101. OPTIONAL. The agent cohort permitted to speak in this conversation (multi-party group conversation / advisory council). Each `agentId` is a roster INSTANCE id (`host:<id>` per RFC 0086). When present (and the host advertises `multiPartyConversation.supported`), a turn whose `speakerId` is not a member of this roster MUST be rejected. Disambiguates the singular `agentId` (the owner) from the full speaking cohort. Absent ⇒ no roster enforcement (back-compat: single-agent conversations are unaffected). MVP: declared at open-time only; mid-conversation roster mutation is out of scope (RFC 0101 §Resolved questions)."
194
+ "description": "RFC 0101. OPTIONAL. The agent cohort permitted to speak in this conversation (multi-party group conversation / advisory council). Each `agentId` is a roster INSTANCE id (`host:<id>` per RFC 0086). When present (and the host advertises `multiPartyConversation`), a turn whose `speakerId` is not a member of this roster MUST be rejected. Disambiguates the singular `agentId` (the owner) from the full speaking cohort. Absent ⇒ no roster enforcement (back-compat: single-agent conversations are unaffected). MVP: declared at open-time only; mid-conversation roster mutation is out of scope (RFC 0101 §Resolved questions)."
195
195
  },
196
196
  "initialTurn": {
197
197
  "$ref": "#/$defs/ConversationTurn"
@@ -90,7 +90,7 @@
90
90
  },
91
91
  "model": {
92
92
  "type": "object",
93
- "description": "RFC 0109 — OPTIONAL provenance: which model produced this `role: 'agent'` turn. NON-SECRET, NON-PII: provider + model identifiers ONLY (`additionalProperties: false` forbids any credential/endpoint/prompt leaking in — the SR-1 secret-redaction guard). Stamped at emit; read VERBATIM on `:fork` (never re-resolved). A host that stamps it MUST advertise `conversationTurnModelProvenance.supported: true`. Absent ⇒ no advertisement; clients MUST tolerate its absence.",
93
+ "description": "RFC 0109 — OPTIONAL provenance: which model produced this `role: 'agent'` turn. NON-SECRET, NON-PII: provider + model identifiers ONLY (`additionalProperties: false` forbids any credential/endpoint/prompt leaking in — the SR-1 secret-redaction guard). Stamped at emit; read VERBATIM on `:fork` (never re-resolved). A host that stamps it MUST advertise `conversationTurnModelProvenance`. Absent ⇒ no advertisement; clients MUST tolerate its absence.",
94
94
  "additionalProperties": false,
95
95
  "required": [
96
96
  "provider",
@@ -123,12 +123,12 @@
123
123
  "type": "string",
124
124
  "minLength": 1,
125
125
  "maxLength": 256,
126
- "description": "RFC 0101. Stable speaker identity of this turn — the roster INSTANCE id of the agent that produced it (the `host:<id>` AgentRef agentId per `agent-roster-entry.schema.json` §A / RFC 0086), NOT the manifest/class `AgentRef.agentId`. REQUIRED when `role: 'agent'` (the conditional below) so that 'turn N was spoken by agent X' is an observable, replay-stable, cross-host-projectable fact in a multi-party transcript. When a `participants` roster is declared on `conversation.opened` (RFC 0101), `speakerId` MUST be a member of that roster; a turn whose `speakerId` is not a participant MUST be rejected (host-enforced, capability-gated on `multiPartyConversation.supported`). For `role: 'user'` / `role: 'system'` turns the field is OPTIONAL and carries no normative meaning. Additive-safe: pre-RFC-0101 `role: 'agent'` turns that omit it are accepted by hosts that do NOT advertise `multiPartyConversation`."
126
+ "description": "RFC 0101. Stable speaker identity of this turn — the roster INSTANCE id of the agent that produced it (the `host:<id>` AgentRef agentId per `agent-roster-entry.schema.json` §A / RFC 0086), NOT the manifest/class `AgentRef.agentId`. REQUIRED when `role: 'agent'` (the conditional below) so that 'turn N was spoken by agent X' is an observable, replay-stable, cross-host-projectable fact in a multi-party transcript. When a `participants` roster is declared on `conversation.opened` (RFC 0101), `speakerId` MUST be a member of that roster; a turn whose `speakerId` is not a participant MUST be rejected (host-enforced, capability-gated on the host advertising `multiPartyConversation`). For `role: 'user'` / `role: 'system'` turns the field is OPTIONAL and carries no normative meaning. Additive-safe: pre-RFC-0101 `role: 'agent'` turns that omit it are accepted by hosts that do NOT advertise `multiPartyConversation`."
127
127
  }
128
128
  },
129
129
  "allOf": [
130
130
  {
131
- "$comment": "RFC 0101 — agent turns MUST carry speaker attribution. Conditional (not unconditional `required`) so the field is only mandatory for `role: 'agent'`; `user`/`system` turns and pre-RFC-0101 producers on non-multi-party hosts are unaffected. Capability-gated: hosts enforce this only when advertising `multiPartyConversation.supported` (capabilities.schema.json).",
131
+ "$comment": "RFC 0101 — agent turns MUST carry speaker attribution. Conditional (not unconditional `required`) so the field is only mandatory for `role: 'agent'`; `user`/`system` turns and pre-RFC-0101 producers on non-multi-party hosts are unaffected. Capability-gated: hosts enforce this only when advertising `multiPartyConversation` (capabilities.schema.json).",
132
132
  "if": {
133
133
  "properties": {
134
134
  "role": {
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/frontend-plugin-manifest.schema.json",
4
4
  "title": "FrontendPluginManifest",
5
- "description": "RFC 0117. Manifest for a published OpenWOP front-end plugin pack — `pack.json` at the pack root with `kind: \"frontend-plugin\"`. Peer to and disjoint from `node-pack-manifest.schema.json` (RFC 0003), `connection-pack-manifest.schema.json` (RFC 0095), and the other pack kinds via the `kind` discriminator. A front-end plugin pack distributes a SIGNED, SANDBOXED user-interface extension (a canvas editor, a custom artifact viewer, a settings panel) that a host loads at runtime in an ORIGIN/EXECUTION-ISOLATED sandbox (a cross-origin iframe by default, or an equivalent WASM/process/container/VM sandbox per `capabilities.uiPlugins.isolation`, RFC 0119) and enables through its own admin surface. The wire owns only the manifest shape, the isolation model, and the `ui-plugin/1` host-RPC boundary — NOT a rendering runtime: the plugin `entry` bundle is opaque bytes the host runs in a sandbox. Carries NO secret and NO backend `runtime` (a `runtime` member is rejected — a plugin is sandboxed UI, not a node entry). Requires the host to advertise `capabilities.uiPlugins.supported: true`; degrades to nothing on hosts without it. See `spec/v1/frontend-plugin-packs.md`.",
5
+ "description": "RFC 0117. Manifest for a published OpenWOP front-end plugin pack — `pack.json` at the pack root with `kind: \"frontend-plugin\"`. Peer to and disjoint from `node-pack-manifest.schema.json` (RFC 0003), `connection-pack-manifest.schema.json` (RFC 0095), and the other pack kinds via the `kind` discriminator. A front-end plugin pack distributes a SIGNED, SANDBOXED user-interface extension (a canvas editor, a custom artifact viewer, a settings panel) that a host loads at runtime in an ORIGIN/EXECUTION-ISOLATED sandbox (a cross-origin iframe by default, or an equivalent WASM/process/container/VM sandbox per `capabilities.uiPlugins.isolation`, RFC 0119) and enables through its own admin surface. The wire owns only the manifest shape, the isolation model, and the `ui-plugin/1` host-RPC boundary — NOT a rendering runtime: the plugin `entry` bundle is opaque bytes the host runs in a sandbox. Carries NO secret and NO backend `runtime` (a `runtime` member is rejected — a plugin is sandboxed UI, not a node entry). Requires the host to advertise `uiPlugins`; degrades to nothing on hosts without it. See `spec/v1/frontend-plugin-packs.md`.",
6
6
  "type": "object",
7
7
  "required": [
8
8
  "name",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/heartbeat-evaluated.schema.json",
4
4
  "title": "HeartbeatEvaluated",
5
- "description": "RFC 0060. Emitted every tick by a host advertising `capabilities.heartbeat.supported: true` — the observability record of a heartbeat predicate evaluation. Heartbeat-scoped (NOT a replayable run-event-log entry). Carries no external state or secret material; `changed` gates whether a `heartbeat.stateChanged` + enqueued run follow.",
5
+ "description": "RFC 0060. Emitted every tick by a host advertising `heartbeat` — the observability record of a heartbeat predicate evaluation. Heartbeat-scoped (NOT a replayable run-event-log entry). Carries no external state or secret material; `changed` gates whether a `heartbeat.stateChanged` + enqueued run follow.",
6
6
  "type": "object",
7
7
  "required": [
8
8
  "heartbeatId",
@@ -19,7 +19,7 @@
19
19
  "tokenBudget": {
20
20
  "type": "integer",
21
21
  "minimum": 1,
22
- "description": "RFC 0113. Max cumulative tokens across returned entries, denominated in the unit named by `capabilities.memory.injectionBudget.tokenCounter`. The adapter MUST return a prefix of the ranked entry list whose cumulative token count does not exceed this; a single entry exceeding the budget on its own MUST be omitted (not truncated mid-entry). MAY combine with `limit` — the adapter honors whichever yields fewer entries. Requires the host to advertise `memory.injectionBudget.supported`."
22
+ "description": "RFC 0113. Max cumulative tokens across returned entries, denominated in the unit named by `capabilities.memory.injectionBudget.tokenCounter`. The adapter MUST return a prefix of the ranked entry list whose cumulative token count does not exceed this; a single entry exceeding the budget on its own MUST be omitted (not truncated mid-entry). MAY combine with `limit` — the adapter honors whichever yields fewer entries. Requires the host to advertise `memory.injectionBudget`."
23
23
  },
24
24
  "rank": {
25
25
  "type": "string",
@@ -281,18 +281,18 @@
281
281
  "items": {
282
282
  "$ref": "#/$defs/SecretRequirement"
283
283
  },
284
- "description": "Secrets the node needs to execute. Resolved by the host's secret-resolution adapter at dispatch time. Hosts that don't advertise `Capabilities.secrets.supported` MUST refuse to dispatch a node with non-empty `requiresSecrets` and return `credential_unavailable`."
284
+ "description": "Secrets the node needs to execute. Resolved by the host's secret-resolution adapter at dispatch time. Hosts that don't advertise `secrets` MUST refuse to dispatch a node with non-empty `requiresSecrets` and return `credential_unavailable`."
285
285
  },
286
286
  "requiredCredentials": {
287
287
  "type": "array",
288
288
  "items": {
289
289
  "$ref": "#/$defs/CredentialRequirement"
290
290
  },
291
- "description": "RFC 0046. Credentials the node needs, resolved by the host's `host.credentials` resolver at dispatch time (distinct from `requiresSecrets`, which targets the informal BYOK annex). Hosts that don't advertise `Capabilities.credentials.supported` MUST refuse to dispatch a node with non-empty `requiredCredentials` and return `credential_unavailable` (peerDependency `credentials: 'supported'`)."
291
+ "description": "RFC 0046. Credentials the node needs, resolved by the host's `host.credentials` resolver at dispatch time (distinct from `requiresSecrets`, which targets the informal BYOK annex). Hosts that don't advertise `credentials` MUST refuse to dispatch a node with non-empty `requiredCredentials` and return `credential_unavailable` (a `credentials` peer dependency)."
292
292
  },
293
293
  "auth": {
294
294
  "$ref": "#/$defs/NodeAuth",
295
- "description": "RFC 0047. The node's third-party authentication need. The host acquires + refreshes the token via the `host.oauth` flow and resolves it into the node sandbox as a bearer token. Hosts that don't advertise `Capabilities.oauth.supported` (or lack the named provider/scope) MUST refuse to register the pack (`oauth_provider_unsupported` / `oauth_scope_unsupported`)."
295
+ "description": "RFC 0047. The node's third-party authentication need. The host acquires + refreshes the token via the `host.oauth` flow and resolves it into the node sandbox as a bearer token. Hosts that don't advertise `oauth` (or lack the named provider/scope) MUST refuse to register the pack (`oauth_provider_unsupported` / `oauth_scope_unsupported`)."
296
296
  },
297
297
  "requiredModelCapabilities": {
298
298
  "type": "array",
@@ -563,7 +563,7 @@
563
563
  "wasm-component",
564
564
  "remote"
565
565
  ],
566
- "description": "How the engine loads the pack. See node-packs.md \u00a7runtime formats. `wasm` is the core-module WASM ABI (RFC 0008). `wasm-component` is the WASM Component Model variant (WIT-defined interfaces); hosts that advertise `capabilities.nodePackRuntimes.wasmComponent.supported: true` load it via wasmtime / wasmer Component Model runtimes. Both share the openwop ABI envelope; the wasm-component variant uses WIT interfaces instead of hand-rolled imports/exports."
566
+ "description": "How the engine loads the pack. See node-packs.md \u00a7runtime formats. `wasm` is the core-module WASM ABI (RFC 0008). `wasm-component` is the WASM Component Model variant (WIT-defined interfaces); hosts that advertise `nodePackRuntimes.wasmComponent` load it via wasmtime / wasmer Component Model runtimes. Both share the openwop ABI envelope; the wasm-component variant uses WIT interfaces instead of hand-rolled imports/exports."
567
567
  },
568
568
  "entry": {
569
569
  "type": "string",
@@ -539,7 +539,7 @@
539
539
  }
540
540
  },
541
541
  "authorizationDecided": {
542
- "description": "RFC 0049 \u2014 emitted on a role-based authorization decision (allow or deny). Redaction-safe: `principal` is an opaque RFC 0048 id; `reason` carries no credential material. Every deny SHOULD be emitted and SHOULD feed the audit log (RFC 0009/0010). MUST NOT be emitted unless `capabilities.authorization.supported: true`.",
542
+ "description": "RFC 0049 \u2014 emitted on a role-based authorization decision (allow or deny). Redaction-safe: `principal` is an opaque RFC 0048 id; `reason` carries no credential material. Every deny SHOULD be emitted and SHOULD feed the audit log (RFC 0009/0010). MUST NOT be emitted unless the host advertises `authorization`.",
543
543
  "type": "object",
544
544
  "additionalProperties": false,
545
545
  "required": [
@@ -758,7 +758,7 @@
758
758
  }
759
759
  },
760
760
  "connectorAuthorized": {
761
- "description": "RFC 0047 \u2014 emitted when the host acquires (or re-authorizes) a third-party OAuth token on a user's behalf via the `host.oauth` flow. Redaction-safe: carries the credential REFERENCE (RFC 0046), never token material. MUST NOT be emitted unless `capabilities.oauth.supported: true`.",
761
+ "description": "RFC 0047 \u2014 emitted when the host acquires (or re-authorizes) a third-party OAuth token on a user's behalf via the `host.oauth` flow. Redaction-safe: carries the credential REFERENCE (RFC 0046), never token material. MUST NOT be emitted unless the host advertises `oauth`.",
762
762
  "type": "object",
763
763
  "additionalProperties": false,
764
764
  "required": [
@@ -786,7 +786,7 @@
786
786
  }
787
787
  },
788
788
  "connectorAuthExpired": {
789
- "description": "RFC 0047 \u2014 emitted when a stored OAuth token's refresh fails terminally (revoked/expired refresh token). Redaction-safe: no token material. MUST NOT be emitted unless `capabilities.oauth.supported: true`.",
789
+ "description": "RFC 0047 \u2014 emitted when a stored OAuth token's refresh fails terminally (revoked/expired refresh token). Redaction-safe: no token material. MUST NOT be emitted unless the host advertises `oauth`.",
790
790
  "type": "object",
791
791
  "additionalProperties": false,
792
792
  "required": [
@@ -811,7 +811,7 @@
811
811
  }
812
812
  },
813
813
  "coreWorkflowChainEvent": {
814
- "description": "RFC 0037 \u2014 emitted on every planner\u2192worker handoff state-machine transition. Required when `capabilities.multiAgent.executionModel.supported: true`; MUST NOT be emitted otherwise. RFC 0040 \u00a7A extends with optional `causationHostId` (when `crossHostCausation.supported: true`): present + non-empty when the `causationId` points at an event on a different host; absent when the chained-event is on the same host (existing semantics).",
814
+ "description": "RFC 0037 \u2014 emitted on every planner\u2192worker handoff state-machine transition. Required when the host advertises `multiAgent.executionModel`; MUST NOT be emitted otherwise. RFC 0040 \u00a7A extends with optional `causationHostId` (when the host advertises `multiAgent.executionModel.crossHostCausation`): present + non-empty when the `causationId` points at an event on a different host; absent when the chained-event is on the same host (existing semantics).",
815
815
  "type": "object",
816
816
  "additionalProperties": false,
817
817
  "required": [
@@ -1162,7 +1162,7 @@
1162
1162
  "additionalProperties": false
1163
1163
  },
1164
1164
  "runDeadLettered": {
1165
- "description": "RFC 0053 \u2014 emitted when a run/node exhausts its retry policy (RFC 0009) and is routed to the durable dead-letter sink. The run remains fork-eligible (RFC 0011) for `capabilities.deadLetter.retentionDays`. Redaction-safe: `reason` carries no credential material. MUST NOT be emitted unless `capabilities.deadLetter.supported: true`.",
1165
+ "description": "RFC 0053 \u2014 emitted when a run/node exhausts its retry policy (RFC 0009) and is routed to the durable dead-letter sink. The run remains fork-eligible (RFC 0011) for `capabilities.deadLetter.retentionDays`. Redaction-safe: `reason` carries no credential material. MUST NOT be emitted unless the host advertises `deadLetter`.",
1166
1166
  "type": "object",
1167
1167
  "additionalProperties": false,
1168
1168
  "required": [
@@ -2149,7 +2149,7 @@
2149
2149
  },
2150
2150
  "promptComposed": {
2151
2151
  "type": "object",
2152
- "description": "RFC 0027. Emitted once per (nodeId, kind) composition when a host resolves a PromptRef on a node and assembles its body for an LLM call. Gated on `capabilities.prompts.supported: true` AND `capabilities.prompts.observability !== 'off'`. Body fields (`systemPrompt`, `userPrompt`, `variableBindings`) are populated only under `observability: 'full'`; under `hashed` the event carries only `hash` + `variableHashes`. Replay-deterministic over `(refs, variableHashes, contentTrust)` per `spec/v1/prompts.md \u00a7\"Replay determinism\"`. Secret-source variable values MUST be replaced with `[REDACTED:<secretId>]` markers per SECURITY invariant `prompt-composed-secret-redaction`; untrusted-input segments MUST be wrapped with `<UNTRUSTED>...</UNTRUSTED>` markers per SECURITY invariant `prompt-composed-trust-marker`.",
2152
+ "description": "RFC 0027. Emitted once per (nodeId, kind) composition when a host resolves a PromptRef on a node and assembles its body for an LLM call. Gated on the host advertising `prompts` AND `capabilities.prompts.observability !== 'off'`. Body fields (`systemPrompt`, `userPrompt`, `variableBindings`) are populated only under `observability: 'full'`; under `hashed` the event carries only `hash` + `variableHashes`. Replay-deterministic over `(refs, variableHashes, contentTrust)` per `spec/v1/prompts.md \u00a7\"Replay determinism\"`. Secret-source variable values MUST be replaced with `[REDACTED:<secretId>]` markers per SECURITY invariant `prompt-composed-secret-redaction`; untrusted-input segments MUST be wrapped with `<UNTRUSTED>...</UNTRUSTED>` markers per SECURITY invariant `prompt-composed-trust-marker`.",
2153
2153
  "required": [
2154
2154
  "nodeId",
2155
2155
  "refs",
@@ -2227,7 +2227,7 @@
2227
2227
  },
2228
2228
  "agentPromptResolved": {
2229
2229
  "type": "object",
2230
- "description": "RFC 0029 \u00a7B. Emitted once per (nodeId, kind) pair BEFORE the corresponding `prompt.composed` event (when emitted). Surfaces the four-layer resolution chain per `spec/v1/prompts.md` \u00a7\"Resolution chain (normative)\" so cross-host debuggers and multi-agent visualizers can render which PromptRef applied at this node and why. Gated on `capabilities.prompts.supported: true`; payload is durable in the event log and participates in replay. Carries refs (not bodies), so emission is safe regardless of `capabilities.prompts.observability` \u2014 the secret-redaction + trust-marker invariants on `prompt.composed` (RFC 0027 \u00a7G) don't apply here.",
2230
+ "description": "RFC 0029 \u00a7B. Emitted once per (nodeId, kind) pair BEFORE the corresponding `prompt.composed` event (when emitted). Surfaces the four-layer resolution chain per `spec/v1/prompts.md` \u00a7\"Resolution chain (normative)\" so cross-host debuggers and multi-agent visualizers can render which PromptRef applied at this node and why. Gated on the host advertising `prompts`; payload is durable in the event log and participates in replay. Carries refs (not bodies), so emission is safe regardless of `capabilities.prompts.observability` \u2014 the secret-redaction + trust-marker invariants on `prompt.composed` (RFC 0027 \u00a7G) don't apply here.",
2231
2231
  "required": [
2232
2232
  "nodeId",
2233
2233
  "kind",
@@ -3061,7 +3061,7 @@
3061
3061
  },
3062
3062
  "memoryCompacted": {
3063
3063
  "type": "object",
3064
- "description": "RFC 0012 (Memory Compaction Profile). Emitted by a host advertising `capabilities.memory.compaction.supported: true` each time a compaction run completes, regardless of trigger. `outputId` MUST be readable via `MemoryAdapter.get(memoryRef, outputId)` until normal TTL eviction. SR-1 carry-forward (RFC 0012 \u00a7D) applies: the host MUST route compacted entry content through the same BYOK redaction harness applied to a fresh `put`.",
3064
+ "description": "RFC 0012 (Memory Compaction Profile). Emitted by a host advertising `memory.compaction` each time a compaction run completes, regardless of trigger. `outputId` MUST be readable via `MemoryAdapter.get(memoryRef, outputId)` until normal TTL eviction. SR-1 carry-forward (RFC 0012 \u00a7D) applies: the host MUST route compacted entry content through the same BYOK redaction harness applied to a fresh `put`.",
3065
3065
  "required": [
3066
3066
  "memoryRef",
3067
3067
  "outputId",
@@ -3109,7 +3109,7 @@
3109
3109
  },
3110
3110
  "distillation": {
3111
3111
  "type": "object",
3112
- "description": "RFC 0062 (when `capabilities.memory.distillation.supported: true`). Present when this compaction is part of a budgeted distillation run (a scheduled or on-demand 'dream'). Absent for a plain RFC 0012 compaction. Carries the token-budget accounting + whether the memory index was refreshed \u2014 not a parallel `memory.distilled` event.",
3112
+ "description": "RFC 0062 (when the host advertises `memory.distillation`). Present when this compaction is part of a budgeted distillation run (a scheduled or on-demand 'dream'). Absent for a plain RFC 0012 compaction. Carries the token-budget accounting + whether the memory index was refreshed \u2014 not a parallel `memory.distilled` event.",
3113
3113
  "additionalProperties": false,
3114
3114
  "required": [
3115
3115
  "tokenBudget",
@@ -3175,7 +3175,7 @@
3175
3175
  },
3176
3176
  "agentMemoryConsolidated": {
3177
3177
  "type": "object",
3178
- "description": "RFC 0068 (`Draft`). Emitted by a host advertising `capabilities.agents.memoryConsolidation.supported: true` after a background consolidation pass over LONG-TERM memory (merge/dedup/supersede/strengthen). Content-free: identifiers + counts only \u2014 entry content is served by the SR-1-redacted read-side (`MemoryAdapter.get`). On replay the event is re-read from the log, never regenerated. Distinct from RFC 0062 `memory.compacted` (token-budgeted distillation of transactional memory). SR-1 carry-forward (RFC 0004) + CTI-1 apply to the consolidated entries.",
3178
+ "description": "RFC 0068 (`Draft`). Emitted by a host advertising `agents.memoryConsolidation` after a background consolidation pass over LONG-TERM memory (merge/dedup/supersede/strengthen). Content-free: identifiers + counts only \u2014 entry content is served by the SR-1-redacted read-side (`MemoryAdapter.get`). On replay the event is re-read from the log, never regenerated. Distinct from RFC 0062 `memory.compacted` (token-budgeted distillation of transactional memory). SR-1 carry-forward (RFC 0004) + CTI-1 apply to the consolidated entries.",
3179
3179
  "required": [
3180
3180
  "memoryRef",
3181
3181
  "inputCount",
@@ -3220,7 +3220,7 @@
3220
3220
  },
3221
3221
  "commitmentFired": {
3222
3222
  "type": "object",
3223
- "description": "RFC 0068 (`Draft`). Emitted by a host advertising `capabilities.agents.commitments.supported: true` when an inferred standing commitment fires. Content-free: identifiers + condition kind only \u2014 the intention text lives in SR-1-redacted memory (`MemoryAdapter.get(memoryRef, memoryId)`). The fired arm composes RFC 0052 (time) or RFC 0060 (predicate). On replay the event is re-read from the log, never regenerated (the host MUST NOT re-infer or re-fire a commitment at replay time). CTI-1: the commitment, its memory provenance, and any run it enqueues MUST share the source memory's tenant.",
3223
+ "description": "RFC 0068 (`Draft`). Emitted by a host advertising `agents.commitments` when an inferred standing commitment fires. Content-free: identifiers + condition kind only \u2014 the intention text lives in SR-1-redacted memory (`MemoryAdapter.get(memoryRef, memoryId)`). The fired arm composes RFC 0052 (time) or RFC 0060 (predicate). On replay the event is re-read from the log, never regenerated (the host MUST NOT re-infer or re-fire a commitment at replay time). CTI-1: the commitment, its memory provenance, and any run it enqueues MUST share the source memory's tenant.",
3224
3224
  "required": [
3225
3225
  "commitmentId",
3226
3226
  "memoryRef",
@@ -3260,7 +3260,7 @@
3260
3260
  },
3261
3261
  "agentInvocationStarted": {
3262
3262
  "type": "object",
3263
- "description": "RFC 0077. Emitted by a host advertising `capabilities.agents.liveRuntime.supported: true` as the FIRST agent-scoped event of a live manifest invocation, bracketing the existing `agent.*` family with `agent.invocation.completed`. Content-free: identifiers + selection metadata only \u2014 prompt/task content is served by the run's normal projection, never on this event. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\": on replay it is re-emitted from the log and the host MUST NOT regenerate its `invocationId` (or any identifier). Distinct from the deterministic RFC 0070 sample floor. For one live invocation the agent-scoped events MUST appear in the order `agent.invocation-started` \u2192 `agent.prompt-resolved` \u2192 (`agent.reasoning-delta`* \u2192 `agent.reasoned`)+ \u2192 (`agent.tool-called` \u2192 `agent.tool-returned`)* \u2192 `agent.decided`+ \u2192 `agent.handoff`? \u2192 `agent.invocation-completed`: this event precedes every other agent-scoped event of the invocation, and `agent.invocation-completed` follows them all and, for a sub-run, precedes the run-scoped `output.harvested`. On replay the host MUST NOT regenerate its timestamps either.",
3263
+ "description": "RFC 0077. Emitted by a host advertising `agents.liveRuntime` as the FIRST agent-scoped event of a live manifest invocation, bracketing the existing `agent.*` family with `agent.invocation.completed`. Content-free: identifiers + selection metadata only \u2014 prompt/task content is served by the run's normal projection, never on this event. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\": on replay it is re-emitted from the log and the host MUST NOT regenerate its `invocationId` (or any identifier). Distinct from the deterministic RFC 0070 sample floor. For one live invocation the agent-scoped events MUST appear in the order `agent.invocation-started` \u2192 `agent.prompt-resolved` \u2192 (`agent.reasoning-delta`* \u2192 `agent.reasoned`)+ \u2192 (`agent.tool-called` \u2192 `agent.tool-returned`)* \u2192 `agent.decided`+ \u2192 `agent.handoff`? \u2192 `agent.invocation-completed`: this event precedes every other agent-scoped event of the invocation, and `agent.invocation-completed` follows them all and, for a sub-run, precedes the run-scoped `output.harvested`. On replay the host MUST NOT regenerate its timestamps either.",
3264
3264
  "required": [
3265
3265
  "invocationId",
3266
3266
  "agentId",
@@ -3320,7 +3320,7 @@
3320
3320
  },
3321
3321
  "agentInvocationCompleted": {
3322
3322
  "type": "object",
3323
- "description": "RFC 0077. Emitted by a host advertising `capabilities.agents.liveRuntime.supported: true` as the LAST agent-scoped event of a live manifest invocation (after the terminal `agent.decided`). Content-free: identifiers + outcome metadata only \u2014 the result body is served by the run's normal projection. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\": re-read from the log on replay, never regenerated.",
3323
+ "description": "RFC 0077. Emitted by a host advertising `agents.liveRuntime` as the LAST agent-scoped event of a live manifest invocation (after the terminal `agent.decided`). Content-free: identifiers + outcome metadata only \u2014 the result body is served by the run's normal projection. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\": re-read from the log on replay, never regenerated.",
3324
3324
  "required": [
3325
3325
  "invocationId",
3326
3326
  "agentId",
@@ -3366,7 +3366,7 @@
3366
3366
  "additionalProperties": false
3367
3367
  },
3368
3368
  "workspaceUpdated": {
3369
- "description": "RFC 0059. Emitted by a host advertising `capabilities.workspace.supported: true` on each successful `PUT`/`DELETE` of a workspace file, attributing the change to the file `path` + resulting `version`. Content-free: carries the path + version only \u2014 the file body is served by the read-side (`GET /v1/host/workspace/files/{path}`), already SR-1-redacted (RFC 0059 \u00a7E WSR-1). On replay the event is re-read from the log, never regenerated. MUST NOT be emitted unless `capabilities.workspace.supported: true`. The proposed SECURITY invariant `workspace-cross-tenant-isolation` (WCT-1) applies to the read-side that resolves these paths.",
3369
+ "description": "RFC 0059. Emitted by a host advertising `workspace` on each successful `PUT`/`DELETE` of a workspace file, attributing the change to the file `path` + resulting `version`. Content-free: carries the path + version only \u2014 the file body is served by the read-side (`GET /v1/host/workspace/files/{path}`), already SR-1-redacted (RFC 0059 \u00a7E WSR-1). On replay the event is re-read from the log, never regenerated. MUST NOT be emitted unless the host advertises `workspace`. The proposed SECURITY invariant `workspace-cross-tenant-isolation` (WCT-1) applies to the read-side that resolves these paths.",
3370
3370
  "type": "object",
3371
3371
  "additionalProperties": false,
3372
3372
  "required": [
@@ -3388,7 +3388,7 @@
3388
3388
  },
3389
3389
  "evalStarted": {
3390
3390
  "type": "object",
3391
- "description": "RFC 0081 \u00a7C. Emitted ONCE at the start of an eval run (a `mode: \"eval\"` run, RFC 0081 \u00a7B) by a host advertising `capabilities.agents.evalSuite.supported: true`. Content-free: suite provenance + counts only. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\".",
3391
+ "description": "RFC 0081 \u00a7C. Emitted ONCE at the start of an eval run (a `mode: \"eval\"` run, RFC 0081 \u00a7B) by a host advertising `agents.evalSuite`. Content-free: suite provenance + counts only. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\".",
3392
3392
  "required": [
3393
3393
  "suiteId",
3394
3394
  "suiteVersion",
@@ -3577,7 +3577,7 @@
3577
3577
  },
3578
3578
  "egressDecided": {
3579
3579
  "type": "object",
3580
- "description": "RFC 0079 \u00a7B. Emitted when a host evaluates a credentialed egress (via `ctx.http.safeFetch` / a tool) against credential provenance + the SSRF guard. Content-free: identifiers + decision only \u2014 no credential value, no request/response body (SR-1). On replay re-read from the log, never regenerated (the decision is a recorded fact). Emitted only when `capabilities.httpClient.egressPolicy.supported: true`.",
3580
+ "description": "RFC 0079 \u00a7B. Emitted when a host evaluates a credentialed egress (via `ctx.http.safeFetch` / a tool) against credential provenance + the SSRF guard. Content-free: identifiers + decision only \u2014 no credential value, no request/response body (SR-1). On replay re-read from the log, never regenerated (the decision is a recorded fact). Emitted only when the host advertises `httpClient.egressPolicy`.",
3581
3581
  "required": [
3582
3582
  "decision",
3583
3583
  "destination"
@@ -3627,7 +3627,7 @@
3627
3627
  },
3628
3628
  "triggerSubscriptionStateChanged": {
3629
3629
  "type": "object",
3630
- "description": "RFC 0083 \u00a7C. Emitted when a trigger subscription changes state (the \u00a7B four-state machine). Content-free: identifiers + states only \u2014 no inbound payload, headers, or credential material (SR-1). Emitted only when `capabilities.triggerBridge.supported: true`.",
3630
+ "description": "RFC 0083 \u00a7C. Emitted when a trigger subscription changes state (the \u00a7B four-state machine). Content-free: identifiers + states only \u2014 no inbound payload, headers, or credential material (SR-1). Emitted only when the host advertises `triggerBridge`.",
3631
3631
  "required": [
3632
3632
  "subscriptionId",
3633
3633
  "source",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v2/tool-descriptor.schema.json",
4
4
  "title": "ToolDescriptor",
5
- "description": "RFC 0078. A portable, read-only description of one tool, unifying the five openwop tool surfaces (node-pack / workflow / MCP / connector / host-extension) behind one stable shape. Returned by `GET /tools` + `GET /tools/{toolId}` when the host advertises `capabilities.toolCatalog.supported: true`. The descriptor DESCRIBES a tool; it never carries credential material (SR-1) and is not an invocation path (tools are invoked on their existing surfaces).",
5
+ "description": "RFC 0078. A portable, read-only description of one tool, unifying the five openwop tool surfaces (node-pack / workflow / MCP / connector / host-extension) behind one stable shape. Returned by `GET /tools` + `GET /tools/{toolId}` when the host advertises `toolCatalog`. The descriptor DESCRIBES a tool; it never carries credential material (SR-1) and is not an invocation path (tools are invoked on their existing surfaces).",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -160,7 +160,7 @@
160
160
  "items": {
161
161
  "$ref": "#/$defs/SubChainRef"
162
162
  },
163
- "description": "RFC 0133 §1.1. OPTIONAL. Child chains this chain composes at RUN TIME. Each entry names a chain (a sibling `chainId` in this pack, or an externally published chain) that a node references via `config.subChainRef`. Unlike RFC 0013's author-time inline splice, a referenced sub-chain is co-instantiated as its own registered workflow and dispatched by the parent as a child run (both parent and child stay owned + builder-editable). A host without runtime child dispatch MUST refuse instantiation with `sub_chain_unsupported` (422) rather than flatten. Requires `capabilities.workflowChainPacks.subChains.supported: true`. See `workflow-chain-packs.md` §\"Sub-chain composition (RFC 0133)\"."
163
+ "description": "RFC 0133 §1.1. OPTIONAL. Child chains this chain composes at RUN TIME. Each entry names a chain (a sibling `chainId` in this pack, or an externally published chain) that a node references via `config.subChainRef`. Unlike RFC 0013's author-time inline splice, a referenced sub-chain is co-instantiated as its own registered workflow and dispatched by the parent as a child run (both parent and child stay owned + builder-editable). A host without runtime child dispatch MUST refuse instantiation with `sub_chain_unsupported` (422) rather than flatten. Requires the host to advertise `workflowChainPacks.subChains`. See `workflow-chain-packs.md` §\"Sub-chain composition (RFC 0133)\"."
164
164
  },
165
165
  "producedVariables": {
166
166
  "type": "array",
@@ -202,7 +202,7 @@
202
202
  },
203
203
  "config": {
204
204
  "type": "object",
205
- "description": "Node configuration (pre-execution constants). The shape is per-typeId — node-pack manifests declare each typeId's `configSchema` for install-time validation. By convention, the keys `systemPromptRef`, `userPromptRef`, and `additionalPromptRefs` MAY hold PromptRef values per `spec/v1/prompts.md` §\"PromptRef\" (RFC 0027). Hosts advertising `capabilities.prompts.supported: true` MUST resolve these keys; hosts without the capability MAY treat them as opaque strings. When both an inline body (e.g., `config.systemPrompt`) and a `*PromptRef` are present, the ref wins and the host MUST emit a `log.appended` warning with `code: \"prompt_ref_supersedes_inline\"` per RFC 0027 §C.",
205
+ "description": "Node configuration (pre-execution constants). The shape is per-typeId — node-pack manifests declare each typeId's `configSchema` for install-time validation. By convention, the keys `systemPromptRef`, `userPromptRef`, and `additionalPromptRefs` MAY hold PromptRef values per `spec/v1/prompts.md` §\"PromptRef\" (RFC 0027). Hosts advertising `prompts` MUST resolve these keys; hosts without the capability MAY treat them as opaque strings. When both an inline body (e.g., `config.systemPrompt`) and a `*PromptRef` are present, the ref wins and the host MUST emit a `log.appended` warning with `code: \"prompt_ref_supersedes_inline\"` per RFC 0027 §C.",
206
206
  "additionalProperties": true
207
207
  },
208
208
  "inputs": {
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.45.17"
7
+ "version": "2.45.19"
8
8
  },
9
9
  "note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
10
10
  },
@@ -426,5 +426,5 @@
426
426
  "$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
427
427
  }
428
428
  ],
429
- "digest": "824f436b536ada54275ccffee0eaced79bae3d4b08dd8acfa8c1f407951d82b1"
429
+ "digest": "902047907690f4c43c35cc77a9f6d55db02412faed058da8c052a95f8730426f"
430
430
  }
package/spec/v1/gaps.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "./gaps.schema.json",
3
3
  "version": 1,
4
- "updated": "2026-10-04",
4
+ "updated": "2026-10-05",
5
5
  "witnessClasses": [
6
6
  "witnessable-unaided",
7
7
  "witnessable-gated",
@@ -14173,6 +14173,40 @@
14173
14173
  }
14174
14174
  ]
14175
14175
  },
14176
+ {
14177
+ "id": "openwop.gap.0235.1",
14178
+ "rfc": "0235",
14179
+ "local": "G1",
14180
+ "section": "§D",
14181
+ "surface": "The v2 reference host compares `If-None-Match` byte-exact on the run snapshot and member-exact on discovery, so it fails §D 1–3 once the legs ship.",
14182
+ "witness": "unclassified",
14183
+ "requirementId": null,
14184
+ "disposition": "closed",
14185
+ "target": null,
14186
+ "sources": [
14187
+ {
14188
+ "file": "RFCS/registers/0235-if-none-match-evaluation.gaps.md",
14189
+ "token": "G1"
14190
+ }
14191
+ ]
14192
+ },
14193
+ {
14194
+ "id": "openwop.gap.0235.2",
14195
+ "rfc": "0235",
14196
+ "local": "G2",
14197
+ "section": "§D",
14198
+ "surface": "No host bundle records the four `openwop.requirement.0235.*` ids, because no host has cut on the suite that ships the legs (2.45.18).",
14199
+ "witness": "unclassified",
14200
+ "requirementId": null,
14201
+ "disposition": "closed",
14202
+ "target": null,
14203
+ "sources": [
14204
+ {
14205
+ "file": "RFCS/registers/0235-if-none-match-evaluation.gaps.md",
14206
+ "token": "G2"
14207
+ }
14208
+ ]
14209
+ },
14176
14210
  {
14177
14211
  "id": "openwop.gap.spec.a2a-integration.g1",
14178
14212
  "rfc": "0152",
@@ -17,7 +17,7 @@ A single fetch answers the major the client speaks and names the other. A v2 roo
17
17
 
18
18
  ### 1.1 Cache validators
19
19
 
20
- A host MUST emit a standard `ETag` on the discovery document and MUST honor `If-None-Match` with `304`. The v2 representation has no `Capabilities-Etag`: the document's bytes are its negotiation identity. A host that changes semantics without changing bytes is non-conformant.
20
+ A host MUST emit a standard `ETag` on the discovery document and MUST honor `If-None-Match` with `304` ([runs.md](runs.md) §Caching and encoding). The v2 representation has no `Capabilities-Etag`: the document's bytes are its negotiation identity. A host that changes semantics without changing bytes is non-conformant.
21
21
 
22
22
  ### 1.2 Removal triggers
23
23
 
@@ -14,7 +14,7 @@ Standard headers keep their standard names: `Idempotency-Key`, `ETag`, `If-None-
14
14
  | --- | --- | --- |
15
15
  | `Accept-Language` | 1 | BCP-47 preference list; authoritative for locale selection (i18n.md). A malformed value MUST NOT produce a 400. |
16
16
  | `Idempotency-Key` | 15 | Per-mutation idempotency token (`idempotency.md` Layer 1). The server caches `(tenantId, endpoint, key)` → response for ≥24h. A duplicate request returns the cached response with `OpenWOP-Idempotent-Replay: true`. |
17
- | `If-None-Match` | 2 | Conditional request on the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot). A value matching the `ETag` the host sent MUST yield `304 Not Modified` with no body. The 304 carries `OpenWOP-Version` like every response (versioning.md §1.4). |
17
+ | `If-None-Match` | 2 | Conditional request on the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot). A value that matches the current `ETag` (runs.md §Caching and encoding) MUST yield `304 Not Modified` with no body. The 304 carries `OpenWOP-Version` like every response (versioning.md §1.4). |
18
18
  | `Last-Event-ID` | 1 | Resume from sequence after this ID. |
19
19
  | `OpenWOP-Client-Version` | 58 | The protocol version the client implements (versioning.md §1.5). Compared with `minClientVersion` on major.minor. A malformed value is treated as absent and MUST NOT produce a 400. Never selects a contract. |
20
20
  | `OpenWOP-Dedup` | 1 | When set, the host's cross-host claim system rejects a duplicate `(tenantId, scopeId)` pair with `409 Conflict`. |
@@ -182,12 +182,13 @@ Every id field in every v2 schema and every `api/v2/openapi.yaml` parameter and
182
182
  | --- | --- | --- |
183
183
  | `runId`, `interruptId`, `subscriptionId`, `deliveryId`, `effectId` | tenant-bound: `^(anon:)?[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$` | host |
184
184
  | `eventId` | `^[A-Za-z0-9._~-]{16,128}$` | host |
185
- | `tenantId`, `workspaceId` | `^[A-Za-z0-9._~-]{1,128}$` | host |
185
+ | `tenantId` | `^(anon:)?[A-Za-z0-9._~-]{1,128}$` | host |
186
+ | `workspaceId` | `^[A-Za-z0-9._~-]{1,128}$` | host |
186
187
  | `subjectId` | `^[^\s/]{1,256}$` (the issuer's grammar) | host |
187
188
  | `traceId`, `spanId` | W3C `^[0-9a-f]{32}$`, `^[0-9a-f]{16}$` | host |
188
189
  | `keyId` | `^[A-Za-z0-9._~-]{1,128}$` (signing keys, resume-token `kid`, bundle signatures) | registry |
189
190
  | `nodeId`, `workflowId`, `agentId`, `chainId`, `pluginId`, `templateId`, `libraryId` | `^[A-Za-z0-9._~:-]{1,128}$` | author |
190
- | `typeId` | `^[a-z][a-z0-9_-]*(\.[a-z][a-zA-Z0-9_-]*)+$`, maxLength 256 | author |
191
+ | `typeId` | `^[a-z][a-z0-9_-]*(\.[a-z][a-zA-Z0-9_-]*)+(@[0-9]+\.[0-9]+\.[0-9]+)?$`, maxLength 256 (the `@` pin: [workflow-chain-packs.md](workflow-chain-packs.md)) | author |
191
192
 
192
193
  `spec/v2/id-field-bindings.json` sorts every `*Id` property in a v2 schema into two sets: it **is** a kind above (and MUST `$ref` it), or nothing here governs it (reason recorded).
193
194
 
@@ -167,8 +167,11 @@ Field rules:
167
167
 
168
168
  ### Caching and encoding
169
169
 
170
- - The `200` SHOULD carry a strong `ETag` derived from the latest persisted `sequence`. When present it MUST change on every observable transition and be stable otherwise.
171
- - When the host sends an `ETag`, a request whose `If-None-Match` matches it MUST receive `304` with no body.
170
+ - The `200` SHOULD carry an `ETag` derived from the latest persisted `sequence`. When present it MUST change on every observable transition and be stable otherwise.
171
+ - A host evaluates `If-None-Match` as RFC 9110 §13.1.2 defines it: `*`, or a list of entity tags any of which matches the current `ETag` under weak comparison (`W/` is ignored on either side). This holds wherever a host honors `If-None-Match`, discovery included.
172
+ - On a match the host MUST answer `304` with no body, carrying the `ETag` and the `Vary` the `200` would carry.
173
+ - The host MUST evaluate it only when the unconditional response would be `2xx`. A run the caller cannot read stays `404`, whatever the request carries.
174
+ - A request `Cache-Control: no-cache` MUST NOT suppress the evaluation.
172
175
  - A host MAY compress (`gzip` baseline; `br` and `zstd` only where advertised under `extensions["<org>.rest-transport"].contentEncodings`, [ext/restTransport](../ext/restTransport/README.md)). It MUST then set `Content-Encoding` and `Vary: Accept-Encoding`. The decoded body is byte-identical.
173
176
 
174
177
  ## List
@@ -298,4 +301,4 @@ Queue messages ([host-services.md](host-services.md) §`queueBus`) and webhook d
298
301
 
299
302
  A non-terminal run inherited from v1 continues, or is cancelled `v1_pin_unsupported`, per [persistence.md](persistence.md) §"Runs pinned to v1".
300
303
 
301
- *Sources: RFCs 0053, 0058, 0084, 0170, 0171, 0176, 0182, 0228, 0229, 0231.*
304
+ *Sources: RFCs 0053, 0058, 0084, 0170, 0171, 0176, 0182, 0228, 0229, 0231, 0235.*
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$comment": "RFC 0172 §D.1 — the one release identity the v2 artifacts derive from. `version` is the next corpus tag `v<version>` (the publish workflow's coordinated-release tag pattern `v*`; RFC 0172's `openwop/v2.<minor>.<patch>` spelling is amended to this at its flip). api/v2/*.yaml info.version, the suite's 2.x version and @openwop/spec-artifacts read it. Bumped by the release PR that cuts the tag, never by hand elsewhere.",
3
- "version": "2.45.17",
4
- "corpusTag": "v2.45.17",
5
- "updated": "2026-10-04"
3
+ "version": "2.45.19",
4
+ "corpusTag": "v2.45.19",
5
+ "updated": "2026-10-05"
6
6
  }
@@ -4,7 +4,7 @@
4
4
  "schemas/v2/**/*.json",
5
5
  "spec/v2/path-manifest.json"
6
6
  ],
7
- "release": "2.45.17",
7
+ "release": "2.45.19",
8
8
  "kinds": {
9
9
  "union": [
10
10
  "channel",