# План v2: Content-Security-Policy (Report-Only) для SPA Лидерры

## Цель

Реализовать через TDD заголовок `Content-Security-Policy-Report-Only` на всех
web-ответах в middleware `SecurityHeaders`, с политикой под Vue 3 + Vuetify 3
(инлайн-стили Vuetify, шрифты Google), не ставя блокирующий заголовок. Сначала
запуск падающего Pest-теста из каталога приложения, затем реализация до зелёного.
Тестовый прогон выполняется из каталога `app`, где лежит автозагрузка и Pest.

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

```steps-json
[
  {"op": "Bash", "object": "cd app", "ref": "D5"},
  {"op": "Bash", "object": "php artisan test --filter=SecurityHeaders", "ref": "D5"},
  {"op": "Edit", "object": "c:/моя/проекты/портал crm/Документация/app/app/Http/Middleware/SecurityHeaders.php", "ref": "D1"},
  {"op": "Bash", "object": "php artisan test --filter=SecurityHeaders", "ref": "D5"}
]
```

```verified-context-json
[
  {
    "id": "ctx-sec-headers",
    "kind": "EXTRACTED",
    "ref": "app/app/Http/Middleware/SecurityHeaders.php",
    "anchor": "$response->headers->set('X-Frame-Options', 'SAMEORIGIN');"
  }
]
```

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

### Круг 1

Довод по реализации: политика минимально достаточная под фактический состав
фронтенда — `script-src 'self'` (бандлы Vite same-origin), `style-src 'unsafe-inline'`
для рантайм-стилей Vuetify, шрифты ограничены доменами Google Fonts. Режим
Report-Only ничего не блокирует — собираются только отчёты. Прогон теста вынесен
в каталог `app` отдельным первым шагом, потому что бинарь Pest и автозагрузка
лежат там. Реализация закрыта Pest-проверкой наличия Report-Only заголовка и
отсутствия блокирующего. Прошу наставника зафиксировать forward-рекомендацию
по достаточности набора директив.
