# Наставник видит доводы контроллера и переоценивает текущий план (Фикс 2b)

## Цель

Наставник на каждом круге должен видеть доводы контроллера из раздела «Переговоры» плана (его
позицию по кругам) и быть прямо обязан переоценить ТЕКУЩИЙ план: проверить, сняты ли его прошлые
претензии, и не тащить уже снятое. Это чинит F-C (наставник тащил устаревшее возражение, не
переоценив текущий контент). Свои прошлые претензии наставник уже видит через журнал переговоров
(`renderNegotiation`); не хватает доводов контроллера и инструкции переоценки.

## Записи контроллера для журнала переговоров {#D1}

Новый модуль `tools/controller-negotiation.mjs`: из контента плана извлекает раздел «Переговоры»
(`parseNegotiationSection`) и возвращает записи журнала вида `{round, side:'controller',
utterance:<позиция дословно>, justification:''}`, пригодные для `renderNegotiation` (которое уже
рендерит `круг N [side] utterance`). Пустой раздел → пустой массив. Дословно, без пересказа.

## Инструкция переоценки в промпте наставника {#D2}

В `buildMentorVerdictPrompt` и `buildMentorSpecVerdictPrompt` (`mentor-verdict.mjs`) в system
добавляется строка-обязательство: «Переоцени ТЕКУЩИЙ план/спеку: сначала проверь, сняты ли твои
ПРОШЛЫЕ претензии из журнала переговоров; снятое НЕ повторяй; учти доводы контроллера; новое
возражение — только если оно реально в текущем тексте». Контракт: system обоих промптов содержит
эту инструкцию.

## Проводка наставника {#D3}

В `enforce-mentor-on-plan-write.mjs` (оба пути — план и спека): к `negotiationLog` (журнал
наставника) добавить записи контроллера из `controllerNegotiationEntries(content)` перед передачей
в `onPlanWrite`/`onSpecWrite`. Тогда `renderNegotiation` покажет наставнику и свои прошлые реплики,
и доводы контроллера. best-effort (сбой парса не ломает круг).

## Дословность {#D4}

Позиция контроллера переносится в журнал ПОБАЙТНО как в разделе «Переговоры» (без сокращения).

## Конвенция и критерий {#D5}

Чистые функции (`controllerNegotiationEntries`, рендер) тестируются без I/O/LLM, RED→GREEN.
Критерий: из плана с `## Переговоры → ### Круг 1` извлекается запись `side:'controller'` с дословной
позицией; system промпта наставника содержит инструкцию переоценки; полная регрессия tools зелёная
(`npx vitest run --root app --config vitest.config.tools.mjs`).

```verified-context-json
[
  {"id":"D1-parse","kind":"EXTRACTED","ref":"tools/negotiation-section.mjs","anchor":"export function parseNegotiationSection("},
  {"id":"D2-prompt","kind":"EXTRACTED","ref":"tools/mentor-verdict.mjs","anchor":"export function buildMentorVerdictPrompt("}
]
```
