@openwop/spec-artifacts 2.18.0 → 2.20.0

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.18.0",
5
- "corpusTag": "v2.18.0",
4
+ "version": "2.20.0",
5
+ "corpusTag": "v2.20.0",
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": "39081c59fb696159806b0f2f9a42e7e9ff830d622fcf2ad4159b21357580a955",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "08f87bebac34e3084dc37fdb4b346fe7a1e06c3b414cf4352df7d8aea707ebe6",
13
- "api/v2/asyncapi.yaml": "325cd3a067f5c731028e1bf58083732c395a7da26849c526fcea16b7ecc5b21a",
14
- "api/v2/openapi.yaml": "f50c914acca3c9dc9578bee4199b3d21feafc7d2de7ebd9aedd2b861c3d70e09",
12
+ "api/seams-v2.yaml": "2132964437fde6f1d28d1fa9b8e1c37cab4e6a61c2630807c2df1d19313864fb",
13
+ "api/v2/asyncapi.yaml": "60b992b381d2b63dde4085664190979e77cfe6082f6c63d1149fa90e4b78cca9",
14
+ "api/v2/openapi.yaml": "22a4249b402fac7498de47f1b8615d68b6ee3090b10a8afcfbbccf8959fb0f68",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
@@ -116,7 +116,7 @@
116
116
  "schemas/v2/audit-verify-result.schema.json": "a748dfadb5155adfde8a91045e76b0db6695005fe559035d71670fdd55edb3ba",
117
117
  "schemas/v2/budget-policy.schema.json": "c7449daeb6e1d95e7a047b8c2814d3d54748697c27046972834874867d9b5f4c",
118
118
  "schemas/v2/capabilities.schema.json": "213c5cbe7ae7a337418c9183ed8ec39f1bc4dc39650a9b3c06cea9780dca3f24",
119
- "schemas/v2/certification-bundle.schema.json": "0bcf8f297266505ca39d30eea8100e3c0fb048f2651717fd746da8129fcb7920",
119
+ "schemas/v2/certification-bundle.schema.json": "9afcd16cf018d9b0d3b31e3b7e2e844d9289fe7b912a363d0df5a78e4fdfc054",
120
120
  "schemas/v2/channel-presence-payload.schema.json": "1c20ad810cb311d47aa0b95d928490826b2468fd161f884cd29e867053e6782f",
121
121
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
122
122
  "schemas/v2/chat-card-pack-manifest.schema.json": "8df0d9d273ae22efc6876d5586833f1d4c2e551edc3ac6cf6e8f0719329f03dd",
@@ -201,13 +201,13 @@
201
201
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
202
202
  "spec/v1/alias-detectors.json": "40069d5976eeb6ba1384a648e57e5cfd673db3fce36175115fb8293bee9664d4",
203
203
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
204
- "spec/v1/core-standard-manifest.json": "8b43e4919b13e88b1b86fd7e088f0b06edc65c40268329ccdc836c43e4f60493",
204
+ "spec/v1/core-standard-manifest.json": "7a9f26072759124fd30685994d120043eee7abb1501d507a9f11a26f558f9951",
205
205
  "spec/v1/deprecations.json": "307083ce29c23fd406015951f99a30d78d6187ff061d38dc9732f62191b40f3f",
206
206
  "spec/v1/deprecations.schema.json": "18c87e78bedc210431f795ae44c5b5d202f2f3317850d5cf86867d4f1fa1cdfb",
207
207
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
208
208
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
209
209
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
210
- "spec/v1/gaps.json": "ac54bdfcfdcbf96ddc5ae13c7e8e94a88f3c60c785be760d8a3d1fa902ef82ce",
210
+ "spec/v1/gaps.json": "348f3d5b93057f614b44ce24cc2f96f7675583dee4cea015943ba02d64f840ee",
211
211
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
212
212
  "spec/v1/migrations.json": "8839497d6a4830b53fa7867014a8336f0d725ef2346352e54fb580b7947897af",
213
213
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -230,11 +230,11 @@
230
230
  "spec/v2/core/persistence.md": "9e241f84259e38848f4a2ad1c21debb0dffd5f8aafbad26408aa6cc8969bf93b",
231
231
  "spec/v2/core/replay.md": "10cc01bf9e4e921fcfac740f3174b2e95cda7ba9a1e13e85cf371c8c2d0fa46a",
232
232
  "spec/v2/core/runs.md": "136319842bacbbb300178980e4b83444917d5b193cc5fdd92e39a4902ba8d3c0",
233
- "spec/v2/core/security-defaults.md": "5c32c0bf4b47975c1428361b225a066cd3966cb37b023ca70bc30152fcbec33b",
233
+ "spec/v2/core/security-defaults.md": "2a54ceaa4cef02c26ee0fbcf44f822ceeea79537c7d5a51ed300f21aa4fea576",
234
234
  "spec/v2/core/versioning.md": "27b88cde88f9060567ef7e46f4897b6be8892ade9f4a46c2ab16e314c515eabd",
235
235
  "spec/v2/core/webhooks.md": "46c1311c1897236f9bf9db5025c8af31dd84cd19208da3e5e9ff69eec9436965",
236
236
  "spec/v2/core/workflow-chain-packs.md": "df78b76dd79f2267fb6b72c08e0911e5f9d5bb1925c6efdd6deda62fe8a51dc8",
237
- "spec/v2/declaration.json": "49307ad6252cd2d21b78ddbbc910f55e8c1ee89a53d04686d28c32f53f6d778b",
237
+ "spec/v2/declaration.json": "6182a370811133d9033591fd357cf6973a9c4e5b01cf25988922d6c621db5d0d",
238
238
  "spec/v2/declaration.schema.json": "c86e3083fb9789c1958ecb4576cc6f71aa90e6f339521139238543ed08211dd4",
239
239
  "spec/v2/errors.json": "aac91b12f954cc90574d310070ae3c651b131055d4389d2c6155242763765195",
240
240
  "spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
@@ -274,8 +274,8 @@
274
274
  "spec/v2/path-manifest.json": "c123c9fd77dc1b3f9c2e9346ace80cdae007e6511138894956abda01e61ec1c6",
275
275
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
276
276
  "spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
277
- "spec/v2/release.json": "3fdc368bea04141d0b459f5a2ffa26bcf40ca3bfc37fa0488afd13b881abdd9d",
277
+ "spec/v2/release.json": "e8d93bad6d3acf1a9ba6b6ff121caeb73bef1371ab930f7adfa9fc29f35f67ef",
278
278
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
279
279
  },
280
- "corpusCommit": "bdad62b0dbb80f9e3f908ebab747b5413fff448d"
280
+ "corpusCommit": "766736268b7b82871bda8f4e27a358d6dcdf5888"
281
281
  }
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.18.0
4
+ version: 2.20.0
5
5
  description: 'GENERATED by scripts/derive-v2-api.py. RFC 0168 §C: the seams are a versioned conformance profile with their
6
6
  own document and path space (/conformance/seams/…), validated against the canonical v2 schemas with no tolerance path,
7
7
  forbidden from the capability namespace (a host advertises the profile, never a testSeams flag). This document carries
@@ -1,7 +1,7 @@
1
1
  asyncapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 event streams
4
- version: 2.18.0
4
+ version: 2.20.0
5
5
  description: GENERATED by scripts/derive-v2-api.py (RFC 0171 §E.1, RFC 0172 §C.2). One run-events channel whose address
6
6
  is the OpenAPI path key; the server pathname is empty (bare origin). streamMode is a pattern over the closed set and its
7
7
  comma-separated combinations (`values` never combines). hostEvents has a real address (RFC 0171 §E.1) — the documented
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 API
4
- version: 2.18.0
4
+ version: 2.20.0
5
5
  summary: REST surface for declaring, executing, suspending, resuming, and observing multi-step workflows.
6
6
  description: GENERATED by scripts/derive-v2-api.py from api/openapi.yaml and the RFC 0167 children (v2 charter Phase 3,
7
7
  P3-C). Bare origin, unversioned path keys, negotiation by `OpenWOP-Version` + `protocolVersions[]` (RFC 0172 §A). No seam
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.18.0",
3
+ "version": "2.20.0",
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": {
@@ -259,7 +259,7 @@
259
259
  "properties": {
260
260
  "id": {
261
261
  "type": "string",
262
- "pattern": "^openwop\\.(?!it\\.(?:artifact-schema-compile-bounded|artifact-type-legacy-ids|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|multi-region-effect-vocabulary|normative-example-extraction|openapi-asyncapi-sdk-parity|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-result-trust-monotone|v2-alias-covers-reword|v2-corpus-tag-pinned|v2-bundle-signature-attributable|v2-declaration-parity|v2-eos-clock|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-id-kinds-bound|v2-one-signing-scheme|v2-path-parity|v2-release-identity|v2-req-only-assertions|v2-retention-floors|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-threat-model-template|v2-umbrella-alias-covered|v2-umbrella-child-parts|v2-umbrella-codemod-at-active|v2-umbrella-codemod-legs|v2-umbrella-migration-deprecation|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
262
+ "pattern": "^openwop\\.(?!it\\.(?:artifact-schema-compile-bounded|artifact-type-legacy-ids|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|multi-region-effect-vocabulary|normative-example-extraction|openapi-asyncapi-sdk-parity|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-result-trust-monotone|v2-alias-covers-reword|v2-bundle-signature-attributable|v2-corpus-tag-pinned|v2-declaration-parity|v2-eos-clock|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-facet-advertisement|v2-id-kinds-bound|v2-normative-home-gate|v2-one-signing-scheme|v2-path-parity|v2-release-identity|v2-req-only-assertions|v2-retention-floors|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-threat-model-template|v2-umbrella-alias-covered|v2-umbrella-child-parts|v2-umbrella-codemod-at-active|v2-umbrella-codemod-legs|v2-umbrella-migration-deprecation|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
263
263
  "description": "RFC 0168 §A.1 — `openwop.<area>.<slug>`. The suite mints six areas: `requirement` (an explicit `req()` id), `it` (a per-test id from the scenario file and title), `scenario` and `floor` (per-file rows), `profile` (a claimed-profile row) and `family` (a capability gate). The lookahead refuses every id minted from a corpus-coherence file: those run in the spec repo’s CI and MUST NOT appear in a host bundle (conformance.md §\"Two products, two ledgers\"; RFC 0168 §D.1). `scripts/check-req-only.mjs` fails when the list drifts from `conformance/src/coherence/`."
264
264
  },
265
265
  "scenario": {
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.18.0"
7
+ "version": "2.20.0"
8
8
  },
9
9
  "note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
10
10
  },
@@ -419,5 +419,5 @@
419
419
  "$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
420
420
  }
421
421
  ],
422
- "digest": "7053aa6c04545aca2ef249cc984336284824182422e528083f6d744eb40d1975"
422
+ "digest": "7019097f2a52113af625c5ae7092147d238e402a93ba12e6f2d67bcc43f48e18"
423
423
  }
package/spec/v1/gaps.json CHANGED
@@ -10424,8 +10424,8 @@
10424
10424
  "surface": "G5 closed a PRECEDING dot but not a FOLLOWING one, and this register's own G5 row plus the gate's docblock CLAIMED otherwise — naming `i18n` ← \"see i18n.md\" as closed when it is not. The trailing boundary class excludes `-`, `_` and `/` but must leave `.` open for the `key.facet` arm, so `see i18n.md` still names `i18n` and `` `channelPresence.supported` `` still names `channelPresence`.",
10425
10425
  "witness": "unclassified",
10426
10426
  "requirementId": null,
10427
- "disposition": "carried",
10428
- "target": "openwop.gap.0189.8",
10427
+ "disposition": "transferred",
10428
+ "target": "scripts/check-v2-normative-home.mjs",
10429
10429
  "sources": [
10430
10430
  {
10431
10431
  "file": "RFCS/registers/0189-normative-home.gaps.md",
@@ -10450,6 +10450,23 @@
10450
10450
  }
10451
10451
  ]
10452
10452
  },
10453
+ {
10454
+ "id": "openwop.gap.0189.10",
10455
+ "rfc": "0189",
10456
+ "local": "G10",
10457
+ "section": "§B(c)",
10458
+ "surface": "G4 split table rows apart so a MUST in row 15 could not satisfy a family named in row 6 — correct, and it had a cost nobody measured. It also severed those rows from the SECTION HEADING that scopes them. `spec/v1/host-capabilities.md` carries `## §host.kvStorage`, `## §host.blobStorage`, `## §host.vectorStore` and five more, each a real contract with three to five MUSTs — every one a table row reading \"A `get` for tenant A MUST NOT return values written by tenant B\". The family's name is in the heading; the obligation is in the row; G4 put them in different units and the gate concluded the contract did not exist. SEVEN families were classified as needing a design decision about where a `ctx.*` host service lives in v2, when their contract was already written and merely unreadable to the predicate.",
10459
+ "witness": "unclassified",
10460
+ "requirementId": null,
10461
+ "disposition": "closed",
10462
+ "target": null,
10463
+ "sources": [
10464
+ {
10465
+ "file": "RFCS/registers/0189-normative-home.gaps.md",
10466
+ "token": "G10"
10467
+ }
10468
+ ]
10469
+ },
10453
10470
  {
10454
10471
  "id": "openwop.gap.0190.1",
10455
10472
  "rfc": "0190",
@@ -10458,8 +10475,8 @@
10458
10475
  "surface": "The per-family grant is **200 words** against a measured mean of **140.75** (four families, 563 words, five sections). That mean is drawn entirely from families with one or two facets. The remaining set includes `agents` (19 facets) and `aiProviders` (12), and a grounded model — ~110 base + ~20 per facet beyond the first — puts the remainder near 9,170 against 12,600 granted. If the real per-facet cost is higher than 20 words, the grant is too thin for the wide families even though the aggregate holds, and the self-funding property forces them to land LAST, when the cheap families have funded them.",
10459
10476
  "witness": "unclassified",
10460
10477
  "requirementId": null,
10461
- "disposition": "carried",
10462
- "target": "openwop.gap.0190.1",
10478
+ "disposition": "transferred",
10479
+ "target": "scripts/check-core-budget.mjs",
10463
10480
  "sources": [
10464
10481
  {
10465
10482
  "file": "RFCS/registers/0190-kernel-budget-denominator.gaps.md",
@@ -10492,8 +10509,8 @@
10492
10509
  "surface": "`spec/v2/ext/` is now a co-pointer that contributes facet coverage only. Nothing checks that an ext document cited as a co-pointer is *about* the family citing it — the same bare-token weakness as RFC 0189 G1, one directory over. The `authorization`-against-thirteen-READMEs case is closed for the OBLIGATION predicate but not for facet coverage: a facet name appearing incidentally in an unrelated ext page still counts as covered.",
10493
10510
  "witness": "unclassified",
10494
10511
  "requirementId": null,
10495
- "disposition": "carried",
10496
- "target": "openwop.gap.0190.3",
10512
+ "disposition": "transferred",
10513
+ "target": "scripts/check-core-budget.mjs",
10497
10514
  "sources": [
10498
10515
  {
10499
10516
  "file": "RFCS/registers/0190-kernel-budget-denominator.gaps.md",
@@ -10509,8 +10526,8 @@
10509
10526
  "surface": "A host has no way to advertise a facet NEGATIVELY — \"I know about this and do not offer it\". Presence-semantics makes omission the only spelling, which cannot distinguish *unsupported* from *not yet considered*. MyndHyve expresses exactly this today as `extensions.myndhyve.runs.pauseResume.supported = false`, fleeing to the vendor namespace because the core root cannot say it. That is a production host routing around a missing surface, which is evidence the gap is real rather than theoretical.",
10510
10527
  "witness": "unclassified",
10511
10528
  "requirementId": null,
10512
- "disposition": "carried",
10513
- "target": "openwop.gap.0192.1",
10529
+ "disposition": "transferred",
10530
+ "target": "schemas/v2/capabilities.schema.json",
10514
10531
  "sources": [
10515
10532
  {
10516
10533
  "file": "RFCS/registers/0192-facet-advertisement.gaps.md",
@@ -10526,8 +10543,8 @@
10526
10543
  "surface": "The rewrite table is keyed on the exact v1 sentence, so a reworded v1 seed silently stops matching and the ghost returns — caught by §C's gate, but as a new failure rather than as a diff on the table.",
10527
10544
  "witness": "unclassified",
10528
10545
  "requirementId": null,
10529
- "disposition": "carried",
10530
- "target": "openwop.gap.0192.2",
10546
+ "disposition": "transferred",
10547
+ "target": "schemas/v2/capabilities.schema.json",
10531
10548
  "sources": [
10532
10549
  {
10533
10550
  "file": "RFCS/registers/0192-facet-advertisement.gaps.md",
@@ -10543,8 +10560,8 @@
10543
10560
  "surface": "Eight core families carry zero facets, so the facet rule is vacuous for them, and `facetsUncovered` gives them no backstop either (RFC 0190 §B). Nothing in the corpus distinguishes \"this family genuinely has no sub-capabilities\" from \"its facets were never modelled\".",
10544
10561
  "witness": "unclassified",
10545
10562
  "requirementId": null,
10546
- "disposition": "carried",
10547
- "target": "openwop.gap.0192.3",
10563
+ "disposition": "transferred",
10564
+ "target": "schemas/v2/capabilities.schema.json",
10548
10565
  "sources": [
10549
10566
  {
10550
10567
  "file": "RFCS/registers/0192-facet-advertisement.gaps.md",
@@ -60,7 +60,7 @@ A host that advertises `idempotency` MUST assign a logical effect id once per ef
60
60
 
61
61
  ## Relaxations
62
62
 
63
- A relaxation, where one is legitimate — a development deployment, a single-tenant appliance — is an operator setting, never a discovery field (RFC 0173 §A.2). Every relaxation a host runs under MUST be recorded in its certification bundle as `host.relaxations[]` (`schemas/v2/certification-bundle.schema.json`): `{ obligation, durability, reason }`, `durability ∈ session | deployment | permanent`.
63
+ A relaxation, where one is legitimate — a development deployment, a single-tenant appliance — is an operator setting, never a discovery field (RFC 0173 §A.2). Every relaxation a host runs under MUST be recorded in its certification bundle as `host.relaxations[]` (`schemas/v2/certification-bundle.schema.json`): `{ obligation, durability, reason }`, `durability ∈ session | deployment | persisted`.
64
64
 
65
65
  | Durability | Meaning |
66
66
  | --- | --- |
@@ -803,6 +803,7 @@
803
803
  {
804
804
  "key": "fs",
805
805
  "kind": "family",
806
+ "normativeText": ["spec/v1/host-capabilities.md"],
806
807
  "anchor": "core",
807
808
  "section": "core/capabilities.md#fs",
808
809
  "peerDependencyId": "fs",
@@ -825,6 +826,7 @@
825
826
  {
826
827
  "key": "kvStorage",
827
828
  "kind": "family",
829
+ "normativeText": ["spec/v1/host-capabilities.md"],
828
830
  "anchor": "core",
829
831
  "section": "core/capabilities.md#kvStorage",
830
832
  "peerDependencyId": "kvStorage",
@@ -847,6 +849,7 @@
847
849
  {
848
850
  "key": "tableStorage",
849
851
  "kind": "family",
852
+ "normativeText": ["spec/v1/host-capabilities.md"],
850
853
  "anchor": "core",
851
854
  "section": "core/capabilities.md#tableStorage",
852
855
  "peerDependencyId": "tableStorage",
@@ -868,6 +871,7 @@
868
871
  {
869
872
  "key": "queueBus",
870
873
  "kind": "family",
874
+ "normativeText": ["spec/v1/host-capabilities.md"],
871
875
  "anchor": "core",
872
876
  "section": "core/capabilities.md#queueBus",
873
877
  "peerDependencyId": "queueBus",
@@ -888,6 +892,7 @@
888
892
  {
889
893
  "key": "scheduling",
890
894
  "kind": "family",
895
+ "normativeText": ["spec/v1/host-capabilities.md"],
891
896
  "anchor": "core",
892
897
  "section": "core/capabilities.md#scheduling",
893
898
  "peerDependencyId": "scheduling",
@@ -1093,6 +1098,7 @@
1093
1098
  {
1094
1099
  "key": "deadLetter",
1095
1100
  "kind": "family",
1101
+ "normativeText": ["spec/v1/host-capabilities.md"],
1096
1102
  "anchor": "core",
1097
1103
  "section": "core/capabilities.md#deadLetter",
1098
1104
  "peerDependencyId": "deadLetter",
@@ -1268,6 +1274,7 @@
1268
1274
  {
1269
1275
  "key": "sql",
1270
1276
  "kind": "family",
1277
+ "normativeText": ["spec/v1/host-capabilities.md"],
1271
1278
  "anchor": "core",
1272
1279
  "section": "core/capabilities.md#sql",
1273
1280
  "peerDependencyId": "sql",
@@ -1288,6 +1295,7 @@
1288
1295
  {
1289
1296
  "key": "nosql",
1290
1297
  "kind": "family",
1298
+ "normativeText": ["spec/v1/host-capabilities.md"],
1291
1299
  "anchor": "core",
1292
1300
  "section": "core/capabilities.md#nosql",
1293
1301
  "peerDependencyId": "nosql",
@@ -1307,6 +1315,7 @@
1307
1315
  {
1308
1316
  "key": "vectorStore",
1309
1317
  "kind": "family",
1318
+ "normativeText": ["spec/v1/host-capabilities.md"],
1310
1319
  "anchor": "core",
1311
1320
  "section": "core/capabilities.md#vectorStore",
1312
1321
  "peerDependencyId": "vectorStore",
@@ -1326,6 +1335,7 @@
1326
1335
  {
1327
1336
  "key": "searchIndex",
1328
1337
  "kind": "family",
1338
+ "normativeText": ["spec/v1/host-capabilities.md"],
1329
1339
  "anchor": "core",
1330
1340
  "section": "core/capabilities.md#searchIndex",
1331
1341
  "peerDependencyId": "searchIndex",
@@ -1345,6 +1355,7 @@
1345
1355
  {
1346
1356
  "key": "blobStorage",
1347
1357
  "kind": "family",
1358
+ "normativeText": ["spec/v1/host-capabilities.md"],
1348
1359
  "anchor": "core",
1349
1360
  "section": "core/capabilities.md#blobStorage",
1350
1361
  "peerDependencyId": "blobStorage",
@@ -1365,6 +1376,7 @@
1365
1376
  {
1366
1377
  "key": "cache",
1367
1378
  "kind": "family",
1379
+ "normativeText": ["spec/v1/host-capabilities.md"],
1368
1380
  "anchor": "core",
1369
1381
  "section": "core/capabilities.md#cache",
1370
1382
  "peerDependencyId": "cache",
@@ -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.18.0",
4
- "corpusTag": "v2.18.0",
3
+ "version": "2.20.0",
4
+ "corpusTag": "v2.20.0",
5
5
  "updated": "2026-09-18"
6
6
  }