Curso / Lição 24  ·  EN
Lição 24 · Avançado · as decisões

A trilha de ADRs: as decisões que moldaram a fusão

O código diz o que o motor faz; os Architecture Decision Records dizem por quê — e por que as alternativas foram rejeitadas. Cinco ADRs formam a espinha de tudo que você aprendeu: que o Alembic é um motor e não um produto (0001), que o portão humano fica no gasto irreversível (0005), que o Validator é o portão de emissão (0006), que uma chamada de modelo nunca lança (0009), e que o loop de auto-aperfeiçoamento tem gate de Validator (0018). Cada um é uma restrição que a fusão teve que honrar — lidos juntos, eles explicam por que o @alembic/hermes tem a forma que tem e não alguma forma mais fácil.

O que é um ADR. Um registro datado e imutável de uma decisão arquitetural: o contexto, a escolha, as opções rejeitadas e as consequências. O repo os mantém em docs/adr/; dezoito estão aceitos. São append-only — uma decisão posterior substitui uma anterior (nunca a edita), então a trilha é uma história verdadeira, não um instantâneo arrumado.

A trilha num relance

ADRA decisãoComo restringe a fusão
0001Alembic é um motor interno, não um SKU para clienteSem UI/billing/onboarding no motor — o @alembic/hermes entrega bibliotecas, não superfícies de produto
0005O portão humano fica no ship / gasto irreversívelO ClarifyGateway (Lição 10) é a superfície T4; aprender + distillar rodam sem humano (HITL-free)
0006Profundidade frontier em tudo, via o modelo mais barato acima de um piso; o Validator é o portão de emissãoO loop de aprendizado deve passar um piso de qualidade antes de sedimentar — não pode auto-gravar
0009Uma chamada de modelo nunca lança; retorna um resultado discriminadoTodo subsistema hermes retorna Result, injeta suas portas e é agnóstico de store
0018Internalizar o loop do Hermes como uma passagem propose→dispose com gate de ValidatorA pedra angular: revisor propõe, Validator dispõe, nunca auto-aplica
ADR-0001 — motor, não produto (a fronteira externa: sem superfícies de cliente no motor) ADR-0009 — run() nunca lança (o contrato que todo subsistema fala) ADR-0006 — Validator é o portão de emissão  ·  ADR-0005 — portão humano no gasto irreversível ADR-0018 — o loop de aprendizado com gate propor → gate (dispõe) → sedimentar — nunca auto-aplicar fica dentro das quatro restrições externas ao mesmo tempo

ADR-0001 — motor, não produto

"Alembic é o motor/plataforma interno da Appfy, não um SKU para cliente hoje." A consequência é nítida: preocupações voltadas ao cliente — uma API pública para venda, billing, onboarding/marketing de tenant — "vivem em produtos … não no motor". É por isso que a fusão portou ferramentas como bibliotecas (um MemoryStore, uma função webSearch) e nunca um app de agente executável com UI. Também deixa uma porta aberta: "Se houver pull de mercado real, produtizar o Alembic como harness-as-a-service … pode virar uma nova decisão" — registrada como um ADR futuro substituindo o escopo deste, nunca uma edição.

ADR-0009 — o contrato que torna tudo componível

Você conheceu isto como a cintura estreita da Lição 14. Como decisão ela diz: toda chamada de modelo passa por run(input): Promise<ModelRunResult>, uma união discriminada, e "run() nunca lança: falhas são valores, não exceções". A opção rejeitada é nomeada — "clientes convencionais que lançam" — porque eles "espalham try/catch pela orquestração … e acoplam chamadores a formatos de erro específicos de provedor". A lista de consequências é a parte que sustenta: retry, circuit-breaking, medição de orçamento e quórum de council "operam todos sobre resultados tipados uniformes". Essa uniformidade é exatamente por que todo subsistema hermes pôde adotar a mesma forma Result sem casos especiais.

ADR-0006 — o Validator é o portão de emissão

A manchete deste ADR é sobre custo (profundidade frontier no corpus inteiro via o modelo mais barato acima de um piso de profundidade), mas sua cláusula sustentadora para a fusão é o princípio de emissão: nada sedimenta sem passar um piso de qualidade. Essa é a regra que o loop de aprendizado teve que obedecer — a proposta de um revisor não é verdade, é um candidato, e um gate decide. O default scoreThresholdGate(0.7) é a codificação conservadora desse piso até o Validator real do @alembic/coda se ligar.

ADR-0005 — o portão humano no gasto irreversível

Onde um humano precisa estar no loop? Não no tempo de design — "código numa branch é reversível". O critério decisivo é "reversibilidade/externalidade, não posição no pipeline — o portão fica onde um erro autônomo deixa de ser 'apagar uma branch' e vira dinheiro ou reputação". Então ship e gasto real defaultam para T4-park (fail-closed), enquanto "Destilação (T0–T3 → Signal/Learning) e discover→build são HITL-free". É o princípio que o ClarifyGateway implementa: uma pergunta estruturada e bloqueante é a superfície humana T4, usada só onde a reversibilidade se esgota.

ADR-0018 — a pedra angular, e por que é um ADAPT, não um CLONE

O mais novo dos cinco (aceito em 2026-06-23) é o que autoriza todo o subsistema de aprendizado. O Hermes tinha a peça que faltava — um revisor pós-turno que grava direto na memória durável — mas o Alembic não pôde copiá-la literalmente por duas razões que ele declara claramente:

Leia esses dois pontos e você vê a trilha de ADRs funcionando como um sistema: 0018 não pode simplesmente clonar o Hermes porque 0006 proíbe emissão sem gate e 0009 proíbe lançar — então a única forma que sobra é exatamente o propose→gate→apply sobre portas injetadas que você construiu no Lab 2. A decisão até nomeia as quatro garantias: somente portas injetadas, com gate de Validator e não auto-aplicado, default conservador com um gate mais rico opt-in, e a passagem é fail-closed com Zod na fronteira.

A trilha é um grafo de restrições, não uma lista de desejos

Cada ADR remove opções. 0001 remove "construir um produto". 0009 remove "lançar no erro". 0006 remove "auto-aplicar". 0005 remove "dar gate em tudo" e "dar gate em nada". Quando 0018 é escrito, o espaço de design encolheu tanto que a implementação é quase forçada. É o valor de escrever decisões: um agente futuro não pode "simplificar" reintroduzindo uma opção rejeitada, porque a rejeição é versionada e datada.

1. A ADR-0018 diz que o loop de aprendizado é um ADAPT, não um CLONE literal do Hermes. A razão mais importante dada é:
Correto: c. A ADR lista duas razões (sem AIAgent Python para fork; e o princípio do portão de emissão) e marca a segunda como "mais importante". 0006 proíbe sedimento sem gate, o que força a forma propose→dispose em vez da gravação direta do Hermes.
2. Pela ADR-0005, o que decide se uma ação precisa de portão humano?
Correto: b. A ADR é explícita: "o critério decisivo é reversibilidade/externalidade, não posição no pipeline". Por isso distill e discover→build são HITL-free (reversíveis) mas ship e gasto real defaultam para T4-park.
3. Por que o projeto registra as opções rejeitadas dentro de cada ADR (ex.: "clientes que lançam — rejeitado")?
Correto: d. A ADR-0011 torna isso explícito em outro lugar ("um agente futuro não pode 'simplificar' ingerindo CL4R1T4S ou copiando o source do tac — a proibição é explícita e versionada"). Registrar o caminho rejeitado é o que torna a decisão executável, não só informativa.

Confusões comuns

"ADRs são atualizados quando o design muda." Não — são append-only. Uma nova decisão substitui uma antiga com seu próprio registro datado; a antiga permanece como história. A ADR-0001 até detalha o protocolo para sua própria reversão futura.
"0006 é só sobre dinheiro." A manchete é custo, mas a cláusula em que a fusão se apoia é o princípio de emissão — nada sedimenta sem passar um piso de qualidade. Essa única ideia é o que torna o aprendizado com gate em vez de automático (0018).