# Cockpit — retorno de execução dos blocos 2 a 8

Data: 2026-10-10  
Repositório canônico: `STACK-NINJA/02-PROJETOS/cockpit`  
Especificação consultada: `retorno.md` no Google Drive, ID `12LoxxSBVLmOxZF0ysc4FIhpMbWb1WYBB`.

## FASE 2 LIVE — homologação do conhecimento, proveniência e validação final — retorno — 2026-10-12

Missão: `tarefa.md` ("FASE 2 LIVE — Homologação do Conhecimento, Revisão de
Proveniência e Validação Final"). Estado final: **CONCLUÍDO** (decisões
humanas pendentes). Relatório completo:
`STACK-NINJA/00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_RELATORIO_HOMOLOGACAO.md`.

### O que foi feito

- **Classificação individual e justificada dos 186 candidatos** →
  **A=16 · B=34 · C=136**, com rubrica e precedência documentadas e evidência
  por linha (origem, SHA-256, autoria, gatilho de quarentena, alvo de
  supersessão). Confronto candidatos × banco: 186/186 hash idêntico (0
  divergências reais; 3 suspeitas = colisão de `external_id` entre categorias,
  falsos positivos explicados).
- **Quarentena revisada sem liberar nada**: 38/38 com causa exata, fonte e
  SHA-256 conferidos, relações e histórico de versões; 0 erros técnicos
  comprovados para correção automática; conteúdo retido não reproduzido.
- **Supersessões reconstruídas documentalmente**: 10/10 cadeias
  original→vigente com motivo mecânico verificado na fonte; 7 verificações
  (0 circulares, 0 autorrelações, 0 órfãs, 0 idênticos, 0 escopo, 0 links
  quebrados, 1 achado de identidade documentado e preservado).
- **Política de autoria**: auditoria de `knowledge_items`/`create_item`/
  `author_agent`, matriz dos 5 tipos (0/16/9/161/0) e proposta ADITIVA
  (migração `0006` em rascunho + mudanças de núcleo + 6 testes) —
  **apresentada, não executada**, sem nenhum valor de autoria fictício.
- **Módulo Conhecimento validado e corrigido**: 8 confirmações (tabelas por
  área, kinds, obrigatoriedade, versionamento, proveniência na UI, revisão
  humana, recuperação, diferenciação homologado×candidato) + 6 correções de
  consulta/contagem/exibição/navegação; 4 anomalias de escrita fora de escopo
  documentadas; 0 materiais artificiais criados.
- **Testes**: 26 novos (idempotência da classificação, gerador
  somente-leitura, invariantes 186/38/10/20, hashes de proveniência, controle
  de autoria, zero promoção indevida, jobs históricos, orquestrador sem
  personas ativas, endpoints protegidos, regressão das correções); suíte
  completa ****254 testes, 0 falhas (OK)**** (`logs/full-suite-20261012-homologacao.txt`).

### Estado final

Banco `integrity_check=ok` (186 registros, migrations 0001–0005,
`knowledge_items=0`, históricos intactos); backup pré-missão
`backups/pre-homologacao-20261012-161552.sqlite3`; UI intacta;
`COCKPIT_CAR_ENFORCE` intocado; zero operações externas; nenhuma fonte,
registro ou histórico alterado.

### Pendências (decisão humana)

Autoria (161+9) · revisão dos 38 retidos · destino dos 10 superados ·
homologação dos 16 classe A · autorizar migração `0006`. ~~Reiniciar
servidor~~ **resolvido (autorizado)**: backup prévio integrity=ok, PID 5084 →
novo servidor **PID 5668** na 8790 (boot OK, health 200) com as 6 correções
ativas.

---

## FASE 2 LIVE — reindexação integral, auditoria e consolidação — retorno — 2026-10-12

Missão: `tarefa.md` ("FASE 2 LIVE — Reindexação integral, auditoria de
integridade e consolidação do ecossistema"). Estado final: **CONCLUÍDO**
(pendências humanas). Relatório completo:
`STACK-NINJA/00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_RELATORIO_FASE2.md`.

### O que foi feito

- **Diagnóstico completo** das 10 perguntas da seção 4 da tarefa: a rotina
  anterior era a importação original (`bds_catalog_import`, 11/10 04:20) para
  `ecosystem_records`; não havia rotina incremental nem registro de execuções.
- **Motor de reindexação novo e idempotente** (`core/reindex.py` +
  `core/source_scan.py` + `scripts/reindex_ecosystem.py`): identidade UUID5
  por (fonte, identificador externo) — arquivos identificados pelo caminho
  relativo, nunca pelo nome; SHA-256 por arquivo e por conteúdo; versionamento
  (`ecosystem_record_versions`), supersessão preservando a linha antiga,
  duplicatas de conteúdo marcando proveniências (`duplicate_content_of`),
  quarentena lógica com conteúdo retido e relatório por execução
  (`ecosystem_import_runs`). Migração `0005` **aditiva**.
- **3 execuções de produção com backup verificável antes de cada uma**
  (`backups/pre-reindex-20261012-*.sqlite3`): 1ª defeituosa → reparada byte a
  byte contra o próprio backup (149 linhas restauradas, diff 0 campos); 2ª
  consolidou o acervo novo (177 → **186**: +5 espelho, +3 briefings de
  projeto, +1 REGRAS.md, rejeitados 0, duplicatas 0); 3ª provou idempotência
  (**todas as fontes: 0 inseridos, 0 atualizados, 0 versões novas**).
- **3 defeitos encontrados e corrigidos**: (1) 1ª execução nulou `content_text`
  dos canônicos e marcou 149 `needs_human_review` espúrios (corrigido +
  reparo); (2) revisão forçada para registros sem nome (removida — é o formato
  das memórias BDS; ambiguidade real vem do produtor); (3) auto-superposição
  `previous == external` em memórias sensíveis quebrava a idempotência
  (guard igual ao do import original + teste regressivo).
- **Conhecimento**: causa do "0 materiais canônicos" esclarecida (fluxo
  distinto do catálogo; `create_item` exige `author_agent`; política proíbe
  autoria inventada). API passou a devolver `policy`/`notice` e o frontend
  explica o zero. 186 candidatos registrados com origem, SHA-256 e status de
  autoria em `STACK-NINJA/00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_CANDIDATOS_CONHECIMENTO.md`
  — **nenhum promovido, nenhuma autoria atribuída**.
- **Personas/orquestrador**: 14 casos de seleção (que devem e que não devem)
  executados com evidência em `cockpit/logs/audit-personas-orchestrator-20261012.txt`;
  todos os candidatos vêm do catálogo, `PERSONA_EXECUTORS=[]`, nenhum com
  saída autoral. Divergência 12 × 16 resolvida (16 registros = 12 catálogo −
  3 ocultos `superseded_by` + 7 painel; 12 cartões = agrupamento por nome
  normalizado); agora **17 registros · 13 cartões** (+1 do arquivo espelhado).

### Resultados e evidências

- Catálogo: **186 registros** (5 fontes), `integrity_check=ok`, 0 FK,
  23 tabelas; feed 624, jobs 2, runs 2, events 12, artifacts 6, chat 20
  preservados; `COCKPIT_CAR_ENFORCE` intocado; zero chamadas externas.
- Testes: suíte completa **228 testes, 0 falhas (OK)** (`logs/full-suite-20261012-final.txt`; 1ª execução: 1 expectativa defasada de snapshot corrigida — C.3.5 do relatório);
  novos 17 testes de reindex + 1 de notice, todos OK; `pip check` OK.
- Relatórios JSON: `cockpit/logs/reindex-20261012-024319.json` e
  `…-025219.json` (inventário com SHA-256, fingerprints, contagens).

### Pendências humanas

1. ~~Reiniciar o servidor (PID 7628)~~ — **RESOLVIDO em 12/10/2026 12:47**
   (autorizado pelo usuário): PID 7628 encerrado, backup pré-troca
   `backups/pre-server-restart-20261012-154503.sqlite3` (integrity ok, 186
   catálogo), servidor relançado na 8790 — **novo PID 5084** (pai 5872),
   boot limpo, health 200, raiz 303→login, rotas protegidas 401 sem sessão e
   já em uso autenticado com o Python novo (`logs/server-8790-20261012-124714.*.log`).
2. Decisão sobre autoria dos candidatos à biblioteca canônica (painel fica 0
   até a decisão).
3. Decisão sobre os 38 registros em quarentena e os 10 superados pela fonte.
4. `01.5-Arquitetura` segue inventariado, não indexado (categoria `context`
   indisponível na API).

---

## FASE 2 LIVE — validação funcional e correções — retorno — 2026-10-11 (20:45)

Missão: `tarefa.md` (atualizado 19:29) — consolidar a Fase 2 LIVE, corrigir
problemas observados no runtime e validar ponta a ponta, preservando
arquitetura, dados, interface e funcionalidades.

### Problemas confirmados e corrigidos

- **A — seleção de personas zerada**: a mensagem real do usuário ("Analise o
  estado atual do Cockpit e apresente o plano de verificação…") retornava
  `[] / None / principal=None` (evidência empírica reproduzida antes da
  correção) e o chat exibia "nenhuma persona compatível encontrada no
  catálogo". Causa: os sinais de candidatura não cobriam análise, verificação
  nem "estado atual". Corrigido em `core/agents.py`
  (`_CRITIQUE_SIGNALS` += análise/verificação; `_PROJECT_SIGNALS` += estado
  atual) e `core/orchestrator.py` (padrão do candidato AUDITOR idem),
  alinhado às missões documentadas de RECLAMÃO e DIRETOR DE PROJETOS —
  seleção segue determinística; mensagem casual continua sem candidatos.
- **B — JSON/Markdown bruto nos registros**: personas guardam `content_text`
  como JSON de configuração (`{"active":…,"content":"# …"}`), exibido cru.
  `frontend/index.html` ganhou `unwrapRecordContent()` (exibe o campo
  `content` legível), `presentableContent()` (Markdown higienizado só na
  apresentação) e `config_original` em "Detalhes técnicos" (JSON original
  íntegro). Conteúdo retido continua não exibido; sem innerHTML; banco
  intocado.
- **E — "duplicidade não verificada nesta leitura"**: a UI nunca enviava
  `probe=true` (a leitura era permanentemente "não verificada") e o probe
  ingênuo marcaria a própria instância como duplica. Frontend passou a pedir
  `?probe=true`; `api/routes_runtime.py` devolve `relation` honesto
  (`self`/`other_instance`/`none`/`unknown`) a partir da instância
  reivindicada no CAR.
- **Poluição residual do feed**: 9 linhas de teste (`QA`/`um`/`dois`/`tres`,
  execuções de 10:52, 18:53 e 19:01 — mesma falha de isolamento do
  `tests/test_api.py`) removidas por assinatura exata com conferência de
  contagem (`scripts/_cleanup_feed_test_pollution2.py`): 633 → 624, todos
  `source=sim`, `integrity_check=ok`, 0 FK.

### Verificado como comportamento esperado (não alterado)

2 jobs + 2 runs em `waiting_human` (`started_at=NULL`, handoff local,
`approval_required=true`, `external_calls_made=false`); simulações do feed
identificadas (`source=sim` no seed e no adapter mock via WS); concorrência 1
(3,92 GiB < 4 GiB → `base_concurrency=1`, limiares provisórios); 6 personas
sem nome (3 `superseded_import_record` + 3 `sensitive_domain_review`), todas
`review_required` com conteúdo retido e selo "Revisão necessária" — fontes
`bds-backup-2026-10-05` preservadas (capturas registravam o estado anterior
16 personas/35 skills/3 sem nome; hoje: 12 personas/42 skills após a
importação normalizadora de 11/10 01:20). **Não implementado (declarado)**:
indexação de conhecimento (`knowledge_items=0` — candidatos identificados:
108 memórias BDS, 3 missões canônicas, docs do repo; criar itens exige
autoria verificável, decisão humana pendente) e o encerramento do uvicorn
duplicado PID 4072 (inerte, 3,3 MB, sem porta — exige autorização humana).

### Testes e evidências

- `tests/test_fase2_e2e.py` (novo): **12/12 OK** — E2E controlado em banco
  temporário: chat → RECLAMÃO principal + DIRETOR participante + colaboração
  `not_executed` + candidato AUDITOR → Job `waiting_human` → run
  `browser_handoff` → trilha de eventos/artefatos → releitura persistente →
  replay idempotente → fila e feed coerentes → zero chamadas externas; probe
  `relation` (4 casos); marcadores de frontend.
- **Suíte completa: 210 testes, 0 falhas (OK), 620,610 s** —
  `logs/suite-fase2-final-20261011-201658.log` (baseline 198; a 1ª execução
  `suite-fase2-live-20261011-200508.log` teve 1 falha de literal de teste
  desatualizado em `test_frontend_ecosystem`, ajustado e reexecutado
  23/23 OK). `pip check` OK; `py_compile` e `node --check` do JS OK.
- Ao vivo com código novo (porta 8791, iniciado e encerrado por esta
  execução): startup limpo, health 200, `/api/chat` 401, `/` → login 200;
  servidor do usuário (8790, PID 2036) preservado; banco final
  `integrity_check=ok`, 0 FK, migrations `0001`–`0004`, chat 20, jobs 2,
  runs 2, events 12, artifacts 6, catálogo 177, feed 624 sem poluição.
- Backup pré-alteração: `backups/fase2-live-20261011-195356/` (5 arquivos +
  sqlite com `integrity_check=ok`).

### Pendências

Reinício humano do Uvicorn (8790 serve o código de 19:27, anterior às
correções) + validação visual autenticada; autorização para encerrar o PID
4072; Google Doc 401; PGE ausentes; provedores sem chave; executores vazios
por desenho; `COCKPIT_CAR_ENFORCE` desligado (não alterado); indexação de
conhecimento e calibração do CAR pendentes de decisão/amostras.

## Chat do Cockpit — continuidade contextual, projeto automático e time de personas — retorno — 2026-10-11 (19:30)

Missão: `tarefa.md` (raiz do Drive), seção 2 — evoluir o Chat do Cockpit para
conversação natural, com o Orquestrador nos bastidores.

### Estado anterior verificado (não repetido)

- Execução concorrente detectada ao iniciar (18:26) e **preservada**: testes
  `tests.test_agents/test_knowledge_api` em andamento (PIDs 5260/4880), suíte
  da consolidação concluída às 18:23 (`175 testes, OK`,
  `logs/suite-consolidacao-20261011-181046.log`) e documentos canônicos
  atualizados por ela às 18:28–18:31. Só iniciei alterações depois que a
  outra execução encerrou a documentação.
- Handoff canônico do Google Doc (`1CkDK-L66fb…`): continua HTTP 401; conteúdo
  não incorporado. `PGE-001`/`PGE-002`: continuam ausentes; nenhuma regra foi
  reescrita. Servidores do usuário (PIDs 2260 na porta 8790, 1440 duplicado
  desde 17:33) foram preservados; nenhum processo externo encerrado.
- Baseline de testes antes das alterações: 175 aprovados, 0 falhas.

### O que o chat já tinha (verificado no código, não presumido)

Persistência/idempotência por conversa e mensagem, separação
planejamento × geração (`planning_notice`/`capability_notice`), encaminhamento
só com autorização (handoff `waiting_human` + clique), aviso de ausência de
executores e seleção de candidatas por sinal de palavras-chave.

### Alterações implementadas (adições reversíveis)

| Item da missão | Implementação |
|---|---|
| 1 — contexto/projeto/intenção automáticos | `resolve_project()` + `prior_project_in_conversation()` (`core/orchestrator.py`): projeto identificado por ordem determinística — explícito do usuário > nome de projeto do catálogo citado na mensagem > projeto do turno anterior da mesma conversa > não identificado. `project_resolution` com fonte é exposto na resposta e gravado no plano. |
| 7 — histórico e continuidade contextual | `conversation_history()`: as últimas até 6 mensagens reais da conversa entram na interpretação com proveniência `conversation_history_local`, são persistidas no Artifact `orchestration_plan` e declaradas na resposta (`conversation_context_considered`). **Teste garante que esse histórico nunca entra em `context_provided`** (contexto de provedor segue exigindo autorização explícita). |
| 2 — persona principal e participantes pelas capacidades reais | `compose_agent_team()` (`core/agents.py`): principal (pedido explícito primeiro, depois ordem canônica) + participantes, tudo determinístico e rotulado como candidatura documental. |
| 6 — colaboração entre personas | Com dois ou mais candidatos é proposta uma colaboração **documental** (`mode=documentary_proposal`, `status=not_executed`) com passos mapeados para capacidades reais já existentes: `knowledge_research` (biblioteca/agenda), `review` (objeção fundamentada) e `project_consultation` (consulta read-only do Diretor). Nada é executado e o bloqueio real (`PERSONA_EXECUTORS` vazio) é declarado. |
| 5 — autoria identificada só por quem participou efetivamente | `responsible_persona` segue nulo e `participating_personas` segue vazio sem executor. Novo: `validate_agent_attribution()` valida autorias em `/api/knowledge` (criar/versionar), `/api/reviews` (abrir, responder): só id/nome de agente canônico (normalizado) ou autoria humana explicitamente marcada `humano:<nome>`; nome inventado → 400. |
| 3–4, 8 — planejamento × geração, encaminhamento, transparência | Preservados sem alteração de comportamento; `_truthful_summary` agora menciona candidatura principal e proposta de colaboração sem afirmar autoria. |
| Frontend | `addPersonaSelectionNote` renderiza principal, candidatas e passos da colaboração via `textContent` (sem innerHTML), com o aviso de ausência de executor. |

### Defeito pré-existente encontrado e corrigido (isolamento de testes)

`tests/test_api.py` dependia de ser o **primeiro** importador de
`config.settings` para apontar o banco temporário; em ordem alfabética de
descoberta os módulos novos `test_agent_attribution`/`test_chat_continuity`
passaram a importar antes, e o teste de escrita paralela de feed gravava no
**banco canônico**. Evidência: 36 linhas `paralelo-N` no feed canônico (12 da
execução da manhã, 10:52 local; 12 às 18:53 e 12 às 19:01 desta execução,
antes da correção). Correção: `tests/test_api.py` agora fixa
`db.settings` no objeto temporário (rebinding explícito de `core.db`) e fecha
conexão cacheda, garantindo banco temporário em qualquer ordem de import.
Remediação: remoção exata das 36 linhas de teste (`who='P'`, `source='user'`);
feed foi de 669 para 633 eventos legítimos; `integrity_check=ok`, 0 FK.
Backups: `backups/chat-continuidade-20261011-183903/` (cópia via API sqlite,
pré-alterações) e `backups/pre-limpeza-feed-20261011-190550/` (pré-limpeza).

### Arquivos modificados/criados

- Novos: `tests/test_chat_continuity.py` (15 testes),
  `tests/test_agent_attribution.py` (7 testes),
  `scripts/_audit_feed_pollution.py`, `scripts/_cleanup_feed_test_pollution.py`,
  `scripts/_audit_final_readonly.py`.
- Alterados: `core/orchestrator.py`, `core/agents.py`, `api/routes_chat.py`,
  `api/routes_knowledge.py`, `frontend/index.html`, `tests/test_api.py`.
- Backups em `backups/chat-continuidade-*` e `backups/pre-limpeza-feed-*`.
- **Nenhuma migration nova; nenhum dado canônico alterado além da remediação
  acima; nenhum arquivo movido ou apagado do Drive.**

### Testes e verificações

- Lote focado (10 módulos): **77 testes, 0 falhas** (305,546 s).
- Suíte completa (`unittest discover -s tests -p 'test_*.py' -v`):
  **198 testes, 0 falhas (OK), 573,168 s**
  (`logs/suite-chat-continuidade-20261011-191213.log`).
- `pip check`: `No broken requirements found`. `compileall`: aprovado.
  Parse JS inline (`node --check`) coberto por `test_frontend_ecosystem`.
- Banco canônico somente leitura ao final: `integrity_check=ok`, 0 FK,
  migrations `0001`–`0004`; `chat_messages=20`, `jobs=2`, `runs=2`,
  `ecosystem_records=177` inalterados; feed 633 sem linhas de teste.
- Validação ao vivo (servidor iniciado e encerrado por esta execução na porta
  **8791**, para não tocar no servidor do usuário): startup limpo, health 200,
  `/api/chat` 401 sem sessão, `/` 303 → login 200; CAR registrou duplicidade
  com o PID 2260 e **nenhum processo foi encerrado**. Porta 8790 segue com o
  servidor do usuário; 8791 livre ao final.

### Pendências

1. O servidor do usuário (PID 2260, iniciado 17:33) serve código anterior:
   para carregar o chat novo e as rotas da execução das 18:15 é preciso
   reiniciá-lo (comando no `COCKPIT_HANDOFF.md`) e autenticar com Ctrl+F5.
2. Validação visual autenticada (personas, colaboração, projeto automático).
3. Handoff canônico do Google Doc (401), `PGE-001`/`PGE-002`, provedores não
   configurados, executores de personas/skills vazios (por desenho),
   `COCKPIT_CAR_ENFORCE` desligado, adapter Context Core stub.

### Próxima etapa recomendada

Reiniciar Uvicorn, validar visualmente o chat autenticado e só depois decidir
sobre homologação de provedores/executores (nenhuma é pré-requisito do chat).

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

### Entrada e limites

- `tarefa.md` atual (raiz do Drive) é a missão de encerramento: 4.651 bytes,
  completo, modificado 11/10/2026 17:04. O arquivo truncado antigo
  (18.287 bytes, seções 1–15) não existe mais nesse caminho; seu conteúdo
  ausente não foi inferido.
- Nenhum código, migration, `.env` ou dado foi alterado. Nenhum processo
  externo foi encerrado, nenhum provedor chamado, nenhuma credencial lida,
  nenhum arquivo movido/apagado no Drive.

### O que foi feito

1. Conferência do estado real: leitura dos três relatórios canônicos,
   verificação de código (`core/car.py`, `core/agents.py`,
   `core/capabilities.py`), configuração (sem ler/exibir segredos) e
   inventário de testes (27 módulos).
2. Suíte completa reexecutada: **174 testes, 0 falhas (OK), 485,515 s**.
3. Banco canônico auditado somente leitura: SHA-256
   `6B91C9055B4A9F7284F33B15225F489A87FAFD8008BFE2EDA7752AD5AD5C0A32`,
   `integrity_check=ok`, 0 violações FK, migrations `0001`–`0004` intactas.
4. Validação ao vivo curta (servidor iniciado e encerrado por esta execução):
   health 200, `/api/runtime` 401 sem sessão, `/` redireciona ao login,
   startup limpo (`logs/encerramento-20261011-171709.*.log`), porta 8790
   livre ao final, SHA-256 do banco inalterado pelo startup.
5. Consolidação das cinco pendências do `tarefa.md` (ver abaixo).

### Pendências — status consolidado

| # | Pendência | Status nesta execução |
|---|---|---|
| 1 | `tarefa.md` truncado | **Atualizado**: o arquivo atual está completo; o truncado antigo sumiu do caminho. Conteúdo ausente não inferido. |
| 2 | `PGE-001`/`PGE-002` | **Confirmada ausência**: busca `PGE*` no Drive e STACK-NINJA sem arquivo; só auto-referências. Nenhum documento concorrente criado. |
| 3 | Handoff canônico do Drive | **Sem acesso** (HTTP 401). Diretrizes conhecidas por resumo previamente registrado; conteúdo integral não incorporado nem afirmado. |
| 4 | Validação visual do painel RUNTIME | **Pendente** (autenticada; requer navegador do usuário). Rotas e HTML cobertos por testes automatizados; conferência visual segue pendente. |
| 5 | `COCKPIT_CAR_ENFORCE` | **Preservado desligado** (ausente do `.env`). O que controla, riscos e testes prévios documentados em `COCKPIT_HANDOFF.md`. |

### Alterações de arquivo nesta execução

- `COCKPIT_ESTADO_REAL.md` — seção “Encerramento técnico e handoff”.
- `COCKPIT_HANDOFF.md` — seção de encerramento + documentação de
  `COCKPIT_CAR_ENFORCE`.
- `COCKPIT_RETORNO_EXECUCAO.md` — este registro.
- Logs gerados: `logs/encerramento-20261011-171709.out.log` /
  `.err.log` (startup limpo, 4 linhas).

### Riscos e limitações

- A imposição do CAR continua nunca exercitada em produção (fase de
  observação); limiares ainda provisórios.
- Nenhum provedor live foi homologado; conectores continuam só com mocks.
- Executores de personas/skills continuam vazios por desenho; Estudioso,
  Reclamão e Diretor de Projetos são documentais.
- Adapter Context Core é stub; MCP 8788 sem listener.

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

### Ordem executada (conforme `tarefa.md`)

1. Auditoria inicial (ler handoffs/estado real, conferir banco/migrations,
   mapear rotas, tabelas, testes; servidor do usuário em 8790 preservado).
2. Backup proporcional antes de alterar: `backups/consolidacao-20261011-*`
   (banco + arquivos alteráveis; integridade ok).
3. Mapeamento de duplicações → consolidação de frontend → backend.
4. Validação (suíte completa + integridade) → conectar capacidades reais →
   validação focada → documentação → relatório.

### Duplicações encontradas e eliminadas

| Duplicação | Ação |
|---|---|
| Cartões "Personas cadastradas" no topo (tabela legada `personas`) × catálogo ECOSSISTEMA | Removidos; ECOSSISTEMA é o catálogo visual único |
| Indicadores simulados (personas ativas/pensando + `jobs_queue` fixo 0) | Substituídos por fila real do núcleo, tasks hoje e uptime |
| Criação de Job sem histórico/acompanhamento unificado | "Novo Job" → EXECUÇÕES com `GET /api/jobs` (núcleo `domain_store`) |
| Backups `.py.bak` em diretórios de código | Movidos para `backups/stale-baks-20261011-*` |

Não eram duplicações (verificado): chat e formulário de Job convergem no mesmo
núcleo; feed/terminal/RUNTIME têm semânticas distintas; o Reclamão já cobre os
7 elementos exigidos no núcleo `review.py`.

### Capacidades conectadas (com infraestrutura existente)

- **Diretor de Projetos**: `project_consultation()` + rota
  `GET /api/agents/diretor-de-projetos/projects` — consulta read-only de
  projetos catalogados e estados reais de Jobs/estudos/revisões/agenda, sem
  inventar progresso; sem autoria (sem executor).
- **Estudioso/Reclamão/Orquestrador**: núcleos já completos; validados sem
  alteração (pesquisa externa pausada sem provedor; objeção não fabricada;
  chat não gera jobs casuais).

### Verificações

- Suíte completa pós-consolidação: **175 testes, OK (0 falhas), 740,971 s**.
- Focados (Diretor + API conhecimento): **17 testes, OK, 133,035 s**.
- Banco: `integrity_check=ok`, 0 FK, migrations `0001`–`0004` intactas; nenhuma
  migration nova. Nenhum `.env` lido, nenhum processo externo encerrado, nenhuma
  chamada paga.

### Pendências

1. Reiniciar Uvicorn + Ctrl+F5 (rotas Python novas exigem reinício; o HTML novo
   já está em disco). Validação visual autenticada pendente (sem credenciais).
2. 3 personas sem nome (importação BDS, conteúdo retido p/ revisão) — revisão
   humana; nenhum nome inventado.
3. Estudioso duplicado (BDS ext3 × canônico) — unificação é decisão humana.
4. Terminal de comandos arbitrários fora do escopo (etapa futura).

## Missão de consolidação — retorno — 2026-10-11

### Entrada e limites

- `tarefa.md` (raiz do Drive) está **truncado**: 18.287 bytes, término no meio da
  seção 15. Nenhum requisito ausente foi inventado; a execução cobre 1–15.
- Antes de alterar: handoffs/estado real lidos, Git verificado (sem `.git`),
  servidor conferido (nenhum listener de Python/Uvicorn ativo) e baseline de
  testes medido: **133 testes, 0 falhas, 463,9 s**.

### O que foi feito

1. **CAR** (`core/car.py`, `api/routes_runtime.py`, `main.py`) — runtime
   adaptativo: coleta sob demanda sem threads/daemon, histerese + dwell,
   calibração por amostras reais (limiares provisórios rotulados como tais),
   admissão/consulta por prioridade, filas com retomada, log de decisões,
   detecção de servidor duplicado sem encerrar processo e registro de
   processos próprios. Router `GET /api/runtime` autenticado.
2. **Otimização para o desktop de casa** — sem dependência nova (sem `psutil`);
   leituras nativas (`GlobalMemoryStatusEx`, `GetSystemTimes`,
   `GetDiskFreeSpaceEx`, Toolhelp32) com fallback; cache por TTL para não
   pesar a própria observação; concorrência derivada da máquina medida.
3. **Portabilidade** (`scripts/diagnose_env.py`, `COCKPIT_PORTABILIDADE.md`) —
   fase Diagnosticar pronta e testada; contratos, componentes reutilizáveis e
   fases futuras documentadas; nenhuma promessa de plataforma não testada.
4. **Orquestração sob demanda** — `check()` no endpoint de execução de
   pesquisa: em modo imposição, tarefa opcional sob pressão responde
   `202 deferred_resource_pressure`; em observação nada muda.
5. **Governança** — escrita otimista `expected_version` em versões de
   conhecimento (409 em conflito): prevenção real de sobrescrita silenciosa.
6. **Frontend** — painel **RUNTIME** (estado dos serviços, memória/CPU/disco,
   tarefas em execução e aguardando recursos), preservando Chat do Cockpit e
   placeholder “Sobre o que vamos conversar?”.
7. **READMEs (pendência obrigatória da execução anterior)** — `README.md` do
   Cockpit atualizado com as 14 seções exigidas sem perder as instruções
   operacionais; `LEIA-ME.md` da raiz recebeu apenas “Resumo arquitetural” +
   histórico v1.1. Outros READMEs não alterados (sem impacto direto).

### Auditoria (seções 8–11)

Estudioso, Reclamão e Diretor de Projetos verificados contra o código: fluxos
de pesquisa/revisão/colaboração existem e não há execução simulada de persona
(`PERSONA_EXECUTORS`/`SKILL_EXECUTORS` vazios). Lacunas reais da pesquisa
(orçamento consumido, concorrência de runs, retomada de run, revisão humana de
findings) registradas como pendência, sem implementação especulativa.

### Verificações finais

- Suíte completa: **174 testes, 0 falhas** (inclui 23 de CAR, 4 de integração,
  9 de portabilidade e 5 de frontend novo).
- `pip check`: `No broken requirements found`; `compileall` aprovado.
- Banco lido somente leitura: `integrity_check=ok`, migrations `0001`–`0004`
  intactas; **nenhuma migration nova**.
- Nenhum servidor deixado em execução, nenhum processo externo encerrado, nenhuma chamada paga,
  nenhuma credencial lida, nenhuma migration nova, nenhum arquivo apagado ou
  movido no Drive.
- Validação ao vivo (servidor iniciado e encerrado por esta execução):
  `health` 200, `/api/runtime` 401 sem sessão, `/` 303 → login 200, startup sem
  erros e SHA-256 do banco **inalterado** (`6B91C905…C0A32`, igual ao backup
  `backups/pre-live-20261011-165558/`).

### Arquivos alterados/criados

- Novos: `core/car.py`, `api/routes_runtime.py`, `scripts/diagnose_env.py`,
  `COCKPIT_PORTABILIDADE.md`, `tests/test_car.py`, `tests/test_car_integration.py`,
  `tests/test_portability.py`, `tests/test_frontend_runtime.py`.
- Alterados: `main.py`, `core/knowledge.py`, `api/routes_knowledge.py`,
  `frontend/index.html`, `README.md`, `LEIA-ME.md` (raiz), este relatório,
  `COCKPIT_HANDOFF.md`, `COCKPIT_ESTADO_REAL.md`.

### Pendências humanas

1. Fornecer o restante de `tarefa.md` (arquivo truncado).
2. Localizar/atualizar `PGE-001` e `PGE-002` (não encontrados na árvore).
3. Ler/incorporar o handoff canônico do Drive (Google Doc; exige API do Docs).
4. Reiniciar Uvicorn e validar o painel RUNTIME com Ctrl+F5 (sessão autenticada).
5. Decidir ativação da imposição do CAR (`COCKPIT_CAR_ENFORCE`) após observação.
6. `author_agent`/`answered_by` são texto livre (sem validação contra executor);
   revisar quando houver executores reais — hoje nenhum executor existe, por desenho.
7. Lacunas da pesquisa não fabricadas: consumo efetivo de orçamento, controlador
   de concorrência de runs, retomada de run e revisão humana de findings.

## Atualizacao — interface do Ecossistema e validacao — 2026-10-11

- `frontend/index.html` recebeu cards responsivos, busca, filtro por estado, contagem e painel de detalhes, mantendo a navegacao e as nove APIs atuais.
- Titulos priorizam nomes verificados; hashes/UUIDs recebem rotulos neutros numerados. Personas com nome equivalente sao agrupadas na apresentacao, sem apagar ou alterar registros.
- Estados internos sao traduzidos; IDs e metadados tecnicos ficam recolhidos. Conteudo de revisao sensivel permanece oculto e texto e renderizado via `textContent`.
- Suite final: 71 aprovados, 0 falhas, 0 ignorados; `pip check` e `compileall` passaram. Testes novos cobrem os cartoes, estados, agrupamento, redacao e escape.
- Banco canonico consultado somente leitura: `integrity_check=ok`, zero violacoes FK, migrations 0001–0003 intactas. Contagens da API conferidas: 108 memorias, 22 skills, 13 personas, 13 ferramentas, 2 MCPs; 20 registros sob revisao permanecem sem conteudo.
- Servidor em `127.0.0.1:8790` responde health 200. Sem cookie, `/` apresenta login (200); nao usei nem solicitei credenciais. Nao foi possivel inspecionar a tela autenticada/console pelo conector de navegador disponivel. Apos Ctrl+F5 na aba autenticada, validar visualmente; nao houve chamada paga nem escrita de teste no banco.

## Atualizacao executor persistente e continuidade — 2026-10-11

### Etapas 9–15/15

- Etapa 9 parcial/concluida no fluxo seguro: o chat continua chamando o planejador. Acoes explicitas podem despachar Jobs/Runs filhos locais idempotentes; o resultado nao afirma que o plano simulado foi executado.
- Etapa 10 parcial: selecao de persona fica somente candidata documental. Nenhuma persona/skill tem executor registrado; a allowlist de executores especializados esta vazia.
- Etapa 11 parcial/bloqueada para leitura live: Context Core REST respondeu HTTP 200 no localhost 8787; Cockpit nao tem configuracao URL/token e o adaptador retornou `unavailable_not_configured` (0 registros consultados). MCP 8788 sem listener. Nenhum servico iniciado e nenhum banco externo alterado.
- Etapa 12 parcial: executor integrado a Jobs/Runs, sem nova migration. Nivel 0 registra classificacao local; nivel 1 simula as etapas do plano; nivel 2 aceita somente `cockpit.readonly_audit` apos confirmacao explicita. Nao ha shell/codigo arbitrario, escrita em arquivos, provedor ou efeito externo.
- Fila/checkpoints: Jobs/Runs persistem fila/estado; Artifact `executor_plan`, Artifact `executor_checkpoint` por tarefa e Artifact `executor_result`; Events append-only para fila, inicio/retomada, checkpoint, resultado, falha e cancelamento. Idempotencia por Job pai+nivel, 1 tentativa, timeout maximo 10 s e nenhum retry automatico. Startup retoma apenas planos versionados com ferramentas allowlisted/idempotentes; plano desconhecido vai para `waiting_human`.
- Etapa 13: conectores existentes permanecem acionados apenas explicitamente; config reporta Perplexity/OpenRouter sem chave/allowlist disponivel. Conectores seguem testados com mocks apenas; nenhuma chamada paga.
- Etapa 14: testes completos: 84 aprovados, 0 falhas, 0 ignorados. `pip check` e `compileall` aprovados. A suite usa bancos temporarios.
- Etapa 15 parcial: API live antiga ocupa 127.0.0.1:8790 (PID 4976), health 200, `/api/chat` sem sessao 401. OpenAPI live nao inclui `/api/jobs/{job_id}/executor` e o HTML live nao inclui `appendExecutorPanel`. A tentativa de iniciar o codigo atualizado terminou por conflito de porta; o processo existente foi preservado. Inspecao visual autenticada nao disponivel (runtime de controle de navegador ausente); parse JavaScript passou.

### Preservacao e auditoria

- Antes de inicializar o novo caminho operacional foi criado backup SQLite consistente: `backups/pre-executor-20261011-095916/cockpit.db`; backup `integrity_check=ok`, 0 erros de FK.
- Banco canonico antes da inicializacao: `integrity_check=ok`, 0 erros de FK, 7 personas legadas, 0 Jobs, 0 Runs e 3 migrations aplicadas. Nenhuma migration foi criada/alterada; 0001–0003 preservadas.
- `.env` nao foi lido ou exibido. Configuracao verificada por booleanos: Argon2id configurado, bypass falso, Perplexity/OpenRouter nao configurados e Context Core nao configurado.
- Tentativa de start local: log `logs/executor-20261011-102651.out.log` registra que a porta ja estava ocupada e o processo iniciado encerrou sem substituir o PID 4976. O servidor antigo permanece ativo; nao foi terminado nem reiniciado.

### Arquivos alterados

- `core/executor.py`, `core/capabilities.py`, `core/orchestrator.py`
- `api/routes_jobs.py`, `main.py`, `frontend/index.html`
- `tests/test_executor.py`, `tests/test_capabilities.py`, `tests/test_operational_api.py`, `tests/test_frontend_ecosystem.py`
- Este relatorio, `COCKPIT_HANDOFF.md`, `COCKPIT_ESTADO_REAL.md` e `COCKPIT_PLANO_EXECUCAO.md`.

### Pendencias humanas e comando de retomada

O usuario deve fechar o processo antigo que ocupa a porta no terminal que o iniciou; nao envie credenciais. Depois:

```powershell
Set-Location "C:\Users\Usuario\Meu Drive\STACK-NINJA\02-PROJETOS\cockpit"
.\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 8790
```

Autenticar manualmente no navegador, atualizar a pagina e confirmar os botoes de execucao local. Context Core exige configuracao autorizada de URL/token para leitura. Provedores continuam sem chamada paga e sem teste live.

## Estado inicial

- O diretório operacional mais avançado era `STACK-NINJA/02-PROJETOS/cockpit`; a cópia `02 - Projetos técnicos/cockpit-backend` era anterior. O mockup/interface existente foi preservado.
- Não foi encontrado `.git` no projeto; sem histórico Git local disponível.
- Existiam núcleos de domínio, migrations, roteamento, serviços de conectores e primitives de sessão, mas não estavam integrados ao startup/API/UI.
- Não havia login, rotas operacionais de Jobs/Runs, nem páginas de handoff/importação.
- O banco canônico tinha apenas o schema legado do MVP e não tinha `schema_migrations`.

## Trabalho executado

- Implementados login/logout de usuário único com Argon2id, hash de sessão/CSRF no SQLite, cookie `HttpOnly`/`SameSite=Strict`, TTL, expiração, revogação, atraso progressivo, validação de Origin e dependência de sessão.
- Startup falha fechado sem `COCKPIT_PASSWORD_HASH` Argon2id. `COCKPIT_DEV_AUTH_BYPASS` existe apenas para uso explícito em desenvolvimento/testes. `COCKPIT_ENV=production` exige cookie Secure.
- Integradas migrations com checksum ao startup e aplicadas as migrations aditivas `0001` e `0002` ao banco canônico. Nenhuma migration aplicada foi editada.
- Implementadas rotas para Jobs, routing, Events, Runs, artifacts, execução API, handoff e importação. A UI preservada recebeu formulário simples de criação/roteamento; execução API exige clique e abertura de provedor só ocorre pelo clique no handoff.
- Mudanças de estado de Job e Run, seus Events e artifacts correspondentes são gravados de forma atômica. Manual import é idempotente pelo par Run/hash e verifica URL HTTP(S), estado e tamanho.
- Roteamento v1 prioriza privacidade e usa Perplexity, OpenRouter apenas com modelos Grok/Claude/DeepSeek allowlisted, ou handoffs determinísticos ChatGPT/Manus/Gemini.
- Conectores Perplexity/OpenRouter usam `httpx.AsyncClient`, não repetem chamadas, sanitizam falhas e foram testados com HTTP mockado.
- Adicionado `scripts/set_password.py`, que solicita senha sem eco e grava somente o hash Argon2id no `.env`; não revela a senha nem o hash.

## Banco canônico e backup

- Backup consistente anterior à migration: `backups/pre-blocks2-8-20261010-1700/cockpit.db`.
- SHA-256 do backup: `64752667ABD592697FBD447C4F64FF446C6DB430382AAECC296BF5A8AD3920E4`.
- Migrations registradas: `0001` (`dcdd40d212027f3ef2075dcbb6ed19cf9365bdf23fdbabe802a5220ef48afb05`) e `0002` (`c69824b91db8c14dba04577d69ae2d6c0538e157cd78e4a259942760145cbbeb`).
- Após aplicação: `integrity_check=ok`, nenhuma violação de FK; contagens legadas preservadas em 621 feed events, 14 mensagens, 3 linhas de terminal e 7 personas.

## Estado por bloco

| Bloco | Estado atual | Pendência concreta |
|---|---|---|
| 2 — Autenticação | Parcial operacional | Definir a senha local em `COCKPIT_PASSWORD_HASH`; sem ela o startup falha por segurança. |
| 3 — Modelo/migrations | Concluído | Nenhuma. Migrations aplicadas e checksum conferido. |
| 4 — Roteamento | Concluído | Nenhuma. Rotas e persistência integradas. |
| 5 — Perplexity | Parcial operacional | Chave/modelo não foram fornecidos; nenhuma chamada live. |
| 6 — OpenRouter | Parcial operacional | Chave/allowlist operacional não foram fornecidas; nenhuma chamada live. |
| 7 — Handoff | Concluído | Nenhuma. Handoff manual não automatiza login/navegador. |
| 8 — Importação | Concluído | Nenhuma. Texto permanece Artifact; não grava fatos no Context Core. |

## Testes

Testes incluídos: primitives de autenticação; login/cookies/CSRF/Origin/expiração;
checksums/idempotência/append-only; transições; routing; APIs de handoff/import; falhas
mockadas dos conectores; regressão do MVP. Não houve tráfego pago.

Resultado: 47 testes aprovados, 0 falhas, em 150,890 s; `pip check` sem conflitos;
`compileall` aprovado. `git diff --check` não se aplica porque não há `.git` local.
Comandos executados:

```powershell
$env:PYTHONDONTWRITEBYTECODE='1'
& .\.venv\Scripts\python.exe -m compileall -q api config connectors core security main.py scripts\set_password.py
& .\.venv\Scripts\python.exe -m unittest discover -s tests -p 'test_*.py' -v
& .\.venv\Scripts\python.exe -m pip check
git diff --check
```

## Configuração e início

O `.env` operacional está configurado em desenvolvimento local, com bypass desligado e
hash de senha vazio. Defina a senha local no prompt oculto; o script grava o hash no `.env`:

```powershell
Set-Location "C:\Users\Usuario\Meu Drive\STACK-NINJA\02-PROJETOS\cockpit"
& .\.venv\Scripts\python.exe .\scripts\set_password.py
& .\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 8790
```

## Revalidacao solicitada pelo usuario — 2026-10-11

- Suite completa executada nesta arvore: 69 testes aprovados, 0 falhas e 0 ignorados (`unittest discover -s tests -p 'test_*.py' -v`; 393,917 s).
- Verificacoes adicionais: `pip check` aprovado; `compileall` aprovado.
- Servidor ja iniciado pelo usuario: `http://127.0.0.1:8790/` respondeu HTTP 200; `/api/health` respondeu HTTP 200 (`status=ok`). O listener local foi observado na porta 8790 (PID 4976; consulta de linha de comando do processo negada pelo Windows).
- As rotas protegidas `/api/chat`, `/api/chat/conversations` e as nove categorias de `/api/ecosystem/{category}` responderam HTTP 401 sem sessao, conforme esperado; nenhuma retornou 404. A suite e o teste autenticado sobre copia temporaria do banco cobrem respostas autenticadas e detalhes reais, sem escrever no banco canonico.
- Auditoria read-only: 108 memorias, 22 skills, 6 personas importadas + 7 personas visuais legadas (13 na API), 2 MCPs, 13 ferramentas, 0 regras, 0 projetos, 3 cards de integracao. Vinte registros seguem em revisao sem conteudo (10 memorias, 7 skills, 3 personas); 10 linhas substituidas permanecem ocultas. Chat: 16 mensagens sem ID de conversa; apresentadas como arquivo legado somente leitura, sem inferir limites entre conversas.
- SQLite: `integrity_check=ok`, 0 violacoes de FK; migrations 0001–0003 presentes e checksums registrados. Nenhuma chamada paga ou escrita de teste no banco canonico.
- Validacao visual/console autenticada segue pendente: o conector Opera nao abriu a sessao (erro de autenticacao e depois exigencia de `link_id`); nao li nem solicitei senha/cookie e nao usei bypass. A pagina autenticada deve ser conferida pelo usuario no navegador ja aberto. O status das rotas e dos dados tem evidencias automatizadas conforme acima.
- Nenhuma falha de codigo foi encontrada nesta rodada; nao houve alteracao de codigo. A unica pendencia operacional e a inspecao visual/console em sessao autenticada acessivel.

## Correção imediata da UI e APIs — 2026-10-11

### Diagnóstico confirmado

O 404 `Not Found` do histórico e de Personas não era ausência de registros. O processo Python que servia a porta 8790 (PID 3056, iniciado em 10/10 às 23:36) foi iniciado antes das atualizações de código de 11/10. As rotas `GET /api/chat`, `GET /api/chat/conversations`, `GET /api/ecosystem/{category}` e `GET /api/ecosystem/{category}/{record_id}` existem no código canônico e passaram por testes autenticados; a instância velha continuava com a app carregada anteriormente. A rota de saúde respondia, mas as novas rotas não estavam disponíveis naquela instância. O boot do frontend ainda misturava a falha da lista de conversas com a do histórico, mostrando uma mensagem imprecisa.

O banco contém 16 mensagens de chat legadas, mas nenhuma tem `conversation_id` (0 conversas identificáveis, 16 mensagens sem ID). Não é possível reconstruir limites de conversas sem inferir. Uma opção explicitamente rotulada como arquivo legado, somente leitura, permite acessar essas mensagens sem alterar registros nem simulá-las como conversas independentes.

### Correções e preservação

- Reiniciado o servidor antigo, após identificar o PID associado à porta local 8790 e obter a permissão de elevação exigida para encerrá-lo. Uvicorn canônico iniciou como PID 7232; startup completo em `http://127.0.0.1:8790`.
- Corrigida a apresentação de erros: método, status HTTP e endpoint agora são informados; lista de conversas e recuperação de histórico têm tratamento independente.
- Corrigido o placeholder LOBO para o Orquestrador. Os registros/personas visuais LOBO existentes foram preservados.
- A lista de conversas agora oferece arquivo legado em modo somente leitura e impede POST nesse ID reservado.
- Não houve nova importação BDS, escrita de teste no banco canônico, alteração de migration, credenciais, bypass ou chamadas pagas. A auditoria pós-restart confirmou o mesmo total de 16 mensagens e `integrity_check=ok`.
- Backups relevantes em `backups/pre-ui-api-fix-20261011-085014/`, incluindo o frontend e a rota principal antes das respectivas edições; o banco canônico não foi alterado.

### Quantidades verificadas contra o banco e as APIs

| Aba | Registros que a API lista | Estado |
|---|---:|---|
| Personas | 13 | 6 BDS + 7 registros visuais legados do Cockpit; conteúdo sensível permanece retido |
| Skills | 22 | Documentais; sem executor presumido |
| Memórias | 108 | 10 exigem revisão e retornam sem conteúdo |
| Regras | 0 | Vazia, não indisponível |
| Ferramentas | 13 | Descritores importados, não executáveis por presunção |
| MCPs | 2 | Registros documentais; conexão não presumida |
| Contexto | 0 | Fonte Context Core indisponível/não conectada |
| Projetos | 0 | Vazia |
| Integrações | 3 | Cards derivados da configuração; não significam live test |

Foram confirmados também 7 skills/personas adicionais na retenção sensível (20 retidos no total: 10 memórias, 7 skills, 3 personas) com conteúdo nulo; 10 linhas da primeira tentativa de importação seguem ocultas como substituídas, sem remoção física.

### Testes e estado live

- Suíte final: 69 aprovados, 0 falhas, 0 ignorados, 112,847 s.
- Teste de integração autenticado sobre cópia temporária do banco canônico: todas as nove listas e detalhes acessíveis; conteúdo dos itens em revisão permaneceu nulo; arquivo legado listou e recuperou 16 mensagens. A sessão de teste foi criada somente na cópia e descartada com ela.
- `pip check` e `compileall` aprovados. Integridade SQLite `ok`, zero violações FK, checksums das migrations 0001–0003 preservados.
- Probes live sem sessão: `/api/health` 200; rotas protegidas 401, comportamento esperado antes de autenticar. Não foi possível validar console/aba autenticada: o conector Opera pediu autenticação repetidamente e falhou após duas tentativas. Não acessei nem alterei a senha.
- Servidor permanece ativo na porta 8790. O usuário deve atualizar a aba com Ctrl+F5 e autenticar novamente se a sessão antiga tiver expirado. A validação visual autenticada continua pendente; não há erros do navegador atribuídos sem observação da aba.

### Arquivos modificados

- `api/routes_chat.py` — arquivo legado somente leitura e recuperação segura de mensagens sem conversation ID.
- `frontend/index.html` — placeholder, mensagens de erro com endpoint/status, boot separado e modo legado read-only.
- `scripts/audit_ecosystem_catalog.py` — contagem efetiva da API (inclui personas visuais e integrações derivadas) e total de mensagens/conversas.
- `tests/test_operational_api.py`, `tests/test_ecosystem.py`, `tests/test_frontend_ecosystem.py` e novo `tests/test_canonical_readonly_api.py` — testes HTTP autenticados e verificação contra cópia temporária do banco real.
- `COCKPIT_HANDOFF.md` e este relatório.

## Atualização da execução — 2026-10-11 (continuidade etapas 8–15)

### Resultado operacional implementado

- O chat do Cockpit foi conectado ao planejador: mensagem persistente → interpretação determinística → decisão de roteamento → Job/Run quando aplicável → Artifact/Event → estado verdadeiro. Conversas podem ser retomadas por `conversation_id`; repetição do mesmo `message_id` é idempotente. O teste HTTP cobre a sessão autenticada com CSRF/Origin e não usa `COCKPIT_DEV_AUTH_BYPASS`.
- A interface existente ganhou a área ECOSSISTEMA para Personas, Skills, Memórias, Regras, Ferramentas, MCPs, Contexto, Projetos e Integrações. Listas e detalhes vêm do banco/configuração real; conteúdo é renderizado como texto, sem inventar registros nem executar instruções importadas. Categorias ausentes/indisponíveis distinguem-se de catálogos vazios.
- Importação BDS local idempotente, com proveniência, hashes, deduplicação e retenção de conteúdo sensível para revisão humana. Contagem visível confirmada por auditoria: 108 memórias, 22 skills, 6 personas, 2 MCPs, 13 ferramentas documentais. Revisão: 10 memórias + 7 skills + 3 personas; zero conteúdo sensível presente nessas linhas. 10 linhas da primeira tentativa estão apenas marcadas como substituídas/ocultas, não apagadas.
- O backup BDS local tem 108 memórias mas não carrega `ALWAYS`/`CALLED` por registro. A exportação textual documenta 90/18, sem relação reproduzível entre modo e ID do JSON local. Nenhum modo foi atribuído por ordem ou inferência: a interface indica indisponibilidade do metadado individual.
- Context Core: adaptador read-only, restrito a host local e escopo explícito, autenticação obrigatória, timeout e sanitização de campos sensíveis. Serviço não iniciado e conexão real não verificada; sem URL/token configurados, consulta informa indisponibilidade. Nenhum banco Context Core foi copiado ou alterado.
- Handoff só prepara pacote local e fica `waiting_human`; abrir navegador depende de clique. Execução de conectores externos permanece explícita. Nenhuma chamada paga ocorreu.

### Estado por etapa

| Etapa | Estado | Evidência/limite |
|---|---|---|
| 8 — Auditoria/herança | Concluída | Inventário existente, importação auditada e contagens SQLite acima. |
| 9 — Orquestrador | Parcial | Chat integrado, persistência/idempotência e fluxo de Job/Artifact/Event testado; não há autonomia geral, retomada de checkpoints, execução automática ou plano complexo com dependências. |
| 10 — Personas/Skills | Parcial | Catálogos reais acessíveis e persona apenas candidata documental; nenhuma skill importada é executável sem executor validado. |
| 11 — Contexto | Parcial | Adaptador read-only e mocks/testes; conexão live e restante dos critérios não verificados. A missão recebida foi truncada no meio desta etapa. |
| 12–15 | Não iniciadas/não especificadas | A continuação dos critérios não estava presente; nenhum escopo foi inventado. |

### Testes e integridade

- Teste HTTP + migrations focalizados: 12 aprovados, 0 falhas, 0 ignorados.
- Auditoria do catálogo: 151 registros visíveis no total (108+22+6+2+13), 20 em revisão sem conteúdo, 10 substituídos ocultos, zero erros de importação na reexecução; zero violações FK; `integrity_check=ok`.
- Migrations 0001/0002 intactas; 0003 aditiva, checksum verificado: `95b3098e82830f095c8fc67d8dd4ac0528018c6f374ddb456fd6c4c388dfea04`.
- `pip check`: aprovado (`No broken requirements found`). `compileall`: aprovado.
- Suíte completa final (árvore atual): 64 aprovados, 0 falhas, 0 ignorados em 112,836 s (`unittest discover -s tests -p test_*.py -v`). O primeiro ciclo apontou duas expectativas antigas que fixavam o schema em 0002 e uma expectativa Echo; atualizados para verificar 0003 e o resultado real do Orquestrador. Todos os testes de API agora usam sessão opaca/CSRF/Origin; bypass falso ou removido.
- Porta 8790: sem listener nesta verificação. Nenhum servidor foi iniciado; portanto login visual, console real e validação de browser não foram afirmados.

### Alterações desta continuidade

`migrations/0003_ecosystem_orchestration.sql`, `core/orchestrator.py`, `core/ecosystem.py`, `core/bds_catalog_import.py`, `core/context_core_client.py`, `core/orchestrator_context.py`, `api/routes_chat.py`, `api/routes_ecosystem.py`, `api/routes_jobs.py`, `core/db.py`, `config/settings.py`, `main.py`, `frontend/index.html`, scripts de importação/auditoria e testes de catálogo/contexto/frontend/orquestração/migration/API. Os relatórios e backups locais foram preservados; não foi encontrado histórico Git no repositório canônico.

### Retomada

Servidor local, quando o usuário desejar: `Set-Location "C:\Users\Usuario\Meu Drive\STACK-NINJA\02-PROJETOS\cockpit"; .\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 8790`. A configuração Argon2id está disponível sem leitura/exibição do hash e o bypass permanece desligado. Antes de afirmar operação live, entrar com a senha escolhida pelo usuário no navegador. Pendências humanas: revisar os 20 registros retidos; disponibilizar mapeamento verificável de modos ALWAYS/CALLED; enviar o texto restante das etapas 11–15; configurar/testar Context Core apenas com autorização adequada.

Para produção: HTTPS, `COCKPIT_ENV=production`, `COCKPIT_COOKIE_SECURE=1`, allowlist
exata em `COCKPIT_ALLOWED_ORIGINS` e `COCKPIT_DEV_AUTH_BYPASS=0`.

## Próxima tarefa executável

Configurar a senha local, iniciar o servidor e verificar o login pela interface. Depois,
se houver interesse, fornecer credenciais/modelos e autorizar explicitamente qualquer
homologação live de Perplexity/OpenRouter.

## Validação operacional — 2026-10-10

- Endereço local configurado: `http://127.0.0.1:8790/` (origens permitidas: localhost e 127.0.0.1 nessa porta).
- Configuração presente: adapter mock, banco SQLite local, host `127.0.0.1`, porta `8790`, TTL de sessão `28800`, `COCKPIT_ENV=development` e bypass de autenticação desligado.
- `COCKPIT_PASSWORD_HASH` permanece vazio. O script `scripts/set_password.py` foi ajustado para solicitar a senha duas vezes com entrada oculta e gravar o hash Argon2id diretamente no `.env`, sem exibir senha ou hash. Para manter o segredo fora do chat, o usuário deve executá-lo localmente e informar apenas que concluiu.
- Não havia processo escutando na porta 8790. O servidor não foi iniciado porque isso falharia fechado sem a senha configurada; nenhum bypass foi ativado.
- Testes desta validação (execução anterior): suíte completa — 49 aprovados, 0 falhas, 90,464 s. Revalidação após correções descritas abaixo: 55 aprovados, 0 falhas, 0 ignorados, 74,648 s.
- Login, painel no browser, criação de Job, roteamento, handoff, importação manual e inspeção de console/backend ficam pendentes até o usuário definir a senha e o servidor poder iniciar. Nenhuma chamada a API paga foi feita.
- Próxima ação: executar `& .\\.venv\\Scripts\\python.exe .\\scripts\\set_password.py` no terminal local, digitar e confirmar uma senha de pelo menos 12 caracteres no prompt oculto; então iniciar com o comando uvicorn acima. Não enviar senha nem hash no chat.

### Etapas permanentes da missão autônoma

- Etapa 1/7 finalizada — integração dos blocos, conforme estado inicial.
- Etapa 2/7 bloqueada para revalidação — embora o usuário informe ter executado o script, a leitura segura do `.env` canônico encontrou exatamente uma definição de `COCKPIT_PASSWORD_HASH`, vazia; a variável de processo também não está definida. Nenhum hash válido está disponível para inspeção. A execução anterior não pode ser atribuída a outro path/cópia com a evidência presente.
- Etapa 3/7 finalizada — causa atual do RuntimeError: configuração efetiva vazia. Causa adicional de robustez corrigida: `env_file` era relativo ao CWD, diferente do caminho absoluto usado pelo script de senha; agora aponta para a raiz canônica. Caminhos relativos de banco/workdir também ficam ancorados à raiz, evitando criar banco paralelo quando o processo é iniciado de outro diretório. Validação Argon2id estrutural completa substitui o teste antigo de mero prefixo.
- Etapa 4/7 bloqueada — não se iniciou servidor nem se ativou bypass porque não há hash. A porta 8790 não tem listener. Testes automatizados de API confirmam redirecionamento de página protegida, 401 para API sem sessão, CSRF, Origin e expiração; confirmação HTTP/browser real aguarda senha.
- Etapa 5/7 finalizada com testes isolados — fluxo operacional, persistência, roteamento determinístico, falhas de conectores simuladas, handoff, `waiting_human`, import idempotente, Events/Artifacts e rollback de transições inválidas passaram; nenhum teste grava no banco canônico.
- Etapa 6/7 finalizada em modo automatizado — Perplexity/OpenRouter exercitados só com mocks, allowlist/429/5xx/timeouts/sanitização passaram; scripts inline nos três documentos HTML passaram análise sintática JavaScript. Corrigida a ordem da abertura da janela do provedor para preservar o gesto explícito do usuário. Console real do navegador permanece não verificado sem servidor.
- Etapa 7/7 finalizada — `unittest discover`: 55 aprovados, 0 falhas, 0 ignorados, 74,648 s. Um primeiro ciclo desta nova suíte expôs que um teste de settings herdava `COCKPIT_DEV_AUTH_BYPASS=1` exportado por outro módulo; o teste foi isolado explicitando bypass falso e o ciclo final passou. `compileall` em api/config/connectors/core/security/main/scripts/tests e `pip check` passaram. Banco SQLite aberto somente em modo read-only: `integrity_check=ok`, zero violações FK, migrations 0001/0002 com checksums correspondentes e tabelas `jobs/runs/events/artifacts/sessions/schema_migrations` presentes. Log `_server.log`: 4 linhas, zero erro/exception/traceback; sem linha de startup.

### Arquivos alterados nesta continuidade

- `config/settings.py`: `.env` absoluto da raiz, resolução de paths relativos e validação de estrutura Argon2id.
- `tests/test_settings_security.py`: seis regressões para path do `.env`, `$` sem interpolação, precedência de env, hash inválido/válido e paths relativos.
- `tests/test_auth_routes.py`: teste de redirect de rota HTML protegida.
- `templates/jobs/handoff.html` e `tests/test_operational_api.py`: preservar gesto do clique para abrir provedor e teste de ordenação.
- `COCKPIT_HANDOFF.md` e este relatório: estado por etapa, evidências e comando de retomada.

### Ação humana pendente

Executar no repositório canônico `& .\\.venv\\Scripts\\python.exe .\\scripts\\set_password.py` e digitar uma senha escolhida pelo usuário, com pelo menos 12 caracteres, apenas no prompt oculto. Não enviar senha/hash ao chat. Então iniciar `& .\\.venv\\Scripts\\python.exe -m uvicorn main:app --host 127.0.0.1 --port 8790`; URL local esperada: `http://127.0.0.1:8790/`. Nenhuma chamada paga é necessária para essa validação.

## Missão autônoma — etapas 8–15 (2026-10-11)

### Estado por etapa

- Etapa 8/15 finalizada — inventário BDS/STACK-NINJA/Context Core com evidências em `COCKPIT_INVENTARIO_HERANCA.md`. O export BDS cobre estruturalmente 108 memórias (90 `ALWAYS`, 18 `CALLED`); backup local JSON válido também contém 108. Há 22 skills, 6 personas, 2 MCPs, zero projetos e zero arquivos de projeto no backup. Os corpos dos chats não estão completos. Nenhuma memória/persona/skill foi importada ou executada.
- Etapa 9/15 iniciada e parcial — implementado núcleo determinístico `core/orchestrator.py` e rota protegida `POST /api/orchestrator/plan`. A entrada inclui conversation/message IDs, texto, projeto ativo opcional, contexto explicitamente fornecido/proveniência, referências e metadados. A rota cria Job, reutiliza o roteador, persiste Artifact JSON `orchestration_plan` e Event `orchestration_planned`. O plano declara aprovação necessária, `not_started` e zero chamadas externas. O endpoint não integra ainda o chat/UI, não recupera Context Core/BDS e não resolve entidades/personas por catálogo executável; o chat atual continua Echo/Mock.
- Etapas 10–15/15 não iniciadas — critérios detalhados não constavam no conteúdo da missão disponível nesta execução. Não foram inventados requisitos.

### Defeitos e correções desta sessão

- Classificador inicial não reconhecia o plural “confidenciais”; regressão demonstrou que o pedido poderia cair no ramo web. Heurística ajustada para o plural; teste exige `R01_PRIVATE` e ausência de Run.
- Teste de Artifact verificava a primeira linha, legitimamente o `routing_decision`; corrigido para verificar a existência do tipo `orchestration_plan`.
- Nenhuma migration foi criada/alterada; nenhum serviço Context Core foi iniciado; banco canônico não recebeu Jobs de teste (fixtures temporárias).

### Testes e auditoria atual

- `python -m unittest discover -s tests -p 'test_*.py' -v`: 56 aprovados, 0 falhas, 0 ignorados.
- `python -m pip check`: `No broken requirements found`.
- `python -m compileall -q api config connectors core security main.py scripts tests`: aprovado.
- SQLite canônico em modo read-only: `integrity_check=ok`, zero violações FK; migrations 0001/0002 presentes com checksums registrados.
- Porta 8790: sem listener no instante da verificação; não iniciei o servidor. Hash de autenticação não foi lido nem exibido.
- Configuração de autenticação revalidada sem revelar credencial: `auth_is_configured=True`; `COCKPIT_DEV_AUTH_BYPASS=False`. Esse estado mais recente substitui a anotação histórica anterior de hash vazio. Não houve login/startup pelo navegador nesta sessão.
- Nenhum provedor foi chamado. Testes de navegador/console real não foram executados.

### Arquivos desta continuidade

- `COCKPIT_INVENTARIO_HERANCA.md` — matriz de origem, estado, reutilização e risco.
- `core/orchestrator.py` — interpretação conservadora e plano unitário auditável.
- `api/routes_jobs.py` — endpoint autenticado para criar plano/Job/Event/Artifact.
- `tests/test_operational_api.py` — regressão do endpoint, privacidade, proveniência e não execução.
- `COCKPIT_HANDOFF.md` e este relatório — estado e próximo passo.

### Pendências

1. Fornecer a continuação integral da especificação das etapas 9–15 para o desenvolvimento avançar sem inferir escopo.
2. Definir política de aprovação/contexto antes de qualquer divulgação a provedor; o plano atual mantém contexto apenas no Artifact local.
3. Resolver contrato do Context Core (endpoint read-only, escopo e autenticação fail-closed) antes de conectar adapter. O serviço permanece parado e seu repositório externo não foi alterado.
4. Integrar a rota ao chat somente quando a experiência estiver definida: o chat legado é Mock/Echo, não execução autônoma.

## Atualização — chat centrado em personas, 2026-10-11

- Corrigida a interface para **Chat do Cockpit** com o placeholder “Sobre o que vamos conversar?”.
- Conversa casual agora é persistida sem Job/Run e retorna a limitação de forma explícita. Pedidos com intenção acionável mantêm o planejador e a rastreabilidade existentes.
- O chat separa `capability_notice` de `planning_notice`; metadados incluem persona responsável (nula quando não executada), participantes, candidatas documentais, provedor efetivo, tipo, Job e estado. A seleção documental é explicada sem atribuir autoria.
- Não há executores registrados para personas ou skills. Assim, nenhuma persona BDS é executável e colaboração multipersona não está disponível. Geração especializada segue pendente de executor autorizado; a chamada ao provedor existente continua dependendo de clique explícito, sem uso nesta sessão.
- Validação final: `unittest discover -s tests -v` — 86 aprovados, 0 falhas, 0 ignorados, em 199,190 s. Após o último ajuste, os 8 testes focados de chat/frontend passaram; `compileall` e `pip check` aprovados. `pytest` não está instalado no ambiente.
- A primeira execução completa identificou uma expectativa antiga de 16 mensagens totais. A cópia do banco revelou 20 mensagens totais, sendo 16 sem conversation_id; o teste foi corrigido para comparar com a contagem baseline da cópia e permaneceu read-only.
- Auditoria final read-only: SQLite `integrity_check=ok`, zero violações FK; 20 mensagens totais e 2 Jobs/2 Runs preexistentes. Nenhum dado canônico foi escrito pelos testes desta tarefa. Nenhuma migration ou backup de banco foi necessário.
- Configuração verificada sem imprimir credenciais: Perplexity não configurado; OpenRouter não configurado; zero modelos permitidos; zero executores reais para personas e skills.
- Operação local: `/api/health` retorna HTTP 200; sem sessão `/` redireciona para login (HTTP 200 final) e `/api/chat` responde 401 conforme esperado. Não foi possível autenticar a inspeção visual nem confirmar por HTML qual build está servido; o processo não foi encerrado. Se a aba autenticada ainda mostrar a versão anterior, reinicie Uvicorn e aplique Ctrl+F5. Inspeção de console/browser permanece pendente.
- Arquivos desta mudança: `api/routes_chat.py`, `frontend/index.html`, `tests/test_operational_api.py`, `tests/test_api.py`, `tests/test_frontend_ecosystem.py`, `tests/test_canonical_readonly_api.py`, `COCKPIT_HANDOFF.md`, `COCKPIT_RETORNO_EXECUCAO.md`, `COCKPIT_ESTADO_REAL.md`.

Comando local para iniciar quando necessário:

```powershell
Set-Location "C:\Users\Usuario\Meu Drive\STACK-NINJA\02-PROJETOS\cockpit"
& .\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 8790
```

## Atualização — Estudioso, Reclamão e Diretor de Projetos — 2026-10-11

### Estado real encontrado

- Reclamão: inexistente em código, banco, catálogo do Ecossistema e documentação do Drive (varredura de 5.595 arquivos sem ocorrência relevante). Criado como contrato canônico novo.
- Estudioso: existia como legado — linha `estudioso` na tabela `personas` (persona visual "ESTUDIOSO", Negócios & Exploração) e registro documental BDS de mesmo nome. Mantida; o contrato canônico convive sem sobrescrever nada.
- Diretor de Projetos: inexistente. Criado como contrato canônico com status declarado de planejamento (`planned_not_registered`).
- Catálogo antes da mudança: 161 registros (108 memórias, 9 personas, 29 skills, 13 tools, 2 MCPs), 7 personas visuais legadas, `integrity_check=ok`.

### O que foi implementado (aditivo e reversível)

1. `migrations/0004_knowledge_review_research.sql` — 8 tabelas novas para biblioteca, revisão e agenda; 0001–0003 preservadas com seus checksums.
2. `core/agents.py` — `CANONICAL_AGENTS` (missão, regras de participação e skills por agente), `canonical_records()`, `seed_canonical_agents()` idempotente e `select_agents_for_context()` para seleção contextual.
3. `core/knowledge.py` — itens canônicos com slug deduplicado, fontes obrigatórias com proveniência, versionamento e máquina de estados (`draft` → `review` → `consolidated`), sem texto tratado como instrução.
4. `core/review.py` — fluxo Estudioso ↔ Reclamão: abertura de rodada, objeção com 7 elementos (afirmação, evidência, lacuna, risco, contraprova, severidade e sugestão), resposta, consolidação, limite de rodadas e escalonamento humano; nenhuma das duas partes tem razão automática e as divergências ficam registradas.
5. `core/research.py` — agenda recorrente com tema, frequência, orçamento, fontes autorizadas, deduplicação e histórico; tema nasce **pausado**, execução exige provedor configurado e autorização, e nunca há disparo automático.
6. `api/routes_knowledge.py` — rotas `/api/knowledge`, `/api/reviews`, `/api/research` e `/api/agents`, autenticadas (sessão + CSRF + Origin), todas locais e sem chamada externa.
7. `api/routes_chat.py` — campo `request_agents`, seleção de candidatos pelo contexto e metadados `candidate_agents` / `agents_without_executor`; nenhuma persona é apresentada como autora.
8. `frontend/index.html` — painel **CONHECIMENTO** (Estudos, Revisões críticas, Agenda de pesquisa, Agentes) reaproveitando o CSS `.ecosystem-*`; "Chat do Cockpit" e "Sobre o que vamos conversar?" preservados.
9. `core/db.py` e `main.py` — seed canônico no startup e registro dos três routers novos.

### O que continua verdadeiro

- `PERSONA_EXECUTORS` e `SKILL_EXECUTORS` continuam vazios: Estudioso, Reclamão e Diretor de Projetos são documentais. O `/api/agents` declara `availability` e o aviso de ausência de executor; nada é atribuído a ninguém.
- Nenhum provedor foi chamado, nenhuma credencial foi lida, nenhum pagamento foi disparado, nenhuma tarefa recorrente foi ativada e nenhum serviço externo foi iniciado.
- Os sete registros visuais legados e os registros BDS permanecem intactos; 10 registros substituídos seguem ocultos, sem exclusão.

### Verificações

- `python -m unittest discover -s tests -p 'test_*.py'`: **133 aprovados, 0 falhas, 0 ignorados, 410,706 s** (6 módulos novos: agents, knowledge, review, research, knowledge_api, frontend_knowledge).
- `python -m pip check`: `No broken requirements found`. `python -m compileall -q api config connectors core security main.py scripts tests`: aprovado.
- SQLite canônico somente leitura: `integrity_check=ok`, zero violações FK, migrations 0001–0004 (0004 `023c1aec693b787d5a391e8c232d07d8e00b7b0f6f0ccf935697a2238dfb2495`); catálogo 177 registros (16 canônicos: 3 personas + 13 skills); tabelas novas com 0 linhas; `chat_messages=20`, `jobs=2` inalterados.
- Servidor: Uvicorn **PID 1176** em `http://127.0.0.1:8790` (porta sem duplicidade). Verificação autenticada ao vivo: **14/14 OK** — health 200 público, rotas novas 401 sem sessão, escrita sem CSRF 403, 3 agentes canônicos listados e painel/identidade presentes no HTML.
- Backup antes das mudanças persistentes: `backups/pre-colaboracao-20261011-131347/`.

### Arquivos desta execução

- Novos: `migrations/0004_knowledge_review_research.sql`, `core/agents.py`, `core/knowledge.py`, `core/review.py`, `core/research.py`, `api/routes_knowledge.py`, `tests/test_agents.py`, `tests/test_knowledge.py`, `tests/test_review.py`, `tests/test_research.py`, `tests/test_knowledge_api.py`, `tests/test_frontend_knowledge.py`.
- Alterados: `core/db.py`, `main.py`, `api/routes_chat.py`, `frontend/index.html`, `tests/test_migrations.py` (expectativa de adoção ampliada para 0004), `tests/test_canonical_readonly_api.py` (contagens 16 personas / 35 skills após o seed), `COCKPIT_HANDOFF.md`, `COCKPIT_RETORNO_EXECUCAO.md`, `COCKPIT_ESTADO_REAL.md`.

### Pendências

1. Registrar executores reais de personas/skills (hoje vazio por desenho) — exige autorização e implementação própria.
2. Configurar provedor e autorizar a agenda de pesquisa recorrente; enquanto isso permanece pausada.
3. Decidir a consolidação do registro BDS `ESTUDIOSO` contra o contrato canônico `Estudioso` (há dois registros para a mesma identidade histórica; nada foi unificado sem aprovação).
4. Validação visual autenticada no navegador (conector de navegador indisponível nesta sessão) e revisão do adapter Context Core, que segue stub.
