You have two systems now: the Alembic engine (Lesson 1) and the reverse-engineered Hermes Agent (Lesson 2). The matrix is the bridge — an item-by-item decision about what to do with each Hermes capability. Four verbs, one rule each.
The matrix is not a wish-list. Each Hermes capability was put through two questions, each answered against a verified map (not from memory):
docs/alembic-complete-map.md, with hit-counts over the map and named packages as evidence.docs/hermes-complete-map.md.The disposition follows from the pair. Anything that couldn't be fully confirmed was marked [uncertain] rather than guessed.
| Verb | When |
|---|---|
| CLONE | Net-new in Alembic; port the Hermes design closely, adapting types to @alembic/*. |
| ADAPT | Alembic has a partial / different equivalent; reimplement the Hermes idea in Alembic's style. |
| MERGE | Alembic already has a related surface; fold Hermes' capability into it — one richer surface. |
| IGNORE | Alembic already does it as well or better, or it's out of scope for the mission. Always justified. |
These have no Alembic equivalent (the map shows zero or incidental hits), so they get ported closely.
| Capability | Hermes source | Why CLONE |
|---|---|---|
| File memory (frozen-snapshot) | memory_tool.py §3.2 (1089 LOC) | Bounded MEMORY.md/USER.md injected as a session-start frozen snapshot. Foundational for the learning loop. |
| Self-review learning loop | background_review.py §1.10 | The headline "self-improving" mechanism — Alembic's biggest miss. (Shipped as ADAPT; see spotlight below.) |
| Curator (skill lifecycle) | curator.py + skill_usage.py §3.3 | active→stale→archived, never delete. Gives the loop quality control. |
| Web search / extract | web_tools.py §3.1 (1377 LOC) | Pure HTTP+JSON over multiple backends. Strengthens the funnel's SOURCE layer. |
| Clarify (human-in-the-loop) | clarify_*.py §3.7 | Structured questions + blocking gateway. Becomes the T4 human-gate's ask surface. |
| Capability | Alembic today | Why MERGE |
|---|---|---|
| MCP client | Alembic is an MCP server, read-only — no client (MCP=8 hits) | Add the ability to consume external MCP servers. High-value; the TS SDK makes it cleaner than the Python original. Parked as a follow-up, not yet wired. |
| Full browser automation | wraps agent-browser read-only (browser=13 hits) | Keep read-only as default; merge interaction surface behind an explicit opt-in. |
| Skills authoring + telemetry | loads skills (skill=22 hits) but no agent-authoring | Merge create/edit/patch into loop-engineering so agent-made skills feed the Curator. |
| Verifier / mixture-of-agents | council verifier-panel (verifier=19 hits) | Alembic's N-lens quorum + veto is the richer equivalent of MoA — keep Alembic's. |
ADAPT (partial equivalent → reimplement): session-search FTS5, skills-hub, kanban concepts into the swarm, cron blueprints, cloud transcription, vision analysis.
IGNORE — and the justification is the interesting part:
| Capability | Why IGNORE |
|---|---|
Subagent delegation (delegate_tool.py, 3188 LOC) | Alembic's swarm (swarm=63 hits: 3-tier orchestrator, lead-worker, depth-bound, dependency-gated queue) already does this natively and better. Keep one portable insight: async-delegation's "completion re-enters as a new turn, never mid-context." |
| Terminal backends (6 contexts) | Alembic's factory already ships docker/podman/no-sandbox + git-worktree isolation. Redundant. |
| Computer use, neural local TTS, faster-whisper | Python-only ML stacks or out of the distill→venture mission. Hard to port, no mission value. |
| 23 messaging-platform adapters | Alembic is an internal engine (ADR-0001), not a personal-assistant gateway. L4 clients are API/MCP/CLI/cockpit — not Telegram/WhatsApp. |
"Alembic has a distillation funnel and a validator gate, but no closed self-improvement loop. Hermes' learning loop is the missing piece, and it composes with what Alembic already has rather than replacing it."
The funnel turns sources into Learnings — but nothing feeds those learnings back into the engine. Hermes closes that loop. Two reasons it fits so cleanly:
AIAgent to fork as a daemon thread, and auto-writing would bypass the Validator Gate. So the reviewer proposes and Alembic's Validator disposes. That nuance is Lesson 4.delegate_tool.py (subagent delegation, 3188 LOC) is dispositioned IGNORE. Why?swarm=63 hits — a 3-tier orchestrator with lead-worker, depth bounds, and a dependency-gated queue. IGNORE here means "already as good or better," not "out of scope." One portable insight is still kept: completion re-enters as a new turn, never mid-context.Result, FsPort, Zod). And a disposition can change between plan and ship: the learning loop went CLONE → ADAPT for principled reasons.