Revisão de Neural-Slop
Neural-Slop não é um estilo, mas afirmações que não são confirmadas e código que não tem razão de existir. Cada achado abaixo é verificado com um fato: uma linha de código, a saída de um comando, a ausência de um consumidor. Observações de gosto pessoal e o que um linter pega não entram aqui.
Princípios.
- Remover é melhor do que adicionar. Uma opção morta é removida, não documentada; uma frase de marketing é substituída por um fato ou removida.
- A afirmação é verificada pelo código, não pela memória. Antes de chamar uma linha do README de falsa ou verdadeira, abra o arquivo ao qual ela se refere.
- Um achado sem evidência não é um achado. Se você não pode mostrar
file:lineou a saída de um comando — não escreva. - Correções apenas sob solicitação. Por padrão, o resultado da revisão é uma lista.
1. Ordem de trabalho
- Determine o escopo: diff (
git diff main...HEAD), arquivos específicos ou o repositório inteiro antes da publicação. - Execute a busca da seção 3 — ela fornece candidatos, não achados.
- Verifique cada candidato lendo o código e descarte falsos positivos.
- Percorra a lista de verificação da seção 2 para o que a busca não pega: README vs código, estados de UI, abstrações.
- Se possível executar o aplicativo — olhe as páginas: telas modelo e componentes não estilizados são visíveis imediatamente.
- Emita um relatório no formato da seção 4.
2. Lista de verificação
2.1. Resquícios de geradores e modelos
- Páginas iniciais e blocos de geradores: "Get started by editing", links para documentação do framework e ferramentas,
utm_source=…-project, "Give us a star", blocos sobre serviços em nuvem da ferramenta. - Arquivos modelo:
example.spec.ts, testes que verificam apenas o título do modelo; SVGs e imagens do modelo empublic/; README do gerador. - Placeholders vazios:
.gitkeepem pastas onde já existem arquivos;index.tsvazios; pastas-camada sem código.
2.2. Morto e inacabado
- Valores de configuração ou ramos
switchque lançam "not implemented" / "pending". - Enumerações com um único valor que parecem um ponto de extensão (
type: "graphql" | "msw", ondemswnão é implementado). - Código comentado,
TODOsem motivo ou link, exportações não utilizadas, dependências empackage.jsonque não são importadas em lugar nenhum. - Scripts em
package.jsonque não executam (referenciam arquivos removidos, targets inexistentes).
2.3. Documentação vs código
Cada afirmação do README, ADR, comentários e descrições de commits é verificada:
- Nomes e caminhos: arquivos, comandos, variáveis de ambiente mencionados existem (
next.config.tsno texto enext.config.jsno repositório — achado). - Comportamento: "as requisições vão diretamente", "tokens não estão acessíveis ao JS", "protegido contra open redirect" — encontre o código que faz isso e verifique os casos limite.
- Versões e números: versões de bibliotecas, tempo de vida de tokens, cobertura.
- Futuro no presente: o que está planejado é descrito como já feito.
- Links e âncoras no Markdown levam para onde deveriam (âncoras quebram ao editar cabeçalhos).
2.4. Tom
- Palavras avaliativas em vez de fatos: premium, state-of-the-art, cutting-edge, blazing/lightning-fast, seamless, robust, powerful, modern, production-ready, enterprise-grade, "mais do que apenas", "premium", "moderno", "poderoso".
- Emojis em cabeçalhos de documentação, na UI, em logs e mensagens de commit.
- "Designed with ❤️", "Carefully crafted", badges por ter badges.
- Comentários que recontam ("// Obtém o usuário" acima de
getUser()), comentários históricos ("// Corrigido", "// Atualizado para X"), comentários em CAPS LOCK, marcações "IMPORTANT" sem explicação. - Cabeçalhos e comentários no estilo "🚀 Production Roadmap" e "(Premium Aesthetic)".
Substituição — fato: o que faz, por que é assim, qual a limitação.
2.5. Abstrações desnecessárias
- Interface ou fábrica com uma única implementação e sem mock nos testes.
- Camada, zona, pacote de monorepo, gerenciador de estado, Storybook sem consumidor ou sem motivo registrado (ADR, seção do README).
- Wrappers que apenas renomeiam (
useAuthApi = () => useStrictContext(Ctx)sem lógica — aceitável; wrapper sobre wrapper — não). - "Para o futuro": parâmetros que ninguém passa, opções de configuração com um único valor.
2.6. Erros e assincronicidade
- O tipo de erro é determinado pelo texto da mensagem (
message === "unauthorized",includes("invalid password")) — sem comentário de motivo e testes. - Apenas o primeiro elemento do array de erros é verificado (
errors[0]). throw { status, ... }— objeto em vez deError.catchvazio,catchretornando dados vazios,.catch(() => {}).- Promise in-flight compartilhada cujo resultado os esperadores não leem (refresh de token "esperamos, depois repetimos" sem verificar se foi bem-sucedido).
error.messagedo servidor é mostrado ao usuário como está.- Estados de carregamento, erro, lista vazia ausentes.
2.7. Segurança e privacidade
- Dados pessoais em logs: email, telefone, nome; tokens; corpos de requisições.
- Segredos no repositório ou no histórico (
git log -p),.envno índice, segredos com prefixoNEXT_PUBLIC_. - Redirecionamentos por parâmetro (
callbackUrl,next,returnTo) sem verificação, ou com verificação apenasstartsWith("/")/!startsWith("//")— permite/\.come caracteres de controle. - Tokens em
localStorage/sessionStorage; token na URL que não é removido da barra de endereços após a leitura. dangerouslySetInnerHTMLsem sanitizador.
2.8. UI
- Classes que não existem no tema: tokens copiados do shadcn/ui (
bg-card,text-muted-foreground,bg-primary) em um projeto sem esses tokens — componente silenciosamente sem estilos. - Valores HEX brutos e valores arbitrários em componentes quando existem tokens.
- Estado "campo preenchido" definido em
onChange: quebra com autopreenchimento ereset(). key={index}em listas mutáveis; botões semtypedentro de formulários; botões-ícone semaria-label.- SVG do layout com filtros (sombras, brilho) cortados pelo
viewBox— retângulo visível ao redor do logotipo.
2.9. Testes
- Testes que verificam mocks, não comportamento; snapshots de grandes árvores.
- e2e contra backend genérico ou de produção, alterando dados.
- Testes que passam apenas porque jsdom não aplica CSS (elemento "oculto" por classe, mas o teste o encontra), e seletores amplos (
/password/i, que também corresponde a "Mostrar senha").
2.10. Git
- Alterações não relacionadas em um único commit; commit "fix stuff".
- Arquivos gerados e artefatos de build no índice (exceto cliente de API gerado intencionalmente comitado).
- Mensagem de commit descreve algo diferente do diff.
3. Busca de candidatos
Comandos fornecem candidatos. Cada correspondência é verificada lendo o código.
# Modelos de geradores e marketing
rg -n -i "utm_source|get started by editing|give us a star|nx cloud|welcome to|carefully crafted|designed with" \
--glob '!**/node_modules/**' --glob '!*.lock' --glob '!pnpm-lock.yaml'
rg -n -i "premium|state-of-the-art|cutting-edge|blazing|lightning|seamless|robust|enterprise-grade|production-ready|premium|modern|powerful" \
--glob '!**/node_modules/**'
# Emojis em código, UI e documentação
rg -n --pcre2 '[\x{1F300}-\x{1FAFF}\x{2600}-\x{27BF}]' --glob '!**/node_modules/**' --glob '!*.lock'
# Inacabado
rg -n -i "not implemented|pending implementation|todo|fixme|hack" --glob '!**/node_modules/**'
# Erros frágeis
rg -n "errors\?\.\[0\]|errors\[0\]|message ===|message\.includes|\.includes\(['\"][a-z ]+['\"]\)" src app
rg -n "throw \{" src app
rg -n "catch \{\s*\}|catch \(\w*\) \{\s*\}|\.catch\(\(\) => \{\s*\}\)" src app
# Logs com dados pessoais
rg -n "(logger|console)\.\w+\(.*(email|phone|password|token)" src app
# Redirecionamentos e tokens
rg -n "callbackUrl|returnTo|redirectTo|searchParams.get\(['\"]next" src app
rg -n "localStorage|sessionStorage" src app
# Classes shadcn sem tokens: encontre classes e compare com @theme / configuração tailwind
rg -n -o "\b(bg|text|border)-(card|muted|popover|accent|primary|secondary|destructive)(-foreground)?\b" src app | sort -u
# Dependências e exportações não utilizadas (se knip estiver instalado)
pnpm dlx knip
# Segredos no histórico
git log -p --all | rg -n -i "(api[_-]?key|secret|password|token)\s*[:=]\s*['\"][A-Za-z0-9_\-]{16,}"
git ls-files | rg -n "(^|/)\.env($|\.)" | rg -v "\.env\.example$"
4. Formato do relatório
Achados em ordem decrescente de importância: segurança e privacidade → afirmações falsas na documentação → bugs de tratamento de erros → código morto e inacabado → modelos → tom.
<arquivo>:<linha> — <categoria>
O que: <uma frase: o que está errado, com o fato>
Por que é importante: <consequência para o usuário, revisor ou suporte>
Correção: <específica; na maioria das vezes "remover" ou "substituir pelo fato: …">
No final — o que foi verificado e não gerou achados, e o que não foi verificado (por exemplo, o aplicativo não foi executado). Se não houver achados, diga isso, sem observações forçadas.