# Review — SDD CLI (TUI)

## Escopo revisado

Revisão da feature TUI sobre o baseline v0.4.1 (`git diff faa1fed..HEAD -- src/ Cargo.toml`), nas cinco dimensões (correção, legibilidade, arquitetura, segurança, performance):

- Módulo `src/tui/` completo: `mod.rs` (entrada, TTY guard, RAII, event loop, telemetria), `app.rs` (estado/reducers), `stage.rs` (máquina de estados/navegação), `orchestration.rs` (scan + parse), `event.rs` (teclas), `ui.rs` (render), `markdown.rs` (parser subset), `runner.rs` (subprocessos), `loader.rs` (spinner), `editor.rs` (`$EDITOR`), `persist.rs` (escrita atômica + artifact save).
- `src/main.rs`: `mod tui;`, `Command::Tui` + dispatch, `now_public()`/`log_jsonl` `pub(crate)`, refatoração de `save_artifact`/`write_stage_content` para `tui::persist::write_atomic`.
- `Cargo.toml`: `ratatui 0.29`, `crossterm 0.28`, dev-dep `ratatui`, `[profile.release] strip = true`.
- Verificação dirigida dos critérios de aceite e dos pontos do refinamento (write_atomic compartilhado, restauração de terminal, ausência de `sh -c`, não introdução de `.md` que quebre `infer_artifact`).

## Evidências

- `cargo test` → 62 testes passando (2 suites). `cargo build`/`cargo fmt --check`/`cargo clippy` limpos.
- `cargo build --release` → binário stripped 3.958.784 bytes (teto +5 MB respeitado; delta negativo).
- Degradação sem TTY: `sdd tui` com stdout redirecionado → exit 1, stderr claro, sem raw mode.
- Não-regressão: `sdd prd --help`/`sdd tui --help` → exit 0.
- Segurança shell: `grep` confirma ausência de `sh -c`/`bash -c`; subprocessos com args vetorizados e `stdin` controlado; teste anti-injeção presente.

## Achados

Nenhum achado **Crítico**.

### Alto
- **A-1. Persistência no checkpoint re-slugifica o `name` (`src/tui/app.rs` approve_stage × `src/main.rs` save_artifact × artifact_dir).** A TUI passava `active.name` a `save_artifact`, que recomputa `docs/slugify(name)/<arquivo>`. Se a normalização não reproduzir o slug original do diretório, a aprovação grava em diretório divergente, violando CA-RF08/CA-RF09 (R-05). **STATUS: corrigido nesta orquestração** — passou-se `active.slug` (idempotente) + teste de round-trip. Ver `08-memory.md`/execução.

### Médio
- **M-1. RN-01/CA-RF01 (2º cenário) não implementado:** sem detecção de instalação SDD (`.sdd/`/`sdd.config.yaml`) na entrada. Aceito como limitação documentada do MVP.
- **M-2. `start_stage` envia `input: None` ao regenerar:** parâmetro `input` efetivamente não usado; etapas leem do store. Confirmar por teste ou remover o parâmetro.
- **M-3. `Event::Resize` não força `needs_redraw`:** validar SIGWINCH no T-25.

### Baixo
- **B-1.** `current_exe()` cai para PATH no fallback (contradiz comentário).
- **B-2.** ciclo `$EDITOR` restaura manualmente com `.ok()`; frágil em falha (R-07) — validar no T-25.
- **B-3.** parser Markdown não cobre listas ordenadas/blockquote (aceitável, R-01).
- **B-4.** `save_stage_state` usa `--force` sempre (mitigado ao resolver A-1).

## Testes

Cobertura automatizada forte e alinhada aos CA: parse de estado (CA-RF02/R-05), navegação/bloqueio (CA-RF08), loader (CA-RF05), escrita atômica (CA-RF09/RNF-06), anti-injeção (runner), degradação (CA-RF11), render em 40/80/120 cols. Lacunas tratadas/aceitas:
1. **A-1:** teste de round-trip slug→save adicionado na correção.
2. **M-1/CA-RF01 2º cenário:** pendência aceita.
3. **CA-RF13:** lógica presente em `on_stage_result`; teste direto recomendado.
4. **T-25 (manual) PENDENTE:** matriz de terminais, `$EDITOR` ao vivo, `kill -9`, `time sdd tui`, SIGWINCH — gate de release, não executável em ambiente headless.

## Veredito

**Aprovado com ressalvas.** Sem achado Crítico. A implementação é coesa, isolada (Model–Update–View), segura contra shell injection, atômica na escrita, não regride os subcomandos (CA-RNF05) e degrada sem TTY (CA-RF11). Condições para merge/release:
- **A-1** corrigido (feito) — desbloqueia CA-RF08/CA-RF09.
- **M-1** aceito como limitação do MVP ou corrigido em seguida.
- **T-25 (manual)** deve rodar num TTY real antes do deploy.

Pontos positivos: isolamento exemplar (1 variante de dispatch), reuso do único ponto de mutação (`artifact save`/`write_atomic`), segurança consistente, restauração de terminal via RAII+panic hook, e lógica de domínio pura coberta por 62 testes.

## Rastreabilidade

| Campo | Valor |
|---|---|
| Artefato de origem | `06-execution.md` |
| Critérios verificados | `02-prd.md` — CA-RF01, CA-RF05, CA-RF08, CA-RF09, CA-RF11, CA-RF13, CA-RNF05 |
| Backlog / refinement | `04-tasks.md` (T-25 manual pendente), `05-refinement.md` |
| Tech Spec / ADR | `03-techspec.md`, `06-adr.md` |
| Risco | `00-risk-classification.md` — medium (external_dependency) |
| Diff revisado | `faa1fed..HEAD -- src/ Cargo.toml` |
| Próximo artefato | `08-memory.md` |
