fix(alerts): отклонять запись устаревшего снимка правил
This commit is contained in:
1 parent
c5c1c2812d
commit
382e318b97
23 files changed
+126
-43
No files matched your search
+10
-1
@@ -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.1; scheduler и GeoIP приняты локально; NetFlow принят локально; Evolution принят локально; далее общие Settings |
|
||||
| 11Б | Оповещения, сбор данных, интеграции, релизы и настройки | В работе: 11Б.1–11Б.4.4.2; scheduler и GeoIP приняты локально; NetFlow принят локально; Evolution принят локально; далее общие Settings |
|
||||
| 12 | Итоговая доступность, адаптивность, производительность и регрессия | Не начат |
|
||||
|
||||
|
||||
@@ -36,6 +36,15 @@
|
||||
|
||||
|
||||
|
||||
## Блок 11Б.4.4.2 — ревизия конфигурации правил (2026-10-03)
|
||||
|
||||
- GET/strict receipt содержит обязательную SHA-256 revision правил/групп. Canonical hash сохраняет порядок targets/conditions и policy, сортирует строки по ID, исключает history/lastFired и Telegram. Это версия конфигурации в body, не ETag полного overview с динамической историей.
|
||||
- Client требует read revision, отправляет quoted If-Match; backend требует его до replace (428 missing/400 malformed). После nonblocking lock сравнивает актуальный hash внутри той же transaction до destructive write; stale получает 412, занятый lock по-прежнему 409. Readback проверяет собственную revision перед commit. Внутренний legacy replaceAlertRules без revision оставлен для совместимости; HTTP bypass отсутствует.
|
||||
- UI сохраняет новую revision только из confirmed GET/receipt. 412/428 — подтверждённый отказ без unknown checkpoint; draft остаётся. Editor умеет обновить snapshot, сохраняя draft; следующая запись включает полученные concurrent rules и новую revision. После refresh пользователь должен сравнить конфликтующие поля одного правила с черновиком — автоматического merge нет.
|
||||
- 1 hash + 1 stale-commit DI, профильный backend/HTTP/JWT (missing/malformed/stale), 6 API unit, 9 rules browser + 3 primary + 3 preview, 10 source/ABA, typecheck/lint и backend/frontend/contracts production builds пройдены. Промежуточные validation/lint ошибки исправлены и профильные проверки повторены. Реальная PG конкуренция/lock/isolation не доказана.
|
||||
- API compatibility: frontend/contracts/backend должны обновляться вместе. Старый HTTP writer без If-Match получает 428; новый reader не принимает legacy overview без revision. Reverse proxy должен передавать If-Match. CORS backend отражает request headers; source fixtures включают If-Match. Нет push/deploy.
|
||||
- Следующий точный шаг 11Б.4.4.3: outbox audit — неизвестный результат отправки/повторы/зависшие sending и согласованность журнала; затем общий dashboard permission reader, адаптивность/pickers, Releases/probe scheduling и приёмка 11Б/12.
|
||||
|
||||
## Блок 11Б.4.4.1 — согласованный GET и происхождение данных (2026-10-03)
|
||||
|
||||
- Production GET Alerts использует одну read-only repeatable-read transaction: Telegram/groups/rules/targets/conditions/last-fired/history/live issues/metadata читаются через тот же context. Raw live SQL больше не выходит в pool dbAll. GET Telegram не создаёт singleton row, отсутствующая конфигурация имеет корректное пустое состояние. Storage thread не округляется молча.
|
||||
|
||||
Reference in new issue
Block a user