# Cockpit de IA — estado real

Data da verificação: 2026-10-10  
Projeto operacional canônico adotado nesta execução: `STACK-NINJA/02-PROJETOS/cockpit`  
Especificação: Google Drive `retorno.md`, ID `12LoxxSBVLmOxZF0ysc4FIhpMbWb1WYBB`.

## Estado real — homologação do conhecimento e proveniência FASE 2 LIVE — 2026-10-12

| Item | Estado | Evidência |
|---|---|---|
| Missão | **CONCLUÍDO** (decisões humanas pendentes) | Relatório: `STACK-NINJA/00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_RELATORIO_HOMOLOGACAO.md`. |
| Classificação 186 | **A=16 · B=34 · C=136** | `COCKPIT_MATRIZ_HOMOLOGACAO.md` — 186 linhas com ID, categoria, origem, hash, autoria, justificativa e ação; precedência C→B→A documentada; gerador `scripts/homologation_reports.py` idempotente e somente-leitura. |
| Quarentena (38) | PERMANECE INTEGRAL | 0 liberadas; causa exata por registro (23 `sensitive_domain_review`, 9 `credential_or_secret`, 6 `personal_contact`); SHA-256 BDS (`3be701bab88…`) + 9 arquivos stack-ninja conferidos; conteúdo retido não reproduzido; 0 erros técnicos automáticos (`COCKPIT_REVISAO_QUARENTENA.md`). |
| Supersessões (10) | 10/10 RECONSTRUÍDAS | Derivações recalculadas na fonte (`idx_content` superada por `idx_json`, mesma chave; casamento 10/10); 0 circulares/autorrelações/órfãs/links quebrados; `source_key` derivado nos 30 sensíveis documentado como achado, não alterado (`COCKPIT_AUDITORIA_SUPERSESSOES.md`). |
| Autoria | MATRIZ + PROPOSTA (não executada) | 5 tipos: humana 0 · agente 16 · institucional 9 · desconhecida 161 · sistema 0; lacunas (`humano:<qualquer>` sem prova, `create_item` sem validação) + migração `0006` em rascunho (`COCKPIT_POLITICA_AUTORIA_PROPOSTA.md`). |
| Módulo Conhecimento | 8 CONFIRMAÇÕES + 6 CORREÇÕES | hidratação de `sources`/`versions` na lista, `count_items` real, aviso só sem filtro, `list_versions` com desempate, `count_threads` real, agenda agregada por SQL (antes corte de 100); anomalias de escrita registradas; UI intacta. |
| Conhecimento (canônicos) | **0** (por opção) | nenhuma promoção automática; nenhuma material artificial para zerar indicador; 34 classe B aguardam decisão de autoria/escopo; 16 classe A aguardam homologação humana. |
| Testes | ****254 testes, 0 falhas (OK)**** | `logs/full-suite-20261012-homologacao.txt`; 26 novos (`tests/test_homologation.py`): invariantes 186/38/10/20, idempotência byte a byte, gerador não escreve, hashes ×3, jobs, endpoints, `PERSONA_EXECUTORS` vazio, regressão das correções; artificiais em banco temporário; operacional `mode=ro`. |
| Banco | ÍNTEGRO E INALTERADO | `integrity_check=ok`, 186 registros, migrations 0001–0005, `knowledge_items=0`; históricos ≥ baseline (feed 624, jobs 2, runs 2, events 12, artifacts 6, chat 20); nenhuma escrita desta missão no operacional. |
| Backup | CRIADO E VERIFICADO | `backups/pre-homologacao-20261012-161552.sqlite3` (integrity=ok). |
| Servidor | REINICIADO (correções ativas) | Backup `backups/pre-server-restart-20261012-20261012-174523.sqlite3` (integrity=ok, 186+chat no backup) → PID 5084 encerrado → novo servidor **PID 5668** (launcher 4832) na 8790: `Application startup complete`, health 200, raiz 303 → /login, logs `logs/server-8790-20261012-144722.{out,err}.log`. |
| CAR / externos / UI | INTACTO | `COCKPIT_CAR_ENFORCE` intocado; zero chamadas externas; nenhum componente de UI reconstruído; nenhum registro apagado. |

## Estado real — reindexação integral e auditoria FASE 2 LIVE — 2026-10-12

| Item | Estado | Evidência |
|---|---|---|
| Missão | **CONCLUÍDO** (pendências humanas) | Relatório completo: `STACK-NINJA/00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_RELATORIO_FASE2.md` (seções A–D da tarefa). |
| Catálogo do Ecossistema | **186 registros**, coerente com as fontes | 161 `bds-backup-2026-10-05` + 16 `cockpit-canonical` + 5 `stack-ninja-mirror` + 3 `stack-ninja-projects` + 1 `stack-ninja-governance`; fingerprints SHA-256 por execução em `ecosystem_import_runs` (10 execuções registradas). |
| Reindexação idempotente | PROVADA | 3 execuções com backup: 1ª defeituosa → reparada byte a byte (diff 0); 2ª = 177 → 186 (+9, rejeitados 0, duplicatas 0); 3ª = **0 inseridos / 0 atualizados / 0 versões** em todas as fontes (`logs/reindex-20261012-025219.json`). |
| Divergência de indexação | DIAGNOSTICADA | Rotina anterior = importação original `bds_catalog_import` (11/10 04:20) para `ecosystem_records`; sem rotina incremental nem registro de execuções; interface lê exatamente essas tabelas (`core/ecosystem.list_category`). |
| Conhecimento (0 canônicos) | 0 = COERENTE, AGORA EXPLICADO | Fluxo distinto do catálogo; `create_item` exige `author_agent`; `REGISTRATION_POLICY` proíbe autoria inventada/promoção automática. API devolve `policy`/`notice` + frontend explica; 186 candidatos registrados para decisão humana em `00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_CANDIDATOS_CONHECIMENTO.md` — nenhum promovido. |
| Personas/orquestrador | VALIDADO | 14 casos de seleção (devem/não devem) OK em `logs/audit-personas-orchestrator-20261012.txt`; candidatos só do catálogo; `PERSONA_EXECUTORS=[]`, `can_produce_authored_output=false` para todos. Divergência 12 × 16 resolvida: 16 = (12 catálogo − 3 `superseded_by`) + 7 painel; agora **17 registros · 13 cartões** (+arquivo espelhado). LOBO/MIN. DEFESA/BDS/SÓCIO CRIPTO só no painel (sem definição no catálogo — não inventadas). |
| Migrations/banco | ÍNTEGRO | `0001`–`0005` (0005 **aditiva**: `ecosystem_record_versions`, `ecosystem_import_runs`); `integrity_check=ok`, 0 FK, 23 tabelas, 0 chaves duplicadas, 0 versões órfãs. |
| Histórico preservado | INALTERADO | `feed_events` 624, `jobs` 2 (`waiting_human`), `runs` 2, `events` 12, `artifacts` 6, `chat_messages` 20; 20 versões + 10 execuções no histórico de reindexação (nada apagado). |
| Quarentena/sensibilidade | ATIVA | 38 `review_required` (conteúdo retido, nome preservado quando não sensível); 10 superseded ocultos da consulta mas presentes no banco; defesa em profundidade no `normalize`. |
| Testes | **228 testes, 0 falhas (OK)** | `logs/full-suite-20261012-final.txt` (791,8 s); 1ª execução: 1 expectativa defasada de snapshot corrigida (`test_canonical_readonly_api`); novos 17 testes de reindex + notice; `pip check`/`py_compile` OK; mutações usam banco temporário. |
| Interface | FUNCIONAL (sem redesenho) | Servidor 8790 em **novo processo PID 5084 desde 12/10 12:47** (restart autorizado, com backup pré-troca `backups/pre-server-restart-20261012-154503.sqlite3`); health 200, raiz 303→login, 401 sem sessão; **código novo (notice/policy + correções) já ativo e atendendo uso autenticado**; frontend do disco; nenhum componente reconstruído. |
| Backups | CRIADOS E VERIFICÁVEIS | `backups/pre-reindex-20261012-022949.sqlite3`, `-024317`, `-025218` (anteriores intactos). |
| CAR / provedores / externos | INTACTO | `COCKPIT_CAR_ENFORCE` não alterado; zero chamadas pagas/live; nenhum processo encerrado; nenhum registro legítimo apagado. |


## Estado real — FASE 2 LIVE validada e corrigida — 2026-10-11 (20:45)

| Item | Estado | Evidência |
|---|---|---|
| Missão | **CONCLUÍDO** (pendências operacionais) | Relatório completo em `tarefa.md` §"RELATÓRIO DE EXECUÇÃO — FASE 2 LIVE". |
| Seleção de personas (A) | CORRIGIDO | Mensagem real do usuário antes: `[]/None/principal=None` → "nenhuma persona compatível". Depois: RECLAMÃO principal + DIRETOR participante + AUDITOR candidata (sinais `análise/verificação/estado atual` em `core/agents.py` + padrão AUDITOR em `core/orchestrator.py`); casual segue sem candidatos. |
| Apresentação de registros (B) | CORRIGIDO | `unwrapRecordContent()`/`presentableContent()` + `config_original` em "Detalhes técnicos"; JSON original preservado; conteúdo retido não exibido; sem innerHTML; banco intocado. |
| Probe de duplicidade (E) | CORRIGIDO | UI pede `?probe=true` sempre; `relation` honesto (`self`/`other_instance`/`none`/`unknown`) via claim do CAR; fim do "duplicidade não verificada nesta leitura" e da autodenúncia. |
| Jobs em espera humana | ESPERADO/VERIFICADO | 2 jobs + 2 runs `waiting_human`, `started_at=NULL`, handoff local, `approval_required=true`, `external_calls_made=false`; eventos `job_created→…→handoff_created→orchestration_planned`; nenhum descartado. |
| Feed | LIMPO E ROTULADO | 633→624: 9 linhas QA (`QA`/`um`/`dois`/`tres`) removidas por assinatura exata; restantes todos `source=sim` (seed + adapter mock WS, não persistido); 0 poluição. |
| Catálogo | PRESERVADO | 177 registros íntegros (`bds-backup-2026-10-05`, `cockpit-canonical`); 12 personas (6 nomeadas + 6 sem nome `review_required` com conteúdo retido), 42 skills, 108 memórias — capturas 16/35/3 registravam estado anterior. |
| Conhecimento | 0 ITENS (declarado) | `knowledge_items=0`: módulo novo, nenhuma importação autorizada; candidatos: 108 memórias BDS, 3 missões canônicas, docs do repo; indexação exige autoria verificável → decisão humana. |
| Concorrência | ESPERADO | 3,92 GiB < 4 GiB → `base_concurrency=1`; limiares provisórios declarados. |
| Suíte completa | **210 testes, 0 falhas (OK), 620,610 s** | `logs/suite-fase2-final-20261011-201658.log` (baseline 198; 1ª execução teve 1 falha de literal de teste → ajustado → 23/23 OK). `pip check`/`py_compile`/`node --check` OK. |
| Migrations/banco | INALTERADOS | `0001`–`0004`; `integrity_check=ok`, 0 FK; chat 20, jobs 2, runs 2, events 12, artifacts 6, sessions 17; nenhuma migration nova. |
| Servidores | PRESERVADOS | 8790/2036 intacto (código de 19:27 — reinício humano para as correções); novo código validado ao vivo na 8791 (startup limpo, health 200, chat 401, raiz→login; encerrado por esta execução); PID 4072 uvicorn duplicado inerte (3,3 MB, sem porta) — encerrar só com autorização. |
| Backup | CRIADO | `backups/fase2-live-20261011-195356/` (5 arquivos alterados + sqlite `integrity_check=ok`). |
| Handoff Google Doc / PGE / provedores / CAR | SEM ACESSO / AUSENTES / SEM CHAVE / OFF | HTTP 401; `PGE*` ausentes; provedores sem chave (zero chamadas pagas); `COCKPIT_CAR_ENFORCE` desligado (não alterado); executores vazios por desenho. |

## Estado real — chat com continuidade contextual — 2026-10-11 (19:30)

| Item | Estado | Evidência |
|---|---|---|
| Contexto/projeto/intenção automáticos | IMPLEMENTADO | `resolve_project()` (explícito > catálogo > turno anterior > não identificado) + `project_resolution` na resposta e no plano; classificador de intenção permanece o determinístico existente. |
| Histórico e continuidade contextual | IMPLEMENTADO | `conversation_history()` — até 6 mensagens reais entram na interpretação com proveniência `conversation_history_local` e no Artifact `orchestration_plan`; teste prova que **nunca** entram em `context_provided` (provedor). |
| Persona principal e participantes | IMPLEMENTADO | `compose_agent_team()`: principal por pedido explícito > ordem canônica; participantes; composição rotulada como candidatura documental. |
| Colaboração entre personas | PROPOSTA DOCUMENTAL | Com ≥2 candidatos: passos mapeados a capacidades reais (`knowledge_research`, `review`, `project_consultation`), `status=not_executed`, bloqueio declarado (`PERSONA_EXECUTORS` vazio). Nada executado, nada atribuído. |
| Autoria validada | IMPLEMENTADO | `validate_agent_attribution()` em `/api/knowledge` e `/api/reviews`: agente canônico normalizado ou `humano:<nome>`; nome inventado → 400. `responsible_persona` segue nulo e `participating_personas` vazio sem executor. |
| Planejamento × geração, encaminhamento, aviso de ausência de executores | PRESERVADO | `planning_notice`/`capability_notice`, handoff `waiting_human` por clique, `agents_without_executor`. |
| Frontend | ATUALIZADO | Nota de persona com principal, candidatas e passos da colaboração via `textContent`. |
| Isolamento de testes | CORRIGIDO (defeito pré-existente) | `tests/test_api.py` gravava no banco canônico quando outro módulo importava `config.settings` antes; rebinding explícito de `db.settings` + banco temporário em qualquer ordem. 36 linhas de teste removidas do feed canônico (669→633); `integrity_check=ok`, 0 FK. |
| Suíte completa | **198 testes, 0 falhas (OK), 573,168 s** | `logs/suite-chat-continuidade-20261011-191213.log`; baseline era 175/0. `pip check` e `compileall` aprovados. |
| Migrations/dados | INALTERADOS (exceto remediação) | `0001`–`0004`; `chat_messages=20`, `jobs=2`, `runs=2`, `ecosystem_records=177`; nenhuma migration nova. |
| Servidor | DO USUÁRIO PRESERVADO | PID 2260 em 8790 serve código anterior (17:33) — precisa reinício humano para carregar o chat novo. Validação ao vivo desta execução na porta 8791 (iniciado e encerrado aqui): health 200, `/api/chat` 401, `/` → login 200. |
| Backups | CRIADOS | `backups/chat-continuidade-20261011-183903/` (cópia sqlite, pré-alterações) e `backups/pre-limpeza-feed-20261011-190550/` (pré-limpeza do feed). |
| Handoff Google Doc / PGE | SEM ACESSO / AUSENTES | HTTP 401 no Doc; `PGE*` não localizados; nada foi reescrito por isso. |

## Consolidação e ativação funcional — 2026-10-11 (18:15)

Missão `tarefa.md` (consolidar interface/núcleos, validar testes, conectar
capacidades reais com infraestrutura disponível). Terminal ficou fora do escopo.

### O que foi alterado

- `frontend/index.html` — removidos cartões de personas do topo (duplicavam o
  ECOSSISTEMA); indicadores viraram dados reais (fila de Jobs do núcleo, tasks
  hoje do feed, uptime); "Novo Job" virou **EXECUÇÕES** com criação + histórico;
  removidos CSS/variáveis órfãs de personas; legenda atualizada.
- `core/domain_store.py` — novas `list_jobs()` e `count_jobs_by_state()`
  (histórico/contagem canônicos, único núcleo de Jobs).
- `api/routes_jobs.py` — nova rota autenticada `GET /api/jobs` (histórico com
  filtro opcional por estado).
- `core/state.py` — `metrics.jobs_queue` agora é a fila real do núcleo (antes
  fixo 0 simulado); contagem protegida por try/except.
- `core/agents.py` — nova `project_consultation()`: consulta read-only do
  Diretor de Projetos aos registros reais (projetos catalogados, Jobs, estudos,
  revisões, agenda) sem inventar progresso.
- `api/routes_knowledge.py` — nova rota autenticada
  `GET /api/agents/diretor-de-projetos/projects`.
- `tests/test_api.py` — `jobs_queue` agora comparado à contagem real do núcleo
  (não mais fixo 0).
- `tests/test_operational_api.py` — novo teste de `GET /api/jobs`.
- `tests/test_agents.py` — novo teste da consulta do Diretor (sem invenção).
- Backups `.py.bak` obsoletos movidos para `backups/stale-baks-20261011-*`.

### Núcleo único por capacidade (verificado, sem duplicação)

- Personas: catálogo único `ecosystem_records`/`core/ecosystem.py` (mescla os 7
  visuais legados + BDS + canônico); chat só apresenta candidatas.
- Conhecimento/revisão/agenda: núcleos `knowledge.py`/`review.py`/`research.py`.
- Jobs: chat e formulário convergem no mesmo núcleo (`domain_store`/`operations`).
- Feed/terminal/RUNTIME: semânticas distintas, sem sobreposição de estado.
- Reclamão: núcleo `review.py` já cobre os 7 elementos exigidos (objeção,
  evidência, impacto, gravidade, confiança, proposta, estado) e impõe
  "opinião não gera objeção" — nenhuma alteração necessária.

### Verificações

- Suíte completa (pós-consolidação): **175 testes, OK (0 falhas), 740,971 s**
  — log `logs/suite-consolidacao-20261011-181046.log`.
- Testes focados dos novos recursos (Diretor + API de conhecimento): **17
  testes, OK, 133,035 s**.
- Banco: `integrity_check=ok`, 0 violações FK, migrations `0001`–`0004`
  intactas; **nenhuma migration nova**.
- Servidor do usuário (PID 2260, porta 8790) **preservado, não reiniciado**;
  nenhum processo externo encerrado, nenhuma chamada paga, nenhum `.env` lido.

### Pendências desta execução

1. Reiniciar Uvicorn (código Python novo em memória) + Ctrl+F5 para servir o
   novo HTML e as rotas `GET /api/jobs` e consulta do Diretor; a interface
   `FileResponse` já entrega o novo layout no disco, mas as rotas novas exigem
   o reinício. Validação visual autenticada segue pendente (sem credenciais).
2. 3 personas sem nome identificado: registros da 1ª importação BDS
   (`external_id` sha256, fonte `bds-backup-2026-10-05`) com conteúdo retido
   para revisão sensível; 2 extras ocultos como substituídos. Nenhum nome
   inventado; aguardam revisão humana.
3. Identidade: Estudioso aparece 2× (registro BDS ext_id=3 + contrato canônico);
   Reclamão e Diretor de Projetos são únicos. Unificação depende de decisão
   humana (nada sobrescrito).
4. Estudioso: estudos com fontes/versionamento prontos e validados; pesquisa
   externa recorrente permanece pausada sem provedor autorizado.
5. Terminal: execução de comandos arbitrários fora do escopo (etapa futura).

## Encerramento técnico e handoff — 2026-10-11 (17:17)

Execução de encerramento conforme `tarefa.md` atual (raiz do Drive). Nenhuma
linha de código, migration ou dado foi alterado; apenas verificação,
consolidação documental e validação ao vivo curta.

### Estado verificado nesta execução

| Item | Resultado |
|---|---|
| Suíte completa | **174 testes, 0 falhas (OK), 485,515 s** — `unittest discover -s tests -p 'test_*.py'` no `.venv` do projeto |
| Servidor no início | Sem listener em `127.0.0.1:8790`; nenhum processo Python ativo |
| Servidor na validação | Iniciado (Uvicorn PID 6328) e **encerrado** por esta execução; porta 8790 livre ao final |
| `GET /api/health` | 200 `{"data":{"status":"ok","version":"0.1.0"},"error":null}` |
| `GET /api/runtime` sem sessão | 401 (comportamento esperado) |
| `GET /` sem sessão | 200 após redirect ao login |
| Startup (log `logs/encerramento-20261011-171709.*.log`) | “Application startup complete”, 4 linhas, sem erros/tracebacks/duplicidade |
| Banco `data/cockpit.db` | SHA-256 `6B91C9055B4A9F7284F33B15225F489A87FAFD8008BFE2EDA7752AD5AD5C0A32` — **inalterado** antes/depois do startup |
| Integridade | `integrity_check=ok`, 0 violações FK |
| Migrations | `0001`–`0004` intactas com checksums documentados; **nenhuma migration nova ou editada** |
| Contagens | 20 chat_messages, 2 jobs, 2 runs, 12 events, 6 artifacts, 3 sessions, 177 ecosystem_records; knowledge/review/research com 0 linhas |
| `COCKPIT_CAR_ENFORCE` | Ausente do `.env` ⇒ CAR em fase de observação (imposição desligada por padrão) |
| Auth | `auth_is_configured=True`, bypass falso (verificado sem ler/exibir hash) |
| Executores | `PERSONA_EXECUTORS=0`, `SKILL_EXECUTORS=0` (documental por desenho) |
| PGE-001/PGE-002 | Continuam ausentes (varredura `PGE*` no Drive e STACK-NINJA sem arquivo; só há referências nos próprios relatórios do cockpit) |
| Handoff canônico Drive (`1CkDK-L66fb…`) | Inacessível sem autorização (HTTP 401 no export); conteúdo não incorporado |
| Processos externos / chamadas pagas | Nenhum encerrado; nenhum provedor chamado; nenhuma credencial lida |

### `tarefa.md` — situação atualizada

O `tarefa.md` da raiz do Drive **não é mais o arquivo truncado de 18.287 bytes**
citado nas execuções anteriores. O arquivo atual (4.651 bytes, modificado
11/10/2026 17:04) contém a missão de encerramento desta execução e está
**completo** (termina com frase integral na REGRA FINAL). A pendência do
truncamento fica, portanto, **resolvida quanto ao arquivo atual**: o conteúdo
ausente (resto da seção 15 e eventual seção 16+ do arquivo antigo) não foi
inventado e não tem mais destino conhecido — se ainda for necessário, o
usuário deve fornecê-lo explicitamente.

### Pendências que permanecem abertas

1. Validação visual autenticada da interface (painel RUNTIME) — requer
   navegador/sessão do usuário (Ctrl+F5 após reiniciar Uvicorn).
2. `PGE-001`/`PGE-002` — documentos canônicos não localizados em lugar nenhum.
3. Handoff canônico do Drive (Google Doc) — exige acesso autorizado.
4. `COCKPIT_CAR_ENFORCE` — preservado desligado; ativação exige observação
   prévia e decisão humana (ver riscos em `COCKPIT_HANDOFF.md`).
5. Lacunas da pesquisa (orçamento, concorrência de runs, retomada, revisão
   humana de findings) — não implementadas por especulação.
6. Adapter Context Core permanece stub; MCP 8788 sem listener.

## Missão de consolidação — CAR, portabilidade e documentação — 2026-10-11

Origem: `tarefa.md` na raiz do Drive. **O arquivo está truncado** (18.287 bytes;
termina no meio da frase da seção 15, "sem provocar es"). O trecho faltante não
foi inferido; o que se segue cobre apenas as seções 1–15 existentes.

### Implementado nesta execução

| Item | Estado | Evidência |
|---|---|---|
| Cockpit Adaptive Runtime (CAR) | IMPLEMENTADO | `core/car.py`: estados `normal/sob_pressao/critico`, histerese + dwell, escalonamento imediato/de-escalada lenta, limiares provisórios calibrados por percentis reais, `check()`/`admit()`/`release()`/`defer()`/`ready_tasks()`/`resume()`, log de decisões |
| Observação sem daemon | IMPLEMENTADO | sem threads nem loops; amostra com TTL (`snapshot()`), coletores Windows/POSIX com fallback; falha de coleta vira `erro:<Tipo>` e nunca derruba o produto |
| Detecção de servidor duplicado | IMPLEMENTADO | `claim_instance()`/`release_instance()` + lock `data/.cockpit_instance.json`; duplicidade é registrada no startup e **nenhum processo é encerrado** |
| Processos do Cockpit | IMPLEMENTADO | `register_owned_pid()` + filhos diretos (Toolhelp32/`/proc`); nenhum processo externo é listado ou controlado |
| Status do runtime | IMPLEMENTADO | `GET /api/runtime` (sessão, `?force=true`, `?probe=true`) + painel **RUNTIME** em `frontend/index.html` |
| Integração CAR ↔ pesquisa | IMPLEMENTADO | `POST /api/research/topics/{id}/run` consulta `check('optional')`; com imposição ativa e pressão responde **202 `deferred_resource_pressure`**; sem imposição o comportamento anterior é preservado |
| Proteção contra sobrescrita silenciosa | IMPLEMENTADO | `expected_version` opcional em `POST /api/knowledge/{id}/versions` → **409** em divergência (`core/knowledge.new_version`) |
| Diagnóstico de portabilidade | IMPLEMENTADO | `scripts/diagnose_env.py` (read-only, sem rede/credenciais) + `COCKPIT_PORTABILIDADE.md` |
| README do Cockpit | ATUALIZADO | `README.md` reescrito com visão, filosofia, arquitetura enxuta, CAR, execução sob demanda, limites, pesquisa/revisão, governança, portabilidade, estado real, pendências e critérios; instruções operacionais preservadas |
| README geral do Drive | ATUALIZADO (parcial) | `LEIA-ME.md` ganhou apenas “Resumo arquitetural” + item do histórico v1.1 |
| Testes novos | IMPLEMENTADO | `tests/test_car.py` (23), `tests/test_car_integration.py` (4), `tests/test_portability.py` (9), `tests/test_frontend_runtime.py` (5) |

### Auditoria das seções 8–12 (sem duplicação)

- **Estudioso** — pesquisa com frequência, prioridade, orçamento, deduplicação e
  histórico confirmados (`core/research.py`); tema nasce pausado e todo run é
  `blocked_no_provider`: nada roda sozinho. Lacunas ficam registradas como
  pendência (consumo efetivo de orçamento, controlador de concorrência de runs,
  retomada de run e revisão humana de findings), não foram fabricadas.
- **Reclamão** — objeção com 7 elementos, resposta com nota, consolidação,
  `max_rounds` 1–10 (padrão 3), escalonamento humano e histórico de divergência
  preservado (`core/review.py`). Nenhuma skill duplicada.
- **Diretor de Projetos** — contrato canônico único `diretor-de-projetos`
  (`planned_not_registered`); sem duplicata.
- **Colaboração** — fluxo Pesquisa→Evidência→Revisão→Contestação→Consolidação
  presente com limite de rodadas; nenhuma execução infinita entre agentes.
- **Execução simulada** — `PERSONA_EXECUTORS`/`SKILL_EXECUTORS` continuam vazios;
  nenhum caminho executa prompt BDS nem atribui texto a persona.

### Verificações

- Suíte completa: **174 testes, 0 falhas** (rodada final desta execução);
  baseline antes das alterações era 133 testes/0 falhas em 463,9 s.
- `pip check`: `No broken requirements found`. `compileall`: aprovado.
- Banco canônico lido em modo somente leitura: `integrity_check=ok`, migrations
  `0001`–`0004` intactas; **nenhuma migration nova foi criada ou aplicada**.
- Nenhum servidor ficou em execução ao final (o teste ao vivo foi encerrado por
  esta execução), nenhum processo externo encerrado, nenhuma chamada paga, nenhuma
  credencial lida, nenhum arquivo apagado ou movido no Drive.
- Ambiente medido pelo diagnóstico: Windows 10 x64, Intel Celeron 3855U
  1,60 GHz (2 lógicos), 3,92 GB RAM, 101,9 GB livres de 237,8 GB.

### Validação ao vivo (após a suíte)

- Servidor iniciado por esta execução em `127.0.0.1:8790` (lock `data/.cockpit_instance.json`
  gravado sem duplicidade), depois **encerrado** — a porta está livre ao final.
- `GET /api/health` → **200** `{"status":"ok"}`; `GET /api/runtime` sem sessão → **401**;
  `GET /` sem sessão → **303 → /login (200)** (página de login, como esperado).
- Log de startup sem erros/tracebacks; nenhum aviso de duplicidade (a porta estava livre).
- SHA-256 do banco **inalterado** pelo startup: `6B91C9055B4A9F7284F33B15225F489A87FAFD8008BFE2EDA7752AD5AD5C0A32`
  (igual ao backup `backups/pre-live-20261011-165558/`); migrations `0001`–`0004`
  com os checksums documentados.
- A HTML autenticada (painel RUNTIME) **não** pôde ser conferida sem credenciais;
  segue como pendência humana (Ctrl+F5 após reiniciar).

### Pendências desta execução

1. `tarefa.md` truncado — falta o restante da seção 15 e eventual seção 16+.
2. `PGE-001`/`PGE-002` não localizados em `.md` da árvore (buscas em
   `STACK-NINJA`, `STACK` e raiz); regras não foram reescritas por isso.
3. Handoff canônico do Drive (Google Doc `1CkDK-L66fb…`) não pôde ser lido
   nesta sessão (exige API do Docs); `COCKPIT_PORTABILIDADE.md` e README
   contêm o conteúdo destinado a ele.
4. Validação visual autenticada da interface (painel RUNTIME) continua pendente:
   reiniciar Uvicorn e usar Ctrl+F5.
5. Outros READMEs do Drive não foram tocados (sem impacto direto comprovado).

## Estado revalidado — executor local — 2026-10-11

- Executor integrado aos Jobs/Runs/Events/Artifacts existentes; sem migration ou banco paralelo. Nivel 0 (classificacao local), nivel 1 (simulacao sem execucao) e nivel 2 somente para auditoria SQLite read-only explicitamente confirmada.
- Fila duravel usa estados normais `routed/running`; checkpoints e resultados sao Artifacts, com Events atomicos. Uma tentativa, timeout maximo 10 s, sem retries. Startup recupera apenas tools idempotentes allowlisted; ambiguidades requerem revisao humana.
- Nenhuma persona/skill possui executor especializado; definicoes BDS continuam documentais e prompts nao sao executados. Conectores Perplexity/OpenRouter permanecem sem configuracao live e nenhum provedor foi chamado.
- Context Core REST local respondeu HTTP 200, mas o Cockpit nao tem URL/token configurados e nao leu registros. MCP 8788 indisponivel.
- Testes: 84 aprovados, 0 falhas/ignorados; `pip check`, `compileall` e parse JS aprovados. Banco canonico: `integrity_check=ok`, zero erros FK, migrations 0001–0003; 0 Jobs/Runs antes da validacao funcional isolada.
- Backup pre-start: `backups/pre-executor-20261011-095916/cockpit.db` (integridade ok, zero FKs).
- Live: PID 4976 ocupa 127.0.0.1:8790; health 200 e rota chat sem sessao 401. O servidor carregado nao expõe as rotas/HTML novos; a inicializacao da versao atual conflitou com a porta e encerrou. Processo existente preservado; precisa reinicio humano. Sem validacao visual autenticada.

## Resumo executivo

O Cockpit existe como MVP executável; não é um projeto novo. A árvore acima é a implementação mais avançada e consistente localizada. Ela contém FastAPI, interface responsiva preservada, WebSocket, SQLite em WAL, chat mock/echo, feed, personas, métricas e terminal local com allowlist. A versão `02 - Projetos técnicos/cockpit-backend` é anterior e não deve ser fundida automaticamente. `STACK/PROJETOS/cockpit` contém documentação, não uma implementação superior.

Nesta continuidade foram implementados e testados, ainda sem ativação no startup: migrations com checksum, persistência transacional do domínio, roteamento persistido, conectores Perplexity/OpenRouter sob mocks, handoff manual, importação idempotente e primitivas de sessão/CSRF/Origin. O banco operacional, as configurações, as rotas e a interface não foram alterados.

## Inventário e evidências

| Item | Estado | Evidência |
|---|---|---|
| Aplicação | IMPLEMENTADO | `main.py:20-69`; routers em `api/`; importação e TestClient aprovados. |
| Interface | PARCIAL | `frontend/index.html:106-159,195-356`; responsiva e integrada ao MVP, sem login/Jobs/Runs/handoff/import. |
| SQLite | PARCIAL | `core/db.py:38-118`; WAL, DDL inline e tabelas `feed_events`, `chat_messages`, `terminal_lines`, `personas`. |
| Migrations versionadas | PARCIAL | `core/migrations.py` e `migrations/0001*`, `0002*` passaram adoção/checksum/idempotência em temporários; não estão ligadas ao startup. |
| Autenticação | PARCIAL | `security/auth.py` implementa sessão opaca, hashes, TTL, CSRF, Origin e throttling; login/FastAPI/Argon2id não ativados. |
| CORS/Origin | DIVERGENTE | `config/settings.py:15,42-46` aceita `*` por padrão e `main.py:45-50` habilita credenciais. |
| WebSocket seguro | AUSENTE | `api/ws.py:11-24` aceita conexão sem sessão ou validação de Origin. |
| Entidades Job/Run/Event/Artifact | PARCIAL | `core/domain_store.py` persiste o domínio em schema migrado; falta API e ativação operacional. |
| Máquina de estados | PARCIAL | `core/workflow.py` + `core/domain_store.py`; transições e Event único na mesma transação, append-only testado. |
| Roteamento determinístico | PARCIAL | `core/routing.py` e `core/operations.py`; decisão Artifact e Run real testados, sem rota HTTP. |
| Perplexity | PARCIAL | `connectors/perplexity.py` e `core/provider_service.py`; 200/429 e persistência testados por mock, sem chamada live. |
| OpenRouter | PARCIAL | `connectors/openrouter.py`; allowlist pré-HTTP e resposta sem métricas testadas por mock. |
| Browser handoff | PARCIAL/DIVERGENTE | Serviço manual novo em `core/operations.py`; automação legada Playwright ainda existe desligada e divergente. |
| Manual import | PARCIAL | Serviço idempotente, hash, URL e estados testados em `core/operations.py`; falta rota/UI. |
| Context Core adapter | AUSENTE | `core/adapters/context_core.py:10-13` lança `NotImplementedError`. |
| DSH adapter | AUSENTE | `core/adapters/dsh.py:10-13` lança `NotImplementedError`. |
| Testes | IMPLEMENTADO/PARCIAL | 42/42 aprovados; incluem auth primitives, migrations, domínio, routing, conectores mockados, handoff/import e regressão do MVP. |

## Persistência e integridade

- Banco operacional existente: `data/cockpit.db`.
- Auditoria de leitura anterior nesta mesma data: `integrity_check=ok`, zero violações de FK, 14 mensagens, 621 eventos de feed, 7 personas e 3 linhas de terminal.
- O banco não foi aberto para escrita nem modificado nesta continuidade.
- Os testes de API usam banco temporário, conforme `tests/test_api.py:13-18`.
- O schema dessas tabelas existe em migrations testadas, mas elas não foram aplicadas ao banco operacional.

## Rotas existentes

- `GET /api/health`, `/api/state`, `/api/personas`, `/api/metrics`.
- `GET/POST /api/feed`.
- `GET/POST /api/chat`.
- `GET /api/terminal/history` e `POST /api/terminal/run`.
- `WS /ws/state`.

Não existem rotas de login/logout, Jobs/Runs, handoff ou importação manual.

## Versões relacionadas

- Principal: `STACK-NINJA/02-PROJETOS/cockpit` — mais completa e com testes aprovados.
- Anterior: `02 - Projetos técnicos/cockpit-backend` — smoke test bloqueou por mais de 90 segundos e foi interrompido; não substituir a principal.
- Documentação: `STACK/PROJETOS/cockpit/BRIEFING-CANONICO.md` — histórico arquitetural, sem código equivalente.
- Mockup: `cockpit-fase2-sim.html` — referência visual; não substituir por dashboard genérico.

## Verificações executadas

| Verificação | Resultado |
|---|---|
| `python -m unittest discover -s tests -p 'test_*.py' -v` | 42 aprovados, 0 falhas, 48,617 s na rodada final |
| Testes existentes da API | 8 aprovados dentro da suíte total |
| Novos testes desta continuidade | 34 aprovados; 8 testes originais preservados |
| `python -m pip check` | `No broken requirements found` |
| Banco principal | Não alterado; integridade comprovada na auditoria anterior da mesma data |
| Perplexity/OpenRouter live | Não executado; nenhuma chamada paga |

## Alterações realizadas

- Criado `core/workflow.py`: estados, transições permitidas e contratos Job/Run/Event/Artifact.
- Criado `core/routing.py`: ruleset v1 determinístico e auditável, sem I/O.
- Criados `tests/test_workflow.py` e `tests/test_routing.py`.
- Criados runner e migrations `0001`/`0002`, repositório de domínio e serviços operacionais.
- Criados conectores Perplexity/OpenRouter e serviço de execução, testados somente com `httpx.MockTransport`.
- Criadas primitivas de autenticação; Argon2/login/rotas permanecem bloqueados pela dependência ausente e pela não ativação do schema.
- Criado backup consistente `backups/pre-domain-20261010-1615/cockpit.db` (SHA-256 `64752667ABD592697FBD447C4F64FF446C6DB430382AAECC296BF5A8AD3920E4`).
- Criados os cinco relatórios canônicos na raiz deste projeto.

Todas são adições reversíveis. Nenhuma migration, dependência, credencial, serviço ou dado operacional foi alterado.

## Atualização de chat — 2026-10-11

- UI: título **Chat do Cockpit**, placeholder conversacional, sem o Orquestrador como autor visível.
- Mensagens casuais: histórico persistido, aviso honesto, sem Job/Run. Pedidos acionáveis: planejamento auditável existente; não é apresentado como resposta especializada.
- Personas candidatas são somente documentais. Os registros `PERSONA_EXECUTORS`/`SKILL_EXECUTORS` estão vazios; autoria especializada e multipersona continuam indisponíveis. Não há execução de prompts BDS.
- A execução externa permanece por ação explícita do usuário e não foi chamada nesta atualização.
- Evidência final: suíte `unittest` 86 aprovados, 0 falhas, 0 ignorados; 8 testes focados após última alteração também aprovados. `compileall` e `pip check` aprovados.
- Provedores não configurados e executores de personas/skills inexistentes. Respostas especializadas/multipersona permanecem indisponíveis; planejamento é distinto de resposta.
- DB read-only: íntegro, sem violações FK. Porta 8790 health 200; sem sessão, a raiz redireciona ao login e `/api/chat` responde 401. Interface autenticada/build atual não foi visualmente verificada; se a sessão aberta mostrar versão anterior, reiniciar Uvicorn e fazer Ctrl+F5. Nenhum dado canônico foi alterado nesta tarefa.

## Estado real — personas, biblioteca e colaboração — 2026-10-11

| Item | Estado | Evidência |
|---|---|---|
| Estudioso | HERANÇA + CANÔNICO | linha `estudioso` em `personas` e registro BDS `ESTUDIOSO` preservados; contrato canônico novo em `core/agents.py` (`documentary_no_executor`). |
| Reclamão | CRIADO (não existia) | varredura de 5.595 arquivos sem ocorrência; contrato canônico novo, `documentary_no_executor`. |
| Diretor de Projetos | CRIADO (não existia) | contrato canônico novo, `planned_not_registered`. |
| Migration 0004 | IMPLEMENTADO | 8 tabelas de conhecimento/revisão/agenda; aditiva; checksum `023c1aec…b2495`; 0001–0003 intactas. |
| Biblioteca canônica | IMPLEMENTADO | `core/knowledge.py` + rotas `/api/knowledge`: slug canônico, fontes obrigatórias, versionamento, estados. |
| Revisão Estudioso↔Reclamão | IMPLEMENTADO | `core/review.py` + `/api/reviews`: objeção em 7 elementos, resposta, consolidação, limite de rodadas e escalonamento. |
| Agenda de pesquisa recorrente | IMPLEMENTADO/INERTE | `core/research.py` + `/api/research`: tema nasce pausado, sem disparo automático, execução bloqueada sem provedor/autorização. |
| Seleção contextual de persona | IMPLEMENTADO | `select_agents_for_context()`; chat expõe `candidate_agents` e `agents_without_executor`. |
| Executores reais | AUSENTE (proposital) | `PERSONA_EXECUTORS`/`SKILL_EXECUTORS` vazios; nenhum agente operacional; nenhum texto atribuído a persona. |
| Interface CONHECIMENTO | IMPLEMENTADO | painel com Estudos, Revisões críticas, Agenda e Agentes em `frontend/index.html`, reutilizando `.ecosystem-*`. |
| Testes | IMPLEMENTADO | 133 aprovados, 0 falhas, 0 ignorados (410,706 s); `pip check` e `compileall` aprovados; parse JS aprovado. |
| Banco canônico | ALTERADO (aditivo) | migration 0004 aplicada no startup; 16 registros canônicos inseridos; `integrity_check=ok`, 0 violações FK; tabelas novas com 0 linhas. |
| Servidor | ATIVO | Uvicorn PID 1176 em `127.0.0.1:8790`; verificação autenticada 14/14 OK. |
| Backup | CRIADO | `backups/pre-colaboracao-20261011-131347/` (banco, código e `index.html`). |

- Catálogo do Ecossistema após o seed: 177 registros (108 memórias, 12 personas, 42 skills, 13 ferramentas, 2 MCPs), dos quais 16 são canônicos (`source='cockpit-canonical'`: 3 personas + 13 skills). A API de Ecossistema mostra 16 personas e 35 skills, mantendo 10 registros substituídos ocultos sem exclusão.
- Nada foi apagado, substituído ou movido no Drive; a escrita persistente se limitou à migration 0004 e ao seed idempotente no `data/cockpit.db`.
