@openwop/spec-artifacts 2.0.12 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CORPUS-STAMP.json CHANGED
@@ -1,17 +1,17 @@
1
1
  {
2
2
  "_comment": "Provenance of @openwop/spec-artifacts (RFC 0168 §D.2). files: SHA-256 per file; the conformance suite compares the installed peer against dist/spec-artifacts.lock.json at start.",
3
3
  "package": "@openwop/spec-artifacts",
4
- "version": "2.0.12",
5
- "corpusTag": "v2.0.12",
4
+ "version": "2.1.0",
5
+ "corpusTag": "v2.1.0",
6
6
  "files": {
7
7
  "api/.redocly.lint-ignore.yaml": "bf5a8350b88a72fa43f59605ed8d903ed24b6cfccda5e45509c9f6ed9ee4e712",
8
8
  "api/asyncapi.yaml": "d5ecb9ee6114582be3b1f662c84bfac9ae96dae7bacb853e461168f70a8e1c7d",
9
9
  "api/grpc/openwop.proto": "c3e72bb17cba514ee98feb6434e6c9b6ea6795bfd086489ec69fd882dd1ad977",
10
10
  "api/openapi.yaml": "39081c59fb696159806b0f2f9a42e7e9ff830d622fcf2ad4159b21357580a955",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "f6da331643d0cc8bd182d50a42a0c84b0ad649c5622b6bcb7958abea4e3db884",
13
- "api/v2/asyncapi.yaml": "ea69ad935eb5013d7d5cf40693bbc8612c0dc538e213507846ac89bf7b91e76f",
14
- "api/v2/openapi.yaml": "699df6886f386ff4505237293ab8a7a3d26884f875232626ebd0d51641cd2604",
12
+ "api/seams-v2.yaml": "bf40af2260e55099ac68020a51f6d931ebca05f3bf385bc76cf57ad1d65d50a8",
13
+ "api/v2/asyncapi.yaml": "26a4a9a3a1f3ecf3a7e6e559941872877461b6677f2b0e0bb187332aec56d069",
14
+ "api/v2/openapi.yaml": "ec983d886bf26e1fc2f52ff456ce44e145b601ac1420e8a490bcee7a23fcdd0f",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
@@ -115,7 +115,7 @@
115
115
  "schemas/v2/artifact-type-pack-manifest.schema.json": "85630d1b760d0b41cf5a6fad2acfada39abaf7f0befd95cc4334e1e883e9615d",
116
116
  "schemas/v2/audit-verify-result.schema.json": "a748dfadb5155adfde8a91045e76b0db6695005fe559035d71670fdd55edb3ba",
117
117
  "schemas/v2/budget-policy.schema.json": "c7449daeb6e1d95e7a047b8c2814d3d54748697c27046972834874867d9b5f4c",
118
- "schemas/v2/capabilities.schema.json": "0d9ca9e3f89a826a1247d295aa4b762e92d550daa5d835d3269f2a1bf1f4faaf",
118
+ "schemas/v2/capabilities.schema.json": "7b9c3853c4792f8242babfd70d6336a2ec365d4702944701e833ee5d45445ff5",
119
119
  "schemas/v2/certification-bundle.schema.json": "d2cbc5cadddff13630a528dc9673162f582c035c6a6663ca02c1ac53e8fec40c",
120
120
  "schemas/v2/channel-presence-payload.schema.json": "9475d46f358d21c19126e78204987a5633979917a2293653354ef5c5e044d54e",
121
121
  "schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
@@ -171,6 +171,7 @@
171
171
  "schemas/v2/run-diff-response.schema.json": "8bdb2045c274580038bd74781f7d062f5049839797c164a89de4ed89edc53a74",
172
172
  "schemas/v2/run-event-payloads.schema.json": "1d3ccffc4e506d3109c17990e01976ba935e61672562684b9635743d56af3f57",
173
173
  "schemas/v2/run-event.schema.json": "1a9946374af9323b71635d00fed22abe02c300fa2cf3ae3e9c30f3e553e408ec",
174
+ "schemas/v2/run-list-response.schema.json": "c2dbc34768dcf64528914a213aa3cb55952e8e3e90a64b04a9423b2a19749d38",
174
175
  "schemas/v2/run-options.schema.json": "f0e9f494d80086c2ed2cf9fe87df54e5b4e66601699c4a1089f4edbc7ba58867",
175
176
  "schemas/v2/run-orchestrator-decided-event.schema.json": "bb76e15ff72e669f12938684033b55dc567470e1a378e19ffc3fa0e4034ab5a7",
176
177
  "schemas/v2/run-snapshot.schema.json": "65a3c82220da2e1a54324665d517dc0e627225f3d37ef75b43bef3fb7e3bac0e",
@@ -199,7 +200,7 @@
199
200
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
200
201
  "spec/v1/alias-detectors.json": "fee4594ef49953953ffcd0b3813300067d16b3e65ebff2aac722034ac9b3f545",
201
202
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
202
- "spec/v1/core-standard-manifest.json": "681b4288007e770595e299aeca2d08419a7696be2d151fb9fd152f49255b25c4",
203
+ "spec/v1/core-standard-manifest.json": "2e1962fac9303bf8c6e8c74998312548f09383a0a83043743894de360775809c",
203
204
  "spec/v1/deprecations.json": "1d5acb69a9b8ccb57275a95605f74aef1d920685f8407c9d382a46b59dc803bb",
204
205
  "spec/v1/deprecations.schema.json": "18c87e78bedc210431f795ae44c5b5d202f2f3317850d5cf86867d4f1fa1cdfb",
205
206
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
@@ -211,28 +212,28 @@
211
212
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
212
213
  "spec/v1/operation-path-manifest.json": "5f5f4e3842669371730ebbd1aace3fb794192615f0018dc144f484ba5db82ac3",
213
214
  "spec/v1/spec-gaps.json": "6cc9962c6b969f632e07a78b52a4f61447ff579e2990cbae989866f584a86042",
214
- "spec/v2/README.md": "87f3eb080264011032cc273cfc87f434d1e660e43380f0f1f5d753605fffb835",
215
- "spec/v2/core/capabilities.md": "8151e42762b8c079b98251cd73231f792c708004c5e9e980b674db7bda491851",
216
- "spec/v2/core/conformance.md": "fde584474ed3934b02ff7bb1e5d1c7fbdd05c465f8430a945ff7aa1c3f72401f",
217
- "spec/v2/core/connection-packs.md": "72aa432037b004883cb6956f54fa9f1d8bc154c27e7dde54d940864d48885957",
218
- "spec/v2/core/errors.md": "0dce8fbff69f3519b775fe4d2fba52bb21d33cb62735c96872bb4b7aed43eb97",
219
- "spec/v2/core/events.md": "dfa65dc347e3e8c76067b4014aff10f5dc308f43b2346a9e91277854e7d91e55",
220
- "spec/v2/core/form-content-packs.md": "8db449943e5683bcea1bae84d0d2f5268ce1ba63439d949102f3f0811f95b215",
221
- "spec/v2/core/headers.md": "90f9ceb993444e5255c562bc1dd2978f030167a3c35cc2c44a99fef0a371f7cb",
222
- "spec/v2/core/idempotency.md": "a580258c5c9d6b1adb05b43de90b055f1ce7f79856cdea40f2d02806fd792e77",
223
- "spec/v2/core/identity.md": "dd29dc95bb58ef57583f540b03d5d722d2c9f7a7c6e8412fd1d19e64191d1a85",
224
- "spec/v2/core/interop.md": "3beb10f9bace3bc650f14e96dcf4927917448950e90e31d9652abe7cb2cf5515",
225
- "spec/v2/core/interrupt.md": "8801f6b0b97ba653298aeaffe6957b58e7018bc175b9705e170e69831ef9b273",
226
- "spec/v2/core/overview.md": "0e941660227d1526411f30822da128969312aa2d60318fcbcadad497a9aa54d9",
227
- "spec/v2/core/packs.md": "ef1dcf9142427f68d781dd8babc35f4b5e0601130a40ac6efc007f7008f1467c",
228
- "spec/v2/core/persistence.md": "aa34d7218839d856cfe61e67b0422914013b17f51c5f582a7f92795d0ee7daf7",
229
- "spec/v2/core/replay.md": "c2c9d30e9ff04554dc5b6879b66e78e7b748038ffccf2329063981a618111e1c",
230
- "spec/v2/core/runs.md": "01f4a979a91fa7a9066b5982d022656464b6c2aba81403a91c521e9e8511d80d",
231
- "spec/v2/core/security-defaults.md": "0cd30b1a166d3516182f6ad68c86ea27c11b04ba072cd739cc50b4d5c516c89b",
232
- "spec/v2/core/versioning.md": "7e99def44c8149414b9b465cf280f470b1b0db37c37a83e49e8dbeae502dc65c",
233
- "spec/v2/core/webhooks.md": "0642953ca6f56fe52bcf5ebceb66badd05234a8476b46bc5c59e01eebfbad8ff",
234
- "spec/v2/core/workflow-chain-packs.md": "8ffa8c18c7b721d922f0a506d75fc5c407f1e561b78ebfd92c502bb0efca03b1",
235
- "spec/v2/declaration.json": "b99a9cd43228af06e0cc63a170b3e1a7acda3e4ac4f4906a578ac51cee494c23",
215
+ "spec/v2/README.md": "7ae852012806ffaab24a5586e5eac107f0bc7b4932f278a93e4b549fcbba56ee",
216
+ "spec/v2/core/capabilities.md": "c5107a4964e487c20bbb5254cfe1f706e0d9ba7e34da9070bc43b50b385e7948",
217
+ "spec/v2/core/conformance.md": "622084e3c74c4549087f4d861b1bb98cec201a0c5aec23788d27f53a355fde3b",
218
+ "spec/v2/core/connection-packs.md": "1d759681e2962f5103228c52c45f24607ed4bb9ae73e30605f690c1d5a59e9ee",
219
+ "spec/v2/core/errors.md": "74fdb5862f432a831cf0c2eadbe0c8cca6b2660ec578180ae33db54773a1df28",
220
+ "spec/v2/core/events.md": "defe0969d6ec7c980f415cc0d78b9d065782ac7e5638b12a44aa4895a35d6126",
221
+ "spec/v2/core/form-content-packs.md": "6ffaae85d4550be48dd53fb6e2959af8aceb35bd87c5343b722885084f197713",
222
+ "spec/v2/core/headers.md": "9e307d2c6ce8a2f91802a753adfd245fd3d10cdc9135e021e76f461f92b866fb",
223
+ "spec/v2/core/idempotency.md": "b86c352d964aebad532727f314e26ed2177d49de382076fa64d3162e2f56118d",
224
+ "spec/v2/core/identity.md": "dd5299f9cdf54640870e1fffae11edb820cf6396ea298c4ebd14c649c4bd4a87",
225
+ "spec/v2/core/interop.md": "d4c404e469e1d9d9be88bc2c939d777e7d7c1d0419b1251c18770f039838a401",
226
+ "spec/v2/core/interrupt.md": "d872e0652a938594eeb2a19e86cf64e64e29b234f5d9c4fbe2970ab5fb191b9c",
227
+ "spec/v2/core/overview.md": "69377c90bbb87b6bfe4b8be4f1b65810094b0759c8d4f93ca6df92cc530ea023",
228
+ "spec/v2/core/packs.md": "e72a7586a61630cdfd342eaf84e989f864b3e199006f5511ef59ea7c1a1c56f7",
229
+ "spec/v2/core/persistence.md": "2373c2815b25b7b4fe29dfdf3783d3f2f3e637d3abce5085e69f019546302fb6",
230
+ "spec/v2/core/replay.md": "bd191a2565aa7ad0df9b35a0716f3de53be34b8722f1807c5e5b02859404a9b9",
231
+ "spec/v2/core/runs.md": "f7a95fc82fda5b7c0c613de6e5edd376bbd6d8ba4c665a500c94eacbe42b86f2",
232
+ "spec/v2/core/security-defaults.md": "1d38aa03b9d2507f1d4a985333cc57ae7892cecc7356f6342fbd1672e34f638a",
233
+ "spec/v2/core/versioning.md": "d731782eeabb953919c7c7057340b7f9c2916b6186790e6b04c7d8ea60767189",
234
+ "spec/v2/core/webhooks.md": "d360da78336afa837bddf515e289e445808bca02e1e4b493f81fa51ce4a545c4",
235
+ "spec/v2/core/workflow-chain-packs.md": "ef2b07d2d99334eaec0cc370314e2ad2f84ea58deb699e5d92e6e52d6056613f",
236
+ "spec/v2/declaration.json": "63dd351a87439241bc744ce62fdc498b7621292c11a4ad42c3f41429d72366b9",
236
237
  "spec/v2/declaration.schema.json": "eac5f8080bd572f147bd57d0c4ac8ad73b14536d9236222490ae29a33b21e184",
237
238
  "spec/v2/errors.json": "f179414a92f30b5dadf26e9e57699649a67324bd7186d5287647d17605d137d3",
238
239
  "spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
@@ -262,14 +263,15 @@
262
263
  "spec/v2/facets/interrupt.schema.json": "c76c58c0abd99de619f8c8afad246568f5bc9cce3b7a0d097d16d87eba84be3a",
263
264
  "spec/v2/facets/mcp.schema.json": "f56609fe24ba6160ad29ae31aa16043354ff005e5cb6a0f3871c4d226087cc08",
264
265
  "spec/v2/facets/replay.schema.json": "0a5aefb0108c708c6794fadd533cf256709704c4f16dbf44cd63fa8980c78018",
266
+ "spec/v2/facets/runList.schema.json": "6223e1baaebbb9f4faa71bfe968f8d22b4aa88046d0e43e8d5f56409e7f86e90",
265
267
  "spec/v2/facets/sandbox.schema.json": "e75f54486d387b2d089791aa93b5093cd1450f1920753a0f97fc23acdfe978ed",
266
268
  "spec/v2/facets/webhooks.schema.json": "0b766033ef4b4c6c2ac6f9979a19843ba024d3a1d1576972dcb55aaba52f1b9a",
267
269
  "spec/v2/id-field-bindings.json": "d9d1f8e266660b581f11020b9511a65c677e026b1a71ada870682ad77e18555d",
268
- "spec/v2/path-manifest.json": "034152e09b1458c66810d4050e20a273b2b9b8fe2d92b66e8b819477de58a1be",
270
+ "spec/v2/path-manifest.json": "a6f4e652e866889e8bde815874062f62929aee95dc8e58e7152c56adee262163",
269
271
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
270
272
  "spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
271
- "spec/v2/release.json": "a9e8f39bdccd099e6b57d0f114997f79177f7dce21b7d764b42e9a25d1aa1101",
273
+ "spec/v2/release.json": "4eea9fc280f05634fe3d5343252ce511267e61a981c30aac3d9491963f06ab18",
272
274
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
273
275
  },
274
- "corpusCommit": "489c36a5fb4832588dcfbc6d6e736a531a772b6d"
276
+ "corpusCommit": "1486657cb7efe8d010cfeec54498aa547e97a981"
275
277
  }
package/api/seams-v2.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP conformance seams profile (openwop-conformance-seams-v2)
4
- version: 2.0.12
4
+ version: 2.1.0
5
5
  description: 'GENERATED by scripts/derive-v2-api.py. RFC 0168 §C: the seams are a versioned conformance profile with their
6
6
  own document and path space (/conformance/seams/…), validated against the canonical v2 schemas with no tolerance path,
7
7
  forbidden from the capability namespace (a host advertises the profile, never a testSeams flag). This document carries
@@ -1,7 +1,7 @@
1
1
  asyncapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 event streams
4
- version: 2.0.12
4
+ version: 2.1.0
5
5
  description: GENERATED by scripts/derive-v2-api.py (RFC 0171 §E.1, RFC 0172 §C.2). One run-events channel whose address
6
6
  is the OpenAPI path key; the server pathname is empty (bare origin). streamMode is a pattern over the closed set and its
7
7
  comma-separated combinations (`values` never combines). hostEvents has a real address (RFC 0171 §E.1) — the documented
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 API
4
- version: 2.0.12
4
+ version: 2.1.0
5
5
  summary: REST surface for declaring, executing, suspending, resuming, and observing multi-step workflows.
6
6
  description: GENERATED by scripts/derive-v2-api.py from api/openapi.yaml and the RFC 0167 children (v2 charter Phase 3,
7
7
  P3-C). Bare origin, unversioned path keys, negotiation by `OpenWOP-Version` + `protocolVersions[]` (RFC 0172 §A). No seam
@@ -339,6 +339,71 @@ paths:
339
339
  $ref: '#/components/schemas/RunClaimConflict'
340
340
  '429':
341
341
  $ref: '#/components/responses/RateLimited'
342
+ get:
343
+ tags:
344
+ - Runs
345
+ operationId: listRuns
346
+ summary: The caller's runs, newest first, cursor-paginated (RFC 0182)
347
+ description: 'Tenant-scoped by construction: only runs whose tenant segment is the caller''s, every runId bound (identity.md
348
+ §5). Gated on the `runList` family — 404 not_found when unadvertised. `limit` is honoured up to `runList.maxPageSize`;
349
+ `cursor` is opaque and a cursor the host did not mint is 400 validation_error; `workflowId` and `status` are exact-match
350
+ filters when `runList.filters` names them (an unadvertised filter is ignored).'
351
+ parameters:
352
+ - name: limit
353
+ in: query
354
+ required: false
355
+ schema:
356
+ type: integer
357
+ minimum: 1
358
+ description: Page size; clamped to runList.maxPageSize.
359
+ - name: cursor
360
+ in: query
361
+ required: false
362
+ schema:
363
+ type: string
364
+ minLength: 1
365
+ maxLength: 2048
366
+ description: Opaque cursor from a previous page's nextCursor.
367
+ - name: workflowId
368
+ in: query
369
+ required: false
370
+ schema:
371
+ $ref: ../../schemas/v2/ids.schema.json#/$defs/workflowId
372
+ description: Exact-match filter (when advertised in runList.filters).
373
+ - name: status
374
+ in: query
375
+ required: false
376
+ schema:
377
+ type: string
378
+ enum:
379
+ - pending
380
+ - running
381
+ - paused
382
+ - waiting-approval
383
+ - waiting-input
384
+ - waiting-external
385
+ - completed
386
+ - failed
387
+ - cancelling
388
+ - cancelled
389
+ description: Exact-match filter (when advertised in runList.filters).
390
+ - $ref: '#/components/parameters/OpenWOPVersion'
391
+ responses:
392
+ '200':
393
+ description: One page of the caller's runs.
394
+ content:
395
+ application/json:
396
+ schema:
397
+ $ref: ../../schemas/v2/run-list-response.schema.json
398
+ headers:
399
+ OpenWOP-Version:
400
+ $ref: '#/components/headers/OpenWOPVersion'
401
+ '400':
402
+ $ref: '#/components/responses/ValidationError'
403
+ '401':
404
+ $ref: '#/components/responses/Unauthenticated'
405
+ '404':
406
+ $ref: '#/components/responses/NotFound'
342
407
  /runs/{runId}:
343
408
  get:
344
409
  tags:
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.0.12",
4
- "description": "The OpenWOP machine-readable contract: api/ (OpenAPI, AsyncAPI, the seams profile), schemas/ (v1 and v2 JSON Schemas), the spec/v1 and spec/v2 registries (errors, event codemap, declaration, deprecations, migrations, gaps) and CORPUS-STAMP.json \u2014 published from the openwop/openwop corpus tag; the peer dependency @openwop/openwop-conformance digest-checks at start (RFC 0168 \u00a7D.2).",
3
+ "version": "2.1.0",
4
+ "description": "The OpenWOP machine-readable contract: api/ (OpenAPI, AsyncAPI, the seams profile), schemas/ (v1 and v2 JSON Schemas), the spec/v1 and spec/v2 registries (errors, event codemap, declaration, deprecations, migrations, gaps) and CORPUS-STAMP.json — published from the openwop/openwop corpus tag; the peer dependency @openwop/openwop-conformance digest-checks at start (RFC 0168 §D.2).",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
7
7
  "type": "git",
@@ -7612,6 +7612,95 @@
7612
7612
  "description": "core/capabilities.md#portability — witness: witnessable-gated; maturity experimental/none; RFC 0098",
7613
7613
  "x-openwop-seeded-from": "v1"
7614
7614
  },
7615
+ "runList": {
7616
+ "type": "object",
7617
+ "additionalProperties": false,
7618
+ "required": [
7619
+ "status",
7620
+ "since",
7621
+ "witness",
7622
+ "maxPageSize"
7623
+ ],
7624
+ "properties": {
7625
+ "status": {
7626
+ "enum": [
7627
+ "stable",
7628
+ "experimental",
7629
+ "deprecated"
7630
+ ]
7631
+ },
7632
+ "since": {
7633
+ "type": "string",
7634
+ "pattern": "^(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)$"
7635
+ },
7636
+ "until": {
7637
+ "type": "string",
7638
+ "pattern": "^((0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)|\\d{4}-\\d{2}-\\d{2})$"
7639
+ },
7640
+ "witness": {
7641
+ "enum": [
7642
+ "witnessable-unaided",
7643
+ "witnessable-gated",
7644
+ "seam-gated",
7645
+ "claims-check",
7646
+ "negative-existence"
7647
+ ]
7648
+ },
7649
+ "maxPageSize": {
7650
+ "type": "integer",
7651
+ "minimum": 1,
7652
+ "maximum": 1000
7653
+ },
7654
+ "filters": {
7655
+ "type": "array",
7656
+ "uniqueItems": true,
7657
+ "items": {
7658
+ "type": "string",
7659
+ "enum": [
7660
+ "workflowId",
7661
+ "status"
7662
+ ]
7663
+ }
7664
+ }
7665
+ },
7666
+ "allOf": [
7667
+ {
7668
+ "if": {
7669
+ "properties": {
7670
+ "status": {
7671
+ "const": "stable"
7672
+ }
7673
+ }
7674
+ },
7675
+ "then": {
7676
+ "not": {
7677
+ "required": [
7678
+ "until"
7679
+ ]
7680
+ }
7681
+ }
7682
+ },
7683
+ {
7684
+ "if": {
7685
+ "properties": {
7686
+ "status": {
7687
+ "enum": [
7688
+ "experimental",
7689
+ "deprecated"
7690
+ ]
7691
+ }
7692
+ }
7693
+ },
7694
+ "then": {
7695
+ "required": [
7696
+ "until"
7697
+ ]
7698
+ }
7699
+ }
7700
+ ],
7701
+ "description": "core/capabilities.md#runList — witness: witnessable-gated; maturity experimental/none; RFC 0182",
7702
+ "x-openwop-facets-from": "spec/v2/facets/runList.schema.json"
7703
+ },
7615
7704
  "interrupt": {
7616
7705
  "type": "object",
7617
7706
  "additionalProperties": false,
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://openwop.dev/spec/v2/run-list-response.schema.json",
4
+ "title": "RunListResponse",
5
+ "description": "RFC 0182. Response body for `GET /runs` (`listRuns`): one page of the caller's runs as full `RunSnapshot`s, newest first by default, with an opaque cursor for the next page when there is one. Every `runId` is tenant-bound (identity.md §5); a host MUST NOT return more rows than its advertised `runList.maxPageSize`.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["runs"],
9
+ "properties": {
10
+ "runs": {
11
+ "type": "array",
12
+ "description": "The page. Empty when the caller has no runs matching the filters.",
13
+ "items": {
14
+ "$ref": "run-snapshot.schema.json"
15
+ }
16
+ },
17
+ "nextCursor": {
18
+ "type": "string",
19
+ "minLength": 1,
20
+ "maxLength": 2048,
21
+ "description": "Opaque host-minted cursor for the next page. Absent on the last page. A host MUST refuse a cursor it did not mint with 400 validation_error."
22
+ }
23
+ }
24
+ }
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.0.12"
7
+ "version": "2.1.0"
8
8
  },
9
9
  "note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
10
10
  },
@@ -419,5 +419,5 @@
419
419
  "$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
420
420
  }
421
421
  ],
422
- "digest": "41185d10ecae45ef7ddd66ddf701a00d6bf60148d4dbd6352146d480b71c4cc4"
422
+ "digest": "8727f890d02f380569cabf77782cee88948f5bdd754c22877fef73d00c2be725"
423
423
  }
package/spec/v2/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # `spec/v2/` — the OpenWOP v2 tree (the current protocol major)
2
2
 
3
- > **Status: released.** v2 is the current protocol major — `v2.0.0` was tagged 2026-09-05 and this tree is at corpus `v2.0.12` (`release.json`). Everything under `spec/v2/`, `schemas/v2/` and `api/v2/` is normative, is vendored into `@openwop/spec-artifacts`, and is what `@openwop/openwop-conformance` 2.x measures. A new integration targets v2.
3
+ > **Status: released.** v2 is the current protocol major — `v2.0.0` was tagged 2026-09-05 and this tree is at corpus `v2.1.0` (`release.json`). Everything under `spec/v2/`, `schemas/v2/` and `api/v2/` is normative, is vendored into `@openwop/spec-artifacts`, and is what `@openwop/openwop-conformance` 2.x measures. A new integration targets v2.
4
4
  >
5
5
  > **v1 is not retired.** Through the overlap a host advertises both majors and `preferredVersion` MUST remain a `1.x` member (`core/versioning.md` §1.1); v1 clients keep working unchanged on `/v1/…`. v1 end-of-support is the later of two clocks in `core/overview.md`, earliest 2026-12-04, and until then `spec/v1/` stays the maintained parallel track. A `1.x` conformance tarball still excludes this tree (`conformance/scripts/pack-vendor.sh`).
6
6
  >
@@ -1,6 +1,6 @@
1
1
  # Discovery and Capabilities
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0169, 0176, 0179.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0169, 0176, 0179.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -265,7 +265,7 @@ Witness `witnessable-gated`; owner RFC 0083.
265
265
 
266
266
  Witness `seam-gated`; owner RFC 0152; facets `versions`, `preferredVersion`, `minimumVersion`, `refreshedAt`, `profiles`, `agentCardUrl`, `streaming`, `pushNotifications`, `durableTasks`.
267
267
 
268
- **A facet MAY name a URL on another origin; that is a claim about the facet, not the origin.** `agentCardUrl` (and `mcp.serverUrls[]`) are `format: uri` with no origin constraint. The advertiser claims to know where the card is — not that the named origin serves `/.well-known/openwop`, speaks any major, or is measured by its bundle; the suite exercises the advertiser only. Certification is per origin: a second origin with its own discovery document is a second host. Open gap (2026-09-10): whether a facet naming an origin that does not answer SHOULD be withdrawn, and how a client learns that origin's major.
268
+ **A facet MAY name a URL on another origin; that is a claim about the facet, not the origin.** `agentCardUrl` (and `mcp.serverUrls[]`) are `format: uri` with no origin constraint: the advertiser knows where the card is, not that the named origin serves `/.well-known/openwop` or speaks any major; the suite exercises the advertiser only, and certification is per origin. Open gap: whether a facet naming an origin that does not answer SHOULD be withdrawn, and how a client learns that origin's major.
269
269
 
270
270
  ### § budget
271
271
 
@@ -361,6 +361,10 @@ Witness `witnessable-gated`; owner RFC 0098.
361
361
 
362
362
  Witness `witnessable-gated`; owner RFC 0104; facets `refKinds`, `tokenAlgs`.
363
363
 
364
+ ### § runList
365
+
366
+ Witness `witnessable-gated`; owner RFC 0182; facets `maxPageSize`, `filters` (runs.md §List).
367
+
364
368
  ## 6. Extension families (13)
365
369
 
366
370
  Rows with `anchor: ext` are documented under `spec/v2/ext/<key>/` and each document MUST declare `witness` and both maturity axes in its header (`overview.md`): `restTransport`, `a2uiSurface`, `brand`, `canvas`, `chat`, `coordination`, `dataIntegration`, `entities`, `kanban`, `knowledge`, `launchStudio`, `messaging`, `webResearch`. `restTransport` and `a2uiSurface` (`witness: claims-check`) stay in `ext/` unless a behavioral witness lands (RFC 0169 §C.5); the other 11 are the RFC 0144 extension-class families advertised as `extensions.openwop-app.<name>` (§3.2).
@@ -1,6 +1,6 @@
1
1
  # Conformance
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0168.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0168.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Connection Packs
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0177, RFC 0095.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0177, RFC 0095.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Errors
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0171 §B.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0171 §B.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Events
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0171 §A, §E; RFC 0176 §A.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0171 §A, §E; RFC 0176 §A.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Form Content Packs
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0177, RFC 0137.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0177, RFC 0137.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Headers
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0171 §C.1, RFC 0172 §A.3–§A.4.** GENERATED by `scripts/derive-v2-api.py` from `api/v2/openapi.yaml`; do not edit.
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0171 §C.1, RFC 0172 §A.3–§A.4.** GENERATED by `scripts/derive-v2-api.py` from `api/v2/openapi.yaml`; do not edit.
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -16,7 +16,7 @@ RFC 0171 §C.1: every non-standard header is `OpenWOP-<Name>` and every header i
16
16
  | `Last-Event-ID` | 1 | Resume from sequence after this ID. |
17
17
  | `OpenWOP-Dedup` | 1 | When set, server cross-host claim system rejects duplicate `(tenantId, scopeId)` pairs with `409 Conflict`. |
18
18
  | `OpenWOP-Force-Engine-Version` | 1 | **Test-keys-only.** When set, the server emits events for this run AS IF it |
19
- | `OpenWOP-Version` | 51 | RFC 0172 §A.3 — selects a listed major.minor; absent ⇒ the host's `preferredVersion`; unlisted ⇒ 406 protocol_version_unsupported. |
19
+ | `OpenWOP-Version` | 52 | RFC 0172 §A.3 — selects a listed major.minor; absent ⇒ the host's `preferredVersion`; unlisted ⇒ 406 protocol_version_unsupported. |
20
20
 
21
21
  ## Response headers
22
22
 
@@ -28,7 +28,7 @@ RFC 0171 §C.1: every non-standard header is `OpenWOP-<Name>` and every header i
28
28
  | `ETag` | 3 | Optional probe handle for mid-session capability change detection. Deprecated toward v2 (RFC 0165 §C.2). |
29
29
  | `Location` | 1 | Canonical URI of the new template. |
30
30
  | `OpenWOP-Idempotent-Replay` | 1 | Set when the response was served from the idempotency cache. |
31
- | `OpenWOP-Version` | 51 | RFC 0172 §A.4 — the contract that produced this response; MUST equal the one used. |
31
+ | `OpenWOP-Version` | 52 | RFC 0172 §A.4 — the contract that produced this response; MUST equal the one used. |
32
32
  | `Retry-After` | 1 | Seconds until the active claim is stale-eligible. |
33
33
 
34
34
  ## Webhook delivery headers
@@ -1,6 +1,6 @@
1
1
  # Idempotency
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0170 §D.3, RFC 0171 §B.2, RFC 0173 §B.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0170 §D.3, RFC 0171 §B.2, RFC 0173 §B.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Identity
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0170, 0165, 0176.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0170, 0165, 0176.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -118,7 +118,7 @@ A host MUST reject a tenant-bound id whose tenant segment is not the caller's wi
118
118
 
119
119
  **On the wire a tenant-bound id is one percent-encoded path segment** (`tenant%2Fopaque`); a host MUST decode before matching the grammar and MUST accept the bound form on every tenant-bound parameter.
120
120
 
121
- **Through the overlap the bare form is admitted on a major-2 path parameter** — a stated affordance with an expiry, not a legacy branch of the grammar. A parameter carrying only the opaque segment (the spelling a `/v1/` create hands out) MUST resolve under the caller's tenant and never another's, and the response MUST name the resource bound (`versioning.md` §5); the credential supplies the segment the `403` check would read. Once a host advertises no `1.x` member it MUST refuse the bare form `400 validation_error` (not `id_tenant_mismatch`, not `not_found`). Ids in documents and bodies are bound, always. Errata 2026-09-10: stated after six scenarios had measured it since rc.44; a same-day "refuse now" draft was withdrawn against them. A client MAY bind at its request seam. Handle grammars (`memoryRef`, workspace `path`/`etag`, the plugin version token) and their `resolvability` class are specified where each handle is used; an importer MUST re-mint every `host`-scoped handle (`spec/v2/ext/portability/`).
121
+ **Through the overlap the bare form is admitted on a major-2 path parameter** — a stated affordance with an expiry, not a legacy branch of the grammar. A parameter carrying only the opaque segment (the spelling a `/v1/` create hands out) MUST resolve under the caller's tenant and never another's, and the response MUST name the resource bound (`versioning.md` §5); the credential supplies the segment the `403` check would read. Once a host advertises no `1.x` member it MUST refuse the bare form `400 validation_error` (not `id_tenant_mismatch`, not `not_found`). Ids in documents and bodies are bound, always. A client MAY bind at its request seam. Handle grammars (`memoryRef`, workspace `path`/`etag`, the plugin version token) and their `resolvability` class are specified where each handle is used; an importer MUST re-mint every `host`-scoped handle (`spec/v2/ext/portability/`).
122
122
 
123
123
  ## 6. Identity error codes (`spec/v2/errors.json`)
124
124
 
@@ -1,6 +1,6 @@
1
1
  # Interop
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0175.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0175.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Interrupt
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0170 §E.1, RFC 0171 §A.4, RFC 0173 §B.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0170 §E.1, RFC 0171 §A.4, RFC 0173 §B.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # OpenWOP v2 Core — Overview
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0167, 0168, 0169, 0171, 0174.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0167, 0168, 0169, 0171, 0174.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Packs
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0177.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0177.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Persistence and Coexistence
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0176 (§A–§B, §D–§E), 0171 §A, 0170 §A.3.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0176 (§A–§B, §D–§E), 0171 §A, 0170 §A.3.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Replay and Fork
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0140, 0041, 0173 §C, 0176 §A.5.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0140, 0041, 0173 §C, 0176 §A.5.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Runs
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0170 §A, §D.1; RFC 0171 §D; RFC 0176 §B.1.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0170 §A, §D.1; RFC 0171 §D; RFC 0176 §B.1.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -32,6 +32,7 @@ Every operation accepts `OpenWOP-Version` (overview.md); every mutating operatio
32
32
  | `getEvalSummary` | `GET /runs/{runId}/eval-summary` | `runs:read` | `agents.evalSuite`; `404` when unadvertised |
33
33
  | `getRunCompensation` | `GET /runs/{runId}/compensation` | `runs:read` | `compensation` (security-defaults.md) |
34
34
  | `getRunEffects` | `GET /runs/{runId}/effects` | `runs:read` | `idempotency` (idempotency.md) |
35
+ | `listRuns` | `GET /runs` | `runs:read` | `runList` (RFC 0182); `404` when unadvertised |
35
36
 
36
37
  ## Create
37
38
 
@@ -84,6 +85,10 @@ An unknown root key, an unknown key inside a section, or a dotted key (`ai.provi
84
85
 
85
86
  The `200` SHOULD carry a strong `ETag` derived from the latest persisted `sequence`; when present it MUST change on every observable transition and be stable otherwise. A request whose `If-None-Match` matches MUST receive `304` with no body. A host MAY compress (`gzip` baseline; `br`, `zstd` only where advertised under `restTransport.contentEncodings`) and MUST then set `Content-Encoding` and `Vary: Accept-Encoding`; the decoded body is byte-identical.
86
87
 
88
+ ## List
89
+
90
+ `GET /runs` (RFC 0182; gated on `runList`) returns `{ runs: RunSnapshot[], nextCursor? }`, the caller's runs newest first: only runs whose tenant segment is the caller's, every `runId` bound (identity.md §5), and a run the caller created MUST appear. A page MUST NOT exceed `runList.maxPageSize`; `cursor` is opaque and one the host did not mint MUST be refused `400 validation_error`; `workflowId` and `status` are exact-match filters when `runList.filters` names them (an unadvertised filter is ignored).
91
+
87
92
  ## Cancel
88
93
 
89
94
  `cancelRun` accepts `{ reason? }` and answers `200 { runId, status }` with `status` `cancelling` or `cancelled`; the cascade MAY be asynchronous and the run emits `run.cancelled` when it completes. A cancel on a run that is already terminal (`completed`, `failed`, `cancelled`) MUST be refused `409 run_terminal`; a `200` whose `status` echoes the terminal state is outside this grammar. Cancelling a parent MUST NOT silently abandon an active compensation (security-defaults.md). `run.cancelled.parentRunId` with `reason: parent-cancelled` records a cascade from a parent.
@@ -1,6 +1,6 @@
1
1
  # Security Defaults
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0173 (§A–§E), 0164 §22, 0170 §B.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0173 (§A–§E), 0164 §22, 0170 §B.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Versioning and Release
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0172, 0179, 0176.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0172, 0179, 0176.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -43,7 +43,7 @@ Every protocol response MUST carry `OpenWOP-Version: <major>.<minor>` naming the
43
43
 
44
44
  A *protocol response* is one produced by an operation named in `spec/v2/path-manifest.json` (or its `/v1/` twin through the overlap); a shell, a hosting fallback or a proprietary route on the same origin has no version to name. Errata 2026-09-10: this read "any path" — §1.2's quantifier defect again.
45
45
 
46
- **On a manifest-named path, a non-protocol response MUST NOT carry `OpenWOP-Version` and MUST NOT be `application/json`**; a reader, a cache or the suite MUST NOT count a response without the header, or with a `text/html` body, as reaching the operation (`reachedUnderMajor2`). A vendor path (§5, RFC 0181) is not a shared name; nothing about its representation is constrained.
46
+ **On a manifest-named path, a non-protocol response MUST NOT carry `OpenWOP-Version` and MUST NOT be `application/json`**; a reader, a cache or the suite MUST NOT count a response without the header, or with a `text/html` body, as reaching the operation (`reachedUnderMajor2`). A vendor path (§5) is not a shared name and is unconstrained.
47
47
 
48
48
  **Content negotiation on a shared name is permitted, with conditions.** A host MAY serve a protocol operation and a page under one unversioned name, selecting on `Accept`, iff:
49
49
 
@@ -110,7 +110,7 @@ Through the overlap a host MUST advertise both majors (§1.1), MUST emit `OpenWO
110
110
 
111
111
  **A run minted under major 1 and read under major 2 MUST be named by its tenant-bound projection** `<tenantId>/<the v1 id>` (`identity.md` §5). A host MUST NOT return the bare v1 id in a major-2 response body. Normative since 2026-09-04, when a conformance check asserting byte-equality with the v1 id and a host implementing `identity.md` §5 could not both hold — §5 had no reading.
112
112
 
113
- The projection is mandatory rather than optional for a reason that is not stylistic. A tenant-bound id carries the tenant segment that §5's `403 id_tenant_mismatch` check reads. **A bare, unprefixed id has no tenant segment, so the mandatory cross-tenant refusal cannot run on it at all.** Admitting a legacy unprefixed form under major 2 would therefore create a class of identifiers — exactly the long-lived ones, carried over from v1 — on which major 2's tenant-isolation check is structurally inapplicable. The grammar in `ids.schema.json` has no legacy branch, and it MUST NOT acquire one.
113
+ The projection is mandatory for a reason that is not stylistic: a tenant-bound id carries the segment `identity.md` §5's `403 id_tenant_mismatch` check reads, and **a bare id has none, so the cross-tenant refusal cannot run on it at all.** A legacy unprefixed form in documents would be a class of long-lived identifiers on which major 2's tenant isolation is structurally inapplicable; the grammar in `ids.schema.json` has no legacy branch and MUST NOT acquire one.
114
114
 
115
115
  The overlap ends at v1 end-of-support (`overview.md`), when `protocolVersions[]` drops the `1.<n>` member and every alias carrying the `v1-end-of-support` trigger is removed.
116
116
 
@@ -118,7 +118,7 @@ The overlap ends at v1 end-of-support (`overview.md`), when `protocolVersions[]`
118
118
 
119
119
  **Retirement flips every header-less request's contract.** Through the overlap a header-less request on an unversioned name is served major 1 (§1.3); where the v1 surface lives under `/v1/` that name is not a v1 key and falls through to whatever else is served there — typically a page. At end-of-support the same request is served major 2 and the page starts answering the operation. A `/v1/`-counting inventory cannot see this. Test: `manifest top-level segments ∩ anything else served unversioned` (`{agents, prompts, runs}` on the host that found it). A non-empty intersection MUST be resolved before end-of-support: move the page, or serve it under §1.4's conditions.
120
120
 
121
- **Host-proprietary paths live at `/host/<org>/…` (RFC 0181).** The corpus keys every vendor namespace — capability records (`capabilities.md` §3.2), error codes, event types, pack properties — to an org registered in `spec/v2/declaration.json`; paths join that pattern. A host MAY serve operations the manifest does not name under `/host/<org>/…` for its registered org, with no major in the path (RFC 0172 rejected a `/v2/` space) and regardless of `OpenWOP-Version` — nothing there is a protocol operation, the suite never measures it, and §1.4's shared-name constraints do not apply. An org MUST NOT be named after a manifest segment under `/host/` (`reservedOrgs`), and a host SHOULD advertise the mount under `extensions.<org>.<name>`. A `/v1/host/<org>/…` twin MAY be served through the overlap; it retires atomically with `/v1`. Decided 2026-09-10 after two production hosts measured the gap (1,062 and 11 roots).
121
+ **Host-proprietary paths live at `/host/<org>/…` (RFC 0181).** Every vendor namespace — capability records (`capabilities.md` §3.2), error codes, event types, pack properties — is keyed to an org registered in `spec/v2/declaration.json`; paths join that pattern. A host MAY serve operations the manifest does not name under `/host/<org>/…` for its registered org: no major in the path, served regardless of `OpenWOP-Version`, never a protocol operation, never measured, outside §1.4. An org MUST NOT be named after a manifest segment under `/host/` (`reservedOrgs`); a host SHOULD advertise the mount under `extensions.<org>.<name>`. A `/v1/host/<org>/…` twin MAY ride the overlap and retires atomically with `/v1`.
122
122
 
123
123
  ## 6. Migration rows (RFC 0172)
124
124
 
@@ -1,6 +1,6 @@
1
1
  # Webhooks
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0165 §C.1, 0173 §B, 0176 §D.2, 0171 §A.4.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0165 §C.1, 0173 §B, 0176 §D.2, 0171 §A.4.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1,6 +1,6 @@
1
1
  # Workflow Chain Packs
2
2
 
3
- > **Status: Stable · v2.0.12 (2026-09-10) · RFC 0177, RFC 0133.**
3
+ > **Status: Stable · v2.1.0 (2026-09-11) · RFC 0177, RFC 0133.**
4
4
 
5
5
  ## Why this exists
6
6
 
@@ -1588,6 +1588,26 @@
1588
1588
  "requirementIds": [],
1589
1589
  "owningRfc": "0098"
1590
1590
  },
1591
+ {
1592
+ "key": "runList",
1593
+ "kind": "family",
1594
+ "anchor": "core",
1595
+ "section": "core/capabilities.md#runList",
1596
+ "peerDependencyId": "runList",
1597
+ "witness": "witnessable-gated",
1598
+ "maturity": {
1599
+ "technical": "experimental",
1600
+ "adoption": "none"
1601
+ },
1602
+ "facets": [
1603
+ "maxPageSize",
1604
+ "filters"
1605
+ ],
1606
+ "floorScenarios": [],
1607
+ "requirementIds": [],
1608
+ "owningRfc": "0182",
1609
+ "facetsFrom": "spec/v2/facets/runList.schema.json"
1610
+ },
1591
1611
  {
1592
1612
  "key": "interrupt",
1593
1613
  "kind": "family",
@@ -0,0 +1,24 @@
1
+ {
2
+ "$comment": "RFC 0182 §A.5 — the run-list family's facets: the page ceiling the host honours and the exact-match filters it implements",
3
+ "properties": {
4
+ "maxPageSize": {
5
+ "type": "integer",
6
+ "minimum": 1,
7
+ "maximum": 1000
8
+ },
9
+ "filters": {
10
+ "type": "array",
11
+ "uniqueItems": true,
12
+ "items": {
13
+ "type": "string",
14
+ "enum": [
15
+ "workflowId",
16
+ "status"
17
+ ]
18
+ }
19
+ }
20
+ },
21
+ "required": [
22
+ "maxPageSize"
23
+ ]
24
+ }
@@ -141,6 +141,11 @@
141
141
  "path": "/prompts:render",
142
142
  "operationId": "renderPromptTemplate"
143
143
  },
144
+ {
145
+ "method": "GET",
146
+ "path": "/runs",
147
+ "operationId": "listRuns"
148
+ },
144
149
  {
145
150
  "method": "POST",
146
151
  "path": "/runs",
@@ -273,7 +278,7 @@
273
278
  }
274
279
  ],
275
280
  "counts": {
276
- "operations": 51,
281
+ "operations": 52,
277
282
  "channels": 2
278
283
  }
279
284
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$comment": "RFC 0172 \u00a7D.1 \u2014 the one release identity the v2 artifacts derive from. `version` is the next corpus tag `v<version>` (the publish workflow's coordinated-release tag pattern `v*`; RFC 0172's `openwop/v2.<minor>.<patch>` spelling is amended to this at its flip). api/v2/*.yaml info.version, the suite's 2.x version and @openwop/spec-artifacts read it. Bumped by the release PR that cuts the tag, never by hand elsewhere.",
3
- "version": "2.0.12",
4
- "corpusTag": "v2.0.12",
3
+ "version": "2.1.0",
4
+ "corpusTag": "v2.1.0",
5
5
  "updated": "2026-09-05"
6
6
  }