fix(alerts): защитить ручной повтор очереди проверкой версии

This commit is contained in:
Denozordec committed 2026-10-03 19:14:27 +07:00
1 parent 89c31289bd
commit 7d0608bbce
16 files changed
+86 -17

No files matched your search

+1 -1
View File
@@ -4,7 +4,7 @@
## Актуальная точка продолжения — 2026-10-03
Этап 11Б в работе; последний проверенный блок 11Б.4.4.3.3; System DB принят локально с внешними ограничениями. Следующий блок 11Б.4.4.3.4: контролируемый повтор только unknown после явной проверки оператором и защиты от конкуренции; processing удерживать до отдельной проверки остановки отправителя. Затем общий dashboard permission reader, адаптивность/pickers, Releases/probe scheduling и приёмка 11Б/12.
Этап 11Б в работе; последний проверенный блок 11Б.4.4.3.4; System DB принят локально с внешними ограничениями. Следующий блок 11Б.4.4.3.5: подключить UI ручного повтора unknown с подтверждением риска дубликата, общим checkpoint при неизвестном POST и сохранением формы/источника; затем общий dashboard permission reader, адаптивность/pickers, Releases/probe scheduling и приёмка 11Б/12.
Реальные pg_dump/pg_restore, PG rollback и остановка UDP worker требуют внешней приёмки. Датированные продолжения ниже — история; точный следующий шаг также указан в начале [журнала](ux-ui-progress.md).
+9 -1
View File
@@ -28,7 +28,7 @@
| 9 | VPN, Firewall и Filters | Завершён в границах локальной приёмки 2026-09-30; блоки 9.1–9.64, ограничения в 9.64 |
| 10 | Маршрутизация, диагностика, карта и терминал | Завершён в границах локальной приёмки 2026-10-01; блоки 10.1–10.71, внешние ограничения в 10.71 |
| 11А | Пользователи, контейнеры, сертификаты и резервные копии | Завершён в границах локальной приёмки 2026-10-01; 11А.1–11А.33, внешние ограничения в 11А.33 |
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | В работе: 11Б.1–11Б.4.4.3.3; scheduler и GeoIP приняты локально; NetFlow принят локально; Evolution принят локально; далее общие Settings |
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | В работе: 11Б.1–11Б.4.4.3.4; scheduler и GeoIP приняты локально; NetFlow принят локально; Evolution принят локально; далее общие Settings |
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Не начат |
@@ -36,6 +36,14 @@
## Блок 11Б.4.4.3.4 — атомарный ручной повтор unknown (2026-10-03)
- POST /api/alerts/outbox/:id/retry под mm:alerts:write/admin требует literal acknowledgedDuplicateRisk:true и expectedVersion. Conditional UPDATE только telegram+unknown+resolution_version переводит запись в pending и увеличивает version. Processing/sent/failed/pending, устаревший снимок и повторный запрос получают 409; endpoint не отправляет Telegram и не пишет ложный успешный history.
- Receipt pending/id/version+1 проверяется внутри transaction и на HTTP границе. Ошибка returning отклоняет callback; сохранённый retryCount/maxRetries остаётся неизменным. 0009 migration добавляет resolution_version и nonnegative CHECK; GET выдаёт version для held items. Версия растёт при каждом ручном повторе, поэтому новый unknown не совпадает с предыдущей генерацией даже при одинаковом timestamp.
- 2 DI проверки concurrent retry/stale/processing/validation/receipt rollback, полный Alerts backend профиль, HTTP 400/409/500/no-store и реальные JWT gates прошли; backend build, nonincremental frontend typecheck, профильный lint и queue browser 2/2 прошли.
- Реальный PG CAS/rollback/0009 migration не проверен локально. При выпуске migrations 0008/0009 и backend/contracts/frontend обновить вместе; held GET требует resolutionVersion. UI операции ещё не подключён, processing не имеет ручного повтора до доказуемой остановки отправителя.
- Следующий точный шаг 11Б.4.4.3.5: подключить UI ручного повтора unknown с подтверждением риска дубликата, общим checkpoint при неизвестном POST и сохранением формы/источника; затем общий dashboard permission reader, адаптивность/pickers, Releases/probe scheduling и приёмка 11Б/12.
## Блок 11Б.4.4.3.3 — подтверждённый снимок очереди Telegram (2026-10-03)
- Отдельный GET /api/alerts/outbox под mm:alerts:read, no-store и строгим DTO. Counts и последние 20 processing/unknown читаются в одной repeatable read/read only transaction; сумма, безопасные числа, количество/статусы/уникальность элементов проверяются. Неизвестные legacy статусы учитываются отдельно. Ответ не содержит payload, token или lastError.
+4
View File
@@ -292,3 +292,7 @@ Conditional atomic claim, unknown/processing hold, transactional status/history
### Продолжение 2026-10-03 — 11Б.4.4.3.3
GET/UI очереди принят локально: независимый strict snapshot, known/unknown, сохранение при сбое и ABA; 32 browser + 12 context, API/DI/HTTP/JWT/build/typecheck/lint прошли. Реальный PG/Telegram и ручное разрешение held не приняты. Следующий блок 11Б.4.4.3.4: контролируемый повтор только unknown после явной проверки оператором и защиты от конкуренции; processing удерживать до отдельной проверки остановки отправителя. Затем общий dashboard permission reader, адаптивность/pickers, Releases/probe scheduling и приёмка 11Б/12.
### Продолжение 2026-10-03 — 11Б.4.4.3.4
Backend manual unknown retry принят локально: acknowledged risk + atomic version CAS, transaction receipt, no send/history; DI/HTTP/JWT/build/typecheck/lint/queue browser прошли. Реальный PG/0009 и UI действия не приняты. Следующий блок 11Б.4.4.3.5: подключить UI ручного повтора unknown с подтверждением риска дубликата, общим checkpoint при неизвестном POST и сохранением формы/источника; затем общий dashboard permission reader, адаптивность/pickers, Releases/probe scheduling и приёмка 11Б/12.