# План: доменный go-live аудит — прогон 4 скилов с чтением артефактов и агрегацией

## Цель

Провести доменный аудит безопасности по спеке `2026-06-15-go-live-security-audit-evidence-2.md`
(раздел D5) через реальный прогон четырёх доменных скилов с чтением исходных артефактов и
записать промежуточный неавторизующий отчёт. Новых правок кода нет — только анализ и запись.

Раскрытие критериев приёмки D5 (что обязан содержать отчёт):
- **Обязательные поля каждой находки:** ID; инвариант (раздел D1–D4); `файл:строка`;
  приоритет `P1`/`P2`/`P3`; статус `закрыт`/`остаточный риск`/`открыт`; рекомендация.
- **Критерий блокера:** открытая находка приоритета **P1** = блокер публикации.
- **Минимальный охват артефактов:** D1 — `EnsureSaasAdmin.php` + `ResolvesAdminUserId.php` +
  `routes/web.php`; D2 — `WebhookSettingsController.php` + `WebhookUrlGuard.php`; D3 —
  `PdErasureService.php` + `schema.sql` (phone-колонки); D4 — `LedgerService.php` +
  `schema.sql` (`lead_charges`, `supplier_lead_deliveries`).
- **Форма артефакта:** промежуточный, **не авторизация go-live**; финальное go/no-go выносит
  владелец после полного review (отложенный live-DAST). Открытые вопросы (Б-1/SEC/CTO/Биз/
  Диз/DO) не закрываются.

## Карточки навыков

- **threat-model** (домены D1/D2). Поведение: STRIDE-классификация точек входа портала.
  Входные артефакты: `routes/web.php`, `EnsureSaasAdmin.php`, `ResolvesAdminUserId.php`,
  `WebhookSettingsController.php`, `WebhookUrlGuard.php`. Выход: список угроз авторизации и
  SSRF с приоритетом и рекомендацией.
- **pdn-152fz-audit** (домен D3). Поведение: проверка полноты анонимизации ПДн по 152-ФЗ.
  Входные артефакты: `PdErasureService.php`, `schema.sql` (колонки с телефоном, JSON-массивы).
  Выход: незакрытые копии ПДн при удалении субъекта.
- **billing-audit** (домен D4). Поведение: проверка money-инвариантов (копейки/`bcmath`,
  идемпотентность списания, провенанс). Входные артефакты: `LedgerService.php`, `schema.sql`
  (`lead_charges`, `supplier_lead_deliveries`). Выход: денежные риски и пробелы defense-in-depth.
- **security-go-live** (итог). Поведение: агрегация находок D1–D4 + промежуточный статус.
  Вход: находки трёх предыдущих скилов. Выход: статус «готов/не готов» + перечень блокеров.

## Порядок исполнения

Под печатью: до первого мутирующего шага (Write) вызываются все 4 объявленных скила
(threat-model → pdn-152fz-audit → billing-audit → security-go-live). Затем grep-шаги
читают и подтверждают артефакты по каждому домену, и финальный Write агрегирует находки
в отчёт по критериям D5.

```skills-json
["threat-model", "pdn-152fz-audit", "billing-audit", "security-go-live"]
```

```steps-json
[
  {"op":"Bash","object":"grep -n admin_user_id app/app/Http/Controllers/Concerns/ResolvesAdminUserId.php","ref":"D1"},
  {"op":"Bash","object":"grep -n Http::timeout app/app/Http/Controllers/Api/WebhookSettingsController.php","ref":"D2"},
  {"op":"Bash","object":"grep -n phones db/schema.sql","ref":"D3"},
  {"op":"Bash","object":"grep -n bcsub app/app/Services/Billing/LedgerService.php","ref":"D4"},
  {"op":"Write","object":"docs/superpowers/audits/2026-06-15-portal-domain-audit-findings.md","ref":"D5"}
]
```

```verified-context-json
[
  {"id":"D1a","kind":"EXTRACTED","ref":"app/app/Http/Middleware/EnsureSaasAdmin.php","anchor":"return $next($request);"},
  {"id":"D3b","kind":"EXTRACTED","ref":"db/schema.sql","anchor":"phones          JSONB"}
]
```
