@openwop/spec-artifacts 2.43.1 → 2.43.2

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.43.1",
5
- "corpusTag": "v2.43.1",
4
+ "version": "2.43.2",
5
+ "corpusTag": "v2.43.2",
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": "69464bc0e1e71ef3b543a73d4fa4f67202343d2603c80af8033f6c3619ef1b30",
11
11
  "api/redocly.yaml": "b0604c89b2ca6d5076ec25725c539dad44a741a811fe524439ee6daef8baa09f",
12
- "api/seams-v2.yaml": "a0a51b581511aaec7f86c67e8157988e580564f569343556dfce3c5329926ce2",
13
- "api/v2/asyncapi.yaml": "0ad04a46c6985d782a7cc3645ded70fd973fcda86ef244086419274062855c09",
14
- "api/v2/openapi.yaml": "95bf518a2290e614e2ba750dfe5233f8df242fafdd31dd84beafbdd512c0e810",
12
+ "api/seams-v2.yaml": "987123ecfbfbc906c5655538b9380021ac0bcbfd93a467a67818e855d624ed0e",
13
+ "api/v2/asyncapi.yaml": "76474704b7a8e829588abec30d31f09e11557ee5daacad301c3be7e77affe7ce",
14
+ "api/v2/openapi.yaml": "f4af9e7fddad438d3a70753af29e5738ea48d15d1abd214a3fbeec97260cea9d",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
@@ -204,13 +204,13 @@
204
204
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
205
205
  "spec/v1/alias-detectors.json": "29f21e0fb2c7a232a92a5c19b4cba3a86bc3b5e16f06780452f0421c66c6ec38",
206
206
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
207
- "spec/v1/core-standard-manifest.json": "0c23e7ab67fa69cda05de86da9dee127e62d82045137fcecc1684d3201feaa97",
207
+ "spec/v1/core-standard-manifest.json": "0be2c8da837ddb170866303ab4640c8e8a8b2554d8c2bb9ac3d1bd9780bede5a",
208
208
  "spec/v1/deprecations.json": "46df807fb4adf0aae24671c20f69975cf3496e3bc3a521cb7e6ea556bdce563c",
209
209
  "spec/v1/deprecations.schema.json": "3e393c405d2a41b467d8c5e3c468549078df1ce6a6d2588fc488097b95d9b55b",
210
210
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
211
211
  "spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
212
212
  "spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
213
- "spec/v1/gaps.json": "dfdb7a8344316ec6b72e2e249736306cb19155f61180c5f13a44f57d51e803e8",
213
+ "spec/v1/gaps.json": "7eefa3aa02e978a41e1e5948818961718d23cb0cbe29a4a491524360feb9fd6f",
214
214
  "spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
215
215
  "spec/v1/migrations.json": "2efcd9064b2bc65a84a3b3d281aa86a91efd002690c1f4f14e8335c4a18194d1",
216
216
  "spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
@@ -230,15 +230,15 @@
230
230
  "spec/v2/core/idempotency.md": "2084d756789c1faf5121593fb39e67ca36a4c227178e175004742e403178ea49",
231
231
  "spec/v2/core/identity.md": "2dceb1c2697015e4a4fa8a9b28f4fbd25fa44a76ca5a919c752e2a8163c819db",
232
232
  "spec/v2/core/interop.md": "e72e25dff864c83b2980d7366b34054cffa072af0225821199f260f6228d260e",
233
- "spec/v2/core/interrupt.md": "b4376fbbaaa0c7b0ca5df04d40049b487753f6736f8e54ed7d75b7f8563b2f72",
233
+ "spec/v2/core/interrupt.md": "2c8a4026930ec40ba47d7415dd02b6eda997a03d7a084e5084fec6f1261aba1c",
234
234
  "spec/v2/core/node-pack-runtimes.md": "e1088cb69b8c3c67256c494063328916c2980ab1aa97a7063de25bab82fdb1e5",
235
235
  "spec/v2/core/oauth.md": "c96483a44b62978c596945fbb7d7c863cf6056cd980fdb4cf4e97555e3e10b72",
236
236
  "spec/v2/core/overview.md": "4087f171b00a3907551f508fec32fb9b0b3ccec8c0ac1b0c7c6d32cd2c0e3ff8",
237
237
  "spec/v2/core/packs.md": "b472a583211d466d6ab8e00c414c225b246e678043fe6283a710c899fadde913",
238
238
  "spec/v2/core/persistence.md": "711874f74cb08b03cd118d683056db10a063517762fcea73ec70feb5d983e6a4",
239
239
  "spec/v2/core/portability.md": "87c4327f674f714fda6217fd79b99d2ba219ad47dc02f9751bb56c200fb2c17a",
240
- "spec/v2/core/replay.md": "22cc8dc94cd145201f1269028fb0cb2abae2d988ee748205582edd59afd1da4d",
241
- "spec/v2/core/runs.md": "157600d7dd2554856bba29e231e46489b5097cc0c0a0e74073549d410897a78b",
240
+ "spec/v2/core/replay.md": "4d379494057746c6883f6047972e93e621863b998ed291b9a691d3aa57c1ff43",
241
+ "spec/v2/core/runs.md": "55e21292ae4b41d0d104199a6c2634ecb3f787c4a671f9ebc37084be38ceef03",
242
242
  "spec/v2/core/security-defaults.md": "153884da7a2d54c30c81b5e649cfdef31e151b3a2a19dee1bc5a16c35d60a3aa",
243
243
  "spec/v2/core/tool-catalog.md": "d16a9004418719c48301804aefa4d7ab6f41112a4ed83727f552aa1b92b418b0",
244
244
  "spec/v2/core/versioning.md": "e3b3ab6d76e51035039a32173e9b412628a52c8fe7b16687ff58a2d0d983faa0",
@@ -246,7 +246,7 @@
246
246
  "spec/v2/core/workflow-chain-packs.md": "fdce7a8477e269950a2bac05ee6eddbd66eb0b670b464d00054f7196ec05d29c",
247
247
  "spec/v2/corrections.json": "59f647f4d22477f6c2b06dcf913b682dde5d51dd5e607a5d0cf648ab60864d6e",
248
248
  "spec/v2/corrections.schema.json": "46bbffb954d13bd9995aebc912ceeb2544f7064331abf25fd6ab85c81a5cec94",
249
- "spec/v2/declaration.json": "7765c86f7a3fbdd5a80c6778fb22335f099dcc4caddf9747fb144c1f318a17f1",
249
+ "spec/v2/declaration.json": "184b83919e56d2f12bda73c7772905810a441cbab53fc42ad0b3135937fac3e5",
250
250
  "spec/v2/declaration.schema.json": "ef951633e4070899f64828f5cf1b5f4870270a0360f81dbb49b5b4d6cd407550",
251
251
  "spec/v2/errors.json": "dc1a846abe3e888acb0ce4a33cf9d1fb98e41fcc8b49f42b3682fd65deca2eb2",
252
252
  "spec/v2/errors.schema.json": "47404ad53e6147cf9017b813483712466573e419fb33e6c4b6c12d3e7deba1bc",
@@ -254,7 +254,7 @@
254
254
  "spec/v2/event-codemap.schema.json": "b173f2a9bcc0bf9b62a474ce3b91e1431d597e64fd1560fc58662cd8606eaf9c",
255
255
  "spec/v2/ext/README.md": "e2731ebb5156ece1840ed3b96e7a347f6345e73071ff4e54df0f21c1585c5027",
256
256
  "spec/v2/ext/a2uiSurface/README.md": "5518c7f355262eb7cc584422f4ff8e548f066b211878f969274a3a578127622d",
257
- "spec/v2/ext/brand/README.md": "4f9db1715219070fc57e06cc9b066f13aa130dd50f4869722d908e6e15720787",
257
+ "spec/v2/ext/brand/README.md": "82989c018d7965bab029bcce7a67b1d76ffc433d08971a4cac91befcccc09438",
258
258
  "spec/v2/ext/canvas/README.md": "0e91b68566d2be90319feedfaebe2cd2db0bd8f72fb59c958fa723c05e38023f",
259
259
  "spec/v2/ext/chat/README.md": "f59b6706162abbfff96f8bccd4c0e1aeed721047cf62e9af58c875727a38d716",
260
260
  "spec/v2/ext/coordination/README.md": "c7fe0884f52405fdd02c5f9ec309ac6b585685ee06ec5f338fff7acf03c07148",
@@ -263,12 +263,12 @@
263
263
  "spec/v2/ext/grpc-transport/README.md": "6ba378e3c6d1f2e3269b392cfdf0c40565ee9bfa259d1baaa9ee1d350e38e792",
264
264
  "spec/v2/ext/kanban/README.md": "bfc386dc0f874a4afa1e3ec6a2f99084b547dcce9bd363da3b8ebd8786b9c184",
265
265
  "spec/v2/ext/knowledge/README.md": "cbe1f945a757791dedac0fd542a68c86c5b457778b831d58d9ae44a2baa270f2",
266
- "spec/v2/ext/launchStudio/README.md": "c732bb855252c31ee1e971cbc2936f2ca29b234c111d548c648095634507babb",
267
- "spec/v2/ext/messaging/README.md": "484cfa3091f89261dbdd48372afba441d3e6c16c3169a861b0ed7fc8c2902780",
266
+ "spec/v2/ext/launchStudio/README.md": "a941ef1d2401438a412eaea48d2d6ca807a032b44ea08719fea33120daf088a0",
267
+ "spec/v2/ext/messaging/README.md": "949f350e35294f52ad490e42699f8c560cd154549516fbaa1805f06312b7f342",
268
268
  "spec/v2/ext/portability/README.md": "c59423ee446638b748a911b9e97e803c4786157be6120f656f0a060586bc7b82",
269
269
  "spec/v2/ext/provider-idempotency/README.md": "9d1bccef0ec16a19a3370ae79c2f5a1726ce0d1d25a51352907f288a2ccb15d7",
270
270
  "spec/v2/ext/provider-idempotency/registry.json": "5b5fecad604fb4ab38da39f5abe697a4e57b05406c398f8afeb377331b2bd965",
271
- "spec/v2/ext/restTransport/README.md": "acda51f1a973308841861a119def691db972f310c7b7250ab14f248e9c968585",
271
+ "spec/v2/ext/restTransport/README.md": "a8115faefeab01b7c85d516de60ebfc99b8e89552d16ba654456224518447b28",
272
272
  "spec/v2/ext/sandbox-runtime-notes/README.md": "0d1290fb1e20b2e35c0b15051541ab6546e4e2a6f693b4f912cb3f7d6a65e92c",
273
273
  "spec/v2/ext/webResearch/README.md": "b675e6f6646128d781b661f754c2393eed86e5935d16c3a22df582a5ce025b9b",
274
274
  "spec/v2/facets/a2a.schema.json": "b68bf5e29e455e46c2ad7cfcccf5963730ec2310ff9db81884550d8df30fd6ef",
@@ -298,9 +298,9 @@
298
298
  "spec/v2/path-manifest.json": "17298a245c5da9a70aa7ab0b7f2db4277e06209d6fcdd7187a8b4cea179c08f3",
299
299
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
300
300
  "spec/v2/profiles.json": "180beb9ef2d161766fa23b2987e7e829851e3d316273147cf6a4a3f324befd6b",
301
- "spec/v2/release.json": "e52aaf9f10896088b2fcca2586ab05a477043275e7a3a48b769ffb4865e37c4a",
301
+ "spec/v2/release.json": "ec99d76b53fba89d3d8788206c649a782774b55acf5284b75cab38b79ecf1d61",
302
302
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
303
- "spec/v2/surface-baseline.json": "d5b4e6c55a1d4bbe54241f9d0d020e7f9857f29912bb9f2ef910087b276be7e6"
303
+ "spec/v2/surface-baseline.json": "3d3d0fc7c0b48e7d7339e5d8ada0640487908f37220b2de65ccc9bff093f876a"
304
304
  },
305
- "corpusCommit": "a99d0e2a2fd3000cff23cade553a6a45ad8f17a9"
305
+ "corpusCommit": "6612868966f2ecb9672d0a64382cb7067491c004"
306
306
  }
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.43.1
4
+ version: 2.43.2
5
5
  description: 'The OpenWOP conformance seams profile (`openwop-conformance-seams-v2`): test-only operations in their own
6
6
  path space, `/conformance/seams/…`. The profile is versioned and validated against the canonical v2 schemas with no tolerance
7
7
  path. It is not a capability: a host advertises the profile, never a `testSeams` flag.
@@ -1,7 +1,7 @@
1
1
  asyncapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 event streams
4
- version: 2.43.1
4
+ version: 2.43.2
5
5
  description: 'OpenWOP v2 event streams over SSE. The run-events channel''s address is the OpenAPI path key, and the server
6
6
  pathname is empty (bare origin). `streamMode` is a stream mode from the closed set, or a comma-separated combination of
7
7
  them; `values` never combines. `hostEvents` has a default address, `/host/events`; a host MAY declare another under `heartbeat.deliveryChannel`.
@@ -1,7 +1,7 @@
1
1
  openapi: 3.1.0
2
2
  info:
3
3
  title: OpenWOP v2 API
4
- version: 2.43.1
4
+ version: 2.43.2
5
5
  summary: REST surface for declaring, executing, suspending, resuming, and observing multi-step workflows.
6
6
  description: 'The OpenWOP v2 REST API. Paths are unversioned and served at the bare origin; a client selects a version with
7
7
  the `OpenWOP-Version` header from the host''s `protocolVersions[]`. Conformance seams and test-mode operations are not
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/spec-artifacts",
3
- "version": "2.43.1",
3
+ "version": "2.43.2",
4
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": {
@@ -4,7 +4,7 @@
4
4
  "provenance": {
5
5
  "suite": {
6
6
  "package": "@openwop/openwop-conformance",
7
- "version": "2.43.1"
7
+ "version": "2.43.2"
8
8
  },
9
9
  "note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
10
10
  },
@@ -421,5 +421,5 @@
421
421
  "$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
422
422
  }
423
423
  ],
424
- "digest": "7800a051d432c1244efd10dcee93b93ddde389aa6bfa843279d0ff6b9d734658"
424
+ "digest": "a8b5948aab2aa9da287f28920d6106d784d33e41a441146ee50a5cf79022d6f6"
425
425
  }
package/spec/v1/gaps.json CHANGED
@@ -7271,6 +7271,23 @@
7271
7271
  }
7272
7272
  ]
7273
7273
  },
7274
+ {
7275
+ "id": "openwop.gap.0140.10",
7276
+ "rfc": "0140",
7277
+ "local": "G10",
7278
+ "section": "§Conformance",
7279
+ "surface": "`openwop.requirement.replay.suppression-execution-ordinal` (openwop#1718) has no witness on any host, positive or negative. `conformance-replay-ordinal-loop` needs a host that both runs cycles and suppresses a side-effecting node in replay. The v2 reference host does neither for this fixture: it does not loop, it does not execute `core.conformance.side-effect`, and its `effectOutcome` (`store.ts:586` at openwop-examples `f56f092`) selects the latest outcome regardless of ordinal, which would fail the row if it looped. openwop-app does not index by ordinal (`nodeAttempts` is never reset), and MyndHyve does not seed `replaySourceOutcomes` from the prefix.",
7280
+ "witness": "unclassified",
7281
+ "requirementId": null,
7282
+ "disposition": "externally-gated",
7283
+ "target": "host-loops-with-replay-suppression",
7284
+ "sources": [
7285
+ {
7286
+ "file": "RFCS/registers/0140-replay-side-effect-suppression.gaps.md",
7287
+ "token": "G10"
7288
+ }
7289
+ ]
7290
+ },
7274
7291
  {
7275
7292
  "id": "openwop.gap.0141.0",
7276
7293
  "rfc": "0141",
@@ -9826,11 +9843,11 @@
9826
9843
  "rfc": "0171",
9827
9844
  "local": "G7",
9828
9845
  "section": "§B.1",
9829
- "surface": "MyndHyve emits about 56 UPPER_CASE run-failure codes (normalised in `failurePayload`, measured at MyndHyve `fc3b007cf`) that are neither registered nor vendor codes.",
9846
+ "surface": "MyndHyve emitted about 56 UPPER_CASE run-failure codes that were neither registered nor vendor codes.",
9830
9847
  "witness": "unclassified",
9831
9848
  "requirementId": null,
9832
- "disposition": "externally-gated",
9833
- "target": "myndhyve-code-remap",
9849
+ "disposition": "closed",
9850
+ "target": null,
9834
9851
  "sources": [
9835
9852
  {
9836
9853
  "file": "RFCS/registers/0171-v2-wire-envelope.gaps.md",
@@ -9843,7 +9860,7 @@
9843
9860
  "rfc": "0171",
9844
9861
  "local": "G8",
9845
9862
  "section": "§B.1",
9846
- "surface": "The v2 reference host emitted 3 unregistered run-failure codes (measured at openwop-examples `456dfaa`).",
9863
+ "surface": "The v2 reference host emitted unregistered run-failure codes that were not vendor codes.",
9847
9864
  "witness": "unclassified",
9848
9865
  "requirementId": null,
9849
9866
  "disposition": "closed",
@@ -13136,6 +13153,23 @@
13136
13153
  }
13137
13154
  ]
13138
13155
  },
13156
+ {
13157
+ "id": "openwop.gap.0220.5",
13158
+ "rfc": "0220",
13159
+ "local": "G5",
13160
+ "section": "§B",
13161
+ "surface": "`canvas` has no tier-2 path yet. MyndHyve serves the canvas host service (myndhyve #547), but its claim depends on the `vendor.myndhyve.canvas` pack. The only v2-admissible version (1.0.1, `registry/v2/`) is signed with `signing.scheme: ed25519-canonical-json` (RFC 0177 §A), and MyndHyve's pack publish route and resolver do not implement that scheme. The v1-tree 1.0.0 pins `engines.openwop <2.0.0`, which a v2 host MUST refuse. This is a general v2 pack-signing gap at the host, not canvas-specific.",
13162
+ "witness": "unclassified",
13163
+ "requirementId": null,
13164
+ "disposition": "transferred",
13165
+ "target": "myndhyve/services/workflow-runtime",
13166
+ "sources": [
13167
+ {
13168
+ "file": "RFCS/registers/0220-ext-families-graduate-on-evidence.gaps.md",
13169
+ "token": "G5"
13170
+ }
13171
+ ]
13172
+ },
13139
13173
  {
13140
13174
  "id": "openwop.gap.0221.1",
13141
13175
  "rfc": "0221",
@@ -13260,11 +13294,11 @@
13260
13294
  "rfc": "0223",
13261
13295
  "local": "G5",
13262
13296
  "section": "§Implementation notes",
13263
- "surface": "MyndHyve fails the gate with the unregistered `APPROVAL_REJECTED`.",
13297
+ "surface": "MyndHyve failed the gate with the unregistered `APPROVAL_REJECTED`.",
13264
13298
  "witness": "unclassified",
13265
13299
  "requirementId": null,
13266
- "disposition": "externally-gated",
13267
- "target": "myndhyve-next-cut",
13300
+ "disposition": "closed",
13301
+ "target": null,
13268
13302
  "sources": [
13269
13303
  {
13270
13304
  "file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
@@ -13362,11 +13396,11 @@
13362
13396
  "rfc": "0223",
13363
13397
  "local": "G10",
13364
13398
  "section": "§Conformance",
13365
- "surface": "`openwop.requirement.0223.timeout-rejects` and `0223.timeout-never-grants` have no MyndHyve witness: its `core.approvalGate` has no timeout configuration. On the v2 reference host both rows are negatively controlled (sweep sabotaged, or the `onTimeout` exclusion present) and pass locally with the fixtures registered. They need suite 2.43.1 and a new certified cut.",
13399
+ "surface": "`openwop.requirement.0223.timeout-rejects` and `0223.timeout-never-grants` had no certified witness, and have no MyndHyve witness: its `core.approvalGate` has no timeout configuration.",
13366
13400
  "witness": "unclassified",
13367
13401
  "requirementId": null,
13368
- "disposition": "externally-gated",
13369
- "target": "certified-cut-on-2.43.1",
13402
+ "disposition": "closed",
13403
+ "target": null,
13370
13404
  "sources": [
13371
13405
  {
13372
13406
  "file": "RFCS/registers/0223-approval-reject-disposition.gaps.md",
@@ -118,7 +118,7 @@ The token grammar and the `interrupt.tokenAlgs[]` / `kid` check are [identity.md
118
118
 
119
119
  ### Rejection
120
120
 
121
- A `reject` exits the suspend. The host MUST record `action: "reject"` and `decision: "rejected"` on `interrupt.resolved`, and SHOULD also emit `approval.rejected`. The resume value returns to the raising node (§Re-entry and resume values).
121
+ A `reject` exits the suspend. The host MUST record `action: "reject"` and `decision: "rejected"` on `interrupt.resolved`, and MAY also emit `approval.rejected`. The resume value returns to the raising node (§Re-entry and resume values).
122
122
 
123
123
  - A node that does not turn the rejection into an output MUST fail with `approval_rejected` and `retryable: false` on the `node.failed` error, and MUST NOT be retried.
124
124
  - A rejected gate is a failed source. It MUST NOT satisfy an `all_success`, `any_success` or `none_failed` edge. The run continues past it only over an edge whose `triggerRule` admits a failed source (`all_complete` or `any_failed`).
@@ -63,7 +63,7 @@ When a replayed node produces an event different from the source at the same seq
63
63
  Divergence codes (`spec/v2/errors.json`):
64
64
 
65
65
  - **`replay_diverged_at_refusal`** (fork fails, `409`) — the source obtained a valid envelope and the replay a refusal, or the reverse. The host MUST NOT substitute silently; it MUST emit `replay.diverged-at-refusal` naming the node and both envelope kinds and fail the replay with this code.
66
- - **`replay_source_missing`** (`node.failed` payload; the fork request still returns `201`) — a side-effecting node reached with no recorded source outcome for `(nodeId, attempt)` (§Suppression).
66
+ - **`replay_source_missing`** (`node.failed` payload; the fork request still returns `201`) — a side-effecting node reached with no recorded source outcome (§Suppression).
67
67
  - **`replay_memory_snapshot_unavailable`** (fork refused, `409`) — the host cannot serve memory state as-of `fromSeq`. It MUST refuse rather than substitute current memory; `details.fromSeq` SHOULD name the index.
68
68
  - **`replay_context_summary_unavailable`** (fork refused, `409`) — the host advertises `multiAgent.executionModel.contextBudget.summarization` and cannot serve, as-of `fromSeq`, a summary artifact (`context.summarized.summaryRef`) the replay would reuse. It MUST refuse rather than re-summarize; `details.fromSeq` SHOULD name the index.
69
69
 
@@ -74,7 +74,7 @@ Suppression is an obligation of the `replay` surface: advertising `replay` binds
74
74
  For a fork with `mode: replay`:
75
75
 
76
76
  1. A node that performs an external side effect — any operation observable outside the run's own event log — MUST NOT perform it.
77
- 2. The host MUST resolve the node's outcome from the source run's recorded terminal outcome for the same `(nodeId, attempt)`, keyed on `(sourceRunId, nodeId, attempt)` and never on the fork's own `runId` (the Layer-2 key includes `runId`, so it cannot span a fork).
77
+ 2. The host MUST resolve the node's outcome from the source run's recorded terminal outcome keyed on `(sourceRunId, nodeId, n)`, never on the fork's own `runId`, where `n` counts the node's `node.started` events through this execution, including retries, later visits and the fork's inherited prefix.
78
78
  3. Absent a recorded outcome, the host MUST fail the node closed with `replay_source_missing`, MUST NOT perform the effect, and MUST NOT substitute a synthesized or empty success.
79
79
  4. A node whose pack manifest declares `role: "side-effect"` MUST be treated as side-effecting; a host classifier MAY add nodes and MUST NOT remove any. A throwing seam satisfies rule 1 only.
80
80
  5. The guarantee is whole-run and requires both classification before execution and a default-deny guard at every effect seam.
@@ -102,7 +102,7 @@ A host advertising `replay` MUST publish `schemas/v2/effect-seam-manifest.schema
102
102
  1. Load the source run's events with `sequence < fromSeq` through the storage boundary, where an era-`2` log is translated (persistence.md).
103
103
  2. Fold them to a projected state.
104
104
  3. Initialize the new run with that state, copy-on-write into its own log.
105
- 4. For `replay`, resolve side-effecting nodes from the source run's recorded outcomes keyed on `(sourceRunId, nodeId, attempt)`; LLM invocations additionally consult the invocation log via the content-addressed invocation key.
105
+ 4. For `replay`, resolve side-effecting nodes from the source run's recorded outcomes keyed on `(sourceRunId, nodeId, n)`; LLM invocations additionally consult the invocation log via the content-addressed invocation key.
106
106
  5. For `branch`, executor invocations create new invocation-log entries keyed on the new `runId`.
107
107
 
108
108
  ## Forking a v1 run
@@ -63,7 +63,7 @@ The `createRun` body is closed (`unevaluatedProperties: false`). Its fields:
63
63
  The `201` response is `{ runId, status, eventsUrl, statusUrl? }`. `status` is one of `pending`, `running`, `waiting-approval`, `waiting-input`, `waiting-external`.
64
64
 
65
65
  - `eventsUrl` and `statusUrl` MUST resolve under the origin the request was made to — a relative path, or an absolute URL on the same origin — and MUST NOT downgrade the scheme. A link naming a different host, or `http://` on an `https://` origin, is non-conformant.
66
- - The base that minted `runId` MUST resolve it: `GET /runs/{runId}` and `GET /runs/{runId}/events/poll` at that base MUST answer `200` for the returned id, percent-encoded per [identity.md](identity.md) §5. (A front door that decodes `%2F` before routing makes every tenant-bound id unreachable.)
66
+ - The base that minted `runId` MUST resolve it: `GET /runs/{runId}` and `GET /runs/{runId}/events/poll` at that base MUST answer `200` for the returned id, percent-encoded per [identity.md](identity.md) §5.
67
67
 
68
68
  ### Refusals
69
69
 
@@ -191,7 +191,7 @@ Per-entry errors ([errors.md](errors.md)):
191
191
  `drainPolicy` is one of:
192
192
 
193
193
  - `drain-current-node` (default) — the executing node reaches a terminal first.
194
- - `immediate` — the run is snapshotted between events. The executing attempt is cut: it has no terminal node event, a host MUST NOT record `node.failed` (or any terminal node event) for it, and the resumed run's `node.started` begins a fresh attempt. `run.paused` itself records the interruption; its payload MAY carry `interruptedNodeId` and `interruptedAttempt` so a `debug` consumer can see which attempt was cut.
194
+ - `immediate` — the run is snapshotted between events. The executing attempt is cut: it has no terminal node event, a host MUST NOT record `node.failed` (or any terminal node event) for it, and the resumed run's `node.started` begins a fresh attempt. `run.paused` itself records the interruption; its payload MAY carry `interruptedNodeId` and `interruptedAttempt`.
195
195
 
196
196
  `resumeRun` accepts `{ reason? }`, answers `202 { runId, status: 'running', resumedAt? }`, and emits `run.resumed`.
197
197
 
@@ -224,6 +224,8 @@ The `201` response is `{ runId, sourceRunId, fromSeq?, mode, status, eventsUrl }
224
224
 
225
225
  `getRunAncestry` returns `schemas/v2/run-ancestry-response.schema.json` (`runId`, `hostId`, `parent` or `null`). A client walks the chain one hop at a time via `parent.wellKnownUrl`.
226
226
 
227
+ `parent` is the dispatching run, `cause` its composition mechanism. A fork is not dispatched (its lineage is `parentRunId`): its `parent` MUST be `null`.
228
+
227
229
  ## Annotations, artifacts, eval summary
228
230
 
229
231
  ### Annotations
@@ -1803,8 +1803,8 @@
1803
1803
  "extensionName": "brand",
1804
1804
  "witness": "claims-check",
1805
1805
  "maturity": {
1806
- "technical": "experimental",
1807
- "adoption": "none"
1806
+ "technical": "stable",
1807
+ "adoption": "single-witness"
1808
1808
  },
1809
1809
  "facets": [],
1810
1810
  "floorScenarios": [],
@@ -1947,8 +1947,8 @@
1947
1947
  "extensionName": "launch-studio",
1948
1948
  "witness": "claims-check",
1949
1949
  "maturity": {
1950
- "technical": "experimental",
1951
- "adoption": "single-witness"
1950
+ "technical": "stable",
1951
+ "adoption": "multi-witness"
1952
1952
  },
1953
1953
  "facets": [],
1954
1954
  "floorScenarios": [],
@@ -1965,8 +1965,8 @@
1965
1965
  "extensionName": "messaging",
1966
1966
  "witness": "claims-check",
1967
1967
  "maturity": {
1968
- "technical": "experimental",
1969
- "adoption": "none"
1968
+ "technical": "stable",
1969
+ "adoption": "single-witness"
1970
1970
  },
1971
1971
  "facets": [],
1972
1972
  "floorScenarios": [],
@@ -1,14 +1,14 @@
1
1
  # `brand` extension
2
2
 
3
- > **Status: Draft.**
3
+ > **Status: Stable.**
4
4
 
5
5
  `brand` names a host service for brand artifacts: themes and personas. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
6
6
 
7
7
  | Field | Value |
8
8
  | --- | --- |
9
9
  | **witness:** | `claims-check` |
10
- | **technical:** | `experimental` |
11
- | **adoption:** | `none` |
10
+ | **technical:** | `stable` |
11
+ | **adoption:** | `single-witness` |
12
12
  | **peer-dependency id** | `brand` |
13
13
  | **advertised as** | `extensions.<org>.brand` |
14
14
  | **declared facets** | none defined |
@@ -1,14 +1,14 @@
1
1
  # `launchStudio` extension
2
2
 
3
- > **Status: Draft.**
3
+ > **Status: Stable.**
4
4
 
5
5
  `launchStudio` names launch-studio operations for the multi-canvas launch workflow. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
6
6
 
7
7
  | Field | Value |
8
8
  | --- | --- |
9
9
  | **witness:** | `claims-check` |
10
- | **technical:** | `experimental` |
11
- | **adoption:** | `single-witness` |
10
+ | **technical:** | `stable` |
11
+ | **adoption:** | `multi-witness` |
12
12
  | **peer-dependency id** | `launchStudio` |
13
13
  | **advertised as** | `extensions.<org>.launch-studio` |
14
14
  | **declared facets** | none defined |
@@ -1,14 +1,14 @@
1
1
  # `messaging` extension
2
2
 
3
- > **Status: Draft.**
3
+ > **Status: Stable.**
4
4
 
5
5
  `messaging` names outbound chat-egress dispatch through host-owned connectors. It is a discovery-only reservation: v2 defines no portable operations or payload contract for it.
6
6
 
7
7
  | Field | Value |
8
8
  | --- | --- |
9
9
  | **witness:** | `claims-check` |
10
- | **technical:** | `experimental` |
11
- | **adoption:** | `none` |
10
+ | **technical:** | `stable` |
11
+ | **adoption:** | `single-witness` |
12
12
  | **peer-dependency id** | `messaging` |
13
13
  | **advertised as** | `extensions.<org>.messaging` |
14
14
  | **declared facets** | none defined |
@@ -32,12 +32,14 @@ For each coding listed in `contentEncodings`, a request that names only that cod
32
32
 
33
33
  A client MUST NOT infer anything else from the record.
34
34
 
35
+ The claim describes what a client receives at the host's advertised base URL, so a CDN or proxy in front of the host is part of it. A front that drops or rewrites a coding the origin produces makes the claim false. This is the most common way it goes wrong in deployment: one host's CDN served `zstd` as identity while its origin produced `zstd`. A host behind a front should list only the codings measured through that front.
36
+
35
37
  ## Conformance
36
38
 
37
39
  `conformance/src/scenarios/v2-ext-rest-transport.test.ts` (major 2) records the witness under `openwop.family.restTransport`:
38
40
 
39
41
  - **Conditional GET:** runs the `conformance-approval` fixture to `waiting-approval`. It checks for a strong `ETag`, a `304` with no body on a matching `If-None-Match`, and a changed `ETag` once the run completes.
40
- - **Codings:** for each advertised coding, the decoded body is byte-identical to the identity body.
42
+ - **Codings:** for each advertised coding, the decoded body is byte-identical to the identity body. The probe goes through the base URL it is given, so it measures any front in the path.
41
43
 
42
44
  A host without the claim records `inapplicable`. A host that makes the claim but lacks the fixture records `blocked`.
43
45
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$comment": "RFC 0172 §D.1 — 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.43.1",
4
- "corpusTag": "v2.43.1",
5
- "updated": "2026-09-27"
3
+ "version": "2.43.2",
4
+ "corpusTag": "v2.43.2",
5
+ "updated": "2026-09-28"
6
6
  }
@@ -4,7 +4,7 @@
4
4
  "schemas/v2/**/*.json",
5
5
  "spec/v2/path-manifest.json"
6
6
  ],
7
- "release": "2.43.1",
7
+ "release": "2.43.2",
8
8
  "kinds": {
9
9
  "union": [
10
10
  "channel",