@mmnto/totem 1.16.1 → 1.17.1

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,572 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { toSeverityBucket } from './recurrence-stats.js';
3
+ import { buildStopConditions, classifyFinding, computeDedupRate, groupFindingsByRound, RETROSPECT_ROUTE_OUT_REASONS, RetrospectClassificationSchema, RetrospectFindingSchema, RetrospectReportSchema, RetrospectRoundSchema, signatureOfBody, toCrossPrBucket, toRoundPosition, } from './retrospect.js';
4
+ function makeFinding(overrides = {}) {
5
+ const base = {
6
+ signature: '0123456789abcdef',
7
+ tool: 'coderabbit',
8
+ severityBucket: 'medium',
9
+ bodyExcerpt: 'a finding',
10
+ file: 'src/x.ts',
11
+ line: 10,
12
+ roundNumber: 1,
13
+ crossPrRecurrence: 0,
14
+ coveredByRule: false,
15
+ };
16
+ const classification = overrides.classification ?? 'in-pr-fix';
17
+ const merged = {
18
+ ...base,
19
+ ...overrides,
20
+ classification,
21
+ };
22
+ if (classification === 'route-out') {
23
+ return {
24
+ ...merged,
25
+ classification: 'route-out',
26
+ routeOutReason: overrides.routeOutReason ?? 'covered by existing compiled rule',
27
+ };
28
+ }
29
+ // in-pr-fix and undetermined forbid routeOutReason; strip if present.
30
+ const { routeOutReason: _, ...rest } = merged;
31
+ void _;
32
+ return { ...rest, classification };
33
+ }
34
+ // ─── Schemas ──────────────────────────────────────────
35
+ describe('RetrospectFindingSchema discriminated union (CR mmnto-ai/totem#1734 R2)', () => {
36
+ it('accepts a route-out finding with a catalog reason', () => {
37
+ const result = RetrospectFindingSchema.safeParse(makeFinding({ classification: 'route-out' }));
38
+ expect(result.success).toBe(true);
39
+ });
40
+ it('rejects a route-out finding without routeOutReason', () => {
41
+ const finding = makeFinding({ classification: 'route-out' });
42
+ // Strip routeOutReason → schema must reject.
43
+ const { routeOutReason: _, ...stripped } = finding;
44
+ void _;
45
+ const result = RetrospectFindingSchema.safeParse(stripped);
46
+ expect(result.success).toBe(false);
47
+ });
48
+ it('rejects a route-out finding with a routeOutReason outside the catalog', () => {
49
+ const result = RetrospectFindingSchema.safeParse({
50
+ ...makeFinding({ classification: 'route-out' }),
51
+ routeOutReason: 'arbitrary prose not in the enum',
52
+ });
53
+ expect(result.success).toBe(false);
54
+ });
55
+ it('rejects an in-pr-fix finding that carries a routeOutReason', () => {
56
+ const result = RetrospectFindingSchema.safeParse({
57
+ ...makeFinding({ classification: 'in-pr-fix' }),
58
+ routeOutReason: 'covered by existing compiled rule',
59
+ });
60
+ expect(result.success).toBe(false);
61
+ });
62
+ it('rejects an undetermined finding that carries a routeOutReason', () => {
63
+ const result = RetrospectFindingSchema.safeParse({
64
+ ...makeFinding({ classification: 'undetermined' }),
65
+ routeOutReason: 'covered by existing compiled rule',
66
+ });
67
+ expect(result.success).toBe(false);
68
+ });
69
+ });
70
+ describe('RetrospectRoundSchema', () => {
71
+ it('parses a well-formed round', () => {
72
+ const result = RetrospectRoundSchema.safeParse({
73
+ roundNumber: 1,
74
+ submittedAt: '2026-04-29T00:00:00.000Z',
75
+ headSha: 'abc123',
76
+ findingCount: 4,
77
+ });
78
+ expect(result.success).toBe(true);
79
+ });
80
+ it('rejects roundNumber < 1', () => {
81
+ const result = RetrospectRoundSchema.safeParse({
82
+ roundNumber: 0,
83
+ submittedAt: 'x',
84
+ findingCount: 0,
85
+ });
86
+ expect(result.success).toBe(false);
87
+ });
88
+ it('accepts a missing headSha', () => {
89
+ const result = RetrospectRoundSchema.safeParse({
90
+ roundNumber: 2,
91
+ submittedAt: '2026-04-29T00:00:00.000Z',
92
+ findingCount: 0,
93
+ });
94
+ expect(result.success).toBe(true);
95
+ });
96
+ });
97
+ describe('RetrospectClassificationSchema', () => {
98
+ it.each(['route-out', 'in-pr-fix', 'undetermined'])('accepts %s', (v) => {
99
+ expect(RetrospectClassificationSchema.safeParse(v).success).toBe(true);
100
+ });
101
+ it('rejects unknown classification', () => {
102
+ expect(RetrospectClassificationSchema.safeParse('block').success).toBe(false);
103
+ });
104
+ });
105
+ describe('RetrospectFindingSchema', () => {
106
+ it('parses a route-out finding with reason', () => {
107
+ const result = RetrospectFindingSchema.safeParse(makeFinding({
108
+ classification: 'route-out',
109
+ routeOutReason: RETROSPECT_ROUTE_OUT_REASONS.COVERED_BY_RULE,
110
+ }));
111
+ expect(result.success).toBe(true);
112
+ });
113
+ it('rejects negative crossPrRecurrence', () => {
114
+ const result = RetrospectFindingSchema.safeParse(makeFinding({ crossPrRecurrence: -1 }));
115
+ expect(result.success).toBe(false);
116
+ });
117
+ });
118
+ describe('RetrospectReportSchema', () => {
119
+ it('parses a minimal empty report', () => {
120
+ const empty = {
121
+ version: 1,
122
+ prNumber: '1713',
123
+ prState: 'open',
124
+ generatedAt: '2026-04-29T00:00:00.000Z',
125
+ threshold: 5,
126
+ substrateAvailable: false,
127
+ compiledRulesAvailable: false,
128
+ rounds: [],
129
+ totalFindings: 0,
130
+ dedupRate: 0,
131
+ findingDistribution: { byTool: {}, bySeverity: {}, byClassification: {} },
132
+ routeOutCandidates: [],
133
+ inPrFixes: [],
134
+ undetermined: [],
135
+ stopConditions: [],
136
+ overrideEventsObserved: 0,
137
+ };
138
+ expect(RetrospectReportSchema.safeParse(empty).success).toBe(true);
139
+ });
140
+ it('rejects version != 1', () => {
141
+ const bad = {
142
+ version: 2,
143
+ prNumber: '1',
144
+ prState: 'open',
145
+ generatedAt: 'x',
146
+ threshold: 5,
147
+ substrateAvailable: false,
148
+ compiledRulesAvailable: false,
149
+ rounds: [],
150
+ totalFindings: 0,
151
+ dedupRate: 0,
152
+ findingDistribution: { byTool: {}, bySeverity: {}, byClassification: {} },
153
+ routeOutCandidates: [],
154
+ inPrFixes: [],
155
+ undetermined: [],
156
+ stopConditions: [],
157
+ overrideEventsObserved: 0,
158
+ };
159
+ expect(RetrospectReportSchema.safeParse(bad).success).toBe(false);
160
+ });
161
+ });
162
+ // ─── toRoundPosition / toCrossPrBucket ─────────────────
163
+ describe('toRoundPosition', () => {
164
+ it.each([
165
+ [1, 'early'],
166
+ [3, 'early'],
167
+ [4, 'mid'],
168
+ [9, 'mid'],
169
+ [10, 'late'],
170
+ [50, 'late'],
171
+ ])('round %i → %s', (round, expected) => {
172
+ expect(toRoundPosition(round)).toBe(expected);
173
+ });
174
+ });
175
+ describe('toCrossPrBucket', () => {
176
+ it.each([
177
+ [0, 'none'],
178
+ [1, 'some'],
179
+ [2, 'some'],
180
+ [3, 'frequent'],
181
+ [99, 'frequent'],
182
+ ])('crossPrRecurrence %i → %s', (n, expected) => {
183
+ expect(toCrossPrBucket(n)).toBe(expected);
184
+ });
185
+ });
186
+ // ─── classifyFinding (table-driven cube) ──────────────
187
+ describe('classifyFinding', () => {
188
+ // Exhaustive cube over (severity, roundPosition-anchor, crossPrRecurrence-anchor, coveredByRule).
189
+ // Each row encodes the EXPECTED outcome for the bucket combination,
190
+ // not the literal round number — we pick a representative round per
191
+ // bucket (early=2, mid=6, late=12) and a representative recurrence
192
+ // count per bucket (none=0, some=1, frequent=5).
193
+ const cube = [
194
+ // critical / high — always in-pr-fix regardless of other axes.
195
+ ['critical', 2, 0, false, 'in-pr-fix'],
196
+ ['critical', 12, 5, true, 'in-pr-fix'],
197
+ ['high', 2, 0, false, 'in-pr-fix'],
198
+ ['high', 12, 5, true, 'in-pr-fix'],
199
+ // medium — late + covered → route-out; else in-pr-fix.
200
+ ['medium', 12, 0, true, 'route-out'],
201
+ ['medium', 12, 0, false, 'in-pr-fix'],
202
+ ['medium', 6, 0, true, 'in-pr-fix'],
203
+ ['medium', 2, 0, false, 'in-pr-fix'],
204
+ // low / nit early/mid — in-pr-fix unless rule-covered (low only).
205
+ ['low', 2, 0, false, 'in-pr-fix'],
206
+ ['low', 6, 0, false, 'in-pr-fix'],
207
+ ['low', 2, 0, true, 'route-out'],
208
+ ['nit', 2, 0, false, 'in-pr-fix'],
209
+ ['nit', 6, 0, true, 'in-pr-fix'], // nit early/mid never routes out via coverage
210
+ // low / nit late — route-out via covered, frequent, or LOW_NIT_LATE default.
211
+ ['low', 12, 0, true, 'route-out'],
212
+ ['low', 12, 5, false, 'route-out'],
213
+ ['low', 12, 0, false, 'route-out'],
214
+ ['nit', 12, 0, true, 'route-out'],
215
+ ['nit', 12, 5, false, 'route-out'],
216
+ ['nit', 12, 0, false, 'route-out'],
217
+ ];
218
+ it.each(cube)('severity=%s round=%i crossPr=%i covered=%s → %s', (severityBucket, roundNumber, crossPrRecurrence, coveredByRule, expected) => {
219
+ const out = classifyFinding({
220
+ severityBucket,
221
+ roundNumber,
222
+ crossPrRecurrence,
223
+ coveredByRule,
224
+ });
225
+ expect(out.classification).toBe(expected);
226
+ });
227
+ it('emits COVERED_BY_RULE reason when low/nit late + covered', () => {
228
+ const out = classifyFinding({
229
+ severityBucket: 'low',
230
+ roundNumber: 12,
231
+ crossPrRecurrence: 0,
232
+ coveredByRule: true,
233
+ });
234
+ expect(out.routeOutReason).toBe(RETROSPECT_ROUTE_OUT_REASONS.COVERED_BY_RULE);
235
+ });
236
+ it('emits FREQUENT_CROSS_PR reason when low/nit late + frequent uncovered', () => {
237
+ const out = classifyFinding({
238
+ severityBucket: 'nit',
239
+ roundNumber: 12,
240
+ crossPrRecurrence: 5,
241
+ coveredByRule: false,
242
+ });
243
+ expect(out.routeOutReason).toBe(RETROSPECT_ROUTE_OUT_REASONS.FREQUENT_CROSS_PR);
244
+ });
245
+ it('emits LOW_NIT_LATE reason when low/nit late, uncovered, not frequent', () => {
246
+ const out = classifyFinding({
247
+ severityBucket: 'low',
248
+ roundNumber: 12,
249
+ crossPrRecurrence: 1,
250
+ coveredByRule: false,
251
+ });
252
+ expect(out.routeOutReason).toBe(RETROSPECT_ROUTE_OUT_REASONS.LOW_NIT_LATE);
253
+ });
254
+ it('emits RULE_COVERED_LATE reason when medium late + covered', () => {
255
+ const out = classifyFinding({
256
+ severityBucket: 'medium',
257
+ roundNumber: 12,
258
+ crossPrRecurrence: 0,
259
+ coveredByRule: true,
260
+ });
261
+ expect(out.routeOutReason).toBe(RETROSPECT_ROUTE_OUT_REASONS.RULE_COVERED_LATE);
262
+ });
263
+ it('returns no reason on in-pr-fix verdict', () => {
264
+ const out = classifyFinding({
265
+ severityBucket: 'critical',
266
+ roundNumber: 1,
267
+ crossPrRecurrence: 0,
268
+ coveredByRule: false,
269
+ });
270
+ expect(out.routeOutReason).toBeUndefined();
271
+ });
272
+ it('is deterministic — same inputs yield identical outputs across calls', () => {
273
+ const input = {
274
+ severityBucket: 'medium',
275
+ roundNumber: 12,
276
+ crossPrRecurrence: 0,
277
+ coveredByRule: true,
278
+ };
279
+ const a = classifyFinding(input);
280
+ const b = classifyFinding(input);
281
+ const c = classifyFinding(input);
282
+ expect(a).toEqual(b);
283
+ expect(b).toEqual(c);
284
+ });
285
+ });
286
+ // ─── groupFindingsByRound ─────────────────────────────
287
+ describe('groupFindingsByRound', () => {
288
+ it('collapses two reviews on the same head_sha into one round', () => {
289
+ const submissions = [
290
+ {
291
+ id: 1,
292
+ commit_id: 'sha-A',
293
+ submitted_at: '2026-04-29T01:00:00.000Z',
294
+ user_login: 'coderabbit[bot]',
295
+ },
296
+ {
297
+ id: 2,
298
+ commit_id: 'sha-A',
299
+ submitted_at: '2026-04-29T01:30:00.000Z',
300
+ user_login: 'gemini-code-assist[bot]',
301
+ },
302
+ ];
303
+ const counts = new Map([['sha-A', 4]]);
304
+ const rounds = groupFindingsByRound(submissions, counts);
305
+ expect(rounds).toHaveLength(1);
306
+ expect(rounds[0].roundNumber).toBe(1);
307
+ expect(rounds[0].headSha).toBe('sha-A');
308
+ expect(rounds[0].findingCount).toBe(4);
309
+ // Earliest of the two timestamps.
310
+ expect(rounds[0].submittedAt).toBe('2026-04-29T01:00:00.000Z');
311
+ });
312
+ it('separates reviews on different head_sha into distinct rounds', () => {
313
+ const submissions = [
314
+ { id: 1, commit_id: 'sha-A', submitted_at: '2026-04-29T01:00:00.000Z', user_login: 'cr' },
315
+ { id: 2, commit_id: 'sha-B', submitted_at: '2026-04-29T02:00:00.000Z', user_login: 'cr' },
316
+ { id: 3, commit_id: 'sha-C', submitted_at: '2026-04-29T03:00:00.000Z', user_login: 'cr' },
317
+ ];
318
+ const counts = new Map([
319
+ ['sha-A', 1],
320
+ ['sha-B', 2],
321
+ ['sha-C', 3],
322
+ ]);
323
+ const rounds = groupFindingsByRound(submissions, counts);
324
+ expect(rounds).toHaveLength(3);
325
+ expect(rounds.map((r) => r.headSha)).toEqual(['sha-A', 'sha-B', 'sha-C']);
326
+ expect(rounds.map((r) => r.roundNumber)).toEqual([1, 2, 3]);
327
+ expect(rounds.map((r) => r.findingCount)).toEqual([1, 2, 3]);
328
+ });
329
+ it('orders rounds by EARLIEST submitted_at per SHA', () => {
330
+ // sha-B first by timestamp, even though sha-A appears earlier in the array.
331
+ const submissions = [
332
+ { id: 10, commit_id: 'sha-A', submitted_at: '2026-04-29T05:00:00.000Z', user_login: 'cr' },
333
+ { id: 11, commit_id: 'sha-B', submitted_at: '2026-04-29T01:00:00.000Z', user_login: 'cr' },
334
+ ];
335
+ const counts = new Map();
336
+ const rounds = groupFindingsByRound(submissions, counts);
337
+ expect(rounds[0].headSha).toBe('sha-B');
338
+ expect(rounds[1].headSha).toBe('sha-A');
339
+ });
340
+ it('buckets reviews missing commit_id into a single synthetic round', () => {
341
+ const submissions = [
342
+ { id: 1, commit_id: null, submitted_at: '2026-04-29T01:00:00.000Z', user_login: 'cr' },
343
+ { id: 2, submitted_at: '2026-04-29T01:30:00.000Z', user_login: 'cr' },
344
+ ];
345
+ const counts = new Map([['', 2]]);
346
+ const rounds = groupFindingsByRound(submissions, counts);
347
+ expect(rounds).toHaveLength(1);
348
+ expect(rounds[0].headSha).toBeUndefined();
349
+ expect(rounds[0].findingCount).toBe(2);
350
+ });
351
+ it('returns an empty array when no submissions are provided', () => {
352
+ expect(groupFindingsByRound([], new Map())).toEqual([]);
353
+ });
354
+ it('handles a single submission with one finding', () => {
355
+ const submissions = [
356
+ { id: 1, commit_id: 'sha-X', submitted_at: '2026-04-29T01:00:00.000Z', user_login: 'cr' },
357
+ ];
358
+ const counts = new Map([['sha-X', 1]]);
359
+ const rounds = groupFindingsByRound(submissions, counts);
360
+ expect(rounds).toHaveLength(1);
361
+ expect(rounds[0].findingCount).toBe(1);
362
+ });
363
+ });
364
+ // ─── buildStopConditions ──────────────────────────────
365
+ describe('buildStopConditions', () => {
366
+ function reportShell(over) {
367
+ return {
368
+ rounds: [],
369
+ routeOutCandidates: [],
370
+ inPrFixes: [],
371
+ undetermined: [],
372
+ dedupRate: 0,
373
+ findingDistribution: { byTool: {}, bySeverity: {}, byClassification: {} },
374
+ ...over,
375
+ };
376
+ }
377
+ it('emits nothing on a totally empty report', () => {
378
+ expect(buildStopConditions(reportShell({}))).toEqual([]);
379
+ });
380
+ it('uses undetermined findings in the rule-covered ratio denominator (CR mmnto-ai/totem#1734 R2)', () => {
381
+ // 1 covered route-out + 0 inPrFixes + 2 uncovered undetermined → 33% covered.
382
+ // Pre-fix denominator excluded undetermined → 100% covered → false-fire.
383
+ const conditions = buildStopConditions(reportShell({
384
+ rounds: [{ roundNumber: 8, submittedAt: '2026-04-29T00:00:00.000Z', findingCount: 3 }],
385
+ routeOutCandidates: [
386
+ makeFinding({
387
+ roundNumber: 8,
388
+ coveredByRule: true,
389
+ classification: 'route-out',
390
+ signature: 'a',
391
+ }),
392
+ ],
393
+ undetermined: [
394
+ makeFinding({
395
+ roundNumber: 8,
396
+ coveredByRule: false,
397
+ classification: 'undetermined',
398
+ signature: 'b',
399
+ }),
400
+ makeFinding({
401
+ roundNumber: 8,
402
+ coveredByRule: false,
403
+ classification: 'undetermined',
404
+ signature: 'c',
405
+ }),
406
+ ],
407
+ }));
408
+ expect(conditions.find((c) => c.includes('covered by compiled rules'))).toBeUndefined();
409
+ });
410
+ it('emits the route-out follow-up suggestion with N=1 when one route-out candidate exists', () => {
411
+ const conditions = buildStopConditions(reportShell({
412
+ routeOutCandidates: [makeFinding({ classification: 'route-out' })],
413
+ }));
414
+ expect(conditions[0]).toContain('1 follow-up issue(s)');
415
+ });
416
+ it('emits the route-out follow-up suggestion with N=3 when three exist', () => {
417
+ const conditions = buildStopConditions(reportShell({
418
+ routeOutCandidates: [
419
+ makeFinding({ classification: 'route-out', signature: 'a' }),
420
+ makeFinding({ classification: 'route-out', signature: 'b' }),
421
+ makeFinding({ classification: 'route-out', signature: 'c' }),
422
+ ],
423
+ }));
424
+ expect(conditions[0]).toContain('3 follow-up issue(s)');
425
+ });
426
+ it('emits the rule-covered ratio suggestion when ≥ 50% of last round is covered', () => {
427
+ const lastRoundFindings = [
428
+ makeFinding({
429
+ roundNumber: 12,
430
+ coveredByRule: true,
431
+ classification: 'route-out',
432
+ signature: 'a',
433
+ }),
434
+ makeFinding({
435
+ roundNumber: 12,
436
+ coveredByRule: true,
437
+ classification: 'route-out',
438
+ signature: 'b',
439
+ }),
440
+ makeFinding({
441
+ roundNumber: 12,
442
+ coveredByRule: false,
443
+ classification: 'in-pr-fix',
444
+ signature: 'c',
445
+ }),
446
+ ];
447
+ const conditions = buildStopConditions(reportShell({
448
+ rounds: [
449
+ {
450
+ roundNumber: 12,
451
+ submittedAt: '2026-04-29T00:00:00.000Z',
452
+ findingCount: lastRoundFindings.length,
453
+ },
454
+ ],
455
+ routeOutCandidates: lastRoundFindings.filter((f) => f.classification === 'route-out'),
456
+ // inPrFixes is referenced inside buildStopConditions via the
457
+ // composed search; report shape here intentionally minimal
458
+ // because the helper only reads `routeOutCandidates +
459
+ // inPrFixes` for the ratio check.
460
+ }));
461
+ // The substring "covered by compiled rules" is the deterministic
462
+ // template fragment.
463
+ expect(conditions.some((c) => c.includes('covered by compiled rules'))).toBe(true);
464
+ });
465
+ it('does NOT emit the rule-covered ratio suggestion when < 50% of last round is covered', () => {
466
+ const conditions = buildStopConditions(reportShell({
467
+ rounds: [{ roundNumber: 12, submittedAt: '2026-04-29T00:00:00.000Z', findingCount: 4 }],
468
+ routeOutCandidates: [
469
+ makeFinding({ roundNumber: 12, coveredByRule: false, classification: 'route-out' }),
470
+ ],
471
+ }));
472
+ expect(conditions.find((c) => c.includes('covered by compiled rules'))).toBeUndefined();
473
+ });
474
+ it('emits the frequent-cross-PR suggestion only when ≥ 1 route-out has frequent recurrence', () => {
475
+ const withFrequent = buildStopConditions(reportShell({
476
+ routeOutCandidates: [
477
+ makeFinding({ classification: 'route-out', crossPrRecurrence: 5, signature: 'a' }),
478
+ ],
479
+ }));
480
+ expect(withFrequent.some((c) => c.includes('recur across other PRs'))).toBe(true);
481
+ const withoutFrequent = buildStopConditions(reportShell({
482
+ routeOutCandidates: [
483
+ makeFinding({ classification: 'route-out', crossPrRecurrence: 1, signature: 'b' }),
484
+ ],
485
+ }));
486
+ expect(withoutFrequent.find((c) => c.includes('recur across other PRs'))).toBeUndefined();
487
+ });
488
+ it('emits the dedup-rate suggestion when dedupRate ≥ 0.4', () => {
489
+ const conditions = buildStopConditions(reportShell({
490
+ dedupRate: 0.5,
491
+ rounds: [{ roundNumber: 1, submittedAt: 'x', findingCount: 0 }],
492
+ }));
493
+ expect(conditions.some((c) => c.includes('high dedup rate'))).toBe(true);
494
+ });
495
+ it('does NOT emit the dedup-rate suggestion when dedupRate < 0.4', () => {
496
+ const conditions = buildStopConditions(reportShell({
497
+ dedupRate: 0.1,
498
+ rounds: [{ roundNumber: 1, submittedAt: 'x', findingCount: 0 }],
499
+ }));
500
+ expect(conditions.find((c) => c.includes('high dedup rate'))).toBeUndefined();
501
+ });
502
+ });
503
+ // ─── computeDedupRate ─────────────────────────────────
504
+ describe('computeDedupRate', () => {
505
+ it('returns 0 on zero findings', () => {
506
+ expect(computeDedupRate([])).toBe(0);
507
+ });
508
+ it('returns 0 when all signatures are unique', () => {
509
+ expect(computeDedupRate([{ signature: 'a' }, { signature: 'b' }, { signature: 'c' }])).toBe(0);
510
+ });
511
+ it('returns 1 - 1/N when all findings share one signature', () => {
512
+ const dup = [{ signature: 'a' }, { signature: 'a' }, { signature: 'a' }, { signature: 'a' }];
513
+ // 1 unique / 4 total → dedupRate = 0.75
514
+ expect(computeDedupRate(dup)).toBeCloseTo(0.75, 6);
515
+ });
516
+ it('returns the mid value for partial duplication', () => {
517
+ // 2 unique / 4 total → 0.5
518
+ expect(computeDedupRate([
519
+ { signature: 'a' },
520
+ { signature: 'a' },
521
+ { signature: 'b' },
522
+ { signature: 'b' },
523
+ ])).toBeCloseTo(0.5, 6);
524
+ });
525
+ it('clamps to [0, 1]', () => {
526
+ const r = computeDedupRate([{ signature: 'x' }]);
527
+ expect(r).toBeGreaterThanOrEqual(0);
528
+ expect(r).toBeLessThanOrEqual(1);
529
+ });
530
+ });
531
+ // ─── signatureOfBody (cross-substrate parity) ─────────
532
+ describe('signatureOfBody', () => {
533
+ it('returns identical 16-char signatures for path/line variants', () => {
534
+ const a = signatureOfBody('Avoid using `any` in src/foo.ts:42 — prefer `unknown`.');
535
+ const b = signatureOfBody('Avoid using `any` in src/bar.ts:99 — prefer `unknown`.');
536
+ expect(a).toBe(b);
537
+ expect(a.length).toBe(16);
538
+ });
539
+ it('returns different signatures for genuinely different findings', () => {
540
+ const a = signatureOfBody('Avoid using `any` — prefer `unknown`.');
541
+ const b = signatureOfBody('Empty catch block.');
542
+ expect(a).not.toBe(b);
543
+ });
544
+ });
545
+ // ─── toSeverityBucket reused from recurrence-stats ───
546
+ describe('toSeverityBucket (re-used from recurrence-stats — single source of truth)', () => {
547
+ it.each([
548
+ ['coderabbit', 'critical', 'critical'],
549
+ ['coderabbit', 'major', 'high'],
550
+ ['coderabbit', 'minor', 'medium'],
551
+ ['coderabbit', 'whatever', 'low'],
552
+ ['gca', 'high', 'high'],
553
+ ['gca', 'medium', 'medium'],
554
+ ['gca', 'low', 'low'],
555
+ ['gca', 'unknown', 'low'],
556
+ ['override', 'anything', 'medium'],
557
+ // SARIF v2.1.0 §3.27.10 result.level vocabulary — explicit branch added for mmnto-ai/totem#1734 review-1.
558
+ ['sarif', 'error', 'high'],
559
+ ['sarif', 'warning', 'medium'],
560
+ ['sarif', 'note', 'low'],
561
+ ['sarif', 'none', 'low'],
562
+ ['sarif', 'unknown', 'low'],
563
+ ['unknown', 'critical', 'critical'],
564
+ ['unknown', 'major', 'high'],
565
+ ['unknown', 'warning', 'medium'],
566
+ ['unknown', 'info', 'low'],
567
+ ['unknown', 'whatever', 'nit'],
568
+ ])('tool=%s severity=%s → %s', (tool, severity, expected) => {
569
+ expect(toSeverityBucket(tool, severity)).toBe(expected);
570
+ });
571
+ });
572
+ //# sourceMappingURL=retrospect.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retrospect.test.js","sourceRoot":"","sources":["../src/retrospect.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmnto/totem",
3
- "version": "1.16.1",
3
+ "version": "1.17.1",
4
4
  "description": "Persistent memory and context layer for AI agents",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",