# Снятие лимита по числу проектов (max_projects) — готово к выкату

**Дата:** 27.06.2026. **Причина:** правило продукта — ограничений по **количеству проектов нет**,
ограничение только по **балансу / заказанным лидам**. В коде же был лишний гейт `max_projects`
(дефолт 10), который блокировал создание проектов у клиентов с >10 проектами (у tenant 2 — 117 шт,
видел сообщение «Достигнут лимит проектов (10). Смените тариф.»).

## Что сделано (по TDD, RED→GREEN)

**Бэкенд:**
- [ProjectService.php:620](app/app/Services/Project/ProjectService.php#L620) — **убран гейт** `max_projects` (бросал 403). Балансовый префлайт в `ProjectController::store` (409 `balance_insufficient`) — настоящий лимит — **не тронут**.
- [DashboardController.php:82,144](app/app/Http/Controllers/Api/DashboardController.php#L82) — убран расчёт `maxProjects` и поле `active_projects.limit` из ответа.

**Фронт:**
- [dashboard.ts:15](app/resources/js/api/dashboard.ts#L15) — тип `active_projects` без `limit`.
- [DashboardView.vue:110](app/resources/js/views/DashboardView.vue#L110) — плитка «Активные проекты» показывает просто количество, без «/ N лимит тарифа».

**Комментарии (чистка вводящего в заблуждение):**
- [Tenant.php:61](app/app/Models/Tenant.php#L61), [миграция add_limits_to_tenants](app/database/migrations/2026_05_11_150000_add_limits_to_tenants.php#L12) — отметка, что `max_projects` убран; `max_users` / `api_rps` в коде не используются (зарезервированы).

**Колонка `tenants.limits` ОСТАВЛЕНА** (она cast'ится в `Tenant` и `TariffPlan`; дроп — отдельная schema-миграция с риском, по правилу «не рвать швы» не делаю). Просто перестали читать `max_projects`.

**Тесты:**
- [ProjectsStoreTest.php:125](app/tests/Feature/Plan5/Projects/ProjectsStoreTest.php#L125) — бывший «rejects when exceeds max_projects» переписан в «лимита по числу проектов нет»: даже при `max_projects=1` второй проект создаётся (201).
- [DashboardSummaryTest.php](app/tests/Feature/DashboardSummaryTest.php) — убрана проверка `active_projects.limit`, добавлена `assertJsonMissingPath`.
- [DashboardView.spec.ts](app/tests/Frontend/DashboardView.spec.ts) — моки без `limit`.

## Проверки (всё зелёное)
- `ProjectsStoreTest` — **13/13** passed.
- `DashboardSummaryTest` — **11/11** passed.
- `DashboardView.spec.ts` (Vitest) — **8/8** passed.
- `vue-tsc` type-check — мои правки чисты.
- `pint` — passed (стиль ок).

## Деплой (по команде владельца, я сам НЕ катаю)
- **Миграций НЕТ**, БД не меняется. Нужна **пересборка фронта** (Vite) — менялись `.vue`/`.ts`.
- Метод — штатный `bin/deploy-source-edit.sh` (rsync overlay gitea→прод + npm build), как обычно.
- **Откат:** вернуть прежние версии 9 файлов (или `git revert` коммита) + пересобрать фронт. БД-отката не требуется.

## Пред-существующее (НЕ от этой правки — для сведения)
- `tests/Frontend/EditProjectDialog.spec.ts:111` — type-error `source_locked` (дрейф типа `Project` из Эпика 3). Я этот файл не трогал; чинить — отдельно.
