Files
jellybit/openspec/changes/archive/2026-07-10-refresh-display-name/specs/web-ui/spec.md
T
avandClaude Opus 4.8 0c9421f4c1 Имя: восстановление display_name после распознавания + гард пустого входа
Голый magnet без dn/контекста заставлял namer звать LLM на пустом входе,
и модель галлюцинировала мусорное имя («Unknown»), которое писалось и в
display_name, и в rename qBittorrent, а заодно ломало UI-фолбэк на
распознанное название. Верное каноническое имя, вычисляемое позже при
распознавании, никуда не переливалось.

- naming: гард пустого входа в DeriveName (нет контекста и подсказки → ""
  без вызова LLM) + детерминированный форматтер FormatTitleYear.
- qbt: операция RenameTorrent (переименование существующей раздачи).
- store: SetDisplayName — обновление имени постфактум без гарда состояния.
- worker: refreshDisplayNameLocked/RefreshDisplayName — перелив канонического
  имени (эффективный план) в display_name + best-effort rename раздачи по
  реальному t.Hash; авто-триггер при подтверждении матча (choose/manual add).
- web-ui: кнопка «Обновить имя» на странице загрузки (htmx-своп заголовка,
  деградация без JS), видимая при наличии распознавания (вкл. done/orphaned).

Спека: дельты ingest/review/web-ui влиты в openspec/specs; change
refresh-display-name заархивирован.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-10 16:51:04 +03:00

2.5 KiB

ADDED Requirements

Requirement: Действие «Обновить имя» на странице загрузки

Когда у загрузки есть распознавание, страница загрузки SHALL предлагать действие «Обновить имя», запускающее обновление отображаемого имени по распознаванию (см. capability ingest). Видимость действия SHALL определяться наличием распознавания (а не состоянием ревью): в частности, действие SHALL быть доступно и на терминальных состояниях с распознаванием (done/orphaned), где раздачу нужно переименовать постфактум. Действие SHALL обновлять заголовок на месте по htmx-паттерну (фрагмент заголовка перерисовывается ответом), без перезагрузки страницы, и SHALL деградировать без JS (обычная форма-POST с переходом на страницу загрузки).

Действие SHALL быть идемпотентным по эффекту: повторный запуск на неизменном распознавании даёт то же имя. Отсутствие распознавания (пустой источник имени) SHALL приводить к отсутствию видимых изменений.

Scenario: Ручное обновление имени перерисовывает заголовок

  • GIVEN страница загрузки с распознанным каноническим названием и заголовком «Unknown»
  • WHEN пользователь запускает действие «Обновить имя»
  • THEN заголовок на странице перерисовывается каноническим именем Title (Year) на месте (htmx), без полной перезагрузки

Scenario: Деградация без JS

  • GIVEN клиент без htmx/JS
  • WHEN пользователь отправляет действие «Обновить имя» обычной формой
  • THEN сервер выполняет обновление и отвечает страницей загрузки с новым заголовком