@sun-asterisk/sungen 3.3.0-alpha.5 → 3.3.0-alpha.7
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/contract-derive-command.d.ts.map +1 -1
- package/dist/cli/commands/contract-derive-command.js +2 -0
- package/dist/cli/commands/contract-derive-command.js.map +1 -1
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +21 -3
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +3 -1
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/next.d.ts +5 -2
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +14 -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/cli/commands/update.d.ts.map +1 -1
- package/dist/cli/commands/update.js +6 -2
- package/dist/cli/commands/update.js.map +1 -1
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/json-error-on-exit.d.ts +34 -0
- package/dist/cli/json-error-on-exit.d.ts.map +1 -0
- package/dist/cli/json-error-on-exit.js +63 -0
- package/dist/cli/json-error-on-exit.js.map +1 -0
- package/dist/cli/waiting-for-you-block.d.ts +15 -0
- package/dist/cli/waiting-for-you-block.d.ts.map +1 -0
- package/dist/cli/waiting-for-you-block.js +19 -0
- package/dist/cli/waiting-for-you-block.js.map +1 -0
- package/dist/contract/derive-free-feature.d.ts +2 -0
- package/dist/contract/derive-free-feature.d.ts.map +1 -1
- package/dist/contract/derive-free-feature.js +22 -0
- package/dist/contract/derive-free-feature.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/decisions/legacy-waiver-migration.d.ts +2 -0
- package/dist/decisions/legacy-waiver-migration.d.ts.map +1 -1
- package/dist/decisions/legacy-waiver-migration.js +5 -2
- package/dist/decisions/legacy-waiver-migration.js.map +1 -1
- package/dist/graph/board-human-actions.d.ts +5 -0
- package/dist/graph/board-human-actions.d.ts.map +1 -0
- package/dist/graph/board-human-actions.js +83 -0
- package/dist/graph/board-human-actions.js.map +1 -0
- package/dist/graph/evaluate-graph.d.ts +16 -0
- package/dist/graph/evaluate-graph.d.ts.map +1 -1
- package/dist/graph/evaluate-graph.js +29 -6
- package/dist/graph/evaluate-graph.js.map +1 -1
- package/dist/graph/human-action.d.ts +21 -0
- package/dist/graph/human-action.d.ts.map +1 -0
- package/dist/graph/human-action.js +3 -0
- package/dist/graph/human-action.js.map +1 -0
- 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/node-decl.d.ts +9 -0
- package/dist/graph/node-decl.d.ts.map +1 -1
- package/dist/graph/node-decl.js +4 -1
- package/dist/graph/node-decl.js.map +1 -1
- package/dist/graph/nodes/test-case-contract-nodes.d.ts.map +1 -1
- package/dist/graph/nodes/test-case-contract-nodes.js +16 -3
- package/dist/graph/nodes/test-case-contract-nodes.js.map +1 -1
- 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 +33 -4
- package/dist/graph/nodes/test-case-nodes.js.map +1 -1
- package/dist/graph/nodes/unit-audit-nodes.d.ts.map +1 -1
- package/dist/graph/nodes/unit-audit-nodes.js +1 -0
- package/dist/graph/nodes/unit-audit-nodes.js.map +1 -1
- package/dist/graph/nodes/unit-contract-node.d.ts.map +1 -1
- package/dist/graph/nodes/unit-contract-node.js +8 -0
- package/dist/graph/nodes/unit-contract-node.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/catalog/gate-rules.yaml +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 +37 -4
- 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 +21 -1
- package/dist/harness/gates/in-run-decision-check.js.map +1 -1
- package/dist/harness/journey.d.ts +21 -0
- package/dist/harness/journey.d.ts.map +1 -1
- package/dist/harness/journey.js +61 -11
- package/dist/harness/journey.js.map +1 -1
- package/dist/harness/next-step.d.ts +17 -0
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +19 -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 +3 -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/dist/hooks/hand-back-core.d.ts +1 -1
- package/dist/hooks/hand-back-core.d.ts.map +1 -1
- package/dist/hooks/hand-back-core.js +4 -2
- package/dist/hooks/hand-back-core.js.map +1 -1
- package/dist/hooks/session-start-unit-state-hook.d.ts +2 -1
- package/dist/hooks/session-start-unit-state-hook.d.ts.map +1 -1
- package/dist/hooks/session-start-unit-state-hook.js +4 -1
- package/dist/hooks/session-start-unit-state-hook.js.map +1 -1
- package/dist/hooks/stop-next-step-hook.d.ts.map +1 -1
- package/dist/hooks/stop-next-step-hook.js +1 -0
- package/dist/hooks/stop-next-step-hook.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/delivery.md +2 -0
- package/dist/orchestrator/templates/ai-src/commands/review.md +2 -0
- package/dist/orchestrator/templates/ai-src/partials/waiting-for-you.claude.md +11 -0
- package/dist/orchestrator/templates/ai-src/partials/waiting-for-you.codex.md +11 -0
- package/dist/orchestrator/templates/ai-src/partials/waiting-for-you.copilot.md +11 -0
- package/package.json +3 -3
- package/src/cli/commands/contract-derive-command.ts +1 -0
- package/src/cli/commands/delivery.ts +20 -3
- package/src/cli/commands/generate.ts +3 -1
- package/src/cli/commands/next.ts +14 -3
- package/src/cli/commands/triage.ts +38 -2
- package/src/cli/commands/update.ts +6 -2
- package/src/cli/index.ts +4 -0
- package/src/cli/json-error-on-exit.ts +72 -0
- package/src/cli/waiting-for-you-block.ts +23 -0
- package/src/contract/derive-free-feature.ts +21 -0
- package/src/decisions/decision-schema.ts +2 -1
- package/src/decisions/legacy-waiver-migration.ts +5 -1
- package/src/graph/board-human-actions.ts +80 -0
- package/src/graph/evaluate-graph.ts +37 -8
- package/src/graph/human-action.ts +33 -0
- package/src/graph/manual-triage-decisions.ts +55 -0
- package/src/graph/node-decl.ts +11 -0
- package/src/graph/nodes/test-case-contract-nodes.ts +20 -4
- package/src/graph/nodes/test-case-nodes.ts +37 -5
- package/src/graph/nodes/unit-audit-nodes.ts +2 -1
- package/src/graph/nodes/unit-contract-node.ts +12 -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/catalog/gate-rules.yaml +1 -1
- 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 +37 -5
- package/src/harness/gates/in-run-decision-check.ts +22 -1
- package/src/harness/journey.ts +79 -8
- package/src/harness/next-step.ts +31 -1
- 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 +6 -3
- package/src/hooks/hand-back-core.ts +4 -2
- package/src/hooks/session-start-unit-state-hook.ts +4 -1
- package/src/hooks/stop-next-step-hook.ts +1 -0
- package/src/orchestrator/templates/ai-src/commands/delivery.md +2 -0
- package/src/orchestrator/templates/ai-src/commands/review.md +2 -0
- package/src/orchestrator/templates/ai-src/partials/waiting-for-you.claude.md +11 -0
- package/src/orchestrator/templates/ai-src/partials/waiting-for-you.codex.md +11 -0
- package/src/orchestrator/templates/ai-src/partials/waiting-for-you.copilot.md +11 -0
|
@@ -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
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-case-satisfied.js","sourceRoot":"","sources":["../../src/graph/test-case-satisfied.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"test-case-satisfied.js","sourceRoot":"","sources":["../../src/graph/test-case-satisfied.ts"],"names":[],"mappings":";;AAuBA,kCAOC;AAGD,8BAUC;AAED,oCAEC;AAGD,kDAOC;AArCD,MAAM,MAAM,GAAG,CAAC,EAAiB,EAAE,GAAW,EAAW,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC;AAEtH,yFAAyF;AACzF,SAAgB,WAAW,CAAC,EAAiB;IAC3C,IAAI,MAAM,CAAC,EAAE,EAAE,SAAS,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3C,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACvE,IAAI,MAAM,CAAC,EAAE,EAAE,eAAe,CAAC;QAAE,OAAO,cAAc,CAAC;IACvD,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,UAAU,CAAC;IACxE,IAAI,EAAE,CAAC,MAAM,EAAE,KAAK,KAAK,oBAAoB;QAAE,OAAO,oBAAoB,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sDAAsD;AACtD,SAAgB,SAAS,CAAC,EAAiB;IACzC,IAAI,EAAE,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,EAAE,CAAC,KAAK;QAAE,OAAO,aAAa,CAAC;IACnC,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,cAAc;YAAE,OAAO,QAAQ,CAAC;QACtE,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,mBAAmB;YAAE,OAAO,mBAAmB,CAAC;QACxE,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,aAAa;YAAE,OAAO,mBAAmB,CAAC;QAClE,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,KAAK,aAAa;YAAE,OAAO,UAAU,CAAC;IAC3D,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAgB,YAAY,CAAC,EAAiB;IAC5C,OAAO,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,SAAgB,mBAAmB,CAAC,EAAiB;IACnD,MAAM,MAAM,GAAG,WAAW,CAAC,EAAE,CAAC,CAAC;IAC/B,IAAI,MAAM;QAAE,OAAO,cAAc,MAAM,GAAG,CAAC;IAC3C,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;IAC3B,IAAI,IAAI;QAAE,OAAO,SAAS,IAAI,EAAE,CAAC;IACjC,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ;QAAE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B,CAAC,CAAC,CAAC,oBAAoB,CAAC;IAClG,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC,MAAM,GAAG,CAAC;AAC3F,CAAC"}
|
|
@@ -50,11 +50,17 @@ export interface TestCaseState {
|
|
|
50
50
|
resultFiles: string[];
|
|
51
51
|
/** Set when the scenario changed after the run that produced its result (run manifest). */
|
|
52
52
|
stale?: string;
|
|
53
|
-
/**
|
|
53
|
+
/**
|
|
54
|
+
* The class of a red case: a manual classification in force (`ruleId: 'manual'` and its decision id,
|
|
55
|
+
* #928), else the current `sungen triage` row — absent when neither has judged this result.
|
|
56
|
+
*/
|
|
54
57
|
triage?: {
|
|
55
58
|
class: TriageClass;
|
|
56
59
|
ruleId: string;
|
|
60
|
+
decision?: string;
|
|
57
61
|
};
|
|
62
|
+
/** Hash of the red final attempts the case accounts for (failed only) — a manual classification is bound to it; a re-run changes it. */
|
|
63
|
+
evidence?: string;
|
|
58
64
|
/** Spec anchors the case was generated from (manifest), and whether they moved since. */
|
|
59
65
|
anchors: Array<{
|
|
60
66
|
anchor: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-case-state-shape.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-state-shape.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,2FAA2F;AAC3F,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAErE,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE3E,4GAA4G;AAC5G,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uFAAuF;IACvF,MAAM,EAAE,cAAc,CAAC;IACvB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf
|
|
1
|
+
{"version":3,"file":"test-case-state-shape.d.ts","sourceRoot":"","sources":["../../src/graph/test-case-state-shape.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,2FAA2F;AAC3F,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,UAAU,GAAG,WAAW,CAAC;AAErE,mGAAmG;AACnG,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kGAAkG;IAClG,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE;QAAE,KAAK,EAAE,eAAe,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,WAAW,CAAC;AAE3E,4GAA4G;AAC5G,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,iDAAiD;IACjD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,4GAA4G;IAC5G,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,wFAAwF;IACxF,WAAW,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,6FAA6F;IAC7F,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,IAAI,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,6EAA6E;IAC7E,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxB,iCAAiC;IACjC,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,uFAAuF;IACvF,MAAM,EAAE,cAAc,CAAC;IACvB,iGAAiG;IACjG,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mFAAmF;IACnF,MAAM,EAAE,OAAO,CAAC;IAChB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,2FAA2F;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,MAAM,CAAC,EAAE;QAAE,KAAK,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACnE,wIAAwI;IACxI,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yFAAyF;IACzF,OAAO,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAA;KAAE,CAAC,CAAC;IACzF,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,kHAAkH;IAClH,QAAQ,CAAC,EAAE,gBAAgB,CAAC;CAC7B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface ResultsFreshness {
|
|
2
|
+
files: Array<{
|
|
3
|
+
file: string;
|
|
4
|
+
runAt: string;
|
|
5
|
+
source: 'run' | 'file';
|
|
6
|
+
}>;
|
|
7
|
+
/** The oldest result file's run — what the counts are at least as old as. */
|
|
8
|
+
oldestRunAt: string;
|
|
9
|
+
newestRunAt: string;
|
|
10
|
+
/** How the oldest run is dated: Playwright's run start, or (none recorded) the file's change time. */
|
|
11
|
+
runAtSource: 'run' | 'file';
|
|
12
|
+
/** Inputs changed after the results they feed were recorded. */
|
|
13
|
+
newerInputs: Array<{
|
|
14
|
+
file: string;
|
|
15
|
+
changedAt: string;
|
|
16
|
+
source: 'commit' | 'file';
|
|
17
|
+
}>;
|
|
18
|
+
/** SUNGEN_ENV, when no result file is for it. */
|
|
19
|
+
missingEnv?: string;
|
|
20
|
+
/** One line: what makes these results untrustworthy — absent when nothing does. */
|
|
21
|
+
warning?: string;
|
|
22
|
+
}
|
|
23
|
+
/** The unit's results, dated, and what they are older than — undefined when the unit has none. */
|
|
24
|
+
export declare function resultsFreshness(projectRoot: string, unitDir: string, unit: string, env?: string | undefined): ResultsFreshness | undefined;
|
|
25
|
+
/** `2026-08-21 03:42Z` */
|
|
26
|
+
export declare const shortDate: (isoTime: string) => string;
|
|
27
|
+
/** `run 2026-08-21 03:42Z (65 days ago)` — the oldest run, and the newest when they are days apart. */
|
|
28
|
+
export declare function describeResultsRun(f: ResultsFreshness, now?: number): string;
|
|
29
|
+
//# sourceMappingURL=unit-results-freshness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-results-freshness.d.ts","sourceRoot":"","sources":["../../src/graph/unit-results-freshness.ts"],"names":[],"mappings":"AAyBA,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,KAAK,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IACtE,6EAA6E;IAC7E,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,sGAAsG;IACtG,WAAW,EAAE,KAAK,GAAG,MAAM,CAAC;IAC5B,gEAAgE;IAChE,WAAW,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,QAAQ,GAAG,MAAM,CAAA;KAAE,CAAC,CAAC;IACnF,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mFAAmF;IACnF,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAoED,kGAAkG;AAClG,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAE,MAAM,GAAG,SAAkC,GAAG,gBAAgB,GAAG,SAAS,CA0CnK;AAED,0BAA0B;AAC1B,eAAO,MAAM,SAAS,GAAI,SAAS,MAAM,KAAG,MAAsD,CAAC;AAEnG,uGAAuG;AACvG,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,gBAAgB,EAAE,GAAG,SAAa,GAAG,MAAM,CAShF"}
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.shortDate = void 0;
|
|
37
|
+
exports.resultsFreshness = resultsFreshness;
|
|
38
|
+
exports.describeResultsRun = describeResultsRun;
|
|
39
|
+
/**
|
|
40
|
+
* Which run a unit's results come from, and whether they still describe the suite (#942) — so `next`
|
|
41
|
+
* and the delivery checklist never read a months-old results JSON in silence. Read-only, like the rest
|
|
42
|
+
* of the graph's facts.
|
|
43
|
+
*
|
|
44
|
+
* run each result file's run start, as Playwright records it (`stats.startTime`); a file
|
|
45
|
+
* without one is dated by its own change time, and says so
|
|
46
|
+
* older an input changed after the results it feeds were recorded:
|
|
47
|
+
* per feature its `.feature` and compiled `<base>.spec.ts` ↔ its `<base>-test-result*.json`
|
|
48
|
+
* unit-wide requirements/spec.md ↔ the oldest result file
|
|
49
|
+
* Not contracts.lock.yaml: approving the contract after a run is the normal order, and it
|
|
50
|
+
* changes no test — the contract check judges the lock, not the results.
|
|
51
|
+
* A file's "change time" is its last commit when git tracks it unchanged, else its file
|
|
52
|
+
* time. Results are "recorded" at the later of their run start and their own change time.
|
|
53
|
+
* So a fresh checkout (every file the checkout's time) and results committed in the same
|
|
54
|
+
* commit as the edit they ran against read fresh; an edit, or a commit, after them does not.
|
|
55
|
+
* env SUNGEN_ENV names an env no result file is for: readers fall back to another env's results
|
|
56
|
+
* Advisory: it states what it sees and warns; it decides no step and changes no exit code.
|
|
57
|
+
*/
|
|
58
|
+
const child_process_1 = require("child_process");
|
|
59
|
+
const fs = __importStar(require("fs"));
|
|
60
|
+
const path = __importStar(require("path"));
|
|
61
|
+
const unit_paths_1 = require("../harness/unit-paths");
|
|
62
|
+
const unit_artifact_probes_1 = require("./unit-artifact-probes");
|
|
63
|
+
/** `next` also runs inside the Claude Code hooks (10 s budget, the contract's git calls included): a slow git dates by file time instead. */
|
|
64
|
+
const GIT_TIMEOUT_MS = 2000;
|
|
65
|
+
/** Commit times have one-second resolution: an edit and its results in one commit tie. */
|
|
66
|
+
const TIE_MS = 1000;
|
|
67
|
+
const posix = (p) => p.split(path.sep).join('/');
|
|
68
|
+
const real = (p) => { try {
|
|
69
|
+
return fs.realpathSync(p);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return path.resolve(p);
|
|
73
|
+
} };
|
|
74
|
+
const iso = (ms) => new Date(ms).toISOString();
|
|
75
|
+
/** project root → its git work tree (null outside one), asked once per process: `next` reads every unit. */
|
|
76
|
+
const workTrees = new Map();
|
|
77
|
+
function git(cwd, args) {
|
|
78
|
+
try {
|
|
79
|
+
return (0, child_process_1.execFileSync)('git', args, { cwd, stdio: ['ignore', 'pipe', 'ignore'], timeout: GIT_TIMEOUT_MS, maxBuffer: 16 * 1024 * 1024 }).toString('utf8');
|
|
80
|
+
}
|
|
81
|
+
catch {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* When each file last changed: its last commit when git tracks it and it is unchanged, else its file
|
|
87
|
+
* time (no git, uncommitted, untracked, ignored, or git failed). Two git calls for the whole set.
|
|
88
|
+
*/
|
|
89
|
+
function changeTimes(projectRoot, files) {
|
|
90
|
+
const mtime = (abs) => { try {
|
|
91
|
+
return { ms: fs.statSync(abs).mtimeMs, source: 'file' };
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return null;
|
|
95
|
+
} };
|
|
96
|
+
if (!workTrees.has(projectRoot))
|
|
97
|
+
workTrees.set(projectRoot, git(projectRoot, ['rev-parse', '--show-toplevel'])?.trim() || null);
|
|
98
|
+
const top = workTrees.get(projectRoot);
|
|
99
|
+
if (!top)
|
|
100
|
+
return mtime;
|
|
101
|
+
const topReal = real(top);
|
|
102
|
+
const rels = files.map((f) => posix(path.relative(topReal, real(f)))).filter((r) => r && !r.startsWith('..'));
|
|
103
|
+
if (!rels.length)
|
|
104
|
+
return mtime;
|
|
105
|
+
const status = git(topReal, ['status', '--porcelain=v1', '-z', '--untracked-files=all', '--', ...rels]);
|
|
106
|
+
const log = git(topReal, ['log', '-n', '500', '--format=%x01%ct', '--name-only', '--', ...rels]);
|
|
107
|
+
if (status === null || log === null)
|
|
108
|
+
return mtime;
|
|
109
|
+
const dirty = new Set();
|
|
110
|
+
const entries = status.split('\0');
|
|
111
|
+
for (let i = 0; i < entries.length; i++) {
|
|
112
|
+
const e = entries[i];
|
|
113
|
+
if (e.length < 4)
|
|
114
|
+
continue;
|
|
115
|
+
dirty.add(e.slice(3));
|
|
116
|
+
if (e[0] === 'R' || e[0] === 'C')
|
|
117
|
+
i++; // a rename/copy carries its source path next
|
|
118
|
+
}
|
|
119
|
+
const committed = new Map();
|
|
120
|
+
let at = 0;
|
|
121
|
+
for (const line of log.split('\n')) {
|
|
122
|
+
if (line.startsWith('\x01'))
|
|
123
|
+
at = Number(line.slice(1)) * 1000;
|
|
124
|
+
else if (line.trim() && at && !committed.has(line.trim()))
|
|
125
|
+
committed.set(line.trim(), at);
|
|
126
|
+
}
|
|
127
|
+
return (abs) => {
|
|
128
|
+
const rel = posix(path.relative(topReal, real(abs)));
|
|
129
|
+
const t = committed.get(rel);
|
|
130
|
+
return t !== undefined && !dirty.has(rel) && fs.existsSync(abs) ? { ms: t, source: 'commit' } : mtime(abs);
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function runStartOf(file) {
|
|
134
|
+
try {
|
|
135
|
+
const t = JSON.parse(fs.readFileSync(file, 'utf8'))?.stats?.startTime;
|
|
136
|
+
const ms = typeof t === 'string' ? Date.parse(t) : NaN;
|
|
137
|
+
return Number.isNaN(ms) ? null : ms;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/** Every result file of the unit, in the directories its readers look in. */
|
|
144
|
+
function resultFilesOf(projectRoot, unitDir, unit) {
|
|
145
|
+
const dirs = [...new Set([...(0, unit_artifact_probes_1.generatedDirs)(projectRoot, unit), path.join(projectRoot, 'specs', 'generated', (0, unit_paths_1.catalogIdFromScreenDir)(unitDir))])];
|
|
146
|
+
return dirs.flatMap((d) => { try {
|
|
147
|
+
return fs.readdirSync(d).filter((f) => unit_artifact_probes_1.RESULT_FILE.test(f)).sort().map((f) => path.join(d, f));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return [];
|
|
151
|
+
} });
|
|
152
|
+
}
|
|
153
|
+
/** The unit's results, dated, and what they are older than — undefined when the unit has none. */
|
|
154
|
+
function resultsFreshness(projectRoot, unitDir, unit, env = process.env.SUNGEN_ENV) {
|
|
155
|
+
const results = resultFilesOf(projectRoot, unitDir, unit);
|
|
156
|
+
if (!results.length)
|
|
157
|
+
return undefined;
|
|
158
|
+
const features = (0, unit_paths_1.featureFilesFor)(unitDir, unit).filter((f) => fs.existsSync(f));
|
|
159
|
+
const specsOf = (base) => [...new Set(results.map((r) => path.join(path.dirname(r), `${base}.spec.ts`)))].filter((f) => fs.existsSync(f));
|
|
160
|
+
const unitWide = [path.join(unitDir, 'requirements', 'spec.md')].filter((f) => fs.existsSync(f));
|
|
161
|
+
const baseOf = (f) => path.basename(f).replace(unit_artifact_probes_1.RESULT_FILE, '');
|
|
162
|
+
const bases = [...new Set(results.map(baseOf))];
|
|
163
|
+
const changed = changeTimes(projectRoot, [...results, ...features, ...bases.flatMap(specsOf), ...unitWide]);
|
|
164
|
+
const rel = (f) => posix(path.relative(projectRoot, f));
|
|
165
|
+
const dated = results.map((file) => {
|
|
166
|
+
const start = runStartOf(file);
|
|
167
|
+
const own = changed(file)?.ms ?? 0;
|
|
168
|
+
return { file, base: baseOf(file), runAt: start ?? own, source: (start !== null ? 'run' : 'file'), recordedAt: Math.max(start ?? 0, own) };
|
|
169
|
+
});
|
|
170
|
+
const oldest = dated.reduce((a, b) => (b.runAt < a.runAt ? b : a));
|
|
171
|
+
const newest = dated.reduce((a, b) => (b.runAt > a.runAt ? b : a));
|
|
172
|
+
const recordedFor = (files) => Math.min(...files.map((d) => d.recordedAt));
|
|
173
|
+
const newerInputs = [];
|
|
174
|
+
const judge = (input, recordedAt) => {
|
|
175
|
+
const c = changed(input);
|
|
176
|
+
if (c && c.ms > recordedAt + TIE_MS)
|
|
177
|
+
newerInputs.push({ file: rel(input), changedAt: iso(c.ms), source: c.source });
|
|
178
|
+
};
|
|
179
|
+
for (const base of bases) {
|
|
180
|
+
const feeds = recordedFor(dated.filter((d) => d.base === base));
|
|
181
|
+
for (const f of [...features.filter((x) => path.basename(x, '.feature') === base), ...specsOf(base)])
|
|
182
|
+
judge(f, feeds);
|
|
183
|
+
}
|
|
184
|
+
for (const f of unitWide)
|
|
185
|
+
judge(f, recordedFor(dated));
|
|
186
|
+
const variants = results.map((f) => path.basename(f).replace(/^.*-test-result\.?/, '').replace(/\.?json$/, ''));
|
|
187
|
+
const missingEnv = env && !variants.some((v) => v === env || v.endsWith(`.${env}`)) ? env : undefined;
|
|
188
|
+
const problems = [
|
|
189
|
+
...(newerInputs.length ? [`results are older than ${newerInputs.slice(0, 3).map((i) => `${i.file} (changed ${(0, exports.shortDate)(i.changedAt)})`).join(', ')}${newerInputs.length > 3 ? ', …' : ''} — re-run the tests before trusting the counts`] : []),
|
|
190
|
+
...(missingEnv ? [`no results for SUNGEN_ENV=${missingEnv} — readers fall back to ${rel(oldest.file)}`] : []),
|
|
191
|
+
];
|
|
192
|
+
return {
|
|
193
|
+
files: dated.map((d) => ({ file: rel(d.file), runAt: iso(d.runAt), source: d.source })),
|
|
194
|
+
oldestRunAt: iso(oldest.runAt), newestRunAt: iso(newest.runAt), runAtSource: oldest.source,
|
|
195
|
+
newerInputs, ...(missingEnv ? { missingEnv } : {}), ...(problems.length ? { warning: problems.join('; ') } : {}),
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/** `2026-08-21 03:42Z` */
|
|
199
|
+
const shortDate = (isoTime) => `${isoTime.slice(0, 16).replace('T', ' ')}Z`;
|
|
200
|
+
exports.shortDate = shortDate;
|
|
201
|
+
/** `run 2026-08-21 03:42Z (65 days ago)` — the oldest run, and the newest when they are days apart. */
|
|
202
|
+
function describeResultsRun(f, now = Date.now()) {
|
|
203
|
+
// A file neither the JSON nor the file system could date reads as epoch 0 — "20000 days ago" is noise.
|
|
204
|
+
if (!(Date.parse(f.oldestRunAt) > 0))
|
|
205
|
+
return 'run time unknown (no run start in the JSON, no file time)';
|
|
206
|
+
const days = Math.floor((now - Date.parse(f.oldestRunAt)) / 86400000);
|
|
207
|
+
const age = days <= 0 ? 'today' : days === 1 ? '1 day ago' : `${days} days ago`;
|
|
208
|
+
const span = Date.parse(f.newestRunAt) - Date.parse(f.oldestRunAt) >= 86400000 ? ` to ${(0, exports.shortDate)(f.newestRunAt)}` : '';
|
|
209
|
+
return f.runAtSource === 'run'
|
|
210
|
+
? `run ${(0, exports.shortDate)(f.oldestRunAt)} (${age})${span}`
|
|
211
|
+
: `file time ${(0, exports.shortDate)(f.oldestRunAt)} (${age}; the JSON records no run start)${span}`;
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=unit-results-freshness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unit-results-freshness.js","sourceRoot":"","sources":["../../src/graph/unit-results-freshness.ts"],"names":[],"mappings":"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"}
|
package/dist/harness/audit.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { ViewpointBaseline } from './viewpoint-baseline';
|
|
2
2
|
import { FlowQualityResult, InventoryResult } from './flow-contract';
|
|
3
|
+
import { catalogIdFromScreenDir } from './unit-paths';
|
|
3
4
|
import { ReusedScenarioId, GateResult, DepthResult, BalanceResult, DuplicateResult, TraceResult, ClaimProofResult, TaxonomyResult, AutomatableManualResult, FlowDepthResult, OracleStrengthResult } from './sensors';
|
|
4
5
|
import { IntentProfile } from './intent';
|
|
5
6
|
import { Provenance } from './provenance';
|
|
@@ -97,8 +98,8 @@ export interface AuditReport {
|
|
|
97
98
|
* project actually contain the spec this one says its requirements come from?".
|
|
98
99
|
*/
|
|
99
100
|
export declare function projectUnitDirs(projectRoot: string): string[];
|
|
100
|
-
/** The catalog-resolution id for a unit dir
|
|
101
|
-
export
|
|
101
|
+
/** The catalog-resolution id for a unit dir — lives in unit-paths.ts (the inputsHash reads it too); kept exported here. */
|
|
102
|
+
export { catalogIdFromScreenDir };
|
|
102
103
|
/**
|
|
103
104
|
* The capability that owns SCORING for a unit (AO-1): the first path segment of the unit id when it
|
|
104
105
|
* is a registered capability (`api/<area>` → `api`), else the default (UI) capability. Generic — a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"AAWA,OAAO,EAA0B,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACjF,OAAO,EAAgF,iBAAiB,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"audit.d.ts","sourceRoot":"","sources":["../../src/harness/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/harness/audit.js
CHANGED
|
@@ -33,8 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.catalogIdFromScreenDir = void 0;
|
|
36
37
|
exports.projectUnitDirs = projectUnitDirs;
|
|
37
|
-
exports.catalogIdFromScreenDir = catalogIdFromScreenDir;
|
|
38
38
|
exports.scoringCapabilityFor = scoringCapabilityFor;
|
|
39
39
|
exports.seniorBandedOverall = seniorBandedOverall;
|
|
40
40
|
exports.runAudit = runAudit;
|
|
@@ -52,6 +52,7 @@ const parse_1 = require("./parse");
|
|
|
52
52
|
const viewpoint_baseline_1 = require("./viewpoint-baseline");
|
|
53
53
|
const flow_contract_1 = require("./flow-contract");
|
|
54
54
|
const unit_paths_1 = require("./unit-paths");
|
|
55
|
+
Object.defineProperty(exports, "catalogIdFromScreenDir", { enumerable: true, get: function () { return unit_paths_1.catalogIdFromScreenDir; } });
|
|
55
56
|
const sensors_1 = require("./sensors");
|
|
56
57
|
const flow_check_1 = require("./flow-check");
|
|
57
58
|
const capability_plan_1 = require("./capability-plan");
|
|
@@ -88,20 +89,6 @@ function projectUnitDirs(projectRoot) {
|
|
|
88
89
|
}
|
|
89
90
|
return out;
|
|
90
91
|
}
|
|
91
|
-
/** The catalog-resolution id for a unit dir (relative to qa/): screen · flows/<flow> · api/<area> · api/flows/<flow>. */
|
|
92
|
-
function catalogIdFromScreenDir(screenDir) {
|
|
93
|
-
const parts = screenDir.split(path.sep);
|
|
94
|
-
const qa = parts.lastIndexOf('qa');
|
|
95
|
-
if (qa >= 0) {
|
|
96
|
-
if (parts[qa + 1] === 'api' && parts[qa + 2] === 'flows' && parts[qa + 3])
|
|
97
|
-
return `api/flows/${parts[qa + 3]}`;
|
|
98
|
-
if (parts[qa + 1] === 'api' && parts[qa + 2])
|
|
99
|
-
return `api/${parts[qa + 2]}`;
|
|
100
|
-
if (parts[qa + 1] === 'flows' && parts[qa + 2])
|
|
101
|
-
return `flows/${parts[qa + 2]}`;
|
|
102
|
-
}
|
|
103
|
-
return path.basename(screenDir);
|
|
104
|
-
}
|
|
105
92
|
/**
|
|
106
93
|
* The capability that owns SCORING for a unit (AO-1): the first path segment of the unit id when it
|
|
107
94
|
* is a registered capability (`api/<area>` → `api`), else the default (UI) capability. Generic — a
|
|
@@ -138,7 +125,7 @@ function runAudit(screenDir, screenName) {
|
|
|
138
125
|
// Catalog-resolution id (for the @api/@query gate sensors): the unit's path relative to qa/ —
|
|
139
126
|
// `flows/<flow>`, `api/<area>`, `api/flows/<flow>`, else the bare screen. A bare screen matches
|
|
140
127
|
// the old behaviour (so the audit-sample snapshot is unchanged); flows/api now resolve correctly.
|
|
141
|
-
const catalogScreenName = catalogIdFromScreenDir(screenDir);
|
|
128
|
+
const catalogScreenName = (0, unit_paths_1.catalogIdFromScreenDir)(screenDir);
|
|
142
129
|
// OES-11.2 — the unit's gate rules: the catalog plus the gate-overrides in force for it.
|
|
143
130
|
const gates = (0, audit_gate_verdict_1.auditGateContext)(screenDir);
|
|
144
131
|
const specPath = path.join(screenDir, 'requirements', 'spec.md');
|
|
@@ -198,7 +185,7 @@ function runAudit(screenDir, screenName) {
|
|
|
198
185
|
// gate gap, credit it to the flow instead of double-counting it as a screen gap. Screens only
|
|
199
186
|
// (a flow/api unit is not credited by sibling flows); mutates the gate before coverage is scored.
|
|
200
187
|
const flowCredits = [];
|
|
201
|
-
const isScreenUnit =
|
|
188
|
+
const isScreenUnit = (0, unit_paths_1.isScreenUnitId)(catalogScreenName);
|
|
202
189
|
if (isScreenUnit && gate.gaps.length) {
|
|
203
190
|
const flowScenarios = (0, flow_check_1.loadFlowScenarios)((0, intent_1.projectRootFromScreenDir)(screenDir));
|
|
204
191
|
if (flowScenarios.length) {
|