Имя: восстановление 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>
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
## 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** сервер выполняет обновление и отвечает страницей загрузки с новым
|
||||
заголовком
|
||||
Reference in New Issue
Block a user