|
1904 | 1904 |
|
1905 | 1905 | - [ ] Extrair apenas primitives Remotion que aceitem `RenderInput` v2 sem ler banco/config global. |
1906 | 1906 | - [ ] Extrair pipeline FFmpeg atrás de recipes e jobs idempotentes. |
| 1907 | +- [x] Endurecer executor FFmpeg/ffprobe legado com timeout, cancelamento, limite de saída e erros tipados. Evidência: `MediaProcessError` e `tests/media/ffmpeg-service.integration.mjs`. |
1907 | 1908 | - [ ] Extrair transcription/timing atrás de adapter versionado. |
1908 | 1909 | - [ ] Extrair componentes de legenda atrás de `SubtitleStylePreset`. |
1909 | 1910 | - [ ] Extrair watchdog/progress para workflow base sem status ad hoc. |
@@ -2373,7 +2374,7 @@ Pendências deliberadas: |
2373 | 2374 |
|
2374 | 2375 | ### Slice F0-009 — Remoção do wrapper FFmpeg sem suporte |
2375 | 2376 |
|
2376 | | -**Status:** concluído em 12 de julho de 2026; ainda não commitado. |
| 2377 | +**Status:** concluído e publicado em 12 de julho de 2026 no commit `3b35732`. |
2377 | 2378 |
|
2378 | 2379 | Entregas: |
2379 | 2380 |
|
@@ -2411,10 +2412,40 @@ Incidente do primeiro runner: |
2411 | 2412 | - o run `29213379388` do commit `3fb94db` falhou corretamente no typecheck porque `remotion/node_modules` não existia no runner limpo; |
2412 | 2413 | - a investigação revelou oito advisories no lockfile Remotion antigo, incluindo dois high; |
2413 | 2414 | - o gate local foi corrigido para instalar e auditar os dois lockfiles antes do typecheck e para empacotar o renderer explicitamente; |
2414 | | -- a correção só poderá ser confirmada no runner hospedado depois da publicação deste slice. |
| 2415 | +- a correção foi confirmada no runner hospedado `29214156774`: todos os 19 passos concluíram com sucesso. |
2415 | 2416 |
|
2416 | 2417 | Pendências deliberadas: |
2417 | 2418 |
|
2418 | 2419 | - extrair recipes versionadas e execução idempotente pertence ao media worker v2; |
2419 | | -- adicionar timeout, cancelamento e limites de stdout/stderr ao executor antes de aceitar jobs não confiáveis; |
2420 | 2420 | - fixar e registrar versões-alvo de FFmpeg/ffprobe em ADR próprio antes do primeiro ambiente de produção. |
| 2421 | + |
| 2422 | +### Slice F0-010 — Executor seguro para processos de mídia |
| 2423 | + |
| 2424 | +**Status:** concluído em 12 de julho de 2026; ainda não commitado. |
| 2425 | + |
| 2426 | +Entregas: |
| 2427 | + |
| 2428 | +- executor único para FFmpeg e ffprobe preservando `execFile` com `shell: false`; |
| 2429 | +- opções compatíveis e opcionais de `AbortSignal`, timeout e limite de buffer em todas as operações públicas do adapter; |
| 2430 | +- timeout default de 30 minutos para FFmpeg e 60 segundos para ffprobe, configuráveis por ambiente e limitados a 6 horas; |
| 2431 | +- limite default de 8 MiB por stream, configurável e limitado a 64 MiB; |
| 2432 | +- FFmpeg recebe `-nostdin`, `-nostats`, `-hide_banner` e log level mínimo por operação; |
| 2433 | +- erros tipados `MediaProcessError` com códigos separados para cancelamento, timeout, excesso de saída e falha operacional; |
| 2434 | +- mensagens estáveis não incluem command line, argumentos ou paths; somente a cauda limitada de stderr fica disponível para diagnóstico interno; |
| 2435 | +- chamadas existentes permanecem válidas porque o novo argumento de opções é opcional. |
| 2436 | + |
| 2437 | +Evidências: |
| 2438 | + |
| 2439 | +- integração real cobre cancelamento antes do spawn e durante encode ativo; |
| 2440 | +- timeout de ffprobe encerra o processo e retorna `MEDIA_PROCESS_TIMEOUT`; |
| 2441 | +- excesso de stderr retorna `MEDIA_PROCESS_OUTPUT_LIMIT` sem crescimento irrestrito; |
| 2442 | +- input inexistente retorna `MEDIA_PROCESS_FAILED` com stderr limitado a quatro mil caracteres; |
| 2443 | +- fluxo nominal continua cobrindo probe, normalize, proxy, áudio, silêncio/corte e thumbnail; |
| 2444 | +- teste de mídia passou três vezes consecutivas para reduzir risco de flakiness temporal. |
| 2445 | + |
| 2446 | +Pendências deliberadas: |
| 2447 | + |
| 2448 | +- cancelamento persistente entre processos/restarts pertence ao workflow durável e ao estado canônico de job; |
| 2449 | +- cleanup e lineage de outputs parciais devem ser definidos nas recipes idempotentes do media worker; |
| 2450 | +- cada recipe terá SLA próprio em vez de depender apenas do teto global; |
| 2451 | +- o presenter público deverá mapear códigos internos para erros estáveis sem expor stderr. |
0 commit comments