-
Notifications
You must be signed in to change notification settings - Fork 1
Pendencias e Roadmap
Este backlog concentra os itens que ainda precisam virar issues no GitHub.
| Pendencia | Resumo |
|---|---|
| Configurar envio diario de relatorio por email | Evitar envio repetido quando o workflow roda mais de uma vez por dia. |
| Criterios finais de qualidade da rodada | Transformar os sinais ja registrados pelo workflow em uma regra objetiva de aceite. |
| Definir resposta para fontes instaveis | Decidir quando timeouts recorrentes exigem retries, backoff ou coleta separada. |
| Desempenho do processamento de raws | Medir e reduzir o custo do processamento, principalmente na extracao de PDFs e nas fontes mais lentas. |
| Avaliar otimizacao dos PDFs brutos | Testar melhor a reducao de tamanho com qpdf antes de usar no backup oficial. |
| Avaliar pipeline produtor-consumidor por raw | Considerar uma fila real entre download e persistencia se o processamento virar gargalo. |
| Retomar Supabase no futuro | Pausar a sincronizacao enquanto o tamanho do banco excede a capacidade esperada do Supabase. |
| Aprimorar sincronizacao incremental com Supabase | Atualizar no Supabase registros antigos que foram corrigidos no banco local. |
| Duplicacao de registros e inchaco do SQLite | Resolver bug que insere cotações duplicadas e causa inchaço do banco devido a chaves dinâmicas. |
O envio por e-mail ja foi parcialmente implementado no workflow por meio da
action .github/actions/send-report-email, usando secrets SMTP e a variavel
COTACOES_SEND_REPORT_EMAIL.
O workflow roda quatro vezes por dia (03:00, 09:00, 15:00 e 21:00 UTC).
A pendencia principal e evitar um e-mail por rodada quando o objetivo for
receber apenas um resumo diario.
Decisao atual:
- manter o envio opcional e desativavel por configuracao;
- nao bloquear a coleta por falta de provedor SMTP;
- escolher se o envio diario sera controlado por uma janela fixa ou por um marcador salvo na release;
- retomar a pesquisa de servidor SMTP gratuito/confiavel somente depois de definir essa regra diaria.
Foram implementadas melhorias importantes: o workflow registra download concluido, parcial ou falho por fonte, separa o status da persistencia, contabiliza falhas parciais e tenta salvar os artefatos antes da validacao final. Ainda falta transformar esses sinais em uma regra objetiva de aceite do pacote publicado.
Comportamento esperado:
- definir limites minimos por fonte, volume ou perda aceitavel;
- classificar a rodada como valida, parcial aproveitavel ou invalida no relatorio final;
- deixar claro quando o pacote publicado nao deve substituir uma rodada boa;
- manter os artefatos salvos para depuracao mesmo quando a rodada for invalida.
A analise dos relatorios recentes nao indicou bloqueio explicito por 403,
429, HttpSourceBlocked, Forbidden ou Too Many Requests. Os problemas
observados ficaram mais associados a timeout, fonte instavel, limite de busca
historica e PDFs ausentes/malformados.
Pontos a investigar com mais cuidado:
- A persistencia da CEASA-PR por
Cotacao sem datafoi tratada nos ajustes pos-analise locais da entrega final; agora o ponto restante e acompanhar se novas rodadas confirmam a estabilidade da correcao. - CEASA-PR ainda pode ter PDFs ausentes em algumas datas. PDFs malformados
passaram a ter fallback com
pdftotext, mas vale acompanhar se novas rodadas ainda registram falhas reais de extracao. - CEASA-Campinas e CEASA-RJ aparecem com timeouts frequentes e, quando o
download falha, a persistencia fica como
persistencia ignorada porque o download falhou. - CEASA-GO e CEASA-CE tambem apresentam timeouts, mas com frequencia menor que Campinas e RJ nas coletas recentes.
- CEASA-BA e CEAGESP-SP foram tratadas como fontes de historico limitado; agora a pendencia e acompanhar se os limites reduzem avisos sem perder dado relevante.
- A publicacao do pacote deve considerar essas falhas parciais para evitar substituir um pacote bom por uma rodada com perda relevante de fontes.
Acoes futuras:
- acompanhar as proximas rodadas para confirmar que a CEASA-PR nao volta a
falhar por
Cotacao sem data; - separar falha de download, falha de parser e falha de persistencia no resumo para deixar o impacto por fonte mais claro;
- manter CEASA-Campinas e CEASA-RJ sob observacao; retries/backoff ou coleta separada ficam como alternativa futura se os timeouts continuarem relevantes;
- acompanhar fontes com historico limitado, como BA e CEAGESP-SP, para ajustar os limites se necessario;
- acompanhar nos proximos relatorios se surgem sinais reais de bloqueio HTTP
(
403,429ouRetry-After).
Melhorar o desempenho do processamento de raws, principalmente nas fontes com grande volume de arquivos e nos parsers de PDF.
O relatorio data/relatorios/persistencia_20260610_204715_856649.md mostrou:
- duracao total de
1h53min54s; - processamento dos raws:
1h30min34s, aproximadamente79,5%do total; - persistencia no SQLite:
19min07s, aproximadamente16,8%do total; - complemento PROHORT:
3min35s, aproximadamente3,1%do total; - CEASA-PR, CEASA-PE e CEASA-ES concentraram aproximadamente
85%da execucao; - a CEASA-PR consumiu aproximadamente
50min12s, principalmente durante o processamento de618PDFs.
Medicoes necessarias:
- comparar por rodada
COTACOES_WORKERS, tempo total do pipeline, janela de downloads, tempo acumulado de persistencia, espera na fila e backlog maximo; - medir listagem e leitura dos arquivos;
- medir extracao de texto dos PDFs;
- medir parser especifico de cada fonte;
- medir normalizacao e criacao das cotacoes;
- medir persistencia no SQLite.
Melhorias a avaliar:
- acompanhar as metricas de tempo por etapa nos relatorios;
- comparar duracao, volume baixado e
COTACOES_WORKERSpara confirmar o ganho real do paralelismo entre fontes; - acompanhar o ganho do salto de raws ja processados sem alteracao;
- acompanhar o ganho do cache de texto extraido de PDFs;
- processar raws independentes em paralelo com limite configuravel;
- reduzir trabalho repetido dentro dos parsers;
- priorizar a investigacao dos PDFs da CEASA-PR.
Qualquer otimizacao deve preservar os resultados atuais dos parsers, a proveniencia dos registros e a capacidade de reconstruir o banco a partir dos raws.
Foram feitos testes locais usando qpdf para reduzir o tamanho dos PDFs brutos
sem alterar o conteudo aparente dos arquivos. A ideia pode ajudar a diminuir o
tamanho do backup completo, principalmente no OneDrive, mas ainda nao deve entrar
no fluxo oficial.
Motivo da cautela:
- alguns PDFs das fontes ja chegam danificados ou fora do padrao esperado;
- o
qpdfconsegue emitir avisos e reconstruir parcialmente alguns arquivos, mas isso precisa ser avaliado com cuidado; - ainda falta confirmar que o PDF otimizado nao interfere na extracao de texto, na interpretacao dos parsers e na persistencia correta no SQLite;
- qualquer ganho de espaco nao pode comprometer a capacidade de reconstruir o banco a partir dos raws.
Decisao atual:
- manter o otimizador de PDF apenas como experimento local;
- nao incluir a otimizacao de PDFs no workflow oficial por enquanto;
- continuar preservando os raws originais no backup completo;
- usar
xzno empacotamento oficial, porque ja reduz o tamanho do backup sem mexer no conteudo interno dos PDFs.
Antes de considerar essa otimizacao como parte do produto, validar pelo menos:
- tamanho antes/depois por fonte;
- quantidade de PDFs com aviso ou erro do
qpdf; - comparacao da extracao de texto antes/depois;
- comparacao das cotacoes persistidas antes/depois;
- impacto no tempo total do workflow.
O fluxo atual ja sobrepoe download e persistencia entre fontes quando
COTACOES_WORKERS e maior que 1: os downloads rodam em paralelo e a
persistencia sequencial consome os resultados conforme cada fonte termina.
Ainda assim, o processamento so comeca depois que a fonte conclui o download
completo ou parcial.
A melhoria futura seria trocar esse modelo por uma fila produtor-consumidor por raw: cada arquivo baixado entraria em uma fila, enquanto um consumidor de persistencia processaria os raws continuamente sem interromper a raspagem.
No estado atual, os relatorios recentes indicam que o gargalo principal ainda e o download. A persistencia acumulada ficou baixa em comparacao com a janela de downloads, entao a mudanca nao parece prioritaria para ganho de tempo agora.
Avaliar essa implementacao somente se os relatorios mostrarem:
- aumento relevante do tempo acumulado de persistencia;
- crescimento do backlog ou da espera na fila;
- processamento de raws virando gargalo em relacao aos downloads;
- necessidade operacional de isolar melhor download e persistencia.
Cuidados antes de implementar:
- garantir que arquivos ainda em escrita nao sejam processados;
- preservar o tratamento de downloads parciais por fonte;
- manter a persistencia SQLite sem escrita concorrente perigosa;
- registrar metricas separadas de fila, processamento e salvamento;
- manter a capacidade de reconstruir o banco a partir dos raws.
A integracao com Supabase existe, mas fica fora do escopo operacional por enquanto. O banco SQLite ficou grande demais para a capacidade esperada do plano avaliado, entao manter a sincronizacao remota ativa agora tende a trazer mais custo e instabilidade do que beneficio.
Decisao atual:
- manter o SQLite publicado como artefato principal;
- nao investir agora em correcoes incrementais do Supabase;
- retomar essa frente somente se houver plano/infra compatível com o tamanho da base ou necessidade real de API remota;
- se a frente voltar, reavaliar tambem atualizacao de registros antigos ja enviados, nao apenas insercao de novos registros.
Atualmente, a sincronizacao incremental envia registros novos e atualiza as tabelas pequenas de referencia. Porem, ela nao detecta correcoes feitas em coletas ou cotacoes que ja haviam sido enviadas ao Supabase.
Exemplo: se o preco de uma cotacao antiga for corrigido no SQLite local, a sincronizacao incremental nao atualiza essa cotacao no Supabase. Atualmente, e necessario executar a substituicao completa para enviar a correcao.
A sincronizacao incremental deve identificar e atualizar esses registros antigos sem precisar substituir todo o banco remoto.
O banco de dados SQLite cresce indevidamente (~1.03 GB) devido a falhas na constraint de unicidade (ON CONFLICT (chave_unica) DO NOTHING).
- A
chave_unicadecotacoesbaseia-se nacoleta_key. - A
coleta_keyusa a colunaarquivo_raw(que inclui a data/hora do download no nome do arquivo físico). - Downloads repetidos do mesmo arquivo histórico criam novas chaves únicas, inserindo cópias idênticas.
- Desvincular a
chave_unicade dados físicos/timestamps de download (usar dados lógicos da cotação: data_cotacao, produto, categoria, preços, etc.). - Limpar os registros duplicados existentes no banco SQLite.
Documentacao operacional do cotacoes-ceasa-scraper.