Nomenclatura Cega ao Contexto.
Um assistente de IA nomeia código novo com placeholders genéricos ou uma convenção nova que ignora os identificadores existentes e o vocabulário do domínio do repositório, corroendo a legibilidade e gerando conceitos duplicados e mal descritos.
##Sinais e sintomas
Um revisor identifica Nomenclatura Cega ao Contexto quando os nomes em um diff de autoria da IA são localmente plausíveis, mas desconectados do repositório ao redor. Sinais reveladores:
- Placeholders genéricos em código de domínio:
data,result,temp,item,obj,payload,response,value,handleStuff,processDataonde o módulo já fala uma linguagem específica (grossPremium,Customer,getCustomerById). - Deriva de convenções: um símbolo
snake_casejogado em um arquivocamelCase, um prefixo booleanois/hasausente, ou um novo verbo CRUD (fetch*) em uma base de código que padronizou emget*. Cada diff segue qualquer que seja o estilo que encontrou por último, introduzindo uma quarta convenção. E então uma quinta. - Proliferação de sinônimos / conceitos duplicados: a IA inventa
fetchUserquandogetCustomerByIdjá existe, ou misturacustomer/client/userpara uma única entidade — reimplementando em vez de reutilizar. - Nomes que descrevem o mecanismo, não a intenção — ou que mentem sobre o comportamento:
processData()que na verdade calcula imposto sobre vendas. Os agentes (e o próximo agente) leemprocessData()e prosseguem como se aquele nome contasse toda a história, então o significado errado se propaga para cada ponto de chamada.
// O repositório já exporta getCustomerById(id: CustomerId): Promise<Customer>
// A IA adiciona uma quase-duplicata com nomes cegos ao contexto:
async function fetchData(id: string) { // verbo genérico, tipo frouxo
const result = await db.query("select * from customers where id = $1", [id]);
const temp = result.rows[0]; // 'temp' esconde que é um Customer
return temp; // nada aqui diz "Customer"
}
##Causas do problema
Por que os modelos a produzem
- Viés de frequência do próximo token. Em todo o corpus de treinamento,
data/result/temp/fooestão entre os identificadores mais frequentes, especialmente no código de tutorial e boilerplate que os LLMs ingerem intensamente. Gerar o nome estatisticamente médio é exatamente o que um preditor de próximo token é otimizado para fazer, o que apaga a intenção do domínio. - Sem contexto do repositório (ou truncado). O modelo raramente vê o glossário do módulo irmão ou o
getCustomerByIdexistente. O resumo da DevClass sobre o relatório de 2025 da GitClear observa que os assistentes têm menos probabilidade de propor a reutilização de uma função similar em outro lugar, em parte por causa do tamanho limitado do contexto (DevClass sobre a GitClear 2025). - Otimização local / instinto fraco de refatoração. Cada turno otimiza o prompt imediato, não a base de código como um todo. A OX Security encontrou Evitação de Refatorações — uma IA que "se destaca gerando código novo, mas nunca volta para melhorar a arquitetura" — em 80–90% do código de IA analisado (relatório OX).
- Defasagem do corte de treinamento. Convenções e nomes de API de corpora mais antigos ressurgem mesmo depois que um projeto já seguiu em frente.
Por que isso prejudica
- Legibilidade/manutenibilidade: nomes são a principal documentação de uma base de código; os genéricos forçam cada leitor a rederivar a intenção a partir do corpo.
- Duplicação e defeitos: renomear um conceito gera uma implementação paralela. A análise de 2025 da GitClear, com 211 milhões de linhas alteradas (2020–2024), constatou que as linhas associadas à refatoração (linhas "movidas") caíram de 25% das linhas alteradas em 2021 para menos de 10% em 2024, enquanto as linhas copiadas/coladas subiram de 8,3% para 12,3% no mesmo período; 2024 foi o primeiro ano em que as linhas copiadas/coladas superaram as movidas, e os blocos com cinco ou mais linhas duplicadas cresceram cerca de oito vezes ao longo de 2024 (GitClear 2025).
- Loop de feedback de agentes (o dano específico de IA): nomes são a interface que o próximo agente lê ao pé da letra. Como diz a Encyclopedia of Agentic Coding Patterns, "um agente de IA trata os nomes que encontra em uma base de código como seu principal sinal para entender o que as coisas fazem", e "nomes inconsistentes no código existente produzem nomes inconsistentes no código gerado" (AI Pattern Book).
- Carga de revisão & correção: os revisores precisam mapear mentalmente
temp/datade volta a conceitos de domínio, o que esconde bugs; nomes enganosos causam uso incorreto nos pontos de chamada. - Pontos cegos de segurança/auditoria: um segredo ou token estacionado em uma variável chamada
data/tmpescapa de greps baseados em nomes e da atenção da revisão.
Observação: ferramentas estáticas capturam bem violações de nomenclatura locais e explícitas (maiúsculas/minúsculas, comprimento, palavras proibidas), mas saber se um nome corresponde ao significado do domínio depende da intenção e escapa em grande parte da detecção automatizada.
##Tratamento
Táticas de revisão & prompting
- Alimente as convenções e o glossário no contexto. Mantenha um guia de nomenclatura curto (casing, prefixos booleanos, verbos CRUD, termos de domínio) em
CLAUDE.md/docs de estilo e exija que o modelo o siga. Aplique os termos do glossário de domínio de forma consistente para que os sinônimos colapsem em uma única palavra. - Force a reutilização antes da criação. Prompt: "Procure no repositório por uma função/tipo existente para isto antes de adicionar uma nova; reutilize-a." Isso combate diretamente a falha de conceito duplicado que a GitClear e a OX sinalizam.
- Nomeie as coisas no prompt. "Nomeie o handler como
createRefund" é melhor do que "adicione processamento de reembolso". Especifique nomes de domínio (monthlyRevenue, nãofloat1). - Exija que o linter + a varredura de duplicação rodem no diff (naming-convention +
id-denylist+ jscpd) e faça o modelo corrigir as violações em vez de você fazê-lo à mão.
A refatoração — aplique Renomear Método (e o mesmo para variáveis) para corrigir nomes enganosos, e elimine o Código Duplicado chamando o símbolo existente em vez do novo.
Antes:
async function fetchData(id: string) {
const result = await db.query("select * from customers where id = $1", [id]);
const temp = result.rows[0];
return temp;
}
Depois (remova a quase duplicata e chame a função de repositório existente com o tipo do domínio):
// Não consulte de novo — reutilize getCustomerById e mantenha o vocabulário do domínio.
const customer = await getCustomerById(id as CustomerId);
Se um nome enganoso já foi entregue, renomeie-o para corresponder ao comportamento (processData → calculateSalesTax) antes de construir em cima dele, para que agentes e humanos a jusante herdem o sinal correto.
##Detectado por
- ESLint (core) id-denylist — Proíbe identificadores especificados
- ESLint (core) id-length — Impõe comprimento mínimo/máximo de identificador
- typescript-eslint @typescript-eslint/naming-convention — Impõe convenções de nomenclatura (casing/prefixos)
- eslint-plugin-unicorn unicorn/prevent-abbreviations — Previne abreviações / nomes excessivamente genéricos
- SonarQube / SonarSource typescript:S117 — Nomes de variáveis locais e parâmetros devem obedecer a uma convenção de nomenclatura
- jscpd --min-lines / --min-tokens — Detecta blocos duplicados criados quando um conceito renomeado duplica um existente