# Fase 12 — PoC reencode para retenção 8–30 dias

**Status:** concluída neste ambiente de desenvolvimento  
**Data:** 2026-08-19  
**Decisão neste host:** **NO-GO**  
**CLI:** `php artisan ipcam:reencode-poc`

## Contexto de desenvolvimento

Este host (4 vCPU Xeon E5-2620, ~8 GB RAM) **não** tem HDD físico nem câmeras reais. A amostra é **lavfi-testsrc** (1280×720 @ 15 fps, CRF 23), não um stream H.264 de câmera IP.  
O MVP de retenção **permanece** reciclagem por idade/espaço (Fase 9). Esta fase **não** liga reencode no `Recycler`, **não** cria systemd contínuo e **não** compacta em zip de MP4.

## Critério de go / no-go

GO só se **todas** forem verdade:

1. Economia ≥ 40%
2. Velocidade ≥ 4× tempo real com **1 thread**
3. Reencode de 24 h × 60 câmeras cabe na janela noturna de 8 h usando só os núcleos de sobra (`host_cores − 2`)

Caso contrário: NO-GO até repetir a ferramenta em hardware de produção com um segmento real.

## Números deste lab (2026-08-19T14:55:31-03:00)

| Métrica | Valor |
|---|---|
| Amostra | lavfi-testsrc 1280×720, 20 s, 15 fps |
| Perfil frio | scale 640, libx264 veryfast, CRF 28, 1 thread |
| Bytes antes | 192 444 |
| Bytes depois | 78 514 |
| Economia | **59,2%** (passa o limiar de 40%) |
| Tempo parede | 3,328 s |
| Velocidade | **6,01×** tempo real (passa 4×) |
| CPU·h / dia (60 cams) | **239,6** |
| Núcleos | 4 (2 de sobra) |
| Orçamento noturno | 2 × 8 h = **16** CPU·h |
| Cabe na janela | **não** (~15× acima do orçamento) |
| Zip / substitui originais / no Recycler | não / não / não |
| **Decisão** | **NO-GO** |

JSON: `apps/panel/storage/app/reencode-poc/latest.json` (cópia em `results/reencode/latest.json`, gitignored).

## Interpretação

A economia e a velocidade **passam** isoladamente, mas **não cabem** no CPU deste host se 60 câmeras precisarem de um dia de vídeo reencodado por dia. Ligar um worker aqui competiria com o Recorder.

A amostra lavfi é **otimista**: testsrc comprime fácil (~77 kbps). Câmera IP em `copy` (1–4 Mbps típico) tende a ser **mais pesada** de decodificar; a velocidade real deve cair. Repetir a PoC apontando um segmento de produção quando houver HDD e VLAN.

## O que foi entregue

- `App\Reencode\ReencodeFfmpegCommand` — argv, libx264, sem shell, sem zip
- `App\Reencode\ReencodePoc` — gera clipe quente, transcodifica, mede bytes/tempo; **não** altera `recordings`
- `php artisan ipcam:reencode-poc` (`--seconds`, `--crf`, `--width`)
- Testes: argv sem `sh`/zip; métricas; Recycler sem reencode

## Como repetir

```bash
cd apps/panel
php artisan ipcam:reencode-poc --seconds=20 --crf=28 --width=640
```

Em produção, depois de gravar um segmento real, a mesma CLI serve para reavaliar. Não há serviço `ipcam-reencode`.

## Aceite

| Critério | Resultado |
|---|---|
| PoC mede CPU e economia | OK |
| Números documentados | OK |
| Go/no-go honesto | **NO-GO** neste lab |
| Recycler inalterado (sem reencode) | OK |
| Sem zip de MP4 | OK |
| Sem systemd de reencode | OK |
| Originais não substituídos | OK |

## Fora desta fase

Cutover produção + rollback (Fase 13 — runbooks neste lab; cutover **não** executado). WebRTC. Worker de reencode contínuo.
