# Хэндофф сессии 19.06.2026 — G1-хвосты + G2-B + G6 DONE. Промпт для следующей сессии

**Дата:** 19.06.2026. Всё на `gitea/main`, HEAD **`716c62da`**.

---

## ⚠️ ГЛАВНОЕ: СТЕНЫ НЕТ

Стена «роутер-наставник» **снята владельцем**. Работай нормально: Write/Edit/Bash/Playwright/git — свободно, без per-step escape и без церемоний. (Если вдруг `node --version` блокнётся «разговорный режим» — стена вернулась, читай `docs/superpowers/router-mentor-wall-GUIDE.md`; кодовая фраза «роутер-наставник». Но сейчас её нет.)

Рабочий ритм этой сессии (повторяй): для новой фичи — brainstorming → spec → writing-plans → executing-plans → finishing (push gitea). Каждый шаг с владельцем согласуется коротким «да/дальше».

---

## Сделано в этой сессии (всё запушено в gitea, github мёртв «account suspended»)

1. **G1/SP3b** (фронт лёгких реквизитов + UX гейта первого проекта): `api/requisites.ts`, `views/settings/RequisitesTab.vue`, вкладка «Реквизиты» в `SettingsView.vue` + deep-link `?tab=requisites`, ветка гейта `422 requisites_required` в `NewProjectDialog.vue` (alert + кнопка «Заполнить реквизиты»). Проверено живым Playwright.
2. **G1/SP3c** (полные платёжные реквизиты): расширил `RequisitesTab.vue` — блок «Реквизиты для оплаты» + чип «Готово к оплате» (по `requisites_completed_at`), поля по типу лица (ЮЛ: КПП+ОГРН13+юр.адрес+банк; ИП: ОГРНИП15+юр.адрес+банк; Физлицо: только банк), валидация форматов. Живой Playwright ✓. **Весь гейт G1 закрыт: SP1+SP2+SP3a+SP3b+SP3c.**
3. **Хвосты G1 (3 шт.)**: NBSP перед ₽ → escape ` ` в `DashboardPageHead.vue` (`lint:vue` зелёный целиком); стейл-тест `OperationalFullFlowTest` — вырезан Шаг 6 (`webhook_log` реально удалена в schema v8.35, контроллер no-op'ит); **register→500 при сбое почты** → решение владельца «очередь+не падать»: `RegistrationService::sendCode` теперь `Mail::queue` + try/catch + Log (без email — ПДн), register/resend не валятся.
4. **G2-B** (дайджест новых сделок по умолчанию): миграция `2026_06_19_120000` флип DEFAULT `users.notification_preferences.new_lead.email` false→true + дотяжка существующих (jsonb_set, живые, текущие false); schema **v8.44** + CHANGELOG (+досинхронил пропущенную SP2-строку v8.43 в header); `UserFactory` зеркалит. Применено на dev и тест-БД.
5. **G6** (публичный read-API сделок по API-ключу): `GET /api/v1/deals`; middleware `ApiKeyAuth` (Bearer, поиск по `key_prefix` через BYPASSRLS `pgsql_supplier` + `Hash::check`, scope `read`, обновление `last_used_at`); контроллер `Api\V1\DealsController` (RLS `SET LOCAL` + keyset-пагинация `limit`/`since`/`next_cursor`); алиас `apikey` в `bootstrap/app.php`. Живой curl-smoke на dev ✓.

**Все тесты дельты зелёные:** финальный прогон 27/27 (RegistrationTest, NewLeadEmailDefaultOnTest, NewLeadsDigestJobTest, PublicDealsApiTest, OperationalFullFlowTest), 109 assertions. `lint:vue` зелёный.

**Терминология (выверено по схеме, не путать):** «лиды» = `supplier_leads` (сырой приход от поставщика, без tenant_id, наружу клиенту НЕ отдаём); «сделки» = `deals` (клиентская сущность). Публичный API отдаёт **сделки**.

---

## Что осталось — go-live находки портала (источник решений: `docs/superpowers/specs/2026-06-18-gfindings-session-handoff.md`)

- **G3** — убрать раздел/функцию «Напоминания» из портала совсем. **Фронт** (+ возможно backend-чистка планировщика/таблиц). vitest сломан (G8) → проверять **живым Playwright**. Затрагивает: пункт меню/роут `/reminders` (`RemindersView.vue`), стор `reminders.ts`, api `reminders.ts`, возможно backend `reminders`-эндпоинты и cron. Спросить владельца глубину: убрать только из UI или и backend.
  - ✅ **ФРОНТ СДЕЛАН — реминдер-фича удалена из UI (подтверждено по коду 22.06.2026):** в `app/resources/js` нет роута `/reminders` (router/index.ts), нет стора `reminders.ts`, нет `RemindersView.vue`, нет `api/reminders.ts`. **NB (точность, не «пусто»):** Grep по `reminders` НЕ полностью пуст — остались хвосты только в названиях: константа `POLLING_REMINDERS_INTERVAL_MS` (`constants/polling.ts`, используется для polling баланса, не напоминаний) + комментарий-упоминание `ReminderDialog` в `TopupDialog.vue`. **Таблица `reminders` УДАЛЕНА** — в `db/schema.sql` нет `CREATE TABLE ... reminders` (перепроверено 22.06.2026). Упоминания `reminders` на строках 8/169-171/217/1711 — это **исторические комментарии шапки и карты разделов** (описывают старое состояние v8.3), а не живая таблица. Остаётся лишь косметический хвост: эти устаревшие комментарии в шапке схемы стоит вычистить отдельно.
- **G7** — вместо входа-под-клиентом: контакт техподдержки + сбор контактов клиента, разбор вручную. Фронт + возможно настройки.
- **G5** — пополнение баланса: **ВИСЯК**, ждёт регистрации ООО (Б-1, P0-блокер). Не трогать.
- Тарифы (лид ≤65₽, сейчас 500→250) — отдельная биллинг-работа, вне G-списка.

**Рекомендация следующей:** спросить владельца — **G3** (фронт, заметная клиенту чистка) или **G7**.

---

## Прочие follow-up (не из этой сессии, к сведению)

- **Квинтет нормативки**: cross-ref версии CLAUDE.md в Pravila/PSR/Tooling указывают 2.46, сам CLAUDE.md — 2.47. Синхронизация на 2.47 — отдельный follow-up (агент `normative-sync`). Не блокирует.
- **G6 без UI/доков**: эндпоинт `/api/v1/deals` есть, но в UI («Настройки → API и Webhook») нет подсказки про URL/использование, и нет публичной доки для клиентов. Мелкий follow-up, если владелец захочет.
- **G6 без рейт-лимита** и без поля `cost` на сделке (стоимость — биллинг-списание, хрупкая привязка F2) — сознательно вне MVP.

---

## Окружение (факты)

- **Dev backend**: `php artisan serve` на `127.0.0.1:8000` (отдаёт SPA + API). Фронт — **собранные** ассеты: после фронт-правок `npm --prefix app run build` (vite-dev НЕ запущен).
- **Тест-БД**: `liderra_testing`. Прогон: `composer --working-dir=app test -- <путь|--filter=X>`. Миграции тест-БД **явно**: `DB_DATABASE=liderra_testing php app/artisan migrate --force` (composer test миграции не гоняет). Dev-БД: `php app/artisan migrate --force`.
- **Коммит**: `composer --working-dir=app pint` (PHP) → `LEFTHOOK=0 git commit -m "..." -m "Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>"`. **Пуш**: `git push gitea main` (pre-push lefthook: gitleaks-full-history + lychee; gitleaks ловит фейк-ПДн фикстур → каталог в allowlist `.gitleaks.toml`).
- **⚠ vitest сломан (G8)** — фронт-юнитов нет; верификация фронта = **живой Playwright** + `vue-tsc` (`npm --prefix app run type-check`) + eslint. Dev-код подтверждения почты приходит в ответе register/resend (`_dev_plain_code`).
- **DaData party** на dev выключена (NullPartyLookup) → `lookup-inn` = `{found:false}`. Тест-клиент самозаписи: `sp3b-test-0619@example.org` / `password123`.
- **Квирк Edit**: инструмент Edit нормализует обычный пробел в NBSP — для literal ` ` использовать `perl -CSD -i -pe 's/.../\x5cu00A0/' file`.

---

## Память
- `MEMORY.md` → `project-golive-findings-status.md` (статус G-серии), `project-g1-sp3b-sp3c-2026-06-19.md` (G1 SP3b/SP3c + хвосты).
- Memory-write требует `coverage: direct:memory-sync` в свежем turn'е ИЛИ override-фразу `memory dump` в промпте.

---

## Промпт для вставки в новую сессию

> Продолжаем go-live находки портала Лидерры (локалка, папка `app/`, пуш `git push gitea main`). Стена снята — работай нормально. Прочитай память (`project-golive-findings-status`, `project-g1-sp3b-sp3c-2026-06-19`) и этот хэндофф (`docs/superpowers/specs/2026-06-19-session-handoff-G1tails-G2B-G6.md`). Сделано: весь G1 + хвосты, G2-A/G2-B, G4, G6. Осталось G3 (убрать напоминания, фронт) и G7 (почта техподдержки); G5 висяк (ООО). Спроси, с какой начинать. Для фронт-правок верификация — живой Playwright (vitest сломан, G8). Ритм: brainstorm→spec→план→реализация→push, согласуй шаги со мной.
