Commit Graph

29 Commits

Author SHA1 Message Date
Дмитрий 59f8ca04bb phase1(hooks-fix): сужение pre-push lychee + 2 битых ссылки + allowlist demo HTML
При первом запуске 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>
2026-05-08 12:00:15 +03:00
Дмитрий 9ee31b71cb phase1(docs): Tooling v1.5 + CLAUDE.md v1.8 — фиксация фактической установки Boost
Doc hygiene после установки Boost (e04f53b) и Roave/SA (0eb2f72).
Прогноз → факт: что планировалось vs что реально сделано.

CLAUDE.md v1.7 → v1.8:
  - §0: реестр инструментов → Tooling v1.5
  - §6 «Текущая фаза»: 0 → 1 (15/28 активных, перечислены 6 backend-tool'ов
    фазы 1, добавлен smoke-test factual status, отмечены остающиеся
    #15/#16, отметка про #17 → ручной cron)
  - §7 «Laravel Boost»: переписан с прогноза на факт. Wizard сломан
    на кириллице → manual setup. «Отключение guidelines» помечено как
    избыточное (Roster auto-detect делает это сам). Путь Vuetify
    guideline скорректирован: app/.ai/guidelines/vuetify.md
    (был resources/boost/guidelines/vuetify.blade.php)

Tooling v1.4 → v1.5:
  - Шапка + блок «Что нового в v1.5» (Boost+SA active, manual setup)
  - §10.1: 12 шагов перехода 0→1 → таблица «план/статус» с галочками
    на фактических коммитах (e04f53b, 0eb2f72, 30f0335, 0345683)
  - §10.2: добавлено уточнение пути userGuidelineDir = '.ai/guidelines'
    после source-проверки GuidelineComposer

Открытые_вопросы — без изменений (это техническая doc-hygiene, не
продуктовое решение). Memory обновляется отдельно (project_state +
feedback_environment п.26).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 11:14:24 +03:00
Дмитрий 3a9ed7101e phase1(hygiene): narrative ↔ Laravel 13 — закрытие техдолга v1.17
Точечная синхронизация трёх narrative-документов под Laravel 13
(один токен на файл, без bump'а версии каждого):
  - docs/CRM_bp-gr_Инструкция_v8_5.md:6219
  - docs/Vybor_oblaka_v8_3.md:3
  - docs/Админка_SaaS_v8_2.md:103

Не трогалось намеренно (исторические записи):
  - docs/Объединённый_конспект.md:149 — Часть I, фиксация решений v8.0 на 03.05
  - docs/Открытые_вопросы_v8_3.md:354 → 361 — фиксация результата аудита

Реестр Открытые_вопросы v1.17 → v1.18 (новый блок «закрыт техдолг»).
Оперативная карта CLAUDE.md v1.6 → v1.7.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 10:35:31 +03:00
Дмитрий 63c7364e6e reopen(stack): Laravel 11 → Laravel 13 — фиксация переоткрытия
Произошло так: 08.05.2026 при `composer create-project laravel/laravel
app` я не зафиксировал `^11` — Composer подтянул свежайшую
`laravel/framework: ^13.7` (Laravel 13.7, релиз ~Feb 2026), вместо
ожидаемого Laravel 11 LTS.

Smoke-test'ы подтвердили работоспособность Laravel 13:
- php artisan migrate: 3/3 default-миграций OK
- pestphp/pest 4.7.0: 2/2 за 281 ms
- laravel/pint 1.29: pint --test passed
- larastan/larastan 3.9.6 + phpstan 2.1.54: analyse passed (с baseline)
- barryvdh/laravel-ide-helper 3.7.0: ide-helper:generate OK

Live-проверка совместимости 5 ключевых плагинов:
- laravel/boost v2.4.6: composer dry-run резолвит lock без conflict
- остальные 4 — установлены и запущены без issue

Заказчик 08.05 (поздний вечер) принял Laravel 13 как latest stable.
Откат дороговат — rm -rf app/ + повторение всей сессии (~10-15 мин).

По правилу «явная фиксация переоткрытий» обновлены 3 источника:

- CLAUDE.md v1.5→v1.6: §2 backend (Laravel 11 → Laravel 13 + объяснение
  обстоятельств), §0 источники (Tooling v1.4, Реестр v1.17), футер
- docs/Tooling_v8_3.md v1.3→v1.4: блок «Что нового в v1.4» (live-
  проверка совместимости 5 плагинов + установка Pint/Larastan/IDE Helper)
- docs/Открытые_вопросы_v8_3.md v1.16→v1.17: блок «Что изменилось в
  v1.17» с обстоятельствами, импактом и техдолгом

Техдолг (для следующих сессий): синхронизация narrative ТЗ + 2 других
архивных документов под Laravel 13:
- docs/CRM_bp-gr_Инструкция_v8_5.md (строка 6219, главное ТЗ)
- docs/Vybor_oblaka_v8_3.md (строка 3, аналитическая записка по облаку)
- docs/Админка_SaaS_v8_2.md (строка 103, описание стека админки)

Не блокер для разработки, но нарушает связность архива. Включить в
hygiene-проход при следующем апдейте narrative до v8.6.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 10:20:55 +03:00
Дмитрий 30f0335f5f phase1(test): Pest 4 swap + reopen(CTO-12) — Pest 3 → Pest 4
Произошло так: при `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>
2026-05-08 09:56:20 +03:00
Дмитрий 477e866726 phase1(stack): native Windows вместо Sail — Tooling v1.2, CLAUDE.md v1.4
Обнаружено 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>
2026-05-08 09:03:51 +03:00
Дмитрий 7f28721723 fix(typo): laravel/liderra → laravel/laravel в триггере фазы 1
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>
2026-05-08 08:31:14 +03:00
Дмитрий e1641f2e16 docs(hygiene 08.05): Часть X конспекта — ребрендинг + CTO-12 + Диз-1
Доделка консистентности архива по итогам сессии 08.05.2026
(коммиты 887abf4 / 3dca049 / 62a85f2 / 63c7c83).

Объединённый_конспект.md:
- Шапка: «03–05.05.2026, до v8.3.2» → «03–08.05.2026, до v8.5 +
  ребрендинг»
- Новая Часть X «РЕБРЕНДИНГ + HANDOFF ПЛАТОНА + ЗАКРЫТИЯ CTO-12 /
  Диз-1 (08.05.2026)» — 11 подразделов: handoff, выборочная
  интеграция (4 расхождения handoff vs ТЗ), массовая замена 33
  файла / 449 замен, CLAUDE.md v1.0→v1.1, реестр v1.12→v1.13,
  cspell+push 887abf4/3dca049, CTO-12 закрыт (Pest 3),
  Диз-1 закрыт (handoff покрыл), метрики на конец дня (78/69/5/4),
  что осталось, 5 уроков сессии.

Приложение_Б_В_БД_диаграммы — без изменений: schema 08.05 не
менялась, дельта v8.2→v8.5 уже добавлена 07.05 в a4d15ee.

Lint markdownlint: 0 errors.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 08:00:33 +03:00
Дмитрий 63c7c83d82 close(Диз-1): HTML-прототипы покрыты handoff'ом Платона — реестр v1.15, CLAUDE.md v1.3
Решение заказчика 08.05.2026: формально закрыть Диз-1 (P1) — handoff
v8 Forest от Платона покрыл HTML-прототипы на 100%+ (13 экранов в
web/v8/ против 8 запланированных + 3 экрана ошибок). Прил. Л не
выпускается (избыточно после handoff'а).

Точечные расхождения handoff vs ТЗ (зафиксированы в шапке v1.13)
реализовывать по ТЗ/schema:
- 14 «обобщённых» статусов в BRANDBOOK_v2 §3.6 ≠ 14 slug'ов в schema
- 3-й click-wrap в v8_login.html ≠ ТЗ §1.5/§4.1
- SSO «локальный 2FA fallback» в v8_admin.html ≠ ТЗ OPEN-И-13

axe: 81 violation на 10/13 HTML (color-contrast на декоративных
separator'ах) — исправлять при реализации в Vue+Vuetify.

Изменения:
- Открытые_вопросы_v8_3.md v1.14 → v1.15: Диз-1 в §5 → ; сводка §0
  (дизайнер 2→3 закрыто, итого 78/68→69 , 5→4 ⏸, 4→3 P1)
- CLAUDE.md v1.2 → v1.3: §0 (версия реестра v1.15), §6 (P0-блокер
  упоминание Диз-1 закрыт), футер

Открыто на 08.05.2026: **4 ⏸ продуктовых** — Б-1 (P0) + 3 P1 (Диз-3,
DO-2, DO-4), все ждут Б-1. Один настоящий блокер — Б-1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 07:51:24 +03:00
Дмитрий 62a85f2a08 close(CTO-12): Pest 3 — реестр v1.14, Tooling v1.1, CLAUDE.md v1.2
Выбран 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>
2026-05-08 07:44:11 +03:00
Дмитрий 887abf444e rebrand(v8.5→Лидерра): дизайн-handoff Платона v8 Forest + Лидпоток→Лидерра
Получен 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>
2026-05-08 07:11:58 +03:00
Дмитрий a4d15ee1d5 docs(hygiene v8.5): Часть IX конспекта + дельта v8.5 ER-диаграмм
Доделка консистентности архива после реализации 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>
2026-05-07 18:27:08 +03:00
Дмитрий 4ffc19a7d2 docs(narrative): v8.4 → v8.5 — реализация 27 решений аудита C
Завершает блок реализации v8.5 после schema-коммита 038a884.

Переименования:
- docs/CRM_bp-gr_Инструкция_v8_4.md → _v8_5.md
- docs/README_АРХИВ_v8_4.md → _v8_5.md

Новые подразделы narrative (in-place):
- §10.8: Антифрод дублей (Биз-19), routing (Биз-17, CTO-16), scoring
  (Биз-22), регион (Биз-23), эскалация (OPEN-И-25), call-recordings
  задел (OPEN-И-26)
- §12.5.5: TTFR-SLA (Биз-18), UTM-когорты (CTO-14)
- §14.8: Append-only audit hash chain (OPEN-И-15), report_jobs export
  trigger (OPEN-И-20)
- §17.9: Telegram-бот (Биз-20), эскалация-нотификации (OPEN-И-25),
  late waiting_payment alert (Биз-24)
- §19.10.11–12: DNS-rebinding pin-IP (OPEN-И-18),
  marketing.conversion event (Биз-21)
- §22.13: SSO Yandex 360 + JIT + break-glass (OPEN-И-13), SET LOCAL
  test plan (CTO-13), RLS WITH CHECK + REVOKE (OPEN-И-14), Sentry
  PII whitelist+regex (OPEN-И-16), anti-DDoS Nginx+SmartCaptcha+
  blacklist (OPEN-И-21), TTL secrets 365d (OPEN-И-17/19),
  two-person impersonation (CTO-15+Ю-9), audit hash chain link
- §23.10.11: SSO login UI, break-glass dashboard, two-person UI,
  152-ФЗ ст.21 hard-block UI
- §7.1: метрики обновлены 53→54/86→91/33→34/3→4/12 триггеров/4 функции

Прил. И Часть Г (новая) — 9 операционных процедур:
- Г.1 RLS smoke-test через PgBouncer (CTO-13, BLOCKER для фазы 1)
- Г.2 Cron audit:verify-chain (OPEN-И-15)
- Г.3 Cron secrets:notify-expiring (OPEN-И-17)
- Г.4 Anti-DDoS (Nginx + Yandex SmartCaptcha + disposable-blacklist)
- Г.5 Per-tenant DEK + crypto-shred (OPEN-И-22)
- Г.6 pg_anonymizer для staging (OPEN-И-24)
- Г.7 Yandex 360 SSO setup (OPEN-И-13)
- Г.8 Cron leads:escalate-stale (OPEN-И-25)
- Г.9 Cron payments:notify-stale (Биз-24)

Кросс-ссылки обновлены: CLAUDE.md, README.md, web/index.html,
README архива (переименован v8_4→v8_5). Schema.sql v8.5 шапка
указывает на narrative v8_5.md.

cspell-words.txt: +SPE, +gethostbyname.

Lint+spell чистые. Архитектурно фаза 1 (composer create-project)
разблокирована — требуется только Г.1 (e2e-тест RLS) в спринте 1.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 18:09:22 +03:00
Дмитрий aabf827f76 docs(audit-C): закрытие 27 вопросов аудита C → реестр v1.12
Решение заказчика 07.05.2026: «A везде» по всем 27 вопросам аудита C.

8 P0 разблокированы для триггера фазы 1 (composer create-project):
- Биз-17 (manual routing), Биз-18 (TTFR 15 мин + alert),
  Биз-19 (24ч-дедуп без списания, duplicate_of_id)
- CTO-13 (e2e SET LOCAL+PgBouncer тест в спринте 1)
- OPEN-И-13 (OIDC+JIT+break-glass), OPEN-И-14 (WITH CHECK + REVOKE),
  OPEN-И-15 (append-only + hash-chain + crm_audit_writer),
  OPEN-И-16 (Sentry whitelist+regex)

12 P1 + 7 P2 закрыты с импактом на schema/narrative
(см. §13.10.4 — schema → 54 таблицы, +6 триггеров, +1 роль).

Реализация v8.5 — отдельный коммит (схема + narrative + CHANGELOG).

Сводка §0: 67  / 5 🟦 / 5 ⏸ (1 P0 Б-1, 4 P1 ждут Б-1 или у Claude).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 17:30:01 +03:00
Дмитрий 4d65d6a523 docs(audit-C): раздел 13 — 27 новых вопросов из аудита C (07.05.2026)
Аудит C — архитектурно-функциональный (CRM-best-practices vs narrative
v8.4) + STRIDE threat modeling. Запускались два независимых read-only
general-purpose агента: C-1 (арх) и C-2 (security).

Найдено 27 новых открытых вопросов:
- Бизнес/продукт (8): Биз-17..24 — автораспределение, TTFR-SLA,
  антифрод дублей, Telegram, маркетинг-конверсии, lead scoring,
  гео-таргетинг сделок, нотификация просрочки.
- CTO (4): CTO-13..16 — SET LOCAL+PgBouncer тест (P0), UTM в deals,
  impersonation two-person, skill-based routing.
- OPEN-И — DevOps/security (14): OPEN-И-13..26 — Yandex 360 SSO flow,
  RLS WITH CHECK + REVOKE, append-only audit hash-chain, Sentry PII
  scrubbing, ротация секретов cron, DNS-rebinding, лимит api_keys,
  signed URL, anti-DDoS, crypto-shred, audit-writer role,
  pg_anonymizer, эскалация лидов, call_recordings задел.
- Юрист (1): Ю-9 — 152-ФЗ ст.21 ч.5 запрет impersonation в
  processing_restricted.

8 P0 (4 архитектура + 4 security), 12 P1, 7 P2. Каждый вопрос
с тремя вариантами решения A/B/C и рекомендуемым.

Закрытий нет — правило §2.2. Все 5 ⏸ из v1.10 в работе.

Версия Открытые_вопросы v1.10 → v1.11. Сводка §0 пересчитана:
50 → 77 продуктовых, 5 → 32 ⏸, 1 → 9 P0, 4 → 16 P1, 0 → 7 P2.

cspell-words.txt: +антифрод, TTFR, UTM, utm.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 01:03:48 +07:00
Дмитрий 574154bcf9 fix(schema+narrative): B-5 — schema P1 + синхронизация метрик
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>
2026-05-07 00:19:20 +07:00
Дмитрий 08c8b3705c fix(narrative): B-4 — внутренняя консистентность v8.4
- §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>
2026-05-07 00:05:53 +07:00
Дмитрий 1ffd5c1609 fix(narrative): B-3 — домены и сервисы синхронизированы с DO-1/Ю-7
- Все 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>
2026-05-06 23:47:00 +07:00
Дмитрий bfe6c9b685 fix(docs): B-2 — арифметика и опечатки в Открытые_вопросы и Tooling
- Открытые_вопросы §0 v1.10 (стр. 17): « 30 → 40, ⏸ 13 → 5, P2 10 → 0»
  → « 33 → 40, ⏸ 12 → 5, P2 7 → 0». Исходные значения соответствуют
  таблице §0 v1.9 (стр. 24: «33 / 5 / 12»). OPEN-К-1/К-7 учитываются
  в счётчике приложения К, не в счётчике «продуктовых».
- Открытые_вопросы CTO-12 (стр. 25): убрана несуществующая ссылка
  «Дефолт по Прил. Н §3.4: PHPUnit». В §3.4 такого дефолта нет —
  только требование «выбрать ОДИН до установки Boost» (§3.4 + §6 п. 2).
- Tooling §6 (стр. 184): ссылка `см. §11` для Lighthouse → `см. §12`
  («Что вне 28 инструментов»). §11 — про Windows/PowerShell.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 23:38:06 +07:00
Дмитрий 4321251bc1 docs(archive): README v8.3.3 → v8.4 (синхронизация с narrative v8.4)
- Переименование: 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>
2026-05-06 19:35:40 +07:00
Дмитрий c8db9a26c4 docs(narrative): v8.4 финал (§23.10 + 13/13 + rename _v8_3 → _v8_4)
- §23.10 Админка SaaS: расширен с 5 до 10 подсекций — Биз-16
  (колонка «Желаемое × факт сегодня» с цветовым кодированием),
  Ю-2 (поставщики, дашборд маржи, сверка счетов), OPEN-Д-5/И-1
  (incidents_log: 8 типов × 4 severity, 24ч SLA уведомления РКН для
  data_breach по 152-ФЗ ст.18.1 ч.3.1), Прил. Д (workflow обращений
  субъектов ПДн с 30-дневным SLA), таблица преимуществ vs оригинал.
- Шапка narrative: убрано «in progress», блок «Что нового в v8.4»
  дополнен §23.10. Подвал: имя файла v8.4.
- Переименование: CRM_bp-gr_Инструкция_v8_3.md → _v8_4.md.
- Кросс-ссылки обновлены: CLAUDE.md (§0/§2/§6/§8 — версии, метрики
  схемы 53/86/33, счётчик прототипов 3/8), README.md (версии, статусы
  прототипов, репо CoralMinister), db/schema.sql, db/CHANGELOG_schema.md,
  web/index.html.
- .lychee.toml: exclude приватного github.com/CoralMinister/lidpotok
  (404 анонимно — норма).
- Plan_narrative_v8_4.md удалён (план v8.4 выполнен полностью, 13/13).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 19:14:53 +07:00
Дмитрий 60897e0ed2 docs(narrative): v8.4 +4 разделов (§5, §8, §9, §12)
§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>
2026-05-06 17:55:31 +07:00
Дмитрий a05b09a025 schema(v8.4)+docs(narrative): §7 + outbound_webhook_* DDL
schema.sql v8.3 → v8.4 (закрывает тех-долг §19.10):
- +outbound_webhook_subscriptions (15 полей: target_url, secret_hash,
  secret_prefix, events JSONB, custom_headers, is_active, paused_at,
  consecutive_failures, …) + 2 индекса
- +outbound_webhook_deliveries (16 полей с retry-флоу: attempt_number 1-7,
  status pending/success/failed/permanently_failed, scheduled_at,
  next_retry_at, response_body, …) + 3 индекса
- +RLS-политики tenant_isolation для обеих таблиц
- Шапка обновлена: 51→53 таблицы, 81→86 индексов, 31→33 RLS,
  32→34 ENABLE RLS

db/CHANGELOG_schema.md: новая запись §Z (v8.3 → v8.4) с обоснованием,
сводной таблицей, описанием новых таблиц/индексов, разъяснением что
crm_connections/crm_field_mappings отложены до спринта 14-15 (amoCRM).

narrative §7: синхронизация с фактическим schema.sql v8.4.
- §7.1: метрики обновлены (53/12/86/33/34), карта таблиц расширена
  до полного списка (включая ранее отсутствовавшие
  tenant_custom_domains, user_recovery_codes, user_sessions,
  project_suppliers, project_limit_adjustments, incidents_log,
  report_jobs, document_sequences, outbound_webhook_*)
- §7.3: DDL deals — удалены reminder_text/reminder_at/idx_deals_reminder
  (синхронизация с v8.3, партия 12.2.5). Добавлены DDL reminders v8.3,
  outbound_webhook_subscriptions, outbound_webhook_deliveries

Шапка narrative: блок «Что нового в v8.4» обновлён (+§7).
План v8.4: 8/13  (было 7/13). cspell-words.txt: +воркер, +деплой формы.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 17:35:18 +07:00
Дмитрий 63b45217dc docs(narrative): v8.4 +§22 (CSP + prompt injection + антипаттерны)
§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>
2026-05-06 14:32:13 +07:00
Дмитрий 6648fdd52f docs(narrative): v8.4 +3 разделов (§14, §18.4, §19.10)
§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>
2026-05-06 14:08:03 +07:00
Дмитрий 938066fefe docs(narrative)+web: narrative v8.4 partial (§1, §17, §26) + HTML-прототип 03 «Список сделок»
Narrative переработан под решения 04–06.05 + аудит партий 1–15:
- §1.4.1 — 7 конкурентных преимуществ vs оригинал crm.bp-gr.ru
- §1.5 — 3 формата ingress (webhook/manual/CSV), 3 чекбокса click-wrap
- §17.8 — Тихие часы (start_hour/end_hour 0..23, минимум 3 часа,
  общий timezone тенанта), паритет с партией 13.2.1
- §26 — полная замена под брендбук v1.1: палитра Teal (#0F6E56),
  сетка 4px, JetBrains Mono, маскирование credentials как
  антипаттерн оригинала.

Шапка narrative — блок «Что нового в v8.4» с маппингом 11 закрытых
вопросов из реестра v1.10. Остальные 9 разделов плана —
в Plan_narrative_v8_4.md (отдельные сессии).

web/03-deals.html — прототип «/deals»:
- Sidebar + topbar + balance widget (как 02-dashboard)
- Sticky-фильтры: поиск FTS, проект, статус, менеджер, период, теги,
  «только с напоминанием», кнопки Колонки/Экспорт/Создать
- Bulk-actions bar при выборе строк
- Таблица 20 демо-строк с 14 цветными статусами (включая 🔥 Горячий)
- Pagination, low-balance баннер, чекбоксы, sort-индикаторы
- Телефоны маскированы по правилу gitleaks `ru-phone-unmasked`
  и брендбуку §9 (формат +7 (XXX) ***-XX-XX)
- web/index.html: 03 → готов, счётчик 3/8

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 13:25:35 +07:00
Дмитрий 4df66c3776 docs(archive): close 11 P1/P2 defaults → registry v1.10, add Plan_narrative_v8_4
Закрытие 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>
2026-05-06 12:37:58 +07:00
Дмитрий 04f38b1e57 docs(archive): add Прил. Н + CLAUDE.md, sync archive to v8.3.3
Новые файлы:
- CLAUDE.md (корень) — оперативная карта для Claude Code: приоритет правил
  (5 уровней), стек проекта, карта 28 инструментов «когда что использовать»,
  10 запретов, текущая фаза.
- docs/Tooling_v8_3.md (Прил. Н v1.0) — единый реестр 28 инструментов
  разработки, скиллов Claude Code, MCP-серверов и плагинов в 4 фазах
  (фаза 0 — текущая, +1 Laravel, +2 Vue/Vuetify, +3 pre-prod). §6 конфликты
  и решения, §7 приоритет правил, §9 что НЕ ставим (10+ запретов), §10
  процедура перехода между фазами, §11 Windows + PowerShell.

Обновления версий:
- docs/Pravila_raboty_Claude_v1_1.md → v1.2: §4.8 «Шифры приложений» —
  Н занят (12 шифров: А, Б, В, Г, Д, Е, Ж, З, И, К, М, Н).
- docs/README_АРХИВ_v8_3.md → v8.3.3: добавлена строка истории, обновлены
  таблицы состава (18 файлов в docs/+db/ + CLAUDE.md), добавлена ветка
  чтения «Claude / разработчик».
- docs/Открытые_вопросы_v8_3.md → v1.9 (через шапку, упоминание Прил. Н).

Точечные правки в архиве:
- 6 фиксов MD028 (пустые строки внутри blockquote → заменены на `>`):
  docs/Админка_SaaS_v8_2.md (1), docs/Приложение_Б_В_БД_диаграммы_v8_3.md (3),
  docs/Oferta_i_Politika_v8_2.md (2).
- 1 фикс MD056 (недостающая колонка в таблице) в
  docs/Аудит_partii_12_15_originala_v8_3.md:1085.
- 2 опечатки (русские буквы в латинских словах):
    docs/README_АРХИВ_v8_3.md: `соft-deleted` → `soft-deleted`
    docs/CRM_bp-gr_Инструкция_v8_3.md: `raтe limit` → `rate limit`
- Авто-форматирование trailing whitespace и blanks-around-lists
  через markdownlint --fix (хук .claude/settings.json).

Baseline после коммита:
- markdownlint: 0 errors
- cspell: 0 unknown words
- lychee: 24 OK / 0 errors
- stylelint: 0 errors
- gitleaks: no leaks

Архитектурных изменений: 0. Состав архива: 18 файлов в docs/+db/ + CLAUDE.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-06 04:45:22 +07:00
Дмитрий b5cda8886d Restructure: split files into docs/web/db folders 2026-05-06 01:39:59 +07:00