Commit Graph

2352 Commits

Author SHA1 Message Date
Дмитрий 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
Дмитрий debfbdb845 docs: синхронизация cross-ref версии CLAUDE.md в квинтете на v2.47 — PSR и Tooling актуальные записи указывают v2.47
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 19:55:28 +03:00
Дмитрий 345e9be636 chore: cspell-words добавлены термины трекера B3/B6 фронтенде десинк недетерминизм ретеншен
Co-Authored-By: Claude Opus 4.8
2026-06-17 19:48:17 +03:00
Дмитрий 6e989881c5 docs: закрыты блокеры B3 и B6 на проде liderra.ru, SAAS_ADMIN_TEST_BYPASS=false и APP_DEBUG/APP_ENV проверены фактом
Co-Authored-By: Claude Opus 4.8
2026-06-17 19:36:57 +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
Дмитрий dea02e402d feat(security): CSP Report-Only под Vue+Vuetify SPA — 2-я ZAP Medium go-live
Report-Only политика в middleware SecurityHeaders; Pest 6/6 GREEN.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 19:30:51 +03:00
Дмитрий 278a5509ee docs(security): хвосты go-live аудита — снять дубли секций, статус блокеров B1/B4/B5, ward-report в .gitignore
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 18:25:59 +03:00
Дмитрий a617de3bde docs(superpowers): отчёт осмотра портала + баг-доки стены (walk/read-block) — для claude-brain
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 17:54:50 +03:00
Дмитрий db469fbb89 feat(pdn): ретеншен ПДн удалённых лидов — анонимизация soft-deleted сделок — F-P1
152-ФЗ блокер B1/F-P1: телефоны и имена контактов soft-deleted сделок не
вычищались и хранились бессрочно. Добавлена плановая команда-ретеншен.

Команда pd:scrub-soft-deleted-deals анонимизирует phone/contact_name/phones
сделок с deleted_at старше N дней; N из system_settings
pd_scrub_soft_deleted_deals_days, по умолчанию no-op — юр.срок не зашит в код.
Значения затирания идентичны PdErasureService. Cross-tenant через
pgsql_supplier BYPASSRLS, идемпотентно, summary-запись в pd_processing_log
системным актором. Планировщик ежедневно 03:30 МСК с heartbeat.

Схема v8.41: partial index deals_deleted_at_index ON deals deleted_at WHERE
deleted_at IS NOT NULL для дешёвой выборки; счётчик индексов 120 на 121.

F-T2 проверен: /api/admin за middleware saas-admin fail-closed 503 — кодовой
правки не требует.

TDD: 4 Pest ScrubSoftDeletedDealsCommandTest GREEN. Escape-per-write — печать
церемонии не опечатывала план.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 17:24:48 +03:00
Дмитрий 714d6885f9 feat(security): middleware безопасных HTTP-заголовков — закрытие ZAP Medium anti-clickjacking
X-Frame-Options SAMEORIGIN + X-Content-Type-Options nosniff + Referrer-Policy на все web-ответы (go-live аудит 17.06). CSP вынесен отдельно (SPA Vue+Vuetify). TDD-тест на публичном /.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-17 17:12:32 +03:00