🧠FFVAcademy
📜

Spec-Driven Development (SDD): a nova espinha dorsal

18 min de leitura·+85 XP
Pré-requisitos (0/1)0%

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

🗺️ O ciclo SDD
💡Intenção bruta0
Ticket, conversa, insight de negócio. Ambíguo por padrão.
destila
📜Spec (markdown)1
Objetivo, requisitos numerados, critérios de aceite, não-objetivos, exemplos, riscos, plano de teste.
vira
🧠Plano técnico2
Arquivos afetados, tarefas, dependências, rollback. Derivado da spec.
delega
🤖Agent implementa3
Consumindo spec + plano + contexto do repo. Produz código e testes.
valida
🧪Testes automatizados4
Derivados dos critérios de aceite. Falha = volta pro agent.
revisa
🔍Review humano5
Olho crítico: invariante, performance, segurança, design. Rejeita ou aceita.
merge
📊Observa em prod6
SLO, logs, métricas. Se fora do spec: volta pro ciclo.

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:

1. ContextoPor que estamos construindo isso? Qual problema resolve? Qual usuário?
2. ObjetivosResultados esperados em frases numeradas e verificáveis.
3. Não-objetivosO que explicitamente NÃO faz parte. Freia o agent e o reviewer.
4. Requisitos funcionaisLista numerada: R1, R2... cada um uma frase, testável.
5. Critérios de aceiteGiven/When/Then ou cenários com input/output esperados.
6. RestriçõesPerformance, compatibilidade, custo, segurança, stack.
7. Exemplos concretosInput real, output real. 3-5 exemplos cobrindo golden path + edge.
8. Riscos & mitigaçõesO que pode dar errado, probabilidade e plano B.
9. Plano de testeComo validar. Unit/integração/E2E/manual. Quem testa.
10. Plano de rollbackComo reverter se falhar em produção. Métrica-gatilho.

Template pronto (copie e cole)

markdown
# 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

bash
# 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."
💡
Por que funciona. Você deu ao agent: (1) objetivo verificável; (2) arquivo-alvo específico; (3) restrições explícitas; (4) regra pra pedir ajuda em ambiguidade. Resultado: PR focado, revisável, alinhado.

SDD vs outras metodologias

DimensãoSDDTDD clássicoBDDWaterfall
Artefato principalSpec markdownTesteFeature (Gherkin)Documento longo
Tamanho1-3 pg, ciclos curtosVários testesMuitos cenários20+ pg, fase única
Quem operaHumano + agentHumanoHumano + QAHumano
FlexibilidadeAlta (spec pequena)MédiaMédiaBaixa
Valida escopoSim (não-objetivos)Só o que foi testadoSim (cenários)Sim no papel
Serve pra equipe AI-nativeSim — desenhado pra issoParcialParcialNã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)

Sem spec formal

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 completaburocratiza; time perde tempo.

📋 Novo fluxo de reembolso com 4 endpoints e integração com PSP

SDD obrigatória

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

1. Dentro do repodocs/specs/<slug>.md. Versionada junto do código. Ideal pra spec técnica.
2. Linear/NotionBoa pra spec de produto com stakeholders externos. Exporte um link no PR.
3. MixedSpec curta no repo (o contrato técnico), spec de produto no Linear (o porquê). Linka um no outro.
⚠️
Regra. A spec técnica vive no repo. Agent precisa lê-la — PDF no Drive não serve.

Perguntas típicas

Preciso de spec pra refactor interno?

Se muda comportamento público (API, schema, contrato) — sim. Se é só reorganização interna com testes preservados — não.

Agent pode escrever a spec pra mim?

Pode rascunhar a partir de um ticket e conversa. Mas humano revisa, ajusta e aceita. Delegar esse passo é delegar o pensamento.

SDD funciona em empresa sem cultura de doc?

Funciona, mas precisa adoção top-down ou bottom-up com 1-2 early adopters mostrando valor. Comece por 1 feature grande; mostre o ganho em retrabalho evitado.

Como integrar com PRD do produto?

PRD responde por quê; SDD responde como. PM escreve PRD; engenheiro escreve SDD linkando ao PRD. Ambos vivem. Juntos.

E se a spec estiver errada depois de começar?

Atualiza a spec no mesmo PR ou em PR novo. Spec é viva, não sagrada. O crime é ship sem atualizar — código e spec divergem.
Take-aways. (1) SDD é ciclo curto: spec pequena, código, feedback. (2) Critérios de aceite viram testes. (3) Não-objetivos evitam scope creep. (4) Spec técnica vive no repo, agent e humano consomem igual. (5) SDD é pra feature não-trivial — bugfix de 5 linhas não precisa. (6) Próximo: gerenciar os agents que consomem essa spec.
🧩

Quiz rápido

4 perguntas · Acerte tudo e ganhe o badge 🎯 Gabarito

Continue lendo