@openwop/spec-artifacts 2.0.0-rc.9 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/CORPUS-STAMP.json +40 -37
  2. package/api/seams-v2.yaml +1 -1
  3. package/api/v2/asyncapi.yaml +1 -1
  4. package/api/v2/openapi.yaml +17 -19
  5. package/package.json +1 -1
  6. package/schemas/capabilities.schema.json +40 -1
  7. package/schemas/run-snapshot.schema.json +103 -33
  8. package/schemas/v2/agent-deployment-transition.schema.json +5 -6
  9. package/schemas/v2/agent-deployment.schema.json +8 -9
  10. package/schemas/v2/agent-eval-suite.schema.json +11 -12
  11. package/schemas/v2/artifact-type-pack-manifest.schema.json +22 -18
  12. package/schemas/v2/certification-bundle.schema.json +1 -1
  13. package/schemas/v2/chat-card-pack-manifest.schema.json +19 -15
  14. package/schemas/v2/debug-bundle.schema.json +6 -6
  15. package/schemas/v2/effect-ledger-projection.schema.json +4 -3
  16. package/schemas/v2/effect-seam-manifest.schema.json +30 -7
  17. package/schemas/v2/error-envelope.schema.json +185 -138
  18. package/schemas/v2/eval-summary.schema.json +17 -10
  19. package/schemas/v2/goal.schema.json +5 -5
  20. package/schemas/v2/ids.schema.json +120 -22
  21. package/schemas/v2/node-pack-manifest.schema.json +27 -31
  22. package/schemas/v2/proposal.schema.json +7 -8
  23. package/schemas/v2/run-event-payloads.schema.json +258 -245
  24. package/schemas/v2/run-event.schema.json +2 -126
  25. package/schemas/v2/run-options.schema.json +1 -1
  26. package/schemas/v2/run-snapshot.schema.json +34 -13
  27. package/schemas/v2/webhook-delivery.schema.json +26 -0
  28. package/schemas/v2/workflow-chain-pack-manifest.schema.json +41 -45
  29. package/schemas/v2/workflow-definition.schema.json +31 -36
  30. package/spec/v1/core-standard-manifest.json +2 -2
  31. package/spec/v1/deprecations.json +79 -67
  32. package/spec/v1/deprecations.schema.json +23 -7
  33. package/spec/v1/extensions.json +3 -2
  34. package/spec/v2/declaration.json +57 -33
  35. package/spec/v2/errors.json +421 -360
  36. package/spec/v2/id-field-bindings.json +105 -0
  37. package/spec/v2/profiles.json +31 -7
  38. package/spec/v2/release.json +3 -3
  39. package/spec/v2/retention-floors.json +35 -0
@@ -1,279 +1,301 @@
1
1
  {
2
2
  "$schema": "https://openwop.dev/spec/v2/errors.schema.json",
3
- "$comment": "RFC 0171 §B.1 the error registry: one row per code {code, httpStatus, retriable, details, since, deprecated?}. schemas/v2/error-envelope.schema.json is GENERATED from it (scripts/generate-error-envelope.mjs). Retry timing lives in Retry-After only (§B.2). statusSource records whether the status was stated in v1 prose, a v1 convention, or decided here. details is null until a code's details schema is registered (a null row means details is an open object for that code closure over details is the RFC 0171 Phase 3 follow-up G-row).",
3
+ "$comment": "RFC 0171 \u00a7B.1 \u2014 the error registry: one row per code {code, httpStatus, retriable, details, since, deprecated?}. schemas/v2/error-envelope.schema.json is GENERATED from it (scripts/generate-error-envelope.mjs). Retry timing lives in Retry-After only (\u00a7B.2). statusSource records whether the status was stated in v1 prose, a v1 convention, or decided here. details is null until a code's details schema is registered (a null row means details is an open object for that code \u2014 closure over details is the RFC 0171 Phase 3 follow-up G-row).",
4
4
  "version": "2.0",
5
- "updated": "2026-09-03",
5
+ "updated": "2026-09-05",
6
6
  "vendorCodePattern": "^(?!openwop\\.)[a-z][a-z0-9]*(-[a-z0-9]+)*\\.[a-z][a-z0-9_]*$",
7
7
  "rows": [
8
8
  {
9
- "code": "audience_mismatch",
10
- "httpStatus": 401,
11
- "statusSource": "v2 decision",
9
+ "code": "connection_provider_unresolved",
10
+ "httpStatus": 400,
11
+ "statusSource": "v1 prose",
12
12
  "retriable": false,
13
13
  "details": null,
14
- "since": "2.0",
15
- "source": "RFC 0170 §B.1"
14
+ "since": "1.0",
15
+ "source": "spec/v1/connection-packs.md"
16
16
  },
17
17
  {
18
- "code": "capability_not_provided",
19
- "httpStatus": 422,
18
+ "code": "connector_action_unresolved",
19
+ "httpStatus": 400,
20
20
  "statusSource": "v1 convention",
21
21
  "retriable": false,
22
22
  "details": null,
23
23
  "since": "1.0",
24
- "source": "spec/v1/rest-endpoints.md §Error response shape"
24
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
25
25
  },
26
26
  {
27
- "code": "capability_required",
28
- "httpStatus": 422,
27
+ "code": "credential_scope_unsupported",
28
+ "httpStatus": 400,
29
29
  "statusSource": "v1 convention",
30
30
  "retriable": false,
31
31
  "details": null,
32
32
  "since": "1.0",
33
- "source": "spec/v1/rest-endpoints.md §Error response shape"
33
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
34
34
  },
35
35
  {
36
- "code": "client_version_unsupported",
37
- "httpStatus": 426,
36
+ "code": "delegation_chain_cyclic",
37
+ "httpStatus": 400,
38
38
  "statusSource": "v2 decision",
39
39
  "retriable": false,
40
40
  "details": null,
41
41
  "since": "2.0",
42
- "source": "RFC 0172 row C5.8"
43
- },
44
- {
45
- "code": "connection_provider_conflict",
46
- "httpStatus": 409,
47
- "statusSource": "v1 prose",
48
- "retriable": false,
49
- "details": null,
50
- "since": "1.0",
51
- "source": "spec/v1/connection-packs.md; RFC 0177 §D.1 fail-closed"
42
+ "source": "RFC 0170 \u00a7B.1"
52
43
  },
53
44
  {
54
- "code": "connection_provider_unresolved",
45
+ "code": "delegation_chain_too_long",
55
46
  "httpStatus": 400,
56
- "statusSource": "v1 prose",
47
+ "statusSource": "v2 decision",
57
48
  "retriable": false,
58
49
  "details": null,
59
- "since": "1.0",
60
- "source": "spec/v1/connection-packs.md"
50
+ "since": "2.0",
51
+ "source": "RFC 0170 \u00a7B.1"
61
52
  },
62
53
  {
63
- "code": "connector_action_unresolved",
54
+ "code": "idempotency_key_invalid",
64
55
  "httpStatus": 400,
65
- "statusSource": "v1 convention",
56
+ "statusSource": "v2 decision",
66
57
  "retriable": false,
67
58
  "details": null,
68
- "since": "1.0",
69
- "source": "spec/v1/rest-endpoints.md §Error response shape"
59
+ "since": "2.0",
60
+ "source": "RFC 0170 \u00a7D.3"
70
61
  },
71
62
  {
72
- "code": "connector_auth_expired",
73
- "httpStatus": 401,
63
+ "code": "interop_version_unsupported",
64
+ "httpStatus": 400,
74
65
  "statusSource": "v1 convention",
75
66
  "retriable": false,
76
67
  "details": null,
77
68
  "since": "1.0",
78
- "source": "spec/v1/rest-endpoints.md §Error response shape"
69
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
79
70
  },
80
71
  {
81
- "code": "credential_forbidden",
82
- "httpStatus": 403,
72
+ "code": "oauth_provider_unsupported",
73
+ "httpStatus": 400,
83
74
  "statusSource": "v1 convention",
84
75
  "retriable": false,
85
76
  "details": null,
86
77
  "since": "1.0",
87
- "source": "spec/v1/rest-endpoints.md §Error response shape"
78
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
88
79
  },
89
80
  {
90
- "code": "credential_not_found",
91
- "httpStatus": 404,
81
+ "code": "oauth_scope_unsupported",
82
+ "httpStatus": 400,
92
83
  "statusSource": "v1 convention",
93
84
  "retriable": false,
94
85
  "details": null,
95
86
  "since": "1.0",
96
- "source": "spec/v1/rest-endpoints.md §Error response shape"
87
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
97
88
  },
98
89
  {
99
- "code": "credential_required",
100
- "httpStatus": 422,
101
- "statusSource": "v1 convention",
90
+ "code": "pack_dependency_cycle",
91
+ "httpStatus": 400,
92
+ "statusSource": "v1 convention (node-packs.md)",
102
93
  "retriable": false,
103
94
  "details": null,
104
95
  "since": "1.0",
105
- "source": "spec/v1/rest-endpoints.md §Error response shape"
96
+ "source": "spec/v1/node-packs.md"
106
97
  },
107
98
  {
108
- "code": "credential_revoked",
109
- "httpStatus": 401,
99
+ "code": "pack_engine_unsupported",
100
+ "httpStatus": 400,
110
101
  "statusSource": "v2 decision",
111
102
  "retriable": false,
112
103
  "details": null,
113
104
  "since": "2.0",
114
- "source": "RFC 0170 §B.3"
105
+ "source": "RFC 0177 \u00a7A.1"
115
106
  },
116
107
  {
117
- "code": "credential_scope_unsupported",
108
+ "code": "pack_integrity_failure",
118
109
  "httpStatus": 400,
119
- "statusSource": "v1 convention",
110
+ "statusSource": "v1 convention (node-packs.md)",
120
111
  "retriable": false,
121
112
  "details": null,
122
113
  "since": "1.0",
123
- "source": "spec/v1/rest-endpoints.md §Error response shape"
114
+ "source": "spec/v1/node-packs.md"
124
115
  },
125
116
  {
126
- "code": "credential_unavailable",
127
- "httpStatus": 501,
128
- "statusSource": "v1 convention",
117
+ "code": "pack_kind_invalid",
118
+ "httpStatus": 400,
119
+ "statusSource": "v1 convention (node-packs.md)",
129
120
  "retriable": false,
130
121
  "details": null,
131
122
  "since": "1.0",
132
- "source": "spec/v1/rest-endpoints.md §Error response shape"
123
+ "source": "spec/v1/node-packs.md"
133
124
  },
134
125
  {
135
- "code": "delegation_chain_cyclic",
126
+ "code": "pack_lockfile_incomplete",
136
127
  "httpStatus": 400,
137
- "statusSource": "v2 decision",
128
+ "statusSource": "v1 convention (node-packs.md)",
138
129
  "retriable": false,
139
130
  "details": null,
140
- "since": "2.0",
141
- "source": "RFC 0170 §B.1"
131
+ "since": "1.0",
132
+ "source": "spec/v1/node-packs.md"
142
133
  },
143
134
  {
144
- "code": "delegation_chain_too_long",
135
+ "code": "pack_peer_dependency_missing",
145
136
  "httpStatus": 400,
146
- "statusSource": "v2 decision",
137
+ "statusSource": "v1 convention (node-packs.md)",
147
138
  "retriable": false,
148
139
  "details": null,
149
- "since": "2.0",
150
- "source": "RFC 0170 §B.1"
140
+ "since": "1.0",
141
+ "source": "spec/v1/node-packs.md"
151
142
  },
152
143
  {
153
- "code": "delegation_expired",
154
- "httpStatus": 401,
155
- "statusSource": "v2 decision",
144
+ "code": "pack_peer_dependency_undefined",
145
+ "httpStatus": 400,
146
+ "statusSource": "v1 convention (node-packs.md)",
156
147
  "retriable": false,
157
148
  "details": null,
158
- "since": "2.0",
159
- "source": "RFC 0170 §B.1"
149
+ "since": "1.0",
150
+ "source": "spec/v1/node-packs.md"
160
151
  },
161
152
  {
162
- "code": "delegation_scope_amplified",
163
- "httpStatus": 403,
164
- "statusSource": "v2 decision",
153
+ "code": "pack_signature_invalid",
154
+ "httpStatus": 400,
155
+ "statusSource": "v1 convention (node-packs.md)",
165
156
  "retriable": false,
166
157
  "details": null,
167
- "since": "2.0",
168
- "source": "RFC 0170 §B.1"
158
+ "since": "1.0",
159
+ "source": "spec/v1/node-packs.md"
169
160
  },
170
161
  {
171
- "code": "envelope_correlation_conflict",
172
- "httpStatus": 409,
173
- "statusSource": "v1 prose",
162
+ "code": "pack_validation_failed",
163
+ "httpStatus": 400,
164
+ "statusSource": "v1 convention (node-packs.md)",
174
165
  "retriable": false,
175
166
  "details": null,
176
167
  "since": "1.0",
177
- "source": "spec/v1/ai-envelope.md E2 (correlationId type conflict)"
168
+ "source": "spec/v1/node-packs.md"
178
169
  },
179
170
  {
180
- "code": "envelope_invalid",
181
- "httpStatus": 422,
182
- "statusSource": "v1 convention",
171
+ "code": "protocol_version_mismatch",
172
+ "httpStatus": 400,
173
+ "statusSource": "v2 decision",
183
174
  "retriable": false,
184
175
  "details": null,
185
- "since": "1.0",
186
- "source": "spec/v1/rest-endpoints.md §Error response shape"
176
+ "since": "2.0",
177
+ "source": "RFC 0172 \u00a7A.3"
187
178
  },
188
179
  {
189
- "code": "envelope_refusal",
190
- "httpStatus": 422,
180
+ "code": "schedule_horizon_exceeded",
181
+ "httpStatus": 400,
191
182
  "statusSource": "v1 convention",
192
183
  "retriable": false,
193
184
  "details": null,
194
185
  "since": "1.0",
195
- "source": "spec/v1/rest-endpoints.md §Error response shape"
186
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
196
187
  },
197
188
  {
198
- "code": "envelope_truncation_unrecoverable",
199
- "httpStatus": 422,
200
- "statusSource": "v1 convention",
189
+ "code": "sub_chain_cycle",
190
+ "httpStatus": 400,
191
+ "statusSource": "v2 decision",
201
192
  "retriable": false,
202
193
  "details": null,
203
- "since": "1.0",
204
- "source": "spec/v1/rest-endpoints.md §Error response shape"
194
+ "since": "2.0",
195
+ "source": "RFC 0133 \u00a7Unresolved 3 (resolved: maxSubChainDepth 8, fail closed); carried into v2 by RFC 0177 \u00a7E"
205
196
  },
206
197
  {
207
- "code": "event_type_unmapped",
208
- "httpStatus": 500,
198
+ "code": "sub_chain_depth_exceeded",
199
+ "httpStatus": 400,
209
200
  "statusSource": "v2 decision",
210
201
  "retriable": false,
211
202
  "details": null,
212
203
  "since": "2.0",
213
- "source": "RFC 0176 §A.3 (a run whose log the host cannot translate is not readable)"
204
+ "source": "RFC 0133 \u00a7Unresolved 3 \u2014 the depth ceiling breach (distinct from a cycle)"
214
205
  },
215
206
  {
216
- "code": "forbidden",
217
- "httpStatus": 403,
207
+ "code": "unsupported_stream_mode",
208
+ "httpStatus": 400,
218
209
  "statusSource": "v1 prose",
219
210
  "retriable": false,
211
+ "details": {
212
+ "type": "object",
213
+ "required": [
214
+ "supported"
215
+ ],
216
+ "properties": {
217
+ "supported": {
218
+ "type": "array",
219
+ "minItems": 1,
220
+ "items": {
221
+ "type": "string",
222
+ "enum": [
223
+ "values",
224
+ "updates",
225
+ "messages",
226
+ "debug"
227
+ ]
228
+ },
229
+ "description": "Each individual mode the host serves; combinations are not listed (events.md \u00a7The events channel)."
230
+ }
231
+ },
232
+ "additionalProperties": true
233
+ },
234
+ "since": "1.0",
235
+ "source": "api/openapi.yaml UnsupportedStreamMode (RFC 0171 \u00a7B.1 folds the one-member enum)"
236
+ },
237
+ {
238
+ "code": "until_in_past",
239
+ "httpStatus": 400,
240
+ "statusSource": "v2 decision",
241
+ "retriable": false,
220
242
  "details": null,
221
- "since": "1.0",
222
- "source": "spec/v1/auth.md (v1 MUST)"
243
+ "since": "2.0",
244
+ "source": "RFC 0169 \u00a7A.3 (validation_error details.reason in v1; a code in v2)"
223
245
  },
224
246
  {
225
- "code": "force_engine_version_forbidden",
226
- "httpStatus": 403,
227
- "statusSource": "v1 prose",
247
+ "code": "validation_error",
248
+ "httpStatus": 400,
249
+ "statusSource": "v1 convention",
228
250
  "retriable": false,
229
251
  "details": null,
230
252
  "since": "1.0",
231
- "source": "spec/v1/run-options.md / version-negotiation.md (OpenWOP-Force-Engine-Version outside test keys)"
253
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
232
254
  },
233
255
  {
234
- "code": "fork_point_invalid",
235
- "httpStatus": 422,
256
+ "code": "webhook_url_rejected",
257
+ "httpStatus": 400,
236
258
  "statusSource": "v2 decision",
237
259
  "retriable": false,
238
260
  "details": null,
239
261
  "since": "2.0",
240
- "source": "spec/v2/core/runs.md §Fork"
262
+ "source": "spec/v2/core/webhooks.md \u00a7Egress"
241
263
  },
242
264
  {
243
- "code": "id_tenant_mismatch",
244
- "httpStatus": 403,
265
+ "code": "audience_mismatch",
266
+ "httpStatus": 401,
245
267
  "statusSource": "v2 decision",
246
268
  "retriable": false,
247
269
  "details": null,
248
270
  "since": "2.0",
249
- "source": "RFC 0170 §D.1 (an id whose tenant segment is not the caller's)"
271
+ "source": "RFC 0170 \u00a7B.1"
250
272
  },
251
273
  {
252
- "code": "idempotency_in_flight",
253
- "httpStatus": 409,
254
- "statusSource": "v1 prose",
274
+ "code": "connector_auth_expired",
275
+ "httpStatus": 401,
276
+ "statusSource": "v1 convention",
255
277
  "retriable": false,
256
278
  "details": null,
257
279
  "since": "1.0",
258
- "source": "spec/v1/idempotency.md §Concurrent duplicates (v1 MUST; RFC 0171 §B.2 keeps one mismatch code, this is the in-flight state)"
280
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
259
281
  },
260
282
  {
261
- "code": "idempotency_key_invalid",
262
- "httpStatus": 400,
283
+ "code": "credential_revoked",
284
+ "httpStatus": 401,
263
285
  "statusSource": "v2 decision",
264
286
  "retriable": false,
265
287
  "details": null,
266
288
  "since": "2.0",
267
- "source": "RFC 0170 §D.3"
289
+ "source": "RFC 0170 \u00a7B.3"
268
290
  },
269
291
  {
270
- "code": "idempotency_key_mismatch",
271
- "httpStatus": 409,
272
- "statusSource": "v1 prose",
292
+ "code": "delegation_expired",
293
+ "httpStatus": 401,
294
+ "statusSource": "v2 decision",
273
295
  "retriable": false,
274
296
  "details": null,
275
- "since": "1.0",
276
- "source": "spec/v1/idempotency.md (the only spelling; RFC 0171 §B.2)"
297
+ "since": "2.0",
298
+ "source": "RFC 0170 \u00a7B.1"
277
299
  },
278
300
  {
279
301
  "code": "identity_unresolvable",
@@ -282,7 +304,7 @@
282
304
  "retriable": false,
283
305
  "details": null,
284
306
  "since": "2.0",
285
- "source": "RFC 0170 §B.1"
307
+ "source": "RFC 0170 \u00a7B.1"
286
308
  },
287
309
  {
288
310
  "code": "identity_unverified",
@@ -291,97 +313,88 @@
291
313
  "retriable": false,
292
314
  "details": null,
293
315
  "since": "2.0",
294
- "source": "RFC 0170 §B.1 / RFC 0154"
295
- },
296
- {
297
- "code": "internal_error",
298
- "httpStatus": 500,
299
- "statusSource": "v1 convention",
300
- "retriable": true,
301
- "details": null,
302
- "since": "1.0",
303
- "source": "spec/v1/rest-endpoints.md §Error response shape"
316
+ "source": "RFC 0170 \u00a7B.1 / RFC 0154"
304
317
  },
305
318
  {
306
- "code": "interop_version_unsupported",
307
- "httpStatus": 400,
308
- "statusSource": "v1 convention",
319
+ "code": "interrupt_token_invalid",
320
+ "httpStatus": 401,
321
+ "statusSource": "v2 decision",
309
322
  "retriable": false,
310
323
  "details": null,
311
- "since": "1.0",
312
- "source": "spec/v1/rest-endpoints.md §Error response shape"
324
+ "since": "2.0",
325
+ "source": "RFC 0170 \u00a7E.1"
313
326
  },
314
327
  {
315
- "code": "interrupt_already_resolved",
316
- "httpStatus": 409,
317
- "statusSource": "v1 prose",
328
+ "code": "key_revoked",
329
+ "httpStatus": 401,
330
+ "statusSource": "v1 convention",
318
331
  "retriable": false,
319
332
  "details": null,
320
333
  "since": "1.0",
321
- "source": "spec/v1/interrupt.md (409/410 overlap: RFC 0171 row C4.6 — one code per state)"
334
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
322
335
  },
323
336
  {
324
- "code": "interrupt_cancelled",
325
- "httpStatus": 410,
326
- "statusSource": "v1 prose",
337
+ "code": "sender_constraint_missing",
338
+ "httpStatus": 401,
339
+ "statusSource": "v2 decision",
327
340
  "retriable": false,
328
341
  "details": null,
329
- "since": "1.0",
330
- "source": "spec/v1/interrupt.md (the run was cancelled while suspended)"
342
+ "since": "2.0",
343
+ "source": "RFC 0170 \u00a7B.4"
331
344
  },
332
345
  {
333
- "code": "interrupt_expired",
334
- "httpStatus": 410,
335
- "statusSource": "v1 prose",
346
+ "code": "unauthenticated",
347
+ "httpStatus": 401,
348
+ "statusSource": "v1 convention",
336
349
  "retriable": false,
337
350
  "details": null,
338
351
  "since": "1.0",
339
- "source": "spec/v1/interrupt.md"
352
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
340
353
  },
341
354
  {
342
- "code": "interrupt_not_found",
343
- "httpStatus": 404,
344
- "statusSource": "v1 prose",
355
+ "code": "credential_forbidden",
356
+ "httpStatus": 403,
357
+ "statusSource": "v1 convention",
345
358
  "retriable": false,
346
359
  "details": null,
347
360
  "since": "1.0",
348
- "source": "spec/v1/interrupt.md"
361
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
349
362
  },
350
363
  {
351
- "code": "interrupt_token_invalid",
352
- "httpStatus": 401,
364
+ "code": "delegation_scope_amplified",
365
+ "httpStatus": 403,
353
366
  "statusSource": "v2 decision",
354
367
  "retriable": false,
355
368
  "details": null,
356
369
  "since": "2.0",
357
- "source": "RFC 0170 §E.1"
370
+ "source": "RFC 0170 \u00a7B.1"
358
371
  },
359
372
  {
360
- "code": "key_revoked",
361
- "httpStatus": 401,
362
- "statusSource": "v1 convention",
373
+ "code": "forbidden",
374
+ "httpStatus": 403,
375
+ "statusSource": "v1 prose",
363
376
  "retriable": false,
364
377
  "details": null,
365
378
  "since": "1.0",
366
- "source": "spec/v1/rest-endpoints.md §Error response shape"
379
+ "source": "spec/v1/auth.md (v1 MUST)"
367
380
  },
368
381
  {
369
- "code": "loop_limit_exceeded",
370
- "httpStatus": 422,
371
- "statusSource": "v1 convention",
382
+ "code": "force_engine_version_forbidden",
383
+ "httpStatus": 403,
384
+ "statusSource": "v1 prose",
372
385
  "retriable": false,
373
386
  "details": null,
374
387
  "since": "1.0",
375
- "source": "spec/v1/rest-endpoints.md §Error response shape"
388
+ "source": "spec/v1/run-options.md / version-negotiation.md (OpenWOP-Force-Engine-Version outside test keys)"
376
389
  },
377
390
  {
378
- "code": "mcp_mrtr_rounds_exceeded",
379
- "httpStatus": 422,
391
+ "code": "id_tenant_mismatch",
392
+ "httpStatus": 403,
380
393
  "statusSource": "v2 decision",
381
394
  "retriable": false,
382
395
  "details": null,
383
396
  "since": "2.0",
384
- "source": "RFC 0175 §E.1"
397
+ "source": "RFC 0170 \u00a7D.1 (an id whose tenant segment is not the caller's)"
385
398
  },
386
399
  {
387
400
  "code": "mock_provider_forbidden",
@@ -393,80 +406,80 @@
393
406
  "source": "spec/v1/run-options.md (mockProvider outside test keys)"
394
407
  },
395
408
  {
396
- "code": "not_found",
397
- "httpStatus": 404,
398
- "statusSource": "v1 convention",
409
+ "code": "pack_namespace_unauthorized",
410
+ "httpStatus": 403,
411
+ "statusSource": "v1 convention (node-packs.md)",
399
412
  "retriable": false,
400
413
  "details": null,
401
414
  "since": "1.0",
402
- "source": "spec/v1/rest-endpoints.md §Error response shape"
415
+ "source": "spec/v1/node-packs.md"
403
416
  },
404
417
  {
405
- "code": "oauth_provider_unsupported",
406
- "httpStatus": 400,
407
- "statusSource": "v1 convention",
418
+ "code": "run_forbidden",
419
+ "httpStatus": 403,
420
+ "statusSource": "v1 prose",
408
421
  "retriable": false,
409
422
  "details": null,
410
423
  "since": "1.0",
411
- "source": "spec/v1/rest-endpoints.md §Error response shape"
424
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
412
425
  },
413
426
  {
414
- "code": "oauth_scope_unsupported",
415
- "httpStatus": 400,
427
+ "code": "sandbox_capability_denied",
428
+ "httpStatus": 403,
416
429
  "statusSource": "v1 convention",
417
430
  "retriable": false,
418
431
  "details": null,
419
432
  "since": "1.0",
420
- "source": "spec/v1/rest-endpoints.md §Error response shape"
433
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
421
434
  },
422
435
  {
423
- "code": "pack_dependency_conflict",
424
- "httpStatus": 409,
425
- "statusSource": "v1 convention (node-packs.md)",
436
+ "code": "sandbox_escape_attempt",
437
+ "httpStatus": 403,
438
+ "statusSource": "v1 convention",
426
439
  "retriable": false,
427
440
  "details": null,
428
441
  "since": "1.0",
429
- "source": "spec/v1/node-packs.md"
442
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
430
443
  },
431
444
  {
432
- "code": "pack_dependency_cycle",
433
- "httpStatus": 400,
434
- "statusSource": "v1 convention (node-packs.md)",
445
+ "code": "workspace_membership_required",
446
+ "httpStatus": 403,
447
+ "statusSource": "v1 prose",
435
448
  "retriable": false,
436
449
  "details": null,
437
450
  "since": "1.0",
438
- "source": "spec/v1/node-packs.md"
451
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
439
452
  },
440
453
  {
441
- "code": "pack_engine_unsupported",
442
- "httpStatus": 400,
443
- "statusSource": "v2 decision",
454
+ "code": "credential_not_found",
455
+ "httpStatus": 404,
456
+ "statusSource": "v1 convention",
444
457
  "retriable": false,
445
458
  "details": null,
446
- "since": "2.0",
447
- "source": "RFC 0177 §A.1"
459
+ "since": "1.0",
460
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
448
461
  },
449
462
  {
450
- "code": "pack_integrity_failure",
451
- "httpStatus": 400,
452
- "statusSource": "v1 convention (node-packs.md)",
463
+ "code": "interrupt_not_found",
464
+ "httpStatus": 404,
465
+ "statusSource": "v1 prose",
453
466
  "retriable": false,
454
467
  "details": null,
455
468
  "since": "1.0",
456
- "source": "spec/v1/node-packs.md"
469
+ "source": "spec/v1/interrupt.md"
457
470
  },
458
471
  {
459
- "code": "pack_integrity_mismatch",
460
- "httpStatus": 409,
461
- "statusSource": "v1 convention (node-packs.md)",
472
+ "code": "not_found",
473
+ "httpStatus": 404,
474
+ "statusSource": "v1 convention",
462
475
  "retriable": false,
463
476
  "details": null,
464
477
  "since": "1.0",
465
- "source": "spec/v1/node-packs.md"
478
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
466
479
  },
467
480
  {
468
- "code": "pack_kind_invalid",
469
- "httpStatus": 400,
481
+ "code": "pack_version_not_found",
482
+ "httpStatus": 404,
470
483
  "statusSource": "v1 convention (node-packs.md)",
471
484
  "retriable": false,
472
485
  "details": null,
@@ -474,80 +487,80 @@
474
487
  "source": "spec/v1/node-packs.md"
475
488
  },
476
489
  {
477
- "code": "pack_load_failure",
478
- "httpStatus": 500,
479
- "statusSource": "v1 convention (node-packs.md)",
490
+ "code": "replay_source_missing",
491
+ "httpStatus": 404,
492
+ "statusSource": "v1 convention",
480
493
  "retriable": false,
481
494
  "details": null,
482
495
  "since": "1.0",
483
- "source": "spec/v1/node-packs.md"
496
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
484
497
  },
485
498
  {
486
- "code": "pack_lockfile_incomplete",
487
- "httpStatus": 400,
488
- "statusSource": "v1 convention (node-packs.md)",
499
+ "code": "signature_not_available",
500
+ "httpStatus": 404,
501
+ "statusSource": "v1 prose",
489
502
  "retriable": false,
490
503
  "details": null,
491
504
  "since": "1.0",
492
- "source": "spec/v1/node-packs.md"
505
+ "source": "api/openapi.yaml"
493
506
  },
494
507
  {
495
- "code": "pack_namespace_unauthorized",
496
- "httpStatus": 403,
497
- "statusSource": "v1 convention (node-packs.md)",
508
+ "code": "protocol_version_unsupported",
509
+ "httpStatus": 406,
510
+ "statusSource": "v2 decision",
498
511
  "retriable": false,
499
512
  "details": null,
500
- "since": "1.0",
501
- "source": "spec/v1/node-packs.md"
513
+ "since": "2.0",
514
+ "source": "RFC 0172 \u00a7A.3"
502
515
  },
503
516
  {
504
- "code": "pack_peer_dependency_missing",
505
- "httpStatus": 400,
506
- "statusSource": "v1 convention (node-packs.md)",
517
+ "code": "connection_provider_conflict",
518
+ "httpStatus": 409,
519
+ "statusSource": "v1 prose",
507
520
  "retriable": false,
508
521
  "details": null,
509
522
  "since": "1.0",
510
- "source": "spec/v1/node-packs.md"
523
+ "source": "spec/v1/connection-packs.md; RFC 0177 \u00a7D.1 fail-closed"
511
524
  },
512
525
  {
513
- "code": "pack_peer_dependency_undefined",
514
- "httpStatus": 400,
515
- "statusSource": "v1 convention (node-packs.md)",
526
+ "code": "envelope_correlation_conflict",
527
+ "httpStatus": 409,
528
+ "statusSource": "v1 prose",
516
529
  "retriable": false,
517
530
  "details": null,
518
531
  "since": "1.0",
519
- "source": "spec/v1/node-packs.md"
532
+ "source": "spec/v1/ai-envelope.md E2 (correlationId type conflict)"
520
533
  },
521
534
  {
522
- "code": "pack_registry_unreachable",
523
- "httpStatus": 503,
524
- "statusSource": "v1 convention (node-packs.md)",
525
- "retriable": true,
535
+ "code": "idempotency_in_flight",
536
+ "httpStatus": 409,
537
+ "statusSource": "v1 prose",
538
+ "retriable": false,
526
539
  "details": null,
527
540
  "since": "1.0",
528
- "source": "spec/v1/node-packs.md"
541
+ "source": "spec/v1/idempotency.md \u00a7Concurrent duplicates (v1 MUST; RFC 0171 \u00a7B.2 keeps one mismatch code, this is the in-flight state)"
529
542
  },
530
543
  {
531
- "code": "pack_runtime_requirement_unmet",
532
- "httpStatus": 422,
533
- "statusSource": "v1 convention (node-packs.md)",
544
+ "code": "idempotency_key_mismatch",
545
+ "httpStatus": 409,
546
+ "statusSource": "v1 prose",
534
547
  "retriable": false,
535
548
  "details": null,
536
549
  "since": "1.0",
537
- "source": "spec/v1/node-packs.md"
550
+ "source": "spec/v1/idempotency.md (the only spelling; RFC 0171 \u00a7B.2)"
538
551
  },
539
552
  {
540
- "code": "pack_signature_invalid",
541
- "httpStatus": 400,
542
- "statusSource": "v1 convention (node-packs.md)",
553
+ "code": "interrupt_already_resolved",
554
+ "httpStatus": 409,
555
+ "statusSource": "v1 prose",
543
556
  "retriable": false,
544
557
  "details": null,
545
558
  "since": "1.0",
546
- "source": "spec/v1/node-packs.md"
559
+ "source": "spec/v1/interrupt.md (409/410 overlap: RFC 0171 row C4.6 \u2014 one code per state)"
547
560
  },
548
561
  {
549
- "code": "pack_validation_failed",
550
- "httpStatus": 400,
562
+ "code": "pack_dependency_conflict",
563
+ "httpStatus": 409,
551
564
  "statusSource": "v1 convention (node-packs.md)",
552
565
  "retriable": false,
553
566
  "details": null,
@@ -555,8 +568,8 @@
555
568
  "source": "spec/v1/node-packs.md"
556
569
  },
557
570
  {
558
- "code": "pack_version_not_found",
559
- "httpStatus": 404,
571
+ "code": "pack_integrity_mismatch",
572
+ "httpStatus": 409,
560
573
  "statusSource": "v1 convention (node-packs.md)",
561
574
  "retriable": false,
562
575
  "details": null,
@@ -564,292 +577,340 @@
564
577
  "source": "spec/v1/node-packs.md"
565
578
  },
566
579
  {
567
- "code": "protocol_version_mismatch",
568
- "httpStatus": 400,
569
- "statusSource": "v2 decision",
580
+ "code": "replay_diverged_at_refusal",
581
+ "httpStatus": 409,
582
+ "statusSource": "v1 convention",
570
583
  "retriable": false,
571
584
  "details": null,
572
- "since": "2.0",
573
- "source": "RFC 0172 §A.3"
585
+ "since": "1.0",
586
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
574
587
  },
575
588
  {
576
- "code": "protocol_version_unsupported",
577
- "httpStatus": 406,
578
- "statusSource": "v2 decision",
589
+ "code": "replay_memory_snapshot_unavailable",
590
+ "httpStatus": 409,
591
+ "statusSource": "v1 convention",
579
592
  "retriable": false,
580
593
  "details": null,
581
- "since": "2.0",
582
- "source": "RFC 0172 §A.3"
594
+ "since": "1.0",
595
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
583
596
  },
584
597
  {
585
- "code": "rate_limited",
586
- "httpStatus": 429,
598
+ "code": "run_already_active",
599
+ "httpStatus": 409,
587
600
  "statusSource": "v1 convention",
588
- "retriable": true,
601
+ "retriable": false,
589
602
  "details": null,
590
603
  "since": "1.0",
591
- "source": "spec/v1/rest-endpoints.md §Error response shape"
604
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
592
605
  },
593
606
  {
594
- "code": "recursion_limit_exceeded",
595
- "httpStatus": 422,
596
- "statusSource": "v1 convention",
607
+ "code": "run_terminal",
608
+ "httpStatus": 409,
609
+ "statusSource": "v1 prose",
597
610
  "retriable": false,
598
611
  "details": null,
599
612
  "since": "1.0",
600
- "source": "spec/v1/rest-endpoints.md §Error response shape"
613
+ "source": "spec/v1/rest-endpoints.md (a mutation on a terminal run)"
601
614
  },
602
615
  {
603
- "code": "replay_diverged_at_refusal",
616
+ "code": "run_state_conflict",
604
617
  "httpStatus": 409,
605
- "statusSource": "v1 convention",
618
+ "statusSource": "v2 decision",
606
619
  "retriable": false,
607
- "details": null,
608
- "since": "1.0",
609
- "source": "spec/v1/rest-endpoints.md §Error response shape"
620
+ "details": {
621
+ "type": "object",
622
+ "required": [
623
+ "runStatus"
624
+ ],
625
+ "properties": {
626
+ "runStatus": {
627
+ "type": "string",
628
+ "description": "The run status that refused the transition (runs.md \u00a7Pause and resume)."
629
+ }
630
+ },
631
+ "additionalProperties": true
632
+ },
633
+ "since": "2.0",
634
+ "source": "spec/v2/core/runs.md \u00a7Pause and resume"
610
635
  },
611
636
  {
612
- "code": "replay_memory_snapshot_unavailable",
637
+ "code": "version_conflict",
613
638
  "httpStatus": 409,
614
- "statusSource": "v1 convention",
639
+ "statusSource": "v1 prose",
615
640
  "retriable": false,
616
641
  "details": null,
617
642
  "since": "1.0",
618
- "source": "spec/v1/rest-endpoints.md §Error response shape"
643
+ "source": "api/openapi.yaml"
619
644
  },
620
645
  {
621
- "code": "replay_source_missing",
622
- "httpStatus": 404,
623
- "statusSource": "v1 convention",
646
+ "code": "workspace_conflict",
647
+ "httpStatus": 409,
648
+ "statusSource": "v1 prose",
624
649
  "retriable": false,
625
650
  "details": null,
626
651
  "since": "1.0",
627
- "source": "spec/v1/rest-endpoints.md §Error response shape"
652
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
628
653
  },
629
654
  {
630
- "code": "residency_unavailable",
631
- "httpStatus": 422,
632
- "statusSource": "v1 convention",
633
- "retriable": true,
655
+ "code": "interrupt_cancelled",
656
+ "httpStatus": 410,
657
+ "statusSource": "v1 prose",
658
+ "retriable": false,
634
659
  "details": null,
635
660
  "since": "1.0",
636
- "source": "spec/v1/rest-endpoints.md §Error response shape"
661
+ "source": "spec/v1/interrupt.md (the run was cancelled while suspended)"
637
662
  },
638
663
  {
639
- "code": "run_already_active",
640
- "httpStatus": 409,
641
- "statusSource": "v1 convention",
664
+ "code": "interrupt_expired",
665
+ "httpStatus": 410,
666
+ "statusSource": "v1 prose",
642
667
  "retriable": false,
643
668
  "details": null,
644
669
  "since": "1.0",
645
- "source": "spec/v1/rest-endpoints.md §Error response shape"
670
+ "source": "spec/v1/interrupt.md"
646
671
  },
647
672
  {
648
- "code": "run_forbidden",
649
- "httpStatus": 403,
650
- "statusSource": "v1 prose",
673
+ "code": "payload_too_large",
674
+ "httpStatus": 413,
675
+ "statusSource": "v2 decision",
651
676
  "retriable": false,
652
677
  "details": null,
653
- "since": "1.0",
654
- "source": "spec/v1/rest-endpoints.md §Error response shape"
678
+ "since": "2.0",
679
+ "source": "spec/v2/core/errors.md \u00a7The envelope \u2014 a request body a host refuses on size before parsing it (RFC 9110 \u00a715.5.14); registered 2026-09-05 because both production hosts had to invent it"
655
680
  },
656
681
  {
657
- "code": "run_terminal",
658
- "httpStatus": 409,
682
+ "code": "workspace_too_large",
683
+ "httpStatus": 413,
659
684
  "statusSource": "v1 prose",
660
685
  "retriable": false,
661
686
  "details": null,
662
687
  "since": "1.0",
663
- "source": "spec/v1/rest-endpoints.md (a mutation on a terminal run)"
688
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
664
689
  },
665
690
  {
666
- "code": "run_timeout",
667
- "httpStatus": 422,
668
- "statusSource": "v1 convention",
691
+ "code": "unsupported_media_type",
692
+ "httpStatus": 415,
693
+ "statusSource": "v2 decision",
669
694
  "retriable": false,
670
695
  "details": null,
671
- "since": "1.0",
672
- "source": "spec/v1/rest-endpoints.md §Error response shape"
696
+ "since": "2.0",
697
+ "source": "spec/v2/core/errors.md \u00a7The envelope \u2014 a request body whose Content-Type the host does not accept (RFC 9110 \u00a715.5.16); registered 2026-09-05 because both production hosts had to invent it"
673
698
  },
674
699
  {
675
- "code": "runner_unavailable",
676
- "httpStatus": 503,
700
+ "code": "capability_not_provided",
701
+ "httpStatus": 422,
677
702
  "statusSource": "v1 convention",
678
- "retriable": true,
703
+ "retriable": false,
679
704
  "details": null,
680
705
  "since": "1.0",
681
- "source": "spec/v1/rest-endpoints.md §Error response shape"
706
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
682
707
  },
683
708
  {
684
- "code": "sandbox_capability_denied",
685
- "httpStatus": 403,
709
+ "code": "capability_required",
710
+ "httpStatus": 422,
686
711
  "statusSource": "v1 convention",
687
712
  "retriable": false,
688
713
  "details": null,
689
714
  "since": "1.0",
690
- "source": "spec/v1/rest-endpoints.md §Error response shape"
715
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
691
716
  },
692
717
  {
693
- "code": "sandbox_escape_attempt",
694
- "httpStatus": 403,
718
+ "code": "credential_required",
719
+ "httpStatus": 422,
695
720
  "statusSource": "v1 convention",
696
721
  "retriable": false,
697
722
  "details": null,
698
723
  "since": "1.0",
699
- "source": "spec/v1/rest-endpoints.md §Error response shape"
724
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
700
725
  },
701
726
  {
702
- "code": "sandbox_memory_exceeded",
727
+ "code": "envelope_invalid",
703
728
  "httpStatus": 422,
704
729
  "statusSource": "v1 convention",
705
730
  "retriable": false,
706
731
  "details": null,
707
732
  "since": "1.0",
708
- "source": "spec/v1/rest-endpoints.md §Error response shape"
733
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
709
734
  },
710
735
  {
711
- "code": "sandbox_timeout",
736
+ "code": "envelope_refusal",
712
737
  "httpStatus": 422,
713
738
  "statusSource": "v1 convention",
714
739
  "retriable": false,
715
740
  "details": null,
716
741
  "since": "1.0",
717
- "source": "spec/v1/rest-endpoints.md §Error response shape"
742
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
718
743
  },
719
744
  {
720
- "code": "schedule_horizon_exceeded",
721
- "httpStatus": 400,
745
+ "code": "envelope_truncation_unrecoverable",
746
+ "httpStatus": 422,
722
747
  "statusSource": "v1 convention",
723
748
  "retriable": false,
724
749
  "details": null,
725
750
  "since": "1.0",
726
- "source": "spec/v1/rest-endpoints.md §Error response shape"
751
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
727
752
  },
728
753
  {
729
- "code": "sender_constraint_missing",
730
- "httpStatus": 401,
754
+ "code": "fork_point_invalid",
755
+ "httpStatus": 422,
731
756
  "statusSource": "v2 decision",
732
757
  "retriable": false,
733
758
  "details": null,
734
759
  "since": "2.0",
735
- "source": "RFC 0170 §B.4"
760
+ "source": "spec/v2/core/runs.md \u00a7Fork"
736
761
  },
737
762
  {
738
- "code": "signature_not_available",
739
- "httpStatus": 404,
740
- "statusSource": "v1 prose",
763
+ "code": "loop_limit_exceeded",
764
+ "httpStatus": 422,
765
+ "statusSource": "v1 convention",
741
766
  "retriable": false,
742
767
  "details": null,
743
768
  "since": "1.0",
744
- "source": "api/openapi.yaml"
769
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
745
770
  },
746
771
  {
747
- "code": "sub_chain_cycle",
748
- "httpStatus": 400,
772
+ "code": "mcp_mrtr_rounds_exceeded",
773
+ "httpStatus": 422,
749
774
  "statusSource": "v2 decision",
750
775
  "retriable": false,
751
776
  "details": null,
752
777
  "since": "2.0",
753
- "source": "RFC 0133 §Unresolved 3 (resolved: maxSubChainDepth 8, fail closed); carried into v2 by RFC 0177 §E"
778
+ "source": "RFC 0175 \u00a7E.1"
754
779
  },
755
780
  {
756
- "code": "sub_chain_depth_exceeded",
757
- "httpStatus": 400,
758
- "statusSource": "v2 decision",
781
+ "code": "pack_runtime_requirement_unmet",
782
+ "httpStatus": 422,
783
+ "statusSource": "v1 convention (node-packs.md)",
759
784
  "retriable": false,
760
785
  "details": null,
761
- "since": "2.0",
762
- "source": "RFC 0133 §Unresolved 3 — the depth ceiling breach (distinct from a cycle)"
786
+ "since": "1.0",
787
+ "source": "spec/v1/node-packs.md"
763
788
  },
764
789
  {
765
- "code": "token_budget_exceeded",
790
+ "code": "recursion_limit_exceeded",
766
791
  "httpStatus": 422,
767
792
  "statusSource": "v1 convention",
768
793
  "retriable": false,
769
794
  "details": null,
770
795
  "since": "1.0",
771
- "source": "spec/v1/rest-endpoints.md §Error response shape"
796
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
772
797
  },
773
798
  {
774
- "code": "unauthenticated",
775
- "httpStatus": 401,
799
+ "code": "residency_unavailable",
800
+ "httpStatus": 422,
776
801
  "statusSource": "v1 convention",
777
- "retriable": false,
802
+ "retriable": true,
778
803
  "details": null,
779
804
  "since": "1.0",
780
- "source": "spec/v1/rest-endpoints.md §Error response shape"
805
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
781
806
  },
782
807
  {
783
- "code": "unsupported_stream_mode",
784
- "httpStatus": 400,
785
- "statusSource": "v1 prose",
808
+ "code": "run_timeout",
809
+ "httpStatus": 422,
810
+ "statusSource": "v1 convention",
786
811
  "retriable": false,
787
812
  "details": null,
788
813
  "since": "1.0",
789
- "source": "api/openapi.yaml UnsupportedStreamMode (RFC 0171 §B.1 folds the one-member enum)"
814
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
790
815
  },
791
816
  {
792
- "code": "until_in_past",
793
- "httpStatus": 400,
794
- "statusSource": "v2 decision",
817
+ "code": "sandbox_memory_exceeded",
818
+ "httpStatus": 422,
819
+ "statusSource": "v1 convention",
795
820
  "retriable": false,
796
821
  "details": null,
797
- "since": "2.0",
798
- "source": "RFC 0169 §A.3 (validation_error details.reason in v1; a code in v2)"
822
+ "since": "1.0",
823
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
799
824
  },
800
825
  {
801
- "code": "validation_error",
802
- "httpStatus": 400,
826
+ "code": "sandbox_timeout",
827
+ "httpStatus": 422,
803
828
  "statusSource": "v1 convention",
804
829
  "retriable": false,
805
830
  "details": null,
806
831
  "since": "1.0",
807
- "source": "spec/v1/rest-endpoints.md §Error response shape"
832
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
808
833
  },
809
834
  {
810
- "code": "version_conflict",
811
- "httpStatus": 409,
812
- "statusSource": "v1 prose",
835
+ "code": "token_budget_exceeded",
836
+ "httpStatus": 422,
837
+ "statusSource": "v1 convention",
813
838
  "retriable": false,
814
839
  "details": null,
815
840
  "since": "1.0",
816
- "source": "api/openapi.yaml"
841
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
817
842
  },
818
843
  {
819
- "code": "webhook_url_rejected",
820
- "httpStatus": 400,
844
+ "code": "client_version_unsupported",
845
+ "httpStatus": 426,
821
846
  "statusSource": "v2 decision",
822
847
  "retriable": false,
823
848
  "details": null,
824
849
  "since": "2.0",
825
- "source": "spec/v2/core/webhooks.md §Egress"
850
+ "source": "RFC 0172 row C5.8"
826
851
  },
827
852
  {
828
- "code": "workspace_conflict",
829
- "httpStatus": 409,
830
- "statusSource": "v1 prose",
853
+ "code": "rate_limited",
854
+ "httpStatus": 429,
855
+ "statusSource": "v1 convention",
856
+ "retriable": true,
857
+ "details": null,
858
+ "since": "1.0",
859
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
860
+ },
861
+ {
862
+ "code": "event_type_unmapped",
863
+ "httpStatus": 500,
864
+ "statusSource": "v2 decision",
831
865
  "retriable": false,
832
866
  "details": null,
867
+ "since": "2.0",
868
+ "source": "RFC 0176 \u00a7A.3 (a run whose log the host cannot translate is not readable)"
869
+ },
870
+ {
871
+ "code": "internal_error",
872
+ "httpStatus": 500,
873
+ "statusSource": "v1 convention",
874
+ "retriable": true,
875
+ "details": null,
833
876
  "since": "1.0",
834
- "source": "spec/v1/rest-endpoints.md §Error response shape"
877
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
835
878
  },
836
879
  {
837
- "code": "workspace_membership_required",
838
- "httpStatus": 403,
839
- "statusSource": "v1 prose",
880
+ "code": "pack_load_failure",
881
+ "httpStatus": 500,
882
+ "statusSource": "v1 convention (node-packs.md)",
840
883
  "retriable": false,
841
884
  "details": null,
842
885
  "since": "1.0",
843
- "source": "spec/v1/rest-endpoints.md §Error response shape"
886
+ "source": "spec/v1/node-packs.md"
844
887
  },
845
888
  {
846
- "code": "workspace_too_large",
847
- "httpStatus": 413,
848
- "statusSource": "v1 prose",
889
+ "code": "credential_unavailable",
890
+ "httpStatus": 501,
891
+ "statusSource": "v1 convention",
849
892
  "retriable": false,
850
893
  "details": null,
851
894
  "since": "1.0",
852
- "source": "spec/v1/rest-endpoints.md §Error response shape"
895
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
896
+ },
897
+ {
898
+ "code": "pack_registry_unreachable",
899
+ "httpStatus": 503,
900
+ "statusSource": "v1 convention (node-packs.md)",
901
+ "retriable": true,
902
+ "details": null,
903
+ "since": "1.0",
904
+ "source": "spec/v1/node-packs.md"
905
+ },
906
+ {
907
+ "code": "runner_unavailable",
908
+ "httpStatus": 503,
909
+ "statusSource": "v1 convention",
910
+ "retriable": true,
911
+ "details": null,
912
+ "since": "1.0",
913
+ "source": "spec/v1/rest-endpoints.md \u00a7Error response shape"
853
914
  }
854
915
  ]
855
916
  }