Веб-UI: режиссёр в блоке «Распознано как» на странице загрузки

На /download/{id} поле «Режиссёр» было захардкожено прочерком, хотя экран
ревью режиссёра уже выводит: слоистое разрешение полей ярлыка было заперто в
неэкспортируемом worker.effectiveDisplayName. Из-за этого билдеры вью видели
только слой распознавания+матч (rd.Plan.Director) без слоя контекста — то же
на экране ревью.

Вынес разрешение в экспортируемую naming.EffectiveFields(parsedContext, plan)
LabelFields с методом Label(): выбор слоя по сырым значениям (как прежде),
выбранные скаляры возвращаются очищенными (sanitize идемпотентен, display_name
побайтно тот же). effectiveDisplayName стал тонкой обёрткой; страница загрузки
и экран ревью берут режиссёра из той же функции — согласованно с заголовком.

OpenSpec: web-ui (ADDED «Режиссёр в блоке распознавания страницы загрузки»),
review (MODIFIED «Инфо и предпросмотр выбранного источника» — слоистое
разрешение с фолбэком на контекст). Change заархивирован. Беклог: закрыта
rezhisser-v-kartochke-zagruzki.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
av
2026-07-17 21:21:27 +03:00
co-authored by Claude Opus 4.8
parent 0354a8c96b
commit 5948f4d219
16 changed files with 612 additions and 93 deletions
+38 -1
View File
@@ -511,7 +511,6 @@ htmx-поллингом (см. конвенцию веб-UI): по перехо
(бейдж, имя, живой прогресс)
- **AND** поллинг фазы `catched` завершается
### Requirement: Загрузка .torrent-файла на форме добавления
Форма добавления загрузки веб-UI SHALL позволять выбрать локальный
@@ -541,3 +540,41 @@ htmx-путь (список обновляется/происходит реди
- **GIVEN** пользователь оставил файловое поле пустым и ввёл magnet/текст
- **WHEN** форма отправлена
- **THEN** выполняется приём по тексту источника, как прежде
### Requirement: Режиссёр в блоке распознавания страницы загрузки
Страница просмотра `/download/{id}` в блоке «Распознано как» SHALL показывать
режиссёра эффективного источника, разрешённого теми же слоями, что и
отображаемое имя раздачи (`display_name`): первый непустой слой `override` →
`recognition`+матч → сохранённый при приёме контекст (`parsed_context`).
Разрешение режиссёра для поля блока и для отображаемого имени SHALL идти **единой
логикой** (общий источник разрешения), а не расходящимися путями — прежняя
захардкоженная в поле заглушка-прочерк при непустом режиссёре в заголовке
устраняется. Показанное значение SHALL проходить ту же очистку (санитайзинг
управляющих символов/пробелов), что и режиссёр внутри отображаемого имени, чтобы
присутствие/отсутствие режиссёра в поле и в заголовке определялось одинаково.
Когда режиссёр недоступен ни в одном слое, поле SHALL показывать прочерк, не
ломая вёрстку.
#### Scenario: Режиссёр из распознавания показан в блоке
- **GIVEN** загрузка, чей эффективный план несёт режиссёра (из матча метабазы или
закреплённого источника)
- **WHEN** клиент открывает `GET /download/{id}`
- **THEN** в блоке «Распознано как» в поле «Режиссёр» показан этот режиссёр
#### Scenario: Режиссёр из контекста при распознавании без матча
- **GIVEN** загрузка без режиссёра в плане, но с режиссёром в сохранённом
контексте (`parsed_context`)
- **WHEN** клиент открывает `GET /download/{id}`
- **THEN** в поле «Режиссёр» показан режиссёр из контекста
- **AND** он разрешён тем же нижним слоем контекста, что и режиссёр в
отображаемом имени раздачи (единая логика, не расходящиеся пути)
#### Scenario: Режиссёр неизвестен — прочерк
- **GIVEN** загрузка, для которой режиссёр не разрешается ни одним слоем
- **WHEN** клиент открывает `GET /download/{id}`
- **THEN** поле «Режиссёр» показывает прочерк, а вёрстка блока не ломается