🗣️ O que é Linguagem Ubíqua
Linguagem Ubíqua é um termo cunhado por Eric Evans em Domain-Driven Design (2003). A ideia é simples: time, código e documentação compartilham exatamente o mesmo vocabulário. Sem traduções entre "termo do negócio" e "termo técnico". Sem sinônimos. Sem ambiguidade. Uma palavra, um conceito.
No contexto de trabalho com agentes (Claude Code, Codex, Copilot), a linguagem ubíqua deixa de ser "boa prática" e vira infra-estrutura crítica. Cada termo ambíguo custa tokens, atenção e iterações. Cada termo bem definido reduz prompts em ordens de magnitude.
💡 Tip: a regra dos 20→1
A heurística prática é: se você precisa de 20 palavras pra explicar um conceito ao agente toda vez que ele aparece, esse conceito merece um nome. Defina-o no CONTEXT.md uma vez, e use o nome dali em diante.
O retorno é absurdo: você troca 20 tokens repetidos a cada turno por 1 token nomeado e uma linha de definição no contexto inicial.
Exemplo: "materialization cascade"
✗ ANTES (sem nome)
Toda vez que o bug aparecia, alguém escrevia no chat:
"Quando o usuário atualiza um campo derivado, todos os outros campos que dependem dele precisam ser recalculados em ordem, e se um falhar, os subsequentes ficam inconsistentes, e a gente precisa rodar de novo do topo..."
→ 40+ palavras, repetidas em 12 conversas diferentes.
✓ DEPOIS (com nome)
Definimos no CONTEXT.md:
materialization cascade: recálculo sequencial de campos derivados após mutação.
"O bug é na materialization cascade quando o passo 3 falha."
→ 12 palavras, zero ambiguidade.
📑 Anatomia do CONTEXT.md
O CONTEXT.md é o arquivo onde mora a linguagem ubíqua do seu projeto. É o primeiro arquivo que um agente lê quando começa a trabalhar. Estrutura mínima recomendada:
# MeuProjeto ## Language **materialization cascade**: recálculo sequencial de campos derivados após mutação de um campo-raiz. _Avoid_: "recálculo em cadeia", "refresh", "update propagation" **handoff**: documento estruturado escrito ao fim de uma sessão pra continuar contexto em outra. Não confundir com "resumo". _Avoid_: "summary", "transferência", "wrap-up doc" **flagged ambiguity**: termo ou comportamento ainda não definido que aparece >2x em conversas — candidato a virar entrada aqui. _Avoid_: "TODO", "open question" ## Decisions - Ver pasta /adrs para decisões arquiteturais. - Mudanças em Language exigem ADR se afetam código.
Seções obrigatórias
- •Language — termos do domínio
- •Decisions — ponteiro pros ADRs
- •Cabeçalho com nome do projeto
Seções opcionais (use quando útil)
- •Constraints — limites técnicos/regulatórios
- •Conventions — estilo, nomes de arquivos
- •Flagged Ambiguities — coisas a resolver
📐 O padrão "termo + Avoid"
Cada entrada de Language tem 2 partes: a definição positiva e a lista de sinônimos a evitar. Por quê? Porque sem isso, todo mundo (humano e agente) reintroduz o sinônimo em 2 semanas.
O Avoid é o que evita a entropia. É a regra que o agente cita quando você escreve "refresh" num PR e ele responde "você quis dizer materialization cascade?".
🏛️ ADRs (Architecture Decision Records)
Um ADR é um documento curto que registra uma decisão arquitetural: o que foi decidido, em que contexto, e quais as consequências. Cunhado por Michael Nygard em 2011. O formato vencedor é minimalista — 4 seções, 1 página.
🧱 Estrutura canônica de um ADR
- 1. Status — proposed / accepted / deprecated / superseded by ADR-NNN
- 2. Context — qual era a situação? Qual problema queríamos resolver?
- 3. Decision — o que decidimos fazer (frase ativa, presente).
- 4. Consequences — trade-offs assumidos, o que ficou pior, o que ficou melhor.
Exemplo: ADR-007 — Postgres em vez de Mongo
# ADR-007: Usar Postgres em vez de Mongo para o catálogo de produtos ## Status Accepted — 2025-11-12 ## Context O catálogo cresceu pra ~2M de itens com relações fortes (SKU ↔ variantes ↔ preços regionais ↔ promoções). Mongo nos forçou a duplicar dados pra evitar joins manuais, e a materialization cascade ficou frágil. Precisamos de JOINs nativos, transações ACID e queries analíticas ad-hoc. ## Decision Migrar o catálogo para Postgres 16. Mantemos Mongo apenas para session blobs (efêmeros, schema-less). ## Consequences + JOINs e CTEs viáveis; analytics direto no DB. + materialization cascade vira VIEW materializada (uma única fonte da verdade). - Migração custa ~3 semanas + 1 freeze de 4h. - Time precisa subir nível em índices Postgres. - 2 bancos em produção (overhead operacional).
💡 Tip: ADR é congelado, não editado
ADRs são imutáveis depois de aceitos. Mudou de ideia? Crie um ADR novo com status "supersedes ADR-007". Isso preserva a história — em 6 meses, quando alguém perguntar "por que escolhemos Postgres?", a resposta original ainda está intacta, junto com a justificativa da mudança.
🔥 Exemplo real: materialization cascade
Como uma equipe descobriu um bug, deu nome ao conceito, e viu o nome se propagar do CONTEXT.md até o código de produção em 2 semanas. História real, anonimizada.
Dia 0 — bug em produção
Sintoma: campos de preço final ficavam inconsistentes após mudança de imposto regional.
Cada engenheiro descrevia o bug com palavras diferentes: "cascade", "recalc bug", "chain refresh issue". Nenhum agente conseguia ajudar — o problema era invisível porque não tinha nome.
Dia 3 — batismo
Tech lead abre CONTEXT.md, escreve a entrada.
materialization cascade: recálculo sequencial de campos derivados após mutação de um campo-raiz. Avoid: cascade, recalc, refresh.
A partir desse momento, o Claude Code começa a usar o termo nas respostas. Em 24h, 4 PRs já citam "materialization cascade" no título.
Dia 7 — código renomeado
Refactor: refreshPrices() → runMaterializationCascade().
A função, a classe, o módulo, a métrica de Prometheus, o evento de log: tudo passou a usar o mesmo nome. Pesquisar "materialization cascade" no repo passou a retornar todos os pontos relevantes.
Dia 14 — ADR + decisão
ADR-007 nasce: substituir cascata imperativa por VIEW materializada no Postgres.
O agente, alimentado pelo CONTEXT.md + ADR, propõe o patch em uma única conversa. Sem que ninguém tenha que explicar o problema de novo. O termo virou alavanca.
📊 Métricas do antes/depois
- Antes: ~14 dias por iteração de fix, 3 PRs revertidos.
- Depois: 1 PR, mergeado em 36h, zero rollbacks.
- Tokens em prompts: queda de ~70% em conversas sobre o sistema de preços.
🔄 Manutenção contínua
Linguagem ubíqua não é um ato único — é uma prática. Sem manutenção, o CONTEXT.md vira fóssil em 3 meses: termos obsoletos, definições inconsistentes com o código, sinônimos voltando à vida. O ciclo saudável tem 4 batidas:
Cada feature nova → revisita o CONTEXT.md
Antes de codar, pergunte: "essa feature introduz algum termo novo? Algum termo existente muda de significado?". Se sim, atualize ANTES do código.
Flagged ambiguities → revisitar semanalmente
A seção "Flagged Ambiguities" lista termos que apareceram >2x sem definição clara. Uma vez por semana, alguém promove os mais usados a entradas formais.
Decisão importante → ADR novo
Sempre que uma mudança altera trade-offs ou supera uma decisão antiga, crie um ADR. Marque o antigo como "superseded by ADR-NNN" — nunca delete.
A linguagem evolui — você documenta a evolução
Termo aposentado? Marque "deprecated, substituído por X". Termo refinado? Atualize a definição com data. O CONTEXT.md é também a história semântica do projeto.
✓ Manter vivo
- ✓Atualizar junto com cada PR relevante
- ✓Revisar Flagged Ambiguities toda sexta
- ✓Citar o termo nos commits ("fix: materialization cascade reorder")
- ✓Linkar ADRs no PR description quando aplicável
✗ Deixar apodrecer
- ✗Criar e nunca mais abrir
- ✗Aceitar sinônimos nos PRs sem desafiar
- ✗Editar ADRs antigos em vez de criar novos
- ✗Deixar Flagged Ambiguities crescer indefinidamente
📈 Benefícios mensuráveis
Linguagem ubíqua não é estética — é alavanca operacional. Os 4 ganhos que aparecem em times que adotam CONTEXT.md + ADRs de verdade:
🎯 Os 4 benefícios concretos
-
1.
Nomes consistentes em toda a stack. Função, classe, log, métrica, dashboard, ticket e PR usam a mesma palavra. Buscar = encontrar.
-
2.
Código navegável por leigos. Um produto-manager lê o nome do método e entende o domínio. Onboarding cai de semanas pra dias.
-
3.
Menos tokens em thinking. O agente não precisa "inferir o que você quis dizer". Reduz prompts longos e elimina turnos de clarificação. Em projetos densos, queda de 40-70% no consumo.
-
4.
Alinhamento humano-agente. O Claude Code e o engenheiro usam o mesmo vocabulário. Pull request virou diálogo em pé de igualdade, não tradução.
🛠️ Exercício prático
Hora de fazer. O exercício tem 3 passos e leva ~15 minutos. Faça AGORA, antes de ir para o módulo 1.4.
🎯 Passo a passo
-
1.
Crie o arquivo
Na raiz do projeto atual (qualquer um — pode ser pessoal), crie
CONTEXT.mdcom o template da Seção 2. -
2.
Defina 3 termos do seu domínio
Pense em conversas recentes onde você precisou explicar a mesma coisa >1x. Esses são candidatos óbvios. Para cada termo, escreva: definição (1 frase) + Avoid (os sinônimos que você quer matar).
-
3.
Rode
/grill-with-docsNo Claude Code, rode o comando com algum plano ou ideia em mente. O grill vai usar seu CONTEXT.md como referência e desafiar inconsistências. Observe quantas vezes ele cita seus termos.
💡 Dica: comece pequeno, evolua semanal
Não tente listar 50 termos no primeiro dia — é receita pra abandonar o arquivo. Comece com 3, use por 1 semana, adicione 2-3 novos. Em 1 mês você terá um glossário vivo e útil em vez de um documento morto.
✅ Checklist do exercício
- ☐CONTEXT.md criado na raiz
- ☐3 termos com definição + Avoid
- ☐
/grill-with-docsrodado pelo menos 1x - ☐Observou diferença na resposta do agente?
📝 Resumo + Próximos passos
Próximo Módulo:
1.4 — Skills, sub-agentes e o ecossistema Claude Code