Como eu uso IA no desenvolvimento
Como organizo skills, AGENTS.md, agentes e regras no Cursor e Claude Code para desenvolver e escrever o blog, com humano no loop e sem prometer mágica.
A pergunta que mais ouço sobre IA no dia a dia não é “qual modelo você usa?”. É “como você organiza isso para não virar bagunça?”.
Eu uso IA o tempo todo, no código e neste blog. O que mudou a minha rotina não foi um prompt milagroso. Foi tratar o agente como alguém que entra no projeto sem contexto: se a regra não está em arquivo, ela não existe. Skills, AGENTS.md, agentes com papéis estreitos e eu revisando o resultado. Sem mágica.
Em outro post falei do Claude Code no fluxo de PRD a PR. Aqui o assunto é outro: o sistema de arquivos e papéis que montei neste repositório, e por que eu gastei tempo nisso.
O contrato, não o chat
A conversa com o modelo some. O repositório fica.
Quando abro uma sessão no Cursor ou no Claude Code, o agente precisa descobrir sozinho o que pode fazer, o que não pode e como o trabalho é entregue. Se isso depender da minha memória em cada chat, eu falho na segunda semana. Já falhei. Por isso o “contrato” vive em arquivos versionados:
| Arquivo / pasta | Papel |
|---|---|
AGENTS.md | Regras do domínio: português, frontmatter, categorias, tags, arquivos protegidos |
CLAUDE.md | Comandos Jekyll, estrutura do site, visão geral |
docs/agents/sdlc.md | Playbook de processo: grill, spec, tickets, implement, preview, ship |
.claude/agents/ | Personas (Writer, Reviewer, Content Analyst, Committer) |
.claude/skills/ | Runbooks passo a passo que os agentes executam |
.claude/commands/ | Atalhos de slash command que disparam os skills |
Regras do Cursor (~/.cursor/rules/) | Comportamento global: processo agentic e minimalismo |
O modelo lê. Eu reviso. O Git guarda. Parece óbvio escrito assim. Na prática, a maioria das pessoas ainda guarda a regra na cabeça ou num prompt favorito que ninguém mais encontra.
Duas camadas: processo e domínio
Misturar “como planejamos trabalho” com “como um post do blog deve ser” vira confusão. Separei em duas camadas porque já vi o agente tentar as duas coisas no mesmo turno.
Processo (SDLC agentic)
Para mudança de site, plugin, automação ou refactor que não é typo, o fluxo é explícito:
- Clarificar: entrevistar decisões abertas antes de travar desenho
- Especificar: PRD com problema, solução, histórias, decisões de teste e fora de escopo
- Fatiar tickets: fatias verticais demoáveis, com critérios de aceite e bloqueios
- Implementar: um ticket por vez, com TDD nos seams combinados
- Revisar com humano: diff e review, não merge silencioso
- Preview local: o agente sobe o Jekyll e espera aprovação antes de abrir PR
- Ship: só depois do meu “ok”
Skills de processo ficam no nível do usuário (~/.claude/skills/, ~/.cursor/skills/), não copiados para dentro de cada app. O playbook do projeto aponta para eles. O corpo do skill não fica duplicado no repo.
Domínio (conteúdo do blog)
Writer, Reviewer, Content Analyst e Committer seguem AGENTS.md e os skills em .claude/. Eles não inventam SDLC paralelo. Se o pedido de post vira mudança de tema ou CI, a gente muda de trilha e volta ao playbook de processo.
Essa divisão existe por um motivo bem concreto: já peguei agente “melhorando” o _config.yml no meio de um post. Nego isso em arquivo e em hook.
Skills: runbooks, não prompts soltos
Skill, para mim, não é um texto genérico de “seja um especialista”. É procedimento: entradas, passos, checagens, saída esperada.
Boa parte dessa forma de pensar veio do trabalho do Matt Pocock com skills para engenheiros: skills como arquivos reais no disco, pensados para o agente executar, não como prompt favorito perdido no chat. Eu adaptei a ideia ao blog e ao meu fluxo; o crédito da abordagem original é dele.
Neste blog, quatro skills cobrem o ciclo editorial.
write-post
Lê os três posts mais recentes para calibrar tom. Propõe título, slug, categorias, tags e description. Gera frontmatter canônico. Escreve o corpo em pt-BR. Valida acentuação, estrutura e tamanho. Se eu pedir, encadeia o Reviewer.
review-post
Somente leitura. Checklist de frontmatter, nome de arquivo, existência da imagem de header, acentuação portuguesa, headings, links e SEO. Relatório em ERROS, AVISOS e SUGESTÕES. Nunca edita o post. Isso importa: se o revisor também “conserta”, eu perco o rastro do que era achado e do que era edição.
analyze-content
Inventário de _posts/, gaps de publicação, cobertura por categoria e tag versus o foco do site, e sugestões concretas de temas. Também só leitura. Uso quando estou sem ideia e não quero inventar tema no vazio.
commit
Inspeciona a árvore, filtra arquivos protegidos, roda as checagens obrigatórias e cria commit convencional. Não faz push. Nunca usa git add .. Eu ainda escolho o que entra.
Os commands em .claude/commands/ são wrappers finos: /write-post, /review-post, /analyze-content, /commit. A inteligência está no skill. O command só dispara o fluxo.
Agentes com papéis estreitos
Um único agente “faz tudo” mistura escrita com commit e com refactor. Prefiro personas pequenas:
- Writer cria o post e pode chamar o Reviewer depois
- Reviewer só reporta e não toca no arquivo
- Content Analyst olha inventário e lacunas
- Committer faz o commit depois das checagens
O Writer declara no próprio arquivo quais tools e skills usa. O Reviewer declara que é read-only. Não acho isso burocracia. Acho API humana para o modelo. Se a fronteira não está escrita, o modelo improvisa.
Arquivos protegidos e ganchos
Confiança sem freio quebra o site. Em .claude/settings.json nego edição de _config.yml, LICENSE, Gemfile e Gemfile.lock. Um hook PreToolUse bloqueia Write e Edit nesses paths.
No AGENTS.md a regra aparece de novo, em texto: não alterar esses arquivos, não mexer em _plugins/ sem pedido explícito, não push direto em main.
O skill de commit reforça a mesma coisa. Se algum protegido estiver sujo na árvore, avisa e não inclui no commit. Redundância de propósito. Uma camada falha, outra segura.
Minimalismo: escrever menos código certo
Processo sozinho vira fábrica de abstrações. A outra regra que carrego é o oposto do hype de “gerar mais”:
- Precisa existir?
- Já existe neste codebase?
- A stdlib resolve?
- Uma linha resolve?
- Só então: o mínimo que funciona
Corrigir o sintoma em cinco call sites é pior que um guard na função compartilhada. Abstração que ninguém pediu não entra. Atalho consciente ganha um comentário ponytail: com o teto conhecido e o caminho de upgrade.
IA útil, neste modo, é a que deleta e reusa. Não a que inventa um framework no meio do post porque “ficou mais limpo”.
Um dia típico no blog
Quando vou publicar aqui, o fluxo costuma ser este:
1
2
3
4
5
6
7
/analyze-content → "o que falta cobrir?"
/write-post <tema> → rascunho + frontmatter
/review-post <arquivo> → ERROS / AVISOS
(humano edita voz e fatos)
bundle exec jekyll serve → preview em http://localhost:4000
/commit → commit convencional, sem push
(humano aprova) → PR → merge
O preview é onde eu corto o romantismo. O agente sobe o servidor (ou reusa um que já está saudável), passa a URL e para. Sem o meu “ok”, não tem PR. Se for só docs, mostrar o diff e esperar também conta.
Um dia típico em código ou no site
Para feature ou refactor:
1
2
3
4
5
6
7
grill (decisões abertas)
→ PRD (issue + cópia em .scratch/)
→ tickets verticais (cada um demoável)
→ implement + tdd no seam combinado
→ code-review com humano
→ jekyll serve / build + htmlproofer
→ só então PR
Tickets pequenos cabem melhor numa janela de contexto fresca. Prefactors entram primeiro. Refactors largos usam expand-contract. Se o desenho ainda está em aberto, a gente grila antes de travar. Parece lento. Na prática, evita o retrabalho de três PRs que resolvem o problema errado.
O que os arquivos realmente dizem ao agente
Trecho típico do contrato de domínio, o tipo de coisa que evita post sem description ou categoria inventada:
1
2
3
4
5
6
7
8
9
10
11
---
layout: post
title: "Título do Post em Português"
description: "Descrição para SEO com 150-160 caracteres"
date: YYYY-MM-DD
categories: [Categoria1, Categoria2]
tags: [tag1, tag2, tag3]
image:
path: /assets/img/headers/nome-do-arquivo.ext
alt: Descrição da imagem
---
E regras que economizam retrabalho:
- Conteúdo novo em pt-BR com acentuação correta
- Heading de conteúdo começa em
##(o Chirpy já usa o título do frontmatter como<h1>) - Categorias e tags contra um registro aprovado; valor novo precisa de confirmação humana
- Checagem de acentuação com
grepde palavras comuns sem acento antes do commit
Nada disso é sofisticado. É repetível. Agente sem registro inventa tag. Com registro, pergunta. Eu prefiro a pergunta.
Onde eu fico no loop
HITL aqui não é slogan de palestra. São pontos em que eu paro o fluxo de propósito:
- Antes de travar desenho, quando há trade-off real
- Depois do diff, porque review humano pega o que o lint do modelo não pega
- No preview, olhando a página renderizada
- Antes do ship, com aprovação explícita para PR ou merge
- No Reviewer de conteúdo: o agente não “conserta” sozinho; eu decido o que aceitar
O modelo erra com confiança. Já vi frontmatter bonito com fato errado, YAML de exemplo que nunca rodou e tom de artigo genérico que eu não escreveria. O contrato reduz a superfície de erro. Não elimina a obrigação de ler.
Se você leu o que acontece quando você conversa com uma IA, sabe o ponto: o sistema otimiza fluência, não verdade. Arquivo, skill e humano é a minha resposta prática a isso no desenvolvimento.
O que eu deliberadamente não faço
Não deixo o agente dar push em main. Não confio em “gere um PRD” sem olhar o código e o histórico. Não meço sucesso por linhas geradas. Não escondo o custo de setup: escrever skills e AGENTS.md leva tempo, e o tempo volta na forma de menos retrabalho, não de mágica. Também não trato MCP, plugins e hype de ferramenta como substituto de processo.
Ferramenta ajuda. Contrato escala. Processo sem disciplina vira teatro.
Como começar sem copiar meu setup inteiro
Se quiser o mínimo útil:
- Um
AGENTS.md(ou equivalente) com linguagem, arquivos protegidos e formato de entrega - Um skill de “fazer a coisa principal do repo” com checagens no final
- Um skill de review somente leitura
- Uma regra: preview ou demo antes de PR
- Uma regra: menor mudança correta, sem abstração pedida pelo ego do modelo
Para ver skills prontos e o formato que eu usei de referência, comece pelo repositório do Matt: github.com/mattpocock/skills. Depois você especializa. Writer, Reviewer e Analyst só fazem sentido quando o volume de conteúdo ou o risco de inconsistência justifica. No começo, um skill bom e um humano atento vencem um organograma de agentes vazios.
O que ainda falha
Este setup continua sendo trabalho. Skills desatualizam. Registro de tags drift. Branch de bootstrap de docs pode estar à frente do que está em main. O agente às vezes ignora o playbook se o meu prompt for ambíguo. Aí a culpa é minha por não apontar o arquivo certo.
Também não resolve produto ruim, requisito confuso ou falta de testes. Só torna o caminho do chat até o merge mais auditável. Isso já me basta na maior parte dos dias.
Fechando
Uso IA no desenvolvimento mais ou menos como uso CI: com pipeline, gates e artefatos. A diferença é que os artefatos são markdown (skills, agentes, AGENTS.md, playbook) e o gate final continua sendo uma pessoa olhando a página ou o diff.
Se você já tem Claude Code ou Cursor e sente que cada sessão começa do zero, pare de colecionar prompts. Escreva o contrato. Transforme o fluxo que você já faz bem em skill. Separe processo de domínio. Exija preview. Delete o que o modelo inventou sem pedido.
O restante é prática. E um grep de acentuação antes do commit, porque eu já publiquei a palavra sem til mais vezes do que admito.
