@openwop/spec-artifacts 2.0.0-rc.0

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 (229) hide show
  1. package/CORPUS-STAMP.json +234 -0
  2. package/LICENSE +201 -0
  3. package/README.md +7 -0
  4. package/api/.redocly.lint-ignore.yaml +22 -0
  5. package/api/asyncapi.yaml +834 -0
  6. package/api/grpc/openwop.proto +251 -0
  7. package/api/openapi.yaml +2693 -0
  8. package/api/redocly.yaml +23 -0
  9. package/api/seams-v2.yaml +680 -0
  10. package/api/v2/asyncapi.yaml +528 -0
  11. package/api/v2/openapi.yaml +3139 -0
  12. package/api/v2/redocly.yaml +16 -0
  13. package/package.json +10 -0
  14. package/schemas/README.md +144 -0
  15. package/schemas/a2a-task-state.schema.json +78 -0
  16. package/schemas/a2ui-surface-delta-frame.schema.json +48 -0
  17. package/schemas/agent-deployment-transition.schema.json +49 -0
  18. package/schemas/agent-deployment.schema.json +54 -0
  19. package/schemas/agent-eval-suite.schema.json +140 -0
  20. package/schemas/agent-inventory-response.schema.json +115 -0
  21. package/schemas/agent-manifest.schema.json +156 -0
  22. package/schemas/agent-org-chart.schema.json +82 -0
  23. package/schemas/agent-ref.schema.json +63 -0
  24. package/schemas/agent-roster-entry.schema.json +81 -0
  25. package/schemas/agent-roster-response.schema.json +21 -0
  26. package/schemas/ai-envelope.schema.json +134 -0
  27. package/schemas/annotation-create.schema.json +37 -0
  28. package/schemas/annotation.schema.json +56 -0
  29. package/schemas/artifact-type-pack-manifest.schema.json +244 -0
  30. package/schemas/audit-verify-result.schema.json +90 -0
  31. package/schemas/budget-policy.schema.json +18 -0
  32. package/schemas/capabilities.schema.json +4160 -0
  33. package/schemas/certification-bundle-v2.schema.json +118 -0
  34. package/schemas/channel-presence-payload.schema.json +41 -0
  35. package/schemas/channel-written-payload.schema.json +55 -0
  36. package/schemas/chat-card-pack-manifest.schema.json +253 -0
  37. package/schemas/compact-tool-descriptor.schema.json +51 -0
  38. package/schemas/compensation-policy.schema.json +64 -0
  39. package/schemas/conformance-certification-bundle.schema.json +86 -0
  40. package/schemas/connection-pack-manifest.schema.json +353 -0
  41. package/schemas/conversation-event.schema.json +168 -0
  42. package/schemas/conversation-turn.schema.json +117 -0
  43. package/schemas/core-conformance-mock-agent-config.schema.json +152 -0
  44. package/schemas/credential-provenance.schema.json +18 -0
  45. package/schemas/credential-reference.schema.json +21 -0
  46. package/schemas/debug-bundle.schema.json +196 -0
  47. package/schemas/dispatch-config.schema.json +112 -0
  48. package/schemas/envelopes/clarification.request.schema.json +52 -0
  49. package/schemas/envelopes/error.schema.json +30 -0
  50. package/schemas/envelopes/media.audio.schema.json +38 -0
  51. package/schemas/envelopes/media.file.schema.json +37 -0
  52. package/schemas/envelopes/media.image.schema.json +33 -0
  53. package/schemas/envelopes/schema.request.schema.json +26 -0
  54. package/schemas/envelopes/schema.response.schema.json +22 -0
  55. package/schemas/envelopes/ui.a2ui-surface.schema.json +154 -0
  56. package/schemas/error-envelope.schema.json +25 -0
  57. package/schemas/eval-summary.schema.json +92 -0
  58. package/schemas/export-bundle.schema.json +66 -0
  59. package/schemas/form-content-pack-manifest.schema.json +243 -0
  60. package/schemas/frontend-plugin-manifest.schema.json +109 -0
  61. package/schemas/goal.schema.json +104 -0
  62. package/schemas/heartbeat-evaluated.schema.json +14 -0
  63. package/schemas/heartbeat-state-changed.schema.json +14 -0
  64. package/schemas/localized-content-language-settings.schema.json +26 -0
  65. package/schemas/localized-content-page-response.schema.json +60 -0
  66. package/schemas/localized-content-page.schema.json +62 -0
  67. package/schemas/localized-content-section.schema.json +51 -0
  68. package/schemas/memory-entry.schema.json +36 -0
  69. package/schemas/memory-list-options.schema.json +37 -0
  70. package/schemas/node-pack-manifest.schema.json +654 -0
  71. package/schemas/orchestrator-decision.schema.json +90 -0
  72. package/schemas/org-chart-responsibility-view.schema.json +26 -0
  73. package/schemas/pack-lockfile.schema.json +108 -0
  74. package/schemas/prompt-kind.schema.json +8 -0
  75. package/schemas/prompt-pack-manifest.schema.json +117 -0
  76. package/schemas/prompt-ref.schema.json +40 -0
  77. package/schemas/prompt-template.schema.json +149 -0
  78. package/schemas/proposal.schema.json +84 -0
  79. package/schemas/registry-version-manifest.schema.json +208 -0
  80. package/schemas/residency.schema.json +16 -0
  81. package/schemas/run-ancestry-response.schema.json +54 -0
  82. package/schemas/run-diff-response.schema.json +64 -0
  83. package/schemas/run-event-payloads.schema.json +4452 -0
  84. package/schemas/run-event.schema.json +211 -0
  85. package/schemas/run-options.schema.json +80 -0
  86. package/schemas/run-orchestrator-decided-event.schema.json +20 -0
  87. package/schemas/run-snapshot.schema.json +148 -0
  88. package/schemas/security-advisory.schema.json +109 -0
  89. package/schemas/self-hosted-runner-dispatch-frame.schema.json +79 -0
  90. package/schemas/self-hosted-runner-registration.schema.json +53 -0
  91. package/schemas/self-hosted-runner-result-frame.schema.json +38 -0
  92. package/schemas/subject.schema.json +56 -0
  93. package/schemas/suspend-request.schema.json +207 -0
  94. package/schemas/tool-descriptor.schema.json +63 -0
  95. package/schemas/trigger-event.schema.json +222 -0
  96. package/schemas/trigger-subscription-registration.schema.json +67 -0
  97. package/schemas/trigger-subscription.schema.json +26 -0
  98. package/schemas/ui-plugin-message.schema.json +90 -0
  99. package/schemas/v2/a2a-task-state.schema.json +102 -0
  100. package/schemas/v2/a2ui-surface-delta-frame.schema.json +62 -0
  101. package/schemas/v2/agent-deployment-transition.schema.json +67 -0
  102. package/schemas/v2/agent-deployment.schema.json +68 -0
  103. package/schemas/v2/agent-eval-suite.schema.json +214 -0
  104. package/schemas/v2/agent-inventory-response.schema.json +172 -0
  105. package/schemas/v2/agent-manifest.schema.json +218 -0
  106. package/schemas/v2/agent-org-chart.schema.json +149 -0
  107. package/schemas/v2/agent-ref.schema.json +67 -0
  108. package/schemas/v2/agent-roster-entry.schema.json +104 -0
  109. package/schemas/v2/agent-roster-response.schema.json +27 -0
  110. package/schemas/v2/ai-envelope.schema.json +167 -0
  111. package/schemas/v2/annotation-create.schema.json +109 -0
  112. package/schemas/v2/annotation.schema.json +142 -0
  113. package/schemas/v2/artifact-type-pack-manifest.schema.json +245 -0
  114. package/schemas/v2/audit-verify-result.schema.json +110 -0
  115. package/schemas/v2/budget-policy.schema.json +61 -0
  116. package/schemas/v2/capabilities.schema.json +7644 -0
  117. package/schemas/v2/certification-bundle.schema.json +401 -0
  118. package/schemas/v2/channel-presence-payload.schema.json +60 -0
  119. package/schemas/v2/channel-written-payload.schema.json +64 -0
  120. package/schemas/v2/chat-card-pack-manifest.schema.json +254 -0
  121. package/schemas/v2/compact-tool-descriptor.schema.json +108 -0
  122. package/schemas/v2/compensation-policy.schema.json +91 -0
  123. package/schemas/v2/compensation-projection.schema.json +95 -0
  124. package/schemas/v2/configurable.schema.json +110 -0
  125. package/schemas/v2/connection-pack-manifest.schema.json +354 -0
  126. package/schemas/v2/conversation-event.schema.json +281 -0
  127. package/schemas/v2/conversation-turn.schema.json +165 -0
  128. package/schemas/v2/credential-provenance.schema.json +62 -0
  129. package/schemas/v2/credential-reference.schema.json +28 -0
  130. package/schemas/v2/debug-bundle.schema.json +312 -0
  131. package/schemas/v2/dispatch-config.schema.json +147 -0
  132. package/schemas/v2/effect-ledger-projection.schema.json +71 -0
  133. package/schemas/v2/effect-seam-manifest.schema.json +98 -0
  134. package/schemas/v2/envelopes/clarification.request.schema.json +59 -0
  135. package/schemas/v2/envelopes/error.schema.json +35 -0
  136. package/schemas/v2/envelopes/media.audio.schema.json +41 -0
  137. package/schemas/v2/envelopes/media.file.schema.json +40 -0
  138. package/schemas/v2/envelopes/media.image.schema.json +36 -0
  139. package/schemas/v2/envelopes/schema.request.schema.json +29 -0
  140. package/schemas/v2/envelopes/schema.response.schema.json +26 -0
  141. package/schemas/v2/envelopes/ui.a2ui-surface.schema.json +292 -0
  142. package/schemas/v2/error-envelope.schema.json +229 -0
  143. package/schemas/v2/eval-summary.schema.json +166 -0
  144. package/schemas/v2/export-bundle.schema.json +94 -0
  145. package/schemas/v2/form-content-pack-manifest.schema.json +241 -0
  146. package/schemas/v2/frontend-plugin-manifest.schema.json +152 -0
  147. package/schemas/v2/goal.schema.json +188 -0
  148. package/schemas/v2/heartbeat-evaluated.schema.json +34 -0
  149. package/schemas/v2/heartbeat-state-changed.schema.json +31 -0
  150. package/schemas/v2/ids.schema.json +31 -0
  151. package/schemas/v2/localized-content-language-settings.schema.json +34 -0
  152. package/schemas/v2/localized-content-page-response.schema.json +94 -0
  153. package/schemas/v2/localized-content-page.schema.json +87 -0
  154. package/schemas/v2/localized-content-section.schema.json +63 -0
  155. package/schemas/v2/memory-entry.schema.json +45 -0
  156. package/schemas/v2/memory-list-options.schema.json +41 -0
  157. package/schemas/v2/node-pack-manifest.schema.json +657 -0
  158. package/schemas/v2/orchestrator-decision.schema.json +120 -0
  159. package/schemas/v2/org-chart-responsibility-view.schema.json +36 -0
  160. package/schemas/v2/pack-lockfile.schema.json +139 -0
  161. package/schemas/v2/prompt-kind.schema.json +14 -0
  162. package/schemas/v2/prompt-pack-manifest.schema.json +118 -0
  163. package/schemas/v2/prompt-ref.schema.json +42 -0
  164. package/schemas/v2/prompt-template.schema.json +209 -0
  165. package/schemas/v2/proposal.schema.json +145 -0
  166. package/schemas/v2/registry-version-manifest.schema.json +292 -0
  167. package/schemas/v2/residency.schema.json +19 -0
  168. package/schemas/v2/run-ancestry-response.schema.json +68 -0
  169. package/schemas/v2/run-diff-response.schema.json +80 -0
  170. package/schemas/v2/run-event-payloads.schema.json +4588 -0
  171. package/schemas/v2/run-event.schema.json +324 -0
  172. package/schemas/v2/run-options.schema.json +90 -0
  173. package/schemas/v2/run-orchestrator-decided-event.schema.json +22 -0
  174. package/schemas/v2/run-snapshot.schema.json +207 -0
  175. package/schemas/v2/security-advisory.schema.json +138 -0
  176. package/schemas/v2/self-hosted-runner-dispatch-frame.schema.json +119 -0
  177. package/schemas/v2/self-hosted-runner-registration.schema.json +74 -0
  178. package/schemas/v2/self-hosted-runner-result-frame.schema.json +47 -0
  179. package/schemas/v2/subject-link.schema.json +69 -0
  180. package/schemas/v2/subject.schema.json +597 -0
  181. package/schemas/v2/suspend-request.schema.json +370 -0
  182. package/schemas/v2/tool-descriptor.schema.json +150 -0
  183. package/schemas/v2/trigger-event.schema.json +508 -0
  184. package/schemas/v2/trigger-subscription-registration.schema.json +99 -0
  185. package/schemas/v2/trigger-subscription.schema.json +79 -0
  186. package/schemas/v2/ui-plugin-message.schema.json +149 -0
  187. package/schemas/v2/workflow-chain-pack-manifest.schema.json +610 -0
  188. package/schemas/v2/workflow-definition.schema.json +864 -0
  189. package/schemas/v2/workload-identity.schema.json +115 -0
  190. package/schemas/v2/workspace-file-create.schema.json +23 -0
  191. package/schemas/v2/workspace-file.schema.json +45 -0
  192. package/schemas/workflow-chain-pack-manifest.schema.json +615 -0
  193. package/schemas/workflow-definition.schema.json +850 -0
  194. package/schemas/workload-identity.schema.json +79 -0
  195. package/schemas/workspace-file-create.schema.json +20 -0
  196. package/schemas/workspace-file.schema.json +39 -0
  197. package/spec/v1/alias-detectors.json +283 -0
  198. package/spec/v1/capability-declaration-classes.json +176 -0
  199. package/spec/v1/core-standard-manifest.json +423 -0
  200. package/spec/v1/deprecations.json +854 -0
  201. package/spec/v1/deprecations.schema.json +187 -0
  202. package/spec/v1/event-codemap.json +1089 -0
  203. package/spec/v1/event-codemap.schema.json +41 -0
  204. package/spec/v1/extensions.json +1273 -0
  205. package/spec/v1/gaps.json +14581 -0
  206. package/spec/v1/gaps.schema.json +55 -0
  207. package/spec/v1/migrations.json +1822 -0
  208. package/spec/v1/migrations.schema.json +44 -0
  209. package/spec/v1/operation-path-manifest.json +462 -0
  210. package/spec/v1/spec-gaps.json +4823 -0
  211. package/spec/v2/declaration.json +1862 -0
  212. package/spec/v2/declaration.schema.json +305 -0
  213. package/spec/v2/errors.json +837 -0
  214. package/spec/v2/event-codemap.json +1099 -0
  215. package/spec/v2/event-codemap.schema.json +114 -0
  216. package/spec/v2/ext/provider-idempotency/registry.json +6 -0
  217. package/spec/v2/facets/a2a.schema.json +51 -0
  218. package/spec/v2/facets/aiProviders.schema.json +56 -0
  219. package/spec/v2/facets/auth.schema.json +91 -0
  220. package/spec/v2/facets/heartbeat.schema.json +20 -0
  221. package/spec/v2/facets/interrupt.schema.json +29 -0
  222. package/spec/v2/facets/mcp.schema.json +81 -0
  223. package/spec/v2/facets/replay.schema.json +34 -0
  224. package/spec/v2/facets/sandbox.schema.json +31 -0
  225. package/spec/v2/facets/webhooks.schema.json +18 -0
  226. package/spec/v2/path-manifest.json +279 -0
  227. package/spec/v2/peer-dependency-aliases.json +165 -0
  228. package/spec/v2/profiles.json +45 -0
  229. package/spec/v2/release.json +6 -0
@@ -0,0 +1,52 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/envelopes/clarification.request.schema.json",
4
+ "title": "ClarificationRequestPayload",
5
+ "description": "Payload for the universal `clarification.request` AI Envelope kind. Emitted by an LLM when it needs additional information from the user before continuing. The engine MUST lift this payload to a `kind: \"clarification\"` `InterruptPayload` per `spec/v1/interrupt.md` §\"`kind: 'clarification'`\" and pause the node, OR refuse the run with `not-applicable` if the host does not implement clarification (clarifications are part of the `openwop-interrupts` profile per `profiles.md`). Counts against `Capabilities.limits.clarificationRounds`; on breach the engine emits `cap.breached { kind: 'clarification' }` and fails the node per `capabilities.md` §\"Engine-enforced limits\".",
6
+ "type": "object",
7
+ "required": ["questions"],
8
+ "properties": {
9
+ "reasoning": {
10
+ "type": "string",
11
+ "description": "OPTIONAL chain-of-thought field per RFC 0030 §A. Hosts SHOULD instruct the model to populate this with its analytical process before emitting the structured fields when reasoning materially improves output quality. The field is informational only — hosts SHALL NOT route on its contents. Hosts MUST NOT reject envelopes where `reasoning` is absent. Subject to the same SR-1 redaction harness as other envelope payload fields per `ai-envelope.md` §\"Redaction (SR-1 carry-forward)\" and the `envelope-reasoning-secret-redaction` SECURITY invariant."
12
+ },
13
+ "questions": {
14
+ "type": "array",
15
+ "minItems": 1,
16
+ "description": "One or more clarification questions to surface to the user. The engine MUST preserve ordering when lifting to the interrupt's `ClarificationData.questions[]`.",
17
+ "items": {
18
+ "type": "object",
19
+ "required": ["id", "question"],
20
+ "properties": {
21
+ "id": {
22
+ "type": "string",
23
+ "minLength": 1,
24
+ "maxLength": 128,
25
+ "description": "Stable id for this question within the envelope. Used by the matching `ClarificationResume.answers[].id`. SHOULD be deterministic across re-emissions of the same logical clarification (so replay can match answers to questions)."
26
+ },
27
+ "question": {
28
+ "type": "string",
29
+ "minLength": 1,
30
+ "description": "Human-readable question text. Localization is host-handled; the spec does not normate a per-locale variant on the envelope."
31
+ },
32
+ "schema": {
33
+ "description": "Optional JSON Schema constraining the answer shape (choices, free-text length, etc.). When present, the host's resolve endpoint SHOULD validate the answer against this schema before returning it to the engine.",
34
+ "type": "object"
35
+ },
36
+ "context": {
37
+ "description": "Optional open-shape metadata bag the LLM MAY use to surface per-question UI hints, trace pointers, or related context. Host-defined. The engine treats this as opaque; SR-1 redaction (`ai-envelope.md` §\"Redaction (SR-1 carry-forward)\") walks every payload field recursively, so any BYOK material that ends up here is scrubbed before persistence.",
38
+ "type": "object",
39
+ "additionalProperties": true
40
+ }
41
+ },
42
+ "additionalProperties": false
43
+ }
44
+ },
45
+ "contextType": {
46
+ "type": "string",
47
+ "maxLength": 128,
48
+ "description": "Optional UI hint for the host (e.g., `\"approval-feedback\"`, `\"form-field\"`). Not normative; passed through to the lifted `ClarificationData.contextType`."
49
+ }
50
+ },
51
+ "additionalProperties": false
52
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/envelopes/error.schema.json",
4
+ "title": "ErrorEnvelopePayload",
5
+ "description": "Payload for the universal `error` AI Envelope kind. The LLM's error report — the model said `I couldn't do that`. Distinct from the HTTP-level `ErrorEnvelope` in `error-envelope.schema.json`, which is the host's error report. Hosts MUST NOT collapse these two surfaces — an `error` envelope is a successful turn whose payload happens to be an error report, and the recommended `RunEventDoc.type` is `log.appended` (level `error`), NOT `node.failed`. The model deliberately surfaced the failure rather than guessing; treating it as a node failure penalizes correct behavior.",
6
+ "type": "object",
7
+ "required": ["code", "message"],
8
+ "properties": {
9
+ "reasoning": {
10
+ "type": "string",
11
+ "description": "OPTIONAL chain-of-thought field per RFC 0030 §A — useful when the model is explaining why it could not produce the requested envelope (the analytical process behind a `validation_failed` or `tool_call_refused` decision). Informational only; hosts SHALL NOT route on contents. Hosts MUST NOT reject envelopes where `reasoning` is absent. Subject to SR-1 redaction per `ai-envelope.md` §\"Redaction\" and the `envelope-reasoning-secret-redaction` invariant."
12
+ },
13
+ "code": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "maxLength": 128,
17
+ "description": "Namespaced machine-readable error code. SHOULD use snake_case. Recommended codes: `validation_failed` (LLM tried but couldn't satisfy the requested contract), `tool_call_refused` (LLM declined to invoke a tool per a safety guideline), `context_exhausted` (LLM ran out of context window mid-emission), `ambiguous_intent` (LLM couldn't disambiguate the user's request). Vendor codes MAY be namespaced as `<vendor>.<code>` per `host-extensions.md`."
18
+ },
19
+ "message": {
20
+ "type": "string",
21
+ "minLength": 1,
22
+ "description": "Human-readable error description from the LLM's perspective. Surfaces to users when the host's UI renders error envelopes."
23
+ },
24
+ "details": {
25
+ "type": "object",
26
+ "description": "Optional structured context. Schema varies by `code` — consumers MUST tolerate missing/unknown fields. Examples: `{requestedKind, requiredFields}` for `validation_failed`, `{toolName, refusalReason}` for `tool_call_refused`."
27
+ }
28
+ },
29
+ "additionalProperties": false
30
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/envelopes/media.audio.schema.json",
4
+ "title": "MediaAudioPayload",
5
+ "description": "Payload for the OPTIONAL `media.audio` AI Envelope kind (RFC 0055 §C). Carries a host-served URL reference (preferred) or, below the host's `aiProviders.maxInlineMediaBytes` cap, inline base64 audio data. Pairs with the `meta.rendering.display: \"audio\"` hint. Advertised, opt-in kind — not a MUST-recognize universal kind.",
6
+ "type": "object",
7
+ "required": ["bytes"],
8
+ "properties": {
9
+ "url": {
10
+ "type": "string",
11
+ "format": "uri",
12
+ "description": "Tenant-scoped, non-guessable host-served asset URL (RFC 0055 §C rule 1). SHOULD be used above `aiProviders.maxInlineMediaBytes`. Enforced by the `media-asset-url-tenant-scoped` SECURITY invariant."
13
+ },
14
+ "base64": {
15
+ "type": "string",
16
+ "description": "Inline base64-encoded audio, permitted only at or below `aiProviders.maxInlineMediaBytes` (RFC 0055 §C rule 2). Above the cap the host MUST use `url`."
17
+ },
18
+ "bytes": {
19
+ "type": "integer",
20
+ "minimum": 0,
21
+ "description": "Byte size of the asset."
22
+ },
23
+ "mimeType": {
24
+ "type": "string",
25
+ "description": "IANA media type (e.g. `audio/mpeg`, `audio/wav`, `audio/ogg`). SHOULD match `meta.rendering.mimeType`."
26
+ },
27
+ "durationSeconds": {
28
+ "type": "number",
29
+ "minimum": 0,
30
+ "description": "Optional clip duration in seconds, for a consumer's player UI."
31
+ },
32
+ "alt": {
33
+ "type": "string",
34
+ "description": "Text alternative / label for accessibility (RFC 0055 §B); mirrors `meta.rendering.alt` when the producer also sets the rendering hint."
35
+ }
36
+ },
37
+ "additionalProperties": false
38
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/envelopes/media.file.schema.json",
4
+ "title": "MediaFilePayload",
5
+ "description": "Payload for the OPTIONAL `media.file` AI Envelope kind (RFC 0055 §C). A downloadable, non-inline-rendered asset (document, archive, dataset). Carries a host-served URL reference (preferred) or, below the host's `aiProviders.maxInlineMediaBytes` cap, inline base64. Pairs with the `meta.rendering.display: \"file\"` hint. Advertised, opt-in kind — not a MUST-recognize universal kind.",
6
+ "type": "object",
7
+ "required": ["bytes"],
8
+ "properties": {
9
+ "url": {
10
+ "type": "string",
11
+ "format": "uri",
12
+ "description": "Tenant-scoped, non-guessable host-served asset URL (RFC 0055 §C rule 1). SHOULD be used above `aiProviders.maxInlineMediaBytes`. Enforced by the `media-asset-url-tenant-scoped` SECURITY invariant."
13
+ },
14
+ "base64": {
15
+ "type": "string",
16
+ "description": "Inline base64-encoded file bytes, permitted only at or below `aiProviders.maxInlineMediaBytes` (RFC 0055 §C rule 2). Above the cap the host MUST use `url`."
17
+ },
18
+ "bytes": {
19
+ "type": "integer",
20
+ "minimum": 0,
21
+ "description": "Byte size of the asset."
22
+ },
23
+ "mimeType": {
24
+ "type": "string",
25
+ "description": "IANA media type (e.g. `application/pdf`, `text/csv`, `application/zip`). SHOULD match `meta.rendering.mimeType`."
26
+ },
27
+ "name": {
28
+ "type": "string",
29
+ "description": "Optional suggested filename for download (e.g. `q3-report.pdf`)."
30
+ },
31
+ "alt": {
32
+ "type": "string",
33
+ "description": "Text alternative / label for accessibility (RFC 0055 §B); mirrors `meta.rendering.alt` when the producer also sets the rendering hint."
34
+ }
35
+ },
36
+ "additionalProperties": false
37
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/envelopes/media.image.schema.json",
4
+ "title": "MediaImagePayload",
5
+ "description": "Payload for the OPTIONAL `media.image` AI Envelope kind (RFC 0055 §C). Carries a host-served URL reference (preferred) or, below the host's `aiProviders.maxInlineMediaBytes` cap, inline base64 image data. Pairs with the `meta.rendering.display: \"image\"` hint. This is an advertised, opt-in kind — not one of the four MUST-recognize universal kinds; a host that emits no `media.*` kind is unaffected.",
6
+ "type": "object",
7
+ "required": ["bytes"],
8
+ "properties": {
9
+ "url": {
10
+ "type": "string",
11
+ "format": "uri",
12
+ "description": "Tenant-scoped, non-guessable host-served asset URL (RFC 0055 §C rule 1 — signed-token / capability-token discipline). SHOULD be used when the asset exceeds `capabilities.aiProviders.maxInlineMediaBytes`. Enforced by the `media-asset-url-tenant-scoped` SECURITY invariant."
13
+ },
14
+ "base64": {
15
+ "type": "string",
16
+ "description": "Inline base64-encoded image, permitted only when the asset is at or below `aiProviders.maxInlineMediaBytes` (default 256 KiB, RFC 0055 §C rule 2). Above the cap the host MUST use `url`. Mutually exclusive with `url` in practice — a single envelope carries one or the other."
17
+ },
18
+ "bytes": {
19
+ "type": "integer",
20
+ "minimum": 0,
21
+ "description": "Byte size of the asset. Required so a consumer can decide whether to inline-render or defer-fetch, and so the cap rule is checkable."
22
+ },
23
+ "mimeType": {
24
+ "type": "string",
25
+ "description": "IANA media type (e.g. `image/png`, `image/jpeg`, `image/webp`). SHOULD match `meta.rendering.mimeType`."
26
+ },
27
+ "alt": {
28
+ "type": "string",
29
+ "description": "Text alternative for accessibility (RFC 0055 §B). SHOULD be present so a consumer can describe the image to assistive technology; mirrors `meta.rendering.alt` when the producer also sets the rendering hint."
30
+ }
31
+ },
32
+ "additionalProperties": false
33
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/envelopes/schema.request.schema.json",
4
+ "title": "SchemaRequestPayload",
5
+ "description": "Payload for the universal `schema.request` AI Envelope kind. Emitted by an LLM when it wants the JSON Schema of a kind it doesn't have memorized (or wants to verify a kind's current shape before emitting). The engine's response is NOT a `RunEventDoc` — it is an out-of-band addition to the LLM's context for the next turn (returned via the same mechanism the host uses to inject system-prompt content). The response document SHOULD include the per-kind JSON Schema at `Capabilities.schemaVersions[envelopeType]`. Counts against `Capabilities.limits.schemaRounds`; on breach the engine emits `cap.breached { kind: 'schema' }` and fails the node per `capabilities.md` §\"Engine-enforced limits\".",
6
+ "type": "object",
7
+ "required": ["envelopeType"],
8
+ "properties": {
9
+ "reasoning": {
10
+ "type": "string",
11
+ "description": "OPTIONAL chain-of-thought field per RFC 0030 §A — useful when the model wants to explain why it's asking for the schema (e.g., uncertainty about a specific kind's shape). Informational only; hosts SHALL NOT route on contents. Hosts MUST NOT reject envelopes where `reasoning` is absent. Subject to SR-1 redaction per `ai-envelope.md` §\"Redaction\" and the `envelope-reasoning-secret-redaction` invariant."
12
+ },
13
+ "envelopeType": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "maxLength": 256,
17
+ "description": "Envelope kind the LLM is asking about. MUST be present in the host's `Capabilities.supportedEnvelopes` advertisement; engines MUST refuse `schema.request` for unknown kinds with `unknown_envelope_kind` (consistent with the production-flow ordering in `ai-envelope.md`)."
18
+ },
19
+ "reason": {
20
+ "type": "string",
21
+ "maxLength": 1024,
22
+ "description": "Optional diagnostic explaining why the LLM is requesting the schema (e.g., `\"I'm not sure my last emission matched\"`). Surfaces in OTel spans and debug bundles; never persisted into security-relevant payloads."
23
+ }
24
+ },
25
+ "additionalProperties": false
26
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/envelopes/schema.response.schema.json",
4
+ "title": "SchemaResponsePayload",
5
+ "description": "Payload for the universal `schema.response` AI Envelope kind. Side-channel acknowledgement that the LLM received a `schema.request` reply. Never surfaces to users. Engines MAY count this against `Capabilities.limits.envelopesPerTurn` or exempt it; conformance does not lock this choice (see `ai-envelope.md` §\"Universal kinds\").",
6
+ "type": "object",
7
+ "required": ["envelopeType", "ack"],
8
+ "properties": {
9
+ "envelopeType": {
10
+ "type": "string",
11
+ "minLength": 1,
12
+ "maxLength": 256,
13
+ "description": "Envelope kind whose schema delivery the LLM is acknowledging. SHOULD match the `envelopeType` from the preceding `schema.request`. Engines MAY refuse mismatches with `envelope_invalid` but are not required to (the LLM's acknowledgement is advisory)."
14
+ },
15
+ "ack": {
16
+ "type": "boolean",
17
+ "const": true,
18
+ "description": "Always `true`. The field exists so the payload validates structurally; an `ack: false` is meaningless (the LLM would simply not emit this envelope)."
19
+ }
20
+ },
21
+ "additionalProperties": false
22
+ }
@@ -0,0 +1,154 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/envelopes/ui.a2ui-surface.schema.json",
4
+ "title": "UiA2uiSurfacePayload",
5
+ "description": "Payload for the OPTIONAL, advertised `ui.a2ui-surface` AI Envelope kind (RFC 0102). Carries a declarative A2UI interface surface — a closed component tree the consumer renders with native widgets, routing user actions back to the producing agent WITHOUT executing any agent-supplied code. `ui.*` is a core, un-namespaced content-primitive family beside `media.*` (ai-envelope.md §\"A2UI surfaces\" / §\"Vendor-namespaced kinds\"). Not one of the four MUST-recognize universal kinds; an unrecognizing consumer falls back to store-without-render.",
6
+ "type": "object",
7
+ "required": ["catalogVersion", "surface"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "reasoning": {
11
+ "type": "string",
12
+ "description": "OPTIONAL per RFC 0030 §A — the model's reasoning, conventionally the first property of a kind whose payload benefits from multi-step composition."
13
+ },
14
+ "catalogVersion": {
15
+ "type": "string",
16
+ "enum": ["0.9.1"],
17
+ "description": "REQUIRED — the A2UI catalog version the surface targets. This enum IS the host's supported-version set (ai-envelope.md §\"A2UI surfaces\"); it is never a free string the producer invents. A consumer MUST refuse an unknown/higher version with `unknown_schema_version`. Pinning the version in the payload keeps `:fork`/replay deterministic after the external A2UI standard ships a breaking version."
18
+ },
19
+ "surface": {
20
+ "$ref": "#/$defs/surface",
21
+ "description": "REQUIRED — the A2UI surface document: a closed component tree (ai-envelope.md §\"A2UI surfaces\"). Self-contained: renderable from the payload alone, never a live reference into an external catalog."
22
+ }
23
+ },
24
+ "$defs": {
25
+ "surface": {
26
+ "type": "object",
27
+ "required": ["components"],
28
+ "additionalProperties": false,
29
+ "properties": {
30
+ "title": {
31
+ "type": "string",
32
+ "description": "OPTIONAL display title for the surface."
33
+ },
34
+ "components": {
35
+ "type": "array",
36
+ "description": "The flat, ordered component list. Each element is one of the host's day-1 catalog components, discriminated by the single-string-enum `component` field. `anyOf` (not `oneOf`) per ai-envelope.md §\"Schema discipline\".",
37
+ "items": { "$ref": "#/$defs/component" }
38
+ }
39
+ }
40
+ },
41
+ "component": {
42
+ "description": "A single A2UI component. Closed set (day-1 catalog 0.9.1); the `component` discriminator is a single-string-enum per branch.",
43
+ "anyOf": [
44
+ { "$ref": "#/$defs/heading" },
45
+ { "$ref": "#/$defs/text" },
46
+ { "$ref": "#/$defs/fieldText" },
47
+ { "$ref": "#/$defs/fieldDate" },
48
+ { "$ref": "#/$defs/fieldSelect" },
49
+ { "$ref": "#/$defs/fieldCheckbox" },
50
+ { "$ref": "#/$defs/actionButton" }
51
+ ]
52
+ },
53
+ "heading": {
54
+ "type": "object",
55
+ "required": ["component", "text"],
56
+ "additionalProperties": false,
57
+ "properties": {
58
+ "component": { "type": "string", "enum": ["heading"] },
59
+ "text": { "type": "string" },
60
+ "level": { "type": "integer", "minimum": 1, "maximum": 6 }
61
+ }
62
+ },
63
+ "text": {
64
+ "type": "object",
65
+ "required": ["component", "text"],
66
+ "additionalProperties": false,
67
+ "properties": {
68
+ "component": { "type": "string", "enum": ["text"] },
69
+ "text": { "type": "string" }
70
+ }
71
+ },
72
+ "fieldText": {
73
+ "type": "object",
74
+ "required": ["component", "id", "label"],
75
+ "additionalProperties": false,
76
+ "properties": {
77
+ "component": { "type": "string", "enum": ["field.text"] },
78
+ "id": { "type": "string", "description": "Binding key; the collected value is keyed by `id` in the resume value." },
79
+ "label": { "type": "string" },
80
+ "placeholder": { "type": "string" },
81
+ "required": { "type": "boolean" }
82
+ }
83
+ },
84
+ "fieldDate": {
85
+ "type": "object",
86
+ "required": ["component", "id", "label"],
87
+ "additionalProperties": false,
88
+ "properties": {
89
+ "component": { "type": "string", "enum": ["field.date"] },
90
+ "id": { "type": "string" },
91
+ "label": { "type": "string" },
92
+ "required": { "type": "boolean" }
93
+ }
94
+ },
95
+ "fieldSelect": {
96
+ "type": "object",
97
+ "required": ["component", "id", "label", "options"],
98
+ "additionalProperties": false,
99
+ "properties": {
100
+ "component": { "type": "string", "enum": ["field.select"] },
101
+ "id": { "type": "string" },
102
+ "label": { "type": "string" },
103
+ "required": { "type": "boolean" },
104
+ "options": {
105
+ "type": "array",
106
+ "minItems": 1,
107
+ "items": {
108
+ "type": "object",
109
+ "required": ["value", "label"],
110
+ "additionalProperties": false,
111
+ "properties": {
112
+ "value": { "type": "string" },
113
+ "label": { "type": "string" }
114
+ }
115
+ }
116
+ }
117
+ }
118
+ },
119
+ "fieldCheckbox": {
120
+ "type": "object",
121
+ "required": ["component", "id", "label"],
122
+ "additionalProperties": false,
123
+ "properties": {
124
+ "component": { "type": "string", "enum": ["field.checkbox"] },
125
+ "id": { "type": "string" },
126
+ "label": { "type": "string" },
127
+ "default": { "type": "boolean" }
128
+ }
129
+ },
130
+ "actionButton": {
131
+ "type": "object",
132
+ "required": ["component", "id", "label", "action"],
133
+ "additionalProperties": false,
134
+ "properties": {
135
+ "component": { "type": "string", "enum": ["action.button"] },
136
+ "id": { "type": "string" },
137
+ "label": { "type": "string" },
138
+ "action": {
139
+ "type": "object",
140
+ "required": ["target"],
141
+ "additionalProperties": false,
142
+ "description": "Confined action (ai-envelope.md §\"A2UI surfaces\" rule 2). `target` resolves to exactly one host-allowlisted destination — a run interrupt resume or a conversation exchange — never an arbitrary URL, endpoint, or network egress. Enforced by the `a2ui-action-confinement` + `a2ui-surface-no-network-egress` SECURITY invariants.",
143
+ "properties": {
144
+ "target": {
145
+ "type": "string",
146
+ "enum": ["resume", "exchange"],
147
+ "description": "`resume` → the collected field values become the interrupt `resumeValue` (interrupt.md). `exchange` → the values become a conversation exchange message (RFC 0005)."
148
+ }
149
+ }
150
+ }
151
+ }
152
+ }
153
+ }
154
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/error-envelope.schema.json",
4
+ "title": "ErrorEnvelope",
5
+ "description": "Canonical error response shape returned by every OpenWOP-compliant server on a non-2xx response. See rest-endpoints.md §error-envelope and auth.md §3.",
6
+ "type": "object",
7
+ "required": ["error", "message"],
8
+ "properties": {
9
+ "error": {
10
+ "type": "string",
11
+ "description": "Machine-readable error code (e.g., `unauthenticated`, `validation_error`, `not_found`, `run_already_active`, `unsupported_stream_mode`). Servers SHOULD use snake_case; spec-canonical codes are listed in `rest-endpoints.md`.",
12
+ "minLength": 1
13
+ },
14
+ "message": {
15
+ "type": "string",
16
+ "description": "Human-readable error description. Localizable per `Accept-Language` request header (servers MAY ignore).",
17
+ "minLength": 1
18
+ },
19
+ "details": {
20
+ "type": "object",
21
+ "description": "Error-specific contextual data. Schema varies by `error` code — readers MUST tolerate missing/unknown fields (forward-compat). Examples: `{retryAfter: 30}` for rate-limit errors, `{activeRunId, activeHost}` for run_already_active conflicts."
22
+ }
23
+ },
24
+ "additionalProperties": false
25
+ }
@@ -0,0 +1,92 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/eval-summary.schema.json",
4
+ "title": "EvalSummary",
5
+ "description": "RFC 0081 §C. The terminal scorecard of an eval run (the `mode: \"eval\"` projection over `POST /v1/runs`, RFC 0081 §B): the aggregate + per-task scores, cost, latency, schema-validity, and safety findings, plus the suite provenance and (for `regression` mode) the score delta vs a baseline. Set as the eval run's output and served by `GET /v1/runs/{runId}/eval-summary`. SECURITY invariant `eval-summary-no-content-leak`: the summary carries scores, ids, counts, and redaction-safe safety descriptors only — NEVER task output bodies, rubric prose, model completions, prompts, or credential material (SR-1). A consumer reads the run's normal projection for any body.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["suiteId", "suiteVersion", "aggregateScore", "passed", "taskCount", "passedCount", "tasks"],
9
+ "properties": {
10
+ "suiteId": {
11
+ "type": "string",
12
+ "pattern": "^[a-z0-9.-]+\\.evals\\.[a-z0-9-]+$",
13
+ "description": "The `agent-eval-suite.schema.json#suiteId` this summary scores."
14
+ },
15
+ "suiteVersion": {
16
+ "type": "string",
17
+ "pattern": "^[0-9]+\\.[0-9]+\\.[0-9]+$",
18
+ "description": "The pinned suite version the run executed (mirrors `eval.started.suiteVersion`)."
19
+ },
20
+ "evaluatedModelClass": {
21
+ "type": "string",
22
+ "enum": ["reasoning", "writing", "coding", "research", "classification", "general"],
23
+ "description": "MAY. The `AgentManifest.modelClass` (RFC 0002) the run was evaluated against, so a score is read against its model. Present when the host resolves a concrete class."
24
+ },
25
+ "aggregateScore": {
26
+ "type": "number",
27
+ "minimum": 0,
28
+ "maximum": 1,
29
+ "description": "The suite-level score (0.0–1.0): the aggregation (host-defined, typically the mean) of per-task scores."
30
+ },
31
+ "passed": {
32
+ "type": "boolean",
33
+ "description": "Whether the run cleared the suite's `thresholds` (RFC 0081 §A) — `aggregateScore >= passScore` AND, when declared, `totalCostUsd <= maxCostUsd` AND the p95 latency bar. The load-bearing flag an RFC 0082 deployment gate may require (`requiredEval`)."
34
+ },
35
+ "taskCount": {
36
+ "type": "integer",
37
+ "minimum": 0,
38
+ "description": "Number of tasks executed."
39
+ },
40
+ "passedCount": {
41
+ "type": "integer",
42
+ "minimum": 0,
43
+ "description": "Number of tasks that individually passed."
44
+ },
45
+ "totalCostUsd": {
46
+ "type": "number",
47
+ "minimum": 0,
48
+ "description": "MAY. Total cost of the run, summed from the per-task RFC 0026 `provider.usage` events (the scalar only — never a pricing breakdown or rate card; `eval-summary-no-content-leak`)."
49
+ },
50
+ "tasks": {
51
+ "type": "array",
52
+ "description": "Per-task results, in suite order. Each entry is content-free: scores, scalars, ids, and redaction-safe safety descriptors only.",
53
+ "items": {
54
+ "type": "object",
55
+ "additionalProperties": false,
56
+ "required": ["taskId", "score", "passed"],
57
+ "properties": {
58
+ "taskId": { "type": "string", "pattern": "^[a-z0-9][a-z0-9-]*$", "description": "The `agent-eval-suite` task id." },
59
+ "score": { "type": "number", "minimum": 0, "maximum": 1, "description": "Task score (0.0–1.0)." },
60
+ "passed": { "type": "boolean", "description": "Whether this task individually met its bar." },
61
+ "costUsd": { "type": "number", "minimum": 0, "description": "MAY. Task cost (scalar)." },
62
+ "latencyMs": { "type": "integer", "minimum": 0, "description": "MAY. Task wall-clock latency." },
63
+ "schemaValid": { "type": "boolean", "description": "MAY. Whether the task output validated against the agent's `handoff.returnSchemaRef` (when structured-output enforcement is in effect)." },
64
+ "safetyFindings": {
65
+ "type": "array",
66
+ "description": "MAY. Redaction-safe safety findings (primarily `adversarial` mode). Each is a `{kind, severity}` descriptor — NO excerpted content, prompt, or completion text (`eval-summary-no-content-leak`).",
67
+ "items": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": ["kind", "severity"],
71
+ "properties": {
72
+ "kind": { "type": "string", "minLength": 1, "description": "Finding category (e.g. `jailbreak`, `pii-leak`, `unsafe-tool-call`) — a category label, not excerpted content." },
73
+ "severity": { "type": "string", "enum": ["low", "medium", "high", "critical"], "description": "Finding severity." }
74
+ }
75
+ }
76
+ }
77
+ }
78
+ }
79
+ },
80
+ "regression": {
81
+ "type": "object",
82
+ "additionalProperties": false,
83
+ "description": "MAY. Present for `regression` mode. The score delta vs a baseline eval run, plus a pointer to the RFC 0054 `:diff` for the structural divergence. Content-free.",
84
+ "required": ["baselineRunId", "scoreDelta"],
85
+ "properties": {
86
+ "baselineRunId": { "type": "string", "minLength": 1, "description": "The prior eval run this run is compared against." },
87
+ "scoreDelta": { "type": "number", "minimum": -1, "maximum": 1, "description": "`aggregateScore` minus the baseline's (negative ⇒ regression)." },
88
+ "diffRef": { "type": "string", "description": "MAY. A pointer to `GET /v1/runs/{runId}:diff?against={baselineRunId}` (RFC 0054) for the structural delta." }
89
+ }
90
+ }
91
+ }
92
+ }
@@ -0,0 +1,66 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v1/export-bundle.schema.json",
4
+ "title": "ExportBundle",
5
+ "description": "RFC 0098 §B. A portable agent-platform export bundle — a tenant's reusable estate (agents, packs, prompt templates, connection refs, schedules, roster/org-chart) composed for migration between openwop hosts (or import from an external platform via an adapter). The bundle MUST NOT contain credential VALUES: `connection-ref` items carry only refs/provider ids per RFC 0046/0079; the importer reports unbound refs in `secretsToRebind` and re-binds secrets at the destination. All imported entities are re-owned to the caller's RFC 0048 identity; `source.originPrincipal` is informational only and grants no access. Gated on the `portability` capability.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["bundleVersion", "source", "items"],
9
+ "properties": {
10
+ "bundleVersion": {
11
+ "const": "1",
12
+ "description": "Bundle schema version. Importers MUST reject a bundleVersion they do not understand."
13
+ },
14
+ "source": {
15
+ "type": "object",
16
+ "additionalProperties": false,
17
+ "required": ["origin"],
18
+ "description": "Provenance of the bundle. Informational only — never a source of authority at the destination.",
19
+ "properties": {
20
+ "origin": {
21
+ "type": "string",
22
+ "minLength": 1,
23
+ "description": "Origin host base URL or adapter id (e.g. 'adapter:openclaw')."
24
+ },
25
+ "exportedAt": { "type": "string", "format": "date-time" },
26
+ "originPrincipal": {
27
+ "type": ["string", "null"],
28
+ "default": null,
29
+ "description": "Opaque source identity, informational only. MUST NOT grant any access at the destination."
30
+ }
31
+ }
32
+ },
33
+ "items": {
34
+ "type": "array",
35
+ "description": "The estate, in arbitrary order; `dependsOn` edges define apply order (topological; a cycle is a 422).",
36
+ "items": {
37
+ "type": "object",
38
+ "additionalProperties": false,
39
+ "required": ["kind", "ref", "payload"],
40
+ "properties": {
41
+ "kind": {
42
+ "type": "string",
43
+ "enum": ["agent", "pack", "prompt-template", "connection-ref", "schedule", "roster", "org-chart"],
44
+ "description": "Estate kind. `agent` (RFC 0070), `pack` (RFC 0003/0013), `prompt-template` (RFC 0027), `connection-ref` (RFC 0045/0095 — refs only), `schedule` (RFC 0052), `roster` (RFC 0086), `org-chart` (RFC 0087)."
45
+ },
46
+ "ref": {
47
+ "type": "string",
48
+ "minLength": 1,
49
+ "description": "Stable id within the bundle, used as the target of `dependsOn` edges."
50
+ },
51
+ "dependsOn": {
52
+ "type": "array",
53
+ "items": { "type": "string" },
54
+ "default": [],
55
+ "description": "Refs of other items that MUST be applied before this one (topological order)."
56
+ },
57
+ "payload": {
58
+ "type": "object",
59
+ "description": "The kind's existing schema (RFC 0070 manifest, 0003/0013 pack, 0027 template, 0045/0095 connection *ref*, 0052 job, 0086 roster, 0087 org-chart). Deliberately open here because each kind validates against its own schema. For `connection-ref`, the payload MUST carry only refs/provider ids — a literal credential value is rejected (422).",
60
+ "$comment": "Intentionally open object — validated against the kind's own schema; connection-ref payloads MUST NOT contain credential values (export-bundle-no-credential-material)."
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ }