Commit Graph

2361 Commits

Author SHA1 Message Date
Дмитрий bb2e0daad8 feat(G6): контроллер + роут GET /api/v1/deals (публичный read-API сделок)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:13:08 +03:00
Дмитрий 206e7a328d feat(G6): middleware ApiKeyAuth — аутентификация по API-ключу
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:12:03 +03:00
Дмитрий 1fd24745d1 test(G6): приёмка публичного API сделок (RED)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:11:24 +03:00
Дмитрий 4eb9ae3bb9 docs: G6 план реализации — публичный read-API сделок (middleware+контроллер+роут+тест)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 10:10:16 +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
Дмитрий 6bfe654efa test(G2-B): UserFactory зеркалит новый дефолт new_lead.email true
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:53:36 +03:00
Дмитрий 8a3569df9e feat(G2-B): миграция — дефолт new_lead.email true + дотяжка существующих
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:53:07 +03:00
Дмитрий e0312734c0 chore(G2-B): канон схемы — дефолт new_lead.email true + CHANGELOG v8.44 (+sync v8.43 в header)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:52:31 +03:00
Дмитрий e6c921935c test(G2-B): дефолт new_lead.email=true (RED) + backfill SQL
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:51:04 +03:00
Дмитрий 3cef5ac88c docs: G2-B план реализации — дайджест по умолчанию (миграция + дотяжка + тест)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:50:08 +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
Дмитрий 9317a45e7e fix(G1-tail): письмо с кодом в очередь + не валить register/resend при сбое доставки
Owner-decision: register не должен падать 500 при сбое SMTP — код уже создан,
клиент может «отправить повторно». Mail::queue + try/catch + Log (без email — ПДн).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:29:15 +03:00
Дмитрий df8f568888 fix(G1-tail): убран стейл-Шаг 6 (webhook_log удалён в v8.35) из OperationalFullFlowTest
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:18:30 +03:00
Дмитрий a8f833e5fe fix(G1-tail): NBSP перед ₽ через escape \u00A0 в DashboardPageHead (lint:vue green)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 08:18:30 +03:00
Дмитрий dec1c95092 feat(G1/SP3c): блок платёжных реквизитов + статус-чип + валидация (поля по типу лица)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 07:58:47 +03:00
Дмитрий c4bd6db523 docs: G1/SP3c план реализации — полные платёжные реквизиты (фронт)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 07:56:38 +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
Дмитрий 6dd9f041fa feat(G1/SP3b): UX гейта — alert requisites_required + переход к реквизитам
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 07:24:27 +03:00
Дмитрий 4fddba60b0 feat(G1/SP3b): вкладка Реквизиты в Настройках + deep-link ?tab=requisites
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 07:24:26 +03:00
Дмитрий 5347976566 feat(G1/SP3b): вкладка RequisitesTab — лёгкая форма реквизитов
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 07:24:26 +03:00
Дмитрий c42e99747e feat(G1/SP3b): api-обёртка реквизитов (get/update/lookup-inn)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 07:24:26 +03:00
Дмитрий 5011fbd41c docs: G1/SP3b план реализации — форма реквизитов (фронт) + UX гейта
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 07:20:12 +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
Дмитрий ac3d4364b7 chore: gitleaks allowlist — factories + specs (демо-телефоны фикстур, не реальные ПДн)
ru-phone-unmasked ловил фейковые телефоны в TenantFactory::withRequisites и в internal-спеке — та же категория, что уже исключённые seeders/tests/plans/audits. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 04:26:05 +03:00
Дмитрий f9e1ddb7da fix: дополнен мок DashboardSummary в DashboardView.spec (avg_lead_cost_rub) — type-check green
Пред-существующая type-ошибка (поле required в DashboardSummary отсутствовало в моке). Не связано с SP3a; убирает единственную ошибку vue-tsc. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 23:45:08 +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
Дмитрий 93335c26a7 docs: план G1/SP1 самозапись с подтверждением почты
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 16:03:21 +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
Дмитрий 09e97190b8 chore: gitignore сырых ZAP-отчётов docs/security
Сырые docs/security/*-zap-active-scan.json и .html остаются локально:
анализ закоммичен как .md, сырьё может содержать снимки ответов dev.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 11:27:58 +03:00
Дмитрий c0d470d1bc chore(security): версионирую ZAP-оркестратор active scan
Скрипт bin/zap-active-scan.ps1 лежит в gitignored bin/, форс-добавлен для
воспроизводимости: отчёт docs/security/2026-06-18-zap-active-scan-report.md
ссылается на него. Демон через вшитую java bin/_runtimes/jdk-17, jar
относительным именем, ASCII-only под PowerShell 5.1.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 11:06:10 +03:00
Дмитрий c01a18d8b8 chore(security): ZAP active scan 2026-06-18 — отчёт + оркестратор
Полный DAST active scan локальной копии 127.0.0.1:8000 через OWASP ZAP 2.17.0.
Сводка: High 1, Medium 4, Low 28, Info 7. Реальных high/critical — 0:
- High «Cloud Metadata Exposed» — false-positive: SPA отдаёт 200 на любой путь,
  evidence пуст, nginx нет, SSRF закрыт WebhookUrlGuard.
- 4 Medium — отсутствие security-заголовков локально; на проде их шлёт nginx.

Вердикт ZAP active scan: GO. Скрипт-оркестратор воспроизводим.
Сырые json и html — локально в docs/security, не коммитятся.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 11:03:47 +03:00
Дмитрий c2bdfdd7d3 refactor(security): единый источник security-заголовков — nginx
Убраны дубли HTTP-заголовков. nginx уже шлёт enforcing CSP, X-Frame-Options,
X-Content-Type-Options, Referrer-Policy, HSTS, Permissions-Policy, COOP, CORP
через add_header always. App-уровневый middleware SecurityHeaders дублировал
четыре из них и слал лишний CSP Report-Only; на проде add_header always плюс
PHP-заголовок давали дубль в ответе.

- удалён middleware SecurityHeaders и его регистрация в bootstrap/app.php
- SecurityHeadersTest переписан: фиксирует, что приложение эти заголовки не ставит

Прод-дедуп вступит в силу после деплоя. Verify локально 4 из 4 green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 09:31:47 +03:00
Дмитрий 757537ab90 docs: рунбук ручного выката gitea на прод
Пошаговый деплой-пайплайн liderra.ru: clone из gitea, npm build на проде,
artisan down, rsync overlay с исключениями, composer и optimize от www-data,
миграции через postgres superuser, up и smoke. Грабли PowerShell-ssh кавычек,
heredoc с dollar-dollar, привилегии www-data и crm_app_user, rollback.
GitHub Actions deploy.yml мёртв, аккаунт CoralMinister suspended.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 09:11:06 +03:00
Дмитрий c0a7fa6c74 test: починка харнеса AdminBilling и AdminIncidents
AdminBillingIndexTest: teardown глушит session-триггеры на время очистки.
DELETE tenants каскадил в append-only tenant_operations_log, триггер
audit_block_mutation давал RAISE EXCEPTION. Плюс ensureRange гарантирует
месячные партиции balance_transactions за прошлые 2 месяца под SharesSupplierPdo.

AdminIncidentsIndexTest: добавлен трейт SharesSupplierPdo. Контроллер читает
через pgsql_supplier, тест писал через дефолтный pgsql под DatabaseTransactions,
cross-connection невидимость давала total=0.

Verify: оба класса 20 из 20 green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-18 09:05:06 +03:00
Дмитрий 2493630249 feat(security): read-only доступ к проду через стену — ssh liderra-prod + gh GET
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-18 08:04:50 +03:00
Дмитрий a4511fe2cf docs(security): go-live трекер — все блокеры B1-B6 сняты (GO), B2 anon на проде; gitignore lychee/walk артефактов 2026-06-18 06:13:56 +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
Дмитрий 34a712eff1 fix(pdn): anon-валидные маски без ::jsonb/::inet-каста + применено на прод 17.06.2026 — B2 закрыт
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 20:02:51 +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