feat(sprint4): entrega final — UI + LLM integrado + pipeline configurável (≥80% cobertura)#87
Merged
Conversation
…rador
- make_cache_key(*args) usa separador \x00 para evitar colisao entre
argumentos que contenham o separador (ex: ("a:b","c") != ("a","b:c"))
- encoding utf-8 explicito no hashlib.sha256
- 5 testes: determinismo, unicidade, tipo, ordem e ausencia de colisao
- corrige .gitignore: cache/ -> /cache/ para nao ignorar src/pr_analyzer/cache/
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- cached_classify(classifier_fn, cache_size, cache_path) envolve qualquer classificador evitando chamadas repetidas para o mesmo input - LRU manual via OrderedDict com limite de cache_size entradas - persistencia opcional em JSON (cache_path) carregada na inicializacao - 4 testes: resultado correto, chamada unica, inputs distintos, persistencia entre instancias (simula reinicio do processo) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- compose(), pipe() e build_pipeline() com assinaturas e tipos completos - implementacao como NotImplementedError (sera feita na sprint 2) - 6 testes verificando importabilidade e contrato de interface - remove move_to_end redundante do cached_classify (refactor TASK-11) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ponents and utils
… Claudinho - Hook conventional-pre-commit no stage commit-msg bloqueia mensagens fora do padrao - make setup agora instala os 3 tipos de hook (pre-commit, pre-push, commit-msg) - CLAUDE.md documentado com tabela de tipos, exemplos validos e invalidos - scripts/claudinho.py: gerador de informes engracados via Claude API para o grupo Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… tooling) na develop
/claudinho <texto> — informe rapido no estilo Claudinho /diario — relatorio da sprint com contexto real do repo (sem API key separada) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
compose(*fns)(x) aplica fns da esquerda para direita via reduce. pipe(value, *fns) equivalente com valor inicial explícito. Ambos suportam zero argumentos (identidade / valor direto). 11 testes cobrindo 1, 2 e 3 funções, consistência entre si e edge cases. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…() e map() Pipeline genérico: aplica filters (reduce+filter) e mappers (reduce+map) sobre qualquer Iterable de forma lazy — nunca materializa a fonte. Testes com mocks de lambda independentes de PRRecord e dev2/transforms. Mocks serão substituídos por integrações reais no merge da Sprint 3. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- pyproject.toml: adiciona E731 e T20 ao per-file-ignores de tests/ e scripts/ - builder.py: adiciona type params completos (Callable[..., Any], Iterable[Any]) - test_builder.py: remove anotacoes callable invalidas, corrige isinstance com | - check_paradigm.py: SIM102/UP038 corrigidos, noqa T201, encoding via -X utf8 - .pre-commit-config.yaml: entry com python -X utf8 para suporte UTF-8 no Windows Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
chore(pedro): sincroniza develop após sprint 3
chore(diogo): sincroniza develop após sprint 3
- sprint 3 marcada como concluída; sprint 4 em andamento - nomes reais das branches (bernardo, pedro, dev/dev3, frederico-barcelos, diogo) - seção de hierarquia de importações com regra sobre EnrichedPR - aliases em inglês em classifiers.py documentados - BP005 se aplica a ui/ também (com exemplo) - st.cache_data requer type: ignore[misc] - verificação pós-merge e erros comuns de integração - cronograma com status de cada fase Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…is de ambiente (ISSUE-46) Lê FILTER_STATE, MIN_CHANGES e ENABLE_LLM do ambiente para compor filtros e mappers dinamicamente via build_pipeline. Testes com monkeypatch. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…amento - fix: client=None substituído por create_llm_client() usando backend/modelo da session_state — Ollama e Groq agora são chamados de verdade - fix: guarda llm_enriched para não re-enriquecer a cada render do Streamlit - feat: st.status() com barra de progresso durante classificação dos PRs - fix: reseta llm_enriched ao carregar novo dataset (upload, local, remover) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Extrai JSON de markdown code blocks que Llama3/Ollama gera frequentemente - Muda avaliar_clareza_descricao para usar JSON em vez de plain text, resolvendo 'sempre o mesmo resultado' causado por frozenset não-determinístico e ausência de traduções inglês→português - Adiciona mapeamento EN→PT como fallback para modelos que respondem em inglês - Atualiza testes para refletir novo formato JSON da clareza Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…se CSV - _maybe_enrich: mostra aviso explícito quando LLM toggle está ativo mas raw_prs é None (demo/archive/CSV incompatível) — usuário sabia que LLM estava ativo mas não percebia que os dados simulados continuavam sendo usados - parse_csv_bytes: usa detect_schema + schema_adapter antes de apply_schema, resolvendo body sempre vazio em CSVs no formato github_export (description→body) - _load_local: passa CSVs locais pelo load_uploaded para popular raw_prs, habilitando enriquecimento LLM também em datasets locais compatíveis Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… reducers Implementa testes matemáticos respeitando as regras puramente funcionais, garantindo idempotência de filtros e soma consistente para as linguagens.
… (frederico-barcelos) feat(sprint4): pipeline_from_env, LLM real conectado e fixes de parsing
test(io): cobertura de edge cases e fluxo pipeline-exportação (Sprint 4)
test(transforms): testes de propriedade Hypothesis e cobertura 100% nos filtros (Sprint 4)
- pipeline_bridge.py: mescla imports — detect_schema/schema_adapter (dev4) com backend_enrich_prs/LLMClient (dev5); descarta cached_classify e classifiers individuais que não eram usados no corpo do arquivo - app.py: usa fluxo dev4 para _maybe_enrich (create_llm_client explícito, warning quando raw_prs=None, st.status com progress bar) adaptado à API do dev5 — enrich_prs(prs, client=client) sem parâmetro cache counter - sidebar.py: combina reset llm_enriched=False do dev4 com except Exception mais amplo e mensagem de erro com filename do dev5 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(ui): cache de enriquecimento, suporte mined-comments e validações de upload (Sprint 4)
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.
Resumo
Entrega da Sprint 4 (UI + Integração) com cobertura 96%, fechando a Issue #50.
Sprint 4 — o que entrou
dev4 / frederico-barcelos (pipeline + llm + ui):
pipeline_from_env: pipeline configurável viaFILTER_STATE,MIN_CHANGES,ENABLE_LLMcreate_llm_client()substituiclient=None, barra de progressost.status()dev1 / bernardo (io):
dev2 / pedro (transforms):
transforms/filters.pydev5 / diogo (ui):
Métricas finais
cache/memo.pyio/csv_reader.pyio/exporters.pyllm/classifiers.pypipeline/builder.pytransforms/filters.pytransforms/mappers.pytransforms/reducers.pyPlano de teste
make docker-test— 123 testes passando, 96% de coberturasrc/main)Closes #50
🤖 Generated with Claude Code