@openwop/openwop-conformance 2.46.35 → 2.46.36

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.
Files changed (31) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +3 -3
  3. package/coverage.md +4 -5
  4. package/dist/spec-artifacts.lock.json +2 -2
  5. package/fixtures/conformance-interrupt-form-refused.json +108 -0
  6. package/fixtures/conformance-interrupt-form-unbound.json +108 -0
  7. package/fixtures/conformance-interrupt-form.json +107 -0
  8. package/fixtures/conformance-stream-text.json +1 -2
  9. package/fixtures.md +19 -4
  10. package/package.json +2 -2
  11. package/requirement-aliases.json +98 -1
  12. package/requirements.json +551 -804
  13. package/scenario-majors.json +13 -19
  14. package/schemas/CORPUS-STAMP.json +56 -69
  15. package/src/lib/callai-attempts-witness.ts +13 -1
  16. package/src/lib/family-advert-witness.ts +37 -50
  17. package/src/scenarios/stream-text-fixture.test.ts +13 -5
  18. package/src/scenarios/v2-envelope-surfaces-absent.test.ts +55 -0
  19. package/src/scenarios/v2-interrupt-form-rules.test.ts +143 -0
  20. package/src/scenarios/v2-limits-clarification-rounds-advertisement.test.ts +42 -0
  21. package/src/scenarios/v2-peer-dependency-declared.test.ts +1 -1
  22. package/src/scenarios/v2-provider-output-reliability.test.ts +94 -0
  23. package/src/scenarios/v2-structured-output-advertisement.test.ts +82 -0
  24. package/src/lib/envelope-schema-static.ts +0 -167
  25. package/src/scenarios/v2-a2ui-v09-surface.test.ts +0 -323
  26. package/src/scenarios/v2-ai-envelope-advertisement.test.ts +0 -43
  27. package/src/scenarios/v2-envelope-contracts-advertisement.test.ts +0 -48
  28. package/src/scenarios/v2-envelope-reasoning-shape.test.ts +0 -81
  29. package/src/scenarios/v2-envelope-tier-one-subset-static.test.ts +0 -64
  30. package/src/scenarios/v2-envelopes-advertisement.test.ts +0 -85
  31. package/src/scenarios/v2-limits-envelope-caps-advertisement.test.ts +0 -61
@@ -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": 665,
4
+ "files": 663,
5
5
  "v1": 455,
6
- "v2": 225
6
+ "v2": 223
7
7
  },
8
8
  "majors": {
9
9
  "a2a-1-0-agent-card.test.ts": [
@@ -1287,9 +1287,6 @@
1287
1287
  "v2-a2a-push-delivery.test.ts": [
1288
1288
  2
1289
1289
  ],
1290
- "v2-a2ui-v09-surface.test.ts": [
1291
- 2
1292
- ],
1293
1290
  "v2-advertised-fixtures-exist.test.ts": [
1294
1291
  2
1295
1292
  ],
@@ -1308,9 +1305,6 @@
1308
1305
  "v2-agents-fan-out.test.ts": [
1309
1306
  2
1310
1307
  ],
1311
- "v2-ai-envelope-advertisement.test.ts": [
1312
- 2
1313
- ],
1314
1308
  "v2-ai-providers-advertisement.test.ts": [
1315
1309
  2
1316
1310
  ],
@@ -1461,16 +1455,7 @@
1461
1455
  "v2-enum-growth-rule.test.ts": [
1462
1456
  2
1463
1457
  ],
1464
- "v2-envelope-contracts-advertisement.test.ts": [
1465
- 2
1466
- ],
1467
- "v2-envelope-reasoning-shape.test.ts": [
1468
- 2
1469
- ],
1470
- "v2-envelope-tier-one-subset-static.test.ts": [
1471
- 2
1472
- ],
1473
- "v2-envelopes-advertisement.test.ts": [
1458
+ "v2-envelope-surfaces-absent.test.ts": [
1474
1459
  2
1475
1460
  ],
1476
1461
  "v2-era-2-append-vocabulary.test.ts": [
@@ -1542,6 +1527,9 @@
1542
1527
  "v2-interop-trace-context.test.ts": [
1543
1528
  2
1544
1529
  ],
1530
+ "v2-interrupt-form-rules.test.ts": [
1531
+ 2
1532
+ ],
1545
1533
  "v2-interrupt-resolve-terminal.test.ts": [
1546
1534
  2
1547
1535
  ],
@@ -1557,7 +1545,7 @@
1557
1545
  "v2-legacy-profiles-absent.test.ts": [
1558
1546
  2
1559
1547
  ],
1560
- "v2-limits-envelope-caps-advertisement.test.ts": [
1548
+ "v2-limits-clarification-rounds-advertisement.test.ts": [
1561
1549
  2
1562
1550
  ],
1563
1551
  "v2-localized-content-delivery.test.ts": [
@@ -1710,6 +1698,9 @@
1710
1698
  "v2-provider-conflict.test.ts": [
1711
1699
  2
1712
1700
  ],
1701
+ "v2-provider-output-reliability.test.ts": [
1702
+ 2
1703
+ ],
1713
1704
  "v2-provider-usage-advertisement.test.ts": [
1714
1705
  2
1715
1706
  ],
@@ -1809,6 +1800,9 @@
1809
1800
  "v2-stream-sse-projection.test.ts": [
1810
1801
  2
1811
1802
  ],
1803
+ "v2-structured-output-advertisement.test.ts": [
1804
+ 2
1805
+ ],
1812
1806
  "v2-sub-workflow-advertisement.test.ts": [
1813
1807
  2
1814
1808
  ],
@@ -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.46.35",
5
- "corpusTag": "v2.46.35",
4
+ "version": "2.46.36",
5
+ "corpusTag": "v2.46.36",
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": "9e0e957200bc2f2eab4da5d2ffde610468cbaa47386c503e19d94a2d6b7f078e",
13
- "api/v2/asyncapi.yaml": "11128d5b4632d020ce4b5aa8dd6178d56ac02d4ebb60a9163533e8d263eb7feb",
14
- "api/v2/openapi.yaml": "454b15732dcab236e8027618c5ffe7985248005156a35b4d08125301b2b597e6",
12
+ "api/seams-v2.yaml": "f9df391138afec022deb5fcc9b4ecd8a60a1afc792b4c1c2a5b9704ed4c81c60",
13
+ "api/v2/asyncapi.yaml": "39b6ddfd2fb533c20ef85f8e59fb52374bdef4c0bb6927763bb4fe935df01101",
14
+ "api/v2/openapi.yaml": "7dbf667cb2ab597e8d4ac71a6938c528f7e0c639f26bba9494dbc2b708ca1f2e",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "276fc1d51eb08e14e9127b9fd27761d7046ee33c12000f3a64a801322db8bf58",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -100,7 +100,6 @@
100
100
  "schemas/trigger-subscription.schema.json": "e8cddab88f73a7a79bb3b78a60a480a00e16966b76f0e18c21a2aef09b6420ac",
101
101
  "schemas/ui-plugin-message.schema.json": "346638babf1f8ea7b161cde75c0038b518cd2cc5bf0631772e20a9b74c96b5dd",
102
102
  "schemas/v2/a2a-task-state.schema.json": "1810363e2d9bddb5997923bdac4044cc17c6f46ec5a40515d2ff21d9c82c1ad9",
103
- "schemas/v2/a2ui-surface-delta-frame.schema.json": "6889c5da3fe7e76cb614038c0eea6774776fa640448558b258eb87fb50cb9b64",
104
103
  "schemas/v2/agent-deployment-transition.schema.json": "fe2d56f9d8ccb5503c94f1f4dff8af5a7286cc304802b089d42d665ddefcf111",
105
104
  "schemas/v2/agent-deployment.schema.json": "64d5f2848419b6ff797bcf34c0e5f4b05a612c3237d2cf0a034fb41f8b8ebc6b",
106
105
  "schemas/v2/agent-eval-suite.schema.json": "a49ad7a232ec781512375001f8d8c70ab073b69ca094f5251dbb30a0bbd972a7",
@@ -110,18 +109,17 @@
110
109
  "schemas/v2/agent-ref.schema.json": "3d94801d76f6d4726a1c4f9c7ffc7456d5d73dd054eb0be134f6b1a9cbb7c5e9",
111
110
  "schemas/v2/agent-roster-entry.schema.json": "72132a80a3eb305e83727fbf6e105d7bd1790b481231d6ff864fd18d5554fc27",
112
111
  "schemas/v2/agent-roster-response.schema.json": "f646b8a5af9ee884e1a86a9c84ec29f10dd3dbb275711ce79db27bee981d4a1d",
113
- "schemas/v2/ai-envelope.schema.json": "0dc7dfbf032a37239ffd81fc2d67f999a40782ff5074866a56e414164cdee809",
114
112
  "schemas/v2/annotation-create.schema.json": "ec32c22a243b343eeb6956a23be2d76ba5b50c8018ec3ec9d6efa5a1d9b0c792",
115
113
  "schemas/v2/annotation.schema.json": "eb4813cdaa8e325412cfcaeeee5c8a28f3751c946dec64e546c7ba0ad3aad8d4",
116
- "schemas/v2/artifact-type-pack-manifest.schema.json": "acbbf14d32da4e0cb81254bbd6cc48fc10083890572044ddef71c59a0f65c185",
114
+ "schemas/v2/artifact-type-pack-manifest.schema.json": "628fa649aed40c8763d1e22daa67c15991618656e152f64e746976f422f4581b",
117
115
  "schemas/v2/artifact.schema.json": "85b9dc284d39b99d2a66fa8cbf47f2dd3d8526d3bd6cc411ad315b372de38975",
118
116
  "schemas/v2/audit-verify-result.schema.json": "14af8e9283510f0a40e48a2059c929ee44e0fc9fa3cc66a95bfbe90b17c48297",
119
117
  "schemas/v2/budget-policy.schema.json": "1de68095db0beb5c7a4be629de26e79f62ebbe748a88d46f36e768edfd1f0d68",
120
- "schemas/v2/capabilities.schema.json": "3c494e0914f766209017bf1d876852c3e4daa9f0d7e7e840f6cad23ad00d769d",
121
- "schemas/v2/certification-bundle.schema.json": "5cfa7fb5247160333e33a58b60d42bcd4e5269d8391d6a112d301e14828892ed",
118
+ "schemas/v2/capabilities.schema.json": "00aa36d0bbaa51169e7a33090b37b501dd2af1ea2ab5174d28b5b2686a4543a4",
119
+ "schemas/v2/certification-bundle.schema.json": "29d2ff33d8256d8729cd4914e2ecff5ff07afc310264e2db483a9c0ae13df2a6",
122
120
  "schemas/v2/channel-presence-payload.schema.json": "fc03df0c20cc12a25f7ee6a47503a4c5931d79fe3d5ff24815e8fd7c1bcb9a87",
123
121
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
124
- "schemas/v2/chat-card-pack-manifest.schema.json": "92a57db2fd4b2463f14ef155fef8e3f18afc78960b646459dcf32efc79ff6bf5",
122
+ "schemas/v2/chat-card-pack-manifest.schema.json": "32893b146e2ef82d527d695b70007c0cbb897c5775af3141ae9f30e933a56d29",
125
123
  "schemas/v2/compact-tool-descriptor.schema.json": "b5c418d72082d5b713bf318212a83397e5be98e56d25ca056302b41b8dd8273b",
126
124
  "schemas/v2/compensation-policy.schema.json": "b3c1142637f5bf980f2b0bb67adb47e8cb7abb99a0405a4b6816ccf5d9c089d6",
127
125
  "schemas/v2/compensation-projection.schema.json": "f46977c7076347b5473faa8c4bbe73d8321c33b33c98fff2f26ee7cbada4ed98",
@@ -136,15 +134,7 @@
136
134
  "schemas/v2/dispatch-config.schema.json": "27cb203d2a5cec90d8eb398569acbd8314ad9b8e231d1acfb8db4aa76f8d8f8b",
137
135
  "schemas/v2/effect-ledger-projection.schema.json": "0d118d385a43921118a76888449c5c3c5618eab1b80914b84a0a1b48d18822c1",
138
136
  "schemas/v2/effect-seam-manifest.schema.json": "197ef9944ab027a50d1b9352f317cbbc12c8ad955fdb14650fb90477052ffef0",
139
- "schemas/v2/envelopes/clarification.request.schema.json": "9e39d7b09f0b3ce7902d6aa19ca0eb52867b634efc78a881469c4d44fb3333e7",
140
- "schemas/v2/envelopes/error.schema.json": "6a11fa3b9d61736fcb5675e6ac9825919aa609dceba13ef5615993d54647802b",
141
- "schemas/v2/envelopes/media.audio.schema.json": "a422352240a592c12840172e70835729f72b6b21915d14e926b6ffcd5d52a704",
142
- "schemas/v2/envelopes/media.file.schema.json": "1a6ec46d5b987f5b4a95054f4c04c2dca712409ccaf4bc3ea3c92c0f6e0acd99",
143
- "schemas/v2/envelopes/media.image.schema.json": "1373a145e4d25c1ea43fbe342a7a71ace370d6344459c2698d7904545ee40789",
144
- "schemas/v2/envelopes/schema.request.schema.json": "be2c5f7aa881cdd252ccff47ac02193659e1393633a1541f4297383205d384a2",
145
- "schemas/v2/envelopes/schema.response.schema.json": "d049a081267c06c28879c331b147f3ed821b14ccfd93005c67aff64db0a8c68e",
146
- "schemas/v2/envelopes/ui.a2ui-surface.schema.json": "e92a2548ba65454c9e0a34f72ea6768d18f59e61fa5da7668d0b2d5baddaddc8",
147
- "schemas/v2/error-envelope.schema.json": "0e9fe379d2f37d928f247dcca89e7b946a8b90b61a68efa5f3e73deb7d1237db",
137
+ "schemas/v2/error-envelope.schema.json": "5d566a910b715452e99b32876426cd490ef803f2177e3ecbbd1051170d4d4462",
148
138
  "schemas/v2/eval-summary.schema.json": "d07f4d116c5410997a81d0bc5387545fb61933a6333c360a26ab8a71c749336b",
149
139
  "schemas/v2/export-bundle.schema.json": "bd28905a7729437ab7f2ad8bb33e13a371b2bf5605a7eb2962a0d246de312d69",
150
140
  "schemas/v2/form-content-pack-manifest.schema.json": "a1942a124e250a6e9fbdb6b811c5a125e78fbcbcaa46dfc71d0636f24710a339",
@@ -154,13 +144,14 @@
154
144
  "schemas/v2/heartbeat-state-changed.schema.json": "eb68d0082aa996650e3a6b8ccf32457f959cebc7e6728cc7c331b9d171a4bef6",
155
145
  "schemas/v2/host-event.schema.json": "8ecb5ae218ea6ba71b2aa52905c7851d125d6ca3c5108718739e84b3d6041d02",
156
146
  "schemas/v2/ids.schema.json": "65cfaa193be0ca9cf48af39c18c553979e3ec1f7fc04509aaa513b322d7b7e4a",
147
+ "schemas/v2/interrupt-form.schema.json": "b9bb0cc603ef0794a781fdaadcd5d3d6bada72de445e449e3ac6aba0abcfb384",
157
148
  "schemas/v2/localized-content-language-settings.schema.json": "3c8350a178037a460f5d87466ccaf9ed5fe3d41497786d2504cc66e42152c8cc",
158
149
  "schemas/v2/localized-content-page-response.schema.json": "ef48329749758afb21e4d3cbc3f017abb911f75726819457f35b9f1390332c75",
159
150
  "schemas/v2/localized-content-page.schema.json": "72560563cc2956ecc9aa4c04fceaf1f7f08d2c6520b7d1b2fa8e52f9b825d8e7",
160
151
  "schemas/v2/localized-content-section.schema.json": "b52cfe36c857c2800f71c480dcd7323e1a29783ecdc9f2440bc8e75a5a034346",
161
152
  "schemas/v2/memory-entry.schema.json": "290576ae84f4fef4cdf975932b87963283b11c50ea3d2654b32cd96aa6537c3d",
162
153
  "schemas/v2/memory-list-options.schema.json": "01ceb7370c4eacd227d2c9b7e1951ee16650abe26a32dc9d6a8e46a07a39093f",
163
- "schemas/v2/node-pack-manifest.schema.json": "3eb2db1d84f0b8dbde917686c72c121788a4ce6e42cf13d497a3b68564546d0e",
154
+ "schemas/v2/node-pack-manifest.schema.json": "b3b733fb0e4e6512c9c15c862bf43295fbb7e6a87ffff720d367ccf436effd7c",
164
155
  "schemas/v2/orchestrator-decision.schema.json": "503b9b28109d875ec7a1acccb45447312a6b1c7d5f4175a9f43c8338d37bd1b1",
165
156
  "schemas/v2/org-chart-responsibility-view.schema.json": "8a2565e4cdc6737a3946a70799f93642808b92f9c8d56dcdff3a0782053b89a1",
166
157
  "schemas/v2/pack-lockfile.schema.json": "2685417702c105146b780cd99154296a46578fbb10d81c8c713348ee26fea898",
@@ -168,7 +159,7 @@
168
159
  "schemas/v2/prompt-kind.schema.json": "67251c937a5a91fb97c0422050e808dc0c162a9b8561366814cf87b0a7f62e00",
169
160
  "schemas/v2/prompt-pack-manifest.schema.json": "752407469475396ad250085437a6cc6bd56a017ac6d3e52196aecc65dda4e51a",
170
161
  "schemas/v2/prompt-ref.schema.json": "8288495bf353fbc158cef6525d16dd1dcd9373941d15ec072044f05d143355d0",
171
- "schemas/v2/prompt-template.schema.json": "63825b39807e4ee85d41b9ad296ff2a0dd7bd2076d91e76a6c15a337e3e3bb84",
162
+ "schemas/v2/prompt-template.schema.json": "1c8de5d89a85c9ccd6c4f7571bd27f5d6985e19ff95c4693a9373fad5ef90816",
172
163
  "schemas/v2/proposal-apply.schema.json": "eb187cfec8cf9a799d94463c34550fa84879e29bbc201a03b5d6ab58efb398d9",
173
164
  "schemas/v2/proposal-list-response.schema.json": "1b5e78fc1e4256dbe6bc866487879deb8f7b9cc18f5bc875db3fde46d79bea02",
174
165
  "schemas/v2/proposal-revise.schema.json": "065e75cccd01fcc619e63c25f2a1775adcc24b0467689dca42462ace6bfa1146",
@@ -190,7 +181,7 @@
190
181
  "schemas/v2/self-hosted-runner-result-frame.schema.json": "8e739a721f350226f3ffb4af752b4fe0a72016042a7b6f42e16c0487c3c58983",
191
182
  "schemas/v2/subject-link.schema.json": "1fc941d6c14af886534009f2ffa6611e2035eb07e30b1df918c50d6bafff026c",
192
183
  "schemas/v2/subject.schema.json": "094e981fb20052a911393e219ea5f2065d8b8417b65080a70c5ea99fd960a8fe",
193
- "schemas/v2/suspend-request.schema.json": "368d9932efb08f85b4520cac44b3c553876209f55bada93b5fcac93cc890b411",
184
+ "schemas/v2/suspend-request.schema.json": "e02a5b34073d2eab248429a640d99c37904c5998db78202bd5ddd8a20f2c85e7",
194
185
  "schemas/v2/tool-descriptor.schema.json": "9bfe8a1ee5ea55d1c23e383d97234d9d6545d833996d7bc30caf075e0a6294bb",
195
186
  "schemas/v2/trigger-dead-letter-page.schema.json": "571f8c39b64571bff20d391a6e6e829d4ce470ab790b2b7f810cc4aa40edcbc1",
196
187
  "schemas/v2/trigger-event.schema.json": "710ecca8b3ecdad3a532a96768177f062192b24a589a4f798c7eb24bab64b30a",
@@ -201,7 +192,7 @@
201
192
  "schemas/v2/webhook-delivery.schema.json": "5f5361ede12098b5c2d685f0aa70fcb07219fd6b68c6ad6af393ca8dd266d56a",
202
193
  "schemas/v2/webhook-verification.schema.json": "76e4e0d81143ffd2649bc7adba2aa34f2525e2c4e9f0300a425d908b3163196b",
203
194
  "schemas/v2/workflow-chain-pack-manifest.schema.json": "c0e38aa96b029c539415fb7e8a793fd770c3eb5a1b44a818661f9c127c99191b",
204
- "schemas/v2/workflow-definition.schema.json": "cb1194631d2b96b0975940b916be43a70363b78b1b6716f9cd84b162d3c96615",
195
+ "schemas/v2/workflow-definition.schema.json": "84a3776bd6020cbfd7d87d1f4f3ae28211e6d77a9b350d8ce01aa9496a3d9eba",
205
196
  "schemas/v2/workload-identity.schema.json": "1f589debfac6d70e0908da511550ec69a27b4bcc8314551cd843b6d923605efc",
206
197
  "schemas/v2/workspace-file-create.schema.json": "b6b5260857318c3b67de0231ed15e3a746f525880a763e7b36a7854178dd10d0",
207
198
  "schemas/v2/workspace-file.schema.json": "d2ed39e8c229dde33b56905c8df6f8b2ff056c97e1c5f615e3124baa54a6254f",
@@ -210,63 +201,62 @@
210
201
  "schemas/workload-identity.schema.json": "64ed93e12cc9f0657e56ff9b8f045e5d68d397df5276d103c07f42c7f34f0579",
211
202
  "schemas/workspace-file-create.schema.json": "70a23b92c2958c0165d7d29aea9020a045dc7816af82c80c5f50d0aac19c4856",
212
203
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
213
- "spec/v1/alias-detectors.json": "22444c22bb88c568339ef512553f9fc38146e22b566d11ab8608f655d688d19c",
204
+ "spec/v1/alias-detectors.json": "202a443678e592a515e33aad7f6ab679a07d8408809f2d4b0f59d156c84ffc65",
214
205
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
215
- "spec/v1/core-standard-manifest.json": "e64402d125ca8da121b7595b1dbaa580d72cd915e45b80b79d309c38a492c075",
216
- "spec/v1/deprecations.json": "e723bc11d7272c71789ad1303bb7f21809a8a024abf57594f9d5c35dc199ece9",
206
+ "spec/v1/core-standard-manifest.json": "c1a5a42b9860f359d8b959c5f6bd75a02654b5658fa85e31c7655a25137f2c50",
207
+ "spec/v1/deprecations.json": "901fdab0a7212627f1838cbb06ae7b7204f0dff528299e56d3d938deecea27c1",
217
208
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
218
209
  "spec/v1/end-of-support.json": "35f0bf3b70fe78b16e2a2fd81a153fc27e703f6c16376c6fe7cdf1f4f2c4e6d4",
219
210
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
220
211
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
221
212
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
222
- "spec/v1/gaps.json": "1c495d62d144e2ce1b0e9282df38c92cdd96015c55a986a047aa8a1c9612d6ac",
213
+ "spec/v1/gaps.json": "b984976759acb1b8d329a49acfa2425938d7d86cd1433f43c48ab22a6c51e9ca",
223
214
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
224
215
  "spec/v1/migrations.json": "4c50760be70cb644d02427bcaf5749606700edf4513f423903cf3b1d12f5c300",
225
216
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
226
217
  "spec/v1/operation-path-manifest.json": "f988f7ebf58ff192e999e2a71192066052f837acc03c91d047d6050ca21a83b0",
227
218
  "spec/v1/spec-gaps.json": "ea9612af55bea9dae3e82223d4f714243f8f590b0193f1188257b13491a38afc",
228
219
  "spec/v2/README.md": "c58acd84bb67c69043d9f777cbaa16d03e4f0f0a8158d2984526b69981067a14",
229
- "spec/v2/core/artifact-type-packs.md": "f734740cc3963f86c9f273a7dace26291bba2855161ddd3540618131a2c8d13e",
230
- "spec/v2/core/capabilities.md": "6b766bcc1ec8c8dd8054defd8a93d8f5ceb046f16d256aef24d1a98bd89a1f73",
231
- "spec/v2/core/conformance.md": "3ca291e63bc70a6ef829ae8759ad0ded3741ea7aa507bbbdffc57de443ab2ae2",
220
+ "spec/v2/core/artifact-type-packs.md": "ba5a258ac93b1aa4d74a4464c63a8f72dbbc5d24fd56f34a2c2ce9f464892799",
221
+ "spec/v2/core/capabilities.md": "c0b90bb002cfa1857406e700edbb8099bf5fc6b0c5e18d1f761b0334bdc3106f",
222
+ "spec/v2/core/conformance.md": "2e12b5fceb9cbd1bbf4a536310fe92a4cd44947e48d0466013327c5de202a2d9",
232
223
  "spec/v2/core/connection-packs.md": "c80f95bd6a03698f35c72cdb2b46bd973f49203bbd786c26760e35fa86e6f23d",
233
224
  "spec/v2/core/conversation.md": "8d6abedf6af408a74577753bfca24719d318e2632e10b45ff5d63bdcf31a8aaa",
234
- "spec/v2/core/errors.md": "53b63a7cfafb9801614fad4ecfa1e2859cff4d142639d7bf6eab5027ed392b74",
235
- "spec/v2/core/events.md": "fd1d95f77565b0b0a747544f4f2126bd02ae4f7cf837ead1da4d89e580b7f694",
236
- "spec/v2/core/execution.md": "4218dbb397534940f83ca5d46561f02bf8f3fdf68d2ae7fefe7f2eb2ed771103",
237
- "spec/v2/core/form-content-packs.md": "02931227899676fd4581a27017be2a6c4953904717be9b81c29d12f87ab3917d",
238
- "spec/v2/core/headers.md": "dae37c2b3980099272e5b9581107c0410d6b23aac95ea6c5a0890c34f0e51c8f",
239
- "spec/v2/core/host-services.md": "a6b5af882cb1e5c992dddc53c4de06feb36eee01bd566614330041213b3ce657",
240
- "spec/v2/core/i18n.md": "882904b7d59f992ab1e5f7346167161a54cf665b8fee47e64a3862cf9133a580",
225
+ "spec/v2/core/errors.md": "0ba4fa59f0f3dc025d43147135dabede6c19d583677b761eafe693fc2169352c",
226
+ "spec/v2/core/events.md": "5834308616f2e722e217db776edea37338c283196b6d2a7c241256575ccca825",
227
+ "spec/v2/core/execution.md": "d6e1ab7336a88b7a598a192434f584e6787e60aeeb56fcdbc32fa548cde3086a",
228
+ "spec/v2/core/form-content-packs.md": "d56022c207c8406fed4b2e9501bd14e70a4300e371c0cfc371787899ae0bd997",
229
+ "spec/v2/core/headers.md": "c86c56868db64724ca8e7afd34bff33740deb2612bf77fa09d412a1d6c65f3c6",
230
+ "spec/v2/core/host-services.md": "68fbe359ec9efc453105a225998b8d0dada07ae61bfd05e324dd8649af31261d",
231
+ "spec/v2/core/i18n.md": "19aea08290a7604f36fa8b416ad270cf84e193cc8fa39d85e52015e312a95565",
241
232
  "spec/v2/core/idempotency.md": "adbd317a6ebb57c2759c076297b31f67def9e391576bccd0bbea787b13e85872",
242
- "spec/v2/core/identity.md": "d0e3d388484507dd6260601ebf8dd1447b0b0f26ce2fe76c8a5d49e61387cffd",
243
- "spec/v2/core/interop.md": "6ec8259117bdb387b9323ca22c707b3b8571c00034e461c4ce79f4070c4d6b4a",
244
- "spec/v2/core/interrupt.md": "10f15dfe30baa0fc748aea0a067f9b271bea316fde6b598d78f77edc296f698a",
245
- "spec/v2/core/node-pack-runtimes.md": "e1088cb69b8c3c67256c494063328916c2980ab1aa97a7063de25bab82fdb1e5",
246
- "spec/v2/core/oauth.md": "c069ae4f9aae2eafe14c07c0bf709aa7ade0dcc821973d740400d49d901f7061",
247
- "spec/v2/core/overview.md": "999cb657711d6c28e62032fc31a013cc175f7a981a3b012e4bf4a90a2b84344c",
248
- "spec/v2/core/packs.md": "74d9c804a71e0e0400e7a5667a918670bcb435be0702b4625ec774ef0f1aa359",
249
- "spec/v2/core/persistence.md": "249a1de353f421cdf92b9006a13a10afdb002f4029eb6a13520cc95252edb2ec",
250
- "spec/v2/core/portability.md": "ab13a6ca43544b9a6a91edfb377ec680c768d14be841c84fb79125b231426891",
251
- "spec/v2/core/replay.md": "9e66e2029b65866187c0920428a8c5bf8ad1c2b39feefbd5c02f0e59909afc7d",
252
- "spec/v2/core/runs.md": "1c292c0ab4a3119aeff3a6e9b6e99cff69782df78c3872179f9f0661b6204f23",
253
- "spec/v2/core/security-defaults.md": "d201fbcd964a624ab45a8bdb7ceca113c561df4c33e9017c2952dd8ef62919a4",
254
- "spec/v2/core/storage.md": "dc94b985847c1341c7a064f04a6010f0fdbe6c3ab3e555d4362878c81d764c18",
233
+ "spec/v2/core/identity.md": "3447f4bec0e4780a3b32b0039d9a0ae1d85de5a71166a4d7e2d3d68b09d55129",
234
+ "spec/v2/core/interop.md": "78d7944c8955412a570f14b84bf74ed4e0ef5dec6680e1cb538c3329a4aa778b",
235
+ "spec/v2/core/interrupt.md": "eabfd26e75bbd4c63b073dc53759008feabef8b81b7e43c28ad725189100848e",
236
+ "spec/v2/core/node-pack-runtimes.md": "0a269d2b36477870d45bdd2e7e34fea9dfd428e2e59e6cc7cbc0c67f3147a9ee",
237
+ "spec/v2/core/oauth.md": "9bdbdc85ad2ff4c1f578730edba3a79a6ce111f0335f90feb06863c8e823a23f",
238
+ "spec/v2/core/overview.md": "593c2ac434952f08c6f552e1b77780541906fe5ffdeb911133f6402075e65e72",
239
+ "spec/v2/core/packs.md": "c46a3bbd8a3a8cfbb6476b88f90d234a45f724aa1f640c9ce6430ba05bacb069",
240
+ "spec/v2/core/persistence.md": "d1767bde0db8038bf6c4f8dc31c4900c67dbd77b4ccc382e99b9f29501b472a3",
241
+ "spec/v2/core/portability.md": "93b9cb8bb85448669df716effb7627236b2bb069f8c5ca7306e8971b9355abfd",
242
+ "spec/v2/core/replay.md": "cf992b8c7f646a79bd0bdd39451cc9d015f7150a3c342c312b2a89d95abe49de",
243
+ "spec/v2/core/runs.md": "f9c26490e52fa69a10c8e98c8a489e3bc8dfbe3effe334bb1793bc9b575f5efe",
244
+ "spec/v2/core/security-defaults.md": "18c9956cae51c3da1def80ce94741ad1fd664a8150701160c6cd0ef367c79749",
245
+ "spec/v2/core/storage.md": "bfcc74526d0f24539188b1c5d1567d8510e80d0b6c39fdc4d19204fcd6fd1f85",
255
246
  "spec/v2/core/tool-catalog.md": "d16a9004418719c48301804aefa4d7ab6f41112a4ed83727f552aa1b92b418b0",
256
- "spec/v2/core/versioning.md": "348a6dc5bd3425efc0016bb6772d5d04ebf578b73eebcdfec6c2d82346a8577e",
257
- "spec/v2/core/webhooks.md": "b3be00624d07466606c81ff5069744428d16761e16d79807517b171d8293c262",
247
+ "spec/v2/core/versioning.md": "f25c64849e9fa7e3ddc976f33c502bbf0e3fdd158c5c2d5730d524b1f8a19bfe",
248
+ "spec/v2/core/webhooks.md": "861284396eb4f445f4b7bec210f07dd2c96d18084f8511371235b98617bf2b90",
258
249
  "spec/v2/core/workflow-chain-packs.md": "fdce7a8477e269950a2bac05ee6eddbd66eb0b670b464d00054f7196ec05d29c",
259
- "spec/v2/corrections.json": "3a8d93e33865b692d26a3b6bfd3819766e206b2e0c2a69669baa4bf833d05a49",
260
- "spec/v2/corrections.schema.json": "46bbffb954d13bd9995aebc912ceeb2544f7064331abf25fd6ab85c81a5cec94",
261
- "spec/v2/declaration.json": "c914e17b8be18ffd186dbd63556c5a06816562b949029413ba46f556e1cd0d54",
250
+ "spec/v2/corrections.json": "5ee76d1ee87677a86d5d9ee2f477b88fc29f9f9d37611040b9ccb08f8f30fb2d",
251
+ "spec/v2/corrections.schema.json": "02f6a0a9531e657693be311af0f59d6432f3efcf645f56ccbf39e5b141e6b641",
252
+ "spec/v2/declaration.json": "113c50192fdb2bb1b55e35f7f79844442021c6698da47137692db25c2fd870cb",
262
253
  "spec/v2/declaration.schema.json": "ef951633e4070899f64828f5cf1b5f4870270a0360f81dbb49b5b4d6cd407550",
263
254
  "spec/v2/eos-override.json": "4c72d2f6a658943b01c1de1643cf294642091933af7832f38ee5495df684cb2d",
264
- "spec/v2/errors.json": "98be280804a0efaa279243cab79edb657f3f262829ee53f10e01d005c32fea41",
255
+ "spec/v2/errors.json": "8b4d2ebab569b26f608323ca4c9adaf805ab515286d26532db23fcb97541787f",
265
256
  "spec/v2/errors.schema.json": "47404ad53e6147cf9017b813483712466573e419fb33e6c4b6c12d3e7deba1bc",
266
257
  "spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
267
258
  "spec/v2/event-codemap.schema.json": "b173f2a9bcc0bf9b62a474ce3b91e1431d597e64fd1560fc58662cd8606eaf9c",
268
259
  "spec/v2/ext/README.md": "3f3b5f09f961b65514cea6880c303470d4b133a3615c734ad7f3c28ba2da8117",
269
- "spec/v2/ext/a2uiSurface/README.md": "5518c7f355262eb7cc584422f4ff8e548f066b211878f969274a3a578127622d",
270
260
  "spec/v2/ext/brand/README.md": "aa64eeaa7d091110ff4378842e2a72eaa19feed0016a41fbce5ffb7d9959b4a0",
271
261
  "spec/v2/ext/canvas/README.md": "6829ee68ea4fec4dc97990a13289155fd5bb3940aeb4d3a98301c06cee763e51",
272
262
  "spec/v2/ext/chat/README.md": "6bcd56f7927f635853c6e6ffc67386ad6cb2f80c7d954197467ba34b3db11b96",
@@ -286,15 +276,14 @@
286
276
  "spec/v2/ext/webResearch/README.md": "2771686719161b811c2a50361815a334c58f09e442528fb8e23e4fcdcd42d630",
287
277
  "spec/v2/facets/a2a.schema.json": "b68bf5e29e455e46c2ad7cfcccf5963730ec2310ff9db81884550d8df30fd6ef",
288
278
  "spec/v2/facets/agents.schema.json": "cc9abae19f500b8a2c6f2b3494284f6f9bb782cde7eec13e4f2f5363a1b44ad5",
289
- "spec/v2/facets/aiProviders.schema.json": "6e4327bcd48110686cc1adfd26ddd6fbbf4ff529c476dcc74eeff8c5ae9965ce",
279
+ "spec/v2/facets/aiProviders.schema.json": "8bf8a359dc36cc79a93314aaa129822faad6c1ef1183479b924435fbb3699578",
290
280
  "spec/v2/facets/auditLogIntegrity.schema.json": "9a7f81320c8f940c6f4129bc7dd895a4063231c5458a717a08c2cbf9bb886c46",
291
281
  "spec/v2/facets/auth.schema.json": "7d98bc81a0f7d307460d039eebfebd21388091bfe1d538762583940f94c0bd2a",
292
282
  "spec/v2/facets/connections.schema.json": "f998bb206a5814183bb4720cc34fa43b7ab64d61e39a79437b009c589ce8b78e",
293
- "spec/v2/facets/envelopeStrictness.schema.json": "28be0a27f880bd45ec1222a16155f5e9167bbca57bf0322970fe1eb2654562aa",
294
283
  "spec/v2/facets/heartbeat.schema.json": "81d7fa1895a8b0241bd07cf00a7e7905bef0fd14eb3427325261c62eee5746a6",
295
284
  "spec/v2/facets/hostEvents.schema.json": "8834c2fde7bc2ba9eb433f22c9d6ec3f9739f44049eecdbf0a05baf2bfa0bb7d",
296
285
  "spec/v2/facets/interrupt.schema.json": "2110ef32c3f880bf706475ef4cf8ddf97ff06871b8e6003a5edbcf4439f1fb70",
297
- "spec/v2/facets/limits.schema.json": "218fcbd34dd2cdf7548c29c8c76e1a6aea2b7d7df1ba32fbe201bd40917bc66f",
286
+ "spec/v2/facets/limits.schema.json": "e68327665def83007f2573b413757caa602e82ad347d1b85e9853fea153ffb48",
298
287
  "spec/v2/facets/mcp.schema.json": "7060657dfcff170f079beed160e3db7c1d3cc4410cd3cf64863baf6459f781cd",
299
288
  "spec/v2/facets/nondeterminismPolicy.schema.json": "e9dfaa32e0778a1a837fdad3b8a0673fccda9579ab08c8bfe9777362dd15e989",
300
289
  "spec/v2/facets/oauth.schema.json": "3a0cbe249d3bd5a5982349ae7ba2534776cc958e4a57e0fbeabf2bdab6e99e69",
@@ -302,25 +291,23 @@
302
291
  "spec/v2/facets/replay.schema.json": "0a5aefb0108c708c6794fadd533cf256709704c4f16dbf44cd63fa8980c78018",
303
292
  "spec/v2/facets/runList.schema.json": "6223e1baaebbb9f4faa71bfe968f8d22b4aa88046d0e43e8d5f56409e7f86e90",
304
293
  "spec/v2/facets/sandbox.schema.json": "e75f54486d387b2d089791aa93b5093cd1450f1920753a0f97fc23acdfe978ed",
305
- "spec/v2/facets/schemaVersions.schema.json": "890d3416c4b66511d51f329abc68e6f467f4338f16807e489fe682999b2b56b9",
306
- "spec/v2/facets/supportedEnvelopes.schema.json": "644f22cc2236e30a611b5b7f1ba0458ff1925d68b94c514d9672583224e126bd",
307
294
  "spec/v2/facets/uiPlugins.schema.json": "1fd3f8440cfb6e4422553a7c4b5f091eb3e10a40da0d43e8b977a18929116758",
308
295
  "spec/v2/facets/webhooks.schema.json": "54b576f1d150e28e1642693d846ce471c118e9c521bdf3924185305fbd1d0de4",
309
296
  "spec/v2/facets/workflowChainPacks.schema.json": "ea625ce818fbeb746478f00f31f96ee9613d538e4409c258c1bfb517acdeaba9",
310
- "spec/v2/generated/error-codes.md": "a184067ea983f7398001b7461732767e0773d7c8a820fc769efa7e4e858cc943",
297
+ "spec/v2/generated/error-codes.md": "430113c79553b05a999d443587a1bc4d5e9db2e14afe1334e293279baf628479",
311
298
  "spec/v2/harness-trust-anchors.json": "6007b92eae16a070fbc3777424efb0abfe865fda89d096963109b96282b91205",
312
299
  "spec/v2/harness-trust-anchors.schema.json": "372b5d92337c893d3449eff3f6bfd009ac09fdac285296d8bdbe0a08fff9e34c",
313
- "spec/v2/id-field-bindings.json": "a7f5d03f5684c02d5792cc52bb1d310c123840e338a499aec4e9b82faf4d3708",
300
+ "spec/v2/id-field-bindings.json": "3ecb4fa9ca92bed6727db6efbab3903b8119c053649499da6556a853e4180e5d",
314
301
  "spec/v2/interop-map.json": "02255dafe7eb55f61ca7f9ae7c21f079d1848a6756991343088975ac9d184b8d",
315
302
  "spec/v2/interop-map.schema.json": "0017c882df34ee215e2e0729de051490e09d43aac3d2c949285698ed51832f12",
316
303
  "spec/v2/migrations.json": "651954938a1e154c0b6f1e3dd6e105889d30de3bb65789f21de7f77a12869e9e",
317
304
  "spec/v2/migrations.schema.json": "b91ade6320ad1b1185c9495b9424f3aa63438ed8e412c45171c227d82c0afd86",
318
305
  "spec/v2/path-manifest.json": "20f598f56df460ad3ed50aba3d6bc2933ea16a3c96ce125da1c5dd6989d4155c",
319
- "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
306
+ "spec/v2/peer-dependency-aliases.json": "cbf62f551f9295b0ac7ba6cc0466abb153563354a57b0622f3ec6e6689cba47e",
320
307
  "spec/v2/profiles.json": "b382b261c7844798575f7c1b37c934f0da19846016a2337d883d4f5ef6e05479",
321
- "spec/v2/release.json": "28c53661beb7a649be7c474d495832d8920cdae8d1c17f9022fa14f11421d61b",
308
+ "spec/v2/release.json": "713b33eb4de710eff421b7fcce5da7804f3bfd21a732a6413078975708340a74",
322
309
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
323
- "spec/v2/surface-baseline.json": "9b2275c5649b410381590509f1a60b827f8d1915a429e05c0318e1f473851829"
310
+ "spec/v2/surface-baseline.json": "98c0c7a13e06c0631e01f8cb6e92a048c85d0cc2417506a362203ec097e6c281"
324
311
  },
325
- "corpusCommit": "cddc595c6fcea6ff052ff1cfa199293737e04d53"
312
+ "corpusCommit": "d5efdfe7a61729ca748f79833f144c572c7225dd"
326
313
  }
@@ -33,7 +33,7 @@ export const NODE_ID = 'callai-echo';
33
33
  const DOC_A = 'aiProviders.schema.json §callAccounting.attempts (RFC 0248 §A)';
34
34
  const DOC_B = 'aiProviders.schema.json §callAccounting.retryPolicy (RFC 0248 §B)';
35
35
 
36
- export interface ScriptEntry { readonly kind: 'invalid-json' | 'truncated' | 'valid'; readonly outputTokens?: number; readonly usage?: false; readonly structuredMode?: 'native' | 'prompt' }
36
+ export interface ScriptEntry { readonly kind: 'invalid-json' | 'truncated' | 'valid' | 'refusal'; readonly outputTokens?: number; readonly usage?: false; readonly structuredMode?: 'native' | 'prompt' }
37
37
  export interface Case { readonly request: Record<string, unknown>; readonly script: readonly ScriptEntry[] }
38
38
 
39
39
  const SCHEMA = { type: 'object', properties: { answer: { type: 'string' } }, required: ['answer'] };
@@ -51,6 +51,12 @@ export const CASES = {
51
51
  cap: { request: { prompt: 'conformance', responseSchema: SCHEMA, maxTokens: BUDGET, retry: { maxAttempts: 1 } }, script: [{ kind: 'invalid-json', outputTokens: 10 }, { kind: 'valid', outputTokens: 20 }] },
52
52
  /** §B.2: truncated, then a reply that fits only a grown budget. */
53
53
  growth: { request: { prompt: 'conformance', responseSchema: SCHEMA, maxTokens: BUDGET, retry: { growMaxTokens: false } }, script: [{ kind: 'truncated', outputTokens: BUDGET }, { kind: 'valid', outputTokens: 150 }] },
54
+ /** RFC 0255 §A (host-services.md §Structured output): truncated, then valid. */
55
+ truncation: { request: { prompt: 'conformance', responseSchema: SCHEMA, maxTokens: BUDGET }, script: [{ kind: 'truncated', outputTokens: BUDGET }, { kind: 'valid', outputTokens: 20 }] },
56
+ /** RFC 0255 §A: every reply violates the schema, so the repair budget runs out. */
57
+ exhaustion: { request: { prompt: 'conformance', responseSchema: SCHEMA, maxTokens: BUDGET, retry: { maxAttempts: 2 } }, script: [{ kind: 'invalid-json', outputTokens: 10 }] },
58
+ /** RFC 0255 §A: the provider refuses; a refusal is never retried. */
59
+ refusal: { request: { prompt: 'conformance', responseSchema: SCHEMA, maxTokens: BUDGET }, script: [{ kind: 'refusal' }, { kind: 'valid', outputTokens: 20 }] },
54
60
  /** §B.5: maxAttempts out of range. */
55
61
  malformed: { request: { prompt: 'conformance', maxTokens: BUDGET, retry: { maxAttempts: 0 } }, script: [{ kind: 'valid', outputTokens: 5 }] },
56
62
  } as const satisfies Record<string, Case>;
@@ -66,6 +72,10 @@ export interface CaseRun {
66
72
  readonly usage: readonly Record<string, unknown>[];
67
73
  readonly exhaustedTotal: number | undefined;
68
74
  readonly startedSeq: number | undefined;
75
+ /** Every event `type` of the run, in log order. */
76
+ readonly types: readonly string[];
77
+ /** `cap.breached` payload `kind`s, in log order. */
78
+ readonly capBreachedKinds: readonly unknown[];
69
79
  }
70
80
 
71
81
  export interface Finding { readonly ok: boolean; readonly doc: string; readonly message: string }
@@ -117,6 +127,8 @@ export async function observe(runId: string, status: string): Promise<CaseRun |
117
127
  usage: of('provider.usage'),
118
128
  exhaustedTotal: typeof exhausted?.['totalAttempts'] === 'number' ? exhausted['totalAttempts'] : undefined,
119
129
  startedSeq: typeof started?.['sequence'] === 'number' ? started['sequence'] : undefined,
130
+ types: mine.map((e) => String(e['type'])),
131
+ capBreachedKinds: of('cap.breached').map((p) => p['kind']),
120
132
  };
121
133
  }
122
134
 
@@ -1,13 +1,14 @@
1
1
  /**
2
2
  * The advertisement-shape witness at major 2. Wave 1: the claims-check AI
3
- * families `envelopes`, `limits` (the three envelope caps), `modelCapabilities`
4
- * and `aiProviders`. Wave 2: the record and facet shapes of `selfHostedRunner`,
3
+ * families `limits` (`clarificationRounds`), `modelCapabilities` and
4
+ * `aiProviders`, whose structured-output facets came from the `envelopes`
5
+ * family RFC 0255 deleted. Wave 2: the record and facet shapes of `selfHostedRunner`,
5
6
  * `credentials`, `authorization`, `providerUsage`, `subWorkflow`, `scheduling`,
6
- * `artifactTypes`, `aiEnvelope`, `deadLetter` and `portability`. Wave 3: the
7
+ * `artifactTypes`, `deadLetter` and `portability`. Wave 3: the
7
8
  * families no host serves at v2 — `dataResidency`, `multiPartyConversation`,
8
9
  * `nodePackRuntimes`, `uiPlugins`, `purposePropagation` and `agentRuntime` get
9
10
  * facet legs; `conversationTurnModelProvenance`, `channelPresence`,
10
- * `nondeterminismPolicy`, `promptLibrary` and `envelopeContracts` carry no facet
11
+ * `nondeterminismPolicy` and `promptLibrary` carry no facet
11
12
  * a host-binding v2 rule gives meaning to, so they get the record leg only.
12
13
  * Wave 4 (suite 2.46.3): the `multiAgent.executionModel` sub-blocks a version
13
14
  * level requires and the escalation kind it may name, and `auth.subjectLinkKey`
@@ -71,12 +72,12 @@ function onFamily(profile: MajorProfile, discovery: unknown, family: string, leg
71
72
 
72
73
  /** The record as a whole against its seat in the capabilities schema. Catches every v1 shape v2 retired (`supported`, `selfHosted[]`, the per-provider `authModes` map, …). */
73
74
  export type AdvertFamily =
74
- | 'envelopes' | 'modelCapabilities' | 'aiProviders'
75
+ | 'modelCapabilities' | 'aiProviders'
75
76
  | 'selfHostedRunner' | 'credentials' | 'authorization' | 'providerUsage' | 'subWorkflow'
76
- | 'scheduling' | 'artifactTypes' | 'aiEnvelope' | 'deadLetter' | 'portability'
77
+ | 'scheduling' | 'artifactTypes' | 'deadLetter' | 'portability'
77
78
  | 'dataResidency' | 'conversationTurnModelProvenance' | 'multiPartyConversation' | 'channelPresence'
78
79
  | 'nodePackRuntimes' | 'uiPlugins' | 'purposePropagation' | 'nondeterminismPolicy'
79
- | 'agentRuntime' | 'promptLibrary' | 'envelopeContracts'
80
+ | 'agentRuntime' | 'promptLibrary'
80
81
  | 'multiAgent' | 'auth' | 'agents';
81
82
 
82
83
  export function recordSchemaLeg(profile: MajorProfile, discovery: unknown, family: AdvertFamily, doc: string): AdvertOutcome {
@@ -84,86 +85,72 @@ export function recordSchemaLeg(profile: MajorProfile, discovery: unknown, famil
84
85
  }
85
86
 
86
87
  // ---------------------------------------------------------------------------
87
- // envelopes — spec/v2/core/events.md §`envelopes`
88
+ // aiProviders structured output — spec/v2/core/host-services.md §Structured output
88
89
  // ---------------------------------------------------------------------------
89
90
 
90
- const ENV_DOC = 'events.md §envelopes';
91
- const ENV = '/properties/envelopes/properties';
91
+ const SO_DOC = 'host-services.md §Structured output';
92
+ const SO = '/properties/aiProviders/properties';
92
93
 
93
- /** `envelopes.reasoning`: an object whose `promptDirective` is one of three values; no `supported` seat at v2. */
94
- export const envelopesReasoningLeg = (p: MajorProfile, d: unknown): AdvertOutcome => onFamily(p, d, 'envelopes', (rec) => {
94
+ /** `aiProviders.reasoning`: an object whose `promptDirective` is one of three values. */
95
+ export const structuredOutputReasoningLeg = (p: MajorProfile, d: unknown): AdvertOutcome => onFamily(p, d, 'aiProviders', (rec) => {
95
96
  const r = rec['reasoning'];
96
- if (r === undefined) return inapplicable('the host does not advertise envelopes.reasoning (optional)');
97
- const out = [bySchema(`${ENV}/reasoning`, r, ENV_DOC, 'envelopes.reasoning')];
97
+ if (r === undefined) return inapplicable('the host does not advertise aiProviders.reasoning (optional)');
98
+ const out = [bySchema(`${SO}/reasoning`, r, SO_DOC, 'aiProviders.reasoning')];
98
99
  if (isRecord(r) && r['promptDirective'] !== undefined) {
99
- out.push({ ok: ['mandatory', 'advisory', 'off'].includes(String(r['promptDirective'])), doc: ENV_DOC, message: `envelopes.reasoning.promptDirective MUST be mandatory, advisory or off (got ${JSON.stringify(r['promptDirective'])})` });
100
+ out.push({ ok: ['mandatory', 'advisory', 'off'].includes(String(r['promptDirective'])), doc: SO_DOC, message: `aiProviders.reasoning.promptDirective MUST be mandatory, advisory or off (got ${JSON.stringify(r['promptDirective'])})` });
100
101
  }
101
102
  return observed(out);
102
103
  });
103
104
 
104
- /** `envelopes.tierOneSubsetCompliance`: one of strict, warn, off. */
105
- export const envelopesTierOneLeg = (p: MajorProfile, d: unknown): AdvertOutcome => onFamily(p, d, 'envelopes', (rec) => {
105
+ /** `aiProviders.tierOneSubsetCompliance`: one of strict, warn, off. */
106
+ export const structuredOutputTierOneLeg = (p: MajorProfile, d: unknown): AdvertOutcome => onFamily(p, d, 'aiProviders', (rec) => {
106
107
  const v = rec['tierOneSubsetCompliance'];
107
- if (v === undefined) return inapplicable('the host does not advertise envelopes.tierOneSubsetCompliance (optional)');
108
- return observed([bySchema(`${ENV}/tierOneSubsetCompliance`, v, ENV_DOC, 'envelopes.tierOneSubsetCompliance')]);
108
+ if (v === undefined) return inapplicable('the host does not advertise aiProviders.tierOneSubsetCompliance (optional)');
109
+ return observed([bySchema(`${SO}/tierOneSubsetCompliance`, v, SO_DOC, 'aiProviders.tierOneSubsetCompliance')]);
109
110
  });
110
111
 
111
- /** The six reliability events by their v2 names, and the four v1 dotted names v2 accepts as aliases until 3.0 (RFC 0228 §G). */
112
+ /** The six reliability events, by their v2 names. */
112
113
  export const RELIABILITY_EVENTS = ['envelope.retry-attempted', 'envelope.retry-exhausted', 'envelope.refusal', 'envelope.truncated', 'envelope.nl-to-format-engaged', 'envelope.recovery-applied'] as const;
113
- export const RELIABILITY_ALIASES: Readonly<Record<string, string>> = {
114
- 'envelope.retry.attempted': 'envelope.retry-attempted',
115
- 'envelope.retry.exhausted': 'envelope.retry-exhausted',
116
- 'envelope.nlToFormat.engaged': 'envelope.nl-to-format-engaged',
117
- 'envelope.recovery.applied': 'envelope.recovery-applied',
118
- };
119
- /** A listed reliability event by its v2 name: an alias folds to its hyphenated equivalent; anything else is returned unchanged. */
120
- export const canonicalReliabilityEvent = (e: string): string => RELIABILITY_ALIASES[e] ?? e;
121
114
 
122
- /**
123
- * `envelopes.reliability`: `events[]` names only reliability events (v2 name
124
- * or v1 alias), and — after folding aliases — includes the two MUST-tier ones;
125
- * `maxRetryAttempts` is an integer in [1, 16].
126
- */
127
- export const envelopesReliabilityLeg = (p: MajorProfile, d: unknown): AdvertOutcome => onFamily(p, d, 'envelopes', (rec) => {
115
+ /** `aiProviders.reliability`: `events[]` names only reliability events and includes the two MUST-tier ones. */
116
+ export const structuredOutputReliabilityLeg = (p: MajorProfile, d: unknown): AdvertOutcome => onFamily(p, d, 'aiProviders', (rec) => {
128
117
  const r = rec['reliability'];
129
- if (r === undefined) return inapplicable('the host does not advertise envelopes.reliability (optional)');
130
- const out = [bySchema(`${ENV}/reliability`, r, ENV_DOC, 'envelopes.reliability')];
118
+ if (r === undefined) return inapplicable('the host does not advertise aiProviders.reliability (optional)');
119
+ const out = [bySchema(`${SO}/reliability`, r, SO_DOC, 'aiProviders.reliability')];
131
120
  const events = isRecord(r) ? r['events'] : undefined;
132
121
  if (!Array.isArray(events)) {
133
- out.push({ ok: false, doc: ENV_DOC, message: `a host advertising envelopes.reliability MUST list the events it emits in reliability.events[] (got ${JSON.stringify(events)})` });
122
+ out.push({ ok: false, doc: SO_DOC, message: `a host advertising aiProviders.reliability MUST list the events it emits in reliability.events[] (got ${JSON.stringify(events)})` });
134
123
  return observed(out);
135
124
  }
136
- const canonical = new Set(events.filter((e): e is string => typeof e === 'string').map(canonicalReliabilityEvent));
137
125
  for (const e of events) {
138
- const name = typeof e === 'string' ? canonicalReliabilityEvent(e) : undefined;
139
- out.push({ ok: name !== undefined && (RELIABILITY_EVENTS as readonly string[]).includes(name), doc: ENV_DOC, message: `reliability.events[] MUST name only reliability events, by v2 name or v1 alias (got ${JSON.stringify(e)})` });
126
+ out.push({ ok: typeof e === 'string' && (RELIABILITY_EVENTS as readonly string[]).includes(e), doc: SO_DOC, message: `reliability.events[] MUST name only reliability events (got ${JSON.stringify(e)})` });
140
127
  }
141
128
  for (const must of ['envelope.retry-exhausted', 'envelope.refusal']) {
142
- out.push({ ok: canonical.has(must), doc: ENV_DOC, message: `a host advertising envelopes.reliability MUST emit and list ${must} (aliases folded; listed: ${JSON.stringify(events)})` });
129
+ out.push({ ok: events.includes(must), doc: SO_DOC, message: `a host advertising aiProviders.reliability MUST emit and list ${must} (listed: ${JSON.stringify(events)})` });
143
130
  }
144
131
  return observed(out);
145
132
  });
146
133
 
147
- /** `envelopes.reliability.completion`: `distinguishesTruncation` is a boolean; `truncationBudgetMultiplier` a number in [1, 8]. */
148
- export const envelopesCompletionLeg = (p: MajorProfile, d: unknown): AdvertOutcome => onFamily(p, d, 'envelopes', (rec) => {
134
+ /** `aiProviders.reliability.completion`: `distinguishesTruncation` is a boolean; `truncationBudgetMultiplier` a number in [1, 8]. */
135
+ export const structuredOutputCompletionLeg = (p: MajorProfile, d: unknown): AdvertOutcome => onFamily(p, d, 'aiProviders', (rec) => {
149
136
  const r = rec['reliability'];
150
137
  const c = isRecord(r) ? r['completion'] : undefined;
151
- if (c === undefined) return inapplicable('the host does not advertise envelopes.reliability.completion (optional)');
152
- const out = [bySchema(`${ENV}/reliability/properties/completion`, c, ENV_DOC, 'envelopes.reliability.completion')];
138
+ if (c === undefined) return inapplicable('the host does not advertise aiProviders.reliability.completion (optional)');
139
+ const out = [bySchema(`${SO}/reliability/properties/completion`, c, SO_DOC, 'aiProviders.reliability.completion')];
153
140
  const dt = isRecord(c) ? c['distinguishesTruncation'] : undefined;
154
- out.push({ ok: typeof dt === 'boolean', doc: ENV_DOC, message: `reliability.completion.distinguishesTruncation MUST be a boolean (got ${JSON.stringify(dt)})` });
141
+ out.push({ ok: typeof dt === 'boolean', doc: SO_DOC, message: `reliability.completion.distinguishesTruncation MUST be a boolean (got ${JSON.stringify(dt)})` });
155
142
  return observed(out);
156
143
  });
157
144
 
158
145
  // ---------------------------------------------------------------------------
159
- // limits — spec/v2/core/runs.md §Limits: the three envelope caps
146
+ // limits — spec/v2/core/runs.md §Limits: the cap every record carries
160
147
  // ---------------------------------------------------------------------------
161
148
 
162
- export const ENVELOPE_CAPS = ['clarificationRounds', 'schemaRounds', 'envelopesPerTurn'] as const;
163
- export type EnvelopeCap = (typeof ENVELOPE_CAPS)[number];
149
+ export const ALWAYS_CARRIED_CAPS = ['clarificationRounds'] as const;
150
+ export type AlwaysCarriedCap = (typeof ALWAYS_CARRIED_CAPS)[number];
164
151
 
165
152
  /** `limits.<cap>`: present (runs.md: "`limits` always carries" it) and a non-negative integer. */
166
- export const limitsCapLeg = (p: MajorProfile, d: unknown, cap: EnvelopeCap): AdvertOutcome => onFamily(p, d, 'limits', (rec) => {
153
+ export const limitsCapLeg = (p: MajorProfile, d: unknown, cap: AlwaysCarriedCap): AdvertOutcome => onFamily(p, d, 'limits', (rec) => {
167
154
  const v = rec[cap];
168
155
  const doc = 'runs.md §Limits';
169
156
  if (v === undefined) return observed([{ ok: false, doc, message: `limits MUST always carry ${cap} (absent)` }]);
@@ -87,13 +87,21 @@ async function isStreamTextMockAdvertised(): Promise<boolean> {
87
87
  return Array.isArray(testing?.mockProviders) && testing.mockProviders.includes('stream-text');
88
88
  }
89
89
 
90
- /** Why the gate below holds, as RFC 0148 §A names it (openwop#1686: a describe-level skip recorded no disposition). */
91
- const GATE_WHY: readonly [SoftSkipKind, string] =
92
- (!isFixtureAdvertised(FIXTURE_ID)) ? ['blocked', `the \`${FIXTURE_ID}\` fixture is not advertised`] as const : ['blocked', 'the gate held for no named reason'] as const;
90
+ /**
91
+ * Why the fixture gate holds, as RFC 0148 §A names it (openwop#1686: a
92
+ * describe-level skip recorded no disposition). The mock is what makes the
93
+ * fixture runnable, so a host serving the mock without the fixture is blocked;
94
+ * a host serving neither has nothing to stream through and is inapplicable.
95
+ */
96
+ async function gateWhy(): Promise<readonly [SoftSkipKind, string]> {
97
+ return (await isStreamTextMockAdvertised())
98
+ ? ['blocked', `the stream-text mock provider is advertised but the \`${FIXTURE_ID}\` fixture is not`] as const
99
+ : ['inapplicable', `neither the \`${FIXTURE_ID}\` fixture nor the stream-text mock provider is advertised`] as const;
100
+ }
93
101
 
94
102
  describe('stream-text-fixture: messages-mode fold through the stream-text mock (F1)', () => {
95
103
  it('delivers the mocked tokens in order, terminates with isLast + meta, and server-closes', async () => {
96
- if (SKIP_NO_FIXTURE) return softSkip(...GATE_WHY);
104
+ if (SKIP_NO_FIXTURE) return softSkip(...(await gateWhy()));
97
105
  if (!(await isStreamTextMockAdvertised())) {
98
106
  // eslint-disable-next-line no-console
99
107
  console.warn(
@@ -196,7 +204,7 @@ describe('stream-text-fixture: messages-mode fold through the stream-text mock (
196
204
  });
197
205
 
198
206
  it('an unknown mockProvider.id is rejected with 400 unsupported_mock_provider', async () => {
199
- if (SKIP_NO_FIXTURE) return softSkip(...GATE_WHY);
207
+ if (SKIP_NO_FIXTURE) return softSkip(...(await gateWhy()));
200
208
  if (!(await isStreamTextMockAdvertised())) {
201
209
  // eslint-disable-next-line no-console
202
210
  console.warn('[stream-text-fixture] stream-text mock not advertised; skipping negative leg');