# Stage 5 monitoring checklist — 7-дневное окно 29.05 → 04.06.2026

**Старт окна:** 28.05.2026 20:32 МСК (Stage 4 выкачен на боевой liderra.ru).
**Цель окна:** 7 дней без P0-регрессий → 04.06.2026 переключаем `supplier_export_mode` `online → batch` (Stage 5 Task 5.1).

**Как проверять:** через `gh workflow run artisan-run.yml -f command="<команда>"` (см. `.github/workflows/artisan-run.yml`). Результат — в Actions summary / artifact.

---

## Ежедневный чек-лист (5 минут)

### 1. Cron'ы живут (scheduler_heartbeats)

```
gh workflow run artisan-run.yml -f command="scheduler:check-heartbeats"
```

**Expected:** `No missing heartbeats detected` или похожий короткий вывод.

**Тревога:** в выводе строки `MISSING` или `WARN: command X consecutive_failures>=3` → расследовать (что ломается). Связано: `SchedulerHeartbeatMissingMail` на `kdv1@bk.ru`.

### 2. Incident-watcher (failed jobs spike / persistent)

```
gh workflow run artisan-run.yml -f command="incidents:watch-failures"
```

**Expected:** `No failure spikes detected` или похожее.

**Тревога:** `incidents_log` insert или email `[Лидерра инцидент]` на kdv1@bk.ru → проверить какая джоба льёт failures.

### 3. Состояние миграций (что схема та же что после Stage 4 deploy)

```
gh workflow run artisan-run.yml -f command="migrate:status"
```

**Expected:** все строки `Ran`, последняя — `2026_05_27_120000_create_project_routing_snapshots_table` (или ещё свежее, если что-то долили). 0 строк `Pending`.

**Тревога:** `Pending` миграции, которых не должно быть → значит кто-то залил изменения схемы вне процесса.

### 4. Партиции на следующий месяц созданы (ОТЛОЖЕНО)

**Проблема:** read-only artisan-команды `partitions:list` или `partitions:status` в проекте нет — есть только mutating `partitions:create-months` и `partitions:drop-expired`. Проверить наличие будущих партиций через GitHub Actions сейчас нельзя.

**Workaround:** партиции `project_routing_snapshots` на май+июнь 2026 были созданы inline в миграции `2026_05_27_120000_create_project_routing_snapshots_table` при deploy этапа 4 — на 7-дневное окно мониторинга 29.05→04.06 этого достаточно. **К моменту перехода в июль (≈25.06) нужно либо:**
- (а) добавить read-only артизан-команду `partitions:status` в код приложения, либо
- (б) запустить `partitions:create-months --months=2` через `gh workflow run artisan-run.yml -f command="partitions:create-months --months=2" -f confirm_apply=true`.

**На текущее окно — пункт пропускается.**

### 5. Просмотр почты `kdv1@bk.ru`

Ручная проверка:
- `[Лидерра ПАДЕНИЕ]` — портал упал >4 мин.
- `[Лидерра восстановлен]` — портал поднялся (после падения).
- `[Лидерра инцидент]` — auto-watcher нашёл подозрение.
- `liderra-queue` systemd alert — очередь упала ≥5 раз за 5 мин.
- `CsvDriftAlertMail` — рассинхрон CSV с поставщиком >5%.
- **`TenantBusinessDriftAlertMail` (новое — добавлено в Stage 4 R-05)** — shortfall в `project_routing_snapshots` per (snapshot_date, tenant_id) >20%. **Если приходит ежедневно** — Stage 5 переключение надо отодвинуть до выяснения.

---

## Что особенно следим (R-checks из Stage 4)

| R | Что проверить | Команда / источник |
|---|---|---|
| R-01 | Снимок снимается ежедневно в 18:02 МСК — есть строка за каждый день | `partitions:list` + ручной просмотр `project_routing_snapshots` через future SQL workflow |
| R-05 | Business-drift не зашкаливает | Почта `TenantBusinessDriftAlertMail` |
| R-13 | `paused_at` синхронизируется с заморозкой проекта | Sentry / `incidents_log` — нет ошибок при тогле проектов |
| R-17 | Новые SMS-проекты создаются с unified key (не дают orphan) | `supplier:rekey-orphans --dry-run` раз в 2-3 дня → должно оставаться `No orphan SMS supplier_projects found` |
| R-18 | `targetWeekdayForNow` не дёргается в полночь | Sentry: нет вспышек ошибок в `SyncSupplierProjectJob` около 00:00 МСК |
| R-19 | Preflight у шерящихся клиентов даёт корректные пропорции | Ручная проверка `Tenant::requiredLeadsForTomorrow` через будущий SQL workflow для топ-5 шерящихся клиентов |

---

## Trigger «переключение преждевременно — отодвинуть»

Если **хотя бы одно из перечисленного** случится в окне:

- ≥1 P0-инцидент в `incidents_log` связанный с supplier-routing
- ≥3 ежедневных `TenantBusinessDriftAlertMail` в одну неделю
- 502/503 на портале >30 минут
- `failed_webhook_jobs` накопил >100 за день
- Любое падение `liderra-queue` сервиса по `OnFailure=`
- `consecutive_failures >= 3` у `SyncSupplierProjectsJob` или `CsvReconcileJob`
- 0 строк в `project_routing_snapshots` за день (сnapshot не снялся)
- Прямые жалобы клиентов на missing leads

→ Stage 5 откладывается на +N дней (N = время диагноза + 3 дня чистого окна после фикса).

---

## Trigger «всё чисто — двигаем 04.06»

7 дней (29.05 → 04.06) подряд:
- 0 P0
- 0 TenantBusinessDriftAlertMail
- scheduler_heartbeats: все green
- incidents:watch-failures: clean каждый день
- migrate:status: ровно тот же набор
- supplier:rekey-orphans --dry-run: clean каждый прогон (✅ проверено на проде 22.06.2026 — «No orphan SMS supplier_projects found»; разовая миграция не нужна, система здорова by design)
- Нет жалоб клиентов

→ 04.06.2026 запускаем Stage 5 Task 5.1: переключение `supplier_export_mode='batch'`. После переключения — ещё 7 дней наблюдения по этому же чек-листу. Если 14 дней суммарно чисто — Stage 5 закрыт окончательно.

---

## Расписание

| День | Дата | Кто проверяет | Что особенно |
|---|---|---|---|
| День 1 | 29.05.2026 (ПТ) | Claude | Все 5 пунктов + R-17 dry-run |
| День 2 | 30.05.2026 (СБ) | Claude | Все 5 пунктов |
| День 3 | 31.05.2026 (ВС) | Claude | Все 5 пунктов |
| День 4 | 01.06.2026 (ПН) | Claude | Все 5 + повторный R-17 dry-run |
| День 5 | 02.06.2026 (ВТ) | Claude | Все 5 пунктов |
| День 6 | 03.06.2026 (СР) | Claude | Все 5 пунктов |
| День 7 | 04.06.2026 (ЧТ) | Claude+заказчик | Все 5 + решение GO/NO-GO Stage 5 |

Можно ставить через `/loop` skill (раз в день) или `/schedule` cron-job — после согласования с заказчиком.
