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

## Цель

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

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

```steps-json
[
  {"op": "Edit", "object": "c:/моя/проекты/портал crm/Документация/app/tests/Feature/SecurityHeadersTest.php", "ref": "D5"},
  {"op": "Bash", "object": "php app/artisan test --filter=SecurityHeaders", "ref": "D5"},
  {"op": "Edit", "object": "c:/моя/проекты/портал crm/Документация/app/app/Http/Middleware/SecurityHeaders.php", "ref": "D1"},
  {"op": "Bash", "object": "php app/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 гарантирует, что на этом шаге ничего в
интерфейсе не блокируется — собираются только отчёты о нарушениях. Реализация
закрыта Pest-проверкой наличия Report-Only заголовка и отсутствия блокирующего.
Прошу наставника зафиксировать forward-рекомендацию по достаточности набора директив.
