# Пред-деплойный аудит: дрейф прод↔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.
