# Закрытие 7 дыр аудита журналирования — Master Overview

> **Триггер:** анализ 23.05.2026 после P0+P1+P2 closure (см. `2026-05-22-audit-*.md` × 3). Заказчик: «делай все 7 и не забудь разместить все на проде».

**Goal:** закрыть 7 «реальных дыр» из gap-анализа 23.05 и выкатить каждую на боевой liderra.ru.

**Стратегия деплоя:** по мере готовности — каждая дыра отдельным деплоем (выбор заказчика). Безопаснее: точечный откат при сбое.

**Решение по объёму #4:** минимум — админ-кнопка + код анонимизации + журнал. Без формы самообслуживания, без email-подтверждения, без 30-дневного SLA (выбор заказчика).

---

## Порядок и зависимости

| № | Дыра | Почему такой порядок | План |
|---|---|---|---|
| **#7** | Dev↔Prod RLS-разрыв (аудит) | Превентивно — выявит проблемы, которые могут испортить новые фичи 1-6. Паттерн `pgsql_supplier` нужно засеять до их добавления. | `2026-05-23-hole-7-dev-prod-rls-audit.md` |
| **#1** | Hash-chain validator | Проверяет целостность того, что уже накапливается. Независим. Должен быть до партиционирования (если найдём повреждение — фиксим прежде чем резать на куски). | `2026-05-23-hole-1-hash-chain-validator.md` (создаётся после #7) |
| **#2** | Партиционирование 7 audit-таблиц | Фундамент масштабирования. До добавления новых watcher-job'ов в #3+#5. | `2026-05-23-hole-2-audit-partitioning.md` |
| **#3+#5** | Watcher coverage (доп. пороги + другие job-классы) | Объединены — оба правят `IncidentsWatchFailures` и/или его таблицу `incidents_log`. | `2026-05-23-hole-3-5-watcher-coverage.md` |
| **#6** | Scheduler heartbeat | Простой — pulse-таблица + watcher. Независим. | `2026-05-23-hole-6-scheduler-heartbeat.md` |
| **#4** | 152-ФЗ minimum | Самостоятельная фича, наименее связанная с журналированием — последней. | `2026-05-23-hole-4-152fz-erasure-minimum.md` |

---

## Tracker

- [x] **#7 RLS-аудит** ✅ DONE+прод+smoke (push `fb4e711b`, 23.05 утром)
- [x] **#1 hash-chain validator** ✅ DONE+прод+smoke (push `a195611d`, 23.05 утром; per-RLS-scope находка)
- [x] **#2 partitioning** ✅ DONE+прод+smoke (23.05 поздний вечер) — 7 audit-таблиц RANGE-партиционированы помесячно через rewrite SQL `db/migrations/2026_05_23_hole2_partition_audit_tables.sql`; репетиция на копии прод-данных (liderra_rehearsal) ДО боя; chains intact, lkomega(t2 info@lkomega.ru) цел 414/275, retention cron Sundays 03:00
- [x] **#3+#5 watcher coverage** ✅ DONE+прод+smoke (push `527f628a`, 23.05 вечером; +failed_jobs + 3 правила: spike/daily-total/persistent)
- [x] **#6 heartbeat** ✅ DONE+прод+smoke (push `c76038d0`+hotfix `33462bf5`, 23.05 вечером; schema v8.30, 12 baseline rows)
- [x] **#4 152-ФЗ minimum** ✅ DONE+прод+smoke (push `77e98afa`+Eloquent fix `f5482f4`, 23.05 вечером; backend + frontend build deploy)
- [x] **Финал:** ПИЛОТ.md / memory sync ✅ — этот документ (UI-приёмка #4 в админке — за заказчиком)

**Итог:** ВСЕ 7 дыр закрыты на боевой liderra.ru за 23.05.2026. Эпик завершён.

**NB (находка при #2):** `db/schema.sql` разошёлся с реальной прод-структурой для 4 таблиц (`activity_log`/`webhook_log`/`balance_transactions`/`pd_processing_log` — разные колонки). Phase A строила schema.sql v8.31 по schema.sql-колонкам; прод-rewrite (`db/migrations/2026_05_23_hole2_partition_audit_tables.sql`) построен из реального `pg_dump` прода (источник истины). Ресинхронизация schema.sql↔prod — отдельная задача вне scope #2.

---

## Out of scope (сознательно отложено или не делаем)

- **Backfill 412 строк activity_log** с NULL-автором (решение B=a из P1)
- **Retroactive pd_processing_log** для 417 существующих сделок (решение P0)
- **Lockbox / DDoS / Sentry / strict CSP / off-site backup** — все ждут Б-1 (регистрация ООО)
- **Полная фича 152-ФЗ** (форма самообслуживания, email-подтверждение, 30-дневный SLA) — выбор заказчика «минимум»

---

## Регламентные напоминания

- §5 п.10 — правки CLAUDE.md только через claude-md-management (или прямой Edit при worktree-эксцепшне)
- §15.1 — субагенты Sonnet/Opus для git-задач (не Haiku)
- §15.2 — pre-flight `git fetch && git log HEAD..origin/main --oneline` перед нормативкой
- §5.2 — никаких ПДн/токенов/секретов в коммитах (gitleaks pre-commit enforces)
- НЕ skip lefthook хуков (`--no-verify`) без явной авторизации заказчика
- Деплой по уже отработанному паттерну — scp tar-pipe → `sudo install -D -m 644 -o www-data -g www-data` → `php artisan config:clear && supervisor restart`
