From b11e1d971caf1891a871d8c52651ee63af42ece2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Tue, 23 Jun 2026 19:17:36 +0300 Subject: [PATCH] =?UTF-8?q?chore/schema:=20=D1=81=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B0-=D1=87=D0=B8=D1=81=D1=82=D0=BA=D0=B0=20=D0=BF=D0=B5?= =?UTF-8?q?=D1=80=D0=B5=D0=B4=20=D0=B7=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=BE?= =?UTF-8?q?=D0=BC=20=E2=80=94=20=D0=BC=D0=B5=D1=82=D1=80=D0=B8=D0=BA=D0=B0?= =?UTF-8?q?=20RLS=2042=20=D0=B2=2044=20+=20=D0=BF=D1=80=D0=B5=D0=B4-=D0=B4?= =?UTF-8?q?=D0=B5=D0=BF=D0=BB=D0=BE=D0=B9=D0=BD=D1=8B=D0=B9=20=D0=B0=D1=83?= =?UTF-8?q?=D0=B4=D0=B8=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Сверка боевого 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) --- db/CHANGELOG_schema.md | 13 ++++ db/schema.sql | 3 +- ...6-06-23-PRE-DEPLOY-drift-and-loss-audit.md | 61 +++++++++++++++++++ 3 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 docs/superpowers/findings/2026-06-23-balance-block/2026-06-23-PRE-DEPLOY-drift-and-loss-audit.md diff --git a/db/CHANGELOG_schema.md b/db/CHANGELOG_schema.md index f76d2635..2b55b7e9 100644 --- a/db/CHANGELOG_schema.md +++ b/db/CHANGELOG_schema.md @@ -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` diff --git a/db/schema.sql b/db/schema.sql index 6b8df6d9..ea8ecd16 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -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 лимитов) diff --git a/docs/superpowers/findings/2026-06-23-balance-block/2026-06-23-PRE-DEPLOY-drift-and-loss-audit.md b/docs/superpowers/findings/2026-06-23-balance-block/2026-06-23-PRE-DEPLOY-drift-and-loss-audit.md new file mode 100644 index 00000000..4bb65210 --- /dev/null +++ b/docs/superpowers/findings/2026-06-23-balance-block/2026-06-23-PRE-DEPLOY-drift-and-loss-audit.md @@ -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.