@openwop/openwop-conformance 2.0.0-rc.56 → 2.0.0-rc.58

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/README.md CHANGED
@@ -3,7 +3,12 @@
3
3
  **openwop is an open, wire-level protocol for multi-agent workflow orchestration** — a single contract for runs in which LLM agents, deterministic tools, sub-workflows, and human reviewers collaborate, with durable suspend / resume, replay, version negotiation, and observability owned by the protocol itself. This package is the black-box conformance suite: point it at any OpenWOP-compliant server (your own or a third party's) and it issues real HTTP requests against the spec'd endpoints and asserts that responses match.
4
4
 
5
5
  ```bash
6
- npm install @openwop/openwop-conformance
6
+ # Install BOTH packages at the SAME explicit version — the suite declares
7
+ # @openwop/spec-artifacts as an exact-pinned peer, and `npm i --legacy-peer-deps`
8
+ # on the suite alone does not pull it (a host measured "corpus stamp MISMATCH —
9
+ # missing @openwop/spec-artifacts" on 2026-09-05). Pre-release 2.x is on the
10
+ # `next` dist-tag; pin the version, never the tag (runbook §0.2b).
11
+ npm install @openwop/openwop-conformance@2.0.0-rc.57 @openwop/spec-artifacts@2.0.0-rc.57
7
12
  # or run without install:
8
13
  npx @openwop/openwop-conformance --base-url https://api.example.com --api-key hk_test_...
9
14
  ```
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "package": "@openwop/spec-artifacts",
3
- "version": "2.0.0-rc.56",
4
- "stampSha256": "d78af0be319b1a6f573bd342ed68df7d9daa61db218ef6c48db2d5036fcdf36c"
3
+ "version": "2.0.0-rc.58",
4
+ "stampSha256": "513ff26b156e8810cd0a5176d93894ae2c2883fc1325738fc7c13a2e55601bb5"
5
5
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/openwop-conformance",
3
- "version": "2.0.0-rc.56",
3
+ "version": "2.0.0-rc.58",
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.0.0-rc.56"
59
+ "@openwop/spec-artifacts": "2.0.0-rc.58"
60
60
  }
61
61
  }
package/requirements.json CHANGED
@@ -26228,7 +26228,7 @@
26228
26228
  {
26229
26229
  "id": "openwop.it.v2-coherence-not-in-bundle.the-bundle-schema-rejects-a-v3-bundle-carrying-a-corpus-coherence-id-and-accepts",
26230
26230
  "file": "v2-coherence-not-in-bundle.test.ts",
26231
- "line": 89,
26231
+ "line": 98,
26232
26232
  "title": "the bundle schema rejects a v3 bundle carrying a corpus-coherence id and accepts one under openwop.requirement.",
26233
26233
  "explicitId": "openwop.requirement.0168.coherence-not-in-bundle.schema-forbids-coherence-ids",
26234
26234
  "citations": [
@@ -26704,7 +26704,7 @@
26704
26704
  {
26705
26705
  "id": "openwop.it.v2-era-2-append-vocabulary.the-run-keeps-the-era-it-was-created-with-an-append-does-not-promote-it-to-era-3",
26706
26706
  "file": "v2-era-2-append-vocabulary.test.ts",
26707
- "line": 128,
26707
+ "line": 133,
26708
26708
  "title": "the run keeps the era it was created with; an append does not promote it to era 3",
26709
26709
  "explicitId": null,
26710
26710
  "citations": [
@@ -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.56",
4
+ "version": "2.0.0-rc.58",
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": "1840bfc791a0b473e37c6f532147af045232e602d1aa8c47c4f192e3014fd638",
13
- "api/v2/asyncapi.yaml": "52d40ac8cc3441302de74ed9eaa33784c906f1a43153f282333f58d2e048e98a",
14
- "api/v2/openapi.yaml": "2dff5215b2b5c0ba37eedd79f997f79f07da4055fa38a31c24af2a8193bb4e48",
12
+ "api/seams-v2.yaml": "ead1c61618e9be6db439a797a9898182f6ab3f91cf27e19b3a92c44e2d798852",
13
+ "api/v2/asyncapi.yaml": "8003483a6f86e02b76f1050ccf540eea2978b59c949175eeb70b9b7500b5213c",
14
+ "api/v2/openapi.yaml": "2bf4b3e9d85ee767c6b77eb13c2505c7e7dd761efeea41c22baac88f9d471ec2",
15
15
  "api/v2/redocly.yaml": "1e66b60e6118ad11a823bb620678be464d99dfe50a40e3e6f93ec9429b88b34c",
16
16
  "schemas/README.md": "0c0b737ffcf8f30e7d2809cec8a498232de710f41443212922ad8337cdde0b51",
17
17
  "schemas/a2a-task-state.schema.json": "c9365918f993f943b4b619d42551eb066a1ed33a08d895d51b395432a5b1f1bc",
@@ -199,7 +199,7 @@
199
199
  "schemas/workspace-file.schema.json": "464de85c2a068243084ee9c1d969bc7cd5d8f7948574e58450d6493c38a0e1e4",
200
200
  "spec/v1/alias-detectors.json": "fee4594ef49953953ffcd0b3813300067d16b3e65ebff2aac722034ac9b3f545",
201
201
  "spec/v1/capability-declaration-classes.json": "e7729aed5c4b4e1dd02abab0530f14cc95f5d4070fe51fb139e7f5cccefa00c6",
202
- "spec/v1/core-standard-manifest.json": "0c6bf3d8bb239fffc06a6e2819a009ed616922e063c001d0f8aa426614f85dc8",
202
+ "spec/v1/core-standard-manifest.json": "fe88d8e07054ea9360955686010421925f18ceaa225664187362af9d21b51272",
203
203
  "spec/v1/deprecations.json": "1d5acb69a9b8ccb57275a95605f74aef1d920685f8407c9d382a46b59dc803bb",
204
204
  "spec/v1/deprecations.schema.json": "18c87e78bedc210431f795ae44c5b5d202f2f3317850d5cf86867d4f1fa1cdfb",
205
205
  "spec/v1/event-codemap.json": "3da60d884157793a360da532a9fcbbfb5285636db325a74cec94b34622186d97",
@@ -230,8 +230,8 @@
230
230
  "spec/v2/path-manifest.json": "034152e09b1458c66810d4050e20a273b2b9b8fe2d92b66e8b819477de58a1be",
231
231
  "spec/v2/peer-dependency-aliases.json": "d10299280abee08258502925bc327293ee413e0108cd6e6ec75ff6110653308d",
232
232
  "spec/v2/profiles.json": "5019ac8209540bfbeee9c3232530d4e599be0ab926d817ff48edcec8419eb209",
233
- "spec/v2/release.json": "86e73d0a91cc0c999241a2ac7178e7244e96570603c4166585115a47ec099cc5",
233
+ "spec/v2/release.json": "a8dd7220e439d0c8a23606cfe0867561ae06630628fdf7af5adf2b13b62dca25",
234
234
  "spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
235
235
  },
236
- "corpusCommit": "5a392d02160028331ff2e73fc2252050db2be0fb"
236
+ "corpusCommit": "6672987ac59496638a54e00c1aac7064c60f17bb"
237
237
  }
@@ -58,8 +58,17 @@ function bundleWith(rows: BundleV3Requirement[]): BundleV3 {
58
58
 
59
59
  describe('v2-coherence-not-in-bundle (RFC 0168 §D.1)', () => {
60
60
  it('every corpus-ledger id has a scenario in src/coherence and none in src/scenarios — the two id sets are disjoint by construction', () => {
61
- if (!existsSync(LEDGER)) return softSkip('blocked', 'evidence/corpus-ledger.json is absent from this layout the corpus id set cannot be read');
62
- if (SCENARIOS_DIR === null || COHERENCE_DIR === null || !existsSync(COHERENCE_DIR)) return softSkip('blocked', 'src/scenarios or src/coherence is absent from this layout');
61
+ // rc.57: `inapplicable`, not `blocked`. The subject of this scenario is the
62
+ // CORPUS it reads evidence/corpus-ledger.json and the two source
63
+ // directories and asserts nothing about a host. RFC 0148 §A defines
64
+ // `blocked` over ADVERTISED behaviour a missing dependency prevented
65
+ // exercising; there is none here, and `blocked` denied certification
66
+ // bundle-wide (RFC 0168 §E.1) to every host running the published tarball,
67
+ // which ships neither the ledger nor src/coherence. Same reasoning as
68
+ // lib/spec-coherence.ts for the v1 corpus scenarios; the reference host
69
+ // carried this row as one of its "16 blocked" since rc.16.
70
+ if (!existsSync(LEDGER)) return softSkip('inapplicable', 'inapplicable to any host: evidence/corpus-ledger.json is absent from this layout — the subject of this scenario is the corpus, which the published tarball does not ship; it runs in a spec checkout (scripts/check-spec-coherence.mjs) and needs no host');
71
+ if (SCENARIOS_DIR === null || COHERENCE_DIR === null || !existsSync(COHERENCE_DIR)) return softSkip('inapplicable', 'inapplicable to any host: src/scenarios or src/coherence is absent from this layout — the subject of this scenario is the corpus, which the published tarball does not ship; it runs in a spec checkout and needs no host');
63
72
  const ledger = JSON.parse(readFileSync(LEDGER, 'utf8')) as { requirements: Record<string, unknown> };
64
73
  const ids = Object.keys(ledger.requirements);
65
74
  expect(ids.length, req('openwop.requirement.0168.coherence-not-in-bundle.disjoint-by-construction', SECTION, 'the corpus ledger MUST carry at least one requirement id')).toBeGreaterThan(0);
@@ -60,7 +60,12 @@ describe('v2-era-2-append-vocabulary (RFC 0176 §A — the writer rule)', () =>
60
60
  if (before === null || before.status !== 200) {
61
61
  return softSkip('blocked', `GET /runs/${runId}/events/poll answered ${before?.status ?? 'no response'} on the seeded era-2 run — the log cannot be read back`);
62
62
  }
63
- const seedCount = eventsOf(before).length;
63
+ // rc.58: `eventsOf` reads `.events` off a JSON body; `before` is the
64
+ // RESPONSE. Passing the response read `events` off an object that never
65
+ // has one, so this leg recorded "reads back empty (0 events)" on every host
66
+ // — including one whose poll returned both seeded rows — and the writer
67
+ // rule was unwitnessable. Every other caller passes `.json`.
68
+ const seedCount = eventsOf(before.json).length;
64
69
  // The seam returning ok is a WRAPPER claim; the readable log is the artifact.
65
70
  // A seam that reports success and seeds nothing leaves no era-2 log to append
66
71
  // to, so there is nothing here to witness the writer rule with — that is
@@ -93,7 +98,7 @@ describe('v2-era-2-append-vocabulary (RFC 0176 §A — the writer rule)', () =>
93
98
  return softSkip('blocked', `the era-2 read failed with ${after.status} after the host's own append — the assertion above already recorded the refusal`);
94
99
  }
95
100
 
96
- const rows = eventsOf(after) as ReadEvent[];
101
+ const rows = eventsOf(after.json) as ReadEvent[];
97
102
  expect(
98
103
  rows.length,
99
104
  req(ID, DOC, `the append MUST be visible in the log (seeded ${seedCount}, read ${rows.length} after cancel)`),