@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,188 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/goal.schema.json",
4
+ "title": "Goal",
5
+ "description": "RFC 0097 §B. A standing goal — a durable objective with explicit completion criteria, evaluated by a host-side judge (RFC 0090 verifier verdict or an opaque host evaluator), that keeps an agent working across turns and runs until the judge is satisfied, a declared RFC 0058 bound is crossed, or the agent escalates (RFC 0044). Completion MUST be the judge's verdict — a client MUST NOT set `state: satisfied` directly. Continuation MUST be bounded. `objective` and any verdict payload are SR-1 redaction-safe. Gated on the `agents.goals` capability.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "id",
10
+ "objective",
11
+ "state",
12
+ "completion",
13
+ "continuation",
14
+ "bounds",
15
+ "owner",
16
+ "createdAt"
17
+ ],
18
+ "properties": {
19
+ "id": {
20
+ "type": "string",
21
+ "minLength": 1,
22
+ "description": "Host-assigned identifier."
23
+ },
24
+ "objective": {
25
+ "type": "string",
26
+ "description": "The standing objective. SR-1 redaction-safe — no secrets/PII."
27
+ },
28
+ "state": {
29
+ "type": "string",
30
+ "enum": [
31
+ "active",
32
+ "satisfied",
33
+ "escalated",
34
+ "abandoned",
35
+ "bound-exceeded"
36
+ ],
37
+ "description": "Lifecycle state. `satisfied` is set ONLY by the host on a judge verdict, never by a client. `bound-exceeded` is set when a declared bound is crossed; `escalated` when an RFC 0044 confidence-escalation interrupt fires against the goal; `abandoned` on explicit abandon."
38
+ },
39
+ "completion": {
40
+ "type": "object",
41
+ "additionalProperties": false,
42
+ "required": [
43
+ "check"
44
+ ],
45
+ "description": "How the goal's completion is judged.",
46
+ "properties": {
47
+ "check": {
48
+ "type": "string",
49
+ "enum": [
50
+ "verifier",
51
+ "host"
52
+ ],
53
+ "description": "`verifier`: completion is an RFC 0090 verifier verdict. `host`: an opaque host evaluator."
54
+ },
55
+ "verifierRef": {
56
+ "type": [
57
+ "string",
58
+ "null"
59
+ ],
60
+ "default": null,
61
+ "description": "RFC 0090 verifier id when `check = verifier`."
62
+ },
63
+ "lastVerdict": {
64
+ "type": [
65
+ "object",
66
+ "null"
67
+ ],
68
+ "default": null,
69
+ "additionalProperties": false,
70
+ "description": "Most recent judge verdict. Content-free re: objective text. Non-deterministic judge output — MUST be persisted (carried in the `goal.evaluated` event / checkpoint) and never recomputed on replay/fork.",
71
+ "properties": {
72
+ "satisfied": {
73
+ "type": "boolean"
74
+ },
75
+ "confidence": {
76
+ "type": "number",
77
+ "minimum": 0,
78
+ "maximum": 1
79
+ },
80
+ "runId": {
81
+ "$ref": "ids.schema.json#/$defs/runId",
82
+ "description": "The run this verdict evaluated (RFC 0040 causation-compatible)."
83
+ }
84
+ }
85
+ }
86
+ }
87
+ },
88
+ "continuation": {
89
+ "type": "object",
90
+ "additionalProperties": false,
91
+ "required": [
92
+ "mode"
93
+ ],
94
+ "description": "How the goal re-engages work between judge checks.",
95
+ "properties": {
96
+ "mode": {
97
+ "type": "string",
98
+ "enum": [
99
+ "schedule",
100
+ "commitment",
101
+ "heartbeat",
102
+ "manual"
103
+ ],
104
+ "description": "`schedule` (RFC 0052), `commitment` (RFC 0068), `heartbeat` (RFC 0060), `manual`."
105
+ },
106
+ "armRef": {
107
+ "type": [
108
+ "string",
109
+ "null"
110
+ ],
111
+ "default": null,
112
+ "description": "The RFC 0052 job / RFC 0068 commitment / RFC 0060 heartbeat that re-engages work for this goal."
113
+ }
114
+ }
115
+ },
116
+ "bounds": {
117
+ "type": "object",
118
+ "additionalProperties": false,
119
+ "description": "RFC 0058 execution bounds. The host MUST stop continuation and set `state: bound-exceeded` when any declared bound is crossed. When `agents.goals.requiresBounds` is true, at least one bound MUST be present before the goal may activate.",
120
+ "properties": {
121
+ "maxLoopIterations": {
122
+ "type": "integer",
123
+ "minimum": 1,
124
+ "description": "RFC 0058. Max contributing iterations before the goal is bound-exceeded."
125
+ },
126
+ "runTimeoutMs": {
127
+ "type": "integer",
128
+ "minimum": 0,
129
+ "description": "RFC 0058. Wall-clock deadline (ms) for the standing goal."
130
+ },
131
+ "maxCostUsd": {
132
+ "type": "number",
133
+ "minimum": 0,
134
+ "description": "RFC 0084. Accumulated cost ceiling across contributing runs."
135
+ }
136
+ }
137
+ },
138
+ "progress": {
139
+ "type": "object",
140
+ "additionalProperties": false,
141
+ "description": "Continuation progress so far.",
142
+ "properties": {
143
+ "iterations": {
144
+ "type": "integer",
145
+ "minimum": 0
146
+ },
147
+ "contributingRunIds": {
148
+ "type": "array",
149
+ "items": {
150
+ "type": "string"
151
+ },
152
+ "description": "RFC 0040 causation-compatible."
153
+ }
154
+ }
155
+ },
156
+ "owner": {
157
+ "type": "object",
158
+ "additionalProperties": false,
159
+ "required": [
160
+ "tenant"
161
+ ],
162
+ "description": "RFC 0048 identity triple. Redaction-safe — `principal` is an opaque id, never PII or credential material.",
163
+ "properties": {
164
+ "tenant": {
165
+ "type": "string",
166
+ "minLength": 1
167
+ },
168
+ "workspace": {
169
+ "type": "string",
170
+ "minLength": 1
171
+ },
172
+ "principal": {
173
+ "type": "string",
174
+ "minLength": 1
175
+ }
176
+ }
177
+ },
178
+ "createdAt": {
179
+ "type": "string",
180
+ "format": "date-time"
181
+ },
182
+ "updatedAt": {
183
+ "type": "string",
184
+ "format": "date-time"
185
+ }
186
+ },
187
+ "x-openwop-seeded-from": "v1"
188
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/heartbeat-evaluated.schema.json",
4
+ "title": "HeartbeatEvaluated",
5
+ "description": "RFC 0060. Emitted every tick by a host advertising `capabilities.heartbeat.supported: true` — the observability record of a heartbeat predicate evaluation. Heartbeat-scoped (NOT a replayable run-event-log entry). Carries no external state or secret material; `changed` gates whether a `heartbeat.stateChanged` + enqueued run follow.",
6
+ "type": "object",
7
+ "required": [
8
+ "heartbeatId",
9
+ "status",
10
+ "changed"
11
+ ],
12
+ "properties": {
13
+ "heartbeatId": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "description": "Host-assigned identifier for the heartbeat whose tick this records."
17
+ },
18
+ "status": {
19
+ "type": "string",
20
+ "enum": [
21
+ "ok",
22
+ "timeout",
23
+ "error"
24
+ ],
25
+ "description": "`ok` — predicate evaluated within `maxRuntimeMs`. `timeout` — terminated at the budget (RFC 0060 §B.2). `error` — the predicate threw."
26
+ },
27
+ "changed": {
28
+ "type": "boolean",
29
+ "description": "Whether the predicate's state transitioned vs. the prior tick. `true` is the only path that may emit `heartbeat.stateChanged` and enqueue a run."
30
+ }
31
+ },
32
+ "additionalProperties": false,
33
+ "x-openwop-seeded-from": "v1"
34
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/heartbeat-state-changed.schema.json",
4
+ "title": "HeartbeatStateChanged",
5
+ "description": "RFC 0060. Emitted ONLY on a predicate-state transition — an unchanged tick MUST NOT emit it (this is what prevents notification spam). Heartbeat-scoped (NOT a replayable run-event-log entry). `from`/`to` are opaque host-persisted predicate-state tokens; they MUST NOT carry secret or external-content material beyond the minimal state needed to detect a transition.",
6
+ "type": "object",
7
+ "required": [
8
+ "heartbeatId",
9
+ "from",
10
+ "to"
11
+ ],
12
+ "properties": {
13
+ "heartbeatId": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "description": "Host-assigned identifier for the heartbeat that transitioned."
17
+ },
18
+ "from": {
19
+ "type": "object",
20
+ "additionalProperties": true,
21
+ "description": "Prior tick's predicate state (opaque, host-defined)."
22
+ },
23
+ "to": {
24
+ "type": "object",
25
+ "additionalProperties": true,
26
+ "description": "Current tick's predicate state — the transition target (opaque, host-defined)."
27
+ }
28
+ },
29
+ "additionalProperties": false,
30
+ "x-openwop-seeded-from": "v1"
31
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/ids.schema.json",
4
+ "title": "OpenWOP v2 identifier grammars (RFC 0170 §D.1)",
5
+ "description": "One $defs entry per id kind. Every id field in every v2 schema, OpenAPI parameter and response body $refs its kind. `minted` records who mints the id: host (opaque, checkable: `^[A-Za-z0-9._~-]{16,128}$` after any tenant segment), author (a workflow/pack author chooses it; the v1 grammar stands), registry (the pack registry mints it). Tenant-bound kinds (runId, interruptId, subscriptionId, deliveryId, effectId) carry the tenant segment: a host MUST reject an id whose tenant segment is not the caller's.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "$defs": {
9
+ "opaque": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{16,128}$", "description": "Host-minted opaque token: no `@`, no whitespace, no `/`; 16–128 characters." },
10
+ "tenantId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}$", "x-openwop-minted": "host" },
11
+ "workspaceId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}$", "x-openwop-minted": "host" },
12
+ "subjectId": { "type": "string", "pattern": "^[^\\s/]{1,256}$", "description": "Issuer-scoped, stable, opaque (RFC 0170 §A); the issuer's grammar, never PII.", "x-openwop-minted": "host" },
13
+ "runId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "description": "Tenant-bound: `<tenantId>/<opaque>`.", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
14
+ "interruptId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
15
+ "subscriptionId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
16
+ "deliveryId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
17
+ "effectId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}/[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host", "x-openwop-tenant-bound": true },
18
+ "eventId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{16,128}$", "x-openwop-minted": "host" },
19
+ "traceId": { "type": "string", "pattern": "^[0-9a-f]{32}$", "description": "W3C trace-context trace-id.", "x-openwop-minted": "host" },
20
+ "spanId": { "type": "string", "pattern": "^[0-9a-f]{16}$", "description": "W3C trace-context parent-id.", "x-openwop-minted": "host" },
21
+ "keyId": { "type": "string", "pattern": "^[A-Za-z0-9._~-]{1,128}$", "description": "A signing-key identifier (registry `signingKeys[].keyId`, resume-token `kid`, bundle signature `keyId`).", "x-openwop-minted": "registry" },
22
+ "nodeId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "description": "Author-chosen within a workflow definition.", "x-openwop-minted": "author" },
23
+ "workflowId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
24
+ "agentId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
25
+ "chainId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
26
+ "pluginId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
27
+ "templateId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
28
+ "libraryId": { "type": "string", "pattern": "^[A-Za-z0-9._~:-]{1,128}$", "x-openwop-minted": "author" },
29
+ "typeId": { "type": "string", "pattern": "^[a-z][a-z0-9-]*(\\.[a-z][a-zA-Z0-9-]*)+$", "description": "A node type id (`core.ai.callPrompt`); the RFC 0107 grammar.", "x-openwop-minted": "author" }
30
+ }
31
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/localized-content-language-settings.schema.json",
4
+ "title": "LocalizedContentLanguageSettings",
5
+ "description": "RFC 0103 (spec/v1/localized-content.md §B). Per-tenant authoring configuration for the content surface. Invariant: `baseLocale` MUST NOT appear in `supportedLocales` (the base locale is carried by section `data`, supported locales by `localizations`). This object is the source of truth for the host's advertised `content` capability block; the advertisement MUST reflect it (`baseLocale` equal, advertised `supportedLocales` equal or a subset).",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "baseLocale",
10
+ "supportedLocales",
11
+ "autoTranslateOnPublish"
12
+ ],
13
+ "properties": {
14
+ "baseLocale": {
15
+ "type": "string",
16
+ "pattern": "^[a-z]{2}(-[A-Z]{2})?$",
17
+ "description": "The locale section `data` is authored in. MUST equal `capabilities.i18n.defaultLocale`."
18
+ },
19
+ "supportedLocales": {
20
+ "type": "array",
21
+ "description": "BCP-47 tags the tenant authors content translations for. MUST NOT contain `baseLocale`.",
22
+ "items": {
23
+ "type": "string",
24
+ "pattern": "^[a-z]{2}(-[A-Z]{2})?$"
25
+ },
26
+ "uniqueItems": true
27
+ },
28
+ "autoTranslateOnPublish": {
29
+ "type": "boolean",
30
+ "description": "Whether the host auto-translates missing locale fields on publish (host-extension behavior; informational at the protocol layer)."
31
+ }
32
+ },
33
+ "x-openwop-seeded-from": "v1"
34
+ }
@@ -0,0 +1,94 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/localized-content-page-response.schema.json",
4
+ "title": "LocalizedContentPageResponse",
5
+ "description": "RFC 0103 (spec/v1/localized-content.md §D). The resolved delivery response for `GET /v1/content/pages/{slug}`. `locale` is the negotiated locale (equals the `Content-Language` response header). `sections[]` carry the ALREADY-MERGED section bodies — resolution (the per-section field merge §C) happened server-side, so no `localizations` map appears in the response. Only `published`, `enabled` sections are present, in render order.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "version",
10
+ "generatedAt",
11
+ "locale",
12
+ "slug",
13
+ "page",
14
+ "sections"
15
+ ],
16
+ "properties": {
17
+ "version": {
18
+ "type": "string",
19
+ "description": "Response schema version marker (e.g. `\"1\"`)."
20
+ },
21
+ "generatedAt": {
22
+ "type": "string",
23
+ "format": "date-time",
24
+ "description": "When the resolved response was generated."
25
+ },
26
+ "locale": {
27
+ "type": "string",
28
+ "pattern": "^[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8}){0,3}$",
29
+ "description": "The negotiated locale actually used (BCP-47). Equals the `Content-Language` response header."
30
+ },
31
+ "slug": {
32
+ "type": "string",
33
+ "pattern": "^[a-z][a-z0-9-]*$",
34
+ "description": "The requested page slug."
35
+ },
36
+ "page": {
37
+ "type": "object",
38
+ "additionalProperties": false,
39
+ "required": [
40
+ "pageId",
41
+ "slug",
42
+ "name"
43
+ ],
44
+ "description": "Resolved page metadata (status omitted — only published pages are delivered).",
45
+ "properties": {
46
+ "pageId": {
47
+ "type": "string",
48
+ "minLength": 1
49
+ },
50
+ "slug": {
51
+ "type": "string",
52
+ "pattern": "^[a-z][a-z0-9-]*$"
53
+ },
54
+ "name": {
55
+ "type": "string",
56
+ "minLength": 1
57
+ },
58
+ "seo": {
59
+ "type": "object",
60
+ "additionalProperties": true
61
+ }
62
+ }
63
+ },
64
+ "sections": {
65
+ "type": "array",
66
+ "description": "Resolved sections in render order; each body is the merged result, not the raw record.",
67
+ "items": {
68
+ "type": "object",
69
+ "additionalProperties": false,
70
+ "required": [
71
+ "sectionId",
72
+ "sectionType",
73
+ "data"
74
+ ],
75
+ "properties": {
76
+ "sectionId": {
77
+ "type": "string",
78
+ "minLength": 1
79
+ },
80
+ "sectionType": {
81
+ "type": "string",
82
+ "minLength": 1
83
+ },
84
+ "data": {
85
+ "type": "object",
86
+ "additionalProperties": true,
87
+ "description": "The merged section body for the negotiated locale (exact → family → base shallow overlay)."
88
+ }
89
+ }
90
+ }
91
+ }
92
+ },
93
+ "x-openwop-seeded-from": "v1"
94
+ }
@@ -0,0 +1,87 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/localized-content-page.schema.json",
4
+ "title": "LocalizedContentPage",
5
+ "description": "RFC 0103 (spec/v1/localized-content.md §B). An authored content page: an ordered composition of sections addressed by a URL `slug`. Publication status is atomic across locales for v1. SEO carries hreflang + og:locale alternates so a renderer can emit per-locale link relations.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "pageId",
10
+ "slug",
11
+ "name",
12
+ "status",
13
+ "sectionOrder"
14
+ ],
15
+ "properties": {
16
+ "pageId": {
17
+ "type": "string",
18
+ "minLength": 1,
19
+ "description": "Stable identifier of the page within its tenant."
20
+ },
21
+ "slug": {
22
+ "type": "string",
23
+ "pattern": "^[a-z][a-z0-9-]*$",
24
+ "description": "URL slug for public delivery (`GET /v1/content/pages/{slug}`). Lowercase, hyphen-separated."
25
+ },
26
+ "name": {
27
+ "type": "string",
28
+ "minLength": 1,
29
+ "description": "Human-facing page name (admin/authoring label)."
30
+ },
31
+ "status": {
32
+ "type": "string",
33
+ "enum": [
34
+ "draft",
35
+ "published"
36
+ ],
37
+ "description": "Publication status, atomic across locales for v1. A `draft` page MUST NOT be served on the public delivery path."
38
+ },
39
+ "sectionOrder": {
40
+ "type": "array",
41
+ "items": {
42
+ "type": "string",
43
+ "minLength": 1
44
+ },
45
+ "description": "Ordered list of `sectionId`s defining the page's render order."
46
+ },
47
+ "seo": {
48
+ "type": "object",
49
+ "additionalProperties": false,
50
+ "description": "Optional SEO metadata for per-locale link relations.",
51
+ "properties": {
52
+ "hreflang": {
53
+ "type": "array",
54
+ "description": "hreflang alternates: per-locale canonical URLs.",
55
+ "items": {
56
+ "type": "object",
57
+ "additionalProperties": false,
58
+ "required": [
59
+ "locale",
60
+ "href"
61
+ ],
62
+ "properties": {
63
+ "locale": {
64
+ "type": "string",
65
+ "pattern": "^[a-z]{2}(-[A-Z]{2})?$"
66
+ },
67
+ "href": {
68
+ "type": "string",
69
+ "format": "uri"
70
+ }
71
+ }
72
+ }
73
+ },
74
+ "ogLocaleAlternates": {
75
+ "type": "array",
76
+ "description": "og:locale:alternate values.",
77
+ "items": {
78
+ "type": "string",
79
+ "pattern": "^[a-z]{2}(-[A-Z]{2})?$"
80
+ },
81
+ "uniqueItems": true
82
+ }
83
+ }
84
+ }
85
+ },
86
+ "x-openwop-seeded-from": "v1"
87
+ }
@@ -0,0 +1,63 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/localized-content-section.schema.json",
4
+ "title": "LocalizedContentSection",
5
+ "description": "RFC 0103 (spec/v1/localized-content.md §B). One section record of an authored content page. A section is ONE record carrying a base `data` payload (authored in the host's `content.baseLocale`) plus a sparse `localizations` map of partial per-locale field overrides — never one record per locale. The negotiated locale's resolved body is computed by the normative per-section field merge (exact-locale → language-family → base `data`, shallow overlay; §C). Body field shapes inside `data`/`localizations` are open and host/section-type-defined; this schema closes the envelope, not the body.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": [
9
+ "sectionId",
10
+ "sectionType",
11
+ "data",
12
+ "localizations",
13
+ "status",
14
+ "enabled",
15
+ "order"
16
+ ],
17
+ "properties": {
18
+ "sectionId": {
19
+ "type": "string",
20
+ "minLength": 1,
21
+ "description": "Stable identifier of the section within its page."
22
+ },
23
+ "sectionType": {
24
+ "type": "string",
25
+ "minLength": 1,
26
+ "description": "The section-type discriminator (e.g. `hero`, `features`). The host/section-type defines the body field shape; the protocol does not."
27
+ },
28
+ "data": {
29
+ "type": "object",
30
+ "additionalProperties": true,
31
+ "description": "The base/default-locale fields, authored in `content.baseLocale`. Open object — body shapes are the host/section-type's concern."
32
+ },
33
+ "localizations": {
34
+ "type": "object",
35
+ "description": "Sparse map of per-locale partial field overrides. MAY be empty (`{}`). Each key is a BCP-47 tag matching `^[a-z]{2}(-[A-Z]{2})?$` and MUST NOT equal `content.baseLocale` (the base locale is carried by `data`). Each value is a partial overlay of `data` fields; missing fields fall through to `data` (per-section merge §C).",
36
+ "propertyNames": {
37
+ "pattern": "^[a-z]{2}(-[A-Z]{2})?$"
38
+ },
39
+ "additionalProperties": {
40
+ "type": "object",
41
+ "additionalProperties": true,
42
+ "description": "Partial field overrides for one locale; shallow-overlaid onto `data`."
43
+ }
44
+ },
45
+ "status": {
46
+ "type": "string",
47
+ "enum": [
48
+ "draft",
49
+ "published"
50
+ ],
51
+ "description": "Publication status. Atomic across all locales for v1 (no per-locale publish). The public delivery path serves `published` only."
52
+ },
53
+ "enabled": {
54
+ "type": "boolean",
55
+ "description": "Whether the section participates in delivery when its page is rendered."
56
+ },
57
+ "order": {
58
+ "type": "integer",
59
+ "description": "Render order of the section within its page (lower first). `sectionOrder` on the page is authoritative; `order` is the per-section tiebreak/sort hint."
60
+ }
61
+ },
62
+ "x-openwop-seeded-from": "v1"
63
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/memory-entry.schema.json",
4
+ "title": "MemoryEntry",
5
+ "description": "A single memory entry returned by `MemoryAdapter.list` or `MemoryAdapter.get` (RFC 0004). Hosts that ship cross-run memory expose entries in this shape regardless of their internal storage format. Mid-run mutations to the underlying store are NOT visible to the same run — `list` returns entries that existed at run start (preserves replay determinism per RFC 0004 §A).",
6
+ "type": "object",
7
+ "required": [
8
+ "id",
9
+ "content",
10
+ "tags",
11
+ "createdAt"
12
+ ],
13
+ "properties": {
14
+ "id": {
15
+ "type": "string",
16
+ "description": "Memory entry id. Stable for the lifetime of the entry. Hosts MAY tenant-prefix (`mem_<wsId>_<id>`) for defense in depth, but the protocol is silent on the id shape — see RFC 0004 §Unresolved questions #1. Length cap matches Firestore document-id limit (1500 octets) so adapters that pass-through native Firestore IDs validate cleanly.",
17
+ "minLength": 1,
18
+ "maxLength": 1500
19
+ },
20
+ "content": {
21
+ "type": "string",
22
+ "description": "Memory body. UTF-8 plaintext. Hosts MUST honor the redaction invariant SR-1 (RFC 0004 §D) at write time — content reaching this projection MUST NOT contain plaintext secret values that flowed through the run's BYOK harness."
23
+ },
24
+ "tags": {
25
+ "type": "array",
26
+ "items": {
27
+ "type": "string",
28
+ "maxLength": 256
29
+ },
30
+ "description": "Free-form tags for filtering. Hosts MAY enforce caps. Empty strings are tolerated by the schema (matches reference-impl behavior) but hosts SHOULD filter them at write time. The `MemoryListOptions.tag` filter is a set-membership check against this array. Hosts that want to surface their internal `MemorySource` (or similar host-defined classification) MAY do so via tags (e.g., `tags: ['source:session']`) per RFC 0004 §G."
31
+ },
32
+ "createdAt": {
33
+ "type": "string",
34
+ "format": "date-time",
35
+ "description": "ISO 8601 timestamp of entry creation. Never mutated post-create; subsequent edits to the entry are out-of-spec at the read-path layer."
36
+ },
37
+ "expiresAt": {
38
+ "type": "string",
39
+ "format": "date-time",
40
+ "description": "Optional TTL. When the host's clock passes this value, the entry MUST NOT be returned by `list` / `get`. Hosts MAY also delete expired entries from storage as a side effect."
41
+ }
42
+ },
43
+ "additionalProperties": false,
44
+ "x-openwop-seeded-from": "v1"
45
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/memory-list-options.schema.json",
4
+ "title": "MemoryListOptions",
5
+ "description": "Options accepted by `MemoryAdapter.list` (RFC 0004). All fields optional; default is \"all entries, newest first.\" Hosts MAY further bound results per their scale-profile.",
6
+ "type": "object",
7
+ "properties": {
8
+ "limit": {
9
+ "type": "integer",
10
+ "minimum": 0,
11
+ "description": "Cap on entries returned. `0` means \"no limit\" (treated identically to omission); positive integers cap the result. Hosts MAY further bound the effective cap per their scale-profile. When omitted, the host applies its own default cap (typical: 100 entries)."
12
+ },
13
+ "tag": {
14
+ "type": "string",
15
+ "minLength": 1,
16
+ "maxLength": 256,
17
+ "description": "Filter to entries whose `tags` array contains this string (set-membership check). Hosts MAY support more advanced filtering as a host extension under a `vendor.<host>.*` field."
18
+ },
19
+ "tokenBudget": {
20
+ "type": "integer",
21
+ "minimum": 1,
22
+ "description": "RFC 0113. Max cumulative tokens across returned entries, denominated in the unit named by `capabilities.memory.injectionBudget.tokenCounter`. The adapter MUST return a prefix of the ranked entry list whose cumulative token count does not exceed this; a single entry exceeding the budget on its own MUST be omitted (not truncated mid-entry). MAY combine with `limit` — the adapter honors whichever yields fewer entries. Requires the host to advertise `memory.injectionBudget.supported`."
23
+ },
24
+ "rank": {
25
+ "type": "string",
26
+ "enum": [
27
+ "recency",
28
+ "relevance"
29
+ ],
30
+ "description": "RFC 0113. Selection order for the (optionally `tokenBudget`-bounded) read. `recency` (default when absent) orders most-recent-first — today's behavior. `relevance` DELEGATES to the existing `memory.search` semantic mode (RFC 0080): it requires `query` AND that the host advertise `capabilities.memory.search` with `semantic` mode, and is the budgeted projection OVER that existing search surface — NOT a new ranking capability. A host that does not advertise `memory.search` semantic mode MUST reject `rank:'relevance'` (or fall back to `'recency'` per its documented behavior)."
31
+ },
32
+ "query": {
33
+ "type": "string",
34
+ "minLength": 1,
35
+ "maxLength": 4096,
36
+ "description": "RFC 0113. Free-text relevance anchor (the `memory.search` semantic query) — REQUIRED when `rank:'relevance'`, ignored otherwise."
37
+ }
38
+ },
39
+ "additionalProperties": false,
40
+ "x-openwop-seeded-from": "v1"
41
+ }