Files
avandClaude Opus 4.8 e9ec26d09a Ingest: контекст распознавания из полей magnet-ссылки
Синтезируем контекст из полей самой magnet-ссылки (dn, xl, tr/xs, kt) без
сети и дополняем им текст от транспорта: пользовательский текст первым, при
пустом — синтез единственный. Обогащённый контекст идёт только в
download.Context (его читают recognition и веб-UI); вход namer и отображаемое
имя не меняются — строки-факты (Размер:/Трекер:) в display_name не текут.

- magnet.Info: поля ExactLength/Sources/Keywords + Info.Context() (синтез,
  отсев dn-заглушек *-topic-<id>, домен трекера, человекочитаемый размер)
- Parse устойчив к ссылке в процент-кодировке (разовый QueryUnescape)
- ingest: mergeContext → download.Context, namer на сыром req.Context
- Влита дельта capability ingest в openspec/specs, change заархивирован

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-07 20:38:01 +03:00

4.9 KiB

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-<id>), размер (человекочитаемо из xl), происхождение по домену трекера/источника (tr/xs) как слабый сигнал языка/типа, ключевые слова (kt).
  • Обогащённый контекст сохраняется в download.Context — его читают recognition (LLM-промпт) и веб-UI (страница загрузки). Вывод отображаемого имени (namer) не меняется: он по-прежнему получает пользовательский текст и dn-подсказку, а помеченные строки-факты (Размер:, Трекер:) в имя не попадают.
  • Явно фиксируем поддержку приёма только по magnet (пустой текст) как штатный сценарий во всех транспортах.

Вне объёма (сознательно): дообогащение со страницы трекера (*-topic-<id> → 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 не требуется.
  • Внешние системы: без новых зависимостей и сетевых вызовов.