5.2 KiB
Баг: наставник GO с пустым recommendation → судья не вызывается (no_mentor_go)
Дата: 16.06.2026. Где: машинерия стены «роутер-наставник», оркестратор
enforce-mentor-then-judge (наставник → судья). Severity: блокирующий печать — план с
чистым GO не опечатывается. Куда: проект claude-brain (управляющий слой).
Симптом
При записи опечатываемого плана наставник (Agent mentor, модель deepseek-v4-pro)
возвращает чистый GO без замечаний:
{ "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 теряется
→ судья пропускается → печать не встаёт. Дефект делает невозможной печать «идеального» плана,
к которому у наставника нет замечаний.
Воспроизведение
- Записать чистый, корректный опечатываемый план (без спорных мест).
- Наставник возвращает
decision:GOсrecommendation:"". - Печать не встаёт; в логе
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.