@openwop/spec-artifacts 2.42.6 → 2.42.8

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 (69) hide show
  1. package/CORPUS-STAMP.json +70 -67
  2. package/api/seams-v2.yaml +238 -322
  3. package/api/v2/asyncapi.yaml +83 -113
  4. package/api/v2/openapi.yaml +408 -724
  5. package/package.json +1 -1
  6. package/schemas/audit-verify-result.schema.json +2 -2
  7. package/schemas/v2/audit-verify-result.schema.json +2 -2
  8. package/schemas/v2/capabilities.schema.json +4 -7
  9. package/schemas/v2/error-envelope.schema.json +144 -69
  10. package/spec/v1/alias-detectors.json +6 -0
  11. package/spec/v1/core-standard-manifest.json +2 -2
  12. package/spec/v1/deprecations.json +22 -0
  13. package/spec/v1/gaps.json +188 -1
  14. package/spec/v1/migrations.json +18 -0
  15. package/spec/v2/README.md +35 -37
  16. package/spec/v2/core/capabilities.md +186 -119
  17. package/spec/v2/core/conformance.md +78 -27
  18. package/spec/v2/core/connection-packs.md +8 -3
  19. package/spec/v2/core/conversation.md +10 -4
  20. package/spec/v2/core/errors.md +30 -9
  21. package/spec/v2/core/events.md +116 -80
  22. package/spec/v2/core/form-content-packs.md +11 -13
  23. package/spec/v2/core/headers.md +23 -14
  24. package/spec/v2/core/host-services.md +22 -5
  25. package/spec/v2/core/i18n.md +64 -0
  26. package/spec/v2/core/idempotency.md +48 -36
  27. package/spec/v2/core/identity.md +110 -42
  28. package/spec/v2/core/interop.md +82 -21
  29. package/spec/v2/core/interrupt.md +79 -40
  30. package/spec/v2/core/node-pack-runtimes.md +18 -4
  31. package/spec/v2/core/oauth.md +40 -6
  32. package/spec/v2/core/overview.md +61 -33
  33. package/spec/v2/core/packs.md +53 -28
  34. package/spec/v2/core/persistence.md +61 -80
  35. package/spec/v2/core/portability.md +44 -0
  36. package/spec/v2/core/replay.md +56 -42
  37. package/spec/v2/core/runs.md +198 -60
  38. package/spec/v2/core/security-defaults.md +57 -33
  39. package/spec/v2/core/tool-catalog.md +29 -6
  40. package/spec/v2/core/versioning.md +115 -50
  41. package/spec/v2/core/webhooks.md +61 -20
  42. package/spec/v2/core/workflow-chain-packs.md +16 -14
  43. package/spec/v2/corrections.json +17 -1
  44. package/spec/v2/corrections.schema.json +1 -1
  45. package/spec/v2/declaration.json +26 -9
  46. package/spec/v2/declaration.schema.json +10 -0
  47. package/spec/v2/errors.json +121 -4
  48. package/spec/v2/errors.schema.json +38 -0
  49. package/spec/v2/ext/README.md +36 -23
  50. package/spec/v2/ext/a2uiSurface/README.md +75 -89
  51. package/spec/v2/ext/brand/README.md +15 -15
  52. package/spec/v2/ext/canvas/README.md +15 -15
  53. package/spec/v2/ext/chat/README.md +15 -15
  54. package/spec/v2/ext/coordination/README.md +15 -15
  55. package/spec/v2/ext/dataIntegration/README.md +17 -20
  56. package/spec/v2/ext/entities/README.md +15 -15
  57. package/spec/v2/ext/grpc-transport/README.md +6 -8
  58. package/spec/v2/ext/kanban/README.md +15 -15
  59. package/spec/v2/ext/knowledge/README.md +15 -15
  60. package/spec/v2/ext/launchStudio/README.md +16 -16
  61. package/spec/v2/ext/messaging/README.md +15 -15
  62. package/spec/v2/ext/portability/README.md +3 -17
  63. package/spec/v2/ext/provider-idempotency/README.md +7 -10
  64. package/spec/v2/ext/restTransport/README.md +30 -19
  65. package/spec/v2/ext/sandbox-runtime-notes/README.md +7 -9
  66. package/spec/v2/ext/webResearch/README.md +16 -16
  67. package/spec/v2/profiles.json +6 -2
  68. package/spec/v2/release.json +2 -2
  69. package/spec/v2/surface-baseline.json +544 -2
@@ -1,12 +1,15 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 API
4
- version: 2.42.6
4
+ version: 2.42.8
5
5
  summary: REST surface for declaring, executing, suspending, resuming, and observing multi-step workflows.
6
- description: GENERATED by scripts/derive-v2-api.py from api/openapi.yaml and the RFC 0167 children (v2 charter Phase 3,
7
- P3-C). Bare origin, unversioned path keys, negotiation by `OpenWOP-Version` + `protocolVersions[]` (RFC 0172 §A). No seam
8
- or test-mode operation lives here (RFC 0168 §C.2 — see api/seams-v2.yaml). Every non-standard header is `OpenWOP-<Name>`
9
- (RFC 0171 §C.1). Retry timing lives in `Retry-After` only (RFC 0171 §B.2).
6
+ description: 'The OpenWOP v2 REST API. Paths are unversioned and served at the bare origin; a client selects a version with
7
+ the `OpenWOP-Version` header from the host''s `protocolVersions[]`. Conformance seams and test-mode operations are not
8
+ in this document: they are in `api/seams-v2.yaml`. Every non-standard header is named `OpenWOP-<Name>`. Retry timing is
9
+ carried only in `Retry-After`.
10
+
11
+
12
+ Generated from `api/openapi.yaml` by `scripts/derive-v2-api.py`; do not edit.'
10
13
  contact:
11
14
  name: openwop spec working group
12
15
  url: https://openwop.dev/spec/v1/
@@ -14,11 +17,11 @@ info:
14
17
  name: Apache-2.0
15
18
  identifier: Apache-2.0
16
19
  externalDocs:
17
- description: openwop spec v1 corpus
20
+ description: OpenWOP specification (v1 corpus)
18
21
  url: https://openwop.dev/spec/v1/
19
22
  servers:
20
23
  - url: https://{host}
21
- description: openwop-compliant server
24
+ description: An OpenWOP server.
22
25
  variables:
23
26
  host:
24
27
  default: api.example.com
@@ -33,11 +36,11 @@ tags:
33
36
  - name: runs
34
37
  description: Run lifecycle — create, read, stream, cancel, fork.
35
38
  - name: agents
36
- description: Manifest-agent inventory (RFC 0072 §A). Read-only; gated on capabilities.agents.manifestRuntime. Dispatch rides
37
- the run surface (WorkflowNode.agent + POST /v1/runs).
39
+ description: Manifest-agent inventory. Read-only; gated on `capabilities.agents.manifestRuntime`. Dispatch uses the run
40
+ surface (`WorkflowNode.agent` + `POST /runs`).
38
41
  - name: tools
39
- description: Portable tool catalog (RFC 0078 §B). Read-only ToolDescriptor projection across tool sources (node-pack / workflow
40
- / mcp / connector / host-extension); gated on capabilities.toolCatalog; authorization-scoped per §F-2.
42
+ description: 'Portable tool catalog: a read-only `ToolDescriptor` projection across tool sources (node-pack, workflow, mcp,
43
+ connector, host-extension). Gated on `capabilities.toolCatalog`; scoped to the tools the caller is authorized to invoke.'
41
44
  - name: hitl
42
45
  description: Human-in-the-loop interrupts and approvals.
43
46
  - name: artifacts
@@ -45,16 +48,16 @@ tags:
45
48
  - name: webhooks
46
49
  description: Subscribe to run events via outbound HTTP.
47
50
  - name: triggers
48
- description: Durable trigger-bridge subscriptions (RFC 0083). RFC 0099 adds the external-event create surface (`POST /v1/trigger-subscriptions`);
51
+ description: Durable trigger-bridge subscriptions. The external-event create surface (`POST /trigger-subscriptions`) is
49
52
  gated on `capabilities.triggerBridge.ingestion.registrationEndpoint`.
50
53
  - name: audit
51
54
  description: Audit-log integrity verification (gated on the `openwop-audit-log-integrity` profile).
52
55
  - name: prompts
53
- description: Prompt-template library — list, fetch, render, mutate (RFC 0028; gated on `capabilities.prompts.*`).
56
+ description: 'Prompt-template library: list, fetch, render, mutate. Gated on `capabilities.prompts.*`.'
54
57
  - name: content
55
- description: Localized authored content — public delivery + tenant-scoped admin CRUD (RFC 0103; gated on `capabilities.content.supported`).
58
+ description: 'Localized authored content: public delivery and tenant-scoped admin CRUD. Gated on `capabilities.content.supported`.'
56
59
  - name: host
57
- description: Host-capability resources — e.g. the RFC 0059 agent workspace file store (gated on `capabilities.workspace.*`).
60
+ description: Host-capability resources, such as the agent workspace file store (gated on `capabilities.workspace.*`).
58
61
  paths:
59
62
  /.well-known/openwop:
60
63
  get:
@@ -69,11 +72,11 @@ paths:
69
72
  required: false
70
73
  schema:
71
74
  type: string
72
- description: 'RFC 0165 §C.2; runs.md §Snapshot. Standard conditional request against any resource that carries an
73
- `ETag` — the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot): a matching value
74
- MUST yield `304 Not Modified` with no body, and the 304 carries `OpenWOP-Version` like every response (versioning.md
75
- §1.4).'
75
+ description: Conditional request on the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot).
76
+ A value matching the `ETag` the host sent MUST yield `304 Not Modified` with no body. The 304 carries `OpenWOP-Version`
77
+ like every response (versioning.md §1.4).
76
78
  - $ref: '#/components/parameters/OpenWOPVersion'
79
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
77
80
  responses:
78
81
  '200':
79
82
  description: Capabilities object — see `capabilities.md`.
@@ -85,9 +88,8 @@ paths:
85
88
  ETag:
86
89
  schema:
87
90
  type: string
88
- description: 'capabilities.md §1 (RFC 0165 §C.2). Standard strong validator for the discovery document: a v2
89
- host MUST send it and MUST honor `If-None-Match` with `304`; a host that changes semantics without changing
90
- the bytes is non-conformant.'
91
+ description: Strong validator for the discovery document (capabilities.md §1). A v2 host MUST send it and MUST
92
+ honor `If-None-Match` with `304`. A host that changes semantics without changing the bytes is non-conformant.
91
93
  OpenWOP-Version:
92
94
  $ref: '#/components/headers/OpenWOPVersion'
93
95
  content:
@@ -95,7 +97,7 @@ paths:
95
97
  schema:
96
98
  $ref: '#/components/schemas/Capabilities'
97
99
  '304':
98
- description: RFC 0165 §C.2 — `If-None-Match` matched the current `ETag`; the body is unchanged.
100
+ description: '`If-None-Match` matched the current `ETag`; the body is unchanged.'
99
101
  headers:
100
102
  OpenWOP-Version:
101
103
  $ref: '#/components/headers/OpenWOPVersion'
@@ -136,6 +138,7 @@ paths:
136
138
  $ref: '#/components/headers/OpenWOPVersion'
137
139
  parameters:
138
140
  - $ref: '#/components/parameters/OpenWOPVersion'
141
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
139
142
  /workflows/{workflowId}:
140
143
  get:
141
144
  tags:
@@ -152,6 +155,7 @@ paths:
152
155
  parameters:
153
156
  - $ref: '#/components/parameters/WorkflowId'
154
157
  - $ref: '#/components/parameters/OpenWOPVersion'
158
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
155
159
  responses:
156
160
  '200':
157
161
  description: Workflow definition.
@@ -189,26 +193,18 @@ paths:
189
193
  type: string
190
194
  enum:
191
195
  - enforce
192
- description: When set, server cross-host claim system rejects duplicate `(tenantId, scopeId)` pairs with `409 Conflict`.
196
+ description: When set, the host's cross-host claim system rejects a duplicate `(tenantId, scopeId)` pair with `409
197
+ Conflict`.
193
198
  - in: header
194
199
  name: OpenWOP-Force-Engine-Version
195
200
  schema:
196
201
  type: integer
197
202
  minimum: 0
198
- description: '**Test-keys-only.** When set, the server emits events for this run AS IF it
199
-
200
- were running the specified engine version (must be within the server''s
201
-
202
- advertised `Capabilities.testing.forceEngineVersionRange`). Used by the
203
-
204
- conformance suite to verify version-negotiation fold-best-effort tolerance
205
-
206
- across the spec''s forward-compat matrix. Servers MUST reject on production
207
-
208
- API keys with `403 force_engine_version_forbidden`. Closes F5.
209
-
210
- '
203
+ description: Test keys only. The server emits this run's events as if it ran the given engine version, which must
204
+ be within `Capabilities.testing.forceEngineVersionRange`. Servers MUST reject it on production API keys with `403
205
+ force_engine_version_forbidden`.
211
206
  - $ref: '#/components/parameters/OpenWOPVersion'
207
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
212
208
  requestBody:
213
209
  required: true
214
210
  content:
@@ -228,10 +224,10 @@ paths:
228
224
  $ref: ../../schemas/v2/residency.schema.json
229
225
  tenantId:
230
226
  type: string
231
- description: Tenant scoping. Server typically defaults from API key.
227
+ description: Tenant scope. A host typically derives it from the API key.
232
228
  scopeId:
233
229
  type: string
234
- description: Opaque correlation ID for `X-Dedup` semantics.
230
+ description: Opaque correlation ID for `OpenWOP-Dedup`.
235
231
  callbackUrl:
236
232
  type: string
237
233
  format: uri
@@ -240,29 +236,18 @@ paths:
240
236
  type: string
241
237
  enum:
242
238
  - eval
243
- description: 'RFC 0081 §B. When `eval`, this run is an eval-suite projection
244
-
245
- (not a workflow run): the host runs the `evalSuiteRef` against
246
-
247
- `agentId`, emits the content-free `eval.*` family, and terminates
248
-
249
- with an `EvalSummary` readable via `GET /v1/runs/{runId}/eval-summary`.
250
-
251
- Capability-gated on `capabilities.agents.evalSuite.supported`; a
252
-
253
- host that omits it rejects `mode: "eval"` with 501. Omit for a
254
-
255
- normal workflow run.
256
-
257
- '
239
+ description: 'Set to `eval` to run an eval-suite projection instead of a workflow run: the host runs the
240
+ `evalSuiteRef` against `agentId`, emits the content-free `eval.*` family, and terminates with an `EvalSummary`
241
+ readable at `GET /runs/{runId}/eval-summary`. Gated on `capabilities.agents.evalSuite.supported`; a
242
+ host that omits it rejects `mode: "eval"` with 501. Omit for a normal workflow run.'
258
243
  evalSuiteRef:
259
244
  type: string
260
245
  minLength: 1
261
- description: RFC 0081 — URI of the `AgentEvalSuite` to run. Required when mode is `eval`.
246
+ description: URI of the `AgentEvalSuite` to run. Required when mode is `eval`.
262
247
  agentId:
263
248
  type: string
264
249
  minLength: 1
265
- description: RFC 0081 — the manifest agent the eval suite targets. Required when mode is `eval`.
250
+ description: The manifest agent the eval suite targets. Required when mode is `eval`.
266
251
  if:
267
252
  properties:
268
253
  mode:
@@ -319,7 +304,7 @@ paths:
319
304
  '403':
320
305
  $ref: '#/components/responses/Forbidden'
321
306
  '409':
322
- description: '`X-Dedup` collision OR concurrent `Idempotency-Key` collision.'
307
+ description: An `OpenWOP-Dedup` collision, or a concurrent `Idempotency-Key` collision.
323
308
  headers:
324
309
  Retry-After:
325
310
  schema:
@@ -337,11 +322,13 @@ paths:
337
322
  tags:
338
323
  - runs
339
324
  operationId: listRuns
340
- summary: The caller's runs, newest first, cursor-paginated (RFC 0182)
341
- description: 'Tenant-scoped by construction: only runs whose tenant segment is the caller''s, every runId bound (identity.md
342
- §5). Gated on the `runList` family — 404 not_found when unadvertised. `limit` is honoured up to `runList.maxPageSize`;
343
- `cursor` is opaque and a cursor the host did not mint is 400 validation_error; `workflowId` and `status` are exact-match
344
- filters when `runList.filters` names them (an unadvertised filter is ignored).'
325
+ summary: List the caller's runs, newest first
326
+ description: 'Lists only runs whose tenant segment is the caller''s; every `runId` is tenant-bound (identity.md §5).
327
+ The list is cursor-paginated. Gated on the `runList` family: a host that does not advertise it answers `404 not_found`.
328
+
329
+
330
+ `limit` is honoured up to `runList.maxPageSize`. `cursor` is opaque; a cursor the host did not mint is `400 validation_error`.
331
+ `workflowId` and `status` are exact-match filters when `runList.filters` names them; an unadvertised filter is ignored.'
345
332
  parameters:
346
333
  - name: limit
347
334
  in: query
@@ -349,7 +336,7 @@ paths:
349
336
  schema:
350
337
  type: integer
351
338
  minimum: 1
352
- description: Page size; clamped to runList.maxPageSize.
339
+ description: Page size; clamped to `runList.maxPageSize`.
353
340
  - name: cursor
354
341
  in: query
355
342
  required: false
@@ -357,13 +344,13 @@ paths:
357
344
  type: string
358
345
  minLength: 1
359
346
  maxLength: 2048
360
- description: Opaque cursor from a previous page's nextCursor.
347
+ description: Opaque cursor from a previous page's `nextCursor`.
361
348
  - name: workflowId
362
349
  in: query
363
350
  required: false
364
351
  schema:
365
352
  $ref: ../../schemas/v2/ids.schema.json#/$defs/workflowId
366
- description: Exact-match filter (when advertised in runList.filters).
353
+ description: Exact-match filter, when advertised in `runList.filters`.
367
354
  - name: status
368
355
  in: query
369
356
  required: false
@@ -380,8 +367,9 @@ paths:
380
367
  - failed
381
368
  - cancelling
382
369
  - cancelled
383
- description: Exact-match filter (when advertised in runList.filters).
370
+ description: Exact-match filter, when advertised in `runList.filters`.
384
371
  - $ref: '#/components/parameters/OpenWOPVersion'
372
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
385
373
  responses:
386
374
  '200':
387
375
  description: One page of the caller's runs.
@@ -425,11 +413,11 @@ paths:
425
413
  required: false
426
414
  schema:
427
415
  type: string
428
- description: 'RFC 0165 §C.2; runs.md §Snapshot. Standard conditional request against any resource that carries an
429
- `ETag` — the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot): a matching value
430
- MUST yield `304 Not Modified` with no body, and the 304 carries `OpenWOP-Version` like every response (versioning.md
431
- §1.4).'
416
+ description: Conditional request on the discovery document (capabilities.md §1) and the run snapshot (runs.md §Snapshot).
417
+ A value matching the `ETag` the host sent MUST yield `304 Not Modified` with no body. The 304 carries `OpenWOP-Version`
418
+ like every response (versioning.md §1.4).
432
419
  - $ref: '#/components/parameters/OpenWOPVersion'
420
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
433
421
  responses:
434
422
  '200':
435
423
  description: Projected run state.
@@ -437,13 +425,8 @@ paths:
437
425
  ETag:
438
426
  schema:
439
427
  type: string
440
- description: 'RFC 0115. Strong validator derived from the run''s latest
441
-
442
- persisted event-log sequence number; changes on every
443
-
444
- observable state transition, stable while none occurs.
445
-
446
- '
428
+ description: Strong validator derived from the run's latest persisted event-log sequence number. It changes
429
+ on every observable state transition and is stable while none occurs.
447
430
  Content-Encoding:
448
431
  required: false
449
432
  schema:
@@ -452,13 +435,8 @@ paths:
452
435
  - gzip
453
436
  - br
454
437
  - zstd
455
- description: 'RFC 0115. Present only when the host negotiated compression
456
-
457
- from `Accept-Encoding`; pairs with `Vary: Accept-Encoding`.
458
-
459
- The decoded body is byte-identical to the identity body.
460
-
461
- '
438
+ description: 'Present only when the host negotiated compression from `Accept-Encoding`; pairs with `Vary: Accept-Encoding`.
439
+ The decoded body is byte-identical to the identity body.'
462
440
  OpenWOP-Version:
463
441
  $ref: '#/components/headers/OpenWOPVersion'
464
442
  content:
@@ -466,7 +444,7 @@ paths:
466
444
  schema:
467
445
  $ref: '#/components/schemas/RunSnapshot'
468
446
  '304':
469
- description: RFC 0115. Not Modified — `If-None-Match` matched the current `ETag`. Empty body.
447
+ description: 'Not Modified: `If-None-Match` matched the current `ETag`. Empty body.'
470
448
  headers:
471
449
  OpenWOP-Version:
472
450
  $ref: '#/components/headers/OpenWOPVersion'
@@ -497,32 +475,24 @@ paths:
497
475
  type: string
498
476
  pattern: ^(values|(updates|messages|debug)(,(updates|messages|debug))*)$
499
477
  default: updates
500
- description: RFC 0171 §E.1 — the closed set and its comma-separated combinations; `values` never combines.
478
+ description: A stream mode from the closed set, or a comma-separated combination of them. `values` never combines.
501
479
  - in: query
502
480
  name: bufferMs
503
481
  schema:
504
482
  type: integer
505
483
  minimum: 0
506
484
  maximum: 5000
507
- description: 'Optional batching hint per S3 closure. When set, the server
508
-
509
- accumulates events for up to N ms (or until a forced-flush
510
-
511
- trigger fires — terminal events, suspensions, connection close)
512
-
513
- and emits a single SSE event with `event: batch` and `data:` as
514
-
515
- a JSON array of `RunEventDoc`. Range 0..5000; `0` = no buffering.
516
-
517
- See `stream-modes.md` §Aggregation hint.
518
-
519
- '
485
+ description: 'Optional batching hint. When set, the server accumulates events for up to N ms, or until a forced-flush
486
+ trigger fires (terminal events, suspensions, connection close), and emits a single SSE event with `event: batch`
487
+ and `data:` as a JSON array of `RunEventDoc`. Range 0..5000; `0` means no buffering. See `stream-modes.md` §Aggregation
488
+ hint.'
520
489
  - in: header
521
490
  name: Last-Event-ID
522
491
  schema:
523
492
  type: string
524
493
  description: Resume from sequence after this ID.
525
494
  - $ref: '#/components/parameters/OpenWOPVersion'
495
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
526
496
  responses:
527
497
  '200':
528
498
  description: SSE stream. Auto-closes on terminal event. Keep-alive comments every 30s.
@@ -569,8 +539,8 @@ paths:
569
539
  schema:
570
540
  type: integer
571
541
  minimum: 0
572
- description: RFC 0171 §E.2 — return events with `sequence > afterSequence`; omission means from the first event (sequence
573
- 0). `lastSequence` and `since` are gone.
542
+ description: Return events with `sequence > afterSequence`. Omitted, the poll starts from the first event (sequence
543
+ 0).
574
544
  - in: query
575
545
  name: timeout
576
546
  schema:
@@ -580,9 +550,10 @@ paths:
580
550
  default: 30
581
551
  description: Seconds to wait for new events. Max 60.
582
552
  - $ref: '#/components/parameters/OpenWOPVersion'
553
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
583
554
  responses:
584
555
  '200':
585
- description: Events since `lastSequence`.
556
+ description: Events after `afterSequence`.
586
557
  content:
587
558
  application/json:
588
559
  schema:
@@ -604,8 +575,7 @@ paths:
604
575
  lastSequence:
605
576
  type: integer
606
577
  minimum: -1
607
- description: The highest sequence in the log at the time of the response (one meaning); -1 when the log
608
- is empty.
578
+ description: The highest sequence in the log at the time of the response; -1 when the log is empty.
609
579
  status:
610
580
  type: string
611
581
  isTerminal:
@@ -636,6 +606,7 @@ paths:
636
606
  - $ref: '#/components/parameters/RunId'
637
607
  - $ref: '#/components/parameters/IdempotencyKey'
638
608
  - $ref: '#/components/parameters/OpenWOPVersion'
609
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
639
610
  requestBody:
640
611
  content:
641
612
  application/json:
@@ -672,7 +643,7 @@ paths:
672
643
  post:
673
644
  tags:
674
645
  - runs
675
- summary: Record a non-blocking quality annotation on a run (RFC 0056).
646
+ summary: Record a non-blocking quality annotation on a run.
676
647
  operationId: createAnnotation
677
648
  security:
678
649
  - ApiKeyAuth:
@@ -685,6 +656,7 @@ paths:
685
656
  - $ref: '#/components/parameters/RunId'
686
657
  - $ref: '#/components/parameters/IdempotencyKey'
687
658
  - $ref: '#/components/parameters/OpenWOPVersion'
659
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
688
660
  requestBody:
689
661
  required: true
690
662
  content:
@@ -710,7 +682,7 @@ paths:
710
682
  '404':
711
683
  $ref: '#/components/responses/NotFound'
712
684
  '501':
713
- description: Host does not advertise capabilities.feedback.supported (RFC 0056).
685
+ description: Host does not advertise `capabilities.feedback.supported`.
714
686
  content:
715
687
  application/json:
716
688
  schema:
@@ -721,7 +693,7 @@ paths:
721
693
  get:
722
694
  tags:
723
695
  - runs
724
- summary: List the annotations recorded on a run (RFC 0056).
696
+ summary: List the annotations recorded on a run.
725
697
  operationId: listAnnotations
726
698
  security:
727
699
  - ApiKeyAuth:
@@ -733,6 +705,7 @@ paths:
733
705
  parameters:
734
706
  - $ref: '#/components/parameters/RunId'
735
707
  - $ref: '#/components/parameters/OpenWOPVersion'
708
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
736
709
  responses:
737
710
  '200':
738
711
  description: Annotations for the run (tenant-scoped).
@@ -758,7 +731,7 @@ paths:
758
731
  '404':
759
732
  $ref: '#/components/responses/NotFound'
760
733
  '501':
761
- description: Host does not advertise capabilities.feedback.supported (RFC 0056).
734
+ description: Host does not advertise `capabilities.feedback.supported`.
762
735
  content:
763
736
  application/json:
764
737
  schema:
@@ -770,20 +743,11 @@ paths:
770
743
  post:
771
744
  tags:
772
745
  - triggers
773
- summary: Register an external-event trigger subscription (RFC 0099).
774
- description: 'Creates an external-event (`webhook`/`email`/`form`) TriggerSubscription
775
-
776
- bound to a workflow, with a dedup config and a source-authenticity
777
-
778
- verification policy (RFC 0099 §F.2). The `workflowId` MUST resolve under
779
-
780
- the caller''s RFC 0048 owner triple. The response carries the created
781
-
782
- TriggerSubscription plus a source-specific `binding`; the binding
783
-
784
- secret/URL is returned ONCE and is not re-fetchable in cleartext.
785
-
786
- '
746
+ summary: Register an external-event trigger subscription.
747
+ description: Creates an external-event (`webhook`/`email`/`form`) TriggerSubscription bound to a workflow, with a dedup
748
+ config and a source-authenticity verification policy. The `workflowId` MUST resolve under the caller's owner triple.
749
+ The response carries the created TriggerSubscription plus a source-specific `binding`; the binding secret or URL is
750
+ returned once and cannot be re-fetched in cleartext.
787
751
  operationId: createTriggerSubscription
788
752
  security:
789
753
  - ApiKeyAuth:
@@ -795,6 +759,7 @@ paths:
795
759
  parameters:
796
760
  - $ref: '#/components/parameters/IdempotencyKey'
797
761
  - $ref: '#/components/parameters/OpenWOPVersion'
762
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
798
763
  requestBody:
799
764
  required: true
800
765
  content:
@@ -817,15 +782,9 @@ paths:
817
782
  $ref: ../../schemas/v2/trigger-subscription.schema.json
818
783
  binding:
819
784
  type: object
820
- description: 'Source-specific binding the caller needs to wire the external
821
-
822
- source. For `webhook`: `{ ingestUrl, secretFingerprint }`; for
823
-
824
- `email`: `{ ingestAddress }`; for `form`: `{ ingestUrl }`. The
825
-
826
- secret is returned once at creation (SR-1).
827
-
828
- '
785
+ description: 'Source-specific binding the caller needs to wire the external source. For `webhook`: `{
786
+ ingestUrl, secretFingerprint }`; for `email`: `{ ingestAddress }`; for `form`: `{ ingestUrl }`. The
787
+ secret is returned once, at creation (SR-1).'
829
788
  additionalProperties: true
830
789
  properties:
831
790
  ingestUrl:
@@ -846,7 +805,7 @@ paths:
846
805
  '403':
847
806
  $ref: '#/components/responses/Forbidden'
848
807
  '501':
849
- description: Host does not advertise capabilities.triggerBridge.ingestion.registrationEndpoint (RFC 0099).
808
+ description: Host does not advertise `capabilities.triggerBridge.ingestion.registrationEndpoint`.
850
809
  content:
851
810
  application/json:
852
811
  schema:
@@ -859,32 +818,19 @@ paths:
859
818
  tags:
860
819
  - content
861
820
  security: []
862
- summary: Deliver a published content page resolved for the negotiated locale (RFC 0103 §D).
863
- description: 'Resolves the published page `slug` for the locale negotiated from
864
-
865
- `Accept-Language` (i18n.md fallback: q-value order → language family →
866
-
867
- `content.baseLocale`), applies the per-section field merge
868
-
869
- (`localized-content.md` §C), and returns the already-merged sections in
870
-
871
- render order. Sets `Content-Language` to the locale used,
821
+ summary: Deliver a published content page resolved for the negotiated locale.
822
+ description: 'Returns the published page `slug` for the locale negotiated from `Accept-Language`, with its sections
823
+ already merged, in render order. Locale fallback follows i18n.md: q-value order, then language family, then `content.baseLocale`.
824
+ Sections are merged field by field (`localized-content.md` §C).
872
825
 
873
- `Vary: Accept-Language, Accept-Encoding`, and
874
826
 
875
- `Cache-Control: public, max-age=300, stale-while-revalidate=3600`.
827
+ The response sets `Content-Language` to the locale used, `Vary: Accept-Language, Accept-Encoding`, and `Cache-Control:
828
+ public, max-age=300, stale-while-revalidate=3600`. Only `status: "published"` content is served.
876
829
 
877
- Serves `status: "published"` content only. Tenant is host-resolved
878
830
 
879
- (`localized-content.md` §F): credential-derived when authenticated,
880
-
881
- host-defined (e.g. domain) when anonymous. A `slug` absent for the
882
-
883
- resolved tenant returns the same `404` as a nonexistent slug (no
884
-
885
- cross-tenant enumeration).
886
-
887
- '
831
+ The tenant is host-resolved (`localized-content.md` §F): from the credential when authenticated, host-defined (for
832
+ example by domain) when anonymous. A `slug` absent for the resolved tenant returns the same `404` as a nonexistent
833
+ slug, so tenants cannot be enumerated.'
888
834
  operationId: getContentPage
889
835
  parameters:
890
836
  - name: slug
@@ -899,8 +845,10 @@ paths:
899
845
  required: false
900
846
  schema:
901
847
  type: string
902
- description: BCP-47 preference list; authoritative for locale selection (i18n.md). A malformed value MUST NOT 400.
848
+ description: BCP-47 preference list; authoritative for locale selection (i18n.md). A malformed value MUST NOT produce
849
+ a 400.
903
850
  - $ref: '#/components/parameters/OpenWOPVersion'
851
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
904
852
  responses:
905
853
  '200':
906
854
  description: The resolved, published page for the negotiated locale.
@@ -918,7 +866,7 @@ paths:
918
866
  '404':
919
867
  $ref: '#/components/responses/NotFound'
920
868
  '501':
921
- description: Host does not advertise capabilities.content.supported (RFC 0103).
869
+ description: Host does not advertise `capabilities.content.supported`.
922
870
  content:
923
871
  application/json:
924
872
  schema:
@@ -929,28 +877,15 @@ paths:
929
877
  delete:
930
878
  tags:
931
879
  - content
932
- summary: Delete a content page (RFC 0103 §D, admin).
933
- description: '`localized-content.md` §D lists `DELETE …/content/pages/{pageId}` among
934
-
935
- the admin CRUD operations: tenant-scoped, requires `content.write`, and
936
-
937
- removes the page with its sections and every locale overlay. The path
938
-
939
- segment is the page''s **`pageId`**, not its slug. It shares this path
940
-
941
- item with public delivery, which addresses the same segment by `slug`,
880
+ summary: Delete a content page (admin).
881
+ description: 'Deletes a page with its sections and every locale overlay: the `DELETE …/content/pages/{pageId}` admin
882
+ operation of `localized-content.md` §D. Tenant-scoped; requires `content.write`.
942
883
 
943
- because OpenAPI 3.1 treats two templates that differ only in the
944
884
 
945
- parameter name as identical and forbids them; the parameter keeps
946
-
947
- delivery''s name for that reason alone. A `pageId` absent for the
948
-
949
- caller''s tenant returns the same `404` as a nonexistent one
950
-
951
- (`localized-content.md` §F, no cross-tenant enumeration).
952
-
953
- '
885
+ The path segment is the page''s `pageId`, not its slug. The operation shares this path item with public delivery,
886
+ which addresses the same segment by `slug`, and OpenAPI 3.1 forbids two templates that differ only in parameter name,
887
+ so the parameter keeps delivery''s name. A `pageId` absent for the caller''s tenant returns the same `404` as a nonexistent
888
+ one (`localized-content.md` §F), so tenants cannot be enumerated.'
954
889
  operationId: deleteContentPage
955
890
  security:
956
891
  - ApiKeyAuth:
@@ -966,8 +901,10 @@ paths:
966
901
  schema:
967
902
  type: string
968
903
  minLength: 1
969
- description: For this operation, the page's `pageId` (§D). See the operation description for why the name is shared.
904
+ description: For this operation, the page's `pageId`, not its slug; the operation description explains the shared
905
+ name.
970
906
  - $ref: '#/components/parameters/OpenWOPVersion'
907
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
971
908
  responses:
972
909
  '204':
973
910
  description: The page, its sections and its locale overlays were deleted.
@@ -984,12 +921,8 @@ paths:
984
921
  get:
985
922
  tags:
986
923
  - content
987
- summary: List content pages for the caller's tenant (RFC 0103 §D, admin).
988
- description: 'Tenant-scoped admin listing of pages (draft + published). Requires a
989
-
990
- principal with `content.read` scope.
991
-
992
- '
924
+ summary: List content pages for the caller's tenant (admin).
925
+ description: Tenant-scoped admin listing of pages, draft and published. Requires a principal with `content.read` scope.
993
926
  operationId: listContentPages
994
927
  security:
995
928
  - ApiKeyAuth:
@@ -1015,7 +948,7 @@ paths:
1015
948
  '403':
1016
949
  $ref: '#/components/responses/Forbidden'
1017
950
  '501':
1018
- description: Host does not advertise capabilities.content.supported (RFC 0103).
951
+ description: Host does not advertise `capabilities.content.supported`.
1019
952
  content:
1020
953
  application/json:
1021
954
  schema:
@@ -1025,10 +958,11 @@ paths:
1025
958
  $ref: '#/components/headers/OpenWOPVersion'
1026
959
  parameters:
1027
960
  - $ref: '#/components/parameters/OpenWOPVersion'
961
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1028
962
  post:
1029
963
  tags:
1030
964
  - content
1031
- summary: Create a content page (RFC 0103 §D, admin).
965
+ summary: Create a content page (admin).
1032
966
  description: Tenant-scoped page creation. Requires `content.write` scope.
1033
967
  operationId: createContentPage
1034
968
  security:
@@ -1055,7 +989,7 @@ paths:
1055
989
  OpenWOP-Version:
1056
990
  $ref: '#/components/headers/OpenWOPVersion'
1057
991
  '400':
1058
- description: Invalid request (e.g. baseLocale in supportedLocales, or a malformed locale/slug).
992
+ description: Invalid request (for example `baseLocale` in `supportedLocales`, or a malformed locale or slug).
1059
993
  content:
1060
994
  application/json:
1061
995
  schema:
@@ -1069,18 +1003,14 @@ paths:
1069
1003
  $ref: '#/components/responses/Forbidden'
1070
1004
  parameters:
1071
1005
  - $ref: '#/components/parameters/OpenWOPVersion'
1006
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1072
1007
  /content/pages/{pageId}/sections/{sectionId}:
1073
1008
  put:
1074
1009
  tags:
1075
1010
  - content
1076
- summary: Upsert a section's base or per-locale fields (RFC 0103 §D, admin).
1077
- description: 'Locale-targeted write: `locale == content.baseLocale` upserts the
1078
-
1079
- section''s base `data`; any other (case-canonical BCP 47 subset, RFC 0206) locale upserts
1080
-
1081
- `localizations[locale]`. Tenant-scoped; requires `content.write`.
1082
-
1083
- '
1011
+ summary: Upsert a section's base or per-locale fields (admin).
1012
+ description: Locale-targeted write. `locale == content.baseLocale` upserts the section's base `data`; any other locale
1013
+ (case-canonical BCP 47 subset) upserts `localizations[locale]`. Tenant-scoped; requires `content.write`.
1084
1014
  operationId: putContentSection
1085
1015
  security:
1086
1016
  - ApiKeyAuth:
@@ -1103,6 +1033,7 @@ paths:
1103
1033
  type: string
1104
1034
  minLength: 1
1105
1035
  - $ref: '#/components/parameters/OpenWOPVersion'
1036
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1106
1037
  requestBody:
1107
1038
  required: true
1108
1039
  content:
@@ -1117,7 +1048,7 @@ paths:
1117
1048
  locale:
1118
1049
  type: string
1119
1050
  pattern: ^[a-z]{2,3}(-[A-Z][a-z]{3})?(-([A-Z]{2}|[0-9]{3}))?$
1120
- description: Target locale; baseLocale upserts `data`, else `localizations[locale]`.
1051
+ description: Target locale. `baseLocale` upserts `data`; any other locale upserts `localizations[locale]`.
1121
1052
  data:
1122
1053
  type: object
1123
1054
  additionalProperties: true
@@ -1133,7 +1064,7 @@ paths:
1133
1064
  OpenWOP-Version:
1134
1065
  $ref: '#/components/headers/OpenWOPVersion'
1135
1066
  '400':
1136
- description: Invalid request (e.g. baseLocale in supportedLocales, or a malformed locale/slug).
1067
+ description: Invalid request (for example `baseLocale` in `supportedLocales`, or a malformed locale or slug).
1137
1068
  content:
1138
1069
  application/json:
1139
1070
  schema:
@@ -1151,7 +1082,7 @@ paths:
1151
1082
  get:
1152
1083
  tags:
1153
1084
  - content
1154
- summary: Read the tenant's content language settings (RFC 0103 §B, admin).
1085
+ summary: Read the tenant's content language settings (admin).
1155
1086
  description: Tenant-scoped read of `{ baseLocale, supportedLocales, autoTranslateOnPublish }`. Requires `content.read`.
1156
1087
  operationId: getContentSettings
1157
1088
  security:
@@ -1176,7 +1107,7 @@ paths:
1176
1107
  '403':
1177
1108
  $ref: '#/components/responses/Forbidden'
1178
1109
  '501':
1179
- description: Host does not advertise capabilities.content.supported (RFC 0103).
1110
+ description: Host does not advertise `capabilities.content.supported`.
1180
1111
  content:
1181
1112
  application/json:
1182
1113
  schema:
@@ -1186,15 +1117,13 @@ paths:
1186
1117
  $ref: '#/components/headers/OpenWOPVersion'
1187
1118
  parameters:
1188
1119
  - $ref: '#/components/parameters/OpenWOPVersion'
1120
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1189
1121
  put:
1190
1122
  tags:
1191
1123
  - content
1192
- summary: Update the tenant's content language settings (RFC 0103 §B, admin).
1193
- description: 'Tenant-scoped settings update. The invariant `baseLocale ∉
1194
-
1195
- supportedLocales` MUST hold (else `400`). Requires `content.write`.
1196
-
1197
- '
1124
+ summary: Update the tenant's content language settings (admin).
1125
+ description: Tenant-scoped settings update. The invariant `baseLocale ∉ supportedLocales` MUST hold, else `400`. Requires
1126
+ `content.write`.
1198
1127
  operationId: putContentSettings
1199
1128
  security:
1200
1129
  - ApiKeyAuth:
@@ -1220,7 +1149,7 @@ paths:
1220
1149
  OpenWOP-Version:
1221
1150
  $ref: '#/components/headers/OpenWOPVersion'
1222
1151
  '400':
1223
- description: Invalid request (e.g. baseLocale in supportedLocales, or a malformed locale/slug).
1152
+ description: Invalid request (for example `baseLocale` in `supportedLocales`, or a malformed locale or slug).
1224
1153
  content:
1225
1154
  application/json:
1226
1155
  schema:
@@ -1234,26 +1163,16 @@ paths:
1234
1163
  $ref: '#/components/responses/Forbidden'
1235
1164
  parameters:
1236
1165
  - $ref: '#/components/parameters/OpenWOPVersion'
1166
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1237
1167
  /runs:bulk-cancel:
1238
1168
  post:
1239
1169
  tags:
1240
1170
  - runs
1241
1171
  summary: Cancel a set of in-flight runs in a single request.
1242
- description: 'Per `spec/v1/rest-endpoints.md` §"POST /v1/runs:bulk-cancel". Accepts
1243
-
1244
- a non-empty array of runIds and processes each cancellation
1245
-
1246
- independently. Returns `200` with a per-id results array even when
1247
-
1248
- some individual cancellations fail; the top-level operation succeeds
1249
-
1250
- when the request reached the host, regardless of per-id outcomes.
1251
-
1252
- Hosts enforce a host-defined cap on the array length (RECOMMENDED
1253
-
1254
- 100); over-cap requests return `400 validation_error`.
1255
-
1256
- '
1172
+ description: 'Accepts a non-empty array of runIds and cancels each one independently. Returns `200` with a per-id results
1173
+ array even when some cancellations fail: the operation succeeds when the request reached the host, whatever the per-id
1174
+ outcomes. Hosts enforce a host-defined cap on the array length (RECOMMENDED 100); an over-cap request returns `400
1175
+ validation_error`.'
1257
1176
  operationId: bulkCancelRuns
1258
1177
  security:
1259
1178
  - ApiKeyAuth:
@@ -1265,6 +1184,7 @@ paths:
1265
1184
  parameters:
1266
1185
  - $ref: '#/components/parameters/IdempotencyKey'
1267
1186
  - $ref: '#/components/parameters/OpenWOPVersion'
1187
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1268
1188
  requestBody:
1269
1189
  required: true
1270
1190
  content:
@@ -1345,6 +1265,7 @@ paths:
1345
1265
  - $ref: '#/components/parameters/RunId'
1346
1266
  - $ref: '#/components/parameters/IdempotencyKey'
1347
1267
  - $ref: '#/components/parameters/OpenWOPVersion'
1268
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1348
1269
  requestBody:
1349
1270
  required: true
1350
1271
  content:
@@ -1357,15 +1278,9 @@ paths:
1357
1278
  fromSeq:
1358
1279
  type: integer
1359
1280
  minimum: 0
1360
- description: 'Inclusive — events `< fromSeq` are fixed history; `>= fromSeq` are re-executed.
1361
-
1362
- Required for `branch` (the branch point). Optional for `replay`; when omitted,
1363
-
1364
- defaults to `0` (full re-execution from source-run start) per `replay.md`
1365
-
1366
- §"Replay-mode defaults".
1367
-
1368
- '
1281
+ description: 'Inclusive: events `< fromSeq` are fixed history and events `>= fromSeq` are re-executed. Required
1282
+ for `branch` (the branch point). Optional for `replay`, where it defaults to `0`, full re-execution from
1283
+ the start of the source run (`replay.md` §"Replay-mode defaults").'
1369
1284
  mode:
1370
1285
  type: string
1371
1286
  enum:
@@ -1373,7 +1288,7 @@ paths:
1373
1288
  - branch
1374
1289
  runOptionsOverlay:
1375
1290
  type: object
1376
- description: For `branch` mode only — caller-supplied `RunOptions` to overlay.
1291
+ description: '`branch` mode only: caller-supplied `RunOptions` to overlay.'
1377
1292
  additionalProperties: false
1378
1293
  responses:
1379
1294
  '201':
@@ -1409,7 +1324,7 @@ paths:
1409
1324
  OpenWOP-Version:
1410
1325
  $ref: '#/components/headers/OpenWOPVersion'
1411
1326
  '400':
1412
- description: Invalid `fromSeq`, `replay` with non-empty `runOptionsOverlay`, etc.
1327
+ description: Invalid `fromSeq`, `replay` with a non-empty `runOptionsOverlay`, and similar.
1413
1328
  content:
1414
1329
  application/json:
1415
1330
  schema:
@@ -1424,7 +1339,7 @@ paths:
1424
1339
  '404':
1425
1340
  $ref: '#/components/responses/NotFound'
1426
1341
  '422':
1427
- description: '`fromSeq` references a sequence number that doesn''t exist in the source run''s event log.'
1342
+ description: '`fromSeq` names a sequence number that does not exist in the source run''s event log.'
1428
1343
  content:
1429
1344
  application/json:
1430
1345
  schema:
@@ -1436,19 +1351,10 @@ paths:
1436
1351
  get:
1437
1352
  tags:
1438
1353
  - runs
1439
- summary: 'RFC 0040 §C — return the run''s immediate parent in the cross-host
1440
-
1441
- composition chain. Capability-gated on
1442
-
1443
- `capabilities.multiAgent.executionModel.crossHostCausation.ancestryEndpointSupported: true`;
1444
-
1445
- hosts that don''t advertise return 404 not_found. Clients walk the full
1446
-
1447
- chain by following `parent.wellKnownUrl` per response, one hop at a
1448
-
1449
- time.
1450
-
1451
- '
1354
+ summary: Read a run's parent in the cross-host composition chain
1355
+ description: 'Returns the run''s immediate parent in the cross-host composition chain. Gated on `capabilities.multiAgent.executionModel.crossHostCausation.ancestryEndpointSupported:
1356
+ true`; a host that does not advertise it returns 404 not_found. Clients walk the full chain one hop at a time by following
1357
+ `parent.wellKnownUrl` in each response.'
1452
1358
  operationId: getRunAncestry
1453
1359
  security:
1454
1360
  - ApiKeyAuth:
@@ -1460,11 +1366,10 @@ paths:
1460
1366
  parameters:
1461
1367
  - $ref: '#/components/parameters/RunId'
1462
1368
  - $ref: '#/components/parameters/OpenWOPVersion'
1369
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1463
1370
  responses:
1464
1371
  '200':
1465
- description: 'Run''s immediate parent (or `parent: null` for top-level runs).
1466
-
1467
- '
1372
+ description: 'The run''s immediate parent (`parent: null` for a top-level run).'
1468
1373
  content:
1469
1374
  application/json:
1470
1375
  schema:
@@ -1477,15 +1382,8 @@ paths:
1477
1382
  '403':
1478
1383
  $ref: '#/components/responses/Forbidden'
1479
1384
  '404':
1480
- description: 'Either the run doesn''t exist, OR the host doesn''t advertise
1481
-
1482
- `crossHostCausation.ancestryEndpointSupported: true` and treats
1483
-
1484
- the endpoint as absent. Clients can disambiguate by inspecting
1485
-
1486
- the host''s discovery doc.
1487
-
1488
- '
1385
+ description: 'The run does not exist, or the host does not advertise `crossHostCausation.ancestryEndpointSupported:
1386
+ true` and treats the endpoint as absent. Clients can tell the two apart from the host''s discovery document.'
1489
1387
  content:
1490
1388
  application/json:
1491
1389
  schema:
@@ -1497,35 +1395,18 @@ paths:
1497
1395
  get:
1498
1396
  tags:
1499
1397
  - agents
1500
- summary: 'RFC 0072 §A — list the manifest agents this host has installed into its
1501
-
1502
- AgentRegistry (RFC 0070). Capability-gated on
1503
-
1504
- `capabilities.agents.manifestRuntime.supported: true`; hosts that don''t
1505
-
1506
- advertise it return 404. Read-only projection — never carries the
1507
-
1508
- system-prompt body, resolved handoff schemas, or credential material (SR-1).
1509
-
1510
- Dispatch is not a bespoke endpoint: a manifest agent is invoked as a run
1511
-
1512
- whose node pins it via `WorkflowNode.agent` + `POST /v1/runs` (RFC 0072 §B).
1513
-
1514
- RFC 0074 — the result is scoped to the authenticated principal''s owner
1515
-
1516
- triple (RFC 0048). When `capabilities.agents.manifestRuntime.installScope`
1517
-
1518
- is `''tenant''`, only the agents available to the caller''s tenant·workspace
1519
-
1520
- are returned (an agent another workspace installed is absent, never
1521
-
1522
- disclosed); when `''host''` (default) the inventory is host-global as in
1523
-
1524
- RFC 0072. A `''tenant''`-scoped host MUST reject unauthenticated/unscoped
1525
-
1526
- requests per its standard auth contract rather than fall back to a global list.
1527
-
1528
- '
1398
+ summary: List installed manifest agents
1399
+ description: 'Lists the manifest agents installed in this host''s AgentRegistry. Gated on `capabilities.agents.manifestRuntime.supported:
1400
+ true`; a host that does not advertise it returns 404. The projection is read-only and never carries the system-prompt
1401
+ body, resolved handoff schemas, or credential material (SR-1). There is no dispatch endpoint: a manifest agent is
1402
+ invoked as a run whose node pins it with `WorkflowNode.agent` + `POST /runs`.
1403
+
1404
+
1405
+ The result is scoped to the authenticated principal''s owner triple. When `capabilities.agents.manifestRuntime.installScope`
1406
+ is `''tenant''`, only the agents available to the caller''s tenant and workspace are returned; an agent another workspace
1407
+ installed is absent, never disclosed. When it is `''host''` (the default), the inventory is host-global. A `''tenant''`-scoped
1408
+ host MUST reject unauthenticated or unscoped requests under its standard auth contract rather than fall back to a
1409
+ global list.'
1529
1410
  operationId: listAgents
1530
1411
  security:
1531
1412
  - ApiKeyAuth:
@@ -1536,9 +1417,9 @@ paths:
1536
1417
  - runs:read
1537
1418
  responses:
1538
1419
  '200':
1539
- description: 'Installed manifest agents (agentId-sorted). RFC 0202: when the host advertises `a2a.agentCards`, an
1540
- entry the host routes a workflow to carries `a2aTenant`, the opaque A2A `tenant` value of that agent''s card (interop.md
1541
- §Per-agent cards).'
1420
+ description: Installed manifest agents, sorted by `agentId`. When the host advertises `a2a.agentCards`, an entry
1421
+ the host routes a workflow to carries `a2aTenant`, the opaque A2A `tenant` value of that agent's card (interop.md
1422
+ §Per-agent cards).
1542
1423
  content:
1543
1424
  application/json:
1544
1425
  schema:
@@ -1551,11 +1432,7 @@ paths:
1551
1432
  '403':
1552
1433
  $ref: '#/components/responses/Forbidden'
1553
1434
  '404':
1554
- description: 'Host does not advertise `capabilities.agents.manifestRuntime` and
1555
-
1556
- treats the endpoint as absent.
1557
-
1558
- '
1435
+ description: Host does not advertise `capabilities.agents.manifestRuntime` and treats the endpoint as absent.
1559
1436
  content:
1560
1437
  application/json:
1561
1438
  schema:
@@ -1565,25 +1442,16 @@ paths:
1565
1442
  $ref: '#/components/headers/OpenWOPVersion'
1566
1443
  parameters:
1567
1444
  - $ref: '#/components/parameters/OpenWOPVersion'
1445
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1568
1446
  /agents/{agentId}:
1569
1447
  get:
1570
1448
  tags:
1571
1449
  - agents
1572
- summary: 'RFC 0072 §A — return one installed manifest agent''s inventory entry, or
1573
-
1574
- 404 when no such agent is installed (or the host doesn''t advertise
1575
-
1576
- `capabilities.agents.manifestRuntime`). RFC 0074 — resolved within the
1577
-
1578
- authenticated principal''s owner triple (RFC 0048): on an
1579
-
1580
- `installScope: ''tenant''` host an agent the caller''s workspace has not
1581
-
1582
- approved 404s identically to "not installed", so the surface never
1583
-
1584
- discloses another tenant''s inventory.
1585
-
1586
- '
1450
+ summary: Read one installed manifest agent
1451
+ description: 'Returns one installed manifest agent''s inventory entry, or 404 when no such agent is installed or the
1452
+ host does not advertise `capabilities.agents.manifestRuntime`. The lookup is resolved within the authenticated principal''s
1453
+ owner triple: on an `installScope: ''tenant''` host, an agent the caller''s workspace has not approved returns the
1454
+ same 404 as "not installed", so another tenant''s inventory is never disclosed.'
1587
1455
  operationId: getAgent
1588
1456
  security:
1589
1457
  - ApiKeyAuth:
@@ -1599,21 +1467,14 @@ paths:
1599
1467
  schema:
1600
1468
  type: string
1601
1469
  pattern: ^(?!roster$|org-chart$).+$
1602
- description: 'The manifest agentId. MUST NOT be the reserved literals `roster` or
1603
-
1604
- `org-chart` — those name the sibling collection routes
1605
-
1606
- (`/v1/agents/roster`, `/v1/agents/org-chart`), so excluding them here
1607
-
1608
- keeps `/v1/agents/{agentId}` unambiguous against them.
1609
-
1610
- '
1470
+ description: The manifest agentId. MUST NOT be the reserved literals `roster` or `org-chart`, which name the sibling
1471
+ collection routes (`/agents/roster`, `/agents/org-chart`), so `/agents/{agentId}` stays unambiguous.
1611
1472
  - $ref: '#/components/parameters/OpenWOPVersion'
1473
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1612
1474
  responses:
1613
1475
  '200':
1614
- description: 'The agent''s inventory entry. RFC 0202: when the host advertises `a2a.agentCards`, an entry the host
1615
- routes a workflow to carries `a2aTenant`, the opaque A2A `tenant` value of that agent''s card (interop.md §Per-agent
1616
- cards).'
1476
+ description: The agent's inventory entry. When the host advertises `a2a.agentCards`, an entry the host routes a
1477
+ workflow to carries `a2aTenant`, the opaque A2A `tenant` value of that agent's card (interop.md §Per-agent cards).
1617
1478
  content:
1618
1479
  application/json:
1619
1480
  schema:
@@ -1638,21 +1499,11 @@ paths:
1638
1499
  get:
1639
1500
  tags:
1640
1501
  - agents
1641
- summary: 'RFC 0082 §C/§E — list the deployment records (per-(agentId, version)) for
1642
-
1643
- a manifest agent: the lifecycle `state`, the named `channels`, the canary
1644
-
1645
- share, the rollback pointer, and the last-transition provenance. Read-only,
1646
-
1647
- content-free of any manifest body or credential (SR-1). Capability-gated on
1648
-
1649
- `capabilities.agents.deployment.supported: true`; hosts that don''t advertise
1650
-
1651
- it return 404. Tenant-scoped to the caller''s owner triple (RFC 0048/0074)
1652
-
1653
- when `installScope: ''tenant''`.
1654
-
1655
- '
1502
+ summary: List an agent's deployment records
1503
+ description: 'Lists the deployment records, one per `(agentId, version)`, for a manifest agent: the lifecycle `state`,
1504
+ the named `channels`, the canary share, the rollback pointer, and the last-transition provenance. Read-only and content-free
1505
+ of any manifest body or credential (SR-1). Gated on `capabilities.agents.deployment.supported: true`; a host that
1506
+ does not advertise it returns 404. Tenant-scoped to the caller''s owner triple when `installScope: ''tenant''`.'
1656
1507
  operationId: listAgentDeployments
1657
1508
  security:
1658
1509
  - ApiKeyAuth:
@@ -1668,18 +1519,11 @@ paths:
1668
1519
  schema:
1669
1520
  type: string
1670
1521
  pattern: ^(?!roster$|org-chart$).+$
1671
- description: 'The manifest agentId. MUST NOT be the reserved literals `roster` or
1672
-
1673
- `org-chart` — those name the sibling collection routes
1674
-
1675
- (`/v1/agents/roster/{rosterId}`, `/v1/agents/org-chart/{departmentId}`),
1676
-
1677
- so excluding them here keeps `/v1/agents/{agentId}/deployments`
1678
-
1679
- unambiguous against them.
1680
-
1681
- '
1522
+ description: The manifest agentId. MUST NOT be the reserved literals `roster` or `org-chart`, which name the sibling
1523
+ collection routes (`/agents/roster/{rosterId}`, `/agents/org-chart/{departmentId}`), so `/agents/{agentId}/deployments`
1524
+ stays unambiguous.
1682
1525
  - $ref: '#/components/parameters/OpenWOPVersion'
1526
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1683
1527
  responses:
1684
1528
  '200':
1685
1529
  description: The agent's deployment records (version-sorted).
@@ -1708,21 +1552,12 @@ paths:
1708
1552
  post:
1709
1553
  tags:
1710
1554
  - agents
1711
- summary: 'RFC 0082 §E — request a deployment state transition (promote / pause /
1712
-
1713
- deprecate / rollback / adjust-canary). The host MUST authorize fail-closed
1714
-
1715
- against the RFC 0049 `deploy:*` scope (absent/unseeded role denies), run any
1716
-
1717
- configured RFC 0051 approvalGate, and — when the gate carries `requiredEval`
1718
-
1719
- — verify the referenced RFC 0081 eval run is terminal and `EvalSummary.passed`
1720
-
1721
- BEFORE emitting `deployment.promoted`. On success returns the updated
1722
-
1723
- deployment record and emits the matching content-free `deployment.*` event.
1724
-
1725
- '
1555
+ summary: Request a deployment state transition
1556
+ description: 'Requests a transition: promote, pause, deprecate, rollback, or adjust-canary. The host MUST authorize
1557
+ fail-closed against the `deploy:*` scope (an absent or unseeded role denies), run any configured approvalGate, and,
1558
+ when the gate carries `requiredEval`, verify that the referenced eval run is terminal and `EvalSummary.passed` before
1559
+ emitting `deployment.promoted`. On success it returns the updated deployment record and emits the matching content-free
1560
+ `deployment.*` event.'
1726
1561
  operationId: transitionAgentDeployment
1727
1562
  security:
1728
1563
  - ApiKeyAuth:
@@ -1740,6 +1575,7 @@ paths:
1740
1575
  description: The manifest agentId.
1741
1576
  - $ref: '#/components/parameters/IdempotencyKey'
1742
1577
  - $ref: '#/components/parameters/OpenWOPVersion'
1578
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1743
1579
  requestBody:
1744
1580
  required: true
1745
1581
  content:
@@ -1757,13 +1593,8 @@ paths:
1757
1593
  OpenWOP-Version:
1758
1594
  $ref: '#/components/headers/OpenWOPVersion'
1759
1595
  '400':
1760
- description: 'Validation error, or a transition that the host''s advertised
1761
-
1762
- `states`/`canary` cannot satisfy, or `no_active_deployment` when a
1763
-
1764
- referenced channel resolves to no active version.
1765
-
1766
- '
1596
+ description: A validation error; a transition the host's advertised `states`/`canary` cannot satisfy; or `no_active_deployment`
1597
+ when a referenced channel resolves to no active version.
1767
1598
  content:
1768
1599
  application/json:
1769
1600
  schema:
@@ -1774,13 +1605,8 @@ paths:
1774
1605
  '401':
1775
1606
  $ref: '#/components/responses/Unauthenticated'
1776
1607
  '403':
1777
- description: 'Fail-closed authorization denial (the principal lacks the required
1778
-
1779
- `deploy:*` scope — RFC 0049), or `eval_gate_unmet` when a `requiredEval`
1780
-
1781
- gate''s referenced eval run is not terminal-and-passed (RFC 0081).
1782
-
1783
- '
1608
+ description: Fail-closed authorization denial (the principal lacks the required `deploy:*` scope), or `eval_gate_unmet`
1609
+ when a `requiredEval` gate's referenced eval run is not terminal and passed.
1784
1610
  content:
1785
1611
  application/json:
1786
1612
  schema:
@@ -1801,19 +1627,11 @@ paths:
1801
1627
  get:
1802
1628
  tags:
1803
1629
  - agents
1804
- summary: 'RFC 0086 §B — list the standing agent roster (named "digital-twin
1805
-
1806
- employee" instances + their workflow portfolios) visible to the
1807
-
1808
- caller. Capability-gated on `capabilities.agents.roster.supported:
1809
-
1810
- true`; hosts that don''t advertise it return 404. Tenant-scoped per
1811
-
1812
- RFC 0074 — on an `installScope: ''tenant''` host only the caller''s
1813
-
1814
- owner-triple entries are returned. Read-only; content-free (SR-1).
1815
-
1816
- '
1630
+ summary: List the standing agent roster
1631
+ description: 'Lists the standing agent roster visible to the caller: named "digital-twin employee" instances and their
1632
+ workflow portfolios. Gated on `capabilities.agents.roster.supported: true`; a host that does not advertise it returns
1633
+ 404. Tenant-scoped: on an `installScope: ''tenant''` host only the caller''s owner-triple entries are returned. Read-only;
1634
+ content-free (SR-1).'
1817
1635
  operationId: listAgentRoster
1818
1636
  security:
1819
1637
  - ApiKeyAuth:
@@ -1847,21 +1665,15 @@ paths:
1847
1665
  $ref: '#/components/headers/OpenWOPVersion'
1848
1666
  parameters:
1849
1667
  - $ref: '#/components/parameters/OpenWOPVersion'
1668
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1850
1669
  /agents/roster/{rosterId}:
1851
1670
  get:
1852
1671
  tags:
1853
1672
  - agents
1854
- summary: 'RFC 0086 §B — return one standing roster entry, or 404 when no such
1855
-
1856
- entry exists, the host doesn''t advertise `capabilities.agents.roster`,
1857
-
1858
- or (on an `installScope: ''tenant''` host) the entry is outside the
1859
-
1860
- caller''s owner triple — a cross-tenant entry 404s identically to
1861
-
1862
- "not found", never disclosing another tenant''s roster.
1863
-
1864
- '
1673
+ summary: Read one standing roster entry
1674
+ description: 'Returns one standing roster entry, or 404 when no such entry exists, the host does not advertise `capabilities.agents.roster`,
1675
+ or (on an `installScope: ''tenant''` host) the entry is outside the caller''s owner triple. A cross-tenant entry returns
1676
+ the same 404 as "not found", so another tenant''s roster is never disclosed.'
1865
1677
  operationId: getAgentRosterEntry
1866
1678
  security:
1867
1679
  - ApiKeyAuth:
@@ -1878,6 +1690,7 @@ paths:
1878
1690
  type: string
1879
1691
  description: The standing instance id (a `host:<id>` AgentRef agentId).
1880
1692
  - $ref: '#/components/parameters/OpenWOPVersion'
1693
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1881
1694
  responses:
1882
1695
  '200':
1883
1696
  description: The roster entry.
@@ -1905,17 +1718,10 @@ paths:
1905
1718
  get:
1906
1719
  tags:
1907
1720
  - agents
1908
- summary: 'RFC 0087 §C — return the caller''s agent org-chart (departments + roles
1909
-
1910
- + `reportsTo` edges over roster members). Capability-gated on
1911
-
1912
- `capabilities.agents.orgChart.supported: true`; hosts that don''t
1913
-
1914
- advertise it return 404. Tenant-scoped per RFC 0074. DESCRIPTIVE only:
1915
-
1916
- an org edge confers no authority (§B `org-position-no-authority-escalation`).
1917
-
1918
- '
1721
+ summary: Read the caller's agent org chart
1722
+ description: 'Returns the caller''s agent org chart: departments, roles, and `reportsTo` edges over roster members.
1723
+ Gated on `capabilities.agents.orgChart.supported: true`; a host that does not advertise it returns 404. Tenant-scoped.
1724
+ The chart is descriptive only: an org edge confers no authority (`org-position-no-authority-escalation`).'
1919
1725
  operationId: getAgentOrgChart
1920
1726
  security:
1921
1727
  - ApiKeyAuth:
@@ -1949,21 +1755,15 @@ paths:
1949
1755
  $ref: '#/components/headers/OpenWOPVersion'
1950
1756
  parameters:
1951
1757
  - $ref: '#/components/parameters/OpenWOPVersion'
1758
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1952
1759
  /agents/org-chart/{departmentId}:
1953
1760
  get:
1954
1761
  tags:
1955
1762
  - agents
1956
- summary: 'RFC 0087 §D — one department''s subtree + responsibility roll-up (the
1957
-
1958
- union of its members'' RFC 0086 portfolios). `?recursive=false` narrows
1959
-
1960
- the roll-up to direct members without changing the response shape.
1961
-
1962
- 404 when the department is unknown, cross-tenant, or the host doesn''t
1963
-
1964
- advertise `capabilities.agents.orgChart`. The roll-up grants nothing (§B).
1965
-
1966
- '
1763
+ summary: Read one department's subtree and responsibility roll-up
1764
+ description: Returns one department's subtree and responsibility roll-up (the union of its members' portfolios). `?recursive=false`
1765
+ narrows the roll-up to direct members without changing the response shape. Returns 404 when the department is unknown
1766
+ or cross-tenant, or the host does not advertise `capabilities.agents.orgChart`. The roll-up grants nothing.
1967
1767
  operationId: getAgentOrgChartDepartment
1968
1768
  security:
1969
1769
  - ApiKeyAuth:
@@ -1978,7 +1778,7 @@ paths:
1978
1778
  required: true
1979
1779
  schema:
1980
1780
  type: string
1981
- description: The department id to root the subtree + roll-up at.
1781
+ description: The department id to root the subtree and roll-up at.
1982
1782
  - in: query
1983
1783
  name: recursive
1984
1784
  required: false
@@ -1987,6 +1787,7 @@ paths:
1987
1787
  default: true
1988
1788
  description: When `false`, the roll-up scopes to direct members only.
1989
1789
  - $ref: '#/components/parameters/OpenWOPVersion'
1790
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
1990
1791
  responses:
1991
1792
  '200':
1992
1793
  description: The department subtree + responsibility roll-up.
@@ -2014,23 +1815,11 @@ paths:
2014
1815
  get:
2015
1816
  tags:
2016
1817
  - tools
2017
- summary: 'RFC 0078 §B — list the portable `ToolDescriptor`s visible to the caller
2018
-
2019
- across every tool source (node-pack / workflow / mcp / connector /
2020
-
2021
- host-extension). Capability-gated on
2022
-
2023
- `capabilities.toolCatalog.supported: true`; hosts that don''t advertise
2024
-
2025
- it return 404. §F-2 — the projection is authorization-scoped: a
2026
-
2027
- principal sees only the tools it may invoke, and a second principal MUST
2028
-
2029
- NOT see another principal''s tools (non-disclosure). Read-only; each
2030
-
2031
- descriptor is content-free of any credential material (SR-1).
2032
-
2033
- '
1818
+ summary: List the tools the caller may invoke
1819
+ description: 'Lists the portable `ToolDescriptor`s visible to the caller across every tool source (node-pack, workflow,
1820
+ mcp, connector, host-extension). Gated on `capabilities.toolCatalog.supported: true`; a host that does not advertise
1821
+ it returns 404. The projection is authorization-scoped: a principal sees only the tools it may invoke, and a second
1822
+ principal MUST NOT see another principal''s tools. Read-only; no descriptor carries credential material (SR-1).'
2034
1823
  operationId: listTools
2035
1824
  security:
2036
1825
  - ApiKeyAuth:
@@ -2049,13 +1838,12 @@ paths:
2049
1838
  - standard
2050
1839
  - compact
2051
1840
  default: standard
2052
- description: 'RFC 0112. `compact` returns the `{ tools: CompactToolDescriptor[] }` projection — heavy descriptor fields
2053
- omitted and `inputSchema` bounded to the compact structural subset — when the host advertises `capabilities.toolCatalog.compactView:
2054
- true`. Defaults to `standard`; a host that does not advertise `compactView` treats `view=compact` as any unknown
2055
- query param and returns the standard view.
2056
-
2057
- '
1841
+ description: '`compact` returns the `{ tools: CompactToolDescriptor[] }` projection (heavy descriptor fields omitted,
1842
+ `inputSchema` bounded to the compact structural subset) when the host advertises `capabilities.toolCatalog.compactView:
1843
+ true`. Defaults to `standard`. A host that does not advertise `compactView` treats `view=compact` like any unknown
1844
+ query parameter and returns the standard view.'
2058
1845
  - $ref: '#/components/parameters/OpenWOPVersion'
1846
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2059
1847
  responses:
2060
1848
  '200':
2061
1849
  description: 'The caller''s authorized tool catalog (standard array, or the compact `{ tools: [] }` projection when
@@ -2095,15 +1883,10 @@ paths:
2095
1883
  get:
2096
1884
  tags:
2097
1885
  - tools
2098
- summary: 'RFC 0078 §B — return one `ToolDescriptor` by its stable `toolId`, or 404
2099
-
2100
- when no such tool exists, the caller isn''t authorized for it (§F-2
2101
-
2102
- non-disclosure — a cross-principal tool 404s identically to "not
2103
-
2104
- found"), or the host doesn''t advertise `capabilities.toolCatalog`.
2105
-
2106
- '
1886
+ summary: Read one tool descriptor
1887
+ description: Returns one `ToolDescriptor` by its stable `toolId`, or 404 when no such tool exists, the caller is not
1888
+ authorized for it, or the host does not advertise `capabilities.toolCatalog`. A tool the caller may not see returns
1889
+ the same 404 as "not found".
2107
1890
  operationId: getTool
2108
1891
  security:
2109
1892
  - ApiKeyAuth:
@@ -2128,12 +1911,11 @@ paths:
2128
1911
  - standard
2129
1912
  - compact
2130
1913
  default: standard
2131
- description: 'RFC 0112. `compact` returns one `CompactToolDescriptor` (heavy fields omitted; `inputSchema` bounded
2132
- to the compact structural subset) when the host advertises `capabilities.toolCatalog.compactView: true`. Defaults
2133
- to `standard`; a host that does not advertise `compactView` treats `view=compact` as any unknown query param.
2134
-
2135
- '
1914
+ description: '`compact` returns one `CompactToolDescriptor` (heavy fields omitted, `inputSchema` bounded to the compact
1915
+ structural subset) when the host advertises `capabilities.toolCatalog.compactView: true`. Defaults to `standard`.
1916
+ A host that does not advertise `compactView` treats `view=compact` like any unknown query parameter.'
2136
1917
  - $ref: '#/components/parameters/OpenWOPVersion'
1918
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2137
1919
  responses:
2138
1920
  '200':
2139
1921
  description: The tool descriptor (standard, or one `CompactToolDescriptor` when `view=compact`).
@@ -2163,23 +1945,12 @@ paths:
2163
1945
  get:
2164
1946
  tags:
2165
1947
  - runs
2166
- summary: 'RFC 0081 §C — return the `EvalSummary` scorecard for a terminal eval run
2167
-
2168
- (a run started with `mode: "eval"`): aggregate + per-task scores, cost,
2169
-
2170
- latency, schema-validity, and redaction-safe safety findings, plus the
2171
-
2172
- suite provenance and (regression mode) the score delta vs a baseline.
2173
-
2174
- Content-free of task output / rubric prose / credentials (SR-1; the
2175
-
2176
- `eval-summary-no-content-leak` invariant). Capability-gated on
2177
-
2178
- `capabilities.agents.evalSuite.supported: true`; hosts that don''t advertise
2179
-
2180
- it return 404. 409 when the run is not yet terminal.
2181
-
2182
- '
1948
+ summary: Read the scorecard of a terminal eval run
1949
+ description: 'Returns the `EvalSummary` scorecard for a terminal eval run (one started with `mode: "eval"`): aggregate
1950
+ and per-task scores, cost, latency, schema validity, redaction-safe safety findings, the suite provenance, and, in
1951
+ regression mode, the score delta against a baseline. It carries no task output, rubric prose, or credentials (SR-1;
1952
+ `eval-summary-no-content-leak`). Gated on `capabilities.agents.evalSuite.supported: true`; a host that does not advertise
1953
+ it returns 404. Returns 409 while the run is not yet terminal.'
2183
1954
  operationId: getEvalSummary
2184
1955
  security:
2185
1956
  - ApiKeyAuth:
@@ -2191,6 +1962,7 @@ paths:
2191
1962
  parameters:
2192
1963
  - $ref: '#/components/parameters/RunId'
2193
1964
  - $ref: '#/components/parameters/OpenWOPVersion'
1965
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2194
1966
  responses:
2195
1967
  '200':
2196
1968
  description: The eval run's scorecard.
@@ -2206,11 +1978,7 @@ paths:
2206
1978
  '403':
2207
1979
  $ref: '#/components/responses/Forbidden'
2208
1980
  '404':
2209
- description: 'No such run, the run is not an eval run, or the host doesn''t advertise
2210
-
2211
- `capabilities.agents.evalSuite`.
2212
-
2213
- '
1981
+ description: No such run, the run is not an eval run, or the host does not advertise `capabilities.agents.evalSuite`.
2214
1982
  content:
2215
1983
  application/json:
2216
1984
  schema:
@@ -2231,17 +1999,10 @@ paths:
2231
1999
  get:
2232
2000
  tags:
2233
2001
  - runs
2234
- summary: 'RFC 0054 — return a deterministic, replay-aware structured diff of
2235
-
2236
- two runs (typically a run and its RFC 0011 fork): `divergedAtSeq` +
2237
-
2238
- ordered `eventDiffs[]` + `stateDiff`. The diff is a pure function of
2239
-
2240
- the two event logs (see `replay.md` determinism contract). Requires
2241
-
2242
- `runs:read` on BOTH runs. Hosts that don''t implement it return 404.
2243
-
2244
- '
2002
+ summary: Diff two runs
2003
+ description: 'Returns a deterministic, replay-aware structured diff of two runs, typically a run and its fork: `divergedAtSeq`,
2004
+ ordered `eventDiffs[]`, and `stateDiff`. The diff is a pure function of the two event logs (see the `replay.md` determinism
2005
+ contract). Requires `runs:read` on both runs. A host that does not implement it returns 404.'
2245
2006
  operationId: diffRun
2246
2007
  security:
2247
2008
  - ApiKeyAuth:
@@ -2259,13 +2020,11 @@ paths:
2259
2020
  schema:
2260
2021
  type: string
2261
2022
  - $ref: '#/components/parameters/OpenWOPVersion'
2023
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2262
2024
  responses:
2263
2025
  '200':
2264
- description: 'Structured diff of the two runs. `divergedAtSeq: null` + empty
2265
-
2266
- `eventDiffs` when the logs are identical.
2267
-
2268
- '
2026
+ description: 'Structured diff of the two runs. `divergedAtSeq: null` and an empty `eventDiffs` when the logs are
2027
+ identical.'
2269
2028
  content:
2270
2029
  application/json:
2271
2030
  schema:
@@ -2285,13 +2044,8 @@ paths:
2285
2044
  '401':
2286
2045
  $ref: '#/components/responses/Unauthenticated'
2287
2046
  '403':
2288
- description: 'Caller lacks `runs:read` on `{runId}` and/or on `against`
2289
-
2290
- (`forbidden`); composes with RFC 0048 cross-workspace
2291
-
2047
+ description: The caller lacks `runs:read` on `{runId}` or on `against` (`forbidden`); composes with cross-workspace
2292
2048
  isolation.
2293
-
2294
- '
2295
2049
  content:
2296
2050
  application/json:
2297
2051
  schema:
@@ -2300,11 +2054,8 @@ paths:
2300
2054
  OpenWOP-Version:
2301
2055
  $ref: '#/components/headers/OpenWOPVersion'
2302
2056
  '404':
2303
- description: 'Either run doesn''t exist, OR the host doesn''t implement the diff
2304
-
2305
- endpoint and treats the path as absent.
2306
-
2307
- '
2057
+ description: Either run does not exist, or the host does not implement the diff endpoint and treats the path as
2058
+ absent.
2308
2059
  content:
2309
2060
  application/json:
2310
2061
  schema:
@@ -2316,12 +2067,9 @@ paths:
2316
2067
  post:
2317
2068
  tags:
2318
2069
  - runs
2319
- summary: Administratively pause an in-flight run (RFC Track 13).
2320
- description: 'Operator-driven pause distinct from cancel (terminal) and HITL suspend (workflow-driven).
2321
-
2322
- Emits a `run.paused` event when the pause takes effect; exit only via `:resume` or `:cancel`.
2323
-
2324
- '
2070
+ summary: Administratively pause an in-flight run.
2071
+ description: An operator-driven pause, distinct from cancel (terminal) and from a HITL suspend (workflow-driven). Emits
2072
+ a `run.paused` event when the pause takes effect. The run leaves `paused` only through `:resume` or `:cancel`.
2325
2073
  operationId: pauseRun
2326
2074
  security:
2327
2075
  - ApiKeyAuth:
@@ -2334,6 +2082,7 @@ paths:
2334
2082
  - $ref: '#/components/parameters/RunId'
2335
2083
  - $ref: '#/components/parameters/IdempotencyKey'
2336
2084
  - $ref: '#/components/parameters/OpenWOPVersion'
2085
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2337
2086
  requestBody:
2338
2087
  content:
2339
2088
  application/json:
@@ -2349,15 +2098,12 @@ paths:
2349
2098
  - immediate
2350
2099
  - drain-current-node
2351
2100
  default: drain-current-node
2352
- description: '`immediate` snapshots between events; `drain-current-node` lets the running node
2353
-
2354
- reach a terminal before transitioning to `paused`.
2355
-
2356
- '
2101
+ description: '`immediate` snapshots between events; `drain-current-node` lets the running node reach a terminal
2102
+ state before the run transitions to `paused`.'
2357
2103
  additionalProperties: false
2358
2104
  responses:
2359
2105
  '202':
2360
- description: Pause requested; transition emits `run.paused` when complete.
2106
+ description: Pause requested; the transition emits `run.paused` when complete.
2361
2107
  content:
2362
2108
  application/json:
2363
2109
  schema:
@@ -2397,10 +2143,8 @@ paths:
2397
2143
  post:
2398
2144
  tags:
2399
2145
  - runs
2400
- summary: Resume a paused run (RFC Track 13).
2401
- description: 'Reverses a prior `:pause`. Run transitions from `paused` to `running` and emits `run.resumed`.
2402
-
2403
- '
2146
+ summary: Resume a paused run.
2147
+ description: 'Reverses a prior `:pause`: the run transitions from `paused` to `running` and emits `run.resumed`.'
2404
2148
  operationId: resumeRun
2405
2149
  security:
2406
2150
  - ApiKeyAuth:
@@ -2413,6 +2157,7 @@ paths:
2413
2157
  - $ref: '#/components/parameters/RunId'
2414
2158
  - $ref: '#/components/parameters/IdempotencyKey'
2415
2159
  - $ref: '#/components/parameters/OpenWOPVersion'
2160
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2416
2161
  requestBody:
2417
2162
  content:
2418
2163
  application/json:
@@ -2483,6 +2228,7 @@ paths:
2483
2228
  minLength: 1
2484
2229
  - $ref: '#/components/parameters/IdempotencyKey'
2485
2230
  - $ref: '#/components/parameters/OpenWOPVersion'
2231
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2486
2232
  requestBody:
2487
2233
  required: true
2488
2234
  content:
@@ -2528,7 +2274,7 @@ paths:
2528
2274
  OpenWOP-Version:
2529
2275
  $ref: '#/components/headers/OpenWOPVersion'
2530
2276
  '409':
2531
- description: Concurrent resolve — only one wins.
2277
+ description: Concurrent resolve; only one wins.
2532
2278
  content:
2533
2279
  application/json:
2534
2280
  schema:
@@ -2537,7 +2283,7 @@ paths:
2537
2283
  OpenWOP-Version:
2538
2284
  $ref: '#/components/headers/OpenWOPVersion'
2539
2285
  '422':
2540
- description: Run was cancelled while interrupt was pending.
2286
+ description: The run was cancelled while the interrupt was pending.
2541
2287
  content:
2542
2288
  application/json:
2543
2289
  schema:
@@ -2581,6 +2327,7 @@ paths:
2581
2327
  $ref: '#/components/headers/OpenWOPVersion'
2582
2328
  parameters:
2583
2329
  - $ref: '#/components/parameters/OpenWOPVersion'
2330
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2584
2331
  post:
2585
2332
  tags:
2586
2333
  - hitl
@@ -2590,6 +2337,7 @@ paths:
2590
2337
  parameters:
2591
2338
  - $ref: '#/components/parameters/IdempotencyKey'
2592
2339
  - $ref: '#/components/parameters/OpenWOPVersion'
2340
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2593
2341
  requestBody:
2594
2342
  required: true
2595
2343
  content:
@@ -2642,11 +2390,12 @@ paths:
2642
2390
  type: string
2643
2391
  minLength: 1
2644
2392
  - $ref: '#/components/parameters/OpenWOPVersion'
2393
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2645
2394
  responses:
2646
2395
  '200':
2647
- description: Artifact payload. Under `application/json` the shape is implementation-defined; under `application/a2a+json`
2648
- (RFC 0205 §A, negotiated by `Accept`; a host SHOULD offer it) it is an A2A `Artifact` whose `artifactId` equals
2649
- the path segment, and a `url` Part in it MUST NOT resolve beyond the caller's `artifacts:read` authorization.
2396
+ description: Artifact payload. Under `application/json` the shape is implementation-defined. Under `application/a2a+json`
2397
+ (negotiated by `Accept`; a host SHOULD offer it) it is an A2A `Artifact` whose `artifactId` equals the path segment,
2398
+ and a `url` Part in it MUST NOT resolve beyond the caller's `artifacts:read` authorization.
2650
2399
  content:
2651
2400
  application/json:
2652
2401
  schema:
@@ -2680,6 +2429,7 @@ paths:
2680
2429
  parameters:
2681
2430
  - $ref: '#/components/parameters/IdempotencyKey'
2682
2431
  - $ref: '#/components/parameters/OpenWOPVersion'
2432
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2683
2433
  requestBody:
2684
2434
  required: true
2685
2435
  content:
@@ -2700,11 +2450,9 @@ paths:
2700
2450
  description: Event types to subscribe to (see `run-event.schema.json` enum).
2701
2451
  secret:
2702
2452
  type: string
2703
- description: 'Server signs payloads with this secret using HMAC-SHA256. REQUIRED in the Standard Webhooks
2704
- form `whsec_<base64>` (24–64 decoded bytes) when `signatureAlgorithms` lists `standard-webhooks-1` (RFC
2705
- 0201 §B.6); never echoed in any response.
2706
-
2707
- '
2453
+ description: The host signs payloads with this secret using HMAC-SHA256. REQUIRED in the Standard Webhooks
2454
+ form `whsec_<base64>` (24–64 decoded bytes) when `signatureAlgorithms` lists `standard-webhooks-1`. Never
2455
+ echoed in any response. When omitted, the host generates one and returns it once in the `201` (RFC 0221).
2708
2456
  tags:
2709
2457
  type: array
2710
2458
  items:
@@ -2721,13 +2469,14 @@ paths:
2721
2469
  enum:
2722
2470
  - v1
2723
2471
  - standard-webhooks-1
2724
- description: 'RFC 0201 §B — the per-subscription opt-in. Absent means `["v1"]`, today''s behaviour byte
2725
- for byte. When present it MUST contain `v1`, MUST NOT repeat a value, and every value MUST be listed in
2726
- the host''s `webhooks.signatureAlgorithms`; otherwise `400 validation_error`. Listing `standard-webhooks-1`
2727
- opts the subscription into the Standard Webhooks 1.0.0 companion scheme, which runs endpoint verification
2728
- before the `201` (`400 webhook_endpoint_unverified` when the endpoint does not echo the challenge).
2472
+ description: 'The per-subscription signature opt-in. Absent means `["v1"]`. When present it MUST contain
2473
+ `v1`, MUST NOT repeat a value, and every value MUST be listed in the host''s `webhooks.signatureAlgorithms`;
2474
+ otherwise `400 validation_error`.
2729
2475
 
2730
- '
2476
+
2477
+ Listing `standard-webhooks-1` opts the subscription into the Standard Webhooks 1.0.0 companion scheme,
2478
+ which runs endpoint verification before the `201` (`400 webhook_endpoint_unverified` when the endpoint
2479
+ does not echo the challenge).'
2731
2480
  additionalProperties: false
2732
2481
  responses:
2733
2482
  '201':
@@ -2745,17 +2494,19 @@ paths:
2745
2494
  type: array
2746
2495
  items:
2747
2496
  type: string
2748
- description: RFC 0201 §B.7 — the list the dispatcher will apply; present whenever the request carried
2749
- `signatureAlgorithms`.
2497
+ description: The list the dispatcher will apply; present whenever the request carried `signatureAlgorithms`.
2498
+ secret:
2499
+ type: string
2500
+ minLength: 1
2501
+ description: 'Present only when the request omitted `secret`: the secret the host generated, returned
2502
+ this once. A supplied secret is never echoed.'
2750
2503
  headers:
2751
2504
  OpenWOP-Version:
2752
2505
  $ref: '#/components/headers/OpenWOPVersion'
2753
2506
  '400':
2754
- description: '`validation_error` (malformed body, or an invalid `signatureAlgorithms` / `secret` opt-in, RFC 0201
2755
- §B), `webhook_url_rejected` (egress), or `webhook_endpoint_unverified` (RFC 0201 §D — an opted-in endpoint did
2756
- not echo the verification challenge; no subscription is persisted).
2757
-
2758
- '
2507
+ description: '`validation_error` (malformed body, or an invalid `signatureAlgorithms` or `secret` opt-in), `webhook_url_rejected`
2508
+ (egress), or `webhook_endpoint_unverified` (an opted-in endpoint did not echo the verification challenge; no subscription
2509
+ is persisted).'
2759
2510
  content:
2760
2511
  application/json:
2761
2512
  schema:
@@ -2786,12 +2537,10 @@ paths:
2786
2537
  required: true
2787
2538
  schema:
2788
2539
  $ref: ../../schemas/v2/ids.schema.json#/$defs/subscriptionId
2789
- description: 'Tenant-bound `<tenantId>/<opaque>` (`identity.md` §5, RFC 0187 §A.1), one path
2790
-
2791
- segment: `~`-projected (RFC 0184) or percent-encoded.
2792
-
2793
- '
2540
+ description: 'Tenant-bound `<tenantId>/<opaque>` (`identity.md` §5), carried as one path segment: `~`-projected or
2541
+ percent-encoded.'
2794
2542
  - $ref: '#/components/parameters/OpenWOPVersion'
2543
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2795
2544
  responses:
2796
2545
  '204':
2797
2546
  description: Unregistered.
@@ -2809,13 +2558,15 @@ paths:
2809
2558
  tags:
2810
2559
  - webhooks
2811
2560
  operationId: rotateWebhookSecret
2812
- summary: Rotate a Standard Webhooks subscription's secret with an overlap (RFC 0201 §E)
2813
- description: 'Gated on `webhooks.secretRotation`: a host that does not advertise it MUST answer `404 not_found`. Only
2814
- for a subscription that opted into `standard-webhooks-1`; any other subscription gets `400 validation_error` (its
2815
- single `v1` signature cannot overlap). Tenant checks are exactly those of `unregisterWebhook`: `403 id_tenant_mismatch`
2561
+ summary: Rotate a Standard Webhooks subscription's secret with an overlap
2562
+ description: 'Rotates the secret of a subscription that opted into `standard-webhooks-1`. Gated on `webhooks.secretRotation`:
2563
+ a host that does not advertise it MUST answer `404 not_found`. Any other subscription gets `400 validation_error`,
2564
+ because its single `v1` signature cannot overlap. Tenant checks are those of `unregisterWebhook`: `403 id_tenant_mismatch`
2816
2565
  when the id''s tenant segment is not the caller''s, checked before the lookup (`identity.md` §5); `404` when unknown.
2566
+
2567
+
2817
2568
  For `overlapSeconds` after `rotatedAt`, `webhook-signature` carries one entry under the new secret and one under the
2818
- previous one, and `OpenWOP-Signature` stays on the previous secret; at `previousSecretExpiresAt` only the new secret
2569
+ previous one, and `OpenWOP-Signature` stays on the previous secret. At `previousSecretExpiresAt` only the new secret
2819
2570
  signs. A second rotation inside an overlap retires the oldest secret immediately. Rotation does not re-verify the
2820
2571
  endpoint. The response carries no secret.'
2821
2572
  parameters:
@@ -2824,10 +2575,11 @@ paths:
2824
2575
  required: true
2825
2576
  schema:
2826
2577
  $ref: ../../schemas/v2/ids.schema.json#/$defs/subscriptionId
2827
- description: 'Tenant-bound `<tenantId>/<opaque>` (`identity.md` §5, RFC 0187 §A.1), one path segment: `~`-projected
2828
- (RFC 0184) or percent-encoded.'
2578
+ description: 'Tenant-bound `<tenantId>/<opaque>` (`identity.md` §5), carried as one path segment: `~`-projected or
2579
+ percent-encoded.'
2829
2580
  - $ref: '#/components/parameters/IdempotencyKey'
2830
2581
  - $ref: '#/components/parameters/OpenWOPVersion'
2582
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2831
2583
  requestBody:
2832
2584
  required: true
2833
2585
  content:
@@ -2841,7 +2593,7 @@ paths:
2841
2593
  secret:
2842
2594
  type: string
2843
2595
  pattern: ^whsec_[A-Za-z0-9+/]+={0,2}$
2844
- description: The new secret, `whsec_<base64>` decoding to 24–64 bytes (RFC 0201 §B.6).
2596
+ description: 'The new secret: `whsec_<base64>`, decoding to 24–64 bytes.'
2845
2597
  responses:
2846
2598
  '200':
2847
2599
  description: Rotated. No secret is returned.
@@ -2884,25 +2636,11 @@ paths:
2884
2636
  tags:
2885
2637
  - audit
2886
2638
  summary: Verify the audit-log hash chain over [fromSeq, toSeq].
2887
- description: 'Per `spec/v1/auth-profiles.md` §`openwop-audit-log-integrity` §4. The
2888
-
2889
- verifier re-walks audit-log entries in the requested range,
2890
-
2891
- re-computes each entry''s `prevHash` from the canonical RFC 8785 JCS
2892
-
2893
- serialization of the prior entry, verifies signed checkpoints
2894
-
2895
- against the host''s advertised `auditLogIntegrity.checkpointPublicKey`,
2896
-
2897
- and returns `chainValid` + an enumeration of any anomalies.
2898
-
2899
- Hosts MUST require the `audit:read` scope. Hosts that do NOT
2900
-
2901
- advertise the `openwop-audit-log-integrity` profile MAY omit this
2902
-
2903
- endpoint entirely (clients SHOULD pre-flight via `/.well-known/openwop`).
2904
-
2905
- '
2639
+ description: Re-walks the audit-log entries in the requested range, recomputes each entry's `prevHash` from the canonical
2640
+ RFC 8785 JCS serialization of the prior entry, verifies signed checkpoints against the host's advertised `auditLogIntegrity.checkpointPublicKey`,
2641
+ and returns `chainValid` with any anomalies. Hosts MUST require the `audit:read` scope. Hosts that do not advertise
2642
+ the `openwop-audit-log-integrity` profile MAY omit this endpoint entirely; clients SHOULD check `/.well-known/openwop`
2643
+ first. See `spec/v1/auth-profiles.md` §`openwop-audit-log-integrity` §4.
2906
2644
  operationId: verifyAuditLog
2907
2645
  security:
2908
2646
  - ApiKeyAuth:
@@ -2927,6 +2665,7 @@ paths:
2927
2665
  minimum: 0
2928
2666
  description: Last audit-log sequence to include (inclusive). MUST be >= fromSeq.
2929
2667
  - $ref: '#/components/parameters/OpenWOPVersion'
2668
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
2930
2669
  responses:
2931
2670
  '200':
2932
2671
  description: Verification result.
@@ -2980,13 +2719,8 @@ paths:
2980
2719
  name: tag
2981
2720
  schema:
2982
2721
  type: string
2983
- description: 'Filter to templates whose `tags[]` contains this exact tag.
2984
-
2985
- Hosts MAY accept the parameter multiple times; the semantic
2986
-
2987
- when repeated is AND (every named tag must be present).
2988
-
2989
- '
2722
+ description: Filter to templates whose `tags[]` contains this exact tag. Hosts MAY accept the parameter more than
2723
+ once; repeated values combine with AND (every named tag must be present).
2990
2724
  - in: query
2991
2725
  name: modelClass
2992
2726
  schema:
@@ -3015,6 +2749,7 @@ paths:
3015
2749
  default: 50
3016
2750
  description: Maximum entries per page.
3017
2751
  - $ref: '#/components/parameters/OpenWOPVersion'
2752
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3018
2753
  responses:
3019
2754
  '200':
3020
2755
  description: Paginated list of templates.
@@ -3040,8 +2775,8 @@ paths:
3040
2775
  '403':
3041
2776
  $ref: '#/components/responses/Forbidden'
3042
2777
  '501':
3043
- description: Host does not advertise capabilities.prompts.endpointsSupported. (RFC 0028 §A — supported gates Phase
3044
- A node-execution composition; endpointsSupported gates this REST surface independently.)
2778
+ description: Host does not advertise `capabilities.prompts.endpointsSupported`. (`supported` gates node-execution
2779
+ composition; `endpointsSupported` gates this REST surface independently.)
3045
2780
  content:
3046
2781
  application/json:
3047
2782
  schema:
@@ -3064,6 +2799,7 @@ paths:
3064
2799
  parameters:
3065
2800
  - $ref: '#/components/parameters/IdempotencyKey'
3066
2801
  - $ref: '#/components/parameters/OpenWOPVersion'
2802
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3067
2803
  requestBody:
3068
2804
  required: true
3069
2805
  content:
@@ -3096,7 +2832,7 @@ paths:
3096
2832
  OpenWOP-Version:
3097
2833
  $ref: '#/components/headers/OpenWOPVersion'
3098
2834
  '501':
3099
- description: Host does not advertise capabilities.prompts.mutableLibrary.
2835
+ description: Host does not advertise `capabilities.prompts.mutableLibrary`.
3100
2836
  content:
3101
2837
  application/json:
3102
2838
  schema:
@@ -3112,7 +2848,7 @@ paths:
3112
2848
  schema:
3113
2849
  type: string
3114
2850
  pattern: ^[a-z0-9][a-z0-9._-]{0,127}$
3115
- description: PromptTemplate.templateId per RFC 0027.
2851
+ description: '`PromptTemplate.templateId`.'
3116
2852
  - in: query
3117
2853
  name: version
3118
2854
  schema:
@@ -3124,13 +2860,8 @@ paths:
3124
2860
  schema:
3125
2861
  type: string
3126
2862
  pattern: ^[a-z0-9][a-z0-9._-]{0,127}$
3127
- description: 'Disambiguate when multiple installed packs ship the same
3128
-
3129
- templateId. Hosts MUST return `prompt_ref_ambiguous` if
3130
-
3131
- ambiguous and libraryId is omitted.
3132
-
3133
- '
2863
+ description: Disambiguates when several installed packs ship the same templateId. Hosts MUST return `prompt_ref_ambiguous`
2864
+ when the reference is ambiguous and libraryId is omitted.
3134
2865
  get:
3135
2866
  tags:
3136
2867
  - prompts
@@ -3167,7 +2898,7 @@ paths:
3167
2898
  OpenWOP-Version:
3168
2899
  $ref: '#/components/headers/OpenWOPVersion'
3169
2900
  '400':
3170
- description: '`prompt_ref_ambiguous` when libraryId disambiguation is required.'
2901
+ description: '`prompt_ref_ambiguous` when `libraryId` disambiguation is required.'
3171
2902
  content:
3172
2903
  application/json:
3173
2904
  schema:
@@ -3189,8 +2920,8 @@ paths:
3189
2920
  OpenWOP-Version:
3190
2921
  $ref: '#/components/headers/OpenWOPVersion'
3191
2922
  '501':
3192
- description: Host does not advertise capabilities.prompts.endpointsSupported. (RFC 0028 §A — supported gates Phase
3193
- A node-execution composition; endpointsSupported gates this REST surface independently.)
2923
+ description: Host does not advertise `capabilities.prompts.endpointsSupported`. (`supported` gates node-execution
2924
+ composition; `endpointsSupported` gates this REST surface independently.)
3194
2925
  content:
3195
2926
  application/json:
3196
2927
  schema:
@@ -3200,6 +2931,7 @@ paths:
3200
2931
  $ref: '#/components/headers/OpenWOPVersion'
3201
2932
  parameters:
3202
2933
  - $ref: '#/components/parameters/OpenWOPVersion'
2934
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3203
2935
  put:
3204
2936
  tags:
3205
2937
  - prompts
@@ -3215,6 +2947,7 @@ paths:
3215
2947
  parameters:
3216
2948
  - $ref: '#/components/parameters/IdempotencyKey'
3217
2949
  - $ref: '#/components/parameters/OpenWOPVersion'
2950
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3218
2951
  requestBody:
3219
2952
  required: true
3220
2953
  content:
@@ -3263,7 +2996,7 @@ paths:
3263
2996
  OpenWOP-Version:
3264
2997
  $ref: '#/components/headers/OpenWOPVersion'
3265
2998
  '501':
3266
- description: Host does not advertise capabilities.prompts.mutableLibrary.
2999
+ description: Host does not advertise `capabilities.prompts.mutableLibrary`.
3267
3000
  content:
3268
3001
  application/json:
3269
3002
  schema:
@@ -3310,7 +3043,7 @@ paths:
3310
3043
  OpenWOP-Version:
3311
3044
  $ref: '#/components/headers/OpenWOPVersion'
3312
3045
  '501':
3313
- description: Host does not advertise capabilities.prompts.mutableLibrary.
3046
+ description: Host does not advertise `capabilities.prompts.mutableLibrary`.
3314
3047
  content:
3315
3048
  application/json:
3316
3049
  schema:
@@ -3320,30 +3053,17 @@ paths:
3320
3053
  $ref: '#/components/headers/OpenWOPVersion'
3321
3054
  parameters:
3322
3055
  - $ref: '#/components/parameters/OpenWOPVersion'
3056
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3323
3057
  /prompts:render:
3324
3058
  post:
3325
3059
  tags:
3326
3060
  - prompts
3327
3061
  summary: Render a prompt template with supplied variable bindings.
3328
- description: 'Returns the composed body + sha256 hash + per-variable hashes.
3329
-
3330
- The response''s `hash` MUST equal the `hash` that a matching
3331
-
3332
- `prompt.composed` event would carry at dispatch time for the
3333
-
3334
- same `(ref, variables, contentTrust)` inputs (RFC 0028 §A
3335
-
3336
- deterministic-render invariant; RFC 0027 §F replay invariant).
3337
-
3338
- Does NOT dispatch an LLM call. Secret-source variable values
3339
-
3340
- MUST be supplied as `[REDACTED:<credentialRef>]` markers; the
3341
-
3342
- host resolves the plaintext internally and never echoes it in
3343
-
3344
- the `composed` response field per SR-1.
3345
-
3346
- '
3062
+ description: Returns the composed body, its sha256 hash, and per-variable hashes. Does not dispatch an LLM call. The
3063
+ response's `hash` MUST equal the `hash` a matching `prompt.composed` event would carry at dispatch time for the same
3064
+ `(ref, variables, contentTrust)` inputs, so rendering is deterministic and replay-safe. Secret-source variable values
3065
+ MUST be supplied as `[REDACTED:<credentialRef>]` markers; the host resolves the plaintext internally and never echoes
3066
+ it in the `composed` response field (SR-1).
3347
3067
  operationId: renderPromptTemplate
3348
3068
  security:
3349
3069
  - ApiKeyAuth:
@@ -3366,24 +3086,15 @@ paths:
3366
3086
  $ref: ../../schemas/v2/prompt-ref.schema.json
3367
3087
  variables:
3368
3088
  type: object
3369
- description: 'Variable bindings keyed by `PromptVariable.name`.
3370
-
3371
- Secret-source bindings carry `[REDACTED:<credentialRef>]`
3372
-
3089
+ description: Variable bindings keyed by `PromptVariable.name`. Secret-source bindings carry `[REDACTED:<credentialRef>]`
3373
3090
  markers; the host resolves the real value internally.
3374
-
3375
- '
3376
3091
  additionalProperties: true
3377
3092
  contentTrust:
3378
3093
  type: string
3379
3094
  enum:
3380
3095
  - trusted
3381
3096
  - untrusted
3382
- description: 'Aggregate trust marker for the supplied bindings,
3383
-
3384
- propagated through composition per RFC 0027 §E.
3385
-
3386
- '
3097
+ description: Aggregate trust marker for the supplied bindings, propagated through composition.
3387
3098
  responses:
3388
3099
  '200':
3389
3100
  description: Composed result.
@@ -3420,13 +3131,8 @@ paths:
3420
3131
  OpenWOP-Version:
3421
3132
  $ref: '#/components/headers/OpenWOPVersion'
3422
3133
  '400':
3423
- description: '`prompt_variable_unresolved` (required variable missing),
3424
-
3425
- `prompt_variable_type_mismatch` (bound type vs. declared type),
3426
-
3427
- or `prompt_ref_invalid` (malformed PromptRef).
3428
-
3429
- '
3134
+ description: '`prompt_variable_unresolved` (a required variable is missing), `prompt_variable_type_mismatch` (bound
3135
+ type differs from declared type), or `prompt_ref_invalid` (malformed PromptRef).'
3430
3136
  content:
3431
3137
  application/json:
3432
3138
  schema:
@@ -3448,8 +3154,8 @@ paths:
3448
3154
  OpenWOP-Version:
3449
3155
  $ref: '#/components/headers/OpenWOPVersion'
3450
3156
  '501':
3451
- description: Host does not advertise capabilities.prompts.endpointsSupported. (RFC 0028 §A — supported gates Phase
3452
- A node-execution composition; endpointsSupported gates this REST surface independently.)
3157
+ description: Host does not advertise `capabilities.prompts.endpointsSupported`. (`supported` gates node-execution
3158
+ composition; `endpointsSupported` gates this REST surface independently.)
3453
3159
  content:
3454
3160
  application/json:
3455
3161
  schema:
@@ -3459,14 +3165,15 @@ paths:
3459
3165
  $ref: '#/components/headers/OpenWOPVersion'
3460
3166
  parameters:
3461
3167
  - $ref: '#/components/parameters/OpenWOPVersion'
3168
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3462
3169
  /host/effect-seams:
3463
3170
  get:
3464
3171
  tags:
3465
3172
  - host
3466
3173
  operationId: getEffectSeamManifest
3467
- summary: The host-declared effect-seam manifest (RFC 0173 §C)
3468
- description: Every outbound effect seam replay suppression covers. A seam omitted here is invisible to the suite; the
3469
- RFC 0140 R5 audit is the control.
3174
+ summary: Read the host's effect-seam manifest
3175
+ description: Lists every outbound effect seam that replay suppression covers. A seam omitted here is invisible to the
3176
+ conformance suite; an audit of the host's seams is the control.
3470
3177
  responses:
3471
3178
  '200':
3472
3179
  description: The manifest.
@@ -3481,6 +3188,7 @@ paths:
3481
3188
  $ref: '#/components/responses/Unauthenticated'
3482
3189
  parameters:
3483
3190
  - $ref: '#/components/parameters/OpenWOPVersion'
3191
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3484
3192
  security:
3485
3193
  - ApiKeyAuth:
3486
3194
  - runs:read
@@ -3495,9 +3203,8 @@ paths:
3495
3203
  tags:
3496
3204
  - runs
3497
3205
  operationId: getRunCompensation
3498
- summary: Compensation plan and attempts for a run (RFC 0173 §C.1)
3499
- description: The read projection that makes compensation a core obligation with a deployed-wire witness (RFC 0151 G9
3500
- / RFC 0173 §B).
3206
+ summary: Read a run's compensation plan and attempts
3207
+ description: The run's compensation plan and every attempt, as a read projection.
3501
3208
  responses:
3502
3209
  '200':
3503
3210
  description: The projection.
@@ -3512,6 +3219,7 @@ paths:
3512
3219
  $ref: '#/components/responses/NotFound'
3513
3220
  parameters:
3514
3221
  - $ref: '#/components/parameters/OpenWOPVersion'
3222
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3515
3223
  security:
3516
3224
  - ApiKeyAuth:
3517
3225
  - runs:read
@@ -3526,8 +3234,8 @@ paths:
3526
3234
  tags:
3527
3235
  - runs
3528
3236
  operationId: getRunEffects
3529
- summary: The Layer-2 effect ledger for a run (RFC 0173 §C.2)
3530
- description: Business-identity keyed effect records; the witness for the Layer-2 effect-identity obligation.
3237
+ summary: Read a run's Layer-2 effect ledger
3238
+ description: Effect records keyed by business identity; the witness for the Layer-2 effect-identity obligation.
3531
3239
  responses:
3532
3240
  '200':
3533
3241
  description: The ledger projection.
@@ -3542,6 +3250,7 @@ paths:
3542
3250
  $ref: '#/components/responses/NotFound'
3543
3251
  parameters:
3544
3252
  - $ref: '#/components/parameters/OpenWOPVersion'
3253
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3545
3254
  security:
3546
3255
  - ApiKeyAuth:
3547
3256
  - runs:read
@@ -3554,20 +3263,22 @@ paths:
3554
3263
  tags:
3555
3264
  - webhooks
3556
3265
  operationId: listWebhookDeadLetters
3557
- summary: A subscription's dead-lettered deliveries (RFC 0188 §A.1)
3558
- description: 'The read that makes `webhooks.md` §Durability observable. A delivery whose retries are exhausted, or a
3559
- `payload_unprojectable` delivery dead-lettered on its first attempt, appears here until `retentionDays` elapse. Gated
3560
- on the `webhooks.deadLetter` facet: a host that does not advertise it answers `404 not_found`. **Content-free (RFC
3561
- 0188 §B.1):** the record NAMES a delivery and never carries the delivered bytes, the request headers, or the subscription
3562
- secret — a dead-letter read is a diagnostic surface, not a payload-replay surface.'
3266
+ summary: List a subscription's dead-lettered deliveries
3267
+ description: 'Lists deliveries that were dead-lettered, making `webhooks.md` §Durability observable. A delivery whose
3268
+ retries are exhausted, or a `payload_unprojectable` delivery dead-lettered on its first attempt, appears here until
3269
+ `retentionDays` elapse. Gated on the `webhooks.deadLetter` facet: a host that does not advertise it answers `404 not_found`.
3270
+
3271
+
3272
+ The record is content-free: it names a delivery and never carries the delivered bytes, the request headers, or the
3273
+ subscription secret.'
3563
3274
  parameters:
3564
3275
  - name: webhookId
3565
3276
  in: path
3566
3277
  required: true
3567
3278
  schema:
3568
3279
  $ref: ../../schemas/v2/ids.schema.json#/$defs/subscriptionId
3569
- description: The subscription, tenant-bound (`identity.md` §5, RFC 0187 §A.1) and carried as ONE path segment — `~`-projected
3570
- per RFC 0184, or percent-encoded.
3280
+ description: 'The subscription, tenant-bound (`identity.md` §5) and carried as one path segment: `~`-projected or
3281
+ percent-encoded.'
3571
3282
  - name: limit
3572
3283
  in: query
3573
3284
  required: false
@@ -3585,6 +3296,7 @@ paths:
3585
3296
  description: Opaque cursor from a previous page's `nextCursor`. A cursor minted for another subscription MUST be refused
3586
3297
  `400 validation_error`.
3587
3298
  - $ref: '#/components/parameters/OpenWOPVersion'
3299
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3588
3300
  responses:
3589
3301
  '200':
3590
3302
  description: One page of dead-lettered deliveries, newest first.
@@ -3615,12 +3327,12 @@ paths:
3615
3327
  tags:
3616
3328
  - host
3617
3329
  operationId: streamHostEvents
3618
- summary: Host-scoped events (heartbeat.*) as SSE (RFC 0171 §E.1)
3619
- description: The documented default hostEvents address; a host MAY declare another under `heartbeat.deliveryChannel`.
3620
- Content-free of run data.
3330
+ summary: Stream host-scoped events (`heartbeat.*`) as SSE
3331
+ description: The default `hostEvents` address; a host MAY declare another under `heartbeat.deliveryChannel`. Carries
3332
+ no run data.
3621
3333
  responses:
3622
3334
  '200':
3623
- description: text/event-stream of hostEvents messages.
3335
+ description: '`text/event-stream` of `hostEvents` messages.'
3624
3336
  content:
3625
3337
  text/event-stream:
3626
3338
  schema:
@@ -3632,6 +3344,7 @@ paths:
3632
3344
  $ref: '#/components/responses/Unauthenticated'
3633
3345
  parameters:
3634
3346
  - $ref: '#/components/parameters/OpenWOPVersion'
3347
+ - $ref: '#/components/parameters/OpenWOPClientVersion'
3635
3348
  security:
3636
3349
  - ApiKeyAuth:
3637
3350
  - runs:read
@@ -3645,28 +3358,14 @@ components:
3645
3358
  type: http
3646
3359
  scheme: bearer
3647
3360
  bearerFormat: API key
3648
- description: 'openwop API key. Format implementation-defined; reference impl uses `hk_`/`hk_test_` prefixes.
3649
-
3650
- Each key carries one or more scopes from the canonical vocabulary
3651
-
3652
- (`manifest:read`, `runs:create`, `runs:read`, `runs:cancel`,
3653
-
3654
- `artifacts:read`, `webhooks:manage`, `approvals:respond`, `audit:read`).
3655
-
3656
- See `auth.md`.
3657
-
3658
- '
3361
+ description: OpenWOP API key. The format is implementation-defined; the reference implementation uses `hk_`/`hk_test_`
3362
+ prefixes. Each key carries one or more scopes from the canonical vocabulary (`manifest:read`, `runs:create`, `runs:read`,
3363
+ `runs:cancel`, `artifacts:read`, `webhooks:manage`, `approvals:respond`, `audit:read`). Scope matching is in `spec/v2/core/identity.md`
3364
+ §2.1.
3659
3365
  OAuth2:
3660
3366
  type: oauth2
3661
- description: 'RFC 0200 §F. OAuth 2.0 lanes — v1 `openwop-auth-oauth2-client-credentials`,
3662
-
3663
- v2 `auth.lanes[].lane: "oauth2"`. Discovery is RFC 9728 Protected Resource
3664
-
3665
- Metadata at the path-inserted well-known URI (`identity.md` §2.5).
3666
-
3667
- Placeholder URLs.
3668
-
3669
- '
3367
+ description: 'The OAuth 2.0 lane (`auth.lanes[].lane: "oauth2"`). Discovery is RFC 9728 Protected Resource Metadata
3368
+ at the path-inserted well-known URI (`identity.md` §2.5). The URLs are placeholders.'
3670
3369
  flows:
3671
3370
  clientCredentials:
3672
3371
  tokenUrl: https://issuer.example/oauth2/token
@@ -3718,26 +3417,14 @@ components:
3718
3417
  OpenIdConnect:
3719
3418
  type: openIdConnect
3720
3419
  openIdConnectUrl: https://issuer.example/.well-known/openid-configuration
3721
- description: 'RFC 0200 §F. v1 `openwop-auth-oidc-user-bearer` / v2 `auth.lanes[].lane: "oidc"`.
3722
-
3723
- An ID token MAY be the bearer only when its `aud` equals the host''s configured
3724
-
3725
- audience (`identity.md` §2.1); any other `aud` is `audience_mismatch`.
3726
-
3727
- Placeholder URL.
3728
-
3729
- '
3420
+ description: 'The OpenID Connect lane (`auth.lanes[].lane: "oidc"`). An ID token MAY be the bearer only when its `aud`
3421
+ equals the host''s configured audience (`identity.md` §2.1); any other `aud` is `audience_mismatch`. The URL is a
3422
+ placeholder.'
3730
3423
  MutualTLS:
3731
3424
  type: mutualTLS
3732
- description: 'RFC 0200 §F. v1 `openwop-auth-mtls` / v2 `auth.lanes[].lane: "mtls"`. In OpenWOP
3733
-
3734
- mTLS is required *in addition to* a bearer, never instead of one, so it appears
3735
-
3736
- in no canonical requirement below: a host that requires it adds `MutualTLS: []`
3737
-
3738
- inside each requirement object (AND).
3739
-
3740
- '
3425
+ description: 'The mTLS lane (`auth.lanes[].lane: "mtls"`). mTLS is required *in addition to* a bearer, never instead
3426
+ of one, so it appears in no canonical requirement below. A host that requires it adds `MutualTLS: []` inside each
3427
+ requirement object (AND).'
3741
3428
  parameters:
3742
3429
  WorkflowId:
3743
3430
  in: path
@@ -3751,11 +3438,8 @@ components:
3751
3438
  required: true
3752
3439
  schema:
3753
3440
  $ref: ../../schemas/v2/ids.schema.json#/$defs/runId
3754
- description: 'Tenant-bound `<tenantId>/<opaque>` (`identity.md` §5). The `/` is part of the
3755
-
3756
- identifier and MUST be percent-encoded as `%2F` in the path segment.
3757
-
3758
- '
3441
+ description: Tenant-bound `<tenantId>/<opaque>` (`identity.md` §5). The `/` is part of the identifier and MUST be percent-encoded
3442
+ as `%2F` in the path segment.
3759
3443
  IdempotencyKey:
3760
3444
  in: header
3761
3445
  name: Idempotency-Key
@@ -3763,15 +3447,8 @@ components:
3763
3447
  schema:
3764
3448
  type: string
3765
3449
  maxLength: 255
3766
- description: 'Per-mutation idempotency token (see `idempotency.md` Layer 1).
3767
-
3768
- Server caches `(tenantId, endpoint, key)` → response for ≥24h.
3769
-
3770
- Duplicate requests return the cached response with header
3771
-
3772
- `OpenWOP-Idempotent-Replay: true`.
3773
-
3774
- '
3450
+ description: 'Per-mutation idempotency token (`idempotency.md` Layer 1). The server caches `(tenantId, endpoint, key)`
3451
+ → response for ≥24h. A duplicate request returns the cached response with `OpenWOP-Idempotent-Replay: true`.'
3775
3452
  OpenWOPVersion:
3776
3453
  name: OpenWOP-Version
3777
3454
  in: header
@@ -3779,14 +3456,23 @@ components:
3779
3456
  schema:
3780
3457
  type: string
3781
3458
  pattern: ^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)$
3782
- description: RFC 0172 §A.3 — selects a listed major.minor; absent ⇒ the host's `preferredVersion`; unlisted ⇒ 406 protocol_version_unsupported.
3459
+ description: Selects one of the host's listed major.minor versions. Absent, `/.well-known/openwop` uses `preferredVersion`
3460
+ and every other unversioned path is v2; an unlisted value is 406 protocol_version_unsupported.
3461
+ OpenWOPClientVersion:
3462
+ name: OpenWOP-Client-Version
3463
+ in: header
3464
+ required: false
3465
+ schema:
3466
+ type: string
3467
+ description: The protocol version the client implements (versioning.md §1.5). Compared with `minClientVersion` on major.minor.
3468
+ A malformed value is treated as absent and MUST NOT produce a 400. Never selects a contract.
3783
3469
  responses:
3784
3470
  Unauthenticated:
3785
3471
  description: Missing or invalid credential.
3786
3472
  headers:
3787
3473
  WWW-Authenticate:
3788
- description: RFC 0200 §B — `Bearer` challenge; `resource_metadata` and `error="invalid_token"` on a host with an
3789
- oauth2/oidc lane. Never on a non-disclosure 404.
3474
+ description: A `Bearer` challenge. On a host with an oauth2 or oidc lane it carries `resource_metadata` and `error="invalid_token"`.
3475
+ Never sent on a non-disclosure 404.
3790
3476
  schema:
3791
3477
  type: string
3792
3478
  content:
@@ -3797,8 +3483,8 @@ components:
3797
3483
  description: Credential valid but lacks required scope or fails resource binding.
3798
3484
  headers:
3799
3485
  WWW-Authenticate:
3800
- description: RFC 0200 §B — `error="insufficient_scope"` with every required `scope` on a scope refusal; absent on
3801
- a resource-binding 403.
3486
+ description: On a scope refusal, `error="insufficient_scope"` with every required `scope`. Absent on a resource-binding
3487
+ 403.
3802
3488
  schema:
3803
3489
  type: string
3804
3490
  content:
@@ -3836,15 +3522,13 @@ components:
3836
3522
  $ref: ../../schemas/v2/run-snapshot.schema.json
3837
3523
  RunClaimConflict:
3838
3524
  $ref: ../../schemas/v2/error-envelope.schema.json
3839
- description: RFC 0171 §B.1 — the former one-member enum `RunClaimConflict` is the generated error envelope (`error`
3840
- carries the code).
3525
+ description: '`RunClaimConflict` is the canonical error envelope; `error` carries the code.'
3841
3526
  UnsupportedStreamMode:
3842
3527
  $ref: ../../schemas/v2/error-envelope.schema.json
3843
- description: RFC 0171 §B.1 — the former one-member enum `UnsupportedStreamMode` is the generated error envelope (`error`
3844
- carries the code).
3528
+ description: '`UnsupportedStreamMode` is the canonical error envelope; `error` carries the code.'
3845
3529
  headers:
3846
3530
  OpenWOPVersion:
3847
3531
  schema:
3848
3532
  type: string
3849
- description: RFC 0172 §A.4 — the contract that produced this response; MUST equal the one used.
3533
+ description: The contract that produced this response. It MUST equal the one used.
3850
3534
  required: true