Skip to content

[POC] Estudo e Validação do PR-Agent #899 - #904

Open
AlisonAndrade123 wants to merge 12 commits into
devfrom
feature/899-estudo-pr-agent
Open

AlisonAndrade123 wants to merge 12 commits into
devfrom
feature/899-estudo-pr-agent

Conversation

@AlisonAndrade123

@AlisonAndrade123 AlisonAndrade123 commented Aug 26, 2026

Copy link
Copy Markdown
Collaborator

O que foi feito

  • Criado o documento de estudo e estratégia do PR-Agent em docs/pr-agent-strategy.md cobrindo arquitetura, escopo, segurança e configuração.
  • Mapeado o escopo técnico do monorepo (Java 21 / Spring Boot 3.5.6 em /apps/api e TypeScript / Next.js 16 em /apps/apae).
  • Validação prática da POC com o modelo gratuito Google Gemini 3.6 Flash via Google AI Studio.
  • Comprovada a detecção de bugs reais em Java (tratamento de null e validação de limites numéricos) e estimativa de esforço de revisão.
  • Documentada a restrição de segurança do GitHub onde comandos manuais via comentário (issue_comment) requerem o workflow na branch padrão dev.

Issue relacionada

Closes #899

Checklist

  • Documento docs/pr-agent-strategy.md criado e documentado
  • POC executada com sucesso com análise de código e labels
  • Requisitos de segurança, secrets e modelos avaliados
  • Nenhuma configuração definitiva mergeada na branch base

Evidências

  • As evidências da execução da POC (análise de compliance, sugestões de código em Java e label de esforço) estão registradas nos comentários automáticos deste Pull Request.

Adiciona POC do PR-Agent para revisão automatizada de Pull Requests:
- Workflow GitHub Actions (.github/workflows/pr-agent-poc.yml)
- Arquivo de configuração (.pr_agent.toml)
- Documento de estratégia (docs/pr-agent-strategy.md)

🤖 Generated with Codebuff
Co-Authored-By: Codebuff <noreply@codebuff.com>
@AlisonAndrade123 AlisonAndrade123 self-assigned this Aug 26, 2026
@AlisonAndrade123 AlisonAndrade123 added QA Lista de tarefas para análise de qualidade poc Para elaboração de POCs para avaliação de ferramentas 5 Complexidade 5 labels Aug 26, 2026
@coderabbitai

coderabbitai Bot commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 009b876d-46aa-4105-8e7b-5dd72800a0fb

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown

PR Reviewer Guide 🔍

(Review updated until commit f395b95)

Here are some key observations to aid the review process:

🎫 Ticket compliance analysis ✅

899 - PR Code Verified

Compliant requirements:

  • Criar o documento docs/pr-agent-strategy.md avaliando o PR-Agent para o repositório.
  • Mapear o escopo de revisão recomendado para os ecossistemas do monorepo (Java no backend e TypeScript no frontend).
  • Definir critérios de avaliação da qualidade das revisões.
  • Definir estratégia para evitar ruído e volume excessivo de comentários.
  • Documentar o modelo utilizado na POC e os critérios para sua escolha.
  • Documentar requisitos de segurança, permissões do GitHub e secrets.
  • Incluir rascunho de configuração comentado dentro da documentação.
  • Executar a POC do PR-Agent em Pull Requests representativos e registrar os resultados no documento.

Requires further human verification:

  • Verificar com o time se os arquivos de configuração experimental .github/workflows/pr-agent-poc.yml e .pr_agent.toml devem ser removidos antes do merge ou se permanecem temporariamente para validação da POC.
  • Validação e aprovação formal do documento pelo Quality Owner.
⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ No major issues detected

@github-actions

github-actions Bot commented Aug 26, 2026

Copy link
Copy Markdown

PR Code Suggestions ✨

Latest suggestions up to f395b95

Explore these optional code suggestions:

CategorySuggestion                                                                                                                                    Impact
Possible issue
Corrigir comparação de texto

A comparação de textos usando o operador == verifica se as referências de memória
são idênticas, e não o seu valor contido. Para evitar falhas de lógica e
NullPointerException, utilize "CONFIRMADO".equals(existente.status).

apps/api/src/test/java/br/org/apae/api/AgendamentoServicePocTest.java [39]

-                    && existente.status == "CONFIRMADO") { // Bug: Uso de == para String
+                    && "CONFIRMADO".equals(existente.status)) {
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies that comparing String objects with == checks reference equality instead of value equality, and provides the correct standard fix using "CONFIRMADO".equals(existente.status).

Medium
Evitar exceção de ponteiro nulo

A Invocação do método trim() em motivo lança NullPointerException caso o parâmetro
recebido seja nulo. Recomenda-se realizar uma verificação defensiva prévia antes de
manipular a String.

apps/api/src/test/java/br/org/apae/api/AgendamentoServicePocTest.java [53-57]

     public boolean cancelarAgendamento(Long agendamentoId, String motivo) {
-        // Bug Proposital 4: Concatenação sem validação de motivo (pode ser nulo)
-        System.out.println("Cancelando agendamento " + agendamentoId + " Motivo: " + motivo.trim());
+        String motivoTratado = (motivo != null) ? motivo.trim() : "Sem motivo informado";
+        System.out.println("Cancelando agendamento " + agendamentoId + " Motivo: " + motivoTratado);
         return true;
     }
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a potential NullPointerException when calling .trim() on a null motivo string and proposes a clean defensive fix.

Medium
Validar objeto de entrada nulo

A propriedade dto.data é acessada diretamente sem verificar se o objeto dto recebido
é nulo. Adicione a validação de nulidade do parâmetro para prevenir exceções
NullPointerException.

apps/api/src/test/java/br/org/apae/api/AgendamentoServicePocTest.java [23-27]

     public AgendamentoDTO agendarConsulta(AgendamentoDTO dto) {
-        // Bug Proposital 1: Falta de validação de DTO nulo (Risco de NullPointerException)
-        if (dto.data == null || dto.data.isBefore(LocalDate.now())) {
+        if (dto == null || dto.data == null || dto.data.isBefore(LocalDate.now())) {
             throw new IllegalArgumentException("Data inválida para agendamento");
         }
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly adds a check to ensure dto is not null before accessing its properties, preventing a NullPointerException.

Medium

Previous suggestions

Suggestions up to commit b270a87
CategorySuggestion                                                                                                                                    Impact
Possible issue
Tratar parâmetro nulo para evitar exceção

Adicione uma verificação defensiva para lidar com valores nulos ou em branco no
parâmetro nome. Isso impede que o método lance uma NullPointerException durante a
chamada a toUpperCase().

apps/api/src/test/java/br/org/apae/api/PocSampleTest.java [6-9]

 public String saudar(String nome) {
-    // Se alguém passar 'nome' vazio ou nulo (null), o sistema vai travar aqui!
+    if (nome == null || nome.isBlank()) {
+        return "Olá!";
+    }
     return "Olá, " + nome.toUpperCase();
 }
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly adds defensive null and empty checks for the nome parameter in saudar to prevent a potential NullPointerException.

Medium
General
Validar idades negativas com exceção

Valide se o parâmetro idade possui um valor coerente antes de avaliar a permissão.
Lançar IllegalArgumentException garante que entradas negativas sejam rejeitadas
explicitamente.

apps/api/src/test/java/br/org/apae/api/PocSampleTest.java [12-15]

 public boolean podeDirigir(int idade) {
-    // O que acontece se alguém passar uma idade negativa, tipo -5?
+    if (idade < 0) {
+        throw new IllegalArgumentException("A idade não pode ser negativa.");
+    }
     return idade >= 18;
 }
Suggestion importance[1-10]: 6

__

Why: Adding input validation to throw an IllegalArgumentException for negative values in podeDirigir prevents invalid inputs from being processed.

Low
Suggestions up to commit 69ceef4
CategorySuggestion                                                                                                                                    Impact
General
Fixar versão da GitHub Action

Evite referenciar a branch @main em workflows de CI/CD para evitar regressões e
quebras inesperadas por alterações na ação upstream. Fixe uma tag de versão estável
(ex: @v0.22) ou o hash do commit.

.github/workflows/pr-agent-poc.yml [24]

-uses: Codium-ai/pr-agent@main
+uses: Codium-ai/pr-agent@v0.22
Suggestion importance[1-10]: 7

__

Why: Pinning a specific version tag or commit hash instead of using @main prevents breaking changes in CI/CD pipelines when upstream updates occur.

Medium
Possible issue
Evitar exceção com parâmetro nulo

Adicione uma verificação previa de nulo na variável nome para evitar a exceção
NullPointerException. Retornar uma saudação genérica ou tratar o valor garante maior
robustez ao método.

apps/api/src/test/java/br/org/apae/api/PocSampleTest.java [6-9]

 public String saudar(String nome) {
-    // Se alguém passar 'nome' vazio ou nulo (null), o sistema vai travar aqui!
+    if (nome == null) {
+        return "Olá, Visitante";
+    }
     return "Olá, " + nome.toUpperCase();
 }
Suggestion importance[1-10]: 6

__

Why: Adding a null check prevents potential NullPointerException runtime errors when nome is passed as null.

Low
Suggestions up to commit 48bfd28
CategorySuggestion                                                                                                                                    Impact
Security
Fixa versão de Action no workflow

Evite utilizar a branch @main diretamente para GitHub Actions de terceiros. Fixar
uma versão específica (tag ou SHA) garante que atualizações inesperadas não quebrem
a execução do seu workflow.

.github/workflows/pr-agent-poc.yml [23-24]

 - id: pr-agent
-  uses: Codium-ai/pr-agent@main
+  uses: Codium-ai/pr-agent@v0.22.0
Suggestion importance[1-10]: 8

__

Why: Pinning GitHub Action versions to a specific tag or hash instead of @main is a security and stability best practice that prevents unexpected workflow failures or supply chain vulnerabilities.

Medium
Possible issue
Adiciona verificação de nulo em saudar

Adicione uma verificação de nulo antes de chamar o método toUpperCase() para evitar
NullPointerException. Retornar uma saudação padrão para entradas nulas ou vazias
torna o código mais seguro.

apps/api/src/test/java/br/org/apae/api/PocSampleTest.java [6-9]

 public String saudar(String nome) {
-    // Se alguém passar 'nome' vazio ou nulo (null), o sistema vai travar aqui!
+    if (nome == null || nome.isBlank()) {
+        return "Olá, Visitante";
+    }
     return "Olá, " + nome.toUpperCase();
 }
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly addresses potential NullPointerException when passing null or empty strings to saudar, improving the robustness of the sample function.

Medium
General
Valida entrada negativa para parâmetro idade

Adicione validação para idades negativas. Lançar uma exceção de argumento inválido
garante que dados incorretos sejam tratados de forma consistente.

apps/api/src/test/java/br/org/apae/api/PocSampleTest.java [12-15]

 public boolean podeDirigir(int idade) {
-    // O que acontece se alguém passar uma idade negativa, tipo -5?
+    if (idade < 0) {
+        throw new IllegalArgumentException("A idade não pode ser negativa.");
+    }
     return idade >= 18;
 }
Suggestion importance[1-10]: 7

__

Why: Adding input validation for negative age values prevents invalid arguments from being processed silently and improves code defensive design.

Medium
Suggestions up to commit 453300e
CategorySuggestion                                                                                                                                    Impact
Possible issue
Trata valores nulos na entrada

A chamada de toUpperCase() diretamente em nome sem validação prévia causará um
NullPointerException caso um valor null seja passado. Adicione uma verificação
defensiva para tratar entradas nulas ou em branco com segurança.

apps/api/src/test/java/br/org/apae/api/PocSampleTest.java [6-9]

 public String saudar(String nome) {
-    // Se alguém passar 'nome' vazio ou nulo (null), o sistema vai travar aqui!
+    if (nome == null || nome.isBlank()) {
+        return "Olá!";
+    }
     return "Olá, " + nome.toUpperCase();
 }
Suggestion importance[1-10]: 7

__

Why: The suggestion correctly identifies a potential NullPointerException when passing null to saudar and provides a safe fallback check.

Medium
General
Valida valores de idade negativos

Entradas com idades negativas representam dados inválidos e não devem ser
processadas silenciosamente. Adicione uma validação para lançar
IllegalArgumentException quando um valor negativo for fornecido.

apps/api/src/test/java/br/org/apae/api/PocSampleTest.java [12-15]

 public boolean podeDirigir(int idade) {
-    // O que acontece se alguém passar uma idade negativa, tipo -5?
+    if (idade < 0) {
+        throw new IllegalArgumentException("A idade não pode ser negativa.");
+    }
     return idade >= 18;
 }
Suggestion importance[1-10]: 6

__

Why: Adding input validation for negative age values prevents processing invalid domain data, improving defensive programming in the sample test method.

Low

@IFPBEsp IFPBEsp deleted a comment from github-actions Bot Aug 26, 2026
@IFPBEsp IFPBEsp deleted a comment from github-actions Bot Aug 26, 2026
@IFPBEsp IFPBEsp deleted a comment from github-actions Bot Aug 26, 2026
@IFPBEsp IFPBEsp deleted a comment from github-actions Bot Aug 26, 2026
@AlisonAndrade123 AlisonAndrade123 added this to the 2026.2 - Sprint 1 milestone Aug 26, 2026
@AlisonAndrade123 AlisonAndrade123 changed the title [WIP/POC] Teste Experimental do PR-Agent #899 [POC] Estudo e Validação do PR-Agent #899 Aug 26, 2026
@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit 48bfd28

@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit 69ceef4

@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit b270a87

@JerfesonGregorio

JerfesonGregorio commented Aug 29, 2026

Copy link
Copy Markdown
Collaborator

Threads abertas.

Comment thread apps/api/src/test/java/br/org/apae/api/PocSampleTest.java
Comment thread docs/pr-agent-strategy.md Outdated
Durante a POC, foram avaliadas três abordagens de modelos de linguagem:

1. **OpenAI (`gpt-4o`):** Modelo comercial de referência, excelente qualidade, porém requer subscrição paga na organização.
2. **OpenRouter (Modelos Abertos Gratuitos):** Testados `deepseek-chat:free` e `llama-3.3-70b:free`. Apresentaram incompatibilidade com o parser de YAML estrito do PR-Agent para sugestões de código inline.

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sobre o OpenRouter, realmente não é possível utiliza-lo por conta da incompatibilidade? Sugiro analisar o ponto de incompatibilidade e validar se não existe uma forma de contornar esse problema.

@github-actions

Copy link
Copy Markdown

Persistent review updated to latest commit f395b95

@AlisonAndrade123

Copy link
Copy Markdown
Collaborator Author

@JerfesonGregorio, atualizei a POC!

  1. Teste de Complexidade (Backend): Criei a classe AgendamentoServicePocTest.java com regras de negócio, loops e bugs propositais clássicos do Java (comparação de String com ==, validações incompletas de DTO e risco de NPE em manipulação de string). A IA (Gemini 3.6 Flash) gabaritou o teste: pegou todos os bugs lógicos e sugeriu correções defensivas precisas (como usar Yoda conditions no .equals e ternários para checagem de nulo).
  2. Análise do OpenRouter: O problema com as tags :free do OpenRouter foi detalhado no Tópico 6 do documento. O LiteLLM conecta, mas os modelos públicos oscilam o formato da resposta, quebrando o parser YAML exigido pelo PR-Agent no comando /improve.
  3. Solução: Mudei a configuração para o provedor oficial do Google Gemini (3.6 Flash), que possui uma cota de API 100% gratuita para desenvolvedores. Ele suporta a formatação estrita (tool calling) e fez essas revisões complexas perfeitamente. O documento e os YAMLs já refletem essa configuração final recomendada!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

5 Complexidade 5 poc Para elaboração de POCs para avaliação de ferramentas QA Lista de tarefas para análise de qualidade Review effort 2/5

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants