import { describe, it, expect } from 'vitest'; import { judgeSurfaceReason } from './enforce-judge-gate.mjs'; describe('judgeSurfaceReason — возражения судьи доходят до показа вердикта', () => { it('NO-GO без reason/recommendation → дословные возражения (formatJudgeObjection)', () => { const verdict = { decision: 'NO-GO', verdict: { objections: [ { anchor: { ref: 'delivery=internal при пользовательском результате' }, severity: 'heavy' }, { anchor: { ref: 'позиция вставки без строк-якорей' }, severity: 'light' }, ] } }; const r = judgeSurfaceReason(verdict); expect(r).toContain('delivery=internal'); expect(r).toContain('[heavy]'); expect(r).toContain('позиция вставки'); }); it('явный reason имеет приоритет', () => { expect(judgeSurfaceReason({ reason: 'прямая причина', verdict: { objections: [{ anchor: { ref: 'x' }, severity: 'light' }] } })) .toBe('прямая причина'); }); it('recommendation (если есть) используется как причина', () => { expect(judgeSurfaceReason({ verdict: { recommendation: 'делай Y' } })).toBe('делай Y'); }); it('нет ни reason, ни возражений → пустая строка (без падения)', () => { expect(judgeSurfaceReason({ verdict: {} })).toBe(''); expect(judgeSurfaceReason(null)).toBe(''); }); });