Logo Guilherme Vitorino
BlogProjetosExperiênciaSobreContato

Desenvolvimento Orientado por Especificações

13 de julho de 2026•25 min de leitura•AI•
SDDAIAgentsClaude CodeRalph LoopOpenSpecSuperpowersBMADGSDSpec Kit

Tenho mantido uma codebase pessoal (workspaces, boilerplates, packages, scripts) e venho desenvolvendo projetos pessoais em paralelo — acredito que ter o próprio arsenal de ferramentas no dia a dia poupa muito trabalho. Neste post, decidi checar como está a situação da autonomia dos agentes — e, como vimos no primeiro post, nem todo agente foi desenhado com autonomia nativa em sua filosofia. Segue uma pesquisa sobre as técnicas e os frameworks utilizados para essa finalidade.

O teste roda sobre um fixture: um blog mínimo em Node puro, com posts servidos por rotas REST sobre o módulo http nativo e uma convenção de resposta e de erro já estabelecida. A tarefa dada a cada framework foi adicionar um sistema de comentários a esse blog — não é um cenário greenfield, e sim uma feature construída em cima de convenções que já existem. É isso que o teste mede: cada framework respeita o padrão existente ou o ignora e reinventa do zero?

(Repositório com os sete worktrees: github.com/vitorinoguilherme/sdd-frameworks-compared.)


Conceitos Fundamentais

Antes de comparar os frameworks, vale alinhar alguns conceitos que aparecem ao longo do post:

Prompt Engineering: técnica de estruturar a instrução enviada ao modelo para obter melhores respostas. Não resolve, por si só, problemas de memória, continuidade entre sessões, execução longa ou manutenção de estado.

Context Engineering: organizar documentação, arquitetura, regras, especificações e convenções para que o agente trabalhe com informação relevante e bem estruturada. O post 1 mostra um exemplo de como organizo tudo isso numa pasta .ai/.

Spec-Driven Development: desenvolvimento guiado por especificações — você define páginas, estados, entidades, fluxos, regras, contratos e critérios de aceite antes da execução. Objetivo: reduzir ambiguidade, drift, inconsistência e decisões erradas durante a implementação.

Workflow-Driven Development: separa a execução em fases distintas. Objetivo: evitar overload de contexto, perda de foco e execução caótica.

Runtime State: memória operacional persistente entre execuções. Importante porque o LLM esquece, resume errado e perde o objetivo original ao longo de sessões longas.

Checkpoints: paradas formais entre fases — por exemplo, validar, resumir, persistir o estado e só então seguir para a próxima fase. Objetivo: evitar degradação cognitiva do modelo ao longo da execução.

Orchestration: coordenação geral da execução. Pode incluir planejamento, retries, validação, divisão de tarefas e checkpoints.

Conceito Foco Mitiga
Prompt engineering prompt instrução
Context engineering contexto consistência
Spec-driven especificação ambiguidade
Workflow-driven execução perda de foco / execução caótica
Runtime state memória continuidade
Checkpoints transição entre fases degradação de contexto
Orchestration coordenação autonomia

Onde entram os frameworks

Os conceitos acima descrevem problemas; os frameworks abaixo são tentativas de resolvê-los de forma sistemática, cada um com uma filosofia diferente. Os problemas que os motivam se repetem: context drift, perda de objetivo, summaries ruins, recency bias, atenção diluída — e a hipótese que este post põe à prova é que todos compartilham um denominador comum: a falta de estado persistente entre execuções. Existe também a opção mais simples de todas: usar o LLM direto, sem framework algum — é o que o Baseline representa aqui, a condição de controle. E há ainda uma categoria paralela surgindo, focada especificamente no problema de memória — ferramentas como agent-memory — que não tentam orquestrar o fluxo inteiro como os frameworks abaixo, só resolver a parte de estado persistente. Fica fora do escopo deste teste, mas é outro ângulo atacando a mesma causa raiz.

Framework Foco real
Baseline controle sem framework
Ralph Loop execute → verify (loop stateless)
OpenSpec specs + contracts
Superpowers methodology enforcement
BMAD-METHOD workflow multiagente
Open GSD orchestration + decomposition
GitHub Spec Kit TDD + spec contracts

Rodando o experimento

A ideia aqui não é comparar os frameworks no papel, e sim rodar cada um de ponta a ponta na mesma tarefa real — o sistema de comentários completo do TASK.md, não um exemplo mínimo. Cada framework recebeu a tarefa inteira, no seu próprio worktree isolado, e correu até concluir ou travar. Mesmo um resultado incompleto — "parou em X" — já revela algo sobre como o framework conduz a execução.

Por baixo de toda a comparação está um tradeoff: dar mais autonomia ao agente ganha velocidade de execução, mas custa controle de contexto a cada etapa.

Antes de rodar qualquer framework, separei algumas decisões de desenho — porque sem isso a comparação vira só "qual ferramenta pareceu mais legal", não dado.

A primeira foi isolar tudo num fixture descartável, sem relação com nenhum projeto real. Um fixture é uma aplicação mínima de blog criada só pra esse teste — Node puro, sem nenhuma dependência externa, rotas de posts só com http nativo. Qualquer coisa além disso (Express, ORM, framework de teste) faria o agente gastar parte da decisão em "qual lib usar", que não é o que quero medir.

A tarefa é um sistema de comentários — mas não greenfield disfarçado. O fixture já chega com convenção estabelecida (rota REST simples, um padrão de erro 404, formato de resposta), e a pergunta que o teste faz é se cada framework respeita isso ou ignora e reinventa. Coloquei duas armadilhas de propósito: o corpo do comentário não pode permitir HTML/script arbitrário (testa se o framework pensa em segurança sem eu pedir explicitamente), e a remoção de um comentário precisa preservar a thread das respostas (testa se ele pensa em efeito cascata, não só CRUD superficial). Também defini um "fora de escopo" explícito — sem isso, framework mais "completista" tende a expandir a tarefa sozinho (notificação, moderação, likes), e aí a comparação entre eles deixa de ser justa.

Cada framework roda numa branch separada, todas nascendo do mesmo commit via git worktree — um repo só, não sete pastas soltas. Isso garante ponto de partida idêntico entre os testes: qualquer diferença de resultado vem do framework, não de qual contexto cada um teve disponível.

A régua de avaliação tem duas dimensões. A primeira é como cada framework lidou com as decisões que a tarefa deixou em aberto de propósito: decidiu em silêncio e embutiu o valor no código, decidiu e documentou o racional, propôs e esperou aprovação, ou perguntou uma a uma. A segunda é a qualidade do resultado além de "terminou": os testes gerados rodam de fato e cobrem os casos que o TASK.md pedia — rate limit, thread preservada no soft-delete, limite de caracteres — ou a suíte passa verde deixando justamente esses casos de fora.

Baseline

O baseline é o controle: o mesmo agente, o mesmo modelo, sem nenhum framework — só o TASK.md colado como entrada. Zero install, zero configuração. A única pergunta que ele respondeu foi a tarefa em si.

O agente explorou a codebase antes de codar (seis leituras: server.js, posts.js, package.json, os arquivos de protocolo). Em seguida, declarou todas as quatro decisões ambíguas como um bloco de texto no início da resposta — não perguntou nada. Limite de caracteres: 2000. Janela de edição: 15 minutos. Resposta quando o pai é removido: entrada permanece, text e name ficam nulos, flag deleted: true. Rate limit: 5 comentários por IP a cada 10 minutos. Valores razoáveis, dentro do que se esperaria de uma escolha humana rápida — mas o usuário não foi consultado em nenhum deles.

Uma decisão ficou fora do radar inteiramente: persistência. O agente não perguntou, não declarou, não levantou — simplesmente usou um array em memória (const comments = []) e um Map para rate limit. package.json ficou sem nenhuma dependência. Isso manteve a convenção zero-deps do fixture, mas significa que os dados somem a cada restart. O GSD, ao contrário, levantou persistência como uma decisão a ser tomada antes de começar.

TDD: não — o transcript confirma a ordem: comments.js primeiro, server.js na sequência, testes por último. Os 10 novos testes cobriram os 5 casos obrigatórios do TASK.md mais quatro extras (parentId, post inexistente 404, GET de listagem, rejeição de texto acima do limite); 12/12 pass. Zero intervenção humana, zero artefatos de planejamento, zero dependências externas — tudo em um turno único.

O baseline revela o piso: dado contexto suficiente e permissão para decidir, o agente completa a feature — mas o rastro das decisões fica invisível no código, não num documento.

Implementação completa: worktrees/00-baseline.


Ralph Loop

O Ralph não é um pacote — é uma técnica. A premissa: um loop bash de ~100 linhas chama claude -p sem --continue. O contexto do modelo zera a cada iteração; todo estado persiste no disco — src/, test/, um LEARNINGS.md que o agente mantém como memória inter-iteração, e um sentinela .ralph-done. O loop encerra quando o sentinela existe e npm test retorna zero. A ideia, conforme descrita pelo criador Geoffrey Huntley, é que cada iteração seja um agente com contexto completamente zerado — a única continuidade é o que está nos arquivos.

Neste teste, o loop convergiu em uma única iteração, em cerca de 2 minutos. A única intervenção humana foi bash launch.sh. O container Docker subiu com apenas o worktree montado, usuário não-root e HOME isolado — sem acesso a variáveis de ambiente do host ou ao ~/.claude real.

O que aconteceu em seguida foi completamente autônomo: o agente leu o TASK.md, criou DECISIONS.md com 6 decisões documentadas (as 4 ambiguidades do spec mais 2 extras sobre estratégia de escape e representação do soft-delete), implementou src/comments.js com store in-memory, rate-limit por sliding window e um parâmetro _now = Date.now() injetável para testar janelas de tempo sem sleep, e escreveu 19 testes. Durante esse passe, detectou que a checagem da janela de edição usava > onde devia ser >= — o teste de fronteira falhou, o agente corrigiu num único Edit e rodou de novo. O mesmo bug existe no GSD, onde nunca foi testado.

TDD: não em sentido estrito — o código veio antes dos testes dentro da mesma iteração, confirmado pelo transcript. O que aconteceu foi detecção e correção dentro de um único passe de ~2 minutos, não um ciclo RED→GREEN planejado. Um gap real persiste: nenhum dos 21 testes verifica o comportamento de rejeição 429, apesar de o rate limit estar implementado e documentado em DECISIONS.md.

O trade-off do Ralph é que --dangerously-skip-permissions não vem de graça. O sandbox nativo de bubblewrap falhou dentro do Docker — o próprio agente vivenciou isso: o primeiro tool call retornou exit 1 com bwrap: No permissions to create new namespace. Ele adicionou dangerouslyDisableSandbox: true em todas as 6 chamadas Bash seguintes. A contenção real foi Docker + HOME override. O LEARNINGS.md escrito ao final com 4 notas para iterações futuras nunca foi relido — o loop não precisou de uma segunda volta. Em tarefas onde a iteração 1 falha, é esse arquivo que evita que a iteração 2 repita os mesmos erros.

O transcript completo tem 57 mensagens JSONL e 16 tool calls, com zero blocos de thinking. O BMAD produziu 976 mensagens para a mesma tarefa. Ralph usou cerca de 6% do volume de mensagens do framework mais pesado — com zero intervenção humana após o disparo.

Implementação completa: worktrees/06-ralph-loop.


OpenSpec

O OpenSpec decide sozinho — mas deixa rastro: cada escolha ambígua vai para um design.md com racional, não fica invisível no código. É o primeiro framework do lote com instalação real: npm install -g @fission-ai/openspec seguido de openspec init. Ao selecionar "Claude Code" no init, cinco skills e cinco commands são criados no .claude/ do worktree — nenhum toque no ~/.claude global.

A primeira diferença em relação ao baseline aparece logo na entrada: não bastou colar o TASK.md e aguardar. O framework exige invocação explícita — /opsx:propose @TASK.md — e impõe um pipeline de artefatos com bloqueios entre estágios. O proposal precisa existir antes que design e specs sejam escritos; tasks só é possível depois; e a implementação (/opsx:apply) só é desbloqueada quando todos estão completos.

O agente explorou a codebase antes de qualquer artefato — as mesmas leituras de server.js, posts.js e package.json do baseline, mas aqui como parte do protocolo do framework. O proposal.md declarou logo no campo Impact que o sistema seria in-memory e sem dependências externas — sem perguntar. Em seguida, design.md e spec.md foram gerados em paralelo. Foi no design.md que as 4 ambiguidades apareceram: numa seção "Unspecified decisions resolved", com uma tabela que listava valor e racional para cada uma — 2000 chars, janela de edição de 15 minutos, replies preservadas com o pai soft-deletado, e 10 comentários por IP por 60 minutos para rate limit. Tudo decidido unilateralmente. O framework tem uma instrução interna explícita: "prefer making reasonable decisions to keep momentum."

TDD: não — os testes foram escritos depois de comments.js e server.js. 18/18 pass, zero-deps mantido, zero intervenção humana além de confirmar o /opsx:apply.

O contraste com os outros frameworks é revelador. O GSD perguntou as quatro ambiguidades, uma a uma com defaults recomendados. O baseline as decidiu implicitamente no código — invisíveis sem ler a implementação. O OpenSpec ficou no meio: decidiu sozinho, como o baseline, mas documentou cada escolha com justificativa no design.md. O usuário não foi consultado, mas pode ler as razões depois. Com 2 comandos e 237 linhas de artefatos, é o framework mais leve com alguma estrutura — e um dos que melhor separa a decisão da implementação sem pedir aprovação.

Implementação completa: worktrees/01-openspec.


Superpowers

O Superpowers é o único dos sete que roda uma self-review autônoma antes de seguir para o plano — o próprio agente relê e corrige o que acabou de escrever, sem input humano. Não é uma CLI — é um plugin instalado de dentro da sessão, via /plugin marketplace add obra/superpowers-marketplace seguido de /plugin install superpowers@superpowers-marketplace. Com HOME override, ficou em .claude/plugins/ do worktree sem tocar o ~/.claude real. O modelo de operação é uma sequência explícita de skills com escopos delimitados: brainstorming → design → self-review → plan → execute → finish. Cada transição é deliberada; cada skill sabe o que pode e o que não pode fazer naquela fase.

A skill de brainstorming explorou a codebase antes de qualquer pergunta (5 arquivos lidos, git log) e depois fez 2 perguntas — mas nenhuma delas era sobre as 4 ambiguidades do TASK.md. As perguntas foram de design técnico: como sanitizar (strip all tags ou lib externa?) e qual convenção de rota (REST nested ou flat?). As 4 ambiguidades vieram depois, compiladas numa tabela de aprovação com valores e racionais propostos, e um único checkpoint foi pedido antes do design doc de 132 linhas. É o inverso do GSD, que interrogou cada ambiguidade individualmente; o Superpowers consolidou tudo num bloco e pediu um "yes".

Antes de gerar o plano, o framework rodou uma self-review autônoma do spec: o mesmo agente que escreveu o design doc leu e corrigiu 3 problemas — contagem de rotas estava errada (3→4), comportamento com parentId apontando para comentário soft-deletado não estava especificado, e o DELETE precisava ser declarado idempotente. Corrigiu tudo num commit separado, sem input humano.

TDD: sim — confirmado pelo transcript. Os testes foram escritos antes de src/comments.js, e o ciclo RED→GREEN do unit test inicial foi executado: o agente confirmou Cannot find module antes de criar o arquivo de implementação. O plano de 566 linhas embutia passos de TDD com saída esperada de cada node --test, e a execução seguiu esse script. 18/18 pass, zero dependências externas, cerca de 3 intervenções humanas ao longo de toda a sessão.

O diferenciador do Superpowers é a self-review constitutiva — o agente edita seu próprio artefato antes de avançar. Que ele tenha identificado 3 problemas no spec que acabou de escrever, e corrigido autonomamente, diz algo sobre o quanto a estrutura de fases forçou uma releitura crítica que a execução linear não produziria.

Implementação completa: worktrees/03-superpowers.


BMAD-METHOD (BMAD)

O BMAD é o mais cerimonioso dos sete — e o único que esgotou a janela de uso de 5h do Claude Code durante a run. O install (npx bmad-method install) cria 46 skills localmente no .claude/skills/ do projeto, sem tocar o ~/.claude global. A estrutura é de role-agents nomeados: John (PM), Winston (Architect) e Amelia (Dev) são invocados em sequência, e o handoff entre eles acontece exclusivamente via arquivos em disco em _bmad-output/. Não há sessão compartilhada; o próximo agente começa lendo o que o anterior escreveu.

John tratou as 4 ambiguidades com uma abordagem específica: propôs cada valor com rationale em tabela formatada e aguardou um checkpoint único de aprovação antes de gravar no PRD. Um "ok" foi suficiente para mover. O PRD final tinha 166 linhas e 17 cenários com IDs estáveis (T-1..T-17).

Winston varreu o codebase existente antes de qualquer rascunho de arquitetura e fez apenas 2 perguntas — nenhuma reabriu as ambiguidades do PRD. Um detalhe de AD-8 revelou o valor do pipeline: o rascunho inicial assumia reset direto no Map; o usuário pediu exports explícitos (resetComments(), resetRateLimit()). Winston atualizou, selou — e essa decisão arquitetural viabilizou o backdating de timestamps nos testes T-8 e T-14.

O create-story funcionou como gate adversarial: antes de qualquer código, capturou 6 problemas na especificação — ?? {} no rate-limit perderia estado do primeiro request, rateLimitStore ausente dos exports impediria T-14, colisão de parsed.body com a variável HTTP, shadowing de match→postMatch, ausência de finally no teardown, IP hardcoded. Todos corrigidos antes de Amelia começar.

TDD: não — Epic 1 foi código (src/comments.js, src/server.js), Epic 2 foram testes. O primeiro npm test real do framework aconteceu na Story 2.1, depois de toda a lógica implementada. 19/19 pass; cada test() nomeia o cenário do PRD que verifica — T-1 até T-17, rastreabilidade 1:1.

O BMAD exigiu cerca de 25–30 interações humanas — 10 invocações de skill no ciclo dev (5× create-story + 5× dev-story, sem batch) mais os checkpoints de fase. Que a janela de 5h tenha sido esgotada antes do fim não é um bug: é a métrica mais honesta do custo de condução do framework.

Implementação completa: worktrees/04-bmad.


Open GSD (GSD)

O GSD fechou com a suíte de testes mais fina dos sete — 7/7, faltando exatamente o caso mais importante do TASK.md — depois de ter sido o framework que mais perguntou e mais documentou antes de codar. A instalação já dá a régua desse excesso: o GSD (@opengsd/gsd-core) é o único dos sete que não instala no projeto — instala globalmente em $HOME/.claude com paths hardcoded. Sem um HOME descartável, a instalação contamina a config global real. A isolação por HOME foi usada em todos os sete worktrees para isolamento genérico; o que é exclusivo do GSD é que ela passa de precaução a requisito técnico do próprio instalador. Com 69 skills e hooks todos hardcoded em $HOME/.claude/, não há como isolar por projeto.

Antes de qualquer spec, /gsd-explore gerou 7 arquivos de documentação em .planning/codebase/ — stack, integrações, arquitetura, estrutura, convenções, testes e um CONCERNS.md que já sinalizou risco de XSS antes de qualquer código ser escrito. Em seguida, /gsd-new-project configurou preferências de workflow em 6 rodadas de perguntas (modo de execução, granularidade de fases, paralelismo, git tracking de artefatos, research por fase, verificação de planos), gerando PROJECT.md, REQUIREMENTS.md, ROADMAP.md e CLAUDE.md — 12 artefatos, 1148 linhas antes da primeira linha de implementação.

As 4 ambiguidades foram perguntadas uma a uma, com default recomendado para cada uma. Além disso, o GSD levantou uma quinta questão ausente do TASK.md: persistência. Isso levou à adoção de better-sqlite3 via npm — o único framework entre os sete a quebrar a convenção zero-deps do fixture, em vez de usar node:sqlite nativo do Node 24. O codebase map que o próprio GSD havia gerado registrava zero-deps como característica do projeto, mas não pesou na decisão de implementação.

Cada fase tinha um subagente plan-checker que validava o plano antes de um executor rodar. TDD: não — código ao longo das fases 1 e 2, testes escritos na fase 3, cerca de uma hora depois do último commit de implementação. O mecanismo que explica o principal gap de cobertura: o plan-checker da fase 3 instruiu exportar resetRateLimit() para que o beforeEach nunca atingisse o limite de rate. Com isso, RATE-01 — documentado em REQUIREMENTS.md, implementado em server.js — nunca aparece em nenhum teste. A suíte terminou com 7 casos e 7/7 pass.

O GSD gerou a especificação mais completa dos sete, perguntou mais do que qualquer outro, e produziu a menor suíte de testes — porque o mecanismo de isolamento que o próprio planejador criou para os testes também eliminou o caso mais importante a verificar.

Implementação completa: worktrees/05-open-gsd.


GitHub Spec Kit (Spec Kit)

O Spec Kit é o único dos sete onde TDD não é intenção de plano — é uma cláusula "NON-NEGOTIABLE" na project constitution. O tasks.md instrui confirmar RED antes de implementar cada user story. Antes de qualquer código: 9 artefatos, 1254 linhas — spec de negócio, checklist de requisitos, plano técnico, modelo de dados, contrato HTTP completo e tasks por user story.

As 4 ambiguidades foram resolvidas em silêncio pelo /speckit-specify, numa seção "Assumptions" com justificativa de produto para cada uma. Um detalhe: o rate limit foi definido como 5 por IP por 60 segundos — único framework que usou segundos em vez de minutos, o que é mais restritivo. O usuário não foi consultado em nenhuma das quatro.

O /speckit-clarify fez um coverage scan e encontrou 2 pontos de ambiguidade — mas nenhum era das 4 do TASK.md. Perguntou sobre o endpoint de listagem, authorName no tombstone e formato de ID. O clarify encontra ambiguidades que o processo de spec criou, não as que a tarefa intencionalmente omitiu.

TDD: sim — mandatado pela constitution. O implement confirmou 15/17 testes falhando antes de qualquer código. Um bug surgiu nesse processo: stripHtml com só /<[^>]*>/g deixava o conteúdo de <script> intacto — <script>alert(1)</script>Hi virava alert(1)Hi. O fix adicionou dois passos anteriores à regex: remoção de blocos <script> completos, depois <style>. Nenhum dos outros seis frameworks detectou esse comportamento — o TDD por contrato forçou a verificação antes da implementação. Houve context compaction durante a sessão; o agente retomou dos artefatos em disco sem intervenção humana.

19/19 pass, zero dependências externas, ~2 intervenções humanas. Com 1254 linhas de artefatos pré-código, o Spec Kit fez mais verificação que o GSD, com menos papel que qualquer um dos dois. A diferença não foi a quantidade de documentação — foi o que o tasks.md mandava fazer com ela.

Implementação completa: worktrees/02-speckit.


Resultados

Rodados os sete testes, os números lado a lado deixam o contraste claro.

Contagens totais incluem artefatos gerados entre fases (GSD: 17 arquivos, 2483 linhas; BMAD: 11 arquivos, 2372 linhas). A ironia central do experimento: o GSD gerou o maior volume de planejamento e a suíte mais fina — 7/7 testes, nenhum verifica o RATE-01 documentado em três artefatos.

Framework Artefatos Linhas de artefato Turnos manuais Zero-deps Testes TDD
Baseline 0 0 ~1 ✅ 12/12 Não
Ralph Loop 0 0 1 ✅ 21/21 Não
OpenSpec 4 237 ~1 ✅ 18/18 Não
Superpowers 2 698 ~2 ✅ 18/18 Sim
BMAD-METHOD 11 2.372 ~25–30 ✅ 19/19 Não
Open GSD 17 2.483 ~6 ❌ 7/7 Não
Spec Kit 9 1.254 ~2 ✅ 19/19 Sim

Nenhum framework ficou no quadrante inferior direito (perguntou, sem rastro) — quem perguntou também documentou. A única entrada no inferior esquerdo é o Baseline: decidiu tudo e não deixou nenhum artefato além do código.

postura-decisao

Mais papel não comprou mais verificação. O BMAD (2.372 linhas, 27 turnos) e o GSD (2.483 linhas, 6 turnos) produziram os maiores volumes de planejamento; o OpenSpec (237 linhas, 1 turno) ficou com a suíte mais ampla em cobertura relativa, e o Ralph (0 linhas, 1 turno) foi o único a testar a fronteira exata da janela de edição.

artefatos-vs-turnos


O que a pesquisa revelou na minha prática

Nos meus projetos mais recentes, venho usando minha própria abordagem dentro da pasta .ai/, em vez de qualquer um dos sete frameworks acima. Essa convenção é anterior a esta pesquisa; nada aqui foi "aplicado a partir do estudo". Foi o contrário: olhei para o que já vinha fazendo à mão e reconheci, depois, os mesmos mecanismos que os frameworks formalizam.

E a sobreposição é real, ainda que não intencional. Meu runtime/current-state.md cumpre a mesma função do status tracking do BMAD e da memória em disco do Ralph — o próprio agente o atualiza a cada fase, seguindo uma instrução no CLAUDE.md, não um mecanismo embutido de ferramenta. Meus .ai/decisions/*.md são ADRs informais: a mesma ideia das assumptions que o Winston sela no AD-8 do BMAD, sem o template formal. E meus tasks/phase-*.md, com gating por checkbox, são o mesmo phase-gating das fases de roadmap do GSD ou das sprint stories do BMAD — só que garantido por convenção e prosa, não por um subagente plan-checker. Cheguei a formas parecidas sozinho porque o problema por baixo é o mesmo: context drift e memória de fase. Convergência, não cópia.

O que me interessou de verdade foi rodar a mesma régua da pesquisa nos meus próprios projetos — e ali apareceram lacunas concretas, não teóricas:

  • Doc drift. Docs desatualizados, descrevendo uma fase antiga do projeto, ainda são auto-carregados como contexto antes do runtime doc correto. Nenhum dos sete tem exatamente essa falha: eles ou regeneram docs por fase (GSD) ou fazem gate em artefato fresco (OpenSpec, Spec Kit).
  • Redundância. As mesmas regras de execução aparecem copiadas em alguns arquivos — um padrão pensado para loops sem acompanhamento, onde cada arquivo precisa carregar contexto suficiente sozinho. Mas vira puro overhead no desenvolvimento incremental, em que o CLAUDE.md já está sempre carregado.
  • Gate só na prosa. Meu phase-gating existe como instrução escrita ("cheque o current-state.md antes de abrir um task file"), não como checagem imposta — diferente do plan-checker do GSD ou do IR gate do BMAD, que verificou 24/24 requisitos antes de liberar a implementação.

Nenhuma dessas lacunas é motivo para adotar um framework inteiro — a maioria é conserto barato para quem mantém sozinho. Mas o padrão é claro: eu tinha dado autonomia aos agentes sem construir os freios que os frameworks embutem. A pasta .ai/ me deu a autonomia; o que a pesquisa expôs foi onde faltava o controle.

Desses controles, o único com lugar óbvio pra cair no que já tenho é um gate enforced entre planejar e codar: o fluxo que já uso barra cada commit com lint, typecheck e testes; falta o equivalente sobre o plano e o spec, não só sobre o código pronto. O resto é cerimônia que cobra caro adiantado: os role-agents nomeados do BMAD, o install global do GSD, as 1148 linhas de artefato antes da primeira linha de implementação — e se esse custo compensa depende do projeto e de quem está nele.

Num projeto de um mantenedor só, esse volume tende ao desperdício; num time, muda de figura. Um arquivo de estado como o current-state.md já é, na prática, um handoff: devolve o contexto quando o projeto é reaberto depois de dias, e cumpriria o mesmo papel passando o bastão pra outra pessoa. É aí que o rastro pesado do BMAD e do GSD se paga — continuidade entre execuções quando há um dev só, onboarding e histórico compartilhado quando há mais gente. Vale lembrar de onde vem essa leitura: a pesquisa rodou sobre um fixture descartável, tarefa única, um turno. O modo de falha que o gate enforced ataca — doc drift, memória de fase perdida ao longo de semanas e muitas sessões — um fixture assim não reproduz. Se fechar esse buraco compensa o atrito de mais uma engrenagem, um teste de um turno não responde; um projeto real, de várias fases, responderia.

Fica uma lição atravessada nos sete: quantidade de spec não é sinônimo de rigor. Os dois maiores volumes de planejamento produziram a suíte de teste mais fina e a mais cara de conduzir. O que previu a qualidade da verificação foi uma coisa só — o processo exigir uma checagem entre o plano e o código; documentar mais, antes, não moveu esse ponteiro. Escolher um framework é decidir quanto controle se quer de volta e quanto atrito se aceita pagar por ele — conta que muda com a tarefa, sem resposta única.

Conteúdo

  • Conceitos Fundamentais
  • Onde entram os frameworks
  • Rodando o experimento
  • Baseline
  • Ralph Loop
  • OpenSpec
  • Superpowers
  • BMAD-METHOD (BMAD)
  • Open GSD (GSD)
  • GitHub Spec Kit (Spec Kit)
  • Resultados
  • O que a pesquisa revelou na minha prática

© 2026 Guilherme Vitorino. Todos os direitos reservados.