Revisão de pull request
Ordem da revisão
Revise nesta ordem e pare no primeiro nível que reprovar. Apontar nomes de variável
num PR que tem race condition desperdiça o tempo de todo mundo.
- Faz o que promete? Compare o diff com a descrição do PR. Código a mais que
ninguém pediu é tão problema quanto código a menos.
- Está correto? Casos de borda, nulos, listas vazias, erro de rede, concorrência.
- Quebra alguém? Contrato de API, schema, formato de dados persistidos,
comportamento que outro time consome.
- Dá pra manter? Duplicação, acoplamento, nomes.
- Estilo. Só se o linter não pega. Se pega, o comentário é no linter, não no PR.
O que buscar ativamente
Estas são as classes de defeito que passam por revisão humana com mais frequência:
- Erro engolido —
catch que loga e segue, ?. mascarando estado inválido.
- Concorrência — leitura e escrita sem transação,
await dentro de laço mutando
estado compartilhado.
- Fronteira de confiança — entrada de usuário chegando em query, path ou shell sem
validação.
- Vazamento — credencial, token ou PII em log, mensagem de erro ou resposta.
- Migração destrutiva —
DROP/ALTER sem plano de rollback, ou incompatível com a
versão anterior rodando em paralelo durante o deploy.
- Teste que não testa — asserção sobre mock,
expect(true), teste que passa com a
implementação removida.
Ao revisar código gerado por agente
Peso extra em: dependência que não existia no projeto, tratamento de erro
excessivamente defensivo, testes que espelham a implementação em vez do requisito, e
código morto deixado para trás. Verifique também se APIs citadas existem de fato na
versão em uso.
Como escrever o comentário
Diga o que quebra e em qual cenário. Sem cenário concreto, é preferência.
# ruim
Isso aqui não parece thread-safe.
# bom
Duas requisições simultâneas para o mesmo `orderId` leem o estoque antes de qualquer
escrita, e as duas passam na checagem — dá pra vender mais do que existe. Precisa de
lock na linha ou de uma constraint no banco.
Separe bloqueio de sugestão. Prefixe o que não bloqueia com nit: e deixe explícito
que pode ser ignorado.
Limiares padrão
Pontos de partida com base defensável, não leis. Onde o time já tem número próprio, o
dele vale — mas conheça o motivo antes de afrouxar.
- PR acima de ~400 linhas alteradas: peça para quebrar. A quantidade de defeito
encontrado por revisão despenca conforme o diff cresce — não porque o código fica
melhor, mas porque a atenção do revisor acaba. Tire da conta arquivo gerado,
lockfile e arquivo só movido de lugar.
- PR parado há mais de um dia: revise ou passe adiante explicitamente. Branch
envelhecendo acumula conflito, e o custo disso supera o do review que ficou para
depois.
- Duas aprovações quando o diff toca autenticação, autorização, migração de dados,
cobrança, ou qualquer coisa que rode com privilégio elevado. Uma aprovação no resto.
- Cobertura: exija teste para o comportamento novo, não um percentual. Meta global
premia teste de getter e não diz nada sobre o caminho que quebra em produção.
- Dono do código: se o repositório tem
.github/CODEOWNERS, o caminho tocado
determina quem precisa aprovar, independente do resto.
Antes de aprovar
1---2name: revisao-de-pr3description: Use quando for revisar um pull request, analisar um diff, responder "esse PR está bom?", ou preparar o próprio código antes de pedir review — inclusive ao revisar mudanças feitas por um agente.4---56# Revisão de pull request78## Ordem da revisão910Revise nesta ordem e **pare no primeiro nível que reprovar**. Apontar nomes de variável11num PR que tem race condition desperdiça o tempo de todo mundo.12131. **Faz o que promete?** Compare o diff com a descrição do PR. Código a mais que14 ninguém pediu é tão problema quanto código a menos.152. **Está correto?** Casos de borda, nulos, listas vazias, erro de rede, concorrência.163. **Quebra alguém?** Contrato de API, schema, formato de dados persistidos,17 comportamento que outro time consome.184. **Dá pra manter?** Duplicação, acoplamento, nomes.195. **Estilo.** Só se o linter não pega. Se pega, o comentário é no linter, não no PR.2021## O que buscar ativamente2223Estas são as classes de defeito que passam por revisão humana com mais frequência:2425- **Erro engolido** — `catch` que loga e segue, `?.` mascarando estado inválido.26- **Concorrência** — leitura e escrita sem transação, `await` dentro de laço mutando27 estado compartilhado.28- **Fronteira de confiança** — entrada de usuário chegando em query, path ou shell sem29 validação.30- **Vazamento** — credencial, token ou PII em log, mensagem de erro ou resposta.31- **Migração destrutiva** — `DROP`/`ALTER` sem plano de rollback, ou incompatível com a32 versão anterior rodando em paralelo durante o deploy.33- **Teste que não testa** — asserção sobre mock, `expect(true)`, teste que passa com a34 implementação removida.3536## Ao revisar código gerado por agente3738Peso extra em: dependência que não existia no projeto, tratamento de erro39excessivamente defensivo, testes que espelham a implementação em vez do requisito, e40código morto deixado para trás. Verifique também se APIs citadas existem de fato na41versão em uso.4243## Como escrever o comentário4445Diga **o que quebra** e **em qual cenário**. Sem cenário concreto, é preferência.4647```48# ruim49Isso aqui não parece thread-safe.5051# bom52Duas requisições simultâneas para o mesmo `orderId` leem o estoque antes de qualquer53escrita, e as duas passam na checagem — dá pra vender mais do que existe. Precisa de54lock na linha ou de uma constraint no banco.55```5657Separe bloqueio de sugestão. Prefixe o que não bloqueia com `nit:` e deixe explícito58que pode ser ignorado.5960## Limiares padrão6162Pontos de partida com base defensável, não leis. Onde o time já tem número próprio, o63dele vale — mas conheça o motivo antes de afrouxar.6465- **PR acima de ~400 linhas alteradas: peça para quebrar.** A quantidade de defeito66 encontrado por revisão despenca conforme o diff cresce — não porque o código fica67 melhor, mas porque a atenção do revisor acaba. Tire da conta arquivo gerado,68 lockfile e arquivo só movido de lugar.69- **PR parado há mais de um dia: revise ou passe adiante explicitamente.** Branch70 envelhecendo acumula conflito, e o custo disso supera o do review que ficou para71 depois.72- **Duas aprovações** quando o diff toca autenticação, autorização, migração de dados,73 cobrança, ou qualquer coisa que rode com privilégio elevado. Uma aprovação no resto.74- **Cobertura: exija teste para o comportamento novo, não um percentual.** Meta global75 premia teste de getter e não diz nada sobre o caminho que quebra em produção.76- **Dono do código:** se o repositório tem `.github/CODEOWNERS`, o caminho tocado77 determina quem precisa aprovar, independente do resto.7879## Antes de aprovar8081- [ ] O CI passou — não aprove verde-pendente82- [ ] Migrações têm rollback e são compatíveis com a versão anterior83- [ ] Nada sensível em log ou mensagem de erro84- [ ] Os testes falham se a implementação for revertida85- [ ] A descrição do PR explica **por que**, não só o que