@openwop/openwop-conformance 2.4.0 → 2.4.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/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# `@openwop/openwop-conformance` Changelog
|
|
2
2
|
|
|
3
|
+
## [2.4.1] — 2026-09-18 — the leg that reads the host, not the schema
|
|
4
|
+
|
|
5
|
+
**Why a patch.** A leg is added to an existing scenario file; no file is added or removed.
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
- **`v2-chain-pin-exact`** gains a third leg: an EXTERNAL `subChainRef` carrying
|
|
10
|
+
`version: "^1.0.0"`. The existing legs are satisfied by schema validation
|
|
11
|
+
alone (sabotage-proved: delete the reference host's pin rule and both stay
|
|
12
|
+
green); `SubChainRef.ref` types the external `version` as a semver range, so
|
|
13
|
+
this leg is the only one that reads the host's rule.
|
|
14
|
+
|
|
3
15
|
## [2.4.0] — 2026-09-18 — every bound kind, not just runId
|
|
4
16
|
|
|
5
17
|
**Why a minor.** One scenario file is added (`PROTOCOL-STATUS.md` §suite version).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/openwop-conformance",
|
|
3
|
-
"version": "2.4.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "Production-ready black-box conformance suite for OpenWOP v1.0 compliant servers.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -56,6 +56,6 @@
|
|
|
56
56
|
"@openwop/spec-artifacts": "file:../spec-artifacts"
|
|
57
57
|
},
|
|
58
58
|
"peerDependencies": {
|
|
59
|
-
"@openwop/spec-artifacts": "2.4.
|
|
59
|
+
"@openwop/spec-artifacts": "2.4.1"
|
|
60
60
|
}
|
|
61
61
|
}
|
package/requirements.json
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
"generatedFrom": "src/scenarios/*.test.ts",
|
|
4
4
|
"counts": {
|
|
5
5
|
"files": 571,
|
|
6
|
-
"tests":
|
|
7
|
-
"withStableId":
|
|
6
|
+
"tests": 2173,
|
|
7
|
+
"withStableId": 2173,
|
|
8
8
|
"interpolatedTitles": 0,
|
|
9
|
-
"explicitIds":
|
|
9
|
+
"explicitIds": 2126
|
|
10
10
|
},
|
|
11
11
|
"records": [
|
|
12
12
|
{
|
|
@@ -26310,7 +26310,7 @@
|
|
|
26310
26310
|
{
|
|
26311
26311
|
"id": "openwop.it.v2-chain-pin-exact.a-chain-reference-carrying-a-range-core-ai-callprompt-1-is-refused-at-register",
|
|
26312
26312
|
"file": "v2-chain-pin-exact.test.ts",
|
|
26313
|
-
"line":
|
|
26313
|
+
"line": 116,
|
|
26314
26314
|
"title": "a chain reference carrying a range (core.ai.callPrompt@^1) is refused at register",
|
|
26315
26315
|
"explicitId": "openwop.requirement.0177.chain-pin-exact.range-refused",
|
|
26316
26316
|
"citations": [
|
|
@@ -26325,10 +26325,28 @@
|
|
|
26325
26325
|
}
|
|
26326
26326
|
]
|
|
26327
26327
|
},
|
|
26328
|
+
{
|
|
26329
|
+
"id": "openwop.it.v2-chain-pin-exact.an-external-sub-chain-reference-carrying-a-range-is-refused-the-one-pin-the-sche",
|
|
26330
|
+
"file": "v2-chain-pin-exact.test.ts",
|
|
26331
|
+
"line": 125,
|
|
26332
|
+
"title": "an EXTERNAL sub-chain reference carrying a range is refused — the one pin the schema cannot catch",
|
|
26333
|
+
"explicitId": "openwop.requirement.0177.chain-pin-exact.external-range-refused",
|
|
26334
|
+
"citations": [
|
|
26335
|
+
{
|
|
26336
|
+
"section": "workflow-chain-packs.md §\"Exact pins\" (RFC 0177 §E.1)",
|
|
26337
|
+
"requirement": null,
|
|
26338
|
+
"interpolated": true
|
|
26339
|
+
},
|
|
26340
|
+
{
|
|
26341
|
+
"section": "workflow-chain-packs.md §\"Exact pins\" (RFC 0177 §E.1)",
|
|
26342
|
+
"requirement": "the refusal MUST carry an error code in the canonical envelope"
|
|
26343
|
+
}
|
|
26344
|
+
]
|
|
26345
|
+
},
|
|
26328
26346
|
{
|
|
26329
26347
|
"id": "openwop.it.v2-chain-pin-exact.a-chain-reference-pinning-an-exact-version-core-ai-callprompt-1-0-0-registers",
|
|
26330
26348
|
"file": "v2-chain-pin-exact.test.ts",
|
|
26331
|
-
"line":
|
|
26349
|
+
"line": 140,
|
|
26332
26350
|
"title": "a chain reference pinning an exact version (core.ai.callPrompt@1.0.0) registers",
|
|
26333
26351
|
"explicitId": "openwop.requirement.0177.chain-pin-exact.exact-accepted",
|
|
26334
26352
|
"citations": [
|
|
@@ -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.4.
|
|
5
|
-
"corpusTag": "v2.4.
|
|
4
|
+
"version": "2.4.1",
|
|
5
|
+
"corpusTag": "v2.4.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": "f6385deac1f8292cce87c896725bcf709308b65dfb8050f9f8113a99492596c2",
|
|
13
|
+
"api/v2/asyncapi.yaml": "edc8d91a418cc29fea8d4cbe20ad1a69af8a26c0addf9b55e29d2fbea50716b0",
|
|
14
|
+
"api/v2/openapi.yaml": "ff765953f64a79f6d7e28e3d1e4adff7d912feb03e5ee804af2bffacbd8da2b3",
|
|
15
15
|
"api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
|
|
16
16
|
"schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
|
|
17
17
|
"schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
|
|
@@ -200,7 +200,7 @@
|
|
|
200
200
|
"schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
|
|
201
201
|
"spec/v1/alias-detectors.json": "e90916db12d2297e2e560b2d54d2c4702d6cb3bef7179a575844687a7ec17262",
|
|
202
202
|
"spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
|
|
203
|
-
"spec/v1/core-standard-manifest.json": "
|
|
203
|
+
"spec/v1/core-standard-manifest.json": "195b0a6fa7944758b773e3814659ed7eb4791597ce08b3d5cf5e1588ab7c5702",
|
|
204
204
|
"spec/v1/deprecations.json": "c81c8f71460936c8d489d8270477c7661cf4a5d7b7bad86c98899750b5656027",
|
|
205
205
|
"spec/v1/deprecations.schema.json": "18c87e78bedc210431f795ae44c5b5d202f2f3317850d5cf86867d4f1fa1cdfb",
|
|
206
206
|
"spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
|
|
@@ -219,7 +219,7 @@
|
|
|
219
219
|
"spec/v2/core/errors.md": "ad85fc830139e587f20deabf88297b91b1fb6ce31e80d5442624a650246ab16e",
|
|
220
220
|
"spec/v2/core/events.md": "f1bac16419740f3b722febb6f5caaabed8838e092cba3d080fe9184024049dcf",
|
|
221
221
|
"spec/v2/core/form-content-packs.md": "6ffaae85d4550be48dd53fb6e2959af8aceb35bd87c5343b722885084f197713",
|
|
222
|
-
"spec/v2/core/headers.md": "
|
|
222
|
+
"spec/v2/core/headers.md": "91167479e63afd8fcfa1f5ee8f5da965eef8fd1cde87135911792dd2effa1b05",
|
|
223
223
|
"spec/v2/core/idempotency.md": "b86c352d964aebad532727f314e26ed2177d49de382076fa64d3162e2f56118d",
|
|
224
224
|
"spec/v2/core/identity.md": "9d2b823eb899463807452fe5721dcf09881837c161be024175957db27870b243",
|
|
225
225
|
"spec/v2/core/interop.md": "d4c404e469e1d9d9be88bc2c939d777e7d7c1d0419b1251c18770f039838a401",
|
|
@@ -271,8 +271,8 @@
|
|
|
271
271
|
"spec/v2/path-manifest.json": "a6f4e652e866889e8bde815874062f62929aee95dc8e58e7152c56adee262163",
|
|
272
272
|
"spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
|
|
273
273
|
"spec/v2/profiles.json": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
|
|
274
|
-
"spec/v2/release.json": "
|
|
274
|
+
"spec/v2/release.json": "4d9ec16c653702e80967db2a08da55dd09326b5dce60e301623826a801702f78",
|
|
275
275
|
"spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
|
|
276
276
|
},
|
|
277
|
-
"corpusCommit": "
|
|
277
|
+
"corpusCommit": "7e0c22fdb50aac7803ca4d9bf46c0406ae944b78"
|
|
278
278
|
}
|
|
@@ -76,6 +76,20 @@ function chainPack(name: string, reference: string): Record<string, unknown> {
|
|
|
76
76
|
}],
|
|
77
77
|
};
|
|
78
78
|
}
|
|
79
|
+
/**
|
|
80
|
+
* The same fixture with an EXTERNAL sub-chain reference. `SubChainRef.ref`
|
|
81
|
+
* oneOf[1] types `version` as a semver RANGE, so — unlike the node reference
|
|
82
|
+
* above — the schema cannot refuse a range here. A host either carries the
|
|
83
|
+
* §Exact pins rule or it does not, and this is the only shape that tells the
|
|
84
|
+
* two apart.
|
|
85
|
+
*/
|
|
86
|
+
function externalRefPack(name: string, version: string): Record<string, unknown> {
|
|
87
|
+
const pack = chainPack(name, 'core.ai.callPrompt@1.0.0');
|
|
88
|
+
const chain = (pack['chains'] as Array<Record<string, unknown>>)[0] as Record<string, unknown>;
|
|
89
|
+
chain['subChains'] = [{ ref: { packName: 'core.openwop.v2-pin-external', chainId: 'c.remote', version } }];
|
|
90
|
+
return pack;
|
|
91
|
+
}
|
|
92
|
+
|
|
79
93
|
async function publish(manifest: Record<string, unknown>) {
|
|
80
94
|
const name = manifest['name'] as string;
|
|
81
95
|
const version = manifest['version'] as string;
|
|
@@ -108,6 +122,21 @@ describe('v2-chain-pin-exact (RFC 0177 §E.1)', () => {
|
|
|
108
122
|
expect(typeof readErrorCode(res.json), req('openwop.requirement.0177.chain-pin-exact.range-refused', SECTION, 'the refusal MUST carry an error code in the canonical envelope')).toBe('string');
|
|
109
123
|
});
|
|
110
124
|
|
|
125
|
+
it('an EXTERNAL sub-chain reference carrying a range is refused — the one pin the schema cannot catch', async () => {
|
|
126
|
+
const skip = await preflight();
|
|
127
|
+
if (skip) return softSkip(skip.kind, skip.reason);
|
|
128
|
+
// Measured 2026-09-18 on both production hosts: the external branch is
|
|
129
|
+
// typed, reachable and UNEXERCISED — every shipped pack uses the sibling
|
|
130
|
+
// string form — so nothing on either host would have noticed a range here.
|
|
131
|
+
// The two legs above are satisfied by schema validation alone (sabotage on
|
|
132
|
+
// the reference host: delete its pin rule and they stay green), which is
|
|
133
|
+
// why this leg exists: it is the only one that reads the HOST's rule.
|
|
134
|
+
const res = await publish(externalRefPack(freshName('chain-ext-range'), '^1.0.0'));
|
|
135
|
+
if (res.status === 404) return softSkip('blocked', 'packs-test publish seam answered 404 — seams profile advertised but the seam is not mounted');
|
|
136
|
+
expect(res.status >= 400 && res.status < 500, req('openwop.requirement.0177.chain-pin-exact.external-range-refused', SECTION, `an external reference carrying a range MUST be refused at register — the schema types this field as a semver range, so only the host's rule can refuse it (got ${res.status})`)).toBe(true);
|
|
137
|
+
expect(typeof readErrorCode(res.json), req('openwop.requirement.0177.chain-pin-exact.external-range-refused', SECTION, 'the refusal MUST carry an error code in the canonical envelope')).toBe('string');
|
|
138
|
+
});
|
|
139
|
+
|
|
111
140
|
it('a chain reference pinning an exact version (core.ai.callPrompt@1.0.0) registers', async () => {
|
|
112
141
|
const skip = await preflight();
|
|
113
142
|
if (skip) return softSkip(skip.kind, skip.reason);
|