@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).
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "package": "@openwop/spec-artifacts",
3
- "version": "2.4.0",
4
- "stampSha256": "5b68f54de94dc0d6693867080f33f9004a4d4455648f899cd7ae8f7a6276ef38"
3
+ "version": "2.4.1",
4
+ "stampSha256": "576f2a6451072e6ae17a6398428f6fba4c8a505d80e8899431d4bcf69a2c0fec"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/openwop-conformance",
3
- "version": "2.4.0",
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.0"
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": 2172,
7
- "withStableId": 2172,
6
+ "tests": 2173,
7
+ "withStableId": 2173,
8
8
  "interpolatedTitles": 0,
9
- "explicitIds": 2125
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": 102,
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": 111,
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.0",
5
- "corpusTag": "v2.4.0",
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": "d7297c933f4987c085f1427b1cb245c0e7f88d0ab91a1d1534c7959bb659940e",
13
- "api/v2/asyncapi.yaml": "5730b64974958076b2da1e77990011228465c088334a8a5c6005e136cf86e20d",
14
- "api/v2/openapi.yaml": "cc94e454854f28d7aae5f0cab264a21dfdc8ce43259dfd30ea4e2340ede756fc",
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": "41af65d02636d651a99f0f48caa5dd5ed45be576f745166bd1510908674997e0",
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": "6f350e4a6893e82fcab40aec6cb515b989e8b56a20a74f6d10d24a0d3fdf5cf0",
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": "975e8d6100d4c0697384dd093eb586eed3f41481a26b954e052fa321525a0273",
274
+ "spec/v2/release.json": "4d9ec16c653702e80967db2a08da55dd09326b5dce60e301623826a801702f78",
275
275
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
276
276
  },
277
- "corpusCommit": "5f410d86a87e25473f8e1d63ce08e9b0947c7e43"
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);