## Why Пачка UI/UX-задач беклога («Главная: список вместо таблицы», «Расширенная информация о загрузке», «показывать матч с записью метабазы», «список: фильтр, поиск, пагинация», «Полировка веб-UI») частично уже закрыта при внедрении современного server-rendered UI. Осталось довести хвосты: список не масштабируется на рост БД (нет серверной пагинации, фильтр/поиск чисто клиентские по уже загруженным карточкам), подтверждённый матч метабазы показывается без ссылки на запись, заголовок карточки — сырой magnet вместо имени раздачи, и есть мелкие дефекты вёрстки. Собираем это в одно небольшое изменение. ## What Changes - **Список загрузок — серверные фильтр, поиск и пагинация.** Фильтр по группе состояний, поиск по названию/infohash/контексту и постраничная выдача (по 25) через query-параметры (`?f=`, `?q=`, `?page=`), на стороне `store`/`httpapi`; заменяет текущую клиентскую фильтрацию по отрендеренным карточкам. Сортировка — по времени добавления торрента в источник (qBittorrent `added_on`), фолбек — время создания загрузки в jellybit. Скрытие `deleted` по умолчанию сохраняется. Живой прогресс активных карточек (htmx-поллинг) не ломается. - **Заголовок загрузки = имя раздачи qBittorrent.** При приёме сохраняем выведенное отображаемое имя (`rename`, что уходит в qBittorrent) в новую колонку `display_name`. Заголовок карточки и шапка страницы берут его; если пусто — распознанное название из плана; если и его нет — сырой источник (magnet) **одной строкой как обычный заголовок** (усечённо), а не в три строки. - **Матч с записью метабазы со ссылкой.** На странице просмотра (`/download/{id}`) и в блоке «Источник совпадения» ревью подтверждённый матч (TMDB/TVDB/IMDb) показывается как ссылка на запись (название, год, провайдер-id, URL), а не только `провайдер · id`. - **Блок «Информация о торренте» на странице загрузки.** Полный magnet/сырой источник и infohash выносятся в отдельный блок, чтобы заголовок оставался чистым. - **Полировка вёрстки:** блок «Распознано как» растянуть на всю ширину (снять `max-width` у списка полей); в блоке «Файлы и раскладка» приклеить стрелку к строке файла-источника, чтобы источник и цель шли строго друг под другом. Вне объёма (отдельные задачи беклога): полный лог переходов состояний (требует таблицы истории), собственный идентификатор загрузки, выбор источника матча с предпросмотром полей, показ матча в Telegram, SSE. ## Capabilities ### New Capabilities Нет. ### Modified Capabilities - `web-ui`: список получает серверные фильтр/поиск/пагинацию (было — клиентская фильтрация без пагинации); заголовок загрузки берётся из сохранённого имени раздачи с фолбеком; страница просмотра получает блок «Информация о торренте» и показывает подтверждённый матч метабазы ссылкой на запись. - `ingest`: выведенное отображаемое имя теперь не только уходит в qBittorrent, но и **сохраняется** у загрузки (для показа в веб-UI); прежний инвариант «не влияет на пути/распознавание/раскладку» сохраняется. ## Impact - **БД (миграция):** новые колонки `download.display_name` и `download.source_added_at` (время добавления в qBittorrent); обновление ER-схемы `docs/specs/database.md`. Новые запросы списка с `WHERE`/`LIKE`/`ORDER BY`/`LIMIT`/`OFFSET` и счётчиком (`store`). - **Код:** `internal/store` (колонки, запрос списка с фильтром/поиском/сортировкой/ пагинацией и count), `internal/ingest` (запись `display_name` при создании загрузки), `internal/worker` (захват `added_on` → `source_added_at` при поллинге), `internal/httpapi` (разбор query-параметров списка, view-модели, ссылка на матч, блок торрента, заголовок с фолбеком), шаблоны `web/templates` (index, download, review, layout_widget) и `web/static/css` (полировка), возможно `web/static/js` (упрощение/удаление клиентской фильтрации). - **Обратная совместимость:** REST API (`/api/downloads`) не меняется в контракте; добавление query-параметров списка — аддитивно. Существующие строки БД получат пустой `display_name` (фолбек на распознанное/источник отработает штатно).