Files
jellybit/docs/tasks/items/ingest-nits.md
T
av f42db0a275 sprint: набран спринт 2026-08-06 под цель распознавания
- в наборе шесть задач: локаль TVDB и confidence-гейт под цель, плюс баги и
  техдолг помимо неё
- взятым дописаны разделы своего типа: «Затрагивает», критерии с оракулами,
  воспроизведение
- решены развилки: оба расхождения код↔спека правятся спекой (и потому стали
  chore), опрос qBittorrent тормозится бэкоффом до минутного потолка
2026-08-06 13:57:33 +03:00

4.1 KiB

🧹 Закрыть мелочи приёма: NoName в контексте, устаревшие комментарии, лог без причины, bencode-аллокации (N1, N3, N4, N5)

  • Тип: chore
  • Категория: Ядро продукта
  • Зачем: косметика приёма: NoName в контексте, устаревшие комментарии, лог, bencode-аллокации (ревью 2026-07-08)

Ревью Fable 2026-07-08 (приём). Косметические нити.

N1 — torrent.go:114: Context() включает NoName-сентинел «-» как строку-название (name != "" проходит); ingest.parse фильтрует «-» только для source_ref (ingest.go:160-162). Одна грязная строка контекста для безымянных торрентов. Фикс: фильтровать «-» и в Context().

N3 — устаревшие комментарии. httpapi.go:574-577 и tgbot/bot.go:256-258 утверждают, что res.DownloadID может быть непуст при ошибке приёма («сбой после создания задачи, напр. qbit»). После fast-catch рефактора Ingest возвращает Result{} на КАЖДОМ пути ошибки (ingest.go:74-75,86,106-107) → корреляция всегда падает на request_id / без ключа. Фикс: поправить комментарии.

N4 — qbt.go:246 логирует «Fails.» со счётчиками, но qBittorrent не даёт причину; вместе с F2 оператор не отличит «дубль» от «битый файл». Идея: логировать хеши/первые байты для корреляции.

N5 — anacrolix bencode (v1.61.0, bencode/decode.go:17,250) аллоцирует до MaxStrLen (~128MiB) на объявленную строку до чтения — крафт-8MiB-торрент может форсить транзиентные ~128MiB аллокации при metainfo.Load. Ограничено и завершается ошибкой; на umbar приемлемо, но знать стоит. (files()-panic-guard torrent.go НЕ покрывает Load/UnmarshalInfo/HashBytes, но panic-путей там не найдено.)

Вердикт: простые фиксы/принять.

Затрагивает

  • internal/torrent/torrent.goContext() и фильтр NoName-сентинела «-»;
  • internal/httpapi/httpapi.go и internal/tgbot/bot.go — устаревшие комментарии про непустой DownloadID на пути ошибки;
  • internal/qbt/qbt.go — лог Fails. без причины;
  • N5 (аллокации bencode в anacrolix/torrent) — граница чужой библиотеки, правке не подлежит: исход пункта — запись наблюдения, а не код.

Критерии приёмки

  • Для безымянного торрента Context() не отдаёт «-» как название — поле пустое (оракул: тест разбора на фикстуре безымянного торрента в internal/torrent).
  • Комментарии в httpapi и tgbot описывают фактическое поведение Ingest: на любом пути ошибки возвращается пустой Result, корреляция идёт по request_id (оракул: чтение диффа на ревью — механического оракула нет).
  • Лог неудачного добавления в qBittorrent несёт инфохэш для корреляции (оракул: тест клиента с подставным сервером, проверяющий поля записи).
  • Наблюдение про аллокации bencode до MaxStrLen записано в docs/research/ с провенансом либо явно отклонено строкой в теле задачи (оракул: task gate, шаг канона).