tetrad 0.1.0

MCP de Consenso Quádruplo para Claude Code - Valida código usando Codex, Gemini e Qwen
Documentation
# Relatório de Debugging e Análise de Qualidade - Tetrad

**Data:** 21 de Janeiro de 2026
**Autor:** Gemini CLI Agent
**Status do Projeto:** Compilando, Testes Passando (127 unitários + integração)

## 1. Resumo Executivo

O projeto **Tetrad** encontra-se em um estado funcional avançado, com a suíte de testes passando integralmente e a estrutura arquitetural bem definida (MCP, Consenso, ReasoningBank). No entanto, a análise estática e revisão de código revelaram problemas críticos de **segurança de threads** e **robustez** que impedem o uso seguro em produção.

## 2. Problemas Críticos Encontrados

### 2.1. Erro de Thread Safety (Concurrency)

Foi identificado um erro grave de concorrência detectado pelo `clippy`, mas que pode passar despercebido na compilação padrão dependendo da versão do compilador ou features ativadas.

*   **Localização:** `src/mcp/tools.rs`
*   **Problema:** O campo `reasoning_bank` na struct `ToolHandler` é definido como:
    ```rust
    reasoning_bank: Arc<RwLock<Option<ReasoningBank>>>
    ```
*   **Causa Raiz:** O `ReasoningBank` contém uma conexão `rusqlite::Connection` (SQLite), que **não é Thread-Safe (`!Sync`)**.
*   **Impacto:** O tipo `Arc<RwLock<Option<ReasoningBank>>>` torna-se `!Send` e `!Sync`. Como o handler é compartilhado entre threads no runtime do `tokio`, isso causará erros de compilação (como "future cannot be sent between threads safely") ou comportamento indefinido/crashes em runtime.
*   **Solução Recomendada:** Substituir `RwLock` por `tokio::sync::Mutex`, pois o `Mutex` do Tokio permite guardar tipos `!Sync` (como a conexão SQLite) e movê-los entre threads com segurança.

### 2.2. Risco de Crises (Panics) em Runtime

O código faz uso excessivo de `.unwrap()` e `.expect()` em caminhos críticos de execução (não apenas em testes), o que torna o servidor frágil.

*   **Transporte MCP (`src/mcp/transport.rs`):**
    *   `transport.read_message().unwrap()`
    *   `transport.write_response(&response).unwrap()`
    *   **Risco:** Se o cliente (Claude Desktop ou outro) desconectar abruptamente ou enviar bytes inválidos, o servidor Tetrad inteiro irá abortar (panic), encerrando o serviço.

*   **Inicialização (`src/mcp/server.rs`, `src/main.rs`):**
    *   `McpServer::new(config).unwrap()`
    *   **Risco:** Falha na configuração causa crash imediato sem log de erro amigável.

*   **Hooks (`src/hooks/mod.rs`):**
    *   `system.run_pre_evaluate(&request).await.unwrap()`
    *   **Risco:** Se um hook falhar (ex: erro de IO no log), todo o processo de avaliação é abortado.

## 3. Qualidade de Código e Manutenção

### 3.1. Arquitetura
A arquitetura está sólida, seguindo boas práticas de separação de responsabilidades:
*   **Consenso:** Lógica bem isolada em `src/consensus`.
*   **Executores:** Abstração `CliExecutor` permite fácil adição de novos modelos.
*   **ReasoningBank:** Persistência em SQLite bem implementada (embora com o problema de thread-safety citado).

### 3.2. Testes
A cobertura de testes é excelente para um projeto neste estágio:
*   Unitários: Cobrem regras de consenso, parsing de JSON e lógica de cache.
*   Integração: `tests/` cobrem o fluxo de ponta a ponta das ferramentas CLI e MCP.

## 4. Recomendações de Correção

Para sanar os problemas identificados, recomenda-se as seguintes ações (em ordem de prioridade):

1.  **Corrigir Thread Safety:**
    Alterar a definição em `src/mcp/tools.rs`:
    ```diff
    - use tokio::sync::RwLock;
    + use tokio::sync::Mutex;

    - reasoning_bank: Arc<RwLock<Option<ReasoningBank>>>,
    + reasoning_bank: Arc<Mutex<Option<ReasoningBank>>>,
    ```
    E atualizar todas as chamadas de `.read().await` e `.write().await` para `.lock().await`.

2.  **Blindar Camada de Transporte:**
    Substituir `unwrap()` em `src/mcp/transport.rs` por tratamento de erro com `Result`, permitindo que o servidor logue o erro e tente recuperar ou encerrar graciosamente a conexão específica, sem derrubar o processo principal.

3.  **Auditoria de Unwraps:**
    Realizar uma varredura (grep) por `unwrap()` fora da pasta `tests/` e substituir por `?` (propagação de erro) ou `unwrap_or_else` com log de erro apropriado.

---
**Conclusão:** O Tetrad é promissor e funcional, mas a correção do problema de `Send/Sync` no `ReasoningBank` é **obrigatória** antes de qualquer deploy ou uso real.