uxskill
Star on GitHub
Blog · Português · 2026-05-28

Regras de design para AI coding, por que toda IA produz a mesma UI?

Cursor, Claude Code, Cline, Windsurf, toda ferramenta de AI coding cai no mesmo conjunto de padrões. Inter 90px no título, gradiente roxo-azul, três cards iguais lado a lado. Troca o modelo, a saída praticamente não muda. ux-skill é um engine Python open source (licença MIT) com 145 regras determinísticas que barram slop no CI. Sem chamada de LLM, sem token gasto, sem telemetria.

Por que toda IA escreve a mesma UI

Não é limitação do modelo. Claude Sonnet, GPT-4, DeepSeek, Gemini, qualquer modelo grande consegue escrever UI muito boa se receber o briefing certo. O problema é que ninguém entrega briefing. "Construa uma landing page de SaaS" leva o modelo a regredir para a média do dataset de treinamento, e essa média parece uma landing page de startup de 2023.

Três forças combinadas reforçam essa impressão digital. Primeira, o corpus de treinamento dos modelos pesa para fontes populares, Vercel, Linear, Stripe, Tailwind UI, shadcn, e todas elas compartilham a mesma estética. Segunda, o prompt do usuário é curto demais, "build a hero section" não produz nada específico. Terceira, não há gating, nada barra o modelo quando ele entrega o mesmo gradiente velho pela centésima vez.

Das três forças, duas são difíceis de corrigir, você não controla o corpus de treinamento, e o hábito de escrever prompts de 500 palavras não se sustenta num time inteiro. A terceira, gating, é um problema de nível mecânico. É exatamente isso que ux-skill resolve.

Os oito padrões que toda ferramenta entrega

Rodamos o mesmo briefing, "hero para produto fintech editorial, tema escuro, voz calma", em oito ferramentas diferentes de AI coding (Cursor, Claude Code, Windsurf, GitHub Copilot, Cline, Continue, Codex, Aider). Sete das oito produziram saídas com pelo menos cinco dos oito padrões abaixo:

  1. Inter como fonte de display: Inter é uma fonte body ajustada para tamanhos pequenos; usada a 90px como título, lê como impressão digital de startup-landing.
  2. Gradiente roxo-para-azul: os mesmos dois códigos hex em todo lugar, sinal quase universal de saída AI de SaaS-startup.
  3. Três cards iguais em uma linha: bloco de features, gap-6, sempre ícone-título-parágrafo.
  4. CTA genérica: "Get started", "Learn more", "Click here". A regra generic-cta-text captura.
  5. Fade-in-up em cada filho direto: mesmo perfil de movimento em hero, features e footer; nenhuma diferenciação por papel.
  6. Verbos vazios de marketing: verbos de marketing genéricos nos títulos. A regra filler-marketing-verbs captura.
  7. Nomes de placeholder: nomes dummy genéricos e parágrafos stub que vazam de staging para produção.
  8. Eixo de tudo-no-centro: layout simétrico independentemente do conteúdo; nenhuma composição assimétrica ou bento.

A lista completa está em 35 impressões digitais de design AI, cada regra com regex de detecção, o "porquê" e o "como corrigir". O ponto que vale repetir: trocar o IDE não muda a saída de forma significativa. Trocar a gramática de design muda.

ux-skill, a camada determinística

ux-skill é um pacote Python open source (MIT), com CLI e servidor MCP. Um mesmo engine, um mesmo catálogo de 998 entradas, um mesmo linter de 145 regras. Três caminhos de instalação cobrem 17 IDEs:

  1. Plugin do Claude Code: /plugin marketplace add Laith0003/ux-skill; /plugin install ux@ux-skill
  2. Pacote Python: pip install uxskill, em qualquer IDE que rode shell: Cursor, Windsurf, Continue, Cline, JetBrains, Aider, Zed, Codex
  3. Servidor MCP: npx uxskill@alpha mcp, plugável em qualquer cliente MCP

O engine tem três ações principais. Um, uxskill discover roda o protocolo de discovery de 10 campos para capturar um briefing estruturado (sem improvisação, o discovery protocol é requisito rígido). Dois, uxskill recommend roda cinco buscas paralelas sobre as 998 entradas do catálogo e devolve um sistema de design resolvido (paleta, par de fontes, motion, grid de espaçamento, lista de componentes). Três, uxskill lint roda as 145 regras regex no código. Exit 0 se limpo, exit 1 se houver finding no threshold.

Uma regra real, Inter como display

Essa é a regra número um do manifesto de 145, direto do data/anti-patterns.json. Severidade high:

// 1 das 145 regras
{
  "id": "inter-as-display",
  "severity": "high",
  "category": "Typography",
  "detection": {
    "type": "regex",
    "pattern": "font-family:\s*['\"]?Inter['\"]?[^;}]*[;}][^{]*(?:font-size:\s*([4-9]\d|\d{3,})px|\btext-(5xl|6xl|7xl|8xl|9xl)\b)",
    "scope": ["css", "scss", "tsx", "jsx", "vue", "html"]
  },
  "why": "Inter é uma fonte body ajustada para legibilidade em tamanhos pequenos;
          usada como display ela lê como a impressão digital startup-landing.",
  "fix": "Pareie Inter (body) com uma display face distinta:
          Geist, Satoshi, Cabinet Grotesk, General Sans, Outfit."
}

O regex procura font-family: Inter e, no mesmo bloco, font-size a partir de 40px ou classe Tailwind text-5xl (ou maior). O campo scope limita a regra às extensões relevantes. Uma única regra funciona em CSS, SCSS, TSX, JSX, Vue, Astro, Blade.

Rodando no CI, GitHub Actions

Um arquivo de workflow, cada PR push é barrado pelo linter se houver finding no threshold. Média no repo todo: 380ms (cold), 90ms (warm). Sem chamada de LLM. Sem token gasto.

# .github/workflows/ux-lint.yml
name: ux-lint

on:
  pull_request:
    paths:
      - '**/*.{tsx,jsx,vue,css,scss,html,astro,blade}'

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with: { python-version: '3.11' }
      - run: pip install uxskill
      - run: uxskill lint --threshold high

O que tem dentro das 998 entradas do catálogo

LaneQtdConteúdo
Indústrias161De logística a legaltech; cada uma com perfil de voz padrão e set de padrões.
Estilos50Editorial cinema, swiss minimal, brutalist warm, mid-mod, neo-pop.
Paletas161Sistemas de cor: hue, saturação, contraste, tratamento dark-mode.
Pares de fonte57Combinações display + body, validadas para renderização em tela.
Motion presets57Framer Motion, GSAP, CSS: com ramos prefers-reduced-motion.
Componentes182De cards a dialogs a dashboards, com regras de composição.
Brand specs110Gramática de marcas reais como Stripe, Airbnb, Vercel.
Anti-patterns145As 145 regras do linter. Mesmo JSON, dois consumidores.
Outras taxonomias120Perfis de densidade, voice register, deltas para RTL.
Total998Uma árvore JSON. recommender, linter e servidor MCP a leem.
Em uma codebase assistida por IA, o linter é a única superfície determinística. Toda outra checagem é probabilística.

Por que regex, e não um LLM-juiz

A alternativa comum é usar um LLM como "juiz", pedir ao Claude ou ao GPT para avaliar a saída, aceitar a nota, reexecutar quando baixa. Esse caminho tem três problemas que se acumulam com o uso.

Um, não é determinístico. Para o mesmo input, o juiz dá notas diferentes entre execuções. Falhas de CI viram flakes, contribuidores aprendem a reexecutar em vez de corrigir, o sinal colapsa.

Dois, é caro. Cada PR push gasta token. Cada retry dobra a conta. Um repo de 200 PRs por semana rodando juiz de LLM no diff está pagando por compute para confirmar o que um regex captura em 12 milissegundos.

Três, esconde a regra. Quando o juiz reprova um PR, o autor recebe prosa. Quando o regex reprova, o autor recebe um padrão concreto contra o qual comparar o próprio código e aprender. O primeiro cria cultura de apelação; o segundo cria cultura de fluência.

A comparação honesta, estrelas no GitHub

Três projetos open source sérios na categoria bolt-on. Estrelas em 2026-05-28:

ProjetoStarsRecommenderLinterMCPCatálogo
ui-ux-pro-max84kSimNãoNão~600
taste-skill25kSimNãoNão~480
ux-skill14Sim145 regras14 tools998

ux-skill é o menor em estrelas (14) e o maior em superfície de funcionalidades. 998 entradas no catálogo, 145 regras regex que rodam no CI como exit não-zero, servidor MCP com 14 tools que alcança 17 IDEs, 22 comandos, 160 brand specs como gramática de referência, 75 testes. ui-ux-pro-max e taste-skill ambos entregam um recommender. ux-skill entrega recommender + linter + MCP. É um lance assimétrico.

Onde isso encaixa no time brasileiro de produto

Times de produto no Brasil que usam Cursor ou Claude Code têm o mesmo problema: a velocidade de codar com IA é real, mas o output regride para o mesmo conjunto de fingerprints SaaS-startup. O linter no CI corta esse caminho. Cada PR que sobe com Inter a 90px, com o gradiente roxo-azul, com os três cards padrão, falha o exit code. O time aprende a gramática da casa porque cada erro vem com a regra concreta e o fix sugerido, não com uma descrição vaga.

Para times que escrevem em português, há um benefício adicional: as regras de marketing-verb são em inglês porque o corpus de treinamento dos modelos é em inglês, mas o engine não impede que o conteúdo final seja em português. Você ganha o filtro contra o vocabulário de marketing dos modelos sem perder a voz da sua marca. As 160 brand specs incluem várias marcas que operam em mercados não-anglófonos com gramática própria, a referência funciona.

Escopo honesto

Regex captura impressões digitais estruturais, não taste.

O linter nunca vai dizer "este bloco está no ritmo errado" ou "este copy está frio". Para isso, é preciso um humano ou um modelo. O que o regex captura é toda impressão digital com token, padrão ou forma literal, e essa é a maior parte dos defaults da IA, porque o modelo volta ao mesmo artefato a cada vez.

Não rodamos LLM-juiz no CI de propósito. Se o seu critério é "parece feito por designer", isso é code review, não lint. ux-skill entrega /ux-critique para o passe de taste, mas roda no IDE, sob demanda, e não no CI.

O que ler em seguida

Para ver o manifesto completo de 145 regras com antes/depois em um hero Next.js real, leia o post sobre regex linter. Para a taxonomia completa com regex de detecção de cada regra, leia o post das 35 impressões digitais de design AI. Para o ranking 2026 de ferramentas de AI coding por qualidade de design, leia o ranking anti-AI-slop.

Leituras relacionadas

Instalar

Um pacote. Três caminhos. 145 regras.

Recommender, linter, servidor MCP, 22 comandos, 160 brand specs, tudo junto. Linter em sub-segundo, o resto sob demanda. Licença MIT, sem telemetria, sem conta.

$ /plugin marketplace add Laith0003/ux-skill
$ /plugin install ux@ux-skill
· ou ·
$ pip install uxskill
· ou ·
$ npx uxskill@alpha init