@openwop/spec-artifacts 2.42.5 → 2.42.7

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 (63) hide show
  1. package/CORPUS-STAMP.json +64 -63
  2. package/api/seams-v2.yaml +238 -316
  3. package/api/v2/asyncapi.yaml +83 -113
  4. package/api/v2/openapi.yaml +339 -724
  5. package/package.json +1 -1
  6. package/schemas/audit-verify-result.schema.json +2 -2
  7. package/schemas/v2/audit-verify-result.schema.json +2 -2
  8. package/schemas/v2/capabilities.schema.json +2 -5
  9. package/spec/v1/core-standard-manifest.json +2 -2
  10. package/spec/v1/gaps.json +171 -1
  11. package/spec/v2/README.md +34 -36
  12. package/spec/v2/core/capabilities.md +186 -119
  13. package/spec/v2/core/conformance.md +78 -27
  14. package/spec/v2/core/connection-packs.md +8 -3
  15. package/spec/v2/core/conversation.md +10 -4
  16. package/spec/v2/core/errors.md +30 -9
  17. package/spec/v2/core/events.md +116 -80
  18. package/spec/v2/core/form-content-packs.md +11 -13
  19. package/spec/v2/core/headers.md +22 -14
  20. package/spec/v2/core/host-services.md +22 -5
  21. package/spec/v2/core/idempotency.md +48 -36
  22. package/spec/v2/core/identity.md +110 -42
  23. package/spec/v2/core/interop.md +82 -21
  24. package/spec/v2/core/interrupt.md +79 -40
  25. package/spec/v2/core/node-pack-runtimes.md +18 -4
  26. package/spec/v2/core/oauth.md +40 -6
  27. package/spec/v2/core/overview.md +61 -33
  28. package/spec/v2/core/packs.md +53 -28
  29. package/spec/v2/core/persistence.md +61 -80
  30. package/spec/v2/core/replay.md +56 -42
  31. package/spec/v2/core/runs.md +198 -60
  32. package/spec/v2/core/security-defaults.md +57 -33
  33. package/spec/v2/core/tool-catalog.md +29 -6
  34. package/spec/v2/core/versioning.md +95 -49
  35. package/spec/v2/core/webhooks.md +59 -20
  36. package/spec/v2/core/workflow-chain-packs.md +16 -14
  37. package/spec/v2/corrections.json +17 -1
  38. package/spec/v2/corrections.schema.json +1 -1
  39. package/spec/v2/declaration.json +24 -7
  40. package/spec/v2/declaration.schema.json +10 -0
  41. package/spec/v2/errors.json +109 -2
  42. package/spec/v2/errors.schema.json +38 -0
  43. package/spec/v2/ext/README.md +36 -23
  44. package/spec/v2/ext/a2uiSurface/README.md +75 -89
  45. package/spec/v2/ext/brand/README.md +15 -15
  46. package/spec/v2/ext/canvas/README.md +15 -15
  47. package/spec/v2/ext/chat/README.md +15 -15
  48. package/spec/v2/ext/coordination/README.md +15 -15
  49. package/spec/v2/ext/dataIntegration/README.md +17 -20
  50. package/spec/v2/ext/entities/README.md +15 -15
  51. package/spec/v2/ext/grpc-transport/README.md +6 -8
  52. package/spec/v2/ext/kanban/README.md +15 -15
  53. package/spec/v2/ext/knowledge/README.md +15 -15
  54. package/spec/v2/ext/launchStudio/README.md +16 -16
  55. package/spec/v2/ext/messaging/README.md +15 -15
  56. package/spec/v2/ext/portability/README.md +3 -17
  57. package/spec/v2/ext/provider-idempotency/README.md +7 -10
  58. package/spec/v2/ext/restTransport/README.md +30 -19
  59. package/spec/v2/ext/sandbox-runtime-notes/README.md +7 -9
  60. package/spec/v2/ext/webResearch/README.md +16 -16
  61. package/spec/v2/profiles.json +6 -2
  62. package/spec/v2/release.json +2 -2
  63. package/spec/v2/surface-baseline.json +542 -2
@@ -1,24 +1,35 @@
1
1
  # Discovery and Capabilities
2
2
 
3
- > **Status: Stable · RFC 0169, 0176, 0179.**
3
+ > **Status: Stable.**
4
4
 
5
5
  ## Why this exists
6
6
 
7
- v2 discovery has one capability record type on a closed root, generated from one declaration file that also mints pack peer-dependency identifiers and the `§` anchors below. Profiles are derived predicates, never a wire field.
7
+ A host advertises what it supports in one discovery document. Every capability family in it is one record type on a closed root, generated from one declaration file. That file also mints the pack peer-dependency identifiers and the `§` anchors below. Profiles are derived predicates, never a wire field.
8
8
 
9
- ## 1. One well-known resource (RFC 0176 §C.1)
9
+ ## 1. One well-known resource
10
10
 
11
- `/.well-known/openwop` is one resource. Its representation MUST be selected by `OpenWOP-Version` per `versioning.md` §1.3: no header ⇒ the v1 document (with `protocolVersions[]` and `preferredVersion` additive) through the overlap; `OpenWOP-Version: 2` ⇒ the closed v2 root. A single fetch answers the major the client speaks and names the other. A v2 root MUST NOT contain a v1 sub-object; per-major sub-objects in one document are not adopted.
11
+ `/.well-known/openwop` is one resource. Its representation MUST be selected by `OpenWOP-Version`, per [`versioning.md`](versioning.md) §1.3:
12
+
13
+ - No header ⇒ the v1 document, with `protocolVersions[]` and `preferredVersion` added, through the overlap.
14
+ - `OpenWOP-Version: 2` ⇒ the closed v2 root.
15
+
16
+ A single fetch answers the major the client speaks and names the other. A v2 root MUST NOT contain a v1 sub-object; one document never carries per-major sub-objects.
12
17
 
13
18
  ### 1.1 Cache validators
14
19
 
15
- A host MUST emit a standard `ETag` on the discovery document and MUST honor `If-None-Match` with `304`. `Capabilities-Etag` is absent from the v2 representation; the document's bytes are its negotiation identity, and a host that changes semantics without changing bytes is non-conformant.
20
+ A host MUST emit a standard `ETag` on the discovery document and MUST honor `If-None-Match` with `304`. The v2 representation has no `Capabilities-Etag`: the document's bytes are its negotiation identity. A host that changes semantics without changing bytes is non-conformant.
21
+
22
+ ### 1.2 Removal triggers
16
23
 
17
- ### 1.2 Removal triggers (RFC 0176 §C.2)
24
+ Each `deprecations.json` row carries a `removalTrigger` (`v2.0-cut | v1-end-of-support`). The following MUST be absent from the v2 representation and MUST be removed from the v1 representation at v1 end-of-support ([`overview.md`](overview.md)):
18
25
 
19
- `deprecations.json` rows carry `removalTrigger` (`v2.0-cut | v1-end-of-support`). The wrapper (`capabilities-wrapper`), the dotted mirror (`host-dotted-mirror`), and `Capabilities-Etag` (`capabilities-etag-header`) MUST be absent from the v2 representation at the cut and MUST be removed from the v1 representation at v1 end-of-support (`overview.md`). The `/.well-known/wop` alias (`well-known-wop-alias`) carries the same trigger.
26
+ - the wrapper (`capabilities-wrapper`);
27
+ - the dotted mirror (`host-dotted-mirror`);
28
+ - `Capabilities-Etag` (`capabilities-etag-header`).
20
29
 
21
- ## 2. The capability record (RFC 0169 §A)
30
+ The `/.well-known/wop` alias (`well-known-wop-alias`) carries the same trigger.
31
+
32
+ ## 2. The capability record
22
33
 
23
34
  Every family at the v2 root is one object:
24
35
 
@@ -30,370 +41,426 @@ Every family at the v2 root is one object:
30
41
  ...facets }
31
42
  ```
32
43
 
33
- | Rule | Requirement |
44
+ | Field | Rule |
34
45
  | --- | --- |
35
- | Required | `status`, `since`, `witness` MUST be present |
46
+ | `status`, `since`, `witness` | MUST be present |
36
47
  | `until` | REQUIRED when `status` is `experimental` or `deprecated`; MUST NOT be present when `stable` |
37
- | `until` in the past | non-conformant; a validator MUST answer `400` `until_in_past` |
38
- | `witness` | MUST be one of the five wire-legal classes; `unwitnessable` MUST NOT appear on a wire record — such a family lives in `spec/v2/ext/` and is not advertised |
39
- | `supported` | does not exist; presence of the record is the claim, and a host that does not support a family MUST omit it |
40
- | facets | the named per-family fields; a facet is advertised by the presence of its key, and a host MUST omit the key for a facet it does not offer, except where the facet's own schema states a meaning for its absence; `aiProviders.providers[]` carries the v1 `supported` list |
48
+ | `until` in the past | Non-conformant; a validator MUST answer `400` `until_in_past` |
49
+ | `witness` | MUST be one of the five wire-legal classes |
50
+ | `supported` | Not a field: the record's presence is the claim, and a host that does not support a family MUST omit it |
51
+ | facets | A facet is advertised by the presence of its key; a host MUST omit the key for a facet it does not offer, except where the facet's own schema states a meaning for its absence |
52
+
53
+ `unwitnessable` MUST NOT appear on a wire record; such a family lives in `spec/v2/ext/` and is not advertised.
41
54
 
42
- `until` absorbs v1 `tier` / `experimentalUntil`. A family's facets are hand-decided where `spec/v2/facets/<key>.schema.json` exists and otherwise generated from the declaration row.
55
+ A family's facets are hand-decided where `spec/v2/facets/<key>.schema.json` exists, and otherwise generated from the declaration row.
43
56
 
44
- ## 3. The closed root (RFC 0169 §A.1a, §A.4)
57
+ ## 3. The closed root
45
58
 
46
- The root of `schemas/v2/capabilities.schema.json` is `additionalProperties: false`; `protocolVersions` and `preferredVersion` are REQUIRED. Every root key is one of: a metadata key (§3.1), a core family (§5), an `ext/` family (§6), or `extensions` (§3.2). Any other key MUST fail validation: no dotted key, no wrapper, no mirror, no root `profiles[]`.
59
+ The root of `schemas/v2/capabilities.schema.json` is `additionalProperties: false`, and `protocolVersions` and `preferredVersion` are REQUIRED. Every root key is one of:
47
60
 
48
- ### 3.1 Metadata keys (17)
61
+ - a metadata key (§3.1);
62
+ - a core family (§5);
63
+ - an `ext/` family (§6);
64
+ - `extensions` (§3.2).
49
65
 
50
- `protocolVersion`, `protocolVersions`, `preferredVersion`, `extensions`, `implementation`, `engineVersion`, `eventLogSchemaVersion`, `configurable`, `observability`, `minClientVersion`, `runtimeCapabilities`, `testing`, `conformance`, `fixtures`, `compliance`, `discovery`, and `supportedTransports`. Each is declared as metadata with its own schema in `spec/v2/declaration.json`; a metadata key is not a record and carries no `status` or `witness`. `supportedTransports` is declared only to record its deletion (§4). Version-axis metadata are specified in `versioning.md`; `configurable` in `runs.md`. `implementation` (`name`, `version`, `vendor`, `url`) is self-reported: a client SHOULD NOT change behaviour because of it or authorize from it.
66
+ Any other key MUST fail validation: no dotted key, no wrapper, no mirror, no root `profiles[]`.
67
+
68
+ ### 3.1 Metadata keys (18)
69
+
70
+ `protocolVersion`, `protocolVersions`, `preferredVersion`, `extensions`, `implementation`, `engineVersion`, `eventLogSchemaVersion`, `configurable`, `observability`, `minClientVersion`, `runtimeCapabilities`, `testing`, `conformance`, `fixtures`, `compliance`, `signingKeys`, `discovery`, and `supportedTransports`.
71
+
72
+ - Each is declared as metadata, with its own schema, in `spec/v2/declaration.json`. A metadata key is not a record and carries no `status` or `witness`.
73
+ - `supportedTransports` is declared only to record its deletion (§4).
74
+ - The version-axis keys are specified in [`versioning.md`](versioning.md); `configurable` in [`runs.md`](runs.md); `signingKeys` in [`conformance.md`](conformance.md).
75
+ - `implementation` (`name`, `version`, `vendor`, `url`) is self-reported: a client SHOULD NOT change behaviour because of it or authorize from it.
51
76
 
52
77
  ### 3.2 `extensions.<org>.<name>`
53
78
 
54
- Vendor and host extensions live under one key, `extensions`, whose members MUST match `^[a-z][a-z0-9]*(-[a-z0-9]+)*\.[a-z][a-z0-9]*(-[a-z0-9]+)*$` (short-form `<org>.<name>`). The orgs in `spec/v2/declaration.json` `reservedOrgs` — `openwop`, `vendor`, `effect-seams` and `events` — are reserved: a host MUST NOT use any of them. An extension record's shape is the org's own (`additionalProperties: true` inside the record). The 11 v1 extension-class `host.*` families (§6) are advertised as `extensions.openwop-app.*` by the host that serves them. A change to an extension that would break an existing reader MUST ship under a new key; a host MUST NOT read one key's record as another's (A2A §4.6.3).
79
+ Vendor and host extensions live under one key, `extensions`. Its members MUST match `^[a-z][a-z0-9]*(-[a-z0-9]+)*\.[a-z][a-z0-9]*(-[a-z0-9]+)*$` (short form `<org>.<name>`).
80
+
81
+ - The orgs in `spec/v2/declaration.json` `reservedOrgs` — `openwop`, `vendor`, `effect-seams` and `events` — are reserved: a host MUST NOT use any of them.
82
+ - An extension record's shape is the org's own (`additionalProperties: true` inside the record).
83
+ - An extension family of §6 is advertised as `extensions["<org>.<extensionName>"]`, where `extensionName` is the kebab-case name its declaration row carries (for example `rest-transport`). The family key itself MUST NOT appear at the root.
84
+ - A change to an extension that would break an existing reader MUST ship under a new key.
85
+ - A host MUST NOT read one key's record as another's (A2A §4.6.3).
86
+
87
+ ## 4. Deleted keys
55
88
 
56
- ## 4. Deleted keys (RFC 0169 §A.5, §B.3; RFC 0175)
89
+ These keys are not part of the v2 root:
57
90
 
58
91
  | Key | Why |
59
92
  | --- | --- |
60
- | `contractProvenance` | an advisory self-declaration the wire cannot falsify (RFC 0169 §A.5) |
61
- | `supportedTransports` | REST is the wire (interop.md; RFC 0175 §B.1) |
62
- | `grpc` | unwitnessable, so not advertisable (interop.md §gRPC; RFC 0175 §A.1) |
63
- | `Capabilities-Etag`, `auth.subjectLinking`, `replay.fork`, bare `a2a.supported` / `mcp.supported`, the `openwop-core` alias | absent from the v2 root; rows `C2.1`–`C2.10` in `spec/v1/migrations.json` carry each with its codemod |
64
- | `host.media`, `host.collaboration` | reserved slots are unrepresentable under a closed root; `host.workspace` is the declared family `workspace` |
93
+ | `contractProvenance` | An advisory self-declaration the wire cannot falsify |
94
+ | `supportedTransports` | REST is the wire ([`interop.md`](interop.md)) |
95
+ | `grpc` | Unwitnessable, so not advertisable ([`interop.md`](interop.md) §gRPC) |
96
+ | `Capabilities-Etag`, `auth.subjectLinking`, `replay.fork`, bare `a2a.supported` / `mcp.supported`, the `openwop-core` alias | Rows `C2.1`–`C2.10` in `spec/v1/migrations.json` give each its codemod |
97
+ | `host.media`, `host.collaboration` | A closed root cannot represent reserved slots |
65
98
 
66
- `minimumSuiteVersion` is retired into the declaration file (`versioning.md` axis 9).
99
+ `host.workspace` is the declared family `workspace`. `minimumSuiteVersion` lives in the declaration file ([`versioning.md`](versioning.md) axis 9).
67
100
 
68
- ## 4.1 The declaration file (RFC 0169 §B)
101
+ ## 4.1 The declaration file
69
102
 
70
- `spec/v2/declaration.json` (schema `spec/v2/declaration.schema.json`) is the single source for: the generated `schemas/v2/capabilities.schema.json`; each family's `witness` class and maturity; the pack peer-dependency identifier (identical to the root key); the spec anchor (`core/capabilities.md#<key>` or `ext/<key>/`); the floor scenarios and requirement ids that define `openwop-core-standard`; and the profile predicates (§7). It replaces `extensions.json`, `core-standard-manifest.json`, `capability-declaration-classes.json`, and the capabilities half of `operation-path-manifest.json` (the operations half is `spec/v2/path-manifest.json`, `versioning.md`). It is generated from nothing and checked against everything (`scripts/check-declaration.mjs`).
103
+ `spec/v2/declaration.json` (schema `spec/v2/declaration.schema.json`) is the single source for:
104
+
105
+ - the generated `schemas/v2/capabilities.schema.json`;
106
+ - each family's `witness` class and maturity;
107
+ - the pack peer-dependency identifier, identical to the root key;
108
+ - the spec anchor (`core/capabilities.md#<key>` or `ext/<key>/`);
109
+ - the floor scenarios and requirement ids that define `openwop-core-standard`;
110
+ - the profile predicates (§7).
111
+
112
+ Operation paths live in `spec/v2/path-manifest.json` ([`versioning.md`](versioning.md)). The declaration is generated from nothing and checked against everything (`scripts/check-declaration.mjs`).
71
113
 
72
114
  ## 5. Core families (72)
73
115
 
74
- Each heading is a `spec/v2/declaration.json` row with `anchor: core`; `scripts/check-declaration.mjs` MUST fail when a heading here, a root key in the generated schema, or a pack peer-dependency identifier names a family the declaration does not. The peer-dependency identifier is identical to the key (`packs.md`). Maturity axes are §7; the sentence under each heading names the witness class, the owning RFC, and, where `spec/v2/facets/<key>.schema.json` exists, the hand-decided facets.
116
+ Each heading below is a `spec/v2/declaration.json` row with `anchor: core`. `scripts/check-declaration.mjs` MUST fail when a heading here, a root key in the generated schema, or a pack peer-dependency identifier names a family the declaration does not. The peer-dependency identifier is identical to the key ([`packs.md`](packs.md)).
117
+
118
+ Under each heading: the family's witness class and, where `spec/v2/facets/<key>.schema.json` exists, its hand-decided facets. Maturity axes are §8; the owning RFC is the row's `owningRfc`.
75
119
 
76
120
  ### § supportedEnvelopes
77
121
 
78
- Witness `witnessable-gated`; owner RFC 0193; facets `kinds`.
122
+ Witness `witnessable-gated`. Facets: `kinds`.
79
123
 
80
124
  ### § schemaVersions
81
125
 
82
- Witness `witnessable-gated`; owner RFC 0193; facets `kinds`.
126
+ Witness `witnessable-gated`. Facets: `kinds`.
83
127
 
84
128
  ### § limits
85
129
 
86
- Witness `witnessable-gated`; owner no owning RFC (declaration row).
130
+ Witness `witnessable-gated`.
87
131
 
88
132
  ### § envelopeStrictness
89
133
 
90
- Witness `claims-check`; owner RFC 0193; facets `mode`.
134
+ Witness `claims-check`. Facets: `mode`.
91
135
 
92
136
  ### § envelopeContracts
93
137
 
94
- Witness `claims-check`; owner no owning RFC (declaration row).
138
+ Witness `claims-check`.
95
139
 
96
140
  ### § envelopes
97
141
 
98
- Witness `claims-check`; owner RFC 0030.
142
+ Witness `claims-check`.
99
143
 
100
144
  ### § prompts
101
145
 
102
- Witness `witnessable-gated`; owner RFC 0027.
146
+ Witness `witnessable-gated`.
103
147
 
104
148
  ### § nodePackRuntimes
105
149
 
106
- Witness `claims-check`; owner RFC 0008.
150
+ Witness `claims-check`.
107
151
 
108
152
  ### § secrets
109
153
 
110
- Witness `witnessable-gated`; owner no owning RFC (declaration row).
154
+ Witness `witnessable-gated`.
111
155
 
112
156
  ### § connections
113
157
 
114
- Witness `witnessable-gated`; owner RFC 0095.
158
+ Witness `witnessable-gated`.
115
159
 
116
160
  ### § selfHostedRunner
117
161
 
118
- Witness `witnessable-gated`; owner RFC 0122.
162
+ Witness `witnessable-gated`.
119
163
 
120
164
  ### § purposePropagation
121
165
 
122
- Witness `witnessable-gated`; owner RFC 0128.
166
+ Witness `witnessable-gated`.
123
167
 
124
168
  ### § dataResidency
125
169
 
126
- Witness `witnessable-gated`; owner RFC 0129.
170
+ Witness `witnessable-gated`.
127
171
 
128
172
  ### § anonymousActor
129
173
 
130
- Witness `seam-gated`; owner RFC 0132.
174
+ Witness `seam-gated`.
131
175
 
132
176
  ### § credentials
133
177
 
134
- Witness `witnessable-gated`; owner RFC 0046.
178
+ Witness `witnessable-gated`.
135
179
 
136
180
  ### § feedback
137
181
 
138
- Witness `witnessable-gated`; owner RFC 0056.
182
+ Witness `witnessable-gated`.
139
183
 
140
184
  ### § replay
141
185
 
142
- Witness `witnessable-gated`; owner RFC 0140; facets `modes`, `retention`, `effectSeamsManifest`.
186
+ Witness `witnessable-gated`. Facets: `modes`, `retention`, `effectSeamsManifest`.
143
187
 
144
188
  ### § oauth
145
189
 
146
- Witness `witnessable-gated`; owner RFC 0047.
190
+ Witness `witnessable-gated`.
147
191
 
148
192
  ### § authorization
149
193
 
150
- Witness `witnessable-gated`; owner RFC 0049.
194
+ Witness `witnessable-gated`.
151
195
 
152
196
  ### § multiPartyConversation
153
197
 
154
- Witness `witnessable-gated`; owner RFC 0101.
198
+ Witness `witnessable-gated`.
155
199
 
156
200
  ### § conversationTurnModelProvenance
157
201
 
158
- Witness `witnessable-gated`; owner RFC 0109.
202
+ Witness `witnessable-gated`.
159
203
 
160
204
  ### § channelPresence
161
205
 
162
- Witness `witnessable-gated`; owner RFC 0110.
206
+ Witness `witnessable-gated`.
163
207
 
164
208
  ### § multiAgent
165
209
 
166
- Witness `claims-check`; owner RFC 0037.
210
+ Witness `claims-check`.
167
211
 
168
212
  ### § modelCapabilities
169
213
 
170
- Witness `witnessable-gated`; owner RFC 0031.
214
+ Witness `witnessable-gated`.
171
215
 
172
216
  ### § providerUsage
173
217
 
174
- Witness `witnessable-gated`; owner RFC 0026.
218
+ Witness `witnessable-gated`.
175
219
 
176
220
  ### § aiProviders
177
221
 
178
- Witness `witnessable-gated`; owner no owning RFC (declaration row); facets `providers`, `byok`, `selfHosted`, `speechSynthesis`, `imageGeneration`, `videoGeneration`, `realtimeVoice`, `promptPrefixCache`, `maxInlineMediaBytes`, `authModes`, `policies`, `input`.
222
+ Witness `witnessable-gated`. Facets: `providers`, `byok`, `selfHosted`, `speechSynthesis`, `imageGeneration`, `videoGeneration`, `realtimeVoice`, `promptPrefixCache`, `maxInlineMediaBytes`, `authModes`, `policies`, `input`.
179
223
 
180
224
  ### § agents
181
225
 
182
- Witness `witnessable-gated`; owner RFC 0002.
226
+ Witness `witnessable-gated`.
183
227
 
184
228
  ### § memory
185
229
 
186
- Witness `witnessable-gated`; owner RFC 0004.
230
+ Witness `witnessable-gated`.
187
231
 
188
232
  ### § conversationPrimitive
189
233
 
190
- Witness `claims-check`; owner RFC 0005.
234
+ Witness `claims-check`.
191
235
 
192
236
  ### § subWorkflow
193
237
 
194
- Witness `claims-check`; owner RFC 0007.
238
+ Witness `claims-check`.
195
239
 
196
240
  ### § fs
197
241
 
198
- Witness `witnessable-gated`; owner RFC 0014.
242
+ Witness `witnessable-gated`.
199
243
 
200
244
  ### § kvStorage
201
245
 
202
- Witness `witnessable-gated`; owner RFC 0015.
246
+ Witness `witnessable-gated`.
203
247
 
204
248
  ### § tableStorage
205
249
 
206
- Witness `witnessable-gated`; owner RFC 0016.
250
+ Witness `witnessable-gated`.
207
251
 
208
252
  ### § queueBus
209
253
 
210
- Witness `witnessable-gated`; owner RFC 0017.
254
+ Witness `witnessable-gated`.
211
255
 
212
256
  ### § scheduling
213
257
 
214
- Witness `witnessable-gated`; owner RFC 0052.
258
+ Witness `witnessable-gated`.
215
259
 
216
260
  ### § heartbeat
217
261
 
218
- Witness `witnessable-gated`; owner RFC 0060; facets `minIntervalSec`, `maxRuntimeMs`, `deliveryChannel`.
262
+ Witness `witnessable-gated`. Facets: `minIntervalSec`, `maxRuntimeMs`, `deliveryChannel`.
219
263
 
220
264
  ### § toolHooks
221
265
 
222
- Witness `witnessable-gated`; owner RFC 0064.
266
+ Witness `witnessable-gated`.
223
267
 
224
268
  ### § toolCatalog
225
269
 
226
- Witness `witnessable-gated`; owner RFC 0078.
270
+ Witness `witnessable-gated`.
227
271
 
228
272
  ### § httpClient
229
273
 
230
- Witness `witnessable-gated`; owner RFC 0076.
274
+ Witness `witnessable-gated`.
231
275
 
232
276
  ### § artifactTypes
233
277
 
234
- Witness `witnessable-gated`; owner RFC 0071.
278
+ Witness `witnessable-gated`.
235
279
 
236
280
  ### § forms
237
281
 
238
- Witness `claims-check`; owner RFC 0137.
282
+ Witness `claims-check`.
239
283
 
240
284
  ### § aiEnvelope
241
285
 
242
- Witness `witnessable-gated`; owner RFC 0144.
286
+ Witness `witnessable-gated`.
243
287
 
244
288
  ### § promptLibrary
245
289
 
246
- Witness `claims-check`; owner RFC 0144.
290
+ Witness `claims-check`.
247
291
 
248
292
  ### § agentRuntime
249
293
 
250
- Witness `claims-check`; owner RFC 0144.
294
+ Witness `claims-check`.
251
295
 
252
296
  ### § deadLetter
253
297
 
254
- Witness `witnessable-gated`; owner RFC 0053.
298
+ Witness `witnessable-gated`.
255
299
 
256
300
  ### § webhooks
257
301
 
258
- Witness `witnessable-gated`; owner RFC 0188; facets `deadLetter`, `retryPolicy`, `secretRotation`, `signatureAlgorithms`.
302
+ Witness `witnessable-gated`. Facets: `deadLetter`, `retryPolicy`, `secretRotation`, `signatureAlgorithms`.
259
303
 
260
304
  ### § triggerBridge
261
305
 
262
- Witness `witnessable-gated`; owner RFC 0083.
306
+ Witness `witnessable-gated`.
263
307
 
264
308
  ### § a2a
265
309
 
266
- Witness `seam-gated`; owner RFC 0152; facets `versions`, `preferredVersion`, `minimumVersion`, `refreshedAt`, `profiles`, `agentCardUrl`, `streaming`, `pushNotifications`, `durableTasks`.
310
+ Witness `seam-gated`. Facets: `versions`, `preferredVersion`, `minimumVersion`, `refreshedAt`, `profiles`, `agentCardUrl`, `streaming`, `pushNotifications`, `durableTasks`, `agentCards`.
311
+
312
+ A facet MAY name a URL on another origin; that is a claim about the facet, not the origin. `agentCardUrl` (and `mcp.serverUrls[]`) are `format: uri` with no origin constraint.
313
+
314
+ - The advertiser knows where the card is, not that the named origin serves `/.well-known/openwop` or speaks any major.
315
+ - The suite exercises the advertiser only, and certification is per origin.
267
316
 
268
- **A facet MAY name a URL on another origin; that is a claim about the facet, not the origin.** `agentCardUrl` (and `mcp.serverUrls[]`) are `format: uri` with no origin constraint: the advertiser knows where the card is, not that the named origin serves `/.well-known/openwop` or speaks any major; the suite exercises the advertiser only, and certification is per origin. Open gap: whether a facet naming an origin that does not answer SHOULD be withdrawn, and how a client learns that origin's major.
317
+ Open gap: whether a facet naming an origin that does not answer SHOULD be withdrawn, and how a client learns that origin's major.
269
318
 
270
319
  ### § budget
271
320
 
272
- Witness `witnessable-gated`; owner RFC 0084.
321
+ Witness `witnessable-gated`.
273
322
 
274
323
  ### § nondeterminismPolicy
275
324
 
276
- Witness `claims-check`; owner RFC 0085.
325
+ Witness `claims-check`.
277
326
 
278
327
  ### § workspace
279
328
 
280
- Witness `witnessable-gated`; owner RFC 0059.
329
+ Witness `witnessable-gated`.
281
330
 
282
331
  ### § uiPlugins
283
332
 
284
- Witness `witnessable-gated`; owner RFC 0117.
333
+ Witness `witnessable-gated`.
285
334
 
286
335
  ### § sql
287
336
 
288
- Witness `witnessable-gated`; owner RFC 0018.
337
+ Witness `witnessable-gated`.
289
338
 
290
339
  ### § nosql
291
340
 
292
- Witness `claims-check`; owner RFC 0018.
341
+ Witness `claims-check`.
293
342
 
294
343
  ### § vectorStore
295
344
 
296
- Witness `witnessable-gated`; owner RFC 0018.
345
+ Witness `witnessable-gated`.
297
346
 
298
347
  ### § searchIndex
299
348
 
300
- Witness `witnessable-gated`; owner RFC 0018.
349
+ Witness `witnessable-gated`.
301
350
 
302
351
  ### § blobStorage
303
352
 
304
- Witness `witnessable-gated`; owner RFC 0019.
353
+ Witness `witnessable-gated`.
305
354
 
306
355
  ### § cache
307
356
 
308
- Witness `witnessable-gated`; owner RFC 0019.
357
+ Witness `witnessable-gated`.
309
358
 
310
359
  ### § workflowChainPacks
311
360
 
312
- Witness `witnessable-gated`; owner RFC 0013; facets `subChains`.
361
+ Witness `witnessable-gated`. Facets: `subChains`.
313
362
 
314
363
  ### § packs
315
364
 
316
- Witness `claims-check`; owner RFC 0025; facets `testMode`.
365
+ Witness `claims-check`. Facets: `testMode`.
317
366
 
318
367
  ### § mcp
319
368
 
320
- Witness `seam-gated`; owner RFC 0153; facets `revisions`, `preferredVersion`, `minimumRevision`, `refreshedAt`, `profiles`, `features`, `serverUrls`, `serverMount`, `mrtr`.
369
+ Witness `seam-gated`. Facets: `revisions`, `preferredVersion`, `minimumRevision`, `refreshedAt`, `profiles`, `features`, `serverUrls`, `serverMount`, `mrtr`, `client`.
321
370
 
322
- `serverUrls[]` MAY name other origins; § a2a's off-origin paragraph applies.
371
+ `serverUrls[]` MAY name other origins; the off-origin rule under § a2a applies.
323
372
 
324
373
  ### § sandbox
325
374
 
326
- Witness `witnessable-gated`; owner RFC 0035; facets `isolationModel`, `allowedHostCalls`, `memoryLimitBytes`, `wallClockLimitMs`.
375
+ Witness `witnessable-gated`. Facets: `isolationModel`, `allowedHostCalls`, `memoryLimitBytes`, `wallClockLimitMs`.
327
376
 
328
377
  ### § compensation
329
378
 
330
- Witness `seam-gated`; owner RFC 0151.
379
+ Witness `seam-gated`.
331
380
 
332
381
  ### § idempotency
333
382
 
334
- Witness `witnessable-gated`; owner RFC 0150.
383
+ Witness `witnessable-gated`.
335
384
 
336
385
  ### § eventLog
337
386
 
338
- Witness `claims-check`; owner RFC 0036.
387
+ Witness `claims-check`.
339
388
 
340
389
  ### § production
341
390
 
342
- Witness `witnessable-gated`; owner RFC 0009.
391
+ Witness `witnessable-gated`.
343
392
 
344
393
  ### § auth
345
394
 
346
- Witness `seam-gated`; owner RFC 0154; facets `lanes`, `subjectLinkKey`.
395
+ Witness `seam-gated`. Facets: `lanes`, `subjectLinkKey`.
347
396
 
348
397
  ### § i18n
349
398
 
350
- Witness `witnessable-gated`; owner no owning RFC (declaration row).
399
+ Witness `witnessable-gated`.
351
400
 
352
401
  ### § content
353
402
 
354
- Witness `witnessable-gated`; owner RFC 0103.
403
+ Witness `witnessable-gated`.
355
404
 
356
405
  ### § portability
357
406
 
358
- Witness `witnessable-gated`; owner RFC 0098.
407
+ Witness `witnessable-gated`.
359
408
 
360
409
  ### § interrupt
361
410
 
362
- Witness `witnessable-gated`; owner RFC 0104; facets `refKinds`, `tokenAlgs`, `callbackDelivery` (RFC 0196).
411
+ Witness `witnessable-gated`. Facets: `refKinds`, `tokenAlgs`, `callbackDelivery`.
363
412
 
364
413
  ### § runList
365
414
 
366
- Witness `witnessable-gated`; owner RFC 0182; facets `maxPageSize`, `filters` (runs.md §List).
415
+ Witness `witnessable-gated`. Facets: `maxPageSize`, `filters` ([runs.md](runs.md) §List).
416
+
367
417
 
368
418
  ## 6. Extension families (13)
369
419
 
370
- Rows with `anchor: ext` are documented under `spec/v2/ext/<key>/` and each document MUST declare `witness` and both maturity axes in its header (`overview.md`): `restTransport`, `a2uiSurface`, `brand`, `canvas`, `chat`, `coordination`, `dataIntegration`, `entities`, `kanban`, `knowledge`, `launchStudio`, `messaging`, `webResearch`. `restTransport` and `a2uiSurface` (`witness: claims-check`) stay in `ext/` unless a behavioral witness lands (RFC 0169 §C.5); the other 11 are the RFC 0144 extension-class families advertised as `extensions.openwop-app.<name>` (§3.2).
420
+ Rows with `anchor: ext` are documented under `spec/v2/ext/<key>/`. Each document MUST declare `witness` and both maturity axes in its header ([`overview.md`](overview.md)). The families are `restTransport`, `a2uiSurface`, `brand`, `canvas`, `chat`, `coordination`, `dataIntegration`, `entities`, `kanban`, `knowledge`, `launchStudio`, `messaging`, `webResearch`.
421
+
422
+ - Each is advertised under `extensions` (§3.2), never at the root. `a2uiSurface` is the exception: its contract is admitted through `schemaVersions.kinds`, and only its deprecated facet is an `extensions` record.
423
+ - `restTransport` (`witnessable-gated`) and `a2uiSurface` (`seam-gated`) have behavioral witnesses. The other 11 are discovery-only reservations checked by `claims-check`.
424
+ - An ext document's `Draft`/`Stable` label is a predicate over certified evidence ([`../ext/README.md`](../ext/README.md)). Becoming core takes its own RFC.
371
425
 
372
- ## 7. Profiles (RFC 0169 §C.1, §C.3)
426
+ ## 7. Profiles
373
427
 
374
- A profile is a predicate over the declaration file, published in `spec/v2/profiles.json` (generated): every listed family present as a record and every listed metadata key present. No `profiles[]` exists at the v2 root; a host that emits one MUST fail schema validation (§3). `auth.profiles`, `a2a.profiles`, and `mcp.profiles` are replaced by the facets `auth.lanes[]` (`identity.md`), `a2a.versions[]` and `mcp.revisions[]` (`interop.md`).
428
+ A profile is a predicate over the declaration file, published in `spec/v2/profiles.json` (generated): every listed family is present as a record, and every listed metadata key is present.
375
429
 
376
430
  | Profile | Predicate |
377
431
  | --- | --- |
378
- | `openwop-discovery-core` | metadata `protocolVersions`, `preferredVersion` |
379
- | `openwop-core-standard` | families `interrupt`, `replay`, `webhooks`, `idempotency`, `eventLog` plus the 2.0.0 floor scenarios and requirement ids the declaration names |
380
- | `openwop-conformance-seams-v2` | the seams profile (`conformance.md`); forbidden from the capability namespace |
432
+ | `openwop-discovery-core` | Metadata `protocolVersions`, `preferredVersion` |
433
+ | `openwop-core-standard` | Families `interrupt`, `replay`, `webhooks`, `idempotency`, `eventLog`, plus the 2.0.0 floor scenarios and requirement ids the declaration names |
434
+ | `openwop-conformance-seams-v2` | The seams profile ([`conformance.md`](conformance.md)); forbidden from the capability namespace |
381
435
 
382
- The `openwop-core` alias is deleted (row `C2.3`); the canonical discovery-only id is `openwop-discovery-core`. The claim vocabulary is `overview.md`. The invariant `profile-claim-floor-not-overstated` is registered in `SECURITY/invariants.yaml` with its test.
436
+ - The v2 root has no `profiles[]`; a host that emits one MUST fail schema validation (§3).
437
+ - The facet `auth.lanes[]` ([`identity.md`](identity.md)) replaces `auth.profiles`.
438
+ - `a2a.profiles[]` and `mcp.profiles[]` are facets that admit no `-legacy` id; the offered versions are `a2a.versions[]` and `mcp.revisions[]` ([`interop.md`](interop.md)).
439
+ - The discovery-only id is `openwop-discovery-core`; the `openwop-core` alias is deleted (row `C2.3`).
440
+ - The claim vocabulary is in [`overview.md`](overview.md). The invariant `profile-claim-floor-not-overstated` is registered in `SECURITY/invariants.yaml` with its test.
383
441
 
384
- ## 8. Maturity axes (RFC 0169 §C.2)
442
+ ## 8. Maturity axes
385
443
 
386
444
  | Axis | Values | Source |
387
445
  | --- | --- | --- |
388
- | `technical` | `experimental \| stable \| deprecated` | the record's `status`, which MUST NOT exceed the declaration row (RFC 0197) |
389
- | `adoption` | `none \| single-witness \| multi-witness \| independent` | derived from INTEROP-MATRIX bundle evidence |
446
+ | `technical` | `experimental \| stable \| deprecated` | The record's `status`, which MUST NOT exceed the declaration row |
447
+ | `adoption` | `none \| single-witness \| multi-witness \| independent` | Derived from INTEROP-MATRIX bundle evidence |
448
+
449
+ - `stable` does not require a tier-3 host; `independent` records whether one exists.
450
+ - There is no cap on the number of families: a family MAY exist at any count if it declares its witness class.
451
+ - `memory.injectionBudget`, `toolCatalog.compactView`, and `aiProviders.promptPrefixCache` keep their families with `adoption: single-witness`.
452
+
453
+ ## 9. Externally-gated
454
+
455
+ `externally-gated` is the disposition for a surface held on grounds that are neither technical nor adoption, such as a legal citation or a non-steward host tripwire.
390
456
 
391
- `stable` does not require a tier-3 host; `independent` records whether one exists. The RFC 0155 numeric extension budget is repealed: a family MAY exist at any count if it declares its witness class. At the cut, `memory.injectionBudget`, `toolCatalog.compactView`, and `aiProviders.promptPrefixCache` keep their families with `adoption: single-witness` (RFC 0169 §C.5).
457
+ - An externally-gated family MAY be declared with `status: experimental` and an `until` equal to the tripwire review date, or omitted.
458
+ - It MUST NOT be `stable` (`externally-gated-never-stable`).
392
459
 
393
- ## 9. Externally-gated (RFC 0169 §C.4)
460
+ `sandbox` is externally gated.
394
461
 
395
- `externally-gated` is the disposition for a surface held on grounds that are neither technical nor adoption (a legal citation, RFC 0121; a non-steward host tripwire, RFC 0035). An externally-gated family MAY be declared with `status: experimental` and an `until` equal to the tripwire review date, or omitted; it MUST NOT be `stable` (`externally-gated-never-stable`, a corpus gate). `sandbox` is the first row.
462
+ ## 10. Migration rows
396
463
 
397
- ## 10. Migration rows (RFC 0169)
464
+ Rows `C2.1`–`C2.10` are `spec/v1/migrations.json` entries. `openwop.codemod.discovery-document-v2` transforms `C2.2`–`C2.8`: it drops a family with `supported: false` and promotes a dotted-only declared family to its plain key. Certification bundles naming `openwop-core` are never upgraded; they remain valid v1 evidence at their version.
398
465
 
399
- Rows `C2.1`–`C2.10` are `spec/v1/migrations.json` entries. `C2.2`–`C2.8` are transformed by `openwop.codemod.discovery-document-v2`; a family with `supported: false` is dropped, and a dotted-only declared family is promoted to its plain key. Certification bundles naming `openwop-core` are never-upgraded and remain valid v1 evidence at their version.
466
+ *Sources: RFC 0144, RFC 0169, RFC 0175, RFC 0176, RFC 0179, RFC 0197. Each family's owning RFC is its `owningRfc` in [`declaration.json`](../declaration.json).*