@openwop/spec-artifacts 2.42.5 → 2.42.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/CORPUS-STAMP.json +64 -63
  2. package/api/seams-v2.yaml +238 -316
  3. package/api/v2/asyncapi.yaml +83 -113
  4. package/api/v2/openapi.yaml +339 -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 +2 -5
  9. package/spec/v1/core-standard-manifest.json +2 -2
  10. package/spec/v1/gaps.json +171 -1
  11. package/spec/v2/README.md +34 -36
  12. package/spec/v2/core/capabilities.md +186 -119
  13. package/spec/v2/core/conformance.md +78 -27
  14. package/spec/v2/core/connection-packs.md +8 -3
  15. package/spec/v2/core/conversation.md +10 -4
  16. package/spec/v2/core/errors.md +30 -9
  17. package/spec/v2/core/events.md +116 -80
  18. package/spec/v2/core/form-content-packs.md +11 -13
  19. package/spec/v2/core/headers.md +22 -14
  20. package/spec/v2/core/host-services.md +22 -5
  21. package/spec/v2/core/idempotency.md +48 -36
  22. package/spec/v2/core/identity.md +110 -42
  23. package/spec/v2/core/interop.md +82 -21
  24. package/spec/v2/core/interrupt.md +79 -40
  25. package/spec/v2/core/node-pack-runtimes.md +18 -4
  26. package/spec/v2/core/oauth.md +40 -6
  27. package/spec/v2/core/overview.md +61 -33
  28. package/spec/v2/core/packs.md +53 -28
  29. package/spec/v2/core/persistence.md +61 -80
  30. package/spec/v2/core/replay.md +56 -42
  31. package/spec/v2/core/runs.md +198 -60
  32. package/spec/v2/core/security-defaults.md +57 -33
  33. package/spec/v2/core/tool-catalog.md +29 -6
  34. package/spec/v2/core/versioning.md +95 -49
  35. package/spec/v2/core/webhooks.md +59 -20
  36. package/spec/v2/core/workflow-chain-packs.md +16 -14
  37. package/spec/v2/corrections.json +17 -1
  38. package/spec/v2/corrections.schema.json +1 -1
  39. package/spec/v2/declaration.json +24 -7
  40. package/spec/v2/declaration.schema.json +10 -0
  41. package/spec/v2/errors.json +109 -2
  42. package/spec/v2/errors.schema.json +38 -0
  43. package/spec/v2/ext/README.md +36 -23
  44. package/spec/v2/ext/a2uiSurface/README.md +75 -89
  45. package/spec/v2/ext/brand/README.md +15 -15
  46. package/spec/v2/ext/canvas/README.md +15 -15
  47. package/spec/v2/ext/chat/README.md +15 -15
  48. package/spec/v2/ext/coordination/README.md +15 -15
  49. package/spec/v2/ext/dataIntegration/README.md +17 -20
  50. package/spec/v2/ext/entities/README.md +15 -15
  51. package/spec/v2/ext/grpc-transport/README.md +6 -8
  52. package/spec/v2/ext/kanban/README.md +15 -15
  53. package/spec/v2/ext/knowledge/README.md +15 -15
  54. package/spec/v2/ext/launchStudio/README.md +16 -16
  55. package/spec/v2/ext/messaging/README.md +15 -15
  56. package/spec/v2/ext/portability/README.md +3 -17
  57. package/spec/v2/ext/provider-idempotency/README.md +7 -10
  58. package/spec/v2/ext/restTransport/README.md +30 -19
  59. package/spec/v2/ext/sandbox-runtime-notes/README.md +7 -9
  60. package/spec/v2/ext/webResearch/README.md +16 -16
  61. package/spec/v2/profiles.json +6 -2
  62. package/spec/v2/release.json +2 -2
  63. package/spec/v2/surface-baseline.json +542 -2
package/api/seams-v2.yaml CHANGED
@@ -1,15 +1,16 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP conformance seams profile (openwop-conformance-seams-v2)
4
- version: 2.42.5
5
- description: 'GENERATED by scripts/derive-v2-api.py. RFC 0168 §C: the seams are a versioned conformance profile with their
6
- own document and path space (/conformance/seams/…), validated against the canonical v2 schemas with no tolerance path,
7
- forbidden from the capability namespace (a host advertises the profile, never a testSeams flag). This document carries
8
- the nine operations the v1 canonical document used to carry; the 2.0.0 suite driver (P3-E2) rewrites the remaining host-sample-test-seams.md
9
- paths into this space, and P3-E3 adds the two RFC 0176 seams (event-log seed, inbound webhook receiver).'
4
+ version: 2.42.7
5
+ description: 'The OpenWOP conformance seams profile (`openwop-conformance-seams-v2`): test-only operations in their own
6
+ path space, `/conformance/seams/…`. The profile is versioned and validated against the canonical v2 schemas with no tolerance
7
+ path. It is not a capability: a host advertises the profile, never a `testSeams` flag.
8
+
9
+
10
+ Generated from `api/openapi.yaml` by `scripts/derive-v2-api.py`; do not edit.'
10
11
  servers:
11
12
  - url: https://{host}
12
- description: openwop-compliant server
13
+ description: An OpenWOP server.
13
14
  variables:
14
15
  host:
15
16
  default: api.example.com
@@ -19,18 +20,10 @@ paths:
19
20
  get:
20
21
  tags:
21
22
  - host
22
- summary: Read the persisted durable A2A task projection (RFC 0100, host-extension).
23
- description: 'Returns the persisted `A2ATaskState` for `taskId` (== the backing
24
-
25
- `runId`) per RFC 0100 §2 — a host-extension convenience read of the
26
-
27
- durable projection that survives caller disconnect. The normative A2A
28
-
29
- read surface remains the A2A `tasks/get` JSON-RPC method. Hosts that do
30
-
31
- not advertise `capabilities.a2a.durableTasks` return `501`.
32
-
33
- '
23
+ summary: Read the persisted durable A2A task projection (host extension).
24
+ description: 'Returns the persisted `A2ATaskState` for `taskId` (equal to the backing `runId`): a host-extension convenience
25
+ read of the durable projection, which survives caller disconnect. The normative A2A read surface remains the A2A `tasks/get`
26
+ JSON-RPC method. Hosts that do not advertise `capabilities.a2a.durableTasks` return `501`.'
34
27
  operationId: getA2ATaskState
35
28
  security:
36
29
  - ApiKeyAuth:
@@ -61,7 +54,7 @@ paths:
61
54
  '404':
62
55
  $ref: '#/components/responses/NotFound'
63
56
  '501':
64
- description: Host does not advertise capabilities.a2a.durableTasks (RFC 0100).
57
+ description: Host does not advertise `capabilities.a2a.durableTasks`.
65
58
  content:
66
59
  application/json:
67
60
  schema:
@@ -70,14 +63,9 @@ paths:
70
63
  get:
71
64
  tags:
72
65
  - host
73
- summary: List workspace file metadata for the caller's tenant·workspace (RFC 0059).
74
- description: 'Returns file metadata (no bodies) for the caller''s `{tenant,
75
-
76
- workspace}` per RFC 0059 §C. Optional `?prefix=` filters the flat
77
-
78
- `path` namespace to entries starting with the given prefix.
79
-
80
- '
66
+ summary: List workspace file metadata for the caller's tenant·workspace.
67
+ description: Returns file metadata, without bodies, for the caller's `{tenant, workspace}`. An optional `?prefix=` filters
68
+ the flat `path` namespace to entries starting with that prefix.
81
69
  operationId: listWorkspaceFiles
82
70
  security:
83
71
  - ApiKeyAuth:
@@ -108,7 +96,7 @@ paths:
108
96
  '403':
109
97
  $ref: '#/components/responses/Forbidden'
110
98
  '501':
111
- description: Host does not advertise capabilities.workspace.supported (RFC 0059).
99
+ description: Host does not advertise `capabilities.workspace.supported`.
112
100
  content:
113
101
  application/json:
114
102
  schema:
@@ -117,14 +105,9 @@ paths:
117
105
  get:
118
106
  tags:
119
107
  - host
120
- summary: Read one workspace file (RFC 0059).
121
- description: 'Returns the `WorkspaceFile` at `path` for the caller''s `{tenant,
122
-
123
- workspace}`. When `capabilities.workspace.versioned: true`, an
124
-
125
- optional `?version=N` returns the historical snapshot at version N.
126
-
127
- '
108
+ summary: Read one workspace file.
109
+ description: 'Returns the `WorkspaceFile` at `path` for the caller''s `{tenant, workspace}`. When `capabilities.workspace.versioned:
110
+ true`, an optional `?version=N` returns the historical snapshot at version N.'
128
111
  operationId: getWorkspaceFile
129
112
  security:
130
113
  - ApiKeyAuth:
@@ -150,7 +133,7 @@ paths:
150
133
  '404':
151
134
  $ref: '#/components/responses/NotFound'
152
135
  '501':
153
- description: Host does not advertise capabilities.workspace.supported (RFC 0059).
136
+ description: Host does not advertise `capabilities.workspace.supported`.
154
137
  content:
155
138
  application/json:
156
139
  schema:
@@ -158,20 +141,11 @@ paths:
158
141
  put:
159
142
  tags:
160
143
  - host
161
- summary: Atomic create/replace of a workspace file (RFC 0059).
162
- description: 'Atomically creates or replaces the file at `path` per RFC 0059 §C.
163
-
164
- MUST honor `If-Match: <etag>` — a stale token returns `409
165
-
166
- workspace_conflict` (`details.currentVersion` carries the live
167
-
168
- version). On success the host bumps `version`, recomputes `etag`,
169
-
170
- and emits a `workspace.updated` event. A `content` exceeding
171
-
172
- `capabilities.workspace.maxFileBytes` returns `workspace_too_large`.
173
-
174
- '
144
+ summary: Atomically create or replace a workspace file.
145
+ description: 'Atomically creates or replaces the file at `path`. MUST honor `If-Match: <etag>`: a stale token returns
146
+ `409 workspace_conflict`, with `details.currentVersion` carrying the live version. On success the host bumps `version`,
147
+ recomputes `etag`, and emits a `workspace.updated` event. A `content` exceeding `capabilities.workspace.maxFileBytes`
148
+ returns `workspace_too_large`.'
175
149
  operationId: putWorkspaceFile
176
150
  security:
177
151
  - ApiKeyAuth:
@@ -216,7 +190,7 @@ paths:
216
190
  schema:
217
191
  $ref: ../schemas/v2/error-envelope.schema.json
218
192
  '501':
219
- description: Host does not advertise capabilities.workspace.supported (RFC 0059).
193
+ description: Host does not advertise `capabilities.workspace.supported`.
220
194
  content:
221
195
  application/json:
222
196
  schema:
@@ -224,12 +198,9 @@ paths:
224
198
  delete:
225
199
  tags:
226
200
  - host
227
- summary: Delete a workspace file (RFC 0059).
228
- description: 'Removes the file at `path` (and, when `versioned: true`, writes a
229
-
230
- tombstone). Emits a `workspace.updated` event on success.
231
-
232
- '
201
+ summary: Delete a workspace file.
202
+ description: 'Removes the file at `path` (and, when `versioned: true`, writes a tombstone). Emits a `workspace.updated`
203
+ event on success.'
233
204
  operationId: deleteWorkspaceFile
234
205
  security:
235
206
  - ApiKeyAuth:
@@ -251,7 +222,7 @@ paths:
251
222
  '404':
252
223
  $ref: '#/components/responses/NotFound'
253
224
  '501':
254
- description: Host does not advertise capabilities.workspace.supported (RFC 0059).
225
+ description: Host does not advertise `capabilities.workspace.supported`.
255
226
  content:
256
227
  application/json:
257
228
  schema:
@@ -264,35 +235,15 @@ paths:
264
235
  tags:
265
236
  - packs-test
266
237
  summary: Publish a pack tarball to the isolated test catalog.
267
- description: 'Mirror of `PUT /v1/packs/{name}/-/{version}.tgz` per
268
-
269
- `spec/v1/node-packs.md` §"PUT /v1/packs/{name}/-/{version}.tgz".
270
-
271
- Request shape, response shape, status codes, and the 19-code
272
-
273
- publish error catalog (`invalid_pack_scope`, `invalid_pack_name`,
274
-
275
- `invalid_version`, `invalid_body`, eight `tarball_*` codes,
276
-
277
- `invalid_manifest`, `manifest_mismatch` (or the granular
278
-
279
- `manifest_name_mismatch` / `manifest_version_mismatch` pair),
280
-
281
- `pack_integrity_failure`, `unsupported_runtime`, `forbidden`,
282
-
283
- `conflict`/`version_conflict`) MUST be served verbatim. The
284
-
285
- test catalog MUST be isolated per RFC 0025 §C — a pack PUT''d
238
+ description: 'Mirrors the registry''s `PUT /v1/packs/{name}/-/{version}.tgz` (`spec/v1/node-packs.md`). The request
239
+ shape, response shape, status codes, and publish error catalog MUST be served verbatim: `invalid_pack_scope`, `invalid_pack_name`,
240
+ `invalid_version`, `invalid_body`, eight `tarball_*` codes, `invalid_manifest`, `manifest_mismatch` (or the granular
241
+ `manifest_name_mismatch` / `manifest_version_mismatch` pair), `pack_integrity_failure`, `unsupported_runtime`, `forbidden`,
242
+ `conflict`/`version_conflict`.
286
243
 
287
- here MUST NOT appear in `GET /v1/packs/{name}` listings.
288
244
 
289
- The mirrored production path is registry-service surface
290
-
291
- (`registry-operations.md`), not defined in this host document
292
-
293
- (see the `packs-test` tag scope note).
294
-
295
- '
245
+ The test catalog MUST be isolated: a pack PUT here MUST NOT appear in `GET /v1/packs/{name}` listings. The mirrored
246
+ production path is registry-service surface (`registry-operations.md`), not defined in this document.'
296
247
  operationId: putTestPackTarball
297
248
  security:
298
249
  - ApiKeyAuth:
@@ -352,29 +303,12 @@ paths:
352
303
  schema:
353
304
  $ref: '#/components/schemas/TestPackPublishRecord'
354
305
  '400':
355
- description: 'One of the 17 spec-documented 400-class publish error codes:
356
-
357
- URL/scope (`invalid_pack_scope`, `invalid_pack_name`, `invalid_version`),
358
-
359
- body shape (`invalid_body`),
360
-
361
- tarball extraction (`tarball_gunzip_failed`, `tarball_too_large`,
362
-
363
- `tarball_manifest_missing`, `tarball_manifest_too_large`,
364
-
365
- `tarball_manifest_not_json`, `tarball_entry_missing`,
366
-
367
- `tarball_entry_too_large`, `tarball_path_traversal`,
368
-
369
- `tarball_tar_parse_failed`),
370
-
371
- manifest contents (`invalid_manifest`, `manifest_mismatch` or
372
-
373
- the granular `manifest_name_mismatch` / `manifest_version_mismatch` pair,
374
-
375
- `pack_integrity_failure`, `unsupported_runtime`).
376
-
377
- '
306
+ description: 'One of the documented 400-class publish error codes: URL or scope (`invalid_pack_scope`, `invalid_pack_name`,
307
+ `invalid_version`), body shape (`invalid_body`), tarball extraction (`tarball_gunzip_failed`, `tarball_too_large`,
308
+ `tarball_manifest_missing`, `tarball_manifest_too_large`, `tarball_manifest_not_json`, `tarball_entry_missing`,
309
+ `tarball_entry_too_large`, `tarball_path_traversal`, `tarball_tar_parse_failed`), or manifest contents (`invalid_manifest`,
310
+ `manifest_mismatch` or the granular `manifest_name_mismatch` / `manifest_version_mismatch` pair, `pack_integrity_failure`,
311
+ `unsupported_runtime`).'
378
312
  content:
379
313
  application/json:
380
314
  schema:
@@ -404,10 +338,9 @@ paths:
404
338
  tags:
405
339
  - packs-test
406
340
  summary: Fetch a published test-catalog tarball.
407
- description: 'Mirror of `GET /v1/packs/{name}/-/{version}.tgz`. Returns the gzipped tarball bytes with `Content-Type:
408
- application/tar+gzip` and an `ETag: "sha256-..."` matching the manifest''s `tarballSha256`. The mirrored production
409
- path is registry-service surface (`registry-operations.md`), not defined in this host document (see the `packs-test`
410
- tag scope note).'
341
+ description: 'Mirrors the registry''s `GET /v1/packs/{name}/-/{version}.tgz`. Returns the gzipped tarball bytes with
342
+ `Content-Type: application/tar+gzip` and an `ETag: "sha256-..."` matching the manifest''s `tarballSha256`. The mirrored
343
+ production path is registry-service surface (`registry-operations.md`), not defined in this document.'
411
344
  operationId: getTestPackTarball
412
345
  security:
413
346
  - ApiKeyAuth:
@@ -452,26 +385,11 @@ paths:
452
385
  delete:
453
386
  tags:
454
387
  - packs-test
455
- summary: Unpublish a test-catalog version (mirrors unpublish-window semantics).
456
- description: 'Mirror of `DELETE /v1/packs/{name}/-/{version}` per
457
-
458
- `spec/v1/node-packs.md`. Returns `400 unpublish_window_expired`
459
-
460
- for versions older than the registry''s unpublish window
461
-
462
- (default 72h). Test-mode implementations MAY shorten the
463
-
464
- window for tractable conformance fixtures but MUST surface
465
-
466
- the same error code. The mirrored production path is
467
-
468
- registry-service surface (`registry-operations.md`), not
469
-
470
- defined in this host document (see the `packs-test` tag
471
-
472
- scope note).
473
-
474
- '
388
+ summary: Unpublish a test-catalog version (same unpublish-window semantics as the registry).
389
+ description: Mirrors the registry's `DELETE /v1/packs/{name}/-/{version}` (`spec/v1/node-packs.md`). Returns `400 unpublish_window_expired`
390
+ for versions older than the registry's unpublish window (default 72h). Test-mode implementations MAY shorten the window
391
+ for tractable conformance fixtures but MUST surface the same error code. The mirrored production path is registry-service
392
+ surface (`registry-operations.md`), not defined in this document.
475
393
  operationId: deleteTestPackVersion
476
394
  security:
477
395
  - ApiKeyAuth:
@@ -511,17 +429,9 @@ paths:
511
429
  tags:
512
430
  - packs-test
513
431
  summary: Fetch the detached Ed25519 signature for a test-catalog pack.
514
- description: 'Mirror of `GET /v1/packs/{name}/-/{version}.sig`. Returns the
515
-
516
- signature blob over `pack.json` for this version. MAY 302-redirect
517
-
518
- to a storage-backend signed URL. The mirrored production path is
519
-
520
- registry-service surface (`registry-operations.md`), not defined
521
-
522
- in this host document (see the `packs-test` tag scope note).
523
-
524
- '
432
+ description: Mirrors the registry's `GET /v1/packs/{name}/-/{version}.sig`. Returns the signature blob over `pack.json`
433
+ for this version. MAY 302-redirect to a storage-backend signed URL. The mirrored production path is registry-service
434
+ surface (`registry-operations.md`), not defined in this document.
525
435
  operationId: getTestPackSignature
526
436
  security:
527
437
  - ApiKeyAuth:
@@ -560,19 +470,9 @@ paths:
560
470
  schema:
561
471
  $ref: ../schemas/v2/error-envelope.schema.json
562
472
  '404':
563
- description: '`signature_not_available` — version is missing, yanked,
564
-
565
- unsigned at publish time, OR the registry''s storage backend
566
-
567
- is unwired. The four cases are intentionally
568
-
569
- indistinguishable per spec/v1/node-packs.md §"GET /v1/packs/{name}/-/{version}.sig".
570
-
571
- Also returned when the host does not advertise
572
-
573
- `capabilities.packs.testMode.supported: true`.
574
-
575
- '
473
+ description: '`signature_not_available`: the version is missing, yanked, or unsigned at publish time, or the registry''s
474
+ storage backend is unwired. The four cases are intentionally indistinguishable (spec/v1/node-packs.md). Also returned
475
+ when the host does not advertise `capabilities.packs.testMode.supported: true`.'
576
476
  content:
577
477
  application/json:
578
478
  schema:
@@ -582,11 +482,11 @@ paths:
582
482
  tags:
583
483
  - Seams
584
484
  operationId: seedEra2EventLog
585
- summary: Persist a run whose event log is in v1 vocabulary (era 2) — RFC 0176 §A/§B/§C witnesses
586
- description: 'The host MUST persist the rows verbatim (v1 `type` strings, the given `sequence` space, no era stamp:
587
- the run reads as era `2` by the absent-⇒-`2` rule of persistence.md) and MUST NOT translate at write time; the read
588
- projection is what the scenarios `v2-v1-events-translated`, `v2-unmapped-type-refused`, `v2-fork-a-v1-run` and `v2-pinned-run-disposition`
589
- witness. `status` is the snapshot status the seeded run holds.'
485
+ summary: Persist a run whose event log uses v1 vocabulary (era 2)
486
+ description: 'Seeds a run whose stored event log is in v1 vocabulary. The host MUST persist the rows verbatim: v1 `type`
487
+ strings, the given `sequence` space, and no era stamp, so the run reads as era `2` by the absent-⇒-`2` rule of persistence.md.
488
+ The host MUST NOT translate at write time. The scenarios `v2-v1-events-translated`, `v2-unmapped-type-refused`, `v2-fork-a-v1-run`
489
+ and `v2-pinned-run-disposition` witness the read projection. `status` is the snapshot status the seeded run holds.'
590
490
  requestBody:
591
491
  required: true
592
492
  content:
@@ -648,22 +548,79 @@ paths:
648
548
  $ref: '#/components/responses/ValidationError'
649
549
  '401':
650
550
  $ref: '#/components/responses/Unauthenticated'
551
+ /conformance/seams/sample/event-log/append:
552
+ post:
553
+ tags:
554
+ - Seams
555
+ operationId: appendEra2Event
556
+ summary: Append a v2-named event to a seeded era-2 run through the host's production writer
557
+ description: 'The host MUST append the event through the same writer its own code uses for that run (the storage boundary
558
+ that applies the writer rule, persistence.md §The writer rule) and MUST NOT branch on the seam. An era-2 run stores
559
+ the event under its v1 spelling (the codemap''s v1 side), so the production read returns the v2 `type` given here.
560
+
561
+
562
+ The seam MUST refuse a `runId` that `seedEra2EventLog` did not create with `404`, exactly as for an unknown run, so
563
+ it cannot inject into a real run. A terminal run answers `409 run_terminal`; a `type` that is not a v2 registry name
564
+ answers `400`. Used by `v2-era-2-append-vocabulary`.'
565
+ requestBody:
566
+ required: true
567
+ content:
568
+ application/json:
569
+ schema:
570
+ type: object
571
+ additionalProperties: false
572
+ required:
573
+ - runId
574
+ - type
575
+ - payload
576
+ properties:
577
+ runId:
578
+ $ref: ../schemas/v2/ids.schema.json#/$defs/runId
579
+ type:
580
+ type: string
581
+ description: A v2 event type name (schemas/v2/run-event.schema.json `type` enum).
582
+ payload:
583
+ type: object
584
+ responses:
585
+ '202':
586
+ description: The event was appended.
587
+ content:
588
+ application/json:
589
+ schema:
590
+ type: object
591
+ additionalProperties: false
592
+ required:
593
+ - runId
594
+ - sequence
595
+ properties:
596
+ runId:
597
+ $ref: ../schemas/v2/ids.schema.json#/$defs/runId
598
+ sequence:
599
+ type: integer
600
+ minimum: 0
601
+ '400':
602
+ $ref: '#/components/responses/ValidationError'
603
+ '401':
604
+ $ref: '#/components/responses/Unauthenticated'
605
+ '404':
606
+ $ref: '#/components/responses/NotFound'
607
+ '409':
608
+ description: The run is terminal (`run_terminal`).
651
609
  /conformance/seams/sample/effect-seams/fire:
652
610
  post:
653
611
  tags:
654
612
  - Seams
655
613
  operationId: fireEffectSeam
656
- summary: Fire one named effect-seam manifest row inside a run — RFC 0173 §C no-re-fire witness
614
+ summary: Fire one named effect seam inside a run
657
615
  description: 'The host runs a workflow that drives the named seam once. The scenario then forks the run in `replay`
658
- mode and reads `GET /runs/{runId}/effects` on the fork: a GUARDED seam MUST NOT produce a new effect attempt there,
659
- because replay suppression is unconditional (`replay.md` §Suppression rule 1) and does not depend on `branchReFires`,
660
- which states only what a `branch` re-fires by design (§Branch: a host "MUST NOT report that as replay suppression").
661
- The witness is the host own Layer-2 ledger, so the leg needs no externally reachable receiver. Without this seam the
662
- replay-suppression obligation is only claims-checkable. HOW THE TARGET IS CHOSEN (suite 2.0.3): the scenario fires
663
- the first `GET /host/effect-seams` row with `guarded: true`, not every row, and records `inapplicable` without calling
664
- this operation at all when no row is guarded. Stated here because it is a contract an implementer cannot see from
665
- the request body — until 2.0.2 the filter also required `branchReFires: false`, and a host whose seams all honestly
666
- re-fire on branch would have built this seam only to find the scenario still declining to call it.'
616
+ mode and reads `GET /runs/{runId}/effects` on the fork. A guarded seam MUST NOT produce a new effect attempt there:
617
+ replay suppression is unconditional (`replay.md` §Suppression rule 1) and does not depend on `branchReFires`, which
618
+ states only what a `branch` re-fires by design (§Branch: a host "MUST NOT report that as replay suppression"). The
619
+ witness is the host''s own Layer-2 ledger, so the leg needs no externally reachable receiver.
620
+
621
+
622
+ The scenario fires the first `GET /host/effect-seams` row with `guarded: true`, not every row. When no row is guarded
623
+ it records `inapplicable` without calling this operation.'
667
624
  requestBody:
668
625
  required: true
669
626
  content:
@@ -677,12 +634,12 @@ paths:
677
634
  seam:
678
635
  type: string
679
636
  minLength: 1
680
- description: The `seam` value of a row in GET /host/effect-seams.
637
+ description: The `seam` value of a row in `GET /host/effect-seams`.
681
638
  receiverUrl:
682
639
  type: string
683
640
  format: uri
684
- description: Optional destination for seams whose kind needs one. Omitted, the host uses its own unreachable
685
- fixture destination — the witness is the effect ledger, not delivery.
641
+ description: Optional destination, for seams whose kind needs one. Omitted, the host uses its own unreachable
642
+ fixture destination; the witness is the effect ledger, not delivery.
686
643
  responses:
687
644
  '201':
688
645
  description: The run that fired the seam.
@@ -707,11 +664,10 @@ paths:
707
664
  tags:
708
665
  - Seams
709
666
  operationId: forceEffectTransportRetry
710
- summary: Drive one effect through the suite fixture provider with a forced transport retry — RFC 0173 §D.2 G4 witness
711
- description: 'The host issues one outbound effect to `providerUrl` and retries it at the transport layer. The suite
712
- fixture provider records the idempotency key of each attempt: a Layer-2 host MUST present the SAME business-identity
713
- key across both attempts, so a provider that sees a changed key fails the leg. Without this seam the effect-identity
714
- obligation is only claims-checkable.'
667
+ summary: Drive one effect through the suite's fixture provider with a forced transport retry
668
+ description: The host issues one outbound effect to `providerUrl` and retries it at the transport layer. The fixture
669
+ provider records the idempotency key of each attempt. A Layer-2 host MUST present the same business-identity key on
670
+ both attempts; a provider that sees a changed key fails the leg.
715
671
  requestBody:
716
672
  required: true
717
673
  content:
@@ -752,12 +708,11 @@ paths:
752
708
  tags:
753
709
  - Seams
754
710
  operationId: armIdempotencyHold
755
- summary: Hold the caller's next same-key create in flight — RFC 0213 §B witness
711
+ summary: Hold the caller's next same-key create in flight
756
712
  description: 'Arms a single-use hold: the caller tenant''s next real `POST /runs` carrying `key` as its Idempotency-Key
757
713
  keeps its Layer-1 claim in flight for `holdMs` after claiming, then completes normally. The seam MUST NOT answer a
758
714
  create or emit a 409: the refusal a concurrent same-key create receives while the claim is held comes from the host''s
759
- production in-flight branch (idempotency.md §Concurrency). Keyed by (tenant, key); single-use; an unarmed key is never
760
- delayed.'
715
+ production in-flight branch (idempotency.md §Concurrency). Keyed by (tenant, key); an unarmed key is never delayed.'
761
716
  requestBody:
762
717
  required: true
763
718
  content:
@@ -801,10 +756,11 @@ paths:
801
756
  tags:
802
757
  - Seams
803
758
  operationId: receiveWebhookDelivery
804
- summary: Run a webhook delivery through the host's inbound receiver — RFC 0176 §D.2 witness
805
- description: The v2 host as a subscriber. The host verifies `headers` + `body` with its production verifier using `secret`
806
- as the subscription secret and reports the verdict; an `X-openwop-*`-only scheme-`v1` delivery over `{timestamp}.{rawBody}`
807
- MUST be accepted (`v2-v1-signed-webhook-accepted`), and a tampered signature MUST be refused.
759
+ summary: Run a webhook delivery through the host's inbound receiver
760
+ description: Exercises the host as a webhook subscriber. The host verifies `headers` and `body` with its production
761
+ verifier, using `secret` as the subscription secret, and reports the verdict. A scheme-`v1` delivery carrying only
762
+ `X-openwop-*` headers, signed over `{timestamp}.{rawBody}`, MUST be accepted (`v2-v1-signed-webhook-accepted`); a
763
+ tampered signature MUST be refused.
808
764
  requestBody:
809
765
  required: true
810
766
  content:
@@ -850,19 +806,24 @@ paths:
850
806
  tags:
851
807
  - Seams
852
808
  operationId: emitA2uiSurface
853
- summary: Admit one `ui.a2ui-surface` envelope into a run through the production envelope-admission path — RFC 0209 witness
854
- description: 'A real `ui.a2ui-surface` envelope is emitted by a model inside a node turn, so the suite cannot choose
855
- one from the canonical wire. This seam supplies the envelope ONLY. The host MUST admit it through its PRODUCTION envelope-admission
856
- path — the envelope-kind catalog (`supportedEnvelopes`, `schemaVersions`, `envelopeStrictness`, events.md §"The envelope-kind
857
- catalog"), validation against the ONE per-kind branch the schema version selects (never the `anyOf` union), the RFC
858
- 0209 cross-field rules (every message `surfaceId` equals the payload `surfaceId`; a `createSurface.catalogId` equals
859
- the payload `catalogId`), the surface-fold guard (spec/v2/ext/a2uiSurface/README.md §"The fold"), trust propagation
860
- and SR-1 redaction — and MUST record it exactly as production would. It MUST NOT be a mock that records without those
861
- rules. `envelope.nodeId`, when present, binds the surface to that node, so a surface emitted at a node suspended on
862
- an `approval` interrupt is the surface whose `resume` action would resolve it (§"Trust": a tainted fold blocks that
863
- interrupt). Refusals use the canonical error envelope: `422 unknown_schema_version` above the floor or under `strict`
864
- below it, `422 envelope_invalid` for a payload that fails its branch, a cross-field rule or the fold guard, `422 unknown_envelope_kind`
865
- when the host does not list the kind; `details` SHOULD name the rule. A host that has not wired the seam answers `404`/`405`,
809
+ summary: Admit one `ui.a2ui-surface` envelope into a run through the production admission path
810
+ description: 'Supplies one `ui.a2ui-surface` envelope for the host to admit. A real one is emitted by a model inside
811
+ a node turn, so the suite cannot choose one from the canonical wire; this seam supplies the envelope only.
812
+
813
+
814
+ The host MUST admit it through its production envelope-admission path and MUST record it exactly as production would.
815
+ That path covers the envelope-kind catalog (`supportedEnvelopes`, `schemaVersions`, `envelopeStrictness`; events.md
816
+ §"The envelope-kind catalog"), validation against the one per-kind branch the schema version selects (never the `anyOf`
817
+ union), the cross-field rules (every message `surfaceId` equals the payload `surfaceId`; a `createSurface.catalogId`
818
+ equals the payload `catalogId`), the surface-fold guard (spec/v2/ext/a2uiSurface/README.md §"The fold"), trust propagation,
819
+ and SR-1 redaction. It MUST NOT be a mock that records without those rules. `envelope.nodeId`, when present, binds
820
+ the surface to that node, so a surface emitted at a node suspended on an `approval` interrupt is the surface whose
821
+ `resume` action would resolve it (§"Trust": a tainted fold blocks that interrupt).
822
+
823
+
824
+ Refusals use the canonical error envelope: `422 unknown_schema_version` above the floor, or below it under `strict`;
825
+ `422 envelope_invalid` for a payload that fails its branch, a cross-field rule, or the fold guard; `422 unknown_envelope_kind`
826
+ when the host does not list the kind. `details` SHOULD name the rule. A host that has not wired the seam answers `404`/`405`,
866
827
  and the scenario records `inapplicable`.'
867
828
  requestBody:
868
829
  required: true
@@ -912,19 +873,23 @@ paths:
912
873
  tags:
913
874
  - Seams
914
875
  operationId: startOAuthAuthorization
915
- summary: Begin an authorization-code grant for the caller through the production authorization-URL builder — RFC 0199
916
- §A/§B witness
917
- description: 'Points `provider` at the given endpoints (the suite''s authorization-server double) — a test-only provider
918
- definition, or, with `connection`, the connection pack''s provider through the host''s PRODUCTION registration path,
919
- which runs the RFC 0199 §B.3 discovery and pins its tuple — and then begins an authorization-code grant for the AUTHENTICATED
920
- caller by calling the host''s PRODUCTION authorization-URL builder, returning the URL a user agent would be redirected
921
- to. The builder MUST be the one production uses (PKCE S256, a fresh `state` bound to the caller''s Subject and the
922
- provider, the provider''s fixed redirect URI, `iss` expectations, `resource` for an MCP reach); a seam that assembles
923
- its own URL measures a stub, and a bundle citing it MUST say which. The grant completes on the host''s PRODUCTION
924
- callback route, which the suite calls as the user agent. `redirectUri` is a probe: the host MUST ignore it (the redirect
925
- URI is fixed per provider, oauth.md rule 5). A refused grant — an MCP-reach provider with no `issuer`, `pkce: "unsupported"`,
926
- or discovered metadata that disagrees with the manifest or the pinned tuple — is `422 connection_auth_metadata_mismatch`
927
- and no authorization URL is issued. A host that has not wired the seam answers `404`, and the scenarios record `blocked`.'
876
+ summary: Begin an authorization-code grant through the production authorization-URL builder
877
+ description: 'Points `provider` at the given endpoints (the suite''s authorization-server double), then begins an authorization-code
878
+ grant for the authenticated caller by calling the host''s production authorization-URL builder, and returns the URL
879
+ a user agent would be redirected to. The provider is a test-only provider definition or, with `connection`, the connection
880
+ pack''s provider registered through the host''s production registration path, which runs discovery and pins its tuple.
881
+
882
+
883
+ The builder MUST be the one production uses: PKCE S256, a fresh `state` bound to the caller''s Subject and the provider,
884
+ the provider''s fixed redirect URI, `iss` expectations, and `resource` for an MCP reach. A seam that assembles its
885
+ own URL measures a stub, and a bundle citing it MUST say which. The grant completes on the host''s production callback
886
+ route, which the suite calls as the user agent. `redirectUri` is a probe: the host MUST ignore it (the redirect URI
887
+ is fixed per provider, oauth.md rule 5).
888
+
889
+
890
+ A refused grant (an MCP-reach provider with no `issuer`, `pkce: "unsupported"`, or discovered metadata that disagrees
891
+ with the manifest or the pinned tuple) is `422 connection_auth_metadata_mismatch`, and no authorization URL is issued.
892
+ A host that has not wired the seam answers `404`, and the scenarios record `blocked`.'
928
893
  requestBody:
929
894
  required: true
930
895
  content:
@@ -962,8 +927,8 @@ paths:
962
927
  minLength: 1
963
928
  connection:
964
929
  $ref: ../schemas/v2/connection-pack-manifest.schema.json
965
- description: A connection pack whose provider is reached as an MCP server (RFC 0199 §B); registered through
966
- the production path.
930
+ description: A connection pack whose provider is reached as an MCP server; registered through the production
931
+ path.
967
932
  redirectUri:
968
933
  type: string
969
934
  description: A probe the host MUST ignore.
@@ -999,14 +964,13 @@ paths:
999
964
  tags:
1000
965
  - Seams
1001
966
  operationId: expireOAuthAccessToken
1002
- summary: Expire the caller's stored access token for a provider so its next use refreshes — RFC 0199 §C.2(b) / RFC 0047
1003
- §C.3 witness
1004
- description: 'Marks the access token of the caller''s stored credential for `provider` expired. Nothing else: the next
1005
- node that uses it refreshes through the host''s PRODUCTION refresh path against the provider''s token endpoint (the
1006
- suite''s double, which decides whether the refresh token is still good). A terminal refresh failure then follows oauth.md
1007
- §Token lifecycle — `connector.auth-expired`, and either the node fails `connector_auth_expired` or, under `oauth.credentialInterrupt`,
1008
- it suspends on a `credential` interrupt with `reason: "expired"`. `404` when the caller holds no credential for the
1009
- provider.'
967
+ summary: Expire the caller's stored access token for a provider so its next use refreshes
968
+ description: 'Marks the access token of the caller''s stored credential for `provider` expired, and nothing else. The
969
+ next node that uses it refreshes through the host''s production refresh path against the provider''s token endpoint
970
+ (the suite''s double, which decides whether the refresh token is still good). A terminal refresh failure then follows
971
+ oauth.md §Token lifecycle: `connector.auth-expired`, and either the node fails `connector_auth_expired` or, under
972
+ `oauth.credentialInterrupt`, it suspends on a `credential` interrupt with `reason: "expired"`. `404` when the caller
973
+ holds no credential for the provider.'
1010
974
  requestBody:
1011
975
  required: true
1012
976
  content:
@@ -1034,9 +998,9 @@ paths:
1034
998
  tags:
1035
999
  - Seams
1036
1000
  operationId: mintLaneCredential
1037
- summary: Mint a fresh credential on an advertised lane for the caller's tenant — RFC 0170 §B.3 witness
1001
+ summary: Mint a fresh credential on an advertised lane for the caller's tenant
1038
1002
  description: 'Issues a new credential on `lane` (an advertised `auth.lanes[].lane` whose `revocation` is `next-request`;
1039
- absent ⇒ `api-key`) for the AUTHENTICATED caller''s tenant, through the host''s PRODUCTION issuance path, so the credential
1003
+ absent ⇒ `api-key`) for the authenticated caller''s tenant, through the host''s production issuance path, so the credential
1040
1004
  it returns authenticates on the canonical API exactly as an ordinary one does. The suite uses it only to hold a credential
1041
1005
  it can then revoke: the revocation, and the refusal on the next request (`401 credential_revoked`), are production
1042
1006
  behaviour the seam does not simulate. A host that has not wired the seam answers `404`, and the scenario records the
@@ -1079,8 +1043,7 @@ paths:
1079
1043
  - kind
1080
1044
  description: 'How the suite presents `credential` on the canonical API. Absent ⇒ bearer. A lane whose
1081
1045
  production credential is cookie-borne (a `session` lane) answers `{ kind: "cookie", name }`, and the
1082
- suite sends `Cookie: <name>=<credential>`. Added so a cookie lane that honours `next-request` revocation
1083
- can be witnessed without advertising a false rule.'
1046
+ suite sends `Cookie: <name>=<credential>`.'
1084
1047
  properties:
1085
1048
  kind:
1086
1049
  type: string
@@ -1090,7 +1053,7 @@ paths:
1090
1053
  name:
1091
1054
  type: string
1092
1055
  pattern: ^[!#$%&'*+.^_`|~0-9A-Za-z-]+$
1093
- description: The cookie name (RFC 6265 token). Required when `kind` is `cookie`.
1056
+ description: The cookie name (an RFC 6265 token). Required when `kind` is `cookie`.
1094
1057
  if:
1095
1058
  properties:
1096
1059
  kind:
@@ -1113,8 +1076,8 @@ paths:
1113
1076
  tags:
1114
1077
  - Seams
1115
1078
  operationId: revokeLaneCredential
1116
- summary: Revoke a credential the mint seam issued — RFC 0170 §B.3 witness
1117
- description: Revokes `credential` through the host's PRODUCTION revocation path. On a `next-request` lane the very next
1079
+ summary: Revoke a credential the mint seam issued
1080
+ description: Revokes `credential` through the host's production revocation path. On a `next-request` lane the very next
1118
1081
  request presenting it MUST be refused `401 credential_revoked` (identity.md §2.2); the suite observes that on the
1119
1082
  canonical API, not through this seam. `404` when no active credential matches.
1120
1083
  requestBody:
@@ -1160,16 +1123,25 @@ paths:
1160
1123
  tags:
1161
1124
  - Seams
1162
1125
  operationId: getTranscriptWindow
1163
- summary: The host's own accounting of what it fed the model on one orchestrator turn — RFC 0111 witness
1164
- description: 'The orchestrator transcript a host assembles each iteration is host-internal and never crosses the wire.
1165
- This seam returns what the host fed the model on turn `iteration` of `runId`: `tokenCount` in the advertised `contextBudget.tokenCounter`
1166
- unit (MUST be ≤ `transcriptTokenBudget`), `eventIds` (the verbatim recent tail, in event-log order), `summarizedRanges`,
1167
- and `entries[] { eventId, rendered }` — the exact text fed per item, REQUIRED when `tokenCounter` is `chars` so the
1168
- suite can sum the rendered Unicode code points and require it to equal `tokenCount`. A summary substitution''s entry
1169
- names its `context.summarized` event and renders the summary text. Served in test mode only; `rendered` MUST NOT carry
1170
- secret material (SR-1). The ceiling is advertise-and-attest: the seam proves the declared accounting is consistent
1171
- and bounded, not that nothing else reached the model. A turn past the run''s last answers `400`/`422`; an unwired
1172
- seam answers `404`/`405`.'
1126
+ summary: Read the host's accounting of what it fed the model on one orchestrator turn
1127
+ description: 'Returns what the host fed the model on turn `iteration` of `runId`. The orchestrator transcript a host
1128
+ assembles each iteration is host-internal and never crosses the wire, so this seam reports the host''s own accounting:
1129
+
1130
+
1131
+ - `tokenCount`, in the advertised `contextBudget.tokenCounter` unit. MUST be ≤ `transcriptTokenBudget`.
1132
+
1133
+ - `eventIds`: the verbatim recent tail, in event-log order.
1134
+
1135
+ - `summarizedRanges`.
1136
+
1137
+ - `entries[] { eventId, rendered }`: the exact text fed per item. REQUIRED when `tokenCounter` is `chars`, so the
1138
+ suite can sum the rendered Unicode code points and require the sum to equal `tokenCount`. A summary substitution''s
1139
+ entry names its `context.summarized` event and renders the summary text.
1140
+
1141
+
1142
+ Served in test mode only; `rendered` MUST NOT carry secret material (SR-1). The ceiling is advertise-and-attest: the
1143
+ seam proves the declared accounting is consistent and bounded, not that nothing else reached the model. A turn past
1144
+ the run''s last answers `400`/`422`; an unwired seam answers `404`/`405`.'
1173
1145
  parameters:
1174
1146
  - name: runId
1175
1147
  in: query
@@ -1255,28 +1227,13 @@ components:
1255
1227
  type: http
1256
1228
  scheme: bearer
1257
1229
  bearerFormat: API key
1258
- description: 'openwop API key. Format implementation-defined; reference impl uses `hk_`/`hk_test_` prefixes.
1259
-
1260
- Each key carries one or more scopes from the canonical vocabulary
1261
-
1262
- (`manifest:read`, `runs:create`, `runs:read`, `runs:cancel`,
1263
-
1264
- `artifacts:read`, `webhooks:manage`, `approvals:respond`, `audit:read`).
1265
-
1266
- See `auth.md`.
1267
-
1268
- '
1230
+ description: OpenWOP API key. The format is implementation-defined; the reference implementation uses `hk_`/`hk_test_`
1231
+ prefixes. Each key carries one or more scopes from the canonical vocabulary (`manifest:read`, `runs:create`, `runs:read`,
1232
+ `runs:cancel`, `artifacts:read`, `webhooks:manage`, `approvals:respond`, `audit:read`). See `auth.md`.
1269
1233
  OAuth2:
1270
1234
  type: oauth2
1271
- description: 'RFC 0200 §F. OAuth 2.0 lanes — v1 `openwop-auth-oauth2-client-credentials`,
1272
-
1273
- v2 `auth.lanes[].lane: "oauth2"`. Discovery is RFC 9728 Protected Resource
1274
-
1275
- Metadata at the path-inserted well-known URI (`identity.md` §2.5).
1276
-
1277
- Placeholder URLs.
1278
-
1279
- '
1235
+ description: 'The OAuth 2.0 lane (`auth.lanes[].lane: "oauth2"`). Discovery is RFC 9728 Protected Resource Metadata
1236
+ at the path-inserted well-known URI (`identity.md` §2.5). The URLs are placeholders.'
1280
1237
  flows:
1281
1238
  clientCredentials:
1282
1239
  tokenUrl: https://issuer.example/oauth2/token
@@ -1328,26 +1285,14 @@ components:
1328
1285
  OpenIdConnect:
1329
1286
  type: openIdConnect
1330
1287
  openIdConnectUrl: https://issuer.example/.well-known/openid-configuration
1331
- description: 'RFC 0200 §F. v1 `openwop-auth-oidc-user-bearer` / v2 `auth.lanes[].lane: "oidc"`.
1332
-
1333
- An ID token MAY be the bearer only when its `aud` equals the host''s configured
1334
-
1335
- audience (`identity.md` §2.1); any other `aud` is `audience_mismatch`.
1336
-
1337
- Placeholder URL.
1338
-
1339
- '
1288
+ description: 'The OpenID Connect lane (`auth.lanes[].lane: "oidc"`). An ID token MAY be the bearer only when its `aud`
1289
+ equals the host''s configured audience (`identity.md` §2.1); any other `aud` is `audience_mismatch`. The URL is a
1290
+ placeholder.'
1340
1291
  MutualTLS:
1341
1292
  type: mutualTLS
1342
- description: 'RFC 0200 §F. v1 `openwop-auth-mtls` / v2 `auth.lanes[].lane: "mtls"`. In OpenWOP
1343
-
1344
- mTLS is required *in addition to* a bearer, never instead of one, so it appears
1345
-
1346
- in no canonical requirement below: a host that requires it adds `MutualTLS: []`
1347
-
1348
- inside each requirement object (AND).
1349
-
1350
- '
1293
+ description: 'The mTLS lane (`auth.lanes[].lane: "mtls"`). mTLS is required *in addition to* a bearer, never instead
1294
+ of one, so it appears in no canonical requirement below. A host that requires it adds `MutualTLS: []` inside each
1295
+ requirement object (AND).'
1351
1296
  parameters:
1352
1297
  IdempotencyKey:
1353
1298
  in: header
@@ -1356,15 +1301,8 @@ components:
1356
1301
  schema:
1357
1302
  type: string
1358
1303
  maxLength: 255
1359
- description: 'Per-mutation idempotency token (see `idempotency.md` Layer 1).
1360
-
1361
- Server caches `(tenantId, endpoint, key)` → response for ≥24h.
1362
-
1363
- Duplicate requests return the cached response with header
1364
-
1365
- `OpenWOP-Idempotent-Replay: true`.
1366
-
1367
- '
1304
+ description: 'Per-mutation idempotency token (`idempotency.md` Layer 1). The server caches `(tenantId, endpoint, key)`
1305
+ → response for ≥24h. A duplicate request returns the cached response with `OpenWOP-Idempotent-Replay: true`.'
1368
1306
  WorkspacePath:
1369
1307
  in: path
1370
1308
  name: path
@@ -1372,13 +1310,8 @@ components:
1372
1310
  schema:
1373
1311
  type: string
1374
1312
  pattern: ^[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$
1375
- description: 'RFC 0059 workspace-relative file path. Flat namespace with
1376
-
1377
- `/`-in-names; no `..`, no leading `/`. Matches
1378
-
1379
- `workspace-file.schema.json#path`.
1380
-
1381
- '
1313
+ description: Workspace-relative file path in a flat namespace that allows `/` in names; no `..` and no leading `/`.
1314
+ Matches `workspace-file.schema.json#path`.
1382
1315
  WorkspacePrefix:
1383
1316
  in: query
1384
1317
  name: prefix
@@ -1386,7 +1319,7 @@ components:
1386
1319
  schema:
1387
1320
  type: string
1388
1321
  maxLength: 256
1389
- description: RFC 0059. Optional prefix filter over the flat `path` namespace for `listWorkspaceFiles`.
1322
+ description: Optional prefix filter over the flat `path` namespace for `listWorkspaceFiles`.
1390
1323
  WorkspaceVersion:
1391
1324
  in: query
1392
1325
  name: version
@@ -1394,11 +1327,8 @@ components:
1394
1327
  schema:
1395
1328
  type: integer
1396
1329
  minimum: 1
1397
- description: 'RFC 0059. When `capabilities.workspace.versioned: true`, request the
1398
-
1399
- historical snapshot at this version. Absent = latest.
1400
-
1401
- '
1330
+ description: 'When `capabilities.workspace.versioned: true`, requests the historical snapshot at this version. Absent
1331
+ means latest.'
1402
1332
  IfMatch:
1403
1333
  in: header
1404
1334
  name: If-Match
@@ -1406,11 +1336,8 @@ components:
1406
1336
  schema:
1407
1337
  type: string
1408
1338
  maxLength: 255
1409
- description: 'RFC 0059 optimistic-concurrency token — the file''s current `etag`.
1410
-
1411
- A `PUT` carrying a stale `If-Match` returns `409 workspace_conflict`.
1412
-
1413
- '
1339
+ description: 'Optimistic-concurrency token: the file''s current `etag`. A `PUT` carrying a stale `If-Match` returns
1340
+ `409 workspace_conflict`.'
1414
1341
  PackName:
1415
1342
  in: path
1416
1343
  name: name
@@ -1433,8 +1360,8 @@ components:
1433
1360
  description: Missing or invalid credential.
1434
1361
  headers:
1435
1362
  WWW-Authenticate:
1436
- description: RFC 0200 §B — `Bearer` challenge; `resource_metadata` and `error="invalid_token"` on a host with an
1437
- oauth2/oidc lane. Never on a non-disclosure 404.
1363
+ description: A `Bearer` challenge. On a host with an oauth2 or oidc lane it carries `resource_metadata` and `error="invalid_token"`.
1364
+ Never sent on a non-disclosure 404.
1438
1365
  schema:
1439
1366
  type: string
1440
1367
  content:
@@ -1445,8 +1372,8 @@ components:
1445
1372
  description: Credential valid but lacks required scope or fails resource binding.
1446
1373
  headers:
1447
1374
  WWW-Authenticate:
1448
- description: RFC 0200 §B — `error="insufficient_scope"` with every required `scope` on a scope refusal; absent on
1449
- a resource-binding 403.
1375
+ description: On a scope refusal, `error="insufficient_scope"` with every required `scope`. Absent on a resource-binding
1376
+ 403.
1450
1377
  schema:
1451
1378
  type: string
1452
1379
  content:
@@ -1469,13 +1396,8 @@ components:
1469
1396
  Error:
1470
1397
  $ref: ../schemas/v2/error-envelope.schema.json
1471
1398
  TestPackPublishRecord:
1472
- description: 'Response body for a successful publish against the test-mode
1473
-
1474
- registry namespace (RFC 0025). Mirror of the production publish
1475
-
1399
+ description: Response body for a successful publish to the test-mode registry namespace. Mirrors the production publish
1476
1400
  record returned by `PUT /v1/packs/{name}/-/{version}.tgz`.
1477
-
1478
- '
1479
1401
  type: object
1480
1402
  required:
1481
1403
  - name