SkillProgramaçãoRevisão
Revisão de Lógica e Corretude
Verifica se a lógica implementada em um PR está correta, trata os casos esperados e não introduz bugs. Use como etapa de code review sempre que o PR alterar regra de negócio, algoritmos, transformações de dados ou fluxos de controle.
Ações
PerfilDev
ProfundidadeAlta
IdiomaInglês (skill original)
Objetivo
Em uma frase.
Verificar se a lógica implementada no PR está correta — cobrindo fluxos de controle, tratamento de estados nulos e inválidos, transformações de dados, contratos de interface e race conditions em código concorrente.
Aplicação
Quando
faz sentido.
Usar
- Como segunda etapa do workflow de code review, após mapear o escopo do PR.
- Sempre que o PR modificar lógica de negócio, algoritmos, transformações de dados ou fluxos de controle.
- Quando há suspeita de que uma mudança pode introduzir comportamento incorreto em casos de borda.
Não usar
- Para revisar segurança — use a skill reviewing-security.
- Para revisar performance — use a skill reviewing-performance.
- Para revisar cobertura de testes — use a skill reviewing-test-coverage.
- Antes de mapear o escopo do PR com understanding-pr-scope — esse contexto é pré-requisito.
Prompt
Instruções
para a IA.
### Passo 1 — Leia cada função alterada por inteiro
Não revise apenas as linhas do diff highlight. Leia a função completa para entender o comportamento antes e depois da mudança — bugs costumam se esconder no contexto das linhas não alteradas.
### Passo 2 — Trace todos os caminhos de controle
Para cada bloco alterado, percorra explicitamente o happy path, os caminhos alternativos, os caminhos de erro e os de borda (valores limite, listas vazias, zero, strings vazias). Verifique se nenhum caminho deixa o sistema em estado inválido.
### Passo 3 — Verifique tratamento de nulo e estado inválido
Para cada valor que pode ser
### Passo 4 — Verifique transformações de dados
Confira se a transformação preserva a semântica, se os tipos são compatíveis, se as comparações usam o operador correto e se arredondamento, overflow, datas e timezones são tratados.
### Passo 5 e 6 — Contratos de interface e race conditions
Valide assinaturas, retornos e compatibilidade nos pontos de integração. Em código concorrente, busque ordem de execução não garantida, estado compartilhado sem sincronização e vulnerabilidades TOCTOU. Cada problema reportado deve incluir arquivo, linha, descrição, impacto e severidade; quando não houver nenhum, declare "No logic issues found."
Não revise apenas as linhas do diff highlight. Leia a função completa para entender o comportamento antes e depois da mudança — bugs costumam se esconder no contexto das linhas não alteradas.
### Passo 2 — Trace todos os caminhos de controle
Para cada bloco alterado, percorra explicitamente o happy path, os caminhos alternativos, os caminhos de erro e os de borda (valores limite, listas vazias, zero, strings vazias). Verifique se nenhum caminho deixa o sistema em estado inválido.
### Passo 3 — Verifique tratamento de nulo e estado inválido
Para cada valor que pode ser
null, undefined, vazio ou inválido, confira se há verificação antes do uso e se o tratamento está no lugar certo.### Passo 4 — Verifique transformações de dados
Confira se a transformação preserva a semântica, se os tipos são compatíveis, se as comparações usam o operador correto e se arredondamento, overflow, datas e timezones são tratados.
### Passo 5 e 6 — Contratos de interface e race conditions
Valide assinaturas, retornos e compatibilidade nos pontos de integração. Em código concorrente, busque ordem de execução não garantida, estado compartilhado sem sincronização e vulnerabilidades TOCTOU. Cada problema reportado deve incluir arquivo, linha, descrição, impacto e severidade; quando não houver nenhum, declare "No logic issues found."
Casos
Exemplos
de uso.
**Contexto:** um PR adiciona o método `getActiveSubscription` em um serviço de usuário.
```typescript
// src/services/UserService.ts
async getActiveSubscription(userId: string): Promise<Subscription> {
const user = await this.userRepository.findById(userId);
const subscriptions = await this.subscriptionRepository.findByUser(user.id);
const active = subscriptions.filter(s => s.status === 'active');
return active[0];
}
```
**Saída esperada do agente**
**Arquivo:** `src/services/UserService.ts` — Linha 4
**Problema:** `user` pode ser `null` se o `userId` não existir, mas `user.id` é acessado na linha seguinte sem verificação, causando `TypeError` em produção.
**Impacto:** crash em runtime para qualquer chamada com `userId` inválido ou de usuário deletado.
**Severidade:** alta
**Sugestão:** lançar `NotFoundError` quando `user` for nulo, após o `findById`.
**Arquivo:** `src/services/UserService.ts` — Linha 7
**Problema:** `active[0]` retorna `undefined` quando não há assinaturas ativas, mas o tipo declarado é `Promise<Subscription>` (não nullable).
**Impacto:** código que acessa o retorno sem verificar nulo quebra silenciosamente para usuários sem assinatura.
**Severidade:** alta
**Sugestão:** alterar o tipo para `Promise<Subscription | null>` e documentar o contrato, ou lançar exceção explícita.Constelação
Onde
ela vive.
Bundles que incluem
Execução
Como usar
com IA.
- 01Copie a skill (botão "Copiar skill para IA", no topo): o texto copiado já é a skill completa, não um resumo.
- 02Abra o Claude ou Claude Code e cole — a IA recebe todas as instruções e fica pronta para a tarefa.
- 03Prefere usar como arquivo reutilizável? Baixe o .zip e coloque o
SKILL.mdem.claude/skills/(Claude Code) ou anexe o arquivo no Claude (claude.ai).