@openwop/openwop-conformance 1.141.0 → 1.142.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.
@@ -55,16 +55,29 @@
55
55
  * run and fails when the two disagree, which is the only thing that makes a
56
56
  * hand-maintained set trustworthy.
57
57
  *
58
- * ## What is deliberately NOT here
58
+ * ## What is deliberately NOT here — and why it is a Set, not a sentence
59
59
  *
60
- * Seven scenarios gate on `V1_DIR` **and** drive the host
61
- * (`replay-side-effect-suppression`, `data-residency-admission`,
62
- * `profile-discovery-core-alias`, `workflow-variable-format`,
63
- * `workflow-chain-deferred-parameters`, `artifact-type-store-emission`,
64
- * `artifact-type-registration-source`). Those assert advertised host behaviour
65
- * that could not be exercised because a dependency was unavailable — which is
66
- * `blocked`, exactly as §A defines it. Classifying them `inapplicable` would
67
- * tell a host "this does not apply to you" about a requirement that does.
60
+ * Seven scenarios gate on `V1_DIR` **and** drive the host. They assert
61
+ * advertised host behaviour that could not be exercised because a dependency
62
+ * was unavailable — `blocked`, exactly as §A defines it. Classifying them
63
+ * `inapplicable` would tell a host "this does not apply to you" about a
64
+ * requirement that does.
65
+ *
66
+ * They are listed in `SPEC_COHERENCE_EXCLUDED` below rather than named in this
67
+ * prose, because naming them here made this file lie to a reasonable reader.
68
+ * A peer checking membership with `grep -c "<scenario>" spec-coherence.ts` got
69
+ * **1 hit for all three** of the ones the prose named — from this very
70
+ * paragraph — and was one step from reporting that host-behaviour rows had
71
+ * been downgraded to "does not apply to you" as a credit. They caught it only
72
+ * because two counts disagreed: 28 members and those 7 included cannot both be
73
+ * true.
74
+ *
75
+ * **A text search over this file still matches both sets** — that is inherent
76
+ * to any file that names what it excludes. So the exclusions are now an
77
+ * exported Set with the same standing as the inclusions: membership has a
78
+ * programmatic answer, `spec-coherence-registry.test.ts` asserts the two are
79
+ * disjoint and jointly exhaustive over the `V1_DIR`-gated files, and a comment
80
+ * is no longer the only place the exclusion reason lives.
68
81
  */
69
82
  /** Scenarios whose subject is the corpus. Kept honest by `spec-coherence-registry.test.ts`. */
70
83
  export const SPEC_COHERENCE_SCENARIOS = new Set([
@@ -97,6 +110,20 @@ export const SPEC_COHERENCE_SCENARIOS = new Set([
97
110
  'workflow-chain-internal-flag.test.ts',
98
111
  'workload-identity-profile.test.ts',
99
112
  ]);
113
+ /**
114
+ * Scenarios that gate on `V1_DIR` **and** drive the host, so their `blocked` is
115
+ * honest: advertised behaviour a missing dependency prevented exercising.
116
+ * Exported so membership is checkable in code rather than inferred from prose.
117
+ */
118
+ export const SPEC_COHERENCE_EXCLUDED = new Set([
119
+ 'artifact-type-registration-source.test.ts',
120
+ 'artifact-type-store-emission.test.ts',
121
+ 'data-residency-admission.test.ts',
122
+ 'profile-discovery-core-alias.test.ts',
123
+ 'replay-side-effect-suppression.test.ts',
124
+ 'workflow-chain-deferred-parameters.test.ts',
125
+ 'workflow-variable-format.test.ts',
126
+ ]);
100
127
  /** The reason recorded on such a row, written for the host operator reading it. */
101
128
  export const SPEC_COHERENCE_DETAIL = 'inapplicable to any host: this scenario reads spec/v1/ to check the SPEC corpus is internally coherent and asserts nothing about a host. '
102
129
  + 'The published tarball does not bundle spec/v1/ (see lib/paths.ts), so it does not run here. '
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openwop/openwop-conformance",
3
- "version": "1.141.0",
3
+ "version": "1.142.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.141.0",
4
- "corpusCommit": "de70377b76d34fdec3b1f4b7e27b8ade95a9ba27"
3
+ "suiteVersion": "1.142.0",
4
+ "corpusCommit": "aced8a6a82d751394c3b299fa4602b9dd5cc9971"
5
5
  }
@@ -14,7 +14,7 @@
14
14
  import { describe, expect, it } from 'vitest';
15
15
  import { readFileSync, readdirSync } from 'node:fs';
16
16
  import { join } from 'node:path';
17
- import { SPEC_COHERENCE_SCENARIOS, SPEC_COHERENCE_DETAIL } from './spec-coherence.js';
17
+ import { SPEC_COHERENCE_SCENARIOS, SPEC_COHERENCE_DETAIL, SPEC_COHERENCE_EXCLUDED } from './spec-coherence.js';
18
18
  import { resolveFileRecord } from './scenario-disposition.js';
19
19
 
20
20
  const SCENARIOS = new URL('../scenarios/', import.meta.url).pathname;
@@ -41,6 +41,27 @@ describe('SPEC_COHERENCE_SCENARIOS is derivable, not asserted', () => {
41
41
  expect(listed.filter((f) => !pure.includes(f)), 'in the registry but no longer qualifies — it now drives a host, or stopped reading spec/v1').toEqual([]);
42
42
  });
43
43
 
44
+ it('the EXCLUDED set is exactly the host-touching ones — the exclusions are checked, not asserted in prose', () => {
45
+ // These used to live only in a docblock sentence. A peer grepping this file
46
+ // for membership matched that sentence and read all three named scenarios
47
+ // as members — the opposite of the truth, and the dangerous direction: it
48
+ // would mean host-behaviour rows downgraded to "does not apply to you" as a
49
+ // credit. Naming them in prose made the file lie to a reasonable reader.
50
+ const { hostTouching } = derive();
51
+ expect([...SPEC_COHERENCE_EXCLUDED].sort()).toEqual(hostTouching);
52
+ });
53
+
54
+ it('the two sets are disjoint and jointly exhaustive over the V1_DIR-gated files', () => {
55
+ // Disjoint: no scenario can be both "does not apply to any host" and
56
+ // "applies but was unwitnessable". Exhaustive: every V1_DIR-gated file has
57
+ // a decided disposition, so none falls back to the unclassified marker.
58
+ const { pure, hostTouching } = derive();
59
+ const overlap = [...SPEC_COHERENCE_SCENARIOS].filter((f) => SPEC_COHERENCE_EXCLUDED.has(f));
60
+ expect(overlap, 'a scenario cannot be both inapplicable-to-all-hosts and blocked-for-this-host').toEqual([]);
61
+ const union = new Set([...SPEC_COHERENCE_SCENARIOS, ...SPEC_COHERENCE_EXCLUDED]);
62
+ expect([...union].sort()).toEqual([...pure, ...hostTouching].sort());
63
+ });
64
+
44
65
  it('excludes the host-touching ones, which are honestly `blocked`', () => {
45
66
  // These assert ADVERTISED behaviour that a missing dependency prevented
46
67
  // exercising — RFC 0148 §A's definition of `blocked`, verbatim. Calling
@@ -55,16 +55,29 @@
55
55
  * run and fails when the two disagree, which is the only thing that makes a
56
56
  * hand-maintained set trustworthy.
57
57
  *
58
- * ## What is deliberately NOT here
58
+ * ## What is deliberately NOT here — and why it is a Set, not a sentence
59
59
  *
60
- * Seven scenarios gate on `V1_DIR` **and** drive the host
61
- * (`replay-side-effect-suppression`, `data-residency-admission`,
62
- * `profile-discovery-core-alias`, `workflow-variable-format`,
63
- * `workflow-chain-deferred-parameters`, `artifact-type-store-emission`,
64
- * `artifact-type-registration-source`). Those assert advertised host behaviour
65
- * that could not be exercised because a dependency was unavailable — which is
66
- * `blocked`, exactly as §A defines it. Classifying them `inapplicable` would
67
- * tell a host "this does not apply to you" about a requirement that does.
60
+ * Seven scenarios gate on `V1_DIR` **and** drive the host. They assert
61
+ * advertised host behaviour that could not be exercised because a dependency
62
+ * was unavailable — `blocked`, exactly as §A defines it. Classifying them
63
+ * `inapplicable` would tell a host "this does not apply to you" about a
64
+ * requirement that does.
65
+ *
66
+ * They are listed in `SPEC_COHERENCE_EXCLUDED` below rather than named in this
67
+ * prose, because naming them here made this file lie to a reasonable reader.
68
+ * A peer checking membership with `grep -c "<scenario>" spec-coherence.ts` got
69
+ * **1 hit for all three** of the ones the prose named — from this very
70
+ * paragraph — and was one step from reporting that host-behaviour rows had
71
+ * been downgraded to "does not apply to you" as a credit. They caught it only
72
+ * because two counts disagreed: 28 members and those 7 included cannot both be
73
+ * true.
74
+ *
75
+ * **A text search over this file still matches both sets** — that is inherent
76
+ * to any file that names what it excludes. So the exclusions are now an
77
+ * exported Set with the same standing as the inclusions: membership has a
78
+ * programmatic answer, `spec-coherence-registry.test.ts` asserts the two are
79
+ * disjoint and jointly exhaustive over the `V1_DIR`-gated files, and a comment
80
+ * is no longer the only place the exclusion reason lives.
68
81
  */
69
82
 
70
83
  /** Scenarios whose subject is the corpus. Kept honest by `spec-coherence-registry.test.ts`. */
@@ -99,6 +112,21 @@ export const SPEC_COHERENCE_SCENARIOS: ReadonlySet<string> = new Set([
99
112
  'workload-identity-profile.test.ts',
100
113
  ]);
101
114
 
115
+ /**
116
+ * Scenarios that gate on `V1_DIR` **and** drive the host, so their `blocked` is
117
+ * honest: advertised behaviour a missing dependency prevented exercising.
118
+ * Exported so membership is checkable in code rather than inferred from prose.
119
+ */
120
+ export const SPEC_COHERENCE_EXCLUDED: ReadonlySet<string> = new Set([
121
+ 'artifact-type-registration-source.test.ts',
122
+ 'artifact-type-store-emission.test.ts',
123
+ 'data-residency-admission.test.ts',
124
+ 'profile-discovery-core-alias.test.ts',
125
+ 'replay-side-effect-suppression.test.ts',
126
+ 'workflow-chain-deferred-parameters.test.ts',
127
+ 'workflow-variable-format.test.ts',
128
+ ]);
129
+
102
130
  /** The reason recorded on such a row, written for the host operator reading it. */
103
131
  export const SPEC_COHERENCE_DETAIL =
104
132
  'inapplicable to any host: this scenario reads spec/v1/ to check the SPEC corpus is internally coherent and asserts nothing about a host. '