@openwop/openwop-conformance 1.103.0 → 1.104.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/openwop-conformance",
3
- "version": "1.103.0",
3
+ "version": "1.104.0",
4
4
  "description": "Production-ready black-box conformance suite for OpenWOP v1.0 compliant servers.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "_comment": "Provenance of this vendored schemas/ copy. See conformance/README.md \u00a7\"Resolving the contract\". Compare against the stamp in your installed @openwop/openwop-conformance to detect a stale hand-copied contract.",
3
- "suiteVersion": "1.103.0",
4
- "corpusCommit": "c6f779513a26705a5d9fd8958ec1cd75ab8f6fdb"
3
+ "suiteVersion": "1.104.0",
4
+ "corpusCommit": "f31b9244c8ecb9743d79a140c19221ecae72e06e"
5
5
  }
@@ -236,6 +236,30 @@ describe.skipIf(V1_DIR === null)('replay.md req 4 — the manifest role is a cla
236
236
  ).toBe(true);
237
237
  });
238
238
 
239
+ it('a throw is named a backstop, not a discharge', () => {
240
+ // The question a tier-1 host asked after deriving the floor: does a guarded
241
+ // seam that THROWS discharge requirement 4, or must the replay succeed with
242
+ // the recorded outcome? Requirements 1 and 2 are two obligations — a throw
243
+ // satisfies "do not perform" and not "resolve the outcome" — but requirement
244
+ // 4 did not say so, and the answer decides whether hundreds of typeIds need
245
+ // classification or only seam coverage. An ambiguity that changes the size
246
+ // of the work by two orders of magnitude is not a footnote.
247
+ const doc = replay();
248
+ expect(
249
+ doc.includes('backstop, not a discharge'),
250
+ 'replay.md requirement 4 MUST state that a guarded-seam throw is a backstop rather than a ' +
251
+ 'discharge. It satisfies requirement 1 (no effect) and not requirement 2 (resolve the ' +
252
+ 'recorded outcome), and a host reading the floor as "make it throw" ships a replay that ' +
253
+ 'fails where this section says it must succeed.',
254
+ ).toBe(true);
255
+ expect(
256
+ /safe and\s+non-conformant/.test(doc),
257
+ 'replay.md requirement 4 MUST name the posture a throw-only host is in — safe and ' +
258
+ 'non-conformant — because "nothing escapes" is a weaker claim than `recorded-outcome` ' +
259
+ 'makes, and a host that conflates them advertises in good faith and still lies.',
260
+ ).toBe(true);
261
+ });
262
+
239
263
  it('the floor direction is stated, not left to inference', () => {
240
264
  // The dangerous reading is symmetric: "my classifier disagrees, so the
241
265
  // manifest is wrong." The requirement is one-directional and says so.