fix(camara-crawler): filtrar por dataApresentacao em vez de dataInicio/Fim#90
Merged
Merged
Conversation
…o/Fim A API da Câmara aceita dois conjuntos distintos de filtros temporais: - `dataInicio` / `dataFim`: data de TRAMITAÇÃO (qualquer evento no range) - `dataApresentacaoInicio/Fim`: data de APRESENTAÇÃO da proposição O crawler usava o primeiro, então chunks semanais do backfill capturavam proposições que apenas TRAMITARAM naquela semana — sem importar quando foram apresentadas. Resultado: ~3.800 itens por semana, espalhados por muitos anos, em vez dos ~720 efetivamente apresentados. Efeitos visíveis em prod: - Cobertura 2024 caía pra 61,7% mesmo com TODAS as semanas processadas - Tempo por chunk explodia (5x mais volume) → backfill demora dias - Cron horário não cabe em 1h por causa de chunks 2025 densos Mudanças: - `_iter_propositions_paginated`: sempre passa `ano=year_start` e usa `dataApresentacaoInicio/Fim` (`ano=` é blindagem contra respostas que ignoram o filtro de data em alguns tipos de proposição) - Remove `_fetch_propositions_list` — dead code, ninguém chamava - Atualiza docstring e help text dos flags CLI pra refletir semântica - Testes garantem (1) que os params certos chegam à API, (2) que a função morta não volta, (3) que `data_fim` é omitido quando não fornecido, (4) que sem `data_inicio` cai no 1º de janeiro do ano Validado contra API ao vivo: - antigo (dataInicio/Fim semana 03–09/06/2024): 504 timeout (era 3.800) - novo (ano + dataApresentacao*): 720 itens exatos Impacto operacional: - Chunks pendentes (388) começam com a nova semântica imediatamente - Chunks já-done (484) ficam com cobertura defeituosa de propostas apresentadas em outra semana que tramitaram na semana coberta - Decisão: não invalidar `done` — PR menor, trade-off aceito; reset pode vir em PR posterior se necessário Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problema
A API da Câmara dos Deputados aceita dois conjuntos distintos de filtros temporais:
dataInicio/dataFim→ data de TRAMITAÇÃO (proposições com QUALQUER evento no range, independente de quando foram apresentadas)dataApresentacaoInicio/dataApresentacaoFim→ data de APRESENTAÇÃO da proposiçãoO crawler usava o primeiro. Resultado: chunks semanais do backfill capturavam proposições que apenas tramitaram naquela semana, espalhadas por muitos anos, em vez das apresentadas no intervalo.
Impacto medido
Para a semana 03–09/06/2024:
dataInicio/Fimano + dataApresentacaoInicio/FimdataApresentacaoInicio/Fimano=vaza outros anos)Efeitos visíveis em prod:
Solução
_iter_propositions_paginatedagora enviaano=year_start+dataApresentacaoInicio/Fim. Oano=é redundante quando o intervalo está estritamente dentro de um ano, mas funciona como blindagem contra respostas que ignoram o filtro de data em certos tipos de proposição.Também removo
_fetch_propositions_list— dead code (nunca chamado).Testes
mamute_scrappers/tests/test_camara_proposition_query_params.py:data_inicio+data_fimpassadosdataApresentacaoFimomitido quandodata_fimausenteyear_startquando semdata_inicioe sem session_fetch_propositions_listremovido (regressão estrutural)pytest mamute_scrappers/tests/ api/tests/ -v→ 30 passed.Impacto operacional pós-deploy
Decisão alinhada com @luizvi: não invalidar
done. PR menor, trade-off aceito. Reset pode vir em PR separado se a cobertura final ficar insatisfatória.Cron incremental (
--year \$(date +%Y)) também herda a nova semântica naturalmente, sem mudança no crontab.Test plan
docker logs scrappers | grep dataApresentacaoInicio)siglaTipoproposition --year 2026(incremental) continua trazendo proposições novas no cron horário🤖 Generated with Claude Code