@openwop/spec-artifacts 2.0.0-rc.6 → 2.0.0-rc.9
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 +11 -11
- package/api/seams-v2.yaml +1 -1
- package/api/v2/asyncapi.yaml +1 -1
- package/api/v2/openapi.yaml +1 -1
- package/package.json +18 -5
- package/schemas/certification-bundle-v2.schema.json +119 -27
- package/schemas/v2/capabilities.schema.json +39 -0
- package/schemas/v2/certification-bundle.schema.json +1 -1
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v2/declaration.json +7 -0
- package/spec/v2/release.json +2 -2
package/CORPUS-STAMP.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
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.0-rc.
|
|
4
|
+
"version": "2.0.0-rc.9",
|
|
5
5
|
"corpusTag": null,
|
|
6
6
|
"files": {
|
|
7
7
|
"api/.redocly.lint-ignore.yaml": "bf5a8350b88a72fa43f59605ed8d903ed24b6cfccda5e45509c9f6ed9ee4e712",
|
|
@@ -9,9 +9,9 @@
|
|
|
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": "1c0444d1bb0a4684d5f9eb0553c0e25305695bb7bbfe36adaa2189bd759b2ed4",
|
|
13
|
+
"api/v2/asyncapi.yaml": "3c5c5c4c2b4bda63d77b2da0e242c0399758f141aee5a89d5e8285c44b78afe7",
|
|
14
|
+
"api/v2/openapi.yaml": "d6b6689388d410388dc506dbed4cade59f6f0ef87671dfdfa6af97027e7114c3",
|
|
15
15
|
"api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
|
|
16
16
|
"schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
|
|
17
17
|
"schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"schemas/audit-verify-result.schema.json": "e8fd013fb610ba5db27ab0113ec2eb18e7da5f9310dd3de2dd3dc87a259c21fe",
|
|
33
33
|
"schemas/budget-policy.schema.json": "3d4fe30ae129fe136ab9ece395f2a2a42a76360786b1b9a1d5f1cbc753eb5b39",
|
|
34
34
|
"schemas/capabilities.schema.json": "e672c35d503532d8039b5552115f5ec150d60317f537f13180d830b0fe315947",
|
|
35
|
-
"schemas/certification-bundle-v2.schema.json": "
|
|
35
|
+
"schemas/certification-bundle-v2.schema.json": "2f85530dd04824a15810c94e96869362dee1e78396eca21fdd18e5501416bb7d",
|
|
36
36
|
"schemas/channel-presence-payload.schema.json": "f9d0ef4219814c2b765baf3e68cbe5eea2cb42379f516a93a0459dcd5f7db47e",
|
|
37
37
|
"schemas/channel-written-payload.schema.json": "54723a56bc5a35232f64544ca686ac1ac959a5fb05b32b2401facca6b3ef51a3",
|
|
38
38
|
"schemas/chat-card-pack-manifest.schema.json": "402f7e9081cc39857a52e772061f4e034a957dcbc17501fe6e8e0bcb3d337e42",
|
|
@@ -115,8 +115,8 @@
|
|
|
115
115
|
"schemas/v2/artifact-type-pack-manifest.schema.json": "c911757562e521cb4f31a47c097f562573b64087efe60c8acb81fd352367d300",
|
|
116
116
|
"schemas/v2/audit-verify-result.schema.json": "cb54c4d89ba5dfb73f49aa8959a980be65c2dc2a87a12f71ba36d3e836fe85da",
|
|
117
117
|
"schemas/v2/budget-policy.schema.json": "c7449daeb6e1d95e7a047b8c2814d3d54748697c27046972834874867d9b5f4c",
|
|
118
|
-
"schemas/v2/capabilities.schema.json": "
|
|
119
|
-
"schemas/v2/certification-bundle.schema.json": "
|
|
118
|
+
"schemas/v2/capabilities.schema.json": "792669b2cc7b1fd44ce9a4fd3e79696ad1277734e29299a4504b39eda15913ed",
|
|
119
|
+
"schemas/v2/certification-bundle.schema.json": "d441198893c01cd14d84abe9c5bf591b69f47554db749c01899512f36cea11fa",
|
|
120
120
|
"schemas/v2/channel-presence-payload.schema.json": "9475d46f358d21c19126e78204987a5633979917a2293653354ef5c5e044d54e",
|
|
121
121
|
"schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
|
|
122
122
|
"schemas/v2/chat-card-pack-manifest.schema.json": "566982ce509a96d1619d58a72e383eff0773fe43fc65e4bfc85a4fe158f4eaff",
|
|
@@ -198,7 +198,7 @@
|
|
|
198
198
|
"schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
|
|
199
199
|
"spec/v1/alias-detectors.json": "fee4594ef49953953ffcd0b3813300067d16b3e65ebff2aac722034ac9b3f545",
|
|
200
200
|
"spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
|
|
201
|
-
"spec/v1/core-standard-manifest.json": "
|
|
201
|
+
"spec/v1/core-standard-manifest.json": "322b72364fa918dd3d5dd939d947f7a66a410f7c39a9ffd6dd331c1916e38ceb",
|
|
202
202
|
"spec/v1/deprecations.json": "520d79927a8ed43ccf62c207a7cf6cf7b19b16e00bbbbdf0410667e939c19d85",
|
|
203
203
|
"spec/v1/deprecations.schema.json": "4cdbbb8eb9c0092913a5704c943880f0c8581bcf0f640a7df5a84105d53c8aee",
|
|
204
204
|
"spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
|
|
@@ -210,7 +210,7 @@
|
|
|
210
210
|
"spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
|
|
211
211
|
"spec/v1/operation-path-manifest.json": "5f5f4e3842669371730ebbd1aace3fb794192615f0018dc144f484ba5db82ac3",
|
|
212
212
|
"spec/v1/spec-gaps.json": "6cc9962c6b969f632e07a78b52a4f61447ff579e2990cbae989866f584a86042",
|
|
213
|
-
"spec/v2/declaration.json": "
|
|
213
|
+
"spec/v2/declaration.json": "52b8c24a2dd463d44086129bf792ad108746f5102778cbbf0ff469fa534eca48",
|
|
214
214
|
"spec/v2/declaration.schema.json": "b0881a76228dfbd1b85a2ec7b7259a60197f768344535cdb475db6ff719b0e54",
|
|
215
215
|
"spec/v2/errors.json": "ad1725dc7c11002450e8abc682858eb5c11952a0718ea8ef6bdb2fb5ae6e7e21",
|
|
216
216
|
"spec/v2/event-codemap.json": "37869a03cdfd8758b57e6f350641a6ebbd383231cebda51f5473ad85f94ab74c",
|
|
@@ -228,7 +228,7 @@
|
|
|
228
228
|
"spec/v2/path-manifest.json": "034152e09b1458c66810d4050e20a273b2b9b8fe2d92b66e8b819477de58a1be",
|
|
229
229
|
"spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
|
|
230
230
|
"spec/v2/profiles.json": "1f0ee40491131cf561ef19a0394c47ba476b4567514fe16befb6cada4a10a5a4",
|
|
231
|
-
"spec/v2/release.json": "
|
|
231
|
+
"spec/v2/release.json": "d8dc6315c0716621625edad0b150c5daa77e1352984f439ee4d1d8627efeec13"
|
|
232
232
|
},
|
|
233
|
-
"corpusCommit": "
|
|
233
|
+
"corpusCommit": "e3480a200a224fb906d0c3f54043b6e229c5dff9"
|
|
234
234
|
}
|
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.0-rc.
|
|
4
|
+
version: 2.0.0-rc.9
|
|
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.0.0-rc.
|
|
4
|
+
version: 2.0.0-rc.9
|
|
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.0.0-rc.
|
|
4
|
+
version: 2.0.0-rc.9
|
|
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,10 +1,23 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/spec-artifacts",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
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
|
|
3
|
+
"version": "2.0.0-rc.9",
|
|
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).",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
|
-
"repository": {
|
|
7
|
-
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/openwop/openwop.git",
|
|
9
|
+
"directory": "spec-artifacts"
|
|
10
|
+
},
|
|
11
|
+
"files": [
|
|
12
|
+
"api",
|
|
13
|
+
"schemas",
|
|
14
|
+
"spec",
|
|
15
|
+
"CORPUS-STAMP.json",
|
|
16
|
+
"README.md",
|
|
17
|
+
"LICENSE"
|
|
18
|
+
],
|
|
8
19
|
"sideEffects": false,
|
|
9
|
-
"publishConfig": {
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"access": "public"
|
|
22
|
+
}
|
|
10
23
|
}
|
|
@@ -5,26 +5,58 @@
|
|
|
5
5
|
"description": "A certification bundle that records what EXECUTED, not merely what passed.\n\nThe v1 bundle carried `{passed, failed, skipped}` scenario-file lists. Those three cannot express the distinction the whole program turns on: a scenario file counted as `passed` whether its assertions ran or its runner returned early, and a `skipped` entry could mean 'the operator excluded this', 'the requirement does not apply', or 'we could not check' — three claims with different consequences flattened into one word.\n\nv2 replaces the lists with per-requirement dispositions from RFC 0148 §A, and adds the counts §A.4 requires so a reader can tell a thorough run from a thin one without re-running it. `blocked` is its own total precisely because it is the one that invalidates a claim.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": true,
|
|
8
|
-
"required": [
|
|
8
|
+
"required": [
|
|
9
|
+
"bundleVersion",
|
|
10
|
+
"suite",
|
|
11
|
+
"host",
|
|
12
|
+
"discovery",
|
|
13
|
+
"claimedProfiles",
|
|
14
|
+
"results",
|
|
15
|
+
"scenarioManifestSha256",
|
|
16
|
+
"targetConfigurationSha256"
|
|
17
|
+
],
|
|
9
18
|
"properties": {
|
|
10
|
-
"bundleVersion": {
|
|
19
|
+
"bundleVersion": {
|
|
20
|
+
"const": "2"
|
|
21
|
+
},
|
|
11
22
|
"suite": {
|
|
12
23
|
"type": "object",
|
|
13
24
|
"additionalProperties": false,
|
|
14
|
-
"required": [
|
|
25
|
+
"required": [
|
|
26
|
+
"package",
|
|
27
|
+
"version"
|
|
28
|
+
],
|
|
15
29
|
"properties": {
|
|
16
|
-
"package": {
|
|
17
|
-
|
|
30
|
+
"package": {
|
|
31
|
+
"type": "string",
|
|
32
|
+
"minLength": 1
|
|
33
|
+
},
|
|
34
|
+
"version": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z.-]+)?$",
|
|
37
|
+
"description": "The suite version that produced this bundle. A SemVer prerelease is admitted because RFC 0168 §D.3 makes the 2.x suite one package with `--target-major`: a v1 host measured by a prerelease 2.x suite legitimately emits a v2 bundle whose `suite.version` is `2.0.0-rc.N`. The original three-part-only pattern predates that decision and made such a bundle unvalidatable — found in Phase 4 when a host pinned to the RC line tried to certify."
|
|
38
|
+
}
|
|
18
39
|
}
|
|
19
40
|
},
|
|
20
41
|
"host": {
|
|
21
42
|
"type": "object",
|
|
22
43
|
"additionalProperties": true,
|
|
23
|
-
"required": [
|
|
44
|
+
"required": [
|
|
45
|
+
"name",
|
|
46
|
+
"version"
|
|
47
|
+
],
|
|
24
48
|
"properties": {
|
|
25
|
-
"name": {
|
|
26
|
-
|
|
27
|
-
|
|
49
|
+
"name": {
|
|
50
|
+
"type": "string",
|
|
51
|
+
"minLength": 1
|
|
52
|
+
},
|
|
53
|
+
"version": {
|
|
54
|
+
"type": "string",
|
|
55
|
+
"minLength": 1
|
|
56
|
+
},
|
|
57
|
+
"vendor": {
|
|
58
|
+
"type": "string"
|
|
59
|
+
},
|
|
28
60
|
"commit": {
|
|
29
61
|
"type": "string",
|
|
30
62
|
"minLength": 1,
|
|
@@ -40,41 +72,80 @@
|
|
|
40
72
|
"discovery": {
|
|
41
73
|
"type": "object",
|
|
42
74
|
"additionalProperties": true,
|
|
43
|
-
"required": [
|
|
75
|
+
"required": [
|
|
76
|
+
"sha256",
|
|
77
|
+
"document"
|
|
78
|
+
],
|
|
44
79
|
"properties": {
|
|
45
|
-
"url": {
|
|
46
|
-
|
|
47
|
-
|
|
80
|
+
"url": {
|
|
81
|
+
"type": "string"
|
|
82
|
+
},
|
|
83
|
+
"sha256": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
86
|
+
},
|
|
87
|
+
"document": {
|
|
88
|
+
"type": "object"
|
|
89
|
+
}
|
|
48
90
|
}
|
|
49
91
|
},
|
|
50
92
|
"claimedProfiles": {
|
|
51
93
|
"type": "array",
|
|
52
94
|
"minItems": 1,
|
|
53
95
|
"uniqueItems": true,
|
|
54
|
-
"items": {
|
|
96
|
+
"items": {
|
|
97
|
+
"type": "string",
|
|
98
|
+
"pattern": "^openwop-[a-z0-9-]+$"
|
|
99
|
+
},
|
|
55
100
|
"description": "RFC 0155 §E — canonical profile IDs only. Deprecated aliases go in `aliases`, never here, so a badge cannot be substantiated by a name that no longer means what it did."
|
|
56
101
|
},
|
|
57
102
|
"aliases": {
|
|
58
103
|
"type": "array",
|
|
59
104
|
"uniqueItems": true,
|
|
60
|
-
"items": {
|
|
105
|
+
"items": {
|
|
106
|
+
"type": "string"
|
|
107
|
+
}
|
|
61
108
|
},
|
|
62
109
|
"results": {
|
|
63
110
|
"type": "object",
|
|
64
111
|
"additionalProperties": false,
|
|
65
|
-
"required": [
|
|
112
|
+
"required": [
|
|
113
|
+
"totals",
|
|
114
|
+
"requirements"
|
|
115
|
+
],
|
|
66
116
|
"properties": {
|
|
67
117
|
"totals": {
|
|
68
118
|
"type": "object",
|
|
69
119
|
"additionalProperties": false,
|
|
70
|
-
"required": [
|
|
120
|
+
"required": [
|
|
121
|
+
"executedPass",
|
|
122
|
+
"executedFail",
|
|
123
|
+
"skipped",
|
|
124
|
+
"inapplicable",
|
|
125
|
+
"blocked"
|
|
126
|
+
],
|
|
71
127
|
"description": "RFC 0148 §A/§C. All five are REQUIRED — an omitted total is indistinguishable from zero, and `blocked: 0` asserted is a different claim from `blocked` unstated.",
|
|
72
128
|
"properties": {
|
|
73
|
-
"executedPass": {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
"
|
|
129
|
+
"executedPass": {
|
|
130
|
+
"type": "integer",
|
|
131
|
+
"minimum": 0
|
|
132
|
+
},
|
|
133
|
+
"executedFail": {
|
|
134
|
+
"type": "integer",
|
|
135
|
+
"minimum": 0
|
|
136
|
+
},
|
|
137
|
+
"skipped": {
|
|
138
|
+
"type": "integer",
|
|
139
|
+
"minimum": 0
|
|
140
|
+
},
|
|
141
|
+
"inapplicable": {
|
|
142
|
+
"type": "integer",
|
|
143
|
+
"minimum": 0
|
|
144
|
+
},
|
|
145
|
+
"blocked": {
|
|
146
|
+
"type": "integer",
|
|
147
|
+
"minimum": 0
|
|
148
|
+
}
|
|
78
149
|
}
|
|
79
150
|
},
|
|
80
151
|
"requirements": {
|
|
@@ -84,17 +155,38 @@
|
|
|
84
155
|
"items": {
|
|
85
156
|
"type": "object",
|
|
86
157
|
"additionalProperties": false,
|
|
87
|
-
"required": [
|
|
158
|
+
"required": [
|
|
159
|
+
"requirementId",
|
|
160
|
+
"scenarioId",
|
|
161
|
+
"disposition"
|
|
162
|
+
],
|
|
88
163
|
"properties": {
|
|
89
|
-
"requirementId": {
|
|
90
|
-
|
|
91
|
-
|
|
164
|
+
"requirementId": {
|
|
165
|
+
"type": "string",
|
|
166
|
+
"minLength": 1
|
|
167
|
+
},
|
|
168
|
+
"scenarioId": {
|
|
169
|
+
"type": "string",
|
|
170
|
+
"minLength": 1
|
|
171
|
+
},
|
|
172
|
+
"disposition": {
|
|
173
|
+
"enum": [
|
|
174
|
+
"executed-pass",
|
|
175
|
+
"executed-fail",
|
|
176
|
+
"skipped",
|
|
177
|
+
"inapplicable",
|
|
178
|
+
"blocked"
|
|
179
|
+
]
|
|
180
|
+
},
|
|
92
181
|
"assertionCount": {
|
|
93
182
|
"type": "integer",
|
|
94
183
|
"minimum": 0,
|
|
95
184
|
"description": "How many assertions actually ran. `executed-pass` with `assertionCount: 0` is the vacuous pass this program exists to close, and a reader can now see it."
|
|
96
185
|
},
|
|
97
|
-
"witnessSha256": {
|
|
186
|
+
"witnessSha256": {
|
|
187
|
+
"type": "string",
|
|
188
|
+
"pattern": "^[0-9a-f]{64}$"
|
|
189
|
+
},
|
|
98
190
|
"detail": {
|
|
99
191
|
"type": "string",
|
|
100
192
|
"description": "Required by RFC 0148 §A for any disposition other than `executed-pass` — an unexplained `blocked` is an outcome nobody can act on."
|
|
@@ -232,6 +232,45 @@
|
|
|
232
232
|
"additionalProperties": true,
|
|
233
233
|
"x-openwop-seeded-from": "v1"
|
|
234
234
|
},
|
|
235
|
+
"signingKeys": {
|
|
236
|
+
"type": "array",
|
|
237
|
+
"description": "RFC 0168 §E.2 — the public keys this host signs certification bundles with. A bundle signature names a keyId; a verifier resolves it HERE, in the discovery document of the host the bundle is about, and checks the Ed25519 signature with the matching publicKey. Without this array a signature attests integrity only: it proves the bundle was not altered after signing and says nothing about who signed it, because a signer can mint a keypair and a keyId at will. RFC 0168 disposed of \"an Ed25519 attestation without a key registry is a signature nobody can check\" by naming this surface; this is that surface.",
|
|
238
|
+
"items": {
|
|
239
|
+
"type": "object",
|
|
240
|
+
"additionalProperties": false,
|
|
241
|
+
"required": [
|
|
242
|
+
"keyId",
|
|
243
|
+
"alg",
|
|
244
|
+
"publicKey"
|
|
245
|
+
],
|
|
246
|
+
"properties": {
|
|
247
|
+
"keyId": {
|
|
248
|
+
"$ref": "ids.schema.json#/$defs/keyId",
|
|
249
|
+
"description": "The identifier a bundle signature carries in signature.keyId. Unique within this array."
|
|
250
|
+
},
|
|
251
|
+
"alg": {
|
|
252
|
+
"const": "ed25519",
|
|
253
|
+
"description": "RFC 0168 §E.2 fixes the attestation algorithm; no other value is defined."
|
|
254
|
+
},
|
|
255
|
+
"publicKey": {
|
|
256
|
+
"type": "string",
|
|
257
|
+
"pattern": "^[A-Za-z0-9_-]{43}$",
|
|
258
|
+
"description": "The Ed25519 public key, base64url, unpadded (32 bytes) — the half that verifies, never the half that signs."
|
|
259
|
+
},
|
|
260
|
+
"use": {
|
|
261
|
+
"enum": [
|
|
262
|
+
"certification-bundle"
|
|
263
|
+
],
|
|
264
|
+
"description": "What the key signs. Closed, so a future use is an explicit addition rather than a reinterpretation of a key already published for something else."
|
|
265
|
+
},
|
|
266
|
+
"retiredAt": {
|
|
267
|
+
"type": "string",
|
|
268
|
+
"format": "date-time",
|
|
269
|
+
"description": "When the key stopped signing. A retired key stays listed so bundles it already signed remain verifiable; dropping it would silently invalidate historical evidence, which is the opposite of what an evidence trail is for."
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
},
|
|
235
274
|
"discovery": {
|
|
236
275
|
"type": "object",
|
|
237
276
|
"description": "Discovery advertisement (capabilities-change-detection.md). Optional in v1; absence means the host serves only the public unauthenticated payload at /.well-known/openwop. Landed by RFC 0011.",
|
|
@@ -254,7 +254,7 @@
|
|
|
254
254
|
"properties": {
|
|
255
255
|
"id": {
|
|
256
256
|
"type": "string",
|
|
257
|
-
"pattern": "^openwop\\.(?!it\\.(?:artifact-schema-compile-bounded|artifact-type-legacy-ids|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|multi-region-effect-vocabulary|normative-example-extraction|openapi-asyncapi-sdk-parity|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-result-trust-monotone|v2-alias-covers-reword|v2-corpus-tag-pinned|v2-declaration-parity|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-one-signing-scheme|v2-path-parity|v2-release-identity|v2-req-only-assertions|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-threat-model-template|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
|
|
257
|
+
"pattern": "^openwop\\.(?!it\\.(?:artifact-schema-compile-bounded|artifact-type-legacy-ids|capability-example-root-layout|certification-floor-enforcement|chain-subchain-unsupported-refused|compensation-profile|core-manifest-and-extension-registry|discovery-canonical-family-no-shadow|edge-condition-truthy-falsy|effect-identity-composition|effect-identity-cross-scope|error-envelope-canonical-shape|event-codemap-complete|form-content-packs|multi-region-effect-vocabulary|normative-example-extraction|openapi-asyncapi-sdk-parity|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-result-trust-monotone|v2-alias-covers-reword|v2-corpus-tag-pinned|v2-declaration-parity|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-bundle-signature-attributable|v2-one-signing-scheme|v2-path-parity|v2-release-identity|v2-req-only-assertions|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-threat-model-template|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
|
|
258
258
|
"description": "RFC 0168 §A.1 — `openwop.<area>.<slug>`. The suite mints six areas: `requirement` (an explicit `req()` id), `it` (a per-test id from the scenario file and title), `scenario` and `floor` (per-file rows), `profile` (a claimed-profile row) and `family` (a capability gate). The lookahead refuses every id minted from a corpus-coherence file: those run in the spec repo’s CI and MUST NOT appear in a host bundle (conformance.md §\"Two products, two ledgers\"; RFC 0168 §D.1). `scripts/check-req-only.mjs` fails when the list drifts from `conformance/src/coherence/`."
|
|
259
259
|
},
|
|
260
260
|
"scenario": {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"provenance": {
|
|
5
5
|
"suite": {
|
|
6
6
|
"package": "@openwop/openwop-conformance",
|
|
7
|
-
"version": "2.0.0-rc.
|
|
7
|
+
"version": "2.0.0-rc.9"
|
|
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": "03105c89cfcd1316eb053e75983e59e117a7bbee189b60e69adfef1dea9ae900"
|
|
423
423
|
}
|
package/spec/v2/declaration.json
CHANGED
|
@@ -121,6 +121,13 @@
|
|
|
121
121
|
"note": null,
|
|
122
122
|
"disposition": "kept"
|
|
123
123
|
},
|
|
124
|
+
{
|
|
125
|
+
"key": "signingKeys",
|
|
126
|
+
"kind": "metadata",
|
|
127
|
+
"schema": "metadata/signingKeys",
|
|
128
|
+
"note": "host bundle-signing public keys (RFC 0168 §E.2); v2-only — the surface the RFC named when it disposed of \"a signature nobody can check\"",
|
|
129
|
+
"disposition": "kept"
|
|
130
|
+
},
|
|
124
131
|
{
|
|
125
132
|
"key": "discovery",
|
|
126
133
|
"kind": "metadata",
|
package/spec/v2/release.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"$comment": "RFC 0172
|
|
3
|
-
"version": "2.0.0-rc.
|
|
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.0-rc.9",
|
|
4
4
|
"corpusTag": null,
|
|
5
5
|
"updated": "2026-09-03"
|
|
6
6
|
}
|