@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,254 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/chat-card-pack-manifest.schema.json",
4
+ "title": "ChatCardPackManifest",
5
+ "description": "Manifest for a published OpenWOP AI chat card pack — `pack.json` at the pack root with `kind: \"card\"`. Peer to the node / workflow-chain / prompt / artifact-type pack manifests; disjoint via the `kind` discriminator. See `spec/v1/chat-card-packs.md` for the canonical contract and RFC 0071 Phase 2 for the rationale.\n\nA chat card pack distributes AI step cards: each card binds a prompt template (with typed input slots) to a typed output artifact. When a host advertises `host.chat.cardPacks: supported` and a registered card is invoked, the host substitutes inputs into the prompt, routes the call through `ctx.aiEnvelope.generate`, and (when `outputArtifactType` is set) validates the result against the referenced artifact-type pack's schema before emitting `artifact.created`.",
6
+ "type": "object",
7
+ "required": [
8
+ "name",
9
+ "version",
10
+ "kind",
11
+ "engines",
12
+ "cards"
13
+ ],
14
+ "additionalProperties": false,
15
+ "properties": {
16
+ "kind": {
17
+ "type": "string",
18
+ "const": "card",
19
+ "description": "Pack kind discriminator. MUST be the literal string `\"card\"`."
20
+ },
21
+ "name": {
22
+ "type": "string",
23
+ "description": "Reverse-DNS pack name per `node-packs.md` §Naming. Reserved scopes are identical (`core.*` / `vendor.<org>.*` / `community.<author>.*` / `private.<host>.*`).",
24
+ "pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
25
+ "minLength": 1,
26
+ "maxLength": 256
27
+ },
28
+ "version": {
29
+ "type": "string",
30
+ "description": "Pack-level SemVer 2.0.0.",
31
+ "pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
32
+ },
33
+ "description": {
34
+ "type": "string",
35
+ "maxLength": 1024
36
+ },
37
+ "author": {
38
+ "type": "string"
39
+ },
40
+ "license": {
41
+ "type": "string",
42
+ "description": "SPDX license identifier (e.g., `Apache-2.0`, `MIT`)."
43
+ },
44
+ "homepage": {
45
+ "type": "string",
46
+ "format": "uri"
47
+ },
48
+ "repository": {
49
+ "type": "string",
50
+ "format": "uri"
51
+ },
52
+ "keywords": {
53
+ "type": "array",
54
+ "items": {
55
+ "type": "string",
56
+ "maxLength": 64
57
+ },
58
+ "maxItems": 50
59
+ },
60
+ "engines": {
61
+ "type": "object",
62
+ "required": [
63
+ "openwop"
64
+ ],
65
+ "properties": {
66
+ "openwop": {
67
+ "type": "string",
68
+ "description": "Semver range — which openwop protocol versions this pack works against."
69
+ }
70
+ },
71
+ "additionalProperties": false
72
+ },
73
+ "dependencies": {
74
+ "type": "object",
75
+ "additionalProperties": {
76
+ "type": "string"
77
+ },
78
+ "description": "Other packs this pack depends on (e.g., the artifact-type pack declaring this card's `outputArtifactType`). Map of pack name → semver range."
79
+ },
80
+ "peerDependencies": {
81
+ "type": "object",
82
+ "additionalProperties": {
83
+ "type": "string"
84
+ },
85
+ "description": "Engine-supplied capabilities the pack consumes (e.g., `{ \"host.aiEnvelope\": \"supported\", \"host.chat.cards\": \"supported\" }`). Resolved against the host's advertised capabilities at register time."
86
+ },
87
+ "cards": {
88
+ "type": "array",
89
+ "minItems": 1,
90
+ "items": {
91
+ "$ref": "#/$defs/Card"
92
+ },
93
+ "description": "AI chat card definitions this pack contributes. Each MUST have a unique `cardTypeId` within the pack."
94
+ },
95
+ "signing": {
96
+ "$ref": "#/$defs/Signing"
97
+ }
98
+ },
99
+ "$defs": {
100
+ "Card": {
101
+ "type": "object",
102
+ "required": [
103
+ "cardTypeId",
104
+ "prompt"
105
+ ],
106
+ "additionalProperties": false,
107
+ "properties": {
108
+ "cardTypeId": {
109
+ "type": "string",
110
+ "description": "Reverse-DNS card identifier. Same pattern and reserved scopes as a pack `name`. The value `WorkflowNode.cardType` / `ctx.chat.emitCard` MAY reference. Third parties MUST NOT publish under `core.*`.",
111
+ "pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
112
+ "minLength": 1,
113
+ "maxLength": 256
114
+ },
115
+ "schemaVersion": {
116
+ "type": "integer",
117
+ "minimum": 0,
118
+ "description": "Non-negative integer card-schema version (the envelope/artifact integer-version axis). Absent ⇒ treated as 0."
119
+ },
120
+ "prompt": {
121
+ "$ref": "#/$defs/PromptSpec"
122
+ },
123
+ "inputs": {
124
+ "type": "array",
125
+ "items": {
126
+ "$ref": "#/$defs/InputField"
127
+ },
128
+ "description": "Typed input fields the card collects. The portable subset only; host-specific widget kinds extend via `vendor.*`/`x-` prefixed `type` values."
129
+ },
130
+ "outputArtifactType": {
131
+ "type": "string",
132
+ "description": "A registered `artifactTypeId` (RFC 0071 Phase 1) the card produces. When present, the host MUST validate the LLM output against that artifact type's schema and emit `artifact.created`. Registered-only by design: unlike a bare node `WorkflowNode.artifactType` (where the unregistered free-string tier is permanently valid), a card's product is always a contract-bound artifact, so this MUST be a reverse-DNS registered id. Omit the field for a prompt-only card that produces no durable artifact.",
133
+ "pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$"
134
+ },
135
+ "outputSchemaRef": {
136
+ "type": "string",
137
+ "minLength": 1,
138
+ "description": "Path inside the pack tarball to the JSON Schema (Draft 2020-12) the LLM output MUST conform to. SHOULD be consistent with the referenced artifact type's schema. MUST set top-level `additionalProperties: false`."
139
+ },
140
+ "requiredModelCapabilities": {
141
+ "type": "array",
142
+ "items": {
143
+ "type": "string",
144
+ "pattern": "^([a-z][a-z0-9-]*|x-host-[a-z][a-z0-9-]*-[a-z][a-z0-9-]*)$"
145
+ },
146
+ "uniqueItems": true,
147
+ "maxItems": 32,
148
+ "description": "Model capabilities the card requires the active model to advertise. Reuses the `requiredModelCapabilities` registry in `host-capabilities.md` (spec-reserved: `structured-output`, `discriminator-enum`, `long-context`, `reasoning`, `function-calling`; host extensions `x-host-<host>-`)."
149
+ }
150
+ },
151
+ "patternProperties": {
152
+ "^(openwop-|x-|vendor\\.)": {
153
+ "description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md` §\"Vendor-prefixed namespaces\", which requires a client receiving an unknown vendor-prefixed field to treat it as opaque — a field that `additionalProperties: false` previously made impossible to carry. SECURITY: an extension value is PACK-AUTHORED, therefore untrusted; \"ignore\" means ignore. See `node-packs.md` §\"Vendor extensions on pack manifests\" and the `pack-manifest-extension-opaque` invariant."
154
+ }
155
+ }
156
+ },
157
+ "PromptSpec": {
158
+ "type": "object",
159
+ "required": [
160
+ "template",
161
+ "placeholderMapping"
162
+ ],
163
+ "additionalProperties": false,
164
+ "description": "The prompt the card composes. The host substitutes mapped input values into `template`/`systemPrompt` before dispatch; segments derived from card inputs are `untrusted` (RFC 0071 Trust boundary).",
165
+ "properties": {
166
+ "template": {
167
+ "type": "string",
168
+ "minLength": 1,
169
+ "description": "Prompt body with `{{placeholder}}` slots."
170
+ },
171
+ "systemPrompt": {
172
+ "type": "string",
173
+ "description": "Optional system prompt."
174
+ },
175
+ "placeholderMapping": {
176
+ "type": "object",
177
+ "additionalProperties": {
178
+ "type": "string"
179
+ },
180
+ "description": "Map of `{{placeholder}}` name → input path (e.g. `\"spec\": \"inputs.spec\"`)."
181
+ },
182
+ "temperature": {
183
+ "type": "number",
184
+ "minimum": 0,
185
+ "maximum": 2
186
+ },
187
+ "maxTokens": {
188
+ "type": "integer",
189
+ "minimum": 1
190
+ }
191
+ }
192
+ },
193
+ "InputField": {
194
+ "type": "object",
195
+ "required": [
196
+ "id",
197
+ "type"
198
+ ],
199
+ "additionalProperties": false,
200
+ "properties": {
201
+ "id": {
202
+ "type": "string",
203
+ "minLength": 1,
204
+ "pattern": "^[a-zA-Z_][a-zA-Z0-9_]*$"
205
+ },
206
+ "type": {
207
+ "type": "string",
208
+ "description": "Closed portable subset OR a `vendor.<org>.<kind>` / `x-<kind>` host extension other hosts ignore. The portable subset (G9, resolved 2026-05-27 against MyndHyve's `CardFieldType`): `text`, `longtext`, `number`, `boolean`, `select`, `multiselect`, `file`, `artifact-ref`. MyndHyve maps `textarea`→`longtext` and `toggle`→`boolean`; its product-specific kinds (`canvas-reference`, `collection-reference`, `color`) are host extensions (`vendor.myndhyve.*`), not portable.",
209
+ "pattern": "^(text|longtext|number|boolean|select|multiselect|file|artifact-ref|vendor\\.[a-z][a-z0-9-]*\\.[a-z][a-z0-9-]*|x-[a-z][a-z0-9-]*)$"
210
+ },
211
+ "label": {
212
+ "type": "string"
213
+ },
214
+ "required": {
215
+ "type": "boolean"
216
+ },
217
+ "default": {},
218
+ "options": {
219
+ "type": "array",
220
+ "items": {
221
+ "type": "string"
222
+ },
223
+ "description": "Choices for `type: \"select\"`."
224
+ }
225
+ }
226
+ },
227
+ "Signing": {
228
+ "type": "object",
229
+ "description": "Optional signing metadata. See node-packs.md §signing.",
230
+ "additionalProperties": false,
231
+ "properties": {
232
+ "publicKeyRef": {
233
+ "type": "string"
234
+ },
235
+ "signatureRef": {
236
+ "type": "string"
237
+ },
238
+ "method": {
239
+ "type": "string",
240
+ "enum": [
241
+ "manual",
242
+ "sigstore"
243
+ ]
244
+ }
245
+ }
246
+ }
247
+ },
248
+ "patternProperties": {
249
+ "^(openwop-|x-|vendor\\.)": {
250
+ "description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md` §\"Vendor-prefixed namespaces\", which requires a client receiving an unknown vendor-prefixed field to treat it as opaque — a field that `additionalProperties: false` previously made impossible to carry. SECURITY: an extension value is PACK-AUTHORED, therefore untrusted; \"ignore\" means ignore. See `node-packs.md` §\"Vendor extensions on pack manifests\" and the `pack-manifest-extension-opaque` invariant."
251
+ }
252
+ },
253
+ "x-openwop-seeded-from": "v1"
254
+ }
@@ -0,0 +1,108 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/compact-tool-descriptor.schema.json",
4
+ "title": "CompactToolDescriptor",
5
+ "description": "RFC 0112. A lossy, model-facing projection of `ToolDescriptor` (tool-descriptor.schema.json) returned by `GET /v1/tools?view=compact` + `GET /v1/tools/{toolId}?view=compact` when the host advertises `capabilities.toolCatalog.compactView: true`. Heavy descriptive fields (`outputSchema`, `auth`, `egress`, `approval`, `replayPolicy`, `costHint`, `latencyHint`) are dropped, and any `inputSchema` is bounded to the self-contained compact structural subset (top-level `type: \"object\"` with `properties`; no `$ref`/`oneOf`/`allOf`/`anyOf`/`not`/`patternProperties`/`dependentSchemas`). The subset is the stable structural core of RFC 0030 Tier-1, cited as rationale but pinned HERE so conformance is machine-checkable and immune to that informative table's drift. Like the full descriptor, a CompactToolDescriptor never carries credential material (SR-1) and is not an invocation path.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "toolId",
10
+ "source",
11
+ "safetyTier"
12
+ ],
13
+ "properties": {
14
+ "toolId": {
15
+ "type": "string",
16
+ "minLength": 1,
17
+ "description": "Unchanged from ToolDescriptor. Stable, host-unique tool identifier in the `<scope>:<tool-id>` form; MUST be stable across catalog reads for a given host version (tool-catalog.md §C MUST 3). The compact `tools[]` MUST carry the same `toolId` set as the standard view for the same principal (projection completeness)."
18
+ },
19
+ "source": {
20
+ "type": "string",
21
+ "enum": [
22
+ "node-pack",
23
+ "workflow",
24
+ "mcp",
25
+ "connector",
26
+ "host-extension"
27
+ ],
28
+ "description": "Retained from ToolDescriptor so the `safetyTier: \"exec\" ⇒ source: \"host-extension\"` cross-field MUST (RFC 0069) stays expressible. Which surface backs the tool: `node-pack`/`workflow`/`mcp`/`connector`/`host-extension`."
29
+ },
30
+ "safetyTier": {
31
+ "type": "string",
32
+ "enum": [
33
+ "pure",
34
+ "read",
35
+ "write",
36
+ "exec"
37
+ ],
38
+ "description": "REQUIRED. The tool's DATA-EFFECT classification (`pure`/`read`/`write`/`exec`); per RFC 0069 an `exec` tool MUST be `source: \"host-extension\"`. Host-assigned, not derivable from a permission/approval/risk tier."
39
+ },
40
+ "title": {
41
+ "type": "string",
42
+ "description": "MAY — short human-readable label for a model-facing tool picker."
43
+ },
44
+ "description": {
45
+ "type": "string",
46
+ "description": "MAY — one-line summary; the host SHOULD truncate to a model-facing summary in the compact view."
47
+ },
48
+ "inputSchema": {
49
+ "type": "object",
50
+ "description": "MAY — the tool's argument schema bounded to the compact structural subset (RFC 0112). When present it MUST have top-level `type: \"object\"` with an explicit `properties` map, and MUST NOT use `$ref`, `oneOf`, `allOf`, `anyOf`, `not`, `patternProperties`, or `dependentSchemas` AT ANY NESTING DEPTH (including inside nested property schemas). Absent ⇒ opaque/host-interpreted args. NOTE: the `propertyNames` clause below is a TOP-LEVEL structural floor only; the total any-depth constraint is enforced by the RFC 0112 conformance scenario (a schema-aware recursive walk), since pure JSON Schema cannot express it without recursion gymnastics.",
51
+ "required": [
52
+ "type",
53
+ "properties"
54
+ ],
55
+ "properties": {
56
+ "type": {
57
+ "const": "object",
58
+ "description": "Top-level MUST be `\"object\"`."
59
+ },
60
+ "properties": {
61
+ "type": "object",
62
+ "description": "The argument property map (MUST be present).",
63
+ "additionalProperties": true
64
+ }
65
+ },
66
+ "propertyNames": {
67
+ "$comment": "RFC 0112 compact structural subset (TOP-LEVEL FLOOR): forbid the heavy/non-portable keywords as top-level inputSchema keys. The total any-depth constraint is enforced by conformance.",
68
+ "not": {
69
+ "enum": [
70
+ "$ref",
71
+ "oneOf",
72
+ "allOf",
73
+ "anyOf",
74
+ "not",
75
+ "patternProperties",
76
+ "dependentSchemas"
77
+ ]
78
+ }
79
+ },
80
+ "additionalProperties": false
81
+ }
82
+ },
83
+ "allOf": [
84
+ {
85
+ "$comment": "RFC 0069 / tool-catalog.md §C-1: an exec-tier tool MUST be host-extension-sourced (exec is never protocol-tier). Mirrors tool-descriptor.schema.json.",
86
+ "if": {
87
+ "properties": {
88
+ "safetyTier": {
89
+ "const": "exec"
90
+ }
91
+ },
92
+ "required": [
93
+ "safetyTier"
94
+ ]
95
+ },
96
+ "then": {
97
+ "properties": {
98
+ "source": {
99
+ "const": "host-extension"
100
+ }
101
+ },
102
+ "required": [
103
+ "source"
104
+ ]
105
+ }
106
+ }
107
+ ]
108
+ }
@@ -0,0 +1,91 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/compensation-policy.schema.json",
4
+ "title": "CompensationPolicy",
5
+ "description": "RFC 0151 §B — the workflow-level compensation policy, carried as the reserved `settings.compensation` key on `WorkflowDefinition` (`workflow-definition.schema.json` §WorkflowSettings). Node-level `compensation` declarations say WHAT the inverse action is; this policy says WHEN the host starts an unwind and HOW it runs one — which failures qualify (`triggers`), the ordering model, retry/timeout defaults for inverse actions, what happens when an inverse action exhausts its retries, whether approval is escalated, and what a parent cancel does to an active unwind. Closed and additive. A host that advertises `capabilities.compensation` MUST validate the policy at workflow registration and refuse one that names an `orderingModel` or `profileVersion` it does not advertise (`validation_error`). A host that does NOT advertise the family MUST refuse a workflow that carries this key with `capability_required` (`details.requiredCapability: \"compensation\"`, per `capabilities.md` §\"Unsupported capability — refusal contract\") rather than accept it silently: accepting a policy the host will never honour tells the author an unwind will happen when it will not, which is RFC 0148 §B's advertise-and-opt-out failure with the sign flipped. Nothing here can WEAKEN a node's own declaration — a node's `compensation.requiresApproval: true` and `retry` bounds always win over the policy's defaults. Policy is authored, not per-run: there is deliberately no run-options overlay, because a per-run caller who could lower approval scope or drop a trigger would be authorizing their own unwind (RFC 0147 R9).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "triggers"
10
+ ],
11
+ "properties": {
12
+ "profileVersion": {
13
+ "type": "string",
14
+ "pattern": "^[1-9][0-9]*$",
15
+ "description": "The RFC 0151 profile version this policy was authored against. OPTIONAL; when present it MUST equal the host's advertised `capabilities.compensation.profileVersion` or registration fails, because `profileVersion` is part of the inverse-action identity (§C) and a workflow authored under one ordering rule MUST NOT mint identities under another."
16
+ },
17
+ "orderingModel": {
18
+ "type": "string",
19
+ "enum": [
20
+ "reverse-completion",
21
+ "dependency-graph"
22
+ ],
23
+ "default": "reverse-completion",
24
+ "description": "RFC 0151 §A/§C. `reverse-completion` (default) orders inverse actions by descending durable forward-completion sequence; `dependency-graph` MUST be a DAG and preserve reverse dependency order. The value MUST be one of the host's advertised `capabilities.compensation.orderingModels[]`; a host MUST refuse the workflow at registration otherwise, so an unwind never discovers at failure time that its ordering rule is unimplemented."
25
+ },
26
+ "triggers": {
27
+ "type": "array",
28
+ "minItems": 1,
29
+ "uniqueItems": true,
30
+ "items": {
31
+ "type": "string",
32
+ "enum": [
33
+ "node-failure",
34
+ "run-cancel",
35
+ "cap-breach",
36
+ "operator-request"
37
+ ]
38
+ },
39
+ "description": "Which events start an unwind. REQUIRED and closed — a policy that names no trigger is not a policy, and an open string here would let a host and an author disagree about a word. `node-failure`: a node reaches terminal failure after its own RFC 0009 retry policy and the run cannot continue. `run-cancel`: an RFC 0094 cancel is accepted while committed effects exist. `cap-breach`: an RFC 0058 / RFC 0084 `cap.breached` hard stop. `operator-request`: an authorized operator explicitly requests an unwind (§E) — MUST be authorized per RFC 0049, binding tenant, principal, action, and plan version. A trigger not listed here does NOT start an unwind; the run ends with its committed effects in place and `compensationStatus: none`, which is the honest shape — no generic rollback is inferred from an undeclared trigger (RFC 0151 §Compatibility)."
40
+ },
41
+ "retry": {
42
+ "type": "object",
43
+ "additionalProperties": false,
44
+ "description": "Defaults for inverse actions whose node-level `compensation.retry` is absent. A node's own bounds always win. Retries reuse the inverse action's stable identity (§C) — never a fresh one, or a transient refund failure mints a second refund.",
45
+ "properties": {
46
+ "maxAttempts": {
47
+ "type": "integer",
48
+ "minimum": 1
49
+ },
50
+ "backoffMs": {
51
+ "type": "integer",
52
+ "minimum": 0
53
+ }
54
+ }
55
+ },
56
+ "timeoutMs": {
57
+ "type": "integer",
58
+ "minimum": 1,
59
+ "description": "Wall-clock ceiling per inverse-action attempt, in milliseconds. A timed-out attempt counts against `retry.maxAttempts`; it is not a distinct outcome."
60
+ },
61
+ "exhaustedDisposition": {
62
+ "type": "string",
63
+ "enum": [
64
+ "record-outcome",
65
+ "manual-intervention"
66
+ ],
67
+ "default": "record-outcome",
68
+ "description": "RFC 0151 §E — what the host does when an inverse action exhausts its retries. Either way the run MUST route to RFC 0053 dead-letter handling and the run's `compensationStatus` follows the §D fold (`partial` or `failed`). `record-outcome` (default): record the failure and continue unwinding the remaining actions. `manual-intervention`: additionally emit `compensation.manual_intervention_required` and stop issuing further inverse actions until an authorized operator retries, skips with recorded justification, substitutes a registered action, or terminates as uncompensated — the rollup reads `manual` while that is unresolved. Requires `capabilities.compensation.manualIntervention: true`; a host that does not advertise it MUST refuse a policy that selects it."
69
+ },
70
+ "approvalScope": {
71
+ "type": "string",
72
+ "enum": [
73
+ "declared",
74
+ "all"
75
+ ],
76
+ "default": "declared",
77
+ "description": "RFC 0151 §E. `declared` (default): only inverse actions whose node sets `compensation.requiresApproval: true` create an RFC 0051 approval interrupt. `all`: every inverse action does, regardless of the node's declaration. This value can only ESCALATE — there is no `none`, because a policy MUST NOT strip an approval a node declared for itself (RFC 0147 R9: an inverse action can itself be harmful)."
78
+ },
79
+ "onParentCancel": {
80
+ "type": "string",
81
+ "enum": [
82
+ "continue",
83
+ "pause",
84
+ "manual"
85
+ ],
86
+ "default": "continue",
87
+ "description": "RFC 0151 §C — cancellation of the parent run MUST NOT silently abandon an active compensation. `continue`: the unwind runs to its terminal rollup. `pause`: emit `compensation.paused` and hold for authorized intervention (the run's own `status` carries the wait). `manual`: emit `compensation.manual_intervention_required` and stop; rollup reads `manual`. `pause`/`manual` require `capabilities.compensation.manualIntervention: true`."
88
+ }
89
+ },
90
+ "x-openwop-seeded-from": "v1"
91
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/compensation-projection.schema.json",
4
+ "title": "Compensation projection (RFC 0173 §C.1)",
5
+ "description": "GET /runs/{runId}/compensation — the plan and every attempt, keyed on the node and attempt the operator family already uses (RFC 0151 §D events). The deployed-wire witness for the compensation obligation.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "runId",
10
+ "status",
11
+ "plan",
12
+ "attempts"
13
+ ],
14
+ "properties": {
15
+ "runId": {
16
+ "$ref": "ids.schema.json#/$defs/runId"
17
+ },
18
+ "status": {
19
+ "type": "string",
20
+ "enum": [
21
+ "none",
22
+ "pending",
23
+ "running",
24
+ "completed",
25
+ "partial",
26
+ "failed",
27
+ "manual-intervention"
28
+ ]
29
+ },
30
+ "plan": {
31
+ "type": "array",
32
+ "items": {
33
+ "type": "object",
34
+ "additionalProperties": false,
35
+ "required": [
36
+ "nodeId",
37
+ "order"
38
+ ],
39
+ "properties": {
40
+ "nodeId": {
41
+ "$ref": "ids.schema.json#/$defs/nodeId"
42
+ },
43
+ "order": {
44
+ "type": "integer",
45
+ "minimum": 0
46
+ },
47
+ "policy": {
48
+ "$ref": "compensation-policy.schema.json"
49
+ },
50
+ "irreversibleEffect": {
51
+ "type": "boolean"
52
+ }
53
+ }
54
+ }
55
+ },
56
+ "attempts": {
57
+ "type": "array",
58
+ "items": {
59
+ "type": "object",
60
+ "additionalProperties": false,
61
+ "required": [
62
+ "nodeId",
63
+ "attempt",
64
+ "outcome",
65
+ "at"
66
+ ],
67
+ "properties": {
68
+ "nodeId": {
69
+ "$ref": "ids.schema.json#/$defs/nodeId"
70
+ },
71
+ "attempt": {
72
+ "type": "integer",
73
+ "minimum": 1
74
+ },
75
+ "outcome": {
76
+ "type": "string",
77
+ "enum": [
78
+ "succeeded",
79
+ "failed",
80
+ "skipped",
81
+ "manual"
82
+ ]
83
+ },
84
+ "at": {
85
+ "type": "string",
86
+ "format": "date-time"
87
+ },
88
+ "reason": {
89
+ "type": "string"
90
+ }
91
+ }
92
+ }
93
+ }
94
+ }
95
+ }
@@ -0,0 +1,110 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/configurable.schema.json",
4
+ "title": "Run configurable (RFC 0171 §D.1)",
5
+ "description": "Closed, nested, versioned. Every reserved key is typed; a vendor key lives under extensions.<org>. The request body $refs this object (no allOf-merge of an open one).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "version"
10
+ ],
11
+ "properties": {
12
+ "version": {
13
+ "const": 1
14
+ },
15
+ "run": {
16
+ "type": "object",
17
+ "additionalProperties": false,
18
+ "properties": {
19
+ "recursionLimit": {
20
+ "type": "integer",
21
+ "minimum": 1
22
+ },
23
+ "runTimeoutMs": {
24
+ "type": "integer",
25
+ "minimum": 1
26
+ },
27
+ "maxLoopIterations": {
28
+ "type": "integer",
29
+ "minimum": 1
30
+ },
31
+ "escalationThreshold": {
32
+ "type": "number",
33
+ "minimum": 0,
34
+ "maximum": 1,
35
+ "description": "0–1 (v1 definition kept)."
36
+ }
37
+ }
38
+ },
39
+ "ai": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "properties": {
43
+ "provider": {
44
+ "type": "string"
45
+ },
46
+ "model": {
47
+ "type": "string"
48
+ },
49
+ "temperature": {
50
+ "type": "number",
51
+ "minimum": 0,
52
+ "maximum": 2
53
+ },
54
+ "maxTokens": {
55
+ "type": "integer",
56
+ "minimum": 1
57
+ },
58
+ "credentialRef": {
59
+ "type": "string"
60
+ },
61
+ "promptOverrides": {
62
+ "type": "object",
63
+ "additionalProperties": {
64
+ "type": "string"
65
+ }
66
+ },
67
+ "mockProvider": {
68
+ "type": "object",
69
+ "additionalProperties": true
70
+ },
71
+ "reasoningVerbosity": {
72
+ "type": "string",
73
+ "enum": [
74
+ "none",
75
+ "summary",
76
+ "full"
77
+ ]
78
+ },
79
+ "maxRefusals": {
80
+ "type": "integer",
81
+ "minimum": 0,
82
+ "description": "RFC 0171 §A.4 E5 — refusal × retry ceiling."
83
+ }
84
+ }
85
+ },
86
+ "distillation": {
87
+ "type": "object",
88
+ "additionalProperties": false,
89
+ "properties": {
90
+ "tokenBudget": {
91
+ "type": "integer",
92
+ "minimum": 1
93
+ }
94
+ }
95
+ },
96
+ "budget": {
97
+ "$ref": "budget-policy.schema.json"
98
+ },
99
+ "extensions": {
100
+ "type": "object",
101
+ "additionalProperties": false,
102
+ "patternProperties": {
103
+ "^[a-z][a-z0-9]*(-[a-z0-9]+)*$": {
104
+ "type": "object",
105
+ "additionalProperties": true
106
+ }
107
+ }
108
+ }
109
+ }
110
+ }