Skip to content

Commit 589a5a1

Browse files
Yerazeclaude
andcommitted
chore(lint): detect fully-fixed files in ratchet advisory (#3962)
Add a second pass in compare() that scans baseline entries missing from the current lint output (file became fully clean). Without this pass, advisory messages only fire when a file still has *some* violation but fewer than baseline — completely-fixed files were silently ignored. Also add a Vitest unit test covering the fully-fixed-file advisory case. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01AphLfgUJWaFNAgU5UXdJ4n
1 parent 8ccb018 commit 589a5a1

2 files changed

Lines changed: 18 additions & 0 deletions

File tree

scripts/lint-ratchet.mjs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,15 @@ export function compare(counts, base, lines = {}) {
9090
}
9191
}
9292
}
93+
// Detect baseline files/rules that have dropped to zero entirely
94+
// (file no longer appears in counts, but baseline had violations).
95+
for (const [file, rules] of Object.entries(base)) {
96+
for (const [rule, prev] of Object.entries(rules)) {
97+
if (prev > 0 && (counts[file]?.[rule] ?? 0) === 0) {
98+
advisories.push(`${file}: ${rule} ${prev}→0`);
99+
}
100+
}
101+
}
93102
return { failures, advisories };
94103
}
95104

scripts/lint-ratchet.test.mjs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,15 @@ describe('compare()', () => {
4545
expect(advisories[0]).toMatch(/31/);
4646
});
4747

48+
it('generates advisory when a file is entirely absent from current counts (fully fixed)', () => {
49+
const counts = {}; // file completely clean now
50+
const base = { 'src/clean.ts': { 'no-unused-vars': 2 } };
51+
const { failures, advisories } = compare(counts, base, {});
52+
expect(failures).toHaveLength(0);
53+
expect(advisories).toHaveLength(1);
54+
expect(advisories[0]).toMatch(/20/);
55+
});
56+
4857
it('handles multiple files and rules independently', () => {
4958
const counts = {
5059
'a.ts': { 'no-unused-vars': 2, '@typescript-eslint/no-explicit-any': 1 },

0 commit comments

Comments
 (0)