Curso / Lição 03
Lição 03 · A camada de decisão

A matriz de fusão

Agora você tem dois sistemas: o motor do Alembic (Lição 1) e o Hermes Agent reconstruído por engenharia reversa (Lição 2). A matriz é a ponte — uma decisão item a item sobre o que fazer com cada capacidade do Hermes. Quatro verbos, uma regra cada: CLONE ADAPT MERGE IGNORE.

Leia primeiro (fonte primária)
docs/alembic-hermes-fusion-matrix.md — a matriz completa

Esta lição destila esse documento, ancorado nas duas fundações verificadas (docs/alembic-complete-map.md e docs/hermes-complete-map.md). Toda contagem de ocorrências e LOC sai dali (rodapé). Por que importa pra missão: a matriz é o que separa "copiar tudo do Hermes" de "construir só o que torna o Alembic melhor" — e metade do valor está no que ela recusa.

Objetivos desta lição
  • Derivar a disposição (CLONE/ADAPT/MERGE/IGNORE) de qualquer capacidade a partir de duas perguntas, respondidas contra um mapa verificado — nunca de memória.
  • Ler a matriz 2×2 e explicar por que o quadrante "tem equivalente + Hermes melhor" vira MERGE, não CLONE.
  • Justificar a coluna IGNORE: por que o swarm derruba o delegate_tool.py e por que 23 adaptadores de mensagem ficam de fora.
  • Explicar por que o ciclo de aprendizado é a pedra angular — e por que foi de CLONE no papel para ADAPT na entrega (ADR-0018).
0
capacidades → CLONE (inéditas)
0
capacidades → MERGE (dobrar)
0
perguntas decidem cada uma
0
swarm=63 ocorrências (vence delegate)

01 · O método: duas perguntas, uma disposição

Pense na matriz como um porteiro de loja diante de cada item do Hermes: ele não deixa tudo entrar, e não recusa tudo. Faz duas perguntas e, conforme o par de respostas, manda o item por uma de quatro portas. A matriz não é uma lista de desejos — é uma ferramenta de poda tanto quanto de construção.

As duas perguntas, cada uma respondida contra um mapa verificado (não de cabeça):

A disposição decorre do par. O que não pôde ser confirmado foi marcado [uncertain] em vez de adivinhado — a mesma honestidade que a Lição 2 cobrava da engenharia reversa.

Em uma frase: "Já temos? A do Hermes é melhor?" — e o cruzamento dessas duas respostas escolhe um de quatro verbos. Se não temos nada parecido, CLONE. Se temos a casa mas falta um cômodo, MERGE. Se temos algo torto, ADAPT. Se o nosso já é igual ou melhor (ou está fora da missão), IGNORE — sempre justificado.
Critério de evidência: "Alembic hoje" cita o mapa por hit-count (ex.: MCP=8, browser=13, skill=22, verifier=19, swarm=63) sobre o mapa de 1488 linhas, ou um pacote nomeado (ex.: packages/council/src/verifier-panel.ts). "Hermes" cita as §-seções de hermes-complete-map.md + LOC. Nada é decidido de memória; todo "Alembic tem/não tem X" tem evidência citada.
DAS DUAS PERGUNTAS ÀS QUATRO DISPOSIÇÕES · siga as setas — cada losango é uma pergunta
capacidade do Hermes cada uma passa pelo porteiro P1 · o Alembic já tem equivalente? NÃO CLONE inédito → portar de perto SIM P2 · a do Hermes é melhor / inédita? SIM, afim MERGE / ADAPT NÃO, ou fora de escopo IGNORE

02 · A matriz 2×2 — o cruzamento que decide tudo

As duas perguntas formam dois eixos. Cruze-os e cada capacidade cai num quadrante — e cada quadrante tem um verbo. Esta é a matriz no sentido literal: linhas = "Alembic já tem?", colunas = "Hermes é melhor/inédito?".

MATRIZ 2×2 · eixo Y = o Alembic já tem? · eixo X = a do Hermes é melhor/inédita?
Alembic NÃO tem ↑ Alembic JÁ tem ↓ ← Hermes não acrescenta Hermes melhor / inédito → IGNORE (fora de escopo) não temos, mas não é da missão ex.: 23 adaptadores de mensagens CLONE inédito e valioso → portar de perto memória, learning, curador, web, clarify IGNORE (já tão bom) o nosso é igual ou melhor ex.: swarm vs delegate · factory vs terminais MERGE · ADAPT superfície afim → dobrar nela torto → reimplementar no estilo ex.: cliente MCP, browser, autoria de skills

Repare na assimetria: três dos quatro quadrantes acabam reusando o que o Alembic já tem (dois IGNORE e o MERGE/ADAPT). Só o canto superior-direito — inédito e valioso — vira código novo de fato. É por isso que a coluna CLONE tem apenas cinco itens. A tabela abaixo fixa o verbo de cada quadrante:

VerboQuando
CLONEInédito no Alembic; portar o design do Hermes de perto, adaptando tipos para @alembic/*.
ADAPTO Alembic tem equivalente parcial / diferente; reimplementar a ideia do Hermes no estilo do Alembic.
MERGEO Alembic já tem superfície afim; dobrar a capacidade do Hermes nela — uma superfície mais rica.
IGNOREO Alembic já faz tão bem ou melhor, ou está fora do escopo da missão. Sempre justificado.

Quantos itens em cada porta?

Preveja antes de continuar
Das quatro disposições (CLONE, ADAPT, MERGE, IGNORE), qual tem mais capacidades nas tabelas da matriz — e isso diz o quê sobre a natureza da fusão? Chute antes de revelar.
IGNORE, com 8 itens (vs CLONE 5, MERGE 4, ADAPT 6). A maior porta é a de não construir. Se você chutou CLONE, pensou na fusão como "copiar o máximo"; na verdade ela é sobre recusar com critério — cada IGNORE mantém o Alembic um motor interno, não um gateway de assistente pessoal. Construir menos, com justificativa, é metade do trabalho.

A distribuição confirma o chute (ou o corrige): a fusão é mais sobre recusar com critério do que sobre copiar. As barras abaixo são as contagens reais das quatro tabelas de disposição da matriz (§2.1–2.4):

CAPACIDADES POR DISPOSIÇÃO · IGNORE é a maior coluna (a poda é metade do valor)
CLONE 5 · inéditos MERGE 4 · dobrar numa superfície ADAPT 6 · reimplementar no estilo IGNORE 8 · recusa justificada Contagens das tabelas §2.1–2.4 da matriz. A maior coluna é a de não construir — cada IGNORE é uma decisão de manter o Alembic um motor interno.
"A matriz é uma lista de desejos de features." Não — é tanto uma ferramenta de poda quanto uma lista de construção. Metade do valor está na coluna IGNORE: cada item é uma recusa justificada que mantém o Alembic um motor interno em vez de um gateway de assistente pessoal.

03 · Decida você mesmo (interativo)

Internalize o porteiro: ajuste as duas perguntas nos botões e veja o quadrante acender com o verbo correspondente. É exatamente o cruzamento da matriz 2×2 — agora controlado por você.

CLONE inédito e valioso → portar o design de perto exemplo: memória em arquivo (memory_tool.py)

Dois eixos, quatro saídas. Repare que "já tem + Hermes melhor" dá MERGE (dobra numa superfície existente), nunca CLONE — esse é o erro mais comum de quem lê a matriz.

Aplique o método na mão (passo a passo → agora você)

Você já viu o porteiro decidir no botão. Agora rode-o na mão, devagar, com um caso real — depois um é seu. Recuperar o procedimento (não só ver o veredito pronto) é o que fixa de verdade.

Exemplo resolvido · qual a disposição do Curador (curator.py + skill_usage.py §3.3)?
1
P1 — o Alembic já tem equivalente? Busca no mapa: curator=0 ocorrências. Não há sidecar de telemetria de uso de skills. Resposta: NÃO.
2
P2 — a versão do Hermes é valiosa/inédita? Sim: dá controle de qualidade ao ciclo de aprendizado (active→stale→archived, nunca deleta). Resposta: SIM, inédita.
3
Cruze na matriz 2×2. NÃO temos + Hermes inédito → canto superior-direito → CLONE.
4
Defina o alvo. Vai para o pacote novo @alembic/hermeslearning/curator.ts, portando o design (não o Python) com Result/Zod/escritas atômicas.
Agora você: qual a disposição da Automação de browser completa (browser_tool.py)? Lembre: o Alembic já encapsula agent-browser somente-leitura (browser=13). Rode P1 e P2 antes de revelar.
MERGE. P1 = JÁ TEM (agent-browser read-only, browser=13) · P2 = SIM, o Hermes acrescenta a superfície de interação. JÁ tem + acrescenta → quadrante inferior-direito → MERGE: manter read-only como padrão e dobrar a interação atrás de opt-in explícito. Dica: o procedimento é sempre o mesmo — só mudam as duas respostas.
O QUE O CURADOR DÁ AO CICLO · ciclo de vida de skills (nunca deleta) — por isso CLONE
active sem uso stale segue sem uso archived (nunca deletada) Skills fixadas (pinned) são isentas · só conta o que foi created_by:"agent" · escritas JSON atômicas. É o controle de qualidade que falta ao loop.

04 · CLONE — os cinco inéditos de alto valor

Estes caem no canto superior-direito da matriz: não têm equivalente no Alembic (o mapa mostra zero ou ocorrências incidentais) e agregam valor. Por isso são portados de perto — adaptando o design, não copiando o Python.

OS CINCO CLONE · cada um preenche uma lacuna real do mapa (hit-count baixo = gap)
fonte no Hermes lacuna no Alembic (evidência) memory_tool.py §3.2 · 1089 LOC memória em arquivo · memory=1 (incidental) background_review.py §1.10 ciclo de aprendizado · learning loop=0 curator.py + skill_usage.py §3.3 · 900 LOC curador · curator=0 web_tools.py §3.1 · 1377 LOC busca/extração web · web search=0 clarify_*.py §3.7 clarify (humano no loop) · clarify=0
CapacidadeFonte no HermesPor que CLONE
Memória em arquivo (snapshot congelado)memory_tool.py §3.2 (1089 LOC)MEMORY.md/USER.md limitados, injetados como snapshot congelado no início da sessão; escritas no meio da sessão tocam o disco mas nunca invalidam o cache de prefixo. Fundamental para o ciclo de aprendizado.
Ciclo de aprendizado por auto-revisãobackground_review.py §1.10O mecanismo "auto-aperfeiçoável" principal — a maior lacuna do Alembic. (Entregue como ADAPT; veja o destaque na seção 08.)
Curador (ciclo de vida de skills)curator.py + skill_usage.py §3.3 (900 LOC)active→stale→archived, nunca deleta. Dá controle de qualidade ao ciclo.
Busca / extração webweb_tools.py §3.1 (1377 LOC)HTTP+JSON puro sobre vários backends (Exa/Firecrawl/Parallel/Tavily) + compressão por LLM. Reforça a camada SOURCE (L-1) do funil.
Clarify (humano no loop)clarify_*.py §3.7Perguntas estruturadas + gateway bloqueante. Vira a superfície de pergunta do portão humano T4.
"CLONE significa copiar-colar o Python." Não — CLONE significa portar o design de perto, adaptando aos tipos e invariantes do Alembic (Result, FsPort, Zod, IDs por conteúdo). Todos vão para um único pacote novo, @alembic/hermes, com Result<T,E> em cada fronteira e nada que lance exceção (ADR-0009).

05 · MERGE — dobrar em uma superfície afim

Estes caem no quadrante "já temos algo parecido e o Hermes acrescenta": a resposta não é construir do zero, é dobrar a capacidade numa superfície existente para ter uma só, mais rica. O caso-modelo é o MCP.

O CASO MCP · servidor (já temos) + cliente (falta) = uma superfície bidirecional
✓ JÁ TEMOS servidor MCP, somente-leitura MCP=8 · handleMcpRequest ✗ FALTA (do Hermes) cliente: consumir MCP externos mcp_tool.py §3.10 · 4724 LOC MERGE → @alembic/harness superfície MCP bidirecional O SDK TS (@modelcontextprotocol/sdk) torna isso mais limpo que o original em Python. Alto valor — mas estacionado como follow-up, ainda não conectado.
CapacidadeAlembic hojePor que MERGE
Cliente MCPO Alembic é um servidor MCP, somente-leitura — sem cliente (MCP=8 ocorrências)Adicionar a capacidade de consumir servidores MCP externos. Alto valor; o SDK TS torna isso mais limpo que o original em Python. Estacionado como follow-up, ainda não conectado.
Automação de browser completaencapsula agent-browser somente-leitura (browser=13 ocorrências)Manter somente-leitura como padrão; combinar a superfície de interação atrás de opt-in explícito.
Autoria de skills + telemetriacarrega skills (skill=22 ocorrências) mas sem autoria pelo agenteCombinar create/edit/patch no loop-engineering para que skills criadas pelo agente alimentem o Curador.
Verifier / mixture-of-agentsverifier-panel do council (verifier=19 ocorrências)O quórum de N-lentes + veto do Alembic é o equivalente mais rico do MoA — manter o do Alembic.

Comparativo: verifier-panel do Alembic vs mixture-of-agents do Hermes

O MERGE mais sutil é o do verifier: aqui o Alembic não ganha nada do Hermes — ele já é o mais rico. Veja o trade-off lado a lado:

VERIFIER-PANEL (Alembic) vs MIXTURE-OF-AGENTS (Hermes) · o nosso já é o superconjunto
Alembic · verifier-panel quórum de N lentes independentes + veto (qualquer lente reprova) verifier=19 · verifier-panel.ts → equivalente MAIS RICO Hermes · mixture-of-agents fan para N modelos de referência + agrega as respostas mixture_of_agents_tool.py §2 → subconjunto (sem veto) Veredito: manter o do Alembic. MERGE só o enquadre "fan + agrega" se acrescentar algo — senão o nosso é canônico.

06 · ADAPT & IGNORE — o resto, justificado

ADAPT (equivalente parcial → reimplementar no estilo do Alembic): session-search FTS5, skills-hub, conceitos de kanban no swarm, blueprints de cron, transcrição na nuvem, análise de visão.

A LINHA DIVISÓRIA · ADAPT (reusa o esqueleto) vs IGNORE (recusa justificada)
ADAPT · há um esqueleto torto o Alembic tem algo parcial/diferente → reimplementar a ideia no estilo dele ex.: FTS5, skills-hub, kanban, cron, mídia IGNORE · não construir já tão bom OU fora da missão → recusa SEMPRE justificada ex.: swarm, factory, computer-use, mensageria

IGNORE — e a justificativa é a parte interessante:

CapacidadePor que IGNORE
Delegação a subagentes (delegate_tool.py, 3188 LOC)O swarm do Alembic (swarm=63 ocorrências: orquestrador de 3 níveis, lead-worker, com limite de profundidade, fila com dependências) já faz isso nativamente e melhor. Mantém um insight portátil: "a conclusão re-entra como um novo turno, nunca no meio do contexto".
Backends de terminal (6 contextos)A factory do Alembic já entrega docker/podman/no-sandbox + isolamento git-worktree. Redundante.
Computer use, TTS neural local, faster-whisperStacks ML só-Python ou fora da missão distill→venture. Difícil portar, sem valor de missão.
23 adaptadores de plataformas de mensagensO Alembic é um motor interno (ADR-0001), não um gateway de assistente pessoal. Os clientes L4 são API/MCP/CLI/cockpit — não Telegram/WhatsApp.

O IGNORE mais importante: swarm vs delegate_tool

A maior tool do Hermes na lista de IGNORE é a delegação — 3188 LOC. Recusá-la parece desperdício até você ver que o Alembic já tem o equivalente nativo e mais completo. É o comparativo que define o que "IGNORE = já tão bom" significa:

SWARM (Alembic, nativo) vs DELEGATE_TOOL (Hermes, 3188 LOC) · IGNORE = já tão bom ou melhor
Alembic · swarm (swarm=63) orquestrador de 3 níveis · lead-worker limite de profundidade fila com dependências · PARL reward → nativo, mais completo Hermes · delegate_tool §3.8 delegação assíncrona a subagentes 3188 LOC ★ insight portátil mantido: "conclusão re-entra como novo turno, nunca no meio do contexto" (cache-safe) IGNORE não é "ruim" — é "já temos melhor". Mas até um IGNORE pode doar uma regra: a cache-safety acima.

07 · A pedra angular: por que o ciclo de aprendizado fica acima de tudo

A linha mais importante da matriz

"O Alembic tem um funil de destilação e um portão de validador, mas nenhum ciclo fechado de auto-aperfeiçoamento. O ciclo de aprendizado do Hermes é a peça que falta, e ele compõe com o que o Alembic já tem em vez de substituir."

O funil transforma fontes em Learnings — mas nada realimenta esses learnings de volta ao motor. É um cano que termina no ar. O Hermes fecha esse ciclo. Veja o "antes e depois":

HOJE (cano aberto) + HERMES (fork revisor) = CICLO FECHADO · próxima run mais esperta
Alembic hoje: SOURCE distill (T0–T3) Learnings ⊘ sem realimentação Hermes adiciona: após a run → fork revisor memória + skills durável Fundido: distill → Learnings snapshot memória/skills (com portão)curador mantém limpo próxima run mais esperta

Duas razões para encaixar tão bem — e ambas são "encaixa", não "substitui":

Encaixa na cintura estreita. A memória vive dentro do system prompt, congelada no início da sessão — exatamente a disciplina que mantém o cache de prefixo de prompt quente (ADR-0010). O fork de revisão herda o prompt em cache literalmente.
Encaixa no pipeline de portões. O revisor é ele próprio passível de portão — escritas passam pelo Validator Gate existente (ADR-0006) antes de sedimentar. Isso dá "aprender só com vitórias validadas".
POR QUE O SNAPSHOT É CONGELADO · a memória entra no prefixo e o cache fica quente
MEMORY.md (congelado) resto do system prompt + conversa prefixo idêntico sessão a sessão → cache QUENTE ✓ escritas no meio da sessão → disco, NÃO o prefixo (cache intacto) Congelar = a regra de cache-safety que a Lição 2 já viu na delegação ("re-entra como novo turno"). Memória obedece à mesma disciplina.

08 · CLONE no papel, ADAPT na entrega (ADR-0018)

Aqui está a nuance que fecha a lição — e prova que a matriz é viva, não um decreto. O ciclo de aprendizado foi listado como CLONE, mas entregue como ADAPT. Por quê? Duas razões fundamentadas (ADR-0018):

CLONE no papel, ADAPT na entrega. A matriz listou o ciclo de aprendizado como CLONE, mas ele foi entregue como ADAPT (ADR-0018): não há AIAgent em Python para forkar como thread daemon, e auto-escrever burlaria o Validator Gate. Então o revisor propõe e o Validator do Alembic dispõe.
CLONE LITERAL (rejeitado) vs ADAPT ENTREGUE · o que mudou entre o plano e o código
CLONE literal (rejeitado) forkar uma thread daemon (AIAgent) auto-escrever na memória durável ✗ burla o Validator Gate (ADR-0006) ✗ não há AIAgent em Python no Alembic ADAPT entregue (ADR-0018) passe síncrono pós-unidade, ports injetadas revisor propõe → Validator dispõe ✓ Validator-gated, nunca auto-aplicado ✓ fail-closed · Zod na fronteira (saída do modelo) Uma disposição pode mudar entre o plano e a entrega — por razões fundamentadas, registradas num ADR.

Como o ADAPT funciona, passo a passo

O mecanismo virou reviewAndLearn(summary, { proposer, gate, memory }) — três portas injetadas, nada concreto. Siga o caminho de uma proposta, do resumo da run até a memória (ou ao descarte):

O PASSE reviewAndLearn · propõe → portão decide (score ≥ 0,7?) → aplica ou descarta (fail-closed)
resumo da run (vazio = no-op válido) ReviewProposer {target,op,rationale,score} ReviewGate score ≥ 0,7? SIM MemoryStore aplica · reusa dedup NÃO descarta (não sedimenta) fail-closed erro do proposer/gate → falha o passe (err) · write rejeitado → registrado em failed, nunca lançado Default conservador: scoreThresholdGate(0,7) = "aprender só com vitórias validadas". O Validator real do @alembic/coda entra depois, injetando seu próprio ReviewGate — sem mudar reviewAndLearn. Saída do proposer é validada com Zod na fronteira (em produção é saída de modelo, não-confiável).

Essa nuance — revisor propõe, Validator dispõe, escritas com portão, tudo fail-closed — é a Lição 4 inteira. Aqui o que importa é o princípio: a matriz decide a intenção; o ADR registra como a intenção sobreviveu ao encontro com as invariantes do Alembic.

09 · Como isso se encaixa

Recue um passo e olhe a máquina inteira. A matriz não vive sozinha: ela é a dobradiça entre o que você descobriu e o que você construiu. À esquerda, os dois mapas verificados a alimentam; ela cospe um veredito por capacidade; esses veredictos viram decisões de build; as decisões viram subsistemas embarcados — e o último deles, o ciclo de aprendizado, fecha o laço de volta na origem. Sem a matriz no meio, "ler tudo do Hermes" e "construir o Alembic certo" seriam a mesma pilha indiscriminada.

A MATRIZ É A DOBRADIÇA · mapas → ESTA decisão item-a-item → builds → subsistemas → laço fechado
UPSTREAM · dois mapas alembic-complete-map.md hermes-complete-map.md P1 · P2 ◆ A MATRIZ (você está aqui) CLONE · ADAPT · MERGE · IGNORE um veredito por capacidade decisões de build ordem de implementação (matriz §5) subsistemas @alembic/hermes: memória · learning · curador web · clarify · skills · mídia ★ pedra angular · ciclo de aprendizado reviewAndLearn → memória durável (com portão) cada run deixa o motor mais esperto p/ a próxima o aprendizado realimenta a base de conhecimento → o laço se fecha (é por isso que esta peça é a pedra angular)

Clique Percorrer o fluxo para acender um passo de cada vez — da fonte (mapas) até o laço que volta nela. A matriz é o único ponto onde o conhecimento vira decisão.

Onde você está na metodologia. Toda a metodologia do Alembic é um funil de provas: aprender → analisar → executar uma unidade → verificar na fronteira real → decidir. A matriz é a etapa analisar da fusão — ela converte os dois mapas (a fase aprender, Lições 1 e 2) em um plano de execução (Lições 7–13, 22–23). É a peça que garante que o executar construa só o que torna o motor melhor. O mapa interativo completo da metodologia (a fonte canônica) é o hub do curso: índice do curso → metodologia. [uncertain] não há um arquivo metodologia.html separado neste pacote do curso; o hub (../index.html) e a Lição 21 são a entrada de metodologia.

Conecta com estas lições (e por quê)

As arestas que entram e saem desta peça
Lição 02 · Engenharia reversa do Hermesalimenta a entrada: produz o hermes-complete-map.md que responde a pergunta P2 (a do Hermes é melhor/inédita?). Sem esse mapa, a coluna direita da matriz seria chute.
Lição 21 · O framework de fusãogeneraliza esta peça: a matriz é o framework aplicado ao Hermes; a Lição 21 mostra como aplicá-lo a qualquer fonte futura (o método por trás das duas perguntas).
Lição 04 · O loop fechadorecebe a saída angular: é a implementação do CLONE-virou-ADAPT desta lição (reviewAndLearn, propõe→dispõe, fail-closed). A matriz decide a intenção; a Lição 4 mostra o código.
Lições 07–13 · os mergulhos por subsistemarecebem os veredictos CLONE/ADAPT/MERGE: MemoryStore (07), reviewAndLearn (08), Curador (09), Clarify (10), web (11), Skills (12), mídia (13). Cada uma é uma célula da matriz construída de verdade.
Lição 19 · O swarmexplica o maior IGNORE: por que delegate_tool.py (3188 LOC) é recusado — o swarm já faz delegação multi-nível nativamente e melhor.

10 · Na prática

A matriz é um documento de decisão — sua "saída executável" é o stack que ela mandou construir e ligar. Você não roda "a matriz"; você inspeciona o que ela produziu de dois ângulos: (1) lê o veredito por capacidade no próprio documento; (2) confirma que o stack de modelos/adaptadores que sustenta esses subsistemas está coerente com alembic doctor --client-stack (offline, $0, sem rede). Abaixo, os dois passos reais.

A fonte de verdade da disposição de cada capacidade é a matriz em si. Abra-a e vá direto às quatro tabelas (§2.1–§2.4):

# a matriz completa — a fonte de toda disposição CLONE/ADAPT/MERGE/IGNORE
docs/alembic-hermes-fusion-matrix.md
#   §1  legenda das disposições
#   §2  as quatro tabelas (2.1 CLONE · 2.2 MERGE · 2.3 ADAPT · 2.4 IGNORE)
#   §3  os dois CLONEs angulares · §4 esboço do pacote · §5 ordem de build

Ancorado nos dois mapas verificados: docs/alembic-complete-map.md (evidência de "Alembic hoje") e docs/hermes-complete-map.md (as §-seções do Hermes + LOC).

As disposições viraram subsistemas que rodam sobre o registro de modelos/adaptadores. Este comando valida a forma desse stack — offline, sem custo, sem rede:

$ alembic doctor --client-stack
# saída esperada (offline, $0 — só valida a forma do MODEL_REGISTRY):
doctor (client-stack):
  [OK] model-registry: N model(s) validated; 0 invalid, 0 with unknown adapter
  [OK] client-stack: offline mode: validated registry shape only; pass --online for live model smoke ($0 without it)
summary: 2 ok, 0 warn, 0 fail

É fail-closed: qualquer entrada inválida do registro vira [FAIL] e saída não-zero — a mesma disciplina que a matriz exige (nada entra sem evidência). [uncertain] não existe um comando que "roda a matriz"; esta validação cobre o stack que ela mandou construir, não a decisão em si.

Experimente · do clone do repo ao veredito
1
No repositório, abra a matriz e localize uma capacidade — ex.: o cliente MCP:
docs/alembic-hermes-fusion-matrix.md → §2.2 (tabela MERGE). Veja a coluna "Por que MERGE".
2
Aplique você as duas perguntas antes de ler o veredito: P1 contra docs/alembic-complete-map.md (procure MCP → conta as ocorrências; servidor existe, cliente não) · P2 contra docs/hermes-complete-map.md (§3.10 mcp_tool.py). Confira se seu par de respostas bate com a disposição da tabela.
3
Valide o stack que sustenta os subsistemas construídos:
alembic doctor --client-stack
O que procurar na saída: [OK] model-registry e summary: … 0 fail. Se aparecer [FAIL], uma entrada do MODEL_REGISTRY está fora de forma (saída não-zero, fail-closed).
Manter verde sempre: qualquer mudança em código tem de passar por pnpm -r typecheck && pnpm -r build && pnpm -w test — inclusive os testes de cada subsistema que a matriz mandou construir (ex.: pnpm --filter @alembic/hermes test).

Fixe os conceitos (flashcards)

Clique pra virar. Tente lembrar a resposta antes de virar — recuperação ativa fixa mais que reler.

Método
Quais são as duas perguntas que decidem a disposição?
clique pra virar ↻
Resposta
P1: o Alembic já tem equivalente? (contra alembic-complete-map). P2: a do Hermes é melhor/inédita? (contra hermes-complete-map). O par escolhe o verbo.
2×2
"Já tem + Hermes melhor" dá qual verbo?
clique pra virar ↻
Resposta
MERGE — dobrar numa superfície existente (ex.: cliente MCP no servidor MCP). Nunca CLONE: CLONE é só "não temos + é valioso".
IGNORE
Por que delegate_tool.py (3188 LOC) é IGNORE?
clique pra virar ↻
Resposta
O swarm=63 já faz delegação multi-nível nativamente e melhor. IGNORE = "já tão bom". Insight mantido: conclusão re-entra como novo turno, nunca no meio do contexto.
ADR-0018
Por que o learning loop virou ADAPT, não CLONE?
clique pra virar ↻
Resposta
Não há AIAgent Python p/ forkar, e auto-escrever burlaria o Validator Gate. Virou passe pós-unidade: revisor propõe, Validator dispõe, fail-closed.

Revisão cumulativa — recupere de memória

Antes de clicar: responda de cabeça. As quatro opções têm o mesmo tamanho de propósito — sem pista pela forma.

1. delegate_tool.py (delegação a subagentes, 3188 LOC) recebe a disposição IGNORE. Por quê?
Correto: c. A matriz cita swarm=63 ocorrências — orquestrador de 3 níveis com lead-worker, limites de profundidade e fila com dependências; IGNORE aqui significa "já tão bom ou melhor". a erra o sentido de CLONE: a linguagem nunca é o bloqueio — todo CLONE porta o design, não o código; o motivo é que já temos melhor. b confunde os dois tipos de IGNORE: "fora de escopo" é o caso dos 23 adaptadores de mensagens, não o do swarm (que é "já tão bom"). d inventa uma dependência que não existe na justificativa. Um insight portátil é mantido: a conclusão re-entra como um novo turno, nunca no meio do contexto.
2. Por que o cliente MCP é um MERGE e não um CLONE?
Correto: b. O Alembic se expõe via MCP (servidor, somente-leitura, MCP=8) mas não consegue consumir servidores externos; o cliente se dobra nessa superfície existente — o quadrante "já tem + Hermes acrescenta". a é factualmente falso: se já tivesse o cliente, não haveria o que fazer. c contradiz a decisão — MCP é justamente alto valor, só está estacionado como follow-up. d erra de novo na linguagem: o SDK TS torna o port mais limpo que o Python, não impossível.
3. O que torna o ciclo de aprendizado a pedra angular de toda a matriz?
Correto: d. O Alembic destilava em Learnings mas não tinha caminho de volta ao motor; o ciclo adiciona exatamente isso, encaixa na cintura estreita (memória congelada no prompt) e no pipeline de portões (escritas com portão) — composição, não substituição. a mede a coisa errada: a maior tool por LOC é o mcp_tool.py (4724), e tamanho não decide importância. b inverte a tese central: ele compõe com o funil, não o substitui. c é o oposto do que houve — esse CLONE virou ADAPT na entrega (ADR-0018).
4. Na entrega (ADR-0018), por que escritas do revisor passam por um portão em vez de serem auto-aplicadas?
Correto: a. ADR-0006: nada sedimenta sem cruzar um piso de qualidade; por isso o passe é propor→dispor, com scoreThresholdGate(0,7) por padrão e o Validator do coda injetável depois — tudo fail-closed, com Zod na fronteira. b inventa um motivo de performance que não está na decisão. c confunde portão com tradução de linguagem — coisas distintas. d é falso: o MemoryStore já existe e é reusado (inclusive seu dedup); o ponto é validar antes de gravar, não a falta de armazenamento.
💬 Travou em algo? Eu sou seu professor neste curso — pergunte. "Por que MERGE e não ADAPT no cliente MCP?", "O que conta como evidência de hit-count?", "Como o coda Validator entra como ReviewGate depois?". É só dizer.