Começar
Aparência

Vale na hora e fica lembrada neste navegador.

Como se trabalha

09 · Mudanças com OpenSpec e TDD

Toda mudança de comportamento é uma change do OpenSpec. Toda linha de código de uma change nasce de um teste que falhou antes. As duas regras se encaixam: a spec diz o que deve acontecer, o teste prova que acontece, o código faz acontecer.

O ciclo de uma change

O ciclo de uma change em duas raias. O mantenedor pede; se o escopo é incerto, o agente explora com perguntas e o mantenedor responde. O agente propõe a change (e uma ADR, se houver decisão técnica); o mantenedor revisa. O agente aplica em TDD, roda os casos E2E novos e a regressão completa, e entrega com o ambiente no ar. O mantenedor valida — ajustes voltam ao apply —, o agente sincroniza e arquiva, e o mantenedor faz o commit. mantenedoragentepedido/opsx:exploreperguntas numeradas, opções, recomendaçãorespostas"1a, 2b, 3a"/opsx:proposeproposal · design · specs · tasks (+ ADR)revisãoajusta ou aprova/opsx:applytarefa a tarefa, em TDDcasos E2Edos cenários novos, setups em cascataregressão completado zero, com 0 falhaentregaambiente no ar, resumo por telavalidaçãona tela, com os dados/opsx:sync + archiveas specs vivas atualizadascommite deploy, se for o casoajustessó se o escopoé incerto

O que cada artefato da change contém

ArtefatoConteúdoRegras do modelo (openspec/config.yaml)
proposal.mdConteúdo: por quê, o que muda, o que fica de fora, impactoRegras do modelo (openspec/config.yaml): aponta as capabilities afetadas
design.mdConteúdo: como: decisões numeradas (D1, D2…), alternativas, riscosRegras do modelo (openspec/config.yaml): aponta módulos e migrations afetados; decisão com alternativa relevante → ADR
specs/<capability>/spec.mdConteúdo: requisitos delta (ADDED/MODIFIED/REMOVED), cada um com cenários WHEN/THENRegras do modelo (openspec/config.yaml): cenários concretos; cada requisito em até 500 caracteres, porque o openspec validate --all --strict da CI recusa o mais longo; distingue regra da aplicação de regra do Keycloak
tasks.mdConteúdo: tarefas numeradas, agrupadas por móduloRegras do modelo (openspec/config.yaml): teste antes do código; cada cenário mapeado para um teste; tarefa de E2E; tarefa de documentação; tarefa de verificação final

A forma do tasks.md

Markdown
## 1. Domínio (<modulo-comum>)

- [ ] 1.1 Teste de unidade: conceder crédito negativo é recusado (cenário "valor inválido")
- [ ] 1.2 Código: a carteira recusa valor ≤ 0
- [ ] 1.3 Teste de integração, com o banco real: o extrato é append-only
- [ ] 1.4 Código: a migration que torna o lançamento imutável

## 2. Aplicação de gestão

- [ ] 2.1 Caso E2E `carteira/concessao/recusa-valor-negativo` (cenário "valor inválido"): falha, a tela ainda não existe
- [ ] 2.2 Caso E2E `carteira/concessao/credito-aparece-no-extrato`: falha
- [ ] 2.3 Teste de rota: conceder sem `carteira:conceder` → 403
- [ ] 2.4 Código: a rota e a tela; o teste de rota e os dois casos passam

## 3. Documentação e verificação

- [ ] 3.1 `docs/acesso/gestao.md`: permissão `carteira:conceder` no perfil gestor
- [ ] 3.2 `ARCHITECTURE.md`: parágrafo da capability
- [ ] 3.3 Build verde + verificador + `eng/e2e.sh` (regressão do zero) com 0 falha
- [ ] 3.4 Capturas só das telas afetadas: `gestao-carteira` (se a stack tem acervo)

O ciclo TDD dentro de cada tarefa

O TDD dentro de cada tarefa: o teste nasce do cenário e falha (vermelho); se falhou pelo motivo errado, conserta-se o teste. O código mínimo o faz passar (verde). Melhora-se sem mudar o comportamento (refatorado), com a suíte verde. Então a tarefa é marcada. vermelhoo teste falhaverdepassarefatoradomais claroo teste nascedo cenáriocódigo mínimomelhora sem mudara suíte segue verdefalhou pelo motivo errado? conserta o testetarefa [x]

O que "teste primeiro" significa na prática

  1. O teste nasce do cenário da spec. O nome do teste diz o cenário; o comentário de cabeçalho cita a spec (spec: carteira-moeda-hibex › Concessão › valor inválido);
  2. O agente roda o teste e o vê falhar antes de escrever o código — e confere que a falha é a esperada (uma asserção, não um erro de compilação de outra coisa);
  3. Código mínimo para passar. Nada de "já que estou aqui";
  4. Refatoração com a suíte verde;
  5. Relato: ao marcar a tarefa, o agente diz em uma linha "vermelho por X → verde". Esse relato é o que permite ao mantenedor confiar no TDD sem assistir à sessão.

Em que camada testar

Em que camada vai o teste de cada cenário: uma regra de negócio vai para a unidade; o banco garantir algo, para a integração com banco real; uma rota com status, permissão ou redirect, para o teste de rota; o fio real com o Keycloak ou a telemetria, para a integração com eles em container; o usuário conseguir fazer algo numa tela, para um caso E2E. o cenário é sobre…uma regra de negócio: cálculo, transição, validaçãoo banco garantir algo: constraint, trigger, consultauma rota: status, permissão, view, redirecto fio real com o Keycloak ou a telemetriao usuário conseguir fazer algo numa telaunidadeno módulo de domínio, em milissegundosintegraçãocom banco realteste de rota, sem redeKeycloak ou coletor, em containercaso E2Eagrupamento, cenário e caso

Regra de proporção: a maior parte dos cenários é coberta por unidade e teste de rota; o E2E cobre o caminho do usuário de cada requisito, não cada combinação. Um cenário de spec pode ser coberto em mais de uma camada, mas pelo menos em uma.

Como o TDD chega ao OpenSpec

O OpenSpec não sabe de TDD; o modelo o ensina por três caminhos, e um script confere:

OndeO que levaQuando chega ao agente
openspec/config.yaml, rules.tasksO que leva: teste e código em tarefas separadas, o teste antes em cada grupo, o tipo no começo de cada tarefa, o caso E2E antes da telaQuando chega ao agente: ao gerar o tasks.md (/opsx:propose), como regra obrigatória
openspec/config.yaml, contextO que leva: rodar o teste e vê-lo falhar antes do código; o relato "vermelho por X → verde"Quando chega ao agente: em todo artefato e também no /opsx:apply
AGENTS.md e o guia fluxo-openspec.mdO que leva: as mesmas regras, com o modelo de tasks.mdQuando chega ao agente: sempre
eng/tdd-order.shO que leva: confere, em cada grupo de cada tasks.md aberto, que nenhuma tarefa Código: vem antes de uma tarefa de testeQuando chega ao agente: o agente roda antes de pedir a revisão; a CI roda em todo push

Cada tarefa começa pelo tipo — Teste de unidade:, Teste de integração:, Teste de rota:, Caso E2E …: ou Código: —, e é isso que torna a ordem conferível. Código que não muda comportamento (criar a pasta de um módulo, renomear) leva Código (sem teste: <razão>):, com a razão à vista do revisor. A instrução padrão do OpenSpec sugere "implementar e verificar" numa tarefa só; a regra do modelo a substitui.

Uma armadilha: um item de rules com ": " fora de aspas vira chave e valor no YAML, e o OpenSpec descarta todas as regras daquele artefato, só com um aviso. O teste eng/tests/test_openspec_config.py do modelo pega esse erro.

TDD também no E2E

O caso E2E de um cenário novo é escrito antes da tela existir, e falha (não acha o botão, a rota responde 404). Na tela pronta, passa. Isso tem duas vantagens sobre um roteiro escrito depois da tela:

  • o caso descreve a tela pelo que o usuário faz, não pela estrutura que acabou saindo;
  • a quebra de um caso antigo por uma mudança de tela aparece durante a change, não numa corrida de roteiro dias depois.

O que é change, e o que não é

É change (OpenSpec)Não é change
comportamento novo ou alteradoNão é change: correção de texto em documentação
tela nova ou alteradaNão é change: ajuste de comentário
atualização do design system (vendor/hibex/)Não é change: regerar capturas sem mudança de tela
atualização da arquitetura (ARQUITETURA)Não é change: ADR nova sem código (a ADR já é o registro)
versão maior de dependênciaNão é change:
nova aplicação na stackNão é change:

Correção de bug

Bug também entra por change, mas pequena, a critério do mantenedor: uma tarefa com o teste que reproduz o bug (vermelho) e outra com a correção (verde). A spec só muda quando o comportamento esperado estava errado; se a spec estava certa e o código não, ela fica como está.

Regras de convivência

  • Uma change em apply por vez. Outras podem estar propostas, esperando;
  • Change grande se divide antes do apply (ex.: adotar o design system em etapas, ou uma atualização grande dele em várias changes — cada uma verificável sozinha);
  • Perguntas de escopo vão como lista numerada em prosa, cada uma com opções (a)/(b)/(c) e a recomendada primeiro — o mantenedor responde "1a, 2b";
  • A change não termina no código: termina quando o mantenedor validou o ambiente no ar, as specs foram sincronizadas e a change foi arquivada.