@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.
Files changed (148) hide show
  1. package/dist/cli/case-triage-hint.d.ts +14 -0
  2. package/dist/cli/case-triage-hint.d.ts.map +1 -0
  3. package/dist/cli/case-triage-hint.js +23 -0
  4. package/dist/cli/case-triage-hint.js.map +1 -0
  5. package/dist/cli/commands/contract-derive-command.d.ts +2 -1
  6. package/dist/cli/commands/contract-derive-command.d.ts.map +1 -1
  7. package/dist/cli/commands/contract-derive-command.js +15 -3
  8. package/dist/cli/commands/contract-derive-command.js.map +1 -1
  9. package/dist/cli/commands/contract.d.ts.map +1 -1
  10. package/dist/cli/commands/contract.js +5 -2
  11. package/dist/cli/commands/contract.js.map +1 -1
  12. package/dist/cli/commands/delivery.d.ts.map +1 -1
  13. package/dist/cli/commands/delivery.js +29 -13
  14. package/dist/cli/commands/delivery.js.map +1 -1
  15. package/dist/cli/commands/gate.d.ts.map +1 -1
  16. package/dist/cli/commands/gate.js +2 -1
  17. package/dist/cli/commands/gate.js.map +1 -1
  18. package/dist/cli/commands/generate.d.ts.map +1 -1
  19. package/dist/cli/commands/generate.js +12 -2
  20. package/dist/cli/commands/generate.js.map +1 -1
  21. package/dist/cli/commands/journey.d.ts.map +1 -1
  22. package/dist/cli/commands/journey.js +4 -2
  23. package/dist/cli/commands/journey.js.map +1 -1
  24. package/dist/cli/commands/next.d.ts +4 -2
  25. package/dist/cli/commands/next.d.ts.map +1 -1
  26. package/dist/cli/commands/next.js +22 -6
  27. package/dist/cli/commands/next.js.map +1 -1
  28. package/dist/cli/commands/triage.d.ts.map +1 -1
  29. package/dist/cli/commands/triage.js +5 -3
  30. package/dist/cli/commands/triage.js.map +1 -1
  31. package/dist/cli/project-sungen-invocation.d.ts +6 -0
  32. package/dist/cli/project-sungen-invocation.d.ts.map +1 -1
  33. package/dist/cli/project-sungen-invocation.js +19 -0
  34. package/dist/cli/project-sungen-invocation.js.map +1 -1
  35. package/dist/cli/run-command-hints.d.ts +9 -0
  36. package/dist/cli/run-command-hints.d.ts.map +1 -0
  37. package/dist/cli/run-command-hints.js +84 -0
  38. package/dist/cli/run-command-hints.js.map +1 -0
  39. package/dist/cli/waiting-for-you-block.d.ts +9 -6
  40. package/dist/cli/waiting-for-you-block.d.ts.map +1 -1
  41. package/dist/cli/waiting-for-you-block.js +9 -6
  42. package/dist/cli/waiting-for-you-block.js.map +1 -1
  43. package/dist/contract/build-trace-conformance.d.ts.map +1 -1
  44. package/dist/contract/build-trace-conformance.js +4 -11
  45. package/dist/contract/build-trace-conformance.js.map +1 -1
  46. package/dist/contract/derive-free-feature.d.ts +9 -0
  47. package/dist/contract/derive-free-feature.d.ts.map +1 -1
  48. package/dist/contract/derive-free-feature.js +10 -3
  49. package/dist/contract/derive-free-feature.js.map +1 -1
  50. package/dist/contract/resolve-unit-trace-identities.d.ts +12 -0
  51. package/dist/contract/resolve-unit-trace-identities.d.ts.map +1 -1
  52. package/dist/contract/resolve-unit-trace-identities.js +33 -49
  53. package/dist/contract/resolve-unit-trace-identities.js.map +1 -1
  54. package/dist/contract/trace/collect-trace-evidence.d.ts +9 -3
  55. package/dist/contract/trace/collect-trace-evidence.d.ts.map +1 -1
  56. package/dist/contract/trace/collect-trace-evidence.js +45 -18
  57. package/dist/contract/trace/collect-trace-evidence.js.map +1 -1
  58. package/dist/contract/trace/scenario-id-claims.d.ts +11 -0
  59. package/dist/contract/trace/scenario-id-claims.d.ts.map +1 -0
  60. package/dist/contract/trace/scenario-id-claims.js +89 -0
  61. package/dist/contract/trace/scenario-id-claims.js.map +1 -0
  62. package/dist/contract/trace/select-final-attempt.d.ts +2 -0
  63. package/dist/contract/trace/select-final-attempt.d.ts.map +1 -1
  64. package/dist/contract/trace/select-final-attempt.js +4 -1
  65. package/dist/contract/trace/select-final-attempt.js.map +1 -1
  66. package/dist/contract/trace/trace-binding.d.ts +3 -2
  67. package/dist/contract/trace/trace-binding.d.ts.map +1 -1
  68. package/dist/contract/trace/trace-binding.js +6 -3
  69. package/dist/contract/trace/trace-binding.js.map +1 -1
  70. package/dist/contract/trace/trace-freshness.d.ts +27 -0
  71. package/dist/contract/trace/trace-freshness.d.ts.map +1 -0
  72. package/dist/contract/trace/trace-freshness.js +146 -0
  73. package/dist/contract/trace/trace-freshness.js.map +1 -0
  74. package/dist/contract/trace/trace-identity-resolution.d.ts +2 -0
  75. package/dist/contract/trace/trace-identity-resolution.d.ts.map +1 -1
  76. package/dist/contract/trace/trace-identity-resolution.js +6 -3
  77. package/dist/contract/trace/trace-identity-resolution.js.map +1 -1
  78. package/dist/contract/trace/trace-run-record.d.ts +2 -0
  79. package/dist/contract/trace/trace-run-record.d.ts.map +1 -1
  80. package/dist/contract/trace/trace-run-record.js +19 -5
  81. package/dist/contract/trace/trace-run-record.js.map +1 -1
  82. package/dist/exporters/csv-exporter.d.ts +11 -2
  83. package/dist/exporters/csv-exporter.d.ts.map +1 -1
  84. package/dist/exporters/csv-exporter.js +8 -4
  85. package/dist/exporters/csv-exporter.js.map +1 -1
  86. package/dist/exporters/matrix/export.d.ts +6 -1
  87. package/dist/exporters/matrix/export.d.ts.map +1 -1
  88. package/dist/exporters/matrix/export.js +11 -4
  89. package/dist/exporters/matrix/export.js.map +1 -1
  90. package/dist/exporters/xlsx-exporter.d.ts +3 -2
  91. package/dist/exporters/xlsx-exporter.d.ts.map +1 -1
  92. package/dist/exporters/xlsx-exporter.js +4 -4
  93. package/dist/exporters/xlsx-exporter.js.map +1 -1
  94. package/dist/graph/evaluate-graph.d.ts +3 -1
  95. package/dist/graph/evaluate-graph.d.ts.map +1 -1
  96. package/dist/graph/evaluate-graph.js +4 -2
  97. package/dist/graph/evaluate-graph.js.map +1 -1
  98. package/dist/graph/unit-artifact-probes.d.ts.map +1 -1
  99. package/dist/graph/unit-artifact-probes.js +3 -1
  100. package/dist/graph/unit-artifact-probes.js.map +1 -1
  101. package/dist/harness/gates/audit-report-verification.d.ts +2 -0
  102. package/dist/harness/gates/audit-report-verification.d.ts.map +1 -1
  103. package/dist/harness/gates/audit-report-verification.js +8 -3
  104. package/dist/harness/gates/audit-report-verification.js.map +1 -1
  105. package/dist/harness/next-step.d.ts +2 -0
  106. package/dist/harness/next-step.d.ts.map +1 -1
  107. package/dist/harness/next-step.js +2 -0
  108. package/dist/harness/next-step.js.map +1 -1
  109. package/dist/hooks/hand-back-core.d.ts +4 -1
  110. package/dist/hooks/hand-back-core.d.ts.map +1 -1
  111. package/dist/hooks/hand-back-core.js +7 -3
  112. package/dist/hooks/hand-back-core.js.map +1 -1
  113. package/dist/hooks/session-start-unit-state-hook.js +1 -1
  114. package/dist/hooks/session-start-unit-state-hook.js.map +1 -1
  115. package/dist/orchestrator/templates/ai-src/commands/create-test.md +4 -1
  116. package/package.json +3 -3
  117. package/src/cli/case-triage-hint.ts +31 -0
  118. package/src/cli/commands/contract-derive-command.ts +14 -4
  119. package/src/cli/commands/contract.ts +5 -2
  120. package/src/cli/commands/delivery.ts +29 -13
  121. package/src/cli/commands/gate.ts +2 -1
  122. package/src/cli/commands/generate.ts +11 -2
  123. package/src/cli/commands/journey.ts +4 -2
  124. package/src/cli/commands/next.ts +25 -9
  125. package/src/cli/commands/triage.ts +5 -3
  126. package/src/cli/project-sungen-invocation.ts +20 -0
  127. package/src/cli/run-command-hints.ts +47 -0
  128. package/src/cli/waiting-for-you-block.ts +14 -10
  129. package/src/contract/build-trace-conformance.ts +4 -6
  130. package/src/contract/derive-free-feature.ts +15 -3
  131. package/src/contract/resolve-unit-trace-identities.ts +35 -12
  132. package/src/contract/trace/collect-trace-evidence.ts +50 -18
  133. package/src/contract/trace/scenario-id-claims.ts +60 -0
  134. package/src/contract/trace/select-final-attempt.ts +9 -2
  135. package/src/contract/trace/trace-binding.ts +7 -4
  136. package/src/contract/trace/trace-freshness.ts +110 -0
  137. package/src/contract/trace/trace-identity-resolution.ts +7 -4
  138. package/src/contract/trace/trace-run-record.ts +20 -4
  139. package/src/exporters/csv-exporter.ts +12 -4
  140. package/src/exporters/matrix/export.ts +11 -4
  141. package/src/exporters/xlsx-exporter.ts +5 -4
  142. package/src/graph/evaluate-graph.ts +5 -3
  143. package/src/graph/unit-artifact-probes.ts +3 -1
  144. package/src/harness/gates/audit-report-verification.ts +7 -2
  145. package/src/harness/next-step.ts +3 -0
  146. package/src/hooks/hand-back-core.ts +8 -4
  147. package/src/hooks/session-start-unit-state-hook.ts +1 -1
  148. 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":"AAeA,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;IAAG,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,CAAA;CAAE;AACnK,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,CAmB9E;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"}
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":"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"}
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
- /** Epoch ms: the newest mtime of the unit's .feature files and lock. */
11
- notBefore: number;
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":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,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,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;CACnB;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,CAuBlD"}
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 newer than the .feature and the lock it is asked to prove
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
- if (wall < i.notBefore)
85
- return fail('the trace is older than the .feature or the lock it should prove (stale) — re-run the test');
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":"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"}
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,CAoB1L"}
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 traces.flatMap(identityRequestsFor))
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":"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"}
1
+ {"version":3,"file":"trace-identity-resolution.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-identity-resolution.ts"],"names":[],"mappings":";;;AA4BA,sCAcC;AAGD,kDAKC;AAID,8CAsBC;AA5ED;;;;;;;;GAQG;AACH,qDAAwG;AACxG,2DAAoE;AACpE,qDAAiD;AACjD,uDAA0I;AAE1I,+CAA6D;AAG7D,MAAM,SAAS,GAAG,sGAAsG,CAAC;AAEzH,gEAAgE;AACzD,MAAM,WAAW,GAAG,CAAC,CAAa,EAAW,EAAE,CACpD,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;AAD3I,QAAA,WAAW,eACgI;AAExJ,SAAS,WAAW,CAAC,KAAkB,EAAE,KAAmB;IAC1D,MAAM,KAAK,GAAG,IAAI,8BAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,IAAA,mBAAW,EAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,MAAO,EAAE,MAAM,EAAE,IAAA,qCAAiB,EAAC,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC,MAAO,CAAC,EAAE,CAAC,CAAC,CAAC;AAClJ,CAAC;AAED,SAAgB,aAAa,CAAC,KAAkB,EAAE,KAAmB,EAAE,KAAoB;IACzF,MAAM,GAAG,GAAG,IAAI,GAAG,EAA0B,CAAC;IAC9C,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,WAAW,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAC3D,IAAI,CAAC,MAAM,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAA,mCAAiB,EAAC,IAAI,EAAE,+BAA+B,CAAC,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACnH,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACrD,IAAI,CAAC,GAAG,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAA,mCAAiB,EAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;YAAC,SAAS;QAAC,CAAC;QACvH,iGAAiG;QACjG,MAAM,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QACvD,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE;YACd,QAAQ,EAAE,EAAE,GAAG,GAAG,EAAE,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,kBAAkB,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE;YACpH,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,kGAAkG;AAClG,SAAgB,mBAAmB,CAAC,KAAkB;IACpD,OAAO,WAAW,CAAC,KAAK,EAAE,IAAA,8BAAgB,EAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;QACtG,GAAG,EAAE,MAAO,CAAC,cAAc,EAAE,IAAI,EAAE,MAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAO,CAAC,QAAQ;QAC3E,cAAc,EAAE,2BAA2B,MAAM,IAAI,EAAE,UAAU,EAAE,MAAO,CAAC,UAAU;KACtF,CAAC,CAAC,CAAC;AACN,CAAC;AAED,2FAA2F;AAC3F,+FAA+F;AACxF,KAAK,UAAU,iBAAiB,CAAC,WAAmB,EAAE,MAAqB,EAAE,QAA+B;IACjH,MAAM,EAAE,KAAK,EAAE,GAAG,IAAA,kCAAiB,EAAC,WAAW,CAAC,CAAC;IACjD,mGAAmG;IACnG,MAAM,IAAI,GAAG,IAAI,GAAG,CAAyB,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5D,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAChD,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAgC,CAAC;IACzD,KAAK,MAAM,GAAG,IAAI,GAAG;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1E,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,eAAe,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5F,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAClH,IAAI,CAAC,kCAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QAC7G,MAAM,IAAI,KAAK,CAAC,gCAAgC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,sEAAsE,CAAC,CAAC;IAC9J,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,IAAA,qCAAmB,EAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,2EAA2E,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACjK,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAA,mCAAkB,EAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IACvD,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;AACjI,CAAC"}
@@ -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":"AAcA,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,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAOD,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,CAgBpE"}
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 TOP = new Set(['schema', 'tool', 'runId', 'startedAt', 'playwrightVersion', 'shard', 'report', 'specs', 'attempts']);
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
- const extra = Object.keys(raw).find((k) => !TOP.has(k));
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, attempts: raw.attempts.map(attemptOf),
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":"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"}
1
+ {"version":3,"file":"trace-run-record.js","sourceRoot":"","sources":["../../../src/contract/trace/trace-run-record.ts"],"names":[],"mappings":"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"}