Commit Graph

261 Commits

Author SHA1 Message Date
Дмитрий 302d629cb8 docs(приёмка): FN-RESET — сброс пароля сломан на проде (Route password.reset не определён)
Найдено владельцем post-run: forgotPassword → дефолтное Laravel-уведомление
строит URL через route('password.reset'), которого нет (SPA-роут /reset/:token).
Клиент видит «ошибка», письмо не уходит; побочно ломает анти-перебор.
Клиент-видимо, чинить до передачи продажникам. Вердикт GO формально не меняет.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 07:21:30 +03:00
Дмитрий c8a9e8ea87 docs(приёмка): отчёт боевого приёмочного теста liderra.ru 22.06 — вердикт GO + 16 карточек эфира
Полный прогон 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>
2026-06-22 07:11:28 +03:00
Дмитрий 3af42dab04 docs(приёмка): на онбординге владелец даёт исполнителю И капчу, И код из письма
R3b + launch-промт: 6-значный код приходит письмом на ящик владельца (в ответе
API на проде его нет, в чужую почту исполнитель не зайдёт) → владелец читает код
и передаёт исполнителю для шага ONB-CODE. На живом онбординге владелец даёт две
вещи: решение капчи + код.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-22 04:29:05 +03:00
Дмитрий 2e7557395e docs(приёмка): телевизор/живой эфир — отдельная обязательная секция в launch-промте
§4.5: efir.html как телевизор владельца, формат карточки было→ожидали→стало
+ 📸 живой скриншот, пульт ▶/⏸, автопродолжение, два параллельных выхода
(техкарточка + эфир). Добавлен в список чтения и Шаг 0.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 20:44:10 +03:00
Дмитрий a183227af4 docs(приёмка): пошаговый launch-промт для сессии-исполнителя
Пуленепробиваемый вход: железные запреты (омега/секреты/21:00/критдефект),
состояние прода (только омега, реальная капча, playwright ок, бэкап), что взять
у владельца, порядок R0-R5 с поправками (Татарстан=19, vid-диапазон, teardown
без name/auth_log, онбординг через ручную капчу), анти-ошибка ритуал, вердикт.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 20:30:27 +03:00
Дмитрий 219040326b docs(приёмка): Раздел B — расширение охвата ранбуков R2/R3/R3b
R3 Часть F: CsvReconcile recovery+drift, терминальные пути, каскад-edges,
вечерняя заморозка+reminder/final, T7, ручная-cost/manager, cost null, индекс,
bulk-изоляция, причины удаления проекта.
R3b Часть F: отчёты retry/cancel/destroy/signed-URL, импорт парсер/провенанс,
онбординг/реквизиты edges + НОВЫЕ карточки G6 (API) и G7 (поддержка/impersonation).
R2: I8 HMAC-путь, I9 phones[]. Всё по факту кода (file:line).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 16:20:49 +03:00
Дмитрий a3b12d687f fix(приёмка): N-2 детерминированная уборка orphan-таблиц + N-4 надёжный дедуп дайджеста
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>
2026-06-21 16:10:57 +03:00
Дмитрий c4c0b7f4f0 docs(ui-аудит): находки + починки UI-прохода + жёсткий промт следующей сессии (Playwright, протыкать всё) 2026-06-21 13:26:29 +03:00
Дмитрий 5be29671c9 feat(auth): фронт-виджет Yandex SmartCaptcha на регистрации с fallback на стаб без ключа (M-2) 2026-06-21 09:34:31 +03:00
Дмитрий ce8bddc7c0 fix(captcha): актуальный validate-URL Yandex SmartCaptcha smartcaptcha.cloud.yandex.ru (сверено по докам) 2026-06-21 09:15:20 +03:00
Дмитрий 90a202be4e feat(security): реальный Yandex SmartCaptcha драйвер самозаписи по CAPTCHA_DRIVER (M-2) 2026-06-21 09:02:31 +03:00
Дмитрий 03ff03a714 docs(приёмка): хэндофф сессии 3 — apiv1-rate/M-1/Раздел B + точка входа следующей 2026-06-21 08:42:20 +03:00
Дмитрий 44a536344c test(coverage): расширение охвата Раздел B №2-5 — границы reminder/final, терминальные пути оркестратора, G6 API edges 2026-06-21 08:41:03 +03:00
Дмитрий 5cdb2b488c test(supplier): regression-guard неизменности received_at при merge CSV-recovered сделки 2026-06-21 08:23:13 +03:00
Дмитрий cdfeb92b77 fix(security): fail-closed app-гейт админ-зоны по REMOTE_USER и allowlist — M-1 2026-06-21 08:11:02 +03:00
Дмитрий 33ea78bf7f docs(приёмка): хэндофф раунда 2 — что закрыто + точка входа следующей сессии
Раунд 2 закрыт (7 коммитов, всё локально-исполнимое по TDD). Хэндофф-док:
карта сделанного + оставшиеся owner-решения (M-1, M-2, apiv1-rate, tenants-RLS,
created_at TZ, #21 schema, Раздел B, прод-прогон) + контекст исполнителю
(db/ через терминал, observer-расстейдж, параллельные сессии, не пушено).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 07:07:15 +03:00
Дмитрий 32b5902a3f fix(digest): идемпотентность дайджеста новых сделок по сделке (N-4)
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>
2026-06-21 07:01:10 +03:00
Дмитрий f62ccfd4ea docs(приёмка): статусы раунда-2 + вынос на решение владельца
- coverage-expansion-NEW.md: статус-баннер (N-1..N-8 закрыто/вынесено), закоммичен
  (был untracked).
- owner-decisions.md (новый): M-1 админ fail-open, M-2 капча Null, N-4 дайджест-дубль,
  tenants-RLS, apiv1-rate, created_at TZ, #21 schema header, Раздел B — то, что
  нельзя править молча (намеренные состояния / смена поведения / объём), с анализом
  и вариантами.
- реестр: раздел «Раунд 2» — F-CSV ДОзакрыт (форматтеры), карта закрытых находок.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 05:45:32 +03:00
Дмитрий dc14afdedd docs(приёмка): поправки планов по находкам ревью (Татарстан/капча/lpimp/воронка/№23/append-only)
Закрыты 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>
2026-06-21 05:38:37 +03:00
Дмитрий 48fccbf109 docs(приёмка): раунд 2 — новые находки + расширение охвата теста
CRITICAL N-1: скрипт teardown R5 не сработает на боевом
supplier_lead_costs без tenant_id + reminders дропнута падают транзакцию.
N-2 orphan-таблицы инъекции; N-4 дубль дайджеста; N-5 snapshot rebuild.
Раздел B — непокрытые код-пути CsvReconcile/заморозка/отчёты/impersonation.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 05:21:22 +03:00
Дмитрий 3ba703d9c9 docs(приёмка): корпус приёмочного теста + поправка №15 + статусы реестра
F-CORPUS: ключевые документы приёмки liderra.ru лежали untracked — мастер-
хэндофф ссылался на отсутствующие в git файлы (битые ссылки в новом клоне).
Закоммичены: R0–R5 + stepbystep ранбуки, хартия, prod-logic-map, эфир-хэндофф,
imitation-checks-table, live-demo/ (эфир-плеер) + смежные specs/планы серий
f1-card/phase1/televizor/g1/g2 (решение владельца — «корпус + смежные»).

F-DELPROJ: пункт №15 checks-table → «удаление проекта со сделками запрещено
(422), сделки целы» (было неточно «сделки сохранены», сверено по
ProjectService::delete).

Реестр находок: статусы F-DEPTRAC/F-CSV/F-REMIND/F-DELPROJ/F-CORPUS → закрыто.
.gitleaks.toml: ранбуки приёмки добавлены в allowlist (синтетические тест-
телефоны, та же категория что plans/specs/audits).
live-demo HTML: stylelint --fix (#fff→#ffffff).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:48:50 +03:00
Дмитрий c20d27f8ab docs(приёмка): независимый ревью подготовки прод-прогона — 5 осей + новые находки
Read-only разбор: код-факты денег/изоляции/распределения сверены построчно.
Блокеры до старта: Татарстан=16 неверно (19), корпус untracked, капча-Null.
Новые HIGH вне реестра: админ fail-open (=F-T2), капча отключена.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 04:25:14 +03:00
Дмитрий 5437ea6f6b docs(приёмка): F-DEPTRAC+F-CORPUS в реестр + 2 промта для свежих сессий
Реестр: F-DEPTRAC (Middleware→Mail блокирует php-коммиты, от G7-B),
F-CORPUS (корпус приёмки R0-R5/хартия/map/live-demo untracked).
Промт #1 — закрыть находки (F-DEPTRAC/F-CSV/F-REMIND/F-DELPROJ/F-CORPUS + комментарий).
Промт #2 — независимый критразбор подготовки приёмки перед прод-прогоном.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-21 03:28:51 +03:00
Дмитрий 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
Дмитрий ca47f68be4 docs(приёмка): реестр находок + планы 18 онбординг и 21 напоминания убраны
Реестр находок (сверка свода с кодом под планы):
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>
2026-06-20 15:54:03 +03:00
Дмитрий f3892cfa93 docs(G7-B): спека двери impersonation + машинный ключ под ИИ + карта каналов 2026-06-19 16:09:07 +03:00
Дмитрий 1c0b432d8a docs(G7-B): хэндофф достройки impersonation — состояние брейншторма + промпт след. сессии
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 15:20:24 +03:00
Дмитрий 2affe6db01 docs(G7-A): спека клиентской «Помощь» (форма+email+JivoSite)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 14:18:16 +03:00
Дмитрий c9c5b44358 docs(G3): спека полного удаления фичи «Напоминания» (вкл. таблицу)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 10:56:18 +03:00
Дмитрий ca8bc0f415 docs: хэндофф сессии 19.06 — G1-хвосты+G2-B+G6 DONE, промпт следующей сессии
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:27:32 +03:00
Дмитрий f6a985c905 docs: G6 дизайн — публичный read-API сделок по API-ключу
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:07:11 +03:00
Дмитрий 16bdd3a91e docs: G2-B дизайн — дайджест новых сделок по умолчанию (флип дефолта + дотяжка)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:47:52 +03:00
Дмитрий 240146813a docs: G1/SP3c дизайн — полные платёжные реквизиты (фронт)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 07:54:57 +03:00
Дмитрий 2447cb706c docs: G1/SP3b дизайн — форма реквизитов (фронт) + UX гейта первого проекта
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:56:53 +03:00
Дмитрий 633bfe3ccc docs: хэндофф G1 SP1/SP2/SP3a DONE + промпт следующей сессии (стена снята)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:36:45 +03:00
Дмитрий d3483c21d8 feat: G1/SP3a фронт входа — регистрация + подтверждение почты
Переработка register под новый бэкенд SP1 (код на почту), новый ConfirmEmailView, капча-шов, роут /confirm-email. Проверено Playwright: register→код→confirm→dashboard, негатив, fallback email. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:33:26 +03:00
Дмитрий 60f76d5919 feat: G1/SP2 реквизиты клиента + ИНН по DaData + гейт первого проекта
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 22:25:23 +03:00
Дмитрий 9a661401a2 feat: G1/SP1 самозапись клиента с подтверждением почты 6-значным кодом
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 19:33:33 +03:00
Дмитрий 834fa144dd docs: G1/SP1 спека+план+хэндофф (печать стены не закрепилась, передаю в след. сессию) 2026-06-18 17:35:32 +03:00
Дмитрий 890998f706 docs: спека G1/SP1 самозапись с подтверждением почты
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 15:42:02 +03:00
Дмитрий b04f5b6726 docs: хэндофф go-live находок портала + промт для следующей сессии
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 15:01:50 +03:00
Дмитрий 78e4c09d2d feat: G2-A дайджест новых сделок на почту - письмо-сводка раз в 30 минут вместо письма на каждую сделку
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 14:40:12 +03:00
Дмитрий 14d076b805 feat: G4 убрать неработающий push-канал из настроек уведомлений + находка G8 про сломанный фронт-тест-раннер
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 13:46:31 +03:00
Дмитрий 7068664026 fix(test): routing-snapshot today+tomorrow в CsvWebhookRaceTest + PII на slack/papertrail/stderr
C: LeadRouter.activeSnapshotDate после 21:00 МСК = завтра; снимок только на сегодня не активен -> снимки на обе даты. A: PII-процессор на остальные лог-каналы, 6/6.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 21:37:41 +03:00
Дмитрий e2425ce873 feat(security): PII-scrubbing процессор логов — Medium go-live
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>
2026-06-17 20:43:28 +03:00
Дмитрий f32366279f feat(security): webhook DNS-rebind пиннинг + аддитивный HMAC supplier-webhook — edge/P2 go-live
WebhookUrlGuard::safeDeliveryIp один резолв + CURLOPT_RESOLVE пиннинг в test(); supplier-webhook принимает HMAC X-Webhook-Signature как альтернативу URL-секрету + secretless-маршрут. Аддитивно, backward-compat. 6 новых тестов GREEN; 5 падений webhook-сюиты pre-existing (Phase-3 B-regex + CsvWebhookRaceTest), подтверждено baseline без моих файлов.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 20:21:11 +03:00
Дмитрий 00cef7635b docs(superpowers): спеки и планы церемоний синка квинтета v2.47 и починки lychee-ссылок
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 20:04:11 +03:00
Дмитрий fdb1c1cca2 feat(security): per-IP route-throttle на auth-эндпоинтах — P1 go-live
Именованные лимитеры 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>
2026-06-17 19:56:23 +03:00
Дмитрий 408a44a53a docs: починка 12 битых относительных .md-ссылок долг lychee — корректные относительные пути и снятие ссылок на отсутствующие цели
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 19:55:37 +03:00
Дмитрий 7414b51523 feat(pdn): правила маскирования ПДн pg_anonymizer на проде — SECURITY LABEL на ПДн-колонки + план применения — закрытие остатка B2
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 19:33:58 +03:00