# План v2: route-level rate-limit — завершение GREEN-фазы

## Цель

Продолжение TDD после подтверждённого RED (новый тест `AuthRouteThrottleTest`
падает без throttle). Импорты в `AppServiceProvider` уже добавлены отдельным
шагом. Здесь: заполнить `boot()` тремя именованными лимитерами
(`auth-login`/`auth-2fa`/`auth-password`, `perMinute(20)->by(ip)`), применить
`throttle:`-middleware к auth-маршрутам в `routes/web.php`, прогнать весь каталог
`tests/Feature/Auth` до зелёного, зафиксировать runbook значений лимитов.
Прогон — из каталога `app`.

```skills-json
["test-driven-development"]
```

```steps-json
[
  {"op": "Bash", "object": "cd \"c:/моя/проекты/портал crm/Документация/app\"", "ref": "D5"},
  {"op": "Edit", "object": "c:/моя/проекты/портал crm/Документация/app/app/Providers/AppServiceProvider.php", "ref": "D2"},
  {"op": "Edit", "object": "c:/моя/проекты/портал crm/Документация/app/routes/web.php", "ref": "D2"},
  {"op": "Bash", "object": "php artisan test tests/Feature/Auth", "ref": "D5"},
  {"op": "Write", "object": "c:/моя/проекты/портал crm/Документация/docs/superpowers/runbooks/2026-06-17-auth-throttle-limits.md", "ref": "D2"}
]
```

```verified-context-json
[
  {
    "id": "ctx-route-forgot",
    "kind": "EXTRACTED",
    "ref": "app/routes/web.php",
    "anchor": "Route::post('/forgot', 'App\\Http\\Controllers\\Api\\PasswordResetController@forgotPassword');"
  }
]
```

## Переговоры

### Круг 1

Довод по реализации: лимитеры именованные ради изоляции счётчиков login/2fa/password.
Значение 20/мин выше максимума тестовых циклов (login 11, forgot 7, 2fa 6) — поэтому
существующие auth-тесты не ломаются; финальный шаг прогоняет весь каталог
`tests/Feature/Auth` для подтверждения отсутствия регрессии. RED уже подтверждён
(тест падал без throttle), здесь только GREEN-фаза. Прошу наставника зафиксировать
forward-рекомендацию по достаточности покрытия и стартовому значению лимита.
