Files
jellybit/openspec/changes/archive/2026-07-17-download-card-director/proposal.md
T
avandClaude Opus 4.8 5948f4d219 Веб-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>
2026-07-17 21:21:27 +03:00

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: первый непустой слой overriderecognition(+матч), уже свёрнутый в план, с фолбэком на извлечённый из контекста слой (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.