// Score de risque d'un hunk. Le but n'est pas de noter le style, c'est de // dire a un relecteur ou regarder en premier quand il a peu de contexte. import type { Hunk } from './hunks'; export interface Risk { score: number; reasons: string[]; } export function scoreHunk(hunk: Hunk): Risk { const reasons: string[] = []; let score = 0; // Un changement de comportement sans changement de test est le motif que // les relecteurs, agents comme humains, ratent le plus souvent. if (hunk.touchesPublicApi && !hunk.touchesTests) { score += 40; reasons.push('public behaviour changed, no test delta'); } if (hunk.touchesAuth) { score += 30; reasons.push('auth surface'); } // Un lockfile seul ne merite pas de reveiller qui que ce soit. if (hunk.isLockfileOnly) { return { score: 0, reasons: ['lockfile only'] }; } // Renommer ou commenter n'est pas risque, et gonfler le score sur ces // hunks noie le signal utile. if (hunk.isRenameOnly || hunk.isCommentOnly) { score = Math.min(score, 5); reasons.push('rename or comment only'); } return { score: Math.min(score, 100), reasons }; }