# Cockpit de IA — handoff técnico

> **ATUALIZAÇÃO DE 2026-10-12 (~22:20) — FASE 2 LIVE, RODADA 3 (EXECUÇÃO AUTORIZADA).**
> Leia a seção abaixo primeiro. Registros anteriores permanecem históricos.

## Fase 2 LIVE — rodada 3: migração 0006 aplicada + reinício controlado (2026-10-12) — LEIA ISTO NA PRÓXIMA SESSÃO

Missão `tarefa.md` ("FASE 2 LIVE — Execução autorizada, migração 0006 e
homologação supervisionada"). Estado: **decisões 1–5 EXECUTADAS** conforme
autorização expressa; **decisões 6–7 sem alteração**; **Fase 2 NÃO declarada
encerrada** (16 candidatos aguardam revisão individual). Relatório completo:
`02-PROJETOS/cockpit/retorno.md` (Seção 0).

### O que mudou (estado operacional)

- **Migração 0006 APLICADA** ao `data/cockpit.db` via mecanismo oficial
  (`core.migrations.apply_migrations`) após backup consistente
  `backups/pre-migracao0006-20261012-220651.sqlite3` (880 640 bytes,
  SHA-256 `D153914D24F63F06DF6014AECC5BD94C51B010EBAC4188B0B6608E0AF795F841`).
  Migrations: 0001–0006 (0006 exatamente 1×). Colunas de autoria em
  `knowledge_items` + índice + tabela `quarantine_reviews` criadas.
  Validação pós: 20 verificações OK; catálogo idêntico (fingerprint `b146cf1b…`).
- **Serviço reiniciado** (decisão 5): PID 5668 encerrado (gracioso não atendido →
  forçado; porta 8790 livre; SQLite íntegro). Novo serviço com o launcher oficial
  `python -m uvicorn main:app --host 127.0.0.1 --port 8790` (PIDs 8108→7312,
  logs `logs/uvicorn-*-20261012-2212.log`). Health 200, login gate ativo
  (raiz serve tela de login; APIs 401 sem sessão), startup limpo, `db.migrate()`
  validou checksums sem reaplicar nada, `research_runs`=0 (nenhuma execução
  externa disparada pelo reinício).
- **Suíte completa: 377 testes, OK.** Dois pins de guarda atualizados para o
  estado legitimamente autorizado (0005→0006):
  `tests/test_authorship_migration.py::OperationalDatabaseGuardTests` e
  `tests/test_homologation.py::test_migrations_0001_to_0006_applied`.

### O que foi preservado (inalterado)

- 186 registros, **0 materiais homologados**, 38 em quarentena, 34 pendências,
  2 jobs + 2 runs em `waiting_human` (nenhum trabalho perdido no reinício).
  `quarantine_reviews` vazio; nenhum conteúdo sensível exposto; trilha de
  auditoria `logs/homologation-audit.jsonl` inexistente (nenhuma aprovação
  executada).
- **16 candidatos continuam PENDENTES DE DECISÃO.** Tabela individual:
  `00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_HOMOLOGACAO_16_TABELA_APROVACAO.md`.
  Arquivo de decisões: `COCKPIT_HOMOLOGACAO_APROVACOES_PRE_PREENCHIDO.json`
  (16 campos `decision` vazios — escolha explícita obrigatória). Aplicar somente
  após decisão individual, via
  `scripts/homologation_approval.py --decisions <arquivo> [--apply --confirm APROVAR]`.

### Próximos passos (proprietário)

1. Revisar e decidir os 16 candidatos (APROVAR / REJEITAR / MANTER PENDENTE).
2. Responder os itens de aprovação agrupados
   (`COCKPIT_ITENS_APROVACAO_PROPRIETARIO.md` — B1, B2 e supersessões).
3. Ao concluir 1–2, declarar a Fase 2 encerrada e iniciar a Fase 3 conforme
   `COCKPIT_FASE3_PROPOSTA.md` (nada implementado ainda; hardening P2/P3 está
   em F3.6).

---

## Missão integrada — saneamento final, engenharia reversa e hardening (2026-10-12) — LEIA ISTO NA PRÓXIMA SESSÃO

Missão `tarefa.md` ("MISSÃO INTEGRADA — Saneamento Final, Homologação, Engenharia
Reversa e Hardening Preventivo"). Estado final: **CONCLUÍDO tecnicamente**, com
**decisões humanas pendentes** (abaixo). Relatório completo:
`02-PROJETOS/cockpit/retorno.md` (seções A–J).

### O que mudou (código) — correções de baixo risco, todas testadas

- `core/db.py`: **serialização de transações cross-thread** (`_SerializedConnection`
  + `RLock`) — elimina commit cruzado entre threads (P0). + `wal_checkpoint(TRUNCATE)`
  no `close()`.
- `core/migrations.py`: **atomicidade por migração** (`BEGIN/COMMIT` explícito) —
  migração interrompida não deixa DDL parcial (P0).
- `core/orchestrator.py` + `main.py`: **`recover_interrupted_requests`** reconcilia
  solicitações presas em `processing` no boot (idempotente, não duplica jobs).
- `api/routes_jobs.py`: `RuntimeError` de corrida mapeado a **409** (antes 500);
  `GET /api/jobs` retorna **`count` real** (campo novo, compatível).
- `core/domain_store.py`: `count_jobs`.
- `frontend/index.html`: painel de jobs usa o `count` real (não `jobs.length`).
- `core/knowledge.py`: `consolidate()` **exige estado `revised`** (fecha bypass de
  `in_review` que contornava `TRANSITIONS`).
- `security/auth.py` + `api/routes_auth.py`: throttle de `last_seen_at` +
  `purge_expired_sessions` (retenção 30 d, só credenciais).
- `core/car.py`: `claim_instance` tolera lock corrompido (preserva `.corrupt`) e
  grava de forma atômica (`temp`+`replace`).
- `chat/browser_pool.py`: gate **`COCKPIT_ALLOW_BROWSER_AUTOMATION`** (default-off)
  — trava defesa-em-profundidade no código morto que dirigia Opera real via CDP.
- `.env.example`: 7 chaves faltantes documentadas.
- `tests/test_resiliencia.py` (novo): **20 cenários** de resistência/recuperação.

### Verificações finais (somente leitura; operacional intocado)

- Suíte completa: **362 testes, OK** (339 + 23 novos). 0 reprovados.
- Banco operacional: integridade ok, migrations **0001–0005** (0006 **NÃO**
  aplicada), sem `authorship_kind`, 186 records, knowledge_items=0, 23 tabelas.
- Servidor PID **5668** (porta 8790) não reiniciado/alterado. Backup pré-missão
  `backups/pre-saneamento-fase2live-20261012-172436.sqlite3` íntegro e restaurável.
- Trilha `logs/homologation-audit.jsonl` **não criada** (nada foi aprovado).

### Pendências — EXCLUSIVAMENTE do dono (não executadas por autonomia)

1. **Aplicar migração 0006** (autorização expressa). Recomendação: aplicar (adição,
   idempotente, reversível; é pré-requisito de homologação honesta).
2. **Decidir os 16 candidatos** via `scripts/homologation_approval.py`
   (dry-run → `--apply --confirm APROVAR`). Não publica nada.
3. **Responder as 34 pendências classe B**; **registrar decisões de quarentena**
   dos 38 registros (nunca liberando conteúdo automaticamente).
4. Resolver higiene: processo uvicorn órfão (PID 4832, sem porta) e `cockpit.sqlite3`
   vazio (0 bytes) na raiz — **não removidos** por regra de não apagar.
5. Opcionais P2/P3: rate limit por endpoint; `password_hash` como `SecretStr`;
   backoff de login persistente.

Documentos de apoio:
`00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_ENGENHARIA_REVERSA_RISCOS.md`
(engenharia reversa + falhas + matriz de riscos),
`00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_RECUPERACAO_CONTINUIDADE_EVIDENCIAS.md`
(evidências brutas da seção 8) e
`02-PROJETOS/cockpit/retorno.md`.

---

## Homologação do Conhecimento e revisão de proveniência FASE 2 LIVE — 2026-10-12

> **[HISTÓRICO]** Seção da missão anterior ("FASE 2 LIVE — Homologação do
> Conhecimento..."), mantida para referência. A missão mais recente está acima.

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

### O que mudou (código)

- `scripts/homologation_reports.py` (novo): gerador determinístico,
  somente-leitura, dos artefatos de análise — reexecução reproduz byte a byte
  (testado). Saída em `00-AUDITORIA/cockpit-fase2-2026-10-12/`:
  `COCKPIT_MATRIZ_HOMOLOGACAO.md` (186 linhas A/B/C), `COCKPIT_REVISAO_QUARENTENA.md` (38),
  `COCKPIT_AUDITORIA_SUPERSESSOES.md` (10 cadeias), `COCKPIT_HOMOLOGACAO_STATS.json`.
- **6 correções no módulo Conhecimento** (consulta/contagem/exibição/navegação):
  (1) `core/knowledge.list_items` agora hidrata `sources`/`versions` em lote
  (UI mostrava "0 fonte(s)"); (2) `core/knowledge.count_items` — contagem real
  na rota `GET /api/knowledge` (antes `len` já cortado pelo LIMIT); (3) aviso
  de catálogo vazio suprimido sob filtro ativo; (4) `list_versions` ordenado
  por `version, created_at` (entradas de estado não empilham); (5)
  `core/review.count_threads` — contagem real em `GET /api/reviews`; (6)
  `core/research.agenda_summary` agrega por SQL sobre **todas** as rodadas
  (antes herdava o corte de 100 do `list_runs`).
- `tests/test_homologation.py` (novo, 26 testes): invariantes 186/38/10/20 no
  banco operacional (`mode=ro`), idempotência da classificação, gerador que
  nunca escreve, hashes candidato×banco×fontes, controle de autoria, zero
  promoção indevida, jobs históricos, `PERSONA_EXECUTORS` vazio, regressão das
  6 correções (banco temporário).
- Documentos: `COCKPIT_POLITICA_AUTORIA_PROPOSTA.md` (matriz de autoria 5
  tipos + migração `0006` em **rascunho, não executada**) e
  `COCKPIT_RELATORIO_HOMOLOGACAO.md`.
- **Nada de UI reconstruída; nenhum registro, fonte, hash ou histórico
  alterado; `knowledge_items` continua 0; migração nenhuma executada.**

### Números e evidências

- Classificação dos **186**: **A=16 · B=34 · C=136** (matriz com justificativa
  e evidência por linha; precedência C→B→A documentada).
- Quarentena **38/38 permanecem** (0 liberadas; 0 erros técnicos
  automáticos); gatilhos: 23 domain / 9 credential / 6 personal; SHA-256 da
  fonte BDS (`3be701bab88…`) e dos 9 arquivos stack-ninja conferidos.
- Supersessões **10/10 reconstruídas** com derivações recalculadas na fonte;
  7 verificações: 0 circulares, 0 autorrelações, 0 órfãs, 0 links quebrados;
  1 achado documentado (`source_key` derivado nos 30 sensíveis — preservado).
- Testes: suíte completa ****254 testes, 0 falhas (OK)**** (`logs/full-suite-20261012-homologacao.txt`).
- Backup pré-missão: `backups/pre-homologacao-20261012-161552.sqlite3`
  (integrity=ok); banco final `integrity_check=ok`, migrations 0001–0005.

### Pendências humanas (nesta ordem)

1. Decisão de autoria: 161 BDS + 9 stack-ninja (desbloqueia os 34 classe B).
2. Revisão de escopo/sensibilidade dos 38 retidos.
3. Destino dos 10 superados (recomendado: manter como histórico).
4. Homologação dos 16 classe A (promoção manual via `create_item`).
5. Autorizar migração `0006_knowledge_authorship.sql` + testes (rascunho na
   política de autoria).
6. ~~Reiniciar o servidor~~ **RESOLVIDO em 2026-10-12 (autorizado)**: backup
   `backups/pre-server-restart-20261012-20261012-174523.sqlite3` (integrity=ok)
   → 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`. As 6 correções estão
   ativas na UI.

## Reindexação integral e auditoria FASE 2 LIVE — 2026-10-12 — LEIA ISTO NA PRÓXIMA SESSÃO

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

### O que mudou (código)

- `core/reindex.py` (novo): motor idempotente — identidade UUID5
  `cockpit:{cat}:{fonte}:{ext_id}`, arquivos identificados por caminho relativo,
  upsert com snapshot de versão (`ecosystem_record_versions`), supersessão que
  preserva a linha antiga, duplicidade de conteúdo por SHA-256 com
  `duplicate_content_of`, quarentena com retenção de conteúdo, relatório por
  execução. Guard de **auto-superposição** (`previous == external`, gerado pela
  fonte BDS em memórias sensíveis) alinhado ao import original — sem ele cada
  execução regravava 10 linhas (corrigido + teste regressivo).
- `core/source_scan.py` (novo): varredura somente-leitura das fontes locais
  (SHA-256 por arquivo, metadados declarados no cabeçalho, inventário,
  mapeamento arquivo→registro); `01.5-Arquitetura` fica só inventariado
  (categoria `context` indisponível).
- `scripts/reindex_ecosystem.py` (novo): CLI → backup → migrações → reindex →
  relatório JSON em `logs/`. `scripts/_repair_reindex_20261012.py`: reparo
  pontual da 1ª execução (149 linhas restauradas byte a byte; diff 0).
- `migrations/0005_ecosystem_provenance.sql` (**aditiva**):
  `ecosystem_record_versions` + `ecosystem_import_runs`.
- `core/knowledge.py` + `api/routes_knowledge.py` + `frontend/index.html`:
  `policy`/`notice` do painel Conhecimento (explica o zero; não infla contagem).
- `tests/test_reindex.py` (17 testes) + `tests/test_knowledge_api.py` (+1).
- **Nada de UI reconstruído/redesenhado; nenhuma fonte original alterada.**

### Números e evidências

- Catálogo **177 → 186** (9 novos: 5 espelho `01.1–01.4`, 3
  `BRIEFING-CANONICO.md`, 1 `REGRAS.md`); rejeitados 0; duplicatas 0;
  `integrity_check=ok`, 0 FK; feed 624 / jobs 2 / runs 2 / events 12 /
  artifacts 6 / chat 20 preservados.
- Idempotência: 3ª execução = **0 inseridos, 0 atualizados, 0 versões** nas 5
  fontes (`logs/reindex-20261012-025219.json`); execuções registradas em
  `ecosystem_import_runs` (10) com fingerprint SHA-256 da fonte.
- Backups: `backups/pre-reindex-20261012-{022949,024317,025218}.sqlite3`.
- Testes: suíte completa **228 testes, 0 falhas (OK)** (`logs/full-suite-20261012-final.txt`;
  1ª execução: 1 expectativa defasada de snapshot corrigida —
  `test_canonical_readonly_api`, contagens atualizadas para o estado
  pós-reindexação); `pip check`/`py_compile` OK.
- Seleção de personas: 14 casos (devem/não devem) OK —
  `logs/audit-personas-orchestrator-20261012.txt`.
- Conhecimento: 0 (coerente); 186 candidatos com autoria/SHA-256 em
  `00-AUDITORIA/cockpit-fase2-2026-10-12/COCKPIT_CANDIDATOS_CONHECIMENTO.md`.

### Pendências da próxima sessão

1. ~~Reiniciar o servidor (PID 7628)~~ — **RESOLVIDO em 12/10/2026 12:47**
   (autorização explícita do usuário): backup pré-troca
   `backups/pre-server-restart-20261012-154503.sqlite3`, PID 7628 encerrado,
   servidor relançado com o mesmo comando — **novo PID 5084** (pai 5872),
   boot limpo, health 200 e tráfego autenticado já atendido pelo código novo
   (`logs/server-8790-20261012-124714.*.log`).
2. Conferir na UI autenticada: ECOSSISTEMA → Personas **17 registros ·
   13 cartões**; Conhecimento com aviso de política.
3. Decisão humana: autoria dos candidatos à biblioteca canônica (até lá, 0);
   38 registros em quarentena; 10 superados pela fonte.
4. `01.5-Arquitetura`: indexar exige categoria `context` na API (hoje
   indisponível) — inventariado, não indexado.
5. `COCKPIT_CAR_ENFORCE` permanece como estava; provedores sem chave;
   nenhuma chamada externa foi feita.

---

## FASE 2 LIVE — validação funcional e correções — 2026-10-11 (20:45) — LEIA ISTO NA PRÓXIMA SESSÃO

(Substitui o “LEIA ISTO” da seção de 19:30 quando houver divergência; todas
as anteriores permanecem preservadas.) Missão `tarefa.md` §1–§7. Execução
concorrente: apenas os servidores do usuário (PIDs 2036 em 8790 + 4072
duplicado inerte, ambos 19:27) — nenhum processo encerrado.

### O que mudou (código)

- `core/agents.py`: `_CRITIQUE_SIGNALS` reconhece `análise/analise/
  analisar/verificação`; `_PROJECT_SIGNALS` reconhece `estado atual`.
  `core/orchestrator.py`: padrão do candidato AUDITOR ampliado idem.
  **Antes**: a mensagem real do usuário ("Analise o estado atual do
  Cockpit…") não casava com nada → "nenhuma persona compatível encontrada".
  **Depois**: principal RECLAMÃO + participante DIRETOR DE PROJETOS +
  colaboração documental + candidato de catálogo AUDITOR; casual continua sem
  candidatos (seleção nunca arbitrária).
- `frontend/index.html`: `unwrapRecordContent()`/`presentableContent()` —
  JSON de configuração desembrulhado (campo `content` legível), Markdown
  higienizado só na apresentação, JSON original em "Detalhes técnicos"
  (`config_original`); conteúdo retido inalterado; sem innerHTML. Painel
  Runtime: `"/api/runtime?probe=true"` sempre + `serverProbeLabel()`
  (`self`/`other_instance`/`none`/`unknown`).
- `api/routes_runtime.py`: probe devolve `relation` honesto a partir do
  claim do CAR (fim do "duplicidade não verificada" e sem autodenúncia de
  duplicidade).
- `scripts/_cleanup_feed_test_pollution2.py`: removeu 9 linhas QA
  (assinatura exata, contagem esperada=9, aborta se divergir): feed 633→624,
  todos `source=sim`.
- `tests/test_frontend_runtime.py`/`test_frontend_ecosystem.py`: literais
  atualizados para os novos comportamentos (mesma intenção do teste).

### Números e evidências

- Backup pré: `backups/fase2-live-20261011-195356/` (5 arquivos + sqlite
  íntegro).
- Suíte final: **210 testes, 0 falhas (OK), 620,610 s** —
  `logs/suite-fase2-final-20261011-201658.log` (baseline 198). 1ª execução
  teve 1 falha (literal de teste desatualizado) → ajustado → módulos
  afetados 23/23 OK. `pip check`, `py_compile` e `node --check` OK.
- E2E (`tests/test_fase2_e2e.py`, 12 testes): chat → persona/time/projeto →
  Job `waiting_human` → run `browser_handoff` → eventos
  `job_created→…→orchestration_planned` → artefatos
  `routing_decision`/`handoff_package`/`orchestration_plan` → releitura +
  replay idempotente → fila e feed coerentes → `external_calls_made=false`.
- Ao vivo: novo código na 8791 (startup limpo, health 200, chat 401, raiz →
  login; encerrado por esta execução); 8790/2036 intacto. Banco final:
  `integrity_check=ok`, 0 FK, migrations `0001`–`0004`, jobs 2, runs 2,
  events 12, artifacts 6, chat 20, catálogo 177, knowledge 0, sessions 17,
  feed 624 (0 poluição).

### Pendências da próxima sessão

1. Pedir ao usuário para **reiniciar o Uvicorn** (8790 carrega o código de
   19:27, anterior às correções de 19:53+) e autenticar com Ctrl+F5;
   validar visualmente: persona principal em pedido de análise, conteúdo
   legível no ECOSSISTEMA, Runtime com "instância única ativa".
2. PID 4072 (uvicorn duplicado inerte, 3,3 MB): encerrar só com autorização
   (recomendo fechar a janela/terminal duplicado).
3. Conhecimento `knowledge_items=0` — se o usuário autorizar, indexar com
   proveniência (candidatos: 108 memórias BDS, 3 missões canônicas, docs);
   até lá, nada importado.
4. Google Doc 401; PGE ausentes; provedores sem chave; executores vazios por
   desenho; `COCKPIT_CAR_ENFORCE` desligado; calibração CAR com amostras.
5. Relatório completo da missão: `tarefa.md` §"RELATÓRIO DE EXECUÇÃO — FASE 2
   LIVE" (status **CONCLUÍDO** com pendências operacionais).

## Chat do Cockpit — continuidade contextual e time de personas — 2026-10-11 (19:30) — LEIA ISTO NA PRÓXIMA SESSÃO

(Substitui o “LEIA ISTO” da seção de consolidação das 18:15 quando houver
divergência; ambas estão preservadas.) Missão `tarefa.md` §2. Execução
concorrente anterior detectada e preservada; só agi após ela encerrou.

### O que mudou (código)

- `core/orchestrator.py`: `conversation_history()` (até 6 mensagens reais da
  conversa entram na interpretação com proveniência
  `conversation_history_local`), `resolve_project()` e
  `prior_project_in_conversation()` — projeto identificado automaticamente
  (explícito > nome de projeto do citado no catálogo > turno anterior da mesma
  conversa > não identificado), com `project_resolution` auditável no plano.
- `core/agents.py`: `compose_agent_team()` — principal (pedido explícito
  primeiro, depois ordem canônica) + participantes + proposta de colaboração
  **documental** (`status=not_executed`) com passos mapeados às capacidades
  reais (`knowledge_research`, `review`, `project_consultation`);
  `validate_agent_attribution()` — autoria só de agente canônico normalizado
  ou `humano:<nome>`; nome inventado é recusado.
- `api/routes_chat.py`: time/composição na resposta (`principal_agent`,
  `participants`, `collaboration`), histórico considerado
  (`conversation_context_considered`) e resolução de projeto
  (`project_resolution`); resumo honesto menciona candidatura sem autoria.
- `api/routes_knowledge.py`: `author_agent`, `opened_by`, `reviewer_agent` e
  `answered_by` validados (400 para autor desconhecido).
- `frontend/index.html`: nota de persona agora mostra principal, candidatas e
  passos da colaboração via `textContent`.
- `tests/test_api.py`: **correção de isolamento** — o teste de feed paralelo
  escrevia no banco canônico quando outro módulo importava `config.settings`
  antes; agora fixa `db.settings` no objeto temporário e fecha conexão cacheda.

### Validação

- Lote focado: 77 testes, 0 falhas. Suíte completa: **198 testes, 0 falhas
  (OK), 573,168 s** (`logs/suite-chat-continuidade-20261011-191213.log`).
  `pip check` e `compileall` aprovados; JS inline com parse aprovado.
- Banco somente leitura ao final: `integrity_check=ok`, 0 FK, migrations
  `0001`–`0004`; `chat_messages=20`, `jobs=2`, `runs=2`, `ecosystem_records=177`
  inalterados. **Remediação**: 36 linhas de teste (`paralelo-N`) removidas do
  feed canônico (669→633), assinatura exata `who='P' AND source='user'`;
  backups `backups/chat-continuidade-20261011-183903/` e
  `backups/pre-limpeza-feed-20261011-190550/`.
- Ao vivo na porta **8791** (servidor iniciado e encerrado por esta execução):
  startup limpo, health 200, `/api/chat` 401 sem sessão, `/` 303 → login 200.
  Servidor do usuário (PID 2260, 8790) preservado; 8791 livre ao final.

### Próximo passo operacional (humano)

Reiniciar Uvicorn (o PID 2260 serve código anterior às 17:33, sem as rotas
novas) e autenticar com Ctrl+F5:

```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
```

Depois validar no chat: projeto identificado sozinho em turno seguinte,
persona principal candidata, proposta de colaboração (pesquisa → revisão) e
nota de ausência de executor.

### Pendências preservadas

Google Doc 401 · PGE-001/002 ausentes · provedores sem chave ·
`PERSONA_EXECUTORS`/`SKILL_EXECUTORS` vazios por desenho ·
`COCKPIT_CAR_ENFORCE` desligado · adapter Context Core stub · validação visual
autenticada pendente · 3 personas BDS sem nome retidas para revisão.

## Consolidação e ativação funcional — 2026-10-11 (18:15) — LEIA ISTO NA PRÓXIMA SESSÃO

Missão `tarefa.md` "concluir consolidação e validar capacidades reais". Núcleo
único por capacidade; terminal fora do escopo.

### O que mudou (código)

- **Frontend** (`frontend/index.html`): cartões de personas do topo removidos
  (duplicavam o ECOSSISTEMA); indicadores reais (fila de Jobs do núcleo, tasks
  hoje, uptime) no lugar dos contadores simulados; "Novo Job" → **EXECUÇÕES**
  com criação + histórico; CSS/variáveis órfãs removidos.
- **Backend**: `core/domain_store.py` ganhou `list_jobs()`/`count_jobs_by_state()`;
  `api/routes_jobs.py` ganhou `GET /api/jobs`; `core/state.py` `jobs_queue` real;
  `core/agents.py` ganhou `project_consultation()`; `api/routes_knowledge.py`
  ganhou `GET /api/agents/diretor-de-projetos/projects`.
- **Testes**: `test_api.py` (jobs_queue real), `test_operational_api.py`
  (GET /api/jobs), `test_agents.py` (consulta do Diretor).

### Validação

- Suíte completa pós-consolidação: **175 testes, OK (0 falhas), 740,971 s**
  (`logs/suite-consolidacao-20261011-181046.log`).
- Focados (Diretor + API conhecimento): **17 testes, OK**.
- Banco: `integrity_check=ok`, 0 FK, migrations `0001`–`0004`; nenhuma nova.
- Servidor do usuário (PID 2260, 8790) preservado, não reiniciado.

### Próximo passo operacional (humano)

As rotas Python novas (`GET /api/jobs`, consulta do Diretor) só respondem após
**reiniciar Uvicorn** (código novo ainda não carregado no PID 2260). O novo
layout do HTML já está em disco (o `FileResponse` lê por request), então
`Ctrl+F5` após o reinício mostra **EXECUÇÕES**. Depois, autenticar e validar
visualmente (painéis Chat/Ecosistema/Conhecimento/Runtime/Execuções).

```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
```

### Capacidades reais — estado

- **Diretor de Projetos**: consulta read-only real de projetos do catálogo +
  Jobs/estudos/revisões/agenda (`planned_not_registered`, sem autoria).
- **Estudioso**: estudos com fontes/versionamento validados; pesquisa externa
  recorrente pausada sem provedor autorizado.
- **Reclamão**: 7 elementos de crítica fundamentada + "opinião não gera objeção"
  já eram suportados pelo núcleo `review.py`; nenhuma alteração necessária.
- **Orquestrador**: chat/planejamento/autorização/execução já distinguidos; sem
  jobs para casuais; sem ação externa sem autorização.
- **CAR**: preservado, `COCKPIT_CAR_ENFORCE` segue desligado (só observação).

### Pendências preservadas

3 personas sem nome (importação BDS, conteúdo retido p/ revisão; nenhum nome
inventado) · Estudioso duplicado (BDS ext3 × canônico; unificação é decisão
humana) · PGE-001/002 ausentes · provedores não configurados · validação visual
autenticada pendente · terminal de comandos fora do escopo (etapa futura).

## Encerramento técnico — 2026-10-11 (17:17) — (histórico; ver seção de consolidação acima)

Nenhuma alteração de código/banco foi feita nesta execução: foi verificação +
consolidação. Evidências:

- Suíte completa: **174 testes, 0 falhas, 485,515 s**.
- Servidor iniciado e encerrado por esta execução (PID 6328); porta 8790 livre
  ao final. Health 200; `/api/runtime` 401 sem sessão; `/` redireciona ao login.
- Banco `data/cockpit.db`: SHA-256 `6B91C9055B4A9F7284F33B15225F489A87FAFD8008BFE2EDA7752AD5AD5C0A32`
  inalterado; `integrity_check=ok`; 0 FK; migrations `0001`–`0004` intactas.
- `tarefa.md` atual da raiz é o arquivo de encerramento (4.651 bytes, completo);
  o arquivo truncado antigo (18.287 bytes, seções 1–15) não existe mais nesse caminho.
- `PGE-001`/`PGE-002`: continua sem documento canônico (busca `PGE*` no Drive e
  STACK-NINJA sem resultado além de auto-referências).
- Handoff canônico do Drive (`1CkDK-L66fb…`): HTTP 401 sem autorização; não incorporado.

### `COCKPIT_CAR_ENFORCE` — estado, risco e pré-requisitos (documentação obrigatória)

- **O que controla:** variável de ambiente lida em `core/car.py`
  (`AdaptiveRuntime.__init__`, linhas ~662–670). Declara quais prioridades terão
  decisão do CAR **imposta** (bloqueio real) em vez de apenas registrada.
  Valores aceitos: lista separada por vírgulas de prioridades
  (`optional`, `background`, `normal`, `essential`, `critical`). Vazia/ausente
  ⇒ fase de observação: `_decide()` calcula a negativa mas a contorna com
  “(observacao; imposicao desativada)” e admite a tarefa na mesma
  transição (linha ~850–853).
- **Estado atual:** ausente do `.env` ⇒ **desligado** (como prescrito). Nenhuma
  tarefa foi bloqueada por CAR em produção.
- **Riscos ao ativar:** com prioridades imposta, `POST /api/research/topics/{id}/run`
  pode passar a responder `202 deferred_resource_pressure` de verdade; usar
  `essential`/`critical` amplia a imposição a tarefas essenciais — o handoff
  anterior já alerta que `critical`/`essential` em escopo amplo podem **bloquear
  chat e persistência**. A imposição usa limiares ainda `provisionais` (não
  calibrados por percentis reais da máquina).
- **Testes que devem preceder a ativação:**
  1. `tests/test_car.py` e `tests/test_car_integration.py` passando com
     `COCKPIT_CAR_ENFORCE=optional` no ambiente do teste (imposição mínima).
  2. Observar ao menos um turno com `COCKPIT_CAR_LOG_FILE` ativo (JSONL) para
     confirmar que as decisões calculadas são as esperadas em pressão real.
  3. Nunca ativar `critical`/`essential` como primeiro passo; escalar
     `optional` → `optional,background` somente após leitura dos logs.
  4. Decisão humana explícita registrada neste arquivo antes de alterar `.env`.

### HANDOFF — PRÓXIMA EXECUÇÃO OPENCODE (2026-10-11)

- **Diretório:** `C:\Users\Usuario\Meu Drive\STACK-NINJA\02-PROJETOS\cockpit`
- **Ler antes:** `tarefa.md` (raiz do Drive), este arquivo,
  `COCKPIT_ESTADO_REAL.md`, `COCKPIT_RETORNO_EXECUCAO.md`.
- **Estado de partida:** suíte 174/0 falhas; banco SHA-256
  `6B91C905…C0A32` íntegro; migrations 0001–0004; porta 8790 livre; CAR em
  observação; sem `.git` na árvore.
- **Prioridades da próxima sessão:**
  1. Validar visualmente o painel RUNTIME autenticado (iniciar Uvicorn,
     `Set-Location` no diretório acima,
     `& .\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 8790`,
     login do usuário, Ctrl+F5). Não registrar senha.
  2. Observar o CAR ao menos um turno (`COCKPIT_CAR_LOG_FILE`) antes de
     qualquer decisão sobre `COCKPIT_CAR_ENFORCE` (riscos e testes prévios
     documentados acima).
  3. Receber do usuário: restante do `tarefa.md` antigo (se houver),
     `PGE-001`/`PGE-002` e acesso autorizado ao Google Doc `1CkDK-L66fb…`.
  4. Avançar desempenho ultraleve (máquina com ~3,9 GB RAM, Celeron 3855U):
     `scripts/diagnose_env.py` (read-only) é a base de diagnóstico.
  5. Lacunas de pesquisa a implementar só com escopo explícito: consumo de
     orçamento, concorrência de runs, retomada de run, revisão humana de findings.
- **Cuidados:** não reaplicar migrations; não ativar `critical`/`essential`
  no CAR; não criar documentos concorrentes de PGE; não chamar provedores
  sem autorização; não encerrar processos externos; preservar histórico dos
  relatórios (anexar, nunca sobrescrever).

## Continuidade — runtime adaptativo, portabilidade e READMEs — 2026-10-11

Leia primeiro: `tarefa.md` (raiz do Drive) está **truncado** na seção 15; nada
faltante foi inferido.

### Novos componentes

- `core/car.py` — Cockpit Adaptive Runtime.
  - Observação sob demanda: `get_car().snapshot()` com TTL
    (`COCKPIT_CAR_SAMPLE_TTL`, padrão 5 s). Sem threads, sem daemon, sem loops.
  - Estados `normal` → `sob_pressao` → `critico`; histerese (limiar de entrada
    ≠ saída) + dwell (`COCKPIT_CAR_MIN_DWELL`, `COCKPIT_CAR_CRITICAL_DWELL`);
    escalonamento imediato, de-escalada lenta. Limiares `provisionais` até
    `COCKPIT_CAR_CALIBRATION_MIN` amostras reais (percentis).
  - `check(task, prioridade)` consulta e registra sem mexer nas filas;
    `admit()` assume a tarefa; `release()`, `defer()`, `ready_tasks()`,
    `resume()` fazem fila/retomada.
  - **Impressão é desligada por padrão.** Ligue por
    `COCKPIT_CAR_ENFORCE=optional` (ou `optional,background`) — nunca use
    `critical`/`essential` (bloquearia chat/persistência).
  - Duplicidade de servidor: `claim_instance()` grava
    `data/.cockpit_instance.json` e avisa no startup; **nunca encerra processo**.
  - Log opcional de decisões: `COCKPIT_CAR_LOG_FILE` (JSONL, só transições/decisões).
- `api/routes_runtime.py` — `GET /api/runtime` (sessão; `?force=true`,
  `?probe=true`). Registrado em `main.py`.
- `scripts/diagnose_env.py` — fase Diagnosticar (read-only, sem rede/credenciais);
  `--out caminho` grava JSON opcionalmente.
- `COCKPIT_PORTABILIDADE.md` — contratos, fluxo Diagnosticar→Preparar→Adaptar→
  Validar→Trabalhar, papel do Drive, fases futuras e critérios.

### Integrações existentes preservadas

- `POST /api/research/topics/{id}/run` consulta o CAR com prioridade
  `optional`. Com imposição ativa e pressão responde **202**
  `deferred_resource_pressure`; sem imposição o comportamento histórico
  (`blocked_no_provider`) permanece idêntico.
- `POST /api/knowledge/{id}/versions` aceita `expected_version` opcional:
  divergência ⇒ **409** (prevenção de sobrescrita silenciosa). Sem o campo, o
  comportamento anterior é preservado.
- Frontend: novo card **RUNTIME** (estado, memória, CPU, disco, execução,
  adiados, duplicidade, limiares) ao lado de CONHECIMENTO; Chat do Cockpit e o
  placeholder “Sobre o que vamos conversar?” intactos.
- `README.md` reescrito (visão, filosofia, arquitetura enxuta, CAR, execução
  sob demanda, limites, pesquisa/revisão, governança, portabilidade, estado
  real, pendências, critérios) mantendo instalação/run/endpoints.
- `LEIA-ME.md` (raiz): apenas “Resumo arquitetural” + histórico v1.1.

### Validação

- Suíte: **174 testes, 0 falhas**; `pip check` e `compileall` aprovados.
- Banco somente leitura: `integrity_check=ok`; migrations `0001`–`0004`;
  **nenhuma migration nova**.
- Sem servidor deixado em execução, sem processo externo encerrado, sem chamada paga, sem
  credencial lida, sem exclusão no Drive.

### Próximos passos

1. Reiniciar Uvicorn na porta 8790 e conferir o painel RUNTIME autenticado (Ctrl+F5).
2. Observar o CAR (ao menos um turno) antes de considerar `COCKPIT_CAR_ENFORCE`.
3. Receber o restante de `tarefa.md` e o handoff canônico do Drive.
4. Localizar `PGE-001`/`PGE-002` para aplicar a governança sem reescrever regras.
5. Lacunas conhecidas da pesquisa (não implementadas por especulação): consumo
   de orçamento, controlador de concorrência de runs, retomada de run e
   revisão humana de findings.

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

## Estado atual

### Executor local controlado — atualizacao 2026-10-11

- O chat manteve o planejamento do Orquestrador e agora oferece acoes explicitas de executor local. Os Jobs/Runs filhos reutilizam a maquina de estados existente; nao foi criado estado ou banco paralelo.
- Niveis habilitados: 0 (registrar/analisar a classificacao deterministica), 1 (simular cada etapa do plano sem executa-la) e 2 limitado a `cockpit.readonly_audit`, com confirmacao por requisicao. Nenhum shell, codigo arbitrario, acesso a caminhos livres ou provedor externo e despachado.
- Fila duravel: estado `routed/running` em Jobs/Runs; plano, checkpoints e resultado em Artifacts; Eventos auditam despacho, checkpoint, conclusao, falha, cancelamento e retomada. Idempotencia por Job pai + nivel; um unico attempt; timeout maximo de 10 s; sem retry automatico.
- Startup retoma somente ferramentas locais allowlisted e idempotentes. Plano/ferramenta desconhecida ou divergencia de estado para em `waiting_human`; terminal nao e retomado. Cancelamento usa a transicao de estado existente.
- Personas BDS seguem documentais: catalogo de executores de persona/skill esta vazio. Correspondencia de keywords e apenas candidata, nao seleciona nem executa prompt importado.
- Context Core: REST local responde, mas Cockpit nao esta configurado; nenhuma leitura de contexto foi feita sem URL/token configurados. MCP 8788 sem listener.
- Validacao: 84 testes (0 falhas, 0 ignorados), `pip check` e `compileall` aprovados. Banco lido: integridade ok, 0 FKs, migrations 0001-0003, 0 Jobs/Runs locais antes do teste. Backup consistente em `backups/pre-executor-20261011-095916/cockpit.db`.
- Servidor: PID 4976 responde em 8790, mas seu OpenAPI/HTML nao contem as novas rotas/controles. O processo novo encerrou por conflito de porta; o processo existente nao foi parado. Inspecao visual autenticada nao realizada.
- Proximo passo: em terminal do usuario, parar o processo antigo que ocupa 8790 e executar o comando abaixo; depois autenticar no navegador e testar os controles novos.

### Validacao da interface do Ecossistema — 2026-10-11

- `frontend/index.html` atualizado com cards responsivos, busca, filtro por estado, contagem de registros e painel de detalhes; as nove categorias existentes permanecem ligadas as APIs reais.
- Titulos agora priorizam nomes verificados; hashes/UUIDs recebem rotulos neutros numerados. Personas com nome equivalente sao agrupadas sem apagar registros, e cada origem permanece visivel nos detalhes.
- Estados internos sao traduzidos para portugues; IDs, external IDs e metadados ficam em `Detalhes tecnicos`. Conteudo de revisao sensivel continua oculto, inclusive metadados do registro.
- Testes de regressao adicionados para navegacao, rotulos, agrupamento, filtros, escape por `textContent` e redacao. Suite final: 71 testes aprovados, 0 falhas, 0 ignorados; `pip check` e `compileall` aprovados.
- SQLite read-only segue integro (`integrity_check=ok`, zero FKs violadas), migrations 0001–0003 inalteradas. Contagens conferidas: 108 memorias, 22 skills, 13 personas na API, 13 ferramentas, 2 MCPs; 20 itens retidos sem conteudo.
- Servidor em `127.0.0.1:8790` e health 200. A requisicao sem cookie recebe a tela de login; a inspecao visual autenticada/console nao foi possivel pelo conector disponivel. Atualizar a aba autenticada com Ctrl+F5 para carregar o HTML atualizado. Nenhuma chamada paga, mudanca no banco ou migration.

O MVP FastAPI foi preservado e conectado aos blocos 2–8. Login Argon2id, sessão opaca,
CSRF/Origin, rotas de Jobs/Runs, roteamento, conectores, handoff e importação manual
estão implementados. O painel existente ganhou controles mínimos para criar e rotear
Jobs, iniciar execução API por clique e abrir handoff por ação explícita.

O banco canônico recebeu `0001` e `0002` de forma aditiva após backup. `integrity_check`
retornou `ok`, `foreign_key_check` não retornou violações e os dados anteriores foram
preservados: 621 feed events, 14 mensagens, 3 linhas de terminal e 7 personas. SHA-256
do backup pré-migration: `64752667ABD592697FBD447C4F64FF446C6DB430382AAECC296BF5A8AD3920E4`.

## Classificação dos blocos

| Bloco | Estado | Evidência/pendência |
|---|---|---|
| 2 — Autenticação | Parcial operacional | Argon2id, cookies, sessões, CSRF, Origin e atraso progressivo implementados e testados. Falta definir a senha local em `COCKPIT_PASSWORD_HASH`; startup falha fechado até isso. |
| 3 — Dados/estados | Concluído | Migrations com checksums aplicadas; tabelas e Events append-only; mudanças de Job/Run/Event/Artifact são atômicas. |
| 4 — Roteamento | Concluído | Ruleset v1 determinístico, privado em revisão manual, allowlist Grok/Claude/DeepSeek e Artifact de decisão. |
| 5 — Perplexity | Parcial operacional | Connector assíncrono e falhas cobertos por mocks. Chave/modelo real não configurados nem chamados. |
| 6 — OpenRouter | Parcial operacional | Allowlist pré-HTTP e métricas/modelos persistidos sob mocks. Chave/modelos reais não configurados nem chamados. |
| 7 — Browser handoff | Concluído | Markdown v1, Artifact/Event, estado `waiting_human`, página e abertura só por clique do usuário. |
| 8 — Manual import | Concluído | URL/tamanho/estado validados, Artifact com hash/proveniência, Event e idempotência `run_id + content_hash`. |

## Arquivos centrais alterados/adicionados

- `main.py`, `config/settings.py`, `core/db.py`, `core/operations.py`, `core/provider_service.py`, `core/routing.py`.
- `security/web.py`, `security/auth.py`, `api/routes_auth.py`, `api/routes_jobs.py`, `api/ws.py`.
- `connectors/openrouter.py`, `frontend/index.html`, templates de login/handoff/importação.
- `requirements.txt`, `.env`, `.env.example`, `README.md`, `scripts/set_password.py`.
- Testes de autenticação HTTP, API operacional, migrações, roteamento e conectores.

Migrations `0001_existing_mvp.sql` e `0002_operational_domain.sql` não foram editadas
depois de aplicadas. A árvore não contém `.git`; portanto não há histórico Git local a
reportar.

## Testes e verificações

Última execução completa: 47 testes aprovados, 0 falhas, em 150,890 s. `pip check`
retornou `No broken requirements found`. `compileall` foi aprovado. `git diff --check`
não se aplica: o diretório canônico não contém `.git`.

Comandos de validação:

```powershell
Set-Location "C:\Users\Usuario\Meu Drive\STACK-NINJA\02-PROJETOS\cockpit"
& .\.venv\Scripts\python.exe -m unittest discover -s tests -p 'test_*.py' -v
& .\.venv\Scripts\python.exe -m pip check
git diff --check
```

Não houve chamadas Perplexity/OpenRouter live nem custos. Os testes externos usam
`httpx.MockTransport`.

## Primeiro start após configurar senha

```powershell
Set-Location "C:\Users\Usuario\Meu Drive\STACK-NINJA\02-PROJETOS\cockpit"
& .\.venv\Scripts\python.exe .\scripts\set_password.py
# Digite e confirme a senha nos prompts ocultos; o script grava o hash em .env.
& .\.venv\Scripts\python.exe -m uvicorn main:app --host 127.0.0.1 --port 8790
```

## Chat centrado em personas — 2026-10-11

- A interface agora se chama **Chat do Cockpit**; a coordenação permanece interna e nenhuma mensagem é atribuída ao Orquestrador.
- Mensagens casuais são persistidas sem criar Job/Run. Pedidos acionáveis continuam no planejador e preservam Job, roteamento, Artifact e Events. A resposta deixa explícito quando é apenas um aviso de capacidade ou um plano.
- A API retorna metadados estruturados de autoria, participantes, candidatas documentais, provedor, tipo de resultado, Job e estado. Candidatas não executadas não são autoras.
- `PERSONA_EXECUTORS` e `SKILL_EXECUTORS` estão vazios; não há persona especializada executável nem colaboração multipersona funcional. Nenhuma definição importada do BDS é executada. Um resultado de provedor só ocorre pela ação explícita de execução já existente e é identificado pelo provedor, não como persona.
- Nenhuma chamada externa paga, migration ou gravação no banco canônico foi realizada nesta atualização.
- Validação final: `unittest discover -s tests -v` — 86 aprovados, 0 falhas, 0 ignorados (199,190 s). Após a última revisão da idempotência/histórico, 8 testes focados passaram; `compileall` e `pip check` aprovados.
- Estado read-only observado: provedores Perplexity/OpenRouter não configurados, zero modelos OpenRouter permitidos, zero executores de personas/skills. SQLite `integrity_check=ok`, zero violações FK; 20 mensagens totais, das quais 16 legadas sem conversa identificada. Porta 8790 responde health HTTP 200; sem sessão, `/` redireciona para login e `/api/chat` responde 401. A versão visual autenticada não pôde ser conferida; se a aba ainda mostrar a versão anterior, reinicie o Uvicorn e use Ctrl+F5.

## 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.

## Atualização executiva — etapas 8–15, 2026-10-11 (estado revalidado)

Esta seção substitui os estados históricos anteriores quando houver divergência.

- Etapa 8/15 finalizada — inventário local e proveniência estão em `COCKPIT_INVENTARIO_HERANCA.md`; acervo BDS local importado de forma idempotente para o catálogo do banco canônico após backup. Estado verificável: 108 memórias, 22 skills, 6 personas, 2 servidores MCP documentais e 13 descritores de ferramentas. Não se afirma que as definições sejam executáveis. Dez memórias, sete skills e três personas tiveram conteúdo retido para revisão sensível (`content=NULL`); nenhuma linha de revisão contém conteúdo. Dez registros antigos da primeira tentativa estão marcados como substituídos e ocultos, sem exclusão física. O JSON local não contém a relação dos modos `ALWAYS`/`CALLED`; a exportação textual os documenta como 90/18, mas não há mapeamento verificável por registro, então a UI não atribui esses modos por suposição.
- Etapa 9/15 parcial — chat persistente integrado a `POST /api/orchestrator/plan`: interpretação determinística, candidato de persona documental quando houver correspondência, contexto somente quando explicitamente autorizado/configurado, Job/Artifact/Event e estado de destino. Repetição de `(conversation_id,message_id)` reapresenta o resultado sem duplicar Job. O chat não é Echo. Destinos browser geram handoff local em `waiting_human`; abrir provedor exige clique. Runs de API permanecem sem chamada externa até ação explícita; nenhuma chamada paga foi feita. Não há execução autônoma geral, decomposição/dependências de subtarefas nem retomada durable de checkpoints.
- Etapa 10/15 parcial — catálogo real de personas/skills e seleção candidata estão consultáveis em Ecossistema. Prompts importados não são executados; habilidades permanecem documentais sem executor. Pessoas/ferramentas não recebem status operacional sem evidência.
- Etapa 11/15 parcial — adaptador read-only do Context Core e consulta de contexto autenticada foram implementados com escopo explícito, origem e sanitização. Nenhuma conexão real foi validada nesta sessão; `CONTEXT_CORE_URL`/token não são inferidos, servidor não foi iniciado e contexto aparece indisponível quando não configurado. O restante da especificação da etapa 11 não chegou no pedido recebido.
- Etapas 12–15/15 não verificáveis/não iniciadas — o texto da missão recebido termina no meio da etapa 11. Não foram inventados requisitos para as etapas ausentes.

Implementação adicionada nesta sessão: migration aditiva `0003_ecosystem_orchestration.sql` (0001/0002 preservadas); tabelas de catálogo e idempotência de orquestração; parser/importador BDS de revisão segura; APIs de Ecossistema e Context Core; interface Ecossistema no painel existente; chat orquestrado; testes de integração/regressão. Backups anteriores à importação e à reconciliação estão em `backups/pre-ecosystem-20261011-*.sqlite3`; nenhum banco foi substituído.

Auditoria SQLite executada em `data/cockpit.db`: `integrity_check=ok`, zero violações de foreign key; checksums 0001 `dcdd40d212027f3ef2075dcbb6ed19cf9365bdf23fdbabe802a5220ef48afb05`, 0002 `c69824b91db8c14dba04577d69ae2d6c0538e157cd78e4a259942760145cbbeb`, 0003 `95b3098e82830f095c8fc67d8dd4ac0528018c6f374ddb456fd6c4c388dfea04`. Importador reexecutado: zero inserções, 151 duplicatas reconhecidas, 20 linhas para revisão, zero erros. A suíte completa final passou: 64 testes, 0 falhas, 0 ignorados, em 112,836 s. `pip check` e `compileall` passaram. Não houve provedor live nem uso de credencial real em mocks. Os harnesses dos testes HTTP usam sessões opacas de fixture com CSRF/Origin; bypass falso.

O servidor não foi iniciado nesta sessão; a porta 8790 deve ser considerada não validada até uma checagem local. Próxima ação segura: obter o restante da especificação 11–15, revisar os 20 itens retidos e fornecer uma política/mapeamento verificável dos modos legados; depois executar a suíte completa e, em sessão autorizada do usuário, validar o navegador autenticado.

## Correção da interface/APIs — 2026-10-11

- Causa dos 404: o processo Python antigo que escutava `127.0.0.1:8790` (PID 3056; iniciado em 10/10 às 23:36) antecedia as alterações de 11/10 em `main.py`, `api/routes_chat.py` e `api/routes_ecosystem.py`. Os routers estão registrados corretamente no código canônico; o processo antigo conservava a aplicação anterior em memória e devolvia o 404 padrão `Not Found`. O processo antigo exigiu elevação para parar; foi reiniciado com o comando canônico. Novo Uvicorn PID 7232 iniciou com “Application startup complete” em `http://127.0.0.1:8790`.
- O texto `[histórico do chat: Not Found]` também ocultava qual chamada falhou: o boot agrupava listagem de conversas e histórico num único `try`, atribuindo qualquer erro à segunda operação. Separadas as chamadas e agora a interface identifica método, status HTTP e endpoint, sem detalhes internos/segredos.
- Banco atual: 16 mensagens antigas, todas sem `conversation_id`; portanto não havia conversa antiga identificável para listar. A API agora as apresenta como “Histórico legado — conversas originais não identificadas”, somente leitura; nenhuma mensagem foi alterada ou reclassificada. Conversas novas continuam tendo IDs reais.
- O placeholder antigo `Fale com LOBO...` foi substituído por texto do Orquestrador. Os sete registros visuais LOBO/painel foram preservados; o chat explica que a persona LOBO permanece no catálogo.
- O catálogo já estava importado; não houve nova importação. Conferência read-only e teste HTTP autenticado sobre uma cópia temporária do banco confirmaram: Personas 13 (6 BDS + 7 visuais legadas), Skills 22, Memórias 108, Regras 0, Ferramentas 13, MCPs 2, Contexto 0 (fonte não configurada/indisponível), Projetos 0 e Integrações 3 (cards derivados da configuração, sem afirmar conexão live). Vinte registros (10 memórias, 7 skills, 3 personas) seguem sem conteúdo para revisão; 10 registros substituídos continuam ocultos sem exclusão. Nenhum fato sensível foi liberado.
- Validação: API autenticada em aplicação de teste ligada a uma cópia temporária do banco (origem aberta somente para leitura) alcançou todas as nove categorias e detalhes; os endpoints de conversa recuperaram as 16 mensagens legadas. A cópia foi descartada e o banco canônico não recebeu mensagens/sessões de teste. No servidor ativo, `/api/health` respondeu 200; probes protegidos sem cookie responderam 401 conforme esperado. Não foi possível inspecionar a aba autenticada/console do usuário: o conector Opera repetiu erro de autenticação após duas tentativas. Nenhuma credencial foi lida, bypass usado ou chamada paga feita.
- Suíte completa: 69 testes aprovados, 0 falhas, 0 ignorados, 112,847 s; `pip check` aprovado; `compileall` aprovado. SQLite canônico permanece `integrity_check=ok`, zero violações FK, migrations 0001–0003 com checksums anteriores.
- Backups relevantes em `backups/pre-ui-api-fix-20261011-085014/`, incluindo o frontend e a rota de chat antes das respectivas edições; o banco canônico não foi alterado.
- Próxima ação do usuário: atualizar a aba (Ctrl+F5; entrar novamente se a sessão expirou). O servidor fica ativo em `http://127.0.0.1:8790`; a inspeção visual autenticada/console permanece pendente por indisponibilidade do conector do navegador.

O painel fica em `http://127.0.0.1:8790/`. Na validação operacional de 2026-10-10,
`COCKPIT_PASSWORD_HASH` ainda estava vazio e nenhuma porta 8790 estava escutando; portanto,
login e fluxo pelo navegador seguem pendentes até a senha local ser definida.

Para produção, configure `COCKPIT_ENV=production`, HTTPS, `COCKPIT_COOKIE_SECURE=1`,
origens exatas e hash de senha. O modo de bypass deve permanecer desligado.

## Próxima tarefa executável

Configurar uma senha local via `scripts/set_password.py`, iniciar o Cockpit e validar
login no navegador. Depois configurar chaves/modelos dos provedores, caso desejado, e
homologar conectores somente mediante autorização para chamadas possivelmente cobradas.

## Continuidade operacional — auditoria de 2026-10-10

- Etapa 1/7 finalizada — integração conforme relatório anterior.
- Etapa 2/7 iniciada anteriormente pelo usuário, mas não revalidada: o `.env` canônico continua com `COCKPIT_PASSWORD_HASH` vazio. A causa observada para o erro de startup é a ausência do valor efetivo; não foi possível determinar por que a execução anterior do script não o deixou persistido. Nenhum segredo foi procurado, redefinido ou exibido.
- Etapa 3/7 finalizada — `config/settings.py` agora resolve `.env`, banco e workdir relativos contra a raiz do projeto; aceita `$` no hash dotenv e valida a estrutura Argon2id completa no startup. Variáveis de processo mantêm a precedência normal sobre `.env`.
- Etapa 4/7 bloqueada — hash ausente. Bypass permanece desligado; nenhum servidor foi iniciado e a porta 8790 não tem listener. O navegador/console e o teste HTTP vivo precisam aguardar a configuração local.
- Etapa 5/7 finalizada com fixtures isoladas — suite exercita Jobs, roteamento, Runs, conectores mockados, Events/Artifacts, handoff, importação idempotente, falhas e transições.
- Etapa 6/7 finalizada em validação estática/automatizada — scripts inline do painel, handoff e importação passam parse JavaScript; o handoff abre a janela no gesto síncrono do clique antes da escrita assíncrona no clipboard. Validação visual/live segue pendente da Etapa 4.
- Etapa 7/7 finalizada — suíte completa: 55 aprovados, 0 falhas, 0 ignorados, 74,648 s; `pip check`, `compileall`, integridade SQLite, foreign keys e checksums das duas migrations aprovados. Log disponível: quatro linhas, sem erros/tracebacks/startup. Nenhuma chamada paga.

Comando de retomada, no terminal do usuário (a senha é digitada sem eco e não deve ser enviada no chat):

```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
```

Após o usuário confirmar apenas que a configuração terminou, validar `http://127.0.0.1:8790/` e continuar com browser/login. Não enviar nem registrar valor/hash da senha.

## Continuidade autônoma — etapas 8–15 (2026-10-11)

- Etapa 8/15 finalizada — inventário verificável em `COCKPIT_INVENTARIO_HERANCA.md`. Export BDS declara 108/108 memórias (90 ALWAYS, 18 CALLED); backup JSON local válido com 108 registros, 22 skills, 6 personas e 2 MCPs. Exportação dos corpos de chats é incompleta. Nenhum conteúdo sensível foi importado. Context Core v0.3.0 foi inspecionado em modo somente leitura; DB íntegro (20 entries, 4 agents, 1 node, 85 jobs, 87 runs), serviços 8787/8788 sem listener; nenhum serviço foi iniciado.
- Etapa 9/15 iniciada, parcial — `POST /api/orchestrator/plan` (sessão autenticada) agora aceita IDs de conversa/mensagem, texto, projeto opcional, contexto explícito com proveniência, referências e metadados. Faz classificação determinística, chama o roteador existente, cria Job e Artifact `orchestration_plan`, registra `orchestration_planned` e retorna plano com `execution_state=not_started`. Não chama conectores, não cria memória e não envia contexto para provedor. A conversa existente permanece Echo/Mock; não é apresentada como agente real.
- Segurança da heurística: privacidade explicitamente indicada é prioridade; termos no plural “confidenciais” também são tratados como privados. Texto não reconhecido vai a revisão manual conforme regras existentes. Classificação por palavras-chave é limitada e não equivale a interpretação semântica completa.
- Validação desta continuidade: `unittest discover` — 56 aprovados, 0 falhas, 0 ignorados; `pip check` sem dependências quebradas; `compileall` aprovado; SQLite `integrity_check=ok`, zero violações FK e migrations 0001/0002 presentes com seus checksums esperados. Porta 8790 sem listener na inspeção final. Nenhuma chamada paga.
- Configuração revalidada sem ler/exibir segredo: `auth_is_configured=True`, `COCKPIT_DEV_AUTH_BYPASS=False`. Isso atualiza os registros históricos anteriores que diziam hash ausente; não houve login por navegador nem startup vivo nesta sessão.
- As etapas 10–15 não foram implementadas nesta sessão: as especificações detalhadas não estavam disponíveis no trecho de missão recebido. Nenhum requisito foi inventado. A conexão Context Core permanece bloqueada até existir contrato seguro de autenticação/read-only; o adapter no Cockpit segue stub.
- Próxima tarefa: obter a continuação da especificação das etapas 9–15, revisar a heurística em conjunto com critérios de aceitação e só então integrar a rota ao fluxo de chat/UI. Para iniciar manualmente o servidor local já configurado: `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`.

## Contratos de persona, biblioteca canônica e colaboração — 2026-10-11

Auditoria inicial (código + banco + Drive, 5.595 arquivos percorridos): **Reclamão não existia em lugar nenhum** (código, banco, catálogo ou documentação); **Estudioso existia apenas como registro legado** (linha `estudioso` na tabela `personas` e registro documental BDS `ESTUDIOSO`); **Diretor de Projetos não existia**. Os três foram tratados como criação canônica, sem apagar herança e sem duplicar identidade lógica.

- Migration aditiva `migrations/0004_knowledge_review_research.sql` (checksum `023c1aec693b787d5a391e8c232d07d8e00b7b0f6f0ccf935697a2238dfb2495`): `knowledge_items`, `knowledge_sources`, `knowledge_versions`, `review_threads`, `review_objections`, `research_topics`, `research_runs`, `research_findings`. As migrations 0001–0003 permanecem intactas.
- `core/agents.py`: contrato canônico vive no código (`CANONICAL_AGENTS`, com missão, regras de participação e skills de cada agente) e é materializado auditavelmente em `ecosystem_records` com `source='cockpit-canonical'`. `seed_canonical_agents` é idempotente (`ON CONFLICT DO NOTHING`), nunca sobrescreve registro alheio e roda no startup via `core/db.py`. Foram inseridos 16 registros (3 personas + 13 skills); o catálogo passou de 161 para 177 linhas.
- `core/knowledge.py`, `core/review.py`, `core/research.py`: biblioteca canônica com versões e proveniência; ciclo estudo → revisão → contestação fundamentada (objeção com 7 elementos) → resposta → consolidação, com limite de rodadas e escalonamento humano; agenda recorrente **inerte por padrão** (tema criado pausado, execução bloqueada sem provedor configurado e sem autorização explícita, achados deduplicados).
- `api/routes_knowledge.py`: rotas autenticadas `/api/knowledge`, `/api/reviews`, `/api/research` e `/api/agents` (sessão + CSRF + Origin). Nenhuma dessas rotas faz chamada externa.
- Chat (`api/routes_chat.py`): aceita `request_agents`, seleciona candidatos pelo contexto e devolve `candidate_agents` e `agents_without_executor` de forma explícita; nenhuma persona é apresentada como autora de resposta.
- Interface (`frontend/index.html`): painel **CONHECIMENTO** com quatro áreas — Estudos, Revisões críticas, Agenda de pesquisa e Agentes — reutilizando o CSS `.ecosystem-*` existente, sem novo módulo de build. Identidade preservada: "Chat do Cockpit", placeholder "Sobre o que vamos conversar?" e Orquestrador nunca como interlocutor principal.
- Executores reais: `PERSONA_EXECUTORS` e `SKILL_EXECUTORS` seguem **vazios** em `core/capabilities.py`. Por isso nenhum agente é operacional: Estudioso e Reclamão ficam `documentary_no_executor` e o Diretor de Projetos `planned_not_registered`; `/api/agents` devolve aviso de ausência de executor e nenhum item operacional.
- Validação: `unittest discover -s tests -p 'test_*.py'` — **133 testes, 0 falhas, 0 ignorados, 410,706 s**; `pip check` sem dependências quebradas; `compileall` aprovado; JavaScript inline com parse aprovado (`node --check`). Testes novos: `tests/test_agents.py`, `test_knowledge.py`, `test_review.py`, `test_research.py`, `test_knowledge_api.py`, `test_frontend_knowledge.py`.
- Banco canônico auditado somente leitura ao final: `integrity_check=ok`, zero violações FK, migrations 0001–0004 registradas; tabelas novas com 0 linhas (nenhum teste escreveu no banco canônico); `chat_messages=20` e `jobs=2` inalterados; 3 sessões pré-existentes (a sessão temporária usada na verificação ao vivo foi removida). Na API de Ecossistema ficam visíveis 16 personas e 35 skills, com 10 registros substituídos ocultos sem exclusão.
- Servidor local iniciado nesta sessão: Uvicorn **PID 1176** em `http://127.0.0.1:8790`, único listener da porta. Verificação ao vivo autenticada: **14/14 OK** (`/api/health` 200 público; `/api/agents`, `/api/knowledge`, `/api/reviews` e `/api/research/agenda` 401 sem sessão; escrita sem CSRF 403; 3 agentes canônicos listados; identidade do chat e painel presentes no HTML servido).
- Backup pré-mudança: `backups/pre-colaboracao-20261011-131347/` (cópia de `data/cockpit.db`, dos arquivos de código alteráveis e de `frontend/index.html`). Nenhum arquivo do Drive foi movido, nenhum banco foi substituído e nenhum dado legado foi apagado.
- Pendências que dependem de autorização do usuário: registrar executores reais de personas/skills; configurar provedor e liberar a agenda de pesquisa recorrente (hoje pausada); decidir consolidação do registro BDS `ESTUDIOSO` contra o contrato canônico `Estudioso` (convivência preservada, nada foi sobrescrito); validação visual autenticada no navegador; adapter Context Core continua stub.
