@openwop/spec-artifacts 2.45.4 → 2.45.6

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.4",
5
- "corpusTag": "v2.45.4",
4
+ "version": "2.45.6",
5
+ "corpusTag": "v2.45.6",
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": "ad37a5a5c732ad46100fc03c3f4243fdd4f2976e330f02a8791b6b5b10a8a0c1",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "e4a8e19b494d12c0d105ed8d1d27337995564a6443cb8a747521a9d67977b52b",
13
- "api/v2/asyncapi.yaml": "d53ca2c06a47282a0cc39d9e0b6b488068da0ad2c91c3166598b005dcf72aa21",
14
- "api/v2/openapi.yaml": "24bce91f02de6527121f12ab23916c4f96bab2cbf8f2203208c1d3a444c632c5",
12
+ "api/seams-v2.yaml": "41ce056ad21053d69a824b28d94ac798cc3ed68aa5117f853ae5aaa017648fc6",
13
+ "api/v2/asyncapi.yaml": "34b82d051f6d1fa20a2abc5a39b822730e22c2eaade1eee1e0975dfe07ff998c",
14
+ "api/v2/openapi.yaml": "2a59f358e951a33b89bea3a7e4c996ca5f30d96ce1438ee99787b31f54f13f1e",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -31,7 +31,7 @@
31
31
  "schemas/artifact-type-pack-manifest.schema.json": "60342fcb15eb7f3ab46271f0641409a30d3a4a8f318b1020c53070886b191252",
32
32
  "schemas/audit-verify-result.schema.json": "0d3a3088ac1c32f9df66d346c33d7adbd8037940dba040e14ea847565a1a14bd",
33
33
  "schemas/budget-policy.schema.json": "3d4fe30ae129fe136ab9ece395f2a2a42a76360786b1b9a1d5f1cbc753eb5b39",
34
- "schemas/capabilities.schema.json": "d1d491248930e9b50ac6aca93a33cb1155eb997c4fbb2af0a940e8e889c76807",
34
+ "schemas/capabilities.schema.json": "a7e5910bf10e6d8238e909fee5b81e405846f91688cccf1bb0d13fb081336a33",
35
35
  "schemas/certification-bundle-v2.schema.json": "2f85530dd04824a15810c94e96869362dee1e78396eca21fdd18e5501416bb7d",
36
36
  "schemas/channel-presence-payload.schema.json": "f9d0ef4219814c2b765baf3e68cbe5eea2cb42379f516a93a0459dcd5f7db47e",
37
37
  "schemas/channel-written-payload.schema.json": "54723a56bc5a35232f64544ca686ac1ac959a5fb05b32b2401facca6b3ef51a3",
@@ -116,7 +116,7 @@
116
116
  "schemas/v2/artifact.schema.json": "85b9dc284d39b99d2a66fa8cbf47f2dd3d8526d3bd6cc411ad315b372de38975",
117
117
  "schemas/v2/audit-verify-result.schema.json": "14af8e9283510f0a40e48a2059c929ee44e0fc9fa3cc66a95bfbe90b17c48297",
118
118
  "schemas/v2/budget-policy.schema.json": "1de68095db0beb5c7a4be629de26e79f62ebbe748a88d46f36e768edfd1f0d68",
119
- "schemas/v2/capabilities.schema.json": "3792aa9d292229cf9b82c7306600a5dfdb63b3274523e0ed5dd4f952a04cb833",
119
+ "schemas/v2/capabilities.schema.json": "8d151a098a3cf7285fcadec8c1f192bed963ed6da3146e62d25155eb18afba9a",
120
120
  "schemas/v2/certification-bundle.schema.json": "82ce31a1ed6c7e21b0ba88ff62a7b8b768fc3b176b1d06fce023203830b94725",
121
121
  "schemas/v2/channel-presence-payload.schema.json": "4eeb224910e6f7eee3ab5e7c3899559c25c83a26d0022e0ad195c4672611977a",
122
122
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
@@ -204,13 +204,13 @@
204
204
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
205
205
  "spec/v1/alias-detectors.json": "0b2f28808ffe0b9d98a187775038c3406bb70919747a788a6e4f866e293ae6d3",
206
206
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
207
- "spec/v1/core-standard-manifest.json": "aa1ecb9c1f1c1c3039f948b137e4672031fad29103bb9ac4166eb4ff89b7c85e",
207
+ "spec/v1/core-standard-manifest.json": "535fef79758a01575c5f49db8690f0b4fe4ebb713564739b974818d6b9b0949b",
208
208
  "spec/v1/deprecations.json": "a3293072ea951857395d05f0437264e88965f1e9019ff61c55bacfa9c1aaa17c",
209
209
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
210
210
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
211
211
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
212
212
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
213
- "spec/v1/gaps.json": "2705bd6f7be31392ba09da318e99d55905dd08aa80e76e1226cf8f1a85132d18",
213
+ "spec/v1/gaps.json": "10c8f4c5bcf312b543dc4139eff23948cb01f6bfaa309b523719ef779e7bec89",
214
214
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
215
215
  "spec/v1/migrations.json": "4c50760be70cb644d02427bcaf5749606700edf4513f423903cf3b1d12f5c300",
216
216
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -240,7 +240,7 @@
240
240
  "spec/v2/core/persistence.md": "249a1de353f421cdf92b9006a13a10afdb002f4029eb6a13520cc95252edb2ec",
241
241
  "spec/v2/core/portability.md": "ab13a6ca43544b9a6a91edfb377ec680c768d14be841c84fb79125b231426891",
242
242
  "spec/v2/core/replay.md": "4a8b53325e18aa53400ece81168c76b4402b932e5e304a391754f293b126eabf",
243
- "spec/v2/core/runs.md": "991757ded9b3645bafad2344f4ccb75c7d79993bd80269f9dd3489193841d71b",
243
+ "spec/v2/core/runs.md": "bee5da861b31a583257f3d6020fbd245c36ba5ec40340d54ae6741f0c6f50ede",
244
244
  "spec/v2/core/security-defaults.md": "887d8c4bc592094e3b931c23f1c2175c18ebbd47528b074016f9d2091bc513b2",
245
245
  "spec/v2/core/storage.md": "dc94b985847c1341c7a064f04a6010f0fdbe6c3ab3e555d4362878c81d764c18",
246
246
  "spec/v2/core/tool-catalog.md": "d16a9004418719c48301804aefa4d7ab6f41112a4ed83727f552aa1b92b418b0",
@@ -249,7 +249,7 @@
249
249
  "spec/v2/core/workflow-chain-packs.md": "fdce7a8477e269950a2bac05ee6eddbd66eb0b670b464d00054f7196ec05d29c",
250
250
  "spec/v2/corrections.json": "3a8d93e33865b692d26a3b6bfd3819766e206b2e0c2a69669baa4bf833d05a49",
251
251
  "spec/v2/corrections.schema.json": "46bbffb954d13bd9995aebc912ceeb2544f7064331abf25fd6ab85c81a5cec94",
252
- "spec/v2/declaration.json": "967f6db929fd7c4000d41a12d8b6d9f77bad90348de0dbc792b02f33e7026385",
252
+ "spec/v2/declaration.json": "45ca70a0d74fdade13192565cb3b35e446ffab537f2caaf23da73a4050b3c6ac",
253
253
  "spec/v2/declaration.schema.json": "ef951633e4070899f64828f5cf1b5f4870270a0360f81dbb49b5b4d6cd407550",
254
254
  "spec/v2/errors.json": "83f048b0a06952b4af6f125fb66c4212acab51056b411390f1010acd6ab9cdc0",
255
255
  "spec/v2/errors.schema.json": "47404ad53e6147cf9017b813483712466573e419fb33e6c4b6c12d3e7deba1bc",
@@ -303,9 +303,9 @@
303
303
  "spec/v2/path-manifest.json": "27c2307b84376b2f22bea4e2213fc7e33ef3bf8fd1d18039f7955edb00dc9c9a",
304
304
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
305
305
  "spec/v2/profiles.json": "180beb9ef2d161766fa23b2987e7e829851e3d316273147cf6a4a3f324befd6b",
306
- "spec/v2/release.json": "d1b495b89fc43030e607d7dc312732500f0433e84656ccc88ad8c80c2ac444b1",
306
+ "spec/v2/release.json": "345ed102cf6fee40e78a5deea9d9d8512e8b03a3fea18887e93487e0faf5f9ab",
307
307
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
308
- "spec/v2/surface-baseline.json": "9e17340cea86146899703c91246ddd5a5403c68e40e749f0ad1958801f60b619"
308
+ "spec/v2/surface-baseline.json": "61c1628690fa95d4ab4b6c746b62d3a021c6485d4e2a2cdcca283489e31c03d9"
309
309
  },
310
- "corpusCommit": "5a4ad1ab0a3584c7ea30f4b32f4599e53ce1f75a"
310
+ "corpusCommit": "ef7ea3078b23d6d488c6c131a305d339eb287afc"
311
311
  }
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.4
4
+ version: 2.45.6
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.4
4
+ version: 2.45.6
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.4
4
+ version: 2.45.6
5
5
  summary: REST surface for declaring, executing, suspending, resuming, and observing multi-step workflows.
6
6
  description: 'The OpenWOP v2 REST API. Paths are unversioned and served at the bare origin; a client selects a version with
7
7
  the `OpenWOP-Version` header from the host''s `protocolVersions[]`. Conformance seams and test-mode operations are not
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.45.4",
3
+ "version": "2.45.6",
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": {
@@ -3026,6 +3026,22 @@
3026
3026
  ],
3027
3027
  "description": "`hard`: exhaustion emits `cap.breached` + stops the run. `advisory`: emits the events but MUST NOT stop the run (honest advertisement of observe-only)."
3028
3028
  },
3029
+ "onExhaustion": {
3030
+ "type": "array",
3031
+ "minItems": 1,
3032
+ "uniqueItems": true,
3033
+ "items": {
3034
+ "type": "string",
3035
+ "enum": [
3036
+ "fail",
3037
+ "interrupt"
3038
+ ]
3039
+ },
3040
+ "contains": {
3041
+ "const": "fail"
3042
+ },
3043
+ "description": "RFC 0231. The `BudgetPolicy.onExhaustion` values the host serves under `enforce: \"hard\"`. Exact when present. Absent: both. A value not listed is refused `422 capability_not_provided` at create, never applied as another behaviour and never ignored. A consumer ignores it under `enforce: \"advisory\"`."
3044
+ },
3029
3045
  "scopes": {
3030
3046
  "type": "array",
3031
3047
  "uniqueItems": true,
@@ -5812,6 +5812,22 @@
5812
5812
  ],
5813
5813
  "description": "`hard`: exhaustion emits `cap.breached` + stops the run. `advisory`: emits the events but MUST NOT stop the run (honest advertisement of observe-only)."
5814
5814
  },
5815
+ "onExhaustion": {
5816
+ "type": "array",
5817
+ "minItems": 1,
5818
+ "uniqueItems": true,
5819
+ "items": {
5820
+ "type": "string",
5821
+ "enum": [
5822
+ "fail",
5823
+ "interrupt"
5824
+ ]
5825
+ },
5826
+ "contains": {
5827
+ "const": "fail"
5828
+ },
5829
+ "description": "RFC 0231. The `BudgetPolicy.onExhaustion` values the host serves under `enforce: \"hard\"`. Exact when present. Absent: both. A value not listed is refused `422 capability_not_provided` at create, never applied as another behaviour and never ignored. A consumer ignores it under `enforce: \"advisory\"`."
5830
+ },
5815
5831
  "scopes": {
5816
5832
  "type": "array",
5817
5833
  "uniqueItems": true,
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.45.4"
7
+ "version": "2.45.6"
8
8
  },
9
9
  "note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
10
10
  },
@@ -421,5 +421,5 @@
421
421
  "$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
422
422
  }
423
423
  ],
424
- "digest": "8bd88246652b23d111a00442d9bb4f3dcf3b0b40f5ec1a27094fa1444e41c591"
424
+ "digest": "9d5c679125aa4b8458d3a43dcfa6a4b9c3a1ee8cf46ba3d08e1bce8c7facc2da"
425
425
  }
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-01",
4
+ "updated": "2026-10-02",
5
5
  "witnessClasses": [
6
6
  "witnessable-unaided",
7
7
  "witnessable-gated",
@@ -13569,8 +13569,8 @@
13569
13569
  "surface": "The v2 reference host emits `example.mcp_unreachable` (`mcp-client.ts:67`, `:73`) and `example.http_fetch_failed` (`executor.ts:264`), vendor codes chosen only because no row existed.",
13570
13570
  "witness": "unclassified",
13571
13571
  "requirementId": null,
13572
- "disposition": "externally-gated",
13573
- "target": "v2-reference-recut",
13572
+ "disposition": "closed",
13573
+ "target": null,
13574
13574
  "sources": [
13575
13575
  {
13576
13576
  "file": "RFCS/registers/0228-v1-host-service-error-codes.gaps.md",
@@ -13799,6 +13799,125 @@
13799
13799
  }
13800
13800
  ]
13801
13801
  },
13802
+ {
13803
+ "id": "openwop.gap.0231.1",
13804
+ "rfc": "0231",
13805
+ "local": "G1",
13806
+ "section": "§B.2",
13807
+ "surface": "What an absent facet means: \"both, as today\" (proposed, additive) or \"`fail` only\" (matches every host measured, and is a correction).",
13808
+ "witness": "unclassified",
13809
+ "requirementId": null,
13810
+ "disposition": "closed",
13811
+ "target": null,
13812
+ "sources": [
13813
+ {
13814
+ "file": "RFCS/registers/0231-budget-exhaustion-facet.gaps.md",
13815
+ "token": "G1"
13816
+ }
13817
+ ]
13818
+ },
13819
+ {
13820
+ "id": "openwop.gap.0231.2",
13821
+ "rfc": "0231",
13822
+ "local": "G2",
13823
+ "section": "§B.1, §F",
13824
+ "surface": "The `interrupt` path has no witness in either major. `runs.md` says the approval's `resumeValue` \"adds budget\" and gives no shape (RFC 0084, Unresolved question 5), so a suite cannot drive the resume.",
13825
+ "witness": "unclassified",
13826
+ "requirementId": null,
13827
+ "disposition": "carried",
13828
+ "target": "openwop.gap.0231.2",
13829
+ "sources": [
13830
+ {
13831
+ "file": "RFCS/registers/0231-budget-exhaustion-facet.gaps.md",
13832
+ "token": "G2"
13833
+ }
13834
+ ]
13835
+ },
13836
+ {
13837
+ "id": "openwop.gap.0231.3",
13838
+ "rfc": "0231",
13839
+ "local": "G3",
13840
+ "section": "§F",
13841
+ "surface": "No host advertises the facet, so the refusal row has no witness. The v2 reference host already refuses as §C requires.",
13842
+ "witness": "unclassified",
13843
+ "requirementId": null,
13844
+ "disposition": "externally-gated",
13845
+ "target": "host-advertises-exhaustion-facet",
13846
+ "sources": [
13847
+ {
13848
+ "file": "RFCS/registers/0231-budget-exhaustion-facet.gaps.md",
13849
+ "token": "G3"
13850
+ }
13851
+ ]
13852
+ },
13853
+ {
13854
+ "id": "openwop.gap.0231.4",
13855
+ "rfc": "0231",
13856
+ "local": "G4",
13857
+ "section": "§C.1",
13858
+ "surface": "Whether the refusal should carry `details.supported`. `capability_not_provided` has no registered details schema.",
13859
+ "witness": "unclassified",
13860
+ "requirementId": null,
13861
+ "disposition": "carried",
13862
+ "target": "openwop.gap.0231.4",
13863
+ "sources": [
13864
+ {
13865
+ "file": "RFCS/registers/0231-budget-exhaustion-facet.gaps.md",
13866
+ "token": "G4"
13867
+ }
13868
+ ]
13869
+ },
13870
+ {
13871
+ "id": "openwop.gap.0231.5",
13872
+ "rfc": "0231",
13873
+ "local": "G5",
13874
+ "section": "§D",
13875
+ "surface": "Whether v1 takes the facet. The seed schema is v1's, so by default both majors get it.",
13876
+ "witness": "unclassified",
13877
+ "requirementId": null,
13878
+ "disposition": "closed",
13879
+ "target": null,
13880
+ "sources": [
13881
+ {
13882
+ "file": "RFCS/registers/0231-budget-exhaustion-facet.gaps.md",
13883
+ "token": "G5"
13884
+ }
13885
+ ]
13886
+ },
13887
+ {
13888
+ "id": "openwop.gap.0231.6",
13889
+ "rfc": "0231",
13890
+ "local": "G6",
13891
+ "section": "Motivation",
13892
+ "surface": "MyndHyve's `interrupt` behaviour is reported from source by its session and was not measured.",
13893
+ "witness": "unclassified",
13894
+ "requirementId": null,
13895
+ "disposition": "externally-gated",
13896
+ "target": "myndhyve-host-cut",
13897
+ "sources": [
13898
+ {
13899
+ "file": "RFCS/registers/0231-budget-exhaustion-facet.gaps.md",
13900
+ "token": "G6"
13901
+ }
13902
+ ]
13903
+ },
13904
+ {
13905
+ "id": "openwop.gap.0231.7",
13906
+ "rfc": "0231",
13907
+ "local": "G7",
13908
+ "section": "§F",
13909
+ "surface": "The v1 rule has no witness: the suite's major-1 profile gives a run budget no `createRun` surface it drives, and the v1 budget scenario uses a host seam.",
13910
+ "witness": "unclassified",
13911
+ "requirementId": null,
13912
+ "disposition": "carried",
13913
+ "target": "openwop.gap.0231.7",
13914
+ "sources": [
13915
+ {
13916
+ "file": "RFCS/registers/0231-budget-exhaustion-facet.gaps.md",
13917
+ "token": "G7"
13918
+ }
13919
+ ]
13920
+ },
13802
13921
  {
13803
13922
  "id": "openwop.gap.spec.a2a-integration.g1",
13804
13923
  "rfc": "0152",
@@ -71,6 +71,7 @@ The `201` response is `{ runId, status, eventsUrl, statusUrl? }`. `status` is on
71
71
  - `mode: eval` makes `evalSuiteRef` and `agentId` REQUIRED. It starts an eval-suite projection that emits the content-free `eval.*` family and terminates with an `EvalSummary`. A host that does not advertise `agents.evalSuite` MUST reject it `422 capability_not_provided`.
72
72
  - A host advertising `dataResidency` MUST reject a `residency.region` outside `dataResidency.regions` with `422 residency_unavailable` and create no run (see §"Conversation and residency capabilities").
73
73
  - A workflow that references a capability-gated reserved node type on a host that does not advertise the capability MUST be rejected with `422 capability_required`.
74
+ - A host that lists `budget.onExhaustion` serves exactly those values. It MUST reject any other `budget.onExhaustion` with `422 capability_not_provided` and create no run. It MUST NOT apply a different behaviour or ignore the field.
74
75
 
75
76
  ### The start event
76
77
 
@@ -124,7 +125,7 @@ The `201` response is `{ runId, status, eventsUrl, statusUrl? }`. `status` is on
124
125
 
125
126
  - `budget.reserved` records the effective budget, and consumption is derived from `provider.usage`, `agent.toolCalled` and `node.retried`, never measured twice. A replay reuses both.
126
127
  - Under either `enforce` mode a host MUST emit `budget.reserved`, `budget.threshold-crossed` and `budget.exhausted`, and MAY coalesce `budget.consumed`.
127
- - `hard` exhaustion under `onExhaustion: fail` emits `cap.breached` (`kind: budget-*`) and fails the run `budget_exhausted`. Under `interrupt` it raises an approval whose `resumeValue` adds budget, recorded by a second `budget.reserved`. An `advisory` host MUST NOT stop the run.
128
+ - `hard` exhaustion under `onExhaustion: fail` emits `cap.breached` (`kind: budget-*`) and fails the run `budget_exhausted`. Under `interrupt`, where the host serves it, it raises an approval whose `resumeValue` adds budget, recorded by a second `budget.reserved`. An `advisory` host MUST NOT stop the run.
128
129
  - A resolved model outside `modelAllow`, or in `modelDeny` (which wins), is refused `budget_model_denied` before the call.
129
130
  - `dimensions` lists only what the host enforces and MAY omit `cost`. The `budget.*` events and `cap.breached` MUST NOT carry rate cards, unit prices, cost breakdowns, credentials or model prose (`budget-no-pricing-leak`); the aggregate cost is allowed.
130
131
 
@@ -297,4 +298,4 @@ Queue messages ([host-services.md](host-services.md) §`queueBus`) and webhook d
297
298
 
298
299
  A non-terminal run inherited from v1 continues, or is cancelled `v1_pin_unsupported`, per [persistence.md](persistence.md) §"Runs pinned to v1".
299
300
 
300
- *Sources: RFCs 0053, 0058, 0084, 0170, 0171, 0176, 0182, 0228, 0229.*
301
+ *Sources: RFCs 0053, 0058, 0084, 0170, 0171, 0176, 0182, 0228, 0229, 0231.*
@@ -1232,10 +1232,14 @@
1232
1232
  "facets": [
1233
1233
  "dimensions",
1234
1234
  "enforce",
1235
+ "onExhaustion",
1235
1236
  "scopes"
1236
1237
  ],
1237
1238
  "floorScenarios": [],
1238
- "requirementIds": [],
1239
+ "requirementIds": [
1240
+ "openwop.requirement.runs.budget-exhaustion-facet-contains-fail",
1241
+ "openwop.requirement.runs.budget-unserved-exhaustion-refused"
1242
+ ],
1239
1243
  "owningRfc": "0084"
1240
1244
  },
1241
1245
  {
@@ -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.4",
4
- "corpusTag": "v2.45.4",
5
- "updated": "2026-10-01"
3
+ "version": "2.45.6",
4
+ "corpusTag": "v2.45.6",
5
+ "updated": "2026-10-02"
6
6
  }
@@ -4,7 +4,7 @@
4
4
  "schemas/v2/**/*.json",
5
5
  "spec/v2/path-manifest.json"
6
6
  ],
7
- "release": "2.45.4",
7
+ "release": "2.45.6",
8
8
  "kinds": {
9
9
  "union": [
10
10
  "channel",
@@ -18,7 +18,7 @@
18
18
  "type"
19
19
  ]
20
20
  },
21
- "count": 8603,
21
+ "count": 8608,
22
22
  "surfaces": [
23
23
  "schemas/v2/a2a-task-state.schema.json#/contextId|type|string",
24
24
  "schemas/v2/a2a-task-state.schema.json#/interruptKind|enum-member|\"approval\"",
@@ -1441,6 +1441,10 @@
1441
1441
  "schemas/v2/capabilities.schema.json#/budget/enforce|enum-member|\"advisory\"",
1442
1442
  "schemas/v2/capabilities.schema.json#/budget/enforce|enum-member|\"hard\"",
1443
1443
  "schemas/v2/capabilities.schema.json#/budget/enforce|type|string",
1444
+ "schemas/v2/capabilities.schema.json#/budget/onExhaustion/[]|enum-member|\"fail\"",
1445
+ "schemas/v2/capabilities.schema.json#/budget/onExhaustion/[]|enum-member|\"interrupt\"",
1446
+ "schemas/v2/capabilities.schema.json#/budget/onExhaustion/[]|type|string",
1447
+ "schemas/v2/capabilities.schema.json#/budget/onExhaustion|type|array",
1444
1448
  "schemas/v2/capabilities.schema.json#/budget/scopes/[]|enum-member|\"agent\"",
1445
1449
  "schemas/v2/capabilities.schema.json#/budget/scopes/[]|enum-member|\"project\"",
1446
1450
  "schemas/v2/capabilities.schema.json#/budget/scopes/[]|enum-member|\"run\"",
@@ -1460,6 +1464,7 @@
1460
1464
  "schemas/v2/capabilities.schema.json#/budget|closed|true",
1461
1465
  "schemas/v2/capabilities.schema.json#/budget|property|dimensions",
1462
1466
  "schemas/v2/capabilities.schema.json#/budget|property|enforce",
1467
+ "schemas/v2/capabilities.schema.json#/budget|property|onExhaustion",
1463
1468
  "schemas/v2/capabilities.schema.json#/budget|property|scopes",
1464
1469
  "schemas/v2/capabilities.schema.json#/budget|property|since",
1465
1470
  "schemas/v2/capabilities.schema.json#/budget|property|status",