| 61 | // ── Verdict loading ─────────────────────────────────────────────────────────── |
| 62 | |
| 63 | function loadLatestVerdicts() { |
| 64 | if (!fs.existsSync(AUDIT_DIR)) return []; |
| 65 | const files = fs.readdirSync(AUDIT_DIR).filter(f => /^judge-verdicts-.*\.json$/.test(f)).sort(); |
| 66 | if (files.length === 0) return []; |
| 67 | try { |
| 68 | const data = JSON.parse(fs.readFileSync(path.join(AUDIT_DIR, files[files.length - 1]), 'utf8')); |
| 69 | return data.merged || []; |
| 70 | } catch { return []; } |
| 71 | } |
| 72 | |
| 73 | /** |
| 74 | * Build the ablation edit for a candidate: { lineNo, action, trimmed_line }. |