@sun-asterisk/sungen 3.3.0-alpha.4 → 3.3.0-alpha.6
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/next.d.ts +3 -2
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +7 -1
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/triage.d.ts +2 -1
- package/dist/cli/commands/triage.d.ts.map +1 -1
- package/dist/cli/commands/triage.js +42 -2
- package/dist/cli/commands/triage.js.map +1 -1
- package/dist/decisions/decision-schema.d.ts +2 -1
- package/dist/decisions/decision-schema.d.ts.map +1 -1
- package/dist/decisions/decision-schema.js +2 -1
- package/dist/decisions/decision-schema.js.map +1 -1
- package/dist/graph/manual-triage-decisions.d.ts +19 -0
- package/dist/graph/manual-triage-decisions.d.ts.map +1 -0
- package/dist/graph/manual-triage-decisions.js +53 -0
- package/dist/graph/manual-triage-decisions.js.map +1 -0
- package/dist/graph/nodes/test-case-nodes.d.ts +3 -0
- package/dist/graph/nodes/test-case-nodes.d.ts.map +1 -1
- package/dist/graph/nodes/test-case-nodes.js +18 -1
- package/dist/graph/nodes/test-case-nodes.js.map +1 -1
- package/dist/graph/test-case-results.d.ts +1 -0
- package/dist/graph/test-case-results.d.ts.map +1 -1
- package/dist/graph/test-case-results.js +27 -3
- package/dist/graph/test-case-results.js.map +1 -1
- package/dist/graph/test-case-satisfied.d.ts +5 -4
- package/dist/graph/test-case-satisfied.d.ts.map +1 -1
- package/dist/graph/test-case-satisfied.js +4 -0
- package/dist/graph/test-case-satisfied.js.map +1 -1
- package/dist/graph/test-case-state-shape.d.ts +7 -1
- package/dist/graph/test-case-state-shape.d.ts.map +1 -1
- package/dist/graph/unit-results-freshness.d.ts +29 -0
- package/dist/graph/unit-results-freshness.d.ts.map +1 -0
- package/dist/graph/unit-results-freshness.js +213 -0
- package/dist/graph/unit-results-freshness.js.map +1 -0
- package/dist/harness/audit.d.ts +3 -2
- package/dist/harness/audit.d.ts.map +1 -1
- package/dist/harness/audit.js +4 -17
- package/dist/harness/audit.js.map +1 -1
- package/dist/harness/defect-draft.d.ts.map +1 -1
- package/dist/harness/defect-draft.js +12 -2
- package/dist/harness/defect-draft.js.map +1 -1
- package/dist/harness/defects.d.ts +14 -0
- package/dist/harness/defects.d.ts.map +1 -1
- package/dist/harness/defects.js +14 -10
- package/dist/harness/defects.js.map +1 -1
- package/dist/harness/flow-check.d.ts +9 -0
- package/dist/harness/flow-check.d.ts.map +1 -1
- package/dist/harness/flow-check.js +11 -0
- package/dist/harness/flow-check.js.map +1 -1
- package/dist/harness/gates/audit-gate-verdict.d.ts.map +1 -1
- package/dist/harness/gates/audit-gate-verdict.js +2 -1
- package/dist/harness/gates/audit-gate-verdict.js.map +1 -1
- package/dist/harness/gates/audit-input-hash.d.ts +2 -0
- package/dist/harness/gates/audit-input-hash.d.ts.map +1 -1
- package/dist/harness/gates/audit-input-hash.js +30 -2
- package/dist/harness/gates/audit-input-hash.js.map +1 -1
- package/dist/harness/gates/audit-report-verification.js +1 -1
- package/dist/harness/gates/audit-report-verification.js.map +1 -1
- package/dist/harness/gates/delivery-checklist.d.ts +3 -0
- package/dist/harness/gates/delivery-checklist.d.ts.map +1 -1
- package/dist/harness/gates/delivery-checklist.js +28 -3
- package/dist/harness/gates/delivery-checklist.js.map +1 -1
- package/dist/harness/gates/in-run-decision-check.d.ts.map +1 -1
- package/dist/harness/gates/in-run-decision-check.js +14 -1
- package/dist/harness/gates/in-run-decision-check.js.map +1 -1
- package/dist/harness/next-step.d.ts +3 -0
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +7 -0
- package/dist/harness/next-step.js.map +1 -1
- package/dist/harness/triage-manual-classification.d.ts +32 -0
- package/dist/harness/triage-manual-classification.d.ts.map +1 -0
- package/dist/harness/triage-manual-classification.js +56 -0
- package/dist/harness/triage-manual-classification.js.map +1 -0
- package/dist/harness/unit-paths.d.ts +8 -0
- package/dist/harness/unit-paths.d.ts.map +1 -1
- package/dist/harness/unit-paths.js +23 -1
- package/dist/harness/unit-paths.js.map +1 -1
- package/dist/hooks/guard-tty-spoof-rule.d.ts +2 -1
- package/dist/hooks/guard-tty-spoof-rule.d.ts.map +1 -1
- package/dist/hooks/guard-tty-spoof-rule.js +3 -2
- package/dist/hooks/guard-tty-spoof-rule.js.map +1 -1
- package/package.json +3 -3
- package/src/cli/commands/next.ts +9 -3
- package/src/cli/commands/triage.ts +38 -2
- package/src/decisions/decision-schema.ts +2 -1
- package/src/graph/manual-triage-decisions.ts +55 -0
- package/src/graph/nodes/test-case-nodes.ts +19 -1
- package/src/graph/test-case-results.ts +25 -4
- package/src/graph/test-case-satisfied.ts +7 -4
- package/src/graph/test-case-state-shape.ts +7 -2
- package/src/graph/unit-results-freshness.ts +165 -0
- package/src/harness/audit.ts +4 -13
- package/src/harness/defect-draft.ts +13 -2
- package/src/harness/defects.ts +22 -9
- package/src/harness/flow-check.ts +11 -0
- package/src/harness/gates/audit-gate-verdict.ts +2 -1
- package/src/harness/gates/audit-input-hash.ts +27 -3
- package/src/harness/gates/audit-report-verification.ts +2 -2
- package/src/harness/gates/delivery-checklist.ts +26 -4
- package/src/harness/gates/in-run-decision-check.ts +15 -1
- package/src/harness/next-step.ts +7 -0
- package/src/harness/triage-manual-classification.ts +76 -0
- package/src/harness/unit-paths.ts +19 -0
- package/src/hooks/guard-tty-spoof-rule.ts +5 -3
|
@@ -9,8 +9,9 @@
|
|
|
9
9
|
* sungen next <unit> --case <id> one test case: its state, and its steps after the blocking
|
|
10
10
|
* unit steps before them (OES-10.3)
|
|
11
11
|
* --json the same, machine-readable; steps add nodeId, granularity,
|
|
12
|
-
* testCase?, gates?;
|
|
13
|
-
* payload alone (#660, #836)
|
|
12
|
+
* testCase?, gates?; the unit adds `results` (#942); every older
|
|
13
|
+
* field is kept. stdout is the payload alone (#660, #836)
|
|
14
|
+
* The text names the run the results come from and warns when they are older than the suite (#942).
|
|
14
15
|
*/
|
|
15
16
|
import { Command } from 'commander';
|
|
16
17
|
export declare function registerNextCommand(program: Command): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"next.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyFpC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2C1D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
|
@@ -40,6 +40,7 @@ const path = __importStar(require("path"));
|
|
|
40
40
|
const contract_git_1 = require("../../contract/contract-git");
|
|
41
41
|
const test_case_satisfied_1 = require("../../graph/test-case-satisfied");
|
|
42
42
|
const test_case_states_1 = require("../../graph/test-case-states");
|
|
43
|
+
const unit_results_freshness_1 = require("../../graph/unit-results-freshness");
|
|
43
44
|
const next_step_1 = require("../../harness/next-step");
|
|
44
45
|
const resolve_unit_1 = require("../resolve-unit");
|
|
45
46
|
const project_sungen_invocation_1 = require("../project-sungen-invocation");
|
|
@@ -83,6 +84,11 @@ function render(s, cwd) {
|
|
|
83
84
|
L(` audit: ${s.audit.overall}/10 [${s.audit.gateStatus}] · ${s.audit.findings.length} finding(s)`);
|
|
84
85
|
else if (s.auditNotCounted)
|
|
85
86
|
L(` audit: ${s.auditNotCounted.state === 'stale' ? 'stale' : 'not trusted'} — ${s.auditNotCounted.reason}`);
|
|
87
|
+
if (s.results) {
|
|
88
|
+
L(` results: ${s.results.files.length} file${s.results.files.length === 1 ? '' : 's'}, ${(0, unit_results_freshness_1.describeResultsRun)(s.results)}`);
|
|
89
|
+
if (s.results.warning)
|
|
90
|
+
L(` ⚠ ${s.results.warning}`);
|
|
91
|
+
}
|
|
86
92
|
L('');
|
|
87
93
|
renderSteps(s.steps, cwd);
|
|
88
94
|
L('');
|
|
@@ -114,7 +120,7 @@ function caseView(s, cwd, unitDir, id, json) {
|
|
|
114
120
|
L('');
|
|
115
121
|
L(` test case: ${tc.title}${tc.unstableId ? ' (no VP-id — this id changes when the title does)' : ''}`);
|
|
116
122
|
L(` where: ${tc.file}#L${tc.lines[0]}-L${tc.lines[1]}`);
|
|
117
|
-
L(` status: ${(0, test_case_satisfied_1.testCaseStatusLabel)(tc)} · result ${tc.result}${tc.mocked && tc.result === 'passed' ? ' (mocked)' : ''}${tc.stale ? ` · stale: ${tc.stale}` : ''}${tc.triage ? ` · triage ${tc.triage.class}` : ''}`);
|
|
123
|
+
L(` status: ${(0, test_case_satisfied_1.testCaseStatusLabel)(tc)} · result ${tc.result}${tc.mocked && tc.result === 'passed' ? ' (mocked)' : ''}${tc.stale ? ` · stale: ${tc.stale}` : ''}${tc.triage ? ` · triage ${tc.triage.class}${tc.triage.ruleId === 'manual' ? ` (by hand, ${tc.triage.decision})` : ''}` : ''}`);
|
|
118
124
|
if (tc.contract)
|
|
119
125
|
L(` contract: ${tc.contract.class}${tc.contract.uncommitted ? ' · lock entry not committed' : ''}${tc.contract.lowIdentity ? ' · low target identity' : ''}`);
|
|
120
126
|
if (tc.anchors.length)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"next.js","sourceRoot":"","sources":["../../../src/cli/commands/next.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
/**
|
|
3
3
|
* `sungen triage` — classify every red or flaky scenario of the latest run (see harness/triage.ts).
|
|
4
|
-
* Reports, never gates: always exits 0 once the unit is found.
|
|
4
|
+
* Reports, never gates: always exits 0 once the unit is found. With `--case --as` it records one
|
|
5
|
+
* classification by hand instead (exit 1 when refused or invalid).
|
|
5
6
|
*/
|
|
6
7
|
export declare function registerTriageCommand(program: Command): void;
|
|
7
8
|
//# sourceMappingURL=triage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/triage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"triage.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/triage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAoCpC;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAmD5D"}
|
|
@@ -36,12 +36,41 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.registerTriageCommand = registerTriageCommand;
|
|
37
37
|
const path = __importStar(require("path"));
|
|
38
38
|
const resolve_unit_1 = require("../resolve-unit");
|
|
39
|
+
const human_confirmation_1 = require("../../decisions/human-confirmation");
|
|
40
|
+
const manual_triage_decisions_1 = require("../../graph/manual-triage-decisions");
|
|
41
|
+
const test_case_states_1 = require("../../graph/test-case-states");
|
|
39
42
|
const triage_unit_1 = require("../../harness/triage-unit");
|
|
43
|
+
const triage_manual_classification_1 = require("../../harness/triage-manual-classification");
|
|
40
44
|
/** Display order: what needs a decision first, green last. */
|
|
41
45
|
const ORDER = ['product-candidate', 'unclassified', 'test-defect', 'environment', 'blocked-capability', 'known-defect', 'flaky'];
|
|
46
|
+
/** The classifications by hand in force for the unit (they win over the automatic class of the same red). */
|
|
47
|
+
function printManual(cwd, unitDir, name) {
|
|
48
|
+
const inForce = (0, test_case_states_1.testCaseStates)(cwd, name, { unitDir, auditFindings: [] }).filter((c) => c.triage?.ruleId === 'manual');
|
|
49
|
+
if (!inForce.length)
|
|
50
|
+
return;
|
|
51
|
+
const why = new Map((0, manual_triage_decisions_1.manualClassifications)(cwd, unitDir).map((m) => [m.decision, m]));
|
|
52
|
+
console.log(`\n classified by hand (${inForce.length}) — these win over the automatic class`);
|
|
53
|
+
for (const c of inForce) {
|
|
54
|
+
const m = why.get(c.triage.decision ?? '');
|
|
55
|
+
console.log(` • ${c.id} → ${c.triage.class}${m ? ` (${m.decision}, by ${m.by}): ${m.reason}` : ''}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/** `--case <id> --as <class> --reason "…"`: record one classification by hand (harness/triage-manual-classification.ts). */
|
|
59
|
+
async function classifyByHand(cwd, name, o) {
|
|
60
|
+
if (!o.case || !o.as)
|
|
61
|
+
throw new Error(o.as ? '--as needs --case <id>' : '--case needs --as product|test-defect|environment and --reason "…"');
|
|
62
|
+
const r = await (0, triage_manual_classification_1.classifyRedCase)({ projectRoot: cwd, unit: name, caseId: o.case, as: o.as, reason: o.reason, io: (0, human_confirmation_1.processIO)() });
|
|
63
|
+
if (o.json) {
|
|
64
|
+
console.log(JSON.stringify({ status: r.status, caseId: r.caseId, class: r.class, path: path.relative(cwd, r.path), entry: r.entry }, null, 2));
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
console.log(`\n${r.status === 'created' ? '✓ Recorded' : '= Already recorded'} ${r.entry.id}: ${r.caseId} → ${r.class} (classified by hand) → ${path.relative(cwd, r.path)}`);
|
|
68
|
+
console.log(' It holds until the case runs again. Commit it through review with the run it judged.\n');
|
|
69
|
+
}
|
|
42
70
|
/**
|
|
43
71
|
* `sungen triage` — classify every red or flaky scenario of the latest run (see harness/triage.ts).
|
|
44
|
-
* Reports, never gates: always exits 0 once the unit is found.
|
|
72
|
+
* Reports, never gates: always exits 0 once the unit is found. With `--case --as` it records one
|
|
73
|
+
* classification by hand instead (exit 1 when refused or invalid).
|
|
45
74
|
*/
|
|
46
75
|
function registerTriageCommand(program) {
|
|
47
76
|
program
|
|
@@ -50,8 +79,11 @@ function registerTriageCommand(program) {
|
|
|
50
79
|
.option('-s, --screen <name>', 'Screen or flow name')
|
|
51
80
|
.option('--api <name>', 'API-first area or api flow (qa/api/<name>)')
|
|
52
81
|
.option('--area <name>', 'Alias of --api')
|
|
82
|
+
.option('--case <id>', 'Classify one red test case by hand (its VP-id) — with --as and --reason')
|
|
83
|
+
.option('--as <class>', 'product (anyone) | test-defect | environment (a human types a confirmation on a TTY)')
|
|
84
|
+
.option('--reason <text>', 'Why the red is that class (mandatory with --as)')
|
|
53
85
|
.option('--json', 'Output the raw JSON report')
|
|
54
|
-
.action((o) => {
|
|
86
|
+
.action(async (o) => {
|
|
55
87
|
try {
|
|
56
88
|
const name = o.screen || o.api || o.area;
|
|
57
89
|
if (!name)
|
|
@@ -60,6 +92,10 @@ function registerTriageCommand(program) {
|
|
|
60
92
|
const unit = (0, resolve_unit_1.resolveUnit)(name, cwd);
|
|
61
93
|
if (!unit)
|
|
62
94
|
throw new Error(`Not found: qa/screens/${name}, qa/flows/${name}, or qa/api/${name}`);
|
|
95
|
+
if (o.case || o.as) {
|
|
96
|
+
await classifyByHand(cwd, name, o);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
63
99
|
const report = (0, triage_unit_1.triageUnit)(cwd, unit);
|
|
64
100
|
if (report.resultFiles.length === 0) {
|
|
65
101
|
if (o.json)
|
|
@@ -87,6 +123,10 @@ function registerTriageCommand(program) {
|
|
|
87
123
|
L(` ${r.ruleId}: ${r.evidence}`);
|
|
88
124
|
}
|
|
89
125
|
}
|
|
126
|
+
printManual(cwd, unit.dir, name);
|
|
127
|
+
if (report.rows.some((r) => r.class === 'unclassified')) {
|
|
128
|
+
L(`\n Unclassified: read the evidence (trace, error), then classify by hand:\n sungen triage --${unit.kind === 'api' ? 'api' : 'screen'} ${name} --case <id> --as product|test-defect|environment --reason "…"`);
|
|
129
|
+
}
|
|
90
130
|
L(`\n Report: ${path.relative(cwd, saved)}\n`);
|
|
91
131
|
}
|
|
92
132
|
catch (error) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/cli/commands/triage.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"triage.js","sourceRoot":"","sources":["../../../src/cli/commands/triage.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
* checked when read — an unknown key (a stored `superseded_by`, say) makes the entry invalid, because
|
|
9
9
|
* a field outside the id's content could carry meaning the id does not vouch for.
|
|
10
10
|
*/
|
|
11
|
-
|
|
11
|
+
/** `triage-classification`: a red classified by hand, `sungen triage --case --as` (#928, graph/manual-triage-decisions.ts). */
|
|
12
|
+
export declare const DECISION_KINDS: readonly ["waiver", "gate-override", "contract-approval", "viewpoint-acceptance", "clarification", "triage-classification"];
|
|
12
13
|
export type DecisionKind = typeof DECISION_KINDS[number];
|
|
13
14
|
export type DecisionVisibility = 'internal' | 'client';
|
|
14
15
|
export type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-schema.d.ts","sourceRoot":"","sources":["../../src/decisions/decision-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"decision-schema.d.ts","sourceRoot":"","sources":["../../src/decisions/decision-schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,+HAA+H;AAC/H,eAAO,MAAM,cAAc,6HAA8H,CAAC;AAC1J,MAAM,MAAM,YAAY,GAAG,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AACzD,MAAM,MAAM,kBAAkB,GAAG,UAAU,GAAG,QAAQ,CAAC;AACvD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtG,MAAM,WAAW,cAAc;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE;AAE7D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACpC,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,kBAAkB,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAAG,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE;AAEvF,eAAO,MAAM,cAAc,QAAqB,CAAC;AAgBjD,kGAAkG;AAClG,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,EAAE,CAgBhE;AAED,+EAA+E;AAC/E,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,EAAE,CAOxD"}
|
|
@@ -13,7 +13,8 @@ exports.storedEntryErrors = storedEntryErrors;
|
|
|
13
13
|
* checked when read — an unknown key (a stored `superseded_by`, say) makes the entry invalid, because
|
|
14
14
|
* a field outside the id's content could carry meaning the id does not vouch for.
|
|
15
15
|
*/
|
|
16
|
-
|
|
16
|
+
/** `triage-classification`: a red classified by hand, `sungen triage --case --as` (#928, graph/manual-triage-decisions.ts). */
|
|
17
|
+
exports.DECISION_KINDS = ['waiver', 'gate-override', 'contract-approval', 'viewpoint-acceptance', 'clarification', 'triage-classification'];
|
|
17
18
|
exports.DECISION_ID_RE = /^D-[0-9a-f]{16}$/;
|
|
18
19
|
const ENTRY_HASH_RE = /^[0-9a-f]{64}$/;
|
|
19
20
|
const ISO_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}(:\d{2}(\.\d+)?)?(Z|[+-]\d{2}:\d{2})$/;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decision-schema.js","sourceRoot":"","sources":["../../src/decisions/decision-schema.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"decision-schema.js","sourceRoot":"","sources":["../../src/decisions/decision-schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export declare const TRIAGE_DECISION_KIND: "triage-classification";
|
|
2
|
+
export type ManualTriageClass = 'product-candidate' | 'test-defect' | 'environment';
|
|
3
|
+
/** `--as` word → the triage class it records. */
|
|
4
|
+
export declare const MANUAL_TRIAGE_AS: Readonly<Record<string, ManualTriageClass>>;
|
|
5
|
+
/** Classes that can hide a product defect: a human types a confirmation on a terminal. */
|
|
6
|
+
export declare const HUMAN_ONLY_TRIAGE: ReadonlySet<ManualTriageClass>;
|
|
7
|
+
export interface ManualClassification {
|
|
8
|
+
decision: string;
|
|
9
|
+
caseId: string;
|
|
10
|
+
class: ManualTriageClass;
|
|
11
|
+
evidence: string;
|
|
12
|
+
reason: string;
|
|
13
|
+
by: string;
|
|
14
|
+
}
|
|
15
|
+
/** The unit's classifications that can be in force, oldest first (read-decisions orders by time). */
|
|
16
|
+
export declare function manualClassifications(projectRoot: string, unitDir: string): ManualClassification[];
|
|
17
|
+
/** The latest classification of this case bound to this red, if any. */
|
|
18
|
+
export declare function manualClassificationFor(list: ManualClassification[], caseId: string, evidence: string | undefined): ManualClassification | undefined;
|
|
19
|
+
//# sourceMappingURL=manual-triage-decisions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual-triage-decisions.d.ts","sourceRoot":"","sources":["../../src/graph/manual-triage-decisions.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,oBAAoB,EAAG,uBAAgC,CAAC;AACrE,MAAM,MAAM,iBAAiB,GAAG,mBAAmB,GAAG,aAAa,GAAG,aAAa,CAAC;AACpF,iDAAiD;AACjD,eAAO,MAAM,gBAAgB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAA8F,CAAC;AACxK,0FAA0F;AAC1F,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,CAA2C,CAAC;AAEzG,MAAM,WAAW,oBAAoB;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,iBAAiB,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;CACZ;AAID,qGAAqG;AACrG,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,oBAAoB,EAAE,CASlG;AAED,wEAAwE;AACxE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,oBAAoB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,oBAAoB,GAAG,SAAS,CAIpJ"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.HUMAN_ONLY_TRIAGE = exports.MANUAL_TRIAGE_AS = exports.TRIAGE_DECISION_KIND = void 0;
|
|
4
|
+
exports.manualClassifications = manualClassifications;
|
|
5
|
+
exports.manualClassificationFor = manualClassificationFor;
|
|
6
|
+
/**
|
|
7
|
+
* Manual triage classifications (#928) — a red `sungen triage` could not classify, or classified
|
|
8
|
+
* wrongly, judged by hand with `sungen triage --screen <u> --case <id> --as <class> --reason "…"`
|
|
9
|
+
* (harness/triage-manual-classification.ts writes them). Each is a `triage-classification` decision
|
|
10
|
+
* in the unit's `decisions/`, read here for the test-case state (test-case-results.ts):
|
|
11
|
+
*
|
|
12
|
+
* payload { case: <id>, class: product-candidate | test-defect | environment, humanConfirmed? }
|
|
13
|
+
* evidence_hash the hash of the red final attempts it judged (TestCaseState.evidence): a re-run
|
|
14
|
+
* makes a new red, and the classification no longer applies to it
|
|
15
|
+
* in force verifies (read-decisions), not superseded, bound to today's red — and, for
|
|
16
|
+
* test-defect / environment, typed by a human on a terminal (`humanConfirmed`, only
|
|
17
|
+
* ever set after the typed confirmation): those classes can hide a product defect,
|
|
18
|
+
* so an entry without it is ignored (fail closed). product-candidate is stricter than
|
|
19
|
+
* any automatic class, so anyone may record it.
|
|
20
|
+
* The latest classification in force wins over the automatic one.
|
|
21
|
+
*/
|
|
22
|
+
const read_decisions_1 = require("../decisions/read-decisions");
|
|
23
|
+
const unit_gate_overrides_1 = require("../harness/gates/unit-gate-overrides");
|
|
24
|
+
exports.TRIAGE_DECISION_KIND = 'triage-classification';
|
|
25
|
+
/** `--as` word → the triage class it records. */
|
|
26
|
+
exports.MANUAL_TRIAGE_AS = { product: 'product-candidate', 'test-defect': 'test-defect', environment: 'environment' };
|
|
27
|
+
/** Classes that can hide a product defect: a human types a confirmation on a terminal. */
|
|
28
|
+
exports.HUMAN_ONLY_TRIAGE = new Set(['test-defect', 'environment']);
|
|
29
|
+
const isClass = (v) => Object.values(exports.MANUAL_TRIAGE_AS).includes(v);
|
|
30
|
+
/** The unit's classifications that can be in force, oldest first (read-decisions orders by time). */
|
|
31
|
+
function manualClassifications(projectRoot, unitDir) {
|
|
32
|
+
const scope = (0, unit_gate_overrides_1.unitScopeOfDir)(projectRoot, unitDir);
|
|
33
|
+
if (!scope)
|
|
34
|
+
return [];
|
|
35
|
+
return (0, read_decisions_1.readDecisions)(projectRoot, scope, { kind: exports.TRIAGE_DECISION_KIND }).entries.flatMap((e) => {
|
|
36
|
+
const p = e.payload ?? {};
|
|
37
|
+
if (e.superseded_by || typeof p.case !== 'string' || !isClass(p.class) || typeof e.evidence_hash !== 'string')
|
|
38
|
+
return [];
|
|
39
|
+
if (exports.HUMAN_ONLY_TRIAGE.has(p.class) && p.humanConfirmed !== true)
|
|
40
|
+
return [];
|
|
41
|
+
return [{ decision: e.id, caseId: p.case, class: p.class, evidence: e.evidence_hash, reason: e.reason, by: e.source.by }];
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/** The latest classification of this case bound to this red, if any. */
|
|
45
|
+
function manualClassificationFor(list, caseId, evidence) {
|
|
46
|
+
if (!evidence)
|
|
47
|
+
return undefined;
|
|
48
|
+
for (let i = list.length - 1; i >= 0; i--)
|
|
49
|
+
if (list[i].caseId === caseId && list[i].evidence === evidence)
|
|
50
|
+
return list[i];
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=manual-triage-decisions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manual-triage-decisions.js","sourceRoot":"","sources":["../../src/graph/manual-triage-decisions.ts"],"names":[],"mappings":";;;AAsCA,sDASC;AAGD,0DAIC;AAtDD;;;;;;;;;;;;;;;GAeG;AACH,gEAA4D;AAC5D,8EAAsE;AAEzD,QAAA,oBAAoB,GAAG,uBAAgC,CAAC;AAErE,iDAAiD;AACpC,QAAA,gBAAgB,GAAgD,EAAE,OAAO,EAAE,mBAAmB,EAAE,aAAa,EAAE,aAAa,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AACxK,0FAA0F;AAC7E,QAAA,iBAAiB,GAAmC,IAAI,GAAG,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AAWzG,MAAM,OAAO,GAAG,CAAC,CAAU,EAA0B,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,wBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAsB,CAAC,CAAC;AAEzH,qGAAqG;AACrG,SAAgB,qBAAqB,CAAC,WAAmB,EAAE,OAAe;IACxE,MAAM,KAAK,GAAG,IAAA,oCAAc,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK;QAAE,OAAO,EAAE,CAAC;IACtB,OAAO,IAAA,8BAAa,EAAC,WAAW,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,4BAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7F,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,CAAC,aAAa,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACzH,IAAI,yBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,cAAc,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;QAC3E,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5H,CAAC,CAAC,CAAC;AACL,CAAC;AAED,wEAAwE;AACxE,SAAgB,uBAAuB,CAAC,IAA4B,EAAE,MAAc,EAAE,QAA4B;IAChH,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE;QAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1H,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -8,6 +8,9 @@
|
|
|
8
8
|
* tc.rerun-stale changed after the recorded run (run manifest) do run-test --change-only
|
|
9
9
|
* tc.triage red, not classified by a current triage do sungen triage
|
|
10
10
|
* tc.product-candidate triage found a product-defect candidate decide sungen defect draft
|
|
11
|
+
* tc.rerun-environment a red the environment caused (#928) decide run-test --ids, once a human confirms it is up
|
|
12
|
+
* tc.fix-test a red the test caused (#928) do run-test --ids (auto-fix)
|
|
13
|
+
* The class is `sungen triage`'s, or a manual classification in force (`sungen triage --case --as`).
|
|
11
14
|
* They sit after unit.run (which cuts a unit that never ran) and before delivery. tc.triage takes
|
|
12
15
|
* the reds the cases account for; unit.triage keeps the rest (unattributedReds), so a red no case
|
|
13
16
|
* explains — an @cases row, a renamed scenario, a nested describe title — still gets a triage step.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-case-nodes.d.ts","sourceRoot":"","sources":["../../../src/graph/nodes/test-case-nodes.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"test-case-nodes.d.ts","sourceRoot":"","sources":["../../../src/graph/nodes/test-case-nodes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAuB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAI9D,eAAO,MAAM,MAAM,GAAI,OAAO,aAAa,EAAE,KAAG,MAA4F,CAAC;AAC7I,sFAAsF;AACtF,eAAO,MAAM,MAAM,GAAI,OAAO,aAAa,EAAE,KAAG,MACoE,CAAC;AAgBrH,eAAO,MAAM,eAAe,EAAE,SAAS,gBAAgB,EAoCtD,CAAC;AAEF,oGAAoG;AACpG,eAAO,MAAM,cAAc,GAAI,GAAG,SAAS,KAAG,MACwD,CAAC;AAEvG,8GAA8G;AAC9G,eAAO,MAAM,gBAAgB,GAAI,GAAG,SAAS,KAAG,MAAsE,CAAC"}
|
|
@@ -11,6 +11,9 @@ exports.unattributedReds = exports.attributedReds = exports.TEST_CASE_NODES = ex
|
|
|
11
11
|
* tc.rerun-stale changed after the recorded run (run manifest) do run-test --change-only
|
|
12
12
|
* tc.triage red, not classified by a current triage do sungen triage
|
|
13
13
|
* tc.product-candidate triage found a product-defect candidate decide sungen defect draft
|
|
14
|
+
* tc.rerun-environment a red the environment caused (#928) decide run-test --ids, once a human confirms it is up
|
|
15
|
+
* tc.fix-test a red the test caused (#928) do run-test --ids (auto-fix)
|
|
16
|
+
* The class is `sungen triage`'s, or a manual classification in force (`sungen triage --case --as`).
|
|
14
17
|
* They sit after unit.run (which cuts a unit that never ran) and before delivery. tc.triage takes
|
|
15
18
|
* the reds the cases account for; unit.triage keeps the rest (unattributedReds), so a red no case
|
|
16
19
|
* explains — an @cases row, a renamed scenario, a nested describe title — still gets a triage step.
|
|
@@ -24,6 +27,8 @@ exports.listed = listed;
|
|
|
24
27
|
const idsArg = (cases) => (cases.length <= MAX_IDS && cases.every((c) => !c.unstableId) ? ` --ids ${cases.map((c) => c.id).join(',')}` : '');
|
|
25
28
|
exports.idsArg = idsArg;
|
|
26
29
|
const flag = (s) => (s.kind === 'api' ? '--api' : '--screen');
|
|
30
|
+
/** Up to three cases with the triage rule that judged each. */
|
|
31
|
+
const withRule = (cases) => `${cases.slice(0, 3).map((c) => `${c.id}: ${c.triage?.ruleId}`).join('; ')}${cases.length > 3 ? '; …' : ''}`;
|
|
27
32
|
function caseNode(id, need, rank, title, actor, step, produces) {
|
|
28
33
|
return {
|
|
29
34
|
id, title, actor, granularity: 'test-case', appliesTo: node_decl_1.ALL_KINDS, requires: ['unit.run'], blocking: false, rank,
|
|
@@ -48,7 +53,7 @@ exports.TEST_CASE_NODES = [
|
|
|
48
53
|
return {
|
|
49
54
|
kind: 'do',
|
|
50
55
|
command: `sungen triage ${flag(s)} ${s.unit}`,
|
|
51
|
-
because: `${cases.length} test case(s) failed in the latest run and are not classified yet${left ? ` (${left} left unclassified by the last triage — read its evidence and classify by hand)` : ''} — classify each (known defect, test defect, environment, product candidate) before exporting or extending: an unexplained red in the deliverable is a finding nobody has judged`,
|
|
56
|
+
because: `${cases.length} test case(s) failed in the latest run and are not classified yet${left ? ` (${left} left unclassified by the last triage — read its evidence and classify by hand: \`sungen triage ${flag(s)} ${s.unit} --case <id> --as product|test-defect|environment --reason "…"\`; test-defect and environment are a human's call, on a terminal)` : ''} — classify each (known defect, test defect, environment, product candidate) before exporting or extending: an unexplained red in the deliverable is a finding nobody has judged`,
|
|
52
57
|
};
|
|
53
58
|
}, ['.sungen/triage/<unit>.json']),
|
|
54
59
|
caseNode('tc.product-candidate', 'product-candidate', 134, 'Decide on the product-defect candidates', 'human', (s, cases, single) => ({
|
|
@@ -56,6 +61,18 @@ exports.TEST_CASE_NODES = [
|
|
|
56
61
|
command: `sungen defect draft ${flag(s)} ${s.unit}${single ? ` --scenario ${cases[0].id}` : ''}`,
|
|
57
62
|
because: `${cases.length} red test case(s) look like a product defect (${(0, exports.listed)(cases)}) — the app answered and the answer differs from the oracle. A QA decides whether it is a defect to record; an agent presents it and does not draft it on its own`,
|
|
58
63
|
}), ['qa/defects/DEF-<n>-<slug>.md']),
|
|
64
|
+
// decide, not do: an agent re-running into an environment that is still down gets the same red and
|
|
65
|
+
// the same step again — a loop with no stop. A human confirms the environment first (#928 review W3).
|
|
66
|
+
caseNode('tc.rerun-environment', 'rerun-environment', 139, 'Re-run the cases the environment failed, once it is up', 'human', (s, cases) => ({
|
|
67
|
+
kind: 'decide',
|
|
68
|
+
command: `/sungen:run-test ${s.unit}${(0, exports.idsArg)(cases)}`,
|
|
69
|
+
because: `${cases.length} red test case(s) failed on the environment, not the app (${withRule(cases)}) — the run never reached a usable app, so their results say nothing about it yet. A human confirms the app, base URL, network, auth state or device is up, then they are re-run; an agent presents this and does not re-run on its own — into an environment that is still down, the same red comes back`,
|
|
70
|
+
}), ['specs/generated/<unit>/<unit>-test-result.json']),
|
|
71
|
+
caseNode('tc.fix-test', 'fix-test', 139.5, 'Fix the tests triaged as test defects', 'ai', (s, cases) => ({
|
|
72
|
+
kind: 'do',
|
|
73
|
+
command: `/sungen:run-test ${s.unit}${(0, exports.idsArg)(cases)}`,
|
|
74
|
+
because: `${cases.length} red test case(s) are test defects (${withRule(cases)}) — the test, not the app, failed: fix its selector, test data or step (run-test's auto-fix reads the triage evidence), then re-run them; never weaken an assertion to make one pass`,
|
|
75
|
+
}), ['selectors/<unit>.yaml', 'specs/generated/<unit>/<unit>-test-result.json']),
|
|
59
76
|
];
|
|
60
77
|
/** Red final attempts the test cases account for (a case read without the count stands for one). */
|
|
61
78
|
const attributedReds = (s) => (s.testCases ?? []).reduce((n, tc) => n + (tc.failedResults ?? (tc.result === 'failed' ? 1 : 0)), 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-case-nodes.js","sourceRoot":"","sources":["../../../src/graph/nodes/test-case-nodes.ts"],"names":[],"mappings":";;;AAAA
|
|
1
|
+
{"version":3,"file":"test-case-nodes.js","sourceRoot":"","sources":["../../../src/graph/nodes/test-case-nodes.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ export interface CaseOutcome {
|
|
|
6
6
|
resultFiles: string[];
|
|
7
7
|
stale?: string;
|
|
8
8
|
triage?: TestCaseState['triage'];
|
|
9
|
+
evidence?: string;
|
|
9
10
|
}
|
|
10
11
|
export declare function caseOutcomes(projectRoot: string, unitDir: string, unit: string, unitId: string, cases: FeatureCase[]): CaseOutcome[];
|
|
11
12
|
//# sourceMappingURL=test-case-results.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-case-results.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-results.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"test-case-results.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-results.ts"],"names":[],"mappings":"AAwBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAO7E,MAAM,WAAW,WAAW;IAAG,MAAM,EAAE,cAAc,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,aAAa,CAAC,QAAQ,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE;AAgD1K,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE,CA8BpI"}
|
|
@@ -43,13 +43,19 @@ exports.caseOutcomes = caseOutcomes;
|
|
|
43
43
|
* stale the run manifest (`sungen changed`) selects the scenario: its steps/tags, a selector or a
|
|
44
44
|
* test-data key it uses, or a project input changed since the recorded run
|
|
45
45
|
* triage the rows of `.sungen/triage/<unit>.json` for the case, only when that triage is not
|
|
46
|
-
* older than the case's result files (a re-run voids it)
|
|
46
|
+
* older than the case's result files (a re-run voids it) — unless a manual classification
|
|
47
|
+
* in force judged this very red (manual-triage-decisions.ts, #928): that one wins
|
|
48
|
+
* evidence a red case's hash of its red final attempts (file, title, status, start, duration,
|
|
49
|
+
* messages): what a manual classification is bound to
|
|
47
50
|
*/
|
|
51
|
+
const crypto_1 = require("crypto");
|
|
48
52
|
const fs = __importStar(require("fs"));
|
|
49
53
|
const path = __importStar(require("path"));
|
|
54
|
+
const decision_identity_1 = require("../decisions/decision-identity");
|
|
50
55
|
const playwright_report_parser_1 = require("../exporters/playwright-report-parser");
|
|
51
56
|
const run_manifest_1 = require("../harness/run-manifest");
|
|
52
57
|
const triage_unit_1 = require("../harness/triage-unit");
|
|
58
|
+
const manual_triage_decisions_1 = require("./manual-triage-decisions");
|
|
53
59
|
const unit_artifact_probes_1 = require("./unit-artifact-probes");
|
|
54
60
|
const RED = new Set(['failed', 'timedOut', 'interrupted']);
|
|
55
61
|
/** The class a case shows when its rows disagree: what needs a human first. */
|
|
@@ -104,19 +110,32 @@ function triageRows(projectRoot, unitId) {
|
|
|
104
110
|
? report.rows.filter((r) => r && typeof r.scenario === 'string' && TRIAGE_PRECEDENCE.includes(r.class)) : [];
|
|
105
111
|
return { at: report && typeof report.generatedAt === 'string' ? Date.parse(report.generatedAt) : NaN, rows };
|
|
106
112
|
}
|
|
113
|
+
/** The red final attempts of one case, hashed: the same red reads the same; a re-run (new start, duration) does not. */
|
|
114
|
+
function redEvidence(projectRoot, reds) {
|
|
115
|
+
const rows = reds.map(({ file, key, r }) => ({
|
|
116
|
+
file: path.relative(projectRoot, file).split(path.sep).join('/'), key, status: r.status,
|
|
117
|
+
startTime: r.startTime ?? null, duration: r.duration ?? null, messages: r.errorMessages ?? (r.error ? [r.error] : []),
|
|
118
|
+
})).sort((a, b) => (`${a.file}\n${a.key}` < `${b.file}\n${b.key}` ? -1 : 1));
|
|
119
|
+
return (0, crypto_1.createHash)('sha256').update((0, decision_identity_1.canonicalJson)(rows)).digest('hex');
|
|
120
|
+
}
|
|
107
121
|
function caseOutcomes(projectRoot, unitDir, unit, unitId, cases) {
|
|
108
122
|
const byFeature = resultsByFeature(projectRoot, unit, unitId);
|
|
109
123
|
const stale = staleReasons(projectRoot, unitDir, unit);
|
|
110
124
|
const triage = triageRows(projectRoot, unitId);
|
|
125
|
+
const manual = (0, manual_triage_decisions_1.manualClassifications)(projectRoot, unitDir);
|
|
111
126
|
return cases.map((c) => {
|
|
112
127
|
const statuses = [];
|
|
113
128
|
const files = [];
|
|
129
|
+
const reds = [];
|
|
114
130
|
for (const { file, report } of byFeature.get(c.featureBase) ?? []) {
|
|
115
|
-
const mine = [...report.entries()].filter(([key]) => ownsTitle(key, c.title))
|
|
131
|
+
const mine = [...report.entries()].filter(([key]) => ownsTitle(key, c.title));
|
|
116
132
|
if (mine.length) {
|
|
117
|
-
statuses.push(...mine);
|
|
133
|
+
statuses.push(...mine.map(([, r]) => r.status));
|
|
118
134
|
files.push(file);
|
|
119
135
|
}
|
|
136
|
+
for (const [key, r] of mine)
|
|
137
|
+
if (RED.has(r.status))
|
|
138
|
+
reds.push({ file, key, r });
|
|
120
139
|
}
|
|
121
140
|
const result = statuses.some((s) => RED.has(s)) ? 'failed'
|
|
122
141
|
: statuses.includes('passed') ? 'passed' : statuses.includes('skipped') ? 'skipped' : 'never-run';
|
|
@@ -126,11 +145,16 @@ function caseOutcomes(projectRoot, unitDir, unit, unitId, cases) {
|
|
|
126
145
|
};
|
|
127
146
|
if (result !== 'never-run' && stale[c.title])
|
|
128
147
|
out.stale = stale[c.title];
|
|
148
|
+
if (result === 'failed')
|
|
149
|
+
out.evidence = redEvidence(projectRoot, reds);
|
|
129
150
|
const current = !Number.isNaN(triage.at) && files.every((f) => mtime(f) <= triage.at);
|
|
130
151
|
const rows = current ? triage.rows.filter((r) => rowOwns(r.scenario, c.title)) : [];
|
|
131
152
|
const worst = TRIAGE_PRECEDENCE.find((cls) => rows.some((r) => r.class === cls));
|
|
132
153
|
if (worst)
|
|
133
154
|
out.triage = { class: worst, ruleId: rows.find((r) => r.class === worst).ruleId };
|
|
155
|
+
const byHand = (0, manual_triage_decisions_1.manualClassificationFor)(manual, c.id, out.evidence);
|
|
156
|
+
if (byHand)
|
|
157
|
+
out.triage = { class: byHand.class, ruleId: 'manual', decision: byHand.decision };
|
|
134
158
|
return out;
|
|
135
159
|
});
|
|
136
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-case-results.js","sourceRoot":"","sources":["../../src/graph/test-case-results.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"test-case-results.js","sourceRoot":"","sources":["../../src/graph/test-case-results.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,13 +8,14 @@
|
|
|
8
8
|
* trigger — what the case needs otherwise, first match wins:
|
|
9
9
|
* never run → run · result older than the scenario (run manifest) → rerun-stale ·
|
|
10
10
|
* red with no current triage, or left `unclassified` by it → triage (a classification
|
|
11
|
-
* is still owed) · triaged product-candidate → a QA decision
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* is still owed) · triaged product-candidate → a QA decision · triaged environment →
|
|
12
|
+
* rerun-environment (once it is up) · triaged test-defect → fix-test (#928)
|
|
13
|
+
* A pass — Pass (Mocked) included — needs nothing. The class may be `sungen triage`'s or a manual
|
|
14
|
+
* classification in force (manual-triage-decisions.ts); test-case-results.ts decides which.
|
|
14
15
|
*/
|
|
15
16
|
import type { TestCaseState } from './test-case-state-shape';
|
|
16
17
|
export type TestCaseExemption = 'manual' | 'requires' | 'known-defect' | 'deferred' | 'blocked-capability';
|
|
17
|
-
export type TestCaseNeed = 'run' | 'rerun-stale' | 'triage' | 'product-candidate';
|
|
18
|
+
export type TestCaseNeed = 'run' | 'rerun-stale' | 'triage' | 'product-candidate' | 'rerun-environment' | 'fix-test';
|
|
18
19
|
/** Why the case is satisfied regardless of its result, or null when it is not exempt. */
|
|
19
20
|
export declare function exemptionOf(tc: TestCaseState): TestCaseExemption | null;
|
|
20
21
|
/** What the case would need if it were not exempt. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-case-satisfied.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-satisfied.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"test-case-satisfied.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-satisfied.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,UAAU,GAAG,oBAAoB,CAAC;AAC3G,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,aAAa,GAAG,QAAQ,GAAG,mBAAmB,GAAG,mBAAmB,GAAG,UAAU,CAAC;AAIrH,yFAAyF;AACzF,wBAAgB,WAAW,CAAC,EAAE,EAAE,aAAa,GAAG,iBAAiB,GAAG,IAAI,CAOvE;AAED,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,EAAE,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAUhE;AAED,wBAAgB,YAAY,CAAC,EAAE,EAAE,aAAa,GAAG,YAAY,GAAG,IAAI,CAEnE;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,aAAa,GAAG,MAAM,CAO7D"}
|
|
@@ -30,6 +30,10 @@ function triggerOf(tc) {
|
|
|
30
30
|
return 'triage';
|
|
31
31
|
if (tc.triage.class === 'product-candidate')
|
|
32
32
|
return 'product-candidate';
|
|
33
|
+
if (tc.triage.class === 'environment')
|
|
34
|
+
return 'rerun-environment';
|
|
35
|
+
if (tc.triage.class === 'test-defect')
|
|
36
|
+
return 'fix-test';
|
|
33
37
|
}
|
|
34
38
|
return null;
|
|
35
39
|
}
|