@openwop/spec-artifacts 2.8.3 → 2.9.1
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 +14 -14
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +1 -1
- package/package.json +1 -1
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/gaps.json +51 -0
- package/spec/v2/core/form-content-packs.md +12 -0
- package/spec/v2/core/idempotency.md +13 -0
- package/spec/v2/core/persistence.md +12 -0
- package/spec/v2/core/replay.md +12 -0
- package/spec/v2/declaration.json +10 -0
- package/spec/v2/release.json +2 -2
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.
|
|
5
|
-
"corpusTag": "v2.
|
|
4
|
+
"version": "2.9.1",
|
|
5
|
+
"corpusTag": "v2.9.1",
|
|
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": "
|
|
13
|
-
"api/v2/asyncapi.yaml": "
|
|
14
|
-
"api/v2/openapi.yaml": "
|
|
12
|
+
"api/seams-v2.yaml": "2714a7e827e4c1dae106bee03662f4ba4707ca87f8846816c878a7a267e8fa35",
|
|
13
|
+
"api/v2/asyncapi.yaml": "17f9f44ca444434cab2fe273f3f23009ce9f480d0a803d234a6cbed0adaf5e05",
|
|
14
|
+
"api/v2/openapi.yaml": "d0d9fc04d38c8df99ed7d60a4760a5e9eab0926054ea8874a4745fe086b801ef",
|
|
15
15
|
"api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
|
|
16
16
|
"schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
|
|
17
17
|
"schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
|
|
@@ -201,13 +201,13 @@
|
|
|
201
201
|
"schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
|
|
202
202
|
"spec/v1/alias-detectors.json": "e90916db12d2297e2e560b2d54d2c4702d6cb3bef7179a575844687a7ec17262",
|
|
203
203
|
"spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
|
|
204
|
-
"spec/v1/core-standard-manifest.json": "
|
|
204
|
+
"spec/v1/core-standard-manifest.json": "86e60c2f39387e12cd85021ec8a90ac052eb5f271a1e080beaa1c61f1193dfe0",
|
|
205
205
|
"spec/v1/deprecations.json": "c81c8f71460936c8d489d8270477c7661cf4a5d7b7bad86c98899750b5656027",
|
|
206
206
|
"spec/v1/deprecations.schema.json": "18c87e78bedc210431f795ae44c5b5d202f2f3317850d5cf86867d4f1fa1cdfb",
|
|
207
207
|
"spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
|
|
208
208
|
"spec/v1/event-codemap.schema.json": "d05933b2e88103aff51a2f774df97b9bda065e0fc88dbd9b114cc47a32189174",
|
|
209
209
|
"spec/v1/extensions.json": "79a60754aa16cbdbdb604f8e5c00038af535a1690a4d07bd5ff7c38f0256a7bc",
|
|
210
|
-
"spec/v1/gaps.json": "
|
|
210
|
+
"spec/v1/gaps.json": "a97c834ac7f0f1429747053b047ffc02a667b49e84b4c40317f141e658b101e5",
|
|
211
211
|
"spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
|
|
212
212
|
"spec/v1/migrations.json": "8839497d6a4830b53fa7867014a8336f0d725ef2346352e54fb580b7947897af",
|
|
213
213
|
"spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
|
|
@@ -219,22 +219,22 @@
|
|
|
219
219
|
"spec/v2/core/connection-packs.md": "2e53c92476f68304139faf0c370874dc27bbba56a127a07e0906ff06edbb8ff1",
|
|
220
220
|
"spec/v2/core/errors.md": "6b6a1480ed889013172d8ce8c6985e321d2f4f73e1d9fae0bac9b961d0dd1a8c",
|
|
221
221
|
"spec/v2/core/events.md": "6ab8c727df3ebc5a60de3837c82a0075b4357d6f7e28435c6f80585687d41a76",
|
|
222
|
-
"spec/v2/core/form-content-packs.md": "
|
|
222
|
+
"spec/v2/core/form-content-packs.md": "967687826d78b8e29e25085769bea97596645036ecb0225fa3ef0ddcf76636d5",
|
|
223
223
|
"spec/v2/core/headers.md": "14cdf4ae9ee7d80eebfd426d7c3552e577baea0300915cd4bb3a68e8588195a8",
|
|
224
|
-
"spec/v2/core/idempotency.md": "
|
|
224
|
+
"spec/v2/core/idempotency.md": "6307a98be7e0d44199a66409eb78d249029c997782489f3e50d130134dd63fd7",
|
|
225
225
|
"spec/v2/core/identity.md": "ae24870df315b527dfe9ecf7a4c26582bcc1113da7954f44acf69bf463ac390d",
|
|
226
226
|
"spec/v2/core/interop.md": "8d8f4b040cb3625044c6aa586c8dcf5e9d15797de3d3b1cea631f44b8924701c",
|
|
227
227
|
"spec/v2/core/interrupt.md": "bdb2879a52a2504d84146e46108c4a4c2dd3a6f27865a295c80375b331cced21",
|
|
228
228
|
"spec/v2/core/overview.md": "7dc00ace32d4e4ce929a383651f0029fc4b7091ec87487b1bf26ead1be209e0e",
|
|
229
229
|
"spec/v2/core/packs.md": "3254fd060c2b690cea70ef2b1b1a119711bb04fb5f13bf8936d4d718df9b2322",
|
|
230
|
-
"spec/v2/core/persistence.md": "
|
|
231
|
-
"spec/v2/core/replay.md": "
|
|
230
|
+
"spec/v2/core/persistence.md": "e9e64d0eb7f9cd6ae71a5973ee539ed30966eca309fad523f05e33adc79f9225",
|
|
231
|
+
"spec/v2/core/replay.md": "13bf1f47573e0688ede28d2b1cc74cefd75e0a5c168ebf5d989f45b2cc2067b7",
|
|
232
232
|
"spec/v2/core/runs.md": "b4c0bb2869077fcbf26e15bc6bbac06819f68b8241944b903a275a37db1c71fa",
|
|
233
233
|
"spec/v2/core/security-defaults.md": "9ab1d1a88ccd0929f354422b151ec6d3164e8cd3784f8e58bb6f11cb7ee1e7d5",
|
|
234
234
|
"spec/v2/core/versioning.md": "27b88cde88f9060567ef7e46f4897b6be8892ade9f4a46c2ab16e314c515eabd",
|
|
235
235
|
"spec/v2/core/webhooks.md": "e08a736fd0bfdc79f5c2309c66f53caf96fac8d9954e0a184c2229de4ce286e9",
|
|
236
236
|
"spec/v2/core/workflow-chain-packs.md": "26bb65721f826285b7d90c3cb62fa7e9fb2414c1bc6e0fd25b33209168c3102e",
|
|
237
|
-
"spec/v2/declaration.json": "
|
|
237
|
+
"spec/v2/declaration.json": "c7338923f69aa72200977286b59d579ca797ba5462d2a911f50c24c5485a62f5",
|
|
238
238
|
"spec/v2/declaration.schema.json": "c86e3083fb9789c1958ecb4576cc6f71aa90e6f339521139238543ed08211dd4",
|
|
239
239
|
"spec/v2/errors.json": "aac91b12f954cc90574d310070ae3c651b131055d4389d2c6155242763765195",
|
|
240
240
|
"spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
|
|
@@ -273,8 +273,8 @@
|
|
|
273
273
|
"spec/v2/path-manifest.json": "c123c9fd77dc1b3f9c2e9346ace80cdae007e6511138894956abda01e61ec1c6",
|
|
274
274
|
"spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
|
|
275
275
|
"spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
|
|
276
|
-
"spec/v2/release.json": "
|
|
276
|
+
"spec/v2/release.json": "68384ffc6c06f2fe42ad85d553dc4da6bfa14160074c7746ee23d95bfbe654bb",
|
|
277
277
|
"spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
|
|
278
278
|
},
|
|
279
|
-
"corpusCommit": "
|
|
279
|
+
"corpusCommit": "ab69b3aec36effd4597c0f9091acf88fa0f70c25"
|
|
280
280
|
}
|
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.
|
|
4
|
+
version: 2.9.1
|
|
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
|
package/api/v2/asyncapi.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
asyncapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: OpenWOP v2 event streams
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.9.1
|
|
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
|
package/api/v2/openapi.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
openapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: OpenWOP v2 API
|
|
4
|
-
version: 2.
|
|
4
|
+
version: 2.9.1
|
|
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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/spec-artifacts",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.1",
|
|
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.
|
|
7
|
+
"version": "2.9.1"
|
|
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": "
|
|
422
|
+
"digest": "30cf52e2e90330d2b62e8a86a420966c01e2949ba127bac8bae33d0a2a3fe337"
|
|
423
423
|
}
|
package/spec/v1/gaps.json
CHANGED
|
@@ -10297,6 +10297,57 @@
|
|
|
10297
10297
|
}
|
|
10298
10298
|
]
|
|
10299
10299
|
},
|
|
10300
|
+
{
|
|
10301
|
+
"id": "openwop.gap.0189.1",
|
|
10302
|
+
"rfc": "0189",
|
|
10303
|
+
"local": "G1",
|
|
10304
|
+
"section": "§B(c)",
|
|
10305
|
+
"surface": "`namesKey` is a bare token match, so a family key that is a common English noun is satisfied by prose that merely uses the word. Measured against `spec/v2/core/*.md` with the gate's own predicate: `packs` has an obligation paragraph naming it in **7** documents — including `security-defaults.md` and `versioning.md`, which say nothing about the packs family's contract — and `idempotency` in **7**. Paragraph scope narrowed document scope but does not fix a common noun, and five of the families still undeclared (`packs`, `forms`, `replay`, `interrupt`, `connections`) are common nouns. A contributor under burn-down pressure can resolve `packs` against `security-defaults.md` and the gate will applaud.",
|
|
10306
|
+
"witness": "unclassified",
|
|
10307
|
+
"requirementId": null,
|
|
10308
|
+
"disposition": "carried",
|
|
10309
|
+
"target": "openwop.gap.0189.1",
|
|
10310
|
+
"sources": [
|
|
10311
|
+
{
|
|
10312
|
+
"file": "RFCS/registers/0189-normative-home.gaps.md",
|
|
10313
|
+
"token": "G1"
|
|
10314
|
+
}
|
|
10315
|
+
]
|
|
10316
|
+
},
|
|
10317
|
+
{
|
|
10318
|
+
"id": "openwop.gap.0189.2",
|
|
10319
|
+
"rfc": "0189",
|
|
10320
|
+
"local": "G2",
|
|
10321
|
+
"section": "§E.2",
|
|
10322
|
+
"surface": "62 families must find v2 homes inside the RFC 0174 §E.2 kernel budget, which `check-core-budget.mjs` reads over `spec/v2/core/*.md` only (non-recursive). At 2.9.0 the budget is **24,695 / 25,000** — 305 words free for 62 families. `spec/v2/ext/**` is a legal home under `homeClass()` and is **not** counted by the budget, and the precedent already exists (`spec/v2/ext/provider-idempotency/README.md` is supporting normative text for the **core** `idempotency` family). Left implicit, 62 authors each discover the escape valve independently and `ext/` silently becomes \"core, but unbudgeted\" — the 25,000-word cap defeated by directory name.",
|
|
10323
|
+
"witness": "unclassified",
|
|
10324
|
+
"requirementId": null,
|
|
10325
|
+
"disposition": "carried",
|
|
10326
|
+
"target": "openwop.gap.0189.2",
|
|
10327
|
+
"sources": [
|
|
10328
|
+
{
|
|
10329
|
+
"file": "RFCS/registers/0189-normative-home.gaps.md",
|
|
10330
|
+
"token": "G2"
|
|
10331
|
+
}
|
|
10332
|
+
]
|
|
10333
|
+
},
|
|
10334
|
+
{
|
|
10335
|
+
"id": "openwop.gap.0189.3",
|
|
10336
|
+
"rfc": "0189",
|
|
10337
|
+
"local": "G3",
|
|
10338
|
+
"section": "§D",
|
|
10339
|
+
"surface": "The burn-down decays `open` linearly to zero at v1 end-of-support, and `open = v1Dependent + undeclared` — but `v1Carried` families (`toolHooks`, `toolCatalog`) are explicitly tolerated past end-of-support by §D itself, which fails only if their target is deleted or its `Status:` banner changes. Counting a deliberately-tolerated family in a burn-down that must reach zero asks for work the RFC says is not required.",
|
|
10340
|
+
"witness": "unclassified",
|
|
10341
|
+
"requirementId": null,
|
|
10342
|
+
"disposition": "carried",
|
|
10343
|
+
"target": "openwop.gap.0189.3",
|
|
10344
|
+
"sources": [
|
|
10345
|
+
{
|
|
10346
|
+
"file": "RFCS/registers/0189-normative-home.gaps.md",
|
|
10347
|
+
"token": "G3"
|
|
10348
|
+
}
|
|
10349
|
+
]
|
|
10350
|
+
},
|
|
10300
10351
|
{
|
|
10301
10352
|
"id": "openwop.gap.spec.a2a-integration.g1",
|
|
10302
10353
|
"rfc": "0152",
|
|
@@ -15,6 +15,18 @@ A field MAY carry `when: <EdgeCondition>`. The grammar is the `WorkflowEdge.cond
|
|
|
15
15
|
"when": { "type": "equals", "left": "fields.shipping", "right": "international" } }
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
+
## Instantiation
|
|
19
|
+
|
|
20
|
+
A form instantiated from a pack advertised through `forms.contentPacks` MUST be
|
|
21
|
+
created through the same path a hand-authored form uses, and MUST remain
|
|
22
|
+
editable afterwards: the pack is a starting point, not a managed object. A host
|
|
23
|
+
MUST degrade an unrecognized field type to plain text rather than failing the
|
|
24
|
+
instantiation, and MUST NOT execute anything carried by the pack. A pack-authored
|
|
25
|
+
string, and any value collected through an instantiated template, is untrusted
|
|
26
|
+
input: when one is interpolated into a prompt, the composed envelope MUST carry
|
|
27
|
+
`meta.contentTrust: "untrusted"`, so a downstream reader can tell authored text
|
|
28
|
+
from pack-supplied text.
|
|
29
|
+
|
|
18
30
|
## Localized strings
|
|
19
31
|
|
|
20
32
|
`label`, `title`, and `description` are localized strings. A host MUST select the rendered language by the locale-selection and fallback rules of i18n.md, and MUST treat every rendered string as untrusted: escaped for the target surface, never interpreted as markup, script, or a template directive.
|
|
@@ -43,3 +43,16 @@ A host that advertises `idempotency` MUST serve `schemas/v2/effect-ledger-projec
|
|
|
43
43
|
## Composition
|
|
44
44
|
|
|
45
45
|
Layer 1 deduplicates the caller's request; Layer 2 deduplicates the run's effects. A retried provider call inside a run MUST resolve to the same effect record. Effects under replay and fork are in replay.md; identifier grammars are in identity.md.
|
|
46
|
+
|
|
47
|
+
## Multi-region
|
|
48
|
+
|
|
49
|
+
`multiRegion` and `crossRegion` are the two region facets of `idempotency`, and
|
|
50
|
+
they claim different things. `crossRegion` names the host's deployment posture
|
|
51
|
+
for this axis and MUST be held constant for the life of an advertisement.
|
|
52
|
+
`multiRegion` is the behavioural claim: when a host advertises it, both layers
|
|
53
|
+
above MUST hold across regions — an `Idempotency-Key` replayed into a second
|
|
54
|
+
region MUST resolve to the first region's response rather than starting new
|
|
55
|
+
work, and effect identity MUST collapse a duplicate effect wherever it is
|
|
56
|
+
observed. A host that does not advertise `multiRegion` makes no cross-region
|
|
57
|
+
promise, and a client MUST NOT infer one from `crossRegion` alone.
|
|
58
|
+
|
|
@@ -49,6 +49,18 @@ falsify a host's era handling on its own. What falsifies that is the vocabulary
|
|
|
49
49
|
of the events themselves, which is why the reader and writer rules below carry
|
|
50
50
|
the obligation and this field only reports it.
|
|
51
51
|
|
|
52
|
+
## The `eventLog` family
|
|
53
|
+
|
|
54
|
+
`eventLog` is the capability record by which a host advertises the era contract
|
|
55
|
+
above. A host that advertises `eventLog` MUST stamp `eventLogSchemaVersion` on
|
|
56
|
+
every run it creates, MUST serve the cursor contract in events.md §"Poll" over
|
|
57
|
+
that log, and MUST NOT emit an event `type` the codemap does not name. The
|
|
58
|
+
record carries no separate storage claim: it asserts that the era key, the
|
|
59
|
+
codemap and the poll cursor are implemented as written here, which is why its
|
|
60
|
+
floor scenarios are the era-key and cursor witnesses rather than tests of a
|
|
61
|
+
surface of its own. Its `crossEngineOrdering` facet is a replay property and is
|
|
62
|
+
normed in replay.md §"Cross-engine ordering".
|
|
63
|
+
|
|
52
64
|
## The reader rule
|
|
53
65
|
|
|
54
66
|
A v2 host reading a run in era `2` MUST translate every event through the codemap at the storage boundary:
|
package/spec/v2/core/replay.md
CHANGED
|
@@ -97,6 +97,18 @@ A host advertising `replay` MUST publish `schemas/v2/effect-seam-manifest.schema
|
|
|
97
97
|
|
|
98
98
|
A v2 host MUST fork a run created before the cut (era `2`, persistence.md). The fork's prefix MUST be byte-equivalent to the *translated* parent — the parent as read through the codemap, not its stored bytes — and `run.started` on the fork MUST carry the legacy Subject (`issuer: urn:openwop:legacy`, identity.md) where the parent had none (RFC 0176 §A.5, scenario `fork-a-v1-run`). A backfill of an era-`2` log is permitted only atomically per run with the original preserved, so this obligation stays checkable.
|
|
99
99
|
|
|
100
|
+
## Cross-engine ordering
|
|
101
|
+
|
|
102
|
+
When a host advertises both `idempotency.multiRegion` and
|
|
103
|
+
`eventLog.crossEngineOrdering`, a fork served by a region other than the one
|
|
104
|
+
that wrote the run MUST produce the same observable state at the `fromSeq`
|
|
105
|
+
boundary as a fork served by the writing region: `status`, `variables`, and the
|
|
106
|
+
projected event log up to `fromSeq` MUST be byte-equivalent across regions.
|
|
107
|
+
Per-region wall-clock and entropy fields in events AFTER the boundary MAY
|
|
108
|
+
differ. A host that advertises one of the two and not the other keeps the
|
|
109
|
+
single-region contract above; a host that advertises neither is single-region
|
|
110
|
+
and the cross-region claim does not apply.
|
|
111
|
+
|
|
100
112
|
## Retention
|
|
101
113
|
|
|
102
114
|
A host advertising `replay` MUST document retention for source snapshots, source logs, the invocation records replay depends on, and forked runs; `retention.days` MAY advertise the window. When the range `fromSeq` needs has expired, the host MUST reject the fork with `410` or `422`; `details` SHOULD carry `sourceRunId`, `fromSeq`, and the boundary.
|
package/spec/v2/declaration.json
CHANGED
|
@@ -1017,6 +1017,9 @@
|
|
|
1017
1017
|
"facets": [
|
|
1018
1018
|
"contentPacks"
|
|
1019
1019
|
],
|
|
1020
|
+
"normativeText": [
|
|
1021
|
+
"spec/v2/core/form-content-packs.md"
|
|
1022
|
+
],
|
|
1020
1023
|
"floorScenarios": [],
|
|
1021
1024
|
"requirementIds": [],
|
|
1022
1025
|
"owningRfc": "0137"
|
|
@@ -1484,6 +1487,9 @@
|
|
|
1484
1487
|
"multiRegion",
|
|
1485
1488
|
"crossRegion"
|
|
1486
1489
|
],
|
|
1490
|
+
"normativeText": [
|
|
1491
|
+
"spec/v2/core/idempotency.md"
|
|
1492
|
+
],
|
|
1487
1493
|
"floorScenarios": [],
|
|
1488
1494
|
"requirementIds": [],
|
|
1489
1495
|
"owningRfc": "0150"
|
|
@@ -1502,6 +1508,10 @@
|
|
|
1502
1508
|
"facets": [
|
|
1503
1509
|
"crossEngineOrdering"
|
|
1504
1510
|
],
|
|
1511
|
+
"normativeText": [
|
|
1512
|
+
"spec/v2/core/persistence.md",
|
|
1513
|
+
"spec/v2/core/replay.md"
|
|
1514
|
+
],
|
|
1505
1515
|
"floorScenarios": [],
|
|
1506
1516
|
"requirementIds": [],
|
|
1507
1517
|
"owningRfc": "0036"
|
package/spec/v2/release.json
CHANGED
|
@@ -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.
|
|
4
|
-
"corpusTag": "v2.
|
|
3
|
+
"version": "2.9.1",
|
|
4
|
+
"corpusTag": "v2.9.1",
|
|
5
5
|
"updated": "2026-09-18"
|
|
6
6
|
}
|