Spec-driven development no Cursor: como escrever a spec antes de pedir o código
Spec-driven development no Cursor é escrever o escopo antes do prompt: qual problema resolver, o que fica de fora e quais são os critérios de aceite. Na prática, a spec vira arquivo de contexto no projeto: a regra mora em .cursor/rules com extensão .mdc, o frontmatter usa description, globs e alwaysApply, e o AGENTS.md na raiz guarda a instrução persistente. Aí você abre o Plan Mode com Shift + Tab, revisa e corta o plano em Markdown, salva em .cursor/plans/ e só então libera o agente. Menos entrega fora do escopo, menos retrabalho 🙂
O agente entrega em trinta segundos aquilo que você não pediu, e lá se vão duas horas desfazendo
Fala aí, beleza? Se você já roda o Cursor no dia a dia, conhece a cena: pedido vago, agente animado, dez arquivos alterados e uma feature inteira que ninguém encomendou 😅
O problema quase nunca é o modelo, é o pedido
Spec-driven development no Cursor é inverter essa ordem: você escreve a especificação antes do prompt, deixando registrado o que é escopo, o que NÃO é escopo e como saber que a coisa ficou pronta
Neste post eu mostro como encaixar esse fluxo com o que o editor já tem: arquivos de contexto em .cursor/rules, o AGENTS.md na raiz, o Plan Mode e uma revisão final contra critérios de aceite
Um aviso honesto antes de seguir: não existe um botão chamado "spec" no Cursor… o que existe é Rules, AGENTS.md e Plan Mode, e o método é montado em cima desses três, mais a sua revisão contra os critérios de aceite no fim
O que você precisa antes de escrever a spec
Checklist curtinho, nada de PC da Nasa aqui:
- Projeto sob controle de versão: as Project Rules vivem em
.cursor/rules, dentro do repositório, versionadas junto do código. Ou seja, a spec anda com o projeto e o time inteiro pega ela nogit pull - Noção de onde cada camada de instrução mora: são três camadas (Project Rules, User Rules, que são globais do seu ambiente, e Team Rules, gerenciadas pelo dashboard do time), além do
AGENTS.mdna raiz, que o Cursor lê nativamente junto das outras - A decisão de qual tipo de ativação a regra vai usar, tomada antes de escrever o arquivo
"Tipo de ativação?" É o dropdown que muda os campos do frontmatter e define quando aquela regra entra no contexto. São quatro, segundo a documentação de regras do Cursor:
| Tipo de ativação | Quando a regra entra |
|---|---|
| Always Apply | Em toda sessão |
| Apply Intelligently | O Agent decide pela description |
| Apply to Specific Files | Quando o arquivo casa com o globs |
| Apply Manually | Só quando é @-mencionada no chat |
Formação Vibe Coding
Do Prompt ao Produto: Crie Software Real com IA
- 474 aulas
- 20 projetos
- 39h 27min
Como escrever a spec antes de pedir o código no Cursor (passo a passo)
- Escreva o documento de escopo antes de abrir o chat
Três blocos, sem enfeite: o problema, o que está fora de escopo e os critérios de aceite em formato verificável
Critério verificável é aquele que alguém consegue conferir olhando a tela ou rodando o código, sem opinião no meio
O erro comum deste passo: escrever desejo no lugar de critério. "A tela tem que ficar boa" não dá pra verificar; "ao enviar o formulário sem e-mail, exibir erro no campo e não chamar a API" dá
Importante: o Cursor não reconhece nenhum formato mágico de critério de aceite. Isso aqui é prática de redação sua, não recurso do produto
- Crie a regra dentro de
.cursor/rulescom extensão.mdc
A estrutura fica mais ou menos assim no repositório:
meu-projeto/
AGENTS.md
.cursor/
rules/
escopo-checkout.mdc
src/
O erro comum deste passo: salvar como .md. Um .md simples dentro de .cursor/rules é ignorado pelo sistema de regras, porque ele não tem o frontmatter de description, globs e alwaysApply. A extensão obrigatória é .mdc, e eu já vi gente jurar que "o Cursor não lê minhas regras" só por causa dessa letrinha
- Preencha o frontmatter e escolha o tipo de ativação
O frontmatter YAML da regra .mdc usa exatamente três campos:
---
description: Escopo e critérios de aceite do checkout
globs: src/checkout/**
alwaysApply: false
---
## Escopo
Ajustar apenas o fluxo de pagamento em src/checkout
## Fora de escopo
Não alterar o carrinho, não trocar a stack, não criar novas dependências
## Critérios de aceite
1. Cartão recusado exibe mensagem no formulário e mantém os dados preenchidos
2. Nenhum arquivo fora de src/checkout é modificado
O erro comum deste passo: deixar alwaysApply: true achando que os globs continuam filtrando. Não continuam. Com alwaysApply: true, os campos globs e description são ignorados e a regra entra sempre. Se você quer a regra anexada só quando um arquivo correspondente está no contexto, o combo é alwaysApply: false com globs preenchido
- Use o
AGENTS.mdna raiz pra instrução persistente do projeto
O Cursor lê o AGENTS.md da raiz nativamente, junto de Project, Team e User Rules, seguindo a especificação aberta do arquivo
Pense nele como o "leia isso antes de encostar no projeto": convenções, o que nunca deve ser mexido, como as pastas estão organizadas
O erro comum deste passo: transformar o arquivo em depósito de tudo. O conteúdo de uma regra aplicada é inserido no INÍCIO do contexto do modelo, então texto morto ali não é decoração, é peso em toda sessão
- Abra o Plan Mode com
Shift + Tabe deixe ele perguntar
No campo de input do agente, Shift + Tab liga o Plan Mode: o agente pesquisa o codebase, faz perguntas de esclarecimento e entrega um plano revisável antes de sair implementando
Se você já usa o modo de plano no Claude Code, a ideia é a mesma: separar o "pensar" do "escrever"
O erro comum deste passo: responder as perguntas de esclarecimento na pressa, no modo "tanto faz, pode seguir". Cada resposta vaga aí vira decisão inventada lá na frente
- Edite o plano em Markdown, é aqui que você corta o excesso
O plano gerado vira um arquivo Markdown editável, com file paths e code references, e você pode adicionar ou remover itens da lista de tarefas. Ele também suporta diagramas Mermaid inline, gerados dentro do próprio plano
Passe o olho item por item e apague tudo que não estava no seu documento de escopo
O erro comum deste passo: aprovar de bater o olho. Todo to-do que sobra vira código que alguém vai revisar depois
- Salve com "Save to workspace" e versione
Esse botão grava o plano na pasta .cursor/plans/ do projeto
Aí o plano deixa de ser papo de chat e vira artefato do repositório, que sobrevive ao fechamento da sessão e entra no code review
- Puxe o contexto certo na hora de executar, com @ mentions
O Cursor usa @ mentions pra trazer contexto específico pro chat. Entre os símbolos disponíveis estão @Files, @Folders, @Code, @Docs, @Git, @Past Chats, @Cursor Rules, @Web, @Link, @Recent Changes e @Lint Errors
Na prática: aponta o plano, aponta a regra com @Cursor Rules, aponta as pastas que ele pode tocar
O erro comum deste passo: mandar executar sem apontar nada e torcer pro agente adivinhar onde a coisa mora
- Revise a entrega contra os critérios de aceite do passo 1
Não contra a sua memória do que você queria, contra o texto escrito lá atrás
Critério que não passa é tarefa não concluída, e não "quase lá"
Como isso funciona na prática: o método rodando num projeto real
Esse fluxo eu rodei num projeto meu, com o Claude Code, o agente que mais uso hoje. A tela muda de produto pra produto, a ordem não: spec primeiro, agente depois
O fluxo foi esse: primeiro eu montei a documentação em arquivos separados, requisitos, design e tarefas, e só DEPOIS abri o agente
São os mesmos blocos do passo 1, só espalhados em arquivos: o escopo e os critérios de aceite moram no de requisitos, o fora de escopo vira restrição explícita no design e no prompt de regras, e a ordem de execução vira o de tarefas
Pedi que ele lesse os documentos e gerasse um arquivo de contexto condensado, porque sem isso o conhecimento se perde quando a sessão fecha, e a versão resumida ainda gasta menos token
O prompt de regras que eu uso ali manda seguir exatamente os documentos, não adicionar funcionalidade fora dos requisitos, não mudar a stack definida no design e executar uma tarefa por vez
Na hora de executar eu referencio a tarefa pelo número do documento de tarefas e peço pro agente PARAR quando terminar. Mesmo que o modelo tenda a parar sozinho, eu prefiro ser explícito a ser implícito
A sequência rodou tarefa a tarefa: setup do projeto, depois autenticação, depois o gerador de QR code
A autenticação saiu em cerca de 2 minutos, e no fim eu subi o projeto na porta 3002, gerei um QR code, baixei o PNG e escaneei pra confirmar que abria a minha plataforma mesmo 🙂
Dois números de UMA demonstração, na minha máquina, num projeto pequeno: isso é observação, não é benchmark, e eu não vou te vender como promessa
O que eu senti de verdade ali: a etapa inicial é mais demorada, escrever a spec dá trabalho
Mas depois que a base está documentada os prompts ficam curtos e simples, porque não é mais preciso caprichar em cada pedido, e as tarefas seguintes ficam mais rápidas e previsíveis
Minha régua prática pra decidir se compensa: se o projeto passa de três prompts, ou se já dá pra prever autenticação, pagamento, perfis de usuário e dashboard, então vale aplicar SDD. Pra uso pessoal simples, nem sempre precisa
No vídeo eu mostro também uma alternativa automatizada, um framework que faz perguntas sobre o sistema e cria a estrutura de documentos sozinho, em fases, em vez de você escrever os arquivos à mão. Se for por esse caminho, minha recomendação é ler o repositório e comparar as versões antes de adotar
Veja o fluxo completo em vídeo
No vídeo abaixo você vê a documentação sendo montada, o arquivo de contexto condensado sendo gerado e as tarefas saindo uma a uma até o QR code funcionar de verdade
A spec foi ignorada pelo agente: o que checar
Escreveu a regra, o agente fez o que quis, e agora? Três casos que aparecem sempre
1. A regra nunca entra no contexto
Sintoma: o agente age como se o arquivo não existisse, em qualquer conversa
Causa: o arquivo foi salvo como .md dentro de .cursor/rules. Um .md simples é ignorado pelo sistema de regras, ele não tem o frontmatter de description, globs e alwaysApply
Correção: renomeie pra .mdc e preencha o frontmatter
2. A regra entra sempre, até onde não deveria
Sintoma: uma regra específica de uma pasta aparece influenciando tarefa que não tem nada a ver
Causa: alwaysApply: true sobrepõe globs e description, então a regra entra em toda sessão
Correção: troque pra alwaysApply: false com globs preenchido, assim ela é anexada só quando um arquivo correspondente está no contexto
3. A regra existe, mas não é puxada na conversa certa
Sintoma: às vezes funciona, às vezes não, e você jura que não mudou nada
Causa: a ativação está em Apply Manually, que só entra quando a regra é @-mencionada no chat
Correção: mencione com @Cursor Rules naquela conversa, ou troque o tipo de ativação no dropdown
E a prevenção pros três: lembre que o conteúdo da regra aplicada é inserido no início do contexto do modelo. O que está escrito ali pesa na sessão inteira, então regra enxuta e específica rende mais que manifesto de dez páginas
Quando vale escrever a spec antes (e quando é só burocracia)
Vale a pena quando:
- A feature toca vários arquivos e você já consegue prever o efeito colateral
- É refactor com regra de negócio no meio, daqueles em que "funciona" não basta
- Outra pessoa vai revisar o código, e o plano salvo em
.cursor/plans/vira histórico de decisão versionado junto - O projeto é novo e já nasce com múltiplas features, banco de dados e API
É só burocracia quando:
- É ajuste de uma linha, um texto, um espaçamento
- Você está explorando, ainda sem saber o que quer
- É protótipo descartável, daqueles que morrem sexta à noite
Em time tem duas peças que se encaixam bem aqui: as Team Rules, gerenciadas pelo dashboard do time, e as Agent Skills, definidas em arquivos SKILL.md, que o agente invoca quando são relevantes
E tem um detalhe que aumenta o valor da spec: o Cursor 3, disponível desde 2 de abril de 2026, executa vários agentes em paralelo entre repositórios e ambientes. Quanto mais agente rodando ao mesmo tempo, menos você consegue vigiar prompt por prompt, e mais o escopo escrito faz o trabalho por você
O Plan Mode, aliás, já vinha apanhando melhoria antes disso, nos changelogs 2.1 e 2.2
Próximo passo: escreva a spec do seu próximo commit
A ideia central é simples e chata de aceitar: o escopo escrito ANTES é o que evita o retrabalho depois
Não tem prompt mágico que substitua isso, e quem já refez feature inteira porque "faltou combinar" sabe do que eu tô falando 😅
Próximo passo pequeno, pra hoje mesmo: pega a próxima tarefa da sua fila, escreve os critérios de aceite dela, cria uma regra .mdc em .cursor/rules, abre o Plan Mode com Shift + Tab e salva o plano no workspace antes de deixar o agente escrever a primeira linha
Depois me conta nos comentários o que quebrou no seu fluxo: regra ignorada, plano aprovado com pressa ou agente saindo da curva mesmo com tudo documentado?
Até o próximo post!
Perguntas frequentes
Spec-driven development é a mesma coisa que o Plan Mode do Cursor?
Não. Spec-driven development é o método de escrever escopo, fora de escopo e critérios de aceite antes de qualquer prompt. O Plan Mode é o recurso do Cursor que entra depois, pesquisando o codebase e gerando um plano revisável a partir dessa spec.
Por que a regra de projeto no Cursor precisa ser .mdc e não .md?
Porque o .md simples não tem o frontmatter com description, globs e alwaysApply, e por isso é ignorado pelo sistema de regras. Só o arquivo com extensão .mdc dentro de .cursor/rules é reconhecido como Project Rule.
Se eu deixar alwaysApply como true, os globs da regra ainda funcionam?
Não. Quando alwaysApply está true, os campos globs e description são ignorados e a regra entra em toda sessão. Pra regra ser anexada só quando um arquivo do glob está no contexto, o certo é alwaysApply: false com globs preenchido.
Qual a diferença entre Project Rules, User Rules e Team Rules no Cursor?
Project Rules ficam em .cursor/rules, dentro do repositório, versionadas junto do código. User Rules são globais do seu ambiente, e Team Rules são gerenciadas pelo dashboard do time; as três camadas convivem com o AGENTS.md lido na raiz do projeto.
O AGENTS.md substitui as regras do .cursor/rules?
Não, ele é lido nativamente pelo Cursor junto de Project, Team e User Rules, não no lugar delas. Como o conteúdo aplicado entra no início do contexto do modelo, vale manter o AGENTS.md enxuto e deixar o detalhe específico pra dentro das regras .mdc.
Dá pra guardar o plano gerado no Plan Mode pra usar depois?
Dá, o botão Save to workspace salva o plano dentro da pasta .cursor/plans/ do projeto. Como o plano é um Markdown editável com file paths e code references, dá pra revisar e cortar itens antes mesmo de acionar o Save.
Formações
Formação SAAS com IA
Tire usas ideias do papel criando softwares com IA, integre pagamentos e lance seu projeto!
- 291 aulas
- 18 projetos
- 24h 17min
Blog | Mais populares
As diferenças de var, let e const
Como fazer redirecionamento com PHP
Neste artigo você vai aprender a como fazer redirecionamento com PHP, utilizaremos abordagens fáceis de entender e de aplicar Fala programador(a), beleza? Bora aprender mais […]
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação
Checklist de segurança n8n VPS pública: guia essencial para proteger sua instalação A popularidade da automação de processos com o n8n está em alta, principalmente […]
