prometeu-runtime/docs/pull-requests/PR-006-cli-preserve-child-exit-status.md

73 lines
2.4 KiB
Markdown

# PR-006: CLI Preserve Child Exit Status
## Briefing
O wrapper `prometeu` despacha para outros binarios do ecossistema. Hoje, se o processo filho terminar sem exit code convencional, o CLI usa `unwrap_or(0)` e pode reportar sucesso mesmo quando houve abort, sinal ou encerramento anormal.
Este PR corrige a propagacao de status do processo filho para tornar o CLI confiavel em automacao, CI e uso por scripts.
## Problema
- `status.code()` pode retornar `None`.
- `unwrap_or(0)` transforma falha anormal em sucesso.
- Isso mascara erros reais em `run`, `debug`, `build` e `verify`.
## Escopo
- Preservar corretamente o resultado do processo filho.
- Melhorar a mensagem de erro quando nao houver codigo numerico.
- Cobrir o comportamento com testes.
## Fora de Escopo
- Reestruturar todo o dispatcher.
- Implementar subcomandos ainda nao existentes.
- Alterar o protocolo entre CLI e bins filhos.
## Abordagem
1. Remover `unwrap_or(0)` no ponto de saida.
2. Tratar dois casos:
- filho retorna exit code numerico: repassar exatamente;
- filho termina sem codigo numerico: encerrar com codigo nao-zero e mensagem clara.
3. Se necessario, extrair a traducao de `ExitStatus` para uma funcao pequena e testavel.
## Algoritmo
Entrada: `ExitStatus` do processo filho.
Passos:
1. Chamar `status.code()`.
2. Se retornar `Some(code)`:
- encerrar o wrapper com `code`.
3. Se retornar `None`:
- escrever mensagem de erro indicando encerramento anormal;
- encerrar o wrapper com `1`.
## Criterios de Aceite
- Se o processo filho sair com `0`, o wrapper sai com `0`.
- Se o processo filho sair com codigo nao-zero, o wrapper replica o mesmo codigo.
- Se o processo filho terminar sem codigo numerico, o wrapper sai com codigo nao-zero.
- O comportamento fica coberto por teste unitario.
## Tests
- Extrair funcao pura ou quase pura para mapear `ExitStatus -> i32` e testá-la.
- Cobrir:
- `0`;
- `1`;
- outro codigo nao-zero;
- status sem code numerico quando a plataforma permitir criar esse caso em teste.
- Se o caso `None` depender de plataforma:
- encapsular sob `cfg(unix)` ou `cfg(windows)` conforme apropriado;
- manter ao menos o contrato da funcao testado por unidade.
- Rodar:
- `cargo test -p prometeu-cli`
- `cargo test --workspace`
## Risco
Muito baixo. A mudanca corrige semantica operacional do CLI e tende a melhorar observabilidade sem alterar a logica de dispatch.