Spec driven development funciona em projeto legado ou só em projeto do zero?

spec driven development aplicado a um projeto legado com spec do delta e testes de caracterização
Resposta rápida

Funciona, mas não do mesmo jeito. Em projeto do zero a spec descreve o comportamento desejado; em spec driven development num projeto legado ela precisa primeiro registrar o comportamento atual, e é aí que a coisa fica mais difícil. O caminho que se sustenta é a spec do delta: especificar só o recorte que a mudança toca, documentar o que o módulo faz hoje (teste de caracterização) antes de mexer e usar os portões de qualidade pra caçar ambiguidade. A documentação oficial do Spec Kit ainda é focada em greenfield, com issue aberta pedindo instruções pra projeto existente

Fala aí, beleza? Todo material de spec driven development começa com a mesma cena: pasta vazia, comando de init, projeto novo brilhando na tela

Aí você olha pro repositório que paga a sua conta

Anos de código, módulo que ninguém entende direito, teste faltando, o cara que escreveu aquilo saiu da empresa em 2021

E bate aquela sensação de que o método não foi feito pra você

A pergunta certa, porém, não é "funciona em legado?"

É: em que ESCOPO funciona?

Neste post eu separo o que dá pra verificar hoje sobre isso no Spec Kit, no Kiro e no Claude Code, sem prometer fórmula mágica. Se você ainda não viu como o SDD funciona, começa por lá que aqui eu já assumo o básico

O que muda entre especificar do zero e especificar o que já existe

O fluxo é o mesmo no papel

O que muda é de onde vem a verdade

No projeto novo, a spec é a única fonte: não existe código pra contradizer ela

Na base existente, o código JÁ é uma fonte de verdade, e ele não pediu licença pra ninguém

Item do fluxo Projeto do zero (greenfield) Base que já existe
Ponto de partida Uma pasta vazia e uma intenção Um módulo em produção com comportamento observável
Fonte da verdade A spec, e só ela O código atual, com a spec correndo atrás
O que a spec descreve O comportamento desejado Primeiro o comportamento atual, depois o desejado
Rede de segurança Você escreve junto, do zero Costuma faltar teste e registro de decisão de arquitetura
Risco principal Especificar coisa que ninguém precisa Quebrar comportamento que alguém dependia em silêncio
Formação Claude Code
Formação Recomendada

Formação Claude Code

Domine Claude Code do absoluto zero até o avançado

  • 114 aulas
  • 4 projetos
  • 9h 18min

Essa linha da rede de segurança é o coração da diferença

Existe um nome antigo pra ela: teste de caracterização, conceito do Michael Feathers no Working Effectively with Legacy Code

É o teste escrito pra documentar o que o código faz HOJE, não o que ele deveria fazer, e preservar isso enquanto você mexe

Sacou a inversão? No zero você escreve o teste do futuro

No legado você escreve o teste do presente, pra ter coragem de mudar o futuro

E vale o aviso honesto: a documentação oficial do Spec Kit, o kit de spec driven development pra agentes de IA mantido no repositório github/spec-kit, ainda é focada em projeto novo

Tem inclusive uma issue aberta pedindo instruções pra projetos existentes, a #1285, de 04/12/2025

Ou seja: não é impressão sua, o caminho do legado é menos pavimentado mesmo

Por que a especificação retroativa é mais difícil

A spec gerada não parece o seu projeto:

Sintoma: você roda o init na base existente, abre os arquivos e parece spec de outro sistema, com nomes e estrutura que não existem ali

Causa: o specify init gera templates genéricos, que não refletem a stack, a arquitetura nem as convenções reais da sua base. Esse é justamente o motivo declarado das extensões de comunidade pra código legado

Solução: dar contexto de projeto ANTES de pedir spec. No Claude Code o CLAUDE.md na raiz é lido automaticamente no início da sessão e funciona como memória persistente, com padrões de código e decisões de arquitetura. No Kiro o equivalente são os arquivos de steering, em .kiro/steering/ na raiz do workspace, pra informar padrões, bibliotecas e convenções

Como prevenir: trate o contexto como pré-requisito, não como bônus. Template genérico não é bug da ferramenta, é falta de matéria-prima

Ninguém sabe qual comportamento é intencional:

Sintoma: você acha um arredondamento estranho, um retry esquisito, um if que trata um caso específico. É regra de negócio ou gambiarra de 2019?

Causa: base legada costuma não ter registro de decisão de arquitetura (ADR), tem pouca ou nenhuma cobertura de teste, e os engenheiros que conheciam a intenção original já saíram

Solução: teste de caracterização antes de mudar qualquer coisa. Você não precisa decidir se aquilo é certo, só precisa registrar que é assim que funciona hoje

Como prevenir: nunca escreva a spec do "como deveria ser" sem antes fixar o "como está". A spec do desejado sem a foto do atual é só um pedido de desculpas futuro

A spec sai ambígua e ninguém percebe:

Sintoma: o agente implementa, roda, e o resultado é plausível mas não é o que você queria. Aí você descobre que a ambiguidade estava lá desde o início

Causa: em legado a spec nasce cheia de subentendido, porque metade do contexto está na cabeça de quem leu o código, não no arquivo

Solução: usar os portões de qualidade do Spec Kit. O checklist gera uma checagem da PRÓPRIA especificação (se ela está completa, clara, não ambígua e consistente), não do código. Já o analyze, que na maioria dos agentes você invoca como /speckit.analyze (é o mesmo comando, só com o prefixo do Spec Kit), é somente leitura e nunca edita arquivo: ele cruza spec.md, plan.md e tasks.md e devolve um relatório de conflitos, lacunas e ambiguidades

Como prevenir: rode os portões justamente quando bater aquela preguiça de rodar. É onde eles pagam mais

Como escrever a spec de um módulo específico numa base que já existe

A ideia aqui é uma só: spec do delta

Você não vai especificar o sistema inteiro retroativamente. Vai especificar o recorte que a sua mudança encosta, e deixar cada bug fix, feature ou refactor virar uma oportunidade de acrescentar spec perto da área que mudou

Bora ver na prática?

  1. Instala o kit dentro do repositório que já existe

A CLI já inicializa num projeto existente, sem criar pasta nova:

specify init .
# ou
specify init --here

A flag --here deposita a pasta .specify/, os templates e os arquivos de comando do agente ao lado do código existente, sem tocar no seu código

Se você não quer instalar nada permanente, dá pra rodar via uvx apontando pro repositório oficial. O comando documentado pro uso avulso é este, com nome de projeto:

uvx --from git+https://github.com/github/spec-kit.git specify init NOME_DO_PROJETO

Repara que essa forma é a do nome de projeto, não a do repositório que já existe. Pra encaixar na base que você já tem, o init que você quer continua sendo o . ou o --here de cima

E tem a variante @vX.Y.Z pra fixar uma release específica, o que é bem sensato em base grande

O erro comum deste passo: rodar o init na raiz de um monorepo achando que ele vai entender tudo sozinho. Ele instala a estrutura, não a compreensão

  1. Registra o contexto do projeto antes de pedir qualquer spec

No Claude Code, é o CLAUDE.md na raiz

Padrões de código, decisões de arquitetura, convenções que já existem e você NÃO quer que sejam reinventadas

O erro comum deste passo: escrever um CLAUDE.md de ferramenta ("usamos React") em vez de um de decisão ("essa camada não pode chamar o banco direto, passa sempre pelo repositório"). O segundo é o que salva a spec

  1. Documenta o comportamento atual do módulo, com teste de caracterização

Antes de mexer, congela o que existe

O teste de caracterização documenta o que o código faz hoje, não o que ele deveria fazer. É a sua rede

O erro comum deste passo: "corrigir" um comportamento esquisito enquanto escreve o teste. Se está esquisito, ANOTA e segue. Corrige depois, com a spec na mão, sabendo o que quebra

  1. Levanta o terreno com o plan mode do Claude Code, sem escrever código

Pera, antes que role confusão: esse plan mode é recurso NATIVO do Claude Code, reconhecimento de terreno pra ele ler a base sem editar nada

Ele NÃO é a fase /plan do Spec Kit. Essa vem depois da spec, lá no passo 6, e a ordem do fluxo continua sendo specify antes de plan

Você aperta Shift+Tab até aparecer plan mode on, ou já inicia a sessão assim:

claude --permission-mode plan

Pra sair, aprova o plano ou aperta Shift+Tab de novo

Esse passo é ouro em legado, porque o agente lê e propõe sem sair editando arquivo que você nem sabia que existia

O erro comum deste passo: aprovar o plano no automático, no modo next, next e finish. O plano é exatamente o momento de discordar barato

  1. Escreve a spec só do recorte, com requisito testável

Aqui vale roubar a notação EARS que o Kiro usa no requirements.md, no padrão WHEN <condição/evento> THE SYSTEM SHALL <comportamento esperado>

É chatinho de ler no começo, mas resolve o problema do requisito que não dá pra verificar

No Kiro, aliás, a feature spec é composta por três arquivos versionáveis: requirements.md (ou bugfix.md), design.md e tasks.md

O erro comum deste passo: deixar escapar um "o sistema deve ser rápido". Rápido quanto, medido onde, em qual condição?

  1. Roda o fluxo, sem cerimônia desnecessária

O Spec Kit expõe os comandos constitution, specify, clarify, plan, checklist, tasks, analyze, implement e converge, que na maioria dos agentes aparecem como /speckit.*

Só o specify é estritamente obrigatório antes do plan

Caminho enxuto: specifyplantasksimplement

Caminho completo acrescenta clarify, checklist e analyze, que são portões de qualidade opcionais

Em legado, minha leitura é que os opcionais deixam de ser tão opcionais assim, justamente por causa da ambiguidade herdada

O erro comum deste passo: pular direto pro implement porque "é um módulo pequeno". Módulo pequeno em base antiga é o que mais tem dependência escondida

E se você repetir esse ritual em vários projetos, faz sentido empacotar ele. Os comandos personalizados do Claude Code hoje têm formato recomendado de skill, em .claude/skills/<nome>/SKILL.md, invocável por /nome, com o diretório .claude/commands/ marcado como legado. Tem um post aqui sobre empacotar esse fluxo numa skill reusável que fecha bem esse ciclo

Quando vale a pena e quando não vale

Feature nova encostada em módulo antigo: vale muito

É o caso mais confortável

O comportamento novo você especifica normalmente, como faria no zero

O trabalho extra fica só na fronteira: o que o módulo antigo garante hoje e você não pode quebrar

Bug fix que precisa preservar comportamento: vale

O Kiro aceita bugfix.md no lugar do requirements.md justamente nesse cenário

Faz sentido: bug fix raramente é "requisito novo", é "o comportamento certo era esse aqui e a gente vai provar"

Refactor ou modernização: é onde mais rende

Extrair spec do código legado é usado pra verificar que a modernização preserva o comportamento exigido

E pra separar o que é comportamento desejado do que é comportamento não documentado, com rastreabilidade de volta ao código-fonte

Essa distinção é o pulo do gato: nem tudo que o sistema faz hoje é regra, parte é acidente que virou tradição

Feature bem entendida e pequena: o portão pesa

Se todo mundo já sabe o que precisa ser feito, rodar clarify, checklist e analyze vira burocracia

O Kiro reconhece isso e oferece variantes: Feature Specs no modo Requirements-First e Design-First, além do Quick Spec, que gera os três artefatos sem portões de aprovação

Usa o formato do tamanho do problema, beleza?

Especificar o sistema inteiro retroativamente: não

Esse é o contraponto honesto do post

A recomendação recorrente pra base existente é spec do delta, mais granular perto da área de mudança, e não uma empreitada de documentar o monólito todo

Vale saber também que as extensões de bootstrap pra código legado no Spec Kit são de comunidade, de terceiros: wcpaxx/spec-kit-brownfield-extensions e Quratulain-bilal/spec-kit-brownfield, com a proposta de extensão registrada na issue #1436 do repositório oficial

Ou seja: existe gente resolvendo, mas não é caminho oficial ainda. Entra sabendo disso

A decisão prática para quem não vai reescrever o sistema

Meu veredito, sem ficar em cima do muro: adota por MÓDULO, no ritmo das mudanças que você já ia fazer de qualquer jeito

A spec vira subproduto do trabalho, não um projeto de documentação paralelo que morre no terceiro sprint

Compensa se você tem um sistema que vai continuar vivo por anos, mexe nele com frequência e sofre com regressão em coisa que ninguém lembrava que existia

Não compensa se a sua meta é documentar tudo antes de tocar em qualquer coisa. Isso não é spec driven development, é um plano de documentação com nome bonito

O que ainda é terreno instável, pra você entrar de olho aberto: a documentação oficial do Spec Kit é focada em greenfield, e o suporte a base existente hoje vem de comunidade e de discussão aberta

O que NÃO é o gargalo: compatibilidade

O Spec Kit declara suporte a mais de 30 agentes de IA, incluindo o Claude Code

E o Kiro versiona as specs junto do código por design, em .kiro/specs, commitadas no repositório

Inclusive os walkthroughs de comunidade do Spec Kit já incluem extensões de bases legadas bem gordas: um CMS em ASP.NET com cerca de 307.000 linhas e um runtime Jakarta EE com cerca de 420.000 linhas em 180 módulos Maven

Não é que "não dá em legado"

É que dá de um jeito diferente do que os tutoriais mostram

Conclusão

Resposta curta pro título: funciona em legado sim, desde que você especifique o DELTA e não o monólito

A spec no projeto do zero descreve o futuro

A spec no legado começa descrevendo o presente, e é essa etapa a mais que faz ela parecer mais difícil (porque é mesmo)

Próximo passo, e é pequeno de propósito: escolhe o próximo módulo que você JÁ ia tocar essa semana

Documenta o comportamento atual dele antes de mexer

E escreve a primeira spec só desse recorte, mais nada

Se funcionar, você repete no próximo módulo. Se não funcionar, você perdeu uma tarde e não um trimestre 🙂

até o próximo post!

Perguntas frequentes

Spec driven development funciona em projeto legado sem cobertura de teste?

Funciona, mas o obstáculo real é justamente esse: base legada costuma não ter ADR, ter pouca ou nenhuma cobertura de teste e perder o engenheiro que conhecia a intenção original. Por isso o passo recomendado antes de especificar qualquer mudança é o teste de caracterização, que documenta o que o código faz hoje, não o que deveria fazer.

É preciso rodar clarify, checklist e analyze em todo projeto?

Não. Só o specify é estritamente obrigatório antes do plan, no caminho enxuto specify → plan → tasks → implement. Clarify, checklist e analyze são portões de qualidade opcionais, e em base legada eles pagam mais justamente por causa da ambiguidade que o código já carrega. Só não confunda a fase plan do Spec Kit, que vem depois da spec, com o plan mode nativo do Claude Code, que é reconhecimento de terreno antes de escrever código.

O comando analyze do Spec Kit muda ou edita o código do projeto?

Não, o analyze (que na maioria dos agentes aparece como /speckit.analyze, é o mesmo comando com o prefixo do kit) é somente leitura e nunca edita arquivos. Ele cruza spec.md, plan.md e tasks.md e devolve um relatório de conflitos, lacunas e ambiguidades, o que ajuda bastante quando parte da spec nasceu de um código legado cheio de subentendido.

Dá pra usar o Spec Kit sem instalar nada permanente?

Dá, via uvx apontando direto para o repositório oficial: uvx –from git+https://github.com/github/spec-kit.git specify init NOME_DO_PROJETO. Existe também a variante com @vX.Y.Z para fixar uma release específica, o que é sensato em base grande. Repare que essa é a forma com nome de projeto: para inicializar dentro de um repositório que já existe, sem criar pasta nova, o init é specify init . ou specify init –here.

Existem extensões oficiais do Spec Kit para código legado?

Não. As extensões de bootstrap para legado, como wcpaxx/spec-kit-brownfield-extensions e Quratulain-bilal/spec-kit-brownfield, são de terceiros da comunidade, não do repositório oficial do GitHub. A proposta de extensão oficial ainda está em discussão na issue #1436, e a própria documentação oficial reconhece o gap via issue #1285.

Como o Kiro guarda o contexto do projeto existente para gerar spec mais fiel?

O Kiro usa arquivos de steering em .kiro/steering/, na raiz do workspace, para informar padrões, bibliotecas e convenções do projeto. As specs geradas ficam em .kiro/specs e são commitadas junto do código, o que é o equivalente funcional ao CLAUDE.md do Claude Code.



Escrito por | Matheus Battisti

Matheus Battisti
Fundador da Hora de Codar

Programador apaixonado pelo mundo das tecnologias, sempre buscando em aprender e se aprofundar em linguagens, frameworks e o que mais for necessário para executar um bom trabalho. Agora tem uma nova missão que é de passar seu conhecimento adiante para formar novos programadores e especializar mais os que já são.

Subscribe
Notify of
guest

0 Comentários
Oldest
Newest Most Voted

Formações

Formação Vibe Coding

Formação Vibe Coding

Do Prompt ao Produto: Crie Software Real com IA

  • 474 aulas
  • 20 projetos
  • 39h 27min

Blog | Mais populares