При первом запуске pre-push hook'ов после установки lefthook (`4eee06f`)
обнаружились 3 проблемы — все легитимны, не в самом lefthook'е:
1. **gitleaks-full-history** ловил 42 хита `ru-phone-unmasked` в HTML-концептах
handoff Платона (liderra_v8_handoff/concepts/v8_*.html и web/v8/v8_*.html).
Это ДЕМО-данные для визуализации, не реальные ПДн. Добавлены в allowlist
.gitleaks.toml: `liderra_v8_handoff/concepts/.*\.html` + `web/v8/.*\.html`
+ `app/composer.lock`.
2. **lychee-links** ловил 21 ошибку «Cannot resolve root-relative link» на
ссылки `/login`, `/register`, `/legal/*` в HTML-концептах. Эти маршруты
появятся только в фазе 2+ (Vue+Vuetify реализация). Сужен glob
pre-push lychee — выкинут `web/**/*.html`. Дополнительно добавлены
`liderra_v8_handoff/concepts` и `web/v8` в .lychee.toml exclude_path
как защита для других вариантов запуска.
3. **2 РЕАЛЬНЫХ битых ссылки** в narrative — спасибо lychee, нашёл:
- `docs/CRM_bp-gr_Инструкция_v8_5.md:6128` ссылался на `brandbook.md`,
но этот файл удалён 08.05.2026 (заменён на `liderra_v8_handoff/docs/
BRANDBOOK_v2.md` v8 Forest). Исправлен относительный путь.
- `README.md:88` ссылался на `docs/README_АРХИВ_v8_4.md`, но переименован
в `_v8_5.md` коммитом `4ffc19a` от 07.05.2026. Поправлено + bump v8.4→v8.5
в подписи.
Финальный smoke-test после правок:
- gitleaks detect (full history): «no leaks found»
- lychee на narrative .md: 122 OK / 0 Errors / 5 Excluded
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Произошло так: при `composer require pestphp/pest pestphp/pest-plugin-laravel
--dev --with-all-dependencies` я не зафиксировал `^3` — composer подтянул
свежайшую Pest v4.7.0 + pest-plugin-laravel v4.1.0. Smoke-test
(`./vendor/bin/pest`) на default-тестах Laravel 11 прошёл 2/2 за 281 ms —
backward-compat с Pest 3 syntax подтверждён. Заказчик 08.05 (поздний вечер)
принял Pest 4 после live-проверки на стеке.
Бонус Pest 4: browser testing (без Dusk), stress testing, mutation
testing v2. Откат дёшев — `composer require pestphp/pest:^3`.
Что сделано:
- composer remove phpunit/phpunit (был direct dev-dep) — phpunit остался
как транзитивная зависимость Pest
- composer require pestphp/pest:^4.7 pestphp/pest-plugin-laravel:^4.1 --dev
- Pest.php создан через `vendor/bin/pest --init` (`tests/Pest.php`)
- `vendor/bin/pest` smoke-test: 2 passed (Unit/Feature ExampleTest), 281 ms
- `vendor/bin/pest --init` упал на интерактивном промпте «Wanna show Pest
some love?» в non-interactive PowerShell — Pest.php к этому моменту уже
создан, нефатально
Reopen(CTO-12): по правилу «явная фиксация переоткрытий» обновлены
3 источника:
- docs/Открытые_вопросы_v8_3.md v1.15→v1.16: блок «Что изменилось в v1.16»,
таблица §0 (CTO-12 переоткрыт+закрыт), запись §3 (Pest 4 + обоснование),
финальный список §X (Pest 4)
- docs/Tooling_v8_3.md v1.2→v1.3: блок «Что нового в v1.3», §3.1 п.4
(Pest 4 в boost:install), §3.4 строка 18 (Pest 4 + бонусы), §6 п.2
(конфликт Pest↔PHPUnit), §10.1 п.9 (процедура установки + warning про
--init на Windows non-interactive)
- CLAUDE.md v1.4→v1.5: §0 источники (Tooling v1.3, Реестр v1.16),
§3.2 строка 18 (Pest 4), §7 п.5 (Pest 4 в boost:install), футер с
историей версий
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Обнаружено 08.05.2026 (вечер): машина — VPS на OpenStack
(Manufacturer = OpenStack Foundation, HypervisorPresent = True).
Provider не пробрасывает nested virtualization в guest VM
(VirtualizationFirmwareEnabled = True на CPU, но KVM на хосте
блокирует VT-x для гостя). Docker Desktop показывает «Virtualization
support not detected, Engine stopped».
Следствие: ранее обсуждённые варианты A (полный WSL2) и B
(Sail на Windows FS) — физически невозможны на этой машине.
Переход на вариант D — native Chocolatey-стек.
Изменения:
- Tooling v1.1 → v1.2: §3.1 п.2/п.3 — Sail удалён из allow-list
Boost. Шапка обновлена под native-стек. Блок «Что нового в v1.2»
с обоснованием.
- CLAUDE.md v1.3 → v1.4: §0 (версия Tooling v1.2), §6 (стек dev =
native PG 16 + Memurai + PHP 8.3), §7 п.3 (Sail отключён в
boost:install). Футер.
Установлено 08.05 вечер:
- ❌ Docker Desktop — удалён (choco uninstall docker-desktop)
- ⏳ PostgreSQL 16.13 — устанавливается (choco install postgresql16)
- ⏳ Memurai Developer 4.1.8 — устанавливается (Redis 7-совместимый,
free до 1GB RAM)
pg_partman/pg_audit/pg_anonymizer на native Windows — ручная
замена. На MVP: партиции через php artisan cron-команду
(Биз-партиции уже в schema v8.5), audit-trigger'ы уже встроены.
Подробное обоснование и триггеры пересмотра — в personal memory
project_phase1_strategy.md (не коммитим).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
CLAUDE.md §6 и Объединённый_конспект Часть X указывали
`composer create-project laravel/liderra app`. Такого Composer-
шаблона на Packagist нет. `liderra` — название нашего продукта,
а не пакета. Правильный official-стартер: `laravel/laravel`.
Замечено при smoke-test окружения 08.05 (готовка к фазе 1, вариант B —
Sail на Windows FS). Без этого фикса первая команда фазы 1 упала бы.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Выбран Pest 3 (не PHPUnit). Обоснование:
- datasets лаконично покрывают 14 статусов воронки и 34 RLS-политики
- architecture testing закрепляет правила Claude на код-уровне
(например, integration тесты не моки́руют БД — линт вместо памяти)
- родной для Laravel/Boost (Nuno Maduro в core team) — один guideline
вместо разрыва на boost:install
- Pest на PHPUnit под капотом — откат дёшев
Изменения:
- Открытые_вопросы_v8_3.md v1.13 → v1.14: запись о закрытии в §3,
сводка §0 (CTO 15→16 закрыто, итого 77→78 / 67→68 ✅)
- Tooling_v8_3.md v1.0 → v1.1: §3.1 п.4, §3.4, §6 п.2, §10.1 п.9
- CLAUDE.md v1.1 → v1.2: §0 (версии источников), §3.2 строка 18,
§7 п.5, футер
Импакт: при composer create-project (триггер фазы 1) — вместо
шага «решить Pest или PHPUnit» теперь composer require pestphp/pest
--dev --with-all-dependencies + vendor/bin/pest --init. Guideline
PHPUnit на boost:install отключить.
P0-блокер фазы 1 остаётся один — Б-1 (юр. лицо).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Получен handoff-пакет liderra_v8_handoff/ от дизайнера Платона
(kpd9363@gmail.com) от 07.05.2026 — v8 Forest. Заказчик 08.05 решил
применить только в части дизайна, имени, логотипа. Функционал, состав
страниц и правила (CTO-11, click-wrap, SSO break-glass, 14 статусов
воронки) — без изменений (источник — ТЗ v8.5/schema v8.5).
Что сделано:
- Массовая замена Лидпоток→Лидерра (с учётом падежей: Лидерры/Лидерре)
в 33 файлах (449 вхождений) — все .md/.sql/.json/.toml/.yml/.txt/.html,
кроме исторических упоминаний внутри liderra_v8_handoff/
- Удалён docs/brandbook.md v1.1 — заменён на BRANDBOOK_v2.md из handoff
- Скопированы 13 концептов liderra_v8_handoff/concepts/v8_*.html в
web/v8/. Удалены старые web/01-login.html, 02-dashboard.html,
03-deals.html, index.html (палитра v1.1 deprecated)
- CLAUDE.md v1.0→v1.1: §0 (BRANDBOOK_v2 + DEVELOPER_HANDOFF в источниках),
§2 (палитра Forest, Inter+JBM, Lucide), §5 п.6 (anti-pattern Inter
снят — в Forest Inter наш основной шрифт), §6 (13 концептов в web/v8/)
- Реестр Открытые_вопросы_v8_3.md v1.12→v1.13: добавлена запись о
ребрендинге + 4 точечных расхождений handoff vs ТЗ (статусы воронки,
click-wrap чекбоксы, SSO fallback, axe violations)
- package.json/package-lock.json: name lidpotok→liderra
4 расхождения handoff vs ТЗ (НЕ применены, источник истины — ТЗ/schema):
1. 14 «обобщённых» статусов в BRANDBOOK_v2 §3.6 ≠ 14 slug'ов в
schema.sql:2076 (совпадает 2 из 14: «Переговоры», «Оплачено»).
Источник — schema/ТЗ §6.4 (реселлерская модель из аудита crm.bp-gr.ru,
6 системных + 8 настраиваемых статусов).
2. 3-й click-wrap в v8_login.html («маркетинг-опционально») ≠ ТЗ §1.5/§4.1
(«согласие на ПДн», обязательное, OPEN-Ж-3).
3. SSO в v8_admin.html («локальный 2FA fallback») ≠ ТЗ OPEN-И-13
(break-glass super_admin, локальный 2FA выключен).
4. Заявление «axe-core 4.10.2 — 0 violations» в README handoff — локально
Pa11y 9.1.1 + axe нашёл 81 violation на 10/13 HTML (преимущественно
color-contrast на декоративных separator'ах с --ink-disabled).
Чисто: settings/errors/palette_options.
Что НЕ включено в коммит:
- лендинг/TZ_landing_v1_0.md — untracked, не моя работа в этой сессии
- .tmp/ — gitignored
Что осталось (для следующих сессий):
- Возможное переименование GitHub-репо CoralMinister/lidpotok → liderra
(отдельное решение заказчика)
- Опционально: обратная связь Платону по 4 расхождениям handoff vs ТЗ
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Доделка консистентности архива после реализации v8.5
(коммиты aabf827 / 038a884 / 4ffc19a).
Объединённый_конспект.md:
- Новая Часть IX «v8.3.3 + v8.4 ФИНАЛ + МИГРАЦИЯ + АУДИТ C → v8.5
(06–07.05.2026)» — хроника двух дней (8 подразделов: хронология,
v8.4 финал, миграция на Server 2022, аудит C, реализация v8.5
тремя коммитами, метрики, что осталось, 5 уроков).
Приложение_Б_В_БД_диаграммы_v8_3.md:
- Шапка обновлена: schema v8.5 (54/91/35/4 роли/12 триггеров/4 функции).
- Новая секция «Дельта v8.2 → v8.5» — компактная сводка изменений
schema, поскольку Mermaid-диаграммы фиксируют срез v8.1.
Перерисовка отложена до спринта 0/1 (следуем существующему
disclaimer'у файла).
- Перечислены: +1 таблица (project_user_assignments), +26 колонок
с разбивкой по таблицам и Биз/CTO/OPEN-И источникам, +5 индексов,
+2 WITH CHECK + 1 новая RLS, +6 REVOKE, +1 роль (crm_audit_writer),
+4 функции (audit_chain_hash/audit_block_mutation/
report_jobs_log_export/calc_lead_score), +12 триггеров, ALTER
api_keys.expires_at, закомментированный задел call_recordings.
cspell-words.txt: +KDV (старая машина), +коммита/коммитов.
Артефакт c--Users-KDV-Projects-lidpotok/ (~25 МБ JSONL старых сессий)
удалён из рабочей директории — был в .gitignore, в git не попадал,
коммит не затрагивает.
Lint+spell чистые.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
schema.sql v8.4 (hotfix Z.5.3-Z.5.6):
- outbound_webhook_subscriptions.events: убран DEFAULT '[]' (конфликт
с CHECK jsonb_array_length>0). NOT NULL остался — приложение должно
явно передать список событий ≥1.
- deal_tag_pivot: добавлены ENABLE RLS + CREATE POLICY tenant_isolation
через JOIN на deal_tags(tenant_id) — паттерн как у saas_invoice_items.
- Шапка schema.sql:107-108: «33 политики / 34 защищённых» → «34/34, 1:1»
(после правки выше). CHANGELOG_schema.md: расширена запись Z.5
(Z.5.3-Z.5.6) с финальными метриками.
narrative v8.4:
- §1.4, §3.2, §7.1, §22.6, §27 «33 политики на 34» (5 мест) → «34/34,
1:1». Шапка «Что нового в v8.4»: +3 RLS вместо +2 (с учётом hotfix).
Прил. Б+В:
- Шапка ссылалась на «schema.sql v8.3, 51 таблица» → актуально:
«schema.sql v8.4, 53/86/34/34, при расхождении приоритет за schema.sql».
Добавлены изменения v8.4 в перечень того, что не отражено в ER.
cspell-words.txt: добавлено «партиционированной» (склонение, нужно для
CHANGELOG Z.5.4).
Метрики schema.sql v8.4: 65 CREATE TABLE (53+12), 86 индексов,
34 RLS-политики, 34 ENABLE RLS, 3 роли БД.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- §1.4/§3.2/§22.6/§23.* «29 политик» (4 места) → «33 политики на
34 защищённых таблицах» (расхождение по `saas_invoice_items` —
намеренное, защита косвенно через FK на `saas_invoices`).
- §3.2: ссылка «schema.sql v8.1, раздел 12» → «db/schema.sql v8.4».
- §7.* «обновление updated_at через trigger» (стр. 1594) уточнено:
Eloquent `$timestamps = true` (application-уровень). Trigger в БД
не вводим на MVP, чтобы не дублировать ORM. В schema.sql triggers нет.
- §7.3 — добавлен явный disclaimer: источник истины = `db/schema.sql`,
inline-DDL ниже могут отставать (см. CHANGELOG_schema.md).
- §4.1 (стр. 660-666): добавлен 3-й чекбокс «Согласие с Политикой
конфиденциальности» — синхронизация с §1.5 (3 click-wrap, OPEN-Ж-3).
- §5.1 (стр. 5693): «Только webhook (без CSV в MVP)» → «webhook
основной + CSV-импорт опциональный модуль (раздел 6) + ручное
создание (раздел 10.7)» — синхронизация с §1.5 и §6.
- Заключение (стр. 5878): шапка v8.1 от 03.05.2026 → v8.4 от
06.05.2026, P0-блокеры 9→1 (Б-1), следующие шаги переписаны
с учётом фактического статуса.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Все 15 упоминаний placeholder-домена `crm-аналог.ru` заменены на
`lidpotok.ru` (имя проекта; DO-2 «купить домен» — отдельный P1).
Затронуты: webhook URL, register/verify-email links, wildcard
subdomains, *.lidpotok.ru SSL, staging.lidpotok.ru, status.lidpotok.ru,
admin@lidpotok.ru.
- Таблица §11.1 (стр. 363-364): «Yandex / VK Cloud (prod)» → только
«Yandex Object Storage (prod, по DO-1)». Email: «Mailgun / SendGrid /
собственный SMTP» → «Unisender Go (по Ю-7)».
- §17.7 Library (стр. 2845): «SMTP / Mailgun API» → «SMTP-relay
(Unisender Go, см. Ю-7)».
- §22.* (стр. 4497-4499): список РФ-провайдеров получил пометку
«✅ Yandex Cloud — выбран по DO-1, VK/Selectel — альтернативы Прил. К
не выбраны». Это точнее, чем простой перечень.
Историческая запись «Ю-7 — Mailgun → Unisender Go» в §1.* шапки
оставлена как есть (показывает решение Ю-7).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Переименование: docs/README_АРХИВ_v8_3.md → _v8_4.md.
- Шапка: версия v8.3.3 → v8.4, состав 18 → 17 файлов в docs/
(минус удалённый Plan_narrative_v8_4.md).
- Эволюция версий: добавлена запись v8.4 (06.05.2026 поздний вечер,
финал narrative + переименование + schema v8.4 + регистр v1.10).
- Главный narrative: имя файла _v8_3 → _v8_4, размер ~310→~340 КБ,
описание расширено под все 13 разделов плана v8.4.
- Прил. А (schema.sql): v8.3 → v8.4, метрики 51/81/31 → 53/86/33,
+outbound_webhook_subscriptions/deliveries (закрытие тех-долга §19.10).
- Прил. Е (Открытые_вопросы): v1.6 → v1.10 (40✅/5🟦/5⏸, 0 P2).
- «Что осталось мне (Claude)»: v8.4 narrative ✅ выполнено;
Прил. Л — 3/8 готово, осталось 04..08.
- История версий: добавлена строка v8.4.
- Обновлены кросс-ссылки в CLAUDE.md (§0), README.md, db/CHANGELOG_schema.md,
docs/Tooling_v8_3.md, docs/CRM_bp-gr_Инструкция_v8_4.md.
- Исторические упоминания старого имени в Объединённый_конспект.md,
Analiz_originala_v8_3.md, Pravila_raboty_Claude_v1_1.md и в записях
прошлых версий — оставлены намеренно (правило §4.4 правил работы
Claude — прослеживаемость решений).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
§5 Источник данных — Webhook:
- §5.1 переписан: 3 канала ingress (webhook ~95%, manual ~3%, CSV ~2%)
- Добавлен блок про outbound webhook как уникальное преимущество
с привязкой к §19.10 и 7 линиям доказательств
§8 Воронка и статусы:
- §8.1: 14 статусов с явным разделением 6 системных vs 8 настраиваемых,
цвета hex из брендбука v1.1, описание каждого статуса
- §8.2: free state machine (CTO-2) с 4-пунктным обоснованием
- §8.5 переписан в 4 подсекции: что настраивается (только название
на MVP), примеры, резолв через Redis-кеш, UX inline-редактирования
§9 Мои Проекты (большой раздел):
- 5 → 10 подсекций
- §9.2: таблица с лимитами/регионами/днями
- §9.4: карточка проекта 11 секций (паритет с оригиналом, партии 10.3-10.7)
- §9.5: EffectiveLimitCalculator (главное расхождение №2 с оригиналом):
динамический effective_daily_limit_today, 5 триггеров пересчёта,
логирование в project_limit_adjustments
- §9.6: project_suppliers m2m
- §9.7: soft-delete + retention 180 дней (Биз-14, cron disabled до Б-1)
- §9.8: capabilities поставщиков B1/B2/B3 (партия 13.3.5)
- §9.9: расширенные действия. §9.10: окно обслуживания (паритет не делаем)
§12 Дашборд:
- §12.5.6 «Конверсия проектов» (паритет с /admin/visit/rt-stat,
партия 12.1): 17 колонок (id/тег/проект/статус/источник/обработано
+ 11 status-колонок), формат N (XX.XX%), monotone per column,
total-row, видимость через users.preferences
- Наши расширения сверх паритета: экспорт XLSX через report_jobs +
drill-down из ячейки в /deals
- +2 эндпоинта в §12.6
Шапка narrative обновлена. План v8.4: 12/13 ✅ (было 8/13).
Осталось только §23.10 Админка SaaS (большой). cspell-words.txt:
+резолв, +пунктным.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
§22.2 Транспортный уровень: CSP-строка расширена до полной политики
(script-src без 'unsafe-inline', object-src 'none', frame-ancestors
'none', report-uri /csp-report).
§22.11 «Защита от prompt injection в DOM» (новый, 4 уровня):
- 22.11.1 — полная CSP-политика с 13 директивами
- 22.11.2 — CI-линтер запрещает в DOM элементы с ID/class
на префиксы claude-/gpt-/agent-/ai-
- 22.11.3 — DOMPurify-конфиг для всех v-html
- 22.11.4 — методология аудита third-party скриптов
(31 keyword grep + SRI-хеши + ежеквартальный re-audit)
- 22.11.5 — что НЕ делаем (не блокируем легитимных AI-агентов)
Контекст — атака `claude-agent-stop-container/glow-border/animation-styles`,
найденная во ВСЕХ страницах crm.bp-gr.ru (партии 10, 12-15 аудита).
§22.12 «Антипаттерны оригинала» (новый):
- 22.12.1 — защита формы смены пароля (vs пароль в `<input type="text">`
оригинала, партия 14.3.4)
- 22.12.2 — защита форм интеграций (vs API credentials в `<input type="text">`
всех 5 карточек оригинала, партия 15.2.3)
- 22.12.3 — code review checklist (7 пунктов)
Шапка narrative обновлена. План v8.4: 7/13 ✅ (было 6/13).
cspell-words.txt: +санитизация, +санитизируются.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
§14 Activity Log: 17 событий (+6 новых: project_changed, phone_changed,
phones_changed, contact_name_changed, reminder_completed, restored).
§14.7 vs оригинал — таблица «что не логирует crm.bp-gr.ru» (партия 11.4).
§18.4 Безопасность: §18.4.1 Биз-9 (2FA на всех тарифах), §18.4.3 retention
auth_log, §18.4.4 уведомления о подозрительной активности (6 типов алертов),
§18.4.5 vs оригинал — 7 функций безопасности (партии 14.3.2–14.3.4).
§19.10 Outbound webhook: статус MVP по OPEN-И-2 (был «v2, не реализуется»).
10 подсекций: 7 линий доказательств уникальности (партии 9–15), формат
запроса, HMAC SHA-256, retry до 24ч, защита от SSRF, rate-limit.
Шапка narrative: блок «Что нового в v8.4» обновлён.
План: 6/13 ✅ (было 3/13). Тех-долг — DDL outbound_webhook_subscriptions
+ outbound_webhook_deliveries при правке §7 v8.4.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Закрытие 11 вопросов с дефолтами (утверждено 06.05.2026):
- Биз-6 — режим «по запросу» (15 партий аудита уже сделано)
- Биз-10..13 — модель reminders, один кошелёк ₽, телефония Post-MVP, magic-link 24ч
- Биз-14..16 — TTL 180д, OSINT не делаем, desired_daily_numbers
- OPEN-К-1, К-7 — Cloud Boost grant и CVoS отложены
- OPEN-И-12 — контакты эскалации в Notion private до DO-4
Сводка после v1.10: 50 продуктовых = 40 ✅ + 5 🟦 + 5 ⏸ (Б-1 P0;
Диз-1/3, DO-2/4 — все P1 ждут Б-1 или у Claude). Все P2 закрыты.
Plan_narrative_v8_4.md — компактный план переписывания 13 разделов
ТЗ под решения 04–06.05 + аудит партий 1–15. Сам narrative не трогали.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>