## Why Приём по «голому» magnet (без сопроводительного текста бота) уже проходит, но контекст распознавания при этом пуст: `download.Context` уходит в recognition почти пустым, и LLM-матч работает почти вслепую до докачки метаданных qBittorrent. При этом сама magnet-ссылка несёт полезные поля (имя релиза `dn`, размер `xl`, трекеры `tr`/источники `xs`), которые сейчас в контекст не попадают: парсим лишь `xt`, `dn`, `tr`, причём `dn` идёт только подсказкой в namer и в `download.Context` (а значит и в recognition) не сохраняется. Выжав эти поля в контекст распознавания, мы даём recognition реальный сигнал даже когда пользователь прислал один magnet. ## What Changes - Парсер `internal/magnet` извлекает дополнительные поля ссылки: `xl` (размер в байтах), `xs` (exact source), `kt` (keywords). `dn` и `tr` уже парсятся. - Ingest **синтезирует текст контекста из полей magnet** и **дополняет** им контекст, пришедший из транспорта: факты из полей добавляются к пользовательскому тексту (пользовательский — первым), а при пустом тексте становятся единственным контекстом. Синтез — из самой ссылки, без сетевых запросов. - В синтез входят: имя релиза (`dn`, если это содержательное имя, а не заглушка-идентификатор вида `*-topic-`), размер (человекочитаемо из `xl`), происхождение по домену трекера/источника (`tr`/`xs`) как слабый сигнал языка/типа, ключевые слова (`kt`). - Обогащённый контекст сохраняется в `download.Context` — его читают **recognition** (LLM-промпт) и **веб-UI** (страница загрузки). **Вывод отображаемого имени (namer) не меняется**: он по-прежнему получает пользовательский текст и `dn`-подсказку, а помеченные строки-факты (`Размер:`, `Трекер:`) в имя не попадают. - Явно фиксируем поддержку приёма **только по magnet** (пустой текст) как штатный сценарий во всех транспортах. Вне объёма (сознательно): дообогащение со страницы трекера (`*-topic-` → HTTP-запрос) — отдельная будущая задача; контекст берём только из полей ссылки. Поведение namer/отображаемого имени не меняем. ## Capabilities ### New Capabilities _Нет._ Изменение укладывается в существующую capability `ingest`. ### Modified Capabilities - `ingest`: добавляется требование «синтез контекста распознавания из полей magnet и дополнение им контекста транспорта» (обогащённый контекст → только `download.Context`; отображаемое имя не затрагивается) и явно фиксируется приём при пустом тексте. Существующие требования по выводу отображаемого имени остаются **без изменений** (namer получает тот же вход). ## Impact - Код: `internal/magnet` (новые поля `Info` + синтез контекста), `internal/ingest` (слияние `req.Context` + синтез в `download.Context` до `CreateDownload`). `internal/naming` **не затрагивается** — вход namer тот же (`req.Context`, `dn`-hint). - Данные: `download.Context` начинает содержать синтезированный текст — влияет на вход recognition и на отображение контекста в веб-UI; схема БД не меняется. - Транспорты (`httpapi`, `tgbot`): поведение при пустом контексте становится штатным; изменений API не требуется. - Внешние системы: без новых зависимостей и сетевых вызовов.