Инбокс Tududi разгружен: четыре открытые задачи проекта оформлены файлами в docs/backlog и помечены выполненными в Tududi. - режиссёр в блоке «Распознано как» на странице загрузки (средний); - карточка информации о торренте вылезает за экран на мобильном (средний); - сигнал Jellyfin после отката и удаления файлов (средний); - кнопки выглядят как кнопки: btn-ghost и рассогласование весов (низкий). Каждая задача проверена по коду: все четыре актуальны, ни одну не закрыли прошлые коммиты. В телах — точки правки, развилки и нужные дельты спек. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
51 lines
3.3 KiB
Markdown
51 lines
3.3 KiB
Markdown
# Режиссёр в блоке «Распознано как» на странице загрузки
|
||
|
||
**Приоритет:** средний
|
||
|
||
На странице `/download/{id}` в блоке «Распознано как» режиссёр всегда показан
|
||
прочерком — поля просто нет:
|
||
`web/templates/partials/download_main.html:40` содержит захардкоженное
|
||
`<dt>Режиссёр</dt><dd><span class="faint">—</span></dd>`.
|
||
|
||
Экран ревью режиссёра уже выводит (`internal/httpapi/review.go:49/122`,
|
||
`review_source_block.html:59`) — это сделано в change про слоистое разрешение
|
||
полей display_name; страницу загрузки он не тронул.
|
||
|
||
Данные для вывода есть: `Plan.Director` (`internal/recognize/recognize.go:91`)
|
||
персистится в JSON-колонке `recognition.plan`, а страница загрузки уже получает
|
||
эффективный план через `Reviewer.ReviewData(...)`
|
||
(`internal/httpapi/download.go:89`) — `rd.Plan` уже с наложенными override
|
||
(`internal/worker/review.go:987`, `:1271`).
|
||
|
||
## Развилка (решить до кода)
|
||
|
||
`rd.Plan.Director` — это слой «override → распознавание+матч», **без слоя
|
||
контекста**. Полное слоистое разрешение живёт в неэкспортируемом
|
||
`effectiveDisplayName(d, plan)` (`internal/worker/review.go:1118`, fallback
|
||
`plan.Director → ctxf.Director` на `:1127-1130`) и отдаёт готовую строку, а не
|
||
поля.
|
||
|
||
- **A (минимум, ~3 строки):** поле `Director` в `downloadDetailView`
|
||
(`internal/httpapi/download.go:37`) + присвоение `view.Director =
|
||
rd.Plan.Director` рядом с `:143`. Но при распознавании без матча режиссёр из
|
||
контекста не покажется, хотя в заголовке страницы (display name) он уже есть →
|
||
видимая нестыковка «в заголовке есть, в поле прочерк».
|
||
- **B (правильный):** вынести слоистое разрешение в экспортируемое
|
||
`naming.Fields`/`EffectiveFields(d, plan)`, переиспользовать в
|
||
`effectiveDisplayName` и в **обоих** билдерах вью. Чинит заодно ту же дыру в
|
||
`internal/httpapi/review.go:122`.
|
||
|
||
Рекомендация — B: A оставляет ровно тот баг, который заводили.
|
||
|
||
## Спеки
|
||
|
||
- `openspec/specs/web-ui/spec.md` — про блок «Распознано как» на `/download/{id}`
|
||
режиссёра нет вообще → нужна дельта.
|
||
- `openspec/specs/review/spec.md:255-289` — сценарий «Режиссёр показан, когда
|
||
доступен» ограничен экраном ревью и формулировкой «из подтверждённого
|
||
матча/кандидата»; вариант B потребует правки формулировки.
|
||
- `openspec/specs/recognition/spec.md:62-69` — режиссёр опционален и best-effort,
|
||
пустое значение штатно.
|
||
|
||
Связано: [[ubiquitous-language-slovar]].
|