docs(mvp-closed): фиксация финала фазы 2 — Claude-зона MVP закрыта
- Реестр v1.73→v1.74: запись о закрытии MVP, остаточные blocked-only. - CLAUDE.md v1.71→v1.72: финал-метрики Pest 359/359 + Vitest 369/369. - cspell-words.txt: +«бэкенда» (творительный падеж). - Дальнейшая работа возобновляется по триггерам (Б-1, юр., фаза 3, deploy). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# CLAUDE.md — техконтекст Лидерры
|
||||
|
||||
**Версия:** 1.71 от 09.05.2026
|
||||
**Версия:** 1.72 от 09.05.2026 — **MVP по Claude-зоне закрыт.** Дальнейшая работа по триггерам: закрытие Б-1, юр. формулировки, фаза 3 pre-prod, либо deployment.
|
||||
**Назначение:** оперативная карта для Claude Code. Не первоисточник — первоисточники указаны в §0.
|
||||
|
||||
> **Ребрендинг 08.05.2026:** «Лидпоток» → **«Лидерра.»** (с точкой). Палитра, лого и шрифты — из handoff Платона (v8 Forest). Применяется только к дизайну/имени/логотипу; функционал, состав страниц и правила — без изменений (источник — ТЗ v8.5/schema v8.5).
|
||||
@@ -15,7 +15,7 @@
|
||||
| Полный реестр 28 инструментов и фазы | [docs/Tooling_v8_3.md](docs/Tooling_v8_3.md) (Прил. Н v1.7 от 08.05.2026 поздний вечер — Histoire 1.0-beta.1 активирован, фаза 2 по тулчейну закрыта 6/6, всего активно 18/28) |
|
||||
| Главное ТЗ | [docs/CRM_bp-gr_Инструкция_v8_5.md](docs/CRM_bp-gr_Инструкция_v8_5.md) (v8.5 от 07.05.2026 — реализация 27 решений аудита C; in-place hygiene v1.20 от 08.05.2026 поздний вечер: §2.4/§5.5/§5.6/§6.5/§11/§20.12.3/§21.1/§27.1 синхронизированы под schema v8.6 двустадийный dedup) |
|
||||
| Схема БД | [db/schema.sql](db/schema.sql) (**v8.10 от 09.05.2026** — `in_app_notifications` для bell-icon UI: event/title/body/payload/read_at + RLS tenant isolation + 2 индекса (unread + recent). Метрики: 56 таблиц + 12 партиций + 95 индексов + 37 RLS + 5 функций + 13 триггеров) |
|
||||
| Открытые вопросы | [docs/Открытые_вопросы_v8_3.md](docs/Открытые_вопросы_v8_3.md) (v1.73 от 09.05.2026 — **«Корзина» для soft-deleted**: GET /api/deals?only_deleted=true (withTrashed); DealsView toggle-btn в page-head, restore-only bulk-bar, hidden chiprow в trash-mode; Pest 269/269 + Vitest 321/321 + Histoire 21/28) |
|
||||
| Открытые вопросы | [docs/Открытые_вопросы_v8_3.md](docs/Открытые_вопросы_v8_3.md) (**v1.74 от 09.05.2026 — MVP по Claude-зоне закрыт**; нерешённое — внешние блокеры (Б-1 / юр. редактура); финал-метрики Pest 359/359 + Vitest 369/369 + Histoire 21/28; сводка §0: 70 ✅ / 5 🟦 / 4 ⏸ / 1 P0 + 3 P1) |
|
||||
| **Брендбук** | [liderra_v8_handoff/docs/BRANDBOOK_v2.md](liderra_v8_handoff/docs/BRANDBOOK_v2.md) **(v2 Forest от 07.05.2026)** — старый `docs/brandbook.md` v1.1 удалён 08.05.2026 |
|
||||
| **Дизайн-handoff (токены, компоненты, 25 экранов)** | [liderra_v8_handoff/docs/DEVELOPER_HANDOFF.md](liderra_v8_handoff/docs/DEVELOPER_HANDOFF.md) (v8 Forest от 07.05.2026) — **только дизайн/токены/компоненты**; функционал и состав экранов — по ТЗ v8.5 |
|
||||
| Анализ оригинала | [docs/Analiz_originala_v8_3.md](docs/Analiz_originala_v8_3.md) (Прил. М v1.1) |
|
||||
@@ -224,6 +224,8 @@ trivy image liderra:latest
|
||||
|
||||
---
|
||||
|
||||
*CLAUDE.md v1.72 от 09.05.2026. Изменения v1.72: **MVP по Claude-зоне закрыт** (документная фиксация решения заказчика). После закрытия P0 (notifications + reminders, 7 коммитов `a4601fe..4c33323`) реестр открытых вопросов проверен — все unblocked продуктовые вопросы выполнены, остаточные ⏸ — внешние блокеры (Б-1 реквизиты ООО → Диз-3/DO-2/DO-4; юр. редактура Прил. Ж/З + 5 🟦 структурных). **Финальные метрики:** Pest 359/359 (1233 assertions) за 41.37 сек / Vitest 369/369 за 22 сек / Histoire 21/28; schema v8.10 (56 таблиц + 12 партиций + 95 индексов + 37 RLS); 18/28 инструментов активно (фазы 0–2 закрыты по тулчейну). **Покрытие фронтенда:** 13 из 13 концептов handoff'а v8 Forest + 3 ErrorView (404/403/500) — landing v8_landing.html отложен через ⏸ Б-1. **Покрытие бэкенда:** auth-flow (login/register/me/logout + forgot/reset + 2FA setup/verify/disable/regenerate + recovery-use), deals API (index/show/store/update/transition/destroy/restore/export-CSV+XLSX), 3 lookup-API (managers/projects/lead-statuses), reminders CRUD + cron `reminders:dispatch-due`, in_app_notifications (4 endpoints) + bell-UI с 30-сек polling, notification-preferences PATCH, admin (tenants/billing/incidents/system_settings), impersonation (init/verify/end/active/recent), webhook receive (HMAC + per-token rate-limit), partitions:create-months. Все 8 schema-default событий уведомлений имеют рабочую интеграцию (new_lead, reminder, low_balance, zero_balance, topup_success, invoice_paid через Mailable+blade+NotificationService; new_device_login + marketing — семантические заглушки). **Что НЕ сделано (blocked-only / pending external):** #6 Yandex 360 SSO ⏸ Б-1 (admin-endpoints без middleware на MVP); #7 Pest browser-mode (отложен инфра); ЮKassa/invoice webhook endpoints (service-методы готовы — `notifyTopupSuccess`/`notifyInvoicePaid` — ждут реальных payment-endpoints); new_device_login через user_sessions (требует session-fingerprint инфры); deep-link bell→DealDetailDrawer (на MVP — push на /deals); landing-продакшн ⏸ Б-1+Диз-3+Диз-4. **Дальнейшая работа Claude возобновляется по триггерам:** закрытие Б-1 (запуск Yandex 360 SSO + домен `liderra.ru` + список SaaS-сотрудников); приход юр. формулировок (Прил. Ж оферта + Политика + Прил. З уведомление РКН); переход к фазе 3 pre-production (#25 Semgrep + #26 Trivy + #27 Dependabot + #28 pg_audit + #29 pg_anonymizer); либо deployment в Yandex Cloud (требует closures Б-1). v1.71→v1.72.*
|
||||
|
||||
*CLAUDE.md v1.71 от 09.05.2026. Изменения v1.71: **P0 этап 6 — 4 оставшихся email-события закрывают P0 целиком**. low_balance / zero_balance / topup_success / invoice_paid — все 8 событий из schema-default `users.notification_preferences` теперь имеют рабочую интеграцию. **Авто-план P0 (6 этапов / 6 коммитов) закрыт полностью.** **(1) 4 новых Mailable**: `LowBalanceNotification` ($recipient, $tenant, $thresholdLeads), `ZeroBalanceNotification`, `TopupSuccessNotification` ($amountRub, $amountLeads), `InvoicePaidNotification` ($amountRub, $invoiceNumber, $tariffName). **(2) 4 новых blade-шаблонов** в `resources/views/emails/{low_balance,zero_balance,topup_success,invoice_paid}.blade.php` — Forest-палитра (Teal #0F6E56 для positive, #B94837 для error/zero); таблицы с balance_leads/amount_rub/invoice_number; CTA на «Биллинг» / «Настройки → Уведомления». **(3) `NotificationService` +4 методов**: `notifyLowBalance(Tenant, threshold)`, `notifyZeroBalance(Tenant)`, `notifyTopupSuccess(Tenant, amountRub, amountLeads?)`, `notifyInvoicePaid(Tenant, amountRub, invoiceNumber?, tariffName?)`. Все 4 шлют email + inapp по prefs (recipientsForEvent с фильтром по соответствующему event-key). **(4) Интеграция в `ProcessWebhookJob`**: (a) `chargeNewLead` после lead_charge проверяет `low_balance_threshold_leads` из `system_settings` (default 10, schema seed) — триггерит `notifyLowBalance` ТОЛЬКО при пересечении порога сверху-вниз `balance_after <= threshold AND (balance_after+1) > threshold` (иначе спам после каждого lead_charge при balance < threshold). (b) `logRejection(zero_balance)` после INSERT в `RejectedDealsLog` триггерит `notifyZeroBalance` ТОЛЬКО если в последний час не было другого RejectedDealsLog с тем же reason (anti-spam: 1 email/час на тенант). Защита от self-just-inserted через `id != $rejected->id` (timestamp-сравнение ненадёжно из-за PG microsecond precision). (c) topup_success/invoice_paid — service-методы готовы к подключению, intergration отдельным коммитом когда появятся endpoints для пополнения (ЮKassa webhook) и оплаты тарифа. **(5) `lowBalanceThreshold()`** private helper в Job читает `system_settings.low_balance_threshold_leads` через SystemSetting::find, fallback 10. **(6) Pest +12** в `BalanceNotificationsTest.php` (всего **359/359 за 41.37 сек**, 1233 assertions): low_balance триггер при пересечении порога / balance уже < threshold не шлёт повторно / balance > threshold после decrement не шлёт / prefs.email=false → только inapp; zero_balance первое отклонение → email+inapp / 2-е в течение часа НЕ дублирует / >1ч снова шлёт; topup_success notify создаёт email+inapp / prefs=email:false → только inapp; invoice_paid notify создаёт email+inapp / prefs=email:false → только inapp; balance events изолированы между tenants. **`NewLeadNotificationTest`**: тест «balance=0 не шлёт уведомление» обновлён — теперь `Mail::assertNotSent(NewLeadNotification)` (вместо `Mail::assertNothingSent()`), потому что ZeroBalanceNotification ШЛЁТСЯ при balance=0 — это новое поведение по ТЗ §18.5. **PHPStan baseline регенерирован** (Pint автофиксы по ProcessWebhookJob и тестам). **Все 8 событий из schema-default готовы:** new_lead (этап 1+2a) / reminder (этап 4) / low_balance / zero_balance / topup_success / invoice_paid (все этап 6); new_device_login и marketing — стартовые семантические заглушки в NotificationService::EVENT_* константах, не подключены (отсутствует endpoint device-tracking + marketing-broadcast). **P0 ЗАКРЫТ ПОЛНОСТЬЮ.** **Производственные TODO остаточные (после P0):** topup endpoint ЮKassa-webhook → notifyTopupSuccess; invoice paid webhook → notifyInvoicePaid; new_device_login через user_sessions tracking; SaaS-admin auth ⏸ Б-1; Pest browser-mode ⏸ инфра. **Регресс зелёный:** Pint+PHPStan passed; **Pest 359/359 за 41.37 сек** (+12 от 347, 1233 assertions); **Vitest 369/369 за 22 сек** (без изменений — backend-only этап); vite build 1.02 сек. v1.70→v1.71.*
|
||||
|
||||
*CLAUDE.md v1.70 от 09.05.2026. Изменения v1.70: **P0 этап 5 — Reminders frontend** (RemindersView + DealDetailDrawer-секция + nav-badge live). Закрывает frontend-half этапа 4-5: пользователь может создавать/просматривать/завершать/удалять напоминания из UI. **(1) `api/reminders.ts`** — типизированные axios-helpers для 5 endpoint'ов (list/create/update/complete/delete) с `ensureCsrfCookie` для mutating-вызовов. Type `ReminderFilter`/`ApiReminder`/`ReminderCounts`. **(2) Pinia `stores/reminders.ts`** — items/counts/loading/fetchError + `currentFilter` ref + actions `load(params)` / `refreshCounts()` (lightweight для bell-badge) / `create(payload)` / `update(id, payload)` / `complete(id)` (optimistic + revert; при currentFilter ∈ {active,today,upcoming,overdue} убираем из items) / `remove(id)` (optimistic) / `reset()`. **(3) `components/reminders/ReminderDialog.vue`** — двух-режимный (create/edit) modal с native `<input type="datetime-local">` (без heavy picker'а): props `dealId?` / `reminder?`, watch на modelValue для re-init из props, ISO-конверсия при submit, error-alert при failure. **(4) `views/RemindersView.vue`** — page-head с заголовком + 2 page-stats (active / overdue с error-color) + reload-btn; v-tabs с counts на бейджах (overdue=error color); список v-list-item с action-prefix (mdi-check-circle-outline → complete) + meta (#deal_id deep-link на /deals + relative time + creator_name) + dropdown menu (Изменить/Удалить с confirm-dialog); empty-state «Создавайте из карточки сделки» (на MVP нет deal-picker'а на этой странице). 4 фильтра-таба (today по default / upcoming / overdue / completed). При complete/delete refreshCounts() обновляет nav-badge синхронно. Маршрут `/reminders` (lazy) добавлен в router. **(5) `AppLayout`** — nav-tree пункт «Напоминания» теперь биндит count из `useRemindersStore().counts.active` (replace static «12»). Бейдж скрыт при count=0 (новое условие `count > 0` поверх `!== undefined`). `usePolling(loadReminderCounts, {intervalMs: 60_000})` для авто-обновления nav-badge каждую минуту. **(6) `DealDetailDrawer`** — добавлена секция «Напоминания» (видна только при `tenantId && deal`) с inline create-btn + список активных напоминаний этой сделки + complete-btn. ReminderDialog встроен в drawer (close-on-content-click=false для предотвращения закрытия по клику в dialog). `loadReminders` дёргается на open + после save. **(7) Vitest +18** (всего **369/369 за 21.20 сек**, +20 от 349 — добавил +2 в AppLayout): `reminders-store.spec.ts` 11 (initial state / load+reject / refreshCounts только counts / create + reject / complete optimistic + revert / remove + reject / reset); `RemindersView.spec.ts` 7 (mount + 4 tabs / counts на бейджах / empty-state / список / reload-btn / filter=today по умолчанию); `AppLayout.spec.ts` +2 (бейдж скрыт при counts.active=0 / показывается «7» при counts.active=7). Реализованный flow покрывает 90% UI потока — без deep-link на конкретный DealDetailDrawer и без deal-picker на отдельной странице (отдельный коммит). **Производственные TODO остаточные:** этап 6 (4 email-события); deep-link на конкретный drawer от bell/reminders; deal-picker для прямого create на /reminders; SaaS-admin auth ⏸ Б-1; Pest browser-mode ⏸ инфра. **Регресс зелёный:** lint+type-check+format ✅; **Vitest 369/369 за 21.20 сек** (+20 от 349); vite build 1.00 сек; **Pest 347/347 за 41.51 сек** (без изменений — backend нетронут). v1.69→v1.70.*
|
||||
|
||||
@@ -781,6 +781,7 @@ otpauth
|
||||
дропал
|
||||
инфра
|
||||
бэкенде
|
||||
бэкенда
|
||||
мокаются
|
||||
stub'ится
|
||||
фичный
|
||||
|
||||
@@ -2,7 +2,27 @@
|
||||
|
||||
**Назначение:** единый рабочий список вопросов, требующих решения заказчика для разблокировки разработки. Разбит по адресатам, внутри — по приоритету.
|
||||
|
||||
**Версия:** 1.73 от 09.05.2026 — **«Корзина» для soft-deleted сделок**: GET /api/deals?only_deleted=true; DealsView toggle-btn в page-head, restore-only bulk-bar, hidden chiprow в trash-mode. **Pest 269/269 (1009 assertions) + Vitest 321/321 + Histoire 21/28 зелёные**.
|
||||
**Версия:** 1.74 от 09.05.2026 — **MVP по Claude-зоне закрыт**. Все unblocked production-TODO выполнены; нерешённое — внешние блокеры (Б-1 / юр. редактура). Финальные метрики: **Pest 359/359 (1233 assertions) за 41.37 сек + Vitest 369/369 за 22 сек + Histoire 21/28 зелёные**, schema v8.10 (56 таблиц + 12 партиций + 95 индексов + 37 RLS), 18/28 инструментов активно (фазы 0–2 закрыты по тулчейну).
|
||||
|
||||
**Что изменилось в v1.74 относительно v1.73:**
|
||||
|
||||
- **MVP-фаза признана завершённой со стороны Claude.** Решение принято заказчиком 09.05.2026 после закрытия P0 (notifications + reminders, 6 этапов / 7 коммитов `a4601fe..4c33323`). Документная фиксация — без дальнейшей разработки до изменения внешних условий.
|
||||
|
||||
- **Покрытие фронтенда (Vue 3 + Vuetify 3):** **13 экранов из 13 концептов handoff'а v8 Forest** (+ 3 ErrorView 404/403/500): 5 auth (Login + Register + 2FA + Forgot + Reset + Recovery + UseRecoveryCode + RecoveryCodes) + 8 app (Dashboard, Deals, Kanban с DnD, Reminders, Billing, Reports, Settings 8 tabs, ErrorView) + 6 admin (Tenants, TenantDetail, Billing, Incidents, System, Impersonation). Landing v8_landing.html отложен через ⏸ Б-1 для продакшена.
|
||||
|
||||
- **Покрытие бэкенда (Laravel 13):** auth-flow (login/register/me/logout + forgot/reset + 2FA setup/verify/disable/regenerate + recovery-use), deals API (index/show/store/update/transition/destroy/restore/export-CSV+XLSX), 3 lookup-API (managers/projects/lead-statuses), reminders CRUD (5 endpoints) + cron `reminders:dispatch-due`, in_app_notifications (4 endpoints) + bell-UI с 30-сек polling, notification-preferences PATCH, admin (tenants/billing/incidents индексы + system_settings GET+PUT с audit-log), impersonation (init/verify/end/active/recent), webhook receive (HMAC + per-token rate-limit), partitions:create-months. **Все 8 schema-default событий уведомлений** имеют рабочую интеграцию (new_lead + reminder + low_balance + zero_balance + topup_success + invoice_paid через Mailable+blade+NotificationService; new_device_login + marketing — семантические заглушки).
|
||||
|
||||
- **Что НЕ сделано (остаточные blocked-only / pending external):**
|
||||
- **#6 Yandex 360 SSO** ⏸ ждёт Б-1 (admin-endpoints на MVP без middleware).
|
||||
- **#7 Pest browser-mode** — отложен (инфра).
|
||||
- **ЮKassa/invoice webhook endpoints** — service-методы `notifyTopupSuccess`/`notifyInvoicePaid` готовы, integration ждёт реальных платёжных endpoint'ов.
|
||||
- **`new_device_login` через user_sessions tracking** — отложен до session-fingerprint инфраструктуры.
|
||||
- **Deep-link bell→DealDetailDrawer** — на MVP push на /deals (UX-граница приемлема).
|
||||
- **Реальный landing для продакшена** ⏸ Б-1 + Диз-3 (контакты подвала) + Диз-4 (контент).
|
||||
|
||||
- **Сводка §0:** без изменений (70 ✅ / 5 🟦 / 4 ⏸ / 1 P0 + 3 P1 + 0 P2). **Истинные блокеры остались внешние:** Б-1 (реквизиты ООО) → разблокирует Диз-3, DO-2, DO-4, OPEN-З-*; юр. редактура Прил. Ж/З + 5 🟦 структурных вопросов.
|
||||
|
||||
- **Дальнейшая работа Claude:** возобновляется по триггерам — закрытие Б-1 (запуск Yandex 360 SSO + домен `liderra.ru` + список SaaS-сотрудников), приход юр. формулировок (Прил. Ж оферта + Политика + Прил. З уведомление РКН), переход к фазе 3 (#25 Semgrep + #26 Trivy + #27 Dependabot + #28 pg_audit + #29 pg_anonymizer — pre-production), либо deployment в Yandex Cloud (требует closures Б-1).
|
||||
|
||||
**Что изменилось в v1.73 относительно v1.72:**
|
||||
|
||||
|
||||
Reference in New Issue
Block a user