Files
portal/docs/superpowers/specs/2026-06-20-acceptance-MASTER-execution-handoff.md
T
Дмитрий e217103d3d docs(приёмка): мастер-хэндофф для прод-прогона + планы 24/25/26 + поправки
Мастер-документ точки входа для свежей сессии: тест на боевом liderra.ru,
порядок R1-R5, карта 26 планов, безопасность, эфир, вердикт GO/NO-GO.
Планы 24 помощь, 25 импер­сонизация, 26 публичный API.

Поправка: F-DIGEST снята — была ошибкой чтения устаревшего комментария,
не отставанием локалки (она байт-в-байт с боевым a119aba8). Канон-схема
db/schema.sql:796 new_lead.email:true — дайджест вкл по умолчанию. План 20
и реестр обновлены. Тесты — только на проде.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 16:47:29 +03:00

172 lines
20 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# МАСТЕР-ХЭНДОФФ: полный приёмочный тест боевого liderra.ru — точка входа для свежей сессии
> **🟢 ЧИТАЙ ЭТО ПЕРВЫМ. Ты — новая сессия-исполнитель. Этот документ ведёт тебя от старта до вердикта GO/NO-GO. Не угадывай — иди по ссылкам.**
**Дата:** 20.06.2026. **Кодовая фраза стены:** «роутер-наставник» (на приёмке стена снята — действуй свободно, но строго по §1 безопасности).
**Что ты делаешь:** прогоняешь **полное приёмочное тестирование боевого портала `liderra.ru`** «глазами клиента» — перед передачей продажникам. Доказываешь, что платящему клиенту **всё реально работает** (вход → проект → заказ поставщику → поставка лида → сделки → деньги → изоляция → отчёты/импорт/онбординг/помощь/API), и оцениваешь ёмкость/железо.
---
## ⛔ §1. БЕЗОПАСНОСТЬ — прочитать дважды (это БОЕВОЙ прод)
Полный свод — [R0 §3-§4](../runbooks/2026-06-18-acceptance-r0-start-access-safety.md). Кратко, неотменяемо:
-**НЕ трогать `lkomega` / tenant 2** — реальный бизнес владельца («Компания 1», `info@lkomega.ru`, баланс ~1.83М ₽, 1013 сделок ЦЕЛ). Не править/удалять/вливать/менять баланс.
-**Реальный заказ у поставщика crm.bp-gr.ru — только тест-проектами, вычищать ДО 21:00 МСК** (иначе поставщик зафиксирует слепок и начнёт слать реальные платные лиды).
-**НЕ светить секреты** (вебхук-секрет, пароли, креды) в чат/логи/коммиты. Берёшь у владельца.
-**Все тест-объекты — с маркером `TEST-`** (для teardown).
-**Мутации прода — осознанно** (стены нет; вся ответственность на тебе). Read-only SELECT — свободно.
- 🛑 **Критдефект** (деньги расходятся / изоляция течёт / чужие данные): **СТОП по пункту**, зафиксируй «ожидали/получили/факт из БД», **доложи владельцу, НЕ чини на боевом**. UX-косяки — отдельным списком, прогон не блокируют.
- ⚠️ **Прод спит** (0 активных проектов) — рабочее окно; железо слабое (2 ГБ / 2 vCPU@20%) → на нагрузке (R4) со SAFETY-стопом.
---
## §2. ЧТО ПРОЧИТАТЬ — строгий порядок
1. **Этот мастер** (точка входа, маршрут, формат отчёта, безопасность).
2. **[prod-logic-map.md](2026-06-18-prod-logic-map.md)** §0–§21 — логика прода построчно. **Без неё не понять, что проверяешь.**
3. **[Хартия](2026-06-18-acceptance-test-charter.md)** — объём (10 клиентских пунктов + слой D + блок **ПЕРЕСМОТР — каноничный**).
4. **[R0](../runbooks/2026-06-18-acceptance-r0-start-access-safety.md)** — доступ, безопасность, формат карточки.
5. **Ранбуки R1→R5 + R3b** по порядку (исполняемая техформа) — см. §4.
6. **26 пер-пунктовых планов** (этой серии, `docs/superpowers/plans/2026-06-20-acceptance-*`) — детальные `было→ожидали→стало` + код-факты file:line + что снимать 📸 / что 💡 — см. §5.
7. **[Реестр находок](2026-06-20-acceptance-findings-register.md)** — что уже найдено, что перепроверить.
8. **[Хэндофф эфира](2026-06-20-acceptance-efir-handoff.md)** §1, §4 — формат живого показа владельцу.
> ✅ **ЛОКАЛЬНЫЙ РЕПОЗИТОРИЙ В СИНХРОНЕ С БОЕВЫМ.** Деплой `01a9029c` (G1G7, schema v8.49) — в локальной истории (предок HEAD), код байт-в-байт с прода. Код-факты планов читаны из локального `app/` и валидны.
> ⚠️ **НО канон — это сама схема/код, а не комментарии-докблоки.** Одна находка (F-DIGEST) была ложной, потому что я прочитал **устаревший комментарий** в `NotificationService.php` вместо канона `db/schema.sql` (дефолт письма). Правило: критичные факты сверяй по **схеме/живому коду**, не по комментариям; и поскольку это **прод-тест** — подтверждай ключевые числа на самом проде (R0 §2). См. §7.
---
## §3. ДВА ВЫХОДА: техническая сверка + живой эфир владельцу
Ты делаешь **одно** действие, но фиксируешь его **двумя** способами:
| Слой | Для кого | Формат | Где |
|---|---|---|---|
| **Техническая сверка** | для тебя/контроля | карточка R0 §6: `ID · §ref · Предусловие · Действие · Ожидаем · Сверка(команды) · Если не так · Покрывает`; статус `PASS/FAIL/SKIP` + «ожидали/получили» | накапливаешь в отчёт (R5) |
| **Живой эфир** | для владельца (НЕ программист) | карточка `было→ожидали→стало` простым языком + **📸 живой скриншот** того, что видно на экране + **💡** объяснение внутреннего; бэйдж ✅/🔴/ℹ️ | `live-demo/steps/NNNN.json` |
**Правило:** что видно на экране портала (баланс, сделки, плашка, реквизиты) — **обязательно 📸 живой скриншот** (Playwright против `https://liderra.ru`). Что внутри (раздача, списание, цепочка) — **💡 простыми словами + 📝 сверка в БД** (read-only).
### Механика эфира (поднять перед показом)
- В `live-demo/`: `php -S 0.0.0.0:8899` → открыть `http://localhost:8899/efir.html` (кнопки ▶/⏸ — пульт владельца).
- Карточки роняешь в `live-demo/steps/NNNN.json` (формат — [эфир-хэндофф §1](2026-06-20-acceptance-efir-handoff.md)), увеличиваешь `steps/count.txt`, скриншоты в `live-demo/img/`.
- Авто-продолжение/пауза — `ScheduleWakeup` + читать `steps/control.txt` (`play`/`pause`).
- Уже отснято 13 образцовых карточек (онбординг/раздача/баланс/изоляция/помощь/API) — на боевом пересними живыми снимками `liderra.ru`.
---
## §4. ПОРЯДОК ИСПОЛНЕНИЯ — ранбуки (техническая спина)
| Этап | Ранбук | Что делает | Уборка/риск |
|---|---|---|---|
| 1 | **[R1](../runbooks/2026-06-18-acceptance-r1-provisioning.md)** | провижининг **7 тест-клиентов / 16 проектов / 12 rt** (SQL `TEST-`, owner-escape; проекты — через ПОРТАЛ, иначе нет синка) + парный teardown-скрипт | rt у поставщика → чистить до 21:00 |
| 2 | **[R2](../runbooks/2026-06-18-acceptance-r2-injection-stand.md)** | инъекционный стенд: слепок (`snapshot:backfill`) → `POST /api/webhook/supplier/<СЕКРЕТ>`; TOTP для 2FA | секрет у владельца |
| 3 | **[R3](../runbooks/2026-06-18-acceptance-r3-engine.md)** | движок карточками: распределение/деньги/сделки/изоляция + **Часть E all-pairs (27 прогонов)** + блокировка share-aware | тест-баланс, не реальные деньги |
| 3б | **[R3b](../runbooks/2026-06-18-acceptance-r3b-onboarding-digest.md)** | онбординг (G1), дайджест-письма (G2), напоминания убраны (G3) — **после деплоя, перечитать на проде** | живые ящики kdv1@/stels_info@ |
| 4 | **[R4](../runbooks/2026-06-18-acceptance-r4-load-capacity.md)** | слой D — нагрузка: **адаптивный ramp до ~3000 лидов + параллельные правки + SAFETY-стоп** (2 ГБ), цель 10k/сут, кривая+прогноз | боевая коробка, lkomega рядом |
| 5 | **[R5](../runbooks/2026-06-18-acceptance-r5-finalize-teardown.md)** | финал: сверки денег/изоляции, `audit:verify-chains`, **teardown** (поставщик→слепки→тест-тенанты→Redis), вердикт **GO/NO-GO** | teardown строгий порядок |
**Логика порядка:** R1 строит популяцию → R2 даёт инструмент → R3 гоняет корректность+all-pairs → R3b онбординг/UI → R4 нагружает → R5 убирает и выносит вердикт.
---
## §5. КАРТА: пункт свода → пер-пунктовый план (детализация `было→ожидали→стало` + код-факты)
26 планов этой серии в `docs/superpowers/plans/2026-06-20-acceptance-*`. Каждый — детальный разбор пункта с file:line, что снимать 📸, что 💡, и где честно помечены расхождения свода с кодом (находки).
| Пункт | План-файл | Гонится в |
|---|---|---|
| PR2 проекты→12 rt | `…-PR2-projects-plan.md` | R1 |
| PR3 балансы | `…-PR3-balances-plan.md` | R1 |
| №1 распределение/CAP=3 | `…-01-distribution-cap-plan.md` | R3 |
| №2 второй круг | `…-02-second-round-plan.md` | R3 |
| №3 каскад региона | `…-03-region-cascade-plan.md` | R3 |
| №4 лимит/пауза под локом | `…-04-limit-pause-under-lock-plan.md` | R3 |
| №5 идемпотентность | `…-05-idempotency-plan.md` | R3 |
| №6 каналы/парсинг | `…-06-channels-parsing-plan.md` | R3 |
| №7 списание+тройная запись | `…-07-charge-triple-entry-plan.md` | R3 |
| №8 тариф-ступень | `…-08-tier-step-plan.md` | R3 |
| №9 нехватка→откат+автопауза | `…-09-insufficient-rollback-plan.md` | R3 |
| №10 два проекта=одно списание | `…-10-two-projects-one-charge-plan.md` | R3 |
| №11 лента денег+калькуляторы | `…-11-money-ledger-calculators-plan.md` | R3 |
| №12 денежный аудит | `…-12-money-audit-plan.md` | R3/R5 |
| №13 сделки лента/карточка/статусы | `…-13-deals-list-card-status-plan.md` | R3 |
| №14 ручная/массовые/экспорт | `…-14-manual-bulk-export-plan.md` | R3 |
| №15 сделки переживают удаление проекта | `…-15-deals-survive-project-delete-plan.md` | R3 |
| №16 изоляция | `…-16-isolation-plan.md` | R3/R5 |
| №18 онбординг | `…-18-onboarding-plan.md` | R3b |
| №19 гейт реквизитов+ИНН | `…-19-requisites-gate-inn-plan.md` | R3b |
| №20 колокольчик+дайджест | `…-20-bell-digest-plan.md` | R3b |
| №21 напоминания убраны | `…-21-reminders-gone-plan.md` | R3b |
| №22 отчёты | `…-22-reports-plan.md` | R3b |
| №23 импорт CSV | `…-23-csv-import-plan.md` | R3b |
| №24 помощь | `…-24-help-support-plan.md` | R3b |
| №25 импер­сонизация (клиентская плашка) | `…-25-impersonation-client-plan.md` | R3/прод |
| №26 публичный API+ключи | `…-26-public-api-keys-plan.md` | R3b |
**№17 all-pairs (27 прогонов)** — не отдельный пункт, а **матрица прогона** пунктов №1–№16 в сочетаниях S×R×B×Lim×D → **R3 Часть E** (генератор 111 пар). **Фаза 4 (нагрузка)** → R4. **Фаза 5 (финал/вердикт)** → R5. **PR1 (7 клиентов)** + **PR4 (teardown-скрипт)** → R1.
> ⚠️ Планы писались по **локальному** коду с пометками «(лок)». **На проде** исполняй те же шаги против `liderra.ru` (провижининг SQL+escape, реальная DaData/Россвязь, реальный поставщик, живые письма). Пометки «🟦 на прод-прогоне» в планах — **теперь основной режим**.
---
## §6. ПРОВИЖИНИНГ И ДОСТУП (кратко; полно — R0 §2, R1)
- **Доступ:** `ssh liderra-prod '<cmd>'` (бастион). Read-only SQL: `ssh liderra-prod 'psql -h 127.0.0.1 -U crm_app_user -d liderra -tA -c "SELECT …"'`. RLS-таблицы — `sudo -u postgres psql -d liderra -c "SET app.current_tenant_id='<ID>'; SELECT …"`.
- **Тест-клиенты:** SQL-INSERT `tenants`(`TEST-…`, `active`, баланс) + `users`(bcrypt, `is_active=true`), маркер `TEST-`, owner FLOOR-ESCAPE. `imitation:seed` на проде **запрещён**, endpoint создания тенанта нет.
- **Проекты:** создавать **через портал** (иначе нет синка к поставщику и rt не появятся).
- **Живые ящики:** `kdv1@bk.ru`, `stels_info@bk.ru` — на тех клиентов, кому письма важны (сброс пароля, новый лид, заморозка). Остальным — пустой адрес, токены смотреть в БД read-only.
- **Браузер:** Playwright против `https://liderra.ru`.
- **Секреты** (вебхук-секрет, пароли) — у владельца, в чат не писать.
---
## §7. НАХОДКИ — что уже известно и что перепроверить на проде
Полный реестр — [findings-register](2026-06-20-acceptance-findings-register.md). Сводка с поправкой по боевому:
| ID | Суть | Статус на проде |
|---|---|---|
| **F-CSV** 🔴 | экспорт без защиты от CSV-инъекции (формулы `=+-@`) | **перепроверить файлом** на проде (№14, №11) — возможен фикс |
| **F-DELPROJ** 🟡 | свод «сделки сохраняются»; код **запрещает** удаление проекта со сделками | поправить свод (№15) |
| **F-DIGEST** ✅ снята | ложная: читал устаревший **комментарий** `NotificationService.php`; канон [db/schema.sql:796](../../../db/schema.sql#L796) = `new_lead.email:true` — дайджест **вкл по умолчанию** (G2-B). Локалка в синхроне | комментарий поправлен; №20 обновить (дайджест вкл) |
| **F-PDF** 🟡 | PDF-отчёт → штатно `failed` (заглушка) | подтвердить на проде (№22) |
| **F-REMIND** 🧹 | фронт-хвосты снятой фичи напоминаний (`auth.ts 'reminder'`, коммент) | проверить мёртвый переключатель на проде; дочистить (№21) |
| F1/F2/F4/F5 | прежний осмотр 17.06 (город/цена0₽/пустой столбец/мок-средняя) | перепроверить (№3,№11,№13) |
| F3 | «хватит на дней» Дашборд↔Биллинг | **закрыта** (единый источник) |
---
## §8. МАСТЕР-ЧЕК-ЛИСТ «ничего не пропущено»
- [ ] Прочитан prod-logic-map §0–§21, хартия (ПЕРЕСМОТР), R0.
- [ ] Поднят эфир (`:8899`), пульт работает; готов ронять карточки.
- [ ] R1: 7 клиентов/16 проектов/12 rt заведены (`TEST-`), teardown-скрипт готов.
- [ ] R2: инъекция работает (слепок→вебхук→сделка).
- [ ] R3: пункты №1–№16 пройдены карточками (тех. PASS/FAIL + эфир); R3 Часть E all-pairs (27) покрыта.
- [ ] R3b: №18–№26 (онбординг/реквизиты/колокольчик/напоминания/отчёты/импорт/помощь/импер­сонизация/API) — перечитаны на проде, пройдены.
- [ ] R4: нагрузка — ramp, кривая, прогноз ёмкости, SAFETY-стоп не сорван.
- [ ] R5: F1 Σ-сверка денег, F2 изоляция, F3 `audit:verify-chains` зелёный, F4 маржа, **teardown ДО 21:00** (поставщик→слепки→тенанты→Redis→проверка чистоты), tenant 2 ЦЕЛ.
- [ ] Все находки §7 перепроверены/обновлены; новые — в реестр.
- [ ] Итоговый отчёт + вердикт **GO / NO-GO** (GO = 0 расхождений по деньгам и изоляции, ядро проходит сквозь).
---
## §9. ВЕРДИКТ
**GO** — если: деньги сходятся копейка-в-копейку (F1), изоляция 0 утечек (F2), аудит зелёный (F3), ядро движка (раздача→списание→сделка→изоляция) проходит сквозь, критдефектов нет. UX-косяки GO не блокируют (список владельцу).
**NO-GO** — любой критдефект денег/изоляции/чужих данных.
Итоговый отчёт — формат [R5](../runbooks/2026-06-18-acceptance-r5-finalize-teardown.md): по пунктам PASS/FAIL/SKIP + находки + ёмкость + вердикт.
---
## §10. ОТКУДА СТАРТОВАТЬ ПРЯМО СЕЙЧАС
1. Прочитай §2 (в порядке): map → хартия → R0.
2. Возьми у владельца: вебхук-секрет, пароли тест-клиентов, подтверждение окна (прод спит, до 21:00 для поставщика).
3. Подними эфир (§3).
4. Иди R1 → R2 → R3(+E) → R3b → R4 → R5, на каждом пункте сверяясь с пер-пунктовым планом (§5); ключевые числа (тарифы, дефолты) подтверждай по **схеме/живому коду и на проде** (это прод-тест), не по комментариям.
5. Критдефект → СТОП + владельцу. Teardown ДО 21:00. Финал → вердикт.