Spec-Driven Development (SDD): a nova espinha dorsal
- ⬜🧭 Engenheiro vs Coder: o que mudou na era dos agents(Engenharia de Software Moderna)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Spec-Driven Development (SDD)é o método que substitui “abrir editor e começar a codar” por “escrever uma spec curta e executável, e só então codar (ou delegar pro agent)”. Funciona porque: (1) reduz ambiguidade antes do código, onde é barato; (2) vira oráculo de teste; (3) dá ao agent o contexto mínimo necessário pra gerar código que não precisa reescrever em review. SDD não é waterfall disfarçado — é ciclo curto: spec pequena → código → feedback → iteração.
SDD em 1 imagem
Anatomia de uma spec profissional
Uma boa spec cabe em 1-3 páginas. Se passa disso, decomponha em várias specs menores. Seções obrigatórias:
Template pronto (copie e cole)
# Spec: <nome curto da feature>
**Owner:** @fernando · **Status:** draft · **Data:** 2026-04-16 · **Review by:** 2026-04-19
## 1. Contexto
Em 2-3 frases: qual o problema, quem sofre, qual a oportunidade.
Exemplo: "Hoje quando um pagamento falha por erro transitório do PSP, o
usuário clica 'pagar' 3x e gera 3 cobranças. Precisamos de idempotência
na camada de checkout."
## 2. Objetivos
O1. Garantir que dois POST /payments com mesma idempotency-key em
janela de 24h retornem sempre a mesma resposta (idempotente).
O2. Expor a chave no header da resposta para debugging.
## 3. Não-objetivos
- NÃO vamos implementar retry automático (fica com o cliente).
- NÃO muda o contrato atual da API (backward compatible).
## 4. Requisitos funcionais
R1. Header 'Idempotency-Key' obrigatório em POST /payments.
R2. Chave persistida em payments.idempotency_key (índice único).
R3. Segunda chamada com mesma chave retorna a resposta original.
R4. Expira em 24h (row deletada).
R5. Chaves inválidas (<16 ou >64 chars) retornam 400.
## 5. Critérios de aceite
CA1. GIVEN uma chave nova
WHEN POST /payments
THEN cria pagamento, responde 201, header X-Idempotency-Key.
CA2. GIVEN uma chave já vista há 1h
WHEN POST /payments (mesmo body)
THEN devolve 200 e MESMA resposta (sem criar outro).
CA3. GIVEN uma chave já vista há 25h
WHEN POST /payments
THEN trata como chave nova.
CA4. GIVEN uma chave com 5 caracteres
WHEN POST /payments
THEN responde 400 com código 'invalid_idempotency_key'.
CA5. GIVEN 100 requests paralelos com mesma chave
WHEN concorrência alta
THEN só 1 pagamento é criado (teste de race).
## 6. Restrições
- Stack: Node 20 + Fastify + Postgres 15.
- Latência: <5ms de overhead por request (p99).
- Segurança: chave não deve vazar em logs.
## 7. Exemplos
POST /payments Idempotency-Key: abc-123
Body: { amount: 1000, currency: "BRL" }
Resposta 201: { id: "pay_01", status: "paid", ... }
POST /payments Idempotency-Key: abc-123 (10 min depois)
Body: { amount: 1000, currency: "BRL" }
Resposta 200: { id: "pay_01", status: "paid", ... } (MESMO id)
## 8. Riscos & mitigações
- Race condition (2 req paralelas): lock com INSERT unique + retry de leitura.
- Chave com body diferente: rejeita com 409 (payload mismatch).
- Crescimento da tabela: índice + job de limpeza diário.
## 9. Plano de teste
- Unit: handler, validador, storage.
- Integração: Postgres real em docker, 100 requests paralelos.
- Property-based: qualquer body válido + chave válida → idempotente.
- Manual: via Bruno/Postman com 3 cenários do item 7.
## 10. Rollback
- Feature flag idempotency.enabled (GrowthBook).
- Se p99 subir >10ms ou taxa de 5xx >0.1%: desliga flag.
- Migration é aditiva (sem drop). Reverter = desligar flag, não rollback de schema.Como agent consome uma spec
# Em Claude Code (ou similar) # 1. abre a spec no editor ou cola no prompt # 2. comanda o agent com precisão "Leia a spec em docs/specs/idempotency.md. Implemente os requisitos R1-R5 na camada de rota POST /payments em src/routes/payments.ts. Escreva testes cobrindo CA1-CA5 em tests/payments.spec.ts. Não altere o schema da resposta atual (não-objetivo 2). Não implemente retry (não-objetivo 1). Se algum critério não ficar claro, pare e pergunte — não invente."
SDD vs outras metodologias
| Dimensão | SDD | TDD clássico | BDD | Waterfall |
|---|---|---|---|---|
| Artefato principal | Spec markdown | Teste | Feature (Gherkin) | Documento longo |
| Tamanho | 1-3 pg, ciclos curtos | Vários testes | Muitos cenários | 20+ pg, fase única |
| Quem opera | Humano + agent | Humano | Humano + QA | Humano |
| Flexibilidade | Alta (spec pequena) | Média | Média | Baixa |
| Valida escopo | Sim (não-objetivos) | Só o que foi testado | Sim (cenários) | Sim no papel |
| Serve pra equipe AI-native | Sim — desenhado pra isso | Parcial | Parcial | Não |
Armadilhas clássicas
- • Spec-bureaucracy. Virar processo pesado com 10 revisores e 2 semanas de review. SDD é ciclo curto — 1 page, 1-2 reviewers, 1 dia de iteração.
- • Spec sem critério de aceite.“Deve ser rápido” não é critério. “p99 < 50ms sob 1000 rps” é.
- • Spec para cada commit.Overhead. SDD é pra feature/bugfix “não-trivial”. Typo não precisa de spec.
- • Não atualizar a spec quando o código muda. Spec vira mentira. Atualiza junto, no mesmo PR.
- • Deixar agent escrever a spec sozinho. Agent pode rascunhar, mas humano tem que aceitar — escrever spec é onde o pensamento acontece.
- • Spec “genérica demais”. Se não tem exemplo concreto (input→output), vira prosa — agent inventa o que quiser.
Dois cenários reais de decisão
📋 Bugfix de validação em campo de CEP (5 linhas de código)
Ticket + teste que reproduz + PR pequeno resolve. Spec aqui é overhead. Regra: se o código é menor que a spec seria, pula a spec.
Alt: SDD completa — burocratiza; time perde tempo.
📋 Novo fluxo de reembolso com 4 endpoints e integração com PSP
Escopo ambíguo, múltiplos stakeholders, integração externa, impacto financeiro. Spec de 2 páginas evita 2 semanas de retrabalho.
Onde armazenar a spec
Perguntas típicas
❓ Preciso de spec pra refactor interno?
❓ Agent pode escrever a spec pra mim?
❓ SDD funciona em empresa sem cultura de doc?
❓ Como integrar com PRD do produto?
❓ E se a spec estiver errada depois de começar?
Quiz rápido
4 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito