@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,834 @@
1
+ asyncapi: 3.1.0
2
+
3
+ info:
4
+ title: Workflow Orchestration Protocol (openwop) SSE Event Stream
5
+ version: "1.1.0"
6
+ externalDocs:
7
+ description: openwop spec v1 corpus
8
+ url: https://openwop.dev/spec/v1/
9
+ description: |
10
+ Canonical AsyncAPI 3.1.0 specification for the openwop server's
11
+ Server-Sent Events surface. Formalizes `stream-modes.md`
12
+ and references the run-event JSON Schema via `$ref` so external SDK
13
+ authors can codegen typed consumers without re-reading the prose.
14
+
15
+ Four canonical stream modes are exposed via the `streamMode` query
16
+ parameter on a single endpoint (`GET /v1/runs/{runId}/events`):
17
+
18
+ - `updates` — minimal state-change deltas (default; lowest bandwidth)
19
+ - `values` — full `state.snapshot` after every transition
20
+ - `messages` — LLM token chunks for chat-style UIs
21
+ - `debug` — full event firehose including internal events
22
+
23
+ Each mode is modeled as a separate AsyncAPI channel because the
24
+ payload union differs per mode. The underlying transport (HTTPS SSE)
25
+ is shared; only the filter + synthesis layer differs.
26
+
27
+ See `stream-modes.md` for the complete event-to-mode mapping table.
28
+ contact:
29
+ name: openwop spec working group
30
+ url: https://openwop.dev/spec/v1/
31
+ license:
32
+ name: Apache-2.0
33
+
34
+ defaultContentType: text/event-stream
35
+
36
+ # ─────────────────────────────────────────────────────────────────────────────
37
+ # SERVERS
38
+ # ─────────────────────────────────────────────────────────────────────────────
39
+ servers:
40
+ production:
41
+ host: '{host}'
42
+ pathname: /v1
43
+ protocol: https
44
+ description: openwop-compliant server
45
+ variables:
46
+ host:
47
+ default: api.example.com
48
+ description: Replace with your server's hostname.
49
+ security:
50
+ - $ref: '#/components/securitySchemes/ApiKeyAuth'
51
+
52
+ # ─────────────────────────────────────────────────────────────────────────────
53
+ # CHANNELS — one per streamMode (filter contract differs)
54
+ # ─────────────────────────────────────────────────────────────────────────────
55
+ channels:
56
+
57
+ heartbeatEvents:
58
+ # Logical channel — `address: null` per AsyncAPI 3.x ("address not
59
+ # applicable / host-defined"). RFC 0094 §I: host-capabilities.md
60
+ # §host.heartbeat defines the two heartbeat events but documents NO
61
+ # HTTP delivery path for them (they are heartbeat-scoped, NOT
62
+ # run-event-log entries, so they do not ride /runs/{runId}/events
63
+ # either). The previous `/heartbeats/{heartbeatId}/events` address
64
+ # implied an undocumented REST surface; the delivery transport is a
65
+ # host concern until an RFC specifies one.
66
+ address: null
67
+ title: Heartbeat evaluation events (RFC 0060)
68
+ summary: Per-tick heartbeat evaluation + state-change notifications (logical channel).
69
+ description: |
70
+ RFC 0060 `host.heartbeat`. Heartbeat-scoped (NOT a run-event
71
+ stream): a host advertising `capabilities.heartbeat.supported: true`
72
+ emits `heartbeat.evaluated` every tick and `heartbeat.stateChanged`
73
+ only on a predicate-state transition. Both are observability-only;
74
+ consumers MAY ignore them.
75
+
76
+ LOGICAL channel: `host-capabilities.md` §host.heartbeat documents
77
+ the event shapes but no HTTP address; how a host delivers them
78
+ (webhook, host-internal bus, vendor stream) is host-defined.
79
+ messages:
80
+ heartbeatEvaluated: { $ref: '#/components/messages/HeartbeatEvaluated' }
81
+ heartbeatStateChanged: { $ref: '#/components/messages/HeartbeatStateChanged' }
82
+
83
+ runEventsUpdates:
84
+ address: /runs/{runId}/events
85
+ title: SSE — updates mode (default)
86
+ summary: Minimal state-change deltas for UI/CLI consumers.
87
+ description: |
88
+ Default consumption mode. Emits an SSE event for each terminal
89
+ node transition, suspension transition, run transition, and
90
+ artifact production. Payloads are deltas (the change since the
91
+ last event), NOT full snapshots.
92
+
93
+ Termination: server closes the connection on a terminal run
94
+ event (`run.completed`, `run.failed`, `run.cancelled`).
95
+
96
+ Selected via `?streamMode=updates` (or by omitting the query
97
+ parameter — `updates` is the default per `stream-modes.md`).
98
+ parameters:
99
+ runId:
100
+ $ref: '#/components/parameters/RunId'
101
+ messages:
102
+ runStarted: { $ref: '#/components/messages/RunStarted' }
103
+ runCompleted: { $ref: '#/components/messages/RunCompleted' }
104
+ runFailed: { $ref: '#/components/messages/RunFailed' }
105
+ runCancelled: { $ref: '#/components/messages/RunCancelled' }
106
+ runPaused: { $ref: '#/components/messages/RunPaused' }
107
+ runResumed: { $ref: '#/components/messages/RunResumed' }
108
+ runAnnotated: { $ref: '#/components/messages/RunAnnotated' }
109
+ workspaceUpdated: { $ref: '#/components/messages/WorkspaceUpdated' }
110
+ nodeCompleted: { $ref: '#/components/messages/NodeCompleted' }
111
+ nodeFailed: { $ref: '#/components/messages/NodeFailed' }
112
+ nodeSkipped: { $ref: '#/components/messages/NodeSkipped' }
113
+ nodeSuspended: { $ref: '#/components/messages/NodeSuspended' }
114
+ nodeDispatched: { $ref: '#/components/messages/NodeDispatched' }
115
+ dispatchFanOut: { $ref: '#/components/messages/DispatchFanOut' }
116
+ dispatchJoin: { $ref: '#/components/messages/DispatchJoin' }
117
+ approvalRequested: { $ref: '#/components/messages/ApprovalRequested' }
118
+ approvalReceived: { $ref: '#/components/messages/ApprovalReceived' }
119
+ clarificationRequested: { $ref: '#/components/messages/ClarificationRequested' }
120
+ clarificationResolved: { $ref: '#/components/messages/ClarificationResolved' }
121
+ interruptRequested: { $ref: '#/components/messages/InterruptRequested' }
122
+ interruptResolved: { $ref: '#/components/messages/InterruptResolved' }
123
+ artifactCreated: { $ref: '#/components/messages/ArtifactCreated' }
124
+ evalStarted: { $ref: '#/components/messages/EvalStarted' }
125
+ evalScored: { $ref: '#/components/messages/EvalScored' }
126
+ evalCompleted: { $ref: '#/components/messages/EvalCompleted' }
127
+ deploymentPromoted: { $ref: '#/components/messages/DeploymentPromoted' }
128
+ deploymentRolledBack: { $ref: '#/components/messages/DeploymentRolledBack' }
129
+ deploymentCanaryAdjusted: { $ref: '#/components/messages/DeploymentCanaryAdjusted' }
130
+ deploymentStateChanged: { $ref: '#/components/messages/DeploymentStateChanged' }
131
+ proposalCreated: { $ref: '#/components/messages/ProposalCreated' }
132
+ proposalActivated: { $ref: '#/components/messages/ProposalActivated' }
133
+ goalEvaluated: { $ref: '#/components/messages/GoalEvaluated' }
134
+ goalClosed: { $ref: '#/components/messages/GoalClosed' }
135
+ importApplied: { $ref: '#/components/messages/ImportApplied' }
136
+
137
+ runEventsValues:
138
+ address: /runs/{runId}/events
139
+ title: SSE — values mode
140
+ summary: Full state snapshots after every transition.
141
+ description: |
142
+ Higher-bandwidth mode for consumers that don't maintain their
143
+ own state machine. Emits a synthesized `state.snapshot` event
144
+ after each `updates`-tier transition. Payload is the complete
145
+ `ProjectedRunState` (status, nodeStates, variables,
146
+ currentNodeId, channels).
147
+
148
+ On resumption (`Last-Event-ID` header), the server MUST emit a
149
+ fresh `state.snapshot` first so the resuming client gets a
150
+ baseline before continuing with subsequent snapshots.
151
+
152
+ Selected via `?streamMode=values`.
153
+ parameters:
154
+ runId:
155
+ $ref: '#/components/parameters/RunId'
156
+ messages:
157
+ stateSnapshot: { $ref: '#/components/messages/StateSnapshot' }
158
+
159
+ runEventsMessages:
160
+ address: /runs/{runId}/events
161
+ title: SSE — messages mode
162
+ summary: LLM token chunks for chat-style UIs.
163
+ description: |
164
+ Per-token chunks from any AI node currently streaming
165
+ (`core.ai.callPrompt`, `core.ai.generateFromPrompt`, etc).
166
+ Other event types are filtered out — consumers wanting state
167
+ transitions should pair this with a separate `updates` stream.
168
+
169
+ If no AI nodes execute during the run, the stream is empty
170
+ until termination.
171
+
172
+ Selected via `?streamMode=messages`.
173
+ parameters:
174
+ runId:
175
+ $ref: '#/components/parameters/RunId'
176
+ messages:
177
+ aiMessageChunk: { $ref: '#/components/messages/AiMessageChunk' }
178
+
179
+ runEventsDebug:
180
+ address: /runs/{runId}/events
181
+ title: SSE — debug mode
182
+ summary: Full event firehose including internal events.
183
+ description: |
184
+ Every `RunEventDoc` from the durable event log, including
185
+ events filtered out of `updates`: `log.appended`,
186
+ `variable.changed`, `version.pinned`, `lease.*`,
187
+ `node.retried`, internal projection writes, and any
188
+ vendor-extension events.
189
+
190
+ Highest bandwidth. Used by replay tools, debuggers, and
191
+ conformance tests.
192
+
193
+ Selected via `?streamMode=debug`.
194
+ parameters:
195
+ runId:
196
+ $ref: '#/components/parameters/RunId'
197
+ messages:
198
+ anyRunEvent: { $ref: '#/components/messages/AnyRunEvent' }
199
+ runAnnotated: { $ref: '#/components/messages/RunAnnotated' }
200
+ workspaceUpdated: { $ref: '#/components/messages/WorkspaceUpdated' }
201
+
202
+ # ─────────────────────────────────────────────────────────────────────────────
203
+ # OPERATIONS — consumer-side (receive)
204
+ # ─────────────────────────────────────────────────────────────────────────────
205
+ operations:
206
+
207
+ subscribeUpdates:
208
+ action: receive
209
+ channel:
210
+ $ref: '#/channels/runEventsUpdates'
211
+ title: Subscribe to updates stream
212
+ summary: Receive minimal state-change events for a run.
213
+ description: |
214
+ Long-lived SSE subscription. Connection auto-closes on
215
+ terminal run event. Honor the `Last-Event-ID` request header
216
+ for resumption — server begins streaming from the sequence
217
+ AFTER the supplied ID and MUST NOT re-emit the resumption
218
+ point itself.
219
+
220
+ Mixed mode (RFC 0094 §I note): the binding's single-value
221
+ `streamMode` enum below describes THIS mode's pure subscription;
222
+ `streamMode` additionally accepts comma-separated combinations
223
+ (e.g. `updates,messages`) per `stream-modes.md` §"Mixed mode" —
224
+ union-of-filters semantics, per-event `event:` labels.
225
+ `values` MUST NOT combine with other modes.
226
+ bindings:
227
+ http:
228
+ method: GET
229
+ query:
230
+ type: object
231
+ properties:
232
+ streamMode:
233
+ type: string
234
+ enum: [updates]
235
+ default: updates
236
+
237
+ subscribeValues:
238
+ action: receive
239
+ channel:
240
+ $ref: '#/channels/runEventsValues'
241
+ title: Subscribe to values stream
242
+ summary: Receive full state snapshots after every transition.
243
+ description: |
244
+ Mixed mode (RFC 0094 §I note): `values` is EXCLUSIVE — it MUST NOT
245
+ be combined in a comma-separated `streamMode` list
246
+ (`stream-modes.md` §"Mixed mode": state.snapshot semantics need
247
+ exclusive ownership). The binding's single-value enum is exact here.
248
+ bindings:
249
+ http:
250
+ method: GET
251
+ query:
252
+ type: object
253
+ required: [streamMode]
254
+ properties:
255
+ streamMode:
256
+ type: string
257
+ enum: [values]
258
+
259
+ subscribeMessages:
260
+ action: receive
261
+ channel:
262
+ $ref: '#/channels/runEventsMessages'
263
+ title: Subscribe to messages stream
264
+ summary: Receive per-token AI chunks.
265
+ description: |
266
+ Mixed mode (RFC 0094 §I note): the binding's single-value
267
+ `streamMode` enum below describes the pure `messages` subscription;
268
+ `streamMode` additionally accepts comma-separated combinations
269
+ (e.g. `updates,messages`) per `stream-modes.md` §"Mixed mode".
270
+ `values` MUST NOT combine with other modes.
271
+ bindings:
272
+ http:
273
+ method: GET
274
+ query:
275
+ type: object
276
+ required: [streamMode]
277
+ properties:
278
+ streamMode:
279
+ type: string
280
+ enum: [messages]
281
+
282
+ subscribeDebug:
283
+ action: receive
284
+ channel:
285
+ $ref: '#/channels/runEventsDebug'
286
+ title: Subscribe to debug stream
287
+ summary: Receive every engine event including internal/log/lease.
288
+ description: |
289
+ Mixed mode (RFC 0094 §I note): the binding's single-value
290
+ `streamMode` enum below describes the pure `debug` subscription;
291
+ `streamMode` additionally accepts comma-separated combinations
292
+ (e.g. `updates,debug`) per `stream-modes.md` §"Mixed mode".
293
+ `values` MUST NOT combine with other modes.
294
+ bindings:
295
+ http:
296
+ method: GET
297
+ query:
298
+ type: object
299
+ required: [streamMode]
300
+ properties:
301
+ streamMode:
302
+ type: string
303
+ enum: [debug]
304
+
305
+ # ─────────────────────────────────────────────────────────────────────────────
306
+ # COMPONENTS
307
+ # ─────────────────────────────────────────────────────────────────────────────
308
+ components:
309
+
310
+ securitySchemes:
311
+ ApiKeyAuth:
312
+ type: httpApiKey
313
+ in: header
314
+ name: Authorization
315
+ description: |
316
+ Bearer-style API key. Format implementation-defined; reference
317
+ impl uses `hk_`/`hk_test_` prefixes. Required scopes:
318
+ `runs:read` to subscribe. See `auth.md`.
319
+
320
+ parameters:
321
+ RunId:
322
+ description: The run to subscribe to. Format opaque; clients MUST treat as a string.
323
+
324
+ # ── Messages ─────────────────────────────────────────────────────────────
325
+ # All `updates`/`debug`-mode messages share the canonical RunEventDoc shape
326
+ # (run-event.schema.json). Each named message below pins the `type` field
327
+ # to a specific RunEventType discriminator so codegens can emit narrowed
328
+ # consumer handlers.
329
+
330
+ messages:
331
+
332
+ # ── Agent evaluation (RFC 0081) — content-free recorded-fact events ───
333
+ EvalStarted:
334
+ name: eval.started
335
+ title: Eval run started (RFC 0081)
336
+ summary: An eval run began. Content-free — suite provenance + counts only. Gated on capabilities.agents.evalSuite.supported.
337
+ contentType: application/json
338
+ payload:
339
+ $ref: '#/components/schemas/EvalStartedPayload'
340
+ EvalScored:
341
+ name: eval.scored
342
+ title: Eval task scored (RFC 0081)
343
+ summary: One eval task was scored (emitted per task, after its terminal agent.decided). Content-free — taskId + score + scalars only, never task output (eval-summary-no-content-leak).
344
+ contentType: application/json
345
+ payload:
346
+ $ref: '#/components/schemas/EvalScoredPayload'
347
+ EvalCompleted:
348
+ name: eval.completed
349
+ title: Eval run completed (RFC 0081)
350
+ summary: An eval run finished. Content-free aggregate scalars; the full scorecard is the run output, read via GET /v1/runs/{runId}/eval-summary.
351
+ contentType: application/json
352
+ payload:
353
+ $ref: '#/components/schemas/EvalCompletedPayload'
354
+
355
+ # ── Agent deployment lifecycle (RFC 0082) — content-free audit events ─
356
+ DeploymentPromoted:
357
+ name: deployment.promoted
358
+ title: Deployment promoted (RFC 0082)
359
+ summary: A version was promoted into a new lifecycle state (gated by RFC 0049 deploy:* + RFC 0051 approvalGate + RFC 0081 requiredEval). Content-free (deployment-event-no-content-leak). Principal-stamped + audit-logged.
360
+ contentType: application/json
361
+ payload:
362
+ $ref: '#/components/schemas/DeploymentPromotedPayload'
363
+ DeploymentRolledBack:
364
+ name: deployment.rolled-back
365
+ title: Deployment rolled back (RFC 0082)
366
+ summary: An active version was rolled back and a prior version restored. Content-free; recorded-fact; audit-logged.
367
+ contentType: application/json
368
+ payload:
369
+ $ref: '#/components/schemas/DeploymentRolledBackPayload'
370
+ DeploymentCanaryAdjusted:
371
+ name: deployment.canary.adjusted
372
+ title: Deployment canary adjusted (RFC 0082)
373
+ summary: An active version's canary traffic share changed. Content-free; recorded-fact; audit-logged.
374
+ contentType: application/json
375
+ payload:
376
+ $ref: '#/components/schemas/DeploymentCanaryAdjustedPayload'
377
+ DeploymentStateChanged:
378
+ name: deployment.state.changed
379
+ title: Deployment state changed (RFC 0082)
380
+ summary: A non-promotion lifecycle transition (pause / resume / deprecate). Content-free; recorded-fact; audit-logged.
381
+ contentType: application/json
382
+ payload:
383
+ $ref: '#/components/schemas/DeploymentStateChangedPayload'
384
+
385
+ # ── Reviewable learning (RFC 0096) — content-free proposal lifecycle ──
386
+ ProposalCreated:
387
+ name: proposal.created
388
+ title: Proposal created (RFC 0096)
389
+ summary: The host synthesized a reviewable-learning draft. Content-free — ids/kind/refs only, never the artifact body or rationale (proposal-inert-until-applied). Emitted only when capabilities.agents.proposals is advertised.
390
+ contentType: application/json
391
+ payload:
392
+ $ref: '#/components/schemas/ProposalCreatedPayload'
393
+ ProposalActivated:
394
+ name: proposal.activated
395
+ title: Proposal activated (RFC 0096)
396
+ summary: A proposal was applied (RFC 0051/0049-gated). Content-free; the installed artifact byte-matches the last-persisted draft (proposal-no-resynthesis).
397
+ contentType: application/json
398
+ payload:
399
+ $ref: '#/components/schemas/ProposalActivatedPayload'
400
+
401
+ # ── Standing goals (RFC 0097) — content-free judge/continuation events ─
402
+ GoalEvaluated:
403
+ name: goal.evaluated
404
+ title: Goal evaluated (RFC 0097)
405
+ summary: A judge check ran against a standing goal. Content-free — no objective text; the verdict is recorded (not recomputed on replay).
406
+ contentType: application/json
407
+ payload:
408
+ $ref: '#/components/schemas/GoalEvaluatedPayload'
409
+ GoalClosed:
410
+ name: goal.closed
411
+ title: Goal closed (RFC 0097)
412
+ summary: A standing goal stopped continuation (satisfied / escalated / abandoned / bound-exceeded). Content-free.
413
+ contentType: application/json
414
+ payload:
415
+ $ref: '#/components/schemas/GoalClosedPayload'
416
+
417
+ # ── Portability (RFC 0098) — content-free import event ───────────────
418
+ ImportApplied:
419
+ name: import.applied
420
+ title: Import applied (RFC 0098)
421
+ summary: An estate import was applied. Content-free — counts + refs only, never item payloads or secret values (export-bundle-no-credential-material).
422
+ contentType: application/json
423
+ payload:
424
+ $ref: '#/components/schemas/ImportAppliedPayload'
425
+
426
+ # ── Run-lifecycle ────────────────────────────────────────────────────
427
+ RunStarted:
428
+ name: run.started
429
+ title: Run started
430
+ summary: A new run was registered and execution began.
431
+ contentType: application/json
432
+ payload:
433
+ $ref: '#/components/schemas/RunEventDoc'
434
+
435
+ RunCompleted:
436
+ name: run.completed
437
+ title: Run completed (terminal)
438
+ summary: Run reached terminal success state. SSE connection closes after this event.
439
+ contentType: application/json
440
+ payload:
441
+ $ref: '#/components/schemas/RunEventDoc'
442
+
443
+ RunFailed:
444
+ name: run.failed
445
+ title: Run failed (terminal)
446
+ summary: Run reached terminal failure state. SSE connection closes after this event.
447
+ contentType: application/json
448
+ payload:
449
+ $ref: '#/components/schemas/RunEventDoc'
450
+
451
+ RunCancelled:
452
+ name: run.cancelled
453
+ title: Run cancelled (terminal)
454
+ summary: Run was cancelled by user or admin. SSE connection closes after this event.
455
+ contentType: application/json
456
+ payload:
457
+ $ref: '#/components/schemas/RunEventDoc'
458
+
459
+ CompensationRequested:
460
+ name: compensation.requested
461
+ title: Compensation plan persisted (RFC 0151 §C/§D)
462
+ summary: >-
463
+ The unwind plan is durable. §C requires this BEFORE the first inverse
464
+ action executes — a host that starts unwinding first cannot resume after
465
+ a crash, and the crash is when resumption matters.
466
+ contentType: application/json
467
+ payload:
468
+ $ref: '#/components/schemas/RunEventDoc'
469
+
470
+ CompensationStarted:
471
+ name: compensation.started
472
+ title: First inverse action started (RFC 0151 §D)
473
+ summary: Compensation began executing. MUST follow compensation.requested.
474
+ contentType: application/json
475
+ payload:
476
+ $ref: '#/components/schemas/RunEventDoc'
477
+
478
+ CompensationCompleted:
479
+ name: compensation.completed
480
+ title: Compensation completed (RFC 0151 §D)
481
+ summary: Every inverse action in the plan succeeded.
482
+ contentType: application/json
483
+ payload:
484
+ $ref: '#/components/schemas/RunEventDoc'
485
+
486
+ CompensationFailed:
487
+ name: compensation.failed
488
+ title: Compensation failed (RFC 0151 §D)
489
+ summary: >-
490
+ An inverse action exhausted its retries. Compensation is a second effect,
491
+ not an undo — it can fail, and the run's compensationStatus records that
492
+ rather than the run silently reporting success.
493
+ contentType: application/json
494
+ payload:
495
+ $ref: '#/components/schemas/RunEventDoc'
496
+
497
+ CompensationPaused:
498
+ name: compensation.paused
499
+ title: Compensation paused for authorized intervention (RFC 0151 §C)
500
+ summary: >-
501
+ Cancelling the parent MUST NOT silently abandon an active compensation.
502
+ It continues, pauses here, or records manual intervention required.
503
+ contentType: application/json
504
+ payload:
505
+ $ref: '#/components/schemas/RunEventDoc'
506
+
507
+ CompensationManualInterventionRequired:
508
+ name: compensation.manual_intervention_required
509
+ title: Compensation needs an operator (RFC 0151 §C/§E)
510
+ summary: >-
511
+ The host cannot proceed unaided. Recorded explicitly because an unwind
512
+ that stops without saying so is indistinguishable from one that finished.
513
+ contentType: application/json
514
+ payload:
515
+ $ref: '#/components/schemas/RunEventDoc'
516
+
517
+ RunPaused:
518
+ name: run.paused
519
+ title: Run paused
520
+ summary: Run paused (e.g., capability limit reached, manual pause).
521
+ contentType: application/json
522
+ payload:
523
+ $ref: '#/components/schemas/RunEventDoc'
524
+
525
+ RunResumed:
526
+ name: run.resumed
527
+ title: Run resumed
528
+ summary: Run resumed from pause/suspend.
529
+ contentType: application/json
530
+ payload:
531
+ $ref: '#/components/schemas/RunEventDoc'
532
+
533
+ RunAnnotated:
534
+ name: run.annotated
535
+ title: Run annotated (RFC 0056)
536
+ summary: A non-blocking quality annotation was recorded for the run. Live notification ONLY — NOT a replayable run-event-log entry; its payload is an Annotation (not a RunEventDoc), so it is excluded from fork/replay (RFC 0056 §B/§D).
537
+ contentType: application/json
538
+ payload:
539
+ $ref: '#/components/schemas/Annotation'
540
+
541
+ WorkspaceUpdated:
542
+ name: workspace.updated
543
+ title: Workspace file updated (RFC 0059)
544
+ summary: A workspace file was created, replaced, or deleted via the host.workspace store. Content-free — carries the file path + resulting version only (the body is served by the read-side, SR-1-redacted). A replayable run-event-log entry (re-read from the log on replay, never regenerated); gated on capabilities.workspace.supported.
545
+ contentType: application/json
546
+ payload:
547
+ $ref: '#/components/schemas/WorkspaceUpdatedPayload'
548
+
549
+ # RFC 0060. Heartbeat-scoped observability events — NOT RunEventDocs,
550
+ # NOT replayable run-event-log entries. Emitted on the heartbeat channel.
551
+ HeartbeatEvaluated:
552
+ name: heartbeat.evaluated
553
+ title: Heartbeat evaluated (RFC 0060)
554
+ summary: A heartbeat predicate was evaluated this tick (status + changed flag). Heartbeat-scoped observability.
555
+ contentType: application/json
556
+ payload:
557
+ $ref: '#/components/schemas/HeartbeatEvaluated'
558
+
559
+ HeartbeatStateChanged:
560
+ name: heartbeat.stateChanged
561
+ title: Heartbeat state changed (RFC 0060)
562
+ summary: A heartbeat predicate's state transitioned; emitted ONLY on change (never on an unchanged tick). Heartbeat-scoped.
563
+ contentType: application/json
564
+ payload:
565
+ $ref: '#/components/schemas/HeartbeatStateChanged'
566
+
567
+ # ── Node-lifecycle ───────────────────────────────────────────────────
568
+ NodeCompleted:
569
+ name: node.completed
570
+ title: Node completed successfully
571
+ contentType: application/json
572
+ payload:
573
+ $ref: '#/components/schemas/RunEventDoc'
574
+
575
+ NodeFailed:
576
+ name: node.failed
577
+ title: Node failed
578
+ contentType: application/json
579
+ payload:
580
+ $ref: '#/components/schemas/RunEventDoc'
581
+
582
+ NodeSkipped:
583
+ name: node.skipped
584
+ title: Node skipped due to edge condition
585
+ contentType: application/json
586
+ payload:
587
+ $ref: '#/components/schemas/RunEventDoc'
588
+
589
+ NodeSuspended:
590
+ name: node.suspended
591
+ title: Node suspended (HITL or external-event wait)
592
+ contentType: application/json
593
+ payload:
594
+ $ref: '#/components/schemas/RunEventDoc'
595
+
596
+ NodeDispatched:
597
+ name: node.dispatched
598
+ title: core.dispatch spawned a child workflow (RFC 0007 §D + RFC 0022 §A)
599
+ contentType: application/json
600
+ payload:
601
+ $ref: '#/components/schemas/RunEventDoc'
602
+ DispatchFanOut:
603
+ name: core.dispatch.fanOut
604
+ title: core.dispatch began a parallel fan-out wave (RFC 0118)
605
+ summary: Emitted when a fanOutPolicy=parallel wave begins; payload $defs.dispatchFanOut carries childCount/maxConcurrency/joinMode. Parallel path only.
606
+ contentType: application/json
607
+ payload:
608
+ $ref: '#/components/schemas/RunEventDoc'
609
+ DispatchJoin:
610
+ name: core.dispatch.join
611
+ title: core.dispatch parallel join satisfied (RFC 0118)
612
+ summary: Emitted when a fanOutPolicy=parallel join is satisfied/failed; payload $defs.dispatchJoin carries joinOutcome + the replay-deterministic mergeOrder.
613
+ contentType: application/json
614
+ payload:
615
+ $ref: '#/components/schemas/RunEventDoc'
616
+
617
+ # ── HITL ─────────────────────────────────────────────────────────────
618
+ ApprovalRequested:
619
+ name: approval.requested
620
+ title: Approval requested
621
+ summary: Engine emitted an approval interrupt awaiting user resolution.
622
+ contentType: application/json
623
+ payload:
624
+ $ref: '#/components/schemas/RunEventDoc'
625
+
626
+ ApprovalReceived:
627
+ name: approval.received
628
+ title: Approval received
629
+ summary: User resolved an approval interrupt (accept/reject/refine/edit).
630
+ contentType: application/json
631
+ payload:
632
+ $ref: '#/components/schemas/RunEventDoc'
633
+
634
+ ClarificationRequested:
635
+ name: clarification.requested
636
+ title: Clarification requested
637
+ contentType: application/json
638
+ payload:
639
+ $ref: '#/components/schemas/RunEventDoc'
640
+
641
+ ClarificationResolved:
642
+ name: clarification.resolved
643
+ title: Clarification resolved
644
+ contentType: application/json
645
+ payload:
646
+ $ref: '#/components/schemas/RunEventDoc'
647
+
648
+ InterruptRequested:
649
+ name: interrupt.requested
650
+ title: Interrupt requested (canonical HITL primitive)
651
+ summary: |
652
+ The discriminated-union form of the full `interrupt.md` kind union
653
+ (RFC 0094 §E): approval / clarification / external-event / custom /
654
+ conversation.start / conversation.exchange / conversation.close /
655
+ low-confidence.
656
+ Servers emitting `interrupt.requested` SHOULD also emit the legacy
657
+ kind-specific event (`approval.requested` etc) for backward compat
658
+ until consumers migrate.
659
+ contentType: application/json
660
+ payload:
661
+ $ref: '#/components/schemas/RunEventDoc'
662
+
663
+ InterruptResolved:
664
+ name: interrupt.resolved
665
+ title: Interrupt resolved
666
+ contentType: application/json
667
+ payload:
668
+ $ref: '#/components/schemas/RunEventDoc'
669
+
670
+ # ── Artifacts ────────────────────────────────────────────────────────
671
+ ArtifactCreated:
672
+ name: artifact.created
673
+ title: Artifact produced by a node
674
+ summary: A typed artifact (PRD, plan, theme, etc) was created and registered.
675
+ contentType: application/json
676
+ payload:
677
+ $ref: '#/components/schemas/RunEventDoc'
678
+
679
+ # ── Synthesized for `values` mode ────────────────────────────────────
680
+ StateSnapshot:
681
+ name: state.snapshot
682
+ title: Full projected run state
683
+ summary: |
684
+ Synthesized event emitted by the server in `values` mode after
685
+ each `updates`-tier transition. NOT a member of the canonical
686
+ `RunEventType` enum — this is a per-mode synthetic.
687
+ contentType: application/json
688
+ payload:
689
+ $ref: '#/components/schemas/StateSnapshotPayload'
690
+
691
+ # ── Synthesized for `messages` mode ──────────────────────────────────
692
+ AiMessageChunk:
693
+ name: ai.message.chunk
694
+ title: AI token chunk
695
+ summary: Per-token streaming chunk from a `core.ai.*` node.
696
+ contentType: application/json
697
+ payload:
698
+ $ref: '#/components/schemas/AiMessageChunkPayload'
699
+
700
+ # ── Catch-all for `debug` mode ───────────────────────────────────────
701
+ AnyRunEvent:
702
+ name: any
703
+ title: Any RunEventDoc
704
+ summary: |
705
+ Type-erased handler for `debug` mode — discriminate on the
706
+ `type` field per the `RunEventType` enum in the run-event
707
+ JSON Schema (the authoritative, exhaustive event list; the
708
+ named messages above are a curated `updates`-tier subset).
709
+ Includes events filtered out of `updates`: `log.appended`,
710
+ `variable.changed`, `version.pinned`, `lease.*`, `node.retried`,
711
+ `replay.diverged`, `connector.authorized`,
712
+ `connector.auth_expired` (RFC 0047), `authorization.decided`
713
+ (RFC 0049), `approval.granted` / `approval.rejected` /
714
+ `approval.overridden` (RFC 0051), etc.
715
+ contentType: application/json
716
+ payload:
717
+ $ref: '#/components/schemas/RunEventDoc'
718
+
719
+ # ── Voice (RFC 0106) ─────────────────────────────────────────────────
720
+ # The voice.* turn-taking / barge-in taxonomy — the single canonical record of a
721
+ # live voice turn (ctx.callTranscriber resolves its Promise at turn_commit; these
722
+ # events ARE the streaming representation on the durable log). All RunEventDocs.
723
+ VoiceSpeechStart:
724
+ name: voice.speech_start
725
+ title: Inbound user speech onset detected
726
+ contentType: application/json
727
+ payload:
728
+ $ref: '#/components/schemas/RunEventDoc'
729
+
730
+ VoiceTranscript:
731
+ name: voice.transcript
732
+ title: Interim/final transcript part (untrusted ingress; carries contentTrust)
733
+ contentType: application/json
734
+ payload:
735
+ $ref: '#/components/schemas/RunEventDoc'
736
+
737
+ VoiceEndpointCandidate:
738
+ name: voice.endpoint_candidate
739
+ title: Likely end-of-turn boundary (semantic turn detection)
740
+ contentType: application/json
741
+ payload:
742
+ $ref: '#/components/schemas/RunEventDoc'
743
+
744
+ VoiceTurnCommit:
745
+ name: voice.turn_commit
746
+ title: User yielded the floor (callTranscriber Promise resolves here)
747
+ contentType: application/json
748
+ payload:
749
+ $ref: '#/components/schemas/RunEventDoc'
750
+
751
+ VoiceSynthesisChunk:
752
+ name: voice.synthesis_chunk
753
+ title: Clause-boundary streaming-synthesis chunk (metadata only)
754
+ contentType: application/json
755
+ payload:
756
+ $ref: '#/components/schemas/RunEventDoc'
757
+
758
+ VoiceBargeIn:
759
+ name: voice.barge_in
760
+ title: User speech overlapped active assistant playback
761
+ contentType: application/json
762
+ payload:
763
+ $ref: '#/components/schemas/RunEventDoc'
764
+
765
+ VoiceCancelled:
766
+ name: voice.cancelled
767
+ title: Downstream LLM/TTS work cancelled (barge-in or explicit)
768
+ contentType: application/json
769
+ payload:
770
+ $ref: '#/components/schemas/RunEventDoc'
771
+
772
+ # ── Schemas ────────────────────────────────────────────────────────────
773
+ schemas:
774
+
775
+ # The canonical persisted-event shape. Defined externally so the same
776
+ # contract is shared with REST event-poll responses (rest-endpoints.md
777
+ # `GET /v1/runs/{runId}/events/poll`) and offline replay tools.
778
+ RunEventDoc:
779
+ $ref: '../schemas/run-event.schema.json'
780
+
781
+ # RFC 0081 — eval event payloads.
782
+ EvalStartedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/evalStarted' }
783
+ EvalScoredPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/evalScored' }
784
+ EvalCompletedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/evalCompleted' }
785
+ # RFC 0082 — deployment event payloads.
786
+ DeploymentPromotedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/deploymentPromoted' }
787
+ DeploymentRolledBackPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/deploymentRolledBack' }
788
+ DeploymentCanaryAdjustedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/deploymentCanaryAdjusted' }
789
+ DeploymentStateChangedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/deploymentStateChanged' }
790
+ # RFC 0096 — reviewable-learning proposal event payloads.
791
+ ProposalCreatedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/proposalCreated' }
792
+ ProposalActivatedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/proposalActivated' }
793
+ # RFC 0097 — standing-goal event payloads.
794
+ GoalEvaluatedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/goalEvaluated' }
795
+ GoalClosedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/goalClosed' }
796
+ # RFC 0098 — portability import event payload.
797
+ ImportAppliedPayload: { $ref: '../schemas/run-event-payloads.schema.json#/$defs/importApplied' }
798
+
799
+ # RFC 0056. The run.annotated notification carries an Annotation —
800
+ # NOT a RunEventDoc — because annotations are a side-resource, not
801
+ # replayable run-event-log entries (RFC 0056 §B/§D).
802
+ Annotation:
803
+ $ref: '../schemas/annotation.schema.json'
804
+
805
+ # RFC 0059. The workspace.updated event payload — content-free
806
+ # {path, version}. Definition lives at
807
+ # run-event-payloads.schema.json#$defs.workspaceUpdated so the SSE
808
+ # consumer + run-event log share one shape contract.
809
+ WorkspaceUpdatedPayload:
810
+ $ref: '../schemas/run-event-payloads.schema.json#/$defs/workspaceUpdated'
811
+ # RFC 0060 heartbeat events (heartbeat-scoped; see host-capabilities.md §host.heartbeat).
812
+ HeartbeatEvaluated:
813
+ $ref: '../schemas/heartbeat-evaluated.schema.json'
814
+ HeartbeatStateChanged:
815
+ $ref: '../schemas/heartbeat-state-changed.schema.json'
816
+
817
+ StateSnapshotPayload:
818
+ # S1 closure (2026-04-27): reuse the canonical RunSnapshot
819
+ # projection shape verbatim. Same type returned by
820
+ # `GET /v1/runs/{runId}` — consumers can swap polling for
821
+ # values-mode SSE without re-modeling state.
822
+ $ref: '../schemas/run-snapshot.schema.json'
823
+
824
+ AiMessageChunkPayload:
825
+ # S2 closure (2026-04-27) + RFC 0094 §D single-sourcing: the payload
826
+ # is the canonical `outputChunk` definition in
827
+ # run-event-payloads.schema.json — referenced (not hand-copied, the
828
+ # prior inline copy was one of the three drifting definitions) so the
829
+ # SSE consumer + run-event log share exactly one shape contract.
830
+ # Minimum compliant payload: {nodeId, runId, chunk, isLast} per
831
+ # stream-modes.md §messages; `meta` adds Tier 1 typed slots
832
+ # (finishReason / logprobs / toolCalls / model / usage) and a Tier 2
833
+ # provider-pass-through escape hatch (see #$defs/_chunkMeta).
834
+ $ref: '../schemas/run-event-payloads.schema.json#/$defs/outputChunk'