Trinta lições que ensinam um sistema real: como o motor Alembic é construído, o que foi reverse-engineered do Hermes Agent, quais capacidades foram fundidas (e quais foram deliberadamente ignoradas) e o loop fechado e auto-melhorante que resultou disso — mais a disciplina de ports que segura tudo, uma guerra de engenharia real, um mergulho em cada subsistema @alembic/hermes entregue, uma passagem completa pelo motor em que a fusão se encaixa e, enfim, dois labs práticos, tópicos avançados e um capstone. Cada afirmação aqui vem dos próprios mapas, ADRs e código entregue do projeto. PT-BR.
@alembic/hermes com Result + Zod + ports injetados → gate do Validator → e, no fim, o loop fechado: um run que termina alimenta o próximo (proponha → gate → sedimente). Nada é fundido por opinião; tudo passa pela prova.Result que nunca lança — e o funil de distill T0→T3 que vira sources em Learnings.Result + Zod + never-throws em cada boundary. Por quê (testabilidade, determinismo, store-agnosticism — ADR-0009) com código real.MEMORY.md/USER.md, add/replace/remove por substring única, o delimitador §, limites 2200/1375, e snapshot-vs-live.reviewAndLearn: propose→gate→apply, o port ReviewGate, scoreThresholdGate(0.7), os buckets applied/rejected/failed e o controle fail-closed.runCurator: o port Clock, active→stale→archived, never-delete, os gates pinned/agent-only e o anchor never-active +Infinity.monotonicIdFactory, Zod com validação cross-field e a regra leave-pending.WebBackend + Compressor, createFetchBackend sobre o fetch global (sem dep), o clamp maxResults e defesa em profundidade.TranscriptionBackend/VisionBackend, fetch backends, Zod no boundary e por que o caminho de ML local é IGNORE.ModelRunResult discriminado em ok (nunca lança), e runWithGuards — Zod-in → try/catch → circuit-breaker → retry → rede de segurança externa.NoteStore do zero — FsPort injetado, Zod no boundary, Result + never-throws, bounded — espelhando como memory/skills foram feitos. Com um "agora você".reviewAndLearn a partir de três ports injetados (proposer + ReviewGate + MemoryStore); veja um turno se dividir em applied/rejected/failed e force cada bucket.detached:true, kill(-pgid), o wrapper safe-test.mjs, o vitest.config.ts endurecido e o sweep pós-run. Estende a Lição 06.pickCheapestForTier e o BudgetGuard fail-closed onde cap não-positivo significa só free-tier.runIdFor), o run-dir determinístico, o ban da plan-VM a Date.now()/Math.random() e o seam Clock/id-factory injetado que mantém o replay honesto.@alembic/hermes — ports-and-injection, Result+Zod, sem dep nova, vitest.config.ts por pacote, test:safe. Um checklist para o próximo agente.