@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.
- package/CORPUS-STAMP.json +70 -67
- package/api/seams-v2.yaml +238 -322
- package/api/v2/asyncapi.yaml +83 -113
- package/api/v2/openapi.yaml +408 -724
- package/package.json +1 -1
- package/schemas/audit-verify-result.schema.json +2 -2
- package/schemas/v2/audit-verify-result.schema.json +2 -2
- package/schemas/v2/capabilities.schema.json +4 -7
- package/schemas/v2/error-envelope.schema.json +144 -69
- package/spec/v1/alias-detectors.json +6 -0
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/deprecations.json +22 -0
- package/spec/v1/gaps.json +188 -1
- package/spec/v1/migrations.json +18 -0
- package/spec/v2/README.md +35 -37
- package/spec/v2/core/capabilities.md +186 -119
- package/spec/v2/core/conformance.md +78 -27
- package/spec/v2/core/connection-packs.md +8 -3
- package/spec/v2/core/conversation.md +10 -4
- package/spec/v2/core/errors.md +30 -9
- package/spec/v2/core/events.md +116 -80
- package/spec/v2/core/form-content-packs.md +11 -13
- package/spec/v2/core/headers.md +23 -14
- package/spec/v2/core/host-services.md +22 -5
- package/spec/v2/core/i18n.md +64 -0
- package/spec/v2/core/idempotency.md +48 -36
- package/spec/v2/core/identity.md +110 -42
- package/spec/v2/core/interop.md +82 -21
- package/spec/v2/core/interrupt.md +79 -40
- package/spec/v2/core/node-pack-runtimes.md +18 -4
- package/spec/v2/core/oauth.md +40 -6
- package/spec/v2/core/overview.md +61 -33
- package/spec/v2/core/packs.md +53 -28
- package/spec/v2/core/persistence.md +61 -80
- package/spec/v2/core/portability.md +44 -0
- package/spec/v2/core/replay.md +56 -42
- package/spec/v2/core/runs.md +198 -60
- package/spec/v2/core/security-defaults.md +57 -33
- package/spec/v2/core/tool-catalog.md +29 -6
- package/spec/v2/core/versioning.md +115 -50
- package/spec/v2/core/webhooks.md +61 -20
- package/spec/v2/core/workflow-chain-packs.md +16 -14
- package/spec/v2/corrections.json +17 -1
- package/spec/v2/corrections.schema.json +1 -1
- package/spec/v2/declaration.json +26 -9
- package/spec/v2/declaration.schema.json +10 -0
- package/spec/v2/errors.json +121 -4
- package/spec/v2/errors.schema.json +38 -0
- package/spec/v2/ext/README.md +36 -23
- package/spec/v2/ext/a2uiSurface/README.md +75 -89
- package/spec/v2/ext/brand/README.md +15 -15
- package/spec/v2/ext/canvas/README.md +15 -15
- package/spec/v2/ext/chat/README.md +15 -15
- package/spec/v2/ext/coordination/README.md +15 -15
- package/spec/v2/ext/dataIntegration/README.md +17 -20
- package/spec/v2/ext/entities/README.md +15 -15
- package/spec/v2/ext/grpc-transport/README.md +6 -8
- package/spec/v2/ext/kanban/README.md +15 -15
- package/spec/v2/ext/knowledge/README.md +15 -15
- package/spec/v2/ext/launchStudio/README.md +16 -16
- package/spec/v2/ext/messaging/README.md +15 -15
- package/spec/v2/ext/portability/README.md +3 -17
- package/spec/v2/ext/provider-idempotency/README.md +7 -10
- package/spec/v2/ext/restTransport/README.md +30 -19
- package/spec/v2/ext/sandbox-runtime-notes/README.md +7 -9
- package/spec/v2/ext/webResearch/README.md +16 -16
- package/spec/v2/profiles.json +6 -2
- package/spec/v2/release.json +2 -2
- 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
|
+
}
|
package/spec/v2/ext/README.md
CHANGED
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
# OpenWOP v2 extensions
|
|
2
2
|
|
|
3
|
-
> **Status: Stable
|
|
4
|
-
|
|
5
|
-
|
|
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).
|
|
9
|
-
|
|
10
|
-
|
|
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
|
|
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
|
|
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:**
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
`
|
|
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
|
|
58
|
-
|
|
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
|
|
4
|
-
|
|
5
|
-
|
|
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:** | `
|
|
9
|
+
| **witness:** | `seam-gated` |
|
|
10
10
|
| **technical:** | `experimental` |
|
|
11
11
|
| **adoption:** | `none` |
|
|
12
12
|
| **peer-dependency id** | `a2uiSurface` |
|
|
13
|
-
| **advertised as** | `extensions.<org>.
|
|
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
|
|
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
|
|
25
|
-
| `2` | `$defs/payloadV2` | `{ reasoning?, version: "v0.9", catalogId, surfaceId, messages[1..64] }
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
A host
|
|
35
|
-
|
|
36
|
-
refuses version 2 with `unknown_schema_version` and fails closed.
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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`
|
|
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
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
|
72
|
-
| `Icon` |
|
|
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
|
-
|
|
85
|
-
|
|
86
|
-
|
|
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
|
-
|
|
97
|
-
|
|
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
|
|
111
|
-
|
|
112
|
-
life of the major, including on a host whose floor is now 2
|
|
113
|
-
|
|
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
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
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
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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
|
|
4
|
-
|
|
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
|
|
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
|
-
|
|
25
|
-
|
|
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
|
|
33
|
-
|
|
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
|
|
4
|
-
|
|
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
|
|
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
|
-
|
|
25
|
-
|
|
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
|
|
33
|
-
|
|
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
|
|
4
|
-
|
|
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
|
|
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
|
-
|
|
25
|
-
|
|
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
|
|
33
|
-
|
|
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
|
|
4
|
-
|
|
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
|
|
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
|
-
|
|
25
|
-
|
|
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
|
|
33
|
-
|
|
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
|
|
4
|
-
|
|
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>.
|
|
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
|
|
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
|
-
|
|
25
|
-
|
|
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
|
|
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
|
|
38
|
-
|
|
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.*
|