Голый 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>
32 lines
2.5 KiB
Markdown
32 lines
2.5 KiB
Markdown
## 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** сервер выполняет обновление и отвечает страницей загрузки с новым
|
|
заголовком
|