Skip to content

fix(camara-crawler): filtrar por dataApresentacao em vez de dataInicio/Fim#90

Merged
luizvi merged 1 commit into
mainfrom
fix/camara-crawler-data-apresentacao
Jun 4, 2026
Merged

fix(camara-crawler): filtrar por dataApresentacao em vez de dataInicio/Fim#90
luizvi merged 1 commit into
mainfrom
fix/camara-crawler-data-apresentacao

Conversation

@luizvi

@luizvi luizvi commented Jun 2, 2026

Copy link
Copy Markdown
Collaborator

Problema

A API da Câmara dos Deputados aceita dois conjuntos distintos de filtros temporais:

  • dataInicio / dataFimdata de TRAMITAÇÃO (proposições com QUALQUER evento no range, independente de quando foram apresentadas)
  • dataApresentacaoInicio / dataApresentacaoFimdata de APRESENTAÇÃO da proposição

O 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:

chamada itens tempo
atual dataInicio/Fim ~3.800 504 timeout
ano + dataApresentacaoInicio/Fim 720 OK
dataApresentacaoInicio/Fim 1.820 (sem ano= vaza outros anos)

Efeitos visíveis em prod:

  • Cobertura Câmara 2024 caiu pra 61,7% mesmo com todas as semanas processadas — proposições apresentadas em 2024 cujo único evento naquela semana foi em outro ano "sumiam"
  • Chunks 2025 muito densos (~78k props/ano) com volume 5x inflado → cron-50 não cabe em 1h, backfill propositions ficou a 1.2 chunks/h em vez dos 50/h esperados
  • Cobertura 2018-2023 patinando (4-19%)

Solução

_iter_propositions_paginated agora envia ano=year_start + dataApresentacaoInicio/Fim. O ano= é 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:

  • Params corretos chegam à API quando data_inicio + data_fim passados
  • dataApresentacaoFim omitido quando data_fim ausente
  • Default cai no 1º de janeiro do year_start quando sem data_inicio e sem session
  • _fetch_propositions_list removido (regressão estrutural)

pytest mamute_scrappers/tests/ api/tests/ -v → 30 passed.

Impacto operacional pós-deploy

chunks status
388 pendentes começam com nova semântica → cobertura completa, 5x mais rápido
484 já-done (Câmara) ficam com cobertura defeituosa de propostas apresentadas em outra semana que tramitaram na semana coberta
59 já-done (Senado) intactos — Senado usa outro endpoint

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

  • Após merge: confirmar próximo chunk Câmara processado em prod usa params novos (docker logs scrappers | grep dataApresentacaoInicio)
  • Após algumas horas: re-medir tempo médio por chunk (esperado ~5x mais rápido)
  • Após backfill descer 2018-2021: medir cobertura por ano vs API oficial filtrando pelos mesmos siglaTipo
  • Verificar que proposition --year 2026 (incremental) continua trazendo proposições novas no cron horário

🤖 Generated with Claude Code

…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>
@luizvi luizvi merged commit caf283e into main Jun 4, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant