# План v4 — Go-Live Security Gate (пред-прод прогон безопасности)

## Цель

Собрать единый письменный отчёт безопасности портала Лидерра с вердиктом
**GO / NO-GO** на текущей ветке `main`, цель — локальная копия `127.0.0.1:8000`.
Гейт концептуально состоит из пяти проверок, каждая со своим механизмом исполнения:

- **статика** — Bash-шаги gitleaks, Semgrep (`npm run sast`), Ward;
- **ПДн / 152-ФЗ** — объявленный навык `pdn-152fz-audit` (Режим 1 и 2);
- **угрозы STRIDE** — объявленный навык `threat-model`;
- **динамика** — Bash-шаги: запуск локального сервера и Nuclei по `127.0.0.1`;
- **сводный вердикт** — шаг записи отчёта (последний), консолидирующий находки
  Bash-инструментов и навыков в один файл с GO/NO-GO.

Прогон не правит продуктовый код, схему и не коммитит; единственная запись —
файл отчёта в `docs/security/`.

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

```steps-json
[
  {"op":"Bash","object":"./bin/gitleaks.exe detect --source . --log-opts \"--all\"","ref":"D1"},
  {"op":"Bash","object":"npm run sast","ref":"D1"},
  {"op":"Bash","object":"./bin/ward.exe scan --path app/","ref":"D1"},
  {"op":"Bash","object":"php app/artisan serve --host 127.0.0.1 --port 8000 &","ref":"D4"},
  {"op":"Bash","object":"bin/nuclei.exe -u http://127.0.0.1:8000 -tags tech -rate-limit 20 -c 5 -timeout 5 -duc","ref":"D4"},
  {"op":"Bash","object":"bin/nuclei.exe -u http://127.0.0.1:8000 -rate-limit 20 -c 5 -timeout 5 -duc -severity medium,high,critical","ref":"D4"},
  {"op":"Write","object":"docs/security/2026-06-17-go-live-security-report.md","ref":"D5"}
]
```

```verified-context-json
[
  {"id":"vc1","kind":"EXTRACTED","ref":".claude/skills/security-go-live/references/gate.md","anchor":"IS8 — цель по умолчанию локальная"},
  {"id":"vc2","kind":"EXTRACTED","ref":"docs/Tooling_v8_3.md","anchor":"security-go-live — go-live security-gate"}
]
```

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

### Круг 1

Доводы по составу шагов:

- **Статика (gitleaks/Semgrep/Ward)** — read-only по локальному репозиторию и
  `app/`, ничего не правит и не отправляет наружу. gitleaks читает git-историю,
  Semgrep (`npm run sast`) и Ward (`./bin/ward.exe scan`) читают код и конфиг.
- **ПДн/152-ФЗ и угрозы** выполняются навыками `pdn-152fz-audit` и `threat-model`
  (объявлены в skills-json) — они анализируют схему и код только чтением; их
  находки попадают в отчёт шагом 7. Эти две проверки — не Bash-шаги, а навыки.
- **Динамика (Nuclei)** направлена строго на локальную копию `http://127.0.0.1:8000`
  (гард IS8). Темп ограничен `-rate-limit 20 -c 5` под однопоточный
  `php artisan serve`. Цель — `127.0.0.1`, не `localhost` (резолвер Nuclei
  пропускает `localhost`). Сначала smoke по тегу `tech`, затем полный medium+.
- **`php artisan serve`** запускается фоном на локальном адресе, продуктовых данных
  и схемы не меняет.
- **ZAP (#68)** требует Java-демона; при его отсутствии — `PENDING`, статус
  фиксируется в отчёте шагом 7 (отдельным Bash-шагом не закладывается).
- **Отчёт (шаг 7)** — единственная запись прогона: новый файл в `docs/security/`.
  Код, схема, миграции и git не трогаются; коммита нет.

Известные долги F-T2 (`/api/admin/*` без app-гейта) и F-P1 (152-ФЗ:
`deals.phones[]` не вычищаются) проверяются фактом и явно отражаются в вердикте.

### Круг 2

Возражение по синхронному `php artisan serve` принято: шаг 4 запускает сервер
**фоном** (`… &`), он работает параллельно с шагами Nuclei. Остальные шаги
одобрены поимённо (пп. 1–3, 5–7 — OK).

### Круг 3

Пять концептуальных проверок гейта сопоставлены с механизмом исполнения прямо в
`## Цель`: статика и динамика — Bash-шаги steps-json; ПДн и угрозы — объявленные
навыки skills-json (не Bash-шаги); сводный вердикт — шаг 7 записи отчёта. Семь
строк steps-json покрывают проверки «статика» (3), «динамика» (3) и «вердикт» (1);
проверки «ПДн» и «угрозы» исполняются навыками. Несостыковки между числом
концептуальных проверок и числом Bash-шагов нет — это разные механизмы.
