@openwop/spec-artifacts 2.0.0-rc.9 → 2.0.1

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 (39) hide show
  1. package/CORPUS-STAMP.json +40 -37
  2. package/api/seams-v2.yaml +1 -1
  3. package/api/v2/asyncapi.yaml +1 -1
  4. package/api/v2/openapi.yaml +17 -19
  5. package/package.json +1 -1
  6. package/schemas/capabilities.schema.json +40 -1
  7. package/schemas/run-snapshot.schema.json +103 -33
  8. package/schemas/v2/agent-deployment-transition.schema.json +5 -6
  9. package/schemas/v2/agent-deployment.schema.json +8 -9
  10. package/schemas/v2/agent-eval-suite.schema.json +11 -12
  11. package/schemas/v2/artifact-type-pack-manifest.schema.json +22 -18
  12. package/schemas/v2/certification-bundle.schema.json +1 -1
  13. package/schemas/v2/chat-card-pack-manifest.schema.json +19 -15
  14. package/schemas/v2/debug-bundle.schema.json +6 -6
  15. package/schemas/v2/effect-ledger-projection.schema.json +4 -3
  16. package/schemas/v2/effect-seam-manifest.schema.json +30 -7
  17. package/schemas/v2/error-envelope.schema.json +185 -138
  18. package/schemas/v2/eval-summary.schema.json +17 -10
  19. package/schemas/v2/goal.schema.json +5 -5
  20. package/schemas/v2/ids.schema.json +120 -22
  21. package/schemas/v2/node-pack-manifest.schema.json +27 -31
  22. package/schemas/v2/proposal.schema.json +7 -8
  23. package/schemas/v2/run-event-payloads.schema.json +258 -245
  24. package/schemas/v2/run-event.schema.json +2 -126
  25. package/schemas/v2/run-options.schema.json +1 -1
  26. package/schemas/v2/run-snapshot.schema.json +34 -13
  27. package/schemas/v2/webhook-delivery.schema.json +26 -0
  28. package/schemas/v2/workflow-chain-pack-manifest.schema.json +41 -45
  29. package/schemas/v2/workflow-definition.schema.json +31 -36
  30. package/spec/v1/core-standard-manifest.json +2 -2
  31. package/spec/v1/deprecations.json +79 -67
  32. package/spec/v1/deprecations.schema.json +23 -7
  33. package/spec/v1/extensions.json +3 -2
  34. package/spec/v2/declaration.json +57 -33
  35. package/spec/v2/errors.json +421 -360
  36. package/spec/v2/id-field-bindings.json +105 -0
  37. package/spec/v2/profiles.json +31 -7
  38. package/spec/v2/release.json +3 -3
  39. package/spec/v2/retention-floors.json +35 -0
@@ -9,7 +9,7 @@
9
9
  "surface": "top-level `capabilities` wrapper object in /.well-known/openwop",
10
10
  "kind": "discovery-shape",
11
11
  "deprecatedIn": "RFC 0073 (v1.1)",
12
- "authority": "RFC 0073 §Proposal; spec/v1/capabilities.md §Discovery document root (\"deprecated legacy shape, tolerated only by the schema's additionalProperties: true\")",
12
+ "authority": "RFC 0073 \u00a7Proposal; spec/v1/capabilities.md \u00a7Discovery document root (\"deprecated legacy shape, tolerated only by the schema's additionalProperties: true\")",
13
13
  "removeIn": "2.0",
14
14
  "replacement": "capability families at the document root",
15
15
  "codemod": null,
@@ -23,8 +23,11 @@
23
23
  "token": "deprecated mirror"
24
24
  }
25
25
  ],
26
- "removalTrigger": "v1-end-of-support",
27
- "note": " RFC 0176 §C.2: absent from the v2 representation at the cut; removed from the v1 representation at v1 end-of-support."
26
+ "removalTrigger": [
27
+ "v2.0-cut",
28
+ "v1-end-of-support"
29
+ ],
30
+ "note": " RFC 0176 \u00a7C.2: absent from the v2 representation at the cut; removed from the v1 representation at v1 end-of-support."
28
31
  },
29
32
  {
30
33
  "id": "openwop.deprecation.host-dotted-mirror",
@@ -32,9 +35,9 @@
32
35
  "surface": "host-side `host.<family>` dotted mirror of root capability families",
33
36
  "kind": "discovery-shape",
34
37
  "deprecatedIn": "RFC 0073 (v1.1)",
35
- "authority": "RFC 0073 §3 \"Reference host canonical root + deprecated mirror\"; retirement gated on the v2 major (RFC 0073 UQ1/UQ2)",
38
+ "authority": "RFC 0073 \u00a73 \"Reference host \u2014 canonical root + deprecated mirror\"; retirement gated on the v2 major (RFC 0073 UQ1/UQ2)",
36
39
  "removeIn": "2.0",
37
- "replacement": "one declaration file: document-root key pack peer-dependency identifier spec section anchor (v2 program C.2)",
40
+ "replacement": "one declaration file: document-root key \u2261 pack peer-dependency identifier \u2261 spec section anchor (v2 program C.2)",
38
41
  "codemod": null,
39
42
  "sources": [
40
43
  {
@@ -42,16 +45,19 @@
42
45
  "token": "canonical root + deprecated mirror"
43
46
  }
44
47
  ],
45
- "removalTrigger": "v1-end-of-support",
46
- "note": " RFC 0176 §C.2: absent from the v2 representation at the cut; removed from the v1 representation at v1 end-of-support."
48
+ "removalTrigger": [
49
+ "v2.0-cut",
50
+ "v1-end-of-support"
51
+ ],
52
+ "note": " RFC 0176 \u00a7C.2: absent from the v2 representation at the cut; removed from the v1 representation at v1 end-of-support."
47
53
  },
48
54
  {
49
55
  "id": "openwop.deprecation.profile-openwop-core-alias",
50
56
  "status": "deprecated",
51
57
  "surface": "profile id `openwop-core` (alias of `openwop-discovery-core`)",
52
58
  "kind": "profile-id",
53
- "deprecatedIn": "RFC 0155 §A (v1.2, 2026-08-16)",
54
- "authority": "spec/v1/profiles.md §`openwop-discovery-core` (canonical) alias `openwop-core` (deprecated); RFC 0155 §A: removal \"no earlier than v2\"",
59
+ "deprecatedIn": "RFC 0155 \u00a7A (v1.2, 2026-08-16)",
60
+ "authority": "spec/v1/profiles.md \u00a7`openwop-discovery-core` (canonical) \u2014 alias `openwop-core` (deprecated); RFC 0155 \u00a7A: removal \"no earlier than v2\"",
55
61
  "removeIn": "2.0",
56
62
  "replacement": "openwop-discovery-core",
57
63
  "codemod": null,
@@ -67,8 +73,8 @@
67
73
  "status": "deprecated",
68
74
  "surface": "state-key prefix conventions as a back-compat layer over typed channels",
69
75
  "kind": "prose-convention",
70
- "deprecatedIn": "spec/v1/channels-and-reducers.md (v1.0; no RFC cited the spec text says the conventions are \"a back-compat layer that the spec deprecates over time\")",
71
- "authority": "spec/v1/channels-and-reducers.md §Why this exists",
76
+ "deprecatedIn": "spec/v1/channels-and-reducers.md (v1.0; no RFC cited \u2014 the spec text says the conventions are \"a back-compat layer that the spec deprecates over time\")",
77
+ "authority": "spec/v1/channels-and-reducers.md \u00a7Why this exists",
72
78
  "removeIn": "2.0",
73
79
  "replacement": "typed channels with explicit reducers",
74
80
  "codemod": null,
@@ -85,8 +91,8 @@
85
91
  "status": "deprecated",
86
92
  "surface": "capabilities.a2a `supported: true` without `protocolVersions[]`",
87
93
  "kind": "discovery-field",
88
- "deprecatedIn": "RFC 0152 §A",
89
- "authority": "spec/v1/a2a-integration.md §Discovery: \"`supported: true` without `protocolVersions` is deprecated\"",
94
+ "deprecatedIn": "RFC 0152 \u00a7A",
95
+ "authority": "spec/v1/a2a-integration.md \u00a7Discovery: \"`supported: true` without `protocolVersions` is deprecated\"",
90
96
  "removeIn": "2.0",
91
97
  "replacement": "non-empty `protocolVersions[]` + `preferredVersion` (v2: a capability facet under the closed root, v2 program C.2)",
92
98
  "codemod": null,
@@ -102,8 +108,8 @@
102
108
  "status": "deprecated",
103
109
  "surface": "capabilities.mcp `supported: true` without `protocolVersions[]`",
104
110
  "kind": "discovery-field",
105
- "deprecatedIn": "RFC 0153 §A",
106
- "authority": "spec/v1/mcp-integration.md §Discovery: \"Unqualified `supported: true` is deprecated and cannot substantiate a current-MCP claim\"",
111
+ "deprecatedIn": "RFC 0153 \u00a7A",
112
+ "authority": "spec/v1/mcp-integration.md \u00a7Discovery: \"Unqualified `supported: true` is deprecated and cannot substantiate a current-MCP claim\"",
107
113
  "removeIn": "2.0",
108
114
  "replacement": "non-empty `protocolVersions[]` (MCP date form) + `preferredVersion`",
109
115
  "codemod": null,
@@ -120,7 +126,7 @@
120
126
  "surface": "workflow node `config.outputArtifactType` bag entry",
121
127
  "kind": "schema-field",
122
128
  "deprecatedIn": "schemas/workflow-definition.schema.json (first-class `artifactType` field)",
123
- "authority": "schemas/workflow-definition.schema.json `artifactType` description: \"replaces the deprecated config.outputArtifactType bag entry\"",
129
+ "authority": "schemas/workflow-definition.schema.json \u2014 `artifactType` description: \"replaces the deprecated config.outputArtifactType bag entry\"",
124
130
  "removeIn": "2.0",
125
131
  "replacement": "node.artifactType",
126
132
  "codemod": null,
@@ -137,7 +143,7 @@
137
143
  "surface": "workflow node `config.chatCard` bag entry",
138
144
  "kind": "schema-field",
139
145
  "deprecatedIn": "schemas/workflow-definition.schema.json (first-class `chatCard` field)",
140
- "authority": "schemas/workflow-definition.schema.json `chatCard` description: \"replaces the deprecated config.chatCard bag entry\"",
146
+ "authority": "schemas/workflow-definition.schema.json \u2014 `chatCard` description: \"replaces the deprecated config.chatCard bag entry\"",
141
147
  "removeIn": "2.0",
142
148
  "replacement": "node.chatCard",
143
149
  "codemod": null,
@@ -154,7 +160,7 @@
154
160
  "surface": "capabilities.auth.subjectLinking",
155
161
  "kind": "discovery-field",
156
162
  "deprecatedIn": "RFC 0164 (suite 1.151.0, 2026-09-02)",
157
- "authority": "RFC 0164 §A.3: the flag is DERIVED (MUST be true whenever both `openwop-auth-saml` and `openwop-auth-scim` are advertised) and deprecated toward v2; the profile pair carries the obligation",
163
+ "authority": "RFC 0164 \u00a7A.3: the flag is DERIVED (MUST be true whenever both `openwop-auth-saml` and `openwop-auth-scim` are advertised) and deprecated toward v2; the profile pair carries the obligation",
158
164
  "removeIn": "2.0",
159
165
  "replacement": "the profile pair itself; v2 Subject record with `keyClass` (v2 program C.3)",
160
166
  "codemod": null,
@@ -175,7 +181,7 @@
175
181
  "surface": "certification bundle format v1 (schemas/conformance-certification-bundle.schema.json, `bundleVersion: \"1\"`)",
176
182
  "kind": "artifact",
177
183
  "deprecatedIn": "RFC 0148 (suite 1.114.0, 2026-08-12); `--certify` default flipped to v2 at suite 1.152.0",
178
- "authority": "COMPATIBILITY.md §2 \"Measurement vs. claim\": v1 remains parseable but ceases to substantiate a new certification after the 90-day window that began 2026-08-12 (ends 2026-11-10)",
184
+ "authority": "COMPATIBILITY.md \u00a72 \"Measurement vs. claim\": v1 remains parseable but ceases to substantiate a new certification after the 90-day window that began 2026-08-12 (ends 2026-11-10)",
179
185
  "removeIn": "2.0",
180
186
  "replacement": "certification bundle v2 (schemas/certification-bundle-v2.schema.json); bundle v3 at v2.0 (v2 program C.1)",
181
187
  "codemod": null,
@@ -195,8 +201,8 @@
195
201
  "status": "deprecated",
196
202
  "surface": "`Capabilities-Etag` response header on GET /.well-known/openwop",
197
203
  "kind": "header",
198
- "deprecatedIn": "RFC 0165 §C.2 (suite 1.155.0, 2026-09-02)",
199
- "authority": "RFC 0165 §C.2: hosts SHOULD send a standard ETag on /.well-known/openwop and honor If-None-Match; Capabilities-Etag keeps its semantics through v1.x and is removed at 2.0",
204
+ "deprecatedIn": "RFC 0165 \u00a7C.2 (suite 1.155.0, 2026-09-02)",
205
+ "authority": "RFC 0165 \u00a7C.2: hosts SHOULD send a standard ETag on /.well-known/openwop and honor If-None-Match; Capabilities-Etag keeps its semantics through v1.x and is removed at 2.0",
200
206
  "removeIn": "2.0",
201
207
  "replacement": "standard `ETag` / `If-None-Match` on the discovery document (dual-emitted through v1.x)",
202
208
  "codemod": null,
@@ -207,11 +213,14 @@
207
213
  },
208
214
  {
209
215
  "file": "RFCS/0165-v2-preparation-wire-shapes.md",
210
- "token": "§C.2 Discovery cache validator"
216
+ "token": "\u00a7C.2 Discovery cache validator"
211
217
  }
212
218
  ],
213
- "removalTrigger": "v1-end-of-support",
214
- "note": " RFC 0176 §C.2: absent from the v2 representation at the cut; removed from the v1 representation at v1 end-of-support."
219
+ "removalTrigger": [
220
+ "v2.0-cut",
221
+ "v1-end-of-support"
222
+ ],
223
+ "note": " RFC 0176 \u00a7C.2: absent from the v2 representation at the cut; removed from the v1 representation at v1 end-of-support."
215
224
  },
216
225
  {
217
226
  "id": "openwop.deprecation.contract-provenance",
@@ -236,8 +245,8 @@
236
245
  "status": "deprecated",
237
246
  "surface": "the `X-openwop-*` webhook delivery header family (Webhook-Id, Event-Type, Timestamp, Signature, Signature-Algorithm)",
238
247
  "kind": "header",
239
- "deprecatedIn": "RFC 0165 §C.1 (suite 1.155.0, 2026-09-02)",
240
- "authority": "RFC 0165 §C.1: hosts SHOULD dual-emit the `OpenWOP-*` family with identical values; subscribers SHOULD accept either; the `X-openwop-*` family MUST still be sent through v1.x and is removed at 2.0",
248
+ "deprecatedIn": "RFC 0165 \u00a7C.1 (suite 1.155.0, 2026-09-02)",
249
+ "authority": "RFC 0165 \u00a7C.1: hosts SHOULD dual-emit the `OpenWOP-*` family with identical values; subscribers SHOULD accept either; the `X-openwop-*` family MUST still be sent through v1.x and is removed at 2.0",
241
250
  "removeIn": "2.0",
242
251
  "replacement": "`OpenWOP-Webhook-Id`, `OpenWOP-Event-Type`, `OpenWOP-Timestamp`, `OpenWOP-Signature: sha256={hex}`, `OpenWOP-Signature-Algorithm`",
243
252
  "codemod": null,
@@ -249,7 +258,7 @@
249
258
  },
250
259
  {
251
260
  "file": "RFCS/0165-v2-preparation-wire-shapes.md",
252
- "token": "§C.1 Webhook headers"
261
+ "token": "\u00a7C.1 Webhook headers"
253
262
  }
254
263
  ]
255
264
  },
@@ -281,11 +290,11 @@
281
290
  "surface": "`engineVersion` typed integer at the discovery root and string on run-event / run-snapshot / three event payloads",
282
291
  "kind": "schema-field",
283
292
  "deprecatedIn": null,
284
- "authority": "RFC 0165 §A.4 (recorded; unification is a v2 C.5 item changing either type is a COMPATIBILITY §2.2 break in v1.x)",
293
+ "authority": "RFC 0165 \u00a7A.4 (recorded; unification is a v2 C.5 item \u2014 changing either type is a COMPATIBILITY \u00a72.2 break in v1.x)",
285
294
  "removeIn": "2.0",
286
295
  "replacement": "one integer `engineVersion` on every carrier (v2)",
287
296
  "codemod": null,
288
- "note": "In v1.x the per-event value is the decimal string rendering of the root integer (version-negotiation.md §\"Protocol version grammar\").",
297
+ "note": "In v1.x the per-event value is the decimal string rendering of the root integer (version-negotiation.md \u00a7\"Protocol version grammar\").",
289
298
  "sources": [
290
299
  {
291
300
  "file": "spec/v1/version-negotiation.md",
@@ -303,7 +312,7 @@
303
312
  "surface": "`since` query parameter on GET /v1/runs/{runId}/events/poll",
304
313
  "kind": "discovery-field",
305
314
  "deprecatedIn": null,
306
- "authority": "v2 charter C.4 (RFC 0167 §E; version-negotiation.md names `lastSequence` authoritative and `since` back-compat for pre-v1.0 deployments)",
315
+ "authority": "v2 charter C.4 (RFC 0167 \u00a7E; version-negotiation.md names `lastSequence` authoritative and `since` back-compat for pre-v1.0 deployments)",
307
316
  "removeIn": "2.0",
308
317
  "replacement": "`lastSequence` in v1.x; the v2 C.4 child defines the cursor (RFC 0165 G7)",
309
318
  "codemod": null,
@@ -321,7 +330,7 @@
321
330
  "surface": "`X-Dedup`, `X-Force-Engine-Version`, `X-Pack-Sha`, `X-Pack-Signing-Method` request headers",
322
331
  "kind": "header",
323
332
  "deprecatedIn": null,
324
- "authority": "v2 charter C.4 (RFC 0167 §E): `OpenWOP-*` for every non-standard header; RFC 0165 §C.1 covered only the webhook family",
333
+ "authority": "v2 charter C.4 (RFC 0167 \u00a7E): `OpenWOP-*` for every non-standard header; RFC 0165 \u00a7C.1 covered only the webhook family",
325
334
  "removeIn": "2.0",
326
335
  "replacement": "`OpenWOP-Dedup`, `OpenWOP-Force-Engine-Version` (seam-only, moves to the seams profile), `OpenWOP-Pack-Sha`, `OpenWOP-Pack-Signing-Method`",
327
336
  "codemod": null,
@@ -385,7 +394,7 @@
385
394
  "surface": "node config `credentialProvider` key",
386
395
  "kind": "schema-field",
387
396
  "deprecatedIn": "node-packs.md (`provider` is canonical; `credentialProvider` is named as the legacy alias)",
388
- "authority": "spec/v1/node-packs.md §Credential resolution (\"and the legacy alias `credentialProvider`\")",
397
+ "authority": "spec/v1/node-packs.md \u00a7Credential resolution (\"and the legacy alias `credentialProvider`\")",
389
398
  "removeIn": "2.0",
390
399
  "replacement": "`provider`",
391
400
  "codemod": null,
@@ -419,7 +428,7 @@
419
428
  "surface": "`approvalRequested` / `clarificationRequested` legacy event payload definitions and the free-text `feedback` field",
420
429
  "kind": "schema-field",
421
430
  "deprecatedIn": "run-event-payloads.schema.json + interrupt-profiles.md (the interrupt primitive `interrupt.requested {kind}` is canonical)",
422
- "authority": "schemas/run-event-payloads.schema.json $defs approvalRequested / clarificationRequested descriptions; spec/v1/interrupt-profiles.md §Approval",
431
+ "authority": "schemas/run-event-payloads.schema.json $defs approvalRequested / clarificationRequested descriptions; spec/v1/interrupt-profiles.md \u00a7Approval",
423
432
  "removeIn": "2.0",
424
433
  "replacement": "`interrupt.requested` with `kind: approval | clarification`; `refineFeedback`",
425
434
  "codemod": null,
@@ -439,8 +448,8 @@
439
448
  "status": "deprecated",
440
449
  "surface": "`a2a-0.3-legacy` A2A profile id",
441
450
  "kind": "profile-id",
442
- "deprecatedIn": "RFC 0152 §A (A2A 1.0.0 published 2026-03-12; legacy window ends 2027-03-12)",
443
- "authority": "spec/v1/a2a-integration.md §Discovery (\"a host SHOULD NOT advertise `a2a-0.3-legacy`\" after 2027-03-12); RFC 0152 register G1/R1",
451
+ "deprecatedIn": "RFC 0152 \u00a7A (A2A 1.0.0 published 2026-03-12; legacy window ends 2027-03-12)",
452
+ "authority": "spec/v1/a2a-integration.md \u00a7Discovery (\"a host SHOULD NOT advertise `a2a-0.3-legacy`\" after 2027-03-12); RFC 0152 register G1/R1",
444
453
  "removeIn": "2.0",
445
454
  "replacement": "`a2a-1.0` only; the v2 C.8 child removes the legacy path",
446
455
  "codemod": null,
@@ -460,8 +469,8 @@
460
469
  "status": "deprecated",
461
470
  "surface": "`mcp-2025-06-18-legacy` MCP profile id",
462
471
  "kind": "profile-id",
463
- "deprecatedIn": "RFC 0153 §A (current profile accepted 2026-08-12; legacy window ends 2027-08-12)",
464
- "authority": "spec/v1/mcp-integration.md §Discovery; RFC 0153 register G1/R1",
472
+ "deprecatedIn": "RFC 0153 \u00a7A (current profile accepted 2026-08-12; legacy window ends 2027-08-12)",
473
+ "authority": "spec/v1/mcp-integration.md \u00a7Discovery; RFC 0153 register G1/R1",
465
474
  "removeIn": "2.0",
466
475
  "replacement": "`mcp-2026-07-28` only; the v2 C.8 child removes the legacy path",
467
476
  "codemod": null,
@@ -481,8 +490,8 @@
481
490
  "status": "deprecated",
482
491
  "surface": "`openwop-Webhook-Signature: v1=<hex>` header the pre-1.9.0 SDK helpers read (never in any spec file)",
483
492
  "kind": "header",
484
- "deprecatedIn": "RFC 0165 §C.3 (SDK-versus-spec defect; fixed in openwop-sdks TS 1.9.0 / Py 1.7.0 / Go v1.6.0)",
485
- "authority": "RFC 0165 §C.3",
493
+ "deprecatedIn": "RFC 0165 \u00a7C.3 (SDK-versus-spec defect; fixed in openwop-sdks TS 1.9.0 / Py 1.7.0 / Go v1.6.0)",
494
+ "authority": "RFC 0165 \u00a7C.3",
486
495
  "removeIn": "2.0",
487
496
  "replacement": "`X-openwop-Signature: sha256={hex}` in v1.x; `OpenWOP-Signature` in v2",
488
497
  "codemod": null,
@@ -496,10 +505,10 @@
496
505
  {
497
506
  "id": "openwop.deprecation.undeclared-host-extension-families",
498
507
  "status": "proposed",
499
- "surface": "the 11 `§host.*` families RFC 0144 classed `extension` (brand, canvas, chat, coordination, dataIntegration, entities, kanban, knowledge, launchStudio, messaging, webResearch) declared in neither the dotted nor the root spelling",
508
+ "surface": "the 11 `\u00a7host.*` families RFC 0144 classed `extension` (brand, canvas, chat, coordination, dataIntegration, entities, kanban, knowledge, launchStudio, messaging, webResearch) \u2014 declared in neither the dotted nor the root spelling",
500
509
  "kind": "discovery-shape",
501
510
  "deprecatedIn": null,
502
- "authority": "v2 charter C.2 (RFC 0167 §E): one declaration file; extensions live under one namespaced key; RFC 0144 §A classified them deliberately as extension namespaces",
511
+ "authority": "v2 charter C.2 (RFC 0167 \u00a7E): one declaration file; extensions live under one namespaced key; RFC 0144 \u00a7A classified them deliberately as extension namespaces",
503
512
  "removeIn": "2.0",
504
513
  "replacement": "the v2 extension namespace key (C.2 child); the prose sections move to spec/v2/ext/",
505
514
  "codemod": null,
@@ -517,9 +526,9 @@
517
526
  "surface": "the `/v1/` path-key prefix on every versioned operation",
518
527
  "kind": "path",
519
528
  "deprecatedIn": null,
520
- "authority": "RFC 0172 §A.2 (v2 operations are unversioned path keys on a bare origin; v1 keys retained through the overlap and removed with the v1 tree at Phase 5)",
529
+ "authority": "RFC 0172 \u00a7A.2 (v2 operations are unversioned path keys on a bare origin; v1 keys retained through the overlap and removed with the v1 tree at Phase 5)",
521
530
  "removeIn": "2.0",
522
- "replacement": "unversioned path keys + `OpenWOP-Version` negotiation (RFC 0172 §A)",
531
+ "replacement": "unversioned path keys + `OpenWOP-Version` negotiation (RFC 0172 \u00a7A)",
523
532
  "codemod": null,
524
533
  "note": "Proposed: the prefix is the v1 wire surface itself and cannot be deprecated inside v1.x; the row exists so the removal has a date and the alias coverage gate sees the surface.",
525
534
  "sources": [
@@ -535,7 +544,7 @@
535
544
  "surface": "the per-RFC `G<n>` local gap id as the register's ID column",
536
545
  "kind": "prose-convention",
537
546
  "deprecatedIn": null,
538
- "authority": "RFC 0178 §B.2 (the `openwop.gap.<rfc>.<n>` id is canonical; `G<n>` is an alias until 2.1)",
547
+ "authority": "RFC 0178 \u00a7B.2 (the `openwop.gap.<rfc>.<n>` id is canonical; `G<n>` is an alias until 2.1)",
539
548
  "removeIn": "2.1",
540
549
  "replacement": "`openwop.gap.<rfc>.<n>` in the ID column",
541
550
  "codemod": null,
@@ -553,7 +562,7 @@
553
562
  "surface": "registry version manifest `deprecated` boolean (an advisory version flag that collides with the JSON Schema `deprecated` annotation keyword)",
554
563
  "kind": "schema-field",
555
564
  "deprecatedIn": null,
556
- "authority": "RFC 0178 §A.1 (renamed so the annotation keyword is unambiguous); the rename rides C.10's registry/v2 re-sign",
565
+ "authority": "RFC 0178 \u00a7A.1 (renamed so the annotation keyword is unambiguous); the rename rides C.10's registry/v2 re-sign",
557
566
  "removeIn": "2.0",
558
567
  "replacement": "`versionDeprecated`",
559
568
  "codemod": null,
@@ -571,7 +580,7 @@
571
580
  "surface": "the two-segment interrupt resume token `base64url(payload).hmac` with no scheme id, algorithm, or key id",
572
581
  "kind": "artifact",
573
582
  "deprecatedIn": null,
574
- "authority": "RFC 0170 §E.1 (`ow2.<alg>.<kid>.<payload>.<mac>`); interrupt.md §Resume tokens' rotation rule references an algorithm-version discriminator the format does not contain",
583
+ "authority": "RFC 0170 \u00a7E.1 (`ow2.<alg>.<kid>.<payload>.<mac>`); interrupt.md \u00a7Resume tokens' rotation rule references an algorithm-version discriminator the format does not contain",
575
584
  "removeIn": "2.0",
576
585
  "replacement": "`ow2.<alg>.<kid>.<payload>.<mac>`; issued v1 tokens resolvable under `kid: legacy` until their expiry",
577
586
  "codemod": null,
@@ -589,7 +598,7 @@
589
598
  "surface": "`details.retryAfter`, `details.retryAfterMs`, `details.retryAfterSeconds` on error envelopes (three body spellings beside the `Retry-After` header)",
590
599
  "kind": "schema-field",
591
600
  "deprecatedIn": null,
592
- "authority": "RFC 0171 §B.2 (retry timing lives in `Retry-After` only)",
601
+ "authority": "RFC 0171 \u00a7B.2 (retry timing lives in `Retry-After` only)",
593
602
  "removeIn": "2.0",
594
603
  "replacement": "the `Retry-After` header",
595
604
  "codemod": null,
@@ -611,7 +620,7 @@
611
620
  "surface": "dotted reserved keys in `RunOptions.configurable` (`ai.provider`, `ai.model`, `ai.credentialRef`, `distillation.tokenBudget`) and the open map they live in",
612
621
  "kind": "schema-field",
613
622
  "deprecatedIn": null,
614
- "authority": "RFC 0171 §D.1 (closed, nested, versioned `configurable`)",
623
+ "authority": "RFC 0171 \u00a7D.1 (closed, nested, versioned `configurable`)",
615
624
  "removeIn": "2.0",
616
625
  "replacement": "`configurable.ai.*`, `configurable.distillation.*`; vendor keys under `configurable.extensions.<org>`",
617
626
  "codemod": "openwop.codemod.configurable-v2",
@@ -629,7 +638,7 @@
629
638
  "surface": "discovery flags that gate a security-load-bearing MUST: the fourteen `auth.*` gates, `replay.sideEffectSuppression`, `webhooks.durable`, `interrupt.approverRouting` (as a gate), `sandbox.supported` (as a gate)",
630
639
  "kind": "discovery-field",
631
640
  "deprecatedIn": null,
632
- "authority": "RFC 0173 §A.1 (an obligation of the surface, never a discovery flag; RFC 0164 §22's ruling applied corpus-wide)",
641
+ "authority": "RFC 0173 \u00a7A.1 (an obligation of the surface, never a discovery flag; RFC 0164 \u00a722's ruling applied corpus-wide)",
633
642
  "removeIn": "2.0",
634
643
  "replacement": "the obligation binds when the surface is advertised; `auth.lanes[]`, `replay`, `webhooks`, `interrupt.refKinds[]`, `sandbox.isolationModel` stay as facets; relaxations are operator settings recorded in bundle v3 `host.relaxations[]`",
635
644
  "codemod": null,
@@ -655,7 +664,7 @@
655
664
  "surface": "`supportedTransports[]` at the discovery root (`rest | mcp | a2a | grpc`)",
656
665
  "kind": "discovery-field",
657
666
  "deprecatedIn": null,
658
- "authority": "RFC 0175 §B.1 (REST is the wire; A2A and MCP are compositions with first-class facets; gRPC is demoted)",
667
+ "authority": "RFC 0175 \u00a7B.1 (REST is the wire; A2A and MCP are compositions with first-class facets; gRPC is demoted)",
659
668
  "removeIn": "2.0",
660
669
  "replacement": "none; `a2a.*` and `mcp.*` facets",
661
670
  "codemod": "openwop.codemod.discovery-document-v2",
@@ -673,7 +682,7 @@
673
682
  "surface": "`capabilities.grpc` block and `grpc-transport.md` as a core Stable document with RFC 2119 MUSTs",
674
683
  "kind": "discovery-field",
675
684
  "deprecatedIn": null,
676
- "authority": "RFC 0175 §A.1 (demoted to `spec/v2/ext/grpc-transport/`, `unwitnessable`, `adoption: none`; the door back into core is named)",
685
+ "authority": "RFC 0175 \u00a7A.1 (demoted to `spec/v2/ext/grpc-transport/`, `unwitnessable`, `adoption: none`; the door back into core is named)",
677
686
  "removeIn": "2.0",
678
687
  "replacement": "`spec/v2/ext/grpc-transport/` (documented, not advertised)",
679
688
  "codemod": "openwop.codemod.discovery-document-v2",
@@ -688,13 +697,16 @@
688
697
  {
689
698
  "id": "openwop.deprecation.well-known-wop-alias",
690
699
  "status": "proposed",
691
- "surface": "`/.well-known/wop` served byte-identically with `/.well-known/openwop` (MyndHyve, the wop openwop rebrand alias; the C.5 precedent)",
700
+ "surface": "`/.well-known/wop` served byte-identically with `/.well-known/openwop` (MyndHyve, the wop \u2192 openwop rebrand alias; the C.5 precedent)",
692
701
  "kind": "path",
693
702
  "deprecatedIn": null,
694
- "authority": "RFC 0176 §C.3",
703
+ "authority": "RFC 0176 \u00a7C.3",
695
704
  "removeIn": "2.0",
696
- "removalTrigger": "v1-end-of-support",
697
- "replacement": "`/.well-known/openwop` (one resource; RFC 0176 §C.1)",
705
+ "removalTrigger": [
706
+ "v2.0-cut",
707
+ "v1-end-of-support"
708
+ ],
709
+ "replacement": "`/.well-known/openwop` (one resource; RFC 0176 \u00a7C.1)",
698
710
  "codemod": null,
699
711
  "note": "Proposed: the alias exists in one host and was never registered; it is the model RFC 0172 cites for overlap publication.",
700
712
  "sources": [
@@ -710,11 +722,11 @@
710
722
  "surface": "`engines.openwop` ranges with no upper bound read as open (146 of 282 published versions)",
711
723
  "kind": "schema-field",
712
724
  "deprecatedIn": null,
713
- "authority": "RFC 0177 §A.1 (absent ceiling `<2.0.0`; `pack_engine_unsupported` at install on every publication path)",
725
+ "authority": "RFC 0177 \u00a7A.1 (absent ceiling \u21d2 `<2.0.0`; `pack_engine_unsupported` at install on every publication path)",
714
726
  "removeIn": "2.0",
715
727
  "replacement": "an explicit `>=x.y.z <M.0.0` range; the v2 schema enforces the grammar",
716
728
  "codemod": null,
717
- "note": "Proposed: no codemod the author declares compatibility; `openwop.codemod.pack-manifest-v2` refuses a manifest with no v2-satisfiable range.",
729
+ "note": "Proposed: no codemod \u2014 the author declares compatibility; `openwop.codemod.pack-manifest-v2` refuses a manifest with no v2-satisfiable range.",
718
730
  "sources": [
719
731
  {
720
732
  "file": "spec/v1/node-packs.md",
@@ -728,7 +740,7 @@
728
740
  "surface": "peer-dependency identifiers that are not declaration-file keys: `host.*` dotted twins (`host.fs`/`fs`, `host.queueBus`/`queueBus`), `openwop.agents.memoryBackends`, facet paths (`aiProviders.imageGeneration`, `host.aiEnvelope.await`), the reserved-slot prose list",
729
741
  "kind": "schema-field",
730
742
  "deprecatedIn": null,
731
- "authority": "RFC 0177 §B.1–§B.2 (identifier declaration-file key; `pack_peer_dependency_undefined` reads against the file; generated alias table)",
743
+ "authority": "RFC 0177 \u00a7B.1\u2013\u00a7B.2 (identifier \u2261 declaration-file key; `pack_peer_dependency_undefined` reads against the file; generated alias table)",
732
744
  "removeIn": "2.0",
733
745
  "removalTrigger": "v1-end-of-support",
734
746
  "replacement": "`spec/v2/peer-dependency-aliases.json` through the overlap; `peerDependenciesMeta.<family>.facets[]` for facets",
@@ -744,14 +756,14 @@
744
756
  {
745
757
  "id": "openwop.deprecation.manifest-signing-method",
746
758
  "status": "proposed",
747
- "surface": "`signing.method: manual | ed25519 | sigstore` two values the schema calls synonymous that the verifier treats as signatures over different bytes",
759
+ "surface": "`signing.method: manual | ed25519 | sigstore` \u2014 two values the schema calls synonymous that the verifier treats as signatures over different bytes",
748
760
  "kind": "schema-field",
749
761
  "deprecatedIn": null,
750
- "authority": "RFC 0177 §C.3 (one `signing.scheme: ed25519-canonical-json`)",
762
+ "authority": "RFC 0177 \u00a7C.3 (one `signing.scheme: ed25519-canonical-json`)",
751
763
  "removeIn": "2.0",
752
764
  "replacement": "`signing.scheme`",
753
765
  "codemod": "openwop.codemod.pack-manifest-v2",
754
- "note": "Proposed: the codemod refuses `ed25519` and `sigstore` those packs are re-signed in `registry/v2/`, never relabeled.",
766
+ "note": "Proposed: the codemod refuses `ed25519` and `sigstore` \u2014 those packs are re-signed in `registry/v2/`, never relabeled.",
755
767
  "sources": [
756
768
  {
757
769
  "file": "schemas/registry-version-manifest.schema.json",
@@ -765,7 +777,7 @@
765
777
  "surface": "`connection-packs.md` clause 6: an installed pack takes precedence over a built-in of the same `provider.id` when its version is greater-than-or-equal",
766
778
  "kind": "prose-convention",
767
779
  "deprecatedIn": null,
768
- "authority": "RFC 0177 §D.1 (RFC 0095 UQ4 decided: fail-closed `connection_provider_conflict`; qualified `<packName>#<id>` form)",
780
+ "authority": "RFC 0177 \u00a7D.1 (RFC 0095 UQ4 decided: fail-closed `connection_provider_conflict`; qualified `<packName>#<id>` form)",
769
781
  "removeIn": "2.0",
770
782
  "replacement": "fail-closed conflict; the qualified form",
771
783
  "codemod": null,
@@ -783,7 +795,7 @@
783
795
  "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",
784
796
  "kind": "path",
785
797
  "deprecatedIn": null,
786
- "authority": "RFC 0168 §C (seams are the profile `openwop-conformance-seams-v2` with `api/seams-v2.yaml`; forbidden from the capability namespace)",
798
+ "authority": "RFC 0168 \u00a7C (seams are the profile `openwop-conformance-seams-v2` with `api/seams-v2.yaml`; forbidden from the capability namespace)",
787
799
  "removeIn": "2.0",
788
800
  "replacement": "`api/seams-v2.yaml`; `profiles[]` membership",
789
801
  "codemod": null,
@@ -801,7 +813,7 @@
801
813
  "surface": "the 29 corpus-coherence scenarios reported `blocked` in every host bundle",
802
814
  "kind": "artifact",
803
815
  "deprecatedIn": null,
804
- "authority": "RFC 0168 §D.1 (spec-repo CI; never in a bundle)",
816
+ "authority": "RFC 0168 \u00a7D.1 (spec-repo CI; never in a bundle)",
805
817
  "removeIn": "2.0",
806
818
  "replacement": "`scripts/check-spec-coherence.mjs`",
807
819
  "codemod": null,
@@ -819,11 +831,11 @@
819
831
  "surface": "the published suite tarball's vendored `api/` and `schemas/` copies (and `src`, suite self-tests)",
820
832
  "kind": "artifact",
821
833
  "deprecatedIn": null,
822
- "authority": "RFC 0168 §D.2 (`dist`, `fixtures`, `vectors` only; corpus as the digest-checked peer dependency `@openwop/spec-artifacts`)",
834
+ "authority": "RFC 0168 \u00a7D.2 (`dist`, `fixtures`, `vectors` only; corpus as the digest-checked peer dependency `@openwop/spec-artifacts`)",
823
835
  "removeIn": "2.0",
824
836
  "replacement": "`@openwop/spec-artifacts`",
825
837
  "codemod": null,
826
- "note": "Proposed: the 1.138.1 mechanism one source, no copy.",
838
+ "note": "Proposed: the 1.138.1 mechanism \u2014 one source, no copy.",
827
839
  "sources": [
828
840
  {
829
841
  "file": "conformance/README.md",
@@ -837,7 +849,7 @@
837
849
  "surface": "certification bundle v2 (`bundleVersion: \"2\"`, root `additionalProperties: true`, `witnessSha256` absent, unsigned)",
838
850
  "kind": "artifact",
839
851
  "deprecatedIn": null,
840
- "authority": "RFC 0168 §E (bundle v3: closed root, required witness/build/tier/count, Ed25519 attestation)",
852
+ "authority": "RFC 0168 \u00a7E (bundle v3: closed root, required witness/build/tier/count, Ed25519 attestation)",
841
853
  "removeIn": "2.0",
842
854
  "removalTrigger": "v1-end-of-support",
843
855
  "replacement": "bundle v3 (`schemas/v2/certification-bundle.schema.json`)",
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://openwop.dev/spec/v1/deprecations.schema.json",
4
4
  "title": "OpenWOP deprecation register",
5
- "description": "Shape of spec/v1/deprecations.json the index of every surface an RFC or spec annotation has deprecated in v1.x (status: deprecated), plus surfaces the v2 program proposes to deprecate but no RFC has yet (status: proposed). In v1.x the register records deprecations; it never creates one (COMPATIBILITY.md §7). It is not a wire artifact and is deliberately kept out of schemas/.",
5
+ "description": "Shape of spec/v1/deprecations.json \u2014 the index of every surface an RFC or spec annotation has deprecated in v1.x (status: deprecated), plus surfaces the v2 program proposes to deprecate but no RFC has yet (status: proposed). In v1.x the register records deprecations; it never creates one (COMPATIBILITY.md \u00a77). It is not a wire artifact and is deliberately kept out of schemas/.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": [
@@ -95,7 +95,7 @@
95
95
  "removeIn": {
96
96
  "type": "string",
97
97
  "pattern": "^[0-9]+\\.[0-9]+$",
98
- "description": "Protocol major.minor at which the surface is removed. v1.x deprecations remove no earlier than 2.0 (COMPATIBILITY.md §7)."
98
+ "description": "Protocol major.minor at which the surface is removed. v1.x deprecations remove no earlier than 2.0 (COMPATIBILITY.md \u00a77)."
99
99
  },
100
100
  "replacement": {
101
101
  "type": "string",
@@ -136,12 +136,28 @@
136
136
  }
137
137
  },
138
138
  "removalTrigger": {
139
- "type": "string",
140
- "enum": [
141
- "v2.0-cut",
142
- "v1-end-of-support"
139
+ "oneOf": [
140
+ {
141
+ "type": "string",
142
+ "enum": [
143
+ "v2.0-cut",
144
+ "v1-end-of-support"
145
+ ]
146
+ },
147
+ {
148
+ "type": "array",
149
+ "items": {
150
+ "type": "string",
151
+ "enum": [
152
+ "v2.0-cut",
153
+ "v1-end-of-support"
154
+ ]
155
+ },
156
+ "minItems": 1,
157
+ "uniqueItems": true
158
+ }
143
159
  ],
144
- "description": "RFC 0176 §C.2: the event that removes the surface. v2.0-cut absent from the v2 representation from the cut; v1-end-of-support removed from the v1 representation when every INTEROP-MATRIX host has produced a non-vacuous v2 bundle plus 90 days (charter Phase 0 rule). Optional; removeIn stays the version."
160
+ "description": "RFC 0176 \u00a7C.2: the event(s) that remove the surface. `v2.0-cut` \u2014 absent from the v2 representation from the cut; `v1-end-of-support` \u2014 removed from the v1 representation when every INTEROP-MATRIX host has produced a non-vacuous v2 bundle plus 90 days (charter Phase 0 rule). A SET, because \u00a7C.2 gives one row two independent removal events: the wrapper, the dotted mirror and Capabilities-Etag are absent from v2 at the cut AND removed from v1 at end-of-support, and a scalar could express only one. Until 2026-09-04 those rows carried `v1-end-of-support` alone while `v2-well-known-one-resource` asserted the `v2.0-cut` obligation by name \u2014 the scenario was right about the effect and the data could not say so. A bare string remains valid for rows with one trigger. Optional; removeIn stays the version."
145
161
  }
146
162
  },
147
163
  "allOf": [
@@ -37,7 +37,7 @@
37
37
  "rfc": "0155 \u00a7C",
38
38
  "coverage": {
39
39
  "rule": "Derived by scripts/generate-extension-registry-coverage.mjs from the top-level keys of schemas/capabilities.schema.json. coreFields = the openwop-discovery-core predicate fields (profiles.md); metadataFields = keys that describe the document or host rather than gate an optional feature (each carries its rationale in metadataRationale; a key that gates behaviour may not be listed there); covered = extension families reached by some record capabilityPath; uncovered = every other family. Uncovered means no registry record exists \u2014 not that the family is non-compliant. Regenerate with --write; the gate runs --check.",
40
- "familiesTotal": 92,
40
+ "familiesTotal": 93,
41
41
  "coreFields": [
42
42
  "limits",
43
43
  "protocolVersion",
@@ -153,7 +153,8 @@
153
153
  "workspace"
154
154
  ],
155
155
  "uncovered": [
156
- "preferredVersion"
156
+ "preferredVersion",
157
+ "signingKeys"
157
158
  ]
158
159
  },
159
160
  "extensions": [