Дмитрий
29a4d01ff4
fix(import): Task 5 code-review — final-класс CsvLeadsParser + self::EXPECTED_COLUMNS
...
Code-review Task 5 (non-blocking 🟡 ): CsvLeadsParser объявлен final (симметрия
с DTO ParsedLeadRow/CsvParseResult, утилитарный класс без наследования);
строка ошибки про число колонок использует self::EXPECTED_COLUMNS вместо
литерала 9.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 17:51:27 +03:00
Дмитрий
8f2b82405a
feat(import): CsvLeadsParser + DTO ParsedLeadRow/CsvParseResult
...
Парсер CSV-выгрузки лидов crm.bp-gr.ru (ТЗ §6.2/§6.3): срезает UTF-8 BOM,
разбирает строки через str_getcsv, валидирует телефон (7XXXXXXXXXX) и даты
(Y/m/d H:i:s), срезает префикс B[123]_ из названия проекта. Невалидные
строки не роняют парсинг — собираются в errors[] с абсолютным номером строки.
Тесты: 5/5 (unit, без DB).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 17:47:15 +03:00
Дмитрий
424987bedb
feat(import): сервис StatusRuToSlugMapper (ТЗ §6.4)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 17:42:49 +03:00
Дмитрий
ef4df2925f
feat(import): сервис MonthlyPartitionManager + рефактор partitions:create-months
...
Выносит DDL-логику создания месячных RANGE-партиций из команды
PartitionsCreateMonths в переиспользуемый сервис MonthlyPartitionManager.
Сервис используется командой (DRY) и будет использован HistoricalImportService
для партиций под исторические даты CSV.
- MonthlyPartitionManager::ensureRange(table, from, to) — гарантирует партиции
под диапазон дат, идемпотентно; отвергает незарегистрированные таблицы
- MonthlyPartitionManager::ensureMonth(table, monthStart) — одна партиция
- PartitionsCreateMonths рефакторена: убраны PARTITIONED_TABLES, partitionExists(),
use DB; inject MonthlyPartitionManager через handle()
- Test: MonthlyPartitionManagerTest (3 теста, DatabaseTransactions — DDL откат)
- Regression: PartitionsCreateMonthsTest (4 теста) — зелёный, поведение не изменилось
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 17:37:29 +03:00
Дмитрий
8bc8c53a3b
feat(import): Eloquent-модели ImportLog + ImportUnknownStatus
...
- ImportLog: $attributes зеркалят DB DEFAULT'ов (status/entity_type/dry_run),
CREATED_AT/UPDATED_AT=null (таблица использует started_at/finished_at),
casts для mapping_config (array) и dry_run (boolean)
- ImportUnknownStatus: scope unresolved() (whereNull mapped_to_slug),
BelongsTo tenant
- Фабрики ImportLogFactory + ImportUnknownStatusFactory
- Тест ImportModelsTest (2/2, DatabaseTransactions, idempotent)
- ide-helper:models перегенерирован под новые модели
- phpstan-baseline регенерирован (квирк 25: TestCall::$tenant/$user)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 17:29:33 +03:00
Дмитрий
98549c52be
fix(import): Task 1 code-review — убран фантомный GRANT-блок + усилен UNIQUE-тест
...
Code-review Task 1: явный per-table GRANT-блок для import_unknown_statuses
использовал несуществующие роли (crm_app_admin / crm_readonly). Реальные роли —
crm_app_user / crm_admin_user / crm_migrator / crm_audit_writer /
crm_supplier_worker (db/00_create_roles.sql). Блок удалён целиком из
db/02_grants.sql и db/schema.sql: import_unknown_statuses — обычная
tenant-scoped таблица, покрыта umbrella GRANT ... ON ALL TABLES +
ALTER DEFAULT PRIVILEGES (как import_log), явный per-table grant не нужен.
ImportSchemaTest: UNIQUE-тест усилен — проверяет состав колонок
(status_ru, tenant_id), а не только наличие constraint'а типа 'u'.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 17:20:12 +03:00
Дмитрий
70f8b210f4
feat(import): H1+H2 — схема import_unknown_statuses + enrichment import_log
...
Sprint 4 Task 1 (schema delta §6):
- H1: новая таблица import_unknown_statuses (RLS tenant_isolation,
UNIQUE(tenant_id,status_ru), FK→tenants/import_log/lead_statuses/users)
- H2: +5 колонок import_log (entity_type, source_system, mapping_config,
unknown_statuses_count, dry_run)
- schema.sql v8.20→v8.21 (64 таблицы / 118 индексов / 40 RLS-политик)
- db/CHANGELOG_schema.md v8.21 entry
- db/02_grants.sql v8.21 section (crm_app_user/crm_app_admin/crm_readonly)
- migrate: hasTable/hasColumn guards (fresh-safe)
- tests: 3 Pest-теста (ImportSchemaTest) + SchemaDeltaTest v8.21 metrics
- ide-helper: _ide_helper.php + _ide_helper_models.php (были отсутствуют
в worktree, phpstan падал молча из-за missing scanFiles entry)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 17:01:51 +03:00
Дмитрий
4937225da3
docs(plan): Sprint 4 — историческая миграция лидов §6 (H1-H6/H8/H9)
...
План CSV-импорта исторических лидов из crm.bp-gr.ru. 12 задач: schema delta
(import_unknown_statuses + enrichment import_log), сервисы парсинга/маппинга/
upsert'а, ImportLeadsJob, ImportController, frontend ImportView + wizard
маппинга статусов, маршрут /import + инструкция H9. H7 (импорт проектов)
вынесен — формат CSV проектов не специфицирован в ТЗ §6.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 16:28:30 +03:00
Дмитрий
da4d46b0d8
feat(map): automation-graph — полная актуализация по аудиту
...
Аудит карты против фактического состояния (~/.claude/settings.json,
project .claude/settings.json, .mcp.json, lefthook.yml, .claude/skills,
memory/). +20 узлов (83 → 103):
- плагины 5→9: +skill-creator, claude-code-setup, plugin-dev, context7
- хуки 5→12: +economy-self-check/skill-marker/skill-check/state-guard/
postcompact/verifier (Stop) + ruflo-queen-hook
- memory 16→24: +audit_B/C, supplier_crm, full_audit_05-12/14, sprint1/2/3
- скилы проекта 2→3: +regression
Квирк 72 устранён (commit 0fa1a73 ) — 2 конфликта переоценены:
ag_pest↔mcp_redis BLACK→GREEN; ruflo_daemon↔ag_pest → квирки 73/77.
Все 103 узла размечены по разделам; E8 «Самообучение Claude» наполнен
(skill-creator, claude-code-setup). Топология 103 / 106 рёбер /
11 конфликтов (🔴 1/⚫ 3/🟢 7). Smoke ✓.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 16:08:07 +03:00
Дмитрий
f9f9fec97d
feat(map): automation-graph — раздел E8 «Самообучение Claude»
...
+1 раздел в блок E «Мета и управление». Итого 40 разделов
(13 наполнены / 27 пусты). E8 — пустой каркас под будущий playbook.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 16:08:07 +03:00
Дмитрий
e74e8aa6d6
feat(map): automation-graph — слой функциональных разделов (iter7)
...
39 разделов деятельности Лидерры (5 блоков A–E) как классификация:
все 83 узла распределены по разделам — 13 наполнены, 26 пусты
(пустые — бизнес-домены, под которые в карте dev-автоматики узлов
ещё нет). Кнопка-панель «📂 Разделы» + строка «Раздел» в Паспорте
узла. Топология карты (83/90/11) и радиальный layout без изменений.
Основа будущего «мозга»: 1 раздел = 1 playbook.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 16:08:07 +03:00
Дмитрий
447ef593fa
feat(api): J1 — auth:sanctum+tenant middleware на /api/deals*
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 15:18:13 +03:00
Дмитрий
9f70d89046
feat(api): J2 — стаб-гейт EnsureSaasAdmin на /api/admin/*
2026-05-16 15:01:07 +03:00
Дмитрий
42a246d633
docs(plan): Sprint 3F — API middleware (J1/J2)
2026-05-16 14:56:11 +03:00
Дмитрий
ca0c4d9318
feat(admin): G5/G6 frontend — incident detail view + РКН-notify
2026-05-16 14:09:53 +03:00
Дмитрий
3269434746
feat(admin): G6 backend — incident РКН-notify endpoint
2026-05-16 14:09:53 +03:00
Дмитрий
5e12126d71
feat(admin): G5 backend — incident detail endpoint
2026-05-16 14:09:53 +03:00
Дмитрий
8e3e06f3a4
fix(admin): G4 review — real AxiosError in error test + balance/NaN guards + a11y
2026-05-16 14:09:53 +03:00
Дмитрий
c85424968e
feat(admin): G4 frontend — billing row-actions menu + dialogs
2026-05-16 14:09:53 +03:00
Дмитрий
00f6611bc1
fix(admin): G4 review — lockForUpdate on refund balance + self-contained tariff tests
2026-05-16 14:09:53 +03:00
Дмитрий
adabcf15a4
feat(admin): G4 backend — billing tenant actions (status/refund/tariff)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 14:09:53 +03:00
Дмитрий
3ea86d62ff
docs(plan): Sprint 3D — Admin actions (G4/G5/G6) implementation plan
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 14:09:53 +03:00
Дмитрий
9a25e658b3
docs(map): automation-graph — нормативный sync под реколлаж ruflo 16.05
...
Карта приведена к реколлажу ruflo (Pravila v1.16 / CLAUDE.md v2.2 /
PSR_v1 v3.2 / Tooling v2.2): убраны «уровень −1», «§12 sub-policy»,
«R0 sub-policy delegation pattern».
- 4 узла-правила: лейблы v1.16/v2.2/v3.2/v2.2 + NODE_META.changed 16.05
- nd()-блоки правил: §12 — hard-rule уровня 0, R0 — головной фильтр,
цепочка 7-уровневая (0–6), §3.5/§4.10 — advisory-подсистема
- ruflo_queen: advisory/automation-подсистема, не entry-point;
reportsTo → Pravila §14 + CLAUDE.md §3.5/Tooling §4.10
- 4 ребра ruflo_queen→{правило} «перенял sub-policy» → flipped
{правило}→ruflo_queen (§14 queen-триггер / §3.5 / §4.10 описывают)
- конфликт ruflo_queen↔pravila 🔴 →🟢 (реколлаж = правило-фикс):
классификация 🔴 2/⚫ 4/🟢 5 → 🔴 1/⚫ 4/🟢 6
- §12 sub-policy → hard-rule level 0 в superpowers/hk_economy/mem_sp
+ CONFLICT hk_economy↔superpowers + EDGE_DETAILS
Топология 83/90/11 без изменений (downstream-sync, не iter).
Visual smoke 8/8 PASS (Playwright): 83 узла / 90 рёбер рендерятся,
0 JS-ошибок, легенды отредактированных узлов рендерятся корректно.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 13:44:14 +03:00
Дмитрий
73d2733522
docs(fix): claude-brain spec — битая ссылка на CLAUDE.md (../../../../../→../../../)
...
Pre-existing баг: 5×../ перелетал repo-root на 2 уровня. Поймана pre-push lychee реколлажа. Корректный путь от docs/superpowers/specs/ до repo-root CLAUDE.md — 3×../
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:42 +03:00
Дмитрий
8b9d9fb029
docs(rules): PSR_v1 R13.1 — счётчик R0.6 «8» → «10 пунктов» (после удаления п.11)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:42 +03:00
Дмитрий
9db66e6f27
docs(rules): Task 6 cross-consistency — вычистить остаточные R0→sub-policy cross-refs
...
Pravila §11.5 + §13.2 содержали живой cross-ref «PSR_v1 v3.0+, R0 → sub-policy под ruflo Queen-led routing» — после реколлажа R0 уже top-of-stack gate, формулировка стала ложной. Task 1 вычистил §13.9/§13.10, но пропустил §11.5/§13.2. + §10 v1.16-row дополнен; PSR_v1 шапка-нарратив +v3.2.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:42 +03:00
Дмитрий
9b6fa50c4c
docs(plan): ruflo hierarchy factual recollage — implementation plan
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:42 +03:00
Дмитрий
d6f0ff868f
docs(rules): CLAUDE.md v2.2 — §5 п.10 убран ruflo-routing loophole (Task 4 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:42 +03:00
Дмитрий
9929b4a599
docs(rules): CLAUDE.md v2.2 — реколлаж ruflo, убран уровень −1
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:42 +03:00
Дмитрий
d84127eaa5
docs(rules): Tooling v2.2 — шапка changelog синхронизирована с §13-записью (Task 3 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:42 +03:00
Дмитрий
2def31eea9
docs(rules): Tooling v2.2 — реколлаж §4.10 ruflo entry-point → advisory-подсистема
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:41 +03:00
Дмитрий
e6556e5a97
docs(rules): PSR_v1 v3.2 — §14 cross-ref + R0.6 п.11 + опечатка (Task 2 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:41 +03:00
Дмитрий
4d807fb9f2
docs(rules): PSR_v1 v3.2 — реколлаж ruflo, R0 sub-policy → top-of-stack gate
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:41 +03:00
Дмитрий
68f341191b
docs(rules): Pravila v1.16 — §10 history row + §14.6 cleanup (Task 1 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:41 +03:00
Дмитрий
91c64cde70
chore(lefthook): cspell --no-gitignore — staged-файлы под gitignored .claude/worktrees/ не проверялись
...
cspell.json useGitignore:true заставлял cspell игнорировать все файлы worktree, расположенного под gitignored .claude/worktrees/ (Files checked: 0 — фейковый green). Staged-файлы по определению tracked, потому --no-gitignore для pre-commit cspell безопасен и чинит worktree-коммиты.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:59:41 +03:00
Дмитрий
b027a3cfee
feat(reports): кнопка «Скачать» → signed download URL (F2 frontend)
2026-05-16 12:45:51 +03:00
Дмитрий
ab23baa1d5
fix(reports): download/downloadUrl отклоняют expired-job по expires_at (F2 review fixup)
2026-05-16 12:42:00 +03:00
Дмитрий
086fc1a903
feat(reports): download endpoint + signed URL 24ч (F2 backend)
2026-05-16 12:36:08 +03:00
Дмитрий
bd9b8e84fa
feat(reports): BillingSummaryProvider + isSupported всех 4 типов (F1 закрыт)
2026-05-16 12:28:57 +03:00
Дмитрий
550e8949d6
feat(reports): SourcesSummaryProvider — агрегат сделок по utm_source (F1)
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-05-16 12:21:51 +03:00
Дмитрий
4bd419654f
feat(reports): ManagersSummaryProvider — агрегат сделок по менеджерам (F1)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:14:49 +03:00
Дмитрий
b163d8a5ca
docs(sprint3c): план Reports F1+F2 — 3 провайдера + download endpoint
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 12:05:58 +03:00
Дмитрий
6e35193f3b
fix(deals): router в DealsViewRedesign.spec + idempotency guard + watch-test (C8/F3 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
2504f1b9ec
feat(deals): deep-link /deals?openId= из напоминаний и колокольчика (audit C8/F3)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
ed61bae482
fix(dashboard): скрыть Live-бейдж при ошибке + formatRub guard + test hardening (C1 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
bf7f70a5d4
fix(dashboard): восстановить tenant-guard в load() + auth.user в тесте (C1 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
cadaecdaf8
feat(dashboard): DashboardView на real API /api/dashboard/summary (audit C1)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
283db070e1
fix(dashboard): activity-бакеты в MSK + deltaBlock для leads + test hardening (J3 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
7705f022c1
fix(dashboard): runway_days опирается на фикс. 7д-окно, не на range (J3 review fixup)
...
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-16 11:41:09 +03:00
Дмитрий
18f132d035
docs(rules): Pravila v1.16 — реколлаж ruflo, §12 sub-policy → hard-rule
2026-05-16 11:41:09 +03:00