Lição 01 · Fundamentos · Alembic × Hermes v3 · O mapa da fusão
Alembic × Hermes — O Curso de Fusão v3 · Visual Course

O mapa da fusão consumada

Ao fim desta lição você sabe explicar como dois sistemas — o motor Alembic (TypeScript) e o Hermes Agent (Python) — viraram um único motor de 28 workspaces, o que foi CLONE, ADAPT ou MERGE, e onde cada número deste curso nasce.

fusao · index · s0
Leia primeiro (fonte primária)
packages/hermes/src/index.ts — o cabeçalho do pacote é a matriz de fusão viva

As 63 primeiras linhas desse arquivo documentam, subsistema a subsistema, o veredito CLONE/ADAPT e a origem Hermes de cada porta. Esta lição destila esse cabeçalho + os KPIs derivados da suíte real.

Você vai conseguir
  • Contar a história: 2 sistemas → 1 motor de 28 workspaces.
  • Aplicar os vereditos CLONE / ADAPT / MERGE / IGNORE a um subsistema real.
  • Localizar cada herança Hermes dentro de @alembic/hermes.
  • Citar os KPIs do motor sem digitar nenhum número de cabeça.
Leia a versão simples, ou abra a camada técnica em qualquer seção.
1

A grande ideia


Havia dois organismos. O Alembic: um motor de destilação em TypeScript — contratos, ETL determinístico, adapters, funil T0→T3 — que transforma um corpus de conhecimento em sinais de negócio e aprendizados. O Hermes Agent: um agente Python com memória durável, hub de skills, loop de auto-aprimoramento, clarify humano, web tools e mídia.

A fusão não foi uma reescrita: foi uma absorção disciplinada. Cada capacidade do Hermes passou pela matriz de decisão (CLONE, ADAPT, MERGE ou IGNORE) e as aprovadas foram reconstruídas dentro do monorepo como @alembic/hermes — com os invariantes do Alembic: Result fail-closed, portas injetadas (FsPort, Clock, backends), Zod na fronteira e zero Date.now() escondido. Hoje o resultado é um único motor: 27 packages + 1 app = 28 workspaces, todos verdes no mesmo baseline.

Pense como… um transplante de órgãos entre duas espécies: cada órgão do doador (Hermes) só entra no receptor (Alembic) depois de tipagem sanguínea (a matriz) e de ser envolvido no tecido imunológico local (Result + portas injetadas). A analogia quebra num ponto: aqui o doador não morre — o código-fonte do Hermes continua em ~/Documents/Resources/Repos/Agents/hermes-agent/ como referência de reverse engineering.

Por baixo do capô

O pacote @alembic/hermes declara a proveniência de cada subsistema no próprio código: packages/hermes/src/index.ts:5-63 lista memory/ (CLONE do frozen-snapshot MEMORY.md + USER.md do Hermes; e ADITIVAMENTE memory/multi-store/, um ADAPT do modelo multi-store do Agent Swarm), learning/ (ADAPT do background-review fork, ADR-0018), clarify/ (CLONE de tools/clarify_tool.py + clarify_gateway.py, o gate T4 humano), web/ (CLONE de tools/web_tools.py), skills/ (CLONE de tools/skills_tool.py + skill_manager_tool.pySkillStore), curator/ (CLONE de tools/skill_usage.py + agent/curator.py), media/ (CLONE do caminho cloud de transcription_tools.py + vision_tools.py) e templates/ (funções tipadas destiladas do catálogo 500-AI-Agents).

A busca de sessões do Hermes (session_search_tool.py) virou o caminho A4b: leitores em @alembic/sessions (claude-reader.ts/codex-reader.ts/chatgpt-reader.ts) + o mapper sessionToTranscriptRecords (packages/hermes/src/memory/transcript-import.ts) que o comando alembic import orquestra.

2

Em uma imagem


ANTES · dois sistemas ALEMBIC (TS) contracts · etl · adapters harness · council · swarm funil T0→T3, gates HERMES (Python) memory · skills hub · learning clarify · web · media session search · templates matriz de fusão CLONE/ADAPT/MERGE DEPOIS · um motor 1 monorepo · 28 workspaces 27 packages/* 1 app (cli) @alembic/hermes memory · learning · clarify · web · skills · curator · media · templates · employee @alembic/sessions (leitores A4b) um baseline: typecheck + build + 1.834 testes verdes
Leia da esquerda → direita: os dois sistemas atravessam a matriz de fusão e viram um monorepo só — a herança Hermes vive em @alembic/hermes + @alembic/sessions.
Estado da fusão hoje: ela está consumada. Não há mais “lado Hermes” esperando porte na fila deste curso: cada lição a partir daqui visita um workspace do motor único e mostra o que ele faz HOJE — e, quando um pedaço veio do Hermes, de onde veio.
3

Clone · Adapt · Merge · Ignore


A matriz fez duas perguntas por capacidade: o Alembic já tem algo equivalente? e a versão do Hermes é melhor ou inédita? As respostas caem em quatro vereditos. O placar real, gravado no cabeçalho de packages/hermes/src/index.ts:

fusao · 03-the-fusion-matrix · s0
SubsistemaVereditoOrigem no HermesOnde vive hoje
memory (frozen-snapshot)CLONEMEMORY.md + USER.mdhermes/src/memory/memory-store.ts
memory multi-storeADAPTAgent Swarm @founderos/memoryhermes/src/memory/multi-store/ (episodic/semantic/procedural/decision/transcript)
learning (loop fechado)ADAPTbackground-review forkhermes/src/learning/ (ADR-0018)
clarify (gate humano)CLONEclarify_tool.py + clarify_gateway.pyhermes/src/clarify/
webCLONEweb_tools.pyhermes/src/web/
skills hubCLONEskills_tool.py + skill_manager_tool.pyhermes/src/skills/skill-store.ts
curatorCLONEskill_usage.py + agent/curator.pyhermes/src/curator/
media (STT + visão)CLONEtranscription_tools.py (cloud) + vision_tools.pyhermes/src/media/
templatesADAPTcatálogo 500-AI-Agents (20 refs Python)hermes/src/templates/ (triageIssue, extractMeetingNotes)
session searchADAPTsession_search_tool.py@alembic/sessions + hermes/src/memory/transcript-import.ts (A4b)
faster-whisper localIGNOREcaminho local de transcription_tools.py— (ML Python; documentado em index.ts:53)
A regra que não muda
Todo porte entra com as convenções do receptor: exports nomeados, Result<T, Error> fail-closed em vez de exceção, IO só por porta injetada (FsPort, backends, Clock) e Zod validando a fronteira. É por isso que o curso pode ensinar “um workspace por lição” — todos falam a mesma língua.
Segundo o cabeçalho de packages/hermes/src/index.ts, qual veredito recebeu o loop de auto-aprimoramento (learning/)?
É um ADAPT: index.ts:15-18 descreve o learning/ como “an ADAPT of Hermes' closed self-improvement loop (the background-review fork)”, com o gate propose→dispose registrado na ADR-0018. O fork daemon original foi rejeitado; ficou a semântica, não o mecanismo.
4

A verdade derivada (os números do motor)


Todo número abaixo foi derivado da fonte em 2026-07-06 (script scripts/derive-counts.mjs + suíte real), nunca digitado de memória — a lição do drift de contagem que o failure-historian pegou vivo (docs diziam 32 comandos; o real era 33/47).

0
workspaces (27 packages + 1 app)
1.834
testes verdes em 200 arquivos *.test.ts (pré-#159; #159 soma +4)
0 · 0
comandos CLI top-level · formas documentadas
0
ADRs em docs/adr/
0
skills no SkillStore (~/.hermes/skills)
0
AI Employees (~/.alembic/employees)
2.589
signals no Business/opportunity-graph
1.022
learnings únicos (rota ADR-0002, 1º run real)
E ainda: 2.677 registros enriquecidos (676 plausíveis, 399 com força 4) no ciclo de enriquecimento T3 local. Os 1.022 learnings estão isolados em ~/.alembic-learnings-bkm, 100% com sourceRefs+hash e confidence média 0,94 — a lição 05 conta essa história inteira.
Camada técnica — derive você mesmo
# o baseline que mantém os 28 workspaces verdes (rode na raiz do repo)
pnpm -r typecheck && pnpm -r build && node scripts/safe-test.mjs pnpm -w test

# contagens derivadas da fonte, nunca à mão (PR #158)
node scripts/derive-counts.mjs

# os stores reais
alembic status
alembic memory semantic list --limit 5
ls ~/.hermes/skills | wc -l          # 148 skills
ls ~/.alembic/employees/*.json | wc -l  # 43 employees
5

O mapa das 30 lições


A tese do v3: cada workspace do monorepo é uma lição. 30 lições = este mapa (01) + os 28 workspaces (um por lição) + o fechamento. O módulo 1 percorre a espinha dorsal — a ordem em que o dado flui:

MÓDULO 1 · FUNDAMENTOS (lições 01–05) 01 mapa você está aqui 02 contracts a fronteira 03 etl T0 determinístico 04 adapters cintura estreita 05 harness o funil T0→T3 LIÇÕES 06–29 · UM WORKSPACE POR LIÇÃO (a partir de 06-hermes-memoria-skills) herança Hermes hermes (memória, skills, employee…) · sessions orquestração & gates swarm · mission · council · forge · coda · vm · factory conhecimento & percepção ingestion · embeddings · ocr · vision · prompts · planf3 · loop-engineering superfícies & produto cli · tui · web · infra · automation · marketing-factory · design · docs
Módulo 1 segue o fluxo do dado (contrato → ETL → adapter → funil); as demais lições cobrem os outros workspaces, agrupados aqui por domínio. Lista canônica: spec/packages.md.
Regra de leitura do curso: em toda lição, o que o pacote faz HOJE vem primeiro; a origem Hermes (quando existe) vem em seguida; invariantes e testes fecham; e a camada técnica sempre traz os comandos copy-paste do operador.
6

No código


A matriz de fusão não é um documento à parte que pode apodrecer: ela está gravada no cabeçalho do próprio pacote. Trecho real:

packages/hermes/src/index.ts:1-13
/**
 * @alembic/hermes — capabilities ported from the Hermes Agent into the Alembic
 * engine (the Alembic × Hermes fusion). All exports are named.
 *
 * Subsystems:
 *   - `memory/` — a faithful CLONE of Hermes' frozen-snapshot curated-memory
 *     store (MEMORY.md + USER.md). See `docs/alembic-hermes-fusion-matrix.md`
 *     §2.1 and `docs/hermes-complete-map.md` §3.2. ADDITIVELY, `memory/multi-store/`
 *     contributes the Agent-Swarm multi-store memory MODEL — FsPort-backed
 *     append-only JSONL stores (episodic / semantic / procedural / decision /
 *     transcript), an ADAPT of `@founderos/memory` with the MongoDB/Redis plumbing
 *     dropped, injected FsPort/Clock/IdFactory, and `Result`/never-throws. ...
 */

Acesse você mesmo

Abra packages/hermes/src/index.ts na raiz do repo e leia as linhas 1–63: cada bloco de comentário nomeia o subsistema, o veredito (CLONE/ADAPT), o arquivo Python de origem e o doc de referência. Depois compare com ls packages/hermes/src/ — os diretórios batem 1:1 com o cabeçalho.

Camada técnica — comandos desta seção
# a matriz viva, direto da fonte
sed -n '1,63p' packages/hermes/src/index.ts

# os subsistemas portados, lado a lado com a origem
ls packages/hermes/src/
ls ~/Documents/Resources/Repos/Agents/hermes-agent/tools/ | head -30

# a herança em uso: sessões → memória transcript (A4b, dry-run $0)
alembic import ~/.claude/projects --format claude --agent demo
7

Experimente


Prática de recuperação: vire cada carta e responda antes de ver o verso.

conceito
Quantos workspaces tem o motor fundido?
clique para virar
28 — 27 packages + 1 app (a CLI). Lista canônica em spec/packages.md; contagem derivada, nunca digitada.
matriz
CLONE vs ADAPT: qual a diferença de um porte?
clique para virar
CLONE copia a semântica quase literal (ex.: SkillStore); ADAPT reimplementa a ideia nas convenções do Alembic (ex.: learning loop com gate, sem daemon).
herança
Para onde foi o session search do Hermes?
clique para virar
Virou o caminho A4b: leitores @alembic/sessions + transcript-import.ts no hermes, orquestrados por alembic import (dry-run $0 por padrão).
disciplina
Por que “números derivados, nunca digitados”?
clique para virar
Porque contagem à mão drifta: os docs diziam 32 comandos e o real era 33/47. O scripts/derive-counts.mjs (PR #158) pegou o drift vivo na 1ª execução.
Você é o operador deste motor agora. Pergunta que vale levar adiante: “qual subsistema do Hermes EU usaria primeiro no meu fluxo?” — anote-a. Teaser da próxima lição: tudo no motor fala Result e passa por Zod — a lição 02 abre o @alembic/contracts, onde essa língua é definida (e onde um empate de 0.0005 USD decidiu um roteamento real).