tgbot: выбор кандидата метабазы inline-кнопками в карточке ревью
Когда для распознавания сохранены кандидаты метабазы, карточка подтверждения бота показывает кнопку «🗂 База (N)». По ней двухшагово (как delete/dismiss) разворачивается список кандидатов inline-кнопками; выбор пиннит источник через worker.ChooseCandidate (ручной матч, без авто-раскладки) и обновляет карточку. Веб остаётся точкой точных правок (ручной ввод id/URL, «без базы»). Безопасность границы: id кандидата из callback_data валидируется как ULID (ident.Parse) до доменного вызова, как в вебе. Текст inline-кнопок Telegram не парсится как HTML — название кандидата в подписи не экранируется. SDD: change telegram-vybor-nahodok — дельта notifications (ADDED «Выбор кандидата метабазы из карточки подтверждения бота») + review (MODIFIED «Разделение труда транспортов»: быстрый выбор кандидата — Telegram-действие). Влито в specs, change заархивирован. Миграций БД нет (кандидаты уже в БД). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -329,10 +329,12 @@ SHALL относиться именно к активному источнику
|
||||
### Requirement: Разделение труда транспортов в ревью
|
||||
|
||||
Состояние ревью SHALL быть единым (в SQLite) для всех транспортов. Веб-UI SHALL
|
||||
быть поверхностью точных правок (маппинг файлов, выбор/ввод источника,
|
||||
предпросмотр). Telegram SHALL давать быстрые действия (одобрить, подсказать,
|
||||
переключить тип, «Позже»/«Отклонить») и эскалацию в веб deep-link'ом на ту же
|
||||
страницу; точечные правки, не помещающиеся в чат, SHALL делаться в вебе.
|
||||
быть поверхностью точных правок (маппинг файлов, ручной ввод/выбор источника по
|
||||
id или URL, «без базы», предпросмотр). Telegram SHALL давать быстрые действия
|
||||
(одобрить, подсказать, переключить тип, **быстрый выбор источника из готового
|
||||
списка кандидатов метабазы**, «Позже»/«Отклонить») и эскалацию в веб deep-link'ом
|
||||
на ту же страницу; точечные правки, не помещающиеся в чат (ручной ввод id/URL,
|
||||
маппинг файлов), SHALL делаться в вебе.
|
||||
|
||||
#### Scenario: Эскалация из Telegram в веб
|
||||
|
||||
@@ -340,6 +342,13 @@ SHALL относиться именно к активному источнику
|
||||
- **WHEN** пользователь в Telegram выбирает «В вебе»
|
||||
- **THEN** бот даёт deep-link на страницу ревью той же загрузки
|
||||
|
||||
#### Scenario: Быстрый выбор кандидата в Telegram, точный ввод — в вебе
|
||||
|
||||
- **GIVEN** загрузка в `review` с сохранёнными кандидатами метабазы
|
||||
- **WHEN** пользователь выбирает кандидата inline-кнопкой в Telegram
|
||||
- **THEN** кандидат закрепляется как источник (тот же единый выбор источника, что
|
||||
и в вебе), а ручной ввод id/URL и «без базы» остаются точными правками веба
|
||||
|
||||
### Requirement: Петлевые действия ревью обновляют экран на месте
|
||||
|
||||
Петлевые действия распознавания на экране ревью — **Распознать заново** (`rerecognize`) и **Уточнить** (`refine`) — SHALL выполняться htmx-запросом и обновлять тело экрана ревью на месте (partial swap), без полной перезагрузки страницы и без сброса позиции прокрутки. Поскольку эти действия асинхронны (переводят загрузку в `recognizing`, распознавание доделывает воркер), своп SHALL отражать актуальное состояние — состояние `recognizing` с индикацией «идёт распознавание», а не мгновенно готовый план. Накопленные подсказки и ручные override MUST переживать перераспознавание. Это согласуется с уже действующим частичным свопом при смене выбранного источника (см. «Единый список источников совпадения на ревью»).
|
||||
|
||||
Reference in New Issue
Block a user