@sun-asterisk/sungen 3.3.0-alpha.7 → 3.3.0-alpha.9
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/case-triage-hint.d.ts +14 -0
- package/dist/cli/case-triage-hint.d.ts.map +1 -0
- package/dist/cli/case-triage-hint.js +23 -0
- package/dist/cli/case-triage-hint.js.map +1 -0
- package/dist/cli/commands/contract-derive-command.d.ts +2 -1
- package/dist/cli/commands/contract-derive-command.d.ts.map +1 -1
- package/dist/cli/commands/contract-derive-command.js +15 -3
- package/dist/cli/commands/contract-derive-command.js.map +1 -1
- package/dist/cli/commands/contract.d.ts.map +1 -1
- package/dist/cli/commands/contract.js +5 -2
- package/dist/cli/commands/contract.js.map +1 -1
- package/dist/cli/commands/delivery.d.ts.map +1 -1
- package/dist/cli/commands/delivery.js +29 -13
- package/dist/cli/commands/delivery.js.map +1 -1
- package/dist/cli/commands/gate.d.ts.map +1 -1
- package/dist/cli/commands/gate.js +2 -1
- package/dist/cli/commands/gate.js.map +1 -1
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +12 -2
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/journey.d.ts.map +1 -1
- package/dist/cli/commands/journey.js +4 -2
- package/dist/cli/commands/journey.js.map +1 -1
- package/dist/cli/commands/next.d.ts +4 -2
- package/dist/cli/commands/next.d.ts.map +1 -1
- package/dist/cli/commands/next.js +22 -6
- package/dist/cli/commands/next.js.map +1 -1
- package/dist/cli/commands/triage.d.ts.map +1 -1
- package/dist/cli/commands/triage.js +5 -3
- package/dist/cli/commands/triage.js.map +1 -1
- package/dist/cli/project-sungen-invocation.d.ts +6 -0
- package/dist/cli/project-sungen-invocation.d.ts.map +1 -1
- package/dist/cli/project-sungen-invocation.js +19 -0
- package/dist/cli/project-sungen-invocation.js.map +1 -1
- package/dist/cli/run-command-hints.d.ts +9 -0
- package/dist/cli/run-command-hints.d.ts.map +1 -0
- package/dist/cli/run-command-hints.js +84 -0
- package/dist/cli/run-command-hints.js.map +1 -0
- package/dist/cli/waiting-for-you-block.d.ts +9 -6
- package/dist/cli/waiting-for-you-block.d.ts.map +1 -1
- package/dist/cli/waiting-for-you-block.js +9 -6
- package/dist/cli/waiting-for-you-block.js.map +1 -1
- package/dist/contract/build-trace-conformance.d.ts.map +1 -1
- package/dist/contract/build-trace-conformance.js +4 -11
- package/dist/contract/build-trace-conformance.js.map +1 -1
- package/dist/contract/derive-free-feature.d.ts +9 -0
- package/dist/contract/derive-free-feature.d.ts.map +1 -1
- package/dist/contract/derive-free-feature.js +10 -3
- package/dist/contract/derive-free-feature.js.map +1 -1
- package/dist/contract/resolve-unit-trace-identities.d.ts +12 -0
- package/dist/contract/resolve-unit-trace-identities.d.ts.map +1 -1
- package/dist/contract/resolve-unit-trace-identities.js +33 -49
- package/dist/contract/resolve-unit-trace-identities.js.map +1 -1
- package/dist/contract/trace/collect-trace-evidence.d.ts +9 -3
- package/dist/contract/trace/collect-trace-evidence.d.ts.map +1 -1
- package/dist/contract/trace/collect-trace-evidence.js +45 -18
- package/dist/contract/trace/collect-trace-evidence.js.map +1 -1
- package/dist/contract/trace/scenario-id-claims.d.ts +11 -0
- package/dist/contract/trace/scenario-id-claims.d.ts.map +1 -0
- package/dist/contract/trace/scenario-id-claims.js +89 -0
- package/dist/contract/trace/scenario-id-claims.js.map +1 -0
- package/dist/contract/trace/select-final-attempt.d.ts +2 -0
- package/dist/contract/trace/select-final-attempt.d.ts.map +1 -1
- package/dist/contract/trace/select-final-attempt.js +4 -1
- package/dist/contract/trace/select-final-attempt.js.map +1 -1
- package/dist/contract/trace/trace-binding.d.ts +3 -2
- package/dist/contract/trace/trace-binding.d.ts.map +1 -1
- package/dist/contract/trace/trace-binding.js +6 -3
- package/dist/contract/trace/trace-binding.js.map +1 -1
- package/dist/contract/trace/trace-freshness.d.ts +27 -0
- package/dist/contract/trace/trace-freshness.d.ts.map +1 -0
- package/dist/contract/trace/trace-freshness.js +146 -0
- package/dist/contract/trace/trace-freshness.js.map +1 -0
- package/dist/contract/trace/trace-identity-resolution.d.ts +2 -0
- package/dist/contract/trace/trace-identity-resolution.d.ts.map +1 -1
- package/dist/contract/trace/trace-identity-resolution.js +6 -3
- package/dist/contract/trace/trace-identity-resolution.js.map +1 -1
- package/dist/contract/trace/trace-run-record.d.ts +2 -0
- package/dist/contract/trace/trace-run-record.d.ts.map +1 -1
- package/dist/contract/trace/trace-run-record.js +19 -5
- package/dist/contract/trace/trace-run-record.js.map +1 -1
- package/dist/exporters/csv-exporter.d.ts +11 -2
- package/dist/exporters/csv-exporter.d.ts.map +1 -1
- package/dist/exporters/csv-exporter.js +8 -4
- package/dist/exporters/csv-exporter.js.map +1 -1
- package/dist/exporters/matrix/export.d.ts +6 -1
- package/dist/exporters/matrix/export.d.ts.map +1 -1
- package/dist/exporters/matrix/export.js +11 -4
- package/dist/exporters/matrix/export.js.map +1 -1
- package/dist/exporters/xlsx-exporter.d.ts +3 -2
- package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
- package/dist/exporters/xlsx-exporter.js +4 -4
- package/dist/exporters/xlsx-exporter.js.map +1 -1
- package/dist/graph/evaluate-graph.d.ts +3 -1
- package/dist/graph/evaluate-graph.d.ts.map +1 -1
- package/dist/graph/evaluate-graph.js +4 -2
- package/dist/graph/evaluate-graph.js.map +1 -1
- package/dist/graph/unit-artifact-probes.d.ts.map +1 -1
- package/dist/graph/unit-artifact-probes.js +3 -1
- package/dist/graph/unit-artifact-probes.js.map +1 -1
- package/dist/harness/gates/audit-report-verification.d.ts +2 -0
- package/dist/harness/gates/audit-report-verification.d.ts.map +1 -1
- package/dist/harness/gates/audit-report-verification.js +8 -3
- package/dist/harness/gates/audit-report-verification.js.map +1 -1
- package/dist/harness/next-step.d.ts +2 -0
- package/dist/harness/next-step.d.ts.map +1 -1
- package/dist/harness/next-step.js +2 -0
- package/dist/harness/next-step.js.map +1 -1
- package/dist/hooks/hand-back-core.d.ts +4 -1
- package/dist/hooks/hand-back-core.d.ts.map +1 -1
- package/dist/hooks/hand-back-core.js +7 -3
- package/dist/hooks/hand-back-core.js.map +1 -1
- package/dist/hooks/session-start-unit-state-hook.js +1 -1
- package/dist/hooks/session-start-unit-state-hook.js.map +1 -1
- package/dist/orchestrator/templates/ai-src/commands/create-test.md +4 -1
- package/package.json +3 -3
- package/src/cli/case-triage-hint.ts +31 -0
- package/src/cli/commands/contract-derive-command.ts +14 -4
- package/src/cli/commands/contract.ts +5 -2
- package/src/cli/commands/delivery.ts +29 -13
- package/src/cli/commands/gate.ts +2 -1
- package/src/cli/commands/generate.ts +11 -2
- package/src/cli/commands/journey.ts +4 -2
- package/src/cli/commands/next.ts +25 -9
- package/src/cli/commands/triage.ts +5 -3
- package/src/cli/project-sungen-invocation.ts +20 -0
- package/src/cli/run-command-hints.ts +47 -0
- package/src/cli/waiting-for-you-block.ts +14 -10
- package/src/contract/build-trace-conformance.ts +4 -6
- package/src/contract/derive-free-feature.ts +15 -3
- package/src/contract/resolve-unit-trace-identities.ts +35 -12
- package/src/contract/trace/collect-trace-evidence.ts +50 -18
- package/src/contract/trace/scenario-id-claims.ts +60 -0
- package/src/contract/trace/select-final-attempt.ts +9 -2
- package/src/contract/trace/trace-binding.ts +7 -4
- package/src/contract/trace/trace-freshness.ts +110 -0
- package/src/contract/trace/trace-identity-resolution.ts +7 -4
- package/src/contract/trace/trace-run-record.ts +20 -4
- package/src/exporters/csv-exporter.ts +12 -4
- package/src/exporters/matrix/export.ts +11 -4
- package/src/exporters/xlsx-exporter.ts +5 -4
- package/src/graph/evaluate-graph.ts +5 -3
- package/src/graph/unit-artifact-probes.ts +3 -1
- package/src/harness/gates/audit-report-verification.ts +7 -2
- package/src/harness/next-step.ts +3 -0
- package/src/hooks/hand-back-core.ts +8 -4
- package/src/hooks/session-start-unit-state-hook.ts +1 -1
- package/src/orchestrator/templates/ai-src/commands/create-test.md +4 -1
|
@@ -0,0 +1,89 @@
|
|
|
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.idsClaimedByTwoTests = idsClaimedByTwoTests;
|
|
37
|
+
exports.twoTestsClaim = twoTestsClaim;
|
|
38
|
+
/**
|
|
39
|
+
* One scenario id, one test (#962): which ids more than one recorded TEST claims, said the same way
|
|
40
|
+
* by `contract derive` (it refuses) and `contract check` (the id is unproven). One test recorded
|
|
41
|
+
* again — another run or shard, a retry, a second Playwright project — is still one test: the same
|
|
42
|
+
* file and the same Playwright test id.
|
|
43
|
+
*
|
|
44
|
+
* Each claiming test names the run record(s) it came from. A test that only an older run's record
|
|
45
|
+
* under `test-results/` still mentions — while another claim comes from the free config's own
|
|
46
|
+
* `test-results-free/` — is most likely gone: that record is offered for deletion.
|
|
47
|
+
*/
|
|
48
|
+
const path = __importStar(require("path"));
|
|
49
|
+
const render_free_gherkin_1 = require("../render-free-gherkin");
|
|
50
|
+
const trace_run_record_1 = require("./trace-run-record");
|
|
51
|
+
const posix = (p) => p.split(path.sep).join('/');
|
|
52
|
+
/** A run's project-relative test file: the run record's (what the binding checks), else the report's. */
|
|
53
|
+
const testFileOf = (r) => r.record?.attempts.find((a) => a.testId === r.test?.testId)?.file ?? r.test?.file ?? '?';
|
|
54
|
+
const label = (r, records) => `${(0, render_free_gherkin_1.clip)(testFileOf(r), 200)}:${r.test?.line ?? 0} "${(0, render_free_gherkin_1.clip)(r.test?.title ?? '')}" (run record ${records.map((f) => (0, render_free_gherkin_1.clip)(f, 200)).join(', ')})`;
|
|
55
|
+
function idsClaimedByTwoTests(projectRoot, runs) {
|
|
56
|
+
const byId = new Map();
|
|
57
|
+
for (const r of runs) {
|
|
58
|
+
if (!r.test)
|
|
59
|
+
continue;
|
|
60
|
+
const tests = byId.get(r.scenarioId) ?? new Map();
|
|
61
|
+
const key = `${testFileOf(r)}\0${r.test.testId}`;
|
|
62
|
+
const entry = tests.get(key) ?? { run: r, records: new Set() };
|
|
63
|
+
if (r.record?.file)
|
|
64
|
+
entry.records.add(posix(path.relative(projectRoot, r.record.file)));
|
|
65
|
+
tests.set(key, entry);
|
|
66
|
+
byId.set(r.scenarioId, tests);
|
|
67
|
+
}
|
|
68
|
+
const claims = new Map();
|
|
69
|
+
for (const [id, tests] of byId) {
|
|
70
|
+
if (tests.size < 2)
|
|
71
|
+
continue;
|
|
72
|
+
const entries = [...tests.values()].map((t) => ({ ...t, records: [...t.records].sort() }));
|
|
73
|
+
const inFreeDir = entries.some((t) => t.records.some((f) => f.startsWith(`${trace_run_record_1.FREE_RUN_DIR}/`)));
|
|
74
|
+
const legacyOnly = entries.filter((t) => t.records.length > 0 && t.records.every((f) => f.startsWith('test-results/')));
|
|
75
|
+
claims.set(id, {
|
|
76
|
+
tests: entries.map((t) => label(t.run, t.records)).sort(),
|
|
77
|
+
staleRecords: inFreeDir ? [...new Set(legacyOnly.flatMap((t) => t.records))].sort() : [],
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
return claims;
|
|
81
|
+
}
|
|
82
|
+
/** What to tell the user when several tests claim one id — check and derive say it the same way. */
|
|
83
|
+
function twoTestsClaim(id, claim) {
|
|
84
|
+
const stale = claim.staleRecords.length
|
|
85
|
+
? `; if that test is gone, delete ${claim.staleRecords.join(', ')} — an older run's record (free tests now record under ${trace_run_record_1.FREE_RUN_DIR}/)`
|
|
86
|
+
: '';
|
|
87
|
+
return `${claim.tests.length} recorded tests claim ${id}: ${claim.tests.join(', ')} — give each test its own ID (its title's leading ID, or its @tag), then run them again with trace on${stale}`;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=scenario-id-claims.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-id-claims.js","sourceRoot":"","sources":["../../../src/contract/trace/scenario-id-claims.ts"],"names":[],"mappings":"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"}
|
|
@@ -14,6 +14,8 @@ export interface ReportTest {
|
|
|
14
14
|
project: string;
|
|
15
15
|
results: ReportResult[];
|
|
16
16
|
report: string;
|
|
17
|
+
/** The directory of the config that ran (`config.configFile`, absolute as Playwright writes it) — where absolute attachment paths start. */
|
|
18
|
+
configRoot?: string;
|
|
17
19
|
}
|
|
18
20
|
export type Admissibility = 'admissible' | 'inconclusive' | 'unproven';
|
|
19
21
|
/** Every test of a report (`text`: its bytes, already read once by the caller); throws when it is not a Playwright JSON report at all. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-final-attempt.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/select-final-attempt.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"select-final-attempt.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/select-final-attempt.ts"],"names":[],"mappings":"AAgBA,MAAM,WAAW,YAAY;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAC9H,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IACpI,4IAA4I;IAC5I,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AACD,MAAM,MAAM,aAAa,GAAG,YAAY,GAAG,cAAc,GAAG,UAAU,CAAC;AAiBvE,0IAA0I;AAC1I,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,UAAU,EAAE,CAqB9E;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,CAKtE;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG;IAAE,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,aAAa,EAAE,aAAa,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAMpH"}
|
|
@@ -49,6 +49,7 @@ exports.finalAttempt = finalAttempt;
|
|
|
49
49
|
* leading id, else the whole title — the same rule the contract uses for a scenario name.
|
|
50
50
|
*/
|
|
51
51
|
const fs = __importStar(require("fs"));
|
|
52
|
+
const path = __importStar(require("path"));
|
|
52
53
|
const parse_1 = require("../../harness/parse");
|
|
53
54
|
const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
54
55
|
const arr = (v) => (Array.isArray(v) ? v : []);
|
|
@@ -79,6 +80,8 @@ function readPlaywrightReport(file, text) {
|
|
|
79
80
|
if (!isObj(doc) || !Array.isArray(doc.suites))
|
|
80
81
|
throw new Error(`${file} is not a Playwright JSON report (no suites)`);
|
|
81
82
|
const out = [];
|
|
83
|
+
const configFile = isObj(doc.config) && typeof doc.config.configFile === 'string' && path.isAbsolute(doc.config.configFile) ? doc.config.configFile : null;
|
|
84
|
+
const configRoot = configFile ? { configRoot: path.dirname(configFile) } : {};
|
|
82
85
|
for (const top of doc.suites) {
|
|
83
86
|
for (const spec of specsOf(top)) {
|
|
84
87
|
if (typeof spec.id !== 'string' || typeof spec.title !== 'string' || typeof spec.file !== 'string')
|
|
@@ -89,7 +92,7 @@ function readPlaywrightReport(file, text) {
|
|
|
89
92
|
const results = arr(t.results).map(resultOf).filter((r) => !!r).sort((a, b) => a.retry - b.retry);
|
|
90
93
|
out.push({
|
|
91
94
|
testId: spec.id, title: spec.title, file: spec.file, line: Number(spec.line) || 0,
|
|
92
|
-
tags: arr(spec.tags).map(String), project: String(t.projectName ?? ''), results, report: file,
|
|
95
|
+
tags: arr(spec.tags).map(String), project: String(t.projectName ?? ''), results, report: file, ...configRoot,
|
|
93
96
|
});
|
|
94
97
|
}
|
|
95
98
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"select-final-attempt.js","sourceRoot":"","sources":["../../../src/contract/trace/select-final-attempt.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"select-final-attempt.js","sourceRoot":"","sources":["../../../src/contract/trace/select-final-attempt.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ParsedTrace } from './trace-file-reader';
|
|
2
|
+
import { UnitContract } from './trace-freshness';
|
|
2
3
|
import type { RunRecord } from './trace-run-record';
|
|
3
4
|
import type { ReportResult, ReportTest } from './select-final-attempt';
|
|
4
5
|
export interface BindingInput {
|
|
@@ -7,8 +8,8 @@ export interface BindingInput {
|
|
|
7
8
|
result: ReportResult;
|
|
8
9
|
record: RunRecord;
|
|
9
10
|
trace: ParsedTrace;
|
|
10
|
-
/**
|
|
11
|
-
|
|
11
|
+
/** The unit's contract as it is now; null when no contract is proven (derive reads traces to write one). */
|
|
12
|
+
contract: UnitContract | null;
|
|
12
13
|
}
|
|
13
14
|
export type Binding = {
|
|
14
15
|
ok: true;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-binding.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/trace-binding.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trace-binding.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/trace-binding.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAe,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEvE,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,SAAS,CAAC;IAClB,KAAK,EAAE,WAAW,CAAC;IACnB,4GAA4G;IAC5G,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC/B;AACD,MAAM,MAAM,OAAO,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAIrF,wBAAgB,SAAS,CAAC,CAAC,EAAE,YAAY,GAAG,OAAO,CAwBlD"}
|
|
@@ -44,11 +44,13 @@ exports.bindTrace = bindTrace;
|
|
|
44
44
|
* code sha256 of the test file NOW equals the hash the record took at run start
|
|
45
45
|
* title every library part says `<file>:<line> › … › <title>` of exactly this test
|
|
46
46
|
* clock the trace started inside the attempt's window (±2 s)
|
|
47
|
-
* fresh the trace is
|
|
47
|
+
* fresh the trace is not older than the .feature files and the lock it is asked to prove —
|
|
48
|
+
* judged by their content, not their file time (#967, trace-freshness.ts)
|
|
48
49
|
*/
|
|
49
50
|
const crypto_1 = require("crypto");
|
|
50
51
|
const fs = __importStar(require("fs"));
|
|
51
52
|
const path = __importStar(require("path"));
|
|
53
|
+
const trace_freshness_1 = require("./trace-freshness");
|
|
52
54
|
const CLOCK_SLACK_MS = 2000;
|
|
53
55
|
function bindTrace(i) {
|
|
54
56
|
const fail = (reason) => ({ ok: false, reason });
|
|
@@ -81,8 +83,9 @@ function bindTrace(i) {
|
|
|
81
83
|
if (typeof wall !== 'number' || Number.isNaN(start) || wall < start - CLOCK_SLACK_MS || wall > start + i.result.duration + CLOCK_SLACK_MS) {
|
|
82
84
|
return fail('the trace was not recorded during this attempt (clock window)');
|
|
83
85
|
}
|
|
84
|
-
|
|
85
|
-
|
|
86
|
+
const stale = i.contract ? (0, trace_freshness_1.staleReason)(i.contract, i.record) : null;
|
|
87
|
+
if (stale)
|
|
88
|
+
return fail(stale);
|
|
86
89
|
return { ok: true, specFile: attempt.file };
|
|
87
90
|
}
|
|
88
91
|
//# sourceMappingURL=trace-binding.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-binding.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-binding.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"trace-binding.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-binding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { RunRecord } from './trace-run-record';
|
|
2
|
+
interface ContractFile {
|
|
3
|
+
rel: string;
|
|
4
|
+
sha: string;
|
|
5
|
+
mtimeMs: number;
|
|
6
|
+
}
|
|
7
|
+
interface LastCommit {
|
|
8
|
+
sha: string;
|
|
9
|
+
ms: number;
|
|
10
|
+
}
|
|
11
|
+
/** A unit's contract as it is NOW — its `.feature` files and lock, read once per verdict. */
|
|
12
|
+
export interface UnitContract {
|
|
13
|
+
projectRoot: string;
|
|
14
|
+
files: ContractFile[];
|
|
15
|
+
/** Schema 1 only, asked of git at most once: project path → the last commit that changed each file git holds unchanged. */
|
|
16
|
+
committed?: Map<string, LastCommit> | null;
|
|
17
|
+
/** Schema 1 only: commit → is it an ancestor of HEAD (asked once per commit). */
|
|
18
|
+
ancestors?: Map<string, boolean>;
|
|
19
|
+
}
|
|
20
|
+
export declare function unitContract(projectRoot: string, unit: {
|
|
21
|
+
name: string;
|
|
22
|
+
dir: string;
|
|
23
|
+
}): UnitContract;
|
|
24
|
+
/** Why a trace bound to `record` is older than the unit's contract — null when it is not. */
|
|
25
|
+
export declare function staleReason(c: UnitContract, record: RunRecord): string | null;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=trace-freshness.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-freshness.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/trace-freshness.ts"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,UAAU,YAAY;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACpE,UAAU,UAAU;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE;AAChD,6FAA6F;AAC7F,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,2HAA2H;IAC3H,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,IAAI,CAAC;IAC3C,iFAAiF;IACjF,SAAS,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAMD,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,YAAY,CAUnG;AAqCD,6FAA6F;AAC7F,wBAAgB,WAAW,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAiB7E"}
|
|
@@ -0,0 +1,146 @@
|
|
|
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.unitContract = unitContract;
|
|
37
|
+
exports.staleReason = staleReason;
|
|
38
|
+
/**
|
|
39
|
+
* Is a trace newer than the contract it is asked to prove? (DOS-14.6: a trace older than the
|
|
40
|
+
* `.feature` or the lock is refused.) Judged by CONTENT, never by file time alone (#967): a `touch`,
|
|
41
|
+
* a checkout or a fresh clone changes no byte, so it stales nothing; an edit after the run always does.
|
|
42
|
+
*
|
|
43
|
+
* schema 2 record the reporter hashed every `.feature` and `contracts.lock.yaml` under `qa/` when
|
|
44
|
+
* the run started. Each of the unit's contract files must hash NOW to what the run
|
|
45
|
+
* saw: one that changed since, or did not exist yet, is newer than the trace → stale
|
|
46
|
+
* schema 1 record an older reporter recorded no content, so the files are dated against the run's
|
|
47
|
+
* start (the record's `startedAt`): one last written before it is older than the run;
|
|
48
|
+
* one written after it still is when git holds it unchanged and the commit that last
|
|
49
|
+
* changed it is an ancestor of HEAD committed before the run started (its bytes ARE
|
|
50
|
+
* that commit's). Anything else — edited, uncommitted, untracked, committed after the
|
|
51
|
+
* run started, no git, git failed or slow — is stale: fail closed.
|
|
52
|
+
*
|
|
53
|
+
* Limit of the schema-1 path: a commit time is what the committer's clock (or GIT_COMMITTER_DATE) said,
|
|
54
|
+
* so a backdated commit passes the time check — time-based checks cannot see through that. Schema 2
|
|
55
|
+
* compares content and retires this path: re-running the free tests once with the current reporter is
|
|
56
|
+
* the remedy.
|
|
57
|
+
*/
|
|
58
|
+
const child_process_1 = require("child_process");
|
|
59
|
+
const crypto_1 = require("crypto");
|
|
60
|
+
const fs = __importStar(require("fs"));
|
|
61
|
+
const path = __importStar(require("path"));
|
|
62
|
+
const contracts_lock_file_1 = require("../contracts-lock-file");
|
|
63
|
+
const normalize_feature_steps_1 = require("../normalize-feature-steps");
|
|
64
|
+
/** Inside the Claude Code guard too: a slow git leaves a schema-1 trace stale rather than the hook waiting. */
|
|
65
|
+
const GIT_TIMEOUT_MS = 2000;
|
|
66
|
+
const posix = (p) => p.split(path.sep).join('/');
|
|
67
|
+
function unitContract(projectRoot, unit) {
|
|
68
|
+
const root = path.resolve(projectRoot);
|
|
69
|
+
const lock = path.resolve((0, contracts_lock_file_1.lockPathFor)(unit.dir));
|
|
70
|
+
const files = [...(fs.existsSync(lock) ? [lock] : []), ...(0, normalize_feature_steps_1.contractFeatureFiles)(unit.dir, unit.name)].map((abs) => {
|
|
71
|
+
let sha = 'unreadable'; // never equal to a recorded sha256: an unreadable contract file is stale
|
|
72
|
+
let mtimeMs = Number.POSITIVE_INFINITY;
|
|
73
|
+
try {
|
|
74
|
+
sha = (0, crypto_1.createHash)('sha256').update(fs.readFileSync(abs)).digest('hex');
|
|
75
|
+
mtimeMs = fs.statSync(abs).mtimeMs;
|
|
76
|
+
}
|
|
77
|
+
catch { /* stale */ }
|
|
78
|
+
return { rel: posix(path.relative(root, abs)), sha, mtimeMs };
|
|
79
|
+
});
|
|
80
|
+
return { projectRoot: root, files };
|
|
81
|
+
}
|
|
82
|
+
function git(cwd, args) {
|
|
83
|
+
try {
|
|
84
|
+
return (0, child_process_1.execFileSync)('git', args, { cwd, stdio: ['ignore', 'pipe', 'ignore'], timeout: GIT_TIMEOUT_MS, maxBuffer: 16 * 1024 * 1024 }).toString('utf8');
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Each contract file git holds unchanged → the last commit (first-parent history, merges included)
|
|
92
|
+
* that changed it, with its committer time. Two git calls for the whole unit; null when git cannot say.
|
|
93
|
+
* Paths are passed as literal pathspecs: no glob or `:(magic)` reading of a unit's file names.
|
|
94
|
+
*/
|
|
95
|
+
function committedTimes(c) {
|
|
96
|
+
if (c.committed !== undefined)
|
|
97
|
+
return c.committed;
|
|
98
|
+
const rels = c.files.map((f) => f.rel);
|
|
99
|
+
const changed = git(c.projectRoot, ['--literal-pathspecs', 'diff', '--name-only', '--relative', '-z', 'HEAD', '--', ...rels]);
|
|
100
|
+
const log = git(c.projectRoot, ['-c', 'core.quotePath=false', '--literal-pathspecs', 'log', '--first-parent', '-m', '-n', '500', '--format=%x01%H %ct', '--name-only', '--relative', '--', ...rels]);
|
|
101
|
+
if (changed === null || log === null)
|
|
102
|
+
return (c.committed = null);
|
|
103
|
+
const dirty = new Set(changed.split('\0').filter(Boolean));
|
|
104
|
+
const times = new Map();
|
|
105
|
+
let at = null;
|
|
106
|
+
for (const raw of log.split('\n')) {
|
|
107
|
+
const line = raw.trim();
|
|
108
|
+
if (raw.startsWith('\x01')) {
|
|
109
|
+
const [sha, ct] = raw.slice(1).trim().split(' ');
|
|
110
|
+
at = /^[0-9a-f]{40,64}$/.test(sha ?? '') && Number(ct) > 0 ? { sha, ms: Number(ct) * 1000 } : null;
|
|
111
|
+
}
|
|
112
|
+
else if (line && at && !times.has(line) && !dirty.has(line))
|
|
113
|
+
times.set(line, at);
|
|
114
|
+
}
|
|
115
|
+
return (c.committed = times);
|
|
116
|
+
}
|
|
117
|
+
/** Is `sha` an ancestor of HEAD? First-parent history says so already; asserted, never assumed. */
|
|
118
|
+
function isAncestorOfHead(c, sha) {
|
|
119
|
+
if (!c.ancestors)
|
|
120
|
+
c.ancestors = new Map();
|
|
121
|
+
if (!c.ancestors.has(sha))
|
|
122
|
+
c.ancestors.set(sha, git(c.projectRoot, ['merge-base', '--is-ancestor', sha, 'HEAD']) !== null);
|
|
123
|
+
return c.ancestors.get(sha);
|
|
124
|
+
}
|
|
125
|
+
/** Why a trace bound to `record` is older than the unit's contract — null when it is not. */
|
|
126
|
+
function staleReason(c, record) {
|
|
127
|
+
if (record.contract) {
|
|
128
|
+
const f = c.files.find((x) => record.contract[x.rel] !== x.sha);
|
|
129
|
+
if (!f)
|
|
130
|
+
return null;
|
|
131
|
+
const why = record.contract[f.rel] === undefined ? 'it did not exist when the run started' : 'its content changed after the run';
|
|
132
|
+
return `the trace is older than ${f.rel}: ${why} (stale) — re-run the test`;
|
|
133
|
+
}
|
|
134
|
+
const runStart = Date.parse(record.startedAt); // unreadable → nothing is "before the run": stale
|
|
135
|
+
const late = c.files.filter((f) => !(f.mtimeMs <= runStart));
|
|
136
|
+
if (!late.length)
|
|
137
|
+
return null;
|
|
138
|
+
const committed = committedTimes(c);
|
|
139
|
+
const vouched = (rel) => {
|
|
140
|
+
const last = committed?.get(rel);
|
|
141
|
+
return !!last && last.ms <= runStart && isAncestorOfHead(c, last.sha);
|
|
142
|
+
};
|
|
143
|
+
const f = late.find((x) => !vouched(x.rel));
|
|
144
|
+
return f ? `the trace is older than ${f.rel}: it was written after the run, and no commit from before the run holds its bytes (stale) — re-run the test` : null;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=trace-freshness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace-freshness.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-freshness.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,9 +18,11 @@ export declare function identitiesFor(trace: ParsedTrace, steps: IntentStep[], c
|
|
|
18
18
|
/** One replay request per element target of a trace, keyed by the sha256 of its rendered HTML. */
|
|
19
19
|
export declare function identityRequestsFor(trace: ParsedTrace): TraceIdentityRequest[];
|
|
20
20
|
/** Ask the driver about every not-yet-cached target of these traces; rewrite the cache. */
|
|
21
|
+
/** `keys`: every target of the given traces (cached or asked) — what the caller reports on. */
|
|
21
22
|
export declare function resolveWithDriver(projectRoot: string, traces: ParsedTrace[], resolver: TraceIdentityResolver): Promise<{
|
|
22
23
|
asked: number;
|
|
23
24
|
resolver: string;
|
|
24
25
|
blockedRequests: number;
|
|
26
|
+
keys: string[];
|
|
25
27
|
}>;
|
|
26
28
|
//# sourceMappingURL=trace-identity-resolution.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-identity-resolution.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/trace-identity-resolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAkB,aAAa,EAAyC,MAAM,kBAAkB,CAAC;AAGxG,OAAO,EAAqB,oBAAoB,EAAE,qBAAqB,EAAyC,MAAM,mBAAmB,CAAC;AAC1I,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAoB,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,gEAAgE;AAChE,eAAO,MAAM,WAAW,GAAI,GAAG,UAAU,KAAG,OAC2G,CAAC;AAOxJ,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAcxH;AAED,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,oBAAoB,EAAE,CAK9E;AAED,2FAA2F;AAC3F,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"trace-identity-resolution.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/trace-identity-resolution.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAkB,aAAa,EAAyC,MAAM,kBAAkB,CAAC;AAGxG,OAAO,EAAqB,oBAAoB,EAAE,qBAAqB,EAAyC,MAAM,mBAAmB,CAAC;AAC1I,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAoB,UAAU,EAAE,MAAM,eAAe,CAAC;AAC7D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAI7D,gEAAgE;AAChE,eAAO,MAAM,WAAW,GAAI,GAAG,UAAU,KAAG,OAC2G,CAAC;AAOxJ,wBAAgB,aAAa,CAAC,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAcxH;AAED,kGAAkG;AAClG,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,GAAG,oBAAoB,EAAE,CAK9E;AAED,2FAA2F;AAC3F,+FAA+F;AAC/F,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,QAAQ,EAAE,qBAAqB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAsB1M"}
|
|
@@ -55,16 +55,19 @@ function identityRequestsFor(trace) {
|
|
|
55
55
|
}));
|
|
56
56
|
}
|
|
57
57
|
/** Ask the driver about every not-yet-cached target of these traces; rewrite the cache. */
|
|
58
|
+
/** `keys`: every target of the given traces (cached or asked) — what the caller reports on. */
|
|
58
59
|
async function resolveWithDriver(projectRoot, traces, resolver) {
|
|
59
60
|
const { cache } = (0, identity_cache_1.readIdentityCache)(projectRoot);
|
|
60
61
|
// The cache is project-wide (every unit's traces): answers are only ever ADDED, never pruned here.
|
|
61
62
|
const keep = new Map(cache.entries);
|
|
63
|
+
const all = traces.flatMap(identityRequestsFor);
|
|
64
|
+
const keys = [...new Set(all.map((req) => req.key))];
|
|
62
65
|
const requests = new Map();
|
|
63
|
-
for (const req of
|
|
66
|
+
for (const req of all)
|
|
64
67
|
if (!keep.has(req.key))
|
|
65
68
|
requests.set(req.key, req);
|
|
66
69
|
if (!requests.size)
|
|
67
|
-
return { asked: 0, resolver: cache.resolver, blockedRequests: 0 };
|
|
70
|
+
return { asked: 0, resolver: cache.resolver, blockedRequests: 0, keys };
|
|
68
71
|
const answer = await resolver({ requests: [...requests.values()] });
|
|
69
72
|
if (!answer || !Array.isArray(answer.results))
|
|
70
73
|
throw new Error('the trace identity resolver returned no results');
|
|
@@ -79,6 +82,6 @@ async function resolveWithDriver(projectRoot, traces, resolver) {
|
|
|
79
82
|
keep.set(key, { ...rest, browser: answer.browser.slice(0, 100) });
|
|
80
83
|
}
|
|
81
84
|
(0, identity_cache_1.writeIdentityCache)(projectRoot, answer.resolver, keep);
|
|
82
|
-
return { asked: requests.size, resolver: String(answer.resolver), blockedRequests: Number(answer.blockedRequests) || 0 };
|
|
85
|
+
return { asked: requests.size, resolver: String(answer.resolver), blockedRequests: Number(answer.blockedRequests) || 0, keys };
|
|
83
86
|
}
|
|
84
87
|
//# sourceMappingURL=trace-identity-resolution.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-identity-resolution.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-identity-resolution.ts"],"names":[],"mappings":";;;AA4BA,sCAcC;AAGD,kDAKC;
|
|
1
|
+
{"version":3,"file":"trace-identity-resolution.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-identity-resolution.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ export interface RunRecord {
|
|
|
18
18
|
shard: string | null;
|
|
19
19
|
report: string | null;
|
|
20
20
|
specs: Record<string, string>;
|
|
21
|
+
/** Schema 2: project path → sha256 of each contract file at run start. null: schema 1 (no content recorded). */
|
|
22
|
+
contract: Record<string, string> | null;
|
|
21
23
|
attempts: RunRecordAttempt[];
|
|
22
24
|
}
|
|
23
25
|
/** The free / impl:code run's own outputDir (the documented free-test config); compiled runs clear `test-results/`. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-run-record.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/trace-run-record.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trace-run-record.d.ts","sourceRoot":"","sources":["../../../src/contract/trace/trace-run-record.ts"],"names":[],"mappings":"AAkBA,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAC3E,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACvE;AACD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,gHAAgH;IAChH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IACxC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAQD,uHAAuH;AACvH,eAAO,MAAM,YAAY,sBAAsB,CAAC;AAChD,gHAAgH;AAChH,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAAmC,CAAC;AAEjF,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,EAAE,CAO5D;AAgBD,4HAA4H;AAC5H,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAyBpE"}
|
|
@@ -46,10 +46,15 @@ exports.readRunRecord = readRunRecord;
|
|
|
46
46
|
* own outputDir (#941) — or `<project>/test-results/sungen-run-record*.json` (one per run or shard).
|
|
47
47
|
* Playwright wipes its outputDir at the start of every run, so a record and its traces share a
|
|
48
48
|
* lifetime; the free run has its own so the compiled suite's next run cannot delete its traces.
|
|
49
|
+
*
|
|
50
|
+
* Schema 2 (#967) adds `contract`: the sha256 of every `.feature` and `contracts.lock.yaml` under `qa/`
|
|
51
|
+
* when the run started — what trace freshness compares by content. Schema 1 (an older reporter) has
|
|
52
|
+
* none; its traces are dated instead (trace-freshness.ts).
|
|
49
53
|
*/
|
|
50
54
|
const fs = __importStar(require("fs"));
|
|
51
55
|
const path = __importStar(require("path"));
|
|
52
|
-
const
|
|
56
|
+
const TOP_V1 = new Set(['schema', 'tool', 'runId', 'startedAt', 'playwrightVersion', 'shard', 'report', 'specs', 'attempts']);
|
|
57
|
+
const TOP_V2 = new Set([...TOP_V1, 'contract']);
|
|
53
58
|
const ATTEMPT = new Set(['testId', 'file', 'title', 'retry', 'status', 'startTime', 'duration', 'trace']);
|
|
54
59
|
const SHA = /^[0-9a-f]{64}$/;
|
|
55
60
|
const isObj = (v) => !!v && typeof v === 'object' && !Array.isArray(v);
|
|
@@ -98,11 +103,16 @@ function readRunRecord(file, text) {
|
|
|
98
103
|
}
|
|
99
104
|
if (!isObj(raw))
|
|
100
105
|
throw new Error('not an object');
|
|
101
|
-
|
|
106
|
+
if (raw.tool === 'sungen-trace-run-record' && typeof raw.schema === 'number' && raw.schema > 2) {
|
|
107
|
+
// A newer driver-ui wrote it (mixed versions): say what to upgrade, not just "not a record".
|
|
108
|
+
throw new Error(`record schema ${raw.schema} is newer than this sungen — upgrade @sun-asterisk/sungen (core before or together with driver-ui)`);
|
|
109
|
+
}
|
|
110
|
+
const keys = raw.schema === 2 ? TOP_V2 : raw.schema === 1 ? TOP_V1 : null;
|
|
111
|
+
if (!keys || raw.tool !== 'sungen-trace-run-record')
|
|
112
|
+
throw new Error('not a sungen run record (schema 1 or 2)');
|
|
113
|
+
const extra = Object.keys(raw).find((k) => !keys.has(k));
|
|
102
114
|
if (extra)
|
|
103
115
|
throw new Error(`unknown key "${extra}"`);
|
|
104
|
-
if (raw.schema !== 1 || raw.tool !== 'sungen-trace-run-record')
|
|
105
|
-
throw new Error('not a sungen run record (schema 1)');
|
|
106
116
|
if (typeof raw.runId !== 'string' || !raw.runId || typeof raw.startedAt !== 'string' || typeof raw.playwrightVersion !== 'string')
|
|
107
117
|
throw new Error('runId, startedAt and playwrightVersion must be strings');
|
|
108
118
|
if (raw.shard !== null && typeof raw.shard !== 'string')
|
|
@@ -111,11 +121,15 @@ function readRunRecord(file, text) {
|
|
|
111
121
|
throw new Error('report must be a string or null');
|
|
112
122
|
if (!isObj(raw.specs) || !Object.values(raw.specs).every((v) => typeof v === 'string' && (v === '' || SHA.test(v))))
|
|
113
123
|
throw new Error('specs must map files to sha256');
|
|
124
|
+
if (raw.schema === 2 && !(isObj(raw.contract) && Object.values(raw.contract).every((v) => typeof v === 'string' && SHA.test(v)))) {
|
|
125
|
+
throw new Error('contract must map contract files to sha256 (schema 2)');
|
|
126
|
+
}
|
|
114
127
|
if (!Array.isArray(raw.attempts))
|
|
115
128
|
throw new Error('attempts must be a list');
|
|
116
129
|
return {
|
|
117
130
|
file, runId: raw.runId, startedAt: raw.startedAt, playwrightVersion: raw.playwrightVersion, shard: raw.shard,
|
|
118
|
-
report: raw.report, specs: raw.specs,
|
|
131
|
+
report: raw.report, specs: raw.specs,
|
|
132
|
+
contract: raw.schema === 2 ? raw.contract : null, attempts: raw.attempts.map(attemptOf),
|
|
119
133
|
};
|
|
120
134
|
}
|
|
121
135
|
//# sourceMappingURL=trace-run-record.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace-run-record.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-run-record.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"trace-run-record.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-run-record.ts"],"names":[],"mappings":"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"}
|