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.
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.
@alembic/hermes.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.
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.py → SkillStore), 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.
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:
| Subsistema | Veredito | Origem no Hermes | Onde vive hoje |
|---|---|---|---|
| memory (frozen-snapshot) | CLONE | MEMORY.md + USER.md | hermes/src/memory/memory-store.ts |
| memory multi-store | ADAPT | Agent Swarm @founderos/memory | hermes/src/memory/multi-store/ (episodic/semantic/procedural/decision/transcript) |
| learning (loop fechado) | ADAPT | background-review fork | hermes/src/learning/ (ADR-0018) |
| clarify (gate humano) | CLONE | clarify_tool.py + clarify_gateway.py | hermes/src/clarify/ |
| web | CLONE | web_tools.py | hermes/src/web/ |
| skills hub | CLONE | skills_tool.py + skill_manager_tool.py | hermes/src/skills/skill-store.ts |
| curator | CLONE | skill_usage.py + agent/curator.py | hermes/src/curator/ |
| media (STT + visão) | CLONE | transcription_tools.py (cloud) + vision_tools.py | hermes/src/media/ |
| templates | ADAPT | catálogo 500-AI-Agents (20 refs Python) | hermes/src/templates/ (triageIssue, extractMeetingNotes) |
| session search | ADAPT | session_search_tool.py | @alembic/sessions + hermes/src/memory/transcript-import.ts (A4b) |
| faster-whisper local | IGNORE | caminho local de transcription_tools.py | — (ML Python; documentado em index.ts:53) |
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.packages/hermes/src/index.ts, qual veredito recebeu o loop de auto-aprimoramento (learning/)?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.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).
~/.alembic-learnings-bkm, 100% com sourceRefs+hash e confidence média 0,94 — a lição 05 conta essa história inteira.# 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
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:
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:
/**
* @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. ...
*/
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.
# 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
Prática de recuperação: vire cada carta e responda antes de ver o verso.
spec/packages.md; contagem derivada, nunca digitada.@alembic/sessions + transcript-import.ts no hermes, orquestrados por alembic import (dry-run $0 por padrão).scripts/derive-counts.mjs (PR #158) pegou o drift vivo na 1ª execução.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).