#!/usr/bin/env node
/**
 * judge-slop-counter (§9.5) — частота халтуры судьи: голые ГО / тонкие вердикты /
 * пропуски линзы. Чистая функция над списком вердиктов (каждый уже несёт missing[]/
 * trivial[] из validateVerdictSlots). Живой источник (лог J8) вшивается в 4-E/4-F;
 * здесь — детерминированный счёт + флаг по порогу. Ловит систематическую штамповку
 * (не качество одного вердикта — это оценщик постфактум 4-F/D31).
 */
const DEFAULT_THRESHOLD = 0.3;

export function computeSlopStats(verdicts = [], { threshold = DEFAULT_THRESHOLD } = {}) {
  const total = verdicts.length;
  let lensSkips = 0, thinVerdicts = 0, dirty = 0, clean = 0;
  for (const v of verdicts) {
    // H (аудит M1-M4): битый/отсутствующий вердикт не роняет счёт и считается халтурой
    // (безопасная сторона: больше флага, не меньше). Раньше v.missing на null → краш.
    if (!v || typeof v !== 'object') { dirty++; continue; }
    const hasMissing = Array.isArray(v.missing) && v.missing.length > 0;
    const hasTrivial = Array.isArray(v.trivial) && v.trivial.length > 0;
    if (hasMissing) lensSkips++;
    if (hasTrivial) thinVerdicts++;
    if (hasMissing || hasTrivial) dirty++; else clean++;
  }
  const slopRate = total ? dirty / total : 0;
  return { total, lensSkips, thinVerdicts, clean, slopRate, flag: total > 0 && slopRate > threshold };
}
