Беклог: перенос четырёх задач из инбокса Tududi
Инбокс Tududi разгружен: четыре открытые задачи проекта оформлены файлами в docs/backlog и помечены выполненными в Tududi. - режиссёр в блоке «Распознано как» на странице загрузки (средний); - карточка информации о торренте вылезает за экран на мобильном (средний); - сигнал Jellyfin после отката и удаления файлов (средний); - кнопки выглядят как кнопки: btn-ghost и рассогласование весов (низкий). Каждая задача проверена по коду: все четыре актуальны, ни одну не закрыли прошлые коммиты. В телах — точки правки, развилки и нужные дельты спек. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
# Режиссёр в блоке «Распознано как» на странице загрузки
|
||||
|
||||
**Приоритет:** средний
|
||||
|
||||
На странице `/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]].
|
||||
Reference in New Issue
Block a user