chore/schema: сверка-чистка перед запуском — метрика RLS 42 в 44 + пред-деплойный аудит
Accessibility (Pa11y live) / a11y (push) Waiting to run

Сверка боевого read-only перед накатом: прод-код == git побайтово 0 правок
мимо git, вся работа всех сессий включая оплату в main+gitea, прод-БД == канон.
Единственная нечистота — счётчик RLS-политик в шапке schema.sql отставал
42 реально 44 == прод pg_policies. Поправлено структурно БД не менялась плюс
запись в CHANGELOG_schema. Полный аудит дрейф+потери — отдельной запиской.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Дмитрий
2026-06-23 19:17:36 +03:00
parent 40d712374f
commit b11e1d971c
3 changed files with 76 additions and 1 deletions
+13
View File
@@ -4,6 +4,19 @@
**Файл схемы:** `schema.sql` (текущая версия — v8.52, консолидированная — разворачивает БД с нуля).
## Сверка-чистка перед запуском (2026-06-23) — коррекция метрики RLS-политик 42→44
Сверка боевого `liderra.ru` перед накатом показала: число активных `CREATE POLICY`
в теле `schema.sql` == **44** == число RLS-политик на проде (`pg_policies`, schema `public`).
Шапка `schema.sql` («Метрики:») указывала **42** — исторический недоучёт в бегущем
счётчике (политики `tenant_requisites_tenant_isolation` v8.43 и др. вносились в тело
без правки сводной метрики). **Структурно БД не изменена** — поправлено только число
в шапке (42→44) для соответствия реальности. Версия схемы не меняется (v8.52).
Все три ранее «не найденные» политики подтверждены в теле: `tenants_self_isolation`
(стр.713), `project_routing_snapshots_tenant_isolation` (стр.2189),
`tenant_requisites_tenant_isolation` (стр.772); `call_recordings.tenant_isolation`
закомментирована (таблицы на проде нет). Дрейфа схемы прод↔канон НЕТ.
## v8.52 (2026-06-22) — saas_transactions.balance_transaction_id (прослеживаемость онлайн-пополнения)
billing-yookassa: добавлена колонка `saas_transactions.balance_transaction_id`
+2 -1
View File
@@ -24,7 +24,8 @@
-- Базовая версия: v8.29 (22.05.2026 — webhook_log: supplier audit columns)
-- Базовая версия: v8.28 (22.05.2026 — tenant_operations_log: журнал тенант-уровневых операций вне сделок (проекты, API-ключи, webhook URL), append-only hash-chain, P2 operational journaling closure)
-- Базовая версия: v8.27 (21.05.2026 — drop projects.archived_at: feature архива заменена настоящим удалением с защитой по сделкам (ProjectService::delete()))
-- Метрики: 77 базовых таблиц (67 regular + 10 partitioned parents: deals + supplier_lead_costs + 6 audit + lead_region_resolution_log + project_routing_snapshots) + 16 партиций / 123 индекса / 42 RLS-политик / 5 функций / 15 триггеров
-- Метрики: 77 базовых таблиц (67 regular + 10 partitioned parents: deals + supplier_lead_costs + 6 audit + lead_region_resolution_log + project_routing_snapshots) + 16 партиций / 123 индекса / 44 RLS-политик / 5 функций / 15 триггеров
-- NB (23.06.2026 сверка-чистка перед запуском): RLS-политик исправлено 42→44 — реальное число активных CREATE POLICY в теле == 44 == на боевом liderra.ru (pg_policies). Расхождение было исторический недоучёт в бегущем счётчике шапки (tenant_requisites v8.43 и др. добавлены в тело без правки сводной метрики). Структурно БД не менялась — только корректность числа.
-- Базовая версия: v8.25 (19.05.2026 — supplier_manual_sync_queue: SaaS-level Tier 3 очередь резерва канала миграции проектов)
-- Базовая версия: v8.24 (18.05.2026 — supplier_leads.vid → nullable для CSV-recovered лидов (Путь 2))
-- Базовая версия: v8.20 (11.05.2026 — Plan 5 frontend projects UI: projects.archived_at TIMESTAMPTZ NULL для soft archive flow; tenants.limits JSONB NOT NULL DEFAULT '{}' для per-tenant project/user лимитов)
@@ -0,0 +1,61 @@
# Пред-деплойный аудит: дрейф прод↔git + «ничего не потеряно» (23.06.2026)
**Зачем:** перед реальным запуском заказчик попросил убедиться, что (а) прод не правили мимо git,
(б) ни одна правка всех сессий (особенно **оплата/биллинг**) не потеряна. Метод — read-only
(`ssh liderra-prod`, psql SELECT, git-анализ). Прод не менялся. Кодовая фраза стены — «роутер-наставник».
## Итог: ✅ ЧИСТО. Дрейфа нет, ничего не потеряно. К деплою готово.
---
## 1. Прод-КОД == git (побайтово)
Сверены хэши blob 552 исходников (backend PHP + frontend vue/ts/js/css + точка входа + playwright):
- **528+4 идентичны** локальному `HEAD` (= gitea/main `40d71237`).
- **20 файлов** прод отстаёт — ровно недеплоенный стек (балансовый блок + F/J + source-edit-lock +
UI), все прод-версии — легит-блобы из истории.
- **0 прод-правок мимо git.** **0 прод-only файлов.** composer.lock идентичен.
- `bootstrap/cache/*` «не в истории» = генерёж Laravel (gitignore), не исходники.
## 2. Ничего не потеряно (вся работа в main + gitea-бэкапе)
| Угол | Результат |
|---|---|
| Рабочая копия (незакоммич. код) | ✅ чисто |
| local main == gitea/main | ✅ `40d71237`, всё запушено |
| **Биллинг/оплата в main** | ✅ целиком: `requiredLeadsForTomorrow`, `balance_freeze_log`, `frozen_by_balance_at`, `BalancePreflightSweepJob`, `BillingTopupService`, `ProjectBlockReleaseService`, `YooKassaDriver`, `PaymentWebhookController`, `OnlineTopupService` |
| ~30 невлитых веток | ✅ старые фичи, влиты по содержимому (рибейз → patch-id разошёлся; проверено `git cherry` + по содержимому: регистрация, `extractRootDomain`, регионы, DIRECT, `mapToSupplier`) |
| 14 worktree | ✅ 0 незакоммич. кода, 0 коммитов вне main (4 prunable = косметика комментов) |
| 19 stash + dangling-коммиты | ✅ остатки дропнутых stash; единственный с кодом (stash@{16}: `not_found_terminal` + `SupplierRegions::mapToSupplier`) — оба фикса в main |
| github(origin) — 21 коммит вне gitea | ✅ a11y-CI + rossvyaz, отличия = Pint-формат/комменты, всё в main по содержимому (main новее) |
| git-теги | ✅ нет / в main |
## 3. Прод-БД == канон (schema.sql)
- **Миграции:** прод применил 40; все имеют файл ИЛИ схлопнуты (squash) в schema.sql. «Лишняя»
прод-запись `2026_05_23_000002_hole2_partition_audit_tables` = ранняя миграция, схлопнута в
`0001_..._load_initial_schema`/schema.sql (6 партиц. audit-таблиц в каноне) — запись безвредна.
- **1 миграция к накату:** `2026_06_22_170000_add_balance_transaction_id_to_saas_transactions`
(ADD COLUMN guarded). schema.sql уже **v8.52** ждёт её.
- **RLS-политики:** прод **44** == активных `CREATE POLICY` в schema.sql **44**. Дрейфа нет.
Счётчик в шапке schema.sql был `42` (исторический недоучёт) — **исправлен 42→44** этой сверкой
(см. CHANGELOG_schema.md, структурно БД не менялась).
## 4. Что поедет с накатом (а НЕ потеряно)
- 20 backend/frontend файлов → обновятся до HEAD; новые файлы (payment-gateway/ЮKassa под флагом
`billing_yookassa_enabled`=**off**, `ProjectBlockReleaseService`, утилиты); 1 миграция; **frontend
rebuild обязателен** (9 vue/ts → `public/build`).
- Деплой-нюанс F/J: «полный лимит» строже морозит клиентов с общим номером; роль планировщика
должна иметь INSERT на `balance_freeze_log`.
## 5. Вне git по своей природе (конфиг/секреты — НЕ потеря, живёт на проде)
- Прод `.env`: CAPTCHA/YOOKASSA-секреты, флаги. Проверить, что в **YC Lockbox** (бэкап секретов).
- Серверный конфиг: nginx (`/api/admin` basic-auth), systemd `liderra-queue`, cron-планировщик.
## 6. Вывод
**Вся работа всех сессий — в main и gitea-бэкапе. Прод чистый (0 правок мимо git). Схема
канонизирована. Дрейфа нет.** Деплой безопасен по дрейфу: накат только обновит прод до main,
затирать прод-only нечего. Остаётся выполнить сам накат (с GO владельца) по процедуре 19.06.