@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.
- package/CORPUS-STAMP.json +234 -0
- package/LICENSE +201 -0
- package/README.md +7 -0
- package/api/.redocly.lint-ignore.yaml +22 -0
- package/api/asyncapi.yaml +834 -0
- package/api/grpc/openwop.proto +251 -0
- package/api/openapi.yaml +2693 -0
- package/api/redocly.yaml +23 -0
- package/api/seams-v2.yaml +680 -0
- package/api/v2/asyncapi.yaml +528 -0
- package/api/v2/openapi.yaml +3139 -0
- package/api/v2/redocly.yaml +16 -0
- package/package.json +10 -0
- package/schemas/README.md +144 -0
- package/schemas/a2a-task-state.schema.json +78 -0
- package/schemas/a2ui-surface-delta-frame.schema.json +48 -0
- package/schemas/agent-deployment-transition.schema.json +49 -0
- package/schemas/agent-deployment.schema.json +54 -0
- package/schemas/agent-eval-suite.schema.json +140 -0
- package/schemas/agent-inventory-response.schema.json +115 -0
- package/schemas/agent-manifest.schema.json +156 -0
- package/schemas/agent-org-chart.schema.json +82 -0
- package/schemas/agent-ref.schema.json +63 -0
- package/schemas/agent-roster-entry.schema.json +81 -0
- package/schemas/agent-roster-response.schema.json +21 -0
- package/schemas/ai-envelope.schema.json +134 -0
- package/schemas/annotation-create.schema.json +37 -0
- package/schemas/annotation.schema.json +56 -0
- package/schemas/artifact-type-pack-manifest.schema.json +244 -0
- package/schemas/audit-verify-result.schema.json +90 -0
- package/schemas/budget-policy.schema.json +18 -0
- package/schemas/capabilities.schema.json +4160 -0
- package/schemas/certification-bundle-v2.schema.json +118 -0
- package/schemas/channel-presence-payload.schema.json +41 -0
- package/schemas/channel-written-payload.schema.json +55 -0
- package/schemas/chat-card-pack-manifest.schema.json +253 -0
- package/schemas/compact-tool-descriptor.schema.json +51 -0
- package/schemas/compensation-policy.schema.json +64 -0
- package/schemas/conformance-certification-bundle.schema.json +86 -0
- package/schemas/connection-pack-manifest.schema.json +353 -0
- package/schemas/conversation-event.schema.json +168 -0
- package/schemas/conversation-turn.schema.json +117 -0
- package/schemas/core-conformance-mock-agent-config.schema.json +152 -0
- package/schemas/credential-provenance.schema.json +18 -0
- package/schemas/credential-reference.schema.json +21 -0
- package/schemas/debug-bundle.schema.json +196 -0
- package/schemas/dispatch-config.schema.json +112 -0
- package/schemas/envelopes/clarification.request.schema.json +52 -0
- package/schemas/envelopes/error.schema.json +30 -0
- package/schemas/envelopes/media.audio.schema.json +38 -0
- package/schemas/envelopes/media.file.schema.json +37 -0
- package/schemas/envelopes/media.image.schema.json +33 -0
- package/schemas/envelopes/schema.request.schema.json +26 -0
- package/schemas/envelopes/schema.response.schema.json +22 -0
- package/schemas/envelopes/ui.a2ui-surface.schema.json +154 -0
- package/schemas/error-envelope.schema.json +25 -0
- package/schemas/eval-summary.schema.json +92 -0
- package/schemas/export-bundle.schema.json +66 -0
- package/schemas/form-content-pack-manifest.schema.json +243 -0
- package/schemas/frontend-plugin-manifest.schema.json +109 -0
- package/schemas/goal.schema.json +104 -0
- package/schemas/heartbeat-evaluated.schema.json +14 -0
- package/schemas/heartbeat-state-changed.schema.json +14 -0
- package/schemas/localized-content-language-settings.schema.json +26 -0
- package/schemas/localized-content-page-response.schema.json +60 -0
- package/schemas/localized-content-page.schema.json +62 -0
- package/schemas/localized-content-section.schema.json +51 -0
- package/schemas/memory-entry.schema.json +36 -0
- package/schemas/memory-list-options.schema.json +37 -0
- package/schemas/node-pack-manifest.schema.json +654 -0
- package/schemas/orchestrator-decision.schema.json +90 -0
- package/schemas/org-chart-responsibility-view.schema.json +26 -0
- package/schemas/pack-lockfile.schema.json +108 -0
- package/schemas/prompt-kind.schema.json +8 -0
- package/schemas/prompt-pack-manifest.schema.json +117 -0
- package/schemas/prompt-ref.schema.json +40 -0
- package/schemas/prompt-template.schema.json +149 -0
- package/schemas/proposal.schema.json +84 -0
- package/schemas/registry-version-manifest.schema.json +208 -0
- package/schemas/residency.schema.json +16 -0
- package/schemas/run-ancestry-response.schema.json +54 -0
- package/schemas/run-diff-response.schema.json +64 -0
- package/schemas/run-event-payloads.schema.json +4452 -0
- package/schemas/run-event.schema.json +211 -0
- package/schemas/run-options.schema.json +80 -0
- package/schemas/run-orchestrator-decided-event.schema.json +20 -0
- package/schemas/run-snapshot.schema.json +148 -0
- package/schemas/security-advisory.schema.json +109 -0
- package/schemas/self-hosted-runner-dispatch-frame.schema.json +79 -0
- package/schemas/self-hosted-runner-registration.schema.json +53 -0
- package/schemas/self-hosted-runner-result-frame.schema.json +38 -0
- package/schemas/subject.schema.json +56 -0
- package/schemas/suspend-request.schema.json +207 -0
- package/schemas/tool-descriptor.schema.json +63 -0
- package/schemas/trigger-event.schema.json +222 -0
- package/schemas/trigger-subscription-registration.schema.json +67 -0
- package/schemas/trigger-subscription.schema.json +26 -0
- package/schemas/ui-plugin-message.schema.json +90 -0
- package/schemas/v2/a2a-task-state.schema.json +102 -0
- package/schemas/v2/a2ui-surface-delta-frame.schema.json +62 -0
- package/schemas/v2/agent-deployment-transition.schema.json +67 -0
- package/schemas/v2/agent-deployment.schema.json +68 -0
- package/schemas/v2/agent-eval-suite.schema.json +214 -0
- package/schemas/v2/agent-inventory-response.schema.json +172 -0
- package/schemas/v2/agent-manifest.schema.json +218 -0
- package/schemas/v2/agent-org-chart.schema.json +149 -0
- package/schemas/v2/agent-ref.schema.json +67 -0
- package/schemas/v2/agent-roster-entry.schema.json +104 -0
- package/schemas/v2/agent-roster-response.schema.json +27 -0
- package/schemas/v2/ai-envelope.schema.json +167 -0
- package/schemas/v2/annotation-create.schema.json +109 -0
- package/schemas/v2/annotation.schema.json +142 -0
- package/schemas/v2/artifact-type-pack-manifest.schema.json +245 -0
- package/schemas/v2/audit-verify-result.schema.json +110 -0
- package/schemas/v2/budget-policy.schema.json +61 -0
- package/schemas/v2/capabilities.schema.json +7644 -0
- package/schemas/v2/certification-bundle.schema.json +401 -0
- package/schemas/v2/channel-presence-payload.schema.json +60 -0
- package/schemas/v2/channel-written-payload.schema.json +64 -0
- package/schemas/v2/chat-card-pack-manifest.schema.json +254 -0
- package/schemas/v2/compact-tool-descriptor.schema.json +108 -0
- package/schemas/v2/compensation-policy.schema.json +91 -0
- package/schemas/v2/compensation-projection.schema.json +95 -0
- package/schemas/v2/configurable.schema.json +110 -0
- package/schemas/v2/connection-pack-manifest.schema.json +354 -0
- package/schemas/v2/conversation-event.schema.json +281 -0
- package/schemas/v2/conversation-turn.schema.json +165 -0
- package/schemas/v2/credential-provenance.schema.json +62 -0
- package/schemas/v2/credential-reference.schema.json +28 -0
- package/schemas/v2/debug-bundle.schema.json +312 -0
- package/schemas/v2/dispatch-config.schema.json +147 -0
- package/schemas/v2/effect-ledger-projection.schema.json +71 -0
- package/schemas/v2/effect-seam-manifest.schema.json +98 -0
- package/schemas/v2/envelopes/clarification.request.schema.json +59 -0
- package/schemas/v2/envelopes/error.schema.json +35 -0
- package/schemas/v2/envelopes/media.audio.schema.json +41 -0
- package/schemas/v2/envelopes/media.file.schema.json +40 -0
- package/schemas/v2/envelopes/media.image.schema.json +36 -0
- package/schemas/v2/envelopes/schema.request.schema.json +29 -0
- package/schemas/v2/envelopes/schema.response.schema.json +26 -0
- package/schemas/v2/envelopes/ui.a2ui-surface.schema.json +292 -0
- package/schemas/v2/error-envelope.schema.json +229 -0
- package/schemas/v2/eval-summary.schema.json +166 -0
- package/schemas/v2/export-bundle.schema.json +94 -0
- package/schemas/v2/form-content-pack-manifest.schema.json +241 -0
- package/schemas/v2/frontend-plugin-manifest.schema.json +152 -0
- package/schemas/v2/goal.schema.json +188 -0
- package/schemas/v2/heartbeat-evaluated.schema.json +34 -0
- package/schemas/v2/heartbeat-state-changed.schema.json +31 -0
- package/schemas/v2/ids.schema.json +31 -0
- package/schemas/v2/localized-content-language-settings.schema.json +34 -0
- package/schemas/v2/localized-content-page-response.schema.json +94 -0
- package/schemas/v2/localized-content-page.schema.json +87 -0
- package/schemas/v2/localized-content-section.schema.json +63 -0
- package/schemas/v2/memory-entry.schema.json +45 -0
- package/schemas/v2/memory-list-options.schema.json +41 -0
- package/schemas/v2/node-pack-manifest.schema.json +657 -0
- package/schemas/v2/orchestrator-decision.schema.json +120 -0
- package/schemas/v2/org-chart-responsibility-view.schema.json +36 -0
- package/schemas/v2/pack-lockfile.schema.json +139 -0
- package/schemas/v2/prompt-kind.schema.json +14 -0
- package/schemas/v2/prompt-pack-manifest.schema.json +118 -0
- package/schemas/v2/prompt-ref.schema.json +42 -0
- package/schemas/v2/prompt-template.schema.json +209 -0
- package/schemas/v2/proposal.schema.json +145 -0
- package/schemas/v2/registry-version-manifest.schema.json +292 -0
- package/schemas/v2/residency.schema.json +19 -0
- package/schemas/v2/run-ancestry-response.schema.json +68 -0
- package/schemas/v2/run-diff-response.schema.json +80 -0
- package/schemas/v2/run-event-payloads.schema.json +4588 -0
- package/schemas/v2/run-event.schema.json +324 -0
- package/schemas/v2/run-options.schema.json +90 -0
- package/schemas/v2/run-orchestrator-decided-event.schema.json +22 -0
- package/schemas/v2/run-snapshot.schema.json +207 -0
- package/schemas/v2/security-advisory.schema.json +138 -0
- package/schemas/v2/self-hosted-runner-dispatch-frame.schema.json +119 -0
- package/schemas/v2/self-hosted-runner-registration.schema.json +74 -0
- package/schemas/v2/self-hosted-runner-result-frame.schema.json +47 -0
- package/schemas/v2/subject-link.schema.json +69 -0
- package/schemas/v2/subject.schema.json +597 -0
- package/schemas/v2/suspend-request.schema.json +370 -0
- package/schemas/v2/tool-descriptor.schema.json +150 -0
- package/schemas/v2/trigger-event.schema.json +508 -0
- package/schemas/v2/trigger-subscription-registration.schema.json +99 -0
- package/schemas/v2/trigger-subscription.schema.json +79 -0
- package/schemas/v2/ui-plugin-message.schema.json +149 -0
- package/schemas/v2/workflow-chain-pack-manifest.schema.json +610 -0
- package/schemas/v2/workflow-definition.schema.json +864 -0
- package/schemas/v2/workload-identity.schema.json +115 -0
- package/schemas/v2/workspace-file-create.schema.json +23 -0
- package/schemas/v2/workspace-file.schema.json +45 -0
- package/schemas/workflow-chain-pack-manifest.schema.json +615 -0
- package/schemas/workflow-definition.schema.json +850 -0
- package/schemas/workload-identity.schema.json +79 -0
- package/schemas/workspace-file-create.schema.json +20 -0
- package/schemas/workspace-file.schema.json +39 -0
- package/spec/v1/alias-detectors.json +283 -0
- package/spec/v1/capability-declaration-classes.json +176 -0
- package/spec/v1/core-standard-manifest.json +423 -0
- package/spec/v1/deprecations.json +854 -0
- package/spec/v1/deprecations.schema.json +187 -0
- package/spec/v1/event-codemap.json +1089 -0
- package/spec/v1/event-codemap.schema.json +41 -0
- package/spec/v1/extensions.json +1273 -0
- package/spec/v1/gaps.json +14581 -0
- package/spec/v1/gaps.schema.json +55 -0
- package/spec/v1/migrations.json +1822 -0
- package/spec/v1/migrations.schema.json +44 -0
- package/spec/v1/operation-path-manifest.json +462 -0
- package/spec/v1/spec-gaps.json +4823 -0
- package/spec/v2/declaration.json +1862 -0
- package/spec/v2/declaration.schema.json +305 -0
- package/spec/v2/errors.json +837 -0
- package/spec/v2/event-codemap.json +1099 -0
- package/spec/v2/event-codemap.schema.json +114 -0
- package/spec/v2/ext/provider-idempotency/registry.json +6 -0
- package/spec/v2/facets/a2a.schema.json +51 -0
- package/spec/v2/facets/aiProviders.schema.json +56 -0
- package/spec/v2/facets/auth.schema.json +91 -0
- package/spec/v2/facets/heartbeat.schema.json +20 -0
- package/spec/v2/facets/interrupt.schema.json +29 -0
- package/spec/v2/facets/mcp.schema.json +81 -0
- package/spec/v2/facets/replay.schema.json +34 -0
- package/spec/v2/facets/sandbox.schema.json +31 -0
- package/spec/v2/facets/webhooks.schema.json +18 -0
- package/spec/v2/path-manifest.json +279 -0
- package/spec/v2/peer-dependency-aliases.json +165 -0
- package/spec/v2/profiles.json +45 -0
- package/spec/v2/release.json +6 -0
|
@@ -0,0 +1,4452 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v1/run-event-payloads.schema.json",
|
|
4
|
+
"title": "RunEventPayloads",
|
|
5
|
+
"description": "Per-RunEventType payload schemas. The base RunEventDoc shape (run-event.schema.json) leaves `payload` permissive for forward-compat. This schema defines the canonical payload contract for each known RunEventType. Consumers MAY pin strict payload validation via `$defs.<typeId>` and `ajv.validate(schema.$defs[event.type], event.payload)`. Unknown event types MUST be tolerated (no $defs match \u2192 fold best-effort).\n\n117 variants from `run-event.schema.json#$defs.RunEventType` are covered, grouped into ~20 shape families with shared $defs. Naming convention: camelCase keys mirror dotted RunEventType names (e.g., `run.started` \u2192 `runStarted`).",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"$defs": {
|
|
8
|
+
"_typeIndex": {
|
|
9
|
+
"description": "Lookup map: RunEventType \u2192 $defs key. Informative \u2014 consumers can derive this themselves but having it explicit aids tooling.",
|
|
10
|
+
"type": "object",
|
|
11
|
+
"additionalProperties": false,
|
|
12
|
+
"properties": {
|
|
13
|
+
"run.started": {
|
|
14
|
+
"$ref": "#/$defs/runStarted"
|
|
15
|
+
},
|
|
16
|
+
"run.completed": {
|
|
17
|
+
"$ref": "#/$defs/runCompleted"
|
|
18
|
+
},
|
|
19
|
+
"run.failed": {
|
|
20
|
+
"$ref": "#/$defs/runFailed"
|
|
21
|
+
},
|
|
22
|
+
"run.cancelled": {
|
|
23
|
+
"$ref": "#/$defs/runCancelled"
|
|
24
|
+
},
|
|
25
|
+
"run.resuming": {
|
|
26
|
+
"$ref": "#/$defs/runResuming"
|
|
27
|
+
},
|
|
28
|
+
"run.paused": {
|
|
29
|
+
"$ref": "#/$defs/runPaused"
|
|
30
|
+
},
|
|
31
|
+
"run.resumed": {
|
|
32
|
+
"$ref": "#/$defs/runResumed"
|
|
33
|
+
},
|
|
34
|
+
"run.restored-from-snapshot": {
|
|
35
|
+
"$ref": "#/$defs/runRestoredFromSnapshot"
|
|
36
|
+
},
|
|
37
|
+
"run.dead_lettered": {
|
|
38
|
+
"$ref": "#/$defs/runDeadLettered"
|
|
39
|
+
},
|
|
40
|
+
"node.started": {
|
|
41
|
+
"$ref": "#/$defs/nodeStarted"
|
|
42
|
+
},
|
|
43
|
+
"node.completed": {
|
|
44
|
+
"$ref": "#/$defs/nodeCompleted"
|
|
45
|
+
},
|
|
46
|
+
"node.failed": {
|
|
47
|
+
"$ref": "#/$defs/nodeFailed"
|
|
48
|
+
},
|
|
49
|
+
"node.suspended": {
|
|
50
|
+
"$ref": "#/$defs/nodeSuspended"
|
|
51
|
+
},
|
|
52
|
+
"node.suspend-failed": {
|
|
53
|
+
"$ref": "#/$defs/nodeSuspendFailed"
|
|
54
|
+
},
|
|
55
|
+
"node.resumed": {
|
|
56
|
+
"$ref": "#/$defs/nodeResumed"
|
|
57
|
+
},
|
|
58
|
+
"node.retried": {
|
|
59
|
+
"$ref": "#/$defs/nodeRetried"
|
|
60
|
+
},
|
|
61
|
+
"node.skipped": {
|
|
62
|
+
"$ref": "#/$defs/nodeSkipped"
|
|
63
|
+
},
|
|
64
|
+
"node.cancelled": {
|
|
65
|
+
"$ref": "#/$defs/nodeCancelled"
|
|
66
|
+
},
|
|
67
|
+
"approval.requested": {
|
|
68
|
+
"$ref": "#/$defs/approvalRequested"
|
|
69
|
+
},
|
|
70
|
+
"approval.received": {
|
|
71
|
+
"$ref": "#/$defs/approvalReceived"
|
|
72
|
+
},
|
|
73
|
+
"approval.granted": {
|
|
74
|
+
"$ref": "#/$defs/approvalGranted"
|
|
75
|
+
},
|
|
76
|
+
"approval.rejected": {
|
|
77
|
+
"$ref": "#/$defs/approvalRejected"
|
|
78
|
+
},
|
|
79
|
+
"approval.overridden": {
|
|
80
|
+
"$ref": "#/$defs/approvalOverridden"
|
|
81
|
+
},
|
|
82
|
+
"clarification.requested": {
|
|
83
|
+
"$ref": "#/$defs/clarificationRequested"
|
|
84
|
+
},
|
|
85
|
+
"clarification.resolved": {
|
|
86
|
+
"$ref": "#/$defs/clarificationResolved"
|
|
87
|
+
},
|
|
88
|
+
"interrupt.requested": {
|
|
89
|
+
"$ref": "#/$defs/interruptRequested"
|
|
90
|
+
},
|
|
91
|
+
"interrupt.resolved": {
|
|
92
|
+
"$ref": "#/$defs/interruptResolved"
|
|
93
|
+
},
|
|
94
|
+
"channel.written": {
|
|
95
|
+
"$ref": "#/$defs/channelWritten"
|
|
96
|
+
},
|
|
97
|
+
"channel.presence": {
|
|
98
|
+
"$ref": "#/$defs/channelPresence"
|
|
99
|
+
},
|
|
100
|
+
"context.summarized": {
|
|
101
|
+
"$ref": "#/$defs/contextSummarized"
|
|
102
|
+
},
|
|
103
|
+
"artifact.created": {
|
|
104
|
+
"$ref": "#/$defs/artifactCreated"
|
|
105
|
+
},
|
|
106
|
+
"output.chunk": {
|
|
107
|
+
"$ref": "#/$defs/outputChunk"
|
|
108
|
+
},
|
|
109
|
+
"variable.changed": {
|
|
110
|
+
"$ref": "#/$defs/variableChanged"
|
|
111
|
+
},
|
|
112
|
+
"log.appended": {
|
|
113
|
+
"$ref": "#/$defs/logAppended"
|
|
114
|
+
},
|
|
115
|
+
"version.pinned": {
|
|
116
|
+
"$ref": "#/$defs/versionPinned"
|
|
117
|
+
},
|
|
118
|
+
"workflow.restored": {
|
|
119
|
+
"$ref": "#/$defs/workflowRestored"
|
|
120
|
+
},
|
|
121
|
+
"workflow.loopback-limit": {
|
|
122
|
+
"$ref": "#/$defs/workflowLoopbackLimit"
|
|
123
|
+
},
|
|
124
|
+
"workflow.stalled": {
|
|
125
|
+
"$ref": "#/$defs/workflowStalled"
|
|
126
|
+
},
|
|
127
|
+
"cap.breached": {
|
|
128
|
+
"$ref": "#/$defs/capBreached"
|
|
129
|
+
},
|
|
130
|
+
"lease.acquired": {
|
|
131
|
+
"$ref": "#/$defs/leaseLifecycle"
|
|
132
|
+
},
|
|
133
|
+
"lease.renewed": {
|
|
134
|
+
"$ref": "#/$defs/leaseLifecycle"
|
|
135
|
+
},
|
|
136
|
+
"lease.lost": {
|
|
137
|
+
"$ref": "#/$defs/leaseLifecycle"
|
|
138
|
+
},
|
|
139
|
+
"lease.handed-off": {
|
|
140
|
+
"$ref": "#/$defs/leaseHandedOff"
|
|
141
|
+
},
|
|
142
|
+
"replay.diverged": {
|
|
143
|
+
"$ref": "#/$defs/replayDiverged"
|
|
144
|
+
},
|
|
145
|
+
"replay.divergedAtRefusal": {
|
|
146
|
+
"$ref": "#/$defs/replayDivergedAtRefusal"
|
|
147
|
+
},
|
|
148
|
+
"agent.reasoned": {
|
|
149
|
+
"$ref": "#/$defs/agentReasoned"
|
|
150
|
+
},
|
|
151
|
+
"agent.reasoning.delta": {
|
|
152
|
+
"$ref": "#/$defs/agentReasoningDelta"
|
|
153
|
+
},
|
|
154
|
+
"provider.usage": {
|
|
155
|
+
"$ref": "#/$defs/providerUsage"
|
|
156
|
+
},
|
|
157
|
+
"prompt.composed": {
|
|
158
|
+
"$ref": "#/$defs/promptComposed"
|
|
159
|
+
},
|
|
160
|
+
"agent.promptResolved": {
|
|
161
|
+
"$ref": "#/$defs/agentPromptResolved"
|
|
162
|
+
},
|
|
163
|
+
"model.capability.substituted": {
|
|
164
|
+
"$ref": "#/$defs/modelCapabilitySubstituted"
|
|
165
|
+
},
|
|
166
|
+
"model.capability.insufficient": {
|
|
167
|
+
"$ref": "#/$defs/modelCapabilityInsufficient"
|
|
168
|
+
},
|
|
169
|
+
"envelope.retry.attempted": {
|
|
170
|
+
"$ref": "#/$defs/envelopeRetryAttempted"
|
|
171
|
+
},
|
|
172
|
+
"envelope.retry.exhausted": {
|
|
173
|
+
"$ref": "#/$defs/envelopeRetryExhausted"
|
|
174
|
+
},
|
|
175
|
+
"envelope.refusal": {
|
|
176
|
+
"$ref": "#/$defs/envelopeRefusal"
|
|
177
|
+
},
|
|
178
|
+
"envelope.truncated": {
|
|
179
|
+
"$ref": "#/$defs/envelopeTruncated"
|
|
180
|
+
},
|
|
181
|
+
"envelope.nlToFormat.engaged": {
|
|
182
|
+
"$ref": "#/$defs/envelopeNlToFormatEngaged"
|
|
183
|
+
},
|
|
184
|
+
"envelope.recovery.applied": {
|
|
185
|
+
"$ref": "#/$defs/envelopeRecoveryApplied"
|
|
186
|
+
},
|
|
187
|
+
"agent.toolCalled": {
|
|
188
|
+
"$ref": "#/$defs/agentToolCalled"
|
|
189
|
+
},
|
|
190
|
+
"agent.toolReturned": {
|
|
191
|
+
"$ref": "#/$defs/agentToolReturned"
|
|
192
|
+
},
|
|
193
|
+
"agent.handoff": {
|
|
194
|
+
"$ref": "#/$defs/agentHandoff"
|
|
195
|
+
},
|
|
196
|
+
"agent.decided": {
|
|
197
|
+
"$ref": "#/$defs/agentDecided"
|
|
198
|
+
},
|
|
199
|
+
"agent.verified": {
|
|
200
|
+
"$ref": "#/$defs/agentVerified"
|
|
201
|
+
},
|
|
202
|
+
"runOrchestrator.decided": {
|
|
203
|
+
"$ref": "#/$defs/runOrchestratorDecided"
|
|
204
|
+
},
|
|
205
|
+
"node.dispatched": {
|
|
206
|
+
"$ref": "#/$defs/nodeDispatched"
|
|
207
|
+
},
|
|
208
|
+
"core.dispatch.fanOut": {
|
|
209
|
+
"$ref": "#/$defs/dispatchFanOut"
|
|
210
|
+
},
|
|
211
|
+
"core.dispatch.join": {
|
|
212
|
+
"$ref": "#/$defs/dispatchJoin"
|
|
213
|
+
},
|
|
214
|
+
"conversation.opened": {
|
|
215
|
+
"$ref": "#/$defs/conversationOpened"
|
|
216
|
+
},
|
|
217
|
+
"conversation.exchanged": {
|
|
218
|
+
"$ref": "#/$defs/conversationExchanged"
|
|
219
|
+
},
|
|
220
|
+
"conversation.closed": {
|
|
221
|
+
"$ref": "#/$defs/conversationClosed"
|
|
222
|
+
},
|
|
223
|
+
"memory.compacted": {
|
|
224
|
+
"$ref": "#/$defs/memoryCompacted"
|
|
225
|
+
},
|
|
226
|
+
"memory.written": {
|
|
227
|
+
"$ref": "#/$defs/memoryWritten"
|
|
228
|
+
},
|
|
229
|
+
"agent.memory.consolidated": {
|
|
230
|
+
"$ref": "#/$defs/agentMemoryConsolidated"
|
|
231
|
+
},
|
|
232
|
+
"commitment.fired": {
|
|
233
|
+
"$ref": "#/$defs/commitmentFired"
|
|
234
|
+
},
|
|
235
|
+
"agent.invocation.started": {
|
|
236
|
+
"$ref": "#/$defs/agentInvocationStarted"
|
|
237
|
+
},
|
|
238
|
+
"agent.invocation.completed": {
|
|
239
|
+
"$ref": "#/$defs/agentInvocationCompleted"
|
|
240
|
+
},
|
|
241
|
+
"workspace.updated": {
|
|
242
|
+
"$ref": "#/$defs/workspaceUpdated"
|
|
243
|
+
},
|
|
244
|
+
"core.workflowChain.event": {
|
|
245
|
+
"$ref": "#/$defs/coreWorkflowChainEvent"
|
|
246
|
+
},
|
|
247
|
+
"core.workflowChain.confidence-escalated": {
|
|
248
|
+
"$ref": "#/$defs/coreWorkflowChainConfidenceEscalated"
|
|
249
|
+
},
|
|
250
|
+
"connector.authorized": {
|
|
251
|
+
"$ref": "#/$defs/connectorAuthorized"
|
|
252
|
+
},
|
|
253
|
+
"connector.auth_expired": {
|
|
254
|
+
"$ref": "#/$defs/connectorAuthExpired"
|
|
255
|
+
},
|
|
256
|
+
"authorization.decided": {
|
|
257
|
+
"$ref": "#/$defs/authorizationDecided"
|
|
258
|
+
},
|
|
259
|
+
"eval.started": {
|
|
260
|
+
"$ref": "#/$defs/evalStarted"
|
|
261
|
+
},
|
|
262
|
+
"eval.scored": {
|
|
263
|
+
"$ref": "#/$defs/evalScored"
|
|
264
|
+
},
|
|
265
|
+
"eval.completed": {
|
|
266
|
+
"$ref": "#/$defs/evalCompleted"
|
|
267
|
+
},
|
|
268
|
+
"deployment.promoted": {
|
|
269
|
+
"$ref": "#/$defs/deploymentPromoted"
|
|
270
|
+
},
|
|
271
|
+
"deployment.rolled-back": {
|
|
272
|
+
"$ref": "#/$defs/deploymentRolledBack"
|
|
273
|
+
},
|
|
274
|
+
"deployment.canary.adjusted": {
|
|
275
|
+
"$ref": "#/$defs/deploymentCanaryAdjusted"
|
|
276
|
+
},
|
|
277
|
+
"deployment.state.changed": {
|
|
278
|
+
"$ref": "#/$defs/deploymentStateChanged"
|
|
279
|
+
},
|
|
280
|
+
"roster.run.initiated": {
|
|
281
|
+
"$ref": "#/$defs/rosterRunInitiated"
|
|
282
|
+
},
|
|
283
|
+
"tool.session.opened": {
|
|
284
|
+
"$ref": "#/$defs/toolSessionOpened"
|
|
285
|
+
},
|
|
286
|
+
"tool.session.closed": {
|
|
287
|
+
"$ref": "#/$defs/toolSessionClosed"
|
|
288
|
+
},
|
|
289
|
+
"egress.decided": {
|
|
290
|
+
"$ref": "#/$defs/egressDecided"
|
|
291
|
+
},
|
|
292
|
+
"trigger.subscription.state.changed": {
|
|
293
|
+
"$ref": "#/$defs/triggerSubscriptionStateChanged"
|
|
294
|
+
},
|
|
295
|
+
"trigger.delivery.attempted": {
|
|
296
|
+
"$ref": "#/$defs/triggerDeliveryAttempted"
|
|
297
|
+
},
|
|
298
|
+
"budget.reserved": {
|
|
299
|
+
"$ref": "#/$defs/budgetReserved"
|
|
300
|
+
},
|
|
301
|
+
"budget.consumed": {
|
|
302
|
+
"$ref": "#/$defs/budgetConsumed"
|
|
303
|
+
},
|
|
304
|
+
"budget.threshold.crossed": {
|
|
305
|
+
"$ref": "#/$defs/budgetThresholdCrossed"
|
|
306
|
+
},
|
|
307
|
+
"budget.exhausted": {
|
|
308
|
+
"$ref": "#/$defs/budgetExhausted"
|
|
309
|
+
},
|
|
310
|
+
"proposal.created": {
|
|
311
|
+
"$ref": "#/$defs/proposalCreated"
|
|
312
|
+
},
|
|
313
|
+
"proposal.activated": {
|
|
314
|
+
"$ref": "#/$defs/proposalActivated"
|
|
315
|
+
},
|
|
316
|
+
"goal.evaluated": {
|
|
317
|
+
"$ref": "#/$defs/goalEvaluated"
|
|
318
|
+
},
|
|
319
|
+
"goal.closed": {
|
|
320
|
+
"$ref": "#/$defs/goalClosed"
|
|
321
|
+
},
|
|
322
|
+
"import.applied": {
|
|
323
|
+
"$ref": "#/$defs/importApplied"
|
|
324
|
+
},
|
|
325
|
+
"voice.speech_start": {
|
|
326
|
+
"$ref": "#/$defs/voiceSpeechStart"
|
|
327
|
+
},
|
|
328
|
+
"voice.transcript": {
|
|
329
|
+
"$ref": "#/$defs/voiceTranscript"
|
|
330
|
+
},
|
|
331
|
+
"voice.endpoint_candidate": {
|
|
332
|
+
"$ref": "#/$defs/voiceEndpointCandidate"
|
|
333
|
+
},
|
|
334
|
+
"voice.turn_commit": {
|
|
335
|
+
"$ref": "#/$defs/voiceTurnCommit"
|
|
336
|
+
},
|
|
337
|
+
"voice.synthesis_chunk": {
|
|
338
|
+
"$ref": "#/$defs/voiceSynthesisChunk"
|
|
339
|
+
},
|
|
340
|
+
"voice.barge_in": {
|
|
341
|
+
"$ref": "#/$defs/voiceBargeIn"
|
|
342
|
+
},
|
|
343
|
+
"voice.cancelled": {
|
|
344
|
+
"$ref": "#/$defs/voiceCancelled"
|
|
345
|
+
},
|
|
346
|
+
"compensation.requested": {
|
|
347
|
+
"$ref": "#/$defs/compensationRequested"
|
|
348
|
+
},
|
|
349
|
+
"compensation.started": {
|
|
350
|
+
"$ref": "#/$defs/compensationStarted"
|
|
351
|
+
},
|
|
352
|
+
"compensation.completed": {
|
|
353
|
+
"$ref": "#/$defs/compensationCompleted"
|
|
354
|
+
},
|
|
355
|
+
"compensation.failed": {
|
|
356
|
+
"$ref": "#/$defs/compensationFailed"
|
|
357
|
+
},
|
|
358
|
+
"compensation.paused": {
|
|
359
|
+
"$ref": "#/$defs/compensationPaused"
|
|
360
|
+
},
|
|
361
|
+
"compensation.manual_intervention_required": {
|
|
362
|
+
"$ref": "#/$defs/compensationManualInterventionRequired"
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
"voiceSpeechStart": {
|
|
367
|
+
"description": "RFC 0106 \u00a7D. Emitted when inbound user speech onset is detected in a live voice session. Content-free (a timestamp only). MUST NOT be emitted unless `aiProviders.realtimeVoice.transcription: \"streaming\"` is advertised.",
|
|
368
|
+
"type": "object",
|
|
369
|
+
"additionalProperties": false,
|
|
370
|
+
"required": [
|
|
371
|
+
"atMs"
|
|
372
|
+
],
|
|
373
|
+
"properties": {
|
|
374
|
+
"atMs": {
|
|
375
|
+
"type": "integer",
|
|
376
|
+
"minimum": 0,
|
|
377
|
+
"description": "Session-relative onset timestamp (ms)."
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
},
|
|
381
|
+
"voiceTranscript": {
|
|
382
|
+
"description": "RFC 0106 \u00a7B/\u00a7D. A settled or provisional transcript part for the current turn, emitted on the durable event log as the single canonical record (the `ctx.callTranscriber` Promise resolves separately at `turn_commit`). `text` is the recognized speech \u2014 UNTRUSTED input (anyone in acoustic range is an unauthenticated writer): it MUST carry `contentTrust: \"untrusted\"` and MUST NOT be promoted to system/developer authority (SECURITY invariant `voice-transcript-untrusted`). A part with `isFinal: false` is provisional and MUST NOT be persisted to durable memory / the replay log / RAG or drive a side-effecting tool call before it finalizes (`voice-interim-not-durable`).",
|
|
383
|
+
"type": "object",
|
|
384
|
+
"additionalProperties": false,
|
|
385
|
+
"required": [
|
|
386
|
+
"text",
|
|
387
|
+
"isFinal",
|
|
388
|
+
"atMs",
|
|
389
|
+
"contentTrust"
|
|
390
|
+
],
|
|
391
|
+
"properties": {
|
|
392
|
+
"text": {
|
|
393
|
+
"type": "string",
|
|
394
|
+
"description": "The current hypothesis for this segment (editable tail when `isFinal:false`)."
|
|
395
|
+
},
|
|
396
|
+
"isFinal": {
|
|
397
|
+
"type": "boolean",
|
|
398
|
+
"description": "true \u21d2 this segment's text is settled and will not change."
|
|
399
|
+
},
|
|
400
|
+
"committedPrefix": {
|
|
401
|
+
"type": "string",
|
|
402
|
+
"description": "The leading portion the host guarantees will not change (Deepgram/Web-Speech model)."
|
|
403
|
+
},
|
|
404
|
+
"stability": {
|
|
405
|
+
"type": "number",
|
|
406
|
+
"minimum": 0,
|
|
407
|
+
"maximum": 1,
|
|
408
|
+
"description": "Graded tail confidence (Google `stability`); omit/1.0 for immutable ASR."
|
|
409
|
+
},
|
|
410
|
+
"formatted": {
|
|
411
|
+
"type": "boolean",
|
|
412
|
+
"description": "Punctuation/casing/ITN applied; absent \u21d2 raw."
|
|
413
|
+
},
|
|
414
|
+
"atMs": {
|
|
415
|
+
"type": "integer",
|
|
416
|
+
"minimum": 0
|
|
417
|
+
},
|
|
418
|
+
"contentTrust": {
|
|
419
|
+
"const": "untrusted",
|
|
420
|
+
"description": "MUST be `\"untrusted\"` \u2014 live transcript is untrusted ingress (`voice-transcript-untrusted`); never promote to higher authority."
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
"voiceEndpointCandidate": {
|
|
425
|
+
"description": "RFC 0106 \u00a7B/\u00a7D. A silence boundary / likely end-of-turn appeared (only when `turnDetection: \"semantic\"`), DISTINCT from `voice.turn_commit` (Deepgram `UtteranceEnd` vs `speech_final`). Content-free.",
|
|
426
|
+
"type": "object",
|
|
427
|
+
"additionalProperties": false,
|
|
428
|
+
"required": [
|
|
429
|
+
"atMs"
|
|
430
|
+
],
|
|
431
|
+
"properties": {
|
|
432
|
+
"atMs": {
|
|
433
|
+
"type": "integer",
|
|
434
|
+
"minimum": 0
|
|
435
|
+
},
|
|
436
|
+
"confidence": {
|
|
437
|
+
"type": "number",
|
|
438
|
+
"minimum": 0,
|
|
439
|
+
"maximum": 1,
|
|
440
|
+
"description": "Optional end-of-turn confidence."
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
},
|
|
444
|
+
"voiceTurnCommit": {
|
|
445
|
+
"description": "RFC 0106 \u00a7B/\u00a7D. The user yielded the floor (turn boundary). This is where the `ctx.callTranscriber` Promise resolves. `finalText` is the settled transcript and is UNTRUSTED (it inherits the `voice.transcript` boundary).",
|
|
446
|
+
"type": "object",
|
|
447
|
+
"additionalProperties": false,
|
|
448
|
+
"required": [
|
|
449
|
+
"atMs",
|
|
450
|
+
"finalText"
|
|
451
|
+
],
|
|
452
|
+
"properties": {
|
|
453
|
+
"atMs": {
|
|
454
|
+
"type": "integer",
|
|
455
|
+
"minimum": 0
|
|
456
|
+
},
|
|
457
|
+
"finalText": {
|
|
458
|
+
"type": "string",
|
|
459
|
+
"description": "The settled transcript for the committed turn (untrusted input)."
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
},
|
|
463
|
+
"voiceSynthesisChunk": {
|
|
464
|
+
"description": "RFC 0106 \u00a7C. Announces a clause-boundary streaming-synthesis chunk. METADATA ONLY \u2014 the audio bytes are referenced by a session-scoped `streamRef`/`url`, NOT inlined on the event log past the host's inline cap (RFC 0055 256 KiB precedent; spill to a tenant-scoped `url`), so replay/`:fork` stays bounded over long sessions. MUST NOT be emitted unless `aiProviders.realtimeVoice.synthesis: \"streaming\"` is advertised.",
|
|
465
|
+
"type": "object",
|
|
466
|
+
"additionalProperties": false,
|
|
467
|
+
"required": [
|
|
468
|
+
"seq",
|
|
469
|
+
"mimeType"
|
|
470
|
+
],
|
|
471
|
+
"properties": {
|
|
472
|
+
"seq": {
|
|
473
|
+
"type": "integer",
|
|
474
|
+
"minimum": 0,
|
|
475
|
+
"description": "Monotonic chunk sequence."
|
|
476
|
+
},
|
|
477
|
+
"mimeType": {
|
|
478
|
+
"type": "string",
|
|
479
|
+
"minLength": 1,
|
|
480
|
+
"description": "Audio chunk type (e.g. `audio/mpeg`)."
|
|
481
|
+
},
|
|
482
|
+
"durationMs": {
|
|
483
|
+
"type": "integer",
|
|
484
|
+
"minimum": 0,
|
|
485
|
+
"description": "Optional chunk duration."
|
|
486
|
+
},
|
|
487
|
+
"url": {
|
|
488
|
+
"type": "string",
|
|
489
|
+
"description": "Tenant-scoped, SSRF-guarded (RFC 0076) reference to the chunk bytes."
|
|
490
|
+
},
|
|
491
|
+
"streamRef": {
|
|
492
|
+
"type": "string",
|
|
493
|
+
"description": "Session-scoped live-stream handle for the chunk bytes."
|
|
494
|
+
},
|
|
495
|
+
"base64": {
|
|
496
|
+
"type": "string",
|
|
497
|
+
"description": "OPTIONAL inline bytes, permitted ONLY while under the host's inline cap; past the cap the host MUST use `url`/`streamRef`."
|
|
498
|
+
},
|
|
499
|
+
"final": {
|
|
500
|
+
"type": "boolean",
|
|
501
|
+
"description": "true on the terminal chunk."
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
},
|
|
505
|
+
"voiceBargeIn": {
|
|
506
|
+
"description": "RFC 0106 \u00a7D. User speech overlapped active assistant playback (probable cut-in). A host advertising `realtimeVoice.bargeIn: \"supported\"` MUST emit this on detected overlap. Content-free. Distinct from `voice.cancelled` (a backchannel \"uh-huh\" MAY produce `barge_in` with no `cancelled`).",
|
|
507
|
+
"type": "object",
|
|
508
|
+
"additionalProperties": false,
|
|
509
|
+
"required": [
|
|
510
|
+
"atMs"
|
|
511
|
+
],
|
|
512
|
+
"properties": {
|
|
513
|
+
"atMs": {
|
|
514
|
+
"type": "integer",
|
|
515
|
+
"minimum": 0
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
},
|
|
519
|
+
"voiceCancelled": {
|
|
520
|
+
"description": "RFC 0106 \u00a7D. Downstream LLM/TTS work was cancelled (barge-in or explicit). A cancellation MUST NOT emit partial tool outputs or partial un-guardrailed model output and MUST roll back or fully complete an in-flight side effect (SECURITY invariant `voice-bargein-no-partial-leak`). Content-free.",
|
|
521
|
+
"type": "object",
|
|
522
|
+
"additionalProperties": false,
|
|
523
|
+
"required": [
|
|
524
|
+
"atMs"
|
|
525
|
+
],
|
|
526
|
+
"properties": {
|
|
527
|
+
"atMs": {
|
|
528
|
+
"type": "integer",
|
|
529
|
+
"minimum": 0
|
|
530
|
+
},
|
|
531
|
+
"reason": {
|
|
532
|
+
"type": "string",
|
|
533
|
+
"enum": [
|
|
534
|
+
"barge-in",
|
|
535
|
+
"explicit"
|
|
536
|
+
],
|
|
537
|
+
"description": "Why downstream work was cancelled."
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
"authorizationDecided": {
|
|
542
|
+
"description": "RFC 0049 \u2014 emitted on a role-based authorization decision (allow or deny). Redaction-safe: `principal` is an opaque RFC 0048 id; `reason` carries no credential material. Every deny SHOULD be emitted and SHOULD feed the audit log (RFC 0009/0010). MUST NOT be emitted unless `capabilities.authorization.supported: true`.",
|
|
543
|
+
"type": "object",
|
|
544
|
+
"additionalProperties": false,
|
|
545
|
+
"required": [
|
|
546
|
+
"principal",
|
|
547
|
+
"action",
|
|
548
|
+
"resource",
|
|
549
|
+
"allowed"
|
|
550
|
+
],
|
|
551
|
+
"properties": {
|
|
552
|
+
"principal": {
|
|
553
|
+
"type": "string",
|
|
554
|
+
"minLength": 1,
|
|
555
|
+
"description": "Opaque RFC 0048 principal id \u2014 never PII."
|
|
556
|
+
},
|
|
557
|
+
"action": {
|
|
558
|
+
"type": "string",
|
|
559
|
+
"minLength": 1,
|
|
560
|
+
"description": "The attempted action, e.g. `runs:cancel`."
|
|
561
|
+
},
|
|
562
|
+
"resource": {
|
|
563
|
+
"type": "string",
|
|
564
|
+
"minLength": 1,
|
|
565
|
+
"description": "The target, e.g. a runId or workflowId."
|
|
566
|
+
},
|
|
567
|
+
"allowed": {
|
|
568
|
+
"type": "boolean"
|
|
569
|
+
},
|
|
570
|
+
"reason": {
|
|
571
|
+
"type": "string",
|
|
572
|
+
"description": "Human-readable, redaction-safe \u2014 no credential material."
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
},
|
|
576
|
+
"proposalCreated": {
|
|
577
|
+
"description": "RFC 0096 \u00a7D. Emitted when the host synthesizes a reviewable-learning draft. Content-free: ids / kind / content-free references only \u2014 NEVER the artifact body or the rationale text (those live behind the authed read). Redaction-safe (SECURITY invariant `proposal-inert-until-applied` covers the behavior; SR-1 covers the payload). MUST NOT be emitted unless `capabilities.agents.proposals` is advertised.",
|
|
578
|
+
"type": "object",
|
|
579
|
+
"additionalProperties": false,
|
|
580
|
+
"required": [
|
|
581
|
+
"proposalId",
|
|
582
|
+
"kind"
|
|
583
|
+
],
|
|
584
|
+
"properties": {
|
|
585
|
+
"proposalId": {
|
|
586
|
+
"type": "string",
|
|
587
|
+
"minLength": 1,
|
|
588
|
+
"description": "The created proposal's stable id."
|
|
589
|
+
},
|
|
590
|
+
"kind": {
|
|
591
|
+
"type": "string",
|
|
592
|
+
"enum": [
|
|
593
|
+
"agent-pack",
|
|
594
|
+
"workflow-chain-pack",
|
|
595
|
+
"prompt-template",
|
|
596
|
+
"automation"
|
|
597
|
+
],
|
|
598
|
+
"description": "The proposed artifact kind."
|
|
599
|
+
},
|
|
600
|
+
"sourceRunIds": {
|
|
601
|
+
"type": "array",
|
|
602
|
+
"items": {
|
|
603
|
+
"type": "string"
|
|
604
|
+
},
|
|
605
|
+
"description": "Runs whose traces produced the draft (RFC 0040 causation-compatible). Ids only \u2014 no trace content."
|
|
606
|
+
},
|
|
607
|
+
"duplicateOf": {
|
|
608
|
+
"type": [
|
|
609
|
+
"string",
|
|
610
|
+
"null"
|
|
611
|
+
],
|
|
612
|
+
"description": "Existing artifact ref the proposal restates/overlaps, when duplication detection is on; else null."
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
},
|
|
616
|
+
"proposalActivated": {
|
|
617
|
+
"description": "RFC 0096 \u00a7D. Emitted on a successful `apply`. Content-free: ids / content-free references only \u2014 NEVER the installed artifact body. MUST NOT be emitted unless `capabilities.agents.proposals` is advertised.",
|
|
618
|
+
"type": "object",
|
|
619
|
+
"additionalProperties": false,
|
|
620
|
+
"required": [
|
|
621
|
+
"proposalId",
|
|
622
|
+
"kind",
|
|
623
|
+
"installedArtifactRef"
|
|
624
|
+
],
|
|
625
|
+
"properties": {
|
|
626
|
+
"proposalId": {
|
|
627
|
+
"type": "string",
|
|
628
|
+
"minLength": 1
|
|
629
|
+
},
|
|
630
|
+
"kind": {
|
|
631
|
+
"type": "string",
|
|
632
|
+
"enum": [
|
|
633
|
+
"agent-pack",
|
|
634
|
+
"workflow-chain-pack",
|
|
635
|
+
"prompt-template",
|
|
636
|
+
"automation"
|
|
637
|
+
]
|
|
638
|
+
},
|
|
639
|
+
"approvalId": {
|
|
640
|
+
"type": [
|
|
641
|
+
"string",
|
|
642
|
+
"null"
|
|
643
|
+
],
|
|
644
|
+
"description": "RFC 0051 approval id when activation routed through an approval gate; null for direct-rbac."
|
|
645
|
+
},
|
|
646
|
+
"installedArtifactRef": {
|
|
647
|
+
"type": "string",
|
|
648
|
+
"minLength": 1,
|
|
649
|
+
"description": "Ref of the artifact installed on apply (RFC 0043)."
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
},
|
|
653
|
+
"goalEvaluated": {
|
|
654
|
+
"description": "RFC 0097 \u00a7D. Emitted after each judge check on a standing goal. Content-free: NO objective text. The verdict (`satisfied`/`confidence`) is non-deterministic judge output \u2014 it is RECORDED here and MUST NOT be recomputed on replay/fork (`replay.md`). MUST NOT be emitted unless `capabilities.agents.goals` is advertised.",
|
|
655
|
+
"type": "object",
|
|
656
|
+
"additionalProperties": false,
|
|
657
|
+
"required": [
|
|
658
|
+
"goalId",
|
|
659
|
+
"satisfied",
|
|
660
|
+
"runId",
|
|
661
|
+
"iterations"
|
|
662
|
+
],
|
|
663
|
+
"properties": {
|
|
664
|
+
"goalId": {
|
|
665
|
+
"type": "string",
|
|
666
|
+
"minLength": 1
|
|
667
|
+
},
|
|
668
|
+
"satisfied": {
|
|
669
|
+
"type": "boolean",
|
|
670
|
+
"description": "The judge's verdict for this check."
|
|
671
|
+
},
|
|
672
|
+
"confidence": {
|
|
673
|
+
"type": "number",
|
|
674
|
+
"minimum": 0,
|
|
675
|
+
"maximum": 1,
|
|
676
|
+
"description": "Judge confidence in [0,1]."
|
|
677
|
+
},
|
|
678
|
+
"runId": {
|
|
679
|
+
"type": "string",
|
|
680
|
+
"minLength": 1,
|
|
681
|
+
"description": "The run this verdict evaluated (RFC 0040 causation-compatible)."
|
|
682
|
+
},
|
|
683
|
+
"iterations": {
|
|
684
|
+
"type": "integer",
|
|
685
|
+
"minimum": 0,
|
|
686
|
+
"description": "Contributing iterations so far."
|
|
687
|
+
}
|
|
688
|
+
}
|
|
689
|
+
},
|
|
690
|
+
"goalClosed": {
|
|
691
|
+
"description": "RFC 0097 \u00a7D. Emitted when a standing goal stops continuation. Content-free. MUST NOT be emitted unless `capabilities.agents.goals` is advertised.",
|
|
692
|
+
"type": "object",
|
|
693
|
+
"additionalProperties": false,
|
|
694
|
+
"required": [
|
|
695
|
+
"goalId",
|
|
696
|
+
"finalState"
|
|
697
|
+
],
|
|
698
|
+
"properties": {
|
|
699
|
+
"goalId": {
|
|
700
|
+
"type": "string",
|
|
701
|
+
"minLength": 1
|
|
702
|
+
},
|
|
703
|
+
"finalState": {
|
|
704
|
+
"type": "string",
|
|
705
|
+
"enum": [
|
|
706
|
+
"satisfied",
|
|
707
|
+
"escalated",
|
|
708
|
+
"abandoned",
|
|
709
|
+
"bound-exceeded"
|
|
710
|
+
],
|
|
711
|
+
"description": "Terminal state the goal closed in."
|
|
712
|
+
}
|
|
713
|
+
}
|
|
714
|
+
},
|
|
715
|
+
"importApplied": {
|
|
716
|
+
"description": "RFC 0098 \u00a7D. Emitted when an estate import is applied. Content-free: counts + ref-only \u2014 NO item payloads, NO secret values (SECURITY invariant `export-bundle-no-credential-material`). MUST NOT be emitted unless `capabilities.portability` is advertised.",
|
|
717
|
+
"type": "object",
|
|
718
|
+
"additionalProperties": false,
|
|
719
|
+
"required": [
|
|
720
|
+
"bundleOrigin",
|
|
721
|
+
"counts"
|
|
722
|
+
],
|
|
723
|
+
"properties": {
|
|
724
|
+
"bundleOrigin": {
|
|
725
|
+
"type": "string",
|
|
726
|
+
"minLength": 1,
|
|
727
|
+
"description": "The bundle's `source.origin` \u2014 informational only."
|
|
728
|
+
},
|
|
729
|
+
"counts": {
|
|
730
|
+
"type": "object",
|
|
731
|
+
"additionalProperties": false,
|
|
732
|
+
"description": "Per-action item tallies.",
|
|
733
|
+
"properties": {
|
|
734
|
+
"created": {
|
|
735
|
+
"type": "integer",
|
|
736
|
+
"minimum": 0
|
|
737
|
+
},
|
|
738
|
+
"updated": {
|
|
739
|
+
"type": "integer",
|
|
740
|
+
"minimum": 0
|
|
741
|
+
},
|
|
742
|
+
"skipped": {
|
|
743
|
+
"type": "integer",
|
|
744
|
+
"minimum": 0
|
|
745
|
+
},
|
|
746
|
+
"failed": {
|
|
747
|
+
"type": "integer",
|
|
748
|
+
"minimum": 0
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
},
|
|
752
|
+
"secretsToRebind": {
|
|
753
|
+
"type": "array",
|
|
754
|
+
"items": {
|
|
755
|
+
"type": "string"
|
|
756
|
+
},
|
|
757
|
+
"description": "Provider/ref ids whose secrets must be re-bound at the destination. Refs only \u2014 never secret values."
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
},
|
|
761
|
+
"connectorAuthorized": {
|
|
762
|
+
"description": "RFC 0047 \u2014 emitted when the host acquires (or re-authorizes) a third-party OAuth token on a user's behalf via the `host.oauth` flow. Redaction-safe: carries the credential REFERENCE (RFC 0046), never token material. MUST NOT be emitted unless `capabilities.oauth.supported: true`.",
|
|
763
|
+
"type": "object",
|
|
764
|
+
"additionalProperties": false,
|
|
765
|
+
"required": [
|
|
766
|
+
"provider",
|
|
767
|
+
"credentialRef"
|
|
768
|
+
],
|
|
769
|
+
"properties": {
|
|
770
|
+
"provider": {
|
|
771
|
+
"type": "string",
|
|
772
|
+
"minLength": 1,
|
|
773
|
+
"description": "Provider id, matching an advertised `capabilities.oauth.providers[].id` (e.g. `slack`, `google`)."
|
|
774
|
+
},
|
|
775
|
+
"credentialRef": {
|
|
776
|
+
"type": "string",
|
|
777
|
+
"minLength": 1,
|
|
778
|
+
"description": "Opaque RFC 0046 credential reference where the acquired token is stored. NEVER the token itself."
|
|
779
|
+
},
|
|
780
|
+
"scopes": {
|
|
781
|
+
"type": "array",
|
|
782
|
+
"items": {
|
|
783
|
+
"type": "string"
|
|
784
|
+
},
|
|
785
|
+
"description": "Scopes granted for the acquired token."
|
|
786
|
+
}
|
|
787
|
+
}
|
|
788
|
+
},
|
|
789
|
+
"connectorAuthExpired": {
|
|
790
|
+
"description": "RFC 0047 \u2014 emitted when a stored OAuth token's refresh fails terminally (revoked/expired refresh token). Redaction-safe: no token material. MUST NOT be emitted unless `capabilities.oauth.supported: true`.",
|
|
791
|
+
"type": "object",
|
|
792
|
+
"additionalProperties": false,
|
|
793
|
+
"required": [
|
|
794
|
+
"provider",
|
|
795
|
+
"credentialRef"
|
|
796
|
+
],
|
|
797
|
+
"properties": {
|
|
798
|
+
"provider": {
|
|
799
|
+
"type": "string",
|
|
800
|
+
"minLength": 1,
|
|
801
|
+
"description": "Provider id, matching an advertised `capabilities.oauth.providers[].id`."
|
|
802
|
+
},
|
|
803
|
+
"credentialRef": {
|
|
804
|
+
"type": "string",
|
|
805
|
+
"minLength": 1,
|
|
806
|
+
"description": "Opaque RFC 0046 credential reference for the expired token."
|
|
807
|
+
},
|
|
808
|
+
"reason": {
|
|
809
|
+
"type": "string",
|
|
810
|
+
"description": "Redaction-safe human-readable reason (e.g. `refresh_token_revoked`)."
|
|
811
|
+
}
|
|
812
|
+
}
|
|
813
|
+
},
|
|
814
|
+
"coreWorkflowChainEvent": {
|
|
815
|
+
"description": "RFC 0037 \u2014 emitted on every planner\u2192worker handoff state-machine transition. Required when `capabilities.multiAgent.executionModel.supported: true`; MUST NOT be emitted otherwise. RFC 0040 \u00a7A extends with optional `causationHostId` (when `crossHostCausation.supported: true`): present + non-empty when the `causationId` points at an event on a different host; absent when the chained-event is on the same host (existing semantics).",
|
|
816
|
+
"type": "object",
|
|
817
|
+
"additionalProperties": false,
|
|
818
|
+
"required": [
|
|
819
|
+
"phase",
|
|
820
|
+
"workerId",
|
|
821
|
+
"parentRunId"
|
|
822
|
+
],
|
|
823
|
+
"properties": {
|
|
824
|
+
"phase": {
|
|
825
|
+
"type": "string",
|
|
826
|
+
"enum": [
|
|
827
|
+
"dispatch.began",
|
|
828
|
+
"dispatch.succeeded",
|
|
829
|
+
"dispatch.failed",
|
|
830
|
+
"child.completed",
|
|
831
|
+
"child.failed",
|
|
832
|
+
"child.cancelled",
|
|
833
|
+
"output.harvested"
|
|
834
|
+
],
|
|
835
|
+
"description": "Which handoff-state-machine transition this event records. See spec/v1/multi-agent-execution.md \u00a7'Handoff state machine'."
|
|
836
|
+
},
|
|
837
|
+
"workerId": {
|
|
838
|
+
"type": "string",
|
|
839
|
+
"minLength": 1,
|
|
840
|
+
"description": "The dispatched worker's workflowId \u2014 matches the entry in the supervisor's OrchestratorDecision.nextWorkerIds[]."
|
|
841
|
+
},
|
|
842
|
+
"parentRunId": {
|
|
843
|
+
"type": "string",
|
|
844
|
+
"minLength": 1,
|
|
845
|
+
"description": "The orchestrator-driven parent run's runId."
|
|
846
|
+
},
|
|
847
|
+
"childRunId": {
|
|
848
|
+
"type": "string",
|
|
849
|
+
"minLength": 1,
|
|
850
|
+
"description": "The dispatched child run's runId. REQUIRED on phases `dispatch.succeeded` and beyond; absent on `dispatch.began` and `dispatch.failed`."
|
|
851
|
+
},
|
|
852
|
+
"harvestedKeys": {
|
|
853
|
+
"type": "array",
|
|
854
|
+
"items": {
|
|
855
|
+
"type": "string"
|
|
856
|
+
},
|
|
857
|
+
"description": "On phase `output.harvested`: which parent-variable keys were populated by the dispatch config's outputMapping per RFC 0022 \u00a7A. SHOULD be present; conformance asserts presence when outputMapping is non-empty."
|
|
858
|
+
},
|
|
859
|
+
"attestation": {
|
|
860
|
+
"type": "object",
|
|
861
|
+
"description": "RFC 0063 (when `capabilities.agents.subRunAttestation: true` AND the `core.subWorkflow` node sets `outputAttestation.checksum: true`). A content checksum over the child's harvested output object, computed BEFORE `outputMapping` is applied so the parent (or a downstream node) can verify integrity \u2014 host-independent because the recipe is RFC 8785 JCS canonicalization + SHA-256 (the `replay.md` recipe, RFC 0041), enabling verification of a child that ran on a different host (RFC 0040). Advisory: the host does NOT itself reject on checksum mismatch; that is parent policy.",
|
|
862
|
+
"additionalProperties": false,
|
|
863
|
+
"required": [
|
|
864
|
+
"checksum",
|
|
865
|
+
"algorithm"
|
|
866
|
+
],
|
|
867
|
+
"properties": {
|
|
868
|
+
"checksum": {
|
|
869
|
+
"type": "string",
|
|
870
|
+
"minLength": 1,
|
|
871
|
+
"description": "Lowercase hex digest of the canonicalized harvested-output object. Content-free: a hash, never the outputs themselves."
|
|
872
|
+
},
|
|
873
|
+
"algorithm": {
|
|
874
|
+
"type": "string",
|
|
875
|
+
"enum": [
|
|
876
|
+
"sha256"
|
|
877
|
+
],
|
|
878
|
+
"description": "Hash algorithm. `sha256` is the only v1 value; the enum reserves the axis for a future agility migration without a wire-shape break."
|
|
879
|
+
}
|
|
880
|
+
}
|
|
881
|
+
},
|
|
882
|
+
"error": {
|
|
883
|
+
"$ref": "#/$defs/_errorObject",
|
|
884
|
+
"description": "On phases `dispatch.failed` / `child.failed` / `child.cancelled`: the canonical error envelope."
|
|
885
|
+
},
|
|
886
|
+
"causationHostId": {
|
|
887
|
+
"type": "string",
|
|
888
|
+
"minLength": 1,
|
|
889
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` (top-level on RunEventDoc) points at an event on a DIFFERENT host; absent when the chained-event is on the SAME host (existing semantics). Value MUST equal the originating host's `capabilities.multiAgent.executionModel.crossHostCausation.hostId` advertisement. Hosts that don't advertise crossHostCausation MUST NOT emit this field."
|
|
890
|
+
}
|
|
891
|
+
}
|
|
892
|
+
},
|
|
893
|
+
"coreWorkflowChainConfidenceEscalated": {
|
|
894
|
+
"description": "RFC 0039 \u00a7A \u2014 emitted when a supervisor's OrchestratorDecision carries `confidence` below the active confidence floor (spec floor 0.5 OR operator-stricter `capabilities.multiAgent.executionModel.confidenceEscalationFloor`). Recorded BEFORE the host fires the matching clarify-or-escalate interrupt so the run event log carries the decision point even if the user later confirms the original decision. MUST NOT be emitted unless `capabilities.multiAgent.executionModel.version >= 2`.",
|
|
895
|
+
"type": "object",
|
|
896
|
+
"additionalProperties": false,
|
|
897
|
+
"required": [
|
|
898
|
+
"confidence",
|
|
899
|
+
"floor",
|
|
900
|
+
"escalationKind",
|
|
901
|
+
"parentRunId"
|
|
902
|
+
],
|
|
903
|
+
"properties": {
|
|
904
|
+
"confidence": {
|
|
905
|
+
"type": "number",
|
|
906
|
+
"minimum": 0,
|
|
907
|
+
"maximum": 1,
|
|
908
|
+
"description": "The supervisor's stated confidence on the escalated decision, copied verbatim from `OrchestratorDecision.confidence`."
|
|
909
|
+
},
|
|
910
|
+
"floor": {
|
|
911
|
+
"type": "number",
|
|
912
|
+
"minimum": 0.5,
|
|
913
|
+
"maximum": 1,
|
|
914
|
+
"description": "The floor that triggered escalation \u2014 either the spec floor (0.5) when the host doesn't advertise a stricter `confidenceEscalationFloor`, or the host-advertised stricter value."
|
|
915
|
+
},
|
|
916
|
+
"escalationKind": {
|
|
917
|
+
"type": "string",
|
|
918
|
+
"enum": [
|
|
919
|
+
"clarify",
|
|
920
|
+
"escalate"
|
|
921
|
+
],
|
|
922
|
+
"description": "Which interrupt-kind the host fired in response. `clarify` is preferred per RFC 0039 \u00a7A; `escalate` is permitted when the host doesn't expose a clarification UI."
|
|
923
|
+
},
|
|
924
|
+
"workerId": {
|
|
925
|
+
"type": "string",
|
|
926
|
+
"minLength": 1,
|
|
927
|
+
"description": "The decision's intended next-worker workflowId (when the escalated decision's kind is `next-worker`). OMITTED for `kind: 'terminate'` escalations \u2014 terminate decisions have no worker to name, so absent-field is the correct signal rather than empty-string."
|
|
928
|
+
},
|
|
929
|
+
"parentRunId": {
|
|
930
|
+
"type": "string",
|
|
931
|
+
"minLength": 1,
|
|
932
|
+
"description": "The orchestrator-driven parent run's runId."
|
|
933
|
+
},
|
|
934
|
+
"originalDecision": {
|
|
935
|
+
"$ref": "orchestrator-decision.schema.json",
|
|
936
|
+
"description": "The OrchestratorDecision that triggered escalation, captured verbatim. The host's existing event-payload redaction harness (the same one enforcing SECURITY invariant `secret-leakage-eventlog-payload` per `conformance/src/scenarios/redaction.test.ts`) applies uniformly across all RunEventType payloads including this one \u2014 no per-event-type opt-in is required. The protocol-tier MUST-NOT for raw key material in persisted payloads is the canonical contract; this field inherits that protection."
|
|
937
|
+
},
|
|
938
|
+
"causationHostId": {
|
|
939
|
+
"type": "string",
|
|
940
|
+
"minLength": 1,
|
|
941
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host (existing semantics). Value MUST equal the originating host's `crossHostCausation.hostId` advertisement."
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
},
|
|
945
|
+
"_errorObject": {
|
|
946
|
+
"description": "Reusable error shape used by run.failed / node.failed / workflow.stalled / etc.",
|
|
947
|
+
"type": "object",
|
|
948
|
+
"required": [
|
|
949
|
+
"code",
|
|
950
|
+
"message"
|
|
951
|
+
],
|
|
952
|
+
"properties": {
|
|
953
|
+
"code": {
|
|
954
|
+
"type": "string",
|
|
955
|
+
"minLength": 1
|
|
956
|
+
},
|
|
957
|
+
"message": {
|
|
958
|
+
"type": "string",
|
|
959
|
+
"minLength": 1
|
|
960
|
+
},
|
|
961
|
+
"details": {
|
|
962
|
+
"type": "object"
|
|
963
|
+
},
|
|
964
|
+
"retryable": {
|
|
965
|
+
"type": "boolean"
|
|
966
|
+
}
|
|
967
|
+
},
|
|
968
|
+
"additionalProperties": true
|
|
969
|
+
},
|
|
970
|
+
"_inputsObject": {
|
|
971
|
+
"type": "object",
|
|
972
|
+
"description": "Caller-supplied workflow inputs (from POST /v1/runs body)."
|
|
973
|
+
},
|
|
974
|
+
"_outputsObject": {
|
|
975
|
+
"type": "object",
|
|
976
|
+
"description": "Node output map. Keys are output port names; values are JSON."
|
|
977
|
+
},
|
|
978
|
+
"runStarted": {
|
|
979
|
+
"type": "object",
|
|
980
|
+
"description": "Emitted once per run when execution begins.",
|
|
981
|
+
"required": [
|
|
982
|
+
"workflowId"
|
|
983
|
+
],
|
|
984
|
+
"properties": {
|
|
985
|
+
"workflowId": {
|
|
986
|
+
"type": "string",
|
|
987
|
+
"minLength": 1
|
|
988
|
+
},
|
|
989
|
+
"inputs": {
|
|
990
|
+
"$ref": "#/$defs/_inputsObject"
|
|
991
|
+
},
|
|
992
|
+
"transport": {
|
|
993
|
+
"type": "string",
|
|
994
|
+
"enum": [
|
|
995
|
+
"rest",
|
|
996
|
+
"mcp",
|
|
997
|
+
"a2a",
|
|
998
|
+
"ui"
|
|
999
|
+
]
|
|
1000
|
+
},
|
|
1001
|
+
"engineVersion": {
|
|
1002
|
+
"type": "string"
|
|
1003
|
+
},
|
|
1004
|
+
"owner": {
|
|
1005
|
+
"type": "object",
|
|
1006
|
+
"description": "RFC 0048. Redaction-safe echo of the run's owning identity triple (matches `RunSnapshot.owner`). Optional; single-tenant hosts omit it.",
|
|
1007
|
+
"required": [
|
|
1008
|
+
"tenant"
|
|
1009
|
+
],
|
|
1010
|
+
"properties": {
|
|
1011
|
+
"tenant": {
|
|
1012
|
+
"type": "string",
|
|
1013
|
+
"minLength": 1
|
|
1014
|
+
},
|
|
1015
|
+
"workspace": {
|
|
1016
|
+
"type": "string",
|
|
1017
|
+
"minLength": 1
|
|
1018
|
+
},
|
|
1019
|
+
"principal": {
|
|
1020
|
+
"type": "string",
|
|
1021
|
+
"minLength": 1
|
|
1022
|
+
},
|
|
1023
|
+
"principalKind": {
|
|
1024
|
+
"type": "string",
|
|
1025
|
+
"enum": ["user", "agent", "anonymous"],
|
|
1026
|
+
"description": "RFC 0132 (declared here by RFC 0165): the echo carries the same optional kind as `RunSnapshot.owner.principalKind`, so a host that echoes its own snapshot owner emits a valid payload."
|
|
1027
|
+
},
|
|
1028
|
+
"subject": {
|
|
1029
|
+
"$ref": "subject.schema.json",
|
|
1030
|
+
"description": "RFC 0165 \u00a7B. The run's Subject record, echoed verbatim from `RunSnapshot.owner.subject` when present."
|
|
1031
|
+
}
|
|
1032
|
+
},
|
|
1033
|
+
"additionalProperties": false
|
|
1034
|
+
},
|
|
1035
|
+
"tags": {
|
|
1036
|
+
"type": "array",
|
|
1037
|
+
"items": {
|
|
1038
|
+
"type": "string"
|
|
1039
|
+
}
|
|
1040
|
+
},
|
|
1041
|
+
"metadata": {
|
|
1042
|
+
"type": "object"
|
|
1043
|
+
}
|
|
1044
|
+
},
|
|
1045
|
+
"additionalProperties": true
|
|
1046
|
+
},
|
|
1047
|
+
"runCompleted": {
|
|
1048
|
+
"type": "object",
|
|
1049
|
+
"description": "Emitted once when the run reaches a successful terminal state. Closes the SSE stream.",
|
|
1050
|
+
"properties": {
|
|
1051
|
+
"outputs": {
|
|
1052
|
+
"$ref": "#/$defs/_outputsObject"
|
|
1053
|
+
},
|
|
1054
|
+
"durationMs": {
|
|
1055
|
+
"type": "integer",
|
|
1056
|
+
"minimum": 0
|
|
1057
|
+
}
|
|
1058
|
+
},
|
|
1059
|
+
"additionalProperties": true
|
|
1060
|
+
},
|
|
1061
|
+
"runFailed": {
|
|
1062
|
+
"type": "object",
|
|
1063
|
+
"description": "Emitted once when the run reaches a failed terminal state.",
|
|
1064
|
+
"required": [
|
|
1065
|
+
"error"
|
|
1066
|
+
],
|
|
1067
|
+
"properties": {
|
|
1068
|
+
"error": {
|
|
1069
|
+
"$ref": "#/$defs/_errorObject"
|
|
1070
|
+
},
|
|
1071
|
+
"failedNodeId": {
|
|
1072
|
+
"type": "string"
|
|
1073
|
+
},
|
|
1074
|
+
"durationMs": {
|
|
1075
|
+
"type": "integer",
|
|
1076
|
+
"minimum": 0
|
|
1077
|
+
}
|
|
1078
|
+
},
|
|
1079
|
+
"additionalProperties": true
|
|
1080
|
+
},
|
|
1081
|
+
"runCancelled": {
|
|
1082
|
+
"type": "object",
|
|
1083
|
+
"description": "Emitted once when the run reaches the cancelled terminal state.",
|
|
1084
|
+
"properties": {
|
|
1085
|
+
"reason": {
|
|
1086
|
+
"type": "string"
|
|
1087
|
+
},
|
|
1088
|
+
"cancelledBy": {
|
|
1089
|
+
"type": "string",
|
|
1090
|
+
"description": "Caller identity (uid / API key fingerprint / `system`)."
|
|
1091
|
+
},
|
|
1092
|
+
"durationMs": {
|
|
1093
|
+
"type": "integer",
|
|
1094
|
+
"minimum": 0
|
|
1095
|
+
},
|
|
1096
|
+
"parentRunId": {
|
|
1097
|
+
"type": "string",
|
|
1098
|
+
"minLength": 1,
|
|
1099
|
+
"description": "When this cancellation was triggered by a parent-cancel cascade (`interrupt-profiles.md \u00a7openwop-interrupt-cascade-cancel`), the parent runId that initiated it. Pairs with `reason: 'parent-cancelled'`. Absent for direct cancellations."
|
|
1100
|
+
}
|
|
1101
|
+
},
|
|
1102
|
+
"additionalProperties": true
|
|
1103
|
+
},
|
|
1104
|
+
"runResuming": {
|
|
1105
|
+
"type": "object",
|
|
1106
|
+
"description": "Emitted when an explicit resume is dispatched (browser bootstrap or `:resume` callable).",
|
|
1107
|
+
"properties": {
|
|
1108
|
+
"fromStatus": {
|
|
1109
|
+
"type": "string"
|
|
1110
|
+
}
|
|
1111
|
+
},
|
|
1112
|
+
"additionalProperties": true
|
|
1113
|
+
},
|
|
1114
|
+
"runPaused": {
|
|
1115
|
+
"type": "object",
|
|
1116
|
+
"description": "Emitted when the run is paused (manual pause / cap.breached pause-and-checkpoint).",
|
|
1117
|
+
"properties": {
|
|
1118
|
+
"reason": {
|
|
1119
|
+
"type": "string"
|
|
1120
|
+
}
|
|
1121
|
+
},
|
|
1122
|
+
"additionalProperties": true
|
|
1123
|
+
},
|
|
1124
|
+
"runResumed": {
|
|
1125
|
+
"type": "object",
|
|
1126
|
+
"description": "Emitted when the run resumes from `paused`.",
|
|
1127
|
+
"additionalProperties": true
|
|
1128
|
+
},
|
|
1129
|
+
"runRestoredFromSnapshot": {
|
|
1130
|
+
"type": "object",
|
|
1131
|
+
"description": "Emitted on cold-start when the engine rebuilds run state from event log.",
|
|
1132
|
+
"properties": {
|
|
1133
|
+
"snapshotSeq": {
|
|
1134
|
+
"type": "integer",
|
|
1135
|
+
"minimum": 0
|
|
1136
|
+
},
|
|
1137
|
+
"engineVersion": {
|
|
1138
|
+
"type": "string"
|
|
1139
|
+
}
|
|
1140
|
+
},
|
|
1141
|
+
"additionalProperties": true
|
|
1142
|
+
},
|
|
1143
|
+
"runDeadLettered": {
|
|
1144
|
+
"description": "RFC 0053 \u2014 emitted when a run/node exhausts its retry policy (RFC 0009) and is routed to the durable dead-letter sink. The run remains fork-eligible (RFC 0011) for `capabilities.deadLetter.retentionDays`. Redaction-safe: `reason` carries no credential material. MUST NOT be emitted unless `capabilities.deadLetter.supported: true`.",
|
|
1145
|
+
"type": "object",
|
|
1146
|
+
"additionalProperties": false,
|
|
1147
|
+
"required": [
|
|
1148
|
+
"runId",
|
|
1149
|
+
"reason",
|
|
1150
|
+
"attempts"
|
|
1151
|
+
],
|
|
1152
|
+
"properties": {
|
|
1153
|
+
"runId": {
|
|
1154
|
+
"type": "string",
|
|
1155
|
+
"minLength": 1
|
|
1156
|
+
},
|
|
1157
|
+
"nodeId": {
|
|
1158
|
+
"type": "string",
|
|
1159
|
+
"description": "The node whose retry exhaustion dead-lettered the run; absent for run-level failures."
|
|
1160
|
+
},
|
|
1161
|
+
"reason": {
|
|
1162
|
+
"type": "string",
|
|
1163
|
+
"minLength": 1,
|
|
1164
|
+
"description": "Redaction-safe terminal-failure reason."
|
|
1165
|
+
},
|
|
1166
|
+
"attempts": {
|
|
1167
|
+
"type": "integer",
|
|
1168
|
+
"minimum": 1,
|
|
1169
|
+
"description": "Total attempts made before dead-lettering."
|
|
1170
|
+
}
|
|
1171
|
+
}
|
|
1172
|
+
},
|
|
1173
|
+
"nodeStarted": {
|
|
1174
|
+
"type": "object",
|
|
1175
|
+
"description": "Emitted when a node begins execution.",
|
|
1176
|
+
"required": [
|
|
1177
|
+
"nodeId",
|
|
1178
|
+
"typeId"
|
|
1179
|
+
],
|
|
1180
|
+
"properties": {
|
|
1181
|
+
"nodeId": {
|
|
1182
|
+
"type": "string",
|
|
1183
|
+
"minLength": 1
|
|
1184
|
+
},
|
|
1185
|
+
"typeId": {
|
|
1186
|
+
"type": "string",
|
|
1187
|
+
"minLength": 1
|
|
1188
|
+
},
|
|
1189
|
+
"attempt": {
|
|
1190
|
+
"type": "integer",
|
|
1191
|
+
"minimum": 0,
|
|
1192
|
+
"description": "Zero-based retry counter."
|
|
1193
|
+
}
|
|
1194
|
+
},
|
|
1195
|
+
"additionalProperties": true
|
|
1196
|
+
},
|
|
1197
|
+
"nodeCompleted": {
|
|
1198
|
+
"type": "object",
|
|
1199
|
+
"description": "Emitted when a node successfully completes.",
|
|
1200
|
+
"required": [
|
|
1201
|
+
"nodeId"
|
|
1202
|
+
],
|
|
1203
|
+
"properties": {
|
|
1204
|
+
"nodeId": {
|
|
1205
|
+
"type": "string",
|
|
1206
|
+
"minLength": 1
|
|
1207
|
+
},
|
|
1208
|
+
"outputs": {
|
|
1209
|
+
"$ref": "#/$defs/_outputsObject"
|
|
1210
|
+
},
|
|
1211
|
+
"durationMs": {
|
|
1212
|
+
"type": "integer",
|
|
1213
|
+
"minimum": 0
|
|
1214
|
+
}
|
|
1215
|
+
},
|
|
1216
|
+
"additionalProperties": true
|
|
1217
|
+
},
|
|
1218
|
+
"nodeFailed": {
|
|
1219
|
+
"type": "object",
|
|
1220
|
+
"description": "Emitted on terminal node failure (after retries exhausted).",
|
|
1221
|
+
"required": [
|
|
1222
|
+
"nodeId",
|
|
1223
|
+
"error"
|
|
1224
|
+
],
|
|
1225
|
+
"properties": {
|
|
1226
|
+
"nodeId": {
|
|
1227
|
+
"type": "string",
|
|
1228
|
+
"minLength": 1
|
|
1229
|
+
},
|
|
1230
|
+
"error": {
|
|
1231
|
+
"$ref": "#/$defs/_errorObject"
|
|
1232
|
+
},
|
|
1233
|
+
"attempts": {
|
|
1234
|
+
"type": "integer",
|
|
1235
|
+
"minimum": 1
|
|
1236
|
+
}
|
|
1237
|
+
},
|
|
1238
|
+
"additionalProperties": true
|
|
1239
|
+
},
|
|
1240
|
+
"nodeSuspended": {
|
|
1241
|
+
"type": "object",
|
|
1242
|
+
"description": "Emitted when a node calls `ctx.interrupt(...)`. Carries the InterruptPayload (suspend-request.schema.json).",
|
|
1243
|
+
"required": [
|
|
1244
|
+
"nodeId",
|
|
1245
|
+
"interruptId"
|
|
1246
|
+
],
|
|
1247
|
+
"properties": {
|
|
1248
|
+
"nodeId": {
|
|
1249
|
+
"type": "string",
|
|
1250
|
+
"minLength": 1
|
|
1251
|
+
},
|
|
1252
|
+
"interruptId": {
|
|
1253
|
+
"type": "string",
|
|
1254
|
+
"minLength": 1
|
|
1255
|
+
},
|
|
1256
|
+
"kind": {
|
|
1257
|
+
"type": "string",
|
|
1258
|
+
"enum": [
|
|
1259
|
+
"approval",
|
|
1260
|
+
"clarification",
|
|
1261
|
+
"external-event",
|
|
1262
|
+
"custom",
|
|
1263
|
+
"conversation.start",
|
|
1264
|
+
"conversation.exchange",
|
|
1265
|
+
"conversation.close",
|
|
1266
|
+
"low-confidence"
|
|
1267
|
+
],
|
|
1268
|
+
"description": "RFC 0094 \u00a7E \u2014 the full kind union `interrupt.md` defines (mirrors suspend-request.schema.json). Conversation kinds are gated on the conversation capability per capabilities.md."
|
|
1269
|
+
},
|
|
1270
|
+
"key": {
|
|
1271
|
+
"type": "string",
|
|
1272
|
+
"minLength": 1
|
|
1273
|
+
}
|
|
1274
|
+
},
|
|
1275
|
+
"additionalProperties": true
|
|
1276
|
+
},
|
|
1277
|
+
"nodeSuspendFailed": {
|
|
1278
|
+
"type": "object",
|
|
1279
|
+
"description": "Emitted when a suspension attempt fails (storage write error, signed-token issue).",
|
|
1280
|
+
"required": [
|
|
1281
|
+
"nodeId",
|
|
1282
|
+
"error"
|
|
1283
|
+
],
|
|
1284
|
+
"properties": {
|
|
1285
|
+
"nodeId": {
|
|
1286
|
+
"type": "string",
|
|
1287
|
+
"minLength": 1
|
|
1288
|
+
},
|
|
1289
|
+
"error": {
|
|
1290
|
+
"$ref": "#/$defs/_errorObject"
|
|
1291
|
+
}
|
|
1292
|
+
},
|
|
1293
|
+
"additionalProperties": true
|
|
1294
|
+
},
|
|
1295
|
+
"nodeResumed": {
|
|
1296
|
+
"type": "object",
|
|
1297
|
+
"description": "Emitted when a suspended node receives its resume value and continues.",
|
|
1298
|
+
"required": [
|
|
1299
|
+
"nodeId"
|
|
1300
|
+
],
|
|
1301
|
+
"properties": {
|
|
1302
|
+
"nodeId": {
|
|
1303
|
+
"type": "string",
|
|
1304
|
+
"minLength": 1
|
|
1305
|
+
},
|
|
1306
|
+
"interruptId": {
|
|
1307
|
+
"type": "string"
|
|
1308
|
+
},
|
|
1309
|
+
"resumeValue": {}
|
|
1310
|
+
},
|
|
1311
|
+
"additionalProperties": true
|
|
1312
|
+
},
|
|
1313
|
+
"nodeRetried": {
|
|
1314
|
+
"type": "object",
|
|
1315
|
+
"description": "Emitted on each retry attempt within a node's retry budget.",
|
|
1316
|
+
"required": [
|
|
1317
|
+
"nodeId",
|
|
1318
|
+
"attempt"
|
|
1319
|
+
],
|
|
1320
|
+
"properties": {
|
|
1321
|
+
"nodeId": {
|
|
1322
|
+
"type": "string",
|
|
1323
|
+
"minLength": 1
|
|
1324
|
+
},
|
|
1325
|
+
"attempt": {
|
|
1326
|
+
"type": "integer",
|
|
1327
|
+
"minimum": 1
|
|
1328
|
+
},
|
|
1329
|
+
"delayMs": {
|
|
1330
|
+
"type": "integer",
|
|
1331
|
+
"minimum": 0
|
|
1332
|
+
},
|
|
1333
|
+
"lastError": {
|
|
1334
|
+
"$ref": "#/$defs/_errorObject"
|
|
1335
|
+
}
|
|
1336
|
+
},
|
|
1337
|
+
"additionalProperties": true
|
|
1338
|
+
},
|
|
1339
|
+
"nodeSkipped": {
|
|
1340
|
+
"type": "object",
|
|
1341
|
+
"description": "Emitted when a node is skipped (edge condition failed, gate veto, conditional branch).",
|
|
1342
|
+
"required": [
|
|
1343
|
+
"nodeId"
|
|
1344
|
+
],
|
|
1345
|
+
"properties": {
|
|
1346
|
+
"nodeId": {
|
|
1347
|
+
"type": "string",
|
|
1348
|
+
"minLength": 1
|
|
1349
|
+
},
|
|
1350
|
+
"reason": {
|
|
1351
|
+
"type": "string"
|
|
1352
|
+
}
|
|
1353
|
+
},
|
|
1354
|
+
"additionalProperties": true
|
|
1355
|
+
},
|
|
1356
|
+
"nodeCancelled": {
|
|
1357
|
+
"type": "object",
|
|
1358
|
+
"description": "Emitted when an in-flight node is cancelled (run-level cancel or upstream failure cascade).",
|
|
1359
|
+
"required": [
|
|
1360
|
+
"nodeId"
|
|
1361
|
+
],
|
|
1362
|
+
"properties": {
|
|
1363
|
+
"nodeId": {
|
|
1364
|
+
"type": "string",
|
|
1365
|
+
"minLength": 1
|
|
1366
|
+
},
|
|
1367
|
+
"reason": {
|
|
1368
|
+
"type": "string"
|
|
1369
|
+
}
|
|
1370
|
+
},
|
|
1371
|
+
"additionalProperties": true
|
|
1372
|
+
},
|
|
1373
|
+
"approvalRequested": {
|
|
1374
|
+
"type": "object",
|
|
1375
|
+
"description": "Legacy kind-specific event (back-compat with pre-interrupt-primitive consumers). Modern servers SHOULD emit `interrupt.requested` with `kind: 'approval'` and MAY also emit this for back-compat per interrupt.md \u00a7migration.",
|
|
1376
|
+
"required": [
|
|
1377
|
+
"nodeId",
|
|
1378
|
+
"artifactId",
|
|
1379
|
+
"artifactType",
|
|
1380
|
+
"actions"
|
|
1381
|
+
],
|
|
1382
|
+
"properties": {
|
|
1383
|
+
"nodeId": {
|
|
1384
|
+
"type": "string"
|
|
1385
|
+
},
|
|
1386
|
+
"interruptId": {
|
|
1387
|
+
"type": "string"
|
|
1388
|
+
},
|
|
1389
|
+
"artifactId": {
|
|
1390
|
+
"type": "string"
|
|
1391
|
+
},
|
|
1392
|
+
"artifactType": {
|
|
1393
|
+
"type": "string"
|
|
1394
|
+
},
|
|
1395
|
+
"title": {
|
|
1396
|
+
"type": "string"
|
|
1397
|
+
},
|
|
1398
|
+
"actions": {
|
|
1399
|
+
"type": "array",
|
|
1400
|
+
"items": {
|
|
1401
|
+
"type": "string",
|
|
1402
|
+
"enum": [
|
|
1403
|
+
"accept",
|
|
1404
|
+
"reject",
|
|
1405
|
+
"refine",
|
|
1406
|
+
"edit",
|
|
1407
|
+
"ask"
|
|
1408
|
+
]
|
|
1409
|
+
},
|
|
1410
|
+
"minItems": 1
|
|
1411
|
+
},
|
|
1412
|
+
"approversList": {
|
|
1413
|
+
"type": "array",
|
|
1414
|
+
"items": {
|
|
1415
|
+
"type": "string"
|
|
1416
|
+
}
|
|
1417
|
+
},
|
|
1418
|
+
"requiredApprovals": {
|
|
1419
|
+
"type": "integer",
|
|
1420
|
+
"minimum": 1
|
|
1421
|
+
}
|
|
1422
|
+
},
|
|
1423
|
+
"additionalProperties": true
|
|
1424
|
+
},
|
|
1425
|
+
"approvalReceived": {
|
|
1426
|
+
"type": "object",
|
|
1427
|
+
"description": "Emitted when an approval action is recorded (accept/reject/refine/edit-accept/timeout). The `ask` action does NOT emit this \u2014 Q&A exchanges have their own log. See `interrupt.md` \u00a7`ApprovalResume` for the action vocabulary + the host-side enforcement boundary.",
|
|
1428
|
+
"required": [
|
|
1429
|
+
"nodeId",
|
|
1430
|
+
"action"
|
|
1431
|
+
],
|
|
1432
|
+
"properties": {
|
|
1433
|
+
"nodeId": {
|
|
1434
|
+
"type": "string"
|
|
1435
|
+
},
|
|
1436
|
+
"action": {
|
|
1437
|
+
"type": "string",
|
|
1438
|
+
"enum": [
|
|
1439
|
+
"accept",
|
|
1440
|
+
"reject",
|
|
1441
|
+
"refine",
|
|
1442
|
+
"edit-accept",
|
|
1443
|
+
"timeout"
|
|
1444
|
+
]
|
|
1445
|
+
},
|
|
1446
|
+
"decidedBy": {
|
|
1447
|
+
"type": "string",
|
|
1448
|
+
"description": "Host-defined opaque principal identifier. Hosts MUST populate this for non-timeout actions per `interrupt.md` \u00a7`Host-side enforcement boundary`."
|
|
1449
|
+
},
|
|
1450
|
+
"decidedAt": {
|
|
1451
|
+
"type": "string",
|
|
1452
|
+
"description": "ISO 8601 timestamp at decision time."
|
|
1453
|
+
},
|
|
1454
|
+
"comment": {
|
|
1455
|
+
"type": "string"
|
|
1456
|
+
},
|
|
1457
|
+
"feedback": {
|
|
1458
|
+
"type": "string",
|
|
1459
|
+
"description": "Legacy free-text feedback. New hosts SHOULD use `refineFeedback` for structured refine-action feedback."
|
|
1460
|
+
},
|
|
1461
|
+
"refineFeedback": {
|
|
1462
|
+
"type": "object",
|
|
1463
|
+
"description": "Structured feedback object for `action: 'refine'`. See `interrupt.md` \u00a7`RefineFeedback`.",
|
|
1464
|
+
"properties": {
|
|
1465
|
+
"scope": {
|
|
1466
|
+
"type": "string",
|
|
1467
|
+
"enum": [
|
|
1468
|
+
"whole",
|
|
1469
|
+
"section",
|
|
1470
|
+
"items"
|
|
1471
|
+
]
|
|
1472
|
+
},
|
|
1473
|
+
"sectionPath": {
|
|
1474
|
+
"type": "string"
|
|
1475
|
+
},
|
|
1476
|
+
"itemIds": {
|
|
1477
|
+
"type": "array",
|
|
1478
|
+
"items": {
|
|
1479
|
+
"type": "string"
|
|
1480
|
+
}
|
|
1481
|
+
},
|
|
1482
|
+
"tags": {
|
|
1483
|
+
"type": "array",
|
|
1484
|
+
"items": {
|
|
1485
|
+
"type": "string"
|
|
1486
|
+
}
|
|
1487
|
+
},
|
|
1488
|
+
"text": {
|
|
1489
|
+
"type": "string"
|
|
1490
|
+
}
|
|
1491
|
+
},
|
|
1492
|
+
"required": [
|
|
1493
|
+
"scope"
|
|
1494
|
+
],
|
|
1495
|
+
"additionalProperties": true
|
|
1496
|
+
},
|
|
1497
|
+
"editedArtifactData": {
|
|
1498
|
+
"description": "User-edited artifact bytes when `action: 'edit-accept'`."
|
|
1499
|
+
}
|
|
1500
|
+
},
|
|
1501
|
+
"additionalProperties": true
|
|
1502
|
+
},
|
|
1503
|
+
"approvalGranted": {
|
|
1504
|
+
"description": "RFC 0051 \u2014 emitted when an authorized principal grants a `core.openwop.governance.approvalGate`. Redaction-safe: `principal` is an opaque RFC 0048 id. MUST NOT be emitted unless the gate node is registered (peerDependency `authorization: 'supported'`).",
|
|
1505
|
+
"type": "object",
|
|
1506
|
+
"additionalProperties": false,
|
|
1507
|
+
"required": [
|
|
1508
|
+
"gateId",
|
|
1509
|
+
"principal"
|
|
1510
|
+
],
|
|
1511
|
+
"properties": {
|
|
1512
|
+
"gateId": {
|
|
1513
|
+
"type": "string",
|
|
1514
|
+
"minLength": 1,
|
|
1515
|
+
"description": "Identifier of the approval gate node."
|
|
1516
|
+
},
|
|
1517
|
+
"principal": {
|
|
1518
|
+
"type": "string",
|
|
1519
|
+
"minLength": 1,
|
|
1520
|
+
"description": "Opaque RFC 0048 principal id of the granting actor."
|
|
1521
|
+
},
|
|
1522
|
+
"quorumProgress": {
|
|
1523
|
+
"type": "object",
|
|
1524
|
+
"additionalProperties": false,
|
|
1525
|
+
"properties": {
|
|
1526
|
+
"granted": {
|
|
1527
|
+
"type": "integer",
|
|
1528
|
+
"minimum": 0
|
|
1529
|
+
},
|
|
1530
|
+
"required": {
|
|
1531
|
+
"type": "integer",
|
|
1532
|
+
"minimum": 1
|
|
1533
|
+
}
|
|
1534
|
+
},
|
|
1535
|
+
"description": "When the gate requires a quorum: grants accumulated vs required."
|
|
1536
|
+
}
|
|
1537
|
+
}
|
|
1538
|
+
},
|
|
1539
|
+
"approvalRejected": {
|
|
1540
|
+
"description": "RFC 0051 \u2014 emitted when an authorized principal rejects an approval gate. The run loops back per the workflow edges (does not terminate by default). Redaction-safe.",
|
|
1541
|
+
"type": "object",
|
|
1542
|
+
"additionalProperties": false,
|
|
1543
|
+
"required": [
|
|
1544
|
+
"gateId",
|
|
1545
|
+
"principal"
|
|
1546
|
+
],
|
|
1547
|
+
"properties": {
|
|
1548
|
+
"gateId": {
|
|
1549
|
+
"type": "string",
|
|
1550
|
+
"minLength": 1
|
|
1551
|
+
},
|
|
1552
|
+
"principal": {
|
|
1553
|
+
"type": "string",
|
|
1554
|
+
"minLength": 1,
|
|
1555
|
+
"description": "Opaque RFC 0048 principal id of the rejecting actor."
|
|
1556
|
+
},
|
|
1557
|
+
"reason": {
|
|
1558
|
+
"type": "string",
|
|
1559
|
+
"description": "Redaction-safe human-readable reason."
|
|
1560
|
+
}
|
|
1561
|
+
}
|
|
1562
|
+
},
|
|
1563
|
+
"approvalOverridden": {
|
|
1564
|
+
"description": "RFC 0051 \u2014 emitted when a role-gated `override` path bypasses the gate (e.g. owner force-publish). MUST feed the audit log (RFC 0009/0010). Redaction-safe.",
|
|
1565
|
+
"type": "object",
|
|
1566
|
+
"additionalProperties": false,
|
|
1567
|
+
"required": [
|
|
1568
|
+
"gateId",
|
|
1569
|
+
"principal",
|
|
1570
|
+
"reason"
|
|
1571
|
+
],
|
|
1572
|
+
"properties": {
|
|
1573
|
+
"gateId": {
|
|
1574
|
+
"type": "string",
|
|
1575
|
+
"minLength": 1
|
|
1576
|
+
},
|
|
1577
|
+
"principal": {
|
|
1578
|
+
"type": "string",
|
|
1579
|
+
"minLength": 1,
|
|
1580
|
+
"description": "Opaque RFC 0048 principal id of the overriding actor (MUST satisfy the override role)."
|
|
1581
|
+
},
|
|
1582
|
+
"reason": {
|
|
1583
|
+
"type": "string",
|
|
1584
|
+
"minLength": 1,
|
|
1585
|
+
"description": "Required, redaction-safe rationale \u2014 the audit breadcrumb."
|
|
1586
|
+
}
|
|
1587
|
+
}
|
|
1588
|
+
},
|
|
1589
|
+
"clarificationRequested": {
|
|
1590
|
+
"type": "object",
|
|
1591
|
+
"description": "Legacy kind-specific event for HITL clarification requests.",
|
|
1592
|
+
"required": [
|
|
1593
|
+
"nodeId",
|
|
1594
|
+
"questions"
|
|
1595
|
+
],
|
|
1596
|
+
"properties": {
|
|
1597
|
+
"nodeId": {
|
|
1598
|
+
"type": "string"
|
|
1599
|
+
},
|
|
1600
|
+
"interruptId": {
|
|
1601
|
+
"type": "string"
|
|
1602
|
+
},
|
|
1603
|
+
"questions": {
|
|
1604
|
+
"type": "array",
|
|
1605
|
+
"items": {
|
|
1606
|
+
"type": "object",
|
|
1607
|
+
"required": [
|
|
1608
|
+
"id",
|
|
1609
|
+
"question"
|
|
1610
|
+
],
|
|
1611
|
+
"properties": {
|
|
1612
|
+
"id": {
|
|
1613
|
+
"type": "string"
|
|
1614
|
+
},
|
|
1615
|
+
"question": {
|
|
1616
|
+
"type": "string"
|
|
1617
|
+
},
|
|
1618
|
+
"schema": {
|
|
1619
|
+
"type": "object"
|
|
1620
|
+
}
|
|
1621
|
+
},
|
|
1622
|
+
"additionalProperties": true
|
|
1623
|
+
}
|
|
1624
|
+
}
|
|
1625
|
+
},
|
|
1626
|
+
"additionalProperties": true
|
|
1627
|
+
},
|
|
1628
|
+
"clarificationResolved": {
|
|
1629
|
+
"type": "object",
|
|
1630
|
+
"description": "Emitted when clarification answers are received.",
|
|
1631
|
+
"required": [
|
|
1632
|
+
"nodeId",
|
|
1633
|
+
"answers"
|
|
1634
|
+
],
|
|
1635
|
+
"properties": {
|
|
1636
|
+
"nodeId": {
|
|
1637
|
+
"type": "string"
|
|
1638
|
+
},
|
|
1639
|
+
"answers": {
|
|
1640
|
+
"type": "object"
|
|
1641
|
+
},
|
|
1642
|
+
"answeredBy": {
|
|
1643
|
+
"type": "string"
|
|
1644
|
+
}
|
|
1645
|
+
},
|
|
1646
|
+
"additionalProperties": true
|
|
1647
|
+
},
|
|
1648
|
+
"interruptRequested": {
|
|
1649
|
+
"description": "Canonical HITL primitive \u2014 discriminated union over kind. Payload mirrors `suspend-request.schema.json` (InterruptPayload) plus engine-assigned identity fields.",
|
|
1650
|
+
"$ref": "https://openwop.dev/spec/v1/suspend-request.schema.json"
|
|
1651
|
+
},
|
|
1652
|
+
"interruptResolved": {
|
|
1653
|
+
"type": "object",
|
|
1654
|
+
"description": "Emitted when an interrupt is resolved (any kind).",
|
|
1655
|
+
"required": [
|
|
1656
|
+
"nodeId",
|
|
1657
|
+
"interruptId"
|
|
1658
|
+
],
|
|
1659
|
+
"properties": {
|
|
1660
|
+
"nodeId": {
|
|
1661
|
+
"type": "string"
|
|
1662
|
+
},
|
|
1663
|
+
"interruptId": {
|
|
1664
|
+
"type": "string"
|
|
1665
|
+
},
|
|
1666
|
+
"kind": {
|
|
1667
|
+
"type": "string",
|
|
1668
|
+
"enum": [
|
|
1669
|
+
"approval",
|
|
1670
|
+
"clarification",
|
|
1671
|
+
"external-event",
|
|
1672
|
+
"custom",
|
|
1673
|
+
"conversation.start",
|
|
1674
|
+
"conversation.exchange",
|
|
1675
|
+
"conversation.close",
|
|
1676
|
+
"low-confidence"
|
|
1677
|
+
],
|
|
1678
|
+
"description": "RFC 0094 \u00a7E \u2014 the full kind union `interrupt.md` defines (mirrors suspend-request.schema.json). Conversation kinds are gated on the conversation capability per capabilities.md."
|
|
1679
|
+
},
|
|
1680
|
+
"resumeValue": {}
|
|
1681
|
+
},
|
|
1682
|
+
"additionalProperties": true
|
|
1683
|
+
},
|
|
1684
|
+
"channelWritten": {
|
|
1685
|
+
"$ref": "https://openwop.dev/spec/v1/channel-written-payload.schema.json"
|
|
1686
|
+
},
|
|
1687
|
+
"channelPresence": {
|
|
1688
|
+
"$ref": "https://openwop.dev/spec/v1/channel-presence-payload.schema.json"
|
|
1689
|
+
},
|
|
1690
|
+
"contextSummarized": {
|
|
1691
|
+
"type": "object",
|
|
1692
|
+
"description": "RFC 0111. Emitted when the host replaces older in-window orchestrator transcript turns with a host-produced summary to honor `multiAgent.executionModel.contextBudget.transcriptTokenBudget`. CONTENT-FREE: the summary text is NEVER inlined \u2014 `summaryRef` is an artifactId resolved via `GET /v1/runs/{runId}/artifacts/{artifactId}`. The summary is a NONDETERMINISTIC host output governed like an RFC 0041 envelope: on `:fork mode:replay` the host MUST reuse this recorded `summaryRef` and MUST NOT re-summarize (see multi-agent-execution.md \u00a7\"Context economy (RFC 0111)\"). `replacedTurns` lists the event ids the summary stands in for, so a replay engine reconstructs the exact transcript.",
|
|
1693
|
+
"required": [
|
|
1694
|
+
"iteration",
|
|
1695
|
+
"replacedTurns",
|
|
1696
|
+
"summaryRef",
|
|
1697
|
+
"tokenCounter",
|
|
1698
|
+
"tokensBefore",
|
|
1699
|
+
"tokensAfter"
|
|
1700
|
+
],
|
|
1701
|
+
"properties": {
|
|
1702
|
+
"iteration": {
|
|
1703
|
+
"type": "integer",
|
|
1704
|
+
"minimum": 0,
|
|
1705
|
+
"description": "The orchestrator-loop iteration (the `runOrchestrator.decided.iteration` counter) whose transcript assembly triggered this summarization."
|
|
1706
|
+
},
|
|
1707
|
+
"replacedTurns": {
|
|
1708
|
+
"type": "array",
|
|
1709
|
+
"items": {
|
|
1710
|
+
"type": "string",
|
|
1711
|
+
"minLength": 1
|
|
1712
|
+
},
|
|
1713
|
+
"description": "Event ids (run event-log entries) the summary stands in for. A replay engine reconstructs the exact model-facing transcript by substituting the `summaryRef` artifact for this contiguous range."
|
|
1714
|
+
},
|
|
1715
|
+
"summaryRef": {
|
|
1716
|
+
"type": "string",
|
|
1717
|
+
"minLength": 1,
|
|
1718
|
+
"description": "ArtifactId of the persisted summary (read via `GET /v1/runs/{runId}/artifacts/{artifactId}`). The summary text is NOT on the wire. MUST be persisted/readable as-of the iteration's event-log index; a host that cannot serve it at the requested `fromSeq` MUST refuse the fork (mirrors `replay_memory_snapshot_unavailable`)."
|
|
1719
|
+
},
|
|
1720
|
+
"tokenCounter": {
|
|
1721
|
+
"type": "string",
|
|
1722
|
+
"enum": [
|
|
1723
|
+
"o200k_base",
|
|
1724
|
+
"cl100k_base",
|
|
1725
|
+
"chars",
|
|
1726
|
+
"host-defined"
|
|
1727
|
+
],
|
|
1728
|
+
"description": "The unit `tokensBefore`/`tokensAfter` are denominated in. MUST equal the advertised `contextBudget.tokenCounter`."
|
|
1729
|
+
},
|
|
1730
|
+
"tokensBefore": {
|
|
1731
|
+
"type": "integer",
|
|
1732
|
+
"minimum": 0,
|
|
1733
|
+
"description": "Token count of the `replacedTurns` range before summarization, in `tokenCounter` units."
|
|
1734
|
+
},
|
|
1735
|
+
"tokensAfter": {
|
|
1736
|
+
"type": "integer",
|
|
1737
|
+
"minimum": 0,
|
|
1738
|
+
"description": "Token count of the summary that replaced the range, in `tokenCounter` units. Expected \u2264 `tokensBefore`."
|
|
1739
|
+
}
|
|
1740
|
+
},
|
|
1741
|
+
"additionalProperties": false
|
|
1742
|
+
},
|
|
1743
|
+
"artifactCreated": {
|
|
1744
|
+
"type": "object",
|
|
1745
|
+
"description": "Emitted when a node produces a typed artifact (PRD, theme, plan, etc.).",
|
|
1746
|
+
"required": [
|
|
1747
|
+
"artifactId",
|
|
1748
|
+
"artifactType"
|
|
1749
|
+
],
|
|
1750
|
+
"properties": {
|
|
1751
|
+
"artifactId": {
|
|
1752
|
+
"type": "string",
|
|
1753
|
+
"minLength": 1
|
|
1754
|
+
},
|
|
1755
|
+
"artifactType": {
|
|
1756
|
+
"type": "string",
|
|
1757
|
+
"minLength": 1
|
|
1758
|
+
},
|
|
1759
|
+
"nodeId": {
|
|
1760
|
+
"type": "string"
|
|
1761
|
+
},
|
|
1762
|
+
"version": {
|
|
1763
|
+
"type": "string"
|
|
1764
|
+
},
|
|
1765
|
+
"summary": {
|
|
1766
|
+
"type": "string"
|
|
1767
|
+
},
|
|
1768
|
+
"registered": {
|
|
1769
|
+
"type": "boolean",
|
|
1770
|
+
"description": "RFC 0071. True when `artifactType` resolves to a registered artifact type (pack- or host-registered) and the payload was validated against its schema; false for unregistered/host-local types accepted without schema validation. Optional; absent \u21d2 treat as true, preserving pre-RFC-0071 semantics. See artifact-type-packs.md \u00a7\"Binding the existing artifact surfaces\"."
|
|
1771
|
+
},
|
|
1772
|
+
"registrationSource": {
|
|
1773
|
+
"type": "string",
|
|
1774
|
+
"enum": [
|
|
1775
|
+
"pack",
|
|
1776
|
+
"host"
|
|
1777
|
+
],
|
|
1778
|
+
"description": "RFC 0075. Provenance of a registered type: `pack` (matches an installed artifact-type pack) or `host` (a host-native type the host validates against a host-known schema, independent of any pack \u2014 e.g. an AI host's built-in artifact types). Optional; meaningful only when `registered: true`. Absent \u21d2 unspecified provenance (existing semantics)."
|
|
1779
|
+
}
|
|
1780
|
+
},
|
|
1781
|
+
"additionalProperties": true
|
|
1782
|
+
},
|
|
1783
|
+
"outputChunk": {
|
|
1784
|
+
"type": "object",
|
|
1785
|
+
"description": "Emitted for streaming output (e.g., LLM token chunks). Stream-mode `messages` consumers see these. RFC 0094 \u00a7D single-sources the `ai.message.chunk` payload here: bare {nodeId, runId, chunk, isLast} is the minimum compliant payload per stream-modes.md \u00a7messages (the prior {nodeId, chunk}-only required set was the defective restatement). Tiered metadata per stream-modes.md \u00a7messages (S2 closure): `meta` adds Tier 1 typed slots and a Tier 2 provider-pass-through escape hatch.",
|
|
1786
|
+
"required": [
|
|
1787
|
+
"nodeId",
|
|
1788
|
+
"runId",
|
|
1789
|
+
"chunk",
|
|
1790
|
+
"isLast"
|
|
1791
|
+
],
|
|
1792
|
+
"properties": {
|
|
1793
|
+
"nodeId": {
|
|
1794
|
+
"type": "string",
|
|
1795
|
+
"minLength": 1
|
|
1796
|
+
},
|
|
1797
|
+
"runId": {
|
|
1798
|
+
"type": "string",
|
|
1799
|
+
"minLength": 1,
|
|
1800
|
+
"description": "Run this chunk belongs to. Required so multiplexed consumers (mixed-mode streams, fan-in UIs) can route chunks without out-of-band context."
|
|
1801
|
+
},
|
|
1802
|
+
"chunk": {
|
|
1803
|
+
"type": "string"
|
|
1804
|
+
},
|
|
1805
|
+
"isLast": {
|
|
1806
|
+
"type": "boolean",
|
|
1807
|
+
"description": "True for the final chunk of a given AI node call. Required \u2014 both reference consumers rely on it for fold termination."
|
|
1808
|
+
},
|
|
1809
|
+
"channel": {
|
|
1810
|
+
"type": "string",
|
|
1811
|
+
"description": "Optional sub-stream identifier when a node emits multiple parallel streams."
|
|
1812
|
+
},
|
|
1813
|
+
"meta": {
|
|
1814
|
+
"$ref": "#/$defs/_chunkMeta"
|
|
1815
|
+
}
|
|
1816
|
+
},
|
|
1817
|
+
"additionalProperties": true
|
|
1818
|
+
},
|
|
1819
|
+
"_chunkMeta": {
|
|
1820
|
+
"type": "object",
|
|
1821
|
+
"description": "Tiered metadata for ai.message.chunk / outputChunk payloads. See stream-modes.md \u00a7messages.",
|
|
1822
|
+
"properties": {
|
|
1823
|
+
"finishReason": {
|
|
1824
|
+
"type": "string",
|
|
1825
|
+
"enum": [
|
|
1826
|
+
"stop",
|
|
1827
|
+
"length",
|
|
1828
|
+
"tool_calls",
|
|
1829
|
+
"content_filter"
|
|
1830
|
+
],
|
|
1831
|
+
"description": "Tier 1: normalized termination reason. Set on the final chunk of a generation. Forward-compat: future values MAY be added; consumers MUST tolerate unknown values."
|
|
1832
|
+
},
|
|
1833
|
+
"logprobs": {
|
|
1834
|
+
"type": "array",
|
|
1835
|
+
"description": "Tier 1: per-token log-probability info. Shape mirrors OpenAI / Anthropic / Gemini conventions; servers SHOULD normalize to `[{token: string, logprob: number, topLogprobs?: [{token, logprob}]}]`."
|
|
1836
|
+
},
|
|
1837
|
+
"toolCalls": {
|
|
1838
|
+
"type": "array",
|
|
1839
|
+
"description": "Tier 1: structured tool / function calls emitted in this chunk. Each item: `{id, name, arguments}` \u2014 `arguments` is a string (JSON-encoded args, may be partial when streaming)."
|
|
1840
|
+
},
|
|
1841
|
+
"model": {
|
|
1842
|
+
"type": "string",
|
|
1843
|
+
"description": "Tier 1: model identifier the chunk was produced by (e.g., `claude-opus-4-7`, `gpt-5`). Useful when a workflow node fans out across multiple models."
|
|
1844
|
+
},
|
|
1845
|
+
"usage": {
|
|
1846
|
+
"type": "object",
|
|
1847
|
+
"description": "Tier 1: token-billing metadata. Pairs with O4 cost-attribution attributes (`openwop.cost.tokens.*`).",
|
|
1848
|
+
"properties": {
|
|
1849
|
+
"promptTokens": {
|
|
1850
|
+
"type": "integer",
|
|
1851
|
+
"minimum": 0
|
|
1852
|
+
},
|
|
1853
|
+
"completionTokens": {
|
|
1854
|
+
"type": "integer",
|
|
1855
|
+
"minimum": 0
|
|
1856
|
+
},
|
|
1857
|
+
"totalTokens": {
|
|
1858
|
+
"type": "integer",
|
|
1859
|
+
"minimum": 0
|
|
1860
|
+
}
|
|
1861
|
+
},
|
|
1862
|
+
"additionalProperties": true
|
|
1863
|
+
},
|
|
1864
|
+
"provider": {
|
|
1865
|
+
"type": "string",
|
|
1866
|
+
"description": "Tier 2: provider name when `providerExtensions` is present. Examples: `openai`, `anthropic`, `google`, `minimax`. Consumers MUST NOT branch on this for behavior \u2014 use Tier 1 fields. Provided for observability + debugging only."
|
|
1867
|
+
},
|
|
1868
|
+
"providerExtensions": {
|
|
1869
|
+
"type": "object",
|
|
1870
|
+
"description": "Tier 2: provider pass-through for fields the spec hasn't typed yet. Consumers using this opt into per-provider knowledge; spec evolution may move fields up into Tier 1 over time (additive \u2014 typed slot wins)."
|
|
1871
|
+
}
|
|
1872
|
+
},
|
|
1873
|
+
"additionalProperties": false
|
|
1874
|
+
},
|
|
1875
|
+
"variableChanged": {
|
|
1876
|
+
"type": "object",
|
|
1877
|
+
"description": "Emitted on workflow-variable mutation (debug/values stream modes). NOT emitted for typed channels (those use channel.written).",
|
|
1878
|
+
"required": [
|
|
1879
|
+
"name"
|
|
1880
|
+
],
|
|
1881
|
+
"properties": {
|
|
1882
|
+
"name": {
|
|
1883
|
+
"type": "string",
|
|
1884
|
+
"minLength": 1
|
|
1885
|
+
},
|
|
1886
|
+
"previous": {},
|
|
1887
|
+
"next": {},
|
|
1888
|
+
"nodeId": {
|
|
1889
|
+
"type": "string"
|
|
1890
|
+
}
|
|
1891
|
+
},
|
|
1892
|
+
"additionalProperties": true
|
|
1893
|
+
},
|
|
1894
|
+
"logAppended": {
|
|
1895
|
+
"type": "object",
|
|
1896
|
+
"description": "Emitted on `ctx.log.*` calls. Debug-stream-mode only.",
|
|
1897
|
+
"required": [
|
|
1898
|
+
"level",
|
|
1899
|
+
"message"
|
|
1900
|
+
],
|
|
1901
|
+
"properties": {
|
|
1902
|
+
"level": {
|
|
1903
|
+
"type": "string",
|
|
1904
|
+
"enum": [
|
|
1905
|
+
"debug",
|
|
1906
|
+
"info",
|
|
1907
|
+
"warn",
|
|
1908
|
+
"error"
|
|
1909
|
+
]
|
|
1910
|
+
},
|
|
1911
|
+
"message": {
|
|
1912
|
+
"type": "string"
|
|
1913
|
+
},
|
|
1914
|
+
"nodeId": {
|
|
1915
|
+
"type": "string"
|
|
1916
|
+
},
|
|
1917
|
+
"fields": {
|
|
1918
|
+
"type": "object"
|
|
1919
|
+
}
|
|
1920
|
+
},
|
|
1921
|
+
"additionalProperties": true
|
|
1922
|
+
},
|
|
1923
|
+
"versionPinned": {
|
|
1924
|
+
"type": "object",
|
|
1925
|
+
"description": "Emitted via `ctx.getVersion(changeId)` per Temporal-style versioning. See version-negotiation.md.",
|
|
1926
|
+
"required": [
|
|
1927
|
+
"changeId",
|
|
1928
|
+
"version"
|
|
1929
|
+
],
|
|
1930
|
+
"properties": {
|
|
1931
|
+
"changeId": {
|
|
1932
|
+
"type": "string",
|
|
1933
|
+
"minLength": 1
|
|
1934
|
+
},
|
|
1935
|
+
"version": {
|
|
1936
|
+
"type": "integer",
|
|
1937
|
+
"minimum": 0
|
|
1938
|
+
},
|
|
1939
|
+
"nodeId": {
|
|
1940
|
+
"type": "string"
|
|
1941
|
+
}
|
|
1942
|
+
},
|
|
1943
|
+
"additionalProperties": true
|
|
1944
|
+
},
|
|
1945
|
+
"workflowRestored": {
|
|
1946
|
+
"type": "object",
|
|
1947
|
+
"description": "Emitted when an in-flight run is recovered from the event log on a fresh engine boot.",
|
|
1948
|
+
"properties": {
|
|
1949
|
+
"fromSnapshotSeq": {
|
|
1950
|
+
"type": "integer",
|
|
1951
|
+
"minimum": 0
|
|
1952
|
+
},
|
|
1953
|
+
"engineVersion": {
|
|
1954
|
+
"type": "string"
|
|
1955
|
+
}
|
|
1956
|
+
},
|
|
1957
|
+
"additionalProperties": true
|
|
1958
|
+
},
|
|
1959
|
+
"workflowLoopbackLimit": {
|
|
1960
|
+
"type": "object",
|
|
1961
|
+
"description": "Emitted when a request-changes loop hits its `maxLoopbackIterations` cap.",
|
|
1962
|
+
"required": [
|
|
1963
|
+
"nodeId",
|
|
1964
|
+
"iterations"
|
|
1965
|
+
],
|
|
1966
|
+
"properties": {
|
|
1967
|
+
"nodeId": {
|
|
1968
|
+
"type": "string"
|
|
1969
|
+
},
|
|
1970
|
+
"iterations": {
|
|
1971
|
+
"type": "integer",
|
|
1972
|
+
"minimum": 1
|
|
1973
|
+
},
|
|
1974
|
+
"limit": {
|
|
1975
|
+
"type": "integer",
|
|
1976
|
+
"minimum": 1
|
|
1977
|
+
}
|
|
1978
|
+
},
|
|
1979
|
+
"additionalProperties": true
|
|
1980
|
+
},
|
|
1981
|
+
"workflowStalled": {
|
|
1982
|
+
"type": "object",
|
|
1983
|
+
"description": "Emitted when the engine detects a stalled run (no progress for N seconds).",
|
|
1984
|
+
"properties": {
|
|
1985
|
+
"stalledForMs": {
|
|
1986
|
+
"type": "integer",
|
|
1987
|
+
"minimum": 0
|
|
1988
|
+
},
|
|
1989
|
+
"lastNodeId": {
|
|
1990
|
+
"type": "string"
|
|
1991
|
+
}
|
|
1992
|
+
},
|
|
1993
|
+
"additionalProperties": true
|
|
1994
|
+
},
|
|
1995
|
+
"capBreached": {
|
|
1996
|
+
"type": "object",
|
|
1997
|
+
"description": "Emitted when a CapabilityLimit is exceeded. Protocol-level limits use the engine kinds (clarificationRounds / schemaRounds / envelopesPerTurn / maxNodeExecutions). RFC 0008 \u00a7K WASM-runtime caps use the wasm-* kinds (memory ceiling, fuel exhaustion, execution-time wall-clock). RFC 0058 run-execution bounds use the run-scoped run-duration (wall-clock timeout; limit=resolvedMs, observed=elapsedMs) and loop-iterations (agent-loop ceiling; limit=resolvedMax, observed=iterationCount) kinds.",
|
|
1998
|
+
"required": [
|
|
1999
|
+
"kind",
|
|
2000
|
+
"limit",
|
|
2001
|
+
"observed"
|
|
2002
|
+
],
|
|
2003
|
+
"properties": {
|
|
2004
|
+
"kind": {
|
|
2005
|
+
"type": "string",
|
|
2006
|
+
"enum": [
|
|
2007
|
+
"clarification",
|
|
2008
|
+
"schema",
|
|
2009
|
+
"envelopes",
|
|
2010
|
+
"node-executions",
|
|
2011
|
+
"wasm-memory",
|
|
2012
|
+
"wasm-fuel",
|
|
2013
|
+
"wasm-execution-time",
|
|
2014
|
+
"run-duration",
|
|
2015
|
+
"loop-iterations",
|
|
2016
|
+
"budget-tokens",
|
|
2017
|
+
"budget-cost",
|
|
2018
|
+
"budget-tool-calls",
|
|
2019
|
+
"budget-retries"
|
|
2020
|
+
]
|
|
2021
|
+
},
|
|
2022
|
+
"limit": {
|
|
2023
|
+
"type": "number",
|
|
2024
|
+
"minimum": 0,
|
|
2025
|
+
"description": "The effective ceiling. A whole number for the engine/WASM/RFC 0058 integer kinds; a fractional value for budget-cost (dollars, matching budget.exhausted + maxCostUsd \u2014 RFC 0084 \u00a7D)."
|
|
2026
|
+
},
|
|
2027
|
+
"observed": {
|
|
2028
|
+
"type": "number",
|
|
2029
|
+
"minimum": 0,
|
|
2030
|
+
"description": "The observed value at breach. Same numeric domain as limit for the kind."
|
|
2031
|
+
},
|
|
2032
|
+
"nodeId": {
|
|
2033
|
+
"type": "string"
|
|
2034
|
+
}
|
|
2035
|
+
},
|
|
2036
|
+
"additionalProperties": true
|
|
2037
|
+
},
|
|
2038
|
+
"leaseLifecycle": {
|
|
2039
|
+
"type": "object",
|
|
2040
|
+
"description": "Shared payload for lease.acquired / lease.renewed / lease.lost.",
|
|
2041
|
+
"required": [
|
|
2042
|
+
"leaseId",
|
|
2043
|
+
"host"
|
|
2044
|
+
],
|
|
2045
|
+
"properties": {
|
|
2046
|
+
"leaseId": {
|
|
2047
|
+
"type": "string",
|
|
2048
|
+
"minLength": 1
|
|
2049
|
+
},
|
|
2050
|
+
"host": {
|
|
2051
|
+
"type": "string",
|
|
2052
|
+
"enum": [
|
|
2053
|
+
"browser",
|
|
2054
|
+
"cloud"
|
|
2055
|
+
]
|
|
2056
|
+
},
|
|
2057
|
+
"instanceId": {
|
|
2058
|
+
"type": "string"
|
|
2059
|
+
},
|
|
2060
|
+
"expiresAt": {
|
|
2061
|
+
"type": "string",
|
|
2062
|
+
"format": "date-time"
|
|
2063
|
+
},
|
|
2064
|
+
"previousHost": {
|
|
2065
|
+
"type": "string",
|
|
2066
|
+
"enum": [
|
|
2067
|
+
"browser",
|
|
2068
|
+
"cloud"
|
|
2069
|
+
]
|
|
2070
|
+
}
|
|
2071
|
+
},
|
|
2072
|
+
"additionalProperties": true
|
|
2073
|
+
},
|
|
2074
|
+
"leaseHandedOff": {
|
|
2075
|
+
"type": "object",
|
|
2076
|
+
"description": "Emitted when a run's executing lease is transferred from one host to another (e.g., browser \u2192 cloud failover).",
|
|
2077
|
+
"required": [
|
|
2078
|
+
"leaseId",
|
|
2079
|
+
"fromHost",
|
|
2080
|
+
"toHost"
|
|
2081
|
+
],
|
|
2082
|
+
"properties": {
|
|
2083
|
+
"leaseId": {
|
|
2084
|
+
"type": "string",
|
|
2085
|
+
"minLength": 1
|
|
2086
|
+
},
|
|
2087
|
+
"fromHost": {
|
|
2088
|
+
"type": "string",
|
|
2089
|
+
"enum": [
|
|
2090
|
+
"browser",
|
|
2091
|
+
"cloud"
|
|
2092
|
+
]
|
|
2093
|
+
},
|
|
2094
|
+
"toHost": {
|
|
2095
|
+
"type": "string",
|
|
2096
|
+
"enum": [
|
|
2097
|
+
"browser",
|
|
2098
|
+
"cloud"
|
|
2099
|
+
]
|
|
2100
|
+
},
|
|
2101
|
+
"reason": {
|
|
2102
|
+
"type": "string"
|
|
2103
|
+
}
|
|
2104
|
+
},
|
|
2105
|
+
"additionalProperties": true
|
|
2106
|
+
},
|
|
2107
|
+
"replayDivergedAtRefusal": {
|
|
2108
|
+
"type": "object",
|
|
2109
|
+
"description": "RFC 0041 \u00a7B \u2014 emitted by `:fork` mode `replay` when the replay's LLM call returns a refusal but the original run got a valid envelope (or vice-versa: the original refused, the replay succeeded). Distinct from the generic `replay.diverged` event (which covers structural output/missing/extra/type-mismatch divergence) to let operators audit safety-policy shifts without filtering through the generic divergence stream. When this event fires, the host MUST also fail the replay with `error.code: \"replay_diverged_at_refusal\"` per `spec/v1/rest-endpoints.md` \u00a7\"Common error codes\". Capability-gated on `capabilities.multiAgent.executionModel.replayDeterminism.refusalDivergenceEmission: true`; non-Phase-4 hosts MUST NOT emit this event.",
|
|
2110
|
+
"required": [
|
|
2111
|
+
"sourceRunId",
|
|
2112
|
+
"atSequence",
|
|
2113
|
+
"originalEnvelopeKind",
|
|
2114
|
+
"replayEnvelopeKind"
|
|
2115
|
+
],
|
|
2116
|
+
"properties": {
|
|
2117
|
+
"sourceRunId": {
|
|
2118
|
+
"type": "string",
|
|
2119
|
+
"minLength": 1,
|
|
2120
|
+
"description": "The original run's runId (the source of the replay)."
|
|
2121
|
+
},
|
|
2122
|
+
"atSequence": {
|
|
2123
|
+
"type": "integer",
|
|
2124
|
+
"minimum": 0,
|
|
2125
|
+
"description": "Event-log index at which the refusal-divergence was detected (the index of the LLM call whose envelope shifted)."
|
|
2126
|
+
},
|
|
2127
|
+
"originalEventId": {
|
|
2128
|
+
"type": "string",
|
|
2129
|
+
"description": "Optional eventId of the original event whose envelope is being compared. SHOULD be set when the host has a stable identifier for the event; MAY be omitted when only the sequence index is known."
|
|
2130
|
+
},
|
|
2131
|
+
"nodeId": {
|
|
2132
|
+
"type": "string",
|
|
2133
|
+
"minLength": 1,
|
|
2134
|
+
"description": "ID of the node whose LLM call diverged. Operators use this to localize the safety-policy shift in the workflow definition."
|
|
2135
|
+
},
|
|
2136
|
+
"originalEnvelopeKind": {
|
|
2137
|
+
"type": "string",
|
|
2138
|
+
"enum": [
|
|
2139
|
+
"valid",
|
|
2140
|
+
"refusal"
|
|
2141
|
+
],
|
|
2142
|
+
"description": "Whether the original run's LLM envelope was a valid response or a refusal."
|
|
2143
|
+
},
|
|
2144
|
+
"replayEnvelopeKind": {
|
|
2145
|
+
"type": "string",
|
|
2146
|
+
"enum": [
|
|
2147
|
+
"valid",
|
|
2148
|
+
"refusal"
|
|
2149
|
+
],
|
|
2150
|
+
"description": "Whether the replay's LLM envelope was a valid response or a refusal. MUST differ from `originalEnvelopeKind` \u2014 otherwise there is no divergence to report."
|
|
2151
|
+
},
|
|
2152
|
+
"refusalReason": {
|
|
2153
|
+
"type": "string",
|
|
2154
|
+
"description": "Provider-supplied refusal reason when available (e.g., the model's `refusal` field on a chat-completion response). OPTIONAL; hosts MAY include for operator triage but MUST redact provider-specific identifiers per `SECURITY/threat-model-secret-leakage.md`."
|
|
2155
|
+
}
|
|
2156
|
+
},
|
|
2157
|
+
"additionalProperties": false
|
|
2158
|
+
},
|
|
2159
|
+
"replayDiverged": {
|
|
2160
|
+
"type": "object",
|
|
2161
|
+
"description": "Emitted by `:fork` when a replay re-execution produces a different output than the original at a given sequence. See replay.md \u00a7divergence detection. `divergencePoint` (RFC 0027 \u00a7F) is the canonical optional field for naming which event-emission diverged; the two fields are complementary, not mutually exclusive.",
|
|
2162
|
+
"required": [
|
|
2163
|
+
"sourceRunId",
|
|
2164
|
+
"atSequence"
|
|
2165
|
+
],
|
|
2166
|
+
"properties": {
|
|
2167
|
+
"sourceRunId": {
|
|
2168
|
+
"type": "string",
|
|
2169
|
+
"minLength": 1
|
|
2170
|
+
},
|
|
2171
|
+
"atSequence": {
|
|
2172
|
+
"type": "integer",
|
|
2173
|
+
"minimum": 0
|
|
2174
|
+
},
|
|
2175
|
+
"originalEventId": {
|
|
2176
|
+
"type": "string"
|
|
2177
|
+
},
|
|
2178
|
+
"divergenceKind": {
|
|
2179
|
+
"type": "string",
|
|
2180
|
+
"enum": [
|
|
2181
|
+
"output",
|
|
2182
|
+
"missing",
|
|
2183
|
+
"extra",
|
|
2184
|
+
"type-mismatch"
|
|
2185
|
+
]
|
|
2186
|
+
},
|
|
2187
|
+
"divergencePoint": {
|
|
2188
|
+
"type": "string",
|
|
2189
|
+
"description": "RFC 0027 \u00a7F. Verbatim `RunEventType` enum string identifying which event-emission the replay diverged at (e.g., `\"prompt.composed\"` per RFC 0027, `\"agent.promptResolved\"` per RFC 0029, `\"envelope.retry.exhausted\"` / `\"envelope.recovery.applied\"` per RFC 0032). Set when divergence is detected on a specific cross-kind operational event's payload. When divergence is purely structural (output/missing/extra at the event-array level rather than within a typed payload), `divergenceKind` carries the shape and `divergencePoint` MAY be omitted. The two fields are complementary: a single `replay.diverged` event MAY carry both (e.g., `{ divergenceKind: \"output\", divergencePoint: \"prompt.composed\" }` reads as \"the `prompt.composed` event at sequence N had a different output on replay than the original\"). The field is defined by RFC 0027; values are contributed by consuming RFCs (0029 adds `agent.promptResolved`, 0032 adds the envelope-reliability event names)."
|
|
2190
|
+
}
|
|
2191
|
+
},
|
|
2192
|
+
"additionalProperties": true
|
|
2193
|
+
},
|
|
2194
|
+
"agentReasoned": {
|
|
2195
|
+
"type": "object",
|
|
2196
|
+
"description": "Multi-Agent Shift Phase 1. Emitted when an agent produces a reasoning trace (typically pre-tool-call, pre-decision, or pre-handoff). The reasoning text MAY be a summary or full trace depending on the run's resolved `RunOptions.configurable.reasoningVerbosity`. Replay-deterministic over the event log.",
|
|
2197
|
+
"required": [
|
|
2198
|
+
"agentId",
|
|
2199
|
+
"reasoning"
|
|
2200
|
+
],
|
|
2201
|
+
"properties": {
|
|
2202
|
+
"agentId": {
|
|
2203
|
+
"type": "string",
|
|
2204
|
+
"minLength": 3,
|
|
2205
|
+
"maxLength": 256,
|
|
2206
|
+
"description": "AgentRef.agentId of the reasoning agent."
|
|
2207
|
+
},
|
|
2208
|
+
"reasoning": {
|
|
2209
|
+
"type": "string",
|
|
2210
|
+
"description": "Reasoning text. Bounded by `capabilities.agents.reasoning.tokenLimit` when verbosity is `summary` (default 512 tokens)."
|
|
2211
|
+
},
|
|
2212
|
+
"verbosity": {
|
|
2213
|
+
"type": "string",
|
|
2214
|
+
"enum": [
|
|
2215
|
+
"summary",
|
|
2216
|
+
"full",
|
|
2217
|
+
"off"
|
|
2218
|
+
],
|
|
2219
|
+
"description": "Verbosity mode this trace was produced under. Hosts MAY emit `'off'` to record the suppression decision without payload content."
|
|
2220
|
+
},
|
|
2221
|
+
"causationHostId": {
|
|
2222
|
+
"type": "string",
|
|
2223
|
+
"minLength": 1,
|
|
2224
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2225
|
+
}
|
|
2226
|
+
},
|
|
2227
|
+
"additionalProperties": true
|
|
2228
|
+
},
|
|
2229
|
+
"agentReasoningDelta": {
|
|
2230
|
+
"type": "object",
|
|
2231
|
+
"description": "RFC 0024. Incremental reasoning chunk for live-streaming UX. Emitted while a reasoning block is still open, BEFORE the corresponding `agent.reasoned` finalization. Consumers concatenate `delta` strings in arrival order to reconstruct the in-progress trace; the closing `agent.reasoned` event carries the FULL authoritative `reasoning`. Gated on `capabilities.agents.reasoning.streaming: true`. NOTE: `additionalProperties: true` mirrors the Phase-1 multi-agent-shift carve-out applied to the sibling `agentReasoned` schema \u2014 a deliberate forward-compat exception per RFC 0024 \u00a7Compatibility, not a precedent generalizable to other event payloads.",
|
|
2232
|
+
"required": [
|
|
2233
|
+
"agentId",
|
|
2234
|
+
"delta",
|
|
2235
|
+
"sequence"
|
|
2236
|
+
],
|
|
2237
|
+
"properties": {
|
|
2238
|
+
"agentId": {
|
|
2239
|
+
"type": "string",
|
|
2240
|
+
"minLength": 3,
|
|
2241
|
+
"maxLength": 256,
|
|
2242
|
+
"description": "AgentRef.agentId of the reasoning agent. MUST match the eventual closing `agent.reasoned`."
|
|
2243
|
+
},
|
|
2244
|
+
"delta": {
|
|
2245
|
+
"type": "string",
|
|
2246
|
+
"description": "New reasoning content since the previous delta event in this block (or since block open, if `sequence` is 0)."
|
|
2247
|
+
},
|
|
2248
|
+
"sequence": {
|
|
2249
|
+
"type": "integer",
|
|
2250
|
+
"minimum": 0,
|
|
2251
|
+
"description": "Monotonically-increasing index within the current reasoning block. Starts at 0 for the first delta in a block; resets at each new block open. Consumers MAY use this to detect dropped events."
|
|
2252
|
+
},
|
|
2253
|
+
"verbosity": {
|
|
2254
|
+
"type": "string",
|
|
2255
|
+
"enum": [
|
|
2256
|
+
"summary",
|
|
2257
|
+
"full",
|
|
2258
|
+
"off"
|
|
2259
|
+
],
|
|
2260
|
+
"description": "Verbosity mode the host resolved for this block. SHOULD match the verbosity reported on the closing `agent.reasoned`."
|
|
2261
|
+
}
|
|
2262
|
+
},
|
|
2263
|
+
"additionalProperties": true
|
|
2264
|
+
},
|
|
2265
|
+
"providerUsage": {
|
|
2266
|
+
"type": "object",
|
|
2267
|
+
"description": "RFC 0026. Per-call usage record emitted after every LLM provider invocation. Durably persisted in the run event log; consumed by replay, webhook subscribers, billing reconciliation. The OTel `openwop.cost.*` attribute group (per `observability.md \u00a7\"Cost attribution attributes\"`) is the observability sibling \u2014 this event type is the durable record. Replay determinism: `inputTokens` + `outputTokens` MUST replay identically; `costEstimateUsd` MAY be omitted on replay, and so MAY the RFC 0116 cost-only `cacheReadTokens`/`cacheWriteTokens` (they are NOT replay-asserted \u2014 a prompt-prefix cache hit vs miss MUST NOT change `inputTokens`/`outputTokens` or the recorded envelope). The payload MUST NOT carry credentialRefs, hashed credential identifiers, or prompt/response substrings per `SECURITY/threat-model-secret-leakage.md \u00a7SR-1` (enforced by SECURITY invariant `provider-usage-no-credential-leak`).",
|
|
2268
|
+
"required": [
|
|
2269
|
+
"provider",
|
|
2270
|
+
"model",
|
|
2271
|
+
"inputTokens",
|
|
2272
|
+
"outputTokens"
|
|
2273
|
+
],
|
|
2274
|
+
"properties": {
|
|
2275
|
+
"provider": {
|
|
2276
|
+
"type": "string",
|
|
2277
|
+
"minLength": 1,
|
|
2278
|
+
"description": "Canonical provider id (lowercase ASCII, e.g. \"anthropic\", \"openai\", \"google\"). Same value as the `openwop.cost.provider` OTel attribute."
|
|
2279
|
+
},
|
|
2280
|
+
"model": {
|
|
2281
|
+
"type": "string",
|
|
2282
|
+
"minLength": 1,
|
|
2283
|
+
"description": "Provider-stamped model id as the model expects it. Same value used in the LLM cache-key recipe per `replay.md \u00a7A`."
|
|
2284
|
+
},
|
|
2285
|
+
"inputTokens": {
|
|
2286
|
+
"type": "integer",
|
|
2287
|
+
"minimum": 0,
|
|
2288
|
+
"description": "Input/prompt tokens billed for this call. Matches the provider response's input-token count verbatim."
|
|
2289
|
+
},
|
|
2290
|
+
"outputTokens": {
|
|
2291
|
+
"type": "integer",
|
|
2292
|
+
"minimum": 0,
|
|
2293
|
+
"description": "Output/completion tokens billed for this call. Matches the provider response's output-token count verbatim."
|
|
2294
|
+
},
|
|
2295
|
+
"totalTokens": {
|
|
2296
|
+
"type": "integer",
|
|
2297
|
+
"minimum": 0,
|
|
2298
|
+
"description": "Convenience sum (inputTokens + outputTokens). Consumers MAY compute themselves; emitters MAY include for readability."
|
|
2299
|
+
},
|
|
2300
|
+
"costEstimateUsd": {
|
|
2301
|
+
"type": "number",
|
|
2302
|
+
"minimum": 0,
|
|
2303
|
+
"description": "ADVISORY estimate in USD computed by the host's static rate table. MUST NOT be used for billing \u2014 real billing is external. Hosts SHOULD omit when no rate is known rather than emit 0."
|
|
2304
|
+
},
|
|
2305
|
+
"currency": {
|
|
2306
|
+
"type": "string",
|
|
2307
|
+
"pattern": "^[A-Z]{3}$",
|
|
2308
|
+
"description": "ISO 4217 code when `costEstimateUsd` is non-USD; the field name stays `costEstimateUsd` for back-compat but `currency` overrides the implied denomination."
|
|
2309
|
+
},
|
|
2310
|
+
"cacheHit": {
|
|
2311
|
+
"type": "boolean",
|
|
2312
|
+
"description": "True iff this call was served from the LLM response cache per `replay.md \u00a7\"LLM cache-key recipe\"`. When true, inputTokens/outputTokens reflect the ORIGINAL call's billed values; the cached invocation incurred zero new provider cost."
|
|
2313
|
+
},
|
|
2314
|
+
"cacheReadTokens": {
|
|
2315
|
+
"type": "integer",
|
|
2316
|
+
"minimum": 0,
|
|
2317
|
+
"description": "RFC 0116. Optional, cost-only. Provider-reported tokens served from the prompt-prefix context cache on this call \u2014 a cache HIT shows > 0. This is a cost hint, NOT a semantic input: it MAY be omitted on replay (NOT replay-asserted, like `costEstimateUsd`), and a hit-vs-miss difference MUST NOT change `inputTokens`/`outputTokens` or the recorded envelope (RFC 0116 replay-invariance MUST). MUST NOT carry prompt/response substrings per `SECURITY/threat-model-secret-leakage.md \u00a7SR-1`."
|
|
2318
|
+
},
|
|
2319
|
+
"cacheWriteTokens": {
|
|
2320
|
+
"type": "integer",
|
|
2321
|
+
"minimum": 0,
|
|
2322
|
+
"description": "RFC 0116. Optional, cost-only. Provider-reported tokens written to the prompt-prefix context cache on this call (a cache PRIME). MAY be omitted on replay (NOT replay-asserted). MUST NOT change `inputTokens`/`outputTokens` or the recorded envelope, and MUST NOT carry prompt/response substrings (SR-1)."
|
|
2323
|
+
},
|
|
2324
|
+
"nodeId": {
|
|
2325
|
+
"type": "string",
|
|
2326
|
+
"description": "The node id that initiated the provider call. Required for per-node cost attribution dashboards."
|
|
2327
|
+
},
|
|
2328
|
+
"traceId": {
|
|
2329
|
+
"type": "string",
|
|
2330
|
+
"description": "OTel trace id linking this event to the matching `openwop.cost.*` span. Lets observability backends correlate event-log entries with traces."
|
|
2331
|
+
}
|
|
2332
|
+
},
|
|
2333
|
+
"additionalProperties": false
|
|
2334
|
+
},
|
|
2335
|
+
"promptComposed": {
|
|
2336
|
+
"type": "object",
|
|
2337
|
+
"description": "RFC 0027. Emitted once per (nodeId, kind) composition when a host resolves a PromptRef on a node and assembles its body for an LLM call. Gated on `capabilities.prompts.supported: true` AND `capabilities.prompts.observability !== 'off'`. Body fields (`systemPrompt`, `userPrompt`, `variableBindings`) are populated only under `observability: 'full'`; under `hashed` the event carries only `hash` + `variableHashes`. Replay-deterministic over `(refs, variableHashes, contentTrust)` per `spec/v1/prompts.md \u00a7\"Replay determinism\"`. Secret-source variable values MUST be replaced with `[REDACTED:<secretId>]` markers per SECURITY invariant `prompt-composed-secret-redaction`; untrusted-input segments MUST be wrapped with `<UNTRUSTED>...</UNTRUSTED>` markers per SECURITY invariant `prompt-composed-trust-marker`.",
|
|
2338
|
+
"required": [
|
|
2339
|
+
"nodeId",
|
|
2340
|
+
"refs",
|
|
2341
|
+
"kind",
|
|
2342
|
+
"hash"
|
|
2343
|
+
],
|
|
2344
|
+
"properties": {
|
|
2345
|
+
"nodeId": {
|
|
2346
|
+
"type": "string",
|
|
2347
|
+
"description": "Lifted to top-level RunEventDoc.nodeId; mirrored here for self-contained payload validation."
|
|
2348
|
+
},
|
|
2349
|
+
"refs": {
|
|
2350
|
+
"type": "array",
|
|
2351
|
+
"items": {
|
|
2352
|
+
"type": "string",
|
|
2353
|
+
"pattern": "^prompt:[a-z0-9][a-z0-9._-]{0,127}(@\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?)?$"
|
|
2354
|
+
},
|
|
2355
|
+
"description": "Ordered list of PromptRef values (stringy form) that contributed to this composition: typically system, then user, then any few-shot or schema-hint additions. Object-form refs are projected to their stringy equivalent for stability."
|
|
2356
|
+
},
|
|
2357
|
+
"kind": {
|
|
2358
|
+
"type": "string",
|
|
2359
|
+
"enum": [
|
|
2360
|
+
"system+user",
|
|
2361
|
+
"system-only",
|
|
2362
|
+
"user-only",
|
|
2363
|
+
"agent-reasoning"
|
|
2364
|
+
],
|
|
2365
|
+
"description": "Composition shape \u2014 what the host actually assembled. `system+user`: both system and user templates resolved. `system-only`: only a system template applied (e.g., agent intrinsic). `user-only`: only a user template applied. `agent-reasoning`: composition was emitted ahead of an agent reasoning trace per RFC 0024."
|
|
2366
|
+
},
|
|
2367
|
+
"hash": {
|
|
2368
|
+
"type": "string",
|
|
2369
|
+
"pattern": "^sha256:[0-9a-f]{64}$",
|
|
2370
|
+
"description": "SHA-256 of the composed body (post-substitution, post-redaction). Stable across replay. Always present, including under observability=hashed."
|
|
2371
|
+
},
|
|
2372
|
+
"composed": {
|
|
2373
|
+
"type": "string",
|
|
2374
|
+
"description": "Generic composed-body field. Present only when `capabilities.prompts.observability` is `full`. Populated for ALL four PromptKind values (system / user / few-shot / schema-hint) so consumers have a single body field to read \u2014 necessary for few-shot + schema-hint templates that don't fit the system/user split below. Same secret-redaction + trust-marker invariants apply as for the kind-specific fields. The kind-specific `systemPrompt` + `userPrompt` fields below remain populated for system/user kinds so existing consumers that key off them continue to work; both fields carry identical content for those kinds."
|
|
2375
|
+
},
|
|
2376
|
+
"systemPrompt": {
|
|
2377
|
+
"type": "string",
|
|
2378
|
+
"description": "Composed system prompt body. Present only when `capabilities.prompts.observability` is `full` AND template `kind: \"system\"`. Secret-sourced variable values MUST be replaced with `[REDACTED:<secretId>]` markers. Untrusted-content `<UNTRUSTED>...</UNTRUSTED>` markers MUST be preserved verbatim. Identical to `composed` when present."
|
|
2379
|
+
},
|
|
2380
|
+
"userPrompt": {
|
|
2381
|
+
"type": "string",
|
|
2382
|
+
"description": "Composed user prompt body. Same presence + redaction rules as `systemPrompt`."
|
|
2383
|
+
},
|
|
2384
|
+
"variableBindings": {
|
|
2385
|
+
"type": "object",
|
|
2386
|
+
"additionalProperties": true,
|
|
2387
|
+
"description": "Variable-name \u2192 bound-value map. Secret-source bindings MUST appear as `[REDACTED:<secretId>]`. Only present under `observability: 'full'`."
|
|
2388
|
+
},
|
|
2389
|
+
"variableHashes": {
|
|
2390
|
+
"type": "object",
|
|
2391
|
+
"additionalProperties": {
|
|
2392
|
+
"type": "string",
|
|
2393
|
+
"pattern": "^sha256:[0-9a-f]{64}$"
|
|
2394
|
+
},
|
|
2395
|
+
"description": "Variable-name \u2192 sha256(value) map. Always present (under both `hashed` and `full`). Enables replay-determinism checks without exposing values."
|
|
2396
|
+
},
|
|
2397
|
+
"contentTrust": {
|
|
2398
|
+
"type": "string",
|
|
2399
|
+
"enum": [
|
|
2400
|
+
"trusted",
|
|
2401
|
+
"untrusted"
|
|
2402
|
+
],
|
|
2403
|
+
"description": "Aggregate trust marker. `untrusted` iff ANY contributing input was tagged untrusted per RFC 0020 \u00a7D / AIEnvelope.meta.contentTrust propagation. When `untrusted`, the composed bodies MUST contain `<UNTRUSTED>...</UNTRUSTED>` markers around the untrusted segments."
|
|
2404
|
+
},
|
|
2405
|
+
"causationHostId": {
|
|
2406
|
+
"type": "string",
|
|
2407
|
+
"minLength": 1,
|
|
2408
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2409
|
+
}
|
|
2410
|
+
},
|
|
2411
|
+
"additionalProperties": false
|
|
2412
|
+
},
|
|
2413
|
+
"agentPromptResolved": {
|
|
2414
|
+
"type": "object",
|
|
2415
|
+
"description": "RFC 0029 \u00a7B. Emitted once per (nodeId, kind) pair BEFORE the corresponding `prompt.composed` event (when emitted). Surfaces the four-layer resolution chain per `spec/v1/prompts.md` \u00a7\"Resolution chain (normative)\" so cross-host debuggers and multi-agent visualizers can render which PromptRef applied at this node and why. Gated on `capabilities.prompts.supported: true`; payload is durable in the event log and participates in replay. Carries refs (not bodies), so emission is safe regardless of `capabilities.prompts.observability` \u2014 the secret-redaction + trust-marker invariants on `prompt.composed` (RFC 0027 \u00a7G) don't apply here.",
|
|
2416
|
+
"required": [
|
|
2417
|
+
"nodeId",
|
|
2418
|
+
"kind",
|
|
2419
|
+
"chain",
|
|
2420
|
+
"resolved"
|
|
2421
|
+
],
|
|
2422
|
+
"properties": {
|
|
2423
|
+
"nodeId": {
|
|
2424
|
+
"type": "string",
|
|
2425
|
+
"description": "Lifted to top-level RunEventDoc.nodeId; mirrored here for self-contained payload validation."
|
|
2426
|
+
},
|
|
2427
|
+
"kind": {
|
|
2428
|
+
"$ref": "./prompt-kind.schema.json"
|
|
2429
|
+
},
|
|
2430
|
+
"agentId": {
|
|
2431
|
+
"type": "string",
|
|
2432
|
+
"description": "AgentManifest.agentId when the node has `config.agentId` set; omitted otherwise."
|
|
2433
|
+
},
|
|
2434
|
+
"chain": {
|
|
2435
|
+
"type": "array",
|
|
2436
|
+
"description": "Ordered traversal of the four normative resolution layers. Hosts MUST emit one entry per layer attempted; skipped layers produce an entry with `applied: false` and `reason: \"...\"` describing why (e.g., `\"agentId unresolved\"`, `\"no candidate at this layer\"`, `\"superseded by node-config layer\"`).",
|
|
2437
|
+
"items": {
|
|
2438
|
+
"type": "object",
|
|
2439
|
+
"additionalProperties": false,
|
|
2440
|
+
"required": [
|
|
2441
|
+
"layer",
|
|
2442
|
+
"applied"
|
|
2443
|
+
],
|
|
2444
|
+
"properties": {
|
|
2445
|
+
"layer": {
|
|
2446
|
+
"type": "string",
|
|
2447
|
+
"enum": [
|
|
2448
|
+
"run-configurable",
|
|
2449
|
+
"node",
|
|
2450
|
+
"agent-intrinsic",
|
|
2451
|
+
"agent-overrides",
|
|
2452
|
+
"agent-library-default",
|
|
2453
|
+
"workflow-defaults",
|
|
2454
|
+
"host-defaults"
|
|
2455
|
+
],
|
|
2456
|
+
"description": "Identifies which precedence layer this chain entry represents. The four normative layers per RFC 0029 \u00a7A are `node`, `agent-*`, `workflow-defaults`, `host-defaults`. `run-configurable` is reserved for the optional `RunOptions.configurable.promptOverrides` extension described in RFC 0029 \u00a7\"Alternatives considered\" #5; hosts that honor that extension MUST emit a chain entry with this layer value above the `node` entry."
|
|
2457
|
+
},
|
|
2458
|
+
"source": {
|
|
2459
|
+
"type": "string",
|
|
2460
|
+
"description": "The PromptRef stringy form this layer would have applied (e.g., `prompt:writer@1.0.0`). Object-form refs are projected to their stringy equivalent for stability. Present only when this layer had a candidate."
|
|
2461
|
+
},
|
|
2462
|
+
"applied": {
|
|
2463
|
+
"type": "boolean",
|
|
2464
|
+
"description": "True for exactly one entry in the chain \u2014 the layer whose ref was selected. False for layers that yielded null OR were skipped after a higher-precedence layer already applied."
|
|
2465
|
+
},
|
|
2466
|
+
"reason": {
|
|
2467
|
+
"type": "string",
|
|
2468
|
+
"description": "Non-normative human-readable explanation. Hosts MAY omit; clients MUST tolerate absence."
|
|
2469
|
+
}
|
|
2470
|
+
}
|
|
2471
|
+
}
|
|
2472
|
+
},
|
|
2473
|
+
"resolved": {
|
|
2474
|
+
"type": [
|
|
2475
|
+
"string",
|
|
2476
|
+
"null"
|
|
2477
|
+
],
|
|
2478
|
+
"description": "The winning PromptRef in stringy form (`prompt:templateId@version`), or null if no layer yielded a candidate. Mirrors the `chain[].source` whose `applied: true` when present."
|
|
2479
|
+
},
|
|
2480
|
+
"causationHostId": {
|
|
2481
|
+
"type": "string",
|
|
2482
|
+
"minLength": 1,
|
|
2483
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2484
|
+
}
|
|
2485
|
+
},
|
|
2486
|
+
"additionalProperties": false
|
|
2487
|
+
},
|
|
2488
|
+
"modelCapabilitySubstituted": {
|
|
2489
|
+
"type": "object",
|
|
2490
|
+
"additionalProperties": false,
|
|
2491
|
+
"description": "RFC 0031 \u00a7D. Emitted when a host substitutes the active model with a NodeModule's declared `fallbackModel` because the active model lacks one or more of the `requiredModelCapabilities`. MUST event per RFC 0031 \u00a7B step 3. The `fallbackProvider` + `fallbackModel` pair MAY be redacted as all-or-nothing `\"[REDACTED]\"` when workspace policy treats multi-vendor posture as confidential per SECURITY invariant `model-capability-substituted-no-credential-disclosure`. The other fields are not redactable \u2014 `originalProvider` is already public via `RunOptions.configurable.ai.provider`, and `nodeId` / `missingCapabilities` carry no provider-possession information.",
|
|
2492
|
+
"required": [
|
|
2493
|
+
"nodeId",
|
|
2494
|
+
"originalProvider",
|
|
2495
|
+
"originalModel",
|
|
2496
|
+
"fallbackProvider",
|
|
2497
|
+
"fallbackModel",
|
|
2498
|
+
"missingCapabilities"
|
|
2499
|
+
],
|
|
2500
|
+
"properties": {
|
|
2501
|
+
"nodeId": {
|
|
2502
|
+
"type": "string",
|
|
2503
|
+
"description": "The node whose dispatch triggered the substitution."
|
|
2504
|
+
},
|
|
2505
|
+
"originalProvider": {
|
|
2506
|
+
"type": "string",
|
|
2507
|
+
"description": "Provider id of the active model the host was about to use."
|
|
2508
|
+
},
|
|
2509
|
+
"originalModel": {
|
|
2510
|
+
"type": "string",
|
|
2511
|
+
"description": "Model id of the active model."
|
|
2512
|
+
},
|
|
2513
|
+
"fallbackProvider": {
|
|
2514
|
+
"type": "string",
|
|
2515
|
+
"description": "Provider id of the substitute model from `NodeModule.fallbackModel.provider`, or `\"[REDACTED]\"` when the host's workspace policy redacts multi-vendor posture."
|
|
2516
|
+
},
|
|
2517
|
+
"fallbackModel": {
|
|
2518
|
+
"type": "string",
|
|
2519
|
+
"description": "Model id of the substitute model from `NodeModule.fallbackModel.model`, or `\"[REDACTED]\"` when redacted (always paired all-or-nothing with `fallbackProvider`)."
|
|
2520
|
+
},
|
|
2521
|
+
"missingCapabilities": {
|
|
2522
|
+
"type": "array",
|
|
2523
|
+
"items": {
|
|
2524
|
+
"type": "string"
|
|
2525
|
+
},
|
|
2526
|
+
"uniqueItems": true,
|
|
2527
|
+
"description": "Subset of `NodeModule.requiredModelCapabilities` that the active model did not satisfy."
|
|
2528
|
+
}
|
|
2529
|
+
}
|
|
2530
|
+
},
|
|
2531
|
+
"modelCapabilityInsufficient": {
|
|
2532
|
+
"type": "object",
|
|
2533
|
+
"additionalProperties": false,
|
|
2534
|
+
"description": "RFC 0031 \u00a7D. Emitted when a host refuses to dispatch a NodeModule because the active model lacks declared `requiredModelCapabilities` AND no viable fallback is available (no `fallbackModel` declared, OR the host cannot authenticate to the fallback provider). MUST event per RFC 0031 \u00a7B step 4. Pairs with `RunSnapshot.error.code = \"capability_not_provided\"` per `capabilities.md` \u00a7\"Unsupported capability \u2014 refusal contract\". Recursive fallback is NOT permitted (RFC 0031 \u00a7\"Unresolved questions\" #3): if a host attempts substitution and the fallback itself fails, the host MUST emit this event with `fallbackAttempted: true` and refuse, not chain to another fallback.",
|
|
2535
|
+
"required": [
|
|
2536
|
+
"nodeId",
|
|
2537
|
+
"provider",
|
|
2538
|
+
"model",
|
|
2539
|
+
"missingCapabilities"
|
|
2540
|
+
],
|
|
2541
|
+
"properties": {
|
|
2542
|
+
"nodeId": {
|
|
2543
|
+
"type": "string",
|
|
2544
|
+
"description": "The node whose dispatch was refused."
|
|
2545
|
+
},
|
|
2546
|
+
"provider": {
|
|
2547
|
+
"type": "string",
|
|
2548
|
+
"description": "Provider id of the active model the host attempted to use."
|
|
2549
|
+
},
|
|
2550
|
+
"model": {
|
|
2551
|
+
"type": "string",
|
|
2552
|
+
"description": "Model id of the active model."
|
|
2553
|
+
},
|
|
2554
|
+
"missingCapabilities": {
|
|
2555
|
+
"type": "array",
|
|
2556
|
+
"items": {
|
|
2557
|
+
"type": "string"
|
|
2558
|
+
},
|
|
2559
|
+
"uniqueItems": true,
|
|
2560
|
+
"description": "Subset of `NodeModule.requiredModelCapabilities` that the active model did not satisfy."
|
|
2561
|
+
},
|
|
2562
|
+
"fallbackAttempted": {
|
|
2563
|
+
"type": "boolean",
|
|
2564
|
+
"default": false,
|
|
2565
|
+
"description": "True if the host attempted to authenticate to a declared `fallbackModel` and that attempt failed (e.g., no credential resolvable, or the fallback provider was outside `capabilities.aiProviders.supported`). False if no `fallbackModel` was declared on the NodeModule."
|
|
2566
|
+
}
|
|
2567
|
+
}
|
|
2568
|
+
},
|
|
2569
|
+
"envelopeRetryAttempted": {
|
|
2570
|
+
"type": "object",
|
|
2571
|
+
"additionalProperties": false,
|
|
2572
|
+
"description": "RFC 0032 \u00a7B.1. Emitted when a host retries an envelope emission after a parse or validation failure on a prior attempt. The first attempt does NOT emit this event; the second attempt emits with `attempt: 2`, etc. SHOULD-tier \u2014 hosts that don't implement retry don't emit; hosts that DO retry on validation failure SHOULD emit per attempt past the first.",
|
|
2573
|
+
"required": [
|
|
2574
|
+
"nodeId",
|
|
2575
|
+
"attempt",
|
|
2576
|
+
"reason"
|
|
2577
|
+
],
|
|
2578
|
+
"properties": {
|
|
2579
|
+
"nodeId": {
|
|
2580
|
+
"type": "string",
|
|
2581
|
+
"description": "The node whose envelope emission is being retried."
|
|
2582
|
+
},
|
|
2583
|
+
"attempt": {
|
|
2584
|
+
"type": "integer",
|
|
2585
|
+
"minimum": 1,
|
|
2586
|
+
"maximum": 16,
|
|
2587
|
+
"description": "1-indexed attempt counter. The first attempt does NOT emit this event; the second attempt emits with `attempt: 2`, etc."
|
|
2588
|
+
},
|
|
2589
|
+
"reason": {
|
|
2590
|
+
"type": "string",
|
|
2591
|
+
"anyOf": [
|
|
2592
|
+
{
|
|
2593
|
+
"enum": [
|
|
2594
|
+
"schema-violation",
|
|
2595
|
+
"truncation",
|
|
2596
|
+
"type-drift",
|
|
2597
|
+
"type-mismatch",
|
|
2598
|
+
"refusal",
|
|
2599
|
+
"parse-error",
|
|
2600
|
+
"unknown"
|
|
2601
|
+
]
|
|
2602
|
+
},
|
|
2603
|
+
{
|
|
2604
|
+
"pattern": "^x-host-[a-z][a-z0-9-]*-[a-z][a-z0-9-]*$"
|
|
2605
|
+
}
|
|
2606
|
+
],
|
|
2607
|
+
"description": "Why the prior attempt failed. Spec-reserved values: `schema-violation` (model emitted wrong-shape JSON; corrective fragment + retry per RFC 0033 \u00a7C), `truncation` (stop_reason: max_tokens; budget-double + retry per RFC 0033 \u00a7B), `type-drift` (envelope `type` discriminator drifted from what was advertised mid-run), `type-mismatch` (a typed payload field was emitted with the wrong runtime type \u2014 e.g., string where number was declared), `refusal` (provider safety-stop; NO retry per RFC 0032 \u00a7B.3), `parse-error` (response was not extractable as JSON even after lenient parsing), `unknown` (host could not classify). Host-private extensions MUST prefix with `x-host-<host>-` per `host-extensions.md` \u00a7\"Canonical-prefix table\"; matches the RFC 0031 \u00a7B `requiredModelCapabilities` precedent."
|
|
2608
|
+
},
|
|
2609
|
+
"previousError": {
|
|
2610
|
+
"type": [
|
|
2611
|
+
"string",
|
|
2612
|
+
"null"
|
|
2613
|
+
],
|
|
2614
|
+
"description": "Diagnostic text from the failing attempt. MUST NOT contain prompt or response substring excerpts; hosts SHOULD limit to validator output (e.g., \"required field 'steps' missing\"). Subject to SR-1 redaction per `ai-envelope.md` \u00a7\"Redaction (SR-1 carry-forward)\"."
|
|
2615
|
+
}
|
|
2616
|
+
}
|
|
2617
|
+
},
|
|
2618
|
+
"envelopeRetryExhausted": {
|
|
2619
|
+
"type": "object",
|
|
2620
|
+
"additionalProperties": false,
|
|
2621
|
+
"description": "RFC 0032 \u00a7B.2. Emitted when a host has exhausted its retry budget and is about to surface a terminal envelope failure to the node. MUST-tier \u2014 alternative is silent terminal failure with no event surface, leaving conformance suites unable to assert correct give-up behavior. Hosts that don't retry MUST still emit this event when an envelope attempt terminally fails (with `totalAttempts: 1`). Pairs with `cap.breached` when the failure mode is schema-violation or truncation per RFC 0033 \u00a7B + \u00a7C.",
|
|
2622
|
+
"required": [
|
|
2623
|
+
"nodeId",
|
|
2624
|
+
"totalAttempts",
|
|
2625
|
+
"finalReason"
|
|
2626
|
+
],
|
|
2627
|
+
"properties": {
|
|
2628
|
+
"nodeId": {
|
|
2629
|
+
"type": "string"
|
|
2630
|
+
},
|
|
2631
|
+
"totalAttempts": {
|
|
2632
|
+
"type": "integer",
|
|
2633
|
+
"minimum": 1
|
|
2634
|
+
},
|
|
2635
|
+
"finalReason": {
|
|
2636
|
+
"type": "string",
|
|
2637
|
+
"anyOf": [
|
|
2638
|
+
{
|
|
2639
|
+
"enum": [
|
|
2640
|
+
"schema-violation",
|
|
2641
|
+
"truncation",
|
|
2642
|
+
"type-drift",
|
|
2643
|
+
"type-mismatch",
|
|
2644
|
+
"refusal",
|
|
2645
|
+
"parse-error",
|
|
2646
|
+
"unknown"
|
|
2647
|
+
]
|
|
2648
|
+
},
|
|
2649
|
+
{
|
|
2650
|
+
"pattern": "^x-host-[a-z][a-z0-9-]*-[a-z][a-z0-9-]*$"
|
|
2651
|
+
}
|
|
2652
|
+
],
|
|
2653
|
+
"description": "Same value set as `envelope.retry.attempted.reason` (\u00a7B.1). Spec-reserved closed enum plus `x-host-<host>-` extensions."
|
|
2654
|
+
},
|
|
2655
|
+
"finalError": {
|
|
2656
|
+
"type": [
|
|
2657
|
+
"string",
|
|
2658
|
+
"null"
|
|
2659
|
+
],
|
|
2660
|
+
"description": "Diagnostic text from the final attempt. Same redaction discipline as `envelope.retry.attempted.previousError`."
|
|
2661
|
+
}
|
|
2662
|
+
}
|
|
2663
|
+
},
|
|
2664
|
+
"envelopeRefusal": {
|
|
2665
|
+
"type": "object",
|
|
2666
|
+
"additionalProperties": false,
|
|
2667
|
+
"description": "RFC 0032 \u00a7B.3. Emitted when the underlying LLM provider returns an explicit refusal (e.g., OpenAI `message.refusal`, Anthropic safety-stop, Gemini safety-block). MUST-tier. Hosts MUST NOT retry on refusal \u2014 retrying refusal with prompt mutation creates a circumvention concern (the host automatically searches for a prompt the model will accept, evading the safety filter's intent) per RFC 0032 \u00a7B.3 + RFC 0033 \u00a7D. The node MUST fail with `error.code = \"envelope_refusal\"` per RFC 0033 \u00a7F (renamed from `envelope_refused_by_provider` per the 2026-05-21 RFC adoption-feedback amendment).",
|
|
2668
|
+
"required": [
|
|
2669
|
+
"nodeId",
|
|
2670
|
+
"provider",
|
|
2671
|
+
"model"
|
|
2672
|
+
],
|
|
2673
|
+
"properties": {
|
|
2674
|
+
"nodeId": {
|
|
2675
|
+
"type": "string"
|
|
2676
|
+
},
|
|
2677
|
+
"provider": {
|
|
2678
|
+
"type": "string"
|
|
2679
|
+
},
|
|
2680
|
+
"model": {
|
|
2681
|
+
"type": "string"
|
|
2682
|
+
},
|
|
2683
|
+
"refusalText": {
|
|
2684
|
+
"type": [
|
|
2685
|
+
"string",
|
|
2686
|
+
"null"
|
|
2687
|
+
],
|
|
2688
|
+
"description": "Provider-returned refusal message, if any. MUST be passed through the host's BYOK redaction harness AND prompt-content redaction pipeline before emission (per SECURITY invariant `envelope-refusal-no-prompt-leak`). Provider safety-refusal messages can echo offending prompt substrings; emitting them verbatim would create a side channel for prompt-injection-attack telemetry exfiltration AND for SR-1 secret-leak. Replay consumers MUST tolerate `null` even when the original was non-null (host redaction policies legitimately tighten over time)."
|
|
2689
|
+
},
|
|
2690
|
+
"safetyCategory": {
|
|
2691
|
+
"type": [
|
|
2692
|
+
"string",
|
|
2693
|
+
"null"
|
|
2694
|
+
],
|
|
2695
|
+
"description": "Provider-specific safety category if available (e.g., Anthropic `harmful-content`, Gemini `SAFETY_BLOCK_HARASSMENT`, OpenAI `policy_violation`). Verbatim from provider; no normalization."
|
|
2696
|
+
}
|
|
2697
|
+
}
|
|
2698
|
+
},
|
|
2699
|
+
"envelopeTruncated": {
|
|
2700
|
+
"type": "object",
|
|
2701
|
+
"additionalProperties": false,
|
|
2702
|
+
"description": "RFC 0032 \u00a7B.4. Emitted when the LLM emission was cut off before the envelope was complete (typically `stop_reason: \"max_tokens\"`). SHOULD-tier \u2014 hosts that distinguish truncation from schema-violation per RFC 0033 \u00a7A MUST emit this event when truncation occurs. Hosts that conflate truncation with schema-violation (legacy behavior) MAY omit; they then fail RFC 0033 conformance.",
|
|
2703
|
+
"required": [
|
|
2704
|
+
"nodeId",
|
|
2705
|
+
"provider",
|
|
2706
|
+
"model",
|
|
2707
|
+
"stopReason"
|
|
2708
|
+
],
|
|
2709
|
+
"properties": {
|
|
2710
|
+
"nodeId": {
|
|
2711
|
+
"type": "string"
|
|
2712
|
+
},
|
|
2713
|
+
"provider": {
|
|
2714
|
+
"type": "string"
|
|
2715
|
+
},
|
|
2716
|
+
"model": {
|
|
2717
|
+
"type": "string"
|
|
2718
|
+
},
|
|
2719
|
+
"stopReason": {
|
|
2720
|
+
"type": "string",
|
|
2721
|
+
"enum": [
|
|
2722
|
+
"max_tokens",
|
|
2723
|
+
"length",
|
|
2724
|
+
"stop_sequence",
|
|
2725
|
+
"unknown"
|
|
2726
|
+
],
|
|
2727
|
+
"description": "Provider-normalized stop reason. `max_tokens` covers OpenAI `length` + Anthropic `max_tokens`; `length` preserved as a separate value for hosts that distinguish provider-side `length` (model self-determined length cap) from `max_tokens` (host-side budget cap)."
|
|
2728
|
+
},
|
|
2729
|
+
"partialPayloadAvailable": {
|
|
2730
|
+
"type": "boolean",
|
|
2731
|
+
"default": false,
|
|
2732
|
+
"description": "True if the host recovered a partial envelope before truncation. Hosts MAY use this signal to route to a recovery path (e.g., budget-doubled retry per RFC 0033 \u00a7B)."
|
|
2733
|
+
},
|
|
2734
|
+
"outputTokenCount": {
|
|
2735
|
+
"type": [
|
|
2736
|
+
"integer",
|
|
2737
|
+
"null"
|
|
2738
|
+
],
|
|
2739
|
+
"minimum": 0,
|
|
2740
|
+
"description": "Tokens emitted before truncation. Sourced from the provider response's usage block. MUST replay identically."
|
|
2741
|
+
}
|
|
2742
|
+
}
|
|
2743
|
+
},
|
|
2744
|
+
"envelopeNlToFormatEngaged": {
|
|
2745
|
+
"type": "object",
|
|
2746
|
+
"additionalProperties": false,
|
|
2747
|
+
"description": "RFC 0032 \u00a7B.5. Emitted when the host has escalated to a two-call NL-to-Format fallback after retry exhaustion (per Tam et al., arXiv 2408.02442 mitigation strategy: free-form reasoning in the first call \u2192 schema coercion in the second call). MAY-tier \u2014 NL-to-Format is one of many possible recovery strategies; hosts that don't implement it don't advertise it.",
|
|
2748
|
+
"required": [
|
|
2749
|
+
"nodeId",
|
|
2750
|
+
"originalEnvelopeType"
|
|
2751
|
+
],
|
|
2752
|
+
"properties": {
|
|
2753
|
+
"nodeId": {
|
|
2754
|
+
"type": "string"
|
|
2755
|
+
},
|
|
2756
|
+
"originalEnvelopeType": {
|
|
2757
|
+
"type": "string",
|
|
2758
|
+
"description": "The envelope kind the original attempt was trying to emit."
|
|
2759
|
+
},
|
|
2760
|
+
"fallbackCalls": {
|
|
2761
|
+
"type": "integer",
|
|
2762
|
+
"minimum": 1,
|
|
2763
|
+
"default": 1,
|
|
2764
|
+
"description": "Number of secondary LLM calls used to reformat free-form output into the envelope's schema."
|
|
2765
|
+
}
|
|
2766
|
+
}
|
|
2767
|
+
},
|
|
2768
|
+
"envelopeRecoveryApplied": {
|
|
2769
|
+
"type": "object",
|
|
2770
|
+
"additionalProperties": false,
|
|
2771
|
+
"description": "RFC 0032 \u00a7B.6. Emitted when lenient parsing recovered a malformed envelope (e.g., JSON repair via `jsonrepair`, markdown fence stripping, last-balanced-object extraction). Recovery is internal to the parsing step, BEFORE validation; recovery does NOT consume a retry attempt per RFC 0033 \u00a7D. MAY-tier \u2014 lenient parsing is a host-discretion recovery path. The event payload MUST NOT carry the recovered envelope content or any substring from the model's pre-recovery output per SECURITY invariant `envelope-recovery-no-content-leak`; only the recovery path identifier and the optional `byteOffset` are emitted. The recovered content rides on the subsequent envelope acceptance + downstream `RunEventDoc`, NOT on this event.",
|
|
2772
|
+
"required": [
|
|
2773
|
+
"nodeId",
|
|
2774
|
+
"path"
|
|
2775
|
+
],
|
|
2776
|
+
"properties": {
|
|
2777
|
+
"nodeId": {
|
|
2778
|
+
"type": "string"
|
|
2779
|
+
},
|
|
2780
|
+
"path": {
|
|
2781
|
+
"type": "string",
|
|
2782
|
+
"enum": [
|
|
2783
|
+
"direct",
|
|
2784
|
+
"jsonrepair",
|
|
2785
|
+
"markdown-fence",
|
|
2786
|
+
"brace-walker",
|
|
2787
|
+
"custom"
|
|
2788
|
+
],
|
|
2789
|
+
"description": "Which recovery path succeeded. `direct` is reserved for the no-recovery-needed path and is informational; hosts MAY omit emission when `path: \"direct\"`. MUST replay identically (deterministic parsing \u2192 deterministic recovery outcome)."
|
|
2790
|
+
},
|
|
2791
|
+
"byteOffset": {
|
|
2792
|
+
"type": [
|
|
2793
|
+
"integer",
|
|
2794
|
+
"null"
|
|
2795
|
+
],
|
|
2796
|
+
"minimum": 0,
|
|
2797
|
+
"description": "Byte position where recovery succeeded. Useful for debugging which fraction of the model's output was salvageable."
|
|
2798
|
+
}
|
|
2799
|
+
}
|
|
2800
|
+
},
|
|
2801
|
+
"agentToolCalled": {
|
|
2802
|
+
"type": "object",
|
|
2803
|
+
"description": "Multi-Agent Shift Phase 1. Emitted when an agent invokes a tool. Pairs with `agent.toolReturned` via shared `callId`.",
|
|
2804
|
+
"required": [
|
|
2805
|
+
"agentId",
|
|
2806
|
+
"toolName",
|
|
2807
|
+
"callId"
|
|
2808
|
+
],
|
|
2809
|
+
"properties": {
|
|
2810
|
+
"agentId": {
|
|
2811
|
+
"type": "string",
|
|
2812
|
+
"minLength": 3,
|
|
2813
|
+
"maxLength": 256
|
|
2814
|
+
},
|
|
2815
|
+
"toolName": {
|
|
2816
|
+
"type": "string",
|
|
2817
|
+
"minLength": 1,
|
|
2818
|
+
"description": "Tool identifier (typically a node-pack typeId or function name)."
|
|
2819
|
+
},
|
|
2820
|
+
"callId": {
|
|
2821
|
+
"type": "string",
|
|
2822
|
+
"minLength": 1,
|
|
2823
|
+
"description": "Unique correlation id linking this call to the subsequent `agent.toolReturned`. Hosts SHOULD use UUIDs or content-addressable hashes."
|
|
2824
|
+
},
|
|
2825
|
+
"inputs": {
|
|
2826
|
+
"description": "Tool inputs. Shape is tool-specific; consumers MUST NOT assume an object."
|
|
2827
|
+
},
|
|
2828
|
+
"argsHash": {
|
|
2829
|
+
"type": "string",
|
|
2830
|
+
"description": "RFC 0064 (when `capabilities.toolHooks.prePostEvents`). SHA-256 over RFC 8785 JCS-canonicalized args with resolved secrets already redacted (SR-1) \u2014 the SIEM-safe, content-free alternative to `inputs`. Raw key material MUST NOT enter the hash input."
|
|
2831
|
+
},
|
|
2832
|
+
"principal": {
|
|
2833
|
+
"type": "string",
|
|
2834
|
+
"description": "RFC 0064. RFC 0048 principal id the call is attributed to (`core.system` for non-agent host egress)."
|
|
2835
|
+
},
|
|
2836
|
+
"transport": {
|
|
2837
|
+
"type": "string",
|
|
2838
|
+
"enum": [
|
|
2839
|
+
"mcp",
|
|
2840
|
+
"http",
|
|
2841
|
+
"native"
|
|
2842
|
+
],
|
|
2843
|
+
"description": "RFC 0064. How the tool was reached."
|
|
2844
|
+
},
|
|
2845
|
+
"causationHostId": {
|
|
2846
|
+
"type": "string",
|
|
2847
|
+
"minLength": 1,
|
|
2848
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2849
|
+
}
|
|
2850
|
+
},
|
|
2851
|
+
"additionalProperties": true
|
|
2852
|
+
},
|
|
2853
|
+
"agentToolReturned": {
|
|
2854
|
+
"type": "object",
|
|
2855
|
+
"description": "Multi-Agent Shift Phase 1. Emitted when a tool invocation completes (success or failure). Pairs with `agent.toolCalled` via `callId`.",
|
|
2856
|
+
"required": [
|
|
2857
|
+
"agentId",
|
|
2858
|
+
"toolName",
|
|
2859
|
+
"callId"
|
|
2860
|
+
],
|
|
2861
|
+
"properties": {
|
|
2862
|
+
"agentId": {
|
|
2863
|
+
"type": "string",
|
|
2864
|
+
"minLength": 3,
|
|
2865
|
+
"maxLength": 256
|
|
2866
|
+
},
|
|
2867
|
+
"toolName": {
|
|
2868
|
+
"type": "string",
|
|
2869
|
+
"minLength": 1
|
|
2870
|
+
},
|
|
2871
|
+
"callId": {
|
|
2872
|
+
"type": "string",
|
|
2873
|
+
"minLength": 1
|
|
2874
|
+
},
|
|
2875
|
+
"outcome": {
|
|
2876
|
+
"description": "Tool result. Discriminated by host on success vs error; payload shape is tool-specific."
|
|
2877
|
+
},
|
|
2878
|
+
"error": {
|
|
2879
|
+
"$ref": "#/$defs/_errorObject",
|
|
2880
|
+
"description": "Set on tool-execution failure. Mutually exclusive with `outcome`."
|
|
2881
|
+
},
|
|
2882
|
+
"status": {
|
|
2883
|
+
"type": "string",
|
|
2884
|
+
"enum": [
|
|
2885
|
+
"ok",
|
|
2886
|
+
"error",
|
|
2887
|
+
"forbidden",
|
|
2888
|
+
"rate_limited"
|
|
2889
|
+
],
|
|
2890
|
+
"description": "RFC 0064 (when `capabilities.toolHooks.prePostEvents`). Tool-hooks outcome. `forbidden`/`rate_limited` mean the tool was never invoked (per-tool authz / rate-limit gate)."
|
|
2891
|
+
},
|
|
2892
|
+
"durationMs": {
|
|
2893
|
+
"type": "integer",
|
|
2894
|
+
"minimum": 0,
|
|
2895
|
+
"description": "RFC 0064. Wall-clock tool duration; recorded in the event and re-emitted verbatim on replay/`:fork` (MUST NOT be recomputed from a clock, per `replay.md`). Absent when the call never started (`forbidden`/`rate_limited`)."
|
|
2896
|
+
},
|
|
2897
|
+
"causationHostId": {
|
|
2898
|
+
"type": "string",
|
|
2899
|
+
"minLength": 1,
|
|
2900
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2901
|
+
}
|
|
2902
|
+
},
|
|
2903
|
+
"additionalProperties": true
|
|
2904
|
+
},
|
|
2905
|
+
"agentHandoff": {
|
|
2906
|
+
"type": "object",
|
|
2907
|
+
"description": "Multi-Agent Shift Phase 1. Emitted when control transfers from one agent to another mid-run (e.g., orchestrator \u2192 worker, worker \u2192 worker via `core.dispatch`). Pairs with the receiving agent's subsequent `agent.decided` / `agent.toolCalled` / `node.started`.",
|
|
2908
|
+
"required": [
|
|
2909
|
+
"fromAgentId",
|
|
2910
|
+
"toAgentId"
|
|
2911
|
+
],
|
|
2912
|
+
"properties": {
|
|
2913
|
+
"fromAgentId": {
|
|
2914
|
+
"type": "string",
|
|
2915
|
+
"minLength": 3,
|
|
2916
|
+
"maxLength": 256,
|
|
2917
|
+
"description": "Agent surrendering control."
|
|
2918
|
+
},
|
|
2919
|
+
"toAgentId": {
|
|
2920
|
+
"type": "string",
|
|
2921
|
+
"minLength": 3,
|
|
2922
|
+
"maxLength": 256,
|
|
2923
|
+
"description": "Agent receiving control."
|
|
2924
|
+
},
|
|
2925
|
+
"reason": {
|
|
2926
|
+
"type": "string",
|
|
2927
|
+
"description": "Optional handoff rationale (e.g., 'specialist routing', 'escalation', 'dispatch-loop-iteration')."
|
|
2928
|
+
},
|
|
2929
|
+
"causationHostId": {
|
|
2930
|
+
"type": "string",
|
|
2931
|
+
"minLength": 1,
|
|
2932
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2933
|
+
}
|
|
2934
|
+
},
|
|
2935
|
+
"additionalProperties": true
|
|
2936
|
+
},
|
|
2937
|
+
"agentDecided": {
|
|
2938
|
+
"type": "object",
|
|
2939
|
+
"description": "Multi-Agent Shift Phase 1. Emitted when an agent produces a typed decision (routing, classification, judgement). Carries optional `confidence` in `[0, 1]`; when below the run's resolved `escalationThreshold` (default 0.7), hosts MUST suspend with `node.suspended { reason: 'low-confidence' }` per the confidence-escalation contract.",
|
|
2940
|
+
"required": [
|
|
2941
|
+
"agentId",
|
|
2942
|
+
"decision"
|
|
2943
|
+
],
|
|
2944
|
+
"properties": {
|
|
2945
|
+
"agentId": {
|
|
2946
|
+
"type": "string",
|
|
2947
|
+
"minLength": 3,
|
|
2948
|
+
"maxLength": 256
|
|
2949
|
+
},
|
|
2950
|
+
"decision": {
|
|
2951
|
+
"description": "Typed decision payload. Shape is decision-specific; consumers MUST NOT assume an object."
|
|
2952
|
+
},
|
|
2953
|
+
"confidence": {
|
|
2954
|
+
"type": "number",
|
|
2955
|
+
"minimum": 0,
|
|
2956
|
+
"maximum": 1,
|
|
2957
|
+
"description": "Optional confidence in `[0, 1]`. Below the threshold \u2192 escalate via `node.suspended { reason: 'low-confidence' }`. Absent values are treated as 'no signal' \u2014 no escalation."
|
|
2958
|
+
},
|
|
2959
|
+
"causationHostId": {
|
|
2960
|
+
"type": "string",
|
|
2961
|
+
"minLength": 1,
|
|
2962
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
2963
|
+
}
|
|
2964
|
+
},
|
|
2965
|
+
"additionalProperties": true
|
|
2966
|
+
},
|
|
2967
|
+
"agentVerified": {
|
|
2968
|
+
"type": "object",
|
|
2969
|
+
"description": "RFC 0090 (`multiAgent.executionModel.version >= 6`). A critic agent's independent verdict over a prior result, emitted before the result is committed/merged. Content-free: names the target + verdict + (optional) criteria KEYS, never the verified content (SECURITY invariant `verifier-no-content-leak`). A `fail` verdict on a `verifier.gating: true` host MUST block the merge/terminate; `revise` SHOULD route back to another actor turn (bounded by `maxLoopIterations`, RFC 0058).",
|
|
2970
|
+
"required": [
|
|
2971
|
+
"agentId",
|
|
2972
|
+
"target",
|
|
2973
|
+
"verdict"
|
|
2974
|
+
],
|
|
2975
|
+
"properties": {
|
|
2976
|
+
"agentId": {
|
|
2977
|
+
"type": "string",
|
|
2978
|
+
"minLength": 3,
|
|
2979
|
+
"maxLength": 256,
|
|
2980
|
+
"description": "AgentRef.agentId of the verifying (critic) agent. SHOULD differ from the agent whose work is checked; a host MAY allow self-verification but MUST keep verifier identity inspectable."
|
|
2981
|
+
},
|
|
2982
|
+
"target": {
|
|
2983
|
+
"type": "string",
|
|
2984
|
+
"minLength": 1,
|
|
2985
|
+
"description": "Opaque reference to what was checked \u2014 the eventId of the verified `agent.decided`, a child runId, or a tool callId. Chains the verdict to its subject."
|
|
2986
|
+
},
|
|
2987
|
+
"verdict": {
|
|
2988
|
+
"type": "string",
|
|
2989
|
+
"enum": [
|
|
2990
|
+
"pass",
|
|
2991
|
+
"fail",
|
|
2992
|
+
"revise"
|
|
2993
|
+
],
|
|
2994
|
+
"description": "`pass`: acceptable, MAY commit/terminate. `fail`: rejected; a `verifier.gating` host MUST NOT commit it. `revise`: needs another actor turn; SHOULD route back, not terminate."
|
|
2995
|
+
},
|
|
2996
|
+
"criteria": {
|
|
2997
|
+
"type": "array",
|
|
2998
|
+
"items": {
|
|
2999
|
+
"type": "string",
|
|
3000
|
+
"minLength": 1
|
|
3001
|
+
},
|
|
3002
|
+
"uniqueItems": true,
|
|
3003
|
+
"description": "Optional closed list of the criteria KEYS evaluated (e.g. `[\"schema-valid\",\"grounded\"]`). Keys only \u2014 never per-criterion verdict text \u2014 for SIEM safety."
|
|
3004
|
+
},
|
|
3005
|
+
"confidence": {
|
|
3006
|
+
"type": "number",
|
|
3007
|
+
"minimum": 0,
|
|
3008
|
+
"maximum": 1,
|
|
3009
|
+
"description": "Optional verifier confidence in `[0,1]` \u2014 the critic's confidence in its OWN verdict, distinct from the actor's `agent.decided.confidence`. MAY drive the RFC 0039 escalation contract."
|
|
3010
|
+
},
|
|
3011
|
+
"causationHostId": {
|
|
3012
|
+
"type": "string",
|
|
3013
|
+
"minLength": 1,
|
|
3014
|
+
"description": "RFC 0040 \u00a7A \u2014 cross-host causation pointer when the verified target lives on a different host."
|
|
3015
|
+
}
|
|
3016
|
+
},
|
|
3017
|
+
"additionalProperties": false
|
|
3018
|
+
},
|
|
3019
|
+
"runOrchestratorDecided": {
|
|
3020
|
+
"type": "object",
|
|
3021
|
+
"description": "Multi-Agent Shift Phase 5. Emitted exactly once per orchestrator decision by a `core.orchestrator.supervisor` node (or host-extension equivalent). Carries the deciding agent's identity and the typed `OrchestratorDecision` (see `orchestrator-decision.schema.json`). The envelope's top-level `nodeId` carries the supervisor node-id; the payload does NOT duplicate it.",
|
|
3022
|
+
"required": [
|
|
3023
|
+
"agentId",
|
|
3024
|
+
"decision"
|
|
3025
|
+
],
|
|
3026
|
+
"properties": {
|
|
3027
|
+
"agentId": {
|
|
3028
|
+
"type": "string",
|
|
3029
|
+
"minLength": 3,
|
|
3030
|
+
"maxLength": 256,
|
|
3031
|
+
"description": "AgentRef.agentId of the orchestrator. MUST equal `RunSnapshot.runOrchestrator.agentId` for the run's lifetime \u2014 orchestrator identity is set at first decision and does not change."
|
|
3032
|
+
},
|
|
3033
|
+
"decision": {
|
|
3034
|
+
"$ref": "orchestrator-decision.schema.json"
|
|
3035
|
+
},
|
|
3036
|
+
"iteration": {
|
|
3037
|
+
"type": "integer",
|
|
3038
|
+
"minimum": 1,
|
|
3039
|
+
"description": "RFC 0061 (`multiAgent.executionModel.version >= 5`). 1-based, monotonic count of orchestrator turns in this run \u2014 the observable loop-iteration counter that `maxLoopIterations` (RFC 0058) bounds; a breach emits `cap.breached { kind: 'loop-iterations', observed: <this+1> }`. A `version >= 5` host MUST set it on every `runOrchestrator.decided`, incrementing by exactly 1 per turn and surviving a stateful HITL resume unchanged. Recorded in the event and re-emitted verbatim on replay/`:fork`, never recomputed (`replay.md`). Omitted by hosts on `version < 5`."
|
|
3040
|
+
},
|
|
3041
|
+
"causationHostId": {
|
|
3042
|
+
"type": "string",
|
|
3043
|
+
"minLength": 1,
|
|
3044
|
+
"description": "RFC 0040 \u00a7A \u2014 optional cross-host causation pointer. Present + non-empty when this event's `causationId` points at an event on a DIFFERENT host; absent when same-host. MUST equal the originating host's `crossHostCausation.hostId`."
|
|
3045
|
+
}
|
|
3046
|
+
},
|
|
3047
|
+
"additionalProperties": false
|
|
3048
|
+
},
|
|
3049
|
+
"nodeDispatched": {
|
|
3050
|
+
"type": "object",
|
|
3051
|
+
"description": "Emitted by `core.dispatch` (RFC 0007 \u00a7D + RFC 0022 \u00a7A) for each child workflow spawned by a `next-worker` OrchestratorDecision. The envelope's top-level `nodeId` carries the dispatching `core.dispatch` node's id; the payload names the spawned child run + its terminal status at the moment of emission. Lets observers reconstruct the parent \u2192 child linkage without scanning the runs table.",
|
|
3052
|
+
"required": [
|
|
3053
|
+
"childRunId",
|
|
3054
|
+
"childWorkflowId"
|
|
3055
|
+
],
|
|
3056
|
+
"properties": {
|
|
3057
|
+
"childRunId": {
|
|
3058
|
+
"type": "string",
|
|
3059
|
+
"minLength": 1,
|
|
3060
|
+
"description": "RunId of the spawned child run."
|
|
3061
|
+
},
|
|
3062
|
+
"childWorkflowId": {
|
|
3063
|
+
"type": "string",
|
|
3064
|
+
"minLength": 1,
|
|
3065
|
+
"description": "WorkflowId of the spawned child."
|
|
3066
|
+
},
|
|
3067
|
+
"childStatus": {
|
|
3068
|
+
"type": "string",
|
|
3069
|
+
"description": "Status of the child run at the moment the dispatch step returned (typically `completed`, `failed`, `cancelled`, or one of the `waiting-*` states when the child suspended)."
|
|
3070
|
+
}
|
|
3071
|
+
},
|
|
3072
|
+
"additionalProperties": false
|
|
3073
|
+
},
|
|
3074
|
+
"dispatchFanOut": {
|
|
3075
|
+
"type": "object",
|
|
3076
|
+
"description": "RFC 0118. Emitted by `core.dispatch` when a `fanOutPolicy: 'parallel'` wave BEGINS, so the parent stays observable while children run concurrently. The envelope's `nodeId` carries the dispatching `core.dispatch` node id; `causationId` is set to the consumed `runOrchestrator.decided` event so replay reconstructs decision \u2192 fan-out. Emitted ONLY on the parallel path.",
|
|
3077
|
+
"required": [
|
|
3078
|
+
"fanOutPolicy",
|
|
3079
|
+
"childCount"
|
|
3080
|
+
],
|
|
3081
|
+
"properties": {
|
|
3082
|
+
"fanOutPolicy": {
|
|
3083
|
+
"const": "parallel",
|
|
3084
|
+
"description": "Always `\"parallel\"` \u2014 this event is emitted only on the parallel fan-out path."
|
|
3085
|
+
},
|
|
3086
|
+
"childCount": {
|
|
3087
|
+
"type": "integer",
|
|
3088
|
+
"minimum": 2,
|
|
3089
|
+
"description": "Number of children dispatched in this fan-out (`nextWorkerIds.length`; > 1 by construction)."
|
|
3090
|
+
},
|
|
3091
|
+
"maxConcurrency": {
|
|
3092
|
+
"type": "integer",
|
|
3093
|
+
"minimum": 1,
|
|
3094
|
+
"description": "Effective concurrency ceiling for the wave (`min(config.maxConcurrency ?? \u221e, capabilities.dispatch.maxFanOut ?? \u221e)`), when bounded."
|
|
3095
|
+
},
|
|
3096
|
+
"joinMode": {
|
|
3097
|
+
"type": "string",
|
|
3098
|
+
"enum": [
|
|
3099
|
+
"wait-all",
|
|
3100
|
+
"quorum",
|
|
3101
|
+
"first",
|
|
3102
|
+
"race"
|
|
3103
|
+
],
|
|
3104
|
+
"description": "The `joinPolicy.mode` governing this fan-out."
|
|
3105
|
+
}
|
|
3106
|
+
},
|
|
3107
|
+
"additionalProperties": false
|
|
3108
|
+
},
|
|
3109
|
+
"dispatchJoin": {
|
|
3110
|
+
"type": "object",
|
|
3111
|
+
"description": "RFC 0118. Emitted by `core.dispatch` when a `fanOutPolicy: 'parallel'` join is SATISFIED (or fails). The envelope's `nodeId` carries the dispatching node id; `causationId` matches the paired `core.dispatch.fanOut`. `mergeOrder` is the canonical replay-deterministic record of the output-merge tiebreak: a replay MUST re-apply `outputMapping` in `mergeOrder` (the parent host's observed wall-clock terminal order), NOT in `nextWorkerIds` order.",
|
|
3112
|
+
"required": [
|
|
3113
|
+
"joinOutcome",
|
|
3114
|
+
"completedCount",
|
|
3115
|
+
"failedCount",
|
|
3116
|
+
"mergeOrder"
|
|
3117
|
+
],
|
|
3118
|
+
"properties": {
|
|
3119
|
+
"joinOutcome": {
|
|
3120
|
+
"type": "string",
|
|
3121
|
+
"enum": [
|
|
3122
|
+
"satisfied",
|
|
3123
|
+
"failed",
|
|
3124
|
+
"partial"
|
|
3125
|
+
],
|
|
3126
|
+
"description": "`'satisfied'` \u2014 `mode` met and `onChildFailure` did not fail the node. `'failed'` \u2014 `onChildFailure: 'fail-fast'` tripped, or `mode` could not be satisfied (e.g. quorum unreachable); the dispatch node fails. `'partial'` \u2014 `mode` satisfied but \u22651 child is non-`completed` under `collect`/`absorb`; the node SUCCEEDS."
|
|
3127
|
+
},
|
|
3128
|
+
"completedCount": {
|
|
3129
|
+
"type": "integer",
|
|
3130
|
+
"minimum": 0,
|
|
3131
|
+
"description": "Number of children that reached `completed`."
|
|
3132
|
+
},
|
|
3133
|
+
"failedCount": {
|
|
3134
|
+
"type": "integer",
|
|
3135
|
+
"minimum": 0,
|
|
3136
|
+
"description": "Number of children that reached `failed`."
|
|
3137
|
+
},
|
|
3138
|
+
"cancelledCount": {
|
|
3139
|
+
"type": "integer",
|
|
3140
|
+
"minimum": 0,
|
|
3141
|
+
"description": "Number of children cancelled (e.g. in-flight when `quorum`/`first`/`race`/`fail-fast` short-circuited the join)."
|
|
3142
|
+
},
|
|
3143
|
+
"mergeOrder": {
|
|
3144
|
+
"type": "array",
|
|
3145
|
+
"items": {
|
|
3146
|
+
"type": "string"
|
|
3147
|
+
},
|
|
3148
|
+
"description": "`childRunId`s in the parent host's observed wall-clock terminal order \u2014 the replay-deterministic tiebreak for colliding `outputMapping` keys. Recorded at terminal-fold time; never recomputed from child timestamps."
|
|
3149
|
+
}
|
|
3150
|
+
},
|
|
3151
|
+
"additionalProperties": false
|
|
3152
|
+
},
|
|
3153
|
+
"conversationOpened": {
|
|
3154
|
+
"type": "object",
|
|
3155
|
+
"description": "Multi-Agent Shift Phase 4. Emitted when a `core.conversationGate` (or host-extension equivalent) opens a new multi-turn conversation context. Pairs with the closing `conversation.closed` via shared `conversationId`.",
|
|
3156
|
+
"required": [
|
|
3157
|
+
"conversationId"
|
|
3158
|
+
],
|
|
3159
|
+
"properties": {
|
|
3160
|
+
"conversationId": {
|
|
3161
|
+
"type": "string",
|
|
3162
|
+
"minLength": 1,
|
|
3163
|
+
"maxLength": 256,
|
|
3164
|
+
"description": "Opaque conversation identifier. Tenant-unique invariant: hosts MUST ensure no two distinct conversations in the same tenant share an id. Cross-host portability not normative."
|
|
3165
|
+
},
|
|
3166
|
+
"openedBy": {
|
|
3167
|
+
"type": "string",
|
|
3168
|
+
"description": "Optional `AgentRef.agentId` of the agent that opened the conversation."
|
|
3169
|
+
}
|
|
3170
|
+
},
|
|
3171
|
+
"additionalProperties": true
|
|
3172
|
+
},
|
|
3173
|
+
"conversationExchanged": {
|
|
3174
|
+
"type": "object",
|
|
3175
|
+
"description": "Multi-Agent Shift Phase 4. Emitted when a single turn completes within an open conversation (`core.conversationGate.exchange`). Carries the validated outcome of the suspend/resume cycle.",
|
|
3176
|
+
"required": [
|
|
3177
|
+
"conversationId",
|
|
3178
|
+
"turnIndex"
|
|
3179
|
+
],
|
|
3180
|
+
"properties": {
|
|
3181
|
+
"conversationId": {
|
|
3182
|
+
"type": "string",
|
|
3183
|
+
"minLength": 1,
|
|
3184
|
+
"maxLength": 256
|
|
3185
|
+
},
|
|
3186
|
+
"turnIndex": {
|
|
3187
|
+
"type": "integer",
|
|
3188
|
+
"minimum": 0,
|
|
3189
|
+
"description": "0-indexed turn within this conversation. Strictly monotonic."
|
|
3190
|
+
},
|
|
3191
|
+
"outcome": {
|
|
3192
|
+
"description": "Validated turn outcome per the per-turn schema declared in `core.conversationGate` config."
|
|
3193
|
+
}
|
|
3194
|
+
},
|
|
3195
|
+
"additionalProperties": true
|
|
3196
|
+
},
|
|
3197
|
+
"conversationClosed": {
|
|
3198
|
+
"type": "object",
|
|
3199
|
+
"description": "Multi-Agent Shift Phase 4. Emitted when a conversation context terminates (`core.conversationGate.close`). Final event in the conversation's lifecycle; no further `conversation.exchanged` events MAY follow for the same `conversationId` in this run.",
|
|
3200
|
+
"required": [
|
|
3201
|
+
"conversationId"
|
|
3202
|
+
],
|
|
3203
|
+
"properties": {
|
|
3204
|
+
"conversationId": {
|
|
3205
|
+
"type": "string",
|
|
3206
|
+
"minLength": 1,
|
|
3207
|
+
"maxLength": 256
|
|
3208
|
+
},
|
|
3209
|
+
"reason": {
|
|
3210
|
+
"type": "string",
|
|
3211
|
+
"description": "Optional close reason (e.g., 'goal-reached', 'max-turns', 'user-cancelled')."
|
|
3212
|
+
},
|
|
3213
|
+
"turnCount": {
|
|
3214
|
+
"type": "integer",
|
|
3215
|
+
"minimum": 0,
|
|
3216
|
+
"description": "Total turns completed in this conversation (number of `conversation.exchanged` events emitted)."
|
|
3217
|
+
}
|
|
3218
|
+
},
|
|
3219
|
+
"additionalProperties": true
|
|
3220
|
+
},
|
|
3221
|
+
"memoryCompacted": {
|
|
3222
|
+
"type": "object",
|
|
3223
|
+
"description": "RFC 0012 (Memory Compaction Profile). Emitted by a host advertising `capabilities.memory.compaction.supported: true` each time a compaction run completes, regardless of trigger. `outputId` MUST be readable via `MemoryAdapter.get(memoryRef, outputId)` until normal TTL eviction. SR-1 carry-forward (RFC 0012 \u00a7D) applies: the host MUST route compacted entry content through the same BYOK redaction harness applied to a fresh `put`.",
|
|
3224
|
+
"required": [
|
|
3225
|
+
"memoryRef",
|
|
3226
|
+
"outputId",
|
|
3227
|
+
"sourceCount",
|
|
3228
|
+
"trigger",
|
|
3229
|
+
"byteSize"
|
|
3230
|
+
],
|
|
3231
|
+
"properties": {
|
|
3232
|
+
"memoryRef": {
|
|
3233
|
+
"type": "string",
|
|
3234
|
+
"minLength": 1,
|
|
3235
|
+
"description": "Opaque MemoryAdapter handle per RFC 0004 \u00a7C. Bounds compaction to a single memory scope."
|
|
3236
|
+
},
|
|
3237
|
+
"outputId": {
|
|
3238
|
+
"type": "string",
|
|
3239
|
+
"minLength": 1,
|
|
3240
|
+
"description": "Id of the new MemoryEntry created by compaction."
|
|
3241
|
+
},
|
|
3242
|
+
"sourceIds": {
|
|
3243
|
+
"type": "array",
|
|
3244
|
+
"items": {
|
|
3245
|
+
"type": "string",
|
|
3246
|
+
"minLength": 1
|
|
3247
|
+
},
|
|
3248
|
+
"description": "Ids of entries collapsed into outputId. Hosts MAY omit when sourceCount > 100; the `compacted-from:<runId>` tag convention (RFC 0012 \u00a7C) becomes the authoritative provenance signal. When present, MUST be exhaustive within the array (no 'and N more' semantics)."
|
|
3249
|
+
},
|
|
3250
|
+
"sourceCount": {
|
|
3251
|
+
"type": "integer",
|
|
3252
|
+
"minimum": 1,
|
|
3253
|
+
"description": "Total source entries collapsed, including any not enumerated in `sourceIds`."
|
|
3254
|
+
},
|
|
3255
|
+
"trigger": {
|
|
3256
|
+
"type": "string",
|
|
3257
|
+
"enum": [
|
|
3258
|
+
"host-managed",
|
|
3259
|
+
"client-requested",
|
|
3260
|
+
"both"
|
|
3261
|
+
],
|
|
3262
|
+
"description": "Matches `capabilities.memory.compaction.trigger`; indicates which trigger path drove this run. v1.x normates only `host-managed`."
|
|
3263
|
+
},
|
|
3264
|
+
"byteSize": {
|
|
3265
|
+
"type": "integer",
|
|
3266
|
+
"minimum": 0,
|
|
3267
|
+
"description": "Byte size of the resulting MemoryEntry.content."
|
|
3268
|
+
},
|
|
3269
|
+
"distillation": {
|
|
3270
|
+
"type": "object",
|
|
3271
|
+
"description": "RFC 0062 (when `capabilities.memory.distillation.supported: true`). Present when this compaction is part of a budgeted distillation run (a scheduled or on-demand 'dream'). Absent for a plain RFC 0012 compaction. Carries the token-budget accounting + whether the memory index was refreshed \u2014 not a parallel `memory.distilled` event.",
|
|
3272
|
+
"additionalProperties": false,
|
|
3273
|
+
"required": [
|
|
3274
|
+
"tokenBudget",
|
|
3275
|
+
"tokensUsed"
|
|
3276
|
+
],
|
|
3277
|
+
"properties": {
|
|
3278
|
+
"tokenBudget": {
|
|
3279
|
+
"type": "integer",
|
|
3280
|
+
"minimum": 1,
|
|
3281
|
+
"description": "Effective per-run budget honored (\u2264 advertised `maxTokenBudget`), counted against the advertised `tokenizerName`."
|
|
3282
|
+
},
|
|
3283
|
+
"tokensUsed": {
|
|
3284
|
+
"type": "integer",
|
|
3285
|
+
"minimum": 0,
|
|
3286
|
+
"description": "Total input+output tokens the distillation consumed, best-effort-honest per the advertised tokenizer (\u00b110% tolerance). MUST be \u2264 `tokenBudget` on a successful run."
|
|
3287
|
+
},
|
|
3288
|
+
"indexUpdated": {
|
|
3289
|
+
"type": "boolean",
|
|
3290
|
+
"description": "Whether this run refreshed the memory-index workspace file (`MEMORY-INDEX.json`, RFC 0059). When `true`, a `workspace.updated` event was also emitted for that path."
|
|
3291
|
+
}
|
|
3292
|
+
}
|
|
3293
|
+
}
|
|
3294
|
+
},
|
|
3295
|
+
"additionalProperties": true
|
|
3296
|
+
},
|
|
3297
|
+
"memoryWritten": {
|
|
3298
|
+
"type": "object",
|
|
3299
|
+
"description": "RFC 0057. Emitted by a host advertising `capabilities.memory.attribution.emitsWriteEvents: true` for each memory write a run makes, attributing it to the node (and agent, when known) that caused it. Content-free: identifiers + non-secret tags only \u2014 the entry content is served by the read-side (`MemoryAdapter.get`), already SR-1-redacted. On replay the event is re-read from the log, never regenerated (the host MUST NOT mint a new `memoryId` or timestamp at replay time). SECURITY invariants `memory-attribution-no-content` + `memory-attribution-tenant-scoped` apply.",
|
|
3300
|
+
"required": [
|
|
3301
|
+
"memoryRef",
|
|
3302
|
+
"memoryId"
|
|
3303
|
+
],
|
|
3304
|
+
"properties": {
|
|
3305
|
+
"memoryRef": {
|
|
3306
|
+
"type": "string",
|
|
3307
|
+
"minLength": 1,
|
|
3308
|
+
"description": "Opaque MemoryAdapter handle (RFC 0004 \u00a7C) the entry was written under; resolvable via the read-side."
|
|
3309
|
+
},
|
|
3310
|
+
"memoryId": {
|
|
3311
|
+
"type": "string",
|
|
3312
|
+
"minLength": 1,
|
|
3313
|
+
"description": "Host-issued, stable entry id; correlates to `MemoryAdapter.get(memoryRef, memoryId)`."
|
|
3314
|
+
},
|
|
3315
|
+
"nodeId": {
|
|
3316
|
+
"type": "string",
|
|
3317
|
+
"minLength": 1,
|
|
3318
|
+
"description": "SHOULD \u2014 the node whose execution caused the write. Omitted only for writes with no node attribution (e.g. host session-end auto-memory)."
|
|
3319
|
+
},
|
|
3320
|
+
"agentId": {
|
|
3321
|
+
"type": "string",
|
|
3322
|
+
"minLength": 1,
|
|
3323
|
+
"description": "MAY \u2014 the agent identity (AgentRef per RFC 0002) behind the write, when known."
|
|
3324
|
+
},
|
|
3325
|
+
"tags": {
|
|
3326
|
+
"type": "array",
|
|
3327
|
+
"items": {
|
|
3328
|
+
"type": "string"
|
|
3329
|
+
},
|
|
3330
|
+
"description": "MAY \u2014 the entry's non-secret labels. MUST NOT carry secret material (the no-content invariant covers payload bodies)."
|
|
3331
|
+
}
|
|
3332
|
+
},
|
|
3333
|
+
"additionalProperties": true
|
|
3334
|
+
},
|
|
3335
|
+
"agentMemoryConsolidated": {
|
|
3336
|
+
"type": "object",
|
|
3337
|
+
"description": "RFC 0068 (`Draft`). Emitted by a host advertising `capabilities.agents.memoryConsolidation.supported: true` after a background consolidation pass over LONG-TERM memory (merge/dedup/supersede/strengthen). Content-free: identifiers + counts only \u2014 entry content is served by the SR-1-redacted read-side (`MemoryAdapter.get`). On replay the event is re-read from the log, never regenerated. Distinct from RFC 0062 `memory.compacted` (token-budgeted distillation of transactional memory). SR-1 carry-forward (RFC 0004) + CTI-1 apply to the consolidated entries.",
|
|
3338
|
+
"required": [
|
|
3339
|
+
"memoryRef",
|
|
3340
|
+
"inputCount",
|
|
3341
|
+
"outputCount"
|
|
3342
|
+
],
|
|
3343
|
+
"properties": {
|
|
3344
|
+
"memoryRef": {
|
|
3345
|
+
"type": "string",
|
|
3346
|
+
"minLength": 1,
|
|
3347
|
+
"description": "Opaque MemoryAdapter handle (RFC 0004 \u00a7C) the consolidation pass operated over. Bounds the pass to a single memory scope (CTI-1)."
|
|
3348
|
+
},
|
|
3349
|
+
"inputCount": {
|
|
3350
|
+
"type": "integer",
|
|
3351
|
+
"minimum": 0,
|
|
3352
|
+
"description": "Long-term entries considered by the pass."
|
|
3353
|
+
},
|
|
3354
|
+
"outputCount": {
|
|
3355
|
+
"type": "integer",
|
|
3356
|
+
"minimum": 0,
|
|
3357
|
+
"description": "Long-term entries remaining after the pass. MUST be <= inputCount for a pass that only merges/dedups; a strengthen-only pass MAY leave outputCount == inputCount."
|
|
3358
|
+
},
|
|
3359
|
+
"mergedIds": {
|
|
3360
|
+
"type": "array",
|
|
3361
|
+
"items": {
|
|
3362
|
+
"type": "string",
|
|
3363
|
+
"minLength": 1
|
|
3364
|
+
},
|
|
3365
|
+
"description": "MAY \u2014 ids of entries collapsed/superseded by the pass. Hosts MAY omit when inputCount is large; consumers MUST tolerate absence."
|
|
3366
|
+
},
|
|
3367
|
+
"trigger": {
|
|
3368
|
+
"type": "string",
|
|
3369
|
+
"enum": [
|
|
3370
|
+
"host-managed",
|
|
3371
|
+
"scheduled",
|
|
3372
|
+
"on-demand"
|
|
3373
|
+
],
|
|
3374
|
+
"description": "MAY \u2014 which initiation path drove this pass (mirrors `agents.memoryConsolidation.schedule`)."
|
|
3375
|
+
}
|
|
3376
|
+
},
|
|
3377
|
+
"additionalProperties": true
|
|
3378
|
+
},
|
|
3379
|
+
"commitmentFired": {
|
|
3380
|
+
"type": "object",
|
|
3381
|
+
"description": "RFC 0068 (`Draft`). Emitted by a host advertising `capabilities.agents.commitments.supported: true` when an inferred standing commitment fires. Content-free: identifiers + condition kind only \u2014 the intention text lives in SR-1-redacted memory (`MemoryAdapter.get(memoryRef, memoryId)`). The fired arm composes RFC 0052 (time) or RFC 0060 (predicate). On replay the event is re-read from the log, never regenerated (the host MUST NOT re-infer or re-fire a commitment at replay time). CTI-1: the commitment, its memory provenance, and any run it enqueues MUST share the source memory's tenant.",
|
|
3382
|
+
"required": [
|
|
3383
|
+
"commitmentId",
|
|
3384
|
+
"memoryRef",
|
|
3385
|
+
"condition"
|
|
3386
|
+
],
|
|
3387
|
+
"properties": {
|
|
3388
|
+
"commitmentId": {
|
|
3389
|
+
"type": "string",
|
|
3390
|
+
"minLength": 1,
|
|
3391
|
+
"description": "Host-issued, stable id for the inferred commitment. Correlates repeated observability across re-evaluations of the same commitment."
|
|
3392
|
+
},
|
|
3393
|
+
"memoryRef": {
|
|
3394
|
+
"type": "string",
|
|
3395
|
+
"minLength": 1,
|
|
3396
|
+
"description": "Opaque MemoryAdapter handle of the memory scope the commitment was inferred from (provenance + CTI-1 tenant binding)."
|
|
3397
|
+
},
|
|
3398
|
+
"memoryId": {
|
|
3399
|
+
"type": "string",
|
|
3400
|
+
"minLength": 1,
|
|
3401
|
+
"description": "MAY \u2014 id of the source `MemoryEntry` the commitment was inferred from, when a single entry is attributable. Resolvable via `MemoryAdapter.get`; content is read SR-1-redacted from the read-side."
|
|
3402
|
+
},
|
|
3403
|
+
"condition": {
|
|
3404
|
+
"type": "string",
|
|
3405
|
+
"enum": [
|
|
3406
|
+
"time",
|
|
3407
|
+
"predicate"
|
|
3408
|
+
],
|
|
3409
|
+
"description": "Which fire-condition kind triggered. `time` composes RFC 0052; `predicate` composes RFC 0060."
|
|
3410
|
+
},
|
|
3411
|
+
"enqueuedRunId": {
|
|
3412
|
+
"type": "string",
|
|
3413
|
+
"minLength": 1,
|
|
3414
|
+
"description": "MAY \u2014 id of the run the fired commitment enqueued, when the host initiates one. Absent when the commitment fires as a notification without a run."
|
|
3415
|
+
}
|
|
3416
|
+
},
|
|
3417
|
+
"additionalProperties": true
|
|
3418
|
+
},
|
|
3419
|
+
"agentInvocationStarted": {
|
|
3420
|
+
"type": "object",
|
|
3421
|
+
"description": "RFC 0077. Emitted by a host advertising `capabilities.agents.liveRuntime.supported: true` as the FIRST agent-scoped event of a live manifest invocation, bracketing the existing `agent.*` family with `agent.invocation.completed`. Content-free: identifiers + selection metadata only \u2014 prompt/task content is served by the run's normal projection, never on this event. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\": on replay it is re-emitted from the log and the host MUST NOT regenerate its `invocationId` (or any identifier). Distinct from the deterministic RFC 0070 sample floor.",
|
|
3422
|
+
"required": [
|
|
3423
|
+
"invocationId",
|
|
3424
|
+
"agentId",
|
|
3425
|
+
"source"
|
|
3426
|
+
],
|
|
3427
|
+
"properties": {
|
|
3428
|
+
"invocationId": {
|
|
3429
|
+
"type": "string",
|
|
3430
|
+
"minLength": 1,
|
|
3431
|
+
"description": "Host-defined id correlating this agent invocation within its run, UNIQUE-WITHIN-RUN (not a mandated global id-space). Distinct from `runId` \u2014 one run MAY dispatch several invocations (multiple agent nodes, or a handoff chain) \u2014 but a host MAY derive it from an existing per-node-execution receipt id (e.g. `runId:nodeId:seq`) or mint a UUID; a single-invocation run MAY reuse `runId`. Recorded-fact: re-read from the log on replay, never regenerated (`replay.md` \u00a7\"Recorded-fact events\"). Correlates to the matching `agent.invocation.completed`."
|
|
3432
|
+
},
|
|
3433
|
+
"agentId": {
|
|
3434
|
+
"type": "string",
|
|
3435
|
+
"minLength": 1,
|
|
3436
|
+
"description": "The manifest agentId being invoked (matches `AgentManifest.agentId`)."
|
|
3437
|
+
},
|
|
3438
|
+
"source": {
|
|
3439
|
+
"type": "string",
|
|
3440
|
+
"enum": [
|
|
3441
|
+
"workflow-node",
|
|
3442
|
+
"run-api",
|
|
3443
|
+
"chat-mention"
|
|
3444
|
+
],
|
|
3445
|
+
"description": "Which entry point launched the invocation. All sources emit this identical family."
|
|
3446
|
+
},
|
|
3447
|
+
"modelClass": {
|
|
3448
|
+
"type": "string",
|
|
3449
|
+
"description": "MAY \u2014 the manifest's abstract `modelClass`. Always populatable at start."
|
|
3450
|
+
},
|
|
3451
|
+
"resolvedModel": {
|
|
3452
|
+
"type": "string",
|
|
3453
|
+
"description": "MAY \u2014 the concrete model the host selected. OPTIONAL: modelClass\u2192concrete resolution MAY happen downstream (with capability-gated fallback substitution), so a dispatch-time start event genuinely may not know it; a host MAY also omit for deployment-privacy."
|
|
3454
|
+
},
|
|
3455
|
+
"resolvedProvider": {
|
|
3456
|
+
"type": "string",
|
|
3457
|
+
"description": "MAY \u2014 the concrete provider the host routed to (aligns with `capabilities.aiProviders.supported` / RFC 0067 `authModes`). OPTIONAL, same rationale as `resolvedModel`."
|
|
3458
|
+
},
|
|
3459
|
+
"resolvedAgentVersion": {
|
|
3460
|
+
"type": "string",
|
|
3461
|
+
"description": "MAY \u2014 RFC 0082 \u00a7B. When this invocation's `AgentRef` bound a `channel` (rather than an exact `version`), the concrete agent-definition version the host pinned per-(run, agentId, channel) at first resolution. A RECORDED FACT: re-read from the log on replay and NEVER re-resolved against a moved channel (the whole event is recorded-fact). Absent when the ref used an exact `version` or host-default resolution."
|
|
3462
|
+
},
|
|
3463
|
+
"resolvedChannel": {
|
|
3464
|
+
"type": "string",
|
|
3465
|
+
"description": "MAY \u2014 RFC 0082 \u00a7B. The named `channel` the `AgentRef` bound (mirrors `AgentRef.channel`), for which `resolvedAgentVersion` is the pinned resolution. Content-free label; present only when the ref bound a channel."
|
|
3466
|
+
},
|
|
3467
|
+
"toolSurfaceCount": {
|
|
3468
|
+
"type": "integer",
|
|
3469
|
+
"minimum": 0,
|
|
3470
|
+
"description": "MAY \u2014 number of tools in the constructed surface after `toolAllowlist` filtering. Content-free count, not the tool ids."
|
|
3471
|
+
},
|
|
3472
|
+
"memoryBound": {
|
|
3473
|
+
"type": "boolean",
|
|
3474
|
+
"description": "MAY \u2014 whether a long-term memory backend was bound for the invocation."
|
|
3475
|
+
}
|
|
3476
|
+
},
|
|
3477
|
+
"additionalProperties": true
|
|
3478
|
+
},
|
|
3479
|
+
"agentInvocationCompleted": {
|
|
3480
|
+
"type": "object",
|
|
3481
|
+
"description": "RFC 0077. Emitted by a host advertising `capabilities.agents.liveRuntime.supported: true` as the LAST agent-scoped event of a live manifest invocation (after the terminal `agent.decided`). Content-free: identifiers + outcome metadata only \u2014 the result body is served by the run's normal projection. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\": re-read from the log on replay, never regenerated.",
|
|
3482
|
+
"required": [
|
|
3483
|
+
"invocationId",
|
|
3484
|
+
"agentId",
|
|
3485
|
+
"outcome"
|
|
3486
|
+
],
|
|
3487
|
+
"properties": {
|
|
3488
|
+
"invocationId": {
|
|
3489
|
+
"type": "string",
|
|
3490
|
+
"minLength": 1,
|
|
3491
|
+
"description": "Correlates to the `agent.invocation.started` `invocationId`. Recorded-fact: never regenerated on replay."
|
|
3492
|
+
},
|
|
3493
|
+
"agentId": {
|
|
3494
|
+
"type": "string",
|
|
3495
|
+
"minLength": 1,
|
|
3496
|
+
"description": "The manifest agentId."
|
|
3497
|
+
},
|
|
3498
|
+
"outcome": {
|
|
3499
|
+
"type": "string",
|
|
3500
|
+
"enum": [
|
|
3501
|
+
"completed",
|
|
3502
|
+
"handed-off",
|
|
3503
|
+
"escalated",
|
|
3504
|
+
"refused",
|
|
3505
|
+
"failed"
|
|
3506
|
+
],
|
|
3507
|
+
"description": "Terminal disposition. `completed`: produced a (schema-valid, if enforced) terminal result. `handed-off`: control passed to another agent (`agent.handoff`). `escalated`: confidence escalation fired (RFC 0002 \u00a7F). `refused`: the model refused (RFC 0032 refusal envelope) \u2014 never a silent substitution. `failed`: an error terminated the invocation."
|
|
3508
|
+
},
|
|
3509
|
+
"schemaValidated": {
|
|
3510
|
+
"type": "boolean",
|
|
3511
|
+
"description": "MAY \u2014 whether the terminal result was validated against `handoff.returnSchemaRef` (true only when `liveRuntime.structuredOutput` is advertised and a `returnSchemaRef` exists)."
|
|
3512
|
+
},
|
|
3513
|
+
"confidence": {
|
|
3514
|
+
"type": "number",
|
|
3515
|
+
"minimum": 0,
|
|
3516
|
+
"maximum": 1,
|
|
3517
|
+
"description": "MAY \u2014 the terminal `agent.decided` confidence, mirrored for convenience. Content-free scalar."
|
|
3518
|
+
},
|
|
3519
|
+
"enqueuedRunId": {
|
|
3520
|
+
"type": "string",
|
|
3521
|
+
"minLength": 1,
|
|
3522
|
+
"description": "MAY \u2014 id of a follow-on run the invocation enqueued (e.g. a sub-run), when applicable."
|
|
3523
|
+
}
|
|
3524
|
+
},
|
|
3525
|
+
"additionalProperties": true
|
|
3526
|
+
},
|
|
3527
|
+
"workspaceUpdated": {
|
|
3528
|
+
"description": "RFC 0059. Emitted by a host advertising `capabilities.workspace.supported: true` on each successful `PUT`/`DELETE` of a workspace file, attributing the change to the file `path` + resulting `version`. Content-free: carries the path + version only \u2014 the file body is served by the read-side (`GET /v1/host/workspace/files/{path}`), already SR-1-redacted (RFC 0059 \u00a7E WSR-1). On replay the event is re-read from the log, never regenerated. MUST NOT be emitted unless `capabilities.workspace.supported: true`. The proposed SECURITY invariant `workspace-cross-tenant-isolation` (WCT-1) applies to the read-side that resolves these paths.",
|
|
3529
|
+
"type": "object",
|
|
3530
|
+
"additionalProperties": false,
|
|
3531
|
+
"required": [
|
|
3532
|
+
"path",
|
|
3533
|
+
"version"
|
|
3534
|
+
],
|
|
3535
|
+
"properties": {
|
|
3536
|
+
"path": {
|
|
3537
|
+
"type": "string",
|
|
3538
|
+
"minLength": 1,
|
|
3539
|
+
"description": "Workspace-relative path of the file that changed (matches `workspace-file.schema.json#path`)."
|
|
3540
|
+
},
|
|
3541
|
+
"version": {
|
|
3542
|
+
"type": "integer",
|
|
3543
|
+
"minimum": 1,
|
|
3544
|
+
"description": "The file's resulting monotonic version after the write. On delete, the tombstone version when `versioned: true`."
|
|
3545
|
+
}
|
|
3546
|
+
}
|
|
3547
|
+
},
|
|
3548
|
+
"evalStarted": {
|
|
3549
|
+
"type": "object",
|
|
3550
|
+
"description": "RFC 0081 \u00a7C. Emitted ONCE at the start of an eval run (a `mode: \"eval\"` run, RFC 0081 \u00a7B) by a host advertising `capabilities.agents.evalSuite.supported: true`. Content-free: suite provenance + counts only. A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\".",
|
|
3551
|
+
"required": [
|
|
3552
|
+
"suiteId",
|
|
3553
|
+
"suiteVersion",
|
|
3554
|
+
"taskCount",
|
|
3555
|
+
"modes"
|
|
3556
|
+
],
|
|
3557
|
+
"properties": {
|
|
3558
|
+
"suiteId": {
|
|
3559
|
+
"type": "string",
|
|
3560
|
+
"minLength": 1,
|
|
3561
|
+
"description": "The `agent-eval-suite.schema.json#suiteId` being run."
|
|
3562
|
+
},
|
|
3563
|
+
"suiteVersion": {
|
|
3564
|
+
"type": "string",
|
|
3565
|
+
"minLength": 1,
|
|
3566
|
+
"description": "The pinned suite SemVer."
|
|
3567
|
+
},
|
|
3568
|
+
"taskCount": {
|
|
3569
|
+
"type": "integer",
|
|
3570
|
+
"minimum": 0,
|
|
3571
|
+
"description": "Number of tasks the run will execute."
|
|
3572
|
+
},
|
|
3573
|
+
"modes": {
|
|
3574
|
+
"type": "array",
|
|
3575
|
+
"uniqueItems": true,
|
|
3576
|
+
"items": {
|
|
3577
|
+
"type": "string",
|
|
3578
|
+
"enum": [
|
|
3579
|
+
"golden",
|
|
3580
|
+
"rubric",
|
|
3581
|
+
"adversarial",
|
|
3582
|
+
"regression",
|
|
3583
|
+
"live-shadow"
|
|
3584
|
+
]
|
|
3585
|
+
},
|
|
3586
|
+
"description": "The eval modes this run exercises (RFC 0081 \u00a7D)."
|
|
3587
|
+
},
|
|
3588
|
+
"baselineRunId": {
|
|
3589
|
+
"type": "string",
|
|
3590
|
+
"minLength": 1,
|
|
3591
|
+
"description": "MAY \u2014 for `regression` mode, the prior eval run this run is scored against."
|
|
3592
|
+
}
|
|
3593
|
+
},
|
|
3594
|
+
"additionalProperties": true
|
|
3595
|
+
},
|
|
3596
|
+
"evalScored": {
|
|
3597
|
+
"type": "object",
|
|
3598
|
+
"description": "RFC 0081 \u00a7C. Emitted ONCE PER TASK, after that task's terminal `agent.decided`, so a streaming consumer sees results land incrementally. Content-free: the task id + scalars + counts ONLY \u2014 NEVER the task output, rubric prose, or model completion (SECURITY invariant `eval-summary-no-content-leak`). A recorded-fact event.",
|
|
3599
|
+
"required": [
|
|
3600
|
+
"taskId",
|
|
3601
|
+
"score",
|
|
3602
|
+
"passed"
|
|
3603
|
+
],
|
|
3604
|
+
"properties": {
|
|
3605
|
+
"taskId": {
|
|
3606
|
+
"type": "string",
|
|
3607
|
+
"minLength": 1,
|
|
3608
|
+
"description": "The `agent-eval-suite` task id."
|
|
3609
|
+
},
|
|
3610
|
+
"score": {
|
|
3611
|
+
"type": "number",
|
|
3612
|
+
"minimum": 0,
|
|
3613
|
+
"maximum": 1,
|
|
3614
|
+
"description": "Task score (0.0\u20131.0)."
|
|
3615
|
+
},
|
|
3616
|
+
"passed": {
|
|
3617
|
+
"type": "boolean",
|
|
3618
|
+
"description": "Whether the task met its bar."
|
|
3619
|
+
},
|
|
3620
|
+
"costUsd": {
|
|
3621
|
+
"type": "number",
|
|
3622
|
+
"minimum": 0,
|
|
3623
|
+
"description": "MAY \u2014 task cost (scalar; summed from RFC 0026 `provider.usage`). NEVER a pricing breakdown."
|
|
3624
|
+
},
|
|
3625
|
+
"latencyMs": {
|
|
3626
|
+
"type": "integer",
|
|
3627
|
+
"minimum": 0,
|
|
3628
|
+
"description": "MAY \u2014 task wall-clock latency."
|
|
3629
|
+
},
|
|
3630
|
+
"schemaValid": {
|
|
3631
|
+
"type": "boolean",
|
|
3632
|
+
"description": "MAY \u2014 whether the output validated against `handoff.returnSchemaRef`."
|
|
3633
|
+
},
|
|
3634
|
+
"safetyFindingCount": {
|
|
3635
|
+
"type": "integer",
|
|
3636
|
+
"minimum": 0,
|
|
3637
|
+
"description": "MAY \u2014 count of safety findings for the task (the redaction-safe descriptors live on `EvalSummary`; the event carries the count only)."
|
|
3638
|
+
}
|
|
3639
|
+
},
|
|
3640
|
+
"additionalProperties": true
|
|
3641
|
+
},
|
|
3642
|
+
"evalCompleted": {
|
|
3643
|
+
"type": "object",
|
|
3644
|
+
"description": "RFC 0081 \u00a7C. Emitted ONCE, after all tasks and before `run.completed`. Content-free: aggregate scalars only. A recorded-fact event. The full scorecard is the run's output (`eval-summary.schema.json`), served by `GET /v1/runs/{runId}/eval-summary`.",
|
|
3645
|
+
"required": [
|
|
3646
|
+
"aggregateScore",
|
|
3647
|
+
"passed",
|
|
3648
|
+
"taskCount",
|
|
3649
|
+
"passedCount"
|
|
3650
|
+
],
|
|
3651
|
+
"properties": {
|
|
3652
|
+
"aggregateScore": {
|
|
3653
|
+
"type": "number",
|
|
3654
|
+
"minimum": 0,
|
|
3655
|
+
"maximum": 1,
|
|
3656
|
+
"description": "The suite-level score (0.0\u20131.0)."
|
|
3657
|
+
},
|
|
3658
|
+
"passed": {
|
|
3659
|
+
"type": "boolean",
|
|
3660
|
+
"description": "Whether the run cleared the suite thresholds \u2014 the flag an RFC 0082 deployment gate MAY require."
|
|
3661
|
+
},
|
|
3662
|
+
"taskCount": {
|
|
3663
|
+
"type": "integer",
|
|
3664
|
+
"minimum": 0,
|
|
3665
|
+
"description": "Tasks executed."
|
|
3666
|
+
},
|
|
3667
|
+
"passedCount": {
|
|
3668
|
+
"type": "integer",
|
|
3669
|
+
"minimum": 0,
|
|
3670
|
+
"description": "Tasks that individually passed."
|
|
3671
|
+
},
|
|
3672
|
+
"regressionVsBaseline": {
|
|
3673
|
+
"type": "number",
|
|
3674
|
+
"minimum": -1,
|
|
3675
|
+
"maximum": 1,
|
|
3676
|
+
"description": "MAY \u2014 for `regression` mode, `aggregateScore` minus the baseline's (negative \u21d2 regression)."
|
|
3677
|
+
}
|
|
3678
|
+
},
|
|
3679
|
+
"additionalProperties": true
|
|
3680
|
+
},
|
|
3681
|
+
"toolSessionOpened": {
|
|
3682
|
+
"type": "object",
|
|
3683
|
+
"description": "RFC 0078 \u00a7D. Emitted when the host opens a multi-step tool session, bracketing one or more RFC 0064 `agent.toolCalled`/`agent.toolReturned` call events. Content-free: identifiers only \u2014 never tool arguments, results, or credential material (SR-1). Emitted only when `capabilities.toolCatalog.sessionLifecycle: true`.",
|
|
3684
|
+
"required": [
|
|
3685
|
+
"sessionId",
|
|
3686
|
+
"toolId"
|
|
3687
|
+
],
|
|
3688
|
+
"properties": {
|
|
3689
|
+
"sessionId": {
|
|
3690
|
+
"type": "string",
|
|
3691
|
+
"minLength": 1,
|
|
3692
|
+
"description": "Host-unique id correlating the opened/closed pair + the bracketed call events."
|
|
3693
|
+
},
|
|
3694
|
+
"toolId": {
|
|
3695
|
+
"type": "string",
|
|
3696
|
+
"minLength": 1,
|
|
3697
|
+
"description": "The `ToolDescriptor.toolId` the session is for (`<scope>:<tool-id>`)."
|
|
3698
|
+
}
|
|
3699
|
+
},
|
|
3700
|
+
"additionalProperties": true
|
|
3701
|
+
},
|
|
3702
|
+
"toolSessionClosed": {
|
|
3703
|
+
"type": "object",
|
|
3704
|
+
"description": "RFC 0078 \u00a7D. Emitted when the host closes a multi-step tool session opened by `tool.session.opened`. Content-free: identifiers + a closed-enum outcome only \u2014 never tool arguments, results, or credential material (SR-1).",
|
|
3705
|
+
"required": [
|
|
3706
|
+
"sessionId",
|
|
3707
|
+
"toolId",
|
|
3708
|
+
"outcome"
|
|
3709
|
+
],
|
|
3710
|
+
"properties": {
|
|
3711
|
+
"sessionId": {
|
|
3712
|
+
"type": "string",
|
|
3713
|
+
"minLength": 1,
|
|
3714
|
+
"description": "Matches the `tool.session.opened` `sessionId`."
|
|
3715
|
+
},
|
|
3716
|
+
"toolId": {
|
|
3717
|
+
"type": "string",
|
|
3718
|
+
"minLength": 1,
|
|
3719
|
+
"description": "The `ToolDescriptor.toolId` the session was for."
|
|
3720
|
+
},
|
|
3721
|
+
"outcome": {
|
|
3722
|
+
"type": "string",
|
|
3723
|
+
"enum": [
|
|
3724
|
+
"completed",
|
|
3725
|
+
"failed",
|
|
3726
|
+
"cancelled"
|
|
3727
|
+
],
|
|
3728
|
+
"description": "Terminal disposition of the session. Content-free \u2014 no failure detail/result on the payload."
|
|
3729
|
+
}
|
|
3730
|
+
},
|
|
3731
|
+
"additionalProperties": true
|
|
3732
|
+
},
|
|
3733
|
+
"egressDecided": {
|
|
3734
|
+
"type": "object",
|
|
3735
|
+
"description": "RFC 0079 \u00a7B. Emitted when a host evaluates a credentialed egress (via `ctx.http.safeFetch` / a tool) against credential provenance + the SSRF guard. Content-free: identifiers + decision only \u2014 no credential value, no request/response body (SR-1). On replay re-read from the log, never regenerated (the decision is a recorded fact). Emitted only when `capabilities.httpClient.egressPolicy.supported: true`.",
|
|
3736
|
+
"required": [
|
|
3737
|
+
"decision",
|
|
3738
|
+
"destination"
|
|
3739
|
+
],
|
|
3740
|
+
"properties": {
|
|
3741
|
+
"decision": {
|
|
3742
|
+
"type": "string",
|
|
3743
|
+
"enum": [
|
|
3744
|
+
"allowed",
|
|
3745
|
+
"denied",
|
|
3746
|
+
"downgraded",
|
|
3747
|
+
"approval-required"
|
|
3748
|
+
],
|
|
3749
|
+
"description": "`allowed`: egress proceeds with the credential; `denied`: blocked (out-of-audience / expired / SSRF / unevaluable provenance \u2014 fail-closed); `downgraded`: proceeds WITHOUT the credential (anonymous egress, when host policy permits); `approval-required`: suspended pending an RFC 0051 approval interrupt."
|
|
3750
|
+
},
|
|
3751
|
+
"destination": {
|
|
3752
|
+
"type": "string",
|
|
3753
|
+
"minLength": 1,
|
|
3754
|
+
"description": "The egress destination **host/authority ONLY** (`api.stripe.com`) \u2014 NOT a path, query, or full URL (SR-1: a path/query can carry secrets; the host MUST strip them for this canonical content-free event). A host whose internal audit retains the path keeps that on its vendor `x-host-*` variant, never here."
|
|
3755
|
+
},
|
|
3756
|
+
"credentialId": {
|
|
3757
|
+
"type": "string",
|
|
3758
|
+
"minLength": 1,
|
|
3759
|
+
"description": "MAY \u2014 the provenance `credentialId` considered (absent for an anonymous / denied-pre-credential egress)."
|
|
3760
|
+
},
|
|
3761
|
+
"reason": {
|
|
3762
|
+
"type": "string",
|
|
3763
|
+
"enum": [
|
|
3764
|
+
"ok",
|
|
3765
|
+
"out-of-audience",
|
|
3766
|
+
"expired",
|
|
3767
|
+
"ssrf-blocked",
|
|
3768
|
+
"provenance-unevaluable",
|
|
3769
|
+
"scope-denied",
|
|
3770
|
+
"policy-denied"
|
|
3771
|
+
],
|
|
3772
|
+
"description": "MAY \u2014 a machine-stable reason code (a CLOSED enum \u2014 a free-form reason is a leak vector that would let a host spill the blocked URL/host/header into it, defeating `egress-decision-no-secret-leak`). The load-bearing field is `decision`."
|
|
3773
|
+
},
|
|
3774
|
+
"auditCorrelationId": {
|
|
3775
|
+
"type": "string",
|
|
3776
|
+
"minLength": 1,
|
|
3777
|
+
"description": "MAY \u2014 correlates to the provenance descriptor + host audit log."
|
|
3778
|
+
}
|
|
3779
|
+
},
|
|
3780
|
+
"additionalProperties": true
|
|
3781
|
+
},
|
|
3782
|
+
"triggerSubscriptionStateChanged": {
|
|
3783
|
+
"type": "object",
|
|
3784
|
+
"description": "RFC 0083 \u00a7C. Emitted when a trigger subscription changes state (the \u00a7B four-state machine). Content-free: identifiers + states only \u2014 no inbound payload, headers, or credential material (SR-1). Emitted only when `capabilities.triggerBridge.supported: true`.",
|
|
3785
|
+
"required": [
|
|
3786
|
+
"subscriptionId",
|
|
3787
|
+
"source",
|
|
3788
|
+
"fromState",
|
|
3789
|
+
"toState"
|
|
3790
|
+
],
|
|
3791
|
+
"properties": {
|
|
3792
|
+
"subscriptionId": {
|
|
3793
|
+
"type": "string",
|
|
3794
|
+
"minLength": 1,
|
|
3795
|
+
"description": "The TriggerSubscription this state change is for."
|
|
3796
|
+
},
|
|
3797
|
+
"source": {
|
|
3798
|
+
"type": "string",
|
|
3799
|
+
"enum": [
|
|
3800
|
+
"webhook",
|
|
3801
|
+
"schedule",
|
|
3802
|
+
"queue",
|
|
3803
|
+
"email",
|
|
3804
|
+
"form",
|
|
3805
|
+
"stream",
|
|
3806
|
+
"change"
|
|
3807
|
+
],
|
|
3808
|
+
"description": "The subscription source."
|
|
3809
|
+
},
|
|
3810
|
+
"fromState": {
|
|
3811
|
+
"type": "string",
|
|
3812
|
+
"enum": [
|
|
3813
|
+
"active",
|
|
3814
|
+
"paused",
|
|
3815
|
+
"failed",
|
|
3816
|
+
"dead-lettered"
|
|
3817
|
+
],
|
|
3818
|
+
"description": "Prior state."
|
|
3819
|
+
},
|
|
3820
|
+
"toState": {
|
|
3821
|
+
"type": "string",
|
|
3822
|
+
"enum": [
|
|
3823
|
+
"active",
|
|
3824
|
+
"paused",
|
|
3825
|
+
"failed",
|
|
3826
|
+
"dead-lettered"
|
|
3827
|
+
],
|
|
3828
|
+
"description": "New state."
|
|
3829
|
+
},
|
|
3830
|
+
"reason": {
|
|
3831
|
+
"type": "string",
|
|
3832
|
+
"enum": [
|
|
3833
|
+
"retry-exhausted",
|
|
3834
|
+
"operator-paused",
|
|
3835
|
+
"signature-invalid",
|
|
3836
|
+
"backpressure",
|
|
3837
|
+
"source-removed",
|
|
3838
|
+
"provenance-unevaluable"
|
|
3839
|
+
],
|
|
3840
|
+
"description": "MAY \u2014 a machine-stable reason code (a CLOSED enum \u2014 a free-form reason is a leak vector that would let a host spill an inbound URL/host/header into it). The load-bearing field is `toState`."
|
|
3841
|
+
}
|
|
3842
|
+
},
|
|
3843
|
+
"additionalProperties": true
|
|
3844
|
+
},
|
|
3845
|
+
"triggerDeliveryAttempted": {
|
|
3846
|
+
"type": "object",
|
|
3847
|
+
"description": "RFC 0083 \u00a7C. Emitted on each inbound-delivery attempt against an active subscription. Content-free: the subscription id, the dedup key, the attempt counter, the outcome, and the resulting runId only \u2014 NEVER the inbound body, headers, or credential material (SR-1).",
|
|
3848
|
+
"required": [
|
|
3849
|
+
"subscriptionId",
|
|
3850
|
+
"dedupKey",
|
|
3851
|
+
"attempt",
|
|
3852
|
+
"outcome"
|
|
3853
|
+
],
|
|
3854
|
+
"properties": {
|
|
3855
|
+
"subscriptionId": {
|
|
3856
|
+
"type": "string",
|
|
3857
|
+
"minLength": 1,
|
|
3858
|
+
"description": "The TriggerSubscription the delivery is for."
|
|
3859
|
+
},
|
|
3860
|
+
"dedupKey": {
|
|
3861
|
+
"type": "string",
|
|
3862
|
+
"minLength": 1,
|
|
3863
|
+
"description": "The de-duplication key (\u00a7C-1). MUST be a **host-opaque** stable key (e.g. `hash(subscriptionId + inbound-event-id)`); it MUST NOT embed inbound body / path / header content in cleartext (SR-1 \u2014 a key like `POST /webhook/orders/12345?token=\u2026` would leak). A repeat within retention is a no-op returning the prior runId."
|
|
3864
|
+
},
|
|
3865
|
+
"attempt": {
|
|
3866
|
+
"type": "integer",
|
|
3867
|
+
"minimum": 1,
|
|
3868
|
+
"description": "1-based attempt counter."
|
|
3869
|
+
},
|
|
3870
|
+
"outcome": {
|
|
3871
|
+
"type": "string",
|
|
3872
|
+
"enum": [
|
|
3873
|
+
"delivered",
|
|
3874
|
+
"retrying",
|
|
3875
|
+
"dead-lettered"
|
|
3876
|
+
],
|
|
3877
|
+
"description": "`delivered`: the run started; `retrying`: failed, will retry per policy; `dead-lettered`: retries exhausted, routed to the RFC 0053 sink (no run)."
|
|
3878
|
+
},
|
|
3879
|
+
"runId": {
|
|
3880
|
+
"type": "string",
|
|
3881
|
+
"minLength": 1,
|
|
3882
|
+
"description": "MAY \u2014 the run started by a `delivered` outcome (the run's `run.started` carries this delivery's id as `causationId`, RFC 0040). Absent for `retrying` / `dead-lettered`."
|
|
3883
|
+
}
|
|
3884
|
+
},
|
|
3885
|
+
"additionalProperties": true
|
|
3886
|
+
},
|
|
3887
|
+
"budgetReserved": {
|
|
3888
|
+
"type": "object",
|
|
3889
|
+
"description": "RFC 0084 \u00a7C. Emitted once at run start with the resolved effective budget (`min` across run/workflow/agent/project scopes, clamped to the host ceiling). A recorded fact \u2014 replay re-reads it, never re-resolves (\u00a7B). Content-free: dimension ceilings + scope only, no pricing breakdown (SR-1, `budget-no-pricing-leak`).",
|
|
3890
|
+
"required": [
|
|
3891
|
+
"effectiveBudget",
|
|
3892
|
+
"scope"
|
|
3893
|
+
],
|
|
3894
|
+
"properties": {
|
|
3895
|
+
"effectiveBudget": {
|
|
3896
|
+
"type": "object",
|
|
3897
|
+
"additionalProperties": false,
|
|
3898
|
+
"description": "The resolved per-dimension ceilings (a subset of the BudgetPolicy dimensions).",
|
|
3899
|
+
"properties": {
|
|
3900
|
+
"maxTokens": {
|
|
3901
|
+
"type": "integer",
|
|
3902
|
+
"minimum": 0
|
|
3903
|
+
},
|
|
3904
|
+
"maxCostUsd": {
|
|
3905
|
+
"type": "number",
|
|
3906
|
+
"minimum": 0
|
|
3907
|
+
},
|
|
3908
|
+
"maxToolCalls": {
|
|
3909
|
+
"type": "integer",
|
|
3910
|
+
"minimum": 0
|
|
3911
|
+
},
|
|
3912
|
+
"maxRetries": {
|
|
3913
|
+
"type": "integer",
|
|
3914
|
+
"minimum": 0
|
|
3915
|
+
}
|
|
3916
|
+
}
|
|
3917
|
+
},
|
|
3918
|
+
"scope": {
|
|
3919
|
+
"type": "string",
|
|
3920
|
+
"enum": [
|
|
3921
|
+
"run",
|
|
3922
|
+
"workflow",
|
|
3923
|
+
"agent",
|
|
3924
|
+
"project"
|
|
3925
|
+
],
|
|
3926
|
+
"description": "The binding scope the effective budget resolved from (\u00a7B)."
|
|
3927
|
+
}
|
|
3928
|
+
},
|
|
3929
|
+
"additionalProperties": false
|
|
3930
|
+
},
|
|
3931
|
+
"budgetConsumed": {
|
|
3932
|
+
"type": "object",
|
|
3933
|
+
"description": "RFC 0084 \u00a7C. A running projection of spend, derived from the existing events (`provider.usage` tokens/cost, `agent.toolCalled`, `node.retried`) \u2014 NOT a new measurement (no double-counting). The host MAY coalesce. Content-free: dimension name + integers only, no pricing breakdown / rate card (SR-1).",
|
|
3934
|
+
"required": [
|
|
3935
|
+
"dimension",
|
|
3936
|
+
"consumed",
|
|
3937
|
+
"limit"
|
|
3938
|
+
],
|
|
3939
|
+
"properties": {
|
|
3940
|
+
"dimension": {
|
|
3941
|
+
"type": "string",
|
|
3942
|
+
"enum": [
|
|
3943
|
+
"tokens",
|
|
3944
|
+
"cost",
|
|
3945
|
+
"toolCalls",
|
|
3946
|
+
"retries"
|
|
3947
|
+
],
|
|
3948
|
+
"description": "Which budget dimension this projection is for."
|
|
3949
|
+
},
|
|
3950
|
+
"consumed": {
|
|
3951
|
+
"type": "number",
|
|
3952
|
+
"minimum": 0,
|
|
3953
|
+
"description": "Amount consumed so far (tokens/calls/retries are integers; cost is a number in the host's `costEstimateUsd` units)."
|
|
3954
|
+
},
|
|
3955
|
+
"limit": {
|
|
3956
|
+
"type": "number",
|
|
3957
|
+
"minimum": 0,
|
|
3958
|
+
"description": "The effective ceiling for the dimension."
|
|
3959
|
+
},
|
|
3960
|
+
"remaining": {
|
|
3961
|
+
"type": "number",
|
|
3962
|
+
"description": "MAY \u2014 `limit - consumed`."
|
|
3963
|
+
}
|
|
3964
|
+
},
|
|
3965
|
+
"additionalProperties": false
|
|
3966
|
+
},
|
|
3967
|
+
"budgetThresholdCrossed": {
|
|
3968
|
+
"type": "object",
|
|
3969
|
+
"description": "RFC 0084 \u00a7C. Emitted once per dimension when consumption crosses `thresholdPercent`. Content-free.",
|
|
3970
|
+
"required": [
|
|
3971
|
+
"dimension",
|
|
3972
|
+
"consumed",
|
|
3973
|
+
"limit",
|
|
3974
|
+
"percent"
|
|
3975
|
+
],
|
|
3976
|
+
"properties": {
|
|
3977
|
+
"dimension": {
|
|
3978
|
+
"type": "string",
|
|
3979
|
+
"enum": [
|
|
3980
|
+
"tokens",
|
|
3981
|
+
"cost",
|
|
3982
|
+
"toolCalls",
|
|
3983
|
+
"retries"
|
|
3984
|
+
]
|
|
3985
|
+
},
|
|
3986
|
+
"consumed": {
|
|
3987
|
+
"type": "number",
|
|
3988
|
+
"minimum": 0
|
|
3989
|
+
},
|
|
3990
|
+
"limit": {
|
|
3991
|
+
"type": "number",
|
|
3992
|
+
"minimum": 0
|
|
3993
|
+
},
|
|
3994
|
+
"percent": {
|
|
3995
|
+
"type": "number",
|
|
3996
|
+
"minimum": 0,
|
|
3997
|
+
"maximum": 100,
|
|
3998
|
+
"description": "The percent-of-limit threshold crossed."
|
|
3999
|
+
}
|
|
4000
|
+
},
|
|
4001
|
+
"additionalProperties": false
|
|
4002
|
+
},
|
|
4003
|
+
"budgetExhausted": {
|
|
4004
|
+
"type": "object",
|
|
4005
|
+
"description": "RFC 0084 \u00a7C. Emitted when a dimension hits its limit. For a hard dimension this is followed by `cap.breached{kind:\"budget-*\"}` \u2192 `run.failed{budget_exhausted}` (or, with `onExhaustion:\"interrupt\"`, an approval interrupt). Content-free.",
|
|
4006
|
+
"required": [
|
|
4007
|
+
"dimension",
|
|
4008
|
+
"consumed",
|
|
4009
|
+
"limit"
|
|
4010
|
+
],
|
|
4011
|
+
"properties": {
|
|
4012
|
+
"dimension": {
|
|
4013
|
+
"type": "string",
|
|
4014
|
+
"enum": [
|
|
4015
|
+
"tokens",
|
|
4016
|
+
"cost",
|
|
4017
|
+
"toolCalls",
|
|
4018
|
+
"retries"
|
|
4019
|
+
]
|
|
4020
|
+
},
|
|
4021
|
+
"consumed": {
|
|
4022
|
+
"type": "number",
|
|
4023
|
+
"minimum": 0
|
|
4024
|
+
},
|
|
4025
|
+
"limit": {
|
|
4026
|
+
"type": "number",
|
|
4027
|
+
"minimum": 0
|
|
4028
|
+
}
|
|
4029
|
+
},
|
|
4030
|
+
"additionalProperties": false
|
|
4031
|
+
},
|
|
4032
|
+
"deploymentPromoted": {
|
|
4033
|
+
"type": "object",
|
|
4034
|
+
"description": "RFC 0082 \u00a7D. Emitted on the deployment-management run when a version is promoted into a new lifecycle state (the \u00a7E contract: authorized via RFC 0049 `deploy:*`, gated via RFC 0051 `approvalGate`, eval-verified via RFC 0081 when `requiredEval` is configured). Content-free: ids / state / scalars / content-free references only \u2014 NEVER a manifest body, prompt, or credential (SECURITY invariant `deployment-event-no-content-leak`; `additionalProperties:false` enforces it). A recorded-fact event per `replay.md` \u00a7\"Recorded-fact events\". Audit-logged with the acting principal (`auth.md`).",
|
|
4035
|
+
"additionalProperties": false,
|
|
4036
|
+
"required": [
|
|
4037
|
+
"agentId",
|
|
4038
|
+
"toVersion",
|
|
4039
|
+
"toState"
|
|
4040
|
+
],
|
|
4041
|
+
"properties": {
|
|
4042
|
+
"agentId": {
|
|
4043
|
+
"type": "string",
|
|
4044
|
+
"minLength": 1,
|
|
4045
|
+
"description": "The promoted agent's id."
|
|
4046
|
+
},
|
|
4047
|
+
"fromVersion": {
|
|
4048
|
+
"type": "string",
|
|
4049
|
+
"minLength": 1,
|
|
4050
|
+
"description": "MAY \u2014 the version previously occupying the target channel/state (absent on a first promotion)."
|
|
4051
|
+
},
|
|
4052
|
+
"toVersion": {
|
|
4053
|
+
"type": "string",
|
|
4054
|
+
"minLength": 1,
|
|
4055
|
+
"description": "The version promoted."
|
|
4056
|
+
},
|
|
4057
|
+
"toState": {
|
|
4058
|
+
"type": "string",
|
|
4059
|
+
"enum": [
|
|
4060
|
+
"draft",
|
|
4061
|
+
"test",
|
|
4062
|
+
"staged",
|
|
4063
|
+
"active",
|
|
4064
|
+
"paused",
|
|
4065
|
+
"deprecated",
|
|
4066
|
+
"rolled-back"
|
|
4067
|
+
],
|
|
4068
|
+
"description": "The lifecycle state entered."
|
|
4069
|
+
},
|
|
4070
|
+
"channel": {
|
|
4071
|
+
"type": "string",
|
|
4072
|
+
"minLength": 1,
|
|
4073
|
+
"description": "MAY \u2014 the named channel this promotion targets (when promoting to a channel)."
|
|
4074
|
+
},
|
|
4075
|
+
"canaryPercent": {
|
|
4076
|
+
"type": "integer",
|
|
4077
|
+
"minimum": 0,
|
|
4078
|
+
"maximum": 100,
|
|
4079
|
+
"description": "MAY \u2014 the canary traffic share assigned (when promoting `active` at < 100)."
|
|
4080
|
+
},
|
|
4081
|
+
"evalRunId": {
|
|
4082
|
+
"type": "string",
|
|
4083
|
+
"minLength": 1,
|
|
4084
|
+
"description": "MAY \u2014 the RFC 0081 eval run whose `EvalSummary.passed` gated this promotion (the \u00a7E evidence)."
|
|
4085
|
+
},
|
|
4086
|
+
"approvalGateId": {
|
|
4087
|
+
"type": "string",
|
|
4088
|
+
"minLength": 1,
|
|
4089
|
+
"description": "MAY \u2014 the RFC 0051 approvalGate that authorized this promotion."
|
|
4090
|
+
}
|
|
4091
|
+
}
|
|
4092
|
+
},
|
|
4093
|
+
"deploymentRolledBack": {
|
|
4094
|
+
"type": "object",
|
|
4095
|
+
"description": "RFC 0082 \u00a7D. Emitted when an `active` version is rolled back and a prior version restored to `active`. Content-free (`deployment-event-no-content-leak`). Recorded-fact; audit-logged.",
|
|
4096
|
+
"additionalProperties": false,
|
|
4097
|
+
"required": [
|
|
4098
|
+
"agentId",
|
|
4099
|
+
"fromVersion",
|
|
4100
|
+
"toVersion",
|
|
4101
|
+
"rollbackPointer"
|
|
4102
|
+
],
|
|
4103
|
+
"properties": {
|
|
4104
|
+
"agentId": {
|
|
4105
|
+
"type": "string",
|
|
4106
|
+
"minLength": 1,
|
|
4107
|
+
"description": "The agent's id."
|
|
4108
|
+
},
|
|
4109
|
+
"fromVersion": {
|
|
4110
|
+
"type": "string",
|
|
4111
|
+
"minLength": 1,
|
|
4112
|
+
"description": "The version that was rolled back (left `active`)."
|
|
4113
|
+
},
|
|
4114
|
+
"toVersion": {
|
|
4115
|
+
"type": "string",
|
|
4116
|
+
"minLength": 1,
|
|
4117
|
+
"description": "The version restored to `active`."
|
|
4118
|
+
},
|
|
4119
|
+
"rollbackPointer": {
|
|
4120
|
+
"type": "string",
|
|
4121
|
+
"minLength": 1,
|
|
4122
|
+
"description": "The recovery target the rolled-back record points to (= `toVersion`)."
|
|
4123
|
+
},
|
|
4124
|
+
"reason": {
|
|
4125
|
+
"type": "string",
|
|
4126
|
+
"minLength": 1,
|
|
4127
|
+
"description": "MAY \u2014 a short redaction-safe rollback reason label (NOT free-text content; same posture as `run.dead_lettered.reason`)."
|
|
4128
|
+
}
|
|
4129
|
+
}
|
|
4130
|
+
},
|
|
4131
|
+
"deploymentCanaryAdjusted": {
|
|
4132
|
+
"type": "object",
|
|
4133
|
+
"description": "RFC 0082 \u00a7D. Emitted when an `active` version's canary traffic share changes. Content-free (`deployment-event-no-content-leak`). Recorded-fact; audit-logged.",
|
|
4134
|
+
"additionalProperties": false,
|
|
4135
|
+
"required": [
|
|
4136
|
+
"agentId",
|
|
4137
|
+
"version",
|
|
4138
|
+
"fromPercent",
|
|
4139
|
+
"toPercent"
|
|
4140
|
+
],
|
|
4141
|
+
"properties": {
|
|
4142
|
+
"agentId": {
|
|
4143
|
+
"type": "string",
|
|
4144
|
+
"minLength": 1,
|
|
4145
|
+
"description": "The agent's id."
|
|
4146
|
+
},
|
|
4147
|
+
"version": {
|
|
4148
|
+
"type": "string",
|
|
4149
|
+
"minLength": 1,
|
|
4150
|
+
"description": "The version whose canary share changed."
|
|
4151
|
+
},
|
|
4152
|
+
"fromPercent": {
|
|
4153
|
+
"type": "integer",
|
|
4154
|
+
"minimum": 0,
|
|
4155
|
+
"maximum": 100,
|
|
4156
|
+
"description": "The prior canary percent."
|
|
4157
|
+
},
|
|
4158
|
+
"toPercent": {
|
|
4159
|
+
"type": "integer",
|
|
4160
|
+
"minimum": 0,
|
|
4161
|
+
"maximum": 100,
|
|
4162
|
+
"description": "The new canary percent."
|
|
4163
|
+
}
|
|
4164
|
+
}
|
|
4165
|
+
},
|
|
4166
|
+
"deploymentStateChanged": {
|
|
4167
|
+
"type": "object",
|
|
4168
|
+
"description": "RFC 0082 \u00a7D. Emitted on any non-promotion lifecycle transition (pause / resume / deprecate). Content-free (`deployment-event-no-content-leak`). Recorded-fact; audit-logged.",
|
|
4169
|
+
"additionalProperties": false,
|
|
4170
|
+
"required": [
|
|
4171
|
+
"agentId",
|
|
4172
|
+
"version",
|
|
4173
|
+
"fromState",
|
|
4174
|
+
"toState"
|
|
4175
|
+
],
|
|
4176
|
+
"properties": {
|
|
4177
|
+
"agentId": {
|
|
4178
|
+
"type": "string",
|
|
4179
|
+
"minLength": 1,
|
|
4180
|
+
"description": "The agent's id."
|
|
4181
|
+
},
|
|
4182
|
+
"version": {
|
|
4183
|
+
"type": "string",
|
|
4184
|
+
"minLength": 1,
|
|
4185
|
+
"description": "The version whose state changed."
|
|
4186
|
+
},
|
|
4187
|
+
"fromState": {
|
|
4188
|
+
"type": "string",
|
|
4189
|
+
"enum": [
|
|
4190
|
+
"draft",
|
|
4191
|
+
"test",
|
|
4192
|
+
"staged",
|
|
4193
|
+
"active",
|
|
4194
|
+
"paused",
|
|
4195
|
+
"deprecated",
|
|
4196
|
+
"rolled-back"
|
|
4197
|
+
],
|
|
4198
|
+
"description": "The prior state."
|
|
4199
|
+
},
|
|
4200
|
+
"toState": {
|
|
4201
|
+
"type": "string",
|
|
4202
|
+
"enum": [
|
|
4203
|
+
"draft",
|
|
4204
|
+
"test",
|
|
4205
|
+
"staged",
|
|
4206
|
+
"active",
|
|
4207
|
+
"paused",
|
|
4208
|
+
"deprecated",
|
|
4209
|
+
"rolled-back"
|
|
4210
|
+
],
|
|
4211
|
+
"description": "The new state."
|
|
4212
|
+
}
|
|
4213
|
+
}
|
|
4214
|
+
},
|
|
4215
|
+
"rosterRunInitiated": {
|
|
4216
|
+
"type": "object",
|
|
4217
|
+
"description": "RFC 0086 \u00a7C. Emitted once, immediately after `run.started` and before any agent invocation, when a trigger (RFC 0052 schedule / RFC 0083 durable work item) fires a workflow in a roster member's portfolio \u2014 attributing the run to the standing agent. Content-free (`roster-attribution-no-content`): ids + persona + trigger source ONLY \u2014 never the work-item body, prompt, or credential material (SR-1). A recorded-fact event (replay.md \u00a7'Recorded-fact events'): re-emitted from the log on replay, identifiers never regenerated, so the run stays attributed to the same member even if the entry was since renamed or deleted.",
|
|
4218
|
+
"additionalProperties": false,
|
|
4219
|
+
"required": [
|
|
4220
|
+
"rosterId",
|
|
4221
|
+
"persona",
|
|
4222
|
+
"agentId",
|
|
4223
|
+
"workflowId",
|
|
4224
|
+
"triggerSource"
|
|
4225
|
+
],
|
|
4226
|
+
"properties": {
|
|
4227
|
+
"rosterId": {
|
|
4228
|
+
"type": "string",
|
|
4229
|
+
"minLength": 1,
|
|
4230
|
+
"description": "The standing agent instance the run is attributed to (a `host:<id>` AgentRef agentId)."
|
|
4231
|
+
},
|
|
4232
|
+
"persona": {
|
|
4233
|
+
"type": "string",
|
|
4234
|
+
"minLength": 1,
|
|
4235
|
+
"description": "The member's human display name (e.g. \"Sally\")."
|
|
4236
|
+
},
|
|
4237
|
+
"agentId": {
|
|
4238
|
+
"type": "string",
|
|
4239
|
+
"minLength": 1,
|
|
4240
|
+
"description": "The manifest agentId the member instantiates (`agentRef.agentId`)."
|
|
4241
|
+
},
|
|
4242
|
+
"workflowId": {
|
|
4243
|
+
"type": "string",
|
|
4244
|
+
"minLength": 1,
|
|
4245
|
+
"description": "The portfolio workflow this run executes."
|
|
4246
|
+
},
|
|
4247
|
+
"triggerSource": {
|
|
4248
|
+
"type": "string",
|
|
4249
|
+
"minLength": 1,
|
|
4250
|
+
"description": "What fired the run: an RFC 0083 source (`schedule`/`webhook`/`queue`/`email`/`form`) or a host-extension source name (e.g. a vendor Kanban bridge)."
|
|
4251
|
+
},
|
|
4252
|
+
"triggerSubscriptionId": {
|
|
4253
|
+
"type": "string",
|
|
4254
|
+
"minLength": 1,
|
|
4255
|
+
"description": "MAY. The RFC 0083 trigger-subscription id when the fire came through the durable trigger bridge, so trigger \u2192 run \u2192 roster is traceable via /ancestry (RFC 0040)."
|
|
4256
|
+
}
|
|
4257
|
+
}
|
|
4258
|
+
},
|
|
4259
|
+
"compensationRequested": {
|
|
4260
|
+
"type": "object",
|
|
4261
|
+
"additionalProperties": false,
|
|
4262
|
+
"description": "RFC 0151 \u00a7D \u2014 plan persisted, before the first inverse action. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4263
|
+
"properties": {
|
|
4264
|
+
"compensationId": {
|
|
4265
|
+
"type": "string",
|
|
4266
|
+
"minLength": 1
|
|
4267
|
+
},
|
|
4268
|
+
"nodeId": {
|
|
4269
|
+
"type": "string"
|
|
4270
|
+
},
|
|
4271
|
+
"effectId": {
|
|
4272
|
+
"type": "string"
|
|
4273
|
+
},
|
|
4274
|
+
"attempt": {
|
|
4275
|
+
"type": "integer",
|
|
4276
|
+
"minimum": 0
|
|
4277
|
+
},
|
|
4278
|
+
"orderingModel": {
|
|
4279
|
+
"enum": [
|
|
4280
|
+
"reverse-completion",
|
|
4281
|
+
"dependency-graph"
|
|
4282
|
+
]
|
|
4283
|
+
}
|
|
4284
|
+
}
|
|
4285
|
+
},
|
|
4286
|
+
"compensationStarted": {
|
|
4287
|
+
"type": "object",
|
|
4288
|
+
"additionalProperties": false,
|
|
4289
|
+
"description": "RFC 0151 \u00a7D \u2014 first inverse action started. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4290
|
+
"properties": {
|
|
4291
|
+
"compensationId": {
|
|
4292
|
+
"type": "string",
|
|
4293
|
+
"minLength": 1
|
|
4294
|
+
},
|
|
4295
|
+
"nodeId": {
|
|
4296
|
+
"type": "string"
|
|
4297
|
+
},
|
|
4298
|
+
"effectId": {
|
|
4299
|
+
"type": "string"
|
|
4300
|
+
},
|
|
4301
|
+
"attempt": {
|
|
4302
|
+
"type": "integer",
|
|
4303
|
+
"minimum": 0
|
|
4304
|
+
},
|
|
4305
|
+
"orderingModel": {
|
|
4306
|
+
"enum": [
|
|
4307
|
+
"reverse-completion",
|
|
4308
|
+
"dependency-graph"
|
|
4309
|
+
]
|
|
4310
|
+
}
|
|
4311
|
+
}
|
|
4312
|
+
},
|
|
4313
|
+
"compensationCompleted": {
|
|
4314
|
+
"type": "object",
|
|
4315
|
+
"additionalProperties": false,
|
|
4316
|
+
"description": "RFC 0151 \u00a7D \u2014 every inverse action succeeded. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4317
|
+
"properties": {
|
|
4318
|
+
"compensationId": {
|
|
4319
|
+
"type": "string",
|
|
4320
|
+
"minLength": 1
|
|
4321
|
+
},
|
|
4322
|
+
"nodeId": {
|
|
4323
|
+
"type": "string"
|
|
4324
|
+
},
|
|
4325
|
+
"effectId": {
|
|
4326
|
+
"type": "string"
|
|
4327
|
+
},
|
|
4328
|
+
"attempt": {
|
|
4329
|
+
"type": "integer",
|
|
4330
|
+
"minimum": 0
|
|
4331
|
+
},
|
|
4332
|
+
"orderingModel": {
|
|
4333
|
+
"enum": [
|
|
4334
|
+
"reverse-completion",
|
|
4335
|
+
"dependency-graph"
|
|
4336
|
+
]
|
|
4337
|
+
}
|
|
4338
|
+
}
|
|
4339
|
+
},
|
|
4340
|
+
"compensationFailed": {
|
|
4341
|
+
"type": "object",
|
|
4342
|
+
"additionalProperties": false,
|
|
4343
|
+
"description": "RFC 0151 \u00a7D \u2014 an inverse action exhausted its retries. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4344
|
+
"properties": {
|
|
4345
|
+
"compensationId": {
|
|
4346
|
+
"type": "string",
|
|
4347
|
+
"minLength": 1
|
|
4348
|
+
},
|
|
4349
|
+
"nodeId": {
|
|
4350
|
+
"type": "string"
|
|
4351
|
+
},
|
|
4352
|
+
"effectId": {
|
|
4353
|
+
"type": "string"
|
|
4354
|
+
},
|
|
4355
|
+
"attempt": {
|
|
4356
|
+
"type": "integer",
|
|
4357
|
+
"minimum": 0
|
|
4358
|
+
},
|
|
4359
|
+
"orderingModel": {
|
|
4360
|
+
"enum": [
|
|
4361
|
+
"reverse-completion",
|
|
4362
|
+
"dependency-graph"
|
|
4363
|
+
]
|
|
4364
|
+
},
|
|
4365
|
+
"reason": {
|
|
4366
|
+
"enum": [
|
|
4367
|
+
"retries-exhausted",
|
|
4368
|
+
"approval-denied",
|
|
4369
|
+
"authority-denied",
|
|
4370
|
+
"dead-lettered",
|
|
4371
|
+
"operator-terminated"
|
|
4372
|
+
],
|
|
4373
|
+
"description": "Closed reason vocabulary. An open string here would invite a provider error body."
|
|
4374
|
+
}
|
|
4375
|
+
}
|
|
4376
|
+
},
|
|
4377
|
+
"compensationPaused": {
|
|
4378
|
+
"type": "object",
|
|
4379
|
+
"additionalProperties": false,
|
|
4380
|
+
"description": "RFC 0151 \u00a7D \u2014 paused for authorized intervention. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4381
|
+
"properties": {
|
|
4382
|
+
"compensationId": {
|
|
4383
|
+
"type": "string",
|
|
4384
|
+
"minLength": 1
|
|
4385
|
+
},
|
|
4386
|
+
"nodeId": {
|
|
4387
|
+
"type": "string"
|
|
4388
|
+
},
|
|
4389
|
+
"effectId": {
|
|
4390
|
+
"type": "string"
|
|
4391
|
+
},
|
|
4392
|
+
"attempt": {
|
|
4393
|
+
"type": "integer",
|
|
4394
|
+
"minimum": 0
|
|
4395
|
+
},
|
|
4396
|
+
"orderingModel": {
|
|
4397
|
+
"enum": [
|
|
4398
|
+
"reverse-completion",
|
|
4399
|
+
"dependency-graph"
|
|
4400
|
+
]
|
|
4401
|
+
},
|
|
4402
|
+
"reason": {
|
|
4403
|
+
"enum": [
|
|
4404
|
+
"retries-exhausted",
|
|
4405
|
+
"approval-denied",
|
|
4406
|
+
"authority-denied",
|
|
4407
|
+
"dead-lettered",
|
|
4408
|
+
"operator-terminated"
|
|
4409
|
+
],
|
|
4410
|
+
"description": "Closed reason vocabulary. An open string here would invite a provider error body."
|
|
4411
|
+
}
|
|
4412
|
+
}
|
|
4413
|
+
},
|
|
4414
|
+
"compensationManualInterventionRequired": {
|
|
4415
|
+
"type": "object",
|
|
4416
|
+
"additionalProperties": false,
|
|
4417
|
+
"description": "RFC 0151 \u00a7D \u2014 operator action required. Content-free: opaque node/effect IDs, attempt, ordering model, and closed reason codes. Provider bodies and credentials MUST NOT appear (\u00a7D/\u00a7G) \u2014 these land in the durable log, the least revocable place a credential can reach.",
|
|
4418
|
+
"properties": {
|
|
4419
|
+
"compensationId": {
|
|
4420
|
+
"type": "string",
|
|
4421
|
+
"minLength": 1
|
|
4422
|
+
},
|
|
4423
|
+
"nodeId": {
|
|
4424
|
+
"type": "string"
|
|
4425
|
+
},
|
|
4426
|
+
"effectId": {
|
|
4427
|
+
"type": "string"
|
|
4428
|
+
},
|
|
4429
|
+
"attempt": {
|
|
4430
|
+
"type": "integer",
|
|
4431
|
+
"minimum": 0
|
|
4432
|
+
},
|
|
4433
|
+
"orderingModel": {
|
|
4434
|
+
"enum": [
|
|
4435
|
+
"reverse-completion",
|
|
4436
|
+
"dependency-graph"
|
|
4437
|
+
]
|
|
4438
|
+
},
|
|
4439
|
+
"reason": {
|
|
4440
|
+
"enum": [
|
|
4441
|
+
"retries-exhausted",
|
|
4442
|
+
"approval-denied",
|
|
4443
|
+
"authority-denied",
|
|
4444
|
+
"dead-lettered",
|
|
4445
|
+
"operator-terminated"
|
|
4446
|
+
],
|
|
4447
|
+
"description": "Closed reason vocabulary. An open string here would invite a provider error body."
|
|
4448
|
+
}
|
|
4449
|
+
}
|
|
4450
|
+
}
|
|
4451
|
+
}
|
|
4452
|
+
}
|