@openwop/openwop-conformance 2.45.17 → 2.45.18

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.
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "$comment": "GENERATED by conformance/scripts/generate-scenario-majors.mjs (RFC 0168 §D.3). Do not edit; add a file to BOTH_MAJORS in the generator to target both majors.",
3
3
  "counts": {
4
- "files": 649,
4
+ "files": 642,
5
5
  "v1": 455,
6
- "v2": 209
6
+ "v2": 202
7
7
  },
8
8
  "majors": {
9
9
  "a2a-1-0-agent-card.test.ts": [
@@ -1305,9 +1305,6 @@
1305
1305
  "v2-ai-envelope-advertisement.test.ts": [
1306
1306
  2
1307
1307
  ],
1308
- "v2-ai-envelope-shape-static.test.ts": [
1309
- 2
1310
- ],
1311
1308
  "v2-ai-providers-advertisement.test.ts": [
1312
1309
  2
1313
1310
  ],
@@ -1320,9 +1317,6 @@
1320
1317
  "v2-artifact-a2a-shape.test.ts": [
1321
1318
  2
1322
1319
  ],
1323
- "v2-artifact-created-static.test.ts": [
1324
- 2
1325
- ],
1326
1320
  "v2-artifact-type-schema-url.test.ts": [
1327
1321
  2
1328
1322
  ],
@@ -1452,9 +1446,6 @@
1452
1446
  "v2-envelope-tier-one-subset-static.test.ts": [
1453
1447
  2
1454
1448
  ],
1455
- "v2-envelope-variant-discriminator-static.test.ts": [
1456
- 2
1457
- ],
1458
1449
  "v2-envelopes-advertisement.test.ts": [
1459
1450
  2
1460
1451
  ],
@@ -1476,9 +1467,6 @@
1476
1467
  "v2-event-type-closed.test.ts": [
1477
1468
  2
1478
1469
  ],
1479
- "v2-export-bundle-static.test.ts": [
1480
- 2
1481
- ],
1482
1470
  "v2-ext-family-claims.test.ts": [
1483
1471
  2
1484
1472
  ],
@@ -1554,9 +1542,6 @@
1554
1542
  "v2-mcp-tasks.test.ts": [
1555
1543
  2
1556
1544
  ],
1557
- "v2-media-inline-cap-static.test.ts": [
1558
- 2
1559
- ],
1560
1545
  "v2-memory-cross-tenant-isolation.test.ts": [
1561
1546
  2
1562
1547
  ],
@@ -1677,9 +1662,6 @@
1677
1662
  "v2-provider-usage-emission.test.ts": [
1678
1663
  2
1679
1664
  ],
1680
- "v2-provider-usage-payload-static.test.ts": [
1681
- 2
1682
- ],
1683
1665
  "v2-purpose-propagation-advertisement.test.ts": [
1684
1666
  2
1685
1667
  ],
@@ -1755,9 +1737,6 @@
1755
1737
  "v2-self-hosted-runner-advertisement.test.ts": [
1756
1738
  2
1757
1739
  ],
1758
- "v2-self-hosted-runner-frames-static.test.ts": [
1759
- 2
1760
- ],
1761
1740
  "v2-sse-last-event-id-cursor.test.ts": [
1762
1741
  2
1763
1742
  ],
@@ -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.18",
5
+ "corpusTag": "v2.45.18",
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": "56dabe76a0104e27ec5db429d10130c710fd6cc77f9e8c83060ac8642e1bf296",
13
+ "api/v2/asyncapi.yaml": "99cf46de7c1009d6a7f317a69d1746d8664db94602a3936140f5a51ad0647293",
14
+ "api/v2/openapi.yaml": "03618b3e70be4a916a88b344f40090e8c0477925c0a40f1447d87872f6772281",
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": "62c1d7adc81e42adb7ec62f634f86e8812835ba07bda83c4ce2e5b67d27d87d5",
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": "7fb75c8cceaa8aa6893aa9dc68ae83e57fe0178225a23f376b6de54e74b15ead",
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": "74d260237e39bc6e3ffd8740a263e9dbe2fc6e75866b51a6d900dffe32b75ad4",
313
313
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
314
- "spec/v2/surface-baseline.json": "273566823eac3465b9f692c9cb795eca669e753bd0e733575b4722d176e115ce"
314
+ "spec/v2/surface-baseline.json": "4bc82b54af36b5f7611668523349a9bfcc370c4d86812cef8d11dd54f1f14405"
315
315
  },
316
- "corpusCommit": "725db8ec383cc3d61068846def2d5b90771b8933"
316
+ "corpusCommit": "332098b793ec36500833b99f40bab66ec5573d77"
317
317
  }
@@ -1,6 +1,7 @@
1
1
  /**
2
- * Static walkers over envelope payload schemas, shared by the v2 static twins
3
- * `v2-envelope-tier-one-subset-static` and `v2-envelope-variant-discriminator-static`.
2
+ * Static walkers over envelope payload schemas, shared by the v2 static twins:
3
+ * the scenario `v2-envelope-tier-one-subset-static` and the corpus gates
4
+ * `v2-envelope-tier-one-universal-static` and `v2-envelope-variant-discriminator-static`.
4
5
  *
5
6
  * The walk rules are the v1 rules unchanged (RFC 0030 §B, RFC 0031 §A); what
6
7
  * moved at major 2 is where the schemas live (`schemas/v2/envelopes/`) and
@@ -0,0 +1,139 @@
1
+ /**
2
+ * `If-None-Match` evaluation (RFC 0235; `spec/v2/core/runs.md` §Caching and
3
+ * encoding), shared by `v2-discovery-etag` and `v2-run-snapshot-etag` so both
4
+ * surfaces are judged by one reading of RFC 9110 §13.1.2.
5
+ *
6
+ * Two halves, as in the other shared witnesses: `observeProbe` asserts nothing
7
+ * and returns what the host answered (or why it could not be read); the
8
+ * `judge*` functions are pure and return findings. The scenarios map findings
9
+ * to requirement ids.
10
+ */
11
+
12
+ import type { OpenWOPResponse } from './driver.js';
13
+
14
+ /** Sends one GET with the given extra headers; `null` when the request could not be made. */
15
+ export type Get = (headers: Readonly<Record<string, string>>) => Promise<OpenWOPResponse | null>;
16
+
17
+ export const NO_SUCH_TAG = '"openwop-conformance-no-such-tag"';
18
+
19
+ /** The opaque part of an entity tag: `W/"x"` and `"x"` both give `"x"` (RFC 9110 §8.8.3.2 weak comparison). */
20
+ export const opaque = (tag: string): string => tag.trim().replace(/^W\//, '');
21
+
22
+ export interface Probe {
23
+ readonly name: string;
24
+ /** The `If-None-Match` value, built from the tag of the preceding `200`. */
25
+ readonly value: (tag: string) => string;
26
+ readonly extra?: Readonly<Record<string, string>>;
27
+ readonly want: 200 | 304;
28
+ }
29
+
30
+ /** RFC 0235 §D legs 1–3 and 5: weak, list, star, and the two negatives. */
31
+ export const MATCH_PROBES: readonly Probe[] = [
32
+ { name: 'weak', value: (t) => `W/${opaque(t)}`, want: 304 },
33
+ { name: 'list', value: (t) => `${NO_SUCH_TAG}, ${t}`, want: 304 },
34
+ { name: 'star', value: () => '*', want: 304 },
35
+ { name: 'non-matching list', value: () => `${NO_SUCH_TAG}, "openwop-conformance-no-such-tag-2"`, want: 200 },
36
+ { name: 'non-matching weak tag', value: () => `W/${NO_SUCH_TAG}`, want: 200 },
37
+ ];
38
+
39
+ /** RFC 0235 §D leg 7. */
40
+ export const NO_CACHE_PROBE: Probe = { name: 'no-cache', value: (t) => t, extra: { 'Cache-Control': 'no-cache' }, want: 304 };
41
+
42
+ /** What one conditional request returned, with the `200` it was built from. */
43
+ export interface Observed {
44
+ readonly probe: Probe;
45
+ readonly tag: string;
46
+ readonly sent: string;
47
+ /** `Vary` on the unconditional `200`, or null. */
48
+ readonly okVary: string | null;
49
+ readonly status: number;
50
+ readonly bodyLength: number;
51
+ readonly etag: string | null;
52
+ readonly vary: string | null;
53
+ }
54
+
55
+ export type Observation = { readonly kind: 'observed'; readonly obs: Observed } | { readonly kind: 'unreadable'; readonly reason: string };
56
+
57
+ /**
58
+ * GET the resource, take its `ETag`, then send the probe. A `200` carrying a
59
+ * DIFFERENT tag on a probe that should match means the representation moved
60
+ * between the two reads, so the probe is retried with the new tag (up to four
61
+ * times). A `200` with the same tag is the violation and is returned as is.
62
+ */
63
+ export async function observeProbe(get: Get, probe: Probe): Promise<Observation> {
64
+ let last: Observed | null = null;
65
+ for (let attempt = 0; attempt < 4; attempt++) {
66
+ const ok = await get({});
67
+ if (ok === null || ok.status !== 200) return { kind: 'unreadable', reason: `the unconditional GET answered ${ok?.status ?? 'no response'}` };
68
+ const tag = ok.headers.get('etag');
69
+ if (!tag) return { kind: 'unreadable', reason: 'the 200 carries no ETag' };
70
+ const sent = probe.value(tag);
71
+ const res = await get({ ...probe.extra, 'If-None-Match': sent });
72
+ if (res === null) return { kind: 'unreadable', reason: `the ${probe.name} conditional GET could not be made` };
73
+ last = { probe, tag, sent, okVary: ok.headers.get('vary'), status: res.status, bodyLength: res.text.length, etag: res.headers.get('etag'), vary: res.headers.get('vary') };
74
+ const moved = probe.want === 304 && res.status === 200 && res.headers.get('etag') !== null && opaque(res.headers.get('etag') as string) !== opaque(tag);
75
+ if (!moved) break;
76
+ await new Promise((r) => setTimeout(r, 500));
77
+ }
78
+ return last ? { kind: 'observed', obs: last } : { kind: 'unreadable', reason: 'no conditional GET was made' };
79
+ }
80
+
81
+ /** §A match semantics: the status the probe wants, and no body on a `304`. */
82
+ export function judgeMatch(o: Observed): string[] {
83
+ const out: string[] = [];
84
+ if (o.status !== o.probe.want) out.push(`${o.probe.name}: If-None-Match ${o.sent} against ETag ${o.tag} MUST receive ${o.probe.want}, got ${o.status}`);
85
+ if (o.status === 304 && o.bodyLength !== 0) out.push(`${o.probe.name}: a 304 MUST carry no body (got ${o.bodyLength} byte(s))`);
86
+ return out;
87
+ }
88
+
89
+ const varySet = (v: string | null): string => (v ?? '').split(',').map((s) => s.trim().toLowerCase()).filter(Boolean).sort().join(',');
90
+
91
+ /** §A a `304` carries the `ETag`, and the `Vary` the `200` would carry. Vacuous on a non-304. */
92
+ export function judge304Headers(o: Observed): string[] {
93
+ if (o.status !== 304) return [];
94
+ const out: string[] = [];
95
+ if (o.etag === null) out.push(`${o.probe.name}: the 304 MUST carry the ETag (${o.tag}); it carried none`);
96
+ else if (opaque(o.etag) !== opaque(o.tag)) out.push(`${o.probe.name}: the 304 MUST carry the ETag of the representation (${o.tag}); it carried ${o.etag}`);
97
+ if (o.okVary !== null && varySet(o.vary) !== varySet(o.okVary)) out.push(`${o.probe.name}: the 304 MUST carry the Vary the 200 carries (${o.okVary}); it carried ${o.vary ?? 'none'}`);
98
+ return out;
99
+ }
100
+
101
+ /**
102
+ * §A evaluation only where the unconditional answer would be `2xx`: a
103
+ * conditional request on a resource the caller cannot read gets that same
104
+ * non-2xx status, never `304`.
105
+ */
106
+ export function judgeNot2xx(unconditional: number, conditional: number, sent: string): string[] {
107
+ if (unconditional >= 200 && unconditional < 300) return [];
108
+ return conditional === unconditional ? [] : [`If-None-Match ${sent} on a resource answering ${unconditional} unconditionally MUST receive ${unconditional}, got ${conditional}${conditional === 304 ? ' (a 304 discloses that the resource exists)' : ''}`];
109
+ }
110
+
111
+ /** A plain `If-None-Match: <tag>`: the base case every 304 leg also inspects. */
112
+ export const EXACT_PROBE: Probe = { name: 'exact', value: (t) => t, want: 304 };
113
+
114
+ export type LegOutcome = { readonly kind: 'observed'; readonly findings: string[] } | { readonly kind: 'unreadable'; readonly reason: string };
115
+
116
+ async function each(get: Get, probes: readonly Probe[], judge: (o: Observed) => string[]): Promise<LegOutcome & { seen?: Observed[] }> {
117
+ const findings: string[] = [];
118
+ const seen: Observed[] = [];
119
+ for (const p of probes) {
120
+ const o = await observeProbe(get, p);
121
+ if (o.kind === 'unreadable') return o;
122
+ seen.push(o.obs);
123
+ findings.push(...judge(o.obs));
124
+ }
125
+ return { kind: 'observed', findings, seen };
126
+ }
127
+
128
+ /** RFC 0235 §D legs 1–3 and 5. */
129
+ export const matchLeg = (get: Get): Promise<LegOutcome> => each(get, MATCH_PROBES, judgeMatch);
130
+
131
+ /** RFC 0235 §D leg 7. */
132
+ export const noCacheLeg = (get: Get): Promise<LegOutcome> => each(get, [NO_CACHE_PROBE], judgeMatch);
133
+
134
+ /** RFC 0235 §D leg 6, over every probe that should yield a 304. Unreadable when the host never answered 304. */
135
+ export async function headersLeg(get: Get): Promise<LegOutcome> {
136
+ const out = await each(get, [EXACT_PROBE, ...MATCH_PROBES.filter((p) => p.want === 304)], judge304Headers);
137
+ if (out.kind === 'observed' && !(out.seen ?? []).some((o) => o.status === 304)) return { kind: 'unreadable', reason: 'no probe was answered 304, so there is no 304 to inspect (the match leg records why)' };
138
+ return out.kind === 'observed' ? { kind: 'observed', findings: out.findings } : out;
139
+ }
@@ -92,7 +92,7 @@ describe('otel-emission-grpc: OTLP/gRPC export path', () => {
92
92
  const runSpans = await waitForRunSpans(runId, { timeoutMs: 5_000, minCount: 1 });
93
93
 
94
94
  expect(runSpans.length, req('openwop.it.otel-emission-grpc.host-emits-openwop-run-spans-over-otlp-grpc-collector-captures-them-via-the-shar',
95
- 'observability.md §"Export protocols" + RFC 0008/0009 Track 11',
95
+ 'observability.md §"Export protocols" (gap-closure plan Track 11)',
96
96
  'host advertising exportProtocols ∋ "grpc" MUST emit openwop.* spans over OTLP/gRPC',
97
97
  )).toBeGreaterThan(0);
98
98
 
@@ -11,7 +11,7 @@
11
11
  * `schemaVersion` ≥ 0 and `registrationSource` pack | host.
12
12
  *
13
13
  * Not here: store-implies-emit and the emitted-vs-advertised `registrationSource`
14
- * match need a fixture run; the event shape is `v2-artifact-created-static`.
14
+ * match need a fixture run; the event shape is the corpus gate `coherence/v2-artifact-created-static`.
15
15
  *
16
16
  * Dispositions: discovery unreadable ⇒ `blocked`; `artifactTypes` absent, or the
17
17
  * facet a leg reads absent ⇒ `inapplicable`.
@@ -17,19 +17,30 @@
17
17
  *
18
18
  * The revalidation runs once per client spelling: `OpenWOP-Version: 2.0` and
19
19
  * `2` (versioning.md §1: a host MUST accept both), and `2` with a wildcard `Accept`
20
- * (curl, a default fetch). openwop-app's public origin answered `304` to the
21
- * suite's own spelling and `200` to the bare one, so a single spelling hid a
22
- * violation every other client sees.
20
+ * (curl, a default fetch). A host that honours only the suite's own spelling
21
+ * would pass a single-spelling leg while failing every other client.
23
22
  *
24
- * Measured against the PUBLIC origin a host is cut on. A front door that drops
25
- * `If-None-Match` on the way to a correct origin (openwop-app, 2026-10-04:
26
- * direct `304`, through the hosting rewrite `200`) fails here, as it should:
27
- * the rule binds what clients reach.
23
+ * Measured against the PUBLIC origin a host is cut on, because the rule binds
24
+ * what clients reach. A CDN in front of a correct origin can still fail it:
25
+ * on openwop-app (2026-10-04) a `no-store` discovery response is hit-for-pass
26
+ * at the edge, so the first conditional request to reach an edge node that has
27
+ * not yet seen the object gets `200` and later ones get `304`. That failure is
28
+ * intermittent and real; it does not depend on the spelling.
29
+ *
30
+ * RFC 0235 (`runs.md` §Caching and encoding): the match is RFC 9110 §13.1.2.
31
+ * Three more legs, shared with `v2-run-snapshot-etag` through
32
+ * `lib/if-none-match-witness.ts`:
33
+ *
34
+ * rfc9110-match `W/<tag>`, a list holding the tag and `*` receive 304;
35
+ * a list of other tags and a weak other tag receive 200;
36
+ * 304-carries-etag every 304 carries the tag (and the 200's `Vary`);
37
+ * no-cache-ignored a request `Cache-Control: no-cache` still gets its 304.
28
38
  *
29
39
  * Dispositions: discovery unreadable ⇒ `blocked`. No other skip — the rule is
30
40
  * unconditional at v2.
31
41
  *
32
42
  * @see spec/v2/core/capabilities.md §1
43
+ * @see spec/v2/core/runs.md §Caching and encoding
33
44
  * @see spec/v2/core/headers.md §Request headers
34
45
  */
35
46
 
@@ -37,11 +48,16 @@ import { describe, it, expect } from 'vitest';
37
48
  import { driver, type OpenWOPResponse } from '../lib/driver.js';
38
49
  import { softSkip } from '../lib/soft-skip.js';
39
50
  import { req } from '../lib/requirement-ids.js';
51
+ import { headersLeg, matchLeg, noCacheLeg, type Get } from '../lib/if-none-match-witness.js';
40
52
 
41
53
  const DOC = 'spec/v2/core/capabilities.md §1';
42
54
  const ID_EMITTED = 'openwop.requirement.capabilities.discovery-etag-emitted';
43
55
  const ID_REVALIDATES = 'openwop.requirement.capabilities.discovery-etag-revalidates';
44
56
  const V2 = { 'OpenWOP-Version': '2.0' };
57
+ const MATCH_DOC = 'spec/v2/core/runs.md §Caching and encoding';
58
+ const ID_MATCH = 'openwop.requirement.0235.if-none-match.rfc9110-match';
59
+ const ID_304_ETAG = 'openwop.requirement.0235.if-none-match.304-carries-etag';
60
+ const ID_NO_CACHE = 'openwop.requirement.0235.if-none-match.no-cache-ignored';
45
61
  /** The client spellings a host MUST treat alike (versioning.md §1). */
46
62
  const SPELLINGS: ReadonlyArray<Readonly<Record<string, string>>> = [
47
63
  { 'OpenWOP-Version': '2.0' },
@@ -83,4 +99,24 @@ describe('v2 discovery ETag (capabilities.md §1)', () => {
83
99
  if (miss === null) return softSkip('blocked', 'conditional GET unreachable (fetch failed)');
84
100
  expect(miss.status, req(ID_REVALIDATES, DOC, `a non-matching If-None-Match MUST receive 200 with the document (got ${miss.status})`)).toBe(200);
85
101
  });
102
+
103
+ const discoveryGet: Get = (headers) => get({ ...V2, ...headers });
104
+
105
+ it('If-None-Match is evaluated as RFC 9110 defines it: a weak tag, a list holding the tag and `*` match; other tags do not', async () => {
106
+ const out = await matchLeg(discoveryGet);
107
+ if (out.kind === 'unreadable') return softSkip('blocked', `discovery: ${out.reason}`);
108
+ expect(out.findings.join('; '), req(ID_MATCH, MATCH_DOC, 'If-None-Match is `*` or a list of entity tags compared weakly (RFC 9110 §13.1.2)')).toBe('');
109
+ });
110
+
111
+ it('a 304 carries the ETag and the Vary of the 200', async () => {
112
+ const out = await headersLeg(discoveryGet);
113
+ if (out.kind === 'unreadable') return softSkip('blocked', `discovery: ${out.reason}`);
114
+ expect(out.findings.join('; '), req(ID_304_ETAG, MATCH_DOC, 'on a match the host MUST answer 304 carrying the ETag and the Vary the 200 would carry')).toBe('');
115
+ });
116
+
117
+ it('a request Cache-Control: no-cache does not suppress the evaluation', async () => {
118
+ const out = await noCacheLeg(discoveryGet);
119
+ if (out.kind === 'unreadable') return softSkip('blocked', `discovery: ${out.reason}`);
120
+ expect(out.findings.join('; '), req(ID_NO_CACHE, MATCH_DOC, 'a request Cache-Control: no-cache MUST NOT suppress the evaluation')).toBe('');
121
+ });
86
122
  });
@@ -4,12 +4,11 @@
4
4
  * The v1 twin is `envelope-tier-one-subset-static`; the walker lives in
5
5
  * `lib/envelope-schema-static.ts`.
6
6
  *
7
- * load-bearing ALWAYS ON, host-free: each universal-kind payload schema in
8
- * `schemas/v2/envelopes/` uses none of the keywords that fail
9
- * across several Tier-1 vendors (`oneOf`, `allOf`, `not`,
10
- * `if`/`then`/`else`, `dependencies`, `prefixItems`,
11
- * `propertyNames`), nests at most 5 deep and has at most 100
12
- * properties;
7
+ * The always-on load-bearing walk over the universal kinds reads only the
8
+ * corpus, so it lives in `src/coherence/v2-envelope-tier-one-universal-static`
9
+ * (moved in 2.45.18; `conformance.md` §Two products). This file keeps the one
10
+ * leg that reads host output:
11
+ *
13
12
  * strict LIVE: a host advertising `tierOneSubsetCompliance: "strict"`
14
13
  * has, for every kind it lists in `supportedEnvelopes.kinds`
15
14
  * that resolves to a corpus schema, a schema meeting the whole
@@ -23,7 +22,7 @@
23
22
  * host MUST accept an envelope restricted to the subset from any advertised
24
23
  * provider — and does not distinguish strict, warn and off.
25
24
  *
26
- * Dispositions (strict leg): discovery unreadable ⇒ `blocked`; `envelopes` not
25
+ * Dispositions: discovery unreadable ⇒ `blocked`; `envelopes` not
27
26
  * advertised, or `tierOneSubsetCompliance` other than "strict" ⇒
28
27
  * `inapplicable`; no advertised kind resolving to a corpus schema ⇒
29
28
  * `inapplicable`.
@@ -36,22 +35,10 @@ import { describe, it, expect } from 'vitest';
36
35
  import { familyAdvertised, v2Discovery } from '../lib/v2.js';
37
36
  import { softSkip } from '../lib/soft-skip.js';
38
37
  import { req } from '../lib/requirement-ids.js';
39
- import { loadV2EnvelopeSchema, tierOneViolations, UNIVERSAL_KINDS, type SchemaViolation } from '../lib/envelope-schema-static.js';
38
+ import { loadV2EnvelopeSchema, tierOneViolations, type SchemaViolation } from '../lib/envelope-schema-static.js';
40
39
 
41
- const ID_LOAD_BEARING = 'openwop.requirement.envelopes.tier-one-load-bearing-universal-kinds';
42
40
  const ID_STRICT = 'openwop.requirement.envelopes.tier-one-strict-advertised-kinds';
43
41
 
44
- describe('v2 Tier-1 subset: universal kinds meet the load-bearing rules (always on)', () => {
45
- for (const kind of UNIVERSAL_KINDS) {
46
- it(`${kind} uses no keyword that fails across Tier-1 vendors`, () => {
47
- const schema = loadV2EnvelopeSchema(kind);
48
- expect(schema !== null, req(ID_LOAD_BEARING, 'RFC 0030 §B', `schemas/v2/envelopes/${kind}.schema.json MUST exist`)).toBe(true);
49
- const violations = schema === null ? [] : tierOneViolations(schema, 'load-bearing');
50
- expect(violations, req(ID_LOAD_BEARING, 'RFC 0030 §B', `${kind} load-bearing Tier-1 violations: ${JSON.stringify(violations)}`)).toEqual([]);
51
- });
52
- }
53
- });
54
-
55
42
  describe('v2 Tier-1 subset: a strict host\'s advertised kinds meet the whole intersection', () => {
56
43
  it('a host advertising tierOneSubsetCompliance strict has advertised kinds whose corpus schemas satisfy the Tier-1 intersection', async () => {
57
44
  let doc: Record<string, unknown> | null;
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * Not here: import refusal of credential material, dry-run no-write and
12
12
  * idempotence: v2 defines no import route ("a host serves them on routes of its
13
- * own"). The bundle shape is `v2-export-bundle-static`.
13
+ * own"). The bundle shape is the corpus gate `coherence/v2-export-bundle-static`.
14
14
  *
15
15
  * Dispositions: discovery unreadable ⇒ `blocked`; `portability` absent, or the
16
16
  * facet a leg reads absent ⇒ `inapplicable`.
@@ -8,7 +8,7 @@
8
8
  * currency an ISO 4217 code, `^[A-Z]{3}$` (absent means USD).
9
9
  *
10
10
  * Not here: exactly-one-per-invocation emission needs a mock-provider run; the
11
- * payload shape is `v2-provider-usage-payload-static`.
11
+ * payload shape is the corpus gate `coherence/v2-provider-usage-payload-static`.
12
12
  *
13
13
  * Dispositions: discovery unreadable ⇒ `blocked`; `providerUsage` absent, or the
14
14
  * facet a leg reads absent ⇒ `inapplicable`.