Origem e rumo
19 · Aprendizados da stack-projetos
A stack-projetos é a referência de estudo deste repositório: uma stack construída antes do modelo, enquanto as regras eram descobertas. Ela não segue o modelo nem faz parte de nenhum fluxo daqui. Começou em 2026-09-02. Em seis semanas: 53 ADRs, 74 changes arquivadas, 26 capabilities, três aplicações. Este documento liga cada aprendizado à regra do modelo que nasceu dele.
Visão geral
Em resumo: o que muda
A stack-projetos foi construída enquanto as regras eram descobertas. O modelo traz as regras desde o primeiro dia e corrige o que ela aprendeu tarde:
| Na stack-projetos | No modelo |
|---|---|
| Stack escolhida na conversa, registrada em ADR depois | No modelo: Ficha da stack preenchida antes de qualquer código; portão explícito |
| ADRs de fundação escritas uma a uma | No modelo: ORGs prontas, copiadas para a stack; o que depende da stack vem em ADRs pré-escritas, com lacunas |
CLAUDE.md com as regras | No modelo: AGENTS.md com as regras; CLAUDE.md só aponta para ele |
| Roteiro ao vivo em seções que dependem das anteriores | No modelo: E2E hierárquico: qualquer caso roda sozinho, com os setups dos níveis acima |
| Roteiro manual em prosa + roteiro automatizado (dois artefatos que se desencontram) | No modelo: Um artefato: o caso E2E narra os próprios passos e gera o roteiro legível |
| Capturas regeradas em massa, centenas de MB por rodada | No modelo: Capturas opcionais, ligadas aos casos, e o acervo só recebe as telas afetadas |
@latest na CI, ubuntu-latest, imagens com tag flutuante | No modelo: Nenhuma versão flutuante; a CI confere |
Autorização por um papel único (gestao:acesso) | No modelo: Permissões finas + perfis documentados por aplicação |
A stack estudada, lida pelo modelo
Um exercício de estudo: onde cada coisa da stack-projetos ficaria se ela tivesse nascido do modelo. Não é plano de migração; serve para testar se o modelo tem lugar para tudo.
Números da stack-projetos em 2026-10-17, para dar escala:
| Item | Quantidade |
|---|---|
| Aplicações | Quantidade: 3 (gestão, cliente, landings de adesão) |
| Módulos de build | Quantidade: 3 (core, gestao, cliente) |
| ADRs | Quantidade: 53 |
| Capabilities (specs vivas) | Quantidade: 26 |
| Changes arquivadas | Quantidade: 74 |
| Seções do roteiro ao vivo | Quantidade: 27 |
| Migrations | Quantidade: 30 |
As seções do roteiro ao vivo, como agrupamentos
O mesmo exercício para o E2E: como as seções do roteiro ao vivo se organizariam em agrupamentos.
| Seções do roteiro ao vivo | Agrupamento | Cenários (exemplos) |
|---|---|---|
| 01 identidade, 01b primeiro acesso | Agrupamento: identidade | Cenários (exemplos): login por perfil, acesso negado, primeiro acesso, logout |
| 02 aparência, 03 preferências | Agrupamento: aparencia, preferencias | Cenários (exemplos): tema, aviso de ambiente; fuso, nome |
| 04 disponibilidade | Agrupamento: disponibilidade | Cenários (exemplos): publicar, remover, sobreposição |
| 05 cotações, 15 histórico | Agrupamento: cotacoes | Cenários (exemplos): cadastrar, evolução (setup com atalho de volume) |
| 06 fluxos | Agrupamento: fluxos | Cenários (exemplos): criar, versionar, publicar, edição concorrente |
| 07 clientes, 08 carteira, 18 extrato | Agrupamento: clientes, carteira | Cenários (exemplos): diretório; concessão, extrato, extrato global |
| 09 solicitação, 10 agendamento, 20 replanejamento | Agrupamento: projeto, agendamento | Cenários (exemplos): criar, descartar; agendar, confirmar, replanejar (atalho de tempo) |
| 11 homologação, 12 execução, 13 acompanhamento | Agrupamento: homologacao, execucao, acompanhamento | Cenários (exemplos): aceitar, recusar, decurso; iniciar, concluir, encerrar |
| 14 impedimento, 14b horas extras | Agrupamento: impedimentos, horas-extras | Cenários (exemplos): abrir, analisar, resolver, trava; registrar, anular |
| 16, 17, 19 dashboards | Agrupamento: painel-da-gestao, painel-do-cliente, dashboard-do-projeto | Cenários (exemplos): cada card com o setup que o alimenta |
| 21 organizações, 22 prévia de links, mural | Agrupamento: organizacoes, mural, previa-de-links | Cenários (exemplos): — |
| 01c, 90 capturas | Agrupamento: — | Cenários (exemplos): viram casos "vazio" e "muitos itens" nos agrupamentos acima |
O que funcionou e virou regra
| Aprendizado | Evidência na stack-projetos | Regra no modelo |
|---|---|---|
| ADRs curtas, numeradas, com status e "alternativas consideradas" dão o porquê a qualquer sessão futura | Evidência na stack-projetos: 53 ADRs; revisões registradas no cabeçalho | Regra no modelo: ORG-0001 |
| "Toda ADR do agente nasce proposta" mantém o mantenedor no controle sem travar o trabalho | Evidência na stack-projetos: ADR-0001 ponto 3 | Regra no modelo: ORG-0001 |
| Uma change por vez, revisada antes do apply, dá ritmo e rastreabilidade | Evidência na stack-projetos: 74 changes arquivadas, specs vivas por capability | Regra no modelo: ORG-0008 |
| Hook que impõe a regra de Git funciona melhor que a regra escrita | Evidência na stack-projetos: block-git-writes.py + teste | Regra no modelo: hooks no modelo; candidato para infraestrutura |
| Identidade declarada no repositório, com script idempotente | Evidência na stack-projetos: eng/auth/provisionar.sh validado contra Keycloak local | Regra no modelo: ORG-0020 |
| Keycloak local descartável, importando realms versionados, com usuários de exemplo: login imediato, sem script | Evidência na stack-projetos: eng/auth/dev-realms/ | Regra no modelo: ORG-0020 + um usuário por perfil |
| Credenciais de IdP externo fora do export versionado | Evidência na stack-projetos: ADR-0044 | Regra no modelo: regra de segredos + ORG-0020 |
Contrato de observabilidade (stdout JSON, porta interna, OTLP, /up) desacopla app e pilha | Evidência na stack-projetos: ADR-0012 | Regra no modelo: ORG-0021 |
Restauração que recria o banco (dump sem --clean falha; com --clean deixa banco misto) | Evidência na stack-projetos: ADR-0047, validado localmente | Regra no modelo: ORG-0022 |
| Imagem de backup na mesma versão maior do servidor | Evidência na stack-projetos: ADR-0047 | Regra no modelo: ORG-0022 |
| Design system como cópia versionada, com verificador na CI e hook | Evidência na stack-projetos: ADR-0049 | Regra no modelo: ORG-0023 |
| Pedidos ao design system num pacote no formato de chegada | Evidência na stack-projetos: ADR-0052 | Regra no modelo: rotina de pedidos |
| Aviso de ambiente ligado pelo ambiente da implantação, nunca nas capturas | Evidência na stack-projetos: ADR-0053 | Regra no modelo: ORG-0023 |
| Testes com Keycloak real em container provam o fio OIDC que nenhum mock prova | Evidência na stack-projetos: ADR-0013 | Regra no modelo: ORG-0015 |
| Instante em UTC, fuso pessoal como lente; data civil só quando é civil | Evidência na stack-projetos: ADR-0016, ADR-0036 | Regra no modelo: ORG-0024 |
| O mantenedor valida olhando o sistema no ar, tela a tela | Evidência na stack-projetos: memória "entrega com ambiente no ar" | Regra no modelo: protocolo de entrega |
| Perguntas de escopo em lista numerada com opções e recomendação | Evidência na stack-projetos: memória de feedback | Regra no modelo: conversa com o mantenedor |
| Diagramas Mermaid em todo documento grande | Evidência na stack-projetos: ADR-0011 | Regra no modelo: ORG-0005 |
| Domínios por público isolam sessões por construção | Evidência na stack-projetos: ADR-0046 | Regra no modelo: ORG-0017 |
| Gráficos e mapa de estados: regra compartilhada no módulo comum, apresentação na aplicação | Evidência na stack-projetos: ADR-0037, ADR-0050 | Regra no modelo: orientação de estrutura (não é ORG) |
O que doeu e como o modelo corrige
Roteiro ao vivo em seções dependentes
- O que aconteceu: o roteiro cresceu para 27 seções; cada uma assume o estado da anterior. Para ajustar a seção 10 era preciso rodar de 1 a 9. Um erro numa seção parava tudo. O roteiro era "demonstração, não garantia", então não pegava regressão.
- Correção: E2E hierárquico, com setups em cascata e casos independentes (11).
Duas fontes para o mesmo roteiro
- O que aconteceu:
roteiro-manual-de-testes.md(prosa) eeng/roteiro-ao-vivo/(código) descreviam a mesma coisa e precisavam ser atualizados juntos. - Correção: o caso E2E narra os passos; o roteiro legível é gerado
(
eng/e2e.sh --roteiro).
Design system adotado depois das telas
- O que aconteceu: a fundação visual veio com Bootstrap e tokens copiados de outro site; depois veio o design system próprio, e a adoção levou 17 changes, mais refinos de telas que nenhuma etapa tocou.
- Correção: o design system entra na Fase 2, antes de qualquer tela de produto.
Versões flutuantes
- O que aconteceu: a CI chama
npx @fission-ai/openspec@latest validate … || true(versão flutuante e falha ignorada); o runner éubuntu-latest; imagens comopostgres:16eeclipse-temurin:21-jresem patch; o guia do OpenSpec sugere fixar a versão como "opcional". - Correção: ORG-0010 +
eng/pinned-versions.shna CI;openspec validate --strictquebrando o build.
ARCHITECTURE.md inchado e com parágrafos datados
- O que aconteceu: a seção de domínio chegou a quase 300 linhas, com o detalhe de cada capability e um parágrafo "Estado em 2026-09-12 (desatualizado…)".
- Correção: um parágrafo e um link por capability; detalhe em
docs/solucoes/e nas specs; nada datado (08).
Um papel único para a aplicação de gestão
- O que aconteceu: o acesso é
gestao:acesso, tudo ou nada. Um perfil novo (ex.: "financeiro só vê carteiras") exigiria mexer no código. - Correção: permissões finas + perfis compostos desde a fundação; documento de acesso por aplicação (12).
Acervo de capturas regerado inteiro
- O que aconteceu: cada rodada trocava o acervo inteiro (1936 PNGs, 415 MB na rodada de 2026-10-10), todos diferentes em bytes por causa de datas e dados, mesmo sem mudança de tela. Foi preciso ir para o Git LFS e depois restringir às telas afetadas.
- Correção: acervo opcional (ORG-0025); capturas ligadas aos casos;
--acervo=<telas>só com as telas que a change muda.
Renomear o produto no meio do caminho
- O que aconteceu: "orçamentos" virou "projetos" (ADR-0032) e o app do cliente foi renomeado (ADR-0041): repositório, módulos, pacotes, realms de dev, documentação, pasta local e memória do agente.
- Correção: a Fase 1 começa por
docs/produto/visao.mde pelos nomes das aplicações, antes de qualquer pasta de código.
Regras no CLAUDE.md
- O que aconteceu: as regras moram no
CLAUDE.md, o que as prende a uma ferramenta. - Correção:
AGENTS.mdcomo fonte;CLAUDE.mdaponta (17).
Fundação em ordem descoberta
- O que aconteceu: identidade, observabilidade, aparência, roteiro ao vivo e
implantação chegaram em momentos diferentes; algumas pendências de infraestrutura
(realm de produção,
job_nameno Prometheus, alias de rede no Kamal) só apareceram perto do deploy. - Correção: seis changes de fundação fixas e o checklist do portão 3 (04).
Nomes de pasta misturados
- O que aconteceu:
docs/decisoes/edocs/guias/em português,docs/solutions/em inglês. - Correção:
docs/solucoes/no modelo; pastas de documentação em pt-BR, pastas de código e ferramenta em inglês (eng/,deploy/,e2e/,vendor/).
De onde veio cada ORG
As ORGs de 07 nasceram, quase todas, de ADRs e práticas da stack-projetos (os números de ADR abaixo são os de lá).
| ORG | Origem na stack-projetos |
|---|---|
| ORG-0001 — Registrar decisões em dois níveis | Origem na stack-projetos: ADR-0001, acrescida dos dois níveis (novo) |
| ORG-0002 — Uma ADR nunca contradiz uma ORG | Origem na stack-projetos: novo: a regra "a camada de cima vence", aplicada às decisões |
| ORG-0003 — Idioma e terminologia | Origem na stack-projetos: ADR-0003 |
| ORG-0004 — Sistema de documentação | Origem na stack-projetos: prática da stack-projetos (README + ARCHITECTURE + solutions + guias), formalizada |
| ORG-0005 — Diagramas | Origem na stack-projetos: ADR-0011, acrescida do banner e dos rabiscos deste repositório |
| ORG-0006 — Estrutura de diretórios | Origem na stack-projetos: tabela de diretórios do CLAUDE.md |
| ORG-0007 — Agentes de IA e controle humano | Origem na stack-projetos: ADR-0005 + hooks + memórias de feedback |
| ORG-0008 — OpenSpec para toda mudança | Origem na stack-projetos: ADR-0008 (a CI de lá usa @latest e ` |
| ORG-0009 — Desenvolvimento orientado a testes (TDD) | Origem na stack-projetos: novo (lá se pedia "teste para cada caso de uso e controller", sem ordem) |
| ORG-0010 — Versões fixas | Origem na stack-projetos: ADR-0004 (pré-requisitos com versão), estendida a tudo |
| ORG-0011 — Plataforma Linux e pré-requisitos | Origem na stack-projetos: ADR-0004 + regras de eng/README.md |
| ORG-0012 — Integração contínua | Origem na stack-projetos: ci.yml |
| ORG-0013 — Stack tecnológica escolhida uma vez, por critérios | Origem na stack-projetos: ADR-0006 e ADR-0002 |
| ORG-0014 — Persistência | Origem na stack-projetos: ADR-0009 e ADR-0010 |
| ORG-0015 — Testes de unidade e integração | Origem na stack-projetos: ADR-0010 e ADR-0013 |
| ORG-0016 — Testes fim a fim hierárquicos | Origem na stack-projetos: ADR-0031 e ADR-0048, redesenhadas |
| ORG-0017 — Aplicações e endereços | Origem na stack-projetos: ADR-0046 |
| ORG-0018 — Containers: Docker e Compose | Origem na stack-projetos: Dockerfiles, compose.yaml e ADR-0004 ponto 5 |
| ORG-0019 — Implantação com Kamal e segredos no Bitwarden | Origem na stack-projetos: deploy/* e ADR-0005 |
| ORG-0020 — Identidade e acesso com Keycloak | Origem na stack-projetos: ADR-0007, ADR-0014, ADR-0017 e ADR-0044, generalizadas |
| ORG-0021 — Observabilidade | Origem na stack-projetos: ADR-0012 |
| ORG-0022 — Backup e restauração | Origem na stack-projetos: ADR-0047 |
| ORG-0023 — Design system da Hibex | Origem na stack-projetos: ADR-0049, ADR-0050, ADR-0052, ADR-0053 |
| ORG-0024 — Tempo e fuso horário | Origem na stack-projetos: ADR-0016 e ADR-0036 — um aprendizado que vale para qualquer produto com agenda |
| ORG-0025 — Acervo de capturas de tela | Origem na stack-projetos: ADR-0048 + o aprendizado "só as telas afetadas" |
ADRs de lá que não viraram ORG (e por quê)
| ADR da stack-projetos | Por que não é ORG |
|---|---|
| Interação sem diálogos customizados (ADR-0018) | Por que não é ORG: já é regra do design system |
| Gráficos desenhados no servidor (ADR-0037) | Por que não é ORG: escolha de produto e de stack (UI no servidor) |
| Mapa de estados no core (ADR-0050) | Por que não é ORG: a regra "um mapa de estados por produto" é do design system; onde mora no código é da stack |
| Edição de perfil pela Account API (ADR-0017) | Por que não é ORG: útil, mas é funcionalidade — vira guia de identidade, não decisão obrigatória |
| Aviso de ambiente (ADR-0053) | Por que não é ORG: entra na ORG-0023, como item do design system |
| Prévia de links segura (ADR-0043) | Por que não é ORG: decisão de produto; o aprendizado (fronteira de SSRF) vai para um guia de segurança futuro |
Armadilhas técnicas que valem para qualquer stack
| Armadilha | Onde apareceu | Vira |
|---|---|---|
O Kamal 2 nomeia o container <service>-<role>-<versão>; um alvo fixo no Prometheus não resolve | Onde apareceu: ADR-0012, ARCHITECTURE | Vira: alias de rede estável no deploy.yml (fixo) |
| Startup do Keycloak é limitado por CPU: ~50 s sozinho, 3+ min com vários em paralelo | Onde apareceu: guia de testes | Vira: poucos testes com Keycloak real; espera de 6 min |
$(...) no .kamal/secrets precisa abrir e fechar na mesma linha | Onde apareceu: toolbox ADR-0031 | Vira: comentário no modelo do arquivo |
| Keycloak local com hostname dinâmico para servir nativo e em container | Onde apareceu: compose.yaml | Vira: modelo do compose.yaml |
Google não aceita http://keycloak:8088 como redirect: login Google local só com apps nativas | Onde apareceu: ADR-0044 | Vira: guia de identidade |
Playwright: fechar o context de uma segunda aba fecha a página principal | Onde apareceu: memória do roteiro | Vira: guia do E2E |
CRLF e camadas de CSS ao importar a biblioteca | Onde apareceu: adoção do design system | Vira: guia de aparência |
| Atualização do framework remodula artefatos de teste (ex.: fatias do Spring Boot 4) | Onde apareceu: ADR-0013 | Vira: ADR de testes registra as coordenadas |
O que não levamos para o modelo
Decisões que são do produto de projetos e não generalizam: moeda Hibex, motor de agendamento, homologação, impedimentos, mural, landings de adesão como peça obrigatória. Elas ficam como exemplo de como decidir (ADR com alternativas, change por fatia), não como o que decidir.