spec 1.0 · normativo
Decisões
Os registros de decisão documentam, com data, o porquê dentro da camada de contexto: decisões de arquitetura, escolhas de fornecedor, limites de escopo e decisões conscientes de não agir. Eles evitam que tudo seja rediscutido do zero e oferecem aos agentes o raciocínio, não apenas a regra.
Os registros de decisão são o subtipo formal de registro (ver content-categories.md, Intenção e registros): são registros por natureza, com um schema e um ciclo de vida uniformes que os registros genéricos não têm. Suas entradas de índice geradas carregam kind: record; um registro de decisão não declara chave kind própria (o schema é fechado, então um kind explícito falha na validação).
Requisitos#
- Os registros de decisão são markdown com frontmatter YAML válido segundo
decision-record.schema.json, um registro por arquivo. O corpus de decisões é a união de duas superfícies declaradas no manifesto, e uma camada de contexto MAY usar uma delas ou as duas: o caminho de registros declarado (machine.decisionRecordsPath, padrão<root>/decisions/) e as entradas para as quais os arquivos de índice da categoriadecisionsresolvem. Um registro MUST ser alcançável por ao menos uma das duas. - O frontmatter MUST carregar:
id(estável),title,statusedate.statusé um entreproposed,accepted,superseded,deprecatederejected. - O corpo MUST enunciar, em prosa: o contexto (que situação forçou uma decisão), a decisão em si e suas consequências. Os títulos de seção RECOMMENDED são
## Context,## Decisione## Consequences; um registro MAY acrescentar## Alternatives. - Os registros são histórico somente acréscimo: um registro MUST NOT ser editado até virar uma decisão diferente. Dois campos de frontmatter são mutáveis conforme uma decisão envelhece,
status(seu ciclo de vida) esupersededBy(definido quando ela é superada); todo o resto, oid, otitlee adateoriginais, o escopo declarado e o corpo em prosa, é imutável uma vez publicado. Uma reversão ou mudança é um novo registro cujo frontmatter definesupersedes, e ostatusdo registro antigo passa asupersededcomsupersededBydefinido. O elo de superação MUST permanecer consistente nos dois sentidos: quando o registro B definesupersedes: A, o registro A carregastatus: supersededesupersededBy: B, e um registrosupersededMUST nomear seu sucessor emsupersededBy. Os dois registros permanecem. O ferramental de referência hoje impõe a consistência bidirecional da superação. Ele ainda não verifica a imutabilidade em si (que os campos congelados e o corpo de um registro publicado estejam inalterados em relação a uma revisão base); essa é uma verificação reportada no roteiro, ainda não uma verificação bloqueante. Até isso chegar, a imutabilidade se apoia na disciplina de revisão atestada por processo (ver conformance.md). - Um registro MAY declarar
affectedPathseaffectedCategories, para que o ferramental possa rotear do escopo de uma tarefa até as decisões que a governam. Como o escopo de uma tarefa seleciona registros (contenção de caminho ciente de sobreposição, casamento estreito de categoria, o vínculo deaccepted/deprecatede o tratamento de alcance organizacional para um registro que não declara nenhum dos dois) é o algoritmo de Roteamento de tarefas em machine-readable-surface.md. - Propostas rejeitadas também são registros (
status: rejected). Uma decisão não tomada, escrita, é o seguro mais barato que existe contra rediscussão.
Compatibilidade com ADR (não normativo)#
Os registros de decisão do Leji foram projetados para serem compatíveis com Architecture Decision Records: um diretório de ADR existente atende a decisions depois que os campos de frontmatter são acrescentados a cada registro (ou apenas aos novos registros dali em diante) e o diretório é mapeado no manifesto. Nenhuma ferramenta de ADR é exigida ou excluída.