Modelos¶
Os modelos que a implementação não carrega sozinha: o que existe, por quais situações passa, o que o banco guarda, e o que depende do quê no backlog.
A regra: modelo é derivado, nunca lembrado. Todo documento aqui sai de uma fonte do
repositório — schema, migração, YAML da base, spec, issue — e abre dizendo de onde saiu, com
arquivo:linha e a data da conferência. Quem escreve é o papel
Documentation — Modelos.
| Pasta | O que responde | Forma |
|---|---|---|
classes/ |
quais entidades existem, o que carregam, como se ligam | classDiagram (Mermaid), uma por subsistema |
estados/ |
por quais situações um registro passa, e o que provoca cada transição | stateDiagram-v2, com gatilho, guarda e o teste que prova |
banco/ |
quais tabelas, colunas, chaves e índices parciais (que carregam invariante) | erDiagram, derivado das migrações |
dsm/ |
o que precisa vir antes do quê, entre épicos, user stories e features | matriz em Markdown, com blocos e ciclos nomeados |
O que existe hoje¶
26 documentos, 42 diagramas Mermaid, conferidos contra o código em 2026-09-18 — e
todos os 42 renderizados com @mermaid-js/mermaid-cli@11.17.0 nessa data, para que nenhum
bloco publicado seja código que não vira desenho. A coluna
diagramas é a contagem de blocos ```mermaid no arquivo — zero significa que o
documento é censo, tabela ou matriz, e não que falta desenho.
Por onde começar¶
Se você chegou agora ao projeto, leia nesta ordem. Cada um destes quatro é um censo, e existe para dizer o tamanho do que você está olhando antes de mostrar qualquer desenho:
| Comece por | Responde |
|---|---|
arquitetura/visao-geral.md |
como o sistema se monta e por onde o dado entra — em C4 |
banco/mapa-das-tabelas.md |
quantas tabelas existem, e qual ERD cobre cada uma |
classes/mapa-dos-schemas.md |
quantos schemas existem — e por que Repo.preload/2 quase não funciona aqui |
estados/mapa-dos-ciclos-de-vida.md |
onde mora o estado, já que só 3 das 66 tabelas têm coluna status |
Arquitetura¶
| Documento | Diag. | Do que é derivado |
|---|---|---|
arquitetura/visao-geral.md |
9 | application.ex, router.ex, compose.yaml, hooks.ex, access.ex, ingestion/*, config/config.exs |
A estrutura é C4 — contexto, contêineres e dois de componentes (coleta e acesso). O que é
dinâmico — a sequência da coleta, o boot da base, a cadeia do tenant, o pipeline de CD —
continua flowchart, e o documento diz por quê. O suporte a C4 no Mermaid é experimental:
visualizador antigo mostra o bloco como texto, e os diagramas foram escritos para continuarem
legíveis assim.
Classes — o que existe, e o que cada coisa carrega¶
| Documento | Diag. | Cobre |
|---|---|---|
classes/mapa-dos-schemas.md |
0 | censo: 65 schemas, 3 associações Ecto, 214 campos :binary_id |
classes/eo-estrutura-organizacional.md |
1 | organização, pessoa, equipe, papel, vínculo |
classes/tenants-e-acesso.md |
1 | tenant, conta, concessão, desativação |
classes/ingestao-e-observacao.md |
1 | ferramenta, credencial, coleta, repositório |
classes/trabalho-e-mudanca.md |
2 | issue, promoção, PR, commit, verificação |
classes/projetos-e-processo.md |
2 | projeto, quadro, item, sprint, atividade |
classes/perfis-e-modelo.md |
1 | credencial de modelo, execução, perfil |
classes/declaracoes-da-organizacao.md |
1 | novo — os 9 schemas de declaração, incluindo os 3 da feature 066 |
Banco — tabelas, chaves e índices parciais¶
| Documento | Diag. | Cobre |
|---|---|---|
banco/mapa-das-tabelas.md |
1 | censo das 66 tabelas de domínio + o mapa de alto nível dos grupos |
banco/eo-e-acesso.md |
1 | 14 tabelas |
banco/ingestao-e-observacao.md |
1 | 10 tabelas |
banco/trabalho-e-mudanca.md |
2 | 17 tabelas |
banco/projetos-e-processo.md |
2 | 17 tabelas |
banco/perfis-e-modelo.md |
1 | 5 tabelas |
banco/declaracoes-da-organizacao.md |
1 | novo — 9 tabelas de declaração, 12 índices parciais, FK declarada × coluna crua |
Estados — por que situações um registro passa¶
| Documento | Diag. | Cobre |
|---|---|---|
estados/mapa-dos-ciclos-de-vida.md |
0 | censo: 51 tabelas com ciclo de vida, 3 com status, e a coluna expires_at que não existe |
estados/declaracao-revogavel.md |
2 | novo — a família de 9 tabelas: vigente, revogada, redeclarada |
estados/observacao.md |
2 | novo — no_longer_observed_at em 23 tabelas, e excluded_at, que é outra coisa |
estados/atividade-executada.md |
1 | novo — por que a ocorrência nunca é atualizada; promoção e complementação |
estados/conta.md |
2 | novo — desativar × revogar o elo, e por que confundi-los foi achado de segurança |
estados/coleta.md |
4 | novo — a execução, a ferramenta (estado por evento) e a credencial |
estados/projeto-declarado.md |
2 | novo — o projeto e seus quatro vínculos; o único estado final que não volta |
estados/vinculo-de-equipe.md |
2 | quatro campos, cinco situações |
DSM — o que precisa vir antes do quê¶
| Documento | Diag. | Cobre |
|---|---|---|
dsm/modulos-de-lib.md |
0 | novo — 37 contextos de lib/the_band/, 136 arestas, 2 ciclos nomeados |
dsm/060-tela-da-equipe.md |
0 | US1 a US9 da feature 060 |
O índice é mantido à mão, e por isso mente primeiro. Em 2026-09-12 ele ainda dizia "
banco/ainda está vazia" enquanto a pasta tinha seis documentos e sete ERDs. A regra que sobra disto: quem acrescenta documento atualiza esta tabela no mesmo commit — índice que contradiz o diretório é pior que índice nenhum, porque quem o lê não vai conferir.
Três coisas que surpreendem quem chega¶
Estão medidas nos censos, e mudam como se lê todo o resto:
- O estado quase nunca é uma coluna. Três das 66 tabelas têm
status; o resto codifica situação em pares de datas que podem ser nulas, para preservar desde quando. →estados/mapa-dos-ciclos-de-vida.md - Quase não há associação Ecto. São 3 em 65 schemas, contra 214 campos
:binary_id. A chave estrangeira existe no banco (201 delas) e não é modelada no Ecto: ojoiné sempre explícito. →classes/mapa-dos-schemas.md - Nada é apagado. Encerrar, revogar, excluir e marcar ausência são todos
UPDATE, com autor e instante. A única linha que some é a que nunca foi escrita. →estados/observacao.md
Como ler uma DSM¶
Linhas e colunas são os mesmos itens, na mesma ordem. A célula (i, j) marcada significa
i depende de j, e a marca diz a natureza: D dado · T tela · R regra · E esquema.
Depois de reordenar, o que fica abaixo da diagonal é ordem possível; o que sobra acima
é ciclo, e ciclo é achado — o documento o nomeia e propõe o corte. Blocos na diagonal são as
fatias que viajam juntas numa PR; a recomendação de fatiamento é oferecida ao Product Owner,
que decide.