@openwop/spec-artifacts 2.40.0 → 2.40.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 +15 -13
- 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/schemas/v2/certification-bundle.schema.json +8 -1
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/gaps.json +121 -2
- package/spec/v2/core/conformance.md +4 -1
- package/spec/v2/core/oauth.md +4 -4
- package/spec/v2/harness-trust-anchors.json +50 -0
- package/spec/v2/harness-trust-anchors.schema.json +29 -0
- package/spec/v2/release.json +2 -2
- package/spec/v2/surface-baseline.json +5 -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.40.
|
|
5
|
-
"corpusTag": "v2.40.
|
|
4
|
+
"version": "2.40.2",
|
|
5
|
+
"corpusTag": "v2.40.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": "6366b5514be71098e9ea41fc81ff52bc39db1a547b353c0b344cc2a2bf5370aa",
|
|
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": "c92bde1fb2ac949edfb50519651ac3755cfc88b8a2a8785eab0e15bcb6a8dbb9",
|
|
13
|
+
"api/v2/asyncapi.yaml": "87d5b9de8e3fa920a0ddecce7f51018f8f573b5ef14f954973a0776d3b9d9a0f",
|
|
14
|
+
"api/v2/openapi.yaml": "532467b699c179c355349c8bb483a801156a68b003d02aa9d7cf576f867c3097",
|
|
15
15
|
"api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
|
|
16
16
|
"schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
|
|
17
17
|
"schemas/a2a-task-state.schema.json": "75d5049dea8bd873ff0e7546f1c60c8d36c219bec7084264360be54a8be30ae1",
|
|
@@ -117,7 +117,7 @@
|
|
|
117
117
|
"schemas/v2/audit-verify-result.schema.json": "a748dfadb5155adfde8a91045e76b0db6695005fe559035d71670fdd55edb3ba",
|
|
118
118
|
"schemas/v2/budget-policy.schema.json": "c7449daeb6e1d95e7a047b8c2814d3d54748697c27046972834874867d9b5f4c",
|
|
119
119
|
"schemas/v2/capabilities.schema.json": "740944d7f0a00c91308449f3a3f52fa7b91b16b8fd36a0171b917afe9f4b0f09",
|
|
120
|
-
"schemas/v2/certification-bundle.schema.json": "
|
|
120
|
+
"schemas/v2/certification-bundle.schema.json": "82ce31a1ed6c7e21b0ba88ff62a7b8b768fc3b176b1d06fce023203830b94725",
|
|
121
121
|
"schemas/v2/channel-presence-payload.schema.json": "4eeb224910e6f7eee3ab5e7c3899559c25c83a26d0022e0ad195c4672611977a",
|
|
122
122
|
"schemas/v2/channel-written-payload.schema.json": "ccecff3c71a3275ad8db035ac0e04db25e6f8d23cf091ddbcd5a60d1be1cbb6b",
|
|
123
123
|
"schemas/v2/chat-card-pack-manifest.schema.json": "92a57db2fd4b2463f14ef155fef8e3f18afc78960b646459dcf32efc79ff6bf5",
|
|
@@ -204,13 +204,13 @@
|
|
|
204
204
|
"schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
|
|
205
205
|
"spec/v1/alias-detectors.json": "2401fcb1c18cdd688c018b3d716ae6bca85c5e356220ee2b793bd9d81872412d",
|
|
206
206
|
"spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
|
|
207
|
-
"spec/v1/core-standard-manifest.json": "
|
|
207
|
+
"spec/v1/core-standard-manifest.json": "a16e3a91b9121d7b6d58fd9f65a348f92a07636417406f56bc3173571e9d55ea",
|
|
208
208
|
"spec/v1/deprecations.json": "2d03f4729810280147ea08c630ea65434f2dc5370567d0aac41c3595f8337d40",
|
|
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": "
|
|
213
|
+
"spec/v1/gaps.json": "3decfec271c30f796ba76586ca06ab31e6ea3b8bcae174c3af0b8bb1c19709b5",
|
|
214
214
|
"spec/v1/gaps.schema.json": "8fd83259f556553c9df0f53e7a82ca8c2a4771d471197f69b4e2ae0ceeacfd66",
|
|
215
215
|
"spec/v1/migrations.json": "8839497d6a4830b53fa7867014a8336f0d725ef2346352e54fb580b7947897af",
|
|
216
216
|
"spec/v1/migrations.schema.json": "886779aa6c22e646db097f5df210adb018a4dd14a7b815465a18c8a7056c8f72",
|
|
@@ -218,7 +218,7 @@
|
|
|
218
218
|
"spec/v1/spec-gaps.json": "ea9612af55bea9dae3e82223d4f714243f8f590b0193f1188257b13491a38afc",
|
|
219
219
|
"spec/v2/README.md": "ccfed7d978ce7293a6d8f3c0f6045835dfb7e488f2b67a68f6b04d67c4b0cfc9",
|
|
220
220
|
"spec/v2/core/capabilities.md": "e22381fed3a93376ad478fa7f07571fdad9653aefd7c05f189a2ef45a49f6c63",
|
|
221
|
-
"spec/v2/core/conformance.md": "
|
|
221
|
+
"spec/v2/core/conformance.md": "e4d3b34ef5b7c6a34675ed59a086143e8bfd0e00d0d04ce0f2a2ec6245275084",
|
|
222
222
|
"spec/v2/core/connection-packs.md": "7257339a4fc125011bf89961588c949cb058a0c0f7d9808ad08a5288deb3f8fc",
|
|
223
223
|
"spec/v2/core/conversation.md": "c9a937e410fdb4e092cec2f05a7cab8b5232745090cfb20041c03c70ccbb5cdc",
|
|
224
224
|
"spec/v2/core/errors.md": "619cd74381c41acf33d012eb1afd834e148ac292663a1a6fa6744dbaff9661d9",
|
|
@@ -231,7 +231,7 @@
|
|
|
231
231
|
"spec/v2/core/interop.md": "9a6b37e07c0235856199ace6b3a84f592fa5903fcf6c442f8a18f4d6b6aa5525",
|
|
232
232
|
"spec/v2/core/interrupt.md": "1dc94f7c791dd5a547b1abafde6a8a76acd3d2993d288057f302f57911dc83bf",
|
|
233
233
|
"spec/v2/core/node-pack-runtimes.md": "c435ad506f618831b6c0a9fd9150d83a5dc6caa1e3d755b949af2ff8949f1140",
|
|
234
|
-
"spec/v2/core/oauth.md": "
|
|
234
|
+
"spec/v2/core/oauth.md": "38ec0e70d46f328430138559095f261ae4fcd3d32c2d994a2d3e630a062c0e6c",
|
|
235
235
|
"spec/v2/core/overview.md": "8f9d4a68b6185664e40d226cb82d9a9270a6c6630e3db59bddff300be781947d",
|
|
236
236
|
"spec/v2/core/packs.md": "91cd577b4a636c1587ef78742e583a203244b8508b289b01a18a8ef2ef0a9b3e",
|
|
237
237
|
"spec/v2/core/persistence.md": "d32736bd74e51df7c552565b4105a8ec801ece6d2292c8676421368ee9bffec1",
|
|
@@ -284,6 +284,8 @@
|
|
|
284
284
|
"spec/v2/facets/supportedEnvelopes.schema.json": "644f22cc2236e30a611b5b7f1ba0458ff1925d68b94c514d9672583224e126bd",
|
|
285
285
|
"spec/v2/facets/webhooks.schema.json": "2fac635ee5fbc10a14a1a46cf512a11bac660bfbabe0aea79f6c7b657ecb9e4e",
|
|
286
286
|
"spec/v2/facets/workflowChainPacks.schema.json": "ea625ce818fbeb746478f00f31f96ee9613d538e4409c258c1bfb517acdeaba9",
|
|
287
|
+
"spec/v2/harness-trust-anchors.json": "6007b92eae16a070fbc3777424efb0abfe865fda89d096963109b96282b91205",
|
|
288
|
+
"spec/v2/harness-trust-anchors.schema.json": "372b5d92337c893d3449eff3f6bfd009ac09fdac285296d8bdbe0a08fff9e34c",
|
|
287
289
|
"spec/v2/id-field-bindings.json": "9f6fd280250447e26a6704811c352bb8f2ff6c4bd242befe3da0ba38962370e9",
|
|
288
290
|
"spec/v2/interop-map.json": "02255dafe7eb55f61ca7f9ae7c21f079d1848a6756991343088975ac9d184b8d",
|
|
289
291
|
"spec/v2/interop-map.schema.json": "0017c882df34ee215e2e0729de051490e09d43aac3d2c949285698ed51832f12",
|
|
@@ -292,9 +294,9 @@
|
|
|
292
294
|
"spec/v2/path-manifest.json": "ae9b56d03a701061fd48ad0b73cb0373493f6a4547da92763b422295b5e19535",
|
|
293
295
|
"spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
|
|
294
296
|
"spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
|
|
295
|
-
"spec/v2/release.json": "
|
|
297
|
+
"spec/v2/release.json": "f04bc2406dfc3af40a495d8750349409f053bb56f009359ebc62a8877251c90f",
|
|
296
298
|
"spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624",
|
|
297
|
-
"spec/v2/surface-baseline.json": "
|
|
299
|
+
"spec/v2/surface-baseline.json": "26f2a03c650413ac9c0d0b5facee47ee0eaebeb01d377c808fe6e737bb08687c"
|
|
298
300
|
},
|
|
299
|
-
"corpusCommit": "
|
|
301
|
+
"corpusCommit": "70c93c0fcd5c595893c1cac7cf1020d5c5835ec2"
|
|
300
302
|
}
|
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.40.
|
|
4
|
+
version: 2.40.2
|
|
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.40.
|
|
4
|
+
version: 2.40.2
|
|
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.40.
|
|
4
|
+
version: 2.40.2
|
|
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.40.
|
|
3
|
+
"version": "2.40.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": {
|
|
@@ -132,6 +132,13 @@
|
|
|
132
132
|
}
|
|
133
133
|
},
|
|
134
134
|
"description": "RFC 0173 §A.2 — operator relaxations; a relaxed obligation's profile cannot certify."
|
|
135
|
+
},
|
|
136
|
+
"deployment": {
|
|
137
|
+
"type": "string",
|
|
138
|
+
"enum": [
|
|
139
|
+
"colocated-companion"
|
|
140
|
+
],
|
|
141
|
+
"description": "RFC 0216 §B — present only on a bundle cut from a colocated companion (the served host's image, run beside the suite so it can trust a suite-held trust anchor). Inside the witnessSha256 preimage when present. Absent: the bundle measures the served host. A companion is acceptance evidence only for spec/v2/harness-trust-anchors.json rows, and only when it pairs with a served-host bundle (RFC 0216 §C)."
|
|
135
142
|
}
|
|
136
143
|
}
|
|
137
144
|
},
|
|
@@ -259,7 +266,7 @@
|
|
|
259
266
|
"properties": {
|
|
260
267
|
"id": {
|
|
261
268
|
"type": "string",
|
|
262
|
-
"pattern": "^openwop\\.(?!it\\.(?:a2a-parts-schemas|a2ui-v09-profile|artifact-schema-compile-bounded|artifact-type-legacy-ids|bundle-maturity-gate|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|locale-key-grammar|multi-region-effect-vocabulary|node-pack-mcp-server-record|normative-example-extraction|openapi-asyncapi-sdk-parity|openapi-security-declared|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|removal-dates-minor|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-descriptor-annotations|tool-result-trust-monotone|v1-webhook-rotation-contract|v1-webhook-unregister-contract|v2-alias-covers-reword|v2-bundle-signature-attributable|v2-bundle-witness-preimage|v2-corpus-tag-pinned|v2-declaration-parity|v2-envelope-catalog|v2-eos-clock|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-facet-advertisement|v2-front-door-counts|v2-id-kinds-bound|v2-interop-map-coherent|v2-lane-exp-only-schema|v2-normative-home-gate|v2-one-signing-scheme|v2-path-parity|v2-push-credential-coherent|v2-release-identity|v2-req-only-assertions|v2-retention-floors|v2-retirement-gate|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-surface-monotone-gate|v2-threat-model-template|v2-umbrella-alias-covered|v2-umbrella-child-parts|v2-umbrella-codemod-at-active|v2-umbrella-codemod-legs|v2-umbrella-migration-deprecation|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
|
|
269
|
+
"pattern": "^openwop\\.(?!it\\.(?:a2a-parts-schemas|a2ui-v09-profile|artifact-schema-compile-bounded|artifact-type-legacy-ids|bundle-maturity-gate|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|locale-key-grammar|multi-region-effect-vocabulary|node-pack-mcp-server-record|normative-example-extraction|openapi-asyncapi-sdk-parity|openapi-security-declared|pack-manifest-extensions|protocol-version-grammar|registry-declarative-kinds|removal-dates-minor|rfc-0147-self-audit|rfc-lifecycle-coherence|semantic-digest-v2|spec-corpus-validity|spec-section-citations|tool-descriptor-annotations|tool-result-trust-monotone|v1-webhook-rotation-contract|v1-webhook-unregister-contract|v2-alias-covers-reword|v2-bundle-signature-attributable|v2-bundle-witness-preimage|v2-colocated-companion|v2-corpus-tag-pinned|v2-declaration-parity|v2-envelope-catalog|v2-eos-clock|v2-error-registry-prose-parity|v2-event-naming-rule|v2-events-channel-parity|v2-externally-gated-never-stable|v2-facet-advertisement|v2-front-door-counts|v2-id-kinds-bound|v2-interop-map-coherent|v2-lane-exp-only-schema|v2-normative-home-gate|v2-one-signing-scheme|v2-path-parity|v2-push-credential-coherent|v2-release-identity|v2-req-only-assertions|v2-retention-floors|v2-retirement-gate|v2-seams-not-in-canonical|v2-security-defaults-table|v2-spec-artifacts-digest|v2-surface-monotone-gate|v2-threat-model-template|v2-umbrella-alias-covered|v2-umbrella-child-parts|v2-umbrella-codemod-at-active|v2-umbrella-codemod-legs|v2-umbrella-migration-deprecation|v2-witness-required|versioned-composition-profiles|workflow-chain-internal-flag|workload-identity-profile)\\.)(requirement|it|scenario|floor|profile|family)\\.[a-z0-9]",
|
|
263
270
|
"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/`."
|
|
264
271
|
},
|
|
265
272
|
"scenario": {
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"provenance": {
|
|
5
5
|
"suite": {
|
|
6
6
|
"package": "@openwop/openwop-conformance",
|
|
7
|
-
"version": "2.40.
|
|
7
|
+
"version": "2.40.2"
|
|
8
8
|
},
|
|
9
9
|
"note": "Derived from the corpus at generation time. Regenerate with --write; verify with --check."
|
|
10
10
|
},
|
|
@@ -420,5 +420,5 @@
|
|
|
420
420
|
"$id": "https://openwop.dev/spec/v1/workspace-file.schema.json"
|
|
421
421
|
}
|
|
422
422
|
],
|
|
423
|
-
"digest": "
|
|
423
|
+
"digest": "01cb5cdd05115c4f87200539c5f03383064af5acc894df36f1793e4177983b9d"
|
|
424
424
|
}
|
package/spec/v1/gaps.json
CHANGED
|
@@ -10713,8 +10713,8 @@
|
|
|
10713
10713
|
"surface": "MyndHyve's committed v2 bundle (suite 2.35.1, 2026-09-22) advertises 38 families `stable` that `spec/v2/declaration.json` calls `experimental`. §C makes that non-conforming for bundles cut on the first suite release that ships this RFC.",
|
|
10714
10714
|
"witness": "unclassified",
|
|
10715
10715
|
"requirementId": null,
|
|
10716
|
-
"disposition": "
|
|
10717
|
-
"target":
|
|
10716
|
+
"disposition": "closed",
|
|
10717
|
+
"target": null,
|
|
10718
10718
|
"sources": [
|
|
10719
10719
|
{
|
|
10720
10720
|
"file": "RFCS/registers/0197-v2-surfaces-retired-never-reshaped.gaps.md",
|
|
@@ -12728,6 +12728,125 @@
|
|
|
12728
12728
|
}
|
|
12729
12729
|
]
|
|
12730
12730
|
},
|
|
12731
|
+
{
|
|
12732
|
+
"id": "openwop.gap.0216.1",
|
|
12733
|
+
"rfc": "0216",
|
|
12734
|
+
"local": "G1",
|
|
12735
|
+
"section": "§C.10",
|
|
12736
|
+
"surface": "The committed companion `openwop-app-colocated-companion.json` is unmarked, `commit`-kind, and signed with a throwaway key, and the gate counts all of its rows.",
|
|
12737
|
+
"witness": "unclassified",
|
|
12738
|
+
"requirementId": null,
|
|
12739
|
+
"disposition": "closed",
|
|
12740
|
+
"target": null,
|
|
12741
|
+
"sources": [
|
|
12742
|
+
{
|
|
12743
|
+
"file": "RFCS/registers/0216-colocated-witness-for-harness-trust-anchor-rows.gaps.md",
|
|
12744
|
+
"token": "G1"
|
|
12745
|
+
}
|
|
12746
|
+
]
|
|
12747
|
+
},
|
|
12748
|
+
{
|
|
12749
|
+
"id": "openwop.gap.0216.2",
|
|
12750
|
+
"rfc": "0216",
|
|
12751
|
+
"local": "G2",
|
|
12752
|
+
"section": "§C.9(c)",
|
|
12753
|
+
"surface": "Whether a companion must be signed under a key the production host publishes, or whether a citation by digest from P is enough.",
|
|
12754
|
+
"witness": "unclassified",
|
|
12755
|
+
"requirementId": null,
|
|
12756
|
+
"disposition": "closed",
|
|
12757
|
+
"target": null,
|
|
12758
|
+
"sources": [
|
|
12759
|
+
{
|
|
12760
|
+
"file": "RFCS/registers/0216-colocated-witness-for-harness-trust-anchor-rows.gaps.md",
|
|
12761
|
+
"token": "G2"
|
|
12762
|
+
}
|
|
12763
|
+
]
|
|
12764
|
+
},
|
|
12765
|
+
{
|
|
12766
|
+
"id": "openwop.gap.0216.3",
|
|
12767
|
+
"rfc": "0216",
|
|
12768
|
+
"local": "G3",
|
|
12769
|
+
"section": "§C.9(d) / Unresolved 1–2",
|
|
12770
|
+
"surface": "Discovery equivalence covers only what discovery exposes, and the normalisation set has not been measured on a real production/companion pair of one image.",
|
|
12771
|
+
"witness": "unclassified",
|
|
12772
|
+
"requirementId": null,
|
|
12773
|
+
"disposition": "transferred",
|
|
12774
|
+
"target": "rfc-0216",
|
|
12775
|
+
"sources": [
|
|
12776
|
+
{
|
|
12777
|
+
"file": "RFCS/registers/0216-colocated-witness-for-harness-trust-anchor-rows.gaps.md",
|
|
12778
|
+
"token": "G3"
|
|
12779
|
+
}
|
|
12780
|
+
]
|
|
12781
|
+
},
|
|
12782
|
+
{
|
|
12783
|
+
"id": "openwop.gap.0216.4",
|
|
12784
|
+
"rfc": "0216",
|
|
12785
|
+
"local": "G4",
|
|
12786
|
+
"section": "Acceptance (deferred box)",
|
|
12787
|
+
"surface": "openwop-app does not yet record its production image digest in `host.build`, and advertises no `oidc` lane at v2 in production. Both need a production deploy, which waits on the steward's `gcloud` re-auth.",
|
|
12788
|
+
"witness": "unclassified",
|
|
12789
|
+
"requirementId": null,
|
|
12790
|
+
"disposition": "externally-gated",
|
|
12791
|
+
"target": "openwop-app-production-deploy",
|
|
12792
|
+
"sources": [
|
|
12793
|
+
{
|
|
12794
|
+
"file": "RFCS/registers/0216-colocated-witness-for-harness-trust-anchor-rows.gaps.md",
|
|
12795
|
+
"token": "G4"
|
|
12796
|
+
}
|
|
12797
|
+
]
|
|
12798
|
+
},
|
|
12799
|
+
{
|
|
12800
|
+
"id": "openwop.gap.0216.5",
|
|
12801
|
+
"rfc": "0216",
|
|
12802
|
+
"local": "G5",
|
|
12803
|
+
"section": "§A",
|
|
12804
|
+
"surface": "`auth-oidc-user-bearer.test.ts` reads the issuer and is not on the list.",
|
|
12805
|
+
"witness": "unclassified",
|
|
12806
|
+
"requirementId": null,
|
|
12807
|
+
"disposition": "closed",
|
|
12808
|
+
"target": null,
|
|
12809
|
+
"sources": [
|
|
12810
|
+
{
|
|
12811
|
+
"file": "RFCS/registers/0216-colocated-witness-for-harness-trust-anchor-rows.gaps.md",
|
|
12812
|
+
"token": "G5"
|
|
12813
|
+
}
|
|
12814
|
+
]
|
|
12815
|
+
},
|
|
12816
|
+
{
|
|
12817
|
+
"id": "openwop.gap.0216.6",
|
|
12818
|
+
"rfc": "0216",
|
|
12819
|
+
"local": "G6",
|
|
12820
|
+
"section": "Alternatives 2",
|
|
12821
|
+
"surface": "Nothing binds the served digest to the served surface. `host.build` is the operator's assertion, as for every bundle. `implementation.build` was struck under the RFC 0147 §A freeze on new optional wire members.",
|
|
12822
|
+
"witness": "unclassified",
|
|
12823
|
+
"requirementId": null,
|
|
12824
|
+
"disposition": "transferred",
|
|
12825
|
+
"target": "rfc-0147-freeze",
|
|
12826
|
+
"sources": [
|
|
12827
|
+
{
|
|
12828
|
+
"file": "RFCS/registers/0216-colocated-witness-for-harness-trust-anchor-rows.gaps.md",
|
|
12829
|
+
"token": "G6"
|
|
12830
|
+
}
|
|
12831
|
+
]
|
|
12832
|
+
},
|
|
12833
|
+
{
|
|
12834
|
+
"id": "openwop.gap.0216.7",
|
|
12835
|
+
"rfc": "0216",
|
|
12836
|
+
"local": "G7",
|
|
12837
|
+
"section": "§D",
|
|
12838
|
+
"surface": "The premise that a served host must not trust a harness issuer was only an openwop-app ADR (0745 D4).",
|
|
12839
|
+
"witness": "unclassified",
|
|
12840
|
+
"requirementId": null,
|
|
12841
|
+
"disposition": "closed",
|
|
12842
|
+
"target": null,
|
|
12843
|
+
"sources": [
|
|
12844
|
+
{
|
|
12845
|
+
"file": "RFCS/registers/0216-colocated-witness-for-harness-trust-anchor-rows.gaps.md",
|
|
12846
|
+
"token": "G7"
|
|
12847
|
+
}
|
|
12848
|
+
]
|
|
12849
|
+
},
|
|
12731
12850
|
{
|
|
12732
12851
|
"id": "openwop.gap.spec.a2a-integration.g1",
|
|
12733
12852
|
"rfc": "0152",
|
|
@@ -58,6 +58,7 @@ A certification bundle validates against `schemas/v2/certification-bundle.schema
|
|
|
58
58
|
| --- | --- |
|
|
59
59
|
| `suite` | `name`, `version`, `targetMajor`, `specArtifactsVersion` REQUIRED |
|
|
60
60
|
| `host` | `name`, `version`, `build.{kind, id}` REQUIRED; `kind` is `image-digest`, `commit`, or `artifact-sha256` |
|
|
61
|
+
| `host.deployment` | OPTIONAL; `colocated-companion` only (below). Absent: the bundle measures the served host |
|
|
61
62
|
| `discovery` | `url`, `sha256`, `protocolVersions`, `preferredVersion` REQUIRED |
|
|
62
63
|
| `claimedProfiles[]` | `id`, `evidenceTier` (`self` \| `steward` \| `independent`), `witnessCount`, `certified` REQUIRED |
|
|
63
64
|
| `results` | `totals` and the per-requirement list REQUIRED |
|
|
@@ -72,11 +73,13 @@ A certification bundle validates against `schemas/v2/certification-bundle.schema
|
|
|
72
73
|
|
|
73
74
|
A signature that cannot be resolved to a published key attests **integrity only**. Such a bundle MUST NOT be read as attributable evidence, and a gate MUST distinguish three outcomes that a presence check collapses into one — *no discovery document was read*, *read and the key is not published*, and *the attestation does not verify*. A retired key MUST stay listed. `evidenceTier: independent` MUST carry a `verifierKeyId` distinct from the host's signing key; the verifier MUST refuse, not warn, on a missing or self-signed independent claim. A bundle with `totals.blocked > 0` does not certify. At major 2 a requirement a test did not observe records `blocked` even when the test asserted setup facts first; an `executed-pass` carrying a `partial-witness:` detail is reserved for a leg that observed its requirement and skipped an optional extra. A verifier MUST derive the operator's opt-outs from the signed `skipped` rows and MUST reject a bundle whose captured discovery document advertises one of them (`opted-out-but-advertised`). v1 and v2 bundles are never upgraded to v3; a bundle is evidence at its own version.
|
|
74
75
|
|
|
76
|
+
A bundle cut from a *colocated companion* — the served host's image, run beside the suite so it can trust a suite-held trust anchor — MUST carry `host.deployment: "colocated-companion"`, which the preimage covers (§"Canonical JSON"). A host serving production traffic MUST NOT list a suite-held trust anchor among the trust roots it advertises. A companion is evidence only for the requirements in `spec/v2/harness-trust-anchors.json`, and only when it pairs with a certified served-host bundle of the same `image-digest` build, signed under a key that bundle's discovery publishes, whose discovery document is equal once each document's origin and the `oidc` lane's `issuers` are set aside (RFC 0216).
|
|
77
|
+
|
|
75
78
|
### Canonical JSON
|
|
76
79
|
|
|
77
80
|
Every signature and digest in this corpus is over the RFC 8785 (JCS) serialization, UTF-8 encoded (RFC 0212). The value MUST be I-JSON (RFC 7493): a signer or hasher MUST refuse, not coerce, a value with duplicate member names, a lone surrogate, a non-finite number, an integer literal whose magnitude exceeds 2^53 − 1, or a non-JSON value, and a verifier that meets one in a document it must re-canonicalize MUST fail verification. `conformance/vectors/jcs-v1.json` is normative.
|
|
78
81
|
|
|
79
|
-
`witnessSha256` is SHA-256 over the JCS bytes of the rows — one object per `results.requirements[]` entry with exactly `id`, `scenario`, `result` and, each only when present, `assertions`, `detail`, `evidence`, sorted by `id` in UTF-16 code-unit order — or, only when `host.relaxations[]` is non-empty, of `{ "rows": …, "relaxations": … }` with relaxations in the order carried. A locale-sensitive comparator MUST NOT be used. `discovery.sha256` is SHA-256 over the JCS bytes of the captured document.
|
|
82
|
+
`witnessSha256` is SHA-256 over the JCS bytes of the rows — one object per `results.requirements[]` entry with exactly `id`, `scenario`, `result` and, each only when present, `assertions`, `detail`, `evidence`, sorted by `id` in UTF-16 code-unit order — or, only when `host.relaxations[]` is non-empty or `host.deployment` is present, of `{ "rows": …, "relaxations": …, "deployment": … }` carrying each of the last two only when so, with relaxations in the order carried. A locale-sensitive comparator MUST NOT be used. `discovery.sha256` is SHA-256 over the JCS bytes of the captured document.
|
|
80
83
|
|
|
81
84
|
### Recovery evidence
|
|
82
85
|
|
package/spec/v2/core/oauth.md
CHANGED
|
@@ -20,13 +20,13 @@ A host advertising `oauth` MUST perform only the grants in `oauth.grants` and MU
|
|
|
20
20
|
On every `authorization_code` grant the host MUST:
|
|
21
21
|
|
|
22
22
|
1. send PKCE with `S256` and never `plain`, omitting PKCE only for a provider advertised with `pkce: "unsupported"`;
|
|
23
|
-
2. send a fresh
|
|
24
|
-
3. complete the callback only for the initiating Subject (invariant `oauth-same-user-binding`);
|
|
23
|
+
2. send a fresh `state` of at least 128 bits from a CSPRNG, bound host-side to the initiating Subject and the provider, with a lifetime of at most 10 minutes, and refuse a callback whose `state` is absent, unknown, reused or expired, making no token request for it;
|
|
24
|
+
3. complete the callback only for the initiating Subject (invariant `oauth-same-user-binding`): store the credential under the Subject bound to `state`, and if the Subject authenticated on the callback request (session or bearer) differs from it, refuse and store nothing;
|
|
25
25
|
4. validate `iss` per RFC 9207 §2.4 where the provider's issuer is known (`oauth.providers[].issuer`), and otherwise give the provider a redirect URI no other provider shares (RFC 9700 §4.4.2);
|
|
26
26
|
5. use one fixed, registered redirect URI per provider.
|
|
27
27
|
|
|
28
|
-
Where the provider is reached as an MCP server, the host MUST also send `resource` (RFC 8707), the server's canonical URI, in both requests, and MUST refuse a provider whose authorization-server metadata omits `S256`. It fetches the server's Protected Resource Metadata (RFC 9728) only from URLs derived from the manifest's server URL. Discovery verifies and never selects: a discovered issuer or endpoint that differs from the manifest's, or from the tuple pinned at registration, MUST be refused `connection_auth_metadata_mismatch`, as MUST a grant for such a provider whose manifest declares no `issuer`.
|
|
28
|
+
Where the provider is reached as an MCP server, the host MUST also send `resource` (RFC 8707), the server's canonical URI, in both requests, and MUST refuse a provider whose authorization-server metadata omits `S256`. It fetches the server's Protected Resource Metadata (RFC 9728) only from URLs derived from the manifest's server URL. Discovery verifies and never selects: a discovered issuer or endpoint that differs from the manifest's, or from the tuple pinned at registration, MUST be refused `connection_auth_metadata_mismatch`, as MUST a grant for such a provider whose manifest declares no `issuer`. This binds a provider the host itself configures as well as one a connection pack defines: the configured server URL and issuer stand in for the manifest's, and the tuple is pinned when the host loads that configuration.
|
|
29
29
|
|
|
30
30
|
## The credential interrupt
|
|
31
31
|
|
|
32
|
-
A host advertising `oauth.credentialInterrupt` MUST suspend the node with a `credential` interrupt (interrupt.md) instead of failing it when no credential resolves for the Subject or refresh failed terminally. `connectUrl` MUST be host-owned, MUST NOT be pre-authenticated, and MUST complete only for the initiating Subject. The host resolves the interrupt when the grant completes; a resolve of `authorized` MUST be refused `400 validation_error` unless a credential now resolves, and `declined` fails the node with `connector_auth_declined`.
|
|
32
|
+
A host advertising `oauth.credentialInterrupt` MUST suspend the node with a `credential` interrupt (interrupt.md) instead of failing it when a node declaring `auth: { type: "oauth2", provider, scopes }` is about to run and no credential resolves for the Subject, provider and scopes (`reason: "missing"`), one resolves with fewer scopes (`"insufficient_scope"`), or refresh failed terminally (`"expired"`). `connectUrl` MUST be host-owned, MUST NOT be pre-authenticated, and MUST complete only for the initiating Subject. The host resolves the interrupt when the grant completes; a resolve of `authorized` MUST be refused `400 validation_error` unless a credential now resolves, and `declined` fails the node with `connector_auth_declined`. A host that binds a node to one credential reference (for example, a connection) reads "resolves" as that reference resolving with the node's scopes, carries it as `credentialRef`, and still completes `connectUrl` only for the initiating Subject.
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "./harness-trust-anchors.schema.json",
|
|
3
|
+
"$comment": "RFC 0216 §A — the rows a colocated companion may witness. Closed by scripts/check-harness-trust-anchors.mjs; extend only under an RFC that carries its own `### Harness-trust-anchor rows` table, and under the RFC 0147 §A.6 full window.",
|
|
4
|
+
"version": 1,
|
|
5
|
+
"updated": "2026-09-26",
|
|
6
|
+
"rows": [
|
|
7
|
+
{
|
|
8
|
+
"requirementId": "openwop.requirement.0210.exp-only-control-accepted",
|
|
9
|
+
"scenario": "v2-lane-exp-only-bound.test.ts",
|
|
10
|
+
"anchor": "oidc-test-issuer",
|
|
11
|
+
"rfc": "0216"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"requirementId": "openwop.requirement.0210.exp-only-lifetime-bound",
|
|
15
|
+
"scenario": "v2-lane-exp-only-bound.test.ts",
|
|
16
|
+
"anchor": "oidc-test-issuer",
|
|
17
|
+
"rfc": "0216"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"requirementId": "openwop.requirement.0210.exp-only-remaining-bound",
|
|
21
|
+
"scenario": "v2-lane-exp-only-bound.test.ts",
|
|
22
|
+
"anchor": "oidc-test-issuer",
|
|
23
|
+
"rfc": "0216"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"requirementId": "openwop.requirement.0210.credential-lifetime-code",
|
|
27
|
+
"scenario": "v2-lane-exp-only-bound.test.ts",
|
|
28
|
+
"anchor": "oidc-test-issuer",
|
|
29
|
+
"rfc": "0216"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"requirementId": "openwop.scenario.v2-lane-exp-only-bound",
|
|
33
|
+
"scenario": "v2-lane-exp-only-bound.test.ts",
|
|
34
|
+
"anchor": "oidc-test-issuer",
|
|
35
|
+
"rfc": "0216"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"requirementId": "openwop.requirement.0200.id-token-aud",
|
|
39
|
+
"scenario": "v2-oidc-id-token-audience.test.ts",
|
|
40
|
+
"anchor": "oidc-test-issuer",
|
|
41
|
+
"rfc": "0216"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"requirementId": "openwop.scenario.v2-oidc-id-token-audience",
|
|
45
|
+
"scenario": "v2-oidc-id-token-audience.test.ts",
|
|
46
|
+
"anchor": "oidc-test-issuer",
|
|
47
|
+
"rfc": "0216"
|
|
48
|
+
}
|
|
49
|
+
]
|
|
50
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v2/harness-trust-anchors.schema.json",
|
|
4
|
+
"title": "OpenWOP v2 harness-trust-anchor rows",
|
|
5
|
+
"description": "Shape of spec/v2/harness-trust-anchors.json (RFC 0216 §A). Each entry names a requirement whose observation needs the host to trust key material the conformance suite holds — a precondition a host serving production traffic MUST NOT meet. A bundle marked `host.deployment: \"colocated-companion\"` is acceptance evidence for these rows only (RFC 0216 §C). scripts/check-harness-trust-anchors.mjs keeps the list closed: exact ids, a closed anchor enum, agreement with the Active/Accepted RFCs' `### Harness-trust-anchor rows` tables, a scenario that mints the id and gates on the anchor, and no floor scenario. Data, not a wire artifact.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": ["$schema", "version", "updated", "rows"],
|
|
9
|
+
"properties": {
|
|
10
|
+
"$schema": { "type": "string", "const": "./harness-trust-anchors.schema.json" },
|
|
11
|
+
"$comment": { "type": "string" },
|
|
12
|
+
"version": { "type": "integer", "const": 1 },
|
|
13
|
+
"updated": { "type": "string", "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}$" },
|
|
14
|
+
"rows": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/row" } }
|
|
15
|
+
},
|
|
16
|
+
"$defs": {
|
|
17
|
+
"row": {
|
|
18
|
+
"type": "object",
|
|
19
|
+
"additionalProperties": false,
|
|
20
|
+
"required": ["requirementId", "scenario", "anchor", "rfc"],
|
|
21
|
+
"properties": {
|
|
22
|
+
"requirementId": { "type": "string", "pattern": "^openwop\\.(requirement|scenario)\\.[a-z0-9.-]+$", "description": "An exact requirement or scenario id. No wildcard or prefix form." },
|
|
23
|
+
"scenario": { "type": "string", "pattern": "^[a-z0-9-]+\\.test\\.ts$", "description": "The conformance scenario file (conformance/src/scenarios/) that mints the id." },
|
|
24
|
+
"anchor": { "type": "string", "enum": ["oidc-test-issuer"], "description": "The closed anchor vocabulary. `oidc-test-issuer`: the host lists OPENWOP_TEST_OIDC_ISSUER_URL among the `issuers` of an advertised `oidc` lane. Adding a member is a schema change under its own RFC." },
|
|
25
|
+
"rfc": { "type": "string", "pattern": "^[0-9]{4}$", "description": "The Active or Accepted RFC whose `### Harness-trust-anchor rows` table lists this id." }
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
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.40.
|
|
4
|
-
"corpusTag": "v2.40.
|
|
3
|
+
"version": "2.40.2",
|
|
4
|
+
"corpusTag": "v2.40.2",
|
|
5
5
|
"updated": "2026-09-26"
|
|
6
6
|
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"schemas/v2/**/*.json",
|
|
5
5
|
"spec/v2/path-manifest.json"
|
|
6
6
|
],
|
|
7
|
-
"release": "2.40.
|
|
7
|
+
"release": "2.40.2",
|
|
8
8
|
"kinds": {
|
|
9
9
|
"union": [
|
|
10
10
|
"channel",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"type"
|
|
19
19
|
]
|
|
20
20
|
},
|
|
21
|
-
"count":
|
|
21
|
+
"count": 7960,
|
|
22
22
|
"surfaces": [
|
|
23
23
|
"schemas/v2/a2a-task-state.schema.json#/contextId|type|string",
|
|
24
24
|
"schemas/v2/a2a-task-state.schema.json#/interruptKind|enum-member|\"approval\"",
|
|
@@ -3323,6 +3323,8 @@
|
|
|
3323
3323
|
"schemas/v2/certification-bundle.schema.json#/host/build|required|id",
|
|
3324
3324
|
"schemas/v2/certification-bundle.schema.json#/host/build|required|kind",
|
|
3325
3325
|
"schemas/v2/certification-bundle.schema.json#/host/build|type|object",
|
|
3326
|
+
"schemas/v2/certification-bundle.schema.json#/host/deployment|enum-member|\"colocated-companion\"",
|
|
3327
|
+
"schemas/v2/certification-bundle.schema.json#/host/deployment|type|string",
|
|
3326
3328
|
"schemas/v2/certification-bundle.schema.json#/host/name|type|string",
|
|
3327
3329
|
"schemas/v2/certification-bundle.schema.json#/host/relaxations/[]/durability|enum-member|\"deployment\"",
|
|
3328
3330
|
"schemas/v2/certification-bundle.schema.json#/host/relaxations/[]/durability|enum-member|\"persisted\"",
|
|
@@ -3343,6 +3345,7 @@
|
|
|
3343
3345
|
"schemas/v2/certification-bundle.schema.json#/host/version|type|string",
|
|
3344
3346
|
"schemas/v2/certification-bundle.schema.json#/host|closed|true",
|
|
3345
3347
|
"schemas/v2/certification-bundle.schema.json#/host|property|build",
|
|
3348
|
+
"schemas/v2/certification-bundle.schema.json#/host|property|deployment",
|
|
3346
3349
|
"schemas/v2/certification-bundle.schema.json#/host|property|name",
|
|
3347
3350
|
"schemas/v2/certification-bundle.schema.json#/host|property|relaxations",
|
|
3348
3351
|
"schemas/v2/certification-bundle.schema.json#/host|property|signingKeyId",
|