Trinta lições depois, você consegue segurar o sistema todo em uma única vista. O Alembic é um motor que transforma fontes brutas em conhecimento validado e realimenta o trabalho terminado em si mesmo — um loop fechado. A fusão com o Hermes adicionou as peças que faltavam para tornar esse loop auto-aprimorável: uma memória para onde escrever, uma passada de aprendizado com gate por onde escrever, e um curador para podar o que envelhece. Este capstone desenha o circuito completo, lista o que foi enviado e o que está deliberadamente estacionado, e fecha com um quiz que atravessa tudo o que você aprendeu. Sem fatos novos — apenas a figura montada.
Esta lição não traz nenhum fato novo: ela monta a figura a partir do que as 29 lições anteriores já provaram. Cada afirmação aqui é citada de arquivo real do monorepo — os 7 subsistemas com suas dispositions vêm do cabeçalho de packages/hermes/src/index.ts; os veredictos de fusão e a fronteira estacionada, de docs/alembic-hermes-fusion-matrix.md; as contagens, das §2 e §5 de docs/alembic-complete-map.md. Você pode verificar tudo no código.
distill → learn → sediment → prune — e dizer por que ele é fechado.Result<T, Error> em vez de lançar exceções, e que a chamada ao modelo passa por uma cintura estreita (o ModelAdapter).Você passou o curso inteiro olhando uma peça de cada vez: a cintura, o funil, os gates, o swarm, os sete subsistemas. Agora vamos dar um passo atrás e olhar a máquina inteira de longe. Vista de longe, ela é simples: uma fábrica que pega matéria-prima (fontes), refina em peças confiáveis (conhecimento validado) e — esta é a parte genial — usa o que produziu para ficar melhor na próxima vez.
Esta lição não ensina nada novo. Ela faz uma coisa diferente e mais difícil: conecta. Cada uma das 29 lições anteriores foi uma estação isolada; aqui montamos o trem inteiro e andamos por ele de ponta a ponta. Se você consegue, ao fim, redesenhar o circuito de memória e prever a forma de um subsistema antes de abrir o arquivo, o curso cumpriu seu papel.
O circuito que tudo serve: distill → learn → sediment → prune, e a próxima run, no centro, sabe mais. O cadeado sobre LEARN é a pedra angular — a passada nunca auto-aplica.
Todo subsistema e toda invariante deste curso existem para fazer um único circuito girar com segurança: distill → learn → sediment → prune. As fontes são destiladas em Learnings (o funil, T0→T3); uma run terminada propõe escritas duráveis (a passada de aprendizado); escritas aprovadas sedimentam na memória e nas skills; e o curador poda o que cai em desuso — realimentando o que a próxima run sabe.
Repare no cadeadinho sobre a caixa LEARN. Essa é a pedra angular (ADR-0018): o loop é gated pelo Validator, nunca auto-aplica. Sem ele, um sistema auto-aprimorável deriva sobre as próprias saídas ruins. O gate é o que torna "aprende consigo mesmo" seguro, em vez de uma catástrofe de realimentação.
O Hermes em Python tinha um AIAgent que escrevia direto na memória ao fim do loop. Por que o Alembic não pôde copiar isso literalmente (CLONE) e teve de ADAPTAR a passada de aprendizado?
propõe → dispõe sobre ports que nunca lançam — as restrições determinam o desenho. É por isso que learning/ é um ADAPT, e não um CLONE (ADR-0018 nomeia os dois motivos).@alembic/etl) destila fontes em Learnings T0→T3; ao fim de uma run, learning/ roda a passada propose → dispose em que um reviewer propõe escritas e o Validator gate dispõe (aprovado → applied[], gate-sim-store-não → failed[], reprovado → rejected[]); escritas aprovadas sedimentam no MemoryStore/SkillStore; runCurator move skills ociosas active → stale → archived sem nunca deletar. Tudo sobre FsPort/Clock injetados e Result never-throws.A fusão entregou sete subsistemas dentro do pacote @alembic/hermes — exatamente os que fecham o loop auto-aprimorável. Cada um tem uma disposition honesta (foi CLONADO quase literal do Hermes, ou ADAPTADO ao estilo do Alembic) e um papel claro no circuito.
As contagens são verificadas pela própria fundação do curso (Lição 01): o complete-map registrou 19 pacotes + 1 app a 415 testes, que cresceram para ~565 depois que @alembic/hermes aterrissou — os mesmos ~565 que o estudo de caso da Lição 6 verifica verdes com um pgrep vazio. [uncertain] o total exato de hoje pode diferir por alguns à medida que testes são adicionados; trate ~565 como a figura as-built de quando o hermes foi enviado.
| Subsistema | Disposition | O que dá ao loop | Lição |
|---|---|---|---|
| memory | CLONE | o store durável para onde a sedimentação escreve (snapshot congelado + multi-store) | 7 |
| learning | ADAPT | a passada com gate propõe→dispõe — a pedra angular | 8 |
| curator | CLONE | poda active→stale→archived (nunca deleta) | 9 |
| clarify | CLONE | a superfície de pergunta do gate humano T4 | 10 |
| web | CLONE | search/extract sobre um backend injetado | 11 |
| skills | CLONE | memória procedural com disclosure progressivo | 12 |
| media | CLONE | transcribe/vision na nuvem sobre backends injetados | 13 |
index.ts descreve memory/ como um CLONE fiel do store de snapshot congelado do Hermes — e, aditivamente, um ADAPT do modelo multi-store do Agent-Swarm. Na tabela acima resumimos pela disposition da peça canônica (o snapshot congelado = CLONE); a Lição 7 abre as duas metades.Clique em cada estágio para ver qual subsistema o alimenta e onde ele vive no código. É a mesma viagem do anel, agora interativa.
—
—Engenharia honesta nomeia o que não está pronto. A matriz de fusão marca várias capacidades como ainda-não-enviadas — de propósito, com motivos. E distingue duas coisas que parecem iguais mas não são: estacionado (recuperável, com disposition na matriz) e IGNORADO (decidido contra, com justificativa). As duas batem uma lista vaga de backlog.
O Alembic é um servidor MCP (read-only), mas ainda não consome servidores MCP externos. A matriz sinaliza isto como um MERGE de alto valor em @alembic/harness — o SDK em TS o torna mais limpo que o original em Python. Estacionado, não rejeitado.
O ADR-0006 manda profundidade de qualidade-fronteira sobre todo o corpus WIKI_LLM, via o modelo mais barato acima de um piso. Esse backfill orçado de uma vez é um plano, não uma run concluída.
A Fase D (interfaces autênticas) e a Fase E (docs de produto/GTM) do plano de orquestração estão escopadas mas pendentes; o motor está construído, as superfícies de produto não (coerente com o ADR-0001: superfícies vivem nos produtos, não no motor).
Delegação de subagentes (o swarm já faz melhor, Lição 19), TTS neural local e faster-whisper local (ML só-Python, sem porte limpo pro Node), e os 23 adapters de plataformas de mensagem (fora de escopo pra um motor interno, ADR-0001). As Lições 3 e 21 percorrem esses veredictos.
Um sistema que entrega tudo de uma vez não entrega nada bem. A fusão desenhou uma fronteira apertada — os sete subsistemas que fecham o loop auto-aprimorável — e adiou o resto explicitamente, com motivos datados. Trabalho estacionado é recuperável (está na matriz com uma disposition); trabalho rejeitado é justificado (um IGNORE com motivo). Ambos batem um backlog vago. Isto é a doutrina de portfólio (ADR-0016) em miniatura: WIP limitado, tudo rastreado.
MERGE na matriz e um caminho ("mais limpo em TS"). Logo é estacionado — recuperável, alguém pode pegar amanhã.IGNORE com motivo ("o swarm já faz melhor"). Logo é decidido contra — não volta sem nova evidência.Se você levar uma única ideia de trinta lições, leve esta: o poder do motor vem das suas restrições, não em volta delas. Cada restrição remove uma classe inteira de falha — e juntas elas deixam um sistema autônomo rodar sem um humano vigiando cada passo, que era o objetivo desde o começo.
| A restrição | A classe de falha que ela remove | ADR |
|---|---|---|
never-throws (run devolve Result) | fan-out frágil: uma falha de provedor degrada uma faixa, não derruba a run | 0009 |
| ports injetados (FsPort/Clock/backends) | não-testável e não-replayável: tudo vira fake-ável e determinístico | 0008 |
fail-closed (DEFAULT_TIER = T4, budget guard) | o caso desconhecido que gasta/age sozinho: o default é negar | 0004 / 0011 |
| Validator gate (propõe→dispõe) | auto-derivar: a auto-melhoria não escreve sem aprovação | 0006 / 0018 |
plan-VM determinístico (sem Date.now()/Math.random()) | replay desonesto: a mesma entrada sempre dá a mesma run | 0008 |
O Alembic não é poderoso apesar das suas regras. Ele é poderoso por causa delas.— o fio condutor das 30 lições
Antes de recapitular, aqui está o curso inteiro em uma imagem: as seis partes e o que cada uma cobriu. Cada parte é uma estação do mesmo caminho que você seguiu na Lição 1 — pedido → tier → adapter → gates → custo → park/ship.
As seis partes do Curso de Fusão. Você está na Parte 6 — a máquina montada, ponta a ponta.
Vire cada cartão (clique, ou Enter/Espaço) e tente responder antes de ver o verso. É prática de recuperação sobre os seis módulos.
distill → learn → sediment → prune. Fontes viram Learnings; runs terminadas propõem escritas (com gate); aprovadas sedimentam; o curador poda — e a próxima run sabe mais.learning/ (a passada com gate).pgrep vazio (Lição 6). É marcado [uncertain] de propósito: o total exato pode variar à medida que testes entram.distill → learn → sediment → prune.curador nunca deleta: o pior destino de uma skill é archived, que é recuperável.ModelAdapter + Result) é a dobradiça por onde toda chamada passa.Quatro perguntas que atravessam os seis módulos. Escolha e leia o porquê de cada opção — o feedback ensina tanto quanto a pergunta.
Checagem cumulativa final
Acerte as quatro para fechar o curso. A pontuação aparece abaixo.
retryable na cintura; o swarm re-estabelece a fronteira never-throws com runSwarmSafe. O orquestrador só vê resultados discriminados uniformes — por isso a falha de um provedor degrada uma faixa, não a run.MemoryStore está acima do orçamento. A mesma run então re-propõe um fato que já está na memória. Onde os dois caem?failed = o gate aprovou mas o store recusou (acima do orçamento). Um fato já existente re-proposto é um no-op de sucesso contado como applied — "reforce, não duplique" (L8/L23). Os três baldes existem exatamente para manter isso distinto.Date.now() no seu alembic.plan.ts para um id, depois roda o suite via vitest puro com um teste que abre um socket. Duas coisas dão errado. Quais?Clock/fábrica de id injetados), e é o test:safe — não o vitest puro — que mata o grupo do worker + faz o sweep. A receita (L29) coloca as duas no "pronto".AIAgent em Python para forkar; e, "mais importante", o princípio do gate de emissão). O 0006 proíbe sedimento sem gate e o 0009 proíbe lançar, então a única forma que sobra é a passada com gate, baseada em ports — as restrições determinam o desenho (L24).Você agora consegue ler qualquer subsistema de @alembic/hermes e prever a forma antes de abrir; traçar uma chamada ao modelo pela cintura e um corpus pelo funil; defender cada veredicto de fusão; diagnosticar um vazamento de worker órfão; e seguir a receita para adicionar um subsistema seu. A fronteira estacionada — o cliente MCP, o backfill do corpus, as superfícies de design e GTM — é o trabalho natural seguinte, e a matriz já diz como abordar cada um. O loop está construído; fazê-lo girar mais rápido e mais largo é a estrada à frente.
packages/hermes/src/ e ler um subsistema de ponta a ponta; você vai descobrir que ele lê exatamente como você agora espera.