# R0 — Старт, доступ, безопасность (приёмочный тест боевого liderra.ru)

**Это первый ранбук набора. Прочти его целиком ДО любых действий.**
Дата составления: 18.06.2026. Версия прод-логики: см. `prod-logic-map.md` §0–§21.

---

## 0. Кто ты и что делаешь

Ты исполняешь **приёмочный тест боевого портала liderra.ru** перед передачей продажникам. Цель — доказать, что **платящему клиенту всё реально работает** (вход → проект → заказ поставщику → поставка лида → сделки → деньги → изоляция) и понять производительность/ёмкость. У тебя **нет стены «роутер-наставник»** — действуй свободно, но **по правилам безопасности ниже**. Вся ответственность за мутации на тебе.

Ты работаешь на **боевом** проде. Любая ошибка видна реальному бизнесу. Медленно, по карточкам, со сверкой.

---

## 1. Что прочитать первым (строгий порядок)

1. **`docs/superpowers/specs/2026-06-18-prod-logic-map.md`** — полная логика прода построчно (§0–§21: архитектура, проект, заказ, слепок, поставка, деньги, заморозка, сделки, изоляция, админ, крон, аудит; **§18** заказ/каскад/жребий/регионы/очередь, **§19** распределение лида в сделки, **§20** заморозка, **§21** блокировка/preflight share-aware). **Без этого не понять, что проверяешь.**
2. **`docs/superpowers/specs/2026-06-18-acceptance-test-charter.md`** — что тестируем (10 клиентских пунктов + слой D + **блок ПЕРЕСМОТР — каноничный**).
3. **Этот R0.**
4. Дальше — ранбуки **R1→R5 по порядку** (см. §5).

---

## 2. Доступ к проду

- **`ssh liderra-prod`** = боевой liderra.ru через бастион (gitea-VM). Команды на сервере: `ssh liderra-prod '<команда>'`.
- **Read-only SQL (без RLS-таблиц):** `ssh liderra-prod 'psql -h 127.0.0.1 -U crm_app_user -d liderra -tA -c "SELECT …"'` (пароль в `~/.pgpass` на бастионе).
- **RLS-таблицы** (`projects`, `deals`, `project_routing_snapshots`, `incidents`, ПДн) под `crm_app_user` **не читаются без tenant-контекста**:
  - `sudo -u postgres psql -d liderra -c "SET app.current_tenant_id='<ID>'; SELECT …"` (конкретный тенант), или
  - supplier-флоу — через роль `crm_supplier_worker` (BYPASSRLS) там, где cross-tenant нужен.
- **Браузерный тест** — Playwright против `https://liderra.ru` (вход тест-клиентом из R1).
- **`.env` под ubuntu не читается**. Вебхук-секрет, пароли тест-клиентов, креды — **берёшь у владельца**, в чат/логи не пишешь.

---

## 3. ⛔ БЕЗОПАСНОСТЬ — что НЕЛЬЗЯ (читать дважды)

- ⛔ **НЕ трогать `lkomega` / tenant 2** — реальный бизнес владельца («Компания 1», `info@lkomega.ru`, баланс ~1.83М ₽, 1013 сделок). Не править/удалять/вливать лиды/менять баланс.
- ⛔ **НЕ гонять живую поставку поставщика** (реальные деньги). Реальный заказ у поставщика crm.bp-gr.ru — **только тест-проектами**, **вычищать ДО 21:00 МСК** (иначе поставщик зафиксирует слепок и начнёт слать реальные платные лиды).
- ⛔ **НЕ светить секреты** в чат/логи/коммиты.
- ✅ **Все тест-объекты — с маркером `TEST-`** (клиенты, проекты), для teardown.
- ✅ Прод **спит** (0 активных проектов) — рабочее окно. Но lkomega-данные на месте — не задень. **Железо слабое (см. §9) — на нагрузке (R4) действуй со SAFETY-стопом.**

---

## 4. При критдефекте — СТОП

Деньги расходятся / изоляция течёт / чужие данные:
1. **Останови прогон по этому пункту.**
2. Зафиксируй: «**ожидали / получили / факт из БД**» (команды + числа).
3. **Доложи владельцу. НЕ чини на боевом.**
UX-косяки — отдельным списком, прогон не блокируют.

---

## 5. Набор ранбуков и порядок

| Ранбук | Что делает |
|---|---|
| **R0** (этот) | старт, доступ, безопасность, формат, гарантии |
| **R1** | провижининг **7 тест-клиентов / 16 проектов / 12 rt** (онбординг/SQL, маркер `TEST-`) + парный teardown-скрипт |
| **R2** | инъекционный стенд: вливание лида (snapshot → POST webhook); TOTP для 2FA |
| **R3** | прогон движка карточками: распределение/деньги/сделки/изоляция + **Часть E — all-pairs (27 прогонов)** + блокировка share-aware |
| **R4** | слой D — нагрузка/ёмкость: **адаптивный ramp до ~3000 лидов на шеринг-источник + параллельные правки + SAFETY-стоп** (железо 2 ГБ), цель 10k/сут, кривая+прогноз |
| **R5** | финал: сверки денег/изоляции, `audit:verify-chains`, teardown, формат отчёта |
| **R3b** | (после деплоя G1/G2/G3) онбординг, дайджест-письма, проверка что напоминания убраны |

Порядок: R1 строит популяцию, R2 даёт инструмент, R3 гоняет (корректность+all-pairs), R4 нагружает, R5 убирает и сводит отчёт.

---

## 6. Формат шага — СТАНДАРТ (уровень C, исчерпывающий)

Каждый шаг — **самодостаточная карточка**. Тебе НЕ нужно знать логику — только выполнить и сверить. Поля: **ID+название · §ref · Что · Предусловие(+сверка) · Действие(буквально) · Ожидаем(точно) · Сверка(команды) · Если не так · Покрывает**.

### Образец карточки (так выглядит КАЖДЫЙ шаг):

> **Шаг M1 — Списание за один поставленный лид (тройная запись + копейки)**
> **§ref:** prod-logic-map §6, §19.4 п.8
> **Что:** один лид → одно списание по ступени; три согласованные записи; баланс копейка-в-копейку.
>
> **Предусловие:**
> - `c1`: `balance_rub` = 100000.00, `delivered_in_month` = 0 (→ T1).
> - ⚠️ **Цену НЕ зашивай — читай живой тариф:** `SELECT price_per_lead_kopecks FROM pricing_tiers WHERE is_active ORDER BY tier_no LIMIT 1;` (на момент написания 50000 коп = 500₽, но **планируется ≤65₽** — бери из БД).
> - Сверка: `psql … "SELECT balance_rub, delivered_in_month FROM tenants WHERE id=<C1>"` → `100000.00 | 0`.
>
> **Действие (инъекция 1 лида, механика — R2):**
> 1. Строка слепка за активную дату для проекта c1 (`snapshot:backfill`).
> 2. `POST https://liderra.ru/api/webhook/supplier/<СЕКРЕТ>` body: `{"vid":777,"project":"B2_test-okna.ru","phone":"79161234567","time":<unix>}`.
>
> **Ожидаем (точно, `T1` = цена из БД):**
> - `tenants.balance_rub`: 100000.00 → (100000.00 − T1₽); `deals` +1 (c1, status='new', city=<регион>);
> - `lead_charges` +1 (`price_kopecks`=T1, source=rub, tier_no=1); `balance_transactions` +1 (−T1); `supplier_lead_costs` +1; `delivered_today` c1 +1.
>
> **Сверка:** баланс = 100000−T1; `count,sum(price_kopecks)` по deal = `1|T1`; `(старый−новый)*100==price_kopecks`.
>
> **Если не так:** баланс не на T1 / нет одной из 3 записей / две сделки / charge без сделки → **СТОП**, зафиксируй, не чини, доложи. **Критдефект денег.**
>
> **Покрывает:** §6 (цена=ступень), §19.4-8 (атомарная тройная запись + откат).

---

## 7. Гарантия от пропусков (этого боится владелец)

- В конце **каждого** ранбука — **матрица покрытия**: каждый инвариант (§18/§19/§20/§21 + пункты хартии) → шаг. Инвариант без шага = дыра, заполни.
- **Финальный чек-лист «ничего не пропущено»** перед закрытием ранбука.
- **Не пропускай шаг молча** — `SKIP` + причина в отчёте.

---

## 8. Как фиксировать результат

Для каждого шага: **статус** `PASS`/`FAIL`/`SKIP` + «**ожидали / получили**» (числа+команды). Накапливай в отчёт (формат — R5). Деньги/изоляция — нулевая терпимость; UX — отдельным списком.

---

## 9. Шпаргалка ключевых фактов (полное — в `prod-logic-map.md`)

- **Железо прода слабое:** `liderra-test` 10.128.0.15 = **2 ГБ RAM · 2 vCPU @ 20% доля (burstable) · 20 ГБ**. Под нагрузкой троттлит, память тесная (риск swap/OOM) → R4 со SAFETY-стопом.
- **Очередь = ОДИН воркер** (`liderra-queue.service`) → все задания (раздача/синки/письма) последовательно.
- **Лид → до 3 клиентов** (CAP=3, §19). Жребий **взвешенный по остатку, в проде CSPRNG** → проверяй **инварианты**, не точный состав.
- **Каскад региона:** точный (шаг1) → «вся РФ» добор (шаг2) → подмена (шаг3).
- **Заказ сайта = 3 rt** B1/B2/B3; формула `max(наиб, ⌈Σ/3⌉)`.
- **Блокировка (§21) хитрая:** `required` для заморозки/preflight — **share-aware доля** в заказе группы `⌈order×лимит/Σ⌉`, не сырой лимит. Шерящий замораживается труднее.
- **Тарифы** — числа из живой `pricing_tiers` (планируется ≤65₽), НЕ зашивай.
- **Регионы — порядковые 1..89:** **Москва=82** (НЕ 77!), СПб=83, Татарстан=16, Москобл=56 (не маппится у поставщика). Лидерра→ГИБДД биекция на 79.
- **Активная дата слепка:** до 21:00 МСК — сегодня, после — завтра. Тест-проекты чистить ДО 21:00.
- **Изоляция:** RLS (`app.current_tenant_id`) + явный `where(tenant_id)`; cross-tenant — только supplier-флоу (BYPASSRLS).
- **Метод раздачи — all-pairs:** 27 прогонов S×R×B×Lim×D (доказано 111 пар) + кластер шеринга + групповые (R3 Часть E). Популяция **7 клиентов / 16 проектов / 12 rt**.

---

## Матрица покрытия R0
R0 — установочный (без тест-шагов). Перед выходом: ✅ прочитал map §0–§21 · ✅ понял доступ · ✅ усвоил «что нельзя» (§3) · ✅ формат карточки (§6) и фиксацию (§8) · ✅ усвоил шпаргалку §9 (железо/блокировка/Москва=82/all-pairs).

**Дальше → R1 (провижининг 7/16).**
