{
  "schema": "vpsnova-progress-operations/1",
  "updated_at": "2026-09-20T03:49:06.930689+00:00",
  "record_type": "documental",
  "summary": {
    "headline": "Meta ativa: casas principais online",
    "diagnosis": "10 fontes sondadas na VPS; 8 nativas e 1 conector externo com captura válida no lote. 7 de 9 principais têm captura própria comprovada; online continua em zero.",
    "next_delivery": "Instalar V4 permanente no TEST e publicar um original rastreável até a API."
  },
  "lanes": [
    {
      "id": "coleta",
      "label": "Coleta por casa",
      "description": "Agenda, workers, sessões, limites e capturas originais.",
      "owner": "Integração VPSODDS + responsáveis BETMONITOR"
    },
    {
      "id": "dados",
      "label": "Fable e persistência",
      "description": "Identidade exata, batches V4, processamento e banco.",
      "owner": "Integração VPSODDS + responsável Fable"
    },
    {
      "id": "consumo",
      "label": "API e consumidor",
      "description": "Snapshot, mudanças, atualidade e exibição das ofertas.",
      "owner": "Integração VPSODDS + responsável pelo painel"
    },
    {
      "id": "entrega",
      "label": "Implantação e aceite",
      "description": "Isolamento, evidências, release, recuperação e promoção.",
      "owner": "Integrador; dono aprova o lote operacional"
    }
  ],
  "waves": [
    {
      "id": "base",
      "number": "00",
      "title": "Base já preparada",
      "status": "done",
      "status_label": "Comprovada no escopo",
      "objective": "Preservar a VPS e criar a bancada Linux para os testes.",
      "depends_on": [],
      "work_items": [
        "D0",
        "D1",
        "D2"
      ],
      "entry": [
        "VPS existente identificada e preservação autorizada."
      ],
      "exit": [
        "Backup recuperável, TEST separado e clientes carregados no Linux."
      ],
      "user_decision": "Etapa executada. As provas são de infraestrutura e preparo, sem coleta de odds."
    },
    {
      "id": "execucao",
      "number": "01",
      "title": "Montar a execução do produto",
      "status": "next",
      "status_label": "Próxima entrega",
      "objective": "Transformar os componentes existentes em um fluxo executável e testável.",
      "depends_on": [
        "base"
      ],
      "work_items": [
        "P1",
        "P2",
        "P3",
        "P4",
        "P5",
        "P6",
        "S1",
        "M1",
        "M2",
        "M3",
        "M4",
        "M5"
      ],
      "entry": [
        "Usar as releases identificadas e os contratos existentes."
      ],
      "exit": [
        "Workers executam trabalhos isolados e retomam o estado.",
        "Contrato V4 e consumidor têm testes reproduzíveis.",
        "Perfis JSON e pacote de release podem ser revisados."
      ],
      "user_decision": "Revisar o pacote e o escopo da primeira campanha TEST: fontes, janela, concorrência e limites. Não aprovar uma descrição abstrata."
    },
    {
      "id": "paralelo",
      "number": "02",
      "title": "Testar fontes e integração em paralelo",
      "status": "blocked",
      "status_label": "Depende dos componentes indicados",
      "objective": "Homologar 10–20 casas e OddsAlerts enquanto o fluxo completo é validado.",
      "depends_on": [
        "execucao"
      ],
      "work_items": [
        "N1",
        "N2",
        "I1",
        "I2",
        "I3"
      ],
      "entry": [
        "Coleta de rede depende de P1/P2; pode começar antes de terminar a ponte V4.",
        "Replay do produto depende de P4/P5; pode usar capturas preservadas sem esperar a rede.",
        "As dependências de cada tarefa prevalecem sobre a numeração das ondas."
      ],
      "exit": [
        "Matriz por fonte informa captura, leitura, publicação e consumidor.",
        "OddsAlerts ou um subconjunto nativo percorre o fluxo completo.",
        "Falhas ficam localizadas, com evidências e próximo reparo."
      ],
      "user_decision": "Receber uma demonstração por fonte/mercado. Fontes com problema continuam em TEST; as aprovadas seguem juntas."
    },
    {
      "id": "homologacao",
      "number": "03",
      "title": "Provar estabilidade e apresentar o lote",
      "status": "future",
      "status_label": "Após o fluxo completo",
      "objective": "Demonstrar continuidade e recuperação do subconjunto candidato em TEST.",
      "depends_on": [
        "paralelo"
      ],
      "work_items": [
        "T1",
        "U1"
      ],
      "entry": [
        "Ao menos um fluxo externo ou nativo já passa de ponta a ponta.",
        "Retorno à release anterior foi ensaiado em TEST."
      ],
      "exit": [
        "Observação conjunta de 24–48 h, sem multiplicar o prazo por casa.",
        "Lote contém versões, fontes/mercados aprovados, métricas e pendências excluídas."
      ],
      "user_decision": "Aprovar o lote exato para RUN, depois de ver resultados e limites. Não há lote pronto aguardando sua aprovação agora."
    },
    {
      "id": "run",
      "number": "04",
      "title": "Promover e ampliar por lotes",
      "status": "future",
      "status_label": "Após seu aceite",
      "objective": "Operar as versões aprovadas em RUN e continuar a homologação das demais.",
      "depends_on": [
        "homologacao"
      ],
      "work_items": [
        "R1",
        "R2",
        "M6",
        "M7"
      ],
      "entry": [
        "Aceite registrado do manifesto do lote e recuperação disponível."
      ],
      "exit": [
        "RUN entrega ofertas ao consumidor com identidade, origem e idade corretas.",
        "Atualização ou falha de uma fonte não interrompe as outras."
      ],
      "user_decision": "Cada ampliação leva apenas o subconjunto aprovado. O próximo lote não precisa esperar todas as casas."
    }
  ],
  "work_items": [
    {
      "id": "D0",
      "title": "Preservação recuperável",
      "wave_id": "base",
      "lane_id": "entrega",
      "status": "done",
      "status_label": "Comprovado",
      "depends_on": [],
      "delivery": "Snapshot registrado e backup local criptografado com recuperação de banco testada.",
      "actions": [
        "Preservar os seis containers e configurações originais."
      ],
      "acceptance": [
        "27 artefatos autenticados; restauração PostgreSQL e duas cópias SQLite conferidas."
      ],
      "reuse": [
        "tools/backup-vps-local.py",
        "docs/BACKUP_BASELINE_20260917.md"
      ],
      "evidence": [
        "backup",
        "snapshot"
      ],
      "owner": "Integrador",
      "decision": "Reconfirmar a validade da recuperação antes de cada mudança operacional; snapshot tem expiração."
    },
    {
      "id": "D1",
      "title": "TEST com banco e API próprios",
      "wave_id": "base",
      "lane_id": "entrega",
      "status": "done",
      "status_label": "Comprovado",
      "depends_on": [
        "D0"
      ],
      "delivery": "Três serviços isolados: PostgreSQL, ingestão V1 e API privada.",
      "actions": [
        "Implantar a fundação em projeto Docker separado."
      ],
      "acceptance": [
        "16 verificações sintéticas aprovadas; autenticação, isolamento e reinício independente conferidos."
      ],
      "reuse": [
        "infra/test/compose.yaml",
        "tools/verify-test-foundation.mjs"
      ],
      "evidence": [
        "test_foundation",
        "test_functional"
      ],
      "owner": "Integração VPSODDS",
      "decision": "TEST disponível para integrar o produto; o contrato V4 ainda não foi exercitado nessa fundação."
    },
    {
      "id": "D2",
      "title": "Pacote Linux dos componentes",
      "wave_id": "base",
      "lane_id": "coleta",
      "status": "done",
      "status_label": "Preparo comprovado",
      "depends_on": [
        "D0"
      ],
      "delivery": "23 clientes construídos, Engine Fable e módulos OddsAlerts carregados sem rede.",
      "actions": [
        "Fixar versões de origem e dependências da imagem comum."
      ],
      "acceptance": [
        "23/23 imports e construções aprovados; seis schemas carregados; psutil incluído."
      ],
      "reuse": [
        "tools/build-test-inputs.py",
        "infra/test/python-requirements.txt"
      ],
      "evidence": [
        "linux_preflight"
      ],
      "owner": "Integração VPSODDS",
      "decision": "Importação comprova preparo; os testes funcionais e de acesso seguem abaixo."
    },
    {
      "id": "P1",
      "title": "Campanha JSON e agenda móvel",
      "wave_id": "execucao",
      "lane_id": "coleta",
      "status": "next",
      "status_label": "Pode começar",
      "depends_on": [
        "D2"
      ],
      "delivery": "Manifesto executável de TEST com fontes, janela móvel, limites e caminhos privados.",
      "actions": [
        "Reaproveitar campaign.example.json; substituir datas fixas por janela atual e renovação.",
        "Preservar prioridades já registradas; incluir MGM e BetConstruct enquanto a divergência documental é reconciliada.",
        "Definir trabalhos ativos, conexões internas, orçamento por credencial, cadência, timeout e reação a 401/403/429.",
        "Manter Papi pausada; usar catálogos nativos e vínculos exatos preservados sem inventar correspondências."
      ],
      "acceptance": [
        "Configuração validada e registrada por hash.",
        "Agenda atravessa a mudança de dia e respeita o estado pré-live nativo.",
        "Credenciais e runtime ficam fora da imagem e do Git."
      ],
      "reuse": [
        "pilot/raw_campaign/campaign.example.json",
        "pilot/raw_campaign/supervisor.py: allowed_event, plan, validate_config_reload"
      ],
      "evidence": [
        "plano",
        "codigo"
      ],
      "owner": "Integração VPSODDS",
      "decision": "A composição do lote e os limites ficam explícitos antes da campanha; não refazer a ordem de prioridade do dono."
    },
    {
      "id": "P2",
      "title": "Worker isolado por casa",
      "wave_id": "execucao",
      "lane_id": "coleta",
      "status": "blocked",
      "status_label": "Após P1",
      "depends_on": [
        "P1"
      ],
      "delivery": "Uma instância de coletor por fonte/casa/modo, usando a imagem comum e a fila existente.",
      "actions": [
        "Adaptar dispatch_reserved ao despacho para workers isolados.",
        "Cada trabalho continua em processo novo, preservando a restrição da interface BETMONITOR.",
        "Conservar reserva persistente, job_id, timeout, confirmação e recuperação de tentativas incertas.",
        "Montar apenas o volume e as credenciais da fonte; não dar Docker socket ou acesso ao PostgreSQL aos coletores."
      ],
      "acceptance": [
        "Reiniciar um worker não interrompe outro.",
        "Interrupção entre reserva, captura e confirmação retoma sem duplicação.",
        "Original incompleto permanece identificado e não vira sucesso."
      ],
      "reuse": [
        "pilot/raw_campaign/supervisor.py: dispatch_reserved",
        "pilot/raw_campaign/worker.py",
        "interface_orquestrador.py"
      ],
      "evidence": [
        "codigo",
        "plano"
      ],
      "owner": "Integração VPSODDS + BETMONITOR",
      "decision": "Reaproveitar o scheduler e os transportes; não criar um segundo supervisor concorrente."
    },
    {
      "id": "P3",
      "title": "Fechar a fronteira V4 com a VPS",
      "wave_id": "execucao",
      "lane_id": "dados",
      "status": "next",
      "status_label": "Pode começar",
      "depends_on": [
        "D1",
        "D2"
      ],
      "delivery": "Contrato de entrada V4 e matriz de compatibilidade com a fundação V1.",
      "actions": [
        "Comparar batch, snapshot, changes e observações V4 com os campos do runtime V1.",
        "Garantir IDs literais, namespaces, período, linha, seleção e preços como decimais exatos.",
        "Definir como evoluir o runtime de TEST quando o V1 perder informação; não reduzir o V4 para caber silenciosamente."
      ],
      "acceptance": [
        "Exemplo válido aceito e contradições rejeitadas com razão.",
        "Pending/conflict não entra como oferta confirmada.",
        "Contrato produtor/consumidor e migrations revisados juntos."
      ],
      "reuse": [
        "Fable schemas/batch-v4.schema.json",
        "Fable schemas/feed-snapshot-v4.schema.json",
        "Fable schemas/feed-changes-v4.schema.json",
        "contracts/odds-event.v1.json",
        "contracts/odds-snapshot.v1.json"
      ],
      "evidence": [
        "contrato",
        "test_functional"
      ],
      "owner": "Integração VPSODDS + Fable",
      "decision": "A fundação V1 não é prova de compatibilidade V4; a decisão técnica será sustentada pela matriz de campos."
    },
    {
      "id": "P4",
      "title": "Persistir V4 com confirmação e retomada",
      "wave_id": "execucao",
      "lane_id": "dados",
      "status": "blocked",
      "status_label": "Após P3",
      "depends_on": [
        "P3"
      ],
      "delivery": "Saída Fable validada chegando ao PostgreSQL por ingestão com confirmação persistente.",
      "actions": [
        "Conectar outbox/recibos, Fable compartilhado e ingresso V4.",
        "Confirmar o processamento após persistência; falha de harmonização permite replay sem recaptura.",
        "Manter estado atual, journal e registro de observação separados."
      ],
      "acceptance": [
        "A→B→A conserva as duas mudanças.",
        "Observação antiga não substitui a atual; retry não duplica.",
        "Ausência em resposta parcial não remove ofertas.",
        "Origem e hash permitem rastrear cada oferta ao original."
      ],
      "reuse": [
        "services/ingest-core/app.mjs",
        "services/ingest-core/server.mjs",
        "tools/db-migrate.mjs",
        "Fable Store e schemas V4"
      ],
      "evidence": [
        "contrato",
        "plano"
      ],
      "owner": "Integração VPSODDS + Fable",
      "decision": "PostgreSQL recebe ofertas validadas; o arquivo SQLite de estudo não será copiado como banco operacional."
    },
    {
      "id": "P5",
      "title": "Consumidor com snapshot, deltas e idade",
      "wave_id": "execucao",
      "lane_id": "consumo",
      "status": "blocked",
      "status_label": "Após P3; paralelo a P4",
      "depends_on": [
        "P3"
      ],
      "delivery": "Consumidor de TEST que mostra oferta, origem, estado e atualidade pelo contrato V4.",
      "actions": [
        "Adaptar a API de leitura e usar o consumidor existente como referência verificável.",
        "Aplicar snapshot com cursor consistente, depois changes até has_more=false.",
        "Usar observações para atualidade da captura sem mudar artificialmente o horário da odd.",
        "Confirmar o consumidor final e sua integração externa antes de promover RUN."
      ],
      "acceptance": [
        "Snapshot reconstruído pelos deltas fica idêntico no mesmo cursor.",
        "Cursor salvo permite retomar; cursor expirado exige novo snapshot.",
        "Seleção suspensa permanece identificada e não oferece preço utilizável.",
        "Histórico/replay não aparece como cotação atual."
      ],
      "reuse": [
        "services/api-read/server.mjs",
        "services/api-read/index.mjs",
        "services/odds-console/index.mjs",
        "Fable feed-snapshot/feed-changes/observations"
      ],
      "evidence": [
        "contrato",
        "plano"
      ],
      "owner": "Integração VPSODDS + consumidor",
      "decision": "O console de TEST é prova de integração. O painel externo precisa passar pela mesma verificação antes do aceite operacional."
    },
    {
      "id": "P6",
      "title": "Reaproveitar e verificar leitores por fonte",
      "wave_id": "execucao",
      "lane_id": "dados",
      "status": "next",
      "status_label": "Pode começar",
      "depends_on": [
        "D2"
      ],
      "delivery": "Matriz por casa/mercado separando leitor existente, replay aprovado e lacunas.",
      "actions": [
        "Reutilizar leitores/regras já comprovados com capturas preservadas.",
        "Conferir os quatro leitores não declarados no pacote: Brasil.bet, Brazino777, Pitaco e Matchbook.",
        "Mapear lacunas por evento/mercado/seleção/dimensões; manter pendências isoladas.",
        "Uma regra nova exige evidência em dois eventos e regressão, sem refazer essa exigência para cada linha de regra já aprovada."
      ],
      "acceptance": [
        "Saída V4 rastreável e identidade exata no subconjunto testado.",
        "Falta de um leitor não bloqueia coleta original nem outras fontes.",
        "Nenhuma correspondência operacional por nome, preço ou aproximação."
      ],
      "reuse": [
        "Fable fable/",
        "Fable dicionarios/ e catálogo oficial",
        "docs/validation/linux_preflight_20260917.json"
      ],
      "evidence": [
        "linux_preflight",
        "contrato",
        "plano"
      ],
      "owner": "Fable + responsáveis por fonte",
      "decision": "19 leitores declarados no pacote não significam 19 casas homologadas; os resultados serão registrados separadamente."
    },
    {
      "id": "S1",
      "title": "Release e retorno ensaiáveis",
      "wave_id": "execucao",
      "lane_id": "entrega",
      "status": "next",
      "status_label": "Pode começar",
      "depends_on": [
        "D1",
        "D2"
      ],
      "delivery": "Manifesto de release, perfis de ambiente e procedimento de retorno testável.",
      "actions": [
        "Fixar commits, digests de imagens, catálogo, configuração e migrations.",
        "Preparar projeção RUN com dados, segredos e cursores próprios; ainda sem ativar.",
        "Ensaiar retorno em TEST e preservar compatibilidade dos dados entre as versões.",
        "Adquirir lock exclusivo de deploy; recusar concorrência ou release divergente.",
        "Desenvolvimento em raiz exata, alterações revisadas e preservação externa; não tratar worktree como backup."
      ],
      "acceptance": [
        "A mesma versão pode ser reimplantada sem reconstrução imprevisível.",
        "Retorno recupera API, cursor e estado sem apagar originais.",
        "Serviços existentes e volumes originais permanecem intactos."
      ],
      "reuse": [
        "tools/deploy-test-foundation.py",
        "tools/deploy-test-foundation.sh",
        "infra/test/compose.yaml",
        "config/test/environment.json"
      ],
      "evidence": [
        "test_foundation",
        "plano"
      ],
      "owner": "Integrador",
      "decision": "Promoção muda a release/configuração em RUN; renomear o container TEST não é o procedimento."
    },
    {
      "id": "N1",
      "title": "Campanha nativa de 10–20 casas",
      "wave_id": "paralelo",
      "lane_id": "coleta",
      "status": "blocked",
      "status_label": "Após P1/P2; paralelo ao V4",
      "depends_on": [
        "P1",
        "P2"
      ],
      "delivery": "Catálogo e detalhe originais obtidos pelo IP da VPS, com resultado individual por casa.",
      "actions": [
        "Executar o lote das prioridades existentes em paralelo e registrar catálogo, routing, detalhe e completude.",
        "Medir casas habilitadas, jobs ativos e conexões internas separadamente.",
        "Tratar falhas e bloqueios por fonte; repetir somente o necessário.",
        "Captura pode ficar preservada enquanto a harmonização é concluída."
      ],
      "acceptance": [
        "IDs solicitados correspondem à captura recebida.",
        "Bytes, hash, instante, fonte e escopo são preservados antes de interpretar.",
        "HTTP 200 sem captura válida ou paginação completa não vira aprovação.",
        "Concorrência cabe no orçamento medido do host e dos fornecedores."
      ],
      "reuse": [
        "interface_orquestrador.py: criar_cliente, catalogo, detalhe",
        "pilot/raw_campaign/worker.py"
      ],
      "evidence": [
        "plano",
        "codigo"
      ],
      "owner": "BETMONITOR + integração",
      "decision": "A campanha não espera a conclusão de todas as regras Fable. Nenhuma coleta é iniciada por esta revisão do plano.",
      "execution_update": {
        "label": "Sondagem real registrada; aceite completo pendente",
        "detail": "10 fontes sondadas na VPS; 8 nativas e 1 conector externo com captura válida no lote. 7 de 9 principais têm captura própria comprovada; online continua em zero.",
        "evidence": [
          "source_probe_20260919"
        ]
      }
    },
    {
      "id": "N2",
      "title": "OddsAlerts com um conector e seis casas",
      "wave_id": "paralelo",
      "lane_id": "coleta",
      "status": "blocked",
      "status_label": "Após P1/P2; paralelo às nativas",
      "depends_on": [
        "P1",
        "P2"
      ],
      "delivery": "Autenticação, orçamento, paginação e dados atuais conferidos por bookmaker.",
      "actions": [
        "Usar a credencial já preparada e a seleção 1,2,3,5,6,7.",
        "Preservar uma reserva de quota por credencial e um fluxo de consulta compartilhado.",
        "Distinguir /latest e seus movimentos de abertura, fechamento e pico históricos.",
        "Registrar a cobertura efetivamente devolvida pela conta; não assumir que o pacote cobre tudo."
      ],
      "acceptance": [
        "Consumo e recuo registrados sem vazar token em next_page_url.",
        "Pinnacle, Bet365, 1XBet, Betfair Exchange, Kambi e Betano identificadas por bookmaker.",
        "Origem OddsAlerts permanece distinta da coleta própria."
      ],
      "reuse": [
        "pilot/raw_campaign/external.py",
        "pilot/oddalerts_feed.py",
        "credencial privada de TEST"
      ],
      "evidence": [
        "test_credentials",
        "linux_preflight",
        "plano"
      ],
      "owner": "Integração + fonte OddsAlerts",
      "decision": "OddsAlerts é a primeira linha completa pretendida de produto, com as nativas avançando ao mesmo tempo.",
      "execution_update": {
        "label": "Sondagem real registrada; aceite completo pendente",
        "detail": "OddsAlerts recebeu catálogo e detalhe agregado. Cobertura individual por bookmaker e publicação V4 ainda não comprovadas.",
        "evidence": [
          "source_probe_20260919"
        ]
      }
    },
    {
      "id": "I1",
      "title": "Replay completo no TEST",
      "wave_id": "paralelo",
      "lane_id": "consumo",
      "status": "blocked",
      "status_label": "Após P4/P5; independe de nova rede",
      "depends_on": [
        "P4",
        "P5"
      ],
      "delivery": "Captura preservada → Fable → PostgreSQL → API → consumidor, sem renovar seu timestamp.",
      "actions": [
        "Reproduzir capturas e casos negativos do contrato no ambiente integrado.",
        "Conferir a identidade e os contadores em cada fronteira.",
        "Ensaiar repetição, atraso, parcial, suspensão e retomada."
      ],
      "acceptance": [
        "Os mesmos records são reconstruídos pelo snapshot e journal.",
        "A falha aparece no ponto correto e não exige nova consulta ao fornecedor.",
        "Replay fica identificado como replay, fora das ofertas atuais."
      ],
      "reuse": [
        "Capturas preservadas e fixtures V4",
        "Serviços TEST integrados"
      ],
      "evidence": [
        "contrato",
        "plano"
      ],
      "owner": "Integrador + consumidor",
      "decision": "Os 16 testes sintéticos V1 anteriores não substituem esta prova V4."
    },
    {
      "id": "I2",
      "title": "OddsAlerts até o consumidor",
      "wave_id": "paralelo",
      "lane_id": "consumo",
      "status": "blocked",
      "status_label": "Após N2/I1",
      "depends_on": [
        "N2",
        "I1"
      ],
      "delivery": "Primeiro subconjunto de ofertas OddsAlerts atuais chegando corretamente ao consumidor.",
      "actions": [
        "Aplicar mapeamentos já comprovados e manter mercados sem prova pendentes.",
        "Conferir IDs, bookmaker, período, linha, estado e idade nas duas pontas."
      ],
      "acceptance": [
        "Amostra de ofertas conferida do original à tela.",
        "Sem usar histórico como preço atual nem fundir fontes sem identidade exata."
      ],
      "reuse": [
        "Mapeamento OddsAlerts existente",
        "Ponte V4 e consumidor TEST"
      ],
      "evidence": [
        "plano",
        "contrato"
      ],
      "owner": "Integração + OddsAlerts + consumidor",
      "decision": "Pode chegar à observação de lote sem esperar a última fonte nativa."
    },
    {
      "id": "I3",
      "title": "Subconjuntos nativos até o consumidor",
      "wave_id": "paralelo",
      "lane_id": "consumo",
      "status": "blocked",
      "status_label": "Após N1/I1; leitor aprovado por fonte",
      "depends_on": [
        "N1",
        "I1"
      ],
      "delivery": "Ofertas próprias publicadas somente nos mercados/dimensões já comprovados.",
      "actions": [
        "Usar o resultado de P6 para habilitar o subconjunto de cada fonte.",
        "Mostrar capturado, confirmado, pendente, conflitante e publicado separadamente.",
        "Deixar as casas/mercados ainda incompletos em TEST."
      ],
      "acceptance": [
        "Cada fonte mantém procedência e oferta próprias.",
        "Reiniciar uma casa não causa perda ou parada das demais.",
        "Vínculo ausente permanece pendente e contável."
      ],
      "reuse": [
        "Leitores aprovados por fonte em P6",
        "Capturas N1",
        "Ponte V4 e consumidor TEST"
      ],
      "evidence": [
        "plano",
        "contrato"
      ],
      "owner": "BETMONITOR + Fable + integração",
      "decision": "P6 é verificado por fonte, sem exigir que todos os leitores fiquem prontos juntos."
    },
    {
      "id": "T1",
      "title": "Observação conjunta e recuperação",
      "wave_id": "homologacao",
      "lane_id": "entrega",
      "status": "blocked",
      "status_label": "Após um fluxo completo",
      "depends_on": [
        "S1",
        "M1"
      ],
      "depends_any": [
        "I2",
        "I3"
      ],
      "delivery": "Relatório do lote candidato após janela conjunta de 24–48 h em TEST.",
      "actions": [
        "Medir atualização, idade, fila, erro, quota e recursos por fonte.",
        "Ensaiar perda de acesso, reinício de worker, retomada e retorno de release.",
        "Ajustar cadência pelo resultado real; reduzir/pausar só a fonte problemática."
      ],
      "acceptance": [
        "Sem perda silenciosa, duplicação indevida ou rejuvenescimento de odds.",
        "Orçamento respeitado e baseline preservado.",
        "Metas de atualidade definidas por fonte e verificadas com medições."
      ],
      "reuse": [
        "Matriz funcional de fontes",
        "Manifesto e retorno S1"
      ],
      "evidence": [
        "plano"
      ],
      "owner": "Integrador",
      "decision": "A janela é compartilhada pelo conjunto. As metas de latência serão propostas após as medições; não existe SLA validado hoje."
    },
    {
      "id": "U1",
      "title": "Apresentar o lote para sua aprovação",
      "wave_id": "homologacao",
      "lane_id": "entrega",
      "status": "future",
      "status_label": "Ainda não há lote pronto",
      "depends_on": [
        "T1",
        "M2",
        "M3"
      ],
      "delivery": "Manifesto revisável com fontes, mercados, versões, métricas, exclusões e retorno.",
      "actions": [
        "Demonstrar no consumidor o que será ligado em RUN.",
        "Listar as fontes e mercados que continuarão em TEST.",
        "Registrar o aceite do dono para aquele lote exato."
      ],
      "acceptance": [
        "Aprovação sustentada por resultados do lote e recuperação ensaiada."
      ],
      "reuse": [
        "Evidências de T1",
        "Manifesto S1"
      ],
      "evidence": [
        "plano"
      ],
      "owner": "Integrador prepara; dono decide",
      "decision": "Aprovar a promoção do lote; ajustes técnicos internos não exigem nova aprovação a cada arquivo."
    },
    {
      "id": "R1",
      "title": "Implantar o lote em RUN",
      "wave_id": "run",
      "lane_id": "entrega",
      "status": "future",
      "status_label": "Após U1",
      "depends_on": [
        "U1"
      ],
      "delivery": "Versão aprovada operando com banco, volumes, tokens e cursores de RUN.",
      "actions": [
        "Usar o mesmo digest testado e as configurações próprias de RUN.",
        "Executar migrations compatíveis e verificar API/consumidor.",
        "Evitar duplicar a coleta TEST/RUN na mesma credencial sem orçamento conjunto.",
        "Conservar a release anterior como retorno."
      ],
      "acceptance": [
        "Ofertas e cursores corretos; fontes não aprovadas continuam desligadas em RUN.",
        "Baseline preservado e rollback disponível."
      ],
      "reuse": [
        "Pacote S1",
        "Manifesto aprovado U1"
      ],
      "evidence": [
        "plano"
      ],
      "owner": "Integrador",
      "decision": "Promove a versão e o lote; não renomeia o container TEST nem reaproveita seus dados de ensaio."
    },
    {
      "id": "R2",
      "title": "Operar e ampliar continuamente",
      "wave_id": "run",
      "lane_id": "entrega",
      "status": "future",
      "status_label": "Após R1",
      "depends_on": [
        "R1"
      ],
      "delivery": "RUN acompanhado enquanto novos subconjuntos são homologados em TEST.",
      "actions": [
        "Observar atualidade, erros, quota e capacidade por fonte.",
        "Promover novos lotes e reverter só a fonte/release afetada quando possível.",
        "Manter exportação seletiva do CRU útil para os discos locais."
      ],
      "acceptance": [
        "Incidentes localizados e estado público coerente.",
        "Expansão reproduzível usando os mesmos critérios de aceite."
      ],
      "reuse": [
        "Matriz de fontes",
        "Ciclo TEST → aceite → RUN"
      ],
      "evidence": [
        "plano"
      ],
      "owner": "Operação + integração",
      "decision": "Continuidade e ampliação sem aguardar todas as pendências do catálogo."
    },
    {
      "id": "M1",
      "title": "Métricas e alertas por fonte",
      "wave_id": "execucao",
      "lane_id": "entrega",
      "status": "next",
      "status_label": "Pode avançar em paralelo",
      "depends_on": [
        "D1"
      ],
      "delivery": "Painéis de CPU/RAM, fila, erro, captura e idade por fonte, além da saúde da API.",
      "actions": [
        "Reaproveitar Prometheus/Grafana/Node Exporter existentes.",
        "Instrumentar workers, Fable, ingestão e leitura sem misturar TEST/RUN.",
        "Medir p95 e frequência real antes de fixar os limiares de atualidade."
      ],
      "acceptance": [
        "Falha ou atraso de uma fonte aparece com motivo e horário.",
        "Alerta diferencia fonte sem mudança de preço de fonte sem captura.",
        "Limiares do lote ficam no relatório de homologação."
      ],
      "reuse": [
        "Infraestrutura Prometheus/Grafana do baseline",
        "Métricas do runtime"
      ],
      "evidence": [
        "mestre",
        "plano"
      ],
      "owner": "Integração VPSODDS",
      "decision": "Observabilidade acompanha o produto; não duplica o console de odds."
    },
    {
      "id": "M2",
      "title": "Acesso privado e identidade do consumidor",
      "wave_id": "execucao",
      "lane_id": "consumo",
      "status": "next",
      "status_label": "Pode avançar em paralelo",
      "depends_on": [
        "D1"
      ],
      "delivery": "Backend do painel autenticado na API por Tailscale; administração preparada com Tunnel/Access.",
      "actions": [
        "Confirmar a identidade máquina-a-máquina na tailnet e credencial própria.",
        "Preparar Cloudflare Access com Google e allowlist exata para interfaces administrativas permanentes.",
        "Conferir os domínios propostos no plano antes de configurar DNS.",
        "Tratar rotação coordenada das credenciais mencionadas no plano, sem interromper serviços por iniciativa desta revisão."
      ],
      "acceptance": [
        "O navegador do usuário final não recebe token/endereço privado da VPS.",
        "API, PostgreSQL e ferramentas internas não ficam publicados diretamente.",
        "Allowlist/identidade e política de sessão verificadas antes da exposição permanente."
      ],
      "reuse": [
        "Tailscale existente",
        "Plano mestre: fronteiras de confiança e autenticação"
      ],
      "evidence": [
        "mestre",
        "plano"
      ],
      "owner": "Integração VPSODDS",
      "decision": "Identidade do backend, e-mail da allowlist e domínio são confirmados na etapa de acesso; não bloqueiam replay/captura no TEST."
    },
    {
      "id": "M3",
      "title": "Console operacional e comandos tipados",
      "wave_id": "execucao",
      "lane_id": "consumo",
      "status": "blocked",
      "status_label": "Conforme dependências",
      "depends_on": [
        "P2",
        "P5"
      ],
      "delivery": "Console com filtros, pendências e ações permitidas com auditoria.",
      "actions": [
        "Reaproveitar o console read-only.",
        "Implementar ops-control com comandos definidos para pausar/retomar/reprocessar e retornar uma fonte.",
        "Registrar ator, motivo, antes/depois, correlação e resultado.",
        "Manter browser e Hermes sem shell, banco ou Docker socket."
      ],
      "acceptance": [
        "Filtros por fonte/evento/mercado e trilha sanitizada funcionam.",
        "Operação não autorizada é rejeitada.",
        "Pausa/retomada e retorno têm resultado e auditoria conferidos."
      ],
      "reuse": [
        "services/odds-console/index.mjs",
        "Contrato e desenho ops-control do plano mestre"
      ],
      "evidence": [
        "mestre",
        "plano"
      ],
      "owner": "Integração VPSODDS",
      "decision": "Ocultações e ações perigosas exigem decisão explícita; o painel de progresso não vira controle de produção."
    },
    {
      "id": "M4",
      "title": "Hermes da VPS ODDS e interface protegida",
      "wave_id": "execucao",
      "lane_id": "entrega",
      "status": "next",
      "status_label": "Pode avançar em paralelo",
      "depends_on": [
        "D1"
      ],
      "delivery": "Assistente desta VPS acessível pelo canal aprovado e limitado a diagnóstico/propostas.",
      "actions": [
        "Reaproveitar instalação, perfil, memória e autenticação já documentados.",
        "Preparar interface web/canal protegido da VPS ODDS.",
        "Conferir primário/fallback com prova própria quando esta frente for executada.",
        "Entregar somente métricas e logs sanitizados ao assistente."
      ],
      "acceptance": [
        "Chat da VPS ODDS identificado sem confundir com Hermes AUTOBET.",
        "Acesso protegido e limites de sessão/tempo preservados.",
        "Não aposta nem decide reinício ou alteração de produção autonomamente."
      ],
      "reuse": [
        "docs/HERMES_PROFILE.md",
        "infra/hermes/",
        "Conversa Planejar nova VPS de odds: atualização de 17/09"
      ],
      "evidence": [
        "mestre",
        "plano"
      ],
      "owner": "Integração VPSODDS",
      "decision": "Telegram permanece canal planejado; WhatsApp é posterior. Hermes não é pré-requisito para capturar odds."
    },
    {
      "id": "M5",
      "title": "Exportação seletiva com hash e confirmação",
      "wave_id": "execucao",
      "lane_id": "entrega",
      "status": "next",
      "status_label": "Pode avançar em paralelo",
      "depends_on": [
        "D1"
      ],
      "delivery": "Lotes do material útil enviados ao destino local e conferidos antes de liberar remoção operacional.",
      "actions": [
        "Definir destino/protocolo para os HDs locais disponíveis.",
        "Fechar lote imutável com manifesto, intervalo, contagem e hash.",
        "Confirmar a integridade no destino e registrar ACK.",
        "Manter limite e retomada quando o destino estiver indisponível."
      ],
      "acceptance": [
        "Lote retransferido não duplica ou corrompe o acervo.",
        "Sem ACK não há elegibilidade para remoção.",
        "Falha dos HDs não para o feed, dentro do orçamento definido."
      ],
      "reuse": [
        "Desenho archive-exporter do plano mestre",
        "Recibos e backup existentes"
      ],
      "evidence": [
        "mestre",
        "plano"
      ],
      "owner": "Integração VPSODDS",
      "decision": "A janela quente original de 30 dias é um parâmetro a dimensionar. CRU de estudo não é retenção permanente obrigatória na VPS."
    },
    {
      "id": "M6",
      "title": "Escala além desta VPS",
      "wave_id": "run",
      "lane_id": "entrega",
      "status": "future",
      "status_label": "Quando houver necessidade comprovada",
      "depends_on": [
        "R2"
      ],
      "delivery": "Decisão de ampliar recursos/nós apoiada em métricas, mantendo contratos e identidade por fonte.",
      "actions": [
        "Medir limites do lote e pressão sustentada de CPU/RAM/fila.",
        "Separar coleta, ingestão ou regiões quando a necessidade estiver demonstrada.",
        "Reavaliar 50/100 fontes com particionamento e capacidade reais."
      ],
      "acceptance": [
        "Necessidade e custo comprovados antes de contratar ou introduzir orquestração maior."
      ],
      "reuse": [
        "Plano mestre: cenários 3,10,24,50,100 fontes",
        "Métricas de operação"
      ],
      "evidence": [
        "mestre",
        "plano"
      ],
      "owner": "Integração VPSODDS",
      "decision": "Não instalar Kubernetes, contratar outra VPS ou prometer 100 fontes nesta máquina por inferência."
    },
    {
      "id": "M7",
      "title": "Memória compartilhada opcional",
      "wave_id": "run",
      "lane_id": "entrega",
      "status": "future",
      "status_label": "Frente opcional; fora do caminho crítico",
      "depends_on": [],
      "delivery": "Protótipo OpenViking isolado com memória inicial aprovada e backup/export verificável.",
      "actions": [
        "Preparar peers separados e acesso privado.",
        "Medir orçamento de recursos e impacto antes de ativar permanentemente."
      ],
      "acceptance": [
        "Fonte de verdade continua em Git.",
        "Nenhum segredo no browser ou memória compartilhada sem curadoria.",
        "A API de odds continua dentro do orçamento aprovado."
      ],
      "reuse": [
        "Plano mestre: memória compartilhada",
        "Perfil e memória do Hermes"
      ],
      "evidence": [
        "mestre"
      ],
      "owner": "Responsável Hermes/memória",
      "decision": "Não atrasar coleta/API para implementar memória opcional."
    }
  ],
  "critical_path": [
    "P3",
    "P4",
    "I1",
    "I2",
    "T1",
    "U1",
    "R1"
  ],
  "decisions": [
    {
      "id": "modelo",
      "title": "Unidade de isolamento",
      "status": "recommended",
      "value": "Um coletor nativo por fonte + casa + modo, com imagem comum e trabalho isolado por processo.",
      "when": "Recomendação arquitetural deste plano; a implementação por casa ainda está pendente."
    },
    {
      "id": "paralelo",
      "title": "Homologação ampla",
      "status": "confirmed",
      "value": "10–20 casas na mesma campanha; OddsAlerts avança junto. Concorrência efetiva e consumo são medidos.",
      "when": "Preferência expressa do dono. Não impor espera serial por casa."
    },
    {
      "id": "latencia",
      "title": "Cadência e atualidade aceitáveis",
      "status": "open",
      "value": "Propor valores por fonte com base nos ensaios reais; intervalos antigos do piloto não são meta de produção.",
      "when": "Antes do aceite do lote, com métricas e limites conhecidos."
    },
    {
      "id": "promocao",
      "title": "O que você aprova",
      "status": "future",
      "value": "Um lote identificado de fontes/mercados, suas versões, resultados, limites e retorno.",
      "when": "Após homologação; nenhum lote está aguardando sua aprovação agora."
    }
  ],
  "architecture_decision": {
    "headline": "Um container por coletor nativo; núcleo compartilhado por ambiente",
    "unit": "fonte nativa + casa + modo (pré-live ou live separados)",
    "why": [
      "Reiniciar, atualizar ou pausar uma casa sem interromper as outras.",
      "Separar sessões, arquivos graváveis e limites de recursos de cada fonte.",
      "Reutilizar os transportes e a coordenação já existentes.",
      "Compartilhar Fable, PostgreSQL e API entre as casas do mesmo ambiente."
    ],
    "image_strategy": "Uma imagem é o pacote de código. Vinte containers podem executar o mesmo digest com configurações distintas. Manter poucas variantes por dependência — HTTP/WS e browser quando necessário — sem vinte Dockerfiles ou cópias do código.",
    "options": [
      {
        "model": "Um processo Python com todos os adaptadores",
        "benefit": "Poucos processos.",
        "cost": "Estado global, imports e travas podem cruzar casas. A interface atual exige isolamento por operação.",
        "recommendation": "Não adotar como executor compartilhado; preservar uma operação por processo.",
        "decision": "rejeitado"
      },
      {
        "model": "Supervisor e processos por job em um container",
        "benefit": "Reaproveita o piloto e reduz o esforço inicial.",
        "cost": "Reiniciar o container afeta o conjunto; memória e permissões ficam no mesmo grupo.",
        "recommendation": "Usar como referência de implementação e comparação, sem reescrever transportes.",
        "decision": "referencia"
      },
      {
        "model": "Container por coletor nativo, imagem comum",
        "benefit": "Falha, sessão, reinício, limites e release independentes por casa.",
        "cost": "Mais processos. O host e os fornecedores continuam limitando o total de trabalhos/conexões.",
        "recommendation": "Modelo operacional recomendado para coleta própria.",
        "decision": "recomendado"
      },
      {
        "model": "Fable, banco e API repetidos por casa",
        "benefit": "Autonomia completa de cada conjunto.",
        "cost": "Duplica catálogo, bancos, consumo de memória e manutenção sem necessidade.",
        "recommendation": "Compartilhar esses serviços dentro de TEST e, separadamente, dentro de RUN.",
        "decision": "rejeitado"
      },
      {
        "model": "Um conector OddsAlerts por credencial/fluxo",
        "benefit": "Preserva lotes, cursor e orçamento do agregador para várias casas.",
        "cost": "Precisa apresentar saúde e cobertura por bookmaker; containers extras não aumentam a quota.",
        "recommendation": "Adotar um conector compartilhado; não abrir polling completo independente por bookmaker.",
        "decision": "recomendado"
      }
    ],
    "code_evidence": [
      {
        "path": "G:/PROJETOS/VPSODDS-PILOTO/pilot/raw_campaign/supervisor.py:433",
        "observation": "dispatch_reserved grava o lote de reservas antes de subprocess.Popen e usa max_workers. A execução por container precisa preservar esse contrato.",
        "status": "Código existente; adaptar dispatch, sem criar outro scheduler."
      },
      {
        "path": "G:/PROJETOS/VPSODDS-PILOTO/pilot/raw_campaign/worker.py:148",
        "observation": "Cada job executa em processo isolado, grava resultado e classifica capturas originais incompletas.",
        "status": "Reaproveitar o worker e os contratos de recibo."
      },
      {
        "path": "BETMONITOR/.MONITORES-PRÉ-VPS/desenvolvimento/captura_original/interface_orquestrador.py",
        "observation": "Interface por casa com contexto, lock e uma operação por processo.",
        "status": "Não transformar o isolamento atual em chamadas concorrentes no mesmo processo."
      },
      {
        "path": "infra/test/python-requirements.txt",
        "observation": "O lock anterior do piloto não incluía psutil, usado pelo supervisor/worker. A imagem TEST agora inclui psutil 7.2.2 e passou no preparo Linux.",
        "status": "Lacuna de dependência corrigida no pacote TEST; não é pendência de instalação atual."
      },
      {
        "path": "docs/validation/linux_preflight_20260917.json",
        "observation": "23/23 clientes importados e construídos; 19 leitores Fable declarados no pacote. Rede de provedores não foi exercitada.",
        "status": "Organização e preparo comprovados; operação e cobertura ainda por fonte/mercado."
      }
    ],
    "promotion_steps": [
      "Construir a versão em desenvolvimento e identificá-la por commit/digest.",
      "Executar a versão em TEST, com dados e configuração de TEST.",
      "Reunir resultados por fonte/mercado e o procedimento de retorno.",
      "Você aprova o lote concreto.",
      "Criar/atualizar os serviços de RUN com a mesma versão testada e dados próprios.",
      "Manter TEST para ensaios e a release anterior disponível para retorno."
    ],
    "formats": [
      {
        "responsibility": "Campanha, perfis por casa, contratos, manifestos e evidências",
        "format": "JSON + JSON Schema",
        "reason": "Padrão compartilhado entre agentes; campos, tipos e versões validados."
      },
      {
        "responsibility": "Docker Compose, Prometheus e configuração da infraestrutura existente",
        "format": "YAML existente",
        "reason": "Formato nativo dessas ferramentas. Não duplicar manualmente o mesmo perfil em JSON e YAML."
      },
      {
        "responsibility": "Explicações, decisões e instruções comuns",
        "format": "Markdown / AGENTS.md",
        "reason": "Documentação humana e acordo compartilhado pelos executores."
      },
      {
        "responsibility": "CRU recebido",
        "format": "Bytes e formato original",
        "reason": "A preferência por JSON não converte nem reescreve o original HTTP, binário ou WebSocket."
      }
    ],
    "environments": [
      {
        "item": "Projeto Compose",
        "test": "vpsnova-test — implantado",
        "run": "vpsnova-run — proposto"
      },
      {
        "item": "Releases",
        "test": "/opt/vpsnova-test/releases/<id>",
        "run": "/opt/vpsnova-run/releases/<id>"
      },
      {
        "item": "Configuração privada",
        "test": "/etc/vpsnova-test",
        "run": "/etc/vpsnova-run"
      },
      {
        "item": "Dados graváveis",
        "test": "/var/lib/vpsnova-test",
        "run": "/var/lib/vpsnova-run"
      },
      {
        "item": "API privada",
        "test": "127.0.0.1:18788 — verificada",
        "run": "127.0.0.1:18888 — proposta"
      },
      {
        "item": "Banco, token e cursor",
        "test": "Próprios de TEST",
        "run": "Próprios de RUN; sem compartilhar dados de ensaio"
      },
      {
        "item": "Conteúdo que pode ser comum",
        "test": "Imagens/catálogo imutáveis por hash",
        "run": "Mesmos digests aprovados em TEST"
      }
    ],
    "responsibilities": [
      {
        "name": "BETMONITOR",
        "owns": "Transportes nativos, catálogo/detalhe, sessão e integridade do original de cada casa."
      },
      {
        "name": "Fable",
        "owns": "Catálogo, curadoria, regras e provas de identidade/dimensões; pending/conflict explícitos."
      },
      {
        "name": "Integração VPSODDS",
        "owns": "Empacotamento, agenda, concorrência, quota, ingestão, PostgreSQL, API e implantação."
      },
      {
        "name": "Consumidor",
        "owns": "Aplicar snapshot/deltas, retomar por cursor e apresentar origem, estado e idade."
      },
      {
        "name": "Dono",
        "owns": "Prioridades de produto e aprovação dos lotes concretos para operação."
      }
    ]
  },
  "policies": [
    {
      "id": "prioridades",
      "title": "Prioridades existentes e OddsAlerts",
      "summary": "OddsAlerts entra como primeira linha completa de produto, enquanto as próprias avançam em paralelo.",
      "details": [
        "Bookmaker IDs 1,2,3,5,6,7: Pinnacle, Bet365, 1XBet, Betfair Exchange, Kambi Group e Betano.",
        "Disponibilidade atual da conta será conferida no ensaio; pacote importado não prova cobertura.",
        "Não reiniciar o mapeamento por uma lista antiga de três mercados; conferir regras e releases atuais.",
        "A ordem exibida na matriz é a do cadastro, não um novo ranking de prioridade.",
        "A divergência MGM/BetConstruct dos documentos será reconciliada sem excluir nenhuma das duas da campanha ampla.",
        "Papi permanece pausada. Bet365 própria continua em standby; Bet365 via OddsAlerts permanece uma origem externa."
      ]
    },
    {
      "id": "identidade",
      "title": "O que pode ser publicado como oferta confirmada",
      "summary": "Evento, mercado, seleção e dimensões devem ter identidade exata e procedência rastreável.",
      "details": [
        "Namespace e IDs literais são preservados; linha, período, participante e instância não podem ser descartados.",
        "Nome, horário e preço não aprovam correspondências.",
        "Pending/conflict fica isolado e contável, sem impedir capturas originais ou casas já comprovadas.",
        "Histórico, replay e observação atual conservam seus próprios timestamps.",
        "Correspondência de identidade não certifica equivalência de liquidação entre casas."
      ]
    },
    {
      "id": "aceite",
      "title": "Critérios de aceite por fonte",
      "summary": "O lote deve funcionar do original ao consumidor e continuar coerente depois de falhas.",
      "details": [
        "Catálogo/detalhe correspondem aos IDs; paginação e completude são explícitas.",
        "Acesso pelo IP da VPS comprovado com captura válida, não apenas HTTP 200.",
        "Hash e proveniência ligam a oferta ao original; publicação só do subconjunto comprovado.",
        "A→B→A, repetição, fora de ordem, parcial, suspensão e retorno têm resultado correto.",
        "Snapshot e mudanças reconstroem o mesmo estado; cursor permite retomada sem duplicação.",
        "Uma casa falha, reinicia ou muda de versão sem interromper as demais.",
        "Fila, erros, consumo, idade e limites têm medição por fonte; baseline permanece preservado."
      ]
    },
    {
      "id": "armazenamento",
      "title": "CRU de estudo e operação",
      "summary": "A VPS mantém o necessário ao fluxo; o acervo de estudo pode permanecer nos discos locais.",
      "details": [
        "Usar spool operacional com prazo/tamanho definidos; não copiar o banco de estudo inteiro para a VPS.",
        "Exportar seletivamente provas, conflitos úteis e campanhas com hash para os cerca de 16 TB locais informados pelo dono.",
        "Nunca descartar uma entrega ainda não confirmada como processada.",
        "Indisponibilidade dos HDs não para o feed; a fila de exportação tem limite e comportamento declarado.",
        "Nenhuma limpeza do acervo ou contratação de armazenamento é pré-condição desta revisão."
      ]
    },
    {
      "id": "capacidade",
      "title": "Concorrência sem serializar as casas",
      "summary": "Habilitar muitas casas e medir o trabalho real, mantendo limites por fonte e por host.",
      "details": [
        "Dez a vinte casas podem estar no mesmo lote; jobs e conexões simultâneas são contados separadamente.",
        "O pool interno de um adaptador também consome conexões e recursos.",
        "TEST/RUN no mesmo host compartilham CPU, RAM e IP público; projetos separados não criam capacidade física.",
        "Quota pertence à credencial do provedor. Não duplicar polling entre ambientes sem um orçamento conjunto.",
        "Cadência e metas de atualidade serão calibradas; o limite antigo de seis workers não será tratado como regra fixa."
      ]
    },
    {
      "id": "recuperacao",
      "title": "Promoção e recuperação",
      "summary": "Usar releases identificadas para promover ou retornar uma casa; snapshot protege a recuperação do host.",
      "details": [
        "Snapshot não é o botão normal de desfazer uma fonte: ele afeta o host inteiro e tem expiração.",
        "O backup local criptografado foi verificado separadamente; a recuperação completa do host não foi ensaiada.",
        "Reconfirmar preservação antes de cada mudança operacional.",
        "Testar retorno de release e compatibilidade das migrations em TEST antes de RUN.",
        "A observação conjunta de 24–48 h é proposta em TEST antes do aceite; depois da promoção segue acompanhamento contínuo."
      ]
    },
    {
      "id": "transportes",
      "title": "Transporte conforme a fonte",
      "summary": "Reaproveitar o transporte já comprovado e escalar sua complexidade quando necessário.",
      "details": [
        "Preferência original: HTTP/REST direto; WebSocket/SSE direto; cliente HTTP compatível; browser/CDP ou Patchright isolado; proxy somente com bloqueio documentado.",
        "AdsPower não integra o desenho operacional da VPS.",
        "Compartilhar a imagem não mistura source_id, sessão, volume, métricas ou ciclo de vida das casas.",
        "Contrato por operação e processo é preservado mesmo dentro do container de cada casa."
      ]
    },
    {
      "id": "seguranca",
      "title": "Fronteiras de confiança do plano mestre",
      "summary": "O backend do painel usa a API privada; o usuário final não recebe credencial da VPS.",
      "details": [
        "PostgreSQL apenas na rede interna Docker, com escritor lógico controlado.",
        "Administração permanente via Tunnel/Access e allowlist; a prévia temporária do plano usa Basic Auth.",
        "Ops-control oferece ações tipadas e auditadas, sem shell no navegador.",
        "Hermes observa dados sanitizados e propõe ações; systemd/Docker continuam responsáveis pela recuperação determinística.",
        "OpenViking é opcional e não crítico; não bloqueia o início das casas."
      ]
    },
    {
      "id": "memoria",
      "title": "Memória compartilhada e OpenViking",
      "summary": "Frente opcional do plano mestre, fora do caminho crítico das odds.",
      "details": [
        "Git/documentação versionada continuam fonte de verdade; a memória built-in do Hermes é privada.",
        "OpenViking começa vazio, em perfil separado, com peers distintos e acesso por rede privada/BFF.",
        "Web Studio protegido; o browser não recebe chave administrativa.",
        "O plano original propõe teto de 1 vCPU/3 GiB e impacto máximo de 10% na API; são critérios para ensaio, não uma validação já feita.",
        "Se não couber, permanece local ou em outro host; nenhuma contratação/API paga é inferida."
      ]
    }
  ],
  "master_plan": {
    "title": "Planejar nova VPS de odds",
    "thread_id": "01a036ea-0842-7410-a003-3226907b9f3e",
    "thread_url": "thread://01a036ea-0842-7410-a003-3226907b9f3e",
    "document": "../ROADMAP.md",
    "scope": "VPS de dados pre-live para um painel externo, com operação observável, acesso privado e Hermes como assistente.",
    "mission": "Coletar, harmonizar, persistir e servir odds com procedência e atualidade. Apostas e motor financeiro ficam fora desta VPS.",
    "precedence": "Decisões atuais do dono atualizam o plano de origem; recibos datados sustentam o estado, sem converter intenção em operação.",
    "stages": [
      {
        "phase": "0",
        "title": "Segredos e Git",
        "state": "Base versionada; rotação coordenada permanece item do plano",
        "task_ids": [
          "D0",
          "S1",
          "M2"
        ]
      },
      {
        "phase": "1",
        "title": "Host seguro",
        "state": "Fundação original preservada; não reconfigurar nesta revisão",
        "task_ids": [
          "D0"
        ]
      },
      {
        "phase": "2",
        "title": "Fundação de dados e métricas",
        "state": "Baseline de seis serviços e TEST separado registrados",
        "task_ids": [
          "D1",
          "M1"
        ]
      },
      {
        "phase": "3",
        "title": "Acesso privado",
        "state": "Tailscale existente; identidade do consumidor e Access permanente pendentes",
        "task_ids": [
          "M2"
        ]
      },
      {
        "phase": "4",
        "title": "Hermes",
        "state": "Instalado/configurado; interface web ODDS desligada no registro de 17/09",
        "task_ids": [
          "M4"
        ]
      },
      {
        "phase": "5",
        "title": "Contrato",
        "state": "V1 existente; fronteira V4 requer integração explícita",
        "task_ids": [
          "P3"
        ]
      },
      {
        "phase": "6",
        "title": "Runtime de dados",
        "state": "Fundação V1 ativa; fluxo Fable V4 ao consumidor pendente",
        "task_ids": [
          "P4",
          "P5",
          "I1"
        ]
      },
      {
        "phase": "7",
        "title": "Console e operação",
        "state": "Leitura existente; controles/auditoria a completar",
        "task_ids": [
          "M3"
        ]
      },
      {
        "phase": "8",
        "title": "Piloto",
        "state": "Atualizado pelo dono para homologação ampla em paralelo",
        "task_ids": [
          "N1",
          "N2",
          "I2",
          "I3",
          "T1"
        ]
      },
      {
        "phase": "9",
        "title": "Expansão",
        "state": "Por lotes aprovados; não aguardar a última casa",
        "task_ids": [
          "U1",
          "R1",
          "R2"
        ]
      },
      {
        "phase": "10",
        "title": "Escala",
        "state": "Somente quando métricas justificarem nova capacidade",
        "task_ids": [
          "M6"
        ]
      }
    ],
    "updates": [
      {
        "original": "Piloto de 3 fontes, depois 10 e 24",
        "current": "Testar 10–20 casas em paralelo, preservando prioridades já definidas; aprovar subconjuntos.",
        "reason": "Decisão do dono nesta conversa."
      },
      {
        "original": "Histórico completo em servidor dedicado",
        "current": "CRU seletivo de estudo pode ir aos cerca de 16 TB locais, com hash/ACK; sem contratação como pré-condição.",
        "reason": "Decisão do dono sobre finalidade do CRU e armazenamento disponível."
      },
      {
        "original": "Fundação V1 como base de produto",
        "current": "Fable V4 é a fronteira a integrar; V1 saudável não prova compatibilidade.",
        "reason": "Contratos vigentes do Fable e recibos TEST."
      },
      {
        "original": "24 fontes lógicas no catálogo inicial",
        "current": "23 nativas no pacote Linux; Bet365 própria em standby; OddsAlerts externa e Papi pausada aparecem separadamente.",
        "reason": "Cadastro e decisões operacionais atuais."
      },
      {
        "original": "Soak do piloto após entrada da fonte",
        "current": "Janela conjunta proposta de 24–48h em TEST antes do aceite do lote, seguida de observação em RUN.",
        "reason": "Proposta de execução revisada para preservar aprovação por entrega."
      },
      {
        "original": "Benchmark para escolher SQLite ou PostgreSQL",
        "current": "PostgreSQL desde a primeira produção, mantendo SQLite apenas em controles/estudos que já o utilizam.",
        "reason": "Correção explícita do dono na conversa original."
      },
      {
        "original": "Hermes poderia usar wrappers de restart permitidos",
        "current": "Assistente observa e propõe; mudanças operacionais dependem das autorizações do dono e comandos auditados.",
        "reason": "Limites reafirmados depois do plano inicial."
      },
      {
        "original": "Quarentena e seleção de observação do contrato USOS-2 inicial",
        "current": "Reconciliar os campos/regras com Fable V4; preço inválido não desfaz identidade já confirmada, e Papi pausada não vira fallback automático.",
        "reason": "Contrato V4 vigente e decisões atuais. Não promover regras de negócio históricas silenciosamente."
      }
    ],
    "structured_plan_document": "../PLANO_MESTRE_CONVERSA.md",
    "full_plan_view": "../plano-mestre/index.html",
    "original_plan_item": "01a036ea-0b11-7903-9647-6b71d6513c0b-plan"
  },
  "coverage": [
    {
      "title": "Missão e fronteiras do produto",
      "source": "Plano mestre §§1,3",
      "section": "master_plan"
    },
    {
      "title": "Containers, alternativas e evidência do código",
      "source": "Plano TEST/RUN: decisão sobre containers",
      "section": "architecture_decision"
    },
    {
      "title": "PostgreSQL desde o início e escritor único",
      "source": "Plano mestre §5",
      "section": "architecture_decision"
    },
    {
      "title": "JSON/YAML e interoperabilidade",
      "source": "Plano TEST/RUN: formatos",
      "section": "architecture_decision"
    },
    {
      "title": "TEST/RUN e promoção",
      "source": "Plano TEST/RUN: ambientes e recuperação",
      "section": "architecture_decision"
    },
    {
      "title": "24 fontes, prioridades e origem externa",
      "source": "Plano mestre §7 + decisões atuais",
      "section": "sources"
    },
    {
      "title": "Frentes, dependências e critérios de avanço",
      "source": "Plano mestre §§13–14 + execução atual",
      "section": "work_items"
    },
    {
      "title": "Transportes e restrição por processo",
      "source": "Plano mestre §9 + interface BETMONITOR",
      "section": "policies"
    },
    {
      "title": "Tailscale, Tunnel/Access e backend externo",
      "source": "Plano mestre §10",
      "section": "M2"
    },
    {
      "title": "Hermes e limites de atuação",
      "source": "Plano mestre §11",
      "section": "M4"
    },
    {
      "title": "Console, ops-control e auditoria",
      "source": "Plano mestre §12",
      "section": "M3"
    },
    {
      "title": "Observabilidade e SLOs",
      "source": "Plano mestre §§4,14",
      "section": "M1"
    },
    {
      "title": "CRU, arquivo seletivo, hash e ACK",
      "source": "Plano mestre §6 + decisão de armazenamento",
      "section": "M5"
    },
    {
      "title": "Recuperação e continuidade",
      "source": "Plano TEST/RUN: recuperação e promoção",
      "section": "S1"
    },
    {
      "title": "Capacidade 50/100 e expansão futura",
      "source": "Plano mestre §8",
      "section": "M6"
    },
    {
      "title": "OpenViking e memória compartilhada",
      "source": "Plano estruturado original §6",
      "section": "M7"
    },
    {
      "title": "Parâmetros de contrato, SLOs e recuperação",
      "source": "Plano estruturado original §§4,5,9",
      "section": "performance_targets"
    },
    {
      "title": "Cofre, DNS e Hostinger MCP administrativo",
      "source": "Plano estruturado original §2",
      "section": "administrative_items"
    },
    {
      "title": "Multidev, lock e promoção de release",
      "source": "Plano estruturado original §7",
      "section": "S1"
    }
  ],
  "performance_targets": [
    {
      "metric": "Captura direta",
      "original": "Cerca de 60 s",
      "current": "Alvo original a medir e adequar por fonte."
    },
    {
      "metric": "Fonte frágil / browser",
      "original": "Cerca de 180 s",
      "current": "Alvo original; depende do transporte e limite real."
    },
    {
      "metric": "Fonte sem captura válida",
      "original": "Stale após 5 min",
      "current": "Política de idade a fechar no contrato; não rejuvenecer a odd com replay."
    },
    {
      "metric": "Ingestão validada até estado",
      "original": "p95 abaixo de 100 ms",
      "current": "Meta original de benchmark; sem medição V4 produtiva."
    },
    {
      "metric": "Consulta principal",
      "original": "p95 abaixo de 250 ms",
      "current": "Meta original de benchmark."
    },
    {
      "metric": "Estado confirmado até SSE",
      "original": "p95 abaixo de 3 s",
      "current": "Meta original; transporte V4/REST/SSE será reconciliado em P3/P5."
    },
    {
      "metric": "Transporte e recuperação",
      "original": "Heartbeat 15 s; deltas 7 dias; paginação 100 / máximo 500",
      "current": "Parâmetros originais, a conferir no contrato efetivamente implantado."
    },
    {
      "metric": "Margem de capacidade",
      "original": "Parar expansão acima de 70% RAM / 65% CPU p95 ou abaixo de 30% disco livre",
      "current": "Limiares originais para ensaios; sem alegar capacidade ilimitada por número de casas."
    },
    {
      "metric": "Recuperação do host",
      "original": "RTO até 4 h; perda histórica máxima 24 h",
      "current": "Metas originais. Restauração de banco foi testada; recuperação completa do host ainda não."
    },
    {
      "metric": "Métricas",
      "original": "Prometheus limitado a 7 dias / 2 GiB",
      "current": "Parâmetro do plano de observabilidade; conferir antes de ampliar instrumentação."
    }
  ],
  "administrative_items": [
    {
      "title": "Identidade do painel na tailnet",
      "when": "Integração do consumidor externo",
      "blocks": "Acesso máquina-a-máquina final; não o replay local."
    },
    {
      "title": "Allowlist Google e domínios",
      "when": "Publicação permanente das interfaces administrativas",
      "blocks": "Tunnel nomeado/Access; não a prévia temporária do plano."
    },
    {
      "title": "Telegram e canal do Hermes",
      "when": "Frente Hermes / alertas",
      "blocks": "Canal humano; não a coleta e API."
    },
    {
      "title": "Destino e protocolo dos HDs de arquivo",
      "when": "Exportador com ACK",
      "blocks": "Exportação/retirada de lotes; não exige contratar armazenamento agora."
    },
    {
      "title": "Cofre e rotação coordenada",
      "when": "Gestão de segredos e exposição permanente",
      "blocks": "Revisão de credenciais sem desligamentos implícitos."
    }
  ],
  "critical_path_note": "Rota lógica de referência para o primeiro lote OddsAlerts; P5 avança em paralelo a P4 e N2 em paralelo à integração. Não é cronograma nem cálculo de duração.",
  "evidence": [
    {
      "id": "plano",
      "label": "Plano de implantação TEST/RUN",
      "kind": "plano",
      "path": "../PLANO_TEST_RUN_20260917.md",
      "observed_at": "2026-09-17",
      "scope": "Arquitetura, trabalho paralelo e critérios de aceite; não prova implantação."
    },
    {
      "id": "entrega",
      "label": "Entrega inicial de preservação",
      "kind": "relato_verificado",
      "path": "../ENTREGA_PRESERVACAO_E_PLANO_20260917.md",
      "observed_at": "2026-09-17",
      "scope": "Registro da recuperação e dos seis containers antes da implantação de TEST; preserva o corte inicial."
    },
    {
      "id": "backup",
      "label": "Recibo de validação do backup",
      "kind": "recibo",
      "path": "../validation/local_backup_20260917.json",
      "observed_at": "2026-09-17",
      "scope": "Autenticação, 27 arquivos, restauração PostgreSQL e preservação dos containers."
    },
    {
      "id": "snapshot",
      "label": "Recibo do snapshot Hostinger",
      "kind": "recibo",
      "path": "../validation/hostinger_snapshot_20260917.json",
      "observed_at": "2026-09-17T07:17:22Z",
      "scope": "Snapshot 367926 concluído e expiração informada pelo provedor."
    },
    {
      "id": "coordenacao",
      "label": "Orientação de escopo da coordenação",
      "kind": "instrucao",
      "path": "README.md#escopo-e-corte",
      "observed_at": "2026-09-17",
      "scope": "Papi pausada, Bet365 nativa em standby e nenhuma coleta ativada nesta preparação."
    },
    {
      "id": "test_foundation",
      "label": "Recibo da base TEST implantada",
      "kind": "recibo",
      "path": "../validation/test_foundation_20260917.json",
      "observed_at": "2026-09-17T17:13:53.391273Z",
      "scope": "Três containers, API, isolamento, reinício independente e baseline preservado. Zero consultas a fornecedores; V4 e RUN pendentes."
    },
    {
      "id": "linux_preflight",
      "label": "Recibo do preparo Linux sem rede",
      "kind": "recibo",
      "path": "../validation/linux_preflight_20260917.json",
      "observed_at": "2026-09-17",
      "scope": "23/23 clientes importados e construídos; Engine Fable, seis schemas e módulos OddsAlerts carregados. Nenhuma captura ou cobertura real comprovada."
    },
    {
      "id": "test_functional",
      "label": "Recibo das 16 verificações sintéticas",
      "kind": "recibo",
      "path": "../validation/test_functional_20260917.json",
      "observed_at": "2026-09-17T17:13:49.282Z",
      "scope": "Contrato VPSNOVA V1 da base: autenticação, persistência e transições com dados sintéticos. Não certifica a ponte V4/PostgreSQL."
    },
    {
      "id": "test_credentials",
      "label": "Recibo de preparo da credencial OddsAlerts",
      "kind": "recibo",
      "path": "../validation/test_credentials_20260917.json",
      "observed_at": "2026-09-17T17:15:13.924502Z",
      "scope": "Credencial instalada em arquivo privado 0600, sem valor registrado. Autenticação no provedor não testada; zero consultas e coleta desativada."
    },
    {
      "id": "codigo",
      "label": "Código reaproveitado e preparação executada",
      "path": "../PREPARACAO_TEST_20260917.md",
      "kind": "relato_verificado",
      "observed_at": "2026-09-17",
      "scope": "Origens e commits do pacote; não certifica operação dos provedores."
    },
    {
      "id": "contrato",
      "label": "Fronteira V4 e invariantes de integração",
      "path": "plano_execucao.json",
      "kind": "plano",
      "observed_at": "2026-09-17",
      "scope": "Plano apoiado em F:/ASTRA_SCH/docs/CONTRATO_V4.md e INTEGRACAO_BETMONITOR_V4.md; implementação PostgreSQL ainda pendente."
    },
    {
      "id": "mestre",
      "label": "Plano mestre integral da conversa",
      "path": "../PLANO_MESTRE_CONVERSA.md",
      "kind": "plano",
      "observed_at": "2026-09-17",
      "scope": "Texto integral do plano estruturado da conversa Planejar nova VPS de odds, preservado como origem histórica; decisões posteriores são reconciliadas no plano de execução."
    },
    {
      "id": "roadmap",
      "label": "Evolução documentada da fundação",
      "path": "../ROADMAP.md",
      "kind": "plano",
      "observed_at": "2026-09-17",
      "scope": "Roadmap que registra a evolução da fundação e as decisões posteriores ao primeiro plano."
    },
    {
      "id": "estado_final",
      "label": "Conferência dos serviços preservados e de TEST",
      "path": "../validation/test_final_state_20260917.json",
      "kind": "recibo",
      "observed_at": "2026-09-17T17:28:33.249978+00:00",
      "scope": "Estado registrado dos seis serviços originais e três TEST. Não é telemetria ao vivo."
    },
    {
      "id": "principal_goal",
      "label": "Meta canônica e nove casas principais",
      "path": "meta_principais.json",
      "kind": "instrucao",
      "observed_at": "2026-09-19T03:52:29.165493+00:00",
      "scope": "Cópia documental gerada de config/goal/principal-houses.json, com hash da origem. Lista mínima, rotas aceitas e critérios do dono; configuração não comprova funcionamento."
    },
    {
      "id": "source_probe_20260919",
      "label": "Sondagem real de fontes: principals-initial-20260919",
      "path": "../validation/source_probe_20260919.json",
      "kind": "recibo",
      "observed_at": "2026-09-19T04:11:27.087298+00:00",
      "scope": "Catálogo/detalhes e originais recebidos na VPS em ensaio finito. Não comprova publicação V4, cobertura individual de bookmakers externos ou recorrência."
    },
    {
      "id": "retomada_visual",
      "label": "Retomada Hermes / A-0270 a A-0273",
      "path": "evidencias_retomada.md",
      "kind": "relato_verificado",
      "observed_at": "2026-09-19T18:58:00-03:00",
      "scope": "Testes, ownership e limites. Não certifica operação recorrente."
    },
    {
      "id": "pg_real_visual",
      "label": "A-0272: PostgreSQL real, ensaio isolado",
      "path": "pg_verification.json",
      "kind": "recibo",
      "observed_at": "2026-09-19T18:57:33.974968+00:00",
      "scope": "91 testes de contratos/persistência na imagem Linux. Não é V4 permanente nem odds online."
    },
    {
      "id": "snapshots_visual",
      "label": "Snapshots VPS e frentes / campos públicos",
      "path": "snapshots.json",
      "kind": "snapshot",
      "observed_at": "2026-09-19T22:05:54.367382+00:00",
      "scope": "Estado observado em corte datado. Serviços healthy e processos preparados não comprovam operação de odds."
    },
    {
      "id": "raw_campaign",
      "path": "raw_snapshot.json",
      "label": "Captura CRU A-0285 · snapshot histórico",
      "kind": "recibo_sanitizado",
      "observed_at": "2026-09-20T00:52:46.291773+00:00",
      "scope": "Prova datada; não representa leitura remota atual nem nove casas online."
    },
    {
      "id": "integration_local",
      "path": "integration_snapshot.json",
      "label": "Correção local concluída · não implantada",
      "kind": "recibo_sanitizado",
      "observed_at": "2026-09-20T02:06:09.807707+00:00",
      "scope": "Prova datada; não representa leitura remota atual nem nove casas online."
    },
    {
      "id": "coordinator_audit_visual",
      "label": "Auditoria da coordenação · A-0279/A-0280",
      "path": "auditoria_coordenacao_20260919.json",
      "kind": "auditoria_sanitizada",
      "observed_at": "2026-09-19T21:35:00-03:00",
      "scope": "Projeção sanitizada das auditorias local/remota e decisão da coordenação. Preserva a data de FRENTES/Hermes; revisão reprovada e correções em andamento não são implantação."
    },
    {
      "id": "work_evidence",
      "path": "work_evidence.json",
      "label": "Trabalho e entregas · recibos e declarações",
      "kind": "recibo_sanitizado",
      "observed_at": "2026-09-20T03:49:06.930689+00:00",
      "scope": "Recibos de Linux, correção, portal e declarações de frentes. Cada registro tem relógio próprio; não comprova agentes ativos agora."
    }
  ],
  "sources": [
    {
      "id": "pinnacle",
      "name": "Pinnacle",
      "type": "native",
      "domain": "www.pinnacle.com",
      "provider": "Pinnacle.com",
      "protocol": "HTTP",
      "order": 1,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "failed",
      "runtime": "unproven",
      "container": "collector-pinnacle",
      "next": "Diagnosticar HTTP 403 da rota nativa; não repetir o mesmo ensaio sem diagnóstico.",
      "blockers": [
        "http_403",
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/pinnacle/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "failed",
          "label": "HTTP 403",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "pinnacle",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "failed",
        "valid_capture": false,
        "catalog_valid": false,
        "detail_jobs_valid": 0,
        "future_events": 0,
        "jobs_total": 1,
        "jobs_captured": 0,
        "errors": [
          "http_403"
        ],
        "original_bytes": 5235,
        "original_receipts": 3,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "04375eb1639e499eb74e6491a780fa02",
            "kind": "catalog",
            "status": "failed",
            "error": "http_403",
            "http_status": 403,
            "captured_at": "2026-09-19T04:10:55.858415+00:00",
            "elapsed_seconds": 12.76,
            "original_bytes": 5235,
            "original_complete": true,
            "original_receipts": 3
          }
        ]
      }
    },
    {
      "id": "betano",
      "name": "Betano",
      "type": "native",
      "domain": "betano.bet.br",
      "provider": "Kaizen / Betano",
      "protocol": "HTTP/curl",
      "order": 2,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "captured",
      "runtime": "unproven",
      "container": "collector-betano",
      "next": "Processar o original em V4 e comprovar publicação, consumidor e execução recorrente.",
      "blockers": [
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/betano/captura_cru.py",
      "routing_fields": [
        "fixture_path"
      ],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "betano",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 2,
        "future_events": 1077,
        "jobs_total": 3,
        "jobs_captured": 3,
        "errors": [],
        "original_bytes": 4498274,
        "original_receipts": 3,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "3ca045eb15f945569bdf0fc5129bdb66",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:48.766917+00:00",
            "elapsed_seconds": 5.8,
            "original_bytes": 4351742,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "1dbb0ceb94e94d6f8d332cd840fc3cb9",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:51.857241+00:00",
            "elapsed_seconds": 3.14,
            "original_bytes": 26282,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "acec35d8fcc343f88b7a4172539d02b6",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:54.877105+00:00",
            "elapsed_seconds": 2.89,
            "original_bytes": 120250,
            "original_complete": true,
            "original_receipts": 1
          }
        ]
      }
    },
    {
      "id": "kto",
      "name": "KTO",
      "type": "native",
      "domain": "kto.bet.br",
      "provider": "Kambi / KTO",
      "protocol": "HTTP",
      "order": 3,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "captured",
      "runtime": "unproven",
      "container": "collector-kto",
      "next": "Processar o original em V4 e comprovar publicação, consumidor e execução recorrente.",
      "blockers": [
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/kto/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "kto",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 2,
        "future_events": 668,
        "jobs_total": 3,
        "jobs_captured": 3,
        "errors": [],
        "original_bytes": 290599,
        "original_receipts": 4,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "84e806b261a6492ea106cd471da8c918",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:48.090928+00:00",
            "elapsed_seconds": 5.05,
            "original_bytes": 284517,
            "original_complete": true,
            "original_receipts": 2
          },
          {
            "job_id": "2076d56a3ab245259710561abe930899",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:50.304880+00:00",
            "elapsed_seconds": 2.33,
            "original_bytes": 3028,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "0bfb3b433acb49d5927d1694f0916880",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:52.939247+00:00",
            "elapsed_seconds": 2.53,
            "original_bytes": 3054,
            "original_complete": true,
            "original_receipts": 1
          }
        ]
      }
    },
    {
      "id": "superbet",
      "name": "Superbet",
      "type": "native",
      "domain": "superbet.bet.br",
      "provider": "Superology / Superbet",
      "protocol": "HTTP/SSE",
      "order": 4,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "captured",
      "runtime": "unproven",
      "container": "collector-superbet",
      "next": "Processar o original em V4 e comprovar publicação, consumidor e execução recorrente.",
      "blockers": [
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/superbet/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "superbet",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 2,
        "future_events": 1531,
        "jobs_total": 3,
        "jobs_captured": 3,
        "errors": [],
        "original_bytes": 1536142,
        "original_receipts": 3,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "d4a6544c41d743d598b182539019e88d",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:49.263682+00:00",
            "elapsed_seconds": 6.37,
            "original_bytes": 1469361,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "2c67b23405c149ffa7e53b5fdee83d2b",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:51.819690+00:00",
            "elapsed_seconds": 2.53,
            "original_bytes": 56867,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "35b3f72d9c84404a93e29192a13136ed",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:54.330765+00:00",
            "elapsed_seconds": 2.32,
            "original_bytes": 9914,
            "original_complete": true,
            "original_receipts": 1
          }
        ]
      }
    },
    {
      "id": "mgm",
      "name": "BetMGM",
      "type": "native",
      "domain": "www.betmgm.bet.br",
      "provider": "Goldrush / BetMGM",
      "protocol": "HTTP",
      "order": 5,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "captured",
      "runtime": "unproven",
      "container": "collector-mgm",
      "next": "Processar o original em V4 e comprovar publicação, consumidor e execução recorrente.",
      "blockers": [
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/mgm/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "mgm",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 2,
        "future_events": 864,
        "jobs_total": 3,
        "jobs_captured": 3,
        "errors": [],
        "original_bytes": 4084093,
        "original_receipts": 17,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "1efbe724dce7447689198fa0e09a2aba",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:51.065002+00:00",
            "elapsed_seconds": 8.12,
            "original_bytes": 4072107,
            "original_complete": true,
            "original_receipts": 15
          },
          {
            "job_id": "8f65af2295ef44a69712ecdaac27ea81",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:53.349801+00:00",
            "elapsed_seconds": 2.13,
            "original_bytes": 9133,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "af2d863a4d474503872fc1df6271d2e9",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:55.239910+00:00",
            "elapsed_seconds": 1.92,
            "original_bytes": 2853,
            "original_complete": true,
            "original_receipts": 1
          }
        ]
      }
    },
    {
      "id": "bwin",
      "name": "Sportingbet",
      "type": "native",
      "domain": "www.sportingbet.bet.br",
      "provider": "Entain CDS / Sportingbet",
      "protocol": "HTTP/curl",
      "order": 6,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "captured",
      "runtime": "unproven",
      "container": "collector-bwin",
      "next": "Processar o original em V4 e comprovar publicação, consumidor e execução recorrente.",
      "blockers": [
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/bwin/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "bwin",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 2,
        "future_events": 1168,
        "jobs_total": 3,
        "jobs_captured": 3,
        "errors": [],
        "original_bytes": 7880613,
        "original_receipts": 13,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "fb3d20b0e0f84737aa34b70cd32ba356",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:51.594227+00:00",
            "elapsed_seconds": 8.68,
            "original_bytes": 7572533,
            "original_complete": true,
            "original_receipts": 9
          },
          {
            "job_id": "543aa06c48884976993dbc8b05779e00",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:54.744392+00:00",
            "elapsed_seconds": 2.94,
            "original_bytes": 122231,
            "original_complete": true,
            "original_receipts": 2
          },
          {
            "job_id": "389f896a7a1b43c2997e0311c255de97",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:57.503044+00:00",
            "elapsed_seconds": 2.78,
            "original_bytes": 185849,
            "original_complete": true,
            "original_receipts": 2
          }
        ]
      }
    },
    {
      "id": "altenar",
      "name": "EstrelaBet",
      "type": "native",
      "domain": "www.estrelabet.bet.br",
      "provider": "Altenar / EstrelaBet",
      "protocol": "HTTP",
      "order": 7,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "captured",
      "runtime": "unproven",
      "container": "collector-altenar",
      "next": "Processar o original em V4 e comprovar publicação, consumidor e execução recorrente.",
      "blockers": [
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/altenar/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "altenar",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 2,
        "future_events": 1329,
        "jobs_total": 3,
        "jobs_captured": 3,
        "errors": [],
        "original_bytes": 511171,
        "original_receipts": 3,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "33161a62c21c4b99aa3036cb306a2c15",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:49.227557+00:00",
            "elapsed_seconds": 6.23,
            "original_bytes": 492885,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "894e9613dd844185899dbf5f7df4fdb9",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:51.552218+00:00",
            "elapsed_seconds": 2.33,
            "original_bytes": 15764,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "7f1f0dd0ffe0404288043058f1e7e5cd",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:53.895201+00:00",
            "elapsed_seconds": 2.23,
            "original_bytes": 2522,
            "original_complete": true,
            "original_receipts": 1
          }
        ]
      }
    },
    {
      "id": "betby",
      "name": "Betboom",
      "type": "native",
      "domain": "betboom.bet.br",
      "provider": "BetBy / Betboom",
      "protocol": "HTTP",
      "order": 8,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "captured",
      "runtime": "unproven",
      "container": "collector-betby",
      "next": "Processar o original em V4 e comprovar publicação, consumidor e execução recorrente.",
      "blockers": [
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/betby/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "betby",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 2,
        "future_events": 854,
        "jobs_total": 3,
        "jobs_captured": 3,
        "errors": [],
        "original_bytes": 519253,
        "original_receipts": 9,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "68b40c284af147acbfeec13460dea36b",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:47.788210+00:00",
            "elapsed_seconds": 4.81,
            "original_bytes": 512002,
            "original_complete": true,
            "original_receipts": 7
          },
          {
            "job_id": "9702cb1adf834fce9409cf43d847cdaf",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:49.988343+00:00",
            "elapsed_seconds": 2.18,
            "original_bytes": 3536,
            "original_complete": true,
            "original_receipts": 1
          },
          {
            "job_id": "55bd3f27cf3f435691955fcb66ec9bea",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:52.630584+00:00",
            "elapsed_seconds": 2.69,
            "original_bytes": 3715,
            "original_complete": true,
            "original_receipts": 1
          }
        ]
      }
    },
    {
      "id": "sporty",
      "name": "SportyBet",
      "type": "native",
      "domain": "www.sporty.bet.br",
      "provider": "SportyBet",
      "protocol": "HTTP",
      "order": 9,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-sporty",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/sporty/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "basehub",
      "name": "EnergiaBet",
      "type": "native",
      "domain": "energia.bet.br",
      "provider": "InPlayNet / Energia",
      "protocol": "HTTP/curl",
      "order": 10,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-basehub",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/basehub/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "betconstruct",
      "name": "VBET",
      "type": "native",
      "domain": "vbet.bet.br",
      "provider": "BetConstruct / VBET",
      "protocol": "WebSocket",
      "order": 11,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "captured",
      "runtime": "unproven",
      "container": "collector-betconstruct",
      "next": "Processar o original em V4 e comprovar publicação, consumidor e execução recorrente.",
      "blockers": [
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "linux_preflight",
        "codigo",
        "source_probe_20260919"
      ],
      "bookmakers": [],
      "code": "casas/betconstruct/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "betconstruct",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 2,
        "future_events": 1374,
        "jobs_total": 3,
        "jobs_captured": 3,
        "errors": [],
        "original_bytes": 749813,
        "original_receipts": 6,
        "http_requests": null,
        "request_unit_note": "Recibos originais podem incluir HTTP e WebSocket; não representam contagem HTTP.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "14c4f55c3213474580185d03556021e7",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:47.410097+00:00",
            "elapsed_seconds": 4.41,
            "original_bytes": 423922,
            "original_complete": true,
            "original_receipts": 2
          },
          {
            "job_id": "1c689251773744d482899b8c69f0424e",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:50.131570+00:00",
            "elapsed_seconds": 2.73,
            "original_bytes": 73547,
            "original_complete": true,
            "original_receipts": 2
          },
          {
            "job_id": "2e067e940cec462b9b6f632c478dd9f2",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:53.194712+00:00",
            "elapsed_seconds": 2.93,
            "original_bytes": 252344,
            "original_complete": true,
            "original_receipts": 2
          }
        ]
      }
    },
    {
      "id": "betmexico",
      "name": "Aposta.bet",
      "type": "native",
      "domain": "aposta.bet.br",
      "provider": "FeedUnifier / Aposta",
      "protocol": "HTTP/curl",
      "order": 12,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-betmexico",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/betmexico/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "betnacional",
      "name": "Betnacional",
      "type": "native",
      "domain": "betnacional.bet.br",
      "provider": "bet6 / Betnacional",
      "protocol": "HTTP",
      "order": 13,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-betnacional",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/betnacional/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "brasil_bet",
      "name": "Brasil.bet",
      "type": "native",
      "domain": "www.brasil.bet.br",
      "provider": "Playtech Mojito / Brasil.bet",
      "protocol": "HTTP/binário BinBag/LZMA",
      "order": 14,
      "linux": "validated",
      "fable_reader": "not_declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-brasil-bet",
      "next": "Verificar leitor Fable no pacote; captura original pode avançar em paralelo.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente",
        "Leitor não declarado neste pacote"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/brasil_bet/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "brazino777",
      "name": "Brazino777",
      "type": "native",
      "domain": "www.brazino777.bet.br",
      "provider": "NSoft / Brazino777",
      "protocol": "HTTP",
      "order": 15,
      "linux": "validated",
      "fable_reader": "not_declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-brazino777",
      "next": "Verificar leitor Fable no pacote; captura original pode avançar em paralelo.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente",
        "Leitor não declarado neste pacote"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/brazino777/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "databet",
      "name": "Pitaco",
      "type": "native",
      "domain": "pitaco.bet.br",
      "provider": "DataBet / Pitaco",
      "protocol": "HTTP/gRPC-web",
      "order": 16,
      "linux": "validated",
      "fable_reader": "not_declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-databet",
      "next": "Verificar leitor Fable no pacote; captura original pode avançar em paralelo.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente",
        "Leitor não declarado neste pacote"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/databet/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "esporte_da_sorte",
      "name": "Esportes da Sorte",
      "type": "native",
      "domain": "esportesdasorte.bet.br",
      "provider": "SportingTech / Esportes da Sorte",
      "protocol": "HTTP/curl",
      "order": 17,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-esporte-da-sorte",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/esporte_da_sorte/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "fssb",
      "name": "Betão",
      "type": "native",
      "domain": "betao.bet.br",
      "provider": "CactusGaming FSSB / Betão",
      "protocol": "HTTP",
      "order": 18,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-fssb",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/fssb/captura_cru.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "kaya",
      "name": "WJCasino",
      "type": "native",
      "domain": "wjcasino.bet.br",
      "provider": "Kaya / WJCasino",
      "protocol": "HTTP",
      "order": 19,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-kaya",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/kaya/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "matchbook",
      "name": "Matchbook",
      "type": "native",
      "domain": "matchbook.bet.br",
      "provider": "Matchbook",
      "protocol": "HTTP",
      "order": 20,
      "linux": "validated",
      "fable_reader": "not_declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-matchbook",
      "next": "Verificar leitor Fable no pacote; captura original pode avançar em paralelo.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente",
        "Leitor não declarado neste pacote"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/matchbook/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "milhao",
      "name": "Milhão",
      "type": "native",
      "domain": "www.milhao.bet.br",
      "provider": "OpenBet / Milhão",
      "protocol": "HTTP/curl",
      "order": 21,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-milhao",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/milhao/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "ngx",
      "name": "Lottu",
      "type": "native",
      "domain": "www.lottu.bet.br",
      "provider": "NGX / Lottu",
      "protocol": "HTTP",
      "order": 22,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-ngx",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/ngx/adaptador.py",
      "routing_fields": [],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "sa_esportes",
      "name": "Lance de Sorte",
      "type": "native",
      "domain": "lancedesorte.bet.br",
      "provider": "SA Esportes / Lance de Sorte",
      "protocol": "HTTP",
      "order": 23,
      "linux": "validated",
      "fable_reader": "declared",
      "network": "not_tested",
      "runtime": "off",
      "container": "collector-sa-esportes",
      "next": "Validar rede/captura e replay V4 do subconjunto.",
      "blockers": [
        "Worker por casa e agenda a integrar",
        "Rede pelo IP da VPS ainda sem prova",
        "V4 até o consumidor ainda pendente"
      ],
      "evidence": [
        "linux_preflight",
        "codigo"
      ],
      "bookmakers": [],
      "code": "casas/sa_esportes/adaptador.py",
      "routing_fields": [
        "countryId",
        "tournamentId"
      ],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "oddalerts",
      "name": "OddsAlerts",
      "type": "external",
      "domain": "OddsAlerts API",
      "provider": "OddsAlerts",
      "protocol": "HTTP",
      "order": 24,
      "linux": "prepared",
      "fable_reader": "external",
      "network": "captured",
      "runtime": "unproven",
      "container": "Um conector por credencial/fluxo (planejado)",
      "next": "Conferir bookmakers no agregado e publicar pelo mapper externo V4, preservando a origem OddsAlerts.",
      "blockers": [
        "Agregado capturado; cobertura individual Bet365/Pinnacle ainda não validada",
        "Publicação Fable V4/PostgreSQL ainda sem prova para esta fonte",
        "API/consumidor e recorrência com recuperação ainda sem prova"
      ],
      "evidence": [
        "test_credentials",
        "linux_preflight",
        "source_probe_20260919"
      ],
      "bookmakers": [
        {
          "id": 1,
          "name": "PINNACLE"
        },
        {
          "id": 2,
          "name": "BET365"
        },
        {
          "id": 3,
          "name": "1XBET"
        },
        {
          "id": 5,
          "name": "BETFAIR_EXCHANGE"
        },
        {
          "id": 6,
          "name": "KAMBI"
        },
        {
          "id": 7,
          "name": "BETANO"
        }
      ],
      "milestones": {
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "test_credentials",
            "linux_preflight"
          ]
        },
        "capture": {
          "status": "verified",
          "label": "Catálogo + 1 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false,
      "probe": {
        "source_id": "oddalerts",
        "run_id": "principals-initial-20260919",
        "observed_at": "2026-09-19T04:11:27.087298+00:00",
        "environment": "test",
        "status": "captured",
        "valid_capture": true,
        "catalog_valid": true,
        "detail_jobs_valid": 1,
        "future_events": 1662,
        "jobs_total": 2,
        "jobs_captured": 2,
        "errors": [],
        "original_bytes": 1390976,
        "original_receipts": 13,
        "http_requests": 13,
        "request_unit_note": "Chamadas HTTP do conector OddsAlerts.",
        "remaining": [
          "harmonization_and_PostgreSQL",
          "API_and_consumer",
          "recurring_execution_and_recovery"
        ],
        "evidence": [
          "source_probe_20260919"
        ],
        "jobs": [
          {
            "job_id": "5c967600b90946798e981802a58ed685",
            "kind": "catalog",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:10:59.033808+00:00",
            "elapsed_seconds": 15.93,
            "original_bytes": 1317213,
            "original_complete": true,
            "original_receipts": 11
          },
          {
            "job_id": "fc19f5fb28b94191aa8cbff2ac97a3e6",
            "kind": "detail",
            "status": "captured",
            "error": null,
            "http_status": null,
            "captured_at": "2026-09-19T04:11:26.840153+00:00",
            "elapsed_seconds": 27.77,
            "original_bytes": 73763,
            "original_complete": true,
            "original_receipts": 2
          }
        ]
      }
    },
    {
      "id": "bet365_proprio",
      "name": "Bet365 própria",
      "type": "standby",
      "domain": "Bet365",
      "provider": "Captura nativa",
      "protocol": "Caminho próprio",
      "order": 25,
      "linux": "not_applicable",
      "fable_reader": "not_applicable",
      "network": "standby",
      "runtime": "off",
      "container": "Ainda não habilitado",
      "next": "Preservar a decisão de standby; não confundir com Bet365 via OddsAlerts.",
      "blockers": [
        "Standby definido pelo dono"
      ],
      "evidence": [
        "coordenacao",
        "plano"
      ],
      "bookmakers": [],
      "milestones": {
        "preparation": {
          "status": "unproven",
          "label": "Fora do preparo",
          "evidence": [
            "coordenacao",
            "plano"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    },
    {
      "id": "papi",
      "name": "OddsPapi",
      "type": "standby",
      "domain": "OddsPapi API",
      "provider": "OddsPapi",
      "protocol": "HTTP",
      "order": 26,
      "linux": "not_applicable",
      "fable_reader": "external",
      "network": "paused",
      "runtime": "off",
      "container": "Ainda não habilitado",
      "next": "Preservar pausa. Evidências históricas permanecem com origem externa.",
      "blockers": [
        "Fonte pausada"
      ],
      "evidence": [
        "coordenacao",
        "plano"
      ],
      "bookmakers": [],
      "milestones": {
        "preparation": {
          "status": "unproven",
          "label": "Fora do preparo",
          "evidence": [
            "coordenacao",
            "plano"
          ]
        },
        "capture": {
          "status": "unproven",
          "label": "Não sondada",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada",
          "evidence": []
        }
      },
      "online_proven": false
    }
  ],
  "environment_checks": [
    {
      "id": "baseline",
      "name": "VPS preservada",
      "status": "preserved",
      "status_label": "6 serviços preservados",
      "services": [
        "PostgreSQL",
        "ingest-core",
        "api-read",
        "Prometheus",
        "Grafana",
        "Node Exporter"
      ],
      "detail": "Base original vpsnova-core. API HTTP 200 no corte registrado; sem alteração pela revisão visual.",
      "observed_at": "2026-09-17T17:28:33.249978+00:00",
      "evidence": [
        "estado_final"
      ]
    },
    {
      "id": "test",
      "name": "TEST",
      "status": "ready",
      "status_label": "3 serviços; base V1 verificada",
      "services": [
        "PostgreSQL",
        "ingest-core",
        "api-read"
      ],
      "detail": "Fundação V1 de TEST preservada; sondagem real finita registrada. Publicação V4, consumidor e recorrência por fonte continuam sem comprovação neste corte.",
      "observed_at": "2026-09-19T04:11:27.087298+00:00",
      "evidence": [
        "estado_final",
        "test_foundation",
        "test_functional",
        "source_probe_20260919"
      ]
    },
    {
      "id": "run",
      "name": "RUN",
      "status": "pending",
      "status_label": "Não implantado",
      "services": [],
      "detail": "Será criado para o lote aprovado, com dados e credenciais próprios.",
      "observed_at": "2026-09-17T17:28:33.249978+00:00",
      "evidence": [
        "test_foundation",
        "plano"
      ]
    }
  ],
  "components": [
    {
      "id": "native",
      "label": "Casas nativas",
      "role": "Fontes de odds próprias",
      "status": "partial",
      "status_label": "8 capturas no lote",
      "environment": "Fontes",
      "exists": [
        "23 clientes preparados no Linux.",
        "8 fontes nativas obtiveram catálogo e detalhes no ensaio real."
      ],
      "missing": [
        "Publicação V4 e recorrência por fonte.",
        "Pinnacle: http_403"
      ],
      "evidence": [
        "linux_preflight",
        "source_probe_20260919"
      ]
    },
    {
      "id": "oa",
      "label": "OddsAlerts",
      "role": "Fonte externa com vários bookmakers",
      "status": "partial",
      "status_label": "Agregado real capturado",
      "environment": "Fontes",
      "exists": [
        "Conector externo obteve catálogo e 1 job(s) agregado(s) de detalhes no lote."
      ],
      "missing": [
        "Cobertura individual de bookmakers, publicação V4 e recorrência."
      ],
      "evidence": [
        "source_probe_20260919"
      ]
    },
    {
      "id": "scheduler",
      "label": "Agenda e workers",
      "role": "Distribuir jobs e isolar cada casa",
      "status": "partial",
      "status_label": "Adaptar o piloto",
      "environment": "TEST / RUN separados",
      "exists": [
        "Supervisor com reservas e worker por processo no piloto.",
        "Jobs de sondagem executados com recibos de captura real; isso não certifica agenda recorrente."
      ],
      "missing": [
        "Dispatch por container, agenda móvel e execução contínua."
      ],
      "evidence": [
        "codigo",
        "source_probe_20260919"
      ]
    },
    {
      "id": "fable",
      "label": "Fable compartilhado",
      "role": "Validar identidade e produzir V4",
      "status": "partial",
      "status_label": "V4 testado; não permanente",
      "environment": "Um núcleo por ambiente",
      "exists": [
        "Engine e serviço V4 implementados/empacotados.",
        "A-0272: suíte Linux com PostgreSQL real aprovada."
      ],
      "missing": [
        "Instalação permanente e publicação de originais no TEST."
      ],
      "evidence": [
        "linux_preflight",
        "contrato",
        "pg_real_visual"
      ]
    },
    {
      "id": "ingest",
      "label": "Ingestão e outbox",
      "role": "Validar e confirmar a persistência",
      "status": "partial",
      "status_label": "V1 ativo em TEST",
      "environment": "TEST / RUN separados",
      "exists": [
        "Ingestão V1 e verificações sintéticas."
      ],
      "missing": [
        "Entrada V4, outbox e confirmação completas."
      ],
      "evidence": [
        "test_functional"
      ]
    },
    {
      "id": "postgres",
      "label": "PostgreSQL",
      "role": "Estado, journal e auditoria",
      "status": "ready",
      "status_label": "V1 ativo; V4 ensaiado",
      "environment": "Um banco por ambiente",
      "exists": [
        "Banco TEST V1 separado.",
        "Persistência V4 testada em PostgreSQL descartável."
      ],
      "missing": [
        "Instalação V4 permanente; não repetir a suíte como se ainda não tivesse sido executada."
      ],
      "evidence": [
        "test_foundation",
        "pg_real_visual"
      ]
    },
    {
      "id": "api",
      "label": "API de leitura",
      "role": "Snapshot, deltas e atualidade",
      "status": "partial",
      "status_label": "V1 ativo; V4 em pacote",
      "environment": "Acesso privado",
      "exists": [
        "API V1 da fundação.",
        "Contratos V4 exercidos pela suíte A-0272."
      ],
      "missing": [
        "API V4 permanente e consumidor com odds rastreáveis."
      ],
      "evidence": [
        "test_functional",
        "contrato",
        "pg_real_visual"
      ]
    },
    {
      "id": "consumer",
      "label": "Painel / backend externo",
      "role": "Consumir e apresentar as odds",
      "status": "pending",
      "status_label": "Integração pendente",
      "environment": "Fora da VPS de odds",
      "exists": [
        "Console de referência read-only na base original."
      ],
      "missing": [
        "Consumo V4, identidade Tailscale e teste do painel final."
      ],
      "evidence": [
        "mestre",
        "plano"
      ]
    },
    {
      "id": "ops",
      "label": "Console e ops-control",
      "role": "Operações tipadas e auditadas",
      "status": "partial",
      "status_label": "Leitura; controles pendentes",
      "environment": "Administração",
      "exists": [
        "Console de consulta read-only na fundação."
      ],
      "missing": [
        "Comandos permitidos, motivo, auditoria e retorno."
      ],
      "evidence": [
        "mestre"
      ]
    },
    {
      "id": "metrics",
      "label": "Prometheus e Grafana",
      "role": "Saúde, filas, erros e idade",
      "status": "partial",
      "status_label": "Base preservada",
      "environment": "Observabilidade",
      "exists": [
        "Prometheus, Grafana e Node Exporter no baseline."
      ],
      "missing": [
        "Métricas, alertas e SLOs por coletor/lote."
      ],
      "evidence": [
        "estado_final",
        "mestre"
      ]
    },
    {
      "id": "hermes",
      "label": "Hermes da VPS ODDS",
      "role": "Assistente operacional",
      "status": "partial",
      "status_label": "Instalado; web desligada",
      "environment": "Administração privada",
      "exists": [
        "Perfil e autenticação configurados segundo a conversa fonte."
      ],
      "missing": [
        "Interface web/canal desta VPS e diagnósticos autorizados."
      ],
      "evidence": [
        "mestre"
      ]
    },
    {
      "id": "archive",
      "label": "Arquivo seletivo / HDs",
      "role": "Preservar estudo com hash e confirmação",
      "status": "pending",
      "status_label": "Integração a preparar",
      "environment": "Armazenamento local",
      "exists": [
        "Aproximadamente 16 TB locais informados pelo dono."
      ],
      "missing": [
        "Exportação por lote, verificação/ACK e retomada."
      ],
      "evidence": [
        "plano",
        "mestre"
      ]
    }
  ],
  "connections": [
    {
      "from": "native",
      "to": "scheduler",
      "status": "planned",
      "label": "captura própria"
    },
    {
      "from": "oa",
      "to": "scheduler",
      "status": "planned",
      "label": "um fluxo por credencial"
    },
    {
      "from": "scheduler",
      "to": "fable",
      "status": "planned",
      "label": "original + recibo"
    },
    {
      "from": "fable",
      "to": "ingest",
      "status": "planned",
      "label": "batch V4 validado"
    },
    {
      "from": "ingest",
      "to": "postgres",
      "status": "planned",
      "label": "persistência confirmada"
    },
    {
      "from": "postgres",
      "to": "api",
      "status": "planned",
      "label": "snapshot / mudanças"
    },
    {
      "from": "api",
      "to": "consumer",
      "status": "planned",
      "label": "backend por Tailscale"
    },
    {
      "from": "ops",
      "to": "scheduler",
      "status": "planned",
      "label": "comandos tipados"
    },
    {
      "from": "scheduler",
      "to": "metrics",
      "status": "planned",
      "label": "métricas por fonte"
    },
    {
      "from": "metrics",
      "to": "hermes",
      "status": "planned",
      "label": "logs e métricas sanitizados"
    },
    {
      "from": "ingest",
      "to": "archive",
      "status": "planned",
      "label": "lote + hash + ACK"
    }
  ],
  "source_counts": {
    "native_catalog": 24,
    "native_packaged": 23,
    "linux_passed": 23,
    "fable_readers_declared": 19,
    "provider_calls_in_preparation": 0,
    "external_selected_bookmakers": 6
  },
  "goal": {
    "id": "principal_houses_online",
    "title": "Casas principais online",
    "created_at": "2026-09-19T03:52:29.165493+00:00",
    "priority_source": "G:/PROJETOS/VPSODDS-PILOTO/docs/MAPA_REGRAS_VERIFICADAS_20260913.md:10",
    "accepted_criteria": [
      "Real current pre-live capture from VPS with original bytes/hash and native IDs preserved",
      "Exact qualified subset through Fable V4 and PostgreSQL, with pending/conflicts separate",
      "API and consumer show source, house, state and actual capture age",
      "Recurring execution and recovery demonstrated per source; one source failure does not stop others",
      "Baseline preserved; releases built from identified commits; no provider secrets in logs/browser/images"
    ],
    "not_online_evidence": [
      "imports_only",
      "synthetic_events",
      "http_200_without_valid_capture",
      "historical_replay",
      "configuration_enabled_only"
    ],
    "houses": [
      {
        "slug": "kto",
        "name": "KTO",
        "accepted_path": "native",
        "native_source_id": "kto",
        "external_source_ids": [],
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture_proven": true,
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "not_applicable",
        "online_proven": false,
        "evidence": [
          "principal_goal",
          "source_probe_20260919"
        ]
      },
      {
        "slug": "superbet",
        "name": "Superbet",
        "accepted_path": "native",
        "native_source_id": "superbet",
        "external_source_ids": [],
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture_proven": true,
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "not_applicable",
        "online_proven": false,
        "evidence": [
          "principal_goal",
          "source_probe_20260919"
        ]
      },
      {
        "slug": "betano",
        "name": "Betano",
        "accepted_path": "native_or_oddalerts",
        "native_source_id": "betano",
        "external_source_ids": [
          "oddalerts"
        ],
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture_proven": true,
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "unproven",
        "online_proven": false,
        "evidence": [
          "principal_goal",
          "source_probe_20260919"
        ]
      },
      {
        "slug": "mgm",
        "name": "BetMGM",
        "accepted_path": "native",
        "native_source_id": "mgm",
        "external_source_ids": [],
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture_proven": true,
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "not_applicable",
        "online_proven": false,
        "evidence": [
          "principal_goal",
          "source_probe_20260919"
        ]
      },
      {
        "slug": "pinnacle",
        "name": "Pinnacle",
        "accepted_path": "native_or_oddalerts",
        "native_source_id": "pinnacle",
        "external_source_ids": [
          "oddalerts"
        ],
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture_proven": false,
        "capture": {
          "status": "failed",
          "label": "Própria: HTTP 403; externa pendente",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "unproven",
        "online_proven": false,
        "evidence": [
          "principal_goal",
          "source_probe_20260919"
        ]
      },
      {
        "slug": "bwin",
        "name": "Sportingbet",
        "accepted_path": "native",
        "native_source_id": "bwin",
        "external_source_ids": [],
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture_proven": true,
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "not_applicable",
        "online_proven": false,
        "evidence": [
          "principal_goal",
          "source_probe_20260919"
        ]
      },
      {
        "slug": "altenar",
        "name": "EstrelaBet",
        "accepted_path": "native",
        "native_source_id": "altenar",
        "external_source_ids": [],
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture_proven": true,
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "not_applicable",
        "online_proven": false,
        "evidence": [
          "principal_goal",
          "source_probe_20260919"
        ]
      },
      {
        "slug": "bet365",
        "name": "Bet365",
        "accepted_path": "oddalerts_while_native_standby",
        "native_source_id": "bet365_proprio",
        "external_source_ids": [
          "oddalerts"
        ],
        "preparation": {
          "status": "verified",
          "label": "Conector preparado"
        },
        "capture_proven": false,
        "capture": {
          "status": "unproven",
          "label": "Cobertura individual OddsAlerts pendente",
          "evidence": []
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "unproven",
        "online_proven": false,
        "evidence": [
          "principal_goal"
        ]
      },
      {
        "slug": "betby",
        "name": "Betboom",
        "accepted_path": "native",
        "native_source_id": "betby",
        "external_source_ids": [],
        "preparation": {
          "status": "verified",
          "label": "Preparo comprovado",
          "evidence": [
            "linux_preflight",
            "codigo"
          ]
        },
        "capture_proven": true,
        "capture": {
          "status": "verified",
          "label": "Catálogo + 2 detalhe(s)",
          "evidence": [
            "source_probe_20260919"
          ]
        },
        "publication": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "operation": {
          "status": "unproven",
          "label": "Não comprovada"
        },
        "external_individual_coverage": "not_applicable",
        "online_proven": false,
        "evidence": [
          "principal_goal",
          "source_probe_20260919"
        ]
      }
    ],
    "parallel_additions": [
      "betconstruct"
    ],
    "counters": {
      "primary_total": 9,
      "primary_online": 0,
      "primary_capture_proven": 7,
      "sources_probed": 10,
      "sources_captured": 9,
      "native_probed": 9,
      "native_captured": 8,
      "external_captured": 1,
      "sources_failed": 1,
      "jobs_total": 27,
      "original_receipts": 74,
      "original_bytes": 21466169,
      "oddalerts_http_requests": 13
    },
    "evidence": [
      "principal_goal"
    ],
    "measurement_scope": "Último recibo por fonte. Os recibos atuais comprovam preparo/captura; não há comprovação de publicação e recorrência. Flags de configuração ou online do probe não promovem etapas.",
    "external_scope": "Conector OddsAlerts capturado não comprova individualmente Bet365 ou Pinnacle. Kambi Group não é KTO. VBET é adicional e não substitui BetMGM."
  },
  "probe_history": [
    {
      "run_id": "principals-initial-20260919",
      "observed_at": "2026-09-19T04:11:27.087298+00:00",
      "sources_probed": 10,
      "sources_captured": 9,
      "baseline_unchanged": true,
      "evidence": [
        "source_probe_20260919"
      ]
    }
  ],
  "current_activity": {
    "title": "Pacotes locais em frentes independentes",
    "detail": "Pacote de integração + revisão do publisher; depois comprovar consumidor e recorrência por fonte.",
    "evidence": [
      "retomada_visual"
    ]
  },
  "monitor": {
    "live": false,
    "baseline_at": "2026-09-20T00:52:46.291773+00:00",
    "runtime": {
      "observed_at": "2026-09-20T00:28:54.717625+00:00",
      "services": [
        {
          "name": "vpsnova-test-image-anchor-ea02ca7",
          "project": null,
          "service": null,
          "state": "created",
          "health": null,
          "image": "sha256:564a8f9ae947f863226bdfd8db73fe8269434df924d2d6beafa7f2c1abbce211",
          "started_at": "0001-01-01T00:00:00Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-test-api-read-1",
          "project": "vpsnova-test",
          "service": "api-read",
          "state": "running",
          "health": "healthy",
          "image": "sha256:94dcb0b18631f1b7b6c951aa3b699fe7a021d54bea18614f1811db71bf2367b9",
          "started_at": "2026-09-17T17:13:49.776488715Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-test-ingest-core-1",
          "project": "vpsnova-test",
          "service": "ingest-core",
          "state": "running",
          "health": "healthy",
          "image": "sha256:94dcb0b18631f1b7b6c951aa3b699fe7a021d54bea18614f1811db71bf2367b9",
          "started_at": "2026-09-17T17:13:42.508158007Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-test-db-migrate-1",
          "project": "vpsnova-test",
          "service": "db-migrate",
          "state": "exited",
          "health": null,
          "image": "sha256:94dcb0b18631f1b7b6c951aa3b699fe7a021d54bea18614f1811db71bf2367b9",
          "started_at": "2026-09-17T17:13:41.830375845Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-test-postgres-1",
          "project": "vpsnova-test",
          "service": "postgres",
          "state": "running",
          "health": "healthy",
          "image": "sha256:bb3e1a57e5407e0a5280b4211980a5e537f4abd234a87014ac979849a78dd825",
          "started_at": "2026-09-17T17:03:27.92918848Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-core-grafana-1",
          "project": "vpsnova-core",
          "service": "grafana",
          "state": "running",
          "health": null,
          "image": "sha256:121a7a9ece6dc10b969f1f96eed64b4f07dfac0d0b8abc070f7cb83bbde86f63",
          "started_at": "2026-08-27T07:22:08.6326134Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-core-prometheus-1",
          "project": "vpsnova-core",
          "service": "prometheus",
          "state": "running",
          "health": null,
          "image": "sha256:332c2f43e7e389d74d3893b55bb02fbbd684208e681eeb604641d5d769c0fe2a",
          "started_at": "2026-08-27T07:22:08.418502654Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-core-ingest-core-1",
          "project": "vpsnova-core",
          "service": "ingest-core",
          "state": "running",
          "health": "healthy",
          "image": "sha256:4983562d0b58ffe6c19ff3ac631f04806e80cf1c5652c30ce08ed6254b52dbe3",
          "started_at": "2026-08-27T07:22:02.593968353Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-core-api-read-1",
          "project": "vpsnova-core",
          "service": "api-read",
          "state": "running",
          "health": "healthy",
          "image": "sha256:4983562d0b58ffe6c19ff3ac631f04806e80cf1c5652c30ce08ed6254b52dbe3",
          "started_at": "2026-08-27T07:22:02.590980461Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-core-db-migrate-1",
          "project": "vpsnova-core",
          "service": "db-migrate",
          "state": "exited",
          "health": null,
          "image": "sha256:4983562d0b58ffe6c19ff3ac631f04806e80cf1c5652c30ce08ed6254b52dbe3",
          "started_at": "2026-08-27T07:22:01.248912768Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-core-postgres-1",
          "project": "vpsnova-core",
          "service": "postgres",
          "state": "running",
          "health": "healthy",
          "image": "sha256:bb3e1a57e5407e0a5280b4211980a5e537f4abd234a87014ac979849a78dd825",
          "started_at": "2026-08-26T16:43:28.512579163Z",
          "restart_count": 0
        },
        {
          "name": "vpsnova-core-node-exporter-1",
          "project": "vpsnova-core",
          "service": "node-exporter",
          "state": "running",
          "health": null,
          "image": "sha256:1b4e4438faca4dd7e001dd445d161a4a2091b0fededa84093b3a8dfeae1f1be0",
          "started_at": "2026-08-26T16:43:28.494848484Z",
          "restart_count": 0
        }
      ],
      "comparison": {
        "reference_containers": 11,
        "unchanged": true,
        "inventory_containers": 12,
        "core_running": 6,
        "test_v1_running": 3
      },
      "v4_deployment_observed": false,
      "continuous_deployment_observed": false,
      "evidence_scope": "Alvos auditados: diretórios V4/continuous/integração ausentes, porta 18084 sem conexão, bancos TEST odds_test/postgres e nenhuma unidade correspondente carregada."
    },
    "fronts": {
      "observed_at": "2026-09-19T21:35:00-03:00",
      "source_observed_at": "2026-09-19T20:24:48.645296-03:00",
      "source_author": "Hermes bconstruct",
      "projection_author": "Coordenação VPSODDS · A-0280",
      "fronts": [
        {
          "name": "visual",
          "status": "delivered_local_pending_independent_review_and_publication",
          "session_id": "20260919_190456_f382c9",
          "process_id": "proc_fb1a6ee36cb7",
          "status_observed_at": "2026-09-19T20:24:48.645296-03:00"
        },
        {
          "name": "integracao",
          "status": "completed",
          "session_id": "20260919_190456_76541f",
          "process_id": "proc_cdf694aed9e2",
          "status_observed_at": "2026-09-20T02:06:09.807707+00:00",
          "detail": "Correção local concluída: 123 aprovados, 31 PG skips; sem aceite remoto."
        },
        {
          "name": "publisher",
          "status": "delivered_linux_verified_with_integration_gate",
          "session_id": "20260919_190456_5c27be",
          "process_id": "proc_2eed3a5c11c8",
          "status_observed_at": "2026-09-19T19:36:27.588506-03:00"
        },
        {
          "name": "auditoria",
          "status": "delivered_frozen_cuts_not_current_worktree_certification",
          "session_id": "20260919_192147_9be243",
          "process_id": "proc_4a7f21c020f6",
          "status_observed_at": "2026-09-19T20:24:48.645296-03:00"
        },
        {
          "name": "revisao_integracao",
          "status": "review_completed_rejected_L1_L2",
          "session_id": "20260919_194224_f46263",
          "process_id": "proc_e5e6dbe1053e",
          "status_observed_at": "2026-09-19T20:24:48.645296-03:00"
        },
        {
          "name": "recuperacao_atlas_contrato",
          "status": "process_started_not_yet_delivery",
          "session_id": null,
          "process_id": "proc_f660f599fc5a",
          "status_observed_at": "2026-09-19T20:24:48.645296-03:00"
        },
        {
          "name": "integration_corrections",
          "status": "completed",
          "status_observed_at": "2026-09-20T02:06:09.807707+00:00",
          "origin": "Coordenação VPSODDS · A-0280",
          "detail": "Correção local concluída: 123 aprovados, 31 PG skips; sem aceite remoto."
        },
        {
          "name": "oa_counterproof",
          "status": "corrections_in_progress",
          "status_observed_at": "2026-09-19T21:35:00-03:00",
          "origin": "Coordenação VPSODDS · A-0280",
          "detail": "Contraprova tardia OddsAlerts na persistência; correção externa em paralelo, sem bloquear nativas."
        }
      ]
    },
    "pg": {
      "schema": "hermes-fable-pg-verification/1",
      "projection": "Campos públicos selecionados do recibo original; não é uma nova execução.",
      "source": {
        "name": "PG_REMOTO_RECIBO.json",
        "bridge": "A-0272",
        "sha256": "bd8e1ead4517fcb6aee6f4ec375a7e8afe0358e0afe1925849542bef35f9cc70"
      },
      "run": "vpsnova-test-fable-verify-20260919t185720z-5f2043",
      "commit": "ea02ca774387fea8058de031d2d71d33f5678812",
      "image": "sha256:564a8f9ae947f863226bdfd8db73fe8269434df924d2d6beafa7f2c1abbce211",
      "scope": "disposable_postgresql_linux_contract_tests",
      "finished_at": "2026-09-19T18:57:33.974968+00:00",
      "online_claimed": false,
      "tests": {
        "tests": 91,
        "passed": 91,
        "failures": 0,
        "errors": 0,
        "skipped": 0
      },
      "status": "passed",
      "junit_sha256": "109c7edcbfe22cc96aba5235cc7368dd8b772e496f8f9e97301c27802c0a6142",
      "existing_containers_unchanged": true,
      "cleanup_errors": []
    },
    "stages": [
      {
        "id": "capture",
        "label": "Captura",
        "implementation": "implementado",
        "package": "empacotado",
        "deployment": "ativo no corte",
        "validation": "validado",
        "operation": "pendente",
        "owner": "Motor / captura",
        "summary": "Nove coletores guardavam CRU na VPS no corte A-0285; não são nove casas online.",
        "detail": "Captura sem harmonização, janela civil até 21/09 00:00 BRT, sem rolagem. Nova leitura é necessária para afirmar atividade agora.",
        "evidence": [
          "source_probe_20260919",
          "coordinator_audit_visual"
        ]
      },
      {
        "id": "publisher",
        "label": "Publicador / reenvio",
        "implementation": "implementado",
        "package": "empacotado",
        "deployment": "pendente",
        "validation": "validado",
        "operation": "pendente",
        "owner": "Publisher / recorrência",
        "summary": "86 testes Linux e probes aprovados; operação permanente pendente.",
        "detail": "A-0276 e auditoria A-0279: 86 testes Linux, UID/GID/flock e fsync file+directory aprovados. Não é queda física de energia. Contraprova tardia OddsAlerts continua bloqueada; nativas avançam em paralelo.",
        "evidence": [
          "retomada_visual",
          "coordinator_audit_visual"
        ]
      },
      {
        "id": "v4",
        "label": "Normalização por ID",
        "implementation": "implementado",
        "package": "empacotado",
        "deployment": "pendente",
        "validation": "validado",
        "operation": "pendente",
        "owner": "Integração TEST",
        "summary": "Contratos testados com banco real; serviço permanente pendente.",
        "detail": "Etapa local concluída. Ensaio Linux: 154 aprovados, zero não executados, com o serviço antigo da imagem. Novo pacote de contraprova: 148 aprovados, incluindo 58 com banco real. São ensaios isolados, sem aceite remoto operacional nem implantação permanente comprovada. Datas e recibos na evidência de trabalho.",
        "evidence": [
          "pg_real_visual",
          "coordinator_audit_visual",
          "work_evidence"
        ]
      },
      {
        "id": "postgres",
        "label": "PostgreSQL",
        "implementation": "implementado",
        "package": "instalado",
        "deployment": "pendente",
        "validation": "validado",
        "operation": "pendente",
        "owner": "Integração TEST",
        "summary": "Banco V1 no TEST; persistência V4 provada só no ensaio.",
        "detail": "Etapa local concluída. Ensaio Linux: 154 aprovados, zero não executados, com o serviço antigo da imagem. Novo pacote de contraprova: 148 aprovados, incluindo 58 com banco real. São ensaios isolados, sem aceite remoto operacional nem implantação permanente comprovada. Datas e recibos na evidência de trabalho.",
        "evidence": [
          "pg_real_visual",
          "coordinator_audit_visual",
          "work_evidence"
        ]
      },
      {
        "id": "api",
        "label": "API",
        "implementation": "implementado",
        "package": "empacotado",
        "deployment": "pendente",
        "validation": "validado",
        "operation": "pendente",
        "owner": "Integração TEST",
        "summary": "API V1 no TEST; entrega V4 de odds ainda sem prova.",
        "detail": "Etapa local concluída. Ensaio Linux: 154 aprovados, zero não executados, com o serviço antigo da imagem. Novo pacote de contraprova: 148 aprovados, incluindo 58 com banco real. São ensaios isolados, sem aceite remoto operacional nem implantação permanente comprovada. Datas e recibos na evidência de trabalho.",
        "evidence": [
          "pg_real_visual",
          "coordinator_audit_visual",
          "work_evidence"
        ]
      },
      {
        "id": "consumer",
        "label": "Consumidor",
        "implementation": "implementado",
        "package": "pendente",
        "deployment": "pendente",
        "validation": "pendente",
        "operation": "pendente",
        "owner": "Coordenação / consumidor",
        "summary": "A tela existe; a inicialização dos dados falhou no corte local.",
        "detail": "bootstrap_failed é falha de dados, não ausência de contrato. A-0287: esquema consultável, mas entrega de odds não comprovada. Atlas é outra superfície e tem responsável próprio.",
        "evidence": [
          "retomada_visual",
          "coordinator_audit_visual"
        ]
      }
    ],
    "next_delivery": "Ligar os originais ao normalizador, banco, API e tela, sem duplicar coletores.",
    "blocker": "Ensaio remoto da integração corrigida e consumo real pendentes; contraprova externa em frente separada.",
    "next_owner": "Hermes executa; tutor 01a0ad99 revisa. Integração local concluída, não é um agente running.",
    "limits": "Papi pausada · OddsJam só mapeamento · Bet365 via OddsAlerts externa · S-0268 candidato, não promovido.",
    "coordination": {
      "schema": "vpsodds-coordinator-audit-projection/1",
      "projection": "Campos públicos selecionados das auditorias da coordenação. Não é nova medição; não modifica FRENTES do Hermes nem prova operação.",
      "author": {
        "role": "Coordenação VPSODDS",
        "thread_id": "01a0ad99-508b-7171-849f-41ba7d4ed7aa",
        "bridge": [
          "A-0279",
          "A-0280"
        ]
      },
      "observed_at": "2026-09-19T21:35:00-03:00",
      "sources": [
        {
          "name": "hermes-remote-audit-20260919.json",
          "sha256": "4ac1fd2b661c923ff5038a649f9d2002a9f0eaf5ba553f050b124f9447158fd5"
        },
        {
          "name": "hermes-local-audit-20260919.json",
          "sha256": "ae6dc7a6e8a225d4c8e7e6b69abd2a8676725b2628a07be944a40a87c0c7dfdd"
        },
        {
          "name": "FRENTES.json",
          "sha256": "e5e19c187d8e15c1a712a12ef0b0fdd91224ba9b2343a47b1351157a24e2701d"
        },
        {
          "name": "COORD_LINUX_GREEN_RECIBO.json",
          "sha256": "31b5bef53a9276436b75473a446ad037327dd799d7acb0250e5ddbfdf9f5b467"
        }
      ],
      "runtime": {
        "observed_at": "2026-09-20T00:28:54.717625+00:00",
        "services": [
          {
            "name": "vpsnova-test-image-anchor-ea02ca7",
            "project": null,
            "service": null,
            "state": "created",
            "health": null,
            "image": "sha256:564a8f9ae947f863226bdfd8db73fe8269434df924d2d6beafa7f2c1abbce211",
            "started_at": "0001-01-01T00:00:00Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-test-api-read-1",
            "project": "vpsnova-test",
            "service": "api-read",
            "state": "running",
            "health": "healthy",
            "image": "sha256:94dcb0b18631f1b7b6c951aa3b699fe7a021d54bea18614f1811db71bf2367b9",
            "started_at": "2026-09-17T17:13:49.776488715Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-test-ingest-core-1",
            "project": "vpsnova-test",
            "service": "ingest-core",
            "state": "running",
            "health": "healthy",
            "image": "sha256:94dcb0b18631f1b7b6c951aa3b699fe7a021d54bea18614f1811db71bf2367b9",
            "started_at": "2026-09-17T17:13:42.508158007Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-test-db-migrate-1",
            "project": "vpsnova-test",
            "service": "db-migrate",
            "state": "exited",
            "health": null,
            "image": "sha256:94dcb0b18631f1b7b6c951aa3b699fe7a021d54bea18614f1811db71bf2367b9",
            "started_at": "2026-09-17T17:13:41.830375845Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-test-postgres-1",
            "project": "vpsnova-test",
            "service": "postgres",
            "state": "running",
            "health": "healthy",
            "image": "sha256:bb3e1a57e5407e0a5280b4211980a5e537f4abd234a87014ac979849a78dd825",
            "started_at": "2026-09-17T17:03:27.92918848Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-core-grafana-1",
            "project": "vpsnova-core",
            "service": "grafana",
            "state": "running",
            "health": null,
            "image": "sha256:121a7a9ece6dc10b969f1f96eed64b4f07dfac0d0b8abc070f7cb83bbde86f63",
            "started_at": "2026-08-27T07:22:08.6326134Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-core-prometheus-1",
            "project": "vpsnova-core",
            "service": "prometheus",
            "state": "running",
            "health": null,
            "image": "sha256:332c2f43e7e389d74d3893b55bb02fbbd684208e681eeb604641d5d769c0fe2a",
            "started_at": "2026-08-27T07:22:08.418502654Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-core-ingest-core-1",
            "project": "vpsnova-core",
            "service": "ingest-core",
            "state": "running",
            "health": "healthy",
            "image": "sha256:4983562d0b58ffe6c19ff3ac631f04806e80cf1c5652c30ce08ed6254b52dbe3",
            "started_at": "2026-08-27T07:22:02.593968353Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-core-api-read-1",
            "project": "vpsnova-core",
            "service": "api-read",
            "state": "running",
            "health": "healthy",
            "image": "sha256:4983562d0b58ffe6c19ff3ac631f04806e80cf1c5652c30ce08ed6254b52dbe3",
            "started_at": "2026-08-27T07:22:02.590980461Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-core-db-migrate-1",
            "project": "vpsnova-core",
            "service": "db-migrate",
            "state": "exited",
            "health": null,
            "image": "sha256:4983562d0b58ffe6c19ff3ac631f04806e80cf1c5652c30ce08ed6254b52dbe3",
            "started_at": "2026-08-27T07:22:01.248912768Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-core-postgres-1",
            "project": "vpsnova-core",
            "service": "postgres",
            "state": "running",
            "health": "healthy",
            "image": "sha256:bb3e1a57e5407e0a5280b4211980a5e537f4abd234a87014ac979849a78dd825",
            "started_at": "2026-08-26T16:43:28.512579163Z",
            "restart_count": 0
          },
          {
            "name": "vpsnova-core-node-exporter-1",
            "project": "vpsnova-core",
            "service": "node-exporter",
            "state": "running",
            "health": null,
            "image": "sha256:1b4e4438faca4dd7e001dd445d161a4a2091b0fededa84093b3a8dfeae1f1be0",
            "started_at": "2026-08-26T16:43:28.494848484Z",
            "restart_count": 0
          }
        ],
        "comparison": {
          "reference_containers": 11,
          "unchanged": true,
          "inventory_containers": 12,
          "core_running": 6,
          "test_v1_running": 3
        },
        "v4_deployment_observed": false,
        "continuous_deployment_observed": false,
        "evidence_scope": "Alvos auditados: diretórios V4/continuous/integração ausentes, porta 18084 sem conexão, bancos TEST odds_test/postgres e nenhuma unidade correspondente carregada."
      },
      "fronts": {
        "observed_at": "2026-09-19T21:35:00-03:00",
        "source_observed_at": "2026-09-19T20:24:48.645296-03:00",
        "source_author": "Hermes bconstruct",
        "projection_author": "Coordenação VPSODDS · A-0280",
        "fronts": [
          {
            "name": "visual",
            "status": "delivered_local_pending_independent_review_and_publication",
            "session_id": "20260919_190456_f382c9",
            "process_id": "proc_fb1a6ee36cb7",
            "status_observed_at": "2026-09-19T20:24:48.645296-03:00"
          },
          {
            "name": "integracao",
            "status": "completed",
            "session_id": "20260919_190456_76541f",
            "process_id": "proc_cdf694aed9e2",
            "status_observed_at": "2026-09-20T02:06:09.807707+00:00",
            "detail": "Correção local concluída: 123 aprovados, 31 PG skips; sem aceite remoto."
          },
          {
            "name": "publisher",
            "status": "delivered_linux_verified_with_integration_gate",
            "session_id": "20260919_190456_5c27be",
            "process_id": "proc_2eed3a5c11c8",
            "status_observed_at": "2026-09-19T19:36:27.588506-03:00"
          },
          {
            "name": "auditoria",
            "status": "delivered_frozen_cuts_not_current_worktree_certification",
            "session_id": "20260919_192147_9be243",
            "process_id": "proc_4a7f21c020f6",
            "status_observed_at": "2026-09-19T20:24:48.645296-03:00"
          },
          {
            "name": "revisao_integracao",
            "status": "review_completed_rejected_L1_L2",
            "session_id": "20260919_194224_f46263",
            "process_id": "proc_e5e6dbe1053e",
            "status_observed_at": "2026-09-19T20:24:48.645296-03:00"
          },
          {
            "name": "recuperacao_atlas_contrato",
            "status": "process_started_not_yet_delivery",
            "session_id": null,
            "process_id": "proc_f660f599fc5a",
            "status_observed_at": "2026-09-19T20:24:48.645296-03:00"
          },
          {
            "name": "integration_corrections",
            "status": "completed",
            "status_observed_at": "2026-09-20T02:06:09.807707+00:00",
            "origin": "Coordenação VPSODDS · A-0280",
            "detail": "Correção local concluída: 123 aprovados, 31 PG skips; sem aceite remoto."
          },
          {
            "name": "oa_counterproof",
            "status": "corrections_in_progress",
            "status_observed_at": "2026-09-19T21:35:00-03:00",
            "origin": "Coordenação VPSODDS · A-0280",
            "detail": "Contraprova tardia OddsAlerts na persistência; correção externa em paralelo, sem bloquear nativas."
          }
        ]
      },
      "review": {
        "status": "rejected",
        "label": "Revisão da integração REPROVADA (L1/L2)",
        "source_observed_at": "2026-09-19T20:24:48.645296-03:00",
        "confirmed_by": "A-0279",
        "corrections": "Em andamento pela divisão de A-0280; não prontas nem implantadas."
      },
      "verified_tests": {
        "pg": {
          "tests": 91,
          "failures": 0,
          "errors": 0,
          "skipped": 0,
          "sha256": "109c7edcbfe22cc96aba5235cc7368dd8b772e496f8f9e97301c27802c0a6142"
        },
        "publisher": {
          "passed": 86,
          "failures": 0,
          "permissions": "passed",
          "fsync_targets": [
            "file",
            "directory"
          ],
          "scope": "real_linux_syscalls_not_power_loss_simulation",
          "finished_at": "2026-09-19T22:34:47.124101+00:00"
        },
        "remote_receipts_match_local": true
      },
      "support": {
        "atlas": {
          "port": 8960,
          "status": "unreachable",
          "required_for_native_capture": false,
          "detail": "Atlas não respondeu à auditoria local; apoio visual não deve segurar fontes nativas."
        },
        "consumer": {
          "port": 8955,
          "http_status": 200,
          "status": "bootstrap_failed",
          "error": "provider_initialization_failed",
          "store_loaded": false,
          "required_for_online": true,
          "detail": "Caminho do consumidor necessário para comprovar o produto; HTTP 200 com bootstrap_failed não é sucesso."
        }
      },
      "blockers": [
        {
          "id": "L1",
          "label": "Persistência pós-restart: falso positivo",
          "detail": "O smoke reenviava antes de conferir a persistência e podia mascarar banco perdido. Comparar estado antes do reenvio; primeiro replay exige duplicate=true e changes=0."
        },
        {
          "id": "L2",
          "label": "ACK stale: falso positivo",
          "detail": "Primeiro ACK stale/ambiguous não pode aprovar publicação; conferir stream, sequence, instante e capture_id."
        },
        {
          "id": "C1",
          "label": "Namespace de caminhos",
          "detail": "Produtor, publicador e API devem usar o mesmo namespace Linux de originais e agenda, sem reescrever bytes, caminhos ou hashes de manifestos."
        },
        {
          "id": "T1",
          "label": "Redirects autenticados",
          "detail": "Recusar redirects nos probes autenticados."
        },
        {
          "id": "OA",
          "label": "Contraprova tardia OddsAlerts",
          "detail": "Capture_id igual pode receber duplicate antes de reavaliar oferta conflitante; corrigir a semântica com prova, sem fabricar sha ou relógio. Nativas avançam em paralelo."
        }
      ],
      "online": {
        "proved": 0,
        "minimum": 9,
        "scope": "Testes e código não comprovam publicação/consumidor/recorrência por casa."
      }
    },
    "publisher": {
      "passed": 86,
      "failures": 0,
      "permissions": "passed",
      "fsync_targets": [
        "file",
        "directory"
      ],
      "scope": "real_linux_syscalls_not_power_loss_simulation",
      "finished_at": "2026-09-19T22:34:47.124101+00:00"
    },
    "evidence_ref": "coordinator_audit_visual",
    "verdict": "Captura CRU comprovada no corte; entrega de odds ainda pendente.",
    "verdict_detail": "91 testes com PostgreSQL real e 86 no publicador Linux foram comprovados. A auditoria não encontrou V4/continuous implantados nos alvos; 0/9 casas online.",
    "raw": {
      "observed_at": "2026-09-20T00:52:46.291773+00:00",
      "sources": [
        {
          "source": "ODDSALERTS",
          "container": "vpsnova-test-raw-oddsalerts",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:45.092757+00:00",
          "supervisor_stopped": false,
          "events_in_window": 813,
          "events_captured": 150,
          "future_events_eligible": 811,
          "captured_jobs": 5,
          "failed_jobs": 0,
          "requests": 14,
          "original_bytes": 1040011,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:33.063948+00:00"
          }
        },
        {
          "source": "kto",
          "container": "vpsnova-test-raw-kto",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:45.206654+00:00",
          "supervisor_stopped": false,
          "events_in_window": 640,
          "events_captured": 12,
          "future_events_eligible": 601,
          "captured_jobs": 13,
          "failed_jobs": 0,
          "requests": 14,
          "original_bytes": 315890,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:40.232198+00:00"
          }
        },
        {
          "source": "superbet",
          "container": "vpsnova-test-raw-superbet",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:45.520799+00:00",
          "supervisor_stopped": false,
          "events_in_window": 2184,
          "events_captured": 12,
          "future_events_eligible": 812,
          "captured_jobs": 13,
          "failed_jobs": 0,
          "requests": 13,
          "original_bytes": 2339075,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:42.361484+00:00"
          }
        },
        {
          "source": "betano",
          "container": "vpsnova-test-raw-betano",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:46.172286+00:00",
          "supervisor_stopped": false,
          "events_in_window": 828,
          "events_captured": 12,
          "future_events_eligible": 828,
          "captured_jobs": 13,
          "failed_jobs": 0,
          "requests": 13,
          "original_bytes": 5394122,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:43.646037+00:00"
          }
        },
        {
          "source": "mgm",
          "container": "vpsnova-test-raw-mgm",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:44.441944+00:00",
          "supervisor_stopped": false,
          "events_in_window": 511,
          "events_captured": 12,
          "future_events_eligible": 509,
          "captured_jobs": 13,
          "failed_jobs": 0,
          "requests": 25,
          "original_bytes": 3465723,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:43.405029+00:00"
          }
        },
        {
          "source": "bwin",
          "container": "vpsnova-test-raw-bwin",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:45.303585+00:00",
          "supervisor_stopped": false,
          "events_in_window": 741,
          "events_captured": 12,
          "future_events_eligible": 701,
          "captured_jobs": 13,
          "failed_jobs": 0,
          "requests": 30,
          "original_bytes": 7236242,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:44.934877+00:00"
          }
        },
        {
          "source": "altenar",
          "container": "vpsnova-test-raw-altenar",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:45.823678+00:00",
          "supervisor_stopped": false,
          "events_in_window": 785,
          "events_captured": 12,
          "future_events_eligible": 785,
          "captured_jobs": 13,
          "failed_jobs": 0,
          "requests": 13,
          "original_bytes": 860077,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:40.920853+00:00"
          }
        },
        {
          "source": "betby",
          "container": "vpsnova-test-raw-betby",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:46.164585+00:00",
          "supervisor_stopped": false,
          "events_in_window": 600,
          "events_captured": 12,
          "future_events_eligible": 600,
          "captured_jobs": 13,
          "failed_jobs": 0,
          "requests": 18,
          "original_bytes": 500264,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:41.061636+00:00"
          }
        },
        {
          "source": "betconstruct",
          "container": "vpsnova-test-raw-betconstruct",
          "running": true,
          "restarts": 0,
          "updated_at": "2026-09-20T00:52:44.835153+00:00",
          "supervisor_stopped": false,
          "events_in_window": 724,
          "events_captured": 11,
          "future_events_eligible": 720,
          "captured_jobs": 12,
          "failed_jobs": 0,
          "requests": 24,
          "original_bytes": 2392278,
          "paused_reason": null,
          "last_result": {
            "kind": "detail",
            "status": "captured",
            "error": null,
            "finished_at": "2026-09-20T00:52:38.579084+00:00"
          }
        }
      ],
      "source_count": 9,
      "running_count": 9,
      "baseline_unchanged": true,
      "harmonization": false,
      "online_claimed": false,
      "window": {
        "first_day": "2026-09-19",
        "last_day": "2026-09-20",
        "timezone": "America/Sao_Paulo",
        "rolling_window": false
      }
    },
    "integration": {
      "status": "completed",
      "observed_at": "2026-09-20T02:06:09.807707+00:00",
      "passed": 123,
      "skipped": 31,
      "deploy_approved": false,
      "pg_executed": false,
      "online_claimed": false
    }
  },
  "functional_map": {
    "schema": "vpsodds-functional-map/1",
    "decision": "A-0274: nomes funcionais; pasta e autoria não são produtos.",
    "scope": "Código observado localmente, não tráfego ativo. Sem serviço de contrato V4 permanente identificado no inventário Docker de 19/09 19:05 BRT; processos fora de Docker não foram medidos. Estado posterior requer novo recibo.",
    "nodes": [
      {
        "id": "capture",
        "label": "Captura e guarda dos originais",
        "type": "processo de coleta",
        "role": "Executa jobs reservados por fonte e promove resultados completos, sem substituir recibos já publicados.",
        "input": "Job, configuração identificada e resposta HTTP/WS da fonte.",
        "output": "Arquivos originais, recibos e jobs/*.result.json.",
        "location": "VPS srv1928392 TEST: nove supervisores ativos no corte A-0285 (2026-09-20T00:52:46.291773+00:00), guardando CRU. Janela civil encerra 21/09 00:00 BRT; sem rolagem. Não é medição atual.",
        "owner": "Publisher / recorrência; coordenação opera TEST",
        "status": "histórico",
        "next": "Comprovar nova captura e recuperação recorrente por fonte.",
        "sources": [
          "worker_launch",
          "worker_collect"
        ],
        "evidence": [
          "source_probe_20260919",
          "snapshots_visual"
        ]
      },
      {
        "id": "native-manifest",
        "label": "Conferência da captura nativa",
        "type": "módulo no publicador",
        "role": "Confere hashes, ID nativo e corpus de agenda; prepara manifesto, não normaliza mercados aqui.",
        "input": "Detalhe completo, original imutável e evidência de agenda fixada.",
        "output": "Manifesto raw-capture/1.0.0 com caminho/hash, stream e sequência.",
        "location": "Código local; não implantado como publicador permanente no snapshot.",
        "owner": "Publisher / recorrência",
        "status": "implementado",
        "next": "Empacotar agenda e originais acessíveis por raízes autorizadas ao servidor.",
        "sources": [
          "prepare",
          "native_manifests",
          "documents"
        ],
        "evidence": [
          "retomada_visual"
        ]
      },
      {
        "id": "external-batch",
        "label": "Normalização da fonte externa",
        "type": "módulo no publicador",
        "role": "Reúne páginas OddsAlerts verificadas, aplica códigos e provas por mercado; preserva pending/conflict e relógio da fonte.",
        "input": "Movimentos OddsAlerts, prova fixada com testemunhas e catálogo selecionado.",
        "output": "Lotes V4 por oferta, origem ODDSALERTS, complete_scope=false.",
        "location": "Código local e dependência no piloto; não implantado como publicador permanente.",
        "owner": "Publisher / recorrência",
        "status": "implementado",
        "next": "Fechar prova portátil e publicação de bookmakers individualmente; Bet365 continua externa.",
        "sources": [
          "prepare",
          "build_batches",
          "load_proof",
          "harmonize_latest",
          "load_rule_evidence"
        ],
        "evidence": [
          "retomada_visual"
        ]
      },
      {
        "id": "publisher",
        "label": "Publicador com fila de reenvio",
        "type": "processo + arquivos de estado",
        "role": "Congela payload por hash, persiste tentativa antes do POST, reenvia com limites e grava ACK durável.",
        "input": "Manifesto nativo ou lote externo já preparado.",
        "output": "POST autenticado; estado pending/retry/blocked/exhausted/acked e recibo do ACK.",
        "location": "Código local testado; ausência de processo permanente comprovado no inventário.",
        "owner": "Publisher / recorrência",
        "status": "implementado",
        "next": "Revisar recuperação e integrar ao endpoint TEST; ACK não certifica odds online.",
        "sources": [
          "discover",
          "deliver",
          "transport",
          "valid_ack"
        ],
        "evidence": [
          "retomada_visual",
          "snapshots_visual"
        ]
      },
      {
        "id": "intake",
        "label": "Recepção autenticada",
        "type": "serviço HTTP",
        "role": "Autentica escrita e valida corpo; distingue manifesto nativo de lote já normalizado.",
        "input": "POST /v4/captures ou POST /v4/batches com credencial de ingestão.",
        "output": "Lote encaminhado à persistência; ACK ou erro controlado.",
        "location": "Implementado e empacotado. Serviço permanente não implantado no corte; âncora Created não executa.",
        "owner": "Integração TEST",
        "status": "validado em ensaio",
        "next": "Instalar serviço permanente com roots, banco e credenciais privados.",
        "sources": [
          "dispatch",
          "authenticate",
          "body",
          "service_main"
        ],
        "evidence": [
          "pg_real_visual",
          "snapshots_visual"
        ]
      },
      {
        "id": "normalize",
        "label": "Normalização nativa por ID",
        "type": "módulo dentro do serviço HTTP",
        "role": "Lê o original pela referência, verifica hash/identidade e aplica leitores, catálogo e motor de regras; não é agente autônomo.",
        "input": "Manifesto nativo + original + agenda/catálogo fixados.",
        "output": "Lote V4 com records, proveniência, confirmed/pending/conflict e complete_scope=false.",
        "location": "Módulo empacotado; executado na suíte isolada. Não implantado permanentemente no snapshot.",
        "owner": "Integração TEST / motor; curadoria via PONTE",
        "status": "validado em ensaio",
        "next": "Publicar original real no TEST permanente sem trocar a seleção de catálogo.",
        "sources": [
          "adapter_init",
          "harmonize",
          "engine_harmonize"
        ],
        "evidence": [
          "pg_real_visual",
          "retomada_visual"
        ]
      },
      {
        "id": "persist",
        "label": "Persistência transacional",
        "type": "módulo dentro do serviço HTTP",
        "role": "Valida contrato, ordena observações, deduplica e atualiza ofertas/journal em transação no banco dedicado.",
        "input": "Lote V4 da rota externa ou da normalização nativa.",
        "output": "Dados persistidos e ACK com capture_id, disposição, cursor e mudanças.",
        "location": "Implementado e testado em banco descartável. Não é a outbox de arquivos do publicador.",
        "owner": "Integração TEST",
        "status": "validado em ensaio",
        "next": "Migrar schema dedicado no TEST permanente e verificar reenvio idempotente.",
        "sources": [
          "apply_batch",
          "transaction",
          "validate_batch"
        ],
        "evidence": [
          "pg_real_visual"
        ]
      },
      {
        "id": "postgres",
        "label": "Banco de ofertas e journal",
        "type": "processo PostgreSQL / armazenamento",
        "role": "Mantém estado e trilha de mudanças no banco/schema dedicado; banco V1 existente é outro escopo.",
        "input": "Transações SQL e migrations versionadas.",
        "output": "Ofertas, observações, journal e cursor consistente.",
        "location": "PostgreSQL V1 ativo no TEST. Schema V4 só comprovado no banco descartável já removido.",
        "owner": "Integração TEST / coordenação",
        "status": "instalado V1; V4 ensaiado",
        "next": "Instalar migrations V4 sem tocar schemas/dados da fundação.",
        "sources": [
          "migrate",
          "transaction",
          "snapshot",
          "changes"
        ],
        "evidence": [
          "pg_real_visual",
          "snapshots_visual"
        ]
      },
      {
        "id": "api",
        "label": "Consulta autenticada",
        "type": "rotas do mesmo serviço HTTP",
        "role": "Lê snapshot confirmado, observações e mudanças por cursor; credencial de leitura separada da ingestão.",
        "input": "GET com filtros source/house/native_event_id ou cursor after.",
        "output": "/v4/snapshot, /v4/observations, /v4/changes e estatísticas.",
        "location": "Rotas implementadas/testadas; API V1 existente não é essa API V4 permanente.",
        "owner": "Integração TEST",
        "status": "validado em ensaio",
        "next": "Comprovar consulta de uma oferta rastreável após publicação real.",
        "sources": [
          "dispatch",
          "snapshot",
          "observations",
          "changes"
        ],
        "evidence": [
          "pg_real_visual",
          "snapshots_visual"
        ]
      },
      {
        "id": "consumer",
        "label": "Consumidor de odds",
        "type": "consumidor externo / alvo",
        "role": "Alvo de exibição de ofertas atuais com origem e relógios; integração final não demonstrada.",
        "input": "Snapshot e mudanças da API V4.",
        "output": "Odds apresentadas e atualização/recuperação comprovadas por fonte.",
        "location": "Computador local: consumidor respondeu com bootstrap_failed na A-0287, 19/09/2026 23:24 BRT. Interface e contrato existentes; falha de inicialização dos dados, não ausência de contrato.",
        "owner": "Coordenação / responsável pelo consumidor",
        "status": "não verificado",
        "next": "Identificar implementação exata e produzir recibo ponta a ponta; não inventar conexão ativa.",
        "sources": [
          "goal_contract"
        ],
        "evidence": [
          "principal_goal",
          "snapshots_visual"
        ]
      }
    ],
    "edges": [
      {
        "id": "raw-native",
        "from": "capture",
        "to": "native-manifest",
        "label": "Original nativo + recibos",
        "role": "Leitura local de arquivos completos, conferidos por hash.",
        "input": "Job detail/captured e original_complete=true",
        "output": "Documentos verificados para identificação nativa",
        "sources": [
          "documents",
          "native_manifests"
        ]
      },
      {
        "id": "raw-external",
        "from": "capture",
        "to": "external-batch",
        "label": "Páginas OddsAlerts + provas",
        "role": "Verifica paginação e prepara normalização fora do servidor.",
        "input": "Páginas de current_odds_movements",
        "output": "Dados externos e prova fixada",
        "sources": [
          "documents",
          "build_batches"
        ]
      },
      {
        "id": "manifest-queue",
        "from": "native-manifest",
        "to": "publisher",
        "label": "Manifesto → fila imutável",
        "role": "Congela bytes e rota de destino na outbox.",
        "input": "raw-capture/1.0.0",
        "output": "Payload por SHA-256 para /v4/captures",
        "sources": [
          "prepare",
          "discover"
        ]
      },
      {
        "id": "batch-queue",
        "from": "external-batch",
        "to": "publisher",
        "label": "Lote por oferta → fila",
        "role": "Congela lotes já normalizados; preserva origem externa.",
        "input": "batch V4, complete_scope=false",
        "output": "Payload por SHA-256 para /v4/batches",
        "sources": [
          "prepare",
          "build_batches",
          "discover"
        ]
      },
      {
        "id": "post-native",
        "from": "publisher",
        "to": "intake",
        "label": "POST /v4/captures",
        "role": "Transporte do manifesto autenticado; não envia preço por inferência.",
        "input": "Bytes do manifesto + autenticação",
        "output": "Recepção do manifesto no serviço",
        "sources": [
          "transport",
          "dispatch"
        ]
      },
      {
        "id": "post-external",
        "from": "publisher",
        "to": "intake",
        "label": "POST /v4/batches",
        "role": "Transporte de lote externo já preparado.",
        "input": "Bytes do lote + autenticação",
        "output": "Recepção para apply_batch sem CaptureAdapter",
        "sources": [
          "transport",
          "dispatch"
        ]
      },
      {
        "id": "intake-native",
        "from": "intake",
        "to": "normalize",
        "label": "Manifesto → normalização local",
        "role": "Somente /v4/captures chama adapter.harmonize.",
        "input": "Manifesto validado",
        "output": "Leitura e normalização do original",
        "sources": [
          "dispatch",
          "harmonize"
        ]
      },
      {
        "id": "normalized-store",
        "from": "normalize",
        "to": "persist",
        "label": "Lote normalizado → transação",
        "role": "Resultado da normalização nativa segue para apply_batch.",
        "input": "Batch V4 conferido",
        "output": "Persistência/ACK",
        "sources": [
          "dispatch",
          "harmonize",
          "apply_batch"
        ]
      },
      {
        "id": "external-store",
        "from": "intake",
        "to": "persist",
        "label": "Lote externo → transação",
        "role": "/v4/batches vai direto à validação/persistência; não normaliza nativas.",
        "input": "Batch externo",
        "output": "Persistência/ACK",
        "sources": [
          "dispatch",
          "apply_batch"
        ]
      },
      {
        "id": "sql-write",
        "from": "persist",
        "to": "postgres",
        "label": "Transação SQL dedicada",
        "role": "Confere current_database, serializa escritor e confirma ofertas/journal juntos.",
        "input": "Lote válido e schema dedicado",
        "output": "Captura/ofertas/journal persistidos",
        "sources": [
          "transaction",
          "apply_batch"
        ]
      },
      {
        "id": "sql-read",
        "from": "postgres",
        "to": "api",
        "label": "Snapshot / journal / observações",
        "role": "A API chama consultas de PgStore; seta representa dados retornados, não um processo novo.",
        "input": "Consulta autenticada",
        "output": "JSON de leitura consistente",
        "sources": [
          "dispatch",
          "snapshot",
          "changes",
          "observations"
        ]
      },
      {
        "id": "ack",
        "from": "intake",
        "to": "publisher",
        "label": "ACK → estado durável",
        "role": "HTTP retorna resultado da transação; publicador valida campos e persiste ACK.",
        "input": "Resposta 200 com capture_id/disposition/cursor/changes",
        "output": "Parte marcada com ACK; não é certificado de online",
        "sources": [
          "apply_batch",
          "handle_request",
          "valid_ack",
          "deliver"
        ]
      },
      {
        "id": "consume",
        "from": "api",
        "to": "consumer",
        "label": "Entrega ao consumidor (proposta)",
        "role": "Integração ainda não comprovada. Não representa tráfego observado.",
        "input": "Snapshot e deltas V4",
        "output": "Tela/consumo com prova ponta a ponta pendente",
        "sources": [
          "goal_contract"
        ],
        "status": "proposta"
      }
    ]
  },
  "code_sources": {
    "schema": "vpsodds-code-sources/1",
    "observed_at": "2026-09-19T22:26:43.159786+00:00",
    "scope": "Hash dos bytes locais observados; não afirma que working tree seja a release instalada. Fontes externas são pacotes dependentes, não agentes.",
    "sources": {
      "prepare": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/publisher.py",
        "symbol": "Preparer.prepare",
        "start_line": 87,
        "end_line": 134,
        "sha256": "7f863cd0be07fd8920834111ed333dce77d15630293ed5f1de1dd3db6867eda5",
        "nature": "implementação observada"
      },
      "discover": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/publisher.py",
        "symbol": "Publisher.discover",
        "start_line": 174,
        "end_line": 242,
        "sha256": "7f863cd0be07fd8920834111ed333dce77d15630293ed5f1de1dd3db6867eda5",
        "nature": "implementação observada"
      },
      "deliver": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/publisher.py",
        "symbol": "Publisher.deliver",
        "start_line": 244,
        "end_line": 311,
        "sha256": "7f863cd0be07fd8920834111ed333dce77d15630293ed5f1de1dd3db6867eda5",
        "nature": "implementação observada"
      },
      "transport": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/publisher.py",
        "symbol": "HttpTransport.post",
        "start_line": 66,
        "end_line": 78,
        "sha256": "7f863cd0be07fd8920834111ed333dce77d15630293ed5f1de1dd3db6867eda5",
        "nature": "implementação observada"
      },
      "valid_ack": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/publisher.py",
        "symbol": "valid_ack",
        "start_line": 49,
        "end_line": 58,
        "sha256": "7f863cd0be07fd8920834111ed333dce77d15630293ed5f1de1dd3db6867eda5",
        "nature": "implementação observada"
      },
      "documents": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/receipts.py",
        "symbol": "documents",
        "start_line": 68,
        "end_line": 150,
        "sha256": "1fe7ce6accbcea698156ca7552ae604d3b947b38a452c9b60522b0d1412cf566",
        "nature": "implementação observada"
      },
      "native_manifests": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/receipts.py",
        "symbol": "native_manifests",
        "start_line": 192,
        "end_line": 221,
        "sha256": "1fe7ce6accbcea698156ca7552ae604d3b947b38a452c9b60522b0d1412cf566",
        "nature": "implementação observada"
      },
      "build_batches": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/oddalerts.py",
        "symbol": "build_batches",
        "start_line": 149,
        "end_line": 217,
        "sha256": "aa06da1d28ac66f1f01e919aab5bacf28a73a222cf3b8ef7853d47722d1c253e",
        "nature": "implementação observada"
      },
      "load_proof": {
        "root": "project",
        "path": "services/capture-publisher/capture_publisher/oddalerts.py",
        "symbol": "load_proof",
        "start_line": 117,
        "end_line": 146,
        "sha256": "aa06da1d28ac66f1f01e919aab5bacf28a73a222cf3b8ef7853d47722d1c253e",
        "nature": "implementação observada"
      },
      "dispatch": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/http.py",
        "symbol": "make_server.Handler.dispatch",
        "start_line": 97,
        "end_line": 141,
        "sha256": "dd15973ea0f466672b4c6ade284f1f0a7bc4ba65419c6caa8ded2086d7d741cb",
        "nature": "implementação observada"
      },
      "authenticate": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/http.py",
        "symbol": "make_server.Handler.authenticate",
        "start_line": 67,
        "end_line": 71,
        "sha256": "dd15973ea0f466672b4c6ade284f1f0a7bc4ba65419c6caa8ded2086d7d741cb",
        "nature": "implementação observada"
      },
      "body": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/http.py",
        "symbol": "make_server.Handler.body",
        "start_line": 73,
        "end_line": 95,
        "sha256": "dd15973ea0f466672b4c6ade284f1f0a7bc4ba65419c6caa8ded2086d7d741cb",
        "nature": "implementação observada"
      },
      "handle_request": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/http.py",
        "symbol": "make_server.Handler.handle_request",
        "start_line": 143,
        "end_line": 162,
        "sha256": "dd15973ea0f466672b4c6ade284f1f0a7bc4ba65419c6caa8ded2086d7d741cb",
        "nature": "implementação observada"
      },
      "adapter_init": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/adapter.py",
        "symbol": "CaptureAdapter.__init__",
        "start_line": 92,
        "end_line": 130,
        "sha256": "c0439515d34202bedb71d321276d076001da2d9065db668d71768bb0b3a8a403",
        "nature": "implementação observada"
      },
      "harmonize": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/adapter.py",
        "symbol": "CaptureAdapter.harmonize",
        "start_line": 279,
        "end_line": 339,
        "sha256": "c0439515d34202bedb71d321276d076001da2d9065db668d71768bb0b3a8a403",
        "nature": "implementação observada"
      },
      "apply_batch": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/store.py",
        "symbol": "PgStore.apply_batch",
        "start_line": 106,
        "end_line": 225,
        "sha256": "efc7d422f2be76e868f656f4a13774b38407471e20f09ca5a881b06f71a92514",
        "nature": "implementação observada"
      },
      "transaction": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/store.py",
        "symbol": "PgStore._transaction",
        "start_line": 60,
        "end_line": 75,
        "sha256": "efc7d422f2be76e868f656f4a13774b38407471e20f09ca5a881b06f71a92514",
        "nature": "implementação observada"
      },
      "migrate": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/store.py",
        "symbol": "PgStore.migrate",
        "start_line": 77,
        "end_line": 95,
        "sha256": "efc7d422f2be76e868f656f4a13774b38407471e20f09ca5a881b06f71a92514",
        "nature": "implementação observada"
      },
      "snapshot": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/store.py",
        "symbol": "PgStore.snapshot",
        "start_line": 237,
        "end_line": 251,
        "sha256": "efc7d422f2be76e868f656f4a13774b38407471e20f09ca5a881b06f71a92514",
        "nature": "implementação observada"
      },
      "observations": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/store.py",
        "symbol": "PgStore.observations",
        "start_line": 253,
        "end_line": 266,
        "sha256": "efc7d422f2be76e868f656f4a13774b38407471e20f09ca5a881b06f71a92514",
        "nature": "implementação observada"
      },
      "changes": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/store.py",
        "symbol": "PgStore.changes",
        "start_line": 268,
        "end_line": 278,
        "sha256": "efc7d422f2be76e868f656f4a13774b38407471e20f09ca5a881b06f71a92514",
        "nature": "implementação observada"
      },
      "validate_batch": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/validation.py",
        "symbol": "validate_batch",
        "start_line": 10,
        "end_line": 20,
        "sha256": "314c7b5931299987672251a662001dabc30317c9c8a10e1a9949945c48b16f33",
        "nature": "implementação observada"
      },
      "service_main": {
        "root": "project",
        "path": "services/fable-v4/fable_v4_service/__main__.py",
        "symbol": "main",
        "start_line": 9,
        "end_line": 42,
        "sha256": "013641421283feb19e86796fe1c4789fc44fdf6b8a758ca7d00fb39c972f2ff6",
        "nature": "implementação observada"
      },
      "worker_launch": {
        "root": "project",
        "path": "services/source-runtime/docker_backend.py",
        "symbol": "Backend.launch",
        "start_line": 157,
        "end_line": 210,
        "sha256": "6c71722343fb285074d08ed781e70004f5c5802d0d1341ff8421975be612653d",
        "nature": "implementação observada"
      },
      "worker_collect": {
        "root": "project",
        "path": "services/source-runtime/docker_backend.py",
        "symbol": "Backend.collect",
        "start_line": 96,
        "end_line": 117,
        "sha256": "6c71722343fb285074d08ed781e70004f5c5802d0d1341ff8421975be612653d",
        "nature": "implementação observada"
      },
      "harmonize_latest": {
        "root": "pilot",
        "path": "pilot/oddalerts_feed.py",
        "symbol": "harmonize_latest",
        "start_line": 612,
        "end_line": 692,
        "sha256": "79b4e39d8c45322c0fa45c4ab0a5017fb92ac40f42143f974d36a75629bc1192",
        "nature": "implementação observada"
      },
      "load_rule_evidence": {
        "root": "pilot",
        "path": "pilot/oddalerts_feed.py",
        "symbol": "load_rule_evidence",
        "start_line": 424,
        "end_line": 534,
        "sha256": "79b4e39d8c45322c0fa45c4ab0a5017fb92ac40f42143f974d36a75629bc1192",
        "nature": "implementação observada"
      },
      "engine_harmonize": {
        "root": "engine",
        "path": "fable/core.py",
        "symbol": "Engine.harmonize",
        "start_line": 498,
        "end_line": 693,
        "sha256": "e75855de76ea82f228946c201309aec830bfd37a1ae1a70049aa17bf6ece7816",
        "nature": "implementação observada"
      },
      "goal_contract": {
        "root": "project",
        "path": "config/goal/principal-houses.json",
        "symbol": "acceptance / primary_houses",
        "start_line": 1,
        "end_line": 78,
        "sha256": "f7a376e62c2232b171602f58c67cd7fb1649d1e5ce3a196f0c2f0d21d6ee706a",
        "nature": "contrato/meta; não prova implementação"
      }
    }
  },
  "input_hashes": {
    "docs/progresso/plano_execucao.json": "ef91c566e0e27af79e91b1d1161a8c3b21487271815e92f7b4e885e9347cb611",
    "config/test/source-registry.json": "5b11547919d39759d8b8da27b95ad2b8166bb933cc61533b80b1783a75a6bd78",
    "docs/validation/linux_preflight_20260917.json": "fc183c7fc6c4765f9b8adda1d009b7e2bcc2c512ffbb8499f8159197e6109f2b",
    "docs/validation/test_final_state_20260917.json": "1833fe72c422e469014f5c9800853d9bca7905c5301c7c5f13d1e91b21ed6c2f",
    "config/goal/principal-houses.json": "f7a376e62c2232b171602f58c67cd7fb1649d1e5ce3a196f0c2f0d21d6ee706a",
    "docs/validation/source_probe_20260919.json": "dd31cc9c3e2dc227a3430f19ce35180652507b17029028aa8105d90ca4a13460",
    "docs/progresso/mapa_funcional.json": "2ac1886dc4b4ba70b541b04c1b00be031e16d9a1925d06ee5e0ffe37d84881c9",
    "docs/progresso/fontes_codigo.json": "153b87c75c895221c8cc0b26ea90cf96aead03aedc46acd32e7c1d72bc773460",
    "docs/progresso/monitor.py": "d94c324e3c04f4394a55bdb231214da8a7fca1187485264e41700c30995b8543",
    "docs/progresso/snapshots.json": "229757aec6b96bc555b20b11f2c5e4393513a9ca28d329035836b853d5acee45",
    "docs/progresso/pg_verification.json": "4029837908141639071a5809663fa62f355ab8e3e6480e8c3e3219f73d40a0e6",
    "docs/progresso/evidencias_retomada.md": "8ee802b5f9f9b56e3c0c6c8d8af9d1580249046201f2b5e012edb2707368924c",
    "docs/progresso/auditoria_coordenacao_20260919.json": "c9ea3ee37ac44e92febdec928e284adf8b92740a86c8b4d955c13ac8928b2d35"
  },
  "work": {
    "schema": "visao-work/1",
    "observed_at": "2026-09-20T03:49:06.930689+00:00",
    "current": [
      {
        "id": "capture",
        "title": "Captura de nove fontes",
        "executor": "Coletores automáticos na VPS · coordenação Hermes",
        "state": "executing",
        "basis": "service_observation",
        "observed_at": "2026-09-20T03:33:54.063410+00:00",
        "action": "Nove coletores estavam rodando na observação do coordenador. Guardam as respostas originais, sem padronização nesta campanha.",
        "limit": "É estado do serviço no horário citado, não presença de agente. Consulte a medição de captura abaixo. Não comprova ofertas na tela.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#capture"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "consumer",
        "title": "Recuperar o carregamento da tela de odds",
        "executor": "Hermes · frente de recuperação do consumidor",
        "state": "blocked",
        "basis": "receipt",
        "observed_at": "2026-09-20T03:49:06.930689+00:00",
        "action": "Executor encerrado; consumidor não recuperado. O candidato foi testado, mas não terminou a carga completa e não foi promovido.",
        "limit": "Temporários encerrados no recibo. O carregamento do acervo antigo excedeu o prazo; falta ensaio completo e leitura final dos dados antes de promover. Não há execução contínua desta frente após o handoff.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#consumer"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "visao",
        "title": "Completar a entrada Visão",
        "executor": "Hermes bconstruct · frente visual; coordenador promove",
        "state": "awaiting",
        "basis": "declared",
        "observed_at": "2026-09-19T23:42:00-03:00",
        "action": "Aplicar A-0296/A-0297 e entregar a correção para conferência e promoção. O portal já publicado não recebe esta revisão automaticamente.",
        "limit": "Declaração de trabalho solicitado; não afirma processo ativo agora. O recibo e a identificação do novo pacote determinam o aceite.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#visao"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "integration",
        "title": "Conferir a integração em Linux e banco real",
        "executor": "Hermes · ensaio Linux; coordenador conferiu o recibo",
        "state": "completed",
        "basis": "receipt",
        "observed_at": "2026-09-19T23:51:41.802833-03:00",
        "action": "154 testes aprovados, 0 não executados. Ensaio concluído em ambiente isolado.",
        "limit": "Inclui serviço antigo da imagem e pacote de integração corrigido. Não instala a nova versão permanente nem comprova recuperação operacional.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#integration"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "counterevidence",
        "title": "Testar correção de informação contraditória",
        "executor": "Hermes · correção OddsAlerts e ensaio de banco",
        "state": "completed",
        "basis": "receipt",
        "observed_at": "2026-09-20T00:06:27.990468-03:00",
        "action": "58 testes com PostgreSQL + 90 sem rede: 148 aprovados, 0 não executados.",
        "limit": "É o novo pacote de contraprova verificado em ambiente isolado. Não foi implantado nos serviços operacionais.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#counterevidence"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "atlas",
        "title": "Atlas, schema e dicionários",
        "executor": "Sessão 01a07952 · Atlas local",
        "state": "completed",
        "basis": "receipt",
        "observed_at": "2026-09-19T23:38:00-03:00",
        "action": "Atlas restaurado e validado na A-0293, preservando notas e referências existentes.",
        "limit": "Consulta ao catálogo não depende do carregamento de odds. Disponibilidade declarada na mensagem, não checagem atual do executor.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#atlas"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      }
    ],
    "previous": {
      "id": "portal",
      "title": "Portal Visão publicado e comentário preservado",
      "executor": "Hermes · coordenador da publicação",
      "state": "completed",
      "basis": "receipt",
      "observed_at": "2026-09-20T03:33:56.073Z",
      "action": "Entrada HTTPS, autenticação, comentários, assets e Archify verificados em desktop/celular; comentário preservado após reiniciar o aplicativo.",
      "limit": "É implantação do portal, não entrega de odds. A entrada publicada ainda não tinha todos os critérios A-0296; esta revisão aguarda promoção.",
      "references": [
        {
          "label": "Ver evidência datada",
          "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#portal"
        },
        {
          "label": "Acompanhar na PONTE",
          "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
        }
      ]
    },
    "next": {
      "id": "promotion",
      "title": "Promover esta entrada e conferir o fluxo de odds",
      "executor": "Coordenador Hermes",
      "state": "awaiting",
      "basis": "declared",
      "observed_at": "2026-09-20T03:33:56.073Z",
      "action": "Conferir o pacote visual, promover a entrada no portal existente e seguir as frentes de integração e consumidor sem parar a captura.",
      "limit": "Passo previsto, não iniciado por esta tela. Não instala outro produtor nem aguarda decisão genérica do dono.",
      "references": [
        {
          "label": "Ver evidência datada",
          "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#promotion"
        },
        {
          "label": "Acompanhar na PONTE",
          "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
        }
      ],
      "classification": "PREVISTO",
      "dependency": "Pacote visual com geração e QA aprovados; para odds na tela, implantação comprovada da integração e recibo da recuperação do consumidor."
    },
    "decision": null
  },
  "work_evidence": {
    "scope": "Projeção de recibos e declarações; não varredura de processos nem nova consulta à VPS.",
    "observed_at": "2026-09-20T03:49:06.930689+00:00",
    "records": [
      {
        "id": "capture",
        "title": "Captura de nove fontes",
        "executor": "Coletores automáticos na VPS · coordenação Hermes",
        "state": "executing",
        "basis": "service_observation",
        "observed_at": "2026-09-20T03:33:54.063410+00:00",
        "action": "Nove coletores estavam rodando na observação do coordenador. Guardam as respostas originais, sem padronização nesta campanha.",
        "limit": "É estado do serviço no horário citado, não presença de agente. Consulte a medição de captura abaixo. Não comprova ofertas na tela.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#capture"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "consumer",
        "title": "Recuperar o carregamento da tela de odds",
        "executor": "Hermes · frente de recuperação do consumidor",
        "state": "blocked",
        "basis": "receipt",
        "observed_at": "2026-09-20T03:49:06.930689+00:00",
        "action": "Executor encerrado; consumidor não recuperado. O candidato foi testado, mas não terminou a carga completa e não foi promovido.",
        "limit": "Temporários encerrados no recibo. O carregamento do acervo antigo excedeu o prazo; falta ensaio completo e leitura final dos dados antes de promover. Não há execução contínua desta frente após o handoff.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#consumer"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "visao",
        "title": "Completar a entrada Visão",
        "executor": "Hermes bconstruct · frente visual; coordenador promove",
        "state": "awaiting",
        "basis": "declared",
        "observed_at": "2026-09-19T23:42:00-03:00",
        "action": "Aplicar A-0296/A-0297 e entregar a correção para conferência e promoção. O portal já publicado não recebe esta revisão automaticamente.",
        "limit": "Declaração de trabalho solicitado; não afirma processo ativo agora. O recibo e a identificação do novo pacote determinam o aceite.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#visao"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "integration",
        "title": "Conferir a integração em Linux e banco real",
        "executor": "Hermes · ensaio Linux; coordenador conferiu o recibo",
        "state": "completed",
        "basis": "receipt",
        "observed_at": "2026-09-19T23:51:41.802833-03:00",
        "action": "154 testes aprovados, 0 não executados. Ensaio concluído em ambiente isolado.",
        "limit": "Inclui serviço antigo da imagem e pacote de integração corrigido. Não instala a nova versão permanente nem comprova recuperação operacional.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#integration"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "counterevidence",
        "title": "Testar correção de informação contraditória",
        "executor": "Hermes · correção OddsAlerts e ensaio de banco",
        "state": "completed",
        "basis": "receipt",
        "observed_at": "2026-09-20T00:06:27.990468-03:00",
        "action": "58 testes com PostgreSQL + 90 sem rede: 148 aprovados, 0 não executados.",
        "limit": "É o novo pacote de contraprova verificado em ambiente isolado. Não foi implantado nos serviços operacionais.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#counterevidence"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "atlas",
        "title": "Atlas, schema e dicionários",
        "executor": "Sessão 01a07952 · Atlas local",
        "state": "completed",
        "basis": "receipt",
        "observed_at": "2026-09-19T23:38:00-03:00",
        "action": "Atlas restaurado e validado na A-0293, preservando notas e referências existentes.",
        "limit": "Consulta ao catálogo não depende do carregamento de odds. Disponibilidade declarada na mensagem, não checagem atual do executor.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#atlas"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "portal",
        "title": "Portal Visão publicado e comentário preservado",
        "executor": "Hermes · coordenador da publicação",
        "state": "completed",
        "basis": "receipt",
        "observed_at": "2026-09-20T03:33:56.073Z",
        "action": "Entrada HTTPS, autenticação, comentários, assets e Archify verificados em desktop/celular; comentário preservado após reiniciar o aplicativo.",
        "limit": "É implantação do portal, não entrega de odds. A entrada publicada ainda não tinha todos os critérios A-0296; esta revisão aguarda promoção.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#portal"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ]
      },
      {
        "id": "promotion",
        "title": "Promover esta entrada e conferir o fluxo de odds",
        "executor": "Coordenador Hermes",
        "state": "awaiting",
        "basis": "declared",
        "observed_at": "2026-09-20T03:33:56.073Z",
        "action": "Conferir o pacote visual, promover a entrada no portal existente e seguir as frentes de integração e consumidor sem parar a captura.",
        "limit": "Passo previsto, não iniciado por esta tela. Não instala outro produtor nem aguarda decisão genérica do dono.",
        "references": [
          {
            "label": "Ver evidência datada",
            "url": "https://visao.oddsbet.tech/progresso/work_evidence.json#promotion"
          },
          {
            "label": "Acompanhar na PONTE",
            "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/"
          }
        ],
        "classification": "PREVISTO",
        "dependency": "Pacote visual com geração e QA aprovados; para odds na tela, implantação comprovada da integração e recibo da recuperação do consumidor."
      }
    ],
    "sources": [
      {
        "receipt": "FRENTES.json",
        "sha256": "d918449322e536dcd4c1bca459aceb436adc2d52059e80bcba9d3d4d794c27ca"
      },
      {
        "receipt": "linux_pg/RESULTADO.json",
        "sha256": "213f42ca8985bfb8245f195486a2b259a8c6ad404c699bdd3542b16ae378fa55"
      },
      {
        "receipt": "linux_pg/COORD_VERIFICACAO.json",
        "sha256": "00fb00374128b85737e294237c8dc904f462aa3957aa94f102c0b3389ca291fa"
      },
      {
        "receipt": "linux_pg/counterevidence/RESULTADO.json",
        "sha256": "f01d5cca8b25b44e9af71ba894d39bcad728045efd747c4f6dd3592a556cb740"
      },
      {
        "receipt": "linux_pg/counterevidence/COORD_VERIFICACAO.json",
        "sha256": "ebccab3a311e86e96d82a6fe1c8366df424c0b7187f0c91eca50db290cd39ae1"
      },
      {
        "receipt": "portal_vps/qa-live/receipt.json",
        "sha256": "19e8220c774eaa37f5831ef679a9f341ccd5fe64b65abc75cf273abfcd81e4a4"
      },
      {
        "receipt": "portal_vps/qa-live/after-restart.json",
        "sha256": "fabbd99d66e2585de924b6cce870c62cd2acf6ac3606aae15bb53877201bfb0e"
      },
      {
        "receipt": "consumer_recovery/ENTREGA.md",
        "sha256": "ecb5d0dde27c3fce7176b38c425e8043c919646a141c49dcc4e922801430e4e8"
      }
    ],
    "portal": {
      "url": "https://visao.oddsbet.tech",
      "observed_at": "2026-09-20T03:26:57.975Z",
      "restart_verified_at": "2026-09-20T03:33:56.073Z",
      "running_count": 9,
      "baseline_unchanged": true
    },
    "integration": {
      "observed_at": "2026-09-19T23:51:41.802833-03:00",
      "passed": 154,
      "skipped": 0,
      "operational_deploy": false
    },
    "counterevidence": {
      "observed_at": "2026-09-20T00:06:27.990468-03:00",
      "passed": 148,
      "pg_cases": 58,
      "offline_cases": 90,
      "skipped": 0,
      "operational_deploy": false
    },
    "fronts_declared_at": "2026-09-20T01:04:10.745629-03:00",
    "consumer": {
      "observed_at": "2026-09-20T03:49:06.930689+00:00",
      "recovered": false,
      "executor_finished": true,
      "candidate_promoted": false
    }
  },
  "visao_links": {
    "ponte": "https://membership-supposed-demanding-avoiding.trycloudflare.com/ponte/",
    "atlas": "https://priority-college-gentleman-forms.trycloudflare.com/mapa-mercados/",
    "shortcuts": [
      {
        "id": "atlas",
        "label": "Atlas de mercados",
        "url": "https://priority-college-gentleman-forms.trycloudflare.com/mapa-mercados/",
        "description": "Mapa atual e notas já existentes; acesso privado do Atlas preservado."
      },
      {
        "id": "schema",
        "label": "Schema",
        "url": "https://membership-supposed-demanding-avoiding.trycloudflare.com/documentos/schema-global/",
        "description": "Catálogo de códigos consolidado; documento preservado com data própria."
      },
      {
        "id": "dictionaries",
        "label": "Dicionários",
        "url": "https://priority-college-gentleman-forms.trycloudflare.com/mapa-mercados/",
        "description": "Leitura no Atlas existente, independente do provedor de odds."
      },
      {
        "id": "harmonization",
        "label": "Harmonização",
        "view": "system",
        "description": "Como os códigos de cada fonte são traduzidos, sem unir pelo nome ou preço."
      },
      {
        "id": "capture",
        "label": "Captura e operação",
        "anchor": "raw-title",
        "description": "Estado dos coletores, última captura informada e limites dos números."
      },
      {
        "id": "architecture",
        "label": "Arquitetura",
        "url": "../archify/",
        "description": "Funções, entradas, saídas e o que falta ligar."
      },
      {
        "id": "audits",
        "label": "Auditorias e evidências",
        "view": "evidence",
        "description": "Recibos datados e o limite do que cada um comprova."
      }
    ]
  }
}
