@openwop/spec-artifacts 2.42.6 → 2.42.8

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 (69) hide show
  1. package/CORPUS-STAMP.json +70 -67
  2. package/api/seams-v2.yaml +238 -322
  3. package/api/v2/asyncapi.yaml +83 -113
  4. package/api/v2/openapi.yaml +408 -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 +4 -7
  9. package/schemas/v2/error-envelope.schema.json +144 -69
  10. package/spec/v1/alias-detectors.json +6 -0
  11. package/spec/v1/core-standard-manifest.json +2 -2
  12. package/spec/v1/deprecations.json +22 -0
  13. package/spec/v1/gaps.json +188 -1
  14. package/spec/v1/migrations.json +18 -0
  15. package/spec/v2/README.md +35 -37
  16. package/spec/v2/core/capabilities.md +186 -119
  17. package/spec/v2/core/conformance.md +78 -27
  18. package/spec/v2/core/connection-packs.md +8 -3
  19. package/spec/v2/core/conversation.md +10 -4
  20. package/spec/v2/core/errors.md +30 -9
  21. package/spec/v2/core/events.md +116 -80
  22. package/spec/v2/core/form-content-packs.md +11 -13
  23. package/spec/v2/core/headers.md +23 -14
  24. package/spec/v2/core/host-services.md +22 -5
  25. package/spec/v2/core/i18n.md +64 -0
  26. package/spec/v2/core/idempotency.md +48 -36
  27. package/spec/v2/core/identity.md +110 -42
  28. package/spec/v2/core/interop.md +82 -21
  29. package/spec/v2/core/interrupt.md +79 -40
  30. package/spec/v2/core/node-pack-runtimes.md +18 -4
  31. package/spec/v2/core/oauth.md +40 -6
  32. package/spec/v2/core/overview.md +61 -33
  33. package/spec/v2/core/packs.md +53 -28
  34. package/spec/v2/core/persistence.md +61 -80
  35. package/spec/v2/core/portability.md +44 -0
  36. package/spec/v2/core/replay.md +56 -42
  37. package/spec/v2/core/runs.md +198 -60
  38. package/spec/v2/core/security-defaults.md +57 -33
  39. package/spec/v2/core/tool-catalog.md +29 -6
  40. package/spec/v2/core/versioning.md +115 -50
  41. package/spec/v2/core/webhooks.md +61 -20
  42. package/spec/v2/core/workflow-chain-packs.md +16 -14
  43. package/spec/v2/corrections.json +17 -1
  44. package/spec/v2/corrections.schema.json +1 -1
  45. package/spec/v2/declaration.json +26 -9
  46. package/spec/v2/declaration.schema.json +10 -0
  47. package/spec/v2/errors.json +121 -4
  48. package/spec/v2/errors.schema.json +38 -0
  49. package/spec/v2/ext/README.md +36 -23
  50. package/spec/v2/ext/a2uiSurface/README.md +75 -89
  51. package/spec/v2/ext/brand/README.md +15 -15
  52. package/spec/v2/ext/canvas/README.md +15 -15
  53. package/spec/v2/ext/chat/README.md +15 -15
  54. package/spec/v2/ext/coordination/README.md +15 -15
  55. package/spec/v2/ext/dataIntegration/README.md +17 -20
  56. package/spec/v2/ext/entities/README.md +15 -15
  57. package/spec/v2/ext/grpc-transport/README.md +6 -8
  58. package/spec/v2/ext/kanban/README.md +15 -15
  59. package/spec/v2/ext/knowledge/README.md +15 -15
  60. package/spec/v2/ext/launchStudio/README.md +16 -16
  61. package/spec/v2/ext/messaging/README.md +15 -15
  62. package/spec/v2/ext/portability/README.md +3 -17
  63. package/spec/v2/ext/provider-idempotency/README.md +7 -10
  64. package/spec/v2/ext/restTransport/README.md +30 -19
  65. package/spec/v2/ext/sandbox-runtime-notes/README.md +7 -9
  66. package/spec/v2/ext/webResearch/README.md +16 -16
  67. package/spec/v2/profiles.json +6 -2
  68. package/spec/v2/release.json +2 -2
  69. package/spec/v2/surface-baseline.json +544 -2
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/errors.schema.json",
4
+ "title": "OpenWOP v2 error registry",
5
+ "description": "Shape of spec/v2/errors.json: one row per registered error code. schemas/v2/error-envelope.schema.json and the status table in spec/v2/core/errors.md are generated from it by scripts/generate-error-envelope.mjs, which also validates the registry against this schema. Data, not a wire artifact.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["$schema", "version", "updated", "vendorCodePattern", "rows"],
9
+ "properties": {
10
+ "$schema": { "type": "string", "const": "https://openwop.dev/spec/v2/errors.schema.json" },
11
+ "$comment": { "type": "string" },
12
+ "version": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+$", "description": "The registry format version." },
13
+ "updated": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
14
+ "vendorCodePattern": { "type": "string", "format": "regex", "description": "The pattern a vendor (non-registered) code MUST match." },
15
+ "rows": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/row" } }
16
+ },
17
+ "$defs": {
18
+ "row": {
19
+ "type": "object",
20
+ "additionalProperties": false,
21
+ "required": ["code", "httpStatus", "statusSource", "retriable", "details", "since", "source"],
22
+ "properties": {
23
+ "code": { "type": "string", "pattern": "^[a-z][a-z0-9]*(_[a-z0-9]+)*$", "description": "The value of the envelope's `error` field. Unique across rows." },
24
+ "meaning": { "type": "string", "minLength": 1, "description": "One plain-English line: what the code tells a client." },
25
+ "httpStatus": { "type": "integer", "minimum": 400, "maximum": 599, "description": "The status a host MUST answer with." },
26
+ "statusSource": { "type": "string", "minLength": 1, "description": "Provenance of the status: stated in v1 prose, a v1 convention, or decided for v2." },
27
+ "retriable": { "type": "boolean", "description": "Whether a client may retry the same request. Timing lives in Retry-After only." },
28
+ "details": {
29
+ "type": ["object", "null"],
30
+ "description": "The JSON Schema for this code's `details` object, or null when details is an open object."
31
+ },
32
+ "since": { "type": "string", "pattern": "^[0-9]+\\.[0-9]+$", "description": "The protocol version that first registered the code." },
33
+ "deprecated": { "type": "boolean", "description": "True when the code is deprecated. Absent means not deprecated." },
34
+ "source": { "type": "string", "minLength": 1, "description": "Provenance: the document or decision the row came from." }
35
+ }
36
+ }
37
+ }
38
+ }
@@ -1,14 +1,15 @@
1
1
  # OpenWOP v2 extensions
2
2
 
3
- > **Status: Stable · RFC 0177 §E, RFC 0174 §E.2.** This page defines the
4
- > maturity labels used by extension documents. Extensions are outside the core
5
- > profile unless a core document explicitly incorporates them.
3
+ > **Status: Stable.**
4
+
5
+ This page defines the maturity labels that extension documents carry.
6
+ Extensions are outside the core profile unless a core document explicitly
7
+ incorporates them.
6
8
 
7
9
  Each declared extension has a page at `spec/v2/ext/<name>/README.md` and a row
8
- in [`../declaration.json`](../declaration.json). Presence in the declaration
9
- reserves its identifier; it does not make the extension interoperable. Read the
10
- individual page to determine whether it defines portable behavior or only a
11
- discovery claim.
10
+ in [`../declaration.json`](../declaration.json). A row reserves the identifier;
11
+ it does not make the extension interoperable. Read the individual page to see
12
+ whether it defines portable behavior or only a discovery claim.
12
13
 
13
14
  ## Maturity labels
14
15
 
@@ -17,42 +18,54 @@ conformance evidence.
17
18
 
18
19
  ### `Draft`
19
20
 
20
- Declared, but not supported by qualifying interoperability evidence.
21
+ Declared, but without qualifying interoperability evidence.
21
22
 
22
23
  **Predicate:** The family is declared in `spec/v2/declaration.json` with
23
24
  `anchor: ext`.
24
25
 
25
26
  ### `Stable`
26
27
 
27
- Witnessed. At least one host at evidence tier 2 or better serves it, and a
28
+ Witnessed: at least one host at evidence tier 2 or better serves it, and a
28
29
  **certified** bundle in `evidence/v2-host-bundles/` records the family's
29
30
  declared witness class as satisfied.
30
31
 
31
- **Predicate:** Every `Stable` document's family has at least one
32
- `executed-pass` row under its witness id in a bundle whose relevant profile
33
- claim is `certified: true`, and the seven-day comment window has run since the
34
- promotion PR.
32
+ **Predicate:** The family has at least one `executed-pass` row under its
33
+ witness id `openwop.family.<key>`, in a bundle that certifies at least one
34
+ profile and whose `discovery.url` origin is listed at tier 2 or better in
35
+ [`evidence/host-tiers.json`](https://github.com/openwop/openwop/blob/main/evidence/host-tiers.json). The seven-day
36
+ comment window has also run since the promotion PR.
37
+
38
+ The label means only what the family's witness class checks:
39
+
40
+ - `witnessable-gated` or `seam-gated`: the host behaves as the page says.
41
+ - `claims-check`: the host advertises the reservation in a well-formed record.
42
+ Two hosts are not shown to interoperate on it, because the page defines no
43
+ portable operations.
35
44
 
36
45
  ### `Retired`
37
46
 
38
- Withdrawn. The family is removed from the declaration, and the document names
47
+ Withdrawn: the family is removed from the declaration, and the document names
39
48
  its replacement or the RFC that retired it.
40
49
 
41
- **Predicate:** The family is absent from the declaration; the document carries
42
- a `Superseded by:` or `Retired by:` line.
50
+ **Predicate:** The family is absent from the declaration, and the document
51
+ carries a `Superseded by:` or `Retired by:` line.
43
52
 
44
- The gate enforces both directions:
53
+ The check works both ways:
45
54
 
46
55
  - A `Stable` document without qualifying evidence fails validation.
47
56
  - A `Draft` document with qualifying evidence is reported as eligible for
48
57
  review and promotion.
49
58
 
50
- A directory without a corresponding declared family is an implementation or
51
- migration note and MUST identify itself as outside this maturity rule. This
52
- currently applies to `grpc-transport`, `portability`,
53
- `provider-idempotency`, and `sandbox-runtime-notes`.
59
+ ### `Note`
60
+
61
+ A directory with no declared family is an implementation or migration note. It
62
+ carries `Status: Note.` and MUST say it is not a declared family. It is outside
63
+ this maturity rule and never becomes `Stable`. Today the notes are
64
+ `grpc-transport`, `provider-idempotency`, and `sandbox-runtime-notes`.
54
65
 
55
66
  ## What this does not decide
56
67
 
57
- Whether an extension should become core. That requires a separate RFC,
58
- normative text, machine-readable contracts, and a behavioral witness.
68
+ Whether an extension should become core. That takes a separate RFC, normative
69
+ text, machine-readable contracts, and a behavioral witness.
70
+
71
+ *Sources: RFC 0174, RFC 0177, RFC 0220.*
@@ -1,66 +1,62 @@
1
1
  # `a2uiSurface` extension
2
2
 
3
- > **Status: Draft · v2 extension.** Normative contract for the `ui.a2ui-surface`
4
- > envelope kind at per-kind schema version 2 (RFC 0209), and the deprecated
5
- > `deltaTransport` facet (RFC 0114 in v1).
3
+ > **Status: Draft.**
4
+
5
+ The normative contract for the `ui.a2ui-surface` envelope kind at per-kind schema version 2, and for the deprecated `deltaTransport` facet.
6
6
 
7
7
  | Field | Value |
8
8
  | --- | --- |
9
- | **witness:** | `claims-check` |
9
+ | **witness:** | `seam-gated` |
10
10
  | **technical:** | `experimental` |
11
11
  | **adoption:** | `none` |
12
12
  | **peer-dependency id** | `a2uiSurface` |
13
- | **advertised as** | `extensions.<org>.a2uiSurface` |
14
- | **owning RFC** | RFC 0209 |
13
+ | **advertised as** | `schemaVersions.kinds["ui.a2ui-surface"]: 2`; the deprecated facet only under `extensions.<org>.a2ui-surface` |
15
14
  | **declared facets** | `deltaTransport` (deprecated) |
16
15
 
17
16
  ## Versions
18
17
 
19
- `ui.a2ui-surface` has two per-kind schema versions in v2, both in
20
- [`schemas/v2/envelopes/ui.a2ui-surface.schema.json`](../../../../schemas/v2/envelopes/ui.a2ui-surface.schema.json):
18
+ `ui.a2ui-surface` has two per-kind schema versions, both in [`schemas/v2/envelopes/ui.a2ui-surface.schema.json`](../../../../schemas/v2/envelopes/ui.a2ui-surface.schema.json):
21
19
 
22
20
  | Version | Branch | Shape |
23
21
  | --- | --- | --- |
24
- | `1`, `0` or absent | `$defs/payloadV1` | the RFC 0102 seven-component tree pinned by `catalogVersion: "0.9.1"`, unchanged from v1 |
25
- | `2` | `$defs/payloadV2` | `{ reasoning?, version: "v0.9", catalogId, surfaceId, messages[1..64] }`: an ordered run of A2UI v0.9 server-to-client messages in the profile below |
26
-
27
- An engine MUST validate an envelope against exactly one branch: the one for the
28
- version that `core/events.md` §"The envelope-kind catalog" selects (the emitted
29
- version, or the advertised one under `warn` below the floor). It MUST NOT
30
- validate against the union: a version-2 envelope carrying a version-1 payload is
31
- invalid, and so is the reverse. The root `anyOf` exists for tooling; a host that
32
- asks a model to emit version 2 hands the provider `$defs/payloadV2` alone.
33
-
34
- A host admits version 2 by advertising `schemaVersions.kinds["ui.a2ui-surface"]: 2`.
35
- The catalog rules then apply unchanged, so a consumer that knows only version 1
36
- refuses version 2 with `unknown_schema_version` and fails closed.
37
-
38
- In a version-2 payload, `catalogId` is an enum of the host-pinned catalogs, today
39
- exactly `https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json`. Every
40
- message's `surfaceId` MUST equal the payload's `surfaceId`, and a
41
- `createSurface.catalogId` MUST equal the payload's `catalogId`. The schema cannot
42
- express either cross-field rule, so the engine checks both at admission and
43
- refuses a violation with `envelope_invalid`.
22
+ | `1`, `0` or absent | `$defs/payloadV1` | the seven-component tree pinned by `catalogVersion: "0.9.1"` |
23
+ | `2` | `$defs/payloadV2` | `{ reasoning?, version: "v0.9", catalogId, surfaceId, messages[1..64] }` |
24
+
25
+ A version-2 payload is an ordered run of A2UI v0.9 server-to-client messages in the profile below.
26
+
27
+ ### Choosing the branch
28
+
29
+ An engine MUST validate an envelope against exactly one branch: the one for the version that [`core/events.md`](../../core/events.md) §"The envelope-kind catalog" selects (the emitted version, or the advertised one under `warn` below the floor).
30
+
31
+ - It MUST NOT validate against the union. A version-2 envelope carrying a version-1 payload is invalid, and so is the reverse.
32
+ - The root `anyOf` exists for tooling. A host that asks a model to emit version 2 hands the provider `$defs/payloadV2` alone.
33
+
34
+ A host admits version 2 by advertising `schemaVersions.kinds["ui.a2ui-surface"]: 2`. The catalog rules apply unchanged: a consumer that knows only version 1 refuses version 2 with `unknown_schema_version` and fails closed.
35
+
36
+ ### Cross-field rules
37
+
38
+ In a version-2 payload, `catalogId` is an enum of the host-pinned catalogs, today exactly `https://a2ui.org/specification/v0_9/catalogs/basic/catalog.json`.
39
+
40
+ - Every message's `surfaceId` MUST equal the payload's `surfaceId`.
41
+ - A `createSurface.catalogId` MUST equal the payload's `catalogId`.
42
+
43
+ The schema cannot express either rule, so the engine checks both at admission and refuses a violation with `envelope_invalid`.
44
44
 
45
45
  ## The profile
46
46
 
47
- Every message that validates against `payloadV2.messages[]` MUST also validate
48
- against upstream A2UI v0.9 `server_to_client.json` with the basic catalog and
49
- `common_types.json` bound. The profile only removes; it never adds a property
50
- A2UI lacks. Conformance vendors the upstream files, pinned by SHA-256
51
- (`conformance/fixtures/upstream/a2ui-v0.9/`).
47
+ Every message that validates against `payloadV2.messages[]` MUST also validate against upstream A2UI v0.9 `server_to_client.json` with the basic catalog and `common_types.json` bound. The profile only removes; it never adds a property A2UI lacks. Conformance vendors the upstream files, pinned by SHA-256 (`conformance/fixtures/upstream/a2ui-v0.9/`).
52
48
 
53
49
  | Message | Profile |
54
50
  | --- | --- |
55
- | `createSurface` | `surfaceId`, `catalogId`, optional `theme` limited to `primaryColor` and `agentDisplayName` |
51
+ | `createSurface` | `surfaceId`, `catalogId`, optional `theme` (`primaryColor`, `agentDisplayName` only) |
56
52
  | `updateComponents` | `surfaceId` and `components[1..512]` from the set below |
57
53
  | `updateDataModel` | as upstream: `surfaceId`, optional `path` (JSON Pointer), optional `value` |
58
54
  | `deleteSurface` | as upstream |
59
55
 
60
- Components, each closed and discriminated by a single-string-enum `component`:
61
- `Text`, `TextField`, `CheckBox`, `ChoicePicker`, `DateTimeInput`, `Button`,
62
- `Column`, `Row`, `Card`, `Divider`. A dynamic value is a literal or a `{path}`
63
- data binding. `Column` and `Row` take static `children` id lists only.
56
+ Components are each closed and discriminated by a single-string-enum `component`: `Text`, `TextField`, `CheckBox`, `ChoicePicker`, `DateTimeInput`, `Button`, `Column`, `Row`, `Card`, `Divider`.
57
+
58
+ - A dynamic value is a literal or a `{path}` data binding.
59
+ - `Column` and `Row` take static `children` id lists only.
64
60
 
65
61
  | Excluded | Why |
66
62
  | --- | --- |
@@ -68,80 +64,70 @@ data binding. `Column` and `Row` take static `children` id lists only.
68
64
  | `FunctionCall` values, except `checks[].condition` calling `required` | code execution on the renderer; `a2ui-surface-no-code-exec` |
69
65
  | `TextField.variant: "obscured"` | a surface MUST NOT solicit a secret; `a2ui-surface-no-secret-input` |
70
66
  | `Image`, `Video`, `AudioPlayer`, `createSurface.theme.iconUrl` | each fetches a URL; `a2ui-surface-no-network-egress` |
71
- | `createSurface.sendDataModel` | collected data returns only through the action below |
72
- | `Icon` | its vocabulary is renderer-defined; deferred |
67
+ | `createSurface.sendDataModel` | collected data returns only through actions |
68
+ | `Icon` | renderer-defined vocabulary; deferred |
73
69
  | `List`, `Tabs`, `Modal`, `Slider`, data-model templates | outside the day-one profile |
74
70
 
75
71
  ## Actions and collected data
76
72
 
77
- A `Button.action` MUST be the A2UI server-event arm `{ event: { name, context? } }`
78
- with `name` ∈ {`resume`, `exchange`}: an interrupt resume or a conversation
79
- exchange. When a user fires one, the consumer resolves `event.context` against
80
- the surface's data model and submits the result, as the interrupt `resumeValue`
81
- for `resume` or as the exchanged turn's data for `exchange`. With no `context` it
82
- submits the whole data model at `/`. It MUST NOT submit anywhere else.
73
+ A `Button.action` MUST be the A2UI server-event arm `{ event: { name, context? } }` with `name` ∈ {`resume`, `exchange`}: an interrupt resume or a conversation exchange.
83
74
 
84
- A host MUST NOT emit a surface whose evident purpose is credential collection.
85
- Collected values become a `resumeValue` in the event log, where SR-1 redaction is
86
- a backstop, not a licence.
75
+ When a user fires an action, the consumer resolves `event.context` against the surface's data model and submits the result:
76
+
77
+ - for `resume`, as the interrupt `resumeValue`;
78
+ - for `exchange`, as the exchanged turn's data;
79
+ - with no `context`, it submits the whole data model at `/`.
80
+
81
+ It MUST NOT submit anywhere else.
82
+
83
+ A host MUST NOT emit a surface whose evident purpose is credential collection. Collected values become a `resumeValue` in the event log, where SR-1 redaction is a backstop, not a licence.
87
84
 
88
85
  ## The fold
89
86
 
90
- A surface is identified by `(runId, surfaceId)`. Its state is the fold, in event
91
- `sequence` order, of the `messages` of every version-2 `ui.a2ui-surface` envelope
92
- the run recorded with that `surfaceId`, under A2UI v0.9 semantics:
93
- `updateComponents` upserts components by `id`, `updateDataModel` replaces or
94
- removes the value at `path`, and `deleteSurface` ends the surface.
87
+ A surface is identified by `(runId, surfaceId)`. Its state is the fold, in event `sequence` order, of the `messages` of every version-2 `ui.a2ui-surface` envelope the run recorded with that `surfaceId`, under A2UI v0.9 semantics:
95
88
 
96
- The host MUST refuse, rather than record, an envelope that would make the fold
97
- invalid, with `envelope_invalid`:
89
+ - `updateComponents` upserts components by `id`;
90
+ - `updateDataModel` replaces or removes the value at `path`;
91
+ - `deleteSurface` ends the surface.
92
+
93
+ The host MUST refuse, rather than record, an envelope that would make the fold invalid, with `envelope_invalid`:
98
94
 
99
95
  - the first envelope for a `surfaceId` does not begin with `createSurface`;
100
96
  - `createSurface` is sent for a live `surfaceId`;
101
97
  - any message follows `deleteSurface` without a new `createSurface`.
102
98
 
103
- A consumer MUST NOT render the surface, or enable any action on it, until the
104
- fold holds exactly one component with `id: "root"`. `partial: true` keeps its
105
- per-envelope meaning; a surface's actions stay disabled until the envelope that
106
- last touched it has finalized.
99
+ A consumer MUST NOT render the surface, or enable any action on it, until the fold holds exactly one component with `id: "root"`. `partial: true` keeps its per-envelope meaning: a surface's actions stay disabled until the envelope that last touched it has finalized.
107
100
 
108
101
  ## Replay and fork
109
102
 
110
- Recorded surface envelopes are returned as recorded; no surface is regenerated.
111
- A reader MUST keep accepting version-1 envelopes on replay, fork and poll for the
112
- life of the major, including on a host whose floor is now 2: recorded envelopes
113
- are read, not re-admitted through the envelope-kind catalog. A fork at `fromSeq`
114
- folds only the envelopes in `[0, fromSeq)`.
103
+ Recorded surface envelopes are returned as recorded, never regenerated.
104
+
105
+ - A reader MUST keep accepting version-1 envelopes on replay, fork and poll for the life of the major, including on a host whose floor is now 2. Recorded envelopes are read, not re-admitted through the envelope-kind catalog.
106
+ - A fork at `fromSeq` folds only the envelopes in `[0, fromSeq)`.
115
107
 
116
108
  ## Trust
117
109
 
118
- If any envelope in a surface's fold carries `meta.contentTrust: "untrusted"`, the
119
- whole surface is untrusted and the `untrusted_content_blocks_approval` rule
120
- applies to every action on it: an `approval` interrupt it is bound to MUST NOT
121
- advance. A later trusted `updateComponents` does not launder an earlier untrusted
122
- one, and one untrusted update taints a surface a trusted node created. The SR-1
123
- harness walks every message.
110
+ If any envelope in a surface's fold carries `meta.contentTrust: "untrusted"`, the whole surface is untrusted. The `untrusted_content_blocks_approval` rule then applies to every action on it: an `approval` interrupt it is bound to MUST NOT advance.
111
+
112
+ - A later trusted `updateComponents` does not launder an earlier untrusted one.
113
+ - One untrusted update taints a surface a trusted node created.
114
+
115
+ The SR-1 harness walks every message.
124
116
 
125
117
  ## `deltaTransport` (deprecated)
126
118
 
127
- `schemas/v2/a2ui-surface-delta-frame.schema.json` and the `deltaTransport` facet
128
- are deprecated for major 2 (`spec/v1/deprecations.json`,
129
- `openwop.deprecation.v2-a2ui-delta-frame` and `-delta-transport-facet`). A v2 host
130
- SHOULD NOT advertise the facet: incremental updates are version-2 envelopes
131
- carrying `updateComponents` / `updateDataModel`, recorded and replayable by the
132
- fold. The rows carry `removeIn: "3.0"` until RFC 0197 is `Accepted`; removal then
133
- follows its `v2-minor` path. v1's RFC 0114 stands.
119
+ `schemas/v2/a2ui-surface-delta-frame.schema.json` and the `deltaTransport` facet are deprecated for major 2 (`spec/v1/deprecations.json`, `openwop.deprecation.v2-a2ui-delta-frame` and `-delta-transport-facet`).
120
+
121
+ A v2 host SHOULD NOT advertise the facet. Incremental updates are version-2 envelopes carrying `updateComponents` / `updateDataModel`, recorded and replayable by the fold.
122
+
123
+ The rows carry `removeIn: "3.0"`. An earlier removal takes the `v2-minor` path of [overview.md §0a](../../core/overview.md): a migration row for the replacement, and a row rescheduled to name the removal minor at least two minors and 30 days ahead.
134
124
 
135
125
  ## Conformance
136
126
 
137
- - `conformance/src/coherence/a2ui-v09-profile.test.ts` (corpus gate, no host): the
138
- profile ⊂ upstream check, each excluded affordance refused, the pinned catalog,
139
- the unchanged version-1 branch and the `ui.*`/`media.*` kind carve-out.
140
- - `conformance/src/scenarios/v2-a2ui-v09-surface.test.ts` (major 2, seams-gated on
141
- `POST /conformance/seams/sample/a2ui/emit-surface` in `api/seams-v2.yaml`):
142
- version selects branch, fold guarded, catalog equality, legacy readable and
143
- sticky taint. A host without the seam records `inapplicable`.
144
- - No render before `root` is a renderer guarantee the server-oriented suite cannot
145
- observe; it is witnessed by a reference-app client probe (`tier: reference-impl`).
146
-
147
- The `claims-check` witness above is the discovery claim of `extensions.<org>.a2uiSurface`.
127
+ - **`conformance/src/coherence/a2ui-v09-profile.test.ts`** (corpus gate, no host): the profile ⊂ upstream check, each excluded affordance refused, the pinned catalog, the unchanged version-1 branch and the `ui.*`/`media.*` kind carve-out.
128
+ - **`conformance/src/scenarios/v2-a2ui-v09-surface.test.ts`** (major 2, seams-gated on `POST /conformance/seams/sample/a2ui/emit-surface` in `api/seams-v2.yaml`): version selects branch, fold guarded, catalog equality, legacy readable and sticky taint. A host without the seam records `inapplicable`.
129
+ - **No render before `root`** is a renderer guarantee the server-oriented suite cannot observe. A reference-app client probe witnesses it (`tier: reference-impl`).
130
+
131
+ The family witness is `openwop.family.a2uiSurface`. It is the last leg of `v2-a2ui-v09-surface`: a version-2 surface is admitted and a version-1 body under schema version 2 is refused, in the same run. It shares the seam gate, so a host without the seam records `inapplicable`.
132
+
133
+ *Sources: RFC 0102, RFC 0114, RFC 0197, RFC 0209, RFC 0220.*
@@ -1,7 +1,8 @@
1
1
  # `brand` extension
2
2
 
3
- > **Status: Draft · v2 extension.** Discovery-only reservation; no portable
4
- > operations or payload contract is defined in the current v2 corpus.
3
+ > **Status: Draft.**
4
+
5
+ `brand` names a host service for brand artifacts: themes and personas. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
5
6
 
6
7
  | Field | Value |
7
8
  | --- | --- |
@@ -10,24 +11,23 @@
10
11
  | **adoption:** | `single-witness` |
11
12
  | **peer-dependency id** | `brand` |
12
13
  | **advertised as** | `extensions.<org>.brand` |
13
- | **owning RFC** | RFC 0144 |
14
14
  | **declared facets** | none defined |
15
15
 
16
16
  ## Contract boundary
17
17
 
18
- A host MAY advertise this identifier under its registered organization namespace.
19
- The extension record is organization-defined, so clients MUST NOT infer portable
20
- operations, payloads, or authorization semantics from its presence. A pack may
21
- name `brand` as a dependency only when the host and pack share
22
- an out-of-band definition of that dependency.
18
+ A host MAY advertise `brand` as `extensions["<org>.brand"]`, where `<org>` is its registered organization ([capabilities.md §3.2](../../core/capabilities.md)). The record is organization-defined, so:
23
19
 
24
- The v1 description,
25
- [`spec/v1/host-capabilities.md`](https://github.com/openwop/openwop/blob/main/spec/v1/host-capabilities.md#hostbrand)
26
- (§host.brand), is useful for migration but is not a
27
- standalone v2 interoperability contract. A future revision can replace this
28
- boundary with normative behavior, schemas, and a behavioral witness.
20
+ - a client MUST NOT infer portable operations, payloads, or authorization semantics from its presence;
21
+ - a pack may name `brand` as a dependency only when the host and pack share an out-of-band definition of it.
29
22
 
30
23
  ## Conformance
31
24
 
32
- The current `claims-check` witness validates only that the discovery claim is
33
- well formed. It does not demonstrate compatible runtime behavior.
25
+ The `claims-check` witness checks only that the discovery claim is well formed, not runtime behavior. `conformance/src/scenarios/v2-ext-family-claims.test.ts` records it under `openwop.family.brand`:
26
+
27
+ - the key `<org>.brand` matches `extensionsKeyPattern`, and `<org>` is registered and not reserved;
28
+ - the record is a JSON object;
29
+ - `brand` is not also a member of the discovery root.
30
+
31
+ A host that does not advertise the family records `inapplicable`. A `Stable` label on this page therefore means a host at evidence tier 2 or better advertises the reservation correctly. It does not mean two hosts interoperate on it ([`../README.md`](../README.md)).
32
+
33
+ *Sources: RFC 0144.*
@@ -1,7 +1,8 @@
1
1
  # `canvas` extension
2
2
 
3
- > **Status: Draft · v2 extension.** Discovery-only reservation; no portable
4
- > operations or payload contract is defined in the current v2 corpus.
3
+ > **Status: Draft.**
4
+
5
+ `canvas` names a host service that reads and writes canvas state. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
5
6
 
6
7
  | Field | Value |
7
8
  | --- | --- |
@@ -10,24 +11,23 @@
10
11
  | **adoption:** | `single-witness` |
11
12
  | **peer-dependency id** | `canvas` |
12
13
  | **advertised as** | `extensions.<org>.canvas` |
13
- | **owning RFC** | RFC 0144 |
14
14
  | **declared facets** | none defined |
15
15
 
16
16
  ## Contract boundary
17
17
 
18
- A host MAY advertise this identifier under its registered organization namespace.
19
- The extension record is organization-defined, so clients MUST NOT infer portable
20
- operations, payloads, or authorization semantics from its presence. A pack may
21
- name `canvas` as a dependency only when the host and pack share
22
- an out-of-band definition of that dependency.
18
+ A host MAY advertise `canvas` as `extensions["<org>.canvas"]`, where `<org>` is its registered organization ([capabilities.md §3.2](../../core/capabilities.md)). The record is organization-defined, so:
23
19
 
24
- The v1 description,
25
- [`spec/v1/host-capabilities.md`](https://github.com/openwop/openwop/blob/main/spec/v1/host-capabilities.md#hostcanvas)
26
- (§host.canvas), is useful for migration but is not a
27
- standalone v2 interoperability contract. A future revision can replace this
28
- boundary with normative behavior, schemas, and a behavioral witness.
20
+ - a client MUST NOT infer portable operations, payloads, or authorization semantics from its presence;
21
+ - a pack may name `canvas` as a dependency only when the host and pack share an out-of-band definition of it.
29
22
 
30
23
  ## Conformance
31
24
 
32
- The current `claims-check` witness validates only that the discovery claim is
33
- well formed. It does not demonstrate compatible runtime behavior.
25
+ The `claims-check` witness checks only that the discovery claim is well formed, not runtime behavior. `conformance/src/scenarios/v2-ext-family-claims.test.ts` records it under `openwop.family.canvas`:
26
+
27
+ - the key `<org>.canvas` matches `extensionsKeyPattern`, and `<org>` is registered and not reserved;
28
+ - the record is a JSON object;
29
+ - `canvas` is not also a member of the discovery root.
30
+
31
+ A host that does not advertise the family records `inapplicable`. A `Stable` label on this page therefore means a host at evidence tier 2 or better advertises the reservation correctly. It does not mean two hosts interoperate on it ([`../README.md`](../README.md)).
32
+
33
+ *Sources: RFC 0144.*
@@ -1,7 +1,8 @@
1
1
  # `chat` extension
2
2
 
3
- > **Status: Draft · v2 extension.** Discovery-only reservation; no portable
4
- > operations or payload contract is defined in the current v2 corpus.
3
+ > **Status: Draft.**
4
+
5
+ `chat` names a host service that posts messages and cards into a host-established chat session. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
5
6
 
6
7
  | Field | Value |
7
8
  | --- | --- |
@@ -10,24 +11,23 @@
10
11
  | **adoption:** | `single-witness` |
11
12
  | **peer-dependency id** | `chat` |
12
13
  | **advertised as** | `extensions.<org>.chat` |
13
- | **owning RFC** | RFC 0144 |
14
14
  | **declared facets** | none defined |
15
15
 
16
16
  ## Contract boundary
17
17
 
18
- A host MAY advertise this identifier under its registered organization namespace.
19
- The extension record is organization-defined, so clients MUST NOT infer portable
20
- operations, payloads, or authorization semantics from its presence. A pack may
21
- name `chat` as a dependency only when the host and pack share
22
- an out-of-band definition of that dependency.
18
+ A host MAY advertise `chat` as `extensions["<org>.chat"]`, where `<org>` is its registered organization ([capabilities.md §3.2](../../core/capabilities.md)). The record is organization-defined, so:
23
19
 
24
- The v1 description,
25
- [`spec/v1/host-capabilities.md`](https://github.com/openwop/openwop/blob/main/spec/v1/host-capabilities.md#hostchat)
26
- (§host.chat), is useful for migration but is not a
27
- standalone v2 interoperability contract. A future revision can replace this
28
- boundary with normative behavior, schemas, and a behavioral witness.
20
+ - a client MUST NOT infer portable operations, payloads, or authorization semantics from its presence;
21
+ - a pack may name `chat` as a dependency only when the host and pack share an out-of-band definition of it.
29
22
 
30
23
  ## Conformance
31
24
 
32
- The current `claims-check` witness validates only that the discovery claim is
33
- well formed. It does not demonstrate compatible runtime behavior.
25
+ The `claims-check` witness checks only that the discovery claim is well formed, not runtime behavior. `conformance/src/scenarios/v2-ext-family-claims.test.ts` records it under `openwop.family.chat`:
26
+
27
+ - the key `<org>.chat` matches `extensionsKeyPattern`, and `<org>` is registered and not reserved;
28
+ - the record is a JSON object;
29
+ - `chat` is not also a member of the discovery root.
30
+
31
+ A host that does not advertise the family records `inapplicable`. A `Stable` label on this page therefore means a host at evidence tier 2 or better advertises the reservation correctly. It does not mean two hosts interoperate on it ([`../README.md`](../README.md)).
32
+
33
+ *Sources: RFC 0144.*
@@ -1,7 +1,8 @@
1
1
  # `coordination` extension
2
2
 
3
- > **Status: Draft · v2 extension.** Discovery-only reservation; no portable
4
- > operations or payload contract is defined in the current v2 corpus.
3
+ > **Status: Draft.**
4
+
5
+ `coordination` names multi-participant coordination primitives that operate on roles, such as voters and competitors. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
5
6
 
6
7
  | Field | Value |
7
8
  | --- | --- |
@@ -10,24 +11,23 @@
10
11
  | **adoption:** | `single-witness` |
11
12
  | **peer-dependency id** | `coordination` |
12
13
  | **advertised as** | `extensions.<org>.coordination` |
13
- | **owning RFC** | RFC 0144 |
14
14
  | **declared facets** | none defined |
15
15
 
16
16
  ## Contract boundary
17
17
 
18
- A host MAY advertise this identifier under its registered organization namespace.
19
- The extension record is organization-defined, so clients MUST NOT infer portable
20
- operations, payloads, or authorization semantics from its presence. A pack may
21
- name `coordination` as a dependency only when the host and pack share
22
- an out-of-band definition of that dependency.
18
+ A host MAY advertise `coordination` as `extensions["<org>.coordination"]`, where `<org>` is its registered organization ([capabilities.md §3.2](../../core/capabilities.md)). The record is organization-defined, so:
23
19
 
24
- The v1 description,
25
- [`spec/v1/host-capabilities.md`](https://github.com/openwop/openwop/blob/main/spec/v1/host-capabilities.md#hostcoordination)
26
- (§host.coordination), is useful for migration but is not a
27
- standalone v2 interoperability contract. A future revision can replace this
28
- boundary with normative behavior, schemas, and a behavioral witness.
20
+ - a client MUST NOT infer portable operations, payloads, or authorization semantics from its presence;
21
+ - a pack may name `coordination` as a dependency only when the host and pack share an out-of-band definition of it.
29
22
 
30
23
  ## Conformance
31
24
 
32
- The current `claims-check` witness validates only that the discovery claim is
33
- well formed. It does not demonstrate compatible runtime behavior.
25
+ The `claims-check` witness checks only that the discovery claim is well formed, not runtime behavior. `conformance/src/scenarios/v2-ext-family-claims.test.ts` records it under `openwop.family.coordination`:
26
+
27
+ - the key `<org>.coordination` matches `extensionsKeyPattern`, and `<org>` is registered and not reserved;
28
+ - the record is a JSON object;
29
+ - `coordination` is not also a member of the discovery root.
30
+
31
+ A host that does not advertise the family records `inapplicable`. A `Stable` label on this page therefore means a host at evidence tier 2 or better advertises the reservation correctly. It does not mean two hosts interoperate on it ([`../README.md`](../README.md)).
32
+
33
+ *Sources: RFC 0144.*
@@ -1,7 +1,8 @@
1
1
  # `dataIntegration` extension
2
2
 
3
- > **Status: Draft · v2 extension.** Discovery-only reservation; no portable
4
- > operations or payload contract is defined in the current v2 corpus.
3
+ > **Status: Draft.**
4
+
5
+ `dataIntegration` names typed data-source operations: fetches from configured external sources, transforms and run-scoped variables. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
5
6
 
6
7
  | Field | Value |
7
8
  | --- | --- |
@@ -9,30 +10,26 @@
9
10
  | **technical:** | `experimental` |
10
11
  | **adoption:** | `single-witness` |
11
12
  | **peer-dependency id** | `dataIntegration` |
12
- | **advertised as** | `extensions.<org>.dataIntegration` |
13
- | **owning RFC** | RFC 0144 |
13
+ | **advertised as** | `extensions.<org>.data-integration` |
14
14
  | **declared facets** | none defined |
15
15
 
16
16
  ## Contract boundary
17
17
 
18
- A host MAY advertise this identifier under its registered organization namespace.
19
- The extension record is organization-defined, so clients MUST NOT infer portable
20
- operations, payloads, or authorization semantics from its presence. A pack may
21
- name `dataIntegration` as a dependency only when the host and pack share
22
- an out-of-band definition of that dependency.
18
+ A host MAY advertise `dataIntegration` as `extensions["<org>.data-integration"]`, where `<org>` is its registered organization ([capabilities.md §3.2](../../core/capabilities.md)). The record is organization-defined, so:
23
19
 
24
- The v1 description,
25
- [`spec/v1/host-capabilities.md`](https://github.com/openwop/openwop/blob/main/spec/v1/host-capabilities.md#hostdataintegration)
26
- (§host.dataIntegration), is useful for migration but is not a
27
- standalone v2 interoperability contract. A future revision can replace this
28
- boundary with normative behavior, schemas, and a behavioral witness.
20
+ - a client MUST NOT infer portable operations, payloads, or authorization semantics from its presence;
21
+ - a pack may name `dataIntegration` as a dependency only when the host and pack share an out-of-band definition of it.
29
22
 
30
- For MCP access, the v1 `ctx.dataIntegration.fetchMCP` operation is superseded
31
- by `ctx.mcp` ([`host-services.md`](../../core/host-services.md) §`mcp`, RFC 0204),
32
- which returns MCP results unaltered. Retiring `fetchMCP` from an organization's
33
- `dataIntegration` record is that organization's decision.
23
+ For MCP access, `ctx.mcp` ([`host-services.md`](../../core/host-services.md) §`mcp`) supersedes the v1 `ctx.dataIntegration.fetchMCP` operation and returns MCP results unaltered. Whether an organization's `dataIntegration` record keeps `fetchMCP` is that organization's decision.
34
24
 
35
25
  ## Conformance
36
26
 
37
- The current `claims-check` witness validates only that the discovery claim is
38
- well formed. It does not demonstrate compatible runtime behavior.
27
+ The `claims-check` witness checks only that the discovery claim is well formed, not runtime behavior. `conformance/src/scenarios/v2-ext-family-claims.test.ts` records it under `openwop.family.dataIntegration`:
28
+
29
+ - the key `<org>.data-integration` matches `extensionsKeyPattern`, and `<org>` is registered and not reserved;
30
+ - the record is a JSON object;
31
+ - `dataIntegration` is not also a member of the discovery root.
32
+
33
+ A host that does not advertise the family records `inapplicable`. A `Stable` label on this page therefore means a host at evidence tier 2 or better advertises the reservation correctly. It does not mean two hosts interoperate on it ([`../README.md`](../README.md)).
34
+
35
+ *Sources: RFC 0144, RFC 0204.*