## Why Загрузка докачалась, воркер увёл её в распознавание и дальше в ревью — а в списке она по-прежнему «Загружается», без кнопки «Ревью →». Верное состояние появляется только после того, как человек сам перезагрузит страницу. Живое обновление сегодня привязано к двум отдельным фазам: карточка опрашивает себя, пока задача в `catched`, а прогресс — пока она в `downloading`. Выйдя из `downloading`, задача не опрашивается ничем, хотя сменить состояние ей предстоит ещё не раз (распознавание, ревью, раскладка) и часть этих смен идёт вообще без участия того, кто смотрит на список: их делает воркер или человек из Telegram. ## What Changes - Самообновление карточки списка привязывается к **нетерминальности** задачи, а не к фазе `catched`: карточка обновляется, пока задача жива, и перестаёт — когда та встала окончательно. - У карточки остаётся **один** источник обновления. Сейчас в `downloading` их было бы два (сама карточка и вложенный фрагмент прогресса), и они опрашивали бы одно и то же дважды, подменяя разметку друг друга. Живые цифры прогресса приходят вместе с карточкой. - Страница `/download/{id}` живёт по тому же правилу: самообновляется, пока задача нетерминальна. - Частота обновления перестаёт быть одинаковой: карточка с живыми цифрами (скорость, ETA) обновляется чаще, чем карточка, у которой меняется только состояние. Цена тика у второй поверхности выше — сборка страницы загрузки считает предпросмотр раскладки и ходит в файловую систему. - Секция «Раздача» на странице загрузки перестаёт опрашивать сервер сама — она лежит внутри области, которую страница обновляет целиком, и два опроса на одну поверхность мешали бы друг другу. - Тик самообновления, не сумевший прочитать задачу, перестаёт быть молчаливым: он объясняет положение дел и прекращает опрос вместо бесконечного стука в сервер. - **BREAKING** для внутреннего контракта фрагментов: фрагменты прогресса и раздачи перестают быть самостоятельными поллерами. Наружного API это не касается — `/api/**` не меняется. ## Capabilities ### New Capabilities Новых нет. ### Modified Capabilities - `web-ui`: требование «Отображение промежуточного состояния catched» обобщается — самообновление интерфейса перестаёт быть свойством одной фазы и становится свойством живой задачи; условие остановки — терминальное состояние. - `live-status`: требование «Живой прогресс активных загрузок» — сценарий «Завершение останавливает поллинг» сегодня описывает наблюдаемый дефект как норму. Прекращаться должен показ живых цифр, а не обновление карточки. ## Impact - `internal/httpapi`: `toView` и `buildDownloadView` (условие самообновления), обработчики фрагментов карточки и прогресса; - `web/templates/partials/card.html`, `progress.html`, `download_main.html`; - нагрузка: число фоновых запросов на открытую страницу меняется — считается в `design.md`; - вне scope: переход на SSE (задача `sse-live-updates`), любые изменения `/api/**` и состава живой телеметрии; - вне scope и названо сознательно: экран `/review/{id}` сохраняет фазовое самообновление, заказанное спекой `review` («пока загрузка в `recognizing`»). Третья поверхность приводится к общему правилу отдельной задачей — иначе change тянет за собой ещё одну capability.