# Cockpit de IA — análise de lacunas dos blocos 2 a 8

Referência: `retorno.md` do Google Drive, ID `12LoxxSBVLmOxZF0ysc4FIhpMbWb1WYBB`.  
Implementação: `STACK-NINJA/02-PROJETOS/cockpit`.

## Resultado consolidado

| Bloco | Classificação atual | Evidência central |
|---|---|---|
| 2. Autenticação local | PARCIAL/DIVERGENTE | Primitivas testadas; login/Argon2id/FastAPI ausentes e CORS ainda aberto. |
| 3. Dados e estados | PARCIAL | Schema, checksum, persistência, append-only e atomicidade testados; ativação/API pendentes. |
| 4. Roteamento | PARCIAL | Ruleset e decisão persistida testados; API/configuração operacional pendentes. |
| 5. Perplexity | PARCIAL | Conector/serviço testados com mocks; falta configuração/rota e validação live autorizada. |
| 6. OpenRouter | PARCIAL | Allowlist e conector mockados; falta configuração/rota operacional. |
| 7. Browser handoff | PARCIAL/DIVERGENTE | Serviço manual testado; automação legada ainda existe desligada; falta UI/rota. |
| 8. Manual import | PARCIAL | Serviço idempotente testado; falta UI/rota. |

## Bloco 2 — autenticação local e proteção web

**Exigido:** usuário local, Argon2id, sessão opaca persistida por hash, TTL/revogação, cookie seguro, CSRF, allowlist de Origin, atraso progressivo e falha segura sem configuração.

**Existe/funciona:** configuração por ambiente e bind padrão local em `config/settings.py:7-15`; frontend usa `textContent` para conteúdo variável em `frontend/index.html:195-270`.

**Lacunas/divergências:** `security/auth.py` agora cobre token opaco, SHA-256, TTL, revogação, CSRF, Origin e atraso progressivo. Ainda não há login/logout/dependência FastAPI; `argon2-cffi` não está instalado; rotas e WebSocket continuam abertos. CORS aceita `*` com credenciais.

**Prova:** 6 testes de primitives cobrem hash-only, TTL/expiração, CSRF, revogação, Origin, throttling e falha segura de configuração; a suíte da API ainda demonstra acesso sem login.

**Próximo trabalho:** instalar Argon2 mediante autorização, criar login/cookie/dependência FastAPI e proteger CSRF/Origin/CORS/WS como uma unidade.

## Bloco 3 — SQLite, migrations e domínio

**Exigido:** `schema_migrations` com checksum; Job, Run, Event append-only, Artifact e Session; transições atômicas entre `queued`, `routed`, `running`, `waiting_human`, `succeeded`, `failed` e `cancelled`.

**Existe/funciona:** SQLite WAL e quatro tabelas do MVP em `core/db.py:38-118`. O novo `core/workflow.py:16-135` define o conjunto de estados, a tabela explícita de transições, rejeição de atalhos e modelos imutáveis de Job/Run/Event/Artifact.

**Prova:** 5 testes de workflow aprovados, incluindo todas as transições declaradas, terminais sem saída, estado desconhecido, imutabilidade e rejeição de `queued -> succeeded`.

**Lacunas:** schema, runner, repositório e atomicidade existem e passaram testes em temporários/cópia. Falta ligar o runner ao startup e aplicar ao banco operacional mediante aprovação; faltam rotas HTTP.

**Próximo trabalho:** mediante aprovação, ligar o runner ao startup e aplicar as migrations já testadas ao banco operacional; depois expor repositório por API autenticada.

## Bloco 4 — roteador determinístico

**Exigido:** sinais explícitos, prioridades fixas, ruleset versionado, fallback, justificativa e decisão persistida; privado deve resultar em revisão humana.

**Existe/funciona:** `core/routing.py:9-181` implementa ruleset v1 puro. A prioridade é: privado; web/Perplexity; código/OpenRouter allowlisted; VM/Manus; visual/estudo/projeto/ChatGPT; ecossistema/conversa/Gemini; revisão manual. Não há aleatoriedade nem chamada externa.

**Prova:** 6 testes aprovados cobrem prioridades, Perplexity configurado/ausente, modelo permitido/negado, três handoffs, fallback manual e determinismo do registro de auditoria.

**Lacunas:** `core/operations.py` já persiste Artifact/Event e cria Run real em uma transação. Sinais ainda não vêm da API e disponibilidade ainda não é obtida da configuração operacional.

**Próximo trabalho:** ativar a persistência aprovada e criar a rota autenticada, mantendo a função pura como núcleo.

## Bloco 5 — PerplexityAI

**Exigido:** conector assíncrono isolado, timeout, normalização, Artifacts, 429/5xx sem retry pago automático e segredo fora do código.

**Estado:** PARCIAL. `connectors/perplexity.py` usa `httpx.AsyncClient`, sem retries, e normaliza 429/4xx/5xx/timeout/resposta inválida. `core/provider_service.py` persiste request/response/links e Events. Testes mockados 200/429 aprovados; nenhuma chamada live.

**Testes:** mocks 200, 429, timeout, resposta inválida e serviço persistente; nenhuma chamada real/paga.

**Próximo trabalho:** carregar configuração segura e integrar à rota; homologação live somente com autorização.

## Bloco 6 — OpenRouter

**Exigido:** gateway assíncrono, allowlist explícita, bloqueio antes do HTTP, modelo solicitado/efetivo, métricas opcionais e erros sanitizados.

**Estado:** PARCIAL. `connectors/openrouter.py` rejeita fora da allowlist antes do HTTP, registra modelos solicitado/efetivo e tolera métricas ausentes. Testes mockados aprovados; falta configuração/rota operacional.

**Testes:** modelo negado com zero HTTP, 200 sem métricas e 5xx sanitizado sob `MockTransport`.

**Próximo trabalho:** carregar allowlist/chave de configuração segura e integrar à rota; live somente com autorização.

## Bloco 7 — browser handoff

**Exigido:** pacote Markdown copiável, abertura de URL apenas por gesto explícito, Run em `waiting_human`, sem login/cookie/sessão/captura automatizados.

**Existe:** código legado em `chat/browser_pool.py:1-89` conecta ao Opera via CDP com perfil persistente; `chat/deepseek_web.py:20-69` envia e captura resposta.

**Divergência:** o mecanismo existente é precisamente o que a especificação proíbe. Ele fica desligado por padrão e não foi executado.

**Lacunas:** pacote, Artifact, Event e transição foram implementados/testados em `core/operations.py`. Faltam rota, tela e clique explícito no frontend; o legado divergente permanece desligado.

**Próximo trabalho:** expor o handoff manual por rota/tela e manter automação legada desabilitada até decisão de quarentena/remoção.

## Bloco 8 — importação manual

**Exigido:** importar texto em Run pendente, Artifact com hash/proveniência, idempotência por Run+hash, validação de estado, URL HTTP(S) opcional e escaping.

**Estado:** PARCIAL. `import_manual_response` valida estado/URL/tamanho, usa hash, é idempotente e conclui o Run com um único Event. Falta expor rota/tela; o frontend atual já usa `textContent`.

**Testes:** sucesso, idempotência, URL inválida, Run terminal, escaping de exibição e Event único aprovados.

**Próximo trabalho:** expor por rota/tela autenticada; acrescentar teste HTTP 404/409 e limite configurado.

## Conclusão

O MVP anterior foi preservado. Todos os blocos 2–8 agora possuem ao menos implementação parcial testada, porém nenhum novo bloco foi ativado nas rotas/startup nem aplicado ao banco operacional. Bloco concluído exige ainda integração e homologação.
