Arquitetura de stacks da Hibex
Arquitetura de stacks web da Hibex
O modelo com que toda stack web da Hibex Solutions nasce, cresce e é operada. Decide de antemão o que não depende de tecnologia e deixa marcado o que depende, para que cada produto novo comece de onde o anterior chegou, e não do zero.
Repositório: stack-architecture — transversal a todas as plataformas da Hibex; as stacks
seguem o nome <plataforma>-stack-<produto>.
Em 60 segundos
- Stack = produto = repositório. Um repositório entrega um produto, com uma ou mais aplicações (cada uma com sua imagem Docker, endereço, client no Keycloak e família de cor).
- Um modelo zerado com lacunas. Tudo o que vale para qualquer tecnologia já vem decidido
(regras, ORGs, estrutura, rotinas). O que depende da tecnologia vem marcado como
{{LACUNA:<id>}}, para a stack preencher ao nascer. - Nenhum código antes da stack definida. A ficha da stack (linguagem, framework, banco, testes, versões exatas) é preenchida e aceita primeiro. A CI fica vermelha enquanto houver lacuna.
- A mesma fundação para todas. Seis changes iguais em toda stack (esqueleto, identidade, E2E, observabilidade, aparência, implantação) antes da primeira funcionalidade de produto.
- Toda mudança por OpenSpec, todo código por TDD. Os testes fim a fim são hierárquicos (agrupamento → cenário → caso), e qualquer caso roda sozinho, com os setups dos níveis acima.
- Plataforma comum. Docker, Compose, Kamal, Bitwarden Secrets Manager, Keycloak, o contrato de observabilidade, backup testado e o design system da Hibex valem para todas as stacks.
- O humano publica, o agente prepara. Git, deploy, infraestrutura e segredos são do
mantenedor; as regras dos agentes moram no
AGENTS.md.
Por que existe
Uma stack construída enquanto as regras são descobertas paga caro pelo que chega tarde:
| O que chega tarde | Custo | No modelo |
|---|---|---|
| Design system adotado depois das telas | Custo: uma change de adoção para cada grupo de telas | No modelo: entra na fundação, antes da primeira tela |
| Roteiro de ponta a ponta em seções que dependem das anteriores | Custo: testar uma tela exige rodar todas as anteriores | No modelo: E2E hierárquico, casos independentes |
Versões flutuantes na CI (@latest, ubuntu-latest) | Custo: build não reproduzível | No modelo: toda versão é exata, e a CI confere |
| Um papel único por aplicação | Custo: perfil novo exige código | No modelo: permissões e perfis desde a fundação |
| Nome do produto trocado no meio do caminho | Custo: renomear repositório, módulos e realms | No modelo: visão e nomes antes de qualquer pasta |
Este repositório transforma esse aprendizado num modelo, para toda stack começar do ponto em que uma stack madura chega. Como histórico: as regras foram concebidas a partir do estudo de uma primeira stack de produto da Hibex, construída antes deste modelo (19 · Aprendizados).
Escopo
| Cobre | Não cobre |
|---|---|
| Regras de trabalho com IA, Git, segredos e infraestrutura | Não cobre: A infraestrutura compartilhada em si (é do toolbox) |
| Estrutura de repositório, documentação e decisões | Não cobre: O design system em si (é do enterprise-stack-design) |
| Ciclo de vida de uma stack, da criação à operação | Não cobre: A escolha de linguagem, framework e banco de cada stack |
| Testes: princípios das três camadas e o modelo de E2E | Não cobre: O domínio e as regras de negócio de cada produto |
| Identidade e acesso, observabilidade, backup, implantação | Não cobre: Aplicações sem interface web (por enquanto) |
| Como uma stack acompanha as versões da arquitetura | Não cobre: |
A arquitetura num relance
Toda decisão de uma stack mora numa de três camadas, e a de cima vence: o que falta em cima vira pedido, nunca exceção local.
| Assunto | Fixo em toda stack | Lacuna (a stack decide ao nascer) |
|---|---|---|
| Linguagem e framework | Fixo em toda stack: — | Lacuna (a stack decide ao nascer): linguagem, runtime, framework, abordagem de UI |
| Versões | Fixo em toda stack: toda versão exata, nunca latest | Lacuna (a stack decide ao nascer): os números e onde cada um mora |
| Persistência | Fixo em toda stack: armazenamentos descartáveis em container; evolução dos dados versionada; um dono; sem banco padrão | Lacuna (a stack decide ao nascer): quais armazenamentos e a ferramenta de evolução |
| Testes | Fixo em toda stack: TDD; dependências reais em container; E2E hierárquico com Playwright | Lacuna (a stack decide ao nascer): frameworks de unidade e integração |
| Entrega | Fixo em toda stack: Docker na entrega, Compose no desenvolvimento, Kamal, Bitwarden SM | Lacuna (a stack decide ao nascer): imagens base, hosts, prefixos de segredo |
| Identidade | Fixo em toda stack: Keycloak; realm por população; permissões e perfis; acesso por grupo | Lacuna (a stack decide ao nascer): realms, clients, permissões, perfis |
| Operação | Fixo em toda stack: contrato de observabilidade; backup diário com restauração testada | Lacuna (a stack decide ao nascer): bibliotecas e ferramenta de backup |
| Interface | Fixo em toda stack: design system da Hibex, verificador na CI | Lacuna (a stack decide ao nascer): família de cor de cada aplicação |
| Trabalho | Fixo em toda stack: OpenSpec, ADR, diagramas, pt-BR, AGENTS.md | Lacuna (a stack decide ao nascer): — |
Visão completa em 01 · Visão geral.
Princípios
- Decidir antes de construir: stack definida antes do código; decisão técnica vira ADR; comportamento vira change.
- Tudo versionado, nada flutuante: ferramenta, biblioteca, imagem, action e CLI com versão exata.
- O humano publica, o agente prepara: Git, deploy, infraestrutura e segredos só pelo mantenedor.
- Teste primeiro: nenhum código sem um teste que falhou antes.
- Uma mudança por vez, especificada: a change do OpenSpec é a unidade de trabalho.
- Tudo reproduzível na máquina: o ambiente local sobe do zero, com um usuário por perfil.
- Segurança por padrão: toda área restrita autenticada e autorizada por permissões finas; aplicação pública declarada como tal; nada de segredo em arquivo.
- Operável desde o primeiro deploy: telemetria, sonda de vida e backup antes do produto.
- A camada de cima vence: plataforma > arquitetura > stack.
Cada regra e como ela é garantida (hook, CI ou revisão): 02 · Princípios e regras.
Ciclo de vida de uma stack
| Fase | O que acontece | Sai quando |
|---|---|---|
| 0 · Nascimento | O que acontece: o modelo zerado é copiado; regras, ORGs e ADRs pré-escritas no lugar | Sai quando: o agente lê o AGENTS.md e se reconhece na Fase 1 |
| 1 · Definição | O que acontece: visão do produto, aplicações, acesso, tecnologia e versões, sem código | Sai quando: eng/gaps.sh encontra zero lacunas e as ADRs estão aceitas |
| 2 · Fundação | O que acontece: esqueleto, identidade, E2E, observabilidade, aparência, implantação | Sai quando: o ambiente sobe do zero, cada perfil entra e a regressão passa |
| 3 · Produto | O que acontece: uma capability por change, em TDD, com E2E | Sai quando: primeiro deploy real |
| 4 · Operação | O que acontece: deploys, backup, atualizações de design system e de arquitetura | Sai quando: — |
Detalhe em 04 · Ciclo de vida.
Anatomia de uma stack
O esqueleto que toda stack tem, seja qual for a tecnologia:
<plataforma>-stack-<produto>/
├── AGENTS.md · CLAUDE.md regras dos agentes (CLAUDE.md só importa)
├── README.md · ARQUITETURA porta de entrada · versão da arquitetura de origem
├── docs/
│ ├── ARCHITECTURE.md a visão técnica viva
│ ├── stack.md a ficha da stack: tecnologia e versões
│ ├── produto/ para quem e para quê
│ ├── decisoes/ ADR-* da stack · organizacao/ORG-* (cópia, nunca editada)
│ ├── solucoes/ · guias/ detalhes de implementação · passo a passo
│ ├── acesso/<app>.md permissões e perfis de cada aplicação
│ └── design-system/ famílias, estados, pedidos
├── openspec/ specs (verdade viva) e changes
├── <módulos e aplicações> o código (forma decidida na Fase 1)
├── e2e/groups/… testes fim a fim hierárquicos
├── deploy/<app>/ Dockerfile · deploy.yml · .kamal/secrets
├── eng/ scripts: ambiente local, auth, e2e, backup, verificações
├── vendor/hibex/ cópia do design system, nunca editada
└── compose.yaml ambiente local descartávelAs três idades do repositório (recém-nascido, fundação pronta, maduro): 05 · Anatomia.
Mapa de leitura
Comece pela visão geral e aprofunde só no que interessa. Cada documento abre com um desenho que resume o assunto.
Por onde começar, conforme o seu papel
| Você é… | Leia primeiro |
|---|---|
| Mantenedor validando esta visão | Leia primeiro: 01 → 04 → 06 → 11 → 12 → 20 |
| Quem vai criar uma stack nova | Leia primeiro: 01 → 04 → 05 → 06 → 07 |
| Quem desenvolve numa stack | Leia primeiro: 02 → 09 → 10 → 11 → 18 |
| Quem configura acesso no Keycloak | Leia primeiro: 03 → 12 |
| Quem opera (deploy, backup, telemetria) | Leia primeiro: 13 → 14 → 15 → 18 |
| Agente de IA | Leia primeiro: AGENTS.md → 02 → 17 → 09 |
Todos os documentos
| # | Documento | Responde |
|---|---|---|
| 01 | Documento: Visão geral | Responde: O que é fixo, o que é lacuna, como as peças se ligam |
| 02 | Documento: Princípios e regras | Responde: As regras invioláveis de toda stack e como cada uma é garantida |
| 03 | Documento: Conceitos e vocabulário | Responde: Stack, aplicação, módulo, capability, change, lacuna, perfil, permissão… |
| 04 | Documento: Ciclo de vida de uma stack | Responde: Do zero à operação: fases e portões |
| 05 | Documento: Anatomia do repositório | Responde: Como o repositório é em cada fase |
| 06 | Documento: Modelo zerado e lacunas | Responde: O que vem vazio, a ficha da stack, como preencher |
| 07 | Documento: ORGs e ADRs | Responde: As decisões da organização e as do projeto, com que toda stack já nasce |
| 08 | Documento: Sistema de documentação | Responde: ADR × spec × solução × guia × arquitetura |
| 09 | Documento: Mudanças: OpenSpec + TDD | Responde: Como uma funcionalidade nasce, do pedido ao arquivo |
| 10 | Documento: Testes | Responde: Unidade, integração e fim a fim: o que é de cada stack e o que é comum |
| 11 | Documento: Testes fim a fim hierárquicos | Responde: Agrupamento → cenário → caso, setups em cascata, capturas de tela |
| 12 | Documento: Identidade e acesso | Responde: Keycloak, permissões, perfis, acesso entre aplicações |
| 13 | Documento: Containers, implantação e segredos | Responde: Docker, Compose, Kamal, Bitwarden SM, domínios |
| 14 | Documento: Observabilidade | Responde: Logs, métricas, traces e saúde: o contrato de toda aplicação |
| 15 | Documento: Backup e restauração | Responde: Todo dado tem backup, e toda restauração é testada |
| 16 | Documento: Design system | Responde: Cópia, famílias, verificador, pedidos e atualização |
| 17 | Documento: Agentes de IA | Responde: AGENTS.md, CLAUDE.md, hooks, o que o agente faz e não faz |
| 18 | Documento: Rotinas | Responde: O dia a dia: desenvolver, testar, implantar, atualizar |
| 19 | Documento: Aprendizados da stack-projetos | Responde: Histórico: o estudo da primeira stack, que deu origem às regras |
| 20 | Documento: Questões em aberto e próximos passos | Responde: O que o mantenedor precisa decidir para isto virar regra |
Como usar este repositório
- Criar uma stack nova: hoje, enquanto o modelo zerado não existe, a referência é
04 + 06 +
07. Depois da validação,
eng/new-stack.shcopiará o modelo. - Adotar numa stack existente: cada assunto vira uma change do OpenSpec na própria stack, que decide a ordem e o ritmo; este repositório não acompanha quem adota.
- Mudar uma regra: ver Governança.
Governança: como a arquitetura muda
| Pergunta | Resposta |
|---|---|
| Quem decide? | Resposta: O mantenedor. Agentes propõem; nada nasce aceito |
| Onde se registra? | Resposta: Nos documentos daqui e, para decisões com alternativas, em ORGs (as que valem para toda stack, copiadas para cada uma) e em ADRs daqui (as que valem só para este repositório) |
| Como as stacks ficam sabendo? | Resposta: Versões marcadas (arquitetura-vX.Y.Z) com um CHANGELOG.md que diz, para cada versão, o que as stacks precisam fazer ("Para as stacks") |
| Como uma stack sabe em que versão está? | Resposta: Arquivo ARQUITETURA na raiz dela, como o vendor/hibex/VERSAO do design system |
| Uma stack pode abrir exceção? | Resposta: Não. O que falta vira pedido para cá |
| Qual a compatibilidade? | Resposta: Maior: muda uma regra (as stacks precisam agir). Menor: acrescenta sem exigir ação (ORG que as stacks já cumprem, ADR pré-escrita nova, guia, script). Correção: só texto |
(Versões, CHANGELOG.md e arquivo ARQUITETURA são propostas desta visão, questão 3 de
20.)
Repositórios relacionados
| Repositório | Papel | Relação com este |
|---|---|---|
toolbox | Papel: Infraestrutura compartilhada: Keycloak, observabilidade, VPS, política de domínios | Relação com este: camada 1: as stacks consomem; este repositório referencia |
enterprise-stack-design | Papel: Design system: biblioteca, marca, regras, verificador | Relação com este: camada 1: cada stack guarda uma cópia em vendor/hibex/ |
Estado e roteiro
| Etapa | Estado |
|---|---|
Visão documentada (docs/01–20) e site navegável | Estado: feito (2026-10-17) |
| Validação do mantenedor (as 15 questões de 20 decididas) | Estado: feito (2026-10-18) |
| ORGs e ADRs deste repositório: 25 ORGs e 5 ADRs | Estado: feito (aceitas em 2026-10-18) |
Modelo zerado (modelo/, com as lacunas catalogadas) | Estado: feito (2026-10-19) |
eng/gaps.sh, eng/pinned-versions.sh, hooks e CI do modelo | Estado: feito (2026-10-19) |
Harness do E2E hierárquico (modelo/e2e/hierarchy/), provado num exemplo | Estado: feito (2026-10-19) |
eng/new-stack.sh: gera uma stack que passa no portão 0 | Estado: feito (2026-10-19) |
| Stack piloto, da Fase 0 ao portão 2 | Estado: agora |
arquitetura-v0.1.0 (a v1.0.0 vem depois de usos reais) | Estado: — |
Estrutura deste repositório
stack-architecture/
├── README.md este documento
├── AGENTS.md · CLAUDE.md regras para agentes de IA (CLAUDE.md só importa)
├── CHANGELOG.md as versões da arquitetura e o "Para as stacks" de cada uma
├── docs/
│ ├── 01…20-*.md a arquitetura, um assunto por documento
│ ├── decisoes/ ADRs deste repositório e, em organizacao/, as ORGs de toda stack
│ ├── imagens/desenhos/ os rabiscos (SVG gerado; não se edita à mão)
│ ├── imagens/banner-*.svg o banner (README) e a capa (site), claro e escuro
│ └── design-system/ a família do site e os pedidos ao design system
├── modelo/ o modelo zerado: os arquivos com que toda stack nasce, em lacunas
├── exemplos/e2e-atendimento/ o projeto de exemplo que prova o harness do E2E (prove.mjs)
├── eng/new-stack.sh cria uma stack nova a partir do modelo (Fase 0)
├── eng/tests/ os testes do new-stack.sh
├── eng/gap-catalog.sh confere que cada lacuna do modelo está uma vez no catálogo
├── .github/workflows/ci.yml testes dos scripts e hooks do modelo, catálogo, versões fixas, prova do E2E
├── eng/sketches/ desenha os rabiscos e o banner (boards/ tem um arquivo por documento)
├── eng/atualizar-design-system.sh traz a cópia do design system (do mantenedor: faz git clone)
├── vendor/hibex/ cópia do design system 0.16.1, nunca editada à mão
├── site/ gerador do site estático, nginx e as instruções de publicar
├── Dockerfile · docker-compose.yml a imagem do site e o jeito de vê-la localmente
└── config/deploy.yml · .kamal/ o deploy em architecture.enterprise.hibex.net (do mantenedor)O site
Os mesmos documentos como site estático, no design system da Hibex (família cobalt, três
cantos, tema claro e escuro), com os rabiscos embutidos nas páginas. Tudo é gerado no build: o
navegador não desenha nada, e o site funciona sem rede. Será publicado em
architecture.enterprise.hibex.net, aberto, como o site do design system.
docker compose up --build # a imagem de produção, em http://localhost:8080
node site/gerar.mjs --servir # sem Docker, a mesma porta (antes: cd site && npm ci)Pré-requisitos, publicação e como mudar um rabisco: site/README.md.
Convenções de escrita
- Português brasileiro; identificadores e nomes de ferramenta em inglês; termos técnicos consagrados sem tradução;
- Todo documento grande abre com um rabisco que resume o assunto, no estilo de rabisco do
design system (a ADR-0037 dele): traço de lápis, Caveat, só as cores da marca, nos dois temas. O
rabisco é desenhado por código em
eng/sketches/boards/e o texto ao redor sempre diz o mesmo que ele (o desenho não carrega informação sozinho). Nas stacks, o rabisco é a recomendação e o Mermaid é permitido (ORG-0005); - Imagem que não é rabisco é, de preferência, SVG desenhado por código (como o banner,
eng/sketches/banner.mjs). Quando precisa de um gerador de imagens, nasce como prompt num arquivo<imagem>.prompt.mdao lado do caminho dela (o banner tem os dele, para uma versão futura gerada por IA), e o mantenedor gera a imagem; - Marca: o logotipo da Hibex é sempre o arquivo do design system, nunca texto redigitado nem desenho de imagem gerada.
Um projeto da Hibex Solutions.