@sun-asterisk/sungen 3.0.0-beta.82 → 3.0.0-beta.83
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/dist/cli/commands/audit.d.ts.map +1 -1
- package/dist/cli/commands/audit.js +6 -0
- package/dist/cli/commands/audit.js.map +1 -1
- package/dist/harness/audit.d.ts +8 -0
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +32 -1
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/parse.d.ts +6 -0
- package/dist/harness/parse.d.ts.map +1 -1
- package/dist/harness/parse.js +18 -3
- package/dist/harness/parse.js.map +1 -1
- package/dist/harness/quality-gates.d.ts +13 -0
- package/dist/harness/quality-gates.d.ts.map +1 -1
- package/dist/harness/quality-gates.js +82 -2
- package/dist/harness/quality-gates.js.map +1 -1
- package/dist/harness/sensors.d.ts.map +1 -1
- package/dist/harness/sensors.js +13 -5
- package/dist/harness/sensors.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/audit.ts +6 -0
- package/src/harness/audit.ts +42 -4
- package/src/harness/parse.ts +19 -3
- package/src/harness/quality-gates.ts +76 -3
- package/src/harness/sensors.ts +12 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqFpC,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmC3D"}
|
|
@@ -119,6 +119,12 @@ function render(r) {
|
|
|
119
119
|
L(` … +${r.ledger.missing.length - 8} more`);
|
|
120
120
|
L('');
|
|
121
121
|
}
|
|
122
|
+
if (r.calibration) {
|
|
123
|
+
const ax = Object.entries(r.calibration.axes).map(([k, v]) => `${k}=${(v * 100).toFixed(0)}%`).join(' · ');
|
|
124
|
+
L(` ⑨ Calibration — ${ax}`);
|
|
125
|
+
L(` weakest: ${r.calibration.weakest.axis} ${(r.calibration.weakest.value * 100).toFixed(0)}%${r.calibration.inflated ? ' ⚠ SCORE-INFLATED-BY-BREADTH' : ''}`);
|
|
126
|
+
L('');
|
|
127
|
+
}
|
|
122
128
|
L(' ── Findings (Repair targets) ──');
|
|
123
129
|
if (r.findings.length === 0)
|
|
124
130
|
L(' ✓ none — output passes the harness');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/cli/commands/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/harness/audit.d.ts
CHANGED
|
@@ -18,6 +18,14 @@ export interface AuditReport {
|
|
|
18
18
|
downstream: DownstreamResult;
|
|
19
19
|
manualOracle: ManualOracleResult;
|
|
20
20
|
ledger: LedgerResult;
|
|
21
|
+
calibration: {
|
|
22
|
+
axes: Record<string, number>;
|
|
23
|
+
weakest: {
|
|
24
|
+
axis: string;
|
|
25
|
+
value: number;
|
|
26
|
+
};
|
|
27
|
+
inflated: boolean;
|
|
28
|
+
};
|
|
21
29
|
score: {
|
|
22
30
|
overall: number;
|
|
23
31
|
coverage: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EACvG,MAAM,WAAW,CAAC;AACnB,OAAO,EAAwC,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAgB,kBAAkB,
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"AAWA,OAAO,EAEL,UAAU,EAAE,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,WAAW,EAAE,gBAAgB,EAAE,cAAc,EACvG,MAAM,WAAW,CAAC;AACnB,OAAO,EAAwC,aAAa,EAAE,MAAM,UAAU,CAAC;AAC/E,OAAO,EAAiB,UAAU,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAgB,kBAAkB,EAAoB,MAAM,iBAAiB,CAAC;AACrF,OAAO,EAA2C,gBAAgB,EAAE,kBAAkB,EAC1B,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAwC,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAExF,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,WAAW,CAAC;IACnB,KAAK,EAAE,gBAAgB,CAAC;IACxB,QAAQ,EAAE,cAAc,CAAC;IACzB,OAAO,EAAE,aAAa,CAAC;IACvB,UAAU,EAAE,eAAe,CAAC;IAC5B,KAAK,EAAE,WAAW,CAAC;IACnB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,YAAY,EAAE,kBAAkB,CAAC;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,WAAW,EAAE;QACX,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7B,OAAO,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACzC,QAAQ,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,YAAY,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;IAC5B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,kBAAkB,CAAC;CAC1B;AAED,wBAAgB,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,CAkJ3E"}
|
package/dist/harness/audit.js
CHANGED
|
@@ -75,6 +75,9 @@ function runAudit(screenDir, screenName) {
|
|
|
75
75
|
const downstream = (0, quality_gates_1.downstreamScope)((0, quality_gates_1.readText)(specPath), scenarios);
|
|
76
76
|
const manualOracleResult = (0, quality_gates_1.manualOracle)(featureText);
|
|
77
77
|
const ledger = (0, viewpoint_ledger_1.viewpointLedger)(viewpointPath, scenarios, featureText);
|
|
78
|
+
const negSideEffect = (0, quality_gates_1.negativeSideEffect)(scenarios);
|
|
79
|
+
const ownership = (0, quality_gates_1.crossArtifactOwnership)(screenDir, scenarios);
|
|
80
|
+
const unsourced = (0, quality_gates_1.sourceBacked)(scenarios, (0, spec_coverage_1.parseSpecClauses)(specPath).frs.map((f) => f.id), (0, viewpoint_ledger_1.parseViewpointItems)(viewpointPath).map((i) => i.text), viewpoints.map((v) => v.id), featureText);
|
|
78
81
|
// Sub-scores
|
|
79
82
|
const coverage = gate.coverageRatio;
|
|
80
83
|
const businessDepth = depth.bcDepthRatio;
|
|
@@ -134,6 +137,34 @@ function runAudit(screenDir, screenName) {
|
|
|
134
137
|
const sample = ledger.missing.slice(0, 6).map((m) => m.id || `"${m.text}"`).join(', ');
|
|
135
138
|
findings.push(`VIEWPOINT-ITEM-MISSING: ${ledger.missing.length}/${ledger.total} atomic viewpoint items have no covering scenario (${(ledger.ratio * 100).toFixed(0)}% covered) — e.g. ${sample}. Cover each item or mark it deferred/spec-gap.`);
|
|
136
139
|
}
|
|
140
|
+
for (const n of negSideEffect.slice(0, 6)) {
|
|
141
|
+
findings.push(`NEGATIVE-SIDE-EFFECT-UNPROVEN: "${n}" — the title claims something must NOT happen but the steps don't prove the absence (assert a count / negative state, or make it @manual with an oracle).`);
|
|
142
|
+
}
|
|
143
|
+
for (const d of ownership.duplicates.slice(0, 6)) {
|
|
144
|
+
findings.push(`DUPLICATE-FLOW-OWNERSHIP: "${d.scenario}" has the same shape as a scenario in flow "${d.flow}" — keep one owner (screen-local vs flow); the other should only reference/set up.`);
|
|
145
|
+
}
|
|
146
|
+
for (const u of unsourced.slice(0, 6)) {
|
|
147
|
+
findings.push(`UNSOURCEABLE-SCENARIO: "${u}" doesn't trace to any FR / viewpoint item — link it to a source, or tag it @exploration (not part of the official suite).`);
|
|
148
|
+
}
|
|
149
|
+
// #8 — multi-axis calibration: a high overall must not hide a weak axis.
|
|
150
|
+
const manualCompleteness = manualOracleResult.manualTotal
|
|
151
|
+
? 1 - manualOracleResult.insufficient.length / manualOracleResult.manualTotal : 1;
|
|
152
|
+
const axes = {
|
|
153
|
+
coverage: Math.round(coverage * 100) / 100,
|
|
154
|
+
businessDepth: Math.round(businessDepth * 100) / 100,
|
|
155
|
+
claimProof: Math.round(claim.ratio * 100) / 100,
|
|
156
|
+
specFR: spec.frTotal ? Math.round((spec.frCovered / spec.frTotal) * 100) / 100 : 1,
|
|
157
|
+
atomicLedger: Math.round(ledger.ratio * 100) / 100,
|
|
158
|
+
manualOracle: Math.round(manualCompleteness * 100) / 100,
|
|
159
|
+
taxonomy: taxonomyMismatch ? 0 : Math.round(trace.mappedRatio * 100) / 100,
|
|
160
|
+
};
|
|
161
|
+
const weakestEntry = Object.entries(axes).sort((a, b) => a[1] - b[1])[0];
|
|
162
|
+
const weakest = { axis: weakestEntry[0], value: weakestEntry[1] };
|
|
163
|
+
const inflated = overall >= 8 && weakest.value < 0.6;
|
|
164
|
+
if (inflated) {
|
|
165
|
+
findings.push(`SCORE-INFLATED-BY-BREADTH: overall ${Math.round(overall * 10) / 10}/10 but the weakest axis "${weakest.axis}" is ${(weakest.value * 100).toFixed(0)}% — breadth is hiding a weak dimension. Raise "${weakest.axis}" before trusting the headline.`);
|
|
166
|
+
}
|
|
167
|
+
const calibration = { axes, weakest, inflated };
|
|
137
168
|
// Gate spans coverage (viewpoint themes), depth, claim-proof, spec-clause coverage,
|
|
138
169
|
// AND taxonomy-match (scenarios must use the project's viewpoint IDs when defined).
|
|
139
170
|
const gateStatus = gate.gaps.length === 0 && depth.verdict !== 'fail' && claim.verdict !== 'fail' && spec.verdict !== 'fail' && !taxonomyMismatch ? 'PASS' : 'FAIL';
|
|
@@ -141,7 +172,7 @@ function runAudit(screenDir, screenName) {
|
|
|
141
172
|
screen: screenName,
|
|
142
173
|
scenarioCount: scenarios.length,
|
|
143
174
|
gate, depth, claim, taxonomy, balance, duplicates, trace, spec,
|
|
144
|
-
taxonomyMismatch, downstream, manualOracle: manualOracleResult, ledger,
|
|
175
|
+
taxonomyMismatch, downstream, manualOracle: manualOracleResult, ledger, calibration,
|
|
145
176
|
score: {
|
|
146
177
|
overall: Math.round(overall * 10) / 10,
|
|
147
178
|
coverage: Math.round(coverage * 100) / 100,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/harness/parse.d.ts
CHANGED
|
@@ -17,7 +17,13 @@ export interface ScenarioInfo {
|
|
|
17
17
|
stepSkeleton: string;
|
|
18
18
|
haystack: string;
|
|
19
19
|
stepsText: string;
|
|
20
|
+
vpId?: string;
|
|
20
21
|
}
|
|
22
|
+
/** Format-tolerant: is this token an ID (project's scheme), not a prose word?
|
|
23
|
+
* Accepts VP0, VP0-001, MS-HP-001, TV-01, VP-LIST-001 — requires a digit + uppercase start. */
|
|
24
|
+
export declare function isIdLike(s: string): boolean;
|
|
25
|
+
/** The ID minus its trailing -NNN sequence number (VP0-001 → VP0, MS-HP-001 → MS-HP). */
|
|
26
|
+
export declare function idPrefix(id: string): string;
|
|
21
27
|
export declare function parseViewpointOverview(filePath: string): ViewpointEntry[];
|
|
22
28
|
export declare function loadScenarios(featurePath: string): ScenarioInfo[];
|
|
23
29
|
//# sourceMappingURL=parse.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/harness/parse.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../src/harness/parse.ts"],"names":[],"mappings":"AAUA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AAE7D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,UAAU,GAAG,aAAa,GAAG,UAAU,CAAC;CACjD;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED;+FAC+F;AAC/F,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE3C;AAED,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAE3C;AAID,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,EAAE,CA4CzE;AAkED,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,YAAY,EAAE,CAOjE"}
|
package/dist/harness/parse.js
CHANGED
|
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.isIdLike = isIdLike;
|
|
37
|
+
exports.idPrefix = idPrefix;
|
|
36
38
|
exports.parseViewpointOverview = parseViewpointOverview;
|
|
37
39
|
exports.loadScenarios = loadScenarios;
|
|
38
40
|
/**
|
|
@@ -44,6 +46,15 @@ exports.loadScenarios = loadScenarios;
|
|
|
44
46
|
*/
|
|
45
47
|
const fs = __importStar(require("fs"));
|
|
46
48
|
const gherkin_parser_1 = require("../generators/gherkin-parser");
|
|
49
|
+
/** Format-tolerant: is this token an ID (project's scheme), not a prose word?
|
|
50
|
+
* Accepts VP0, VP0-001, MS-HP-001, TV-01, VP-LIST-001 — requires a digit + uppercase start. */
|
|
51
|
+
function isIdLike(s) {
|
|
52
|
+
return /^[A-Z][A-Za-z0-9.-]*$/.test(s) && /\d/.test(s) && s.length >= 3;
|
|
53
|
+
}
|
|
54
|
+
/** The ID minus its trailing -NNN sequence number (VP0-001 → VP0, MS-HP-001 → MS-HP). */
|
|
55
|
+
function idPrefix(id) {
|
|
56
|
+
return id.replace(/[-.]\d{1,4}$/, '');
|
|
57
|
+
}
|
|
47
58
|
// ---------- test-viewpoint.md ----------
|
|
48
59
|
function parseViewpointOverview(filePath) {
|
|
49
60
|
if (!fs.existsSync(filePath))
|
|
@@ -66,7 +77,7 @@ function parseViewpointOverview(filePath) {
|
|
|
66
77
|
const cells = line.split('|').map((c) => c.trim()).filter((_, i, a) => i > 0 && i < a.length - 1);
|
|
67
78
|
if (cells.length >= 3) {
|
|
68
79
|
const id = cells[0];
|
|
69
|
-
if (
|
|
80
|
+
if (isIdLike(id) && !/^-+$/.test(cells[1])) {
|
|
70
81
|
const pr = /high/i.test(cells[1]) ? 'High' : /medium/i.test(cells[1]) ? 'Medium' : /low/i.test(cells[1]) ? 'Low' : 'Unknown';
|
|
71
82
|
entries.set(id.toUpperCase(), { id: id.toUpperCase(), priority: pr, reason: cells[2] });
|
|
72
83
|
}
|
|
@@ -86,8 +97,8 @@ function parseViewpointOverview(filePath) {
|
|
|
86
97
|
group = undefined;
|
|
87
98
|
}
|
|
88
99
|
if (group) {
|
|
89
|
-
const m = line.match(
|
|
90
|
-
if (m) {
|
|
100
|
+
const m = line.match(/^[-*+]\s+([A-Za-z][A-Za-z0-9.-]*)/);
|
|
101
|
+
if (m && isIdLike(m[1])) {
|
|
91
102
|
const id = m[1].toUpperCase();
|
|
92
103
|
const existing = entries.get(id);
|
|
93
104
|
if (existing)
|
|
@@ -111,6 +122,9 @@ function classifyScenario(sc) {
|
|
|
111
122
|
const codeMatch = sc.name.match(/\bVP-([A-Z]+)-\d+/i);
|
|
112
123
|
const vpCode = codeMatch ? codeMatch[0].toUpperCase() : undefined;
|
|
113
124
|
const category = codeMatch ? codeMatch[1].toUpperCase() : undefined;
|
|
125
|
+
// Project-scheme ID: the leading token of the title (VP0-001 / MS-HP-001 / VP-LIST-001).
|
|
126
|
+
const leadMatch = sc.name.match(/^\s*([A-Za-z][A-Za-z0-9.-]*)/);
|
|
127
|
+
const vpId = leadMatch && isIdLike(leadMatch[1]) ? leadMatch[1].toUpperCase() : undefined;
|
|
114
128
|
// Then-phase detection (And/But inherit previous primary keyword)
|
|
115
129
|
let last = 'Given';
|
|
116
130
|
let thenCount = 0;
|
|
@@ -152,6 +166,7 @@ function classifyScenario(sc) {
|
|
|
152
166
|
stepSkeleton: skeletonParts.join(' | '),
|
|
153
167
|
haystack: textParts.join(' ').toLowerCase(),
|
|
154
168
|
stepsText: stepTextParts.join(' ').toLowerCase(),
|
|
169
|
+
vpId,
|
|
155
170
|
};
|
|
156
171
|
}
|
|
157
172
|
function loadScenarios(featurePath) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/harness/parse.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../../src/harness/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,5 +12,18 @@ export interface ManualOracleResult {
|
|
|
12
12
|
insufficient: string[];
|
|
13
13
|
}
|
|
14
14
|
export declare function manualOracle(featureText: string): ManualOracleResult;
|
|
15
|
+
/** Titles asserting an ABSENCE must prove it (count / negative / @manual+oracle), not just a happy outcome. */
|
|
16
|
+
export declare function negativeSideEffect(scenarios: ScenarioInfo[]): string[];
|
|
17
|
+
/** A scenario should trace to a source: a viewpoint ID (its own scheme), an FR id, or a
|
|
18
|
+
* viewpoint item (keyword overlap). ID match is language-agnostic and primary. */
|
|
19
|
+
export declare function sourceBacked(scenarios: ScenarioInfo[], frIds: string[], viewpointItems: string[], viewpointIds: string[], featureText: string): string[];
|
|
20
|
+
export interface OwnershipResult {
|
|
21
|
+
duplicates: {
|
|
22
|
+
scenario: string;
|
|
23
|
+
flow: string;
|
|
24
|
+
}[];
|
|
25
|
+
}
|
|
26
|
+
/** Scenarios whose step-skeleton also appears in a sibling flow feature → duplicate ownership. */
|
|
27
|
+
export declare function crossArtifactOwnership(screenDir: string, scenarios: ScenarioInfo[]): OwnershipResult;
|
|
15
28
|
export declare function readText(p: string): string;
|
|
16
29
|
//# sourceMappingURL=quality-gates.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-gates.d.ts","sourceRoot":"","sources":["../../src/harness/quality-gates.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quality-gates.d.ts","sourceRoot":"","sources":["../../src/harness/quality-gates.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,YAAY,EAA2B,MAAM,SAAS,CAAC;AAIhE,MAAM,WAAW,gBAAgB;IAC/B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,YAAY,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CACjD;AAiBD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,gBAAgB,CAe7F;AAID,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAMD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,kBAAkB,CAgBpE;AAMD,+GAA+G;AAC/G,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,MAAM,EAAE,CAStE;AAID;kFACkF;AAClF,wBAAgB,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,cAAc,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBxJ;AAID,MAAM,WAAW,eAAe;IAAG,UAAU,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAA;CAAE;AAErF,kGAAkG;AAClG,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,eAAe,CAqBpG;AAGD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAE1C"}
|
|
@@ -35,12 +35,18 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.downstreamScope = downstreamScope;
|
|
37
37
|
exports.manualOracle = manualOracle;
|
|
38
|
+
exports.negativeSideEffect = negativeSideEffect;
|
|
39
|
+
exports.sourceBacked = sourceBacked;
|
|
40
|
+
exports.crossArtifactOwnership = crossArtifactOwnership;
|
|
38
41
|
exports.readText = readText;
|
|
39
42
|
/**
|
|
40
|
-
* Quality gates (batch): downstream-scope
|
|
41
|
-
*
|
|
43
|
+
* Quality gates (batch): downstream-scope + manual-oracle + negative-side-effect +
|
|
44
|
+
* cross-artifact ownership + source-backed strictness.
|
|
45
|
+
* Generic — read the project's own spec.md / feature text / sibling flows; no project data.
|
|
42
46
|
*/
|
|
43
47
|
const fs = __importStar(require("fs"));
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const parse_1 = require("./parse");
|
|
44
50
|
/** Routes the spec hands off to (Navigation Flow / success), other than the screen's own route. */
|
|
45
51
|
function downstreamRoutes(specText) {
|
|
46
52
|
const ownRoute = (specText.match(/\*\*Route\*\*\s*:\s*`?(\/[^\s`]+)/) || [])[1] || '';
|
|
@@ -96,6 +102,80 @@ function manualOracle(featureText) {
|
|
|
96
102
|
}
|
|
97
103
|
return { manualTotal, insufficient };
|
|
98
104
|
}
|
|
105
|
+
// ---------- #4 Negative side-effect ----------
|
|
106
|
+
const NEG_TITLE = /\b(does not|doesn't|no second|not dispatch|not sent|without submitting|no leak|single request|exactly one|count is 1|only one request|no duplicate|not create)\b/i;
|
|
107
|
+
/** Titles asserting an ABSENCE must prove it (count / negative / @manual+oracle), not just a happy outcome. */
|
|
108
|
+
function negativeSideEffect(scenarios) {
|
|
109
|
+
const flagged = [];
|
|
110
|
+
for (const s of scenarios) {
|
|
111
|
+
if (s.manual)
|
|
112
|
+
continue; // @manual is a legitimate deferral (oracle checked by #4 manual-oracle)
|
|
113
|
+
if (!NEG_TITLE.test(s.name))
|
|
114
|
+
continue;
|
|
115
|
+
const proven = /\bcount\b|tohavecount|table with|is hidden|are hidden|not complete|message is hidden/.test(s.stepsText);
|
|
116
|
+
if (!proven)
|
|
117
|
+
flagged.push(s.name.slice(0, 80));
|
|
118
|
+
}
|
|
119
|
+
return flagged;
|
|
120
|
+
}
|
|
121
|
+
// ---------- #7 Source-backed strictness ----------
|
|
122
|
+
/** A scenario should trace to a source: a viewpoint ID (its own scheme), an FR id, or a
|
|
123
|
+
* viewpoint item (keyword overlap). ID match is language-agnostic and primary. */
|
|
124
|
+
function sourceBacked(scenarios, frIds, viewpointItems, viewpointIds, featureText) {
|
|
125
|
+
if (!frIds.length && !viewpointItems.length && !viewpointIds.length)
|
|
126
|
+
return []; // no contract
|
|
127
|
+
const vpIds = viewpointIds.map((s) => s.toUpperCase());
|
|
128
|
+
const itemWords = viewpointItems.map((t) => new Set((t.toLowerCase().match(/[a-z][a-z-]{4,}/g) || [])));
|
|
129
|
+
// per-scenario blocks (INCLUDING comments) so an FR cited in a comment counts as a source
|
|
130
|
+
const blockOf = new Map();
|
|
131
|
+
for (const b of featureText.split(/\n\s*\n/)) {
|
|
132
|
+
const m = b.match(/Scenario:\s*(.+)/);
|
|
133
|
+
if (m)
|
|
134
|
+
blockOf.set(m[1].trim().toLowerCase(), b.toLowerCase());
|
|
135
|
+
}
|
|
136
|
+
const unsourced = [];
|
|
137
|
+
for (const s of scenarios) {
|
|
138
|
+
const id = (s.vpId || s.vpCode || '').toUpperCase();
|
|
139
|
+
const mapsId = !!id && vpIds.some((v) => id === v || id.startsWith(v) || v.startsWith((0, parse_1.idPrefix)(id)));
|
|
140
|
+
const block = blockOf.get(s.name.trim().toLowerCase()) || s.haystack;
|
|
141
|
+
const citesFr = frIds.some((fid) => block.includes(fid.toLowerCase()));
|
|
142
|
+
const sWords = new Set((s.haystack.match(/[a-z][a-z-]{4,}/g) || []));
|
|
143
|
+
const mapsItem = itemWords.some((iw) => { let hits = 0; for (const w of iw)
|
|
144
|
+
if (sWords.has(w))
|
|
145
|
+
hits++; return hits >= 2; });
|
|
146
|
+
if (!mapsId && !citesFr && !mapsItem)
|
|
147
|
+
unsourced.push(s.name.slice(0, 80));
|
|
148
|
+
}
|
|
149
|
+
return unsourced;
|
|
150
|
+
}
|
|
151
|
+
/** Scenarios whose step-skeleton also appears in a sibling flow feature → duplicate ownership. */
|
|
152
|
+
function crossArtifactOwnership(screenDir, scenarios) {
|
|
153
|
+
const duplicates = [];
|
|
154
|
+
// screenDir = <root>/qa/screens/<name>; flows live at <root>/qa/flows/*/features/*.feature
|
|
155
|
+
const flowsRoot = path.resolve(screenDir, '..', '..', 'flows');
|
|
156
|
+
if (!fs.existsSync(flowsRoot))
|
|
157
|
+
return { duplicates };
|
|
158
|
+
const bySkeleton = new Map();
|
|
159
|
+
for (const flow of fs.readdirSync(flowsRoot)) {
|
|
160
|
+
const fdir = path.join(flowsRoot, flow, 'features');
|
|
161
|
+
if (!fs.existsSync(fdir))
|
|
162
|
+
continue;
|
|
163
|
+
for (const f of fs.readdirSync(fdir).filter((x) => x.endsWith('.feature'))) {
|
|
164
|
+
for (const fs2 of (0, parse_1.loadScenarios)(path.join(fdir, f))) {
|
|
165
|
+
if (fs2.stepSkeleton && fs2.stepSkeleton.length > 20)
|
|
166
|
+
bySkeleton.set(fs2.stepSkeleton, flow);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (!bySkeleton.size)
|
|
171
|
+
return { duplicates };
|
|
172
|
+
for (const s of scenarios) {
|
|
173
|
+
const flow = s.stepSkeleton && s.stepSkeleton.length > 20 ? bySkeleton.get(s.stepSkeleton) : undefined;
|
|
174
|
+
if (flow)
|
|
175
|
+
duplicates.push({ scenario: s.name.slice(0, 70), flow });
|
|
176
|
+
}
|
|
177
|
+
return { duplicates };
|
|
178
|
+
}
|
|
99
179
|
// convenience reader
|
|
100
180
|
function readText(p) {
|
|
101
181
|
return fs.existsSync(p) ? fs.readFileSync(p, 'utf-8') : '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quality-gates.js","sourceRoot":"","sources":["../../src/harness/quality-gates.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"quality-gates.js","sourceRoot":"","sources":["../../src/harness/quality-gates.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensors.d.ts","sourceRoot":"","sources":["../../src/harness/sensors.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"sensors.d.ts","sourceRoot":"","sources":["../../src/harness/sensors.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;AAcjE,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AACD,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,UAAU,CAAA;CAAE;AACvF,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE;QAAE,eAAe,EAAE,MAAM,EAAE,CAAC;QAAC,UAAU,EAAE,YAAY,EAAE,CAAA;KAAE,CAAC,CAAC;IACtF,SAAS,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,wBAAgB,WAAW,IAAI,OAAO,CAGrC;AASD,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;QAAC,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;KAAE,EAAE,CAAC;IAC7E,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,wBAAgB,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAyCnH;AAID,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;IAChC,YAAY,EAAE,MAAM,CAAC;IACrB,uBAAuB,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAE/D,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;CACvB;AASD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,SAAS,EAAE,YAAY,EAAE,EACzB,UAAU,GAAE,YAAY,EAAO,EAC/B,KAAK,SAAe,GACnB,WAAW,CAoCb;AAED,oFAAoF;AACpF,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,GAAG,YAAY,EAAE,CAKvF;AAID,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,aAAa,CA0BxE;AAID,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,EAAE,CAAC;QAAC,cAAc,EAAE,OAAO,CAAA;KAAE,EAAE,CAAC;IAC/E,mBAAmB,EAAE,MAAM,CAAC;IAC5B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,eAAe,CAoB5E;AAID,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,GAAG,WAAW,CAqBjG;AAUD,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,aAAa,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,YAAY,CAAC;CACvB;AA0HD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAcD,wBAAgB,YAAY,CAAC,SAAS,EAAE,YAAY,EAAE,GAAG,cAAc,CAkBtE;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,YAAY,EAAE,EAAE,KAAK,SAAe,GAAG,gBAAgB,CAmC5F"}
|
package/dist/harness/sensors.js
CHANGED
|
@@ -53,6 +53,7 @@ exports.claimProof = claimProof;
|
|
|
53
53
|
const fs = __importStar(require("fs"));
|
|
54
54
|
const path = __importStar(require("path"));
|
|
55
55
|
const yaml_1 = require("yaml");
|
|
56
|
+
const parse_1 = require("./parse");
|
|
56
57
|
// Business-critical category codes (project VP-<CAT> prefixes). Configurable later.
|
|
57
58
|
const BUSINESS_CRITICAL_CATS = ['LIST', 'CART', 'PRODUCT', 'FILTER', 'CHECKOUT', 'ORDER'];
|
|
58
59
|
// Buckets for coverage-balance.
|
|
@@ -217,17 +218,24 @@ function duplicateClusters(scenarios) {
|
|
|
217
218
|
}
|
|
218
219
|
function traceability(scenarios, viewpoints) {
|
|
219
220
|
const overviewIds = new Set(viewpoints.map((v) => v.id.toUpperCase()));
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
221
|
+
// A scenario carries an ID if it has a project-scheme leading ID (vpId) or a VP-CAT code.
|
|
222
|
+
const withCode = scenarios.filter((s) => s.vpId || s.vpCode);
|
|
223
|
+
// Maps to overview if the scenario's ID, its sequence-stripped prefix, or its VP-CAT code
|
|
224
|
+
// matches a declared viewpoint ID (format-tolerant: VP0-001↔VP0, MS-HP-001↔MS-HP-001).
|
|
225
|
+
const mapped = withCode.filter((s) => {
|
|
226
|
+
const id = (s.vpId || s.vpCode || '').toUpperCase();
|
|
227
|
+
if (overviewIds.has(id) || overviewIds.has((0, parse_1.idPrefix)(id)))
|
|
228
|
+
return true;
|
|
229
|
+
return [...overviewIds].some((oid) => id.startsWith(oid) || oid.startsWith((0, parse_1.idPrefix)(id)) || (!!s.category && oid.includes(s.category)));
|
|
230
|
+
});
|
|
223
231
|
return {
|
|
224
232
|
total: scenarios.length,
|
|
225
233
|
withVpCode: withCode.length,
|
|
226
234
|
mappedToOverview: mapped.length,
|
|
227
235
|
withVpCodeRatio: scenarios.length ? withCode.length / scenarios.length : 0,
|
|
228
236
|
mappedRatio: scenarios.length ? mapped.length / scenarios.length : 0,
|
|
229
|
-
note: mapped.length < withCode.length * 0.5
|
|
230
|
-
? '
|
|
237
|
+
note: withCode.length && mapped.length < withCode.length * 0.5
|
|
238
|
+
? 'Scenario IDs do not match the viewpoint-overview ids (weak traceability — re-tag to the project viewpoint IDs).'
|
|
231
239
|
: 'Traceable.',
|
|
232
240
|
};
|
|
233
241
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sensors.js","sourceRoot":"","sources":["../../src/harness/sensors.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sensors.js","sourceRoot":"","sources":["../../src/harness/sensors.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -71,6 +71,12 @@ function render(r: AuditReport): void {
|
|
|
71
71
|
if (r.ledger.missing.length > 8) L(` … +${r.ledger.missing.length - 8} more`);
|
|
72
72
|
L('');
|
|
73
73
|
}
|
|
74
|
+
if (r.calibration) {
|
|
75
|
+
const ax = Object.entries(r.calibration.axes).map(([k, v]) => `${k}=${(v * 100).toFixed(0)}%`).join(' · ');
|
|
76
|
+
L(` ⑨ Calibration — ${ax}`);
|
|
77
|
+
L(` weakest: ${r.calibration.weakest.axis} ${(r.calibration.weakest.value * 100).toFixed(0)}%${r.calibration.inflated ? ' ⚠ SCORE-INFLATED-BY-BREADTH' : ''}`);
|
|
78
|
+
L('');
|
|
79
|
+
}
|
|
74
80
|
L(' ── Findings (Repair targets) ──');
|
|
75
81
|
if (r.findings.length === 0) L(' ✓ none — output passes the harness');
|
|
76
82
|
for (const f of r.findings) L(` • ${f}`);
|
package/src/harness/audit.ts
CHANGED
|
@@ -15,9 +15,10 @@ import {
|
|
|
15
15
|
} from './sensors';
|
|
16
16
|
import { readIntent, projectRootFromScreenDir, IntentProfile } from './intent';
|
|
17
17
|
import { getProvenance, Provenance } from './provenance';
|
|
18
|
-
import { specCoverage, SpecCoverageResult } from './spec-coverage';
|
|
19
|
-
import { downstreamScope, manualOracle, readText, DownstreamResult, ManualOracleResult
|
|
20
|
-
|
|
18
|
+
import { specCoverage, SpecCoverageResult, parseSpecClauses } from './spec-coverage';
|
|
19
|
+
import { downstreamScope, manualOracle, readText, DownstreamResult, ManualOracleResult,
|
|
20
|
+
negativeSideEffect, sourceBacked, crossArtifactOwnership } from './quality-gates';
|
|
21
|
+
import { viewpointLedger, parseViewpointItems, LedgerResult } from './viewpoint-ledger';
|
|
21
22
|
|
|
22
23
|
export interface AuditReport {
|
|
23
24
|
screen: string;
|
|
@@ -33,6 +34,11 @@ export interface AuditReport {
|
|
|
33
34
|
downstream: DownstreamResult; // downstream screens referenced but under-covered
|
|
34
35
|
manualOracle: ManualOracleResult; // @manual scenarios lacking setup/action/oracle
|
|
35
36
|
ledger: LedgerResult; // atomic viewpoint-item coverage (per-bullet status)
|
|
37
|
+
calibration: { // #8 — multi-axis score so a high overall can't hide a weak axis
|
|
38
|
+
axes: Record<string, number>;
|
|
39
|
+
weakest: { axis: string; value: number };
|
|
40
|
+
inflated: boolean;
|
|
41
|
+
};
|
|
36
42
|
score: {
|
|
37
43
|
overall: number; // 0..10, business-weighted
|
|
38
44
|
coverage: number; // 0..1
|
|
@@ -75,6 +81,9 @@ export function runAudit(screenDir: string, screenName: string): AuditReport {
|
|
|
75
81
|
const downstream = downstreamScope(readText(specPath), scenarios);
|
|
76
82
|
const manualOracleResult = manualOracle(featureText);
|
|
77
83
|
const ledger = viewpointLedger(viewpointPath, scenarios, featureText);
|
|
84
|
+
const negSideEffect = negativeSideEffect(scenarios);
|
|
85
|
+
const ownership = crossArtifactOwnership(screenDir, scenarios);
|
|
86
|
+
const unsourced = sourceBacked(scenarios, parseSpecClauses(specPath).frs.map((f) => f.id), parseViewpointItems(viewpointPath).map((i) => i.text), viewpoints.map((v) => v.id), featureText);
|
|
78
87
|
|
|
79
88
|
// Sub-scores
|
|
80
89
|
const coverage = gate.coverageRatio;
|
|
@@ -138,6 +147,35 @@ export function runAudit(screenDir: string, screenName: string): AuditReport {
|
|
|
138
147
|
const sample = ledger.missing.slice(0, 6).map((m) => m.id || `"${m.text}"`).join(', ');
|
|
139
148
|
findings.push(`VIEWPOINT-ITEM-MISSING: ${ledger.missing.length}/${ledger.total} atomic viewpoint items have no covering scenario (${(ledger.ratio * 100).toFixed(0)}% covered) — e.g. ${sample}. Cover each item or mark it deferred/spec-gap.`);
|
|
140
149
|
}
|
|
150
|
+
for (const n of negSideEffect.slice(0, 6)) {
|
|
151
|
+
findings.push(`NEGATIVE-SIDE-EFFECT-UNPROVEN: "${n}" — the title claims something must NOT happen but the steps don't prove the absence (assert a count / negative state, or make it @manual with an oracle).`);
|
|
152
|
+
}
|
|
153
|
+
for (const d of ownership.duplicates.slice(0, 6)) {
|
|
154
|
+
findings.push(`DUPLICATE-FLOW-OWNERSHIP: "${d.scenario}" has the same shape as a scenario in flow "${d.flow}" — keep one owner (screen-local vs flow); the other should only reference/set up.`);
|
|
155
|
+
}
|
|
156
|
+
for (const u of unsourced.slice(0, 6)) {
|
|
157
|
+
findings.push(`UNSOURCEABLE-SCENARIO: "${u}" doesn't trace to any FR / viewpoint item — link it to a source, or tag it @exploration (not part of the official suite).`);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// #8 — multi-axis calibration: a high overall must not hide a weak axis.
|
|
161
|
+
const manualCompleteness = manualOracleResult.manualTotal
|
|
162
|
+
? 1 - manualOracleResult.insufficient.length / manualOracleResult.manualTotal : 1;
|
|
163
|
+
const axes: Record<string, number> = {
|
|
164
|
+
coverage: Math.round(coverage * 100) / 100,
|
|
165
|
+
businessDepth: Math.round(businessDepth * 100) / 100,
|
|
166
|
+
claimProof: Math.round(claim.ratio * 100) / 100,
|
|
167
|
+
specFR: spec.frTotal ? Math.round((spec.frCovered / spec.frTotal) * 100) / 100 : 1,
|
|
168
|
+
atomicLedger: Math.round(ledger.ratio * 100) / 100,
|
|
169
|
+
manualOracle: Math.round(manualCompleteness * 100) / 100,
|
|
170
|
+
taxonomy: taxonomyMismatch ? 0 : Math.round(trace.mappedRatio * 100) / 100,
|
|
171
|
+
};
|
|
172
|
+
const weakestEntry = Object.entries(axes).sort((a, b) => a[1] - b[1])[0];
|
|
173
|
+
const weakest = { axis: weakestEntry[0], value: weakestEntry[1] };
|
|
174
|
+
const inflated = overall >= 8 && weakest.value < 0.6;
|
|
175
|
+
if (inflated) {
|
|
176
|
+
findings.push(`SCORE-INFLATED-BY-BREADTH: overall ${Math.round(overall * 10) / 10}/10 but the weakest axis "${weakest.axis}" is ${(weakest.value * 100).toFixed(0)}% — breadth is hiding a weak dimension. Raise "${weakest.axis}" before trusting the headline.`);
|
|
177
|
+
}
|
|
178
|
+
const calibration = { axes, weakest, inflated };
|
|
141
179
|
|
|
142
180
|
// Gate spans coverage (viewpoint themes), depth, claim-proof, spec-clause coverage,
|
|
143
181
|
// AND taxonomy-match (scenarios must use the project's viewpoint IDs when defined).
|
|
@@ -148,7 +186,7 @@ export function runAudit(screenDir: string, screenName: string): AuditReport {
|
|
|
148
186
|
screen: screenName,
|
|
149
187
|
scenarioCount: scenarios.length,
|
|
150
188
|
gate, depth, claim, taxonomy, balance, duplicates, trace, spec,
|
|
151
|
-
taxonomyMismatch, downstream, manualOracle: manualOracleResult, ledger,
|
|
189
|
+
taxonomyMismatch, downstream, manualOracle: manualOracleResult, ledger, calibration,
|
|
152
190
|
score: {
|
|
153
191
|
overall: Math.round(overall * 10) / 10,
|
|
154
192
|
coverage: Math.round(coverage * 100) / 100,
|
package/src/harness/parse.ts
CHANGED
|
@@ -29,6 +29,18 @@ export interface ScenarioInfo {
|
|
|
29
29
|
stepSkeleton: string; // normalized steps for duplicate clustering
|
|
30
30
|
haystack: string; // lowercase name + steps text (for keyword coverage)
|
|
31
31
|
stepsText: string; // lowercase steps ONLY (name excluded) — for claim-proof
|
|
32
|
+
vpId?: string; // raw leading ID token of the title (project's scheme: VP0-001, MS-HP-001, VP-LIST-001)
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Format-tolerant: is this token an ID (project's scheme), not a prose word?
|
|
36
|
+
* Accepts VP0, VP0-001, MS-HP-001, TV-01, VP-LIST-001 — requires a digit + uppercase start. */
|
|
37
|
+
export function isIdLike(s: string): boolean {
|
|
38
|
+
return /^[A-Z][A-Za-z0-9.-]*$/.test(s) && /\d/.test(s) && s.length >= 3;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** The ID minus its trailing -NNN sequence number (VP0-001 → VP0, MS-HP-001 → MS-HP). */
|
|
42
|
+
export function idPrefix(id: string): string {
|
|
43
|
+
return id.replace(/[-.]\d{1,4}$/, '');
|
|
32
44
|
}
|
|
33
45
|
|
|
34
46
|
// ---------- test-viewpoint.md ----------
|
|
@@ -50,7 +62,7 @@ export function parseViewpointOverview(filePath: string): ViewpointEntry[] {
|
|
|
50
62
|
const cells = line.split('|').map((c) => c.trim()).filter((_, i, a) => i > 0 && i < a.length - 1);
|
|
51
63
|
if (cells.length >= 3) {
|
|
52
64
|
const id = cells[0];
|
|
53
|
-
if (
|
|
65
|
+
if (isIdLike(id) && !/^-+$/.test(cells[1])) {
|
|
54
66
|
const pr = /high/i.test(cells[1]) ? 'High' : /medium/i.test(cells[1]) ? 'Medium' : /low/i.test(cells[1]) ? 'Low' : 'Unknown';
|
|
55
67
|
entries.set(id.toUpperCase(), { id: id.toUpperCase(), priority: pr as any, reason: cells[2] });
|
|
56
68
|
}
|
|
@@ -66,8 +78,8 @@ export function parseViewpointOverview(filePath: string): ViewpointEntry[] {
|
|
|
66
78
|
if (g) { group = (g[1][0].toUpperCase() + g[1].slice(1).toLowerCase()) as any; continue; }
|
|
67
79
|
if (/^##\s/.test(line)) { group = undefined; }
|
|
68
80
|
if (group) {
|
|
69
|
-
const m = line.match(
|
|
70
|
-
if (m) {
|
|
81
|
+
const m = line.match(/^[-*+]\s+([A-Za-z][A-Za-z0-9.-]*)/);
|
|
82
|
+
if (m && isIdLike(m[1])) {
|
|
71
83
|
const id = m[1].toUpperCase();
|
|
72
84
|
const existing = entries.get(id);
|
|
73
85
|
if (existing) existing.group = group;
|
|
@@ -92,6 +104,9 @@ function classifyScenario(sc: ParsedScenario): ScenarioInfo {
|
|
|
92
104
|
const codeMatch = sc.name.match(/\bVP-([A-Z]+)-\d+/i);
|
|
93
105
|
const vpCode = codeMatch ? codeMatch[0].toUpperCase() : undefined;
|
|
94
106
|
const category = codeMatch ? codeMatch[1].toUpperCase() : undefined;
|
|
107
|
+
// Project-scheme ID: the leading token of the title (VP0-001 / MS-HP-001 / VP-LIST-001).
|
|
108
|
+
const leadMatch = sc.name.match(/^\s*([A-Za-z][A-Za-z0-9.-]*)/);
|
|
109
|
+
const vpId = leadMatch && isIdLike(leadMatch[1]) ? leadMatch[1].toUpperCase() : undefined;
|
|
95
110
|
|
|
96
111
|
// Then-phase detection (And/But inherit previous primary keyword)
|
|
97
112
|
let last = 'Given';
|
|
@@ -136,6 +151,7 @@ function classifyScenario(sc: ParsedScenario): ScenarioInfo {
|
|
|
136
151
|
stepSkeleton: skeletonParts.join(' | '),
|
|
137
152
|
haystack: textParts.join(' ').toLowerCase(),
|
|
138
153
|
stepsText: stepTextParts.join(' ').toLowerCase(),
|
|
154
|
+
vpId,
|
|
139
155
|
};
|
|
140
156
|
}
|
|
141
157
|
|
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Quality gates (batch): downstream-scope
|
|
3
|
-
*
|
|
2
|
+
* Quality gates (batch): downstream-scope + manual-oracle + negative-side-effect +
|
|
3
|
+
* cross-artifact ownership + source-backed strictness.
|
|
4
|
+
* Generic — read the project's own spec.md / feature text / sibling flows; no project data.
|
|
4
5
|
*/
|
|
5
6
|
import * as fs from 'fs';
|
|
6
|
-
import
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { ScenarioInfo, loadScenarios, idPrefix } from './parse';
|
|
7
9
|
|
|
8
10
|
// ---------- #2 Downstream-scope ----------
|
|
9
11
|
|
|
@@ -73,6 +75,77 @@ export function manualOracle(featureText: string): ManualOracleResult {
|
|
|
73
75
|
return { manualTotal, insufficient };
|
|
74
76
|
}
|
|
75
77
|
|
|
78
|
+
// ---------- #4 Negative side-effect ----------
|
|
79
|
+
|
|
80
|
+
const NEG_TITLE = /\b(does not|doesn't|no second|not dispatch|not sent|without submitting|no leak|single request|exactly one|count is 1|only one request|no duplicate|not create)\b/i;
|
|
81
|
+
|
|
82
|
+
/** Titles asserting an ABSENCE must prove it (count / negative / @manual+oracle), not just a happy outcome. */
|
|
83
|
+
export function negativeSideEffect(scenarios: ScenarioInfo[]): string[] {
|
|
84
|
+
const flagged: string[] = [];
|
|
85
|
+
for (const s of scenarios) {
|
|
86
|
+
if (s.manual) continue; // @manual is a legitimate deferral (oracle checked by #4 manual-oracle)
|
|
87
|
+
if (!NEG_TITLE.test(s.name)) continue;
|
|
88
|
+
const proven = /\bcount\b|tohavecount|table with|is hidden|are hidden|not complete|message is hidden/.test(s.stepsText);
|
|
89
|
+
if (!proven) flagged.push(s.name.slice(0, 80));
|
|
90
|
+
}
|
|
91
|
+
return flagged;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ---------- #7 Source-backed strictness ----------
|
|
95
|
+
|
|
96
|
+
/** A scenario should trace to a source: a viewpoint ID (its own scheme), an FR id, or a
|
|
97
|
+
* viewpoint item (keyword overlap). ID match is language-agnostic and primary. */
|
|
98
|
+
export function sourceBacked(scenarios: ScenarioInfo[], frIds: string[], viewpointItems: string[], viewpointIds: string[], featureText: string): string[] {
|
|
99
|
+
if (!frIds.length && !viewpointItems.length && !viewpointIds.length) return []; // no contract
|
|
100
|
+
const vpIds = viewpointIds.map((s) => s.toUpperCase());
|
|
101
|
+
const itemWords = viewpointItems.map((t) => new Set((t.toLowerCase().match(/[a-z][a-z-]{4,}/g) || [])));
|
|
102
|
+
// per-scenario blocks (INCLUDING comments) so an FR cited in a comment counts as a source
|
|
103
|
+
const blockOf = new Map<string, string>();
|
|
104
|
+
for (const b of featureText.split(/\n\s*\n/)) {
|
|
105
|
+
const m = b.match(/Scenario:\s*(.+)/);
|
|
106
|
+
if (m) blockOf.set(m[1].trim().toLowerCase(), b.toLowerCase());
|
|
107
|
+
}
|
|
108
|
+
const unsourced: string[] = [];
|
|
109
|
+
for (const s of scenarios) {
|
|
110
|
+
const id = (s.vpId || s.vpCode || '').toUpperCase();
|
|
111
|
+
const mapsId = !!id && vpIds.some((v) => id === v || id.startsWith(v) || v.startsWith(idPrefix(id)));
|
|
112
|
+
const block = blockOf.get(s.name.trim().toLowerCase()) || s.haystack;
|
|
113
|
+
const citesFr = frIds.some((fid) => block.includes(fid.toLowerCase()));
|
|
114
|
+
const sWords = new Set((s.haystack.match(/[a-z][a-z-]{4,}/g) || []));
|
|
115
|
+
const mapsItem = itemWords.some((iw) => { let hits = 0; for (const w of iw) if (sWords.has(w)) hits++; return hits >= 2; });
|
|
116
|
+
if (!mapsId && !citesFr && !mapsItem) unsourced.push(s.name.slice(0, 80));
|
|
117
|
+
}
|
|
118
|
+
return unsourced;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// ---------- #6 Cross-artifact ownership ----------
|
|
122
|
+
|
|
123
|
+
export interface OwnershipResult { duplicates: { scenario: string; flow: string }[] }
|
|
124
|
+
|
|
125
|
+
/** Scenarios whose step-skeleton also appears in a sibling flow feature → duplicate ownership. */
|
|
126
|
+
export function crossArtifactOwnership(screenDir: string, scenarios: ScenarioInfo[]): OwnershipResult {
|
|
127
|
+
const duplicates: { scenario: string; flow: string }[] = [];
|
|
128
|
+
// screenDir = <root>/qa/screens/<name>; flows live at <root>/qa/flows/*/features/*.feature
|
|
129
|
+
const flowsRoot = path.resolve(screenDir, '..', '..', 'flows');
|
|
130
|
+
if (!fs.existsSync(flowsRoot)) return { duplicates };
|
|
131
|
+
const bySkeleton = new Map<string, string>();
|
|
132
|
+
for (const flow of fs.readdirSync(flowsRoot)) {
|
|
133
|
+
const fdir = path.join(flowsRoot, flow, 'features');
|
|
134
|
+
if (!fs.existsSync(fdir)) continue;
|
|
135
|
+
for (const f of fs.readdirSync(fdir).filter((x) => x.endsWith('.feature'))) {
|
|
136
|
+
for (const fs2 of loadScenarios(path.join(fdir, f))) {
|
|
137
|
+
if (fs2.stepSkeleton && fs2.stepSkeleton.length > 20) bySkeleton.set(fs2.stepSkeleton, flow);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (!bySkeleton.size) return { duplicates };
|
|
142
|
+
for (const s of scenarios) {
|
|
143
|
+
const flow = s.stepSkeleton && s.stepSkeleton.length > 20 ? bySkeleton.get(s.stepSkeleton) : undefined;
|
|
144
|
+
if (flow) duplicates.push({ scenario: s.name.slice(0, 70), flow });
|
|
145
|
+
}
|
|
146
|
+
return { duplicates };
|
|
147
|
+
}
|
|
148
|
+
|
|
76
149
|
// convenience reader
|
|
77
150
|
export function readText(p: string): string {
|
|
78
151
|
return fs.existsSync(p) ? fs.readFileSync(p, 'utf-8') : '';
|
package/src/harness/sensors.ts
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
import * as fs from 'fs';
|
|
10
10
|
import * as path from 'path';
|
|
11
11
|
import { parse as parseYaml } from 'yaml';
|
|
12
|
-
import { ScenarioInfo, ViewpointEntry } from './parse';
|
|
12
|
+
import { ScenarioInfo, ViewpointEntry, idPrefix } from './parse';
|
|
13
13
|
|
|
14
14
|
// Business-critical category codes (project VP-<CAT> prefixes). Configurable later.
|
|
15
15
|
const BUSINESS_CRITICAL_CATS = ['LIST', 'CART', 'PRODUCT', 'FILTER', 'CHECKOUT', 'ORDER'];
|
|
@@ -263,17 +263,23 @@ export interface TraceResult {
|
|
|
263
263
|
|
|
264
264
|
export function traceability(scenarios: ScenarioInfo[], viewpoints: ViewpointEntry[]): TraceResult {
|
|
265
265
|
const overviewIds = new Set(viewpoints.map((v) => v.id.toUpperCase()));
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
266
|
+
// A scenario carries an ID if it has a project-scheme leading ID (vpId) or a VP-CAT code.
|
|
267
|
+
const withCode = scenarios.filter((s) => s.vpId || s.vpCode);
|
|
268
|
+
// Maps to overview if the scenario's ID, its sequence-stripped prefix, or its VP-CAT code
|
|
269
|
+
// matches a declared viewpoint ID (format-tolerant: VP0-001↔VP0, MS-HP-001↔MS-HP-001).
|
|
270
|
+
const mapped = withCode.filter((s) => {
|
|
271
|
+
const id = (s.vpId || s.vpCode || '').toUpperCase();
|
|
272
|
+
if (overviewIds.has(id) || overviewIds.has(idPrefix(id))) return true;
|
|
273
|
+
return [...overviewIds].some((oid) => id.startsWith(oid) || oid.startsWith(idPrefix(id)) || (!!s.category && oid.includes(s.category)));
|
|
274
|
+
});
|
|
269
275
|
return {
|
|
270
276
|
total: scenarios.length,
|
|
271
277
|
withVpCode: withCode.length,
|
|
272
278
|
mappedToOverview: mapped.length,
|
|
273
279
|
withVpCodeRatio: scenarios.length ? withCode.length / scenarios.length : 0,
|
|
274
280
|
mappedRatio: scenarios.length ? mapped.length / scenarios.length : 0,
|
|
275
|
-
note: mapped.length < withCode.length * 0.5
|
|
276
|
-
? '
|
|
281
|
+
note: withCode.length && mapped.length < withCode.length * 0.5
|
|
282
|
+
? 'Scenario IDs do not match the viewpoint-overview ids (weak traceability — re-tag to the project viewpoint IDs).'
|
|
277
283
|
: 'Traceable.',
|
|
278
284
|
};
|
|
279
285
|
}
|