@openwop/spec-artifacts 2.44.5 → 2.44.7
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 +49 -47
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +31 -122
- package/package.json +1 -1
- package/schemas/v2/agent-ref.schema.json +2 -3
- package/schemas/v2/budget-policy.schema.json +2 -3
- package/schemas/v2/capabilities.schema.json +42 -38
- package/schemas/v2/debug-bundle.schema.json +2 -2
- package/schemas/v2/error-envelope.schema.json +282 -4
- package/schemas/v2/node-pack-manifest.schema.json +2 -2
- package/schemas/v2/prompt-ref.schema.json +2 -3
- package/schemas/v2/prompt-template.schema.json +3 -3
- package/schemas/v2/run-event-payloads.schema.json +5 -5
- package/spec/v1/alias-detectors.json +25 -1
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/deprecations.json +89 -1
- package/spec/v1/gaps.json +46 -12
- package/spec/v1/migrations.json +57 -1
- package/spec/v2/core/artifact-type-packs.md +5 -1
- package/spec/v2/core/capabilities.md +20 -22
- package/spec/v2/core/conformance.md +24 -7
- package/spec/v2/core/errors.md +17 -119
- package/spec/v2/core/events.md +7 -7
- package/spec/v2/core/execution.md +56 -16
- package/spec/v2/core/host-services.md +57 -58
- package/spec/v2/core/i18n.md +10 -10
- package/spec/v2/core/idempotency.md +3 -3
- package/spec/v2/core/identity.md +11 -9
- package/spec/v2/core/interop.md +6 -8
- package/spec/v2/core/interrupt.md +8 -8
- package/spec/v2/core/oauth.md +4 -4
- package/spec/v2/core/packs.md +11 -5
- package/spec/v2/core/persistence.md +11 -13
- package/spec/v2/core/portability.md +4 -4
- package/spec/v2/core/replay.md +8 -10
- package/spec/v2/core/runs.md +20 -7
- package/spec/v2/core/security-defaults.md +0 -2
- package/spec/v2/core/storage.md +18 -20
- package/spec/v2/core/versioning.md +4 -9
- package/spec/v2/core/webhooks.md +13 -8
- package/spec/v2/declaration.json +3 -3
- package/spec/v2/errors.json +206 -2
- package/spec/v2/facets/agents.schema.json +367 -0
- package/spec/v2/facets/aiProviders.schema.json +2 -2
- package/spec/v2/generated/error-codes.md +130 -0
- package/spec/v2/release.json +2 -2
- package/spec/v2/surface-baseline.json +38 -2
package/spec/v2/core/webhooks.md
CHANGED
|
@@ -89,7 +89,7 @@ Best-effort delivery is not a conforming mode. A `3xx` response is a delivery fa
|
|
|
89
89
|
|
|
90
90
|
### Delivery isolation
|
|
91
91
|
|
|
92
|
-
One subscription's slow or dead receiver MUST NOT delay another subscription's deliveries (invariant `webhook-delivery-isolation`). The rule
|
|
92
|
+
One subscription's slow or dead receiver MUST NOT delay another subscription's deliveries (invariant `webhook-delivery-isolation`). The rule constrains when an attempt starts, not how soon after its event, and names no mechanism; a sequential loop over a batch does not meet it.
|
|
93
93
|
|
|
94
94
|
A host MAY bound concurrent attempts beyond the floor of 8, and SHOULD NOT let one tenant's unanswered attempts occupy capacity another tenant's deliveries need.
|
|
95
95
|
|
|
@@ -99,10 +99,10 @@ An attempt whose request the host had begun sending before `unregisterWebhook` a
|
|
|
99
99
|
|
|
100
100
|
### Dead letters
|
|
101
101
|
|
|
102
|
-
This
|
|
102
|
+
This is the delivery sink, not the run sink of the `deadLetter` family ([runs.md](runs.md) §Dead letters).
|
|
103
103
|
|
|
104
104
|
- A host advertising `webhooks.deadLetter` MUST serve `GET /webhooks/{webhookId}/dead-letters`.
|
|
105
|
-
- A record MUST NOT carry the delivered body, the delivery headers, or the subscription secret
|
|
105
|
+
- A record names a delivery and MUST NOT carry the delivered body, the delivery headers, or the subscription secret.
|
|
106
106
|
- The read belongs to a live subscription: after `unregisterWebhook` answers `204`, `GET /webhooks/{webhookId}/dead-letters` for that id MUST answer `404 not_found`, exactly as for a same-tenant id the host never minted. The host MAY discard that subscription's records at the unregister.
|
|
107
107
|
- `expiresAt` bounds a record's retention only while its subscription exists.
|
|
108
108
|
|
|
@@ -124,13 +124,20 @@ At delivery time a host MUST re-resolve the hostname, validate every resolved ad
|
|
|
124
124
|
|
|
125
125
|
## Inbound triggers
|
|
126
126
|
|
|
127
|
-
A host advertising `triggerBridge` runs inbound work through subscriptions (`schemas/v2/trigger-subscription.schema.json`)
|
|
127
|
+
A host advertising `triggerBridge` runs inbound work through subscriptions (`schemas/v2/trigger-subscription.schema.json`), and `subscriptionStates` lists the states it implements:
|
|
128
|
+
|
|
129
|
+
- `active`;
|
|
130
|
+
- `paused` — not delivering; a schedule skips ticks;
|
|
131
|
+
- `failed`;
|
|
132
|
+
- `dead-lettered` — deliveries are in the `deadLetter` sink.
|
|
133
|
+
|
|
134
|
+
On an `active` subscription the host:
|
|
128
135
|
|
|
129
136
|
- with `dedup`, MUST answer a `dedupKey` repeated within retention (at least 24 hours) with the prior `runId`;
|
|
130
|
-
- retries per `retryPolicy`, then dead-letters
|
|
137
|
+
- retries a failed delivery per `retryPolicy`, then dead-letters it without starting a run;
|
|
131
138
|
- MUST set the delivery id as `causationId` on `run.started`.
|
|
132
139
|
|
|
133
|
-
A source in `triggerBridge.sources` MUST
|
|
140
|
+
A source in `triggerBridge.sources` MUST move through these states and emit `trigger.subscription-state-changed` and `trigger.delivery-attempted`. These events MUST NOT carry inbound content or credentials (`schemas/v2/run-event-payloads.schema.json`).
|
|
134
141
|
|
|
135
142
|
With `triggerBridge.ingestion`, each `externalSources` entry MUST turn an external event into a `TriggerEvent` (`schemas/v2/trigger-event.schema.json`, whose rules bind) and start a run. The host:
|
|
136
143
|
|
|
@@ -140,6 +147,4 @@ With `triggerBridge.ingestion`, each `externalSources` entry MUST turn an extern
|
|
|
140
147
|
- MUST refuse private, link-local and loopback targets and cap the body on any ingestion fetch, and never hand the run a URL (invariant `trigger-ingestion-ssrf`);
|
|
141
148
|
- SHOULD key `stream` by topic, partition and offset, `change` by table and changelog id; a key MUST survive broker redelivery.
|
|
142
149
|
|
|
143
|
-
See also: events.md, replay.md, persistence.md, security-defaults.md.
|
|
144
|
-
|
|
145
150
|
*Sources: RFCs 0053, 0083, 0099, 0127, 0165, 0171, 0173, 0176, 0188, 0196, 0201, 0215, 0217.*
|
package/spec/v2/declaration.json
CHANGED
|
@@ -717,7 +717,7 @@
|
|
|
717
717
|
{
|
|
718
718
|
"key": "agents",
|
|
719
719
|
"kind": "family",
|
|
720
|
-
"normativeText": ["spec/
|
|
720
|
+
"normativeText": ["spec/v2/core/execution.md", "spec/v2/facets/agents.schema.json", "schemas/v2/run-event-payloads.schema.json"],
|
|
721
721
|
"anchor": "core",
|
|
722
722
|
"section": "core/capabilities.md#agents",
|
|
723
723
|
"peerDependencyId": "agents",
|
|
@@ -1214,7 +1214,7 @@
|
|
|
1214
1214
|
{
|
|
1215
1215
|
"key": "budget",
|
|
1216
1216
|
"kind": "family",
|
|
1217
|
-
"normativeText": ["spec/
|
|
1217
|
+
"normativeText": ["spec/v2/core/runs.md", "schemas/v2/budget-policy.schema.json"],
|
|
1218
1218
|
"anchor": "core",
|
|
1219
1219
|
"section": "core/capabilities.md#budget",
|
|
1220
1220
|
"peerDependencyId": "budget",
|
|
@@ -1582,7 +1582,7 @@
|
|
|
1582
1582
|
{
|
|
1583
1583
|
"key": "production",
|
|
1584
1584
|
"kind": "family",
|
|
1585
|
-
"normativeText": ["spec/
|
|
1585
|
+
"normativeText": ["spec/v2/core/conformance.md"],
|
|
1586
1586
|
"anchor": "core",
|
|
1587
1587
|
"section": "core/capabilities.md#production",
|
|
1588
1588
|
"peerDependencyId": "production",
|
package/spec/v2/errors.json
CHANGED
|
@@ -1031,13 +1031,13 @@
|
|
|
1031
1031
|
},
|
|
1032
1032
|
{
|
|
1033
1033
|
"code": "token_budget_exceeded",
|
|
1034
|
-
"meaning": "
|
|
1034
|
+
"meaning": "A memory distillation could not be completed within its effective token budget, so the run failed and wrote no partial archive.",
|
|
1035
1035
|
"httpStatus": 422,
|
|
1036
1036
|
"statusSource": "v1 convention",
|
|
1037
1037
|
"retriable": false,
|
|
1038
1038
|
"details": null,
|
|
1039
1039
|
"since": "1.0",
|
|
1040
|
-
"source": "spec/v1/rest-endpoints.md §Error response shape"
|
|
1040
|
+
"source": "spec/v1/rest-endpoints.md §Error response shape; meaning narrowed to v1's (RFC 0062) by RFC 0228 §E"
|
|
1041
1041
|
},
|
|
1042
1042
|
{
|
|
1043
1043
|
"code": "client_version_unsupported",
|
|
@@ -1186,6 +1186,210 @@
|
|
|
1186
1186
|
"details": null,
|
|
1187
1187
|
"since": "1.0",
|
|
1188
1188
|
"source": "spec/v1/ai-envelope.md §\"Schema version advertisement\" (emitted schemaVersion above the advertised floor)"
|
|
1189
|
+
},
|
|
1190
|
+
{
|
|
1191
|
+
"code": "storage_limit_exceeded",
|
|
1192
|
+
"meaning": "A storage call was refused because it would exceed an advertised limit or the tenant's quota.",
|
|
1193
|
+
"httpStatus": 422,
|
|
1194
|
+
"statusSource": "v2 decision",
|
|
1195
|
+
"retriable": false,
|
|
1196
|
+
"details": {
|
|
1197
|
+
"type": "object",
|
|
1198
|
+
"required": [
|
|
1199
|
+
"service",
|
|
1200
|
+
"limit"
|
|
1201
|
+
],
|
|
1202
|
+
"properties": {
|
|
1203
|
+
"service": {
|
|
1204
|
+
"type": "string",
|
|
1205
|
+
"minLength": 1,
|
|
1206
|
+
"description": "The host-service family key (`fs`, `kvStorage`, `secrets`, `queueBus`, …)."
|
|
1207
|
+
},
|
|
1208
|
+
"limit": {
|
|
1209
|
+
"type": "string",
|
|
1210
|
+
"minLength": 1,
|
|
1211
|
+
"description": "The advertised field that was exceeded (`maxValueBytes`, `maxTtlSeconds`, `maxRowsPerTable`, …), or `quota`."
|
|
1212
|
+
}
|
|
1213
|
+
},
|
|
1214
|
+
"additionalProperties": true
|
|
1215
|
+
},
|
|
1216
|
+
"since": "2.45",
|
|
1217
|
+
"source": "RFC 0228 §C (replaces v1's nine per-service size, TTL, row and quota codes)"
|
|
1218
|
+
},
|
|
1219
|
+
{
|
|
1220
|
+
"code": "egress_denied",
|
|
1221
|
+
"meaning": "The host refused an outbound request a pack asked it to make: the address guard or the egress policy denied it.",
|
|
1222
|
+
"httpStatus": 403,
|
|
1223
|
+
"statusSource": "v2 decision",
|
|
1224
|
+
"retriable": false,
|
|
1225
|
+
"details": {
|
|
1226
|
+
"type": "object",
|
|
1227
|
+
"required": [
|
|
1228
|
+
"reason"
|
|
1229
|
+
],
|
|
1230
|
+
"properties": {
|
|
1231
|
+
"reason": {
|
|
1232
|
+
"enum": [
|
|
1233
|
+
"out-of-audience",
|
|
1234
|
+
"expired",
|
|
1235
|
+
"ssrf-blocked",
|
|
1236
|
+
"provenance-unevaluable",
|
|
1237
|
+
"scope-denied",
|
|
1238
|
+
"policy-denied"
|
|
1239
|
+
],
|
|
1240
|
+
"description": "The `egress.decided` reason, from its closed set minus `ok`."
|
|
1241
|
+
}
|
|
1242
|
+
},
|
|
1243
|
+
"additionalProperties": true
|
|
1244
|
+
},
|
|
1245
|
+
"since": "2.45",
|
|
1246
|
+
"source": "RFC 0228 §C (v1 `ssrf_blocked` and the `egressPolicy` denial; measured: MyndHyve `ssrf_blocked`)"
|
|
1247
|
+
},
|
|
1248
|
+
{
|
|
1249
|
+
"code": "upstream_unavailable",
|
|
1250
|
+
"meaning": "A host service could not reach the upstream it depends on (a fetch target, an MCP server, a queue backend), so the call failed.",
|
|
1251
|
+
"httpStatus": 502,
|
|
1252
|
+
"statusSource": "v2 decision",
|
|
1253
|
+
"retriable": true,
|
|
1254
|
+
"details": {
|
|
1255
|
+
"type": "object",
|
|
1256
|
+
"required": [
|
|
1257
|
+
"service"
|
|
1258
|
+
],
|
|
1259
|
+
"properties": {
|
|
1260
|
+
"service": {
|
|
1261
|
+
"type": "string",
|
|
1262
|
+
"minLength": 1,
|
|
1263
|
+
"description": "The host-service family key (`fs`, `kvStorage`, `secrets`, `queueBus`, …)."
|
|
1264
|
+
}
|
|
1265
|
+
},
|
|
1266
|
+
"additionalProperties": true
|
|
1267
|
+
},
|
|
1268
|
+
"since": "2.45",
|
|
1269
|
+
"source": "RFC 0228 §C (measured: MyndHyve `fetch_failed`, the v2 reference host's `example.mcp_unreachable` and `example.http_fetch_failed`)"
|
|
1270
|
+
},
|
|
1271
|
+
{
|
|
1272
|
+
"code": "budget_exhausted",
|
|
1273
|
+
"meaning": "A hard budget dimension was exhausted and the run failed.",
|
|
1274
|
+
"httpStatus": 422,
|
|
1275
|
+
"statusSource": "v2 decision",
|
|
1276
|
+
"retriable": false,
|
|
1277
|
+
"details": {
|
|
1278
|
+
"type": "object",
|
|
1279
|
+
"required": [
|
|
1280
|
+
"dimension"
|
|
1281
|
+
],
|
|
1282
|
+
"properties": {
|
|
1283
|
+
"dimension": {
|
|
1284
|
+
"enum": [
|
|
1285
|
+
"tokens",
|
|
1286
|
+
"costUsd",
|
|
1287
|
+
"toolCalls",
|
|
1288
|
+
"retries"
|
|
1289
|
+
],
|
|
1290
|
+
"description": "The budget dimension that was exhausted."
|
|
1291
|
+
}
|
|
1292
|
+
},
|
|
1293
|
+
"additionalProperties": true
|
|
1294
|
+
},
|
|
1295
|
+
"since": "2.45",
|
|
1296
|
+
"source": "RFC 0228 §C; spec/v1/budget-policy.md §D (measured: MyndHyve `host/budgetPolicy.ts`)"
|
|
1297
|
+
},
|
|
1298
|
+
{
|
|
1299
|
+
"code": "budget_model_denied",
|
|
1300
|
+
"meaning": "The run's resolved model is outside its budget's `modelAllow`, or inside its `modelDeny`, so it was refused before the call.",
|
|
1301
|
+
"httpStatus": 422,
|
|
1302
|
+
"statusSource": "v2 decision",
|
|
1303
|
+
"retriable": false,
|
|
1304
|
+
"details": {
|
|
1305
|
+
"type": "object",
|
|
1306
|
+
"properties": {
|
|
1307
|
+
"model": {
|
|
1308
|
+
"type": "string",
|
|
1309
|
+
"minLength": 1,
|
|
1310
|
+
"description": "OPTIONAL. The refused model."
|
|
1311
|
+
}
|
|
1312
|
+
},
|
|
1313
|
+
"additionalProperties": true
|
|
1314
|
+
},
|
|
1315
|
+
"since": "2.45",
|
|
1316
|
+
"source": "RFC 0228 §C; spec/v1/budget-policy.md §D (measured: MyndHyve `host/budgetPolicy.ts`)"
|
|
1317
|
+
},
|
|
1318
|
+
{
|
|
1319
|
+
"code": "service_unavailable",
|
|
1320
|
+
"meaning": "The host is at capacity. Retry after the `Retry-After` header when present.",
|
|
1321
|
+
"httpStatus": 503,
|
|
1322
|
+
"statusSource": "v1 prose (production-profile.md §Backpressure)",
|
|
1323
|
+
"retriable": true,
|
|
1324
|
+
"details": null,
|
|
1325
|
+
"since": "2.45",
|
|
1326
|
+
"source": "RFC 0228 §C (measured: MyndHyve `middleware/backpressureGate.ts`)"
|
|
1327
|
+
},
|
|
1328
|
+
{
|
|
1329
|
+
"code": "run_expired",
|
|
1330
|
+
"meaning": "The run, or the part of its event log the request needs, was purged under the host's documented retention.",
|
|
1331
|
+
"httpStatus": 410,
|
|
1332
|
+
"statusSource": "v2 decision",
|
|
1333
|
+
"retriable": false,
|
|
1334
|
+
"details": {
|
|
1335
|
+
"type": "object",
|
|
1336
|
+
"properties": {
|
|
1337
|
+
"runId": {
|
|
1338
|
+
"$ref": "ids.schema.json#/$defs/runId",
|
|
1339
|
+
"description": "OPTIONAL. The expired run."
|
|
1340
|
+
}
|
|
1341
|
+
},
|
|
1342
|
+
"additionalProperties": true
|
|
1343
|
+
},
|
|
1344
|
+
"since": "2.45",
|
|
1345
|
+
"source": "RFC 0228 §C (replay.md's `410` for a fork past retention; spec-authored, no measured host)"
|
|
1346
|
+
},
|
|
1347
|
+
{
|
|
1348
|
+
"code": "provider_policy_denied",
|
|
1349
|
+
"meaning": "Host provider policy refused the model or provider before the call, so the node failed.",
|
|
1350
|
+
"httpStatus": 422,
|
|
1351
|
+
"statusSource": "v2 decision",
|
|
1352
|
+
"retriable": false,
|
|
1353
|
+
"details": {
|
|
1354
|
+
"type": "object",
|
|
1355
|
+
"required": [
|
|
1356
|
+
"provider"
|
|
1357
|
+
],
|
|
1358
|
+
"properties": {
|
|
1359
|
+
"provider": {
|
|
1360
|
+
"type": "string",
|
|
1361
|
+
"minLength": 1,
|
|
1362
|
+
"description": "The refused provider."
|
|
1363
|
+
},
|
|
1364
|
+
"reason": {
|
|
1365
|
+
"type": "string",
|
|
1366
|
+
"minLength": 1,
|
|
1367
|
+
"description": "OPTIONAL. The policy cause (`provider-disabled`, `model-not-allowed`, …)."
|
|
1368
|
+
}
|
|
1369
|
+
},
|
|
1370
|
+
"additionalProperties": true
|
|
1371
|
+
},
|
|
1372
|
+
"since": "2.45",
|
|
1373
|
+
"source": "RFC 0228 §C; the default of `aiProviders.policies[].errorCode` (measured: openwop-app and MyndHyve)"
|
|
1374
|
+
},
|
|
1375
|
+
{
|
|
1376
|
+
"code": "eval_gate_unmet",
|
|
1377
|
+
"meaning": "A deployment transition was refused because the eval run its gate requires is not terminal and passing.",
|
|
1378
|
+
"httpStatus": 422,
|
|
1379
|
+
"statusSource": "v2 decision (the status MyndHyve answers)",
|
|
1380
|
+
"retriable": false,
|
|
1381
|
+
"details": {
|
|
1382
|
+
"type": "object",
|
|
1383
|
+
"properties": {
|
|
1384
|
+
"evalRunId": {
|
|
1385
|
+
"$ref": "ids.schema.json#/$defs/runId",
|
|
1386
|
+
"description": "OPTIONAL. The eval run the gate requires."
|
|
1387
|
+
}
|
|
1388
|
+
},
|
|
1389
|
+
"additionalProperties": true
|
|
1390
|
+
},
|
|
1391
|
+
"since": "2.45",
|
|
1392
|
+
"source": "RFC 0228 §C (measured: MyndHyve `host/agentDeployment.ts`, answered at 422)"
|
|
1189
1393
|
}
|
|
1190
1394
|
]
|
|
1191
1395
|
}
|