@openwop/openwop-conformance 2.0.0-rc.66 → 2.0.0-rc.67
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,14 @@
|
|
|
1
1
|
# `@openwop/openwop-conformance` Changelog
|
|
2
2
|
|
|
3
|
+
## [2.0.0-rc.67] — 2026-09-05 — a core-standard floor file was flaky, and the flake blamed the host
|
|
4
|
+
|
|
5
|
+
`v2-poll-cursor-v2` compared **two reads of the same event log** — a full read, then a cursor read — and asserted they agree. But `terminalRun()` waits for the run's *status* to be terminal, and a terminal status does not mean the log has stopped **appending**. A host emitting trailing or vendor rows can add an event between the two reads, and the leg then reports an array mismatch and blames the host for a cursor defect it does not have.
|
|
6
|
+
|
|
7
|
+
Measured by a peer host: this leg failed **twice under a full-suite run** and passed **6/6 in isolation** on the same revision — the signature of a window widening under load, not of a wrong cursor.
|
|
8
|
+
|
|
9
|
+
It now re-reads the whole log after the cursor read. If the log is unchanged the two reads straddled a quiet window and the comparison is decidable; if it grew, the suite records `blocked` naming the growth instead of failing, because it could not measure the rule. This matters more than a normal flake: the file is on the `openwop-core-standard` floor, so its flakiness made **certification non-deterministic**.
|
|
10
|
+
|
|
11
|
+
|
|
3
12
|
## [2.0.0-rc.66] — 2026-09-05 — the changelog you are reading had not mentioned this major
|
|
4
13
|
|
|
5
14
|
**This file went un-updated from `1.156.0` (2026-09-02) through `2.0.0-rc.65`** — twenty-one published releases, and zero mentions of any `2.0.0-rc` in the changelog that ships inside the tarball. If you installed `2.0.0-rc.65` and read its CHANGELOG, you read a document that ended three days before the v2 release series began.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"package": "@openwop/spec-artifacts",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
4
|
-
"stampSha256": "
|
|
3
|
+
"version": "2.0.0-rc.67",
|
|
4
|
+
"stampSha256": "bb9ebaf7ca9a81d6cbcbf126a7ccf370a5ca8c3f74dfdf35ae46c3d6615630b9"
|
|
5
5
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openwop/openwop-conformance",
|
|
3
|
-
"version": "2.0.0-rc.
|
|
3
|
+
"version": "2.0.0-rc.67",
|
|
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.
|
|
59
|
+
"@openwop/spec-artifacts": "2.0.0-rc.67"
|
|
60
60
|
}
|
|
61
61
|
}
|
package/requirements.json
CHANGED
|
@@ -27834,7 +27834,7 @@
|
|
|
27834
27834
|
{
|
|
27835
27835
|
"id": "openwop.it.v2-poll-cursor-v2.a-cursor-past-the-end-of-the-log-returns-200-with-an-empty-events-array",
|
|
27836
27836
|
"file": "v2-poll-cursor-v2.test.ts",
|
|
27837
|
-
"line":
|
|
27837
|
+
"line": 121,
|
|
27838
27838
|
"title": "a cursor past the end of the log returns 200 with an empty events array",
|
|
27839
27839
|
"explicitId": "openwop.requirement.0171.poll-cursor-v2.past-end",
|
|
27840
27840
|
"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.
|
|
4
|
+
"version": "2.0.0-rc.67",
|
|
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": "fd91ecc2cc421581de356bae43eb3864756fe1433e4c526f1655b045530090e0",
|
|
13
|
+
"api/v2/asyncapi.yaml": "3db6c9086a9b177933ca8ed235f704423076c8c107ca92691bad5390ad6cabba",
|
|
14
|
+
"api/v2/openapi.yaml": "848d8a248a999313d0020c004fa6eac8cab04767bc75efd5fcb7171a73408748",
|
|
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": "
|
|
202
|
+
"spec/v1/core-standard-manifest.json": "4fc754b2a60fe4f33bcc0022899855eac8ac86de7289c027c632f840e48a5ff4",
|
|
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": "0636f19fceae625390003a347e70ef4797d84766b5c24ce8a02cea52aadebca4",
|
|
233
|
-
"spec/v2/release.json": "
|
|
233
|
+
"spec/v2/release.json": "23f49c7d219046e65b083fe9057f77fbb65c00a6688a108cba255d793aec8ff7",
|
|
234
234
|
"spec/v2/retention-floors.json": "eaf3722d95c79947af1d4269ef85117e126518c588cfcf1a2b21b97269f51624"
|
|
235
235
|
},
|
|
236
|
-
"corpusCommit": "
|
|
236
|
+
"corpusCommit": "0f0dbe7048c1126e0a602e88b954b8ac7e99f2f3"
|
|
237
237
|
}
|
|
@@ -96,6 +96,24 @@ describe('v2 poll-cursor-v2 (RFC 0171 §E.2)', () => {
|
|
|
96
96
|
if (res === null) return softSkip('blocked', 'GET /runs/{runId}/events/poll?afterSequence= unreachable (fetch failed)');
|
|
97
97
|
expect(res.status, req('openwop.requirement.0171.poll-cursor-v2.after-sequence', DOC, 'afterSequence is an integer ≥ 0 and MUST be accepted')).toBe(200);
|
|
98
98
|
const after = sequences(res.json);
|
|
99
|
+
// QUIESCENCE (rc.67). The comparison below is between TWO READS of the
|
|
100
|
+
// same log, and a run whose STATUS is terminal has not necessarily
|
|
101
|
+
// finished APPENDING — a host emitting trailing or vendor rows can add an
|
|
102
|
+
// event between the full read above and the cursor read just made. The
|
|
103
|
+
// assertion then reports an array mismatch and blames the host for a
|
|
104
|
+
// cursor defect it does not have.
|
|
105
|
+
//
|
|
106
|
+
// Measured by a peer host: this leg failed TWICE under a full-suite run
|
|
107
|
+
// and passed 6/6 in isolation on the same revision — the signature of a
|
|
108
|
+
// widening window under load, not of a wrong cursor. Re-reading the whole
|
|
109
|
+
// log now settles which it was: if the log is unchanged, the two reads
|
|
110
|
+
// straddled a quiet window and the comparison is decidable; if it grew,
|
|
111
|
+
// the suite could not measure the rule and says so instead of failing.
|
|
112
|
+
const settled = await poll(r.runId, '');
|
|
113
|
+
const seqsAfter = settled !== null && settled.status === 200 ? sequences(settled.json) : null;
|
|
114
|
+
if (seqsAfter === null || seqsAfter.join(',') !== seqs.join(',')) {
|
|
115
|
+
return softSkip('blocked', `the event log grew while the cursor was being read (before: [${seqs.join(',')}], after: [${seqsAfter?.join(',') ?? 'unreadable'}]) — a run at terminal STATUS is still appending, so the two reads this rule compares do not describe the same log. Re-run against a quiescent log; this is not a cursor defect.`);
|
|
116
|
+
}
|
|
99
117
|
expect(after.every((s) => s > n), req('openwop.requirement.0171.poll-cursor-v2.after-sequence', DOC, `every returned sequence MUST be > afterSequence (${n}); got [${after.join(', ')}]`)).toBe(true);
|
|
100
118
|
expect(after, req('openwop.requirement.0171.poll-cursor-v2.after-sequence', DOC, 'the cursor is exclusive and the log is not renumbered: afterSequence=first yields exactly the rest of the log')).toEqual(seqs.filter((s) => s > n));
|
|
101
119
|
});
|