## Context Изменение презентационное и уже реализовано в коде (шаблоны, поиск, view-структуры). Дизайн-документ здесь короткий и нужен лишь как зависимость для `tasks` и чтобы зафиксировать одно продуктовое решение. Полноценного двухчекпоинтного ревью задача не требует (тривиальная — достаточно прохода по коду). ## Goals / Non-Goals **Goals:** - Показывать и копировать в карточках `download.id` — тот же ключ, что в логах (`download_id`), чтобы «скопировал → нашёл в логах» работало без перекодировки. - Поиск по списку — по любому идентификатору загрузки (`download.id` ИЛИ infohash). **Non-Goals:** - Не убираем infohash из UI совсем: он остаётся в блоке «Информация о торренте». - Не меняем модель данных, API-DTO и формат логов. ## Decisions - **Идентификатор карточки — `download.id`, не infohash.** В логах основной ключ связывания — `download_id` (см. `internal/worker/*`), поэтому именно его нужно копировать и грепать. Infohash второстепенен и уместен только в детальном блоке о торренте. Альтернатива (оставить infohash в шапке) отвергнута: заставляет пользователя вручную сопоставлять хэш с id при чтении логов. - **Поиск матчит любой идентификатор.** В LIKE-условие `internal/store/list.go` добавлен `download.id` рядом с уже имевшимся infohash; название/контекст сохранены. Так скопированный из карточки id находится обратным поиском. - **Чистка мёртвого кода.** Поля `Infohash`/`InfohashShort` во view-структурах и хелпер `shortenHash` стали не нужны — удалены, чтобы не копить неиспользуемое. ## Risks / Trade-offs - [ULID менее узнаваем на глаз, чем hex-infohash] → показываем полностью (26 символов помещаются в строку), рядом кнопка копирования; в детальном блоке infohash остаётся для тех, кому он нужен. - [Проза `## Purpose` в live-спеке упоминает «копирование infohash»] → правится прямой правкой live-спеки при archive (Purpose не покрывается дельта-операциями).