@stacknext/regression 0.0.0-stage → 0.6.0

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.
@@ -0,0 +1,583 @@
1
+ import { DEFAULT_COMPARISON_OPTIONS, STACKNEXT_COMPARISON_FORMAT, STACKNEXT_REGRESSION_FORMAT_VERSION, REGRESSION_LIMITATIONS, } from './constants.js';
2
+ import { createComparisonId } from './capture.js';
3
+ import { compareEnvironments } from './environment.js';
4
+ import { comparisonOptionsSchema } from './schema.js';
5
+ const SEVERITY_RANK = {
6
+ none: 0,
7
+ low: 1,
8
+ medium: 2,
9
+ high: 3,
10
+ };
11
+ function compareStrings(left, right) {
12
+ return left < right ? -1 : left > right ? 1 : 0;
13
+ }
14
+ function median(values) {
15
+ if (values.length === 0)
16
+ return null;
17
+ const sorted = [...values].sort((a, b) => a - b);
18
+ const middle = Math.floor(sorted.length / 2);
19
+ if (sorted.length % 2 === 1)
20
+ return sorted[middle] ?? null;
21
+ const left = sorted[middle - 1];
22
+ const right = sorted[middle];
23
+ return left === undefined || right === undefined ? null : (left + right) / 2;
24
+ }
25
+ function round(value, digits = 3) {
26
+ const factor = 10 ** digits;
27
+ return Math.round(value * factor) / factor;
28
+ }
29
+ function aggregate(scenario) {
30
+ if (!scenario) {
31
+ return {
32
+ samples: [],
33
+ verified: [],
34
+ incomplete: [],
35
+ tracesByKey: new Map(),
36
+ traceKeys: new Set(),
37
+ findings: new Map(),
38
+ variableTraceShape: false,
39
+ };
40
+ }
41
+ const verified = scenario.samples.filter((sample) => sample.correlation.status === 'verified' && sample.correlation.traces.length > 0);
42
+ const incomplete = scenario.samples.filter((sample) => sample.correlation.status !== 'verified' || sample.correlation.traces.length === 0);
43
+ const tracesByKey = new Map();
44
+ const traceKeys = new Set();
45
+ for (const sample of verified) {
46
+ for (const trace of sample.correlation.traces) {
47
+ const existing = tracesByKey.get(trace.key);
48
+ if (existing)
49
+ existing.push(trace);
50
+ else
51
+ tracesByKey.set(trace.key, [trace]);
52
+ traceKeys.add(trace.key);
53
+ }
54
+ }
55
+ const findings = new Map();
56
+ const sampleFindings = verified.flatMap((sample) => sample.findings);
57
+ const sourceFindings = sampleFindings.length > 0 ? sampleFindings : scenario.findings;
58
+ for (const finding of sourceFindings) {
59
+ if (!findings.has(finding.key))
60
+ findings.set(finding.key, finding);
61
+ }
62
+ const variableTraceShape = verified.some((sample) => {
63
+ const keys = new Set(sample.correlation.traces.map((trace) => trace.key));
64
+ if (keys.size !== traceKeys.size)
65
+ return true;
66
+ for (const key of traceKeys) {
67
+ if (!keys.has(key))
68
+ return true;
69
+ }
70
+ return false;
71
+ });
72
+ return {
73
+ samples: scenario.samples,
74
+ verified,
75
+ incomplete,
76
+ tracesByKey,
77
+ traceKeys,
78
+ findings,
79
+ variableTraceShape,
80
+ };
81
+ }
82
+ function sideSummary(side) {
83
+ return {
84
+ samples: side.samples.length,
85
+ verifiedSamples: side.verified.length,
86
+ incompleteSamples: side.incomplete.length,
87
+ traces: [...side.tracesByKey.values()].reduce((sum, traces) => sum + traces.length, 0),
88
+ findings: side.findings.size,
89
+ };
90
+ }
91
+ function durationSeverity(deltaMs, percent) {
92
+ if (deltaMs >= 100 || (percent !== null && percent >= 100))
93
+ return 'high';
94
+ if (deltaMs >= 50 || (percent !== null && percent >= 50))
95
+ return 'medium';
96
+ return 'low';
97
+ }
98
+ function durationMetric(input) {
99
+ const baselineMedian = median(input.baselineValues);
100
+ const candidateMedian = median(input.candidateValues);
101
+ const sampleCount = Math.min(input.baselineValues.length, input.candidateValues.length);
102
+ const nulls = (input.baselineNulls ?? 0) + (input.candidateNulls ?? 0);
103
+ if (nulls > 0) {
104
+ return {
105
+ key: input.key,
106
+ label: input.label,
107
+ kind: 'duration',
108
+ status: 'inconclusive',
109
+ severity: 'none',
110
+ baselineValue: baselineMedian === null ? null : round(baselineMedian),
111
+ candidateValue: candidateMedian === null ? null : round(candidateMedian),
112
+ delta: null,
113
+ percent: null,
114
+ sampleCount,
115
+ note: 'One or more durations are null (unmeasured). Null is never treated as zero.',
116
+ unmeasured: true,
117
+ };
118
+ }
119
+ if (baselineMedian === null ||
120
+ candidateMedian === null ||
121
+ input.baselineValues.length < input.minSamples ||
122
+ input.candidateValues.length < input.minSamples) {
123
+ return {
124
+ key: input.key,
125
+ label: input.label,
126
+ kind: 'duration',
127
+ status: 'inconclusive',
128
+ severity: 'none',
129
+ baselineValue: baselineMedian === null ? null : round(baselineMedian),
130
+ candidateValue: candidateMedian === null ? null : round(candidateMedian),
131
+ delta: null,
132
+ percent: null,
133
+ sampleCount,
134
+ note: `At least ${input.minSamples} measured values per side are required.`,
135
+ };
136
+ }
137
+ const delta = candidateMedian - baselineMedian;
138
+ const percent = baselineMedian > 0 ? (delta / baselineMedian) * 100 : null;
139
+ let status = 'unchanged';
140
+ if (delta > 0 &&
141
+ delta >= input.options.durationRegressionMs &&
142
+ (percent === null || percent >= input.options.durationRegressionPct)) {
143
+ status = 'regressed';
144
+ }
145
+ else if (delta < 0 &&
146
+ Math.abs(delta) >= input.options.durationImprovementMs &&
147
+ (percent === null || -percent >= input.options.durationImprovementPct)) {
148
+ status = 'improved';
149
+ }
150
+ return {
151
+ key: input.key,
152
+ label: input.label,
153
+ kind: 'duration',
154
+ status,
155
+ severity: status === 'regressed' ? durationSeverity(Math.abs(delta), percent) : 'none',
156
+ baselineValue: round(baselineMedian),
157
+ candidateValue: round(candidateMedian),
158
+ delta: round(delta),
159
+ percent: percent === null ? null : round(percent, 1),
160
+ sampleCount,
161
+ };
162
+ }
163
+ function countMetric(input) {
164
+ const delta = input.candidateValue - input.baselineValue;
165
+ let status = 'unchanged';
166
+ if (delta >= input.options.countRegressionMin)
167
+ status = 'regressed';
168
+ else if (delta <= -input.options.countRegressionMin)
169
+ status = 'improved';
170
+ const severity = status !== 'regressed'
171
+ ? 'none'
172
+ : input.kind === 'error' ||
173
+ input.kind === 'finding' ||
174
+ input.kind === 'test-status'
175
+ ? 'high'
176
+ : 'medium';
177
+ return {
178
+ key: input.key,
179
+ label: input.label,
180
+ kind: input.kind,
181
+ status,
182
+ severity,
183
+ baselineValue: round(input.baselineValue),
184
+ candidateValue: round(input.candidateValue),
185
+ delta: round(delta),
186
+ percent: input.baselineValue > 0 ? round((delta / input.baselineValue) * 100, 1) : null,
187
+ sampleCount: Math.max(input.sampleCount, 0),
188
+ };
189
+ }
190
+ function perSampleValues(side, traceKey, selector) {
191
+ const values = [];
192
+ for (const sample of side.verified) {
193
+ const traces = sample.correlation.traces.filter((trace) => traceKey === null || trace.key === traceKey);
194
+ if (traceKey !== null && traces.length === 0)
195
+ continue;
196
+ const selected = selector(traces);
197
+ const value = median(selected);
198
+ if (value !== null)
199
+ values.push(value);
200
+ }
201
+ return values;
202
+ }
203
+ function countPerSample(side, traceKey, selector) {
204
+ const values = [];
205
+ for (const sample of side.verified) {
206
+ const traces = sample.correlation.traces.filter((trace) => traceKey === null || trace.key === traceKey);
207
+ if (traceKey !== null && traces.length === 0)
208
+ continue;
209
+ values.push(selector(traces));
210
+ }
211
+ return values;
212
+ }
213
+ function spanKeySet(traces) {
214
+ return new Set(traces.flatMap((trace) => trace.spans.map((span) => span.key)));
215
+ }
216
+ function traceSpanDurationValues(side, traceKey, spanKey) {
217
+ const values = [];
218
+ for (const sample of side.verified) {
219
+ const matching = sample.correlation.traces.filter((trace) => trace.key === traceKey);
220
+ if (matching.length === 0)
221
+ continue;
222
+ const durations = matching.flatMap((trace) => trace.spans.filter((span) => span.key === spanKey).map((span) => span.durationMs));
223
+ const value = median(durations);
224
+ if (value !== null)
225
+ values.push(value);
226
+ }
227
+ return values;
228
+ }
229
+ function queryDurationValues(side, traceKey, queryKey) {
230
+ const values = [];
231
+ let nulls = 0;
232
+ for (const sample of side.verified) {
233
+ const matching = sample.correlation.traces.filter((trace) => trace.key === traceKey);
234
+ if (matching.length === 0)
235
+ continue;
236
+ const durations = [];
237
+ for (const query of matching.flatMap((trace) => trace.queries)) {
238
+ if (query.key !== queryKey)
239
+ continue;
240
+ if (query.durationMs === null)
241
+ nulls += 1;
242
+ else
243
+ durations.push(query.durationMs);
244
+ }
245
+ const value = median(durations);
246
+ if (value !== null)
247
+ values.push(value);
248
+ }
249
+ return { values, nulls };
250
+ }
251
+ function findingCounts(side) {
252
+ const counts = new Map();
253
+ for (const sample of side.verified) {
254
+ for (const finding of sample.findings) {
255
+ counts.set(finding.key, (counts.get(finding.key) ?? 0) + 1);
256
+ }
257
+ }
258
+ if (counts.size === 0) {
259
+ for (const finding of side.findings.values())
260
+ counts.set(finding.key, 1);
261
+ }
262
+ return counts;
263
+ }
264
+ function metricWorstSeverity(metrics) {
265
+ let severity = 'none';
266
+ for (const metric of metrics) {
267
+ if (metric.status === 'regressed' &&
268
+ (SEVERITY_RANK[metric.severity] ?? 0) > (SEVERITY_RANK[severity] ?? 0)) {
269
+ severity = metric.severity;
270
+ }
271
+ }
272
+ return severity;
273
+ }
274
+ function compareScenario(input) {
275
+ const baseline = aggregate(input.baseline);
276
+ const candidate = aggregate(input.candidate);
277
+ const scenarioId = input.baseline?.identity.id ?? input.candidate?.identity.id ?? 'scn-0000000000000000';
278
+ const identity = input.candidate?.identity ?? input.baseline?.identity;
279
+ const reasons = [];
280
+ const metrics = [];
281
+ const forceInconclusive = [];
282
+ if (!input.environmentCompatible && !input.environmentIgnored) {
283
+ forceInconclusive.push('environment-mismatch');
284
+ }
285
+ if (input.candidateStatus !== 'completed') {
286
+ forceInconclusive.push(`candidate-run-${input.candidateStatus}`);
287
+ }
288
+ if (!input.baseline) {
289
+ forceInconclusive.push('no-baseline-scenario');
290
+ }
291
+ if (!input.candidate) {
292
+ forceInconclusive.push('scenario-missing-from-candidate');
293
+ }
294
+ if (baseline.incomplete.length > 0) {
295
+ forceInconclusive.push(`baseline-incomplete-samples:${baseline.incomplete.length}`);
296
+ }
297
+ if (candidate.incomplete.length > 0) {
298
+ forceInconclusive.push(`candidate-incomplete-samples:${candidate.incomplete.length}`);
299
+ }
300
+ if (baseline.verified.length < input.options.minSamples) {
301
+ forceInconclusive.push(`baseline-insufficient-samples:${baseline.verified.length}<${input.options.minSamples}`);
302
+ }
303
+ if (candidate.verified.length < input.options.minSamples) {
304
+ forceInconclusive.push(`candidate-insufficient-samples:${candidate.verified.length}<${input.options.minSamples}`);
305
+ }
306
+ if (baseline.variableTraceShape)
307
+ forceInconclusive.push('baseline-variable-trace-shape');
308
+ if (candidate.variableTraceShape)
309
+ forceInconclusive.push('candidate-variable-trace-shape');
310
+ const baselineKeys = [...baseline.traceKeys].sort(compareStrings);
311
+ const candidateKeys = [...candidate.traceKeys].sort(compareStrings);
312
+ if (baselineKeys.join('\u0000') !== candidateKeys.join('\u0000')) {
313
+ const missing = baselineKeys.filter((key) => !candidate.traceKeys.has(key));
314
+ const added = candidateKeys.filter((key) => !baseline.traceKeys.has(key));
315
+ if (missing.length > 0)
316
+ reasons.push(`baseline-trace-missing-from-candidate:${missing.length}`);
317
+ if (added.length > 0)
318
+ reasons.push(`candidate-trace-not-in-baseline:${added.length}`);
319
+ }
320
+ if (forceInconclusive.length === 0) {
321
+ const baselineSpanCounts = countPerSample(baseline, null, (traces) => traces.reduce((sum, trace) => sum + trace.spanCount, 0));
322
+ const candidateSpanCounts = countPerSample(candidate, null, (traces) => traces.reduce((sum, trace) => sum + trace.spanCount, 0));
323
+ const baselineQueryCounts = countPerSample(baseline, null, (traces) => traces.reduce((sum, trace) => sum + trace.databaseQueryCount, 0));
324
+ const candidateQueryCounts = countPerSample(candidate, null, (traces) => traces.reduce((sum, trace) => sum + trace.databaseQueryCount, 0));
325
+ const baselineErrorCounts = countPerSample(baseline, null, (traces) => traces.reduce((sum, trace) => sum + trace.errorCount, 0));
326
+ const candidateErrorCounts = countPerSample(candidate, null, (traces) => traces.reduce((sum, trace) => sum + trace.errorCount, 0));
327
+ const scenarioSampleCount = Math.min(baseline.verified.length, candidate.verified.length);
328
+ metrics.push(durationMetric({
329
+ key: 'scenario:duration',
330
+ label: 'Scenario request duration',
331
+ baselineValues: perSampleValues(baseline, null, (traces) => traces.map((trace) => trace.durationMs)),
332
+ candidateValues: perSampleValues(candidate, null, (traces) => traces.map((trace) => trace.durationMs)),
333
+ minSamples: input.options.minSamples,
334
+ options: input.options,
335
+ }), countMetric({
336
+ key: 'scenario:spans',
337
+ label: 'Spans per sample',
338
+ kind: 'count',
339
+ baselineValue: median(baselineSpanCounts) ?? 0,
340
+ candidateValue: median(candidateSpanCounts) ?? 0,
341
+ sampleCount: Math.min(baselineSpanCounts.length, candidateSpanCounts.length),
342
+ options: input.options,
343
+ }), countMetric({
344
+ key: 'scenario:queries',
345
+ label: 'Queries per sample',
346
+ kind: 'count',
347
+ baselineValue: median(baselineQueryCounts) ?? 0,
348
+ candidateValue: median(candidateQueryCounts) ?? 0,
349
+ sampleCount: Math.min(baselineQueryCounts.length, candidateQueryCounts.length),
350
+ options: input.options,
351
+ }), countMetric({
352
+ key: 'scenario:errors',
353
+ label: 'Errors per sample',
354
+ kind: 'error',
355
+ baselineValue: median(baselineErrorCounts) ?? 0,
356
+ candidateValue: median(candidateErrorCounts) ?? 0,
357
+ sampleCount: Math.min(baselineErrorCounts.length, candidateErrorCounts.length),
358
+ options: input.options,
359
+ }), countMetric({
360
+ key: 'scenario:failed-tests',
361
+ label: 'Failed samples',
362
+ kind: 'test-status',
363
+ baselineValue: baseline.verified.filter((sample) => ['failed', 'timedOut', 'interrupted'].includes(sample.status)).length,
364
+ candidateValue: candidate.verified.filter((sample) => ['failed', 'timedOut', 'interrupted'].includes(sample.status)).length,
365
+ sampleCount: scenarioSampleCount,
366
+ options: input.options,
367
+ }));
368
+ for (const traceKey of baselineKeys.filter((key) => candidate.traceKeys.has(key)).slice(0, 50)) {
369
+ const baselineTraceQueries = countPerSample(baseline, traceKey, (traces) => traces.reduce((sum, trace) => sum + trace.databaseQueryCount, 0));
370
+ const candidateTraceQueries = countPerSample(candidate, traceKey, (traces) => traces.reduce((sum, trace) => sum + trace.databaseQueryCount, 0));
371
+ metrics.push(durationMetric({
372
+ key: `trace:${traceKey}:duration`,
373
+ label: `Trace duration: ${traceKey}`,
374
+ baselineValues: perSampleValues(baseline, traceKey, (traces) => traces.map((trace) => trace.durationMs)),
375
+ candidateValues: perSampleValues(candidate, traceKey, (traces) => traces.map((trace) => trace.durationMs)),
376
+ minSamples: input.options.minSamples,
377
+ options: input.options,
378
+ }), countMetric({
379
+ key: `trace:${traceKey}:queries`,
380
+ label: `Queries: ${traceKey}`,
381
+ kind: 'count',
382
+ baselineValue: median(baselineTraceQueries) ?? 0,
383
+ candidateValue: median(candidateTraceQueries) ?? 0,
384
+ sampleCount: Math.min(baselineTraceQueries.length, candidateTraceQueries.length),
385
+ options: input.options,
386
+ }));
387
+ const baselineTraces = baseline.tracesByKey.get(traceKey) ?? [];
388
+ const candidateTraces = candidate.tracesByKey.get(traceKey) ?? [];
389
+ const baselineSpanKeys = spanKeySet(baselineTraces);
390
+ const candidateSpanKeys = spanKeySet(candidateTraces);
391
+ const spanKeys = [...baselineSpanKeys].sort(compareStrings);
392
+ const missingSpans = spanKeys.filter((key) => !candidateSpanKeys.has(key));
393
+ const addedSpans = [...candidateSpanKeys]
394
+ .filter((key) => !baselineSpanKeys.has(key))
395
+ .sort(compareStrings);
396
+ if (missingSpans.length > 0 || addedSpans.length > 0) {
397
+ reasons.push(`span-shape-changed:${traceKey}:${missingSpans.length} missing, ${addedSpans.length} added`);
398
+ }
399
+ for (const spanKey of spanKeys.filter((key) => candidateSpanKeys.has(key)).slice(0, 200)) {
400
+ metrics.push(durationMetric({
401
+ key: `span:${traceKey}:${spanKey}`,
402
+ label: `Span: ${spanKey}`,
403
+ baselineValues: traceSpanDurationValues(baseline, traceKey, spanKey),
404
+ candidateValues: traceSpanDurationValues(candidate, traceKey, spanKey),
405
+ minSamples: input.options.minSamples,
406
+ options: input.options,
407
+ }));
408
+ }
409
+ const queryKeys = new Set([...baselineTraces, ...candidateTraces].flatMap((trace) => trace.queries.map((query) => query.key)));
410
+ for (const queryKey of [...queryKeys].sort(compareStrings).slice(0, 100)) {
411
+ const baselineDurations = queryDurationValues(baseline, traceKey, queryKey);
412
+ const candidateDurations = queryDurationValues(candidate, traceKey, queryKey);
413
+ metrics.push(durationMetric({
414
+ key: `query-duration:${traceKey}:${queryKey}`,
415
+ label: `Query duration: ${queryKey.slice(0, 120)}`,
416
+ baselineValues: baselineDurations.values,
417
+ candidateValues: candidateDurations.values,
418
+ baselineNulls: baselineDurations.nulls,
419
+ candidateNulls: candidateDurations.nulls,
420
+ minSamples: input.options.minSamples,
421
+ options: input.options,
422
+ }));
423
+ }
424
+ }
425
+ const baselineFindings = findingCounts(baseline);
426
+ const candidateFindings = findingCounts(candidate);
427
+ const verifiedSampleCount = Math.min(baseline.verified.length, candidate.verified.length);
428
+ const findingKeys = [...new Set([...baselineFindings.keys(), ...candidateFindings.keys()])].sort(compareStrings);
429
+ for (const key of findingKeys.slice(0, 100)) {
430
+ const finding = baseline.findings.get(key) ?? candidate.findings.get(key);
431
+ metrics.push(countMetric({
432
+ key: `finding:${key}`,
433
+ label: `Diagnostic finding: ${finding?.ruleId ?? key}`,
434
+ kind: 'finding',
435
+ baselineValue: baselineFindings.get(key) ?? 0,
436
+ candidateValue: candidateFindings.get(key) ?? 0,
437
+ sampleCount: verifiedSampleCount,
438
+ options: input.options,
439
+ }));
440
+ }
441
+ }
442
+ const regressed = metrics.filter((metric) => metric.status === 'regressed');
443
+ const improved = metrics.filter((metric) => metric.status === 'improved');
444
+ const inconclusiveMetrics = metrics.filter((metric) => metric.status === 'inconclusive');
445
+ const blockingInconclusive = inconclusiveMetrics.filter((metric) => metric.unmeasured !== true);
446
+ const structuralChange = reasons.length > 0;
447
+ let status;
448
+ let severity = 'none';
449
+ if (forceInconclusive.length > 0) {
450
+ status = 'inconclusive';
451
+ reasons.unshift(...forceInconclusive);
452
+ }
453
+ else if (regressed.length > 0) {
454
+ status = 'regressed';
455
+ severity = metricWorstSeverity(regressed);
456
+ }
457
+ else if (structuralChange ||
458
+ (blockingInconclusive.length > 0 && improved.length === 0)) {
459
+ status = 'inconclusive';
460
+ }
461
+ else if (improved.length > 0) {
462
+ status = 'improved';
463
+ }
464
+ else {
465
+ status = 'unchanged';
466
+ }
467
+ return {
468
+ scenarioId,
469
+ title: identity?.title ?? 'Unknown scenario',
470
+ file: identity?.file ?? 'unknown.spec.ts',
471
+ project: identity?.project ?? 'default',
472
+ status,
473
+ severity,
474
+ reasons: [...new Set(reasons)].slice(0, 50),
475
+ metrics: metrics.slice(0, 1_000),
476
+ baseline: sideSummary(baseline),
477
+ candidate: sideSummary(candidate),
478
+ };
479
+ }
480
+ function summaryOf(scenarios) {
481
+ return {
482
+ scenarios: scenarios.length,
483
+ regressed: scenarios.filter((scenario) => scenario.status === 'regressed').length,
484
+ improved: scenarios.filter((scenario) => scenario.status === 'improved').length,
485
+ unchanged: scenarios.filter((scenario) => scenario.status === 'unchanged').length,
486
+ inconclusive: scenarios.filter((scenario) => scenario.status === 'inconclusive').length,
487
+ };
488
+ }
489
+ /**
490
+ * Compares a saved baseline with a candidate run. Ids and timestamps are never
491
+ * used to match scenarios or traces; matching uses the stored stable keys.
492
+ */
493
+ export function compareBaseline(baseline, candidate, options = {}, meta = {}) {
494
+ const resolved = comparisonOptionsSchema.parse({
495
+ ...DEFAULT_COMPARISON_OPTIONS,
496
+ ...options,
497
+ });
498
+ const differences = compareEnvironments(baseline.environment, candidate.environment);
499
+ if (baseline.projectName !== candidate.projectName) {
500
+ differences.push({
501
+ field: 'projectName',
502
+ baseline: baseline.projectName,
503
+ candidate: candidate.projectName,
504
+ });
505
+ differences.sort((a, b) => compareStrings(a.field, b.field));
506
+ }
507
+ const environmentCompatible = differences.length === 0;
508
+ const warnings = [];
509
+ if (!environmentCompatible && resolved.ignoreEnvironment) {
510
+ warnings.push('Environment differences were explicitly ignored. Results are reported but remain environment-sensitive.');
511
+ }
512
+ if (candidate.status !== 'completed') {
513
+ warnings.push(`Candidate run ${candidate.id} is ${candidate.status}; no regression verdict is inferred from it.`);
514
+ }
515
+ if (baseline.stats.incompleteSamples > 0) {
516
+ warnings.push(`Baseline ${baseline.id} contains ${baseline.stats.incompleteSamples} incomplete sample(s).`);
517
+ }
518
+ if (candidate.stats.incompleteSamples > 0) {
519
+ warnings.push(`Candidate ${candidate.id} contains ${candidate.stats.incompleteSamples} incomplete sample(s).`);
520
+ }
521
+ const baselineById = new Map(baseline.scenarios.map((scenario) => [scenario.identity.id, scenario]));
522
+ const candidateById = new Map(candidate.scenarios.map((scenario) => [scenario.identity.id, scenario]));
523
+ const scenarioIds = [...new Set([...baselineById.keys(), ...candidateById.keys()])].sort(compareStrings);
524
+ const scenarios = scenarioIds.map((id) => compareScenario({
525
+ baseline: baselineById.get(id) ?? null,
526
+ candidate: candidateById.get(id) ?? null,
527
+ options: resolved,
528
+ environmentCompatible,
529
+ environmentIgnored: resolved.ignoreEnvironment,
530
+ candidateStatus: candidate.status,
531
+ }));
532
+ const summary = summaryOf(scenarios);
533
+ let status;
534
+ let severity = 'none';
535
+ if (!environmentCompatible && !resolved.ignoreEnvironment) {
536
+ status = 'inconclusive';
537
+ }
538
+ else if (candidate.status !== 'completed') {
539
+ status = 'inconclusive';
540
+ }
541
+ else if (summary.regressed > 0) {
542
+ status = 'regressed';
543
+ severity = scenarios
544
+ .filter((scenario) => scenario.status === 'regressed')
545
+ .reduce((worst, scenario) => (SEVERITY_RANK[scenario.severity] ?? 0) > (SEVERITY_RANK[worst] ?? 0)
546
+ ? scenario.severity
547
+ : worst, 'none');
548
+ }
549
+ else if (summary.inconclusive > 0) {
550
+ status = 'inconclusive';
551
+ }
552
+ else if (summary.improved > 0) {
553
+ status = 'improved';
554
+ }
555
+ else {
556
+ status = 'unchanged';
557
+ }
558
+ return {
559
+ format: STACKNEXT_COMPARISON_FORMAT,
560
+ version: STACKNEXT_REGRESSION_FORMAT_VERSION,
561
+ id: meta.id ?? createComparisonId(),
562
+ projectName: candidate.projectName,
563
+ createdAt: meta.now ?? Date.now(),
564
+ baselineId: baseline.id,
565
+ candidateId: candidate.id,
566
+ status,
567
+ severity,
568
+ environment: {
569
+ compatible: environmentCompatible,
570
+ ignored: resolved.ignoreEnvironment,
571
+ differences: differences.slice(0, 50),
572
+ },
573
+ options: resolved,
574
+ summary,
575
+ scenarios,
576
+ warnings: [...new Set(warnings)].slice(0, 50),
577
+ limitations: [...REGRESSION_LIMITATIONS],
578
+ };
579
+ }
580
+ export function environmentDifferencesOf(comparison) {
581
+ return comparison.environment.differences;
582
+ }
583
+ //# sourceMappingURL=compare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compare.js","sourceRoot":"","sources":["../src/compare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export declare const STACKNEXT_RUN_FORMAT = "stacknext-test-run";
2
+ export declare const STACKNEXT_BASELINE_FORMAT = "stacknext-baseline";
3
+ export declare const STACKNEXT_COMPARISON_FORMAT = "stacknext-comparison";
4
+ export declare const STACKNEXT_REGRESSION_FORMAT_VERSION = 1;
5
+ export declare const STACKNEXT_REGRESSION_ENGINE_VERSION = "0.6.0";
6
+ export declare const RUN_STATUSES: readonly ["running", "completed", "failed", "interrupted", "incomplete"];
7
+ export type RunStatus = (typeof RUN_STATUSES)[number];
8
+ export declare const SAMPLE_STATUSES: readonly ["passed", "failed", "timedOut", "skipped", "interrupted"];
9
+ export type SampleStatus = (typeof SAMPLE_STATUSES)[number];
10
+ export declare const SAMPLE_EXPECTED_STATUSES: readonly ["passed", "failed", "skipped"];
11
+ export type SampleExpectedStatus = (typeof SAMPLE_EXPECTED_STATUSES)[number];
12
+ export declare const CORRELATION_STATUSES: readonly ["verified", "incomplete"];
13
+ export type CorrelationStatus = (typeof CORRELATION_STATUSES)[number];
14
+ export declare const REGRESSION_STATUSES: readonly ["improved", "regressed", "unchanged", "inconclusive"];
15
+ export type RegressionStatus = (typeof REGRESSION_STATUSES)[number];
16
+ export declare const REGRESSION_SEVERITIES: readonly ["high", "medium", "low", "none"];
17
+ export type RegressionSeverity = (typeof REGRESSION_SEVERITIES)[number];
18
+ export declare const REGRESSION_METRIC_KINDS: readonly ["duration", "count", "test-status", "error", "finding"];
19
+ export type RegressionMetricKind = (typeof REGRESSION_METRIC_KINDS)[number];
20
+ export declare const REGRESSION_ID_PATTERN: RegExp;
21
+ export declare const SCENARIO_ID_PATTERN: RegExp;
22
+ export declare const SAMPLE_ID_PATTERN: RegExp;
23
+ export declare const DEFAULT_COMPARISON_OPTIONS: {
24
+ readonly minSamples: 3;
25
+ readonly durationRegressionPct: 20;
26
+ readonly durationRegressionMs: 25;
27
+ readonly durationImprovementPct: 20;
28
+ readonly durationImprovementMs: 25;
29
+ readonly countRegressionMin: 1;
30
+ readonly ignoreEnvironment: false;
31
+ };
32
+ export declare const REGRESSION_LIMITATIONS: readonly ["Comparisons use only telemetry correlated to Playwright scenario samples in the captured run.", "Durations are wall-clock measurements from the local run and include machine and dev-server noise.", "Medians reduce noise but are not a statistical significance test; StackNext makes no significance claim.", "Null database durations are unmeasured and are never converted to zero.", "A baseline or candidate with missing samples, incomplete correlation or a changed trace shape is inconclusive by default.", "Environment differences such as Node.js, Next.js, OS, runtime, database, instrumentation or verbose tracing make a comparison inconclusive unless explicitly overridden."];
33
+ //# sourceMappingURL=constants.d.ts.map