@openwop/spec-artifacts 2.42.6 → 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 +187 -322
  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.6
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
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`.
284
243
 
285
- test catalog MUST be isolated per RFC 0025 §C — a pack PUT''d
286
244
 
287
- here MUST NOT appear in `GET /v1/packs/{name}` listings.
288
-
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:
@@ -653,14 +553,15 @@ paths:
653
553
  tags:
654
554
  - Seams
655
555
  operationId: appendEra2Event
656
- summary: Append a v2-named event to a seeded era-2 run through the host's production writer — RFC 0176 §A writer-rule
657
- witness
658
- description: 'The host MUST append the event through the SAME writer its own code uses for that run — the storage boundary
659
- that applies the writer rule (persistence.md §The writer rule) — and MUST NOT branch on the seam: an era-2 run stores
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
660
559
  the event under its v1 spelling (the codemap''s v1 side), so the production read returns the v2 `type` given here.
560
+
561
+
661
562
  The seam MUST refuse a `runId` that `seedEra2EventLog` did not create with `404`, exactly as for an unknown run, so
662
- it cannot inject into a real run; a terminal run answers `409 run_terminal`; a `type` that is not a v2 registry name
663
- answers `400`. Consumed by `v2-era-2-append-vocabulary`.'
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`.'
664
565
  requestBody:
665
566
  required: true
666
567
  content:
@@ -710,17 +611,16 @@ paths:
710
611
  tags:
711
612
  - Seams
712
613
  operationId: fireEffectSeam
713
- 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
714
615
  description: 'The host runs a workflow that drives the named seam once. The scenario then forks the run in `replay`
715
- mode and reads `GET /runs/{runId}/effects` on the fork: a GUARDED seam MUST NOT produce a new effect attempt there,
716
- because replay suppression is unconditional (`replay.md` §Suppression rule 1) and does not depend on `branchReFires`,
717
- which states only what a `branch` re-fires by design (§Branch: a host "MUST NOT report that as replay suppression").
718
- The witness is the host own Layer-2 ledger, so the leg needs no externally reachable receiver. Without this seam the
719
- replay-suppression obligation is only claims-checkable. HOW THE TARGET IS CHOSEN (suite 2.0.3): the scenario fires
720
- the first `GET /host/effect-seams` row with `guarded: true`, not every row, and records `inapplicable` without calling
721
- this operation at all when no row is guarded. Stated here because it is a contract an implementer cannot see from
722
- the request body — until 2.0.2 the filter also required `branchReFires: false`, and a host whose seams all honestly
723
- 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.'
724
624
  requestBody:
725
625
  required: true
726
626
  content:
@@ -734,12 +634,12 @@ paths:
734
634
  seam:
735
635
  type: string
736
636
  minLength: 1
737
- 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`.
738
638
  receiverUrl:
739
639
  type: string
740
640
  format: uri
741
- description: Optional destination for seams whose kind needs one. Omitted, the host uses its own unreachable
742
- 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.
743
643
  responses:
744
644
  '201':
745
645
  description: The run that fired the seam.
@@ -764,11 +664,10 @@ paths:
764
664
  tags:
765
665
  - Seams
766
666
  operationId: forceEffectTransportRetry
767
- summary: Drive one effect through the suite fixture provider with a forced transport retry — RFC 0173 §D.2 G4 witness
768
- description: 'The host issues one outbound effect to `providerUrl` and retries it at the transport layer. The suite
769
- fixture provider records the idempotency key of each attempt: a Layer-2 host MUST present the SAME business-identity
770
- key across both attempts, so a provider that sees a changed key fails the leg. Without this seam the effect-identity
771
- 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.
772
671
  requestBody:
773
672
  required: true
774
673
  content:
@@ -809,12 +708,11 @@ paths:
809
708
  tags:
810
709
  - Seams
811
710
  operationId: armIdempotencyHold
812
- 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
813
712
  description: 'Arms a single-use hold: the caller tenant''s next real `POST /runs` carrying `key` as its Idempotency-Key
814
713
  keeps its Layer-1 claim in flight for `holdMs` after claiming, then completes normally. The seam MUST NOT answer a
815
714
  create or emit a 409: the refusal a concurrent same-key create receives while the claim is held comes from the host''s
816
- production in-flight branch (idempotency.md §Concurrency). Keyed by (tenant, key); single-use; an unarmed key is never
817
- delayed.'
715
+ production in-flight branch (idempotency.md §Concurrency). Keyed by (tenant, key); an unarmed key is never delayed.'
818
716
  requestBody:
819
717
  required: true
820
718
  content:
@@ -858,10 +756,11 @@ paths:
858
756
  tags:
859
757
  - Seams
860
758
  operationId: receiveWebhookDelivery
861
- summary: Run a webhook delivery through the host's inbound receiver — RFC 0176 §D.2 witness
862
- description: The v2 host as a subscriber. The host verifies `headers` + `body` with its production verifier using `secret`
863
- as the subscription secret and reports the verdict; an `X-openwop-*`-only scheme-`v1` delivery over `{timestamp}.{rawBody}`
864
- 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.
865
764
  requestBody:
866
765
  required: true
867
766
  content:
@@ -907,19 +806,24 @@ paths:
907
806
  tags:
908
807
  - Seams
909
808
  operationId: emitA2uiSurface
910
- summary: Admit one `ui.a2ui-surface` envelope into a run through the production envelope-admission path — RFC 0209 witness
911
- description: 'A real `ui.a2ui-surface` envelope is emitted by a model inside a node turn, so the suite cannot choose
912
- one from the canonical wire. This seam supplies the envelope ONLY. The host MUST admit it through its PRODUCTION envelope-admission
913
- path — the envelope-kind catalog (`supportedEnvelopes`, `schemaVersions`, `envelopeStrictness`, events.md §"The envelope-kind
914
- catalog"), validation against the ONE per-kind branch the schema version selects (never the `anyOf` union), the RFC
915
- 0209 cross-field rules (every message `surfaceId` equals the payload `surfaceId`; a `createSurface.catalogId` equals
916
- the payload `catalogId`), the surface-fold guard (spec/v2/ext/a2uiSurface/README.md §"The fold"), trust propagation
917
- and SR-1 redaction — and MUST record it exactly as production would. It MUST NOT be a mock that records without those
918
- rules. `envelope.nodeId`, when present, binds the surface to that node, so a surface emitted at a node suspended on
919
- an `approval` interrupt is the surface whose `resume` action would resolve it (§"Trust": a tainted fold blocks that
920
- interrupt). Refusals use the canonical error envelope: `422 unknown_schema_version` above the floor or under `strict`
921
- below it, `422 envelope_invalid` for a payload that fails its branch, a cross-field rule or the fold guard, `422 unknown_envelope_kind`
922
- 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`,
923
827
  and the scenario records `inapplicable`.'
924
828
  requestBody:
925
829
  required: true
@@ -969,19 +873,23 @@ paths:
969
873
  tags:
970
874
  - Seams
971
875
  operationId: startOAuthAuthorization
972
- summary: Begin an authorization-code grant for the caller through the production authorization-URL builder — RFC 0199
973
- §A/§B witness
974
- description: 'Points `provider` at the given endpoints (the suite''s authorization-server double) — a test-only provider
975
- definition, or, with `connection`, the connection pack''s provider through the host''s PRODUCTION registration path,
976
- which runs the RFC 0199 §B.3 discovery and pins its tuple — and then begins an authorization-code grant for the AUTHENTICATED
977
- caller by calling the host''s PRODUCTION authorization-URL builder, returning the URL a user agent would be redirected
978
- to. The builder MUST be the one production uses (PKCE S256, a fresh `state` bound to the caller''s Subject and the
979
- provider, the provider''s fixed redirect URI, `iss` expectations, `resource` for an MCP reach); a seam that assembles
980
- its own URL measures a stub, and a bundle citing it MUST say which. The grant completes on the host''s PRODUCTION
981
- callback route, which the suite calls as the user agent. `redirectUri` is a probe: the host MUST ignore it (the redirect
982
- URI is fixed per provider, oauth.md rule 5). A refused grant — an MCP-reach provider with no `issuer`, `pkce: "unsupported"`,
983
- or discovered metadata that disagrees with the manifest or the pinned tuple — is `422 connection_auth_metadata_mismatch`
984
- 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`.'
985
893
  requestBody:
986
894
  required: true
987
895
  content:
@@ -1019,8 +927,8 @@ paths:
1019
927
  minLength: 1
1020
928
  connection:
1021
929
  $ref: ../schemas/v2/connection-pack-manifest.schema.json
1022
- description: A connection pack whose provider is reached as an MCP server (RFC 0199 §B); registered through
1023
- the production path.
930
+ description: A connection pack whose provider is reached as an MCP server; registered through the production
931
+ path.
1024
932
  redirectUri:
1025
933
  type: string
1026
934
  description: A probe the host MUST ignore.
@@ -1056,14 +964,13 @@ paths:
1056
964
  tags:
1057
965
  - Seams
1058
966
  operationId: expireOAuthAccessToken
1059
- summary: Expire the caller's stored access token for a provider so its next use refreshes — RFC 0199 §C.2(b) / RFC 0047
1060
- §C.3 witness
1061
- description: 'Marks the access token of the caller''s stored credential for `provider` expired. Nothing else: the next
1062
- node that uses it refreshes through the host''s PRODUCTION refresh path against the provider''s token endpoint (the
1063
- suite''s double, which decides whether the refresh token is still good). A terminal refresh failure then follows oauth.md
1064
- §Token lifecycle — `connector.auth-expired`, and either the node fails `connector_auth_expired` or, under `oauth.credentialInterrupt`,
1065
- it suspends on a `credential` interrupt with `reason: "expired"`. `404` when the caller holds no credential for the
1066
- 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.'
1067
974
  requestBody:
1068
975
  required: true
1069
976
  content:
@@ -1091,9 +998,9 @@ paths:
1091
998
  tags:
1092
999
  - Seams
1093
1000
  operationId: mintLaneCredential
1094
- 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
1095
1002
  description: 'Issues a new credential on `lane` (an advertised `auth.lanes[].lane` whose `revocation` is `next-request`;
1096
- 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
1097
1004
  it returns authenticates on the canonical API exactly as an ordinary one does. The suite uses it only to hold a credential
1098
1005
  it can then revoke: the revocation, and the refusal on the next request (`401 credential_revoked`), are production
1099
1006
  behaviour the seam does not simulate. A host that has not wired the seam answers `404`, and the scenario records the
@@ -1136,8 +1043,7 @@ paths:
1136
1043
  - kind
1137
1044
  description: 'How the suite presents `credential` on the canonical API. Absent ⇒ bearer. A lane whose
1138
1045
  production credential is cookie-borne (a `session` lane) answers `{ kind: "cookie", name }`, and the
1139
- suite sends `Cookie: <name>=<credential>`. Added so a cookie lane that honours `next-request` revocation
1140
- can be witnessed without advertising a false rule.'
1046
+ suite sends `Cookie: <name>=<credential>`.'
1141
1047
  properties:
1142
1048
  kind:
1143
1049
  type: string
@@ -1147,7 +1053,7 @@ paths:
1147
1053
  name:
1148
1054
  type: string
1149
1055
  pattern: ^[!#$%&'*+.^_`|~0-9A-Za-z-]+$
1150
- 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`.
1151
1057
  if:
1152
1058
  properties:
1153
1059
  kind:
@@ -1170,8 +1076,8 @@ paths:
1170
1076
  tags:
1171
1077
  - Seams
1172
1078
  operationId: revokeLaneCredential
1173
- summary: Revoke a credential the mint seam issued — RFC 0170 §B.3 witness
1174
- 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
1175
1081
  request presenting it MUST be refused `401 credential_revoked` (identity.md §2.2); the suite observes that on the
1176
1082
  canonical API, not through this seam. `404` when no active credential matches.
1177
1083
  requestBody:
@@ -1217,16 +1123,25 @@ paths:
1217
1123
  tags:
1218
1124
  - Seams
1219
1125
  operationId: getTranscriptWindow
1220
- summary: The host's own accounting of what it fed the model on one orchestrator turn — RFC 0111 witness
1221
- description: 'The orchestrator transcript a host assembles each iteration is host-internal and never crosses the wire.
1222
- This seam returns what the host fed the model on turn `iteration` of `runId`: `tokenCount` in the advertised `contextBudget.tokenCounter`
1223
- unit (MUST be ≤ `transcriptTokenBudget`), `eventIds` (the verbatim recent tail, in event-log order), `summarizedRanges`,
1224
- and `entries[] { eventId, rendered }` — the exact text fed per item, REQUIRED when `tokenCounter` is `chars` so the
1225
- suite can sum the rendered Unicode code points and require it to equal `tokenCount`. A summary substitution''s entry
1226
- names its `context.summarized` event and renders the summary text. Served in test mode only; `rendered` MUST NOT carry
1227
- secret material (SR-1). The ceiling is advertise-and-attest: the seam proves the declared accounting is consistent
1228
- and bounded, not that nothing else reached the model. A turn past the run''s last answers `400`/`422`; an unwired
1229
- 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`.'
1230
1145
  parameters:
1231
1146
  - name: runId
1232
1147
  in: query
@@ -1312,28 +1227,13 @@ components:
1312
1227
  type: http
1313
1228
  scheme: bearer
1314
1229
  bearerFormat: API key
1315
- description: 'openwop API key. Format implementation-defined; reference impl uses `hk_`/`hk_test_` prefixes.
1316
-
1317
- Each key carries one or more scopes from the canonical vocabulary
1318
-
1319
- (`manifest:read`, `runs:create`, `runs:read`, `runs:cancel`,
1320
-
1321
- `artifacts:read`, `webhooks:manage`, `approvals:respond`, `audit:read`).
1322
-
1323
- See `auth.md`.
1324
-
1325
- '
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`.
1326
1233
  OAuth2:
1327
1234
  type: oauth2
1328
- description: 'RFC 0200 §F. OAuth 2.0 lanes — v1 `openwop-auth-oauth2-client-credentials`,
1329
-
1330
- v2 `auth.lanes[].lane: "oauth2"`. Discovery is RFC 9728 Protected Resource
1331
-
1332
- Metadata at the path-inserted well-known URI (`identity.md` §2.5).
1333
-
1334
- Placeholder URLs.
1335
-
1336
- '
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.'
1337
1237
  flows:
1338
1238
  clientCredentials:
1339
1239
  tokenUrl: https://issuer.example/oauth2/token
@@ -1385,26 +1285,14 @@ components:
1385
1285
  OpenIdConnect:
1386
1286
  type: openIdConnect
1387
1287
  openIdConnectUrl: https://issuer.example/.well-known/openid-configuration
1388
- description: 'RFC 0200 §F. v1 `openwop-auth-oidc-user-bearer` / v2 `auth.lanes[].lane: "oidc"`.
1389
-
1390
- An ID token MAY be the bearer only when its `aud` equals the host''s configured
1391
-
1392
- audience (`identity.md` §2.1); any other `aud` is `audience_mismatch`.
1393
-
1394
- Placeholder URL.
1395
-
1396
- '
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.'
1397
1291
  MutualTLS:
1398
1292
  type: mutualTLS
1399
- description: 'RFC 0200 §F. v1 `openwop-auth-mtls` / v2 `auth.lanes[].lane: "mtls"`. In OpenWOP
1400
-
1401
- mTLS is required *in addition to* a bearer, never instead of one, so it appears
1402
-
1403
- in no canonical requirement below: a host that requires it adds `MutualTLS: []`
1404
-
1405
- inside each requirement object (AND).
1406
-
1407
- '
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).'
1408
1296
  parameters:
1409
1297
  IdempotencyKey:
1410
1298
  in: header
@@ -1413,15 +1301,8 @@ components:
1413
1301
  schema:
1414
1302
  type: string
1415
1303
  maxLength: 255
1416
- description: 'Per-mutation idempotency token (see `idempotency.md` Layer 1).
1417
-
1418
- Server caches `(tenantId, endpoint, key)` → response for ≥24h.
1419
-
1420
- Duplicate requests return the cached response with header
1421
-
1422
- `OpenWOP-Idempotent-Replay: true`.
1423
-
1424
- '
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`.'
1425
1306
  WorkspacePath:
1426
1307
  in: path
1427
1308
  name: path
@@ -1429,13 +1310,8 @@ components:
1429
1310
  schema:
1430
1311
  type: string
1431
1312
  pattern: ^[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$
1432
- description: 'RFC 0059 workspace-relative file path. Flat namespace with
1433
-
1434
- `/`-in-names; no `..`, no leading `/`. Matches
1435
-
1436
- `workspace-file.schema.json#path`.
1437
-
1438
- '
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`.
1439
1315
  WorkspacePrefix:
1440
1316
  in: query
1441
1317
  name: prefix
@@ -1443,7 +1319,7 @@ components:
1443
1319
  schema:
1444
1320
  type: string
1445
1321
  maxLength: 256
1446
- 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`.
1447
1323
  WorkspaceVersion:
1448
1324
  in: query
1449
1325
  name: version
@@ -1451,11 +1327,8 @@ components:
1451
1327
  schema:
1452
1328
  type: integer
1453
1329
  minimum: 1
1454
- description: 'RFC 0059. When `capabilities.workspace.versioned: true`, request the
1455
-
1456
- historical snapshot at this version. Absent = latest.
1457
-
1458
- '
1330
+ description: 'When `capabilities.workspace.versioned: true`, requests the historical snapshot at this version. Absent
1331
+ means latest.'
1459
1332
  IfMatch:
1460
1333
  in: header
1461
1334
  name: If-Match
@@ -1463,11 +1336,8 @@ components:
1463
1336
  schema:
1464
1337
  type: string
1465
1338
  maxLength: 255
1466
- description: 'RFC 0059 optimistic-concurrency token — the file''s current `etag`.
1467
-
1468
- A `PUT` carrying a stale `If-Match` returns `409 workspace_conflict`.
1469
-
1470
- '
1339
+ description: 'Optimistic-concurrency token: the file''s current `etag`. A `PUT` carrying a stale `If-Match` returns
1340
+ `409 workspace_conflict`.'
1471
1341
  PackName:
1472
1342
  in: path
1473
1343
  name: name
@@ -1490,8 +1360,8 @@ components:
1490
1360
  description: Missing or invalid credential.
1491
1361
  headers:
1492
1362
  WWW-Authenticate:
1493
- description: RFC 0200 §B — `Bearer` challenge; `resource_metadata` and `error="invalid_token"` on a host with an
1494
- 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.
1495
1365
  schema:
1496
1366
  type: string
1497
1367
  content:
@@ -1502,8 +1372,8 @@ components:
1502
1372
  description: Credential valid but lacks required scope or fails resource binding.
1503
1373
  headers:
1504
1374
  WWW-Authenticate:
1505
- description: RFC 0200 §B — `error="insufficient_scope"` with every required `scope` on a scope refusal; absent on
1506
- a resource-binding 403.
1375
+ description: On a scope refusal, `error="insufficient_scope"` with every required `scope`. Absent on a resource-binding
1376
+ 403.
1507
1377
  schema:
1508
1378
  type: string
1509
1379
  content:
@@ -1526,13 +1396,8 @@ components:
1526
1396
  Error:
1527
1397
  $ref: ../schemas/v2/error-envelope.schema.json
1528
1398
  TestPackPublishRecord:
1529
- description: 'Response body for a successful publish against the test-mode
1530
-
1531
- registry namespace (RFC 0025). Mirror of the production publish
1532
-
1399
+ description: Response body for a successful publish to the test-mode registry namespace. Mirrors the production publish
1533
1400
  record returned by `PUT /v1/packs/{name}/-/{version}.tgz`.
1534
-
1535
- '
1536
1401
  type: object
1537
1402
  required:
1538
1403
  - name