На /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>
4.3 KiB
Why
На странице просмотра загрузки /download/{id} в блоке «Распознано как» поле
«Режиссёр» всегда показано прочерком — оно захардкожено
(web/templates/partials/download_main.html:40), в отличие от экрана ревью, где
режиссёр уже выводится. Данные есть: Plan.Director персистится в
recognition.plan, а страница получает эффективный план через
Reviewer.ReviewData. Возникает видимая нестыковка: в заголовке страницы
(display_name) режиссёр из контекста уже присутствует, а в поле блока — прочерк.
Причина глубже одного шаблона: полное слоистое разрешение полей ярлыка
(override → распознавание+матч → контекст) заперто в неэкспортируемом
worker.effectiveDisplayName, который отдаёт готовую строку, а не поля. Поэтому
билдеры вью на странице загрузки и на экране ревью видят только слой
«распознавание+матч» (rd.Plan.Director) без нижнего слоя контекста — та же дыра
в internal/httpapi/review.go.
What Changes
- Слоистое разрешение полей ярлыка выносится в экспортируемую функцию
naming.EffectiveFields(parsedContext, plan), возвращающую эффективные поля (в т.ч.Director), а не готовую строку. Логика — та же, что была вeffectiveDisplayName: первый непустой слойoverride→recognition(+матч), уже свёрнутый в план, с фолбэком на извлечённый из контекста слой (parsed_context). worker.effectiveDisplayNameпереиспользует новую функцию (тонкая обёрткаnaming.EffectiveFields(...).Label()) — поведениеdisplay_nameне меняется, существующие тесты остаются зелёными.- Страница загрузки выводит режиссёра из слоистого разрешения — согласованно
с режиссёром в заголовке (
display_name); при отсутствии во всех слоях — прочерк. - Экран ревью берёт режиссёра из той же функции — закрывается та же дыра
(ранее только
rd.Plan.Director, без слоя контекста).
Всё перечисленное — косметика отображения: не влияет на пути файлов, распознавание или раскладку.
Capabilities
New Capabilities
(нет — правка отображения в существующих capability)
Modified Capabilities
web-ui: блок «Распознано как» на/download/{id}показывает режиссёра эффективного источника (слоистое разрешение), согласованно с заголовком.review: инфо-часть выбранного источника показывает режиссёра из слоистого разрешения (с фолбэком на сохранённый контекст), а не только из плана.
Impact
- Код:
internal/naming(экспортEffectiveFields+ тип полей с методомLabel),internal/worker(effectiveDisplayNameделегирует в naming),internal/httpapi(download.go,review.go— режиссёр из слоистого разрешения),web/templates/partials/download_main.html(поле «Режиссёр» вместо прочерка). - БД: изменений схемы нет.
- Внешние вызовы: нет.
- Беклог: закрывается
docs/backlog/rezhisser-v-kartochke-zagruzki.md.