Aplique o método DARE numa feature
Pegue um requisito de feature pequena e produza os três artefatos do DARE — DESIGN.md, BLUEPRINT.md e TASKS.md — aprendendo o método fazendo. Separe estratégia (o quê/porquê) da tática (o como) com checkpoints humanos explícitos.
Problema
Você tem uma feature pequena que quer construir com um assistente de IA, mas toda vez que simplesmente "pede pra IA codar" recebe um resultado convincente na aparência, porém cheio de stubs, mocks e comportamento inventado. A IA chutou as partes que você nunca especificou. O método DARE resolve isso fazendo com que você — o humano — seja dono da **estratégia** (o quê e o porquê) enquanto a IA é dona da **tática** (o como), com portões de revisão explícitos no meio. Neste lab você vai escolher uma feature real e passá-la pelo método, produzindo três artefatos concretos: `DESIGN.md` (o problema e critérios de sucesso testáveis), `BLUEPRINT.md` (um contrato executável e anti-stub) e `TASKS.md` (tasks atômicas organizadas como um grafo de dependências). No fim você terá um registro que a IA consegue executar sem inventar nada — e vai entender *por que* cada fase existe.
Objetivos
- Explicar as quatro fases do DARE (Design, Architect, Review, Execute) e quem dirige cada uma
- Distinguir estratégia (do humano: o quê/porquê) de tática (da IA: o como)
- Escrever um
DESIGN.mdcom critérios de sucesso testáveis, restrições e não-objetivos explícitos - Escrever um
BLUEPRINT.mdcom modelo de dados e endpoints especificados por status code, usando um contrato anti-stub - Decompor um blueprint em tasks atômicas (15–60 min) e organizá-las como um grafo de dependências (DAG) com ranks paralelos
- Auto-revisar seus artefatos para pegar stubs e frases vagas do tipo "implementar X" antes de gastar tokens de execução
Pré-requisitos
- Uma ideia de feature pequena sua (algo que você conseguiria construir em um dia). Se não tiver, use o exemplo do Passo 2.
- Um editor de texto simples (qualquer editor que salve Markdown serve)
- Git instalado, para conseguir commitar ou compartilhar seus três artefatos no fim
- Nenhuma linguagem de programação específica é exigida — este lab é stack-agnóstico e concept-first
O que você vai construir
Você vai passar uma feature pequena por todo o método DARE e sair com três arquivos:
DESIGN.md, BLUEPRINT.md e TASKS.md. Isso não é burocracia — são exatamente as entradas
que um assistente de IA precisa para implementar sua feature sem chutar.
Por que o DARE existe
Modelos de linguagem são excelentes em tática (escrever código) e péssimos em ler sua mente
sobre estratégia (o que você realmente quer). Quando você pula a especificação, o modelo preenche
a lacuna com a resposta estatisticamente mais provável — que geralmente é um stub, um mock ou um
"TODO". O DARE força a estratégia a sair da sua cabeça e ir para o papel antes de qualquer
código ser escrito.
DARE significa Design, Architect, Review, Execute:
-
Design →
DESIGN.md. O humano define o problema, o contexto, critérios de sucesso testáveis,
restrições e não-objetivos. A IA assiste (faz perguntas de esclarecimento), mas o humano dirige. -
Architect →
BLUEPRINT.md. O modelo de dados e cada endpoint são especificados — request e
response por status code — usando um contrato anti-stub: cada função ou endpoint é descrito
de forma executável, nunca como um genérico "implementar X". -
Review. Um portão de aprovação humana explícito. Você lê o blueprint e diz "sim, construa isto"
antes de gastar tokens na execução. -
Execute →
TASKS.md+ um grafo de tasks. O blueprint é decomposto em tasks atômicas
(15–60 minutos cada) com dependências reais e mínimas, organizadas como um DAG com ranks paralelos.
Cada task carrega uma Definition of Done anti-stub. Então o Ralph Loop implementa e itera até
testes, lint e tipos passarem.
A divisão central: estratégia vs tática
| Preocupação | Dono | Artefato |
|---|---|---|
| O quê e o porquê | Humano (dirige) | DESIGN.md |
| O contrato executável | Humano decide, IA rascunha | BLUEPRINT.md |
| Aprovação para prosseguir | Humano (portão) | Review |
| O como, implementado | IA (dirige) |
TASKS.md + código |
Guarde esta tabela para o lab inteiro. Toda vez que você se sentir tentado a deixar a IA decidir
o que algo deve fazer, isso é uma decisão de estratégia — pertence a você, no DESIGN.md.
O que "anti-stub" significa
Um stub é um placeholder que parece pronto mas não está: uma função vazia, um retorno fixo,
um // TODO: implementar. O princípio anti-stub diz que toda especificação precisa ser concreta
o suficiente para que "não fez nada" e "fez certo" sejam distinguíveis. Se uma spec pudesse ser
satisfeita por um mock, a spec está vaga demais. Você vai aplicar esse teste nos Passos 3 e 5.
Como trabalhar neste lab
Faça os passos em ordem — cada artefato alimenta o próximo. Escreva arquivos Markdown de verdade
conforme avança; no Passo 6 você commita os três. Os exemplos usam uma pseudo-notação neutra para
que você possa usar a linguagem que quiser.
Passos
-
Entenda as quatro fases e a divisão humano/IA
Antes de escrever qualquer coisa, internalize o ciclo. O DARE tem quatro fases, e o ponto central
é quem está no controle em cada uma.-
Design — humano dirige, IA assiste. Você decide o problema, os critérios de sucesso e os
limites. A IA pode fazer perguntas, mas não decide escopo. -
Architect — humano decide, IA rascunha. Juntos vocês produzem um contrato preciso e
executável. Você continua sendo a autoridade sobre o quê; a IA ajuda a moldar como será estruturado. -
Review — portão humano. Nada prossegue sem o seu "aprovado" explícito. Este é o checkpoint
que te salva de pagar tokens para implementar a coisa errada. -
Execute — IA dirige, humano supervisiona. A IA implementa as tasks e roda o Ralph Loop
(implementar → testar → lint → checar tipos → corrigir → repetir) até tudo ficar verde.
A única regra pra lembrar
Estratégia (o quê e o porquê) é sempre humana. Tática (o como) é sempre da IA. Cada fase é só uma
passagem de bastão entre essas duas, e o Review é o portão de segurança no meio.Checkpoint
Responda estas três perguntas pra você mesmo antes de continuar (escreva-as):
- Qual fase decide se uma feature vale a pena ser construída? (Design.)
- Qual artefato precisa ser concreto o suficiente para que um stub o reprove? (BLUEPRINT.md.)
- O que acontece no Review se você achar uma lacuna? (Você volta e corrige o blueprint — não prossegue.)
Se alguma resposta pareceu nebulosa, releia a visão geral acima. O resto do lab assume que você
sabe nomear quem é dono de cada decisão. -
Design — humano dirige, IA assiste. Você decide o problema, os critérios de sucesso e os
-
Escolha uma feature e escreva o DESIGN.md
Agora você é dono da fase de Design. Escolha uma feature pequena. Mantenha minúscula — o
equivalente a um endpoint ou o comportamento de uma tela. Se não tiver nenhuma ideia à mão, use
este exemplo:Feature de exemplo: um serviço de "encurtar URL". O usuário envia uma URL longa e recebe um
código curto; visitar o código curto redireciona para a URL original.Crie um arquivo chamado
DESIGN.mdcom estas cinco seções. O trabalho aqui é estratégia, não código.# DESIGN — Encurtador de URL ## Problema e contexto Usuários querem compartilhar URLs longas em lugares com limite de tamanho (chat, impressão). Precisamos de um serviço que transforme uma URL longa em um código curto e redirecione ao visitar. ## Critérios de sucesso (testáveis) - Um POST de URL válida retorna um código curto de 6–8 caracteres URL-safe. - GET /{código} para um código conhecido responde com um redirect HTTP para a URL original. - GET /{código} para um código desconhecido responde com 404. - A mesma URL longa enviada duas vezes retorna o mesmo código (idempotente). ## Restrições - Códigos devem ser URL-safe (sem /, + ou =). - A URL original deve ser uma URL http/https sintaticamente válida. ## Não-objetivos - Sem contas de usuário ou autenticação. - Sem analytics/rastreamento de cliques. - Sem códigos customizados (vanity).Regras para bons critérios de sucesso
Cada critério precisa ser testável — uma entrada específica produzindo uma saída específica e
observável. "Deve ser rápido" não é testável; "responde em menos de 200 ms para um código conhecido"
é. Escreva critérios que você poderia entregar a outra pessoa e ela saberia exatamente quando a
feature está pronta.Por que não-objetivos importam
Não-objetivos são a cerca em volta da imaginação da IA. Se você não escrever "sem autenticação",
a IA pode gentilmente adicionar um sistema de login que você nunca quis — isso é escopo que o modelo
inventou. Cada não-objetivo é um token que você não vai desperdiçar depois.Entregável deste passo: um
DESIGN.mdcom as cinco seções preenchidas para a sua feature. -
Escreva o BLUEPRINT.md com um contrato anti-stub
Com o Design aprovado (por você), entre na fase Architect. O
BLUEPRINT.mdtraduz seus
critérios de sucesso em um contrato executável: um modelo de dados mais cada endpoint especificado
com seu request e seu response por status code.A disciplina crítica é o contrato anti-stub. Não escreva "implementar o endpoint de criação".
Escreva exatamente o que entra, o que sai e para qual status. Eis o exemplo:# BLUEPRINT — Encurtador de URL ## Modelo de dados Link: - id: identificador único - code: string, 6–8 chars URL-safe, único - original_url: string, http/https válida - created_at: timestamp ## Endpoint: POST /links Corpo do request: { "url": "https://exemplo.com/caminho/muito/longo" } Responses: - 201 Created { "code": "Ab3xZ9", "short_url": ".../Ab3xZ9", "original_url": "https://exemplo.com/caminho/muito/longo" } - 422 Unprocessable Entity (url ausente ou não http/https) { "error": "url precisa ser uma URL http ou https válida" } Comportamento: - Normalizar a URL (remover espaços, host em minúsculas). - Se já existir um Link com a mesma original_url normalizada, retornar o código existente (201, idempotente). - Caso contrário, gerar um código URL-safe aleatório de 6 chars; em colisão, regenerar (máx. 5 tentativas). ## Endpoint: GET /{code} Responses: - 302 Found -> header Location = original_url - 404 Not Found (nenhum Link com esse código) { "error": "código desconhecido" }O teste anti-stub
Leia cada endpoint e pergunte: um stub que retorna um valor fixo satisfaria esta spec?
Se "gerar um código" não tem regra para colisões, um stub retornando"AAAAAA"toda vez passaria —
logo a spec está fraca demais. Repare como o exemplo fecha esse buraco com "em colisão, regenerar".
Cada linha de comportamento existe para fazer o "não fez nada" falhar.Checklist do seu blueprint
- O modelo de dados lista cada campo com seu tipo e restrições
- Cada endpoint lista um formato de request e um formato de response para cada status code (sucesso e erros)
- Todo comportamento não-trivial (normalização, idempotência, colisões, validação) está detalhado
- Nenhuma linha diz "implementar X", "tratar Y" ou "etc." — isso são stubs disfarçados
Entregável deste passo: um
BLUEPRINT.mdonde cada endpoint poderia ser implementado por alguém
que nunca viu seuDESIGN.md, sem precisar chutar nada. -
Decomponha em TASKS e monte o DAG
Agora a fase Execute começa no papel. Quebre o blueprint em tasks atômicas — cada uma de
15 a 60 minutos de trabalho focado, cada uma com uma Definition of Done (DoD) anti-stub. Depois
conecte-as pelas suas dependências reais e mínimas para formar um DAG (grafo acíclico dirigido).Tasks no mesmo rank não têm dependência entre si, então poderiam rodar em paralelo. Os ranks
rodam em sequência.# TASKS — Encurtador de URL ## T1 — Modelo de dados e armazenamento do Link DoD: Um Link com code, original_url, created_at pode ser criado e buscado por code; o code é único no nível de armazenamento. Teste: criar dois links, buscar cada um por code. Depende de: (nenhuma) ## T2 — Validação e normalização de URL DoD: Dada uma string, retorna a URL normalizada ou um erro de validação; rejeita não-http(s). Teste: URL válida normaliza; "ftp://x" e "" são rejeitados. Depende de: (nenhuma) ## T3 — Gerador de código com retry em colisão DoD: Retorna um code URL-safe de 6 chars; em colisão simulada, regenera; falha após 5 tentativas. Teste: caminho de colisão forçada regenera e por fim retorna um code único. Depende de: (nenhuma) ## T4 — Endpoint POST /links DoD: URL válida -> 201 com code (idempotente em repetições); inválida -> 422 com corpo de erro. Teste: cobre 201, repetição idempotente e 422. Depende de: T1, T2, T3 ## T5 — Endpoint GET /{code} DoD: Code conhecido -> 302 para original_url; desconhecido -> 404 com corpo de erro. Teste: cobre 302 e 404. Depende de: T1O grafo de dependências (DAG)
Ler as linhas "Depende de" te dá os ranks:
Rank 0 (paralelo): T1 T2 T3 \ | / Rank 1: T4 T5 (T5 só precisa de T1, então também pode começar assim que T1 terminar)- Rank 0: T1, T2, T3 — independentes, poderiam ser construídas ao mesmo tempo.
- Rank 1: T4 depende de T1+T2+T3; T5 depende só de T1.
Regras para uma boa decomposição
-
Atômica: se uma task levaria mais de ~60 minutos, divida. Se duas tasks são sempre feitas
juntas em menos de 15 minutos, junte. -
Dependências reais mínimas: só desenhe uma aresta se a task genuinamente não pode começar sem a
outra. Inventar dependências mata o paralelismo; perder uma real causa builds quebrados. -
DoD anti-stub: toda DoD nomeia um teste concreto. "Endpoint funciona" é uma DoD amigável a stub;
"cobre 201, repetição idempotente e 422" não é.
Entregável deste passo: um
TASKS.mdlistando tasks atômicas com DoDs anti-stub e suas
dependências, mais o agrupamento por rank (o DAG) escrito. -
Auto-revisão: cace stubs antes de gastar tokens
Este é o portão de Review — o checkpoint que faz o DARE valer a pena. Antes de entregar estes
artefatos a uma IA, você faz o papel de revisor. Seu objetivo é encontrar todo lugar onde a IA
poderia legitimamente produzir um stub e ainda satisfazer sua spec. Cada um que você achar é um
bug pego de graça.A auditoria anti-stub
Percorra seus três arquivos e cheque cada item. Corrija o que falhar antes de seguir.
- DESIGN.md — critérios são testáveis. Leia cada critério de sucesso. Você conseguiria
escrever um teste automatizado a partir dele como está? Se disser "trata erros graciosamente",
troque pelas entradas específicas e saídas esperadas. - DESIGN.md — não-objetivos são explícitos. Existe alguma feature adjacente que a IA poderia
"gentilmente" adicionar? Nomeie-a como não-objetivo. - BLUEPRINT.md — cada status code está especificado. Para cada endpoint, você lista o response
de sucesso e cada response de erro com seu corpo? Um 404/422 ausente é onde a IA inventa comportamento. - BLUEPRINT.md — sem verbos vagos. Procure por "implementar", "tratar", "processar", "gerenciar",
"etc.", "e assim por diante". Cada um é um buraco. Troque pela regra concreta. - TASKS.md — cada DoD nomeia um teste. Uma DoD sem teste observável é um ímã de stub.
"Funciona" → "dado X, retorna Y". - TASKS.md — dependências são reais. Para cada aresta, confirme que a task realmente não pode
começar sem a dependência. Remova arestas inventadas; adicione qualquer real que faltar. - Sem ciclos. Siga seus links "depende de" — você nunca deve conseguir voltar em loop a uma task.
O teste do mock
Para cada função ou endpoint, faça a pergunta decisiva:
Se alguém substituísse isto por um mock com valor fixo, algum dos meus critérios de sucesso ou testes de DoD falharia?
Se a resposta for "não" para algum item, esse item está subespecificado. Aperte-o até que um mock
falhasse visivelmente. Essa única pergunta é a essência do DARE — é por isso que o método produz
software funcionando em vez de stubs convincentes.Por que este portão existe
Tudo até aqui te custou minutos de escrita. A execução custa tokens, tempo e esforço de revisão.
Pegar um endpoint subespecificado agora é quase de graça; pegá-lo depois que a IA construiu um stub
em volta dele não é. Aprove só quando cada caixa acima estiver marcada.Entregável deste passo: os mesmos três arquivos, revisados — com uma nota curta no fim do
TASKS.mdlistando ao menos um risco de stub que você achou e como o fechou. - DESIGN.md — critérios são testáveis. Leia cada critério de sucesso. Você conseguiria
-
Entregue e saiba como executar
Você passou uma feature por todas as quatro fases do DARE. Hora de entregar — e de entender o que
acontece quando uma execução real começa.Critério de submissão
Coloque seus três artefatos em um só lugar e compartilhe:
- Crie um repositório git (ou um gist) contendo exatamente três arquivos na raiz:
DESIGN.md,BLUEPRINT.mdeTASKS.md. - Confirme que cada um atende ao seu entregável dos passos anteriores:
-
DESIGN.md: problema, critérios de sucesso testáveis, restrições, não-objetivos. -
BLUEPRINT.md: modelo de dados + cada endpoint com request/response por status code, comportamento anti-stub. -
TASKS.md: tasks atômicas com DoDs anti-stub, dependências reais, o agrupamento por rank/DAG e sua nota de risco de stub.
-
- Commite e faça push. Entregue a URL do repositório ou gist como seu entregável do lab.
git init git add DESIGN.md BLUEPRINT.md TASKS.md git commit -m "Artefatos DARE para <minha feature>" # faça push para o remoto de sua escolha, depois entregue a URLComo é a execução (próximos passos)
Com os artefatos aprovados, a execução é mecânica. Para cada rank do DAG, um assistente de IA pega
as tasks e roda o Ralph Loop em cada uma:- Implementar a task para satisfazer sua Definition of Done.
- Rodar os testes, o linter e o checador de tipos.
- Se algo estiver vermelho, ler a falha e corrigir.
- Repetir até testes, lint e tipos ficarem todos verdes.
Como tasks do mesmo rank são independentes, podem ser executadas em paralelo; o próximo rank só começa
depois que suas dependências terminam. Como toda DoD nomeia um teste, "pronto" é objetivo — o loop tem
uma condição de parada clara, e um stub não passa.O que você aprendeu
Você não só preencheu templates. Você praticou o movimento central do DARE: tirar a estratégia da
sua cabeça e colocá-la no papel, numa forma tão concreta que a IA não tem mais nada para inventar.
Esse é o método inteiro. Toda feature futura são as mesmas quatro fases — Design, Architect, Review,
Execute — na escala que você precisar. - Crie um repositório git (ou um gist) contendo exatamente três arquivos na raiz: