# Баг: наставник GO с пустым `recommendation` → судья не вызывается (`no_mentor_go`) **Дата:** 16.06.2026. **Где:** машинерия стены «роутер-наставник», оркестратор `enforce-mentor-then-judge` (наставник → судья). **Severity:** блокирующий печать — план с чистым GO не опечатывается. **Куда:** проект **claude-brain** (управляющий слой). ## Симптом При записи опечатываемого плана наставник (Agent mentor, модель `deepseek-v4-pro`) возвращает чистый GO без замечаний: ```json { "plan_points_addressed": [...], "reasoning": "...", "recommendation": "", "confidence": 0.95, "decision": "GO" } ``` Оркестратор применяет проверку-содержательности вердикта, видит **пустой слот `recommendation`** и помечает вердикт несодержательным → `no_mentor_go` → **судья НЕ вызывается** → план не печатается. В логе: `несодержательный вердикт: пустые слоты [recommendation]` + `⏭ пропуск (no_mentor_go)`. ## Корень Проверка-содержательности (введена M4-аудитом: «слот вердикта обязан быть непустой строкой, `{}` больше не содержателен») применяется **одинаково** к GO и NO-GO. Для NO-GO непустой `recommendation`/objection логичен. Для **GO** пустой `recommendation` — нормальное состояние (плану нечего рекомендовать), но проверка его отбраковывает → валидный GO теряется → судья пропускается → печать не встаёт. Дефект делает невозможной печать «идеального» плана, к которому у наставника нет замечаний. ## Воспроизведение 1. Записать чистый, корректный опечатываемый план (без спорных мест). 2. Наставник возвращает `decision:GO` с `recommendation:""`. 3. Печать не встаёт; в логе `no_mentor_go`, судья не вызывался. **Обход (подтверждён 16.06):** добавить в `## Переговоры` плана круг, прямо приглашающий наставника записать forward-`recommendation` (напр. «при одобрении зафиксируй в recommendation указание исполнителю …»). Тогда слот непуст → судья вызывается → печать встаёт. Это костыль уровня контроллера, не лечит корень. ## Предлагаемый фикс (корень) Сделать проверку-содержательности **decision-aware**: - `decision === 'GO'` → пустой `recommendation` **допустим** (достаточно непустого `reasoning` и/или `plan_points_addressed`); вердикт содержателен. - `decision === 'NO-GO'` → требовать непустой `recommendation`/objection (как сейчас). ## Где искать в коде Слой, считающий `no_mentor_go` и проверяющий содержательность вердикта наставника: `mentor-verdict.mjs` / `judge-orchestrator.mjs` / `enforce-mentor-then-judge.mjs`. Искать проверку пустых слотов вердикта (`пустые слоты`, `no_mentor_go`). ## Доказательство (лог AITUNNEL) 16.06.2026 14:17:32, эндпоинт `/v1/messages`, модель `deepseek-v4-pro`, ключ «Agent mentor», ответ ASSISTANT: `"decision": "GO"`, `"confidence": 0.95`, `"recommendation": ""`, `plan_points_addressed` заполнен (обе претензии сняты) → оркестратор: `no_mentor_go`, судья не вызван. На следующей итерации плана с Переговоры-кругом, приглашающим recommendation, наставник вернул GO с непустым `recommendation` → судья вызвался → план опечатан. ## Связанная находка (для того же разбора) Десинк **criterion-gate**: `enforce-supreme-gate` удаляет frozen-plan на совпадении **последнего** шага плана раньше, чем `enforce-criterion-gate` (со-хук) проверит `frozenPlanValid` → ложный блок git push «кодовое изменение без валидного запечатанного плана». Лечится не-терминальным мутирующим шагом, но корень — порядок хуков (supreme-gate не должен удалять печать, если со-хук в той же цепочке блокнёт действие). Тот же класс, что F-J.