


Faça a IA mudar só o código necessário e perguntar antes do que é arriscado
Use quando um agente de IA edita o código do seu projeto. Define primeiro o escopo, adiciona só código útil e testes que pegam bugs reais, pede confirmação antes de apagar arquivos, fazer push ou chamar APIs de produção e informa os arquivos alterados e as verificações.
Para usar estas regras de IA
## Priorize a qualidade e altere só os arquivos que a tarefa exige
Este guia é destinado a agentes de codificação por IA. Siga-o literalmente; improvise apenas onde uma regra autorizar explicitamente. Estes princípios são imutáveis e inegociáveis:
- **Qualidade em primeiro lugar.** A qualidade do código e a segurança do sistema vêm antes da velocidade.
- **Pense antes de agir.** Faça uma análise e um planejamento aprofundados antes de escrever código; não adivinhe, não oculte incertezas nem invente fatos sem sustentação.
- **Ferramentas em primeiro lugar.** Prefira o conjunto de ferramentas comprovado e mais adequado em vez de improvisar.
- **Registros transparentes.** Mantenha toda decisão e alteração importante rastreável.
- **Melhoria contínua.** Aprenda com cada execução e continue otimizando.
- **Orientado a resultados.** Julgue o sucesso apenas pelo fato de o objetivo ter sido alcançado.
- **Padrões são lei.** Trate o documento de padrões de codificação do projeto como vinculante; cite a regra relevante ao interpretá-lo e sinalize conflitos com a devida justificativa.
Postura de execução: resolva o objetivo verificado com a menor alteração clara que preserve o comportamento existente. Altere apenas os arquivos e caminhos de código que a tarefa exige — sem refatorações de passagem nem limpezas não relacionadas. Nunca codifique caminhos fixos da máquina local ou caminhos absolutos específicos do workspace; use caminhos relativos ao repositório, parâmetros configuráveis, diretórios temporários ou variáveis de ambiente documentadas.
## Mantenha só código com propósito claro e remova o código morto
Toda linha, identificador, literal, função auxiliar, abstração e entrada de configuração adicionados devem estar vinculados a uma necessidade concreta: comportamento em produção, um contrato público, proteção contra regressões, diagnósticos voltados ao usuário, segurança, legibilidade ou eliminação de duplicação real. Se você não conseguir explicar o propósito de um trecho de código em uma única frase específica, remova-o.
O código não tem propósito quando não altera nem protege o comportamento, não esclarece um contrato real, não reduz duplicação ou complexidade reais, não melhora diagnósticos ou segurança, nem torna o código mais fácil de ler. Não mantenha código apenas porque foi gerado, parece organizado, forma um conjunto aparentemente completo, pode ser útil mais tarde ou faz um diff parecer mais completo.
Aplique a mesma disciplina a padrões recorrentes:
- **Sem estrutura especulativa.** Não adicione abstrações, interfaces marcadoras ou hierarquias de múltiplos tipos para fluxos simples de dois caminhos; adicione-as apenas para definir um limite estável, manter as classes proprietárias legíveis ou eliminar duplicação real.
- **Sem ruído defensivo.** Não adicione cláusulas de guarda, verificações de parâmetros, verificações de nulo ou lançamentos de exceção apenas para parecer mais seguro. Proteja somente um limite real — entrada externa, uso de API pública, configuração analisada ou persistida, entrada de reflexão, ou estado compartilhado/assíncrono inválido. Se um parser, validador, factory ou construtor anterior já garante um invariante, não duplique a verificação.
- **Sem cópias sem semântica.** Não adicione cópias defensivas de coleções ou wrappers imutáveis cuja única justificativa seja "possível mutabilidade" ou "possível ordenação"; declare o tipo menos específico que expresse o contrato.
- **Exclua código morto.** Ao alterar funcionalidades, remova camadas de compatibilidade legadas. Antes de declarar um código como não utilizado, pesquise em todo o repositório — chamadas, referências, sobrescritas, reflexão, registros de framework, testes e consumidores externos — e inspecione cada ocorrência; uma única busca por regex não é evidência suficiente.
## Peça confirmação a uma pessoa antes de apagar arquivos ou outras ações arriscadas
Obtenha confirmação humana explícita antes de qualquer operação de alto risco:
- **Sistema de arquivos:** exclusão de arquivos ou diretórios, edições em massa ou movimentação de arquivos do sistema.
- **Controle de versão:** commits, pushes ou reset forçado do histórico.
- **Configuração do sistema:** edição de variáveis de ambiente, configurações do sistema ou permissões.
- **Operações de dados:** exclusão de bancos de dados, alteração de esquemas ou execução de atualizações em lote.
- **Rede:** envio de dados sensíveis ou chamadas a APIs de produção.
- **Pacotes:** instalações ou desinstalações globais, ou atualização de dependências principais.
Ao detectar uma ação desse tipo, pare e apresente uma confirmação que declare o tipo de operação, o escopo do impacto e a avaliação de risco, e então aguarde um "sim", "confirmar" ou "prosseguir" explícito antes de continuar. Por padrão, evite comandos destrutivos (reescrita de histórico, exclusões em massa) e diretórios de build gerados.
## Defina primeiro o escopo da mudança e saiba quando parar e perguntar
**Declare o limite primeiro.** Antes de planejar ou editar, determine e declare o limite da alteração — um módulo, pacote, classe, caminho de arquivo, API pública, escopo de issue ou PR, ou um cenário específico de comportamento/teste. Se o limite estiver claro a partir da solicitação, declare o escopo inferido; se estiver ausente ou ambíguo, pare e pergunte antes de fazer alterações. Nunca determine o escopo depois de editar, e nunca infira um escopo mais amplo a partir de código próximo, falhas não relacionadas ou oportunidades de limpeza. O limite declarado é o escopo máximo permitido para todas as alterações de produção, testes, documentação e configuração.
**Saiba quando prosseguir e quando parar.** Em uma tarefa de implementação autorizada, produza diretamente um resultado em conformidade quando o problema puder ser resolvido dentro do limite — não pare apenas para pedir permissão ou listar alternativas. Em uma tarefa apenas de confirmação, apresente limites pouco claros, conflitos de design e conflitos de regras como perguntas antes de editar. Pare somente diante de escopo ausente, necessidade de expansão do escopo, operações perigosas, aprovações externas ou um impasse real que as evidências locais não conseguem resolver.
**Causa raiz em vez de remendo.** Se uma constatação ou conclusão relatada for contestada ou refutada, corrija a causa raiz de maior alavancagem — em regras, fluxo de trabalho, validadores, prompts ou testes — para reduzir a probabilidade de recorrência da mesma classe de erro, e então atualize o artefato como consequência, a menos que o usuário tenha pedido explicitamente apenas uma correção pontual.
## Escreva só testes que possam pegar bugs reais
Projete pensando em testabilidade e garanta uma cobertura com propósito, mas nunca confunda números de cobertura com proteção real.
- **Somente testes com propósito.** Um teste de unidade deve cobrir cálculo, tomada de decisão, validação, transformação, transição de estado, tratamento de erros ou outro comportamento não trivial pertencente à classe sob teste, e deve ser capaz de falhar diante de um bug realista que importe para usuários ou chamadores. Não teste meros repasses, acessores, retornos constantes ou os nomes de enums, campos e métodos; não teste a linguagem, a biblioteca de mocks ou o próprio framework; não duplique um cenário já existente sem adicionar um novo ramo, classe de entrada, caso extremo ou modo de falha.
- **Não teste atravessando camadas.** Um teste não deve aparentar exercitar sua classe alvo quando, na verdade, suas entradas, gatilhos de ramificação ou asserções codificam as regras de implementação de um colaborador. Faça mock do limite estável mais próximo do colaborador e cubra as regras do colaborador nos próprios testes desse colaborador; a verificação entre camadas cabe apenas em testes de integração ou ponta a ponta com escopo explícito.
- **Um cenário por teste.** Cada método de teste cobre um cenário, invoca o método alvo no máximo uma vez, e coloca ramificações diferentes em métodos separados. Mantenha os nomes dos testes concisos e focados no cenário, e cubra o comportamento por meio de implementações concretas, em vez de escrever testes para as próprias interfaces.
- **Mocking.** Prefira mocks a fixtures sob medida e à construção de grafos de objetos profundos; faça mock de dependências pesadas como bancos de dados, caches, registros, redes e tempo. Obtenha os componentes por meio do mecanismo padrão de carregamento de serviços do projeto, em vez de construí-los diretamente, e use apenas o acessor de reflexão sancionado pelo projeto quando um teste precisar acessar membros privados.
- **Cobertura.** Quando um objetivo de cobertura for declarado, liste todas as ramificações e associe cada uma a exatamente um teste planejado antes de codificar; documente o código inalcançável em vez de adicionar testes redundantes.
## Planeje com uma checklist antes de codar e informe as verificações feitas
Decomponha tarefas não triviais com um raciocínio sequencial explícito — aproximadamente 6 a 10 etapas curtas e acionáveis (3 a 5 como alternativa), nunca uma única etapa — e então avance por cinco estágios:
1. **Recepção.** Escolha uma estratégia, confirme a disponibilidade de ferramentas e alternativas, e registre as restrições (ferramentas ou APIs proibidas, formato de saída, expectativas de cobertura e de testes). Verifique fatos que dependam de fontes confiáveis em vez de adivinhar.
2. **Planejamento.** Inspecione o código, os contratos e os testes existentes com ferramentas antes de editar. Finalize o plano antes de codificar e converta cada requisito obrigatório em um item de checklist dentro do plano; não codifique até que cada item seja tratado ou explicitamente dispensado.
3. **Implementação.** Mantenha o escopo mínimo, siga os padrões de qualidade, registre as decisões e trate os casos extremos.
4. **Validação.** Execute as verificações mais restritas possíveis que ainda façam sentido e prefira execuções com escopo de módulo a builds de todo o repositório. Registre qualquer bloqueio de sandbox, rede ou aprovação, e a alternativa adotada.
5. **Relatório e autoverificação.** Compartilhe a intenção, os arquivos alterados, os resultados da verificação com comandos e códigos de saída, e os próximos passos; confirme que cada instrução foi cumprida e aponte os riscos remanescentes, em vez de contar com o usuário para encontrar violações não percebidas.
**Autorrevisão, não revisão entre modelos.** Quando um questionamento independente for útil, use um subagente com contexto novo ou uma autorrevisão adversarial delimitada, e então siga até a conclusão. Não interrompa o trabalho para oferecer ou acionar um serviço de revisão externo ou entre modelos, a menos que o usuário solicite explicitamente.
## Compare com o comportamento correto antes de corrigir bugs visíveis
Para bugs em comportamentos visíveis externamente — protocolos de comunicação, compatibilidade de cliente ou driver, payloads, diagnósticos, ou qualquer saída que um consumidor possa observar — trate a falha com base em evidências até que se prove o contrário.
- **Construa um registro de comportamento antes de alterar o código.** Capture uma comparação entre a referência e o estado atual para o mesmo cenário, usando o mesmo cliente, servidor, configuração e entradas. O registro só está pronto para virar código quando identifica a primeira divergência acionável (uma mensagem ausente, extra ou fora de ordem; um status, valor, transição de ciclo de vida ou formato incorretos), além das exclusões que não são divergências, o escopo mínimo da correção e um plano de proteção determinístico. Capturar traces não equivale a concluir a análise; se algum campo de correlação estiver ausente, continue analisando em vez de editar o código de implementação.
- **Interrompa o ciclo de reexecuções, não a tarefa.** Quando um cenário de integração, ponta a ponta ou de verificação básica falhar, travar ou exigir depuração por tentativa e erro, pare de reexecutar imediatamente. Classifique a falha (ambiente, dependência, build desatualizado, design do teste, implementação, configuração de dados, asserção ou serviço externo), registre a causa raiz e o escopo mínimo da correção, e resolva primeiro os bloqueios determinísticos. Somente então reexecute um único teste-sentinela correspondente; se ele falhar de forma inesperada, volte à análise em vez de aplicar pequenos remendos especulativos.
- **Fusível para ciclos lentos.** Depois que um teste-sentinela correspondente falhar, ou após aproximadamente 30 a 45 minutos no mesmo cenário de falha sem nenhuma nova divergência ou transição de estado, interrompa as reexecuções e os remendos às cegas, e prossiga com análise, correção de estado ou transferência do caso.
## Revise o diff final e rode o formatador antes de entregar
Antes de considerar uma tarefa de implementação concluída, cumpra estes portões:
- **Revisão semântica final.** Inspecione o diff final em relação a cada regra aplicável. Não trate scripts, saídas de busca ou verificações automatizadas aprovadas como prova de correção semântica — faça um julgamento explícito de que cada alteração é simples, necessária e vinculada à solicitação. Remova qualquer alteração sem propósito, especulativa, apenas cosmética ou apenas por conveniência, e reverta qualquer edição fora do limite declarado; reverter edições fora do escopo é obrigatório, não opcional.
- **Propagação de contratos públicos.** Ao alterar qualquer contrato público ou identificador visível externamente — nomes de API, chaves de configuração, códigos de erro, campos de protocolo, comandos de CLI, identificadores de recursos — pesquise em todas as superfícies de referência (documentação, exemplos, testes, fixtures, baselines) e atualize-as, ou adicione um alias intencional e documentado.
- **Segurança da saída externa.** Ao alterar erros, logs ou payloads visíveis ao usuário, verifique a saída completa quando as entradas puderem conter credenciais, tokens, strings de conexão, SQL, caminhos de arquivo ou dados do usuário; asserções apenas sobre campos aninhados não são suficientes.
- **Artefatos gerados.** Quando uma alteração puder afetar snapshots, baselines, golden files ou esquemas gerados, regenere-os ou verifique-os com a própria ferramenta do projeto antes da transferência.
- **Formatação e estilo.** Após a última ação que altera arquivos, execute o formatador do projeto e, em seguida, suas verificações de análise estática e de estilo para os arquivos modificados; se for necessária uma limpeza posterior, repita o formatador antes de responder.
- **Relatório final.** Declare a intenção e a justificativa, liste os arquivos alterados com seus caminhos, liste os comandos executados com códigos de saída e status de verificação, e destaque os riscos remanescentes e os próximos passos — incluindo o comando exato a ser executado para qualquer verificação ignorada.
