@openwop/spec-artifacts 2.4.6 → 2.4.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.
- package/CORPUS-STAMP.json +15 -15
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +1 -1
- package/package.json +1 -1
- package/schemas/v2/a2a-task-state.schema.json +10 -10
- package/schemas/v2/channel-presence-payload.schema.json +3 -5
- package/schemas/v2/conversation-turn.schema.json +10 -12
- package/schemas/v2/self-hosted-runner-dispatch-frame.schema.json +4 -4
- package/schemas/v2/self-hosted-runner-result-frame.schema.json +2 -2
- package/schemas/v2/trigger-event.schema.json +23 -23
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v2/core/headers.md +1 -1
- package/spec/v2/release.json +2 -2
package/CORPUS-STAMP.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"_comment": "Provenance of @openwop/spec-artifacts (RFC 0168 §D.2). files: SHA-256 per file; the conformance suite compares the installed peer against dist/spec-artifacts.lock.json at start.",
|
|
3
3
|
"package": "@openwop/spec-artifacts",
|
|
4
|
-
"version": "2.4.
|
|
5
|
-
"corpusTag": "v2.4.
|
|
4
|
+
"version": "2.4.7",
|
|
5
|
+
"corpusTag": "v2.4.7",
|
|
6
6
|
"files": {
|
|
7
7
|
"api/.redocly.lint-ignore.yaml": "bf5a8350b88a72fa43f59605ed8d903ed24b6cfccda5e45509c9f6ed9ee4e712",
|
|
8
8
|
"api/asyncapi.yaml": "d5ecb9ee6114582be3b1f662c84bfac9ae96dae7bacb853e461168f70a8e1c7d",
|
|
9
9
|
"api/grpc/openwop.proto": "c3e72bb17cba514ee98feb6434e6c9b6ea6795bfd086489ec69fd882dd1ad977",
|
|
10
10
|
"api/openapi.yaml": "39081c59fb696159806b0f2f9a42e7e9ff830d622fcf2ad4159b21357580a955",
|
|
11
11
|
"api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
|
|
12
|
-
"api/seams-v2.yaml": "
|
|
13
|
-
"api/v2/asyncapi.yaml": "
|
|
14
|
-
"api/v2/openapi.yaml": "
|
|
12
|
+
"api/seams-v2.yaml": "ea8ac475df166b0c3ad47268819020eb247bb4d24a78798c5ffa725a91fefe78",
|
|
13
|
+
"api/v2/asyncapi.yaml": "6ad6a2c8415f26542fd7b9e0871457bbbfb910486faa50e982583a388651c48e",
|
|
14
|
+
"api/v2/openapi.yaml": "4a6d428b18eb95cd312d39944300714359e682513b8602e6ac7198fbfe7f46e4",
|
|
15
15
|
"api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
|
|
16
16
|
"schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
|
|
17
17
|
"schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"schemas/trigger-subscription-registration.schema.json": "929d628bad08e1def696e47e9a148aba00fa801e28d49bbd0dc2360b08673435",
|
|
99
99
|
"schemas/trigger-subscription.schema.json": "4f7b067f20032073b140c4bb15dc9a9914c4f6421a252ff1ff261cbdd8edf270",
|
|
100
100
|
"schemas/ui-plugin-message.schema.json": "346638babf1f8ea7b161cde75c0038b518cd2cc5bf0631772e20a9b74c96b5dd",
|
|
101
|
-
"schemas/v2/a2a-task-state.schema.json": "
|
|
101
|
+
"schemas/v2/a2a-task-state.schema.json": "e19e8770f2f9c77cb914eca181a5cd105f1fc8bd8ccffd821e36137bf3ba516e",
|
|
102
102
|
"schemas/v2/a2ui-surface-delta-frame.schema.json": "6889c5da3fe7e76cb614038c0eea6774776fa640448558b258eb87fb50cb9b64",
|
|
103
103
|
"schemas/v2/agent-deployment-transition.schema.json": "5fb65556576e3d8705a4834d6ab8ab47389123c40f206d39ba672bc03302c544",
|
|
104
104
|
"schemas/v2/agent-deployment.schema.json": "5581fea8ed8bf99ff05c8df9d3cc007fa2b94a446e7a37a68ea73a513d55b6cd",
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"schemas/v2/budget-policy.schema.json": "c7449daeb6e1d95e7a047b8c2814d3d54748697c27046972834874867d9b5f4c",
|
|
118
118
|
"schemas/v2/capabilities.schema.json": "fa9b80a9107fc322ecadbac808e7fbe5e16ccf0af1a6bf673181faa8379dde33",
|
|
119
119
|
"schemas/v2/certification-bundle.schema.json": "d2cbc5cadddff13630a528dc9673162f582c035c6a6663ca02c1ac53e8fec40c",
|
|
120
|
-
"schemas/v2/channel-presence-payload.schema.json": "
|
|
120
|
+
"schemas/v2/channel-presence-payload.schema.json": "1c20ad810cb311d47aa0b95d928490826b2468fd161f884cd29e867053e6782f",
|
|
121
121
|
"schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
|
|
122
122
|
"schemas/v2/chat-card-pack-manifest.schema.json": "8df0d9d273ae22efc6876d5586833f1d4c2e551edc3ac6cf6e8f0719329f03dd",
|
|
123
123
|
"schemas/v2/compact-tool-descriptor.schema.json": "b5c418d72082d5b713bf318212a83397e5be98e56d25ca056302b41b8dd8273b",
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
"schemas/v2/configurable.schema.json": "33a6884047e2490f723733bf8b74d3b9164e00374cfea6dc3eac5a70dc368861",
|
|
127
127
|
"schemas/v2/connection-pack-manifest.schema.json": "7410a3011b28829b286e3ff764bdb283854dca69ea4b71a8441f8c1c4f1cc948",
|
|
128
128
|
"schemas/v2/conversation-event.schema.json": "e87b7fb36ab4ca0afe9f77993654065b28b67e5f24b20175907f90e238942025",
|
|
129
|
-
"schemas/v2/conversation-turn.schema.json": "
|
|
129
|
+
"schemas/v2/conversation-turn.schema.json": "a15b43dc15dbcc6aaf216bfab7424c540b514d7e40e661a732384aad45387006",
|
|
130
130
|
"schemas/v2/credential-provenance.schema.json": "f86b09e94b1c524dec7d1c6353965665ae8891e9517faef6e742d639c5578c99",
|
|
131
131
|
"schemas/v2/credential-reference.schema.json": "ea699ce30f58fb2c32d4279158b3f730f70be7b2dc8c3037693a76e66eb3e001",
|
|
132
132
|
"schemas/v2/debug-bundle.schema.json": "0bfa4b1d91fefbc12c95670dba9d5eacb72b879bb9a5c074e821ca9ed0fee6fd",
|
|
@@ -176,14 +176,14 @@
|
|
|
176
176
|
"schemas/v2/run-orchestrator-decided-event.schema.json": "bb76e15ff72e669f12938684033b55dc567470e1a378e19ffc3fa0e4034ab5a7",
|
|
177
177
|
"schemas/v2/run-snapshot.schema.json": "65a3c82220da2e1a54324665d517dc0e627225f3d37ef75b43bef3fb7e3bac0e",
|
|
178
178
|
"schemas/v2/security-advisory.schema.json": "6a382f737730a738d634266315e9d335e5760020a0cdd9f30727c2f987a01770",
|
|
179
|
-
"schemas/v2/self-hosted-runner-dispatch-frame.schema.json": "
|
|
179
|
+
"schemas/v2/self-hosted-runner-dispatch-frame.schema.json": "9524c3fcf2e195bb10b9561dea34eb2fbe49607b90d010efb0e4c9e36bf87842",
|
|
180
180
|
"schemas/v2/self-hosted-runner-registration.schema.json": "93d60003a668cacb0eeac37699ca2884c6b79332d9494cb9e0a1752ac8f8a16c",
|
|
181
|
-
"schemas/v2/self-hosted-runner-result-frame.schema.json": "
|
|
181
|
+
"schemas/v2/self-hosted-runner-result-frame.schema.json": "505b8e44c93bc4fd3c9fa73bbd7bd5b3d1a1a123f54096761fc0d0b210e5ec8a",
|
|
182
182
|
"schemas/v2/subject-link.schema.json": "1fc941d6c14af886534009f2ffa6611e2035eb07e30b1df918c50d6bafff026c",
|
|
183
183
|
"schemas/v2/subject.schema.json": "094e981fb20052a911393e219ea5f2065d8b8417b65080a70c5ea99fd960a8fe",
|
|
184
184
|
"schemas/v2/suspend-request.schema.json": "4a0dda88a257cdb21c9b57fc9ad898d91de0d75bc4944a693eb950b709f58c91",
|
|
185
185
|
"schemas/v2/tool-descriptor.schema.json": "658b18ef173e0f12d732f92d4866a9b3daeb8f88b493db8b025a577e09dd681c",
|
|
186
|
-
"schemas/v2/trigger-event.schema.json": "
|
|
186
|
+
"schemas/v2/trigger-event.schema.json": "66077c3b3d5b81591270655643ae8957c4c42aaf7cf31c45e8e45cb1b73fde63",
|
|
187
187
|
"schemas/v2/trigger-subscription-registration.schema.json": "04bc314a07c7e8b565577cb8df5821d968ce2af915900dfdccd4a24e928d20db",
|
|
188
188
|
"schemas/v2/trigger-subscription.schema.json": "c887d4b9a12be0133f8c9dfd3a8bafcb518e27ecc2e800447ebc4d1fef111503",
|
|
189
189
|
"schemas/v2/ui-plugin-message.schema.json": "879d65867c01656b3962d64283e66364dcb8f626ad26c5fcf2d2d55a79ae0ce9",
|
|
@@ -200,7 +200,7 @@
|
|
|
200
200
|
"schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
|
|
201
201
|
"spec/v1/alias-detectors.json": "e90916db12d2297e2e560b2d54d2c4702d6cb3bef7179a575844687a7ec17262",
|
|
202
202
|
"spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
|
|
203
|
-
"spec/v1/core-standard-manifest.json": "
|
|
203
|
+
"spec/v1/core-standard-manifest.json": "2d78ebddc7b5142cefd5c2314bfee1502e7b3b6823cdeaf96fe2820cd82ee544",
|
|
204
204
|
"spec/v1/deprecations.json": "c81c8f71460936c8d489d8270477c7661cf4a5d7b7bad86c98899750b5656027",
|
|
205
205
|
"spec/v1/deprecations.schema.json": "18c87e78bedc210431f795ae44c5b5d202f2f3317850d5cf86867d4f1fa1cdfb",
|
|
206
206
|
"spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
|
|
@@ -219,7 +219,7 @@
|
|
|
219
219
|
"spec/v2/core/errors.md": "ad85fc830139e587f20deabf88297b91b1fb6ce31e80d5442624a650246ab16e",
|
|
220
220
|
"spec/v2/core/events.md": "f1bac16419740f3b722febb6f5caaabed8838e092cba3d080fe9184024049dcf",
|
|
221
221
|
"spec/v2/core/form-content-packs.md": "6ffaae85d4550be48dd53fb6e2959af8aceb35bd87c5343b722885084f197713",
|
|
222
|
-
"spec/v2/core/headers.md": "
|
|
222
|
+
"spec/v2/core/headers.md": "6d56dca18fc5dfe3870a40863247a33f57bba3dad624200e9cf9fa9358df90b9",
|
|
223
223
|
"spec/v2/core/idempotency.md": "b86c352d964aebad532727f314e26ed2177d49de382076fa64d3162e2f56118d",
|
|
224
224
|
"spec/v2/core/identity.md": "9d2b823eb899463807452fe5721dcf09881837c161be024175957db27870b243",
|
|
225
225
|
"spec/v2/core/interop.md": "d4c404e469e1d9d9be88bc2c939d777e7d7c1d0419b1251c18770f039838a401",
|
|
@@ -271,8 +271,8 @@
|
|
|
271
271
|
"spec/v2/path-manifest.json": "a6f4e652e866889e8bde815874062f62929aee95dc8e58e7152c56adee262163",
|
|
272
272
|
"spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
|
|
273
273
|
"spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
|
|
274
|
-
"spec/v2/release.json": "
|
|
274
|
+
"spec/v2/release.json": "5452e872bc486fbf8aa970e8cd42333c05a48c31422ceb858f5142dbc30181a6",
|
|
275
275
|
"spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
|
|
276
276
|
},
|
|
277
|
-
"corpusCommit": "
|
|
277
|
+
"corpusCommit": "bbdafa8e3a46a3c26d8fa0280d3fb541f9993d84"
|
|
278
278
|
}
|
package/api/seams-v2.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
openapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: OpenWOP conformance seams profile (openwop-conformance-seams-v2)
|
|
4
|
-
version: 2.4.
|
|
4
|
+
version: 2.4.7
|
|
5
5
|
description: 'GENERATED by scripts/derive-v2-api.py. RFC 0168 §C: the seams are a versioned conformance profile with their
|
|
6
6
|
own document and path space (/conformance/seams/…), validated against the canonical v2 schemas with no tolerance path,
|
|
7
7
|
forbidden from the capability namespace (a host advertises the profile, never a testSeams flag). This document carries
|
package/api/v2/asyncapi.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
asyncapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: OpenWOP v2 event streams
|
|
4
|
-
version: 2.4.
|
|
4
|
+
version: 2.4.7
|
|
5
5
|
description: GENERATED by scripts/derive-v2-api.py (RFC 0171 §E.1, RFC 0172 §C.2). One run-events channel whose address
|
|
6
6
|
is the OpenAPI path key; the server pathname is empty (bare origin). streamMode is a pattern over the closed set and its
|
|
7
7
|
comma-separated combinations (`values` never combines). hostEvents has a real address (RFC 0171 §E.1) — the documented
|
package/api/v2/openapi.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
openapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: OpenWOP v2 API
|
|
4
|
-
version: 2.4.
|
|
4
|
+
version: 2.4.7
|
|
5
5
|
summary: REST surface for declaring, executing, suspending, resuming, and observing multi-step workflows.
|
|
6
6
|
description: GENERATED by scripts/derive-v2-api.py from api/openapi.yaml and the RFC 0167 children (v2 charter Phase 3,
|
|
7
7
|
P3-C). Bare origin, unversioned path keys, negotiation by `OpenWOP-Version` + `protocolVersions[]` (RFC 0172 §A). No seam
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/spec-artifacts",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.7",
|
|
4
4
|
"description": "The OpenWOP machine-readable contract: api/ (OpenAPI, AsyncAPI, the seams profile), schemas/ (v1 and v2 JSON Schemas), the spec/v1 and spec/v2 registries (errors, event codemap, declaration, deprecations, migrations, gaps) and CORPUS-STAMP.json — published from the openwop/openwop corpus tag; the peer dependency @openwop/openwop-conformance digest-checks at start (RFC 0168 §D.2).",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"repository": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/a2a-task-state.schema.json",
|
|
4
4
|
"title": "A2ATaskState",
|
|
5
|
-
"description": "RFC 0100
|
|
5
|
+
"description": "RFC 0100 \u00a72. The durable, persisted projection of an A2A `Task` an OpenWOP host keeps per backing run when it advertises `capabilities.a2a.durableTasks: true` \u2014 durable for the run's whole lifecycle (surviving caller disconnect, host restart within retention, and HITL pauses) so `tasks/get` returns live state after a disconnect. It is the persisted form of the `a2a-integration.md` \u00a7\"State projection (forward)\" mapping, NOT a new mapping. Content-free of run inputs/outputs/artifacts/credential material (SR-1 / `a2a-integration.md` trust boundary) \u2014 artifacts project to A2A `Artifact`s over the A2A transport, not into this record.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"taskId": {
|
|
16
16
|
"type": "string",
|
|
17
17
|
"minLength": 1,
|
|
18
|
-
"description": "The A2A Task.id. MUST equal the backing OpenWOP `runId` (a2a-integration.md
|
|
18
|
+
"description": "The A2A Task.id. MUST equal the backing OpenWOP `runId` (a2a-integration.md \u00a72 \u2014 'the returned runId becomes the A2A Task.id')."
|
|
19
19
|
},
|
|
20
20
|
"runId": {
|
|
21
21
|
"$ref": "ids.schema.json#/$defs/runId",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
},
|
|
24
24
|
"contextId": {
|
|
25
25
|
"type": "string",
|
|
26
|
-
"description": "The A2A context_id (carried as the run tag `a2a:ctx_*` per a2a-integration.md
|
|
26
|
+
"description": "The A2A context_id (carried as the run tag `a2a:ctx_*` per a2a-integration.md \u00a72)."
|
|
27
27
|
},
|
|
28
28
|
"state": {
|
|
29
29
|
"type": "string",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"canceled",
|
|
38
38
|
"rejected"
|
|
39
39
|
],
|
|
40
|
-
"description": "The A2A 0.3 JSON-RPC wire form (lowercase-hyphen
|
|
40
|
+
"description": "The A2A 0.3 JSON-RPC wire form (lowercase-hyphen \u2014 a2a-integration.md \u00a7'Wire-shape spelling drift'). Projected from `run.status` per a2a-integration.md \u00a7'State projection (forward)': pending\u2192submitted, running\u2192working, paused\u2192working, waiting-approval/waiting-input\u2192input-required, completed\u2192completed, failed\u2192failed, cancelled\u2192canceled. `auth-required` is carried for reverse-direction fidelity only; the forward projection never sets it (openwop has no native auth interrupt \u2014 a2a-integration.md drift point #3)."
|
|
41
41
|
},
|
|
42
42
|
"interruptKind": {
|
|
43
43
|
"type": "string",
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"approval",
|
|
46
46
|
"clarification"
|
|
47
47
|
],
|
|
48
|
-
"description": "Present iff `state == 'input-required'`. Disambiguates a2a-integration.md drift point #2 (both approval + clarification project to INPUT_REQUIRED)
|
|
48
|
+
"description": "Present iff `state == 'input-required'`. Disambiguates a2a-integration.md drift point #2 (both approval + clarification project to INPUT_REQUIRED) \u2014 carried in `Task.metadata.openwop.interrupt.kind`, the `metadata.openwop.*` shape the doc's Future-work asks to codify."
|
|
49
49
|
},
|
|
50
50
|
"updatedAt": {
|
|
51
51
|
"type": "string",
|
|
@@ -63,17 +63,17 @@
|
|
|
63
63
|
"required": [
|
|
64
64
|
"url"
|
|
65
65
|
],
|
|
66
|
-
"description": "RFC 0100
|
|
66
|
+
"description": "RFC 0100 \u00a74. A caller-registered A2A push-notification config for this Task.",
|
|
67
67
|
"properties": {
|
|
68
68
|
"url": {
|
|
69
69
|
"type": "string",
|
|
70
70
|
"format": "uri",
|
|
71
|
-
"description": "Caller-registered push target. The host MUST validate it through the RFC 0093 webhook-egress SSRF guard before any push (no private/loopback/link-local target)
|
|
71
|
+
"description": "Caller-registered push target. The host MUST validate it through the RFC 0093 webhook-egress SSRF guard before any push (no private/loopback/link-local target) \u2014 SECURITY invariant `a2a-push-egress-ssrf`."
|
|
72
72
|
},
|
|
73
73
|
"tokenFingerprint": {
|
|
74
74
|
"type": "string",
|
|
75
75
|
"maxLength": 32,
|
|
76
|
-
"description": "MAY
|
|
76
|
+
"description": "MAY \u2014 a truncated/salted digest of the caller's push-auth token (NEVER the raw token; same SR-1 rule as RFC 0083's `secretFingerprint`). The A2A push HMAC details (A2A \u00a74.3.3) stay inside the A2A layer per a2a-integration.md."
|
|
77
77
|
}
|
|
78
78
|
}
|
|
79
79
|
}
|
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
"examples": [
|
|
82
82
|
{
|
|
83
83
|
"taskId": "run_x",
|
|
84
|
-
"runId": "run_x",
|
|
84
|
+
"runId": "acme/run_x-xxxxxxxxxx",
|
|
85
85
|
"contextId": "ctx_42",
|
|
86
86
|
"state": "input-required",
|
|
87
87
|
"interruptKind": "approval",
|
|
@@ -93,7 +93,7 @@
|
|
|
93
93
|
},
|
|
94
94
|
{
|
|
95
95
|
"taskId": "run_y",
|
|
96
|
-
"runId": "run_y",
|
|
96
|
+
"runId": "acme/run_y-xxxxxxxxxx",
|
|
97
97
|
"state": "completed",
|
|
98
98
|
"updatedAt": "2026-06-13T19:05:00Z"
|
|
99
99
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/channel-presence-payload.schema.json",
|
|
4
4
|
"title": "ChannelPresencePayload",
|
|
5
|
-
"description": "Payload of the OPTIONAL `channel.presence` RunEvent (RFC 0110). EPHEMERAL live presence for a `type:'channel'` conversation
|
|
5
|
+
"description": "Payload of the OPTIONAL `channel.presence` RunEvent (RFC 0110). EPHEMERAL live presence for a `type:'channel'` conversation \u2014 who is currently present + (optionally) who is typing. A host MUST NOT persist this event to the replayable event log / transcript, and it MUST NOT affect replay or `:fork` determinism (presence is live state, the load-bearing distinction from the persisted `conversation.exchanged` turn \u2014 see replay.md). Membership-gated: every ref MUST be a current channel participant and the event MUST NOT be delivered to a non-member (the same DEFAULT-DENY visibility as the channel's messages; cross-tenant delivery is forbidden, CTI-1). NON-PII: subject refs are the opaque RFC 0041 vocabulary only \u2014 no IP/location/device. A host MAY emit; if it advertises `channelPresence.supported` it MUST. Gated on `channelPresence.supported` (capabilities.schema.json). See RFC 0110.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"conversationId",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
},
|
|
19
19
|
"present": {
|
|
20
20
|
"type": "array",
|
|
21
|
-
"description": "Subject refs (RFC 0041 vocabulary `user:<id>` / `agent:<id>`
|
|
21
|
+
"description": "Subject refs (RFC 0041 vocabulary `user:<id>` / `agent:<id>` \u2014 opaque, non-PII) of members CURRENTLY present in the channel. MUST be a subset of the channel's current participants; a non-member MUST NOT appear.",
|
|
22
22
|
"items": {
|
|
23
23
|
"type": "string",
|
|
24
24
|
"minLength": 1,
|
|
@@ -37,7 +37,6 @@
|
|
|
37
37
|
},
|
|
38
38
|
"examples": [
|
|
39
39
|
{
|
|
40
|
-
"$comment": "RFC 0110 POSITIVE — two members present in a channel, one typing.",
|
|
41
40
|
"conversationId": "chan-eng",
|
|
42
41
|
"present": [
|
|
43
42
|
"user:alice",
|
|
@@ -48,13 +47,12 @@
|
|
|
48
47
|
]
|
|
49
48
|
},
|
|
50
49
|
{
|
|
51
|
-
"$comment": "RFC 0110 POSITIVE — typing is OPTIONAL; a presence snapshot with no one typing.",
|
|
52
50
|
"conversationId": "chan-eng",
|
|
53
51
|
"present": [
|
|
54
52
|
"user:alice"
|
|
55
53
|
]
|
|
56
54
|
}
|
|
57
55
|
],
|
|
58
|
-
"$comment": "RFC 0110 NEGATIVE (not validatable as an examples[] entry, which must be VALID): a payload carrying any field beyond conversationId/present/typing (e.g. `ip`, `location`) MUST FAIL validation via `additionalProperties: false`
|
|
56
|
+
"$comment": "RFC 0110 NEGATIVE (not validatable as an examples[] entry, which must be VALID): a payload carrying any field beyond conversationId/present/typing (e.g. `ip`, `location`) MUST FAIL validation via `additionalProperties: false` \u2014 the no-PII guard; see conformance/src/scenarios/channel-presence-shape.test.ts.",
|
|
59
57
|
"x-openwop-seeded-from": "v1"
|
|
60
58
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/conversation-turn.schema.json",
|
|
4
4
|
"title": "ConversationTurn",
|
|
5
|
-
"description": "One turn in a multi-turn conversation. Structural superset of `ConversationMessage` (RFC 0002
|
|
5
|
+
"description": "One turn in a multi-turn conversation. Structural superset of `ConversationMessage` (RFC 0002 \u00a7G \u2014 append-only, idempotent on `messageId`, replay-deterministic). Adds `role`, optional `agent` reference, and `turnIndex` discriminators. Folds through the existing `applyMessage` reducer unchanged. See RFC 0005 \u00a7C.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"required": [
|
|
8
8
|
"messageId",
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
},
|
|
22
22
|
"from": {
|
|
23
23
|
"type": "string",
|
|
24
|
-
"description": "Sender identity. Either an agent ID (RFC 0002
|
|
24
|
+
"description": "Sender identity. Either an agent ID (RFC 0002 \u00a7A1) or the literal `'user'` for human-originated turns.",
|
|
25
25
|
"minLength": 1,
|
|
26
26
|
"maxLength": 256
|
|
27
27
|
},
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
},
|
|
33
33
|
"groupId": {
|
|
34
34
|
"type": "string",
|
|
35
|
-
"description": "Optional shared-agent group ID. When set, the turn is scoped to the `shared:<groupId>` agent context per RFC 0002
|
|
35
|
+
"description": "Optional shared-agent group ID. When set, the turn is scoped to the `shared:<groupId>` agent context per RFC 0002 \u00a7A8.",
|
|
36
36
|
"maxLength": 256
|
|
37
37
|
},
|
|
38
38
|
"content": {
|
|
@@ -58,11 +58,11 @@
|
|
|
58
58
|
"agent",
|
|
59
59
|
"system"
|
|
60
60
|
],
|
|
61
|
-
"description": "Discriminator distinguishing human-originated turns (`'user'`), AI-agent-originated turns (`'agent'`), and host-emitted procedural turns (`'system'`
|
|
61
|
+
"description": "Discriminator distinguishing human-originated turns (`'user'`), AI-agent-originated turns (`'agent'`), and host-emitted procedural turns (`'system'` \u2014 e.g., `'conversation timed out'`)."
|
|
62
62
|
},
|
|
63
63
|
"agent": {
|
|
64
64
|
"type": "object",
|
|
65
|
-
"description": "Optional agent reference (RFC 0002
|
|
65
|
+
"description": "Optional agent reference (RFC 0002 \u00a7A1 `AgentRef`) for `role: 'agent'` turns. The same shape RFC 0002 reserves on `RunSnapshot.agent` and `node.started.payload.agent` \u2014 propagated through inheritance.",
|
|
66
66
|
"properties": {
|
|
67
67
|
"agentId": {
|
|
68
68
|
"$ref": "ids.schema.json#/$defs/agentId"
|
|
@@ -74,15 +74,15 @@
|
|
|
74
74
|
"shared",
|
|
75
75
|
"shared:%shared%"
|
|
76
76
|
],
|
|
77
|
-
"description": "Per RFC 0002
|
|
77
|
+
"description": "Per RFC 0002 \u00a7A8 \u2014 `shared:<groupId>` requires a `groupId` field on the message."
|
|
78
78
|
},
|
|
79
79
|
"memoryRef": {
|
|
80
80
|
"type": "string",
|
|
81
|
-
"description": "Opaque memory reference per RFC 0002
|
|
81
|
+
"description": "Opaque memory reference per RFC 0002 \u00a7A + RFC 0004 \u00a7A. Resolves to `MemoryEntry[]` via host `MemoryAdapter` for cross-run conversation continuity."
|
|
82
82
|
},
|
|
83
83
|
"model": {
|
|
84
84
|
"type": "object",
|
|
85
|
-
"description": "RFC 0109
|
|
85
|
+
"description": "RFC 0109 \u2014 OPTIONAL provenance: which model produced this `role: 'agent'` turn. NON-SECRET, NON-PII: provider + model identifiers ONLY (`additionalProperties: false` forbids any credential/endpoint/prompt leaking in \u2014 the SR-1 secret-redaction guard). Stamped at emit; read VERBATIM on `:fork` (never re-resolved). A host that stamps it MUST advertise `conversationTurnModelProvenance.supported: true`. Absent \u21d2 no advertisement; clients MUST tolerate its absence.",
|
|
86
86
|
"additionalProperties": false,
|
|
87
87
|
"required": [
|
|
88
88
|
"provider",
|
|
@@ -115,12 +115,12 @@
|
|
|
115
115
|
"type": "string",
|
|
116
116
|
"minLength": 1,
|
|
117
117
|
"maxLength": 256,
|
|
118
|
-
"description": "RFC 0101. Stable speaker identity of this turn
|
|
118
|
+
"description": "RFC 0101. Stable speaker identity of this turn \u2014 the roster INSTANCE id of the agent that produced it (the `host:<id>` AgentRef agentId per `agent-roster-entry.schema.json` \u00a7A / RFC 0086), NOT the manifest/class `AgentRef.agentId`. REQUIRED when `role: 'agent'` (the conditional below) so that 'turn N was spoken by agent X' is an observable, replay-stable, cross-host-projectable fact in a multi-party transcript. When a `participants` roster is declared on `conversation.opened` (RFC 0101), `speakerId` MUST be a member of that roster; a turn whose `speakerId` is not a participant MUST be rejected (host-enforced, capability-gated on `multiPartyConversation.supported`). For `role: 'user'` / `role: 'system'` turns the field is OPTIONAL and carries no normative meaning. Additive-safe: pre-RFC-0101 `role: 'agent'` turns that omit it are accepted by hosts that do NOT advertise `multiPartyConversation`."
|
|
119
119
|
}
|
|
120
120
|
},
|
|
121
121
|
"allOf": [
|
|
122
122
|
{
|
|
123
|
-
"$comment": "RFC 0101
|
|
123
|
+
"$comment": "RFC 0101 \u2014 agent turns MUST carry speaker attribution. Conditional (not unconditional `required`) so the field is only mandatory for `role: 'agent'`; `user`/`system` turns and pre-RFC-0101 producers on non-multi-party hosts are unaffected. Capability-gated: hosts enforce this only when advertising `multiPartyConversation.supported` (capabilities.schema.json).",
|
|
124
124
|
"if": {
|
|
125
125
|
"properties": {
|
|
126
126
|
"role": {
|
|
@@ -140,7 +140,6 @@
|
|
|
140
140
|
],
|
|
141
141
|
"examples": [
|
|
142
142
|
{
|
|
143
|
-
"$comment": "RFC 0101 POSITIVE — an agent turn in a multi-party council carrying speaker attribution (the roster instance id).",
|
|
144
143
|
"messageId": "council-q1:1:agent",
|
|
145
144
|
"from": "host:advisor-cfo",
|
|
146
145
|
"content": "From a cash-runway view I'd push the launch one quarter.",
|
|
@@ -150,7 +149,6 @@
|
|
|
150
149
|
"speakerId": "host:advisor-cfo"
|
|
151
150
|
},
|
|
152
151
|
{
|
|
153
|
-
"$comment": "RFC 0101 POSITIVE — a user turn; speakerId is OPTIONAL for non-agent roles and omitted here.",
|
|
154
152
|
"messageId": "council-q1:0:user",
|
|
155
153
|
"from": "user",
|
|
156
154
|
"content": "Should we launch in Q3 or Q4?",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/self-hosted-runner-dispatch-frame.schema.json",
|
|
4
4
|
"title": "SelfHostedRunnerDispatchFrame",
|
|
5
|
-
"description": "RFC 0122
|
|
5
|
+
"description": "RFC 0122 \u00a7Registration + channel. A single model/tool DISPATCH STEP the host routes to a registered runner over the runner\u2194host channel (`self-hosted-runner.md`). The host is the sole orchestration/persistence/replay authority; this frame carries ONE step's inputs, never a whole run. `inputs` is opaque model/tool input (messages, tool arguments) and MUST NOT contain runner-credential material \u2014 the runner holds its own credential locally (SECURITY invariant `runner-credential-non-transit`). `seq` is the per-runner monotonic DISPATCH cursor, a DISTINCT sequence from the run event-log `sequence` (they MUST NOT be conflated); a reconnecting runner resumes via `Last-Event-ID` at this cursor and the host drops any redelivered `{runId, stepId}` whose result is already persisted (at-most-once).",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"seq": {
|
|
26
26
|
"type": "integer",
|
|
27
27
|
"minimum": 0,
|
|
28
|
-
"description": "The per-runner monotonic dispatch cursor for the channel. DISTINCT from the run event-log `sequence` (MUST NOT be conflated
|
|
28
|
+
"description": "The per-runner monotonic dispatch cursor for the channel. DISTINCT from the run event-log `sequence` (MUST NOT be conflated \u2014 conflating them breaks resume dedup). A reconnecting runner resumes via the SSE `Last-Event-ID` at this cursor so a dispatch is never redelivered past it (`stream-modes.md \u00a7Resumption`)."
|
|
29
29
|
},
|
|
30
30
|
"kind": {
|
|
31
31
|
"type": "string",
|
|
@@ -89,7 +89,7 @@
|
|
|
89
89
|
],
|
|
90
90
|
"examples": [
|
|
91
91
|
{
|
|
92
|
-
"runId": "run_x",
|
|
92
|
+
"runId": "acme/run_x-xxxxxxxxxx",
|
|
93
93
|
"stepId": "step_3",
|
|
94
94
|
"seq": 12,
|
|
95
95
|
"kind": "model",
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
}
|
|
106
106
|
},
|
|
107
107
|
{
|
|
108
|
-
"runId": "run_y",
|
|
108
|
+
"runId": "acme/run_y-xxxxxxxxxx",
|
|
109
109
|
"stepId": "step_1",
|
|
110
110
|
"seq": 0,
|
|
111
111
|
"kind": "tool",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/self-hosted-runner-result-frame.schema.json",
|
|
4
4
|
"title": "SelfHostedRunnerResultFrame",
|
|
5
|
-
"description": "RFC 0122
|
|
5
|
+
"description": "RFC 0122 \u00a7Registration + channel. The runner's answer to one `SelfHostedRunnerDispatchFrame`, POSTed back to the host over ordinary HTTP. The `{runId, stepId}` pair MUST equal the dispatch it answers (the at-most-once idempotency key); `seq` echoes the dispatch cursor. `output` is the opaque model/tool output the host persists as a normal step record \u2014 replay reads from persistence and NEVER re-dispatches. `output` MUST NOT contain runner-credential material (`runner-credential-non-transit`), and the host MUST treat it as UNTRUSTED transport: content re-entering an agent loop is fenced `<UNTRUSTED>` (`runner-output-untrusted-transport`). A provider-side error is carried inside `output` (it is still a model/tool output); host-side liveness failure is signalled out-of-band as the retriable `runner_unavailable` error, NOT as a result frame.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"examples": [
|
|
36
36
|
{
|
|
37
|
-
"runId": "run_x",
|
|
37
|
+
"runId": "acme/run_x-xxxxxxxxxx",
|
|
38
38
|
"stepId": "step_3",
|
|
39
39
|
"seq": 12,
|
|
40
40
|
"output": {
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://openwop.dev/spec/v2/trigger-event.schema.json",
|
|
4
4
|
"title": "TriggerEvent",
|
|
5
|
-
"description": "RFC 0099
|
|
5
|
+
"description": "RFC 0099 \u00a7F.1. The normalized external-event envelope a host hands a started run as `ctx.triggerData` when an externally-originated event (`webhook`/`email`/`form`/`stream`/`change`) is delivered to an `active` TriggerSubscription (RFC 0083). This is an IN-RUN payload only \u2014 it never appears on the durable event log; the `trigger.delivery.attempted` event stays content-free (RFC 0083 \u00a7C / SECURITY `trigger-ingestion-content-redaction`). A TriggerEvent carries exactly the per-source sub-object matching its `source`. All content is `untrusted` (SECURITY `threat-model-prompt-injection.md`).",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": [
|
|
@@ -21,19 +21,19 @@
|
|
|
21
21
|
"stream",
|
|
22
22
|
"change"
|
|
23
23
|
],
|
|
24
|
-
"description": "Which external source originated the event. A TriggerEvent MUST carry exactly the per-source sub-object matching this value and MUST NOT carry the others (RFC 0099
|
|
24
|
+
"description": "Which external source originated the event. A TriggerEvent MUST carry exactly the per-source sub-object matching this value and MUST NOT carry the others (RFC 0099 \u00a7F.1; `stream`/`change` per RFC 0127)."
|
|
25
25
|
},
|
|
26
26
|
"subscriptionId": {
|
|
27
27
|
"$ref": "ids.schema.json#/$defs/subscriptionId",
|
|
28
|
-
"description": "The RFC 0083
|
|
28
|
+
"description": "The RFC 0083 \u00a7B subscription this event was delivered to."
|
|
29
29
|
},
|
|
30
30
|
"deliveryId": {
|
|
31
31
|
"$ref": "ids.schema.json#/$defs/deliveryId",
|
|
32
|
-
"description": "Stable per-delivery id
|
|
32
|
+
"description": "Stable per-delivery id for this trigger delivery, tenant-bound per `identity.md` \u00a75. **It is NOT the `causationId` stamped on `run.started`.** An earlier revision of this description said it was; that claim was unsatisfiable from the moment RFC 0184/0187 made this kind tenant-bound \u2014 `deliveryId` REQUIRES a `<tenant>/<opaque>` form and `causationId` is typed as `eventId`, whose grammar admits no `/`, so no string can be both. No host emitted the pairing (the kind has no v2 read surface at all), so nothing was relying on it. How a run points back at the delivery that caused it is deliberately left open: RFC 0040 \u00a7Alternatives already rejected overloading `causationId` for a cross-space pointer in favour of a sibling field, and the v2 seat belongs in `spec/v2/core/webhooks.md` when `deliveryId` gets a read surface (RFC 0187 \u00a7Unresolved tracks it). A normative cross-field rule does not belong in a schema description in the first place."
|
|
33
33
|
},
|
|
34
34
|
"dedupKey": {
|
|
35
35
|
"type": "string",
|
|
36
|
-
"description": "The host-opaque dedup key (RFC 0083
|
|
36
|
+
"description": "The host-opaque dedup key (RFC 0083 \u00a7C-1). Present iff the subscription's `dedupEnabled`. MUST NOT embed inbound body/header content in cleartext (SECURITY `trigger-ingestion-content-redaction`)."
|
|
37
37
|
},
|
|
38
38
|
"receivedAt": {
|
|
39
39
|
"type": "string",
|
|
@@ -42,21 +42,21 @@
|
|
|
42
42
|
},
|
|
43
43
|
"verified": {
|
|
44
44
|
"type": "boolean",
|
|
45
|
-
"description": "Whether the host verified the source's authenticity (webhook signature / email DMARC / form CSRF+origin) before delivery per the subscription's `verification` policy (RFC 0099
|
|
45
|
+
"description": "Whether the host verified the source's authenticity (webhook signature / email DMARC / form CSRF+origin) before delivery per the subscription's `verification` policy (RFC 0099 \u00a7F.2). A run MUST be able to gate on this."
|
|
46
46
|
},
|
|
47
47
|
"contentTrust": {
|
|
48
48
|
"type": "string",
|
|
49
49
|
"enum": [
|
|
50
50
|
"untrusted"
|
|
51
51
|
],
|
|
52
|
-
"description": "Always `untrusted`. Inbound external content reaching an LLM node MUST be wrapped per `threat-model-prompt-injection.md`
|
|
52
|
+
"description": "Always `untrusted`. Inbound external content reaching an LLM node MUST be wrapped per `threat-model-prompt-injection.md` \u00a7UNTRUSTED; a TriggerEvent MUST NOT directly advance a HITL approval gate (the `prompt-injection-mcp-no-approval` invariant generalizes)."
|
|
53
53
|
},
|
|
54
54
|
"permittedPurposes": {
|
|
55
55
|
"type": "array",
|
|
56
56
|
"items": {
|
|
57
57
|
"type": "string"
|
|
58
58
|
},
|
|
59
|
-
"description": "RFC 0128
|
|
59
|
+
"description": "RFC 0128 \u2014 OPTIONAL declared uses the receiver is permitted to make of the accompanying data. Opaque purpose strings mapped to the host's local vocabulary; carries purpose categories only, never subject identifiers or consent records. Absent \u21d2 unlabelled (no constraint asserted); `[]` \u21d2 no onward use permitted (NOT the same as absent). A host advertising `purposePropagation` MUST honor the RFC 0128 \u00a73 propagation rules for this label."
|
|
60
60
|
},
|
|
61
61
|
"webhook": {
|
|
62
62
|
"$ref": "#/$defs/WebhookEvent"
|
|
@@ -76,7 +76,7 @@
|
|
|
76
76
|
},
|
|
77
77
|
"allOf": [
|
|
78
78
|
{
|
|
79
|
-
"description": "RFC 0099
|
|
79
|
+
"description": "RFC 0099 \u00a7F.1 \u2014 a TriggerEvent MUST carry exactly the per-source sub-object matching its `source` and MUST NOT carry the others.",
|
|
80
80
|
"if": {
|
|
81
81
|
"properties": {
|
|
82
82
|
"source": {
|
|
@@ -271,7 +271,7 @@
|
|
|
271
271
|
"additionalProperties": {
|
|
272
272
|
"type": "string"
|
|
273
273
|
},
|
|
274
|
-
"description": "Host-allowlisted headers only
|
|
274
|
+
"description": "Host-allowlisted headers only \u2014 a host MUST NOT pass through `Authorization`, `Cookie`, `Proxy-Authorization`, or any header carrying credential material (RFC 0099 \u00a7F.1 / SECURITY `trigger-ingestion-content-redaction`)."
|
|
275
275
|
},
|
|
276
276
|
"body": {
|
|
277
277
|
"description": "The parsed JSON body, or a string for non-JSON. Bounded by `triggerBridge.ingestion.maxBodyBytes`."
|
|
@@ -339,7 +339,7 @@
|
|
|
339
339
|
"partition": {
|
|
340
340
|
"type": "integer",
|
|
341
341
|
"minimum": 0,
|
|
342
|
-
"description": "Broker partition/shard, where the broker has one. With `offset`, feeds the RFC 0127
|
|
342
|
+
"description": "Broker partition/shard, where the broker has one. With `offset`, feeds the RFC 0127 \u00a74 dedup-key guidance `(topic, partition, offset)`."
|
|
343
343
|
},
|
|
344
344
|
"offset": {
|
|
345
345
|
"type": "string",
|
|
@@ -350,7 +350,7 @@
|
|
|
350
350
|
"description": "The message key, where the broker has one."
|
|
351
351
|
},
|
|
352
352
|
"message": {
|
|
353
|
-
"description": "The consumed message payload
|
|
353
|
+
"description": "The consumed message payload \u2014 parsed JSON, or a string for non-JSON. Bounded by `triggerBridge.ingestion.maxBodyBytes`."
|
|
354
354
|
}
|
|
355
355
|
}
|
|
356
356
|
},
|
|
@@ -369,11 +369,11 @@
|
|
|
369
369
|
"update",
|
|
370
370
|
"delete"
|
|
371
371
|
],
|
|
372
|
-
"description": "The change operation. REQUIRED (RFC 0127
|
|
372
|
+
"description": "The change operation. REQUIRED (RFC 0127 \u00a72 / resolved Q1 \u2014 one `change` source with an `op` discriminator, not per-verb sources)."
|
|
373
373
|
},
|
|
374
374
|
"table": {
|
|
375
375
|
"type": "string",
|
|
376
|
-
"description": "The source table/collection/entity name. With `changelogId`, feeds the RFC 0127
|
|
376
|
+
"description": "The source table/collection/entity name. With `changelogId`, feeds the RFC 0127 \u00a74 dedup-key guidance `(table, changelog-id)`."
|
|
377
377
|
},
|
|
378
378
|
"changelogId": {
|
|
379
379
|
"type": "string",
|
|
@@ -393,7 +393,7 @@
|
|
|
393
393
|
"required": [
|
|
394
394
|
"ref"
|
|
395
395
|
],
|
|
396
|
-
"description": "A host-internal opaque handle to a resolved attachment/upload
|
|
396
|
+
"description": "A host-internal opaque handle to a resolved attachment/upload \u2014 NEVER a raw external URL the run is expected to fetch itself (RFC 0099 \u00a7F.1/\u00a7F.4). The host resolves and ingests attachments through its SSRF guard (SECURITY `trigger-ingestion-ssrf`), then hands the run an internal ref.",
|
|
397
397
|
"properties": {
|
|
398
398
|
"ref": {
|
|
399
399
|
"type": "string",
|
|
@@ -416,8 +416,8 @@
|
|
|
416
416
|
"examples": [
|
|
417
417
|
{
|
|
418
418
|
"source": "email",
|
|
419
|
-
"subscriptionId": "sub_7",
|
|
420
|
-
"deliveryId": "dlv_a1b2",
|
|
419
|
+
"subscriptionId": "acme/sub_7-xxxxxxxxxx",
|
|
420
|
+
"deliveryId": "acme/dlv_a1b2-xxxxxxx",
|
|
421
421
|
"dedupKey": "msgid:abc@in.example.com",
|
|
422
422
|
"receivedAt": "2026-06-13T18:04:11Z",
|
|
423
423
|
"verified": true,
|
|
@@ -441,8 +441,8 @@
|
|
|
441
441
|
},
|
|
442
442
|
{
|
|
443
443
|
"source": "webhook",
|
|
444
|
-
"subscriptionId": "sub_9",
|
|
445
|
-
"deliveryId": "dlv_c3d4",
|
|
444
|
+
"subscriptionId": "acme/sub_9-xxxxxxxxxx",
|
|
445
|
+
"deliveryId": "acme/dlv_c3d4-xxxxxxx",
|
|
446
446
|
"receivedAt": "2026-06-13T18:10:00Z",
|
|
447
447
|
"verified": true,
|
|
448
448
|
"contentTrust": "untrusted",
|
|
@@ -461,8 +461,8 @@
|
|
|
461
461
|
},
|
|
462
462
|
{
|
|
463
463
|
"source": "stream",
|
|
464
|
-
"subscriptionId": "sub_12",
|
|
465
|
-
"deliveryId": "dlv_e5f6",
|
|
464
|
+
"subscriptionId": "acme/sub_12-xxxxxxxxx",
|
|
465
|
+
"deliveryId": "acme/dlv_e5f6-xxxxxxx",
|
|
466
466
|
"dedupKey": "events:3:88412",
|
|
467
467
|
"receivedAt": "2026-07-06T12:00:00Z",
|
|
468
468
|
"verified": true,
|
|
@@ -480,8 +480,8 @@
|
|
|
480
480
|
},
|
|
481
481
|
{
|
|
482
482
|
"source": "change",
|
|
483
|
-
"subscriptionId": "sub_13",
|
|
484
|
-
"deliveryId": "dlv_a7b8",
|
|
483
|
+
"subscriptionId": "acme/sub_13-xxxxxxxxx",
|
|
484
|
+
"deliveryId": "acme/dlv_a7b8-xxxxxxx",
|
|
485
485
|
"dedupKey": "contacts:lsn:0/1C4F9D0",
|
|
486
486
|
"receivedAt": "2026-07-06T12:01:00Z",
|
|
487
487
|
"verified": true,
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"provenance": {
|
|
5
5
|
"suite": {
|
|
6
6
|
"package": "@openwop/openwop-conformance",
|
|
7
|
-
"version": "2.4.
|
|
7
|
+
"version": "2.4.7"
|
|
8
8
|
},
|
|
9
9
|
"note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
|
|
10
10
|
},
|
|
@@ -419,5 +419,5 @@
|
|
|
419
419
|
"$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
|
|
420
420
|
}
|
|
421
421
|
],
|
|
422
|
-
"digest": "
|
|
422
|
+
"digest": "4bd818db3a9336113a60c9c0408eb07ad94fcc07a8e75e3827de559ddb9c4a35"
|
|
423
423
|
}
|
package/spec/v2/core/headers.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Headers
|
|
2
2
|
|
|
3
|
-
> **Status: Stable · v2.4.
|
|
3
|
+
> **Status: Stable · v2.4.7 (2026-09-18) · RFC 0171 §C.1, RFC 0172 §A.3–§A.4.** GENERATED by `scripts/derive-v2-api.py` from `api/v2/openapi.yaml`; do not edit.
|
|
4
4
|
|
|
5
5
|
## Why this exists
|
|
6
6
|
|
package/spec/v2/release.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "RFC 0172 §D.1 — the one release identity the v2 artifacts derive from. `version` is the next corpus tag `v<version>` (the publish workflow's coordinated-release tag pattern `v*`; RFC 0172's `openwop/v2.<minor>.<patch>` spelling is amended to this at its flip). api/v2/*.yaml info.version, the suite's 2.x version and @openwop/spec-artifacts read it. Bumped by the release PR that cuts the tag, never by hand elsewhere.",
|
|
3
|
-
"version": "2.4.
|
|
4
|
-
"corpusTag": "v2.4.
|
|
3
|
+
"version": "2.4.7",
|
|
4
|
+
"corpusTag": "v2.4.7",
|
|
5
5
|
"updated": "2026-09-18"
|
|
6
6
|
}
|