O modelo
04 · Ciclo de vida de uma stack
Uma stack passa por cinco fases. Entre elas há portões: condições verificáveis sem as quais a fase seguinte não começa. O mais importante é o portão 1: nenhum código antes de a stack estar definida.
As fases
Fase 0 — Nascimento
Objetivo: existir um repositório com as regras do jogo e nenhum código.
| O que existe | O que não existe |
|---|---|
README.md com o nome, o propósito e "Estado: Fase 1 — definindo a stack" | O que não existe: nenhum código |
AGENTS.md completo; CLAUDE.md importando-o (@AGENTS.md) | O que não existe: nenhum Dockerfile, compose.yaml, build |
docs/decisoes/organizacao/ com a cópia das ORGs; docs/decisoes/ com as ADRs pré-escritas, propostas e com lacunas | O que não existe: nenhuma spec de produto |
docs/stack.md — a ficha da stack, toda em lacunas | O que não existe: |
docs/produto/visao.md — o propósito do produto, em lacunas | O que não existe: |
openspec/ inicializado (os comandos /opsx:*, na versão do OpenSpec que o modelo traz), config.yaml com lacunas | O que não existe: |
.claude/ com os hooks; ARQUITETURA com a versão de origem | O que não existe: |
eng/gaps.sh, eng/pinned-versions.sh, eng/tdd-order.sh e o kit de rabiscos | O que não existe: |
e2e/hierarchy/, o harness do E2E | O que não existe: |
O mantenedor cria a stack a partir deste repositório, numa versão da arquitetura:
eng/new-stack.sh ../enterprise-stack-atendimento --platform enterprise --product atendimento \
--version arquitetura-v0.1.0O script copia o modelo, as ORGs e o kit de rabiscos; escreve o ARQUITETURA; preenche o que a
Fase 0 já sabe (o nome do produto, a plataforma e o repositório); roda o openspec init; e confere
o resultado (hooks, scripts, versões fixas, ordem do TDD). Ele não toca no Git: no fim, imprime os
comandos do primeiro commit, que são do mantenedor. Uma pré-versão também serve (--version arquitetura-v0.1.0-dev). Antes da primeira tag, --draft
copia a árvore de trabalho e grava arquitetura-rascunho-<commit> no ARQUITETURA.
Portão 0: o repositório existe, o mantenedor fez o primeiro commit, e um agente
aberto nele lê o AGENTS.md e responde que está na Fase 1.
Fase 1 — Definição da stack
Objetivo: decidir tudo o que depende de tecnologia e de produto, por escrito, antes de construir.
Como se trabalha nesta fase: em conversa com o agente, usando /opsx:explore para
pensar. O agente não escreve código — ele preenche a ficha, propõe as ADRs e
aponta as consequências de cada escolha. A ordem importa: tecnologia vem depois de
saber quem usa e quantas aplicações há, porque é isso que pesa na escolha.
Por que não há change do OpenSpec aqui: a Fase 1 decide como construir, não o que o produto faz. Isso é ADR. O OpenSpec entra na Fase 2.
Portão 1 (verificado por eng/gaps.sh, que roda na CI desde o primeiro commit):
- nenhuma ocorrência de
{{LACUNA:no repositório; - todas as ADRs pré-escritas com status aceita;
docs/stack.mdcom toda ferramenta acompanhada da versão exata;README.mdcom os pré-requisitos e as versões.
Enquanto o portão 1 estiver fechado, o AGENTS.md instrui o agente a recusar
qualquer pedido de código e voltar à ficha.
Fase 2 — Fundação
Objetivo: ter o esqueleto da stack funcionando de ponta a ponta, antes de qualquer funcionalidade de produto. Toda stack faz as mesmas changes de fundação, na mesma ordem — o que muda é a tecnologia dentro delas.
| # | Change | Entrega | Prova |
|---|---|---|---|
| 1 | Change: esqueleto | Entrega: módulos que compilam; um teste de unidade e um de integração (banco em container); Dockerfile por aplicação; compose.yaml com o banco; CI com build, testes, lacunas e versões | Prova: <build> && docker compose up sobe tudo; CI verde |
| 2 | Change: identidade | Entrega: cada aplicação exige login no seu realm; permissões e perfis conferidos pelo código; eng/auth/provision.sh idempotente; realms de desenvolvimento com um usuário por perfil; página de acesso negado; logout | Prova: teste de integração com Keycloak real em container; docs/acesso/<app>.md completo |
| 3 | Change: e2e-base | Entrega: e2e/ com o harness hierárquico, eng/e2e.sh, login por perfil, capturas desligadas por padrão; agrupamento identidade | Prova: eng/e2e.sh verde do zero; eng/e2e.sh identidade/login/<caso> verde sozinho |
| 4 | Change: observabilidade | Entrega: log JSON no stdout, métricas na porta interna, traces OTLP, /up; Tempo + Grafana locais num perfil do Compose | Prova: teste de integração do contrato; trace visível no Grafana local |
| 5 | Change: aparencia | Entrega: cópia do design system, entrega pelo build, layout com os três menus, temas, página de erro, aviso de ambiente LOCAL | Prova: verificador sem erro; caso E2E de aparência; capturas nos dois temas |
| 6 | Change: implantacao | Entrega: deploy/<app>/ com Dockerfile, deploy.yml, .kamal/secrets (só referências), a partir dos esqueletos de deploy/README.md; accessory de banco e de backup; script de restauração; guias de implantação (com o catálogo de todas as variáveis e o portão 3 na ordem), identidade em produção e backup | Prova: docker build de cada imagem; restauração testada localmente; instruções de deploy para o mantenedor |
A identidade vem antes da e2e-base porque o E2E entra com um usuário por perfil, e esses
usuários nascem na identidade. Por isso as telas dela (login, acesso negado, logout) são a
única exceção à regra de que nenhuma tela muda sem caso E2E: na própria change, ficam
cobertas por teste de rota e pelo teste de integração com o Keycloak, e os casos E2E delas
chegam na e2e-base, no agrupamento identidade.
Portão 2: o mantenedor sobe o ambiente local do zero com um comando, entra em cada aplicação com cada perfil, vê telemetria local, roda a regressão E2E verde, e tem em mãos as instruções para o primeiro deploy.
Fase 3 — Produto
Objetivo: entregar as capabilities do produto, uma change por vez.
O ciclo completo está em 09 · Mudanças com OpenSpec e TDD.
Portão 3 (antes do primeiro deploy real): realms e clients provisionados no
Keycloak real; segredos no Bitwarden; DNS apontado; métricas e traces ligados no
toolbox; restauração de backup testada. Cada item é uma linha do guia de implantação
com uma caixa de seleção, na ordem do
13: a identidade vem antes
de qualquer deploy, porque o segredo do client é um dos segredos dele.
Fase 4 — Operação
A stack está no ar e continua recebendo changes. Algumas rotinas passam a existir:
| Rotina | Gatilho | Como |
|---|---|---|
| Deploy | Gatilho: change concluída e commitada | Como: mantenedor, kamal deploy a partir de deploy/<app>/ |
| Backup | Gatilho: diário, automático | Como: accessory de backup |
| Teste de restauração | Gatilho: antes de subir versão maior do banco; periodicamente | Como: guia de backup |
| Atualizar o design system | Gatilho: nova versão no enterprise-stack-design | Como: change (ver 16) |
| Atualizar a arquitetura | Gatilho: nova versão aqui | Como: change (ver abaixo) |
| Atualizar dependências | Gatilho: aviso de segurança ou versão maior | Como: change; ADR se houver alternativa |
Uma stack acompanha a arquitetura como acompanha o design system
A arquitetura também tem versões. A stack registra de qual versão nasceu (arquivo
ARQUITETURA na raiz, como o vendor/hibex/VERSAO) e adota as versões novas por
change, seguindo o "Para as stacks" do CHANGELOG.md daqui. O caminho de volta são os pedidos:
o que a stack aprende e a arquitetura não dá vai para docs/decisoes/pedidos-a-arquitetura.md, o
mantenedor o traz para cá, e a versão que o atende o cita no "Para as stacks".