ADR 0002 — YAML versionado como base de conhecimento declarativa¶
Status¶
Aceita — 2026-08-08
Contexto¶
O modelo conceitual do The Band — 12 ontologias, 219 conceitos, 141 relações, 64 perguntas de competência — é o ativo central do sistema. É ele que distingue a plataforma de um data lake com dashboards.
Esse modelo precisa de propriedades que código Elixir sozinho não oferece bem:
- ser revisável por quem entende do domínio, incluindo quem não lê Elixir;
- ser versionado semanticamente, com diff que mostre a mudança conceitual;
- carregar proveniência, apontando para a seção da tese que originou cada conceito;
- ser validável mecanicamente — referências, ciclos, cardinalidades, campos obrigatórios;
- ser a mesma fonte para o código, a documentação e os testes conceituais.
Se conceitos vivessem apenas em módulos e schemas Ecto, uma mudança conceitual apareceria espalhada por schema, migração, changeset e documentação — e a documentação divergiria do modelo real em semanas.
Decisão¶
O modelo conceitual vive em priv/knowledge_base/, como YAML versionado, validado e
revisado. O código Elixir carrega esse modelo; não o duplica.
A base cobre: ontologias e seus metadados, conceitos, relações, cardinalidades, restrições, perguntas de competência, mapeamentos entre fontes e ontologias, necessidades de informação, medidas, glossário, regras e exemplos.
Regras que acompanham a decisão:
- todo YAML tem schema em
schemas/, versão, identificador estável, dependências declaradas e proveniência; - campos desconhecidos são rejeitados quando o schema é estrito;
- validação roda no CI e falha o build;
- mudança que altere semântica, contrato ou comportamento exige teste e revisão semântica;
- nenhum YAML contém token, senha ou credencial;
- carregamento acontece em compile time, boot ou cache controlado — nunca leitura de disco por requisição;
- a documentação em
docs/ontology/é gerada da base, e não editada à mão.
Granularidade: um arquivo por módulo/subontologia, não por conceito. Um conceito por arquivo geraria ~200 arquivos e faria conceito e relações aparecerem em diffs separados, tornando ilegível a revisão de uma mudança semântica. O módulo é a mesma granularidade dos módulos Elixir correspondentes.
Alternativas consideradas¶
Conceitos como módulos Elixir, direto no código. Elimina a etapa de carga e dá verificação de tipo, mas perde a revisibilidade por não-programadores, dilui a proveniência em comentários e faz a documentação divergir. A mudança conceitual deixa de ser um diff conceitual.
OWL/RDF com um triplestore. É o formato nativo de ontologias e traria raciocínio automático de graça. Custa uma dependência de infraestrutura pesada, uma linguagem que a equipe não domina, e ferramental distante do fluxo de revisão em Pull Request. O ganho de raciocínio não é necessário para o caso atual: as verificações que importam — referências, ciclos, cardinalidades — são obtidas com validação de schema.
Tabelas no banco, editáveis por interface. Facilitaria edição por usuários finais,
mas tira o modelo do controle de versão. Uma mudança conceitual passaria a ser um
UPDATE sem revisão, sem histórico legível e sem vínculo com o código que depende dela.
JSON Schema com arquivos JSON. Equivalente em capacidade, mas sem comentários e com sintaxe mais ruidosa para texto multilinha — e as definições dos conceitos são textos longos, em dois idiomas.
Consequências¶
Positivas
- A mudança conceitual é um diff legível, revisável por quem entende de ontologia.
- Proveniência fica junto do conceito, apontando para a seção da tese.
- Validação mecânica pega referência quebrada, ciclo de dependência e conceito órfão antes do merge.
- Documentação gerada não diverge do modelo, porque é derivada dele.
- Teste conceitual e perguntas de competência leem a mesma fonte que o código.
Negativas
- Existe uma camada de carga e cache a construir e manter.
- YAML não dá verificação de tipo em tempo de compilação; a rede de segurança é a validação de schema.
- Há risco de divergência entre a base e os schemas Ecto se não houver teste que amarre os dois.
Mitigações
mix knowledge.validate,knowledge.graph,knowledge.compile,knowledge.testeknowledge.diffcomo portas obrigatórias no CI.- Testes conceituais por ontologia verificando que schemas Ecto refletem os conceitos declarados.
- Nenhuma leitura de disco em tempo de requisição — carga controlada e cacheada.