## ADDED Requirements ### Requirement: Панель действий при пустом предпросмотре называет причину Панель действий SHALL называть причину, когда предпросмотр раскладки пуст, а не печатать общее «Подтверди источник, чтобы получить превью раскладки». Первой SHALL идти причина, посчитанная **на показе** — отказ построения этого предпросмотра: она относится к текущему эффективному плану, тогда как записанная при последнем переходе после смены источника устаревает, а у задачи, пришедшей в `review` без записанной причины, её нет вовсе. Записанная причина SHALL использоваться, когда посчитанной нет. Общий текст SHALL оставаться только там, где нет ни той, ни другой — источник действительно ещё не подтверждён. Построение предпросмотра НЕ SHALL двигать состояние задачи: причина считается на чтении и наружу отдаётся значением, а не записью. Те же две причины в том же порядке SHALL показываться и в карточке Telegram, когда плана в ней нет: обе поверхности ревью объясняют отсутствие команды «Применить» одинаково. Команда, упершаяся в непомещающееся имя, SHALL отвечать конфликтом, а не сбоем сервера. Требование не трогает доступность команды «Применить»: она по-прежнему следует наличию предпросмотра. Речь о том, что человеку говорят, когда предпросмотра нет: пустой предпросмотр наступает и от коллизии путей, и от непомещающегося имени, и от невалидного плана, а текст сегодня во всех случаях один и в трёх из четырёх неверен. #### Scenario: Непомещающееся имя названо в панели действий - **GIVEN** загрузка в `review` с причиной «имя не помещается», источник подтверждён, предпросмотр пуст - **WHEN** человек открывает экран ревью - **THEN** панель действий печатает причину отказа, а не предложение подтвердить источник, и команда «Применить» недоступна #### Scenario: Причина не записана в состоянии — считается на показе - **GIVEN** загрузка пришла в `review` без записанной причины (нет матча), а её название не помещается в имя файла - **WHEN** человек открывает экран ревью - **THEN** панель действий называет длину имени, хотя в состоянии причины нет, и состояние при этом не меняется #### Scenario: После смены источника показывается свежая причина - **GIVEN** загрузка в `review` с записанной причиной «имя не помещается», и человек выбрал другой источник - **WHEN** экран перестраивается - **THEN** показывается причина, посчитанная для нового плана, а не записанная при прошлом переходе #### Scenario: Карточка Telegram называет ту же причину - **GIVEN** загрузка в `review`, плана в карточке нет - **WHEN** карточка отправляется или обновляется - **THEN** в ней есть строка с причиной, по которой план не построился #### Scenario: Источник не подтверждён — текст прежний - **GIVEN** загрузка в `review` без записанной причины, без посчитанной и без предпросмотра - **WHEN** человек открывает экран ревью - **THEN** панель действий печатает общее предложение подтвердить источник