# 🚀 ПРОМТ ДЛЯ СЕССИИ-ИСПОЛНИТЕЛЯ — приёмочный тест боевого liderra.ru

> **Это твой единственный вход. Читай сверху вниз и делай РОВНО как написано. Кодовая фраза стены: «роутер-наставник».**
> Ты — новая сессия. Твоя задача — провести **полный приёмочный тест боевого портала liderra.ru** «глазами клиента» перед передачей продажникам, и выдать вердикт **GO/NO-GO**. Прод спит (один реальный клиент — омега). Подготовка уже сделана прошлой сессией (см. §2). Не импровизируй — где не уверен, **спроси владельца**, не гадай.

---

## ⛔ §1. ЖЕЛЕЗНЫЕ ЗАПРЕТЫ (прочитай дважды — это БОЕВОЙ прод)

1. **НИКОГДА не трогай `tenant_id = 2`** — это **`Компания 1` / `info@lkomega.ru`**, ЕДИНСТВЕННЫЙ реальный клиент (баланс **1 835 400 ₽**, **1013 сделок**, **117 проектов**). Не править, не удалять, не списывать, не имперсонировать, не включать в выборки на запись. **Любая мутирующая SQL ОБЯЗАНА содержать `tenant_id IN (<твои TEST-id>)` или `<> 2`. Перед КАЖДОЙ мутацией перечитай WHERE и убедись: tenant 2 НЕ затрагивается.**
2. **Все тест-объекты — с маркером `TEST-`** (в `tenants.organization_name` И `tenants.subdomain`). ⚠️ У таблицы `tenants` **НЕТ колонки `name`** — опознавай тест-тенантов по `organization_name`/`subdomain`, не по `name` (иначе SQL упадёт).
3. **Все инъекции вебхука — с `vid` из зарезервированного TEST-диапазона `9000000000000..9999999999999`** (13 цифр). Это единственный маркер для уборки orphan-таблиц (`supplier_leads`/`webhook_log`/`failed_webhook_jobs` — без `tenant_id`).
4. **Реальный заказ у поставщика crm.bp-gr.ru — только тест-проектами, чистить rt-проекты ДО 21:00 МСК.** Иначе поставщик зафиксирует слепок и начнёт слать платные лиды.
5. **Критдефект** (деньги расходятся / изоляция течёт / видны чужие данные / двойное списание): **СТОП по пункту**, зафиксируй «ожидали / получили / факт из БД», **доложи владельцу, НЕ чини на боевом**. UX-косяки — в отдельный список, прогон не блокируют.
6. **Секреты** (вебхук-секрет, пароли) — бери у владельца, **в чат/логи/коммиты не писать**.
7. **Read-only `SELECT` — свободно. Мутации — осознанно**, по правилам выше. Доступ к проду: `ssh liderra-prod '<команда>'`; RLS-таблицы — `sudo -u postgres psql -d liderra -c "SET app.current_tenant_id='<ID>'; SELECT …"`.
8. **Перед массовым удалением (teardown) — свежий `pg_dump`** (как в R5). Не удаляй `auth_log`/`saas_admin_audit_log` (глобальная audit-цепочка — порвёшь `verify-chains`; это находка N-3).

---

## §2. СОСТОЯНИЕ ПРОДА НА СТАРТ (что оставила прошлая сессия 21.06)

- **Прод вычищен: остался ТОЛЬКО tenant 2 (омега).** Все demo/test-тенанты (1,3,4,5,16) удалены. Чистый фон — случайно зайти не подо что.
- **Капча на проде — РЕАЛЬНАЯ** Yandex SmartCaptcha (`CAPTCHA_DRIVER=yandex`, site-key боевой, `test=false`). Headless-автомат её НЕ решит (см. §5 про онбординг).
- **Playwright/синк к поставщику — РАБОТАЕТ** (браузер установлен, сессия в Redis жива).
- **Выкачено на прод и проверено:** M-1 (fail-closed админ-гейт), M-2 (реальная капча), F-CSV (экранирование выгрузок), F-DEPTRAC, rate-limit `/api/v1/deals`, N-4 (дедуп дайджеста mark-after).
- **Код:** локалка = прод-исходники = gitea-бэкап **байт-в-байт**. Бэкап БД до сноса: `/tmp/liderra-pre-teardown.dump` (откат возможен).
- **Прежние «живые ящики» `kdv1@/stels_info@` УДАЛЕНЫ** — для писем бери свежий ящик, которым владеешь.

---

## §3. ЧТО ВЗЯТЬ У ВЛАДЕЛЬЦА ПЕРЕД СТАРТОМ (НЕ начинай прогон без этого — спроси)

1. **Вебхук-секрет** (`system_settings.supplier_webhook_secret`) — для инъекций R2.
2. **Тест-IP в allowlist** ИЛИ подтверждение «инъекция с самого прод-сервера» (`ssh liderra-prod 'curl … 127.0.0.1 …'`). На проде пустой allowlist = fail-closed (404).
3. **Живой ящик, которым владелец управляет** — для писем онбординга/дайджеста/заморозки.
4. **Готовность владельца решать капчу** для онбординг-карточек (см. §5) и подтверждение окна/«прод спит»/дедлайн 21:00 по поставщику.
5. **Пароли** для входа (если понадобятся под конкретные сценарии).

---

## §4. ЧТО ПРОЧИТАТЬ — строгий порядок (не пропускай)

1. **МАСТЕР:** `docs/superpowers/specs/2026-06-20-acceptance-MASTER-execution-handoff.md` (точка входа, маршрут, формат отчёта).
2. **Логика прода:** `docs/superpowers/specs/2026-06-18-prod-logic-map.md` §0–§21 (без неё не понять, что проверяешь).
3. **Хартия:** `docs/superpowers/specs/2026-06-18-acceptance-test-charter.md`.
4. **R0** (доступ/безопасность/формат карточки): `docs/superpowers/runbooks/2026-06-18-acceptance-r0-start-access-safety.md`.
5. **Ранбуки R1→R5 + R3b** по порядку (исполняемая форма) — `docs/superpowers/runbooks/2026-06-18-acceptance-r{1,2,3,3b,4,5}-*.md`. У каждого есть **Часть F «Расширенный охват»** (Раздел B) — гнать тоже.
6. **Реестр находок + расширение охвата:** `docs/superpowers/specs/2026-06-20-acceptance-findings-register.md`, `2026-06-21-acceptance-coverage-expansion-NEW.md`, `2026-06-21-acceptance-prep-review.md`.
7. **26 пер-пунктовых планов:** `docs/superpowers/plans/2026-06-20-acceptance-*` — детальные `было→ожидали→стало` + код-факты file:line.
8. **ТЕЛЕВИЗОР/эфир (формат показа владельцу):** `docs/superpowers/specs/2026-06-20-acceptance-efir-handoff.md` (§1 формат карточки + механика) и `2026-06-19-acceptance-televizor-proof-design.md` (дизайн доказательства). См. §4.5 ниже — без эфира работа не принята.

> Перед открытым codebase-вопросом — сначала `/graphify query`, потом Read/Grep (правило CLAUDE.md §5 п.14).

---

## 📺 §4.5. ТЕЛЕВИЗОР — ЖИВОЙ ЭФИР ВЛАДЕЛЬЦУ (обязательно, это половина работы)

> Владелец **НЕ программист** и **смотрит прогон вживую, как телевизор**. Это не побочка — это второй выход результата (мастер §3: техкарточка для тебя + живой эфир для владельца). **Каждый** пройденный пункт обязан стать карточкой эфира простым языком. Без эфира работа не принята.

**Что это:** `live-demo/efir.html` — страница-«телевизор»: сама опрашивает `steps/count.txt`, рисует карточки `steps/NNNN.json`, у владельца пульт **▶/⏸**. (Старые `player.html`/`proof.html` — устарели, НЕ использовать.)

**Поднять (это и есть Шаг 0, ДО прогона):** `cd live-demo && php -S 0.0.0.0:8899` → владелец открывает `http://localhost:8899/efir.html`. Пульт: `control.php?set=play|pause` пишет `steps/control.txt`.

**На КАЖДЫЙ пройденный пункт роняй карточку `live-demo/steps/NNNN.json`, затем `steps/count.txt`++:**
```json
{
  "punkt": "Группа (раздел)", "title": "Заголовок шага", "status": "ok | fail | note",
  "did": "что сделал — простыми словами",
  "rows": [{"what":"...","was":"было...","exp":"ожидали...","got":"стало...","proof":"shot|text"}],
  "inside": "💡 что внутри портала простым языком (без SQL/жаргона)",
  "shots": [{"cap":"📸 подпись","img":"img/файл.png"}]
}
```
**Правила эфира (согласованы с владельцем — не переспрашивать):**
- Язык — **человеческий, без SQL/кода/жаргона**; технику держи «под капотом».
- Каждый шаг = **`было → ожидали → стало`** (не слово «проверил»).
- **Что видно на экране** (баланс/сделки/плашка/реквизиты) — **обязательно 📸 живой скриншот** (Playwright против `https://liderra.ru`) в `live-demo/img/`, ссылка в `shots`.
- **Что внутри** (раздача/списание/цепочка) — **💡 простыми словами** + (для себя) сверка в БД.
- Бэйдж: ✅ `ok` сошлось · 🔴 `fail` не сошлось · ℹ️ `note` (прод-only заметка).
- **Автопродолжение/пауза:** батчами через `ScheduleWakeup` (~90с); каждый wake читай `steps/control.txt`: `pause`→жди (reschedule), `play`→следующий батч + карточки + `count.txt`++.

**Ты ведёшь ДВА выхода параллельно:** (1) техкарточка R0 §6 (PASS/FAIL + сверка БД — для тебя) и (2) карточка эфира (простым языком + 📸 — для владельца-«телевизора»). Формат эфира — `2026-06-20-acceptance-efir-handoff.md` §1; дизайн доказательства — `2026-06-19-acceptance-televizor-proof-design.md`.

---

## §5. ПОШАГОВЫЙ ПОРЯДОК — делай ровно так

**Шаг 0. Подними ТЕЛЕВИЗОР/эфир** (см. §4.5 — обязательно, до прогона): `cd live-demo && php -S 0.0.0.0:8899` → `efir.html`. Дальше на КАЖДЫЙ пункт ниже — карточка эфира + техкарточка.

**Шаг 1. R1 — провижининг** (`…r1-provisioning.md`): завести **7 тест-клиентов `TEST-C1..C7` / 16 проектов / 12 rt**.
- Тенанты — SQL-INSERT (sudo postgres) с маркером `TEST-` в `organization_name`+`subdomain`, bcrypt-пароль, `is_active=true`. **`imitation:seed` на проде ЗАПРЕЩЁН.**
- ⚠️ **R1 предусловие (гейт реквизитов):** SQL-засев даёт тенанта **без** реквизитов → создание проекта вернёт 422 `requisites_required`. Перед заведением проектов заполни лёгкие реквизиты (subject_type+contact_name+contact_phone, +ИНН для ЮЛ/ИП), и баланс ≥ Σ(лимиты)×тариф (иначе 409).
- Проекты — **через ПОРТАЛ** (иначе нет синка к поставщику и rt не появятся).
- Собери **парный teardown-скрипт** (список id) сразу.

**Шаг 2. R2 — инъекционный стенд** (`…r2-injection-stand.md`): слепок (`snapshot:backfill --date=<активная>` — НЕ `rebuild` вслепую, N-5) → `POST /api/webhook/supplier/<СЕКРЕТ>` с **`vid` из TEST-диапазона**. Проверь HMAC-путь (I8) и `phones[]` (I9).

**Шаг 3. R3 — движок** (`…r3-engine.md`): пункты №1–№16 карточками (распределение/деньги/сделки/изоляция) + **Часть E all-pairs (27)** + **Часть F** (CsvReconcile, вечерняя заморозка, терминальные пути, T7, bulk-изоляция и т.д.).
- ⚠️ **Регионы — порядковые 1..89, НЕ ГИБДД:** Москва=82, СПб=83, **Татарстан=19** (НЕ 16 — 16 это Мордовия!), Москобл=56.
- Инварианты, не точный состав (жребий в проде случайный).

**Шаг 4. R3b — онбординг/UI/G6/G7** (`…r3b-onboarding-digest.md`): №18–№26 + **Часть F** (отчёты-цикл, импорт-правила, G6 API, G7 поддержка/impersonation).
- 🔑 **ОНБОРДИНГ ЧЕРЕЗ РЕАЛЬНУЮ КАПЧУ — владелец даёт тебе ДВЕ вещи:** (1) **решает капчу** вручную (либо (а) сам регистрируется в своём браузере и ты продолжаешь под аккаунтом, либо (б) ты ведёшь Playwright, на капче ставишь паузу, владелец решает в видимом окне, ты жмёшь «отправить»); (2) **код из письма** — 6-значный код приходит **письмом на ящик владельца** (в ответе API на проде кода нет, в чужую почту ты не залезешь) → **владелец читает код и передаёт тебе** для шага ONB-CODE, ты вводишь. Так проверяются ONB-REG/ONB-CODE/ONB-CAPTCHA (хотя бы 1 раз вживую); остальную популяцию — SQL (R1).

**Шаг 5. R4 — нагрузка** (`…r4-load-capacity.md`): адаптивный ramp до SAFETY-стопа (2 ГБ, омега спит рядом — не уронить).

**Шаг 6. R5 — финал/teardown/вердикт** (`…r5-finalize-teardown.md`):
- Сверки: F1 Σ-деньги по копейкам, F2 изоляция 0 утечек, F3 `audit:verify-chains` зелёный, F4 маржа.
- **TD1 убрать тест rt-проекты у поставщика ДО 21:00.** TD2–TD5 — слепки → тест-тенанты (trigger-bypass под postgres) → Redis → проверка чистоты.
- ⚠️ **Teardown тест-тенантов:** опознавай их по `organization_name`/`subdomain LIKE 'TEST-%'` (НЕ `name`). Удаляй строго `WHERE tenant_id IN (<TEST-id>)`, **никогда не 2**. Скрипт TD3 уже исправлен (N-1: `supplier_lead_costs` через `deal_id`; строка `reminders` убрана). orphan-таблицы (supplier_leads/log/webhook/failed) — по TEST-`vid`-диапазону (N-2). **auth_log не трогать** (N-3).
- **Итог: вердикт GO / NO-GO** (формат R5).

---

## §6. АНТИ-ОШИБКА — проверка перед КАЖДОЙ мутацией прода (ритуал)

Прежде чем выполнить любой `DELETE/UPDATE/INSERT` или мутирующий `ssh`:
1. **Назови вслух (в ответе) tenant-id, которые затрагиваешь.** Если среди них **2** — СТОП, ты ошибся.
2. **WHERE обязан фильтровать по `tenant_id IN (<твои TEST-id>)`** (или `<> 2`). Без явного фильтра — не выполнять.
3. **Перед teardown — `pg_dump`.** После teardown — **проверь омегу:** `SELECT balance_rub, (SELECT count(*) FROM deals WHERE tenant_id=2) FROM tenants WHERE id=2` → должно остаться **1835400.00 / 1013** (если изменилось — ты задел омегу, СТОП, откат из дампа).
4. **Не обходи стену/гейты обходными путями.** Упёрся — спроси владельца (CLAUDE.md §5 п.7).
5. **«Готово» — только если правда проверил** реальной командой/БД, не «по памяти».

---

## §7. ВЕРДИКТ (формат R5)

- **GO** — деньги сходятся копейка-в-копейку (F1), изоляция 0 утечек (F2), аудит зелёный (F3), ядро (раздача→списание→сделка→изоляция) проходит сквозь, критдефектов нет. UX-косяки GO не блокируют (список владельцу).
- **NO-GO** — любой критдефект денег/изоляции/чужих данных.

Итоговый отчёт — по пунктам PASS/FAIL/SKIP + находки + ёмкость + вердикт. Положи в `docs/superpowers/specs/2026-06-21-acceptance-RUN-report.md`. Коммит — спросить владельца.

---

## §8. СТАРТ ПРЯМО СЕЙЧАС

1. Прочитай §4 (мастер → map → хартия → R0).
2. Спроси у владельца §3 (секрет, IP, ящик, готовность решать капчу, окно).
3. Подними эфир (Шаг 0).
4. Иди R1 → R2 → R3(+E,+F) → R3b(+F) → R4 → R5. На каждом пункте — карточка + сверка БД + (если видно на экране) живой скриншот Playwright против `https://liderra.ru`.
5. Перед любой мутацией — ритуал §6. Критдефект → СТОП + владельцу. Teardown ДО 21:00. Финал → вердикт.

**Не уверен — спроси. Не выдумывай — открой и проверь. Омегу (tenant 2) — не трогай.**
