Найдено владельцем post-run: forgotPassword → дефолтное Laravel-уведомление
строит URL через route('password.reset'), которого нет (SPA-роут /reset/:token).
Клиент видит «ошибка», письмо не уходит; побочно ломает анти-перебор.
Клиент-видимо, чинить до передачи продажникам. Вердикт GO формально не меняет.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Полный прогон R1–R5 на боевом liderra.ru: деньги сходятся до копейки,
изоляция 0 утечек, аудит-цепочки зелёные после teardown, нагрузка ~37x
запас, живой онбординг через реальную капчу + дайджест-email доставлен.
Омега не тронута: 1835400.00 / 1013 сделок. Критдефектов нет.
Находки FN-AUDIT / FN-1 / FN-2 / FN-3 — разработчику, на продажу не влияют.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
R3b + launch-промт: 6-значный код приходит письмом на ящик владельца (в ответе
API на проде его нет, в чужую почту исполнитель не зайдёт) → владелец читает код
и передаёт исполнителю для шага ONB-CODE. На живом онбординге владелец даёт две
вещи: решение капчи + код.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
§4.5: efir.html как телевизор владельца, формат карточки было→ожидали→стало
+ 📸 живой скриншот, пульт ▶/⏸, автопродолжение, два параллельных выхода
(техкарточка + эфир). Добавлен в список чтения и Шаг 0.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Пуленепробиваемый вход: железные запреты (омега/секреты/21:00/критдефект),
состояние прода (только омега, реальная капча, playwright ок, бэкап), что взять
у владельца, порядок R0-R5 с поправками (Татарстан=19, vid-диапазон, teardown
без name/auth_log, онбординг через ручную капчу), анти-ошибка ритуал, вердикт.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
N-4: пометка digest_sent ПОСЛЕ отправки (mark-after-send) — повтор не
дублирует И сбой джоба до отправки не теряет дайджест. TDD-тест GREEN 6/6.
N-2: инъекции R2 с TEST-диапазоном vid 9e12..1e13 → R5 чистит 4 orphan-таблицы
детерминированно по vid/lead_id, без ручного манифеста.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
N-4: SendNewLeadsDigestJob выбирал сделки received_at>now()-30min без маркера
отправки → ручной/повторный прогон (R3b велит дёргать вручную) дублировал
письмо-дайджест. Окно «непересекается» только при ровно-30-мин прогонах.
Фикс без схемы: идемпотентность по сделке через Redis SETNX
(Cache::add 'digest_sent:<id>', TTL 1 сутки) — паттерн как rate-limit
ZeroBalancePausedMail. Уже отправленная сделка в дайджест повторно не входит.
TDD: тест «повторный прогон НЕ дублирует» (RED 2 письма → GREEN 1), сюит 5/5.
R3b DIGEST-ON + owner-decisions + NEW-статус обновлены (N-4 → закрыто).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Закрыты doc-находки двух ревью-сессий (точность планов перед прод-прогоном):
- GAP-1: Татарстан 16→19 (16=Мордовия, конституц. порядок ст.65, НЕ ГИБДД) —
свод, план №3 (C-2), PR2 (сноска: P5 [16]=Мордовия, не Татарстан). Сверено
по RussianRegions.php.
- M-2/GAP-3: капча = NullCaptchaVerifier БЕЗУСЛОВНО (не только local) — план №18.
- lpimp-status: lpimp_ → 401 на биллинг/api-keys (не 403), 403 только на admin,
/api/billing/charges читается — план №25.
- N-6: воронка статусов НЕ форсится (любой валидный slug, нет state-machine) — план №13.
- №23-tx: импорт пишет 1 нулевую historical_import строку; сверять баланс/lead_charges,
не число balance_transactions — план №23.
- append-only: lead_charges защищён GRANT'ом (prod/crm_app_user), не триггером →
на dev-superuser правка пройдёт (ложный GREEN); гонять на проде — план №12.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Read-only разбор: код-факты денег/изоляции/распределения сверены построчно.
Блокеры до старта: Татарстан=16 неверно (19), корпус untracked, капча-Null.
Новые HIGH вне реестра: админ fail-open (=F-T2), капча отключена.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Мастер-документ точки входа для свежей сессии: тест на боевом 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>
Реестр находок (сверка свода с кодом под планы):
F-CSV экспорт без защиты от CSV-инъекции (безопасность, под фикс),
F-DELPROJ удаление проекта со сделками запрещено (свод неточен),
F-DIGEST дефолт email-дайджеста по схеме выключен,
F-PDF штатность PDF-формата не подтверждена,
F-REMIND фронт-хвосты снятой фичи напоминаний,
F1-F5 прежние прогонные (F3 закрыта).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Переработка register под новый бэкенд SP1 (код на почту), новый ConfirmEmailView, капча-шов, роут /confirm-email. Проверено Playwright: register→код→confirm→dashboard, негатив, fallback email. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
C: LeadRouter.activeSnapshotDate после 21:00 МСК = завтра; снимок только на сегодня не активен -> снимки на обе даты. A: PII-процессор на остальные лог-каналы, 6/6.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Monolog PiiScrubbingProcessor (телефоны/email -> [PHONE]/[EMAIL]) + ScrubPii tap на single/daily в config/logging.php. Pest 6/6 GREEN. Sentry-scrubbing (OPEN-И-16) не реализуем: sentry-laravel не установлен — open-item.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Именованные лимитеры auth-login/auth-2fa/auth-password (perMinute 20 by IP) в AppServiceProvider; throttle-middleware на login/forgot/reset/2fa-verify/recovery в web.php. Закрывает per-IP объёмный перебор. Pest tests/Feature/Auth 97/97 GREEN.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>