@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
|
-
*
|
|
62
|
-
* `
|
|
63
|
-
* `
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
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,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.
|
|
4
|
-
"corpusCommit": "
|
|
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
|
-
*
|
|
62
|
-
* `
|
|
63
|
-
* `
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
*
|
|
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. '
|