@openwop/spec-artifacts 2.9.2 → 2.11.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.9.2",
5
- "corpusTag": "v2.9.2",
4
+ "version": "2.11.0",
5
+ "corpusTag": "v2.11.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": "5368b80007ca3247752b493501d5d63cff866081832125bffcb893806e67ea32",
13
- "api/v2/asyncapi.yaml": "95acc8ea7834002397c7b3bfff3e606208701c8cdee6845692a3ae81516a7748",
14
- "api/v2/openapi.yaml": "75e944c763849f16da03710b75be56843d10904ff01343ab328ecfb222916e0e",
12
+ "api/seams-v2.yaml": "faff58de5dc16aaf5e857868a2caa0592c4c63c277c476b035c9c35242a4cc85",
13
+ "api/v2/asyncapi.yaml": "f2160685a557b4642b1e4983273f0c7537416407af02f0799fae82f18c09ddfe",
14
+ "api/v2/openapi.yaml": "75afa9163e295f30c49517f8e777917e8489de682016b416a702ea7b1eb3961a",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
@@ -115,7 +115,7 @@
115
115
  "schemas/v2/artifact-type-pack-manifest.schema.json": "85630d1b760d0b41cf5a6fad2acfada39abaf7f0befd95cc4334e1e883e9615d",
116
116
  "schemas/v2/audit-verify-result.schema.json": "a748dfadb5155adfde8a91045e76b0db6695005fe559035d71670fdd55edb3ba",
117
117
  "schemas/v2/budget-policy.schema.json": "c7449daeb6e1d95e7a047b8c2814d3d54748697c27046972834874867d9b5f4c",
118
- "schemas/v2/capabilities.schema.json": "4329d6a9a1a857afa327cc3428433a86aabf6c3cf4fde230855b29443992f693",
118
+ "schemas/v2/capabilities.schema.json": "ae1ece0c55cf467f11fe54d1374b42a249db57d8d69e45afc6f8d40e3712ca90",
119
119
  "schemas/v2/certification-bundle.schema.json": "0bcf8f297266505ca39d30eea8100e3c0fb048f2651717fd746da8129fcb7920",
120
120
  "schemas/v2/channel-presence-payload.schema.json": "1c20ad810cb311d47aa0b95d928490826b2468fd161f884cd29e867053e6782f",
121
121
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
@@ -199,15 +199,15 @@
199
199
  "schemas/workload-identity.schema.json": "64ed93e12cc9f0657e56ff9b8f045e5d68d397df5276d103c07f42c7f34f0579",
200
200
  "schemas/workspace-file-create.schema.json": "70a23b92c2958c0165d7d29aea9020a045dc7816af82c80c5f50d0aac19c4856",
201
201
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
202
- "spec/v1/alias-detectors.json": "e90916db12d2297e2e560b2d54d2c4702d6cb3bef7179a575844687a7ec17262",
202
+ "spec/v1/alias-detectors.json": "40069d5976eeb6ba1384a648e57e5cfd673db3fce36175115fb8293bee9664d4",
203
203
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
204
- "spec/v1/core-standard-manifest.json": "96cc4fce756f1619a6c86aa675806067f0054eb92ec8b33510bdae7ceb412f58",
205
- "spec/v1/deprecations.json": "c81c8f71460936c8d489d8270477c7661cf4a5d7b7bad86c98899750b5656027",
204
+ "spec/v1/core-standard-manifest.json": "c678d49b424a188f793fd7d865f5e785d3dc8bde35f6fa0b025249aac891a846",
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": "a97c834ac7f0f1429747053b047ffc02a667b49e84b4c40317f141e658b101e5",
210
+ "spec/v1/gaps.json": "ca8e4170421c22a26a5dafc2d354a5b4998a6acae34fd4f47ba688492daac4a1",
211
211
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
212
212
  "spec/v1/migrations.json": "8839497d6a4830b53fa7867014a8336f0d725ef2346352e54fb580b7947897af",
213
213
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -226,7 +226,7 @@
226
226
  "spec/v2/core/interop.md": "8d8f4b040cb3625044c6aa586c8dcf5e9d15797de3d3b1cea631f44b8924701c",
227
227
  "spec/v2/core/interrupt.md": "bdb2879a52a2504d84146e46108c4a4c2dd3a6f27865a295c80375b331cced21",
228
228
  "spec/v2/core/overview.md": "7dc00ace32d4e4ce929a383651f0029fc4b7091ec87487b1bf26ead1be209e0e",
229
- "spec/v2/core/packs.md": "3254fd060c2b690cea70ef2b1b1a119711bb04fb5f13bf8936d4d718df9b2322",
229
+ "spec/v2/core/packs.md": "6e74aecc613b8f3592df0506fc9dfbddb5e51998c905e772ff7a38573b3ed95b",
230
230
  "spec/v2/core/persistence.md": "e9e64d0eb7f9cd6ae71a5973ee539ed30966eca309fad523f05e33adc79f9225",
231
231
  "spec/v2/core/replay.md": "13bf1f47573e0688ede28d2b1cc74cefd75e0a5c168ebf5d989f45b2cc2067b7",
232
232
  "spec/v2/core/runs.md": "b4c0bb2869077fcbf26e15bc6bbac06819f68b8241944b903a275a37db1c71fa",
@@ -234,7 +234,7 @@
234
234
  "spec/v2/core/versioning.md": "27b88cde88f9060567ef7e46f4897b6be8892ade9f4a46c2ab16e314c515eabd",
235
235
  "spec/v2/core/webhooks.md": "e08a736fd0bfdc79f5c2309c66f53caf96fac8d9954e0a184c2229de4ce286e9",
236
236
  "spec/v2/core/workflow-chain-packs.md": "26bb65721f826285b7d90c3cb62fa7e9fb2414c1bc6e0fd25b33209168c3102e",
237
- "spec/v2/declaration.json": "c7338923f69aa72200977286b59d579ca797ba5462d2a911f50c24c5485a62f5",
237
+ "spec/v2/declaration.json": "83ba35c0d1d059f420edee62e4c1b96e3d8bd35394106e8a5ae684e502dcd99e",
238
238
  "spec/v2/declaration.schema.json": "c86e3083fb9789c1958ecb4576cc6f71aa90e6f339521139238543ed08211dd4",
239
239
  "spec/v2/errors.json": "aac91b12f954cc90574d310070ae3c651b131055d4389d2c6155242763765195",
240
240
  "spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
@@ -264,6 +264,7 @@
264
264
  "spec/v2/facets/heartbeat.schema.json": "81d7fa1895a8b0241bd07cf00a7e7905bef0fd14eb3427325261c62eee5746a6",
265
265
  "spec/v2/facets/interrupt.schema.json": "c76c58c0abd99de619f8c8afad246568f5bc9cce3b7a0d097d16d87eba84be3a",
266
266
  "spec/v2/facets/mcp.schema.json": "f56609fe24ba6160ad29ae31aa16043354ff005e5cb6a0f3871c4d226087cc08",
267
+ "spec/v2/facets/packs.schema.json": "fc8307f9230d4c2a780912bc4e506c92cc26b78d3e7fdd63418b3e7df2b365bd",
267
268
  "spec/v2/facets/replay.schema.json": "0a5aefb0108c708c6794fadd533cf256709704c4f16dbf44cd63fa8980c78018",
268
269
  "spec/v2/facets/runList.schema.json": "6223e1baaebbb9f4faa71bfe968f8d22b4aa88046d0e43e8d5f56409e7f86e90",
269
270
  "spec/v2/facets/sandbox.schema.json": "e75f54486d387b2d089791aa93b5093cd1450f1920753a0f97fc23acdfe978ed",
@@ -273,8 +274,8 @@
273
274
  "spec/v2/path-manifest.json": "c123c9fd77dc1b3f9c2e9346ace80cdae007e6511138894956abda01e61ec1c6",
274
275
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
275
276
  "spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
276
- "spec/v2/release.json": "f928b02fe8150902b4148f9c2f460380189656d937f8d61128dc8adcc6d40362",
277
+ "spec/v2/release.json": "e88fb5140889a0da1f5acc19c964cc2a9e5a2b37a9cf5be48c91443d66c0cc50",
277
278
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
278
279
  },
279
- "corpusCommit": "f68c0cbf6c0cbb7892d25ba8ab75efdaf2417999"
280
+ "corpusCommit": "745a8c479757fd04f84b75c1333b22053a46088e"
280
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.9.2
4
+ version: 2.11.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.9.2
4
+ version: 2.11.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.9.2
4
+ version: 2.11.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
@@ -55,27 +55,6 @@ tags:
55
55
  description: Localized authored content — public delivery + tenant-scoped admin CRUD (RFC 0103; gated on `capabilities.content.supported`).
56
56
  - name: host
57
57
  description: Host-capability resources — e.g. the RFC 0059 agent workspace file store (gated on `capabilities.workspace.*`).
58
- - name: packs-test
59
- description: 'RFC 0025 (`Draft`). Test-mode mirror of the production `/v1/packs/*` publish/get/delete/sig surface against
60
-
61
- an isolated catalog. Gated on `capabilities.packs.testMode.supported: true` plus the reference impl''s
62
-
63
- `OPENWOP_PACKS_TEST_NAMESPACE_ENABLED=true` env-gate. Lets the conformance suite exercise the documented
64
-
65
- 19-code publish error catalog without `packs:publish` scope on the real registry. Hosts that haven''t
66
-
67
- mounted this surface MUST return `404 Not Found` for every path under `/v1/packs-test/`.
68
-
69
-
70
- Scope note (RFC 0094 §I): the PRODUCTION `/v1/packs/*` surface these paths mirror is specified in
71
-
72
- `spec/v1/registry-operations.md` + `node-packs.md` §"Registry HTTP API" and is served by a registry
73
-
74
- service (a distinct deployable from the host), so it is intentionally NOT defined in this host
75
-
76
- OpenAPI document.
77
-
78
- '
79
58
  paths:
80
59
  /.well-known/openwop:
81
60
  get:
@@ -341,7 +320,7 @@ paths:
341
320
  $ref: '#/components/responses/RateLimited'
342
321
  get:
343
322
  tags:
344
- - Runs
323
+ - runs
345
324
  operationId: listRuns
346
325
  summary: The caller's runs, newest first, cursor-paginated (RFC 0182)
347
326
  description: 'Tenant-scoped by construction: only runs whose tenant segment is the caller''s, every runId bound (identity.md
@@ -3001,7 +2980,7 @@ paths:
3001
2980
  /host/effect-seams:
3002
2981
  get:
3003
2982
  tags:
3004
- - Host
2983
+ - host
3005
2984
  operationId: getEffectSeamManifest
3006
2985
  summary: The host-declared effect-seam manifest (RFC 0173 §C)
3007
2986
  description: Every outbound effect seam replay suppression covers. A seam omitted here is invisible to the suite; the
@@ -3025,7 +3004,7 @@ paths:
3025
3004
  - $ref: '#/components/parameters/RunId'
3026
3005
  get:
3027
3006
  tags:
3028
- - Runs
3007
+ - runs
3029
3008
  operationId: getRunCompensation
3030
3009
  summary: Compensation plan and attempts for a run (RFC 0173 §C.1)
3031
3010
  description: The read projection that makes compensation a core obligation with a deployed-wire witness (RFC 0151 G9
@@ -3049,7 +3028,7 @@ paths:
3049
3028
  - $ref: '#/components/parameters/RunId'
3050
3029
  get:
3051
3030
  tags:
3052
- - Runs
3031
+ - runs
3053
3032
  operationId: getRunEffects
3054
3033
  summary: The Layer-2 effect ledger for a run (RFC 0173 §C.2)
3055
3034
  description: Business-identity keyed effect records; the witness for the Layer-2 effect-identity obligation.
@@ -3070,7 +3049,7 @@ paths:
3070
3049
  /webhooks/{webhookId}/dead-letters:
3071
3050
  get:
3072
3051
  tags:
3073
- - Webhooks
3052
+ - webhooks
3074
3053
  operationId: listWebhookDeadLetters
3075
3054
  summary: A subscription's dead-lettered deliveries (RFC 0188 §A.1)
3076
3055
  description: 'The read that makes `webhooks.md` §Durability observable. A delivery whose retries are exhausted, or a
@@ -3124,7 +3103,7 @@ paths:
3124
3103
  /host/events:
3125
3104
  get:
3126
3105
  tags:
3127
- - Host
3106
+ - host
3128
3107
  operationId: streamHostEvents
3129
3108
  summary: Host-scoped events (heartbeat.*) as SSE (RFC 0171 §E.1)
3130
3109
  description: The documented default hostEvents address; a host MAY declare another under `heartbeat.deliveryChannel`.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.9.2",
3
+ "version": "2.11.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": {
@@ -104,10 +104,12 @@
104
104
  "type": "boolean",
105
105
  "description": "Host exposes `POST /v1/host/sample/test/debug-bundle/export` returning the same payload shape as `GET /v1/runs/{runId}/debug-bundle` per `spec/v1/debug-bundle.md`. Conformance verifies the serialized bundle doesn't carry BYOK canaries. When advertised true, the host MUST serve a 200 response with the documented shape."
106
106
  }
107
- }
107
+ },
108
+ "deprecated": true,
109
+ "x-openwop-remove-in": "3.0"
108
110
  }
109
111
  },
110
- "additionalProperties": true,
112
+ "additionalProperties": false,
111
113
  "x-openwop-seeded-from": "v1"
112
114
  },
113
115
  "minClientVersion": {
@@ -6546,7 +6548,7 @@
6546
6548
  },
6547
6549
  "testMode": {
6548
6550
  "type": "object",
6549
- "description": "RFC 0025 §A. Optional `/v1/packs-test/*` mirror surface that exposes the production publish/get/delete/sig contract against an isolated catalog. Lets the conformance suite (`pack-registry-publish.test.ts`) exercise the documented 19-code publish error catalog without `packs:publish` scope on the real registry. Hosts that advertise `supported: true` MUST honor the §C isolation guarantees and MUST surface the same error envelopes and HTTP statuses as the production `/v1/packs/*` surface.",
6551
+ "description": "Deprecated 2026-09-18, removeIn 3.0 (spec/v1/deprecations.json). A test-seam flag in the capability namespace, which spec/v2/core/conformance.md §\"The seams profile\" forbids: seams are the profile `openwop-conformance-seams-v2` in the /conformance/seams/ path space. NOT removed at 2.x because live v2 discovery documents advertise it and the v2 root is additionalProperties:false. RFC 0025 §A. Optional `/v1/packs-test/*` mirror surface that exposes the production publish/get/delete/sig contract against an isolated catalog. Lets the conformance suite (`pack-registry-publish.test.ts`) exercise the documented 19-code publish error catalog without `packs:publish` scope on the real registry. Hosts that advertise this facet MUST honor the §C isolation guarantees and MUST surface the same error envelopes and HTTP statuses as the production `/v1/packs/*` surface.",
6550
6552
  "properties": {
6551
6553
  "isolated": {
6552
6554
  "type": "boolean",
@@ -6574,7 +6576,9 @@
6574
6576
  "description": "RFC 0025 §A. Which namespace scopes the test catalog accepts in pack names. Public test catalogs SHOULD refuse `private` and `local` (matching the production-registry rule for `packs.openwop.dev`); private dev catalogs MAY accept all five. When omitted, the test catalog defaults to the same scope set as the production namespace it mirrors."
6575
6577
  }
6576
6578
  },
6577
- "additionalProperties": false
6579
+ "additionalProperties": false,
6580
+ "deprecated": true,
6581
+ "x-openwop-remove-in": "3.0"
6578
6582
  }
6579
6583
  },
6580
6584
  "allOf": [
@@ -6613,7 +6617,7 @@
6613
6617
  }
6614
6618
  ],
6615
6619
  "description": "core/capabilities.md#packs — witness: claims-check; maturity experimental/none; RFC 0025",
6616
- "x-openwop-seeded-from": "v1"
6620
+ "x-openwop-facets-from": "spec/v2/facets/packs.schema.json"
6617
6621
  },
6618
6622
  "mcp": {
6619
6623
  "type": "object",
@@ -284,6 +284,18 @@
284
284
  "file": "spec/v2/core/identity.md",
285
285
  "token": "Through the overlap the bare form is admitted on a major-2 path parameter",
286
286
  "deprecation": "openwop.deprecation.bare-webhook-id"
287
+ },
288
+ {
289
+ "alias": "packs.testMode facet",
290
+ "file": "spec/v2/core/packs.md",
291
+ "token": "`testMode` is DEPRECATED",
292
+ "deprecation": "openwop.deprecation.packs-test-mode-facet"
293
+ },
294
+ {
295
+ "alias": "observability.testSeams facet",
296
+ "file": "schemas/v2/capabilities.schema.json",
297
+ "token": "testSeams",
298
+ "deprecation": "openwop.deprecation.observability-test-seams-facet"
287
299
  }
288
300
  ]
289
301
  }
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.9.2"
7
+ "version": "2.11.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": "738555934581a6bcf3d97c070ba69154fe63c6cf81f4333192875317be0c2a6d"
422
+ "digest": "17aa13b9499ceab62849c42545ad3dec4c36c67fd563015b1779c16f80584dff"
423
423
  }
@@ -826,14 +826,14 @@
826
826
  {
827
827
  "id": "openwop.deprecation.seam-operations-in-canonical-api",
828
828
  "status": "deprecated",
829
- "surface": "the nine `/v1/host/sample/*`, `/v1/host/workspace/files*` and `/v1/packs-test/*` seam/test operations in `api/openapi.yaml` and `spec/v1/operation-path-manifest.json`, and the `testSeams` discovery-flag proposals",
829
+ "surface": "the nine `/v1/host/sample/*`, `/v1/host/workspace/files*` and `/v1/packs-test/*` seam/test OPERATIONS in `api/openapi.yaml` and `spec/v1/operation-path-manifest.json`",
830
830
  "kind": "path",
831
831
  "deprecatedIn": "RFC 0168 (v2.0)",
832
832
  "authority": "RFC 0168 §C (seams are the profile `openwop-conformance-seams-v2` with `api/seams-v2.yaml`; forbidden from the capability namespace)",
833
833
  "removeIn": "2.0",
834
834
  "replacement": "`api/seams-v2.yaml`; `profiles[]` membership",
835
835
  "codemod": null,
836
- "note": "Proposed: a generated document, not a persisted artifact. Status flipped proposed→deprecated 2026-09-17: the surface has no occurrence in spec/v2, schemas/v2 or api/v2 (token grep, W7).",
836
+ "note": "Proposed: a generated document, not a persisted artifact. Status flipped proposed→deprecated 2026-09-17 on a token grep asserting the surface had no occurrence in spec/v2, schemas/v2 or api/v2. THAT CLAIM WAS FALSE — three residues were present: `packs.testMode` and `observability.testSeams` in schemas/v2/capabilities.schema.json, and an orphaned `packs-test` tag in api/v2/openapi.yaml. Corrected 2026-09-18 by NARROWING this row to the path operations, which its removeIn:2.0 genuinely did satisfy, and moving the two capability facets to their own removeIn:3.0 rows — they CANNOT be removed at 2.x because live v2 discovery documents advertise them (myndhyve emits both; openwop-host-v2-reference emits packs.testMode) and the v2 root is additionalProperties:false. The orphaned tag is deleted in this change. Two lessons: a row that bundles surfaces with different removal horizons cannot be honestly satisfied at either; and check-removal-dates.mjs only reads a row's declared sources[], so a row can certify its own absence by declaring too few.",
837
837
  "sources": [
838
838
  {
839
839
  "file": "spec/v1/operation-path-manifest.json",
@@ -916,6 +916,48 @@
916
916
  "token": "A host MUST NOT mint one after this RFC"
917
917
  }
918
918
  ]
919
+ },
920
+ {
921
+ "id": "openwop.deprecation.packs-test-mode-facet",
922
+ "status": "deprecated",
923
+ "surface": "`capabilities.packs.testMode` — the v2 advertisement of the v1 `/v1/packs-test/*` conformance-seam mirror",
924
+ "kind": "discovery-field",
925
+ "deprecatedIn": "2.10 (RFC 0189 Phase 1)",
926
+ "authority": "spec/v2/core/conformance.md §\"The seams profile\" (a test-seam capability flag MUST NOT be advertised) + spec/v2/path-manifest.json (no packs path in v2)",
927
+ "removeIn": "3.0",
928
+ "replacement": "`openwop-conformance-seams-v2` profile membership (`api/seams-v2.yaml`)",
929
+ "codemod": null,
930
+ "note": "NOT removed at 2.x. Unlike workflowChainPacks.deferredParameters/hostExpansionSeam (2.8.2), which no host advertised, TWO live v2 discovery documents carry this facet — evidence/v2-host-bundles/myndhyve.json and openwop-host-v2-reference.json — and the v2 root is additionalProperties:false, so removal breaks a published closed record with no host change (COMPATIBILITY.md §2.2; §3's second clause fails because deprecation is available and adequate).",
931
+ "sources": [
932
+ {
933
+ "file": "schemas/v2/capabilities.schema.json",
934
+ "token": "testMode"
935
+ },
936
+ {
937
+ "file": "spec/v2/core/packs.md",
938
+ "token": "`testMode` is DEPRECATED"
939
+ }
940
+ ],
941
+ "removalTrigger": "v1-end-of-support"
942
+ },
943
+ {
944
+ "id": "openwop.deprecation.observability-test-seams-facet",
945
+ "status": "deprecated",
946
+ "surface": "`capabilities.observability.testSeams` — a test-seam flag in the capability namespace",
947
+ "kind": "discovery-field",
948
+ "deprecatedIn": "2.10 (RFC 0189 Phase 1)",
949
+ "authority": "spec/v2/core/conformance.md §\"The seams profile\" (a `testSeams` capability flag does not exist and MUST NOT be advertised)",
950
+ "removeIn": "3.0",
951
+ "replacement": "`openwop-conformance-seams-v2` profile membership (`api/seams-v2.yaml`)",
952
+ "codemod": null,
953
+ "note": "NOT removed at 2.x. MyndHyve's live v2 discovery document advertises `observability.testSeams: {\"otelScrape\": true}` (evidence/v2-host-bundles/myndhyve.json), so this is the same closed-record hazard as packs.testMode — not the 2.8.2 zero-bundle case.",
954
+ "sources": [
955
+ {
956
+ "file": "schemas/v2/capabilities.schema.json",
957
+ "token": "testSeams"
958
+ }
959
+ ],
960
+ "removalTrigger": "v1-end-of-support"
919
961
  }
920
962
  ]
921
963
  }
package/spec/v1/gaps.json CHANGED
@@ -10319,11 +10319,11 @@
10319
10319
  "rfc": "0189",
10320
10320
  "local": "G2",
10321
10321
  "section": "§E.2",
10322
- "surface": "62 families must find v2 homes inside the RFC 0174 §E.2 kernel budget, which `check-core-budget.mjs` reads over `spec/v2/core/*.md` only (non-recursive). At 2.9.0 the budget is **24,695 / 25,000** — 305 words free for 62 families. `spec/v2/ext/**` is a legal home under `homeClass()` and is **not** counted by the budget, and the precedent already exists (`spec/v2/ext/provider-idempotency/README.md` is supporting normative text for the **core** `idempotency` family). Left implicit, 62 authors each discover the escape valve independently and `ext/` silently becomes \"core, but unbudgeted\" — the 25,000-word cap defeated by directory name.",
10322
+ "surface": "61 families must find v2 homes inside the RFC 0174 §E.2 kernel budget, which `check-core-budget.mjs` reads over `spec/v2/core/*.md` only (non-recursive). At 2.9.0 the budget is **24,836 / 25,000** — 164 words free for 61 families. `spec/v2/ext/**` is a legal home under `homeClass()` and is **not** counted by the budget, and the precedent already exists (`spec/v2/ext/provider-idempotency/README.md` is supporting normative text for the **core** `idempotency` family). Left implicit, 62 authors each discover the escape valve independently and `ext/` silently becomes \"core, but unbudgeted\" — the 25,000-word cap defeated by directory name.",
10323
10323
  "witness": "unclassified",
10324
10324
  "requirementId": null,
10325
- "disposition": "carried",
10326
- "target": "openwop.gap.0189.2",
10325
+ "disposition": "closed",
10326
+ "target": null,
10327
10327
  "sources": [
10328
10328
  {
10329
10329
  "file": "RFCS/registers/0189-normative-home.gaps.md",
@@ -10339,8 +10339,8 @@
10339
10339
  "surface": "The burn-down decays `open` linearly to zero at v1 end-of-support, and `open = v1Dependent + undeclared` — but `v1Carried` families (`toolHooks`, `toolCatalog`) are explicitly tolerated past end-of-support by §D itself, which fails only if their target is deleted or its `Status:` banner changes. Counting a deliberately-tolerated family in a burn-down that must reach zero asks for work the RFC says is not required.",
10340
10340
  "witness": "unclassified",
10341
10341
  "requirementId": null,
10342
- "disposition": "carried",
10343
- "target": "openwop.gap.0189.3",
10342
+ "disposition": "closed",
10343
+ "target": null,
10344
10344
  "sources": [
10345
10345
  {
10346
10346
  "file": "RFCS/registers/0189-normative-home.gaps.md",
@@ -10348,6 +10348,57 @@
10348
10348
  }
10349
10349
  ]
10350
10350
  },
10351
+ {
10352
+ "id": "openwop.gap.0190.1",
10353
+ "rfc": "0190",
10354
+ "local": "G1",
10355
+ "section": "§A",
10356
+ "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.",
10357
+ "witness": "unclassified",
10358
+ "requirementId": null,
10359
+ "disposition": "carried",
10360
+ "target": "openwop.gap.0190.1",
10361
+ "sources": [
10362
+ {
10363
+ "file": "RFCS/registers/0190-kernel-budget-denominator.gaps.md",
10364
+ "token": "G1"
10365
+ }
10366
+ ]
10367
+ },
10368
+ {
10369
+ "id": "openwop.gap.0190.2",
10370
+ "rfc": "0190",
10371
+ "local": "G2",
10372
+ "section": "§A",
10373
+ "surface": "The cap reads `resolved` from `spec/v2/declaration.json` while the budget counts words — two different files, one number. A family could in principle be declared, grant 200 words, and later have its home refused by a tightened §B predicate, retroactively lowering the cap under prose already written.",
10374
+ "witness": "unclassified",
10375
+ "requirementId": null,
10376
+ "disposition": "carried",
10377
+ "target": "openwop.gap.0190.2",
10378
+ "sources": [
10379
+ {
10380
+ "file": "RFCS/registers/0190-kernel-budget-denominator.gaps.md",
10381
+ "token": "G2"
10382
+ }
10383
+ ]
10384
+ },
10385
+ {
10386
+ "id": "openwop.gap.0190.3",
10387
+ "rfc": "0190",
10388
+ "local": "G3",
10389
+ "section": "§B",
10390
+ "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.",
10391
+ "witness": "unclassified",
10392
+ "requirementId": null,
10393
+ "disposition": "carried",
10394
+ "target": "openwop.gap.0190.3",
10395
+ "sources": [
10396
+ {
10397
+ "file": "RFCS/registers/0190-kernel-budget-denominator.gaps.md",
10398
+ "token": "G3"
10399
+ }
10400
+ ]
10401
+ },
10351
10402
  {
10352
10403
  "id": "openwop.gap.spec.a2a-integration.g1",
10353
10404
  "rfc": "0152",
@@ -10,6 +10,22 @@ Every one of the 282 pack versions published under v1 either pins `<2.0.0` or de
10
10
 
11
11
  A manifest's `engines.openwop` MUST match the grammar in `schemas/v2/node-pack-manifest.schema.json`: a `>=` lower bound and an explicit `<` major ceiling (`^>=\d+(\.\d+){0,2} <\d+\.0\.0$`). A v2 host MUST treat a range with no upper bound as bounded by `<2.0.0`. A host MUST refuse to install a version whose range does not admit the host's protocol major with `pack_engine_unsupported` (`spec/v2/errors.json`); `pack_runtime_requirement_unmet` remains a runtime-requirement code and MUST NOT be used for the protocol major. The check MUST run at install on every publication path — the canonical registry, a vendor registry's write API, and a mirror ingest — so no registry-side artifact can bypass it.
12
12
 
13
+ ## The `packs` capability
14
+
15
+ A host advertises `packs` when it serves the registry surface above. The record
16
+ is the advertisement: a host MUST NOT advertise `packs` unless it resolves pack
17
+ references through a registry reachable from its discovery document, and a
18
+ client MUST treat an absent record as "this host installs no packs" rather than
19
+ as an unknown.
20
+
21
+ `testMode` is DEPRECATED and MUST NOT be relied on by a client. It advertises
22
+ the v1 `/v1/packs-test/*` mirror, a conformance seam — and `conformance.md`
23
+ §"The seams profile" places seams in the `openwop-conformance-seams-v2` profile
24
+ and the `/conformance/seams/` path space, not in the capability namespace. It
25
+ remains advertisable through the overlap because hosts already publish it; it is
26
+ removed at 3.0. A host mounting a test catalog SHOULD advertise the seams
27
+ profile instead, and MUST NOT treat `testMode` as a second way to claim one.
28
+
13
29
  ## The registry tree
14
30
 
15
31
  The registry is versioned by tree, not header. It publishes `registry/v2/packs/<name>/-/<version>.{json,sbom.json,sig,tgz}` as a parallel tree of re-signed manifests with regenerated SBOMs and index; the v1 tree is frozen through the overlap, deliberately behind this one. A signed compatibility overlay MUST be rejected: signatures authorize by namespace, and a mirror re-derives the signer at ingest.
@@ -1396,6 +1396,9 @@
1396
1396
  "facets": [
1397
1397
  "testMode"
1398
1398
  ],
1399
+ "normativeText": [
1400
+ "spec/v2/core/packs.md"
1401
+ ],
1399
1402
  "floorScenarios": [],
1400
1403
  "requirementIds": [],
1401
1404
  "owningRfc": "0025"
@@ -0,0 +1,39 @@
1
+ {
2
+ "$comment": "Hand-decided v2 facet set for `packs` (2.10.0). Exists so the deprecation of its seam facet is emitted BY generate-from-declaration.mjs rather than stamped on afterwards by generate-deprecation-annotations.mjs — the two generators write the same file, and these are the first discovery-field rows sourced to schemas/v2/, so that interaction had never been exercised. A facet's deprecation is a decision, and a decision belongs on the record.",
3
+ "properties": {
4
+ "testMode": {
5
+ "type": "object",
6
+ "description": "Deprecated 2026-09-18, removeIn 3.0 (spec/v1/deprecations.json). A test-seam flag in the capability namespace, which spec/v2/core/conformance.md §\"The seams profile\" forbids: seams are the profile `openwop-conformance-seams-v2` in the /conformance/seams/ path space. NOT removed at 2.x because live v2 discovery documents advertise it and the v2 root is additionalProperties:false. RFC 0025 §A. Optional `/v1/packs-test/*` mirror surface that exposes the production publish/get/delete/sig contract against an isolated catalog. Lets the conformance suite (`pack-registry-publish.test.ts`) exercise the documented 19-code publish error catalog without `packs:publish` scope on the real registry. Hosts that advertise this facet MUST honor the §C isolation guarantees and MUST surface the same error envelopes and HTTP statuses as the production `/v1/packs/*` surface.",
7
+ "properties": {
8
+ "isolated": {
9
+ "type": "boolean",
10
+ "description": "RFC 0025 §C point 1. MUST be `true` when `supported` is `true` — guarantees the test catalog is persisted distinctly from the production catalog and that a pack PUT'd via `/v1/packs-test/*` MUST NOT appear in `/v1/packs/*` listings."
11
+ },
12
+ "catalogResetEndpoint": {
13
+ "type": "string",
14
+ "description": "RFC 0025 §C point 4. Optional URL path (e.g. `/v1/packs-test/reset`) that clears the entire test catalog. When advertised, conformance-suite teardown SHOULD call it; the endpoint MUST be idempotent. Hosts MAY omit; in that case the suite leaves disposable timestamped pack names in place and relies on the next host restart to clear in-memory state.",
15
+ "pattern": "^/"
16
+ },
17
+ "scopes": {
18
+ "type": "array",
19
+ "items": {
20
+ "type": "string",
21
+ "enum": [
22
+ "core",
23
+ "vendor",
24
+ "community",
25
+ "private",
26
+ "local"
27
+ ]
28
+ },
29
+ "uniqueItems": true,
30
+ "minItems": 1,
31
+ "description": "RFC 0025 §A. Which namespace scopes the test catalog accepts in pack names. Public test catalogs SHOULD refuse `private` and `local` (matching the production-registry rule for `packs.openwop.dev`); private dev catalogs MAY accept all five. When omitted, the test catalog defaults to the same scope set as the production namespace it mirrors."
32
+ }
33
+ },
34
+ "additionalProperties": false,
35
+ "deprecated": true,
36
+ "x-openwop-remove-in": "3.0"
37
+ }
38
+ }
39
+ }
@@ -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.9.2",
4
- "corpusTag": "v2.9.2",
3
+ "version": "2.11.0",
4
+ "corpusTag": "v2.11.0",
5
5
  "updated": "2026-09-18"
6
6
  }