# Fase 5 — Monitor + estados compostos

**Status:** concluída neste ambiente  
**Data:** 2026-08-19  
**URL:** https://vms.restor.app.br/saude  
**Serviço:** `ipcam-monitor.service`

## Princípio

Health do painel ≠ health da gravação. Dimensões **independentes**:

| Dimensão | Estados |
|---|---|
| Câmera | online / offline |
| Stream | disponível / indisponível / ocioso |
| FFmpeg | rodando / parado / falhou / ocioso |
| Gravação | ok / aguardando / sem gravação / falha / desligada |
| Armazenamento | ok / problema |

Caso crítico (iVMS): **ONLINE + SEM GRAVAÇÃO há X min** — alerta de primeira classe.

O Monitor **não** spawna FFmpeg. Reiniciar o Monitor não mata gravações. Reiniciar o Recorder é visível como FFmpeg parado / sem gravação.

## O que foi entregue

- `App\Monitor\HealthEvaluator` — regras puras, sem `if fabricante`
- Probe TCP genérico (`host:rtsp_port`, fallback ONVIF); `lavfi:` conta como online
- Histórico em `health_events` (abre/fecha na transição; conta quedas e tempo sem gravação)
- Snapshot em `cameras.health_*` + `health_headline`
- CLI `php artisan ipcam:monitor` (`--once` para testes)
- systemd `ipcam-monitor` (User=www-data; sem `Requires=` de Apache/Recorder)
- UI **Saúde** na sidebar; cards no dashboard; ficha da câmera

## SLA

Sem segmento novo além de `2 × IPCAM_SEGMENT_SECONDS + 30s` (default ~10,5 min) ⇒ `no_recording`.  
Antes do primeiro arquivo, há janela de espera a partir de `recording_enabled_at`.

## Testes

`php artisan test --filter=HealthMonitorTest` — alerta ONLINE/SEM GRAVAÇÃO, offline ≠ esse alerta, transições de evento, `--once` persiste snapshot.

## Aceite

| Critério | Resultado |
|---|---|
| ONLINE ≠ GRAVANDO | OK (dimensões separadas) |
| Alerta “sem gravação há X min” | OK (teste + UI) |
| Histórico de gaps / quedas | OK (`health_events`) |
| Monitor independente do Recorder/Apache | OK (unit systemd) |
| Sem `if fabricante` | OK |

## Fora desta fase

Live view (Fase 6): [`docs/FASE-6-RESULTADOS.md`](FASE-6-RESULTADOS.md). Fora da Fase 5: pesquisa/timeline, export, retenção.
