A história completa, numa página: do corpus de IA jurídica ao signal "fábrica de petições personalizadas", à campanha da C.D Advocacia, até a funcionária Iris — cada passo um comando real que você roda e verifica.
Esta lição destila o REVIEW.md numa só coisa: as três jornadas reais que costuram TODOS os pacotes do Alembic num organismo único — e mostra onde o $0 vira gasto.
As sete lições anteriores ensinaram peças: o funil, os tijolos atômicos, o swarm e os gates, o AI Employee, a marketing factory, a factory/forge. Esta lição final não ensina nenhuma peça nova — ela encadeia as peças em três jornadas reais, ponta a ponta, todas dentro do mesmo exemplo recorrente do curso.
Pense em três caminhos que partem de uma só matéria-prima — um corpus de IA jurídica (transcripts, bookmarks, repos, notas):
--online com memória que persiste.Pense como… uma destilaria que abastece toda uma vila: o mesmo alambique central enche vials de conhecimento e oportunidade (A), e dessas oportunidades nascem oficinas — uma fábrica de campanhas (B) e uma artesã contratada que atende o balcão (C). Onde a analogia quebra: numa vila real você não tem um interruptor que separa “ensaiar de graça” de “gastar dinheiro de verdade” — no Alembic você tem, e ele é o herói desta lição.
Os três fluxos não são features separadas: são composições da mesma cintura estreita. Todo comando devolve Result<T, Error> de @alembic/contracts (sucesso-ou-erro como valor, nunca exceção), todo IO passa por FsPort de @alembic/etl, e todo comando roda offline determinístico ($0) por padrão. O Fluxo A usa @alembic/etl (funil) + @alembic/swarm/@alembic/harness (orquestração). O Fluxo B usa @alembic/marketing-factory. O Fluxo C usa @alembic/hermes/employee. Os três escrevem em stores append-only sob .alembic/.
A regra que se repete nos três: nenhum flag sozinho gasta. Rede real = --online; geração paga de vídeo = --approve e --yes juntos. É a trava de gasto, e ela é estrutural — está no parser de args, não num “cuidado” verbal.
distill um corpus e ler os BUSINESS SIGNALS que viram uma venture.marketing discover da C.D → marketing campaign em dry-run $0.employee show/explain/run em preview offline.Um só diagrama, da matéria-prima à funcionária. Leia da esquerda para a direita: a mesma origem (o corpus) ramifica nos três fluxos desta lição.
Quantos dos três fluxos, rodados em sua forma padrão (sem nenhuma flag extra), gastam dinheiro ou tocam a internet?
distill roda --offline; marketing campaign é dry-run em toda etapa; employee run imprime um preview sem chamar modelo. Gastar exige flags explícitas — e é isso que a seção “O que é gated” destrincha.O primeiro fluxo é o porquê do Alembic existir: transformar conhecimento bruto em oportunidade acionável, sem humano no meio. Você aponta o funil para um corpus, ele roteia cada item por tiers (T0→T3) e deposita duas saídas — LEARNINGS (o que aprendeu, citável) e BUSINESS SIGNALS (o que fazer com isso).
distill --offline roteia o corpus por T0→T3 e deposita LEARNINGS + opportunity; status confirma os stores; um signal escolhido vira um run com goal+plan no harness, que materializa a venture.A sequência real, passo a passo (cada linha é um comando que você cola):
# 1. destile o corpus — offline, determinístico, $0 alembic distill ~/corpora/ia-juridica --offline # 2. confirme o que o funil depositou (os dois stores) alembic status # → default tier T4 · phases: discover -> validate -> design -> plan -> build -> review -> ship # → stores: 4 opportunity, 0 learnings # 3. um BUSINESS SIGNAL ("fábrica de petições personalizadas") vira um escopo; # o harness o forja em venture (gates: Scope→Council→Proof→Validator→Publish) alembic run --goal GOAL.md --plan alembic.plan.ts --yes
default tier T4 · phases: discover -> validate -> design -> plan -> build -> review -> ship · stores: 4 opportunity, 0 learnings. Aquele 4 opportunity são quatro BUSINESS SIGNALS prontos para virar venture — incluindo o nosso.O funil vive em @alembic/etl (lição 0002). Ele lê o corpus por FsPort (nunca fs direto), roteia cada item por tiers — T0 hermético, T1 cita o evidence field, até T3 — e deposita em dois stores append-only sob .alembic/. --offline garante $0 e determinismo (o VM rejeita Date.now()/Math.random() no plano). PII falha fechado.
O passo 3 é o harness (lições 0004): run --goal GOAL.md --plan alembic.plan.ts executa uma mission com units[] e proof[] — cada proof[] é um bash -c que falha fechado se sair não-zero. Os cinco gates (Scope → Council → Proof → Validator → Publish) liberam o passo seguinte. --yes evita a pausa interativa; tarefas tier T4 ainda param para o humano (approve/reject/propose).
O segundo fluxo é uma venture servindo um cliente real. A C.D Advocacia (cliente #1) quer um vídeo. Você não escreve o brief à mão: parte de um pedido fino (“nome + o que querem”) e a fábrica descobre o brief rico, depois roda a campanha inteira em dry-run $0 — e só gera o vídeo de verdade quando você abre as duas travas juntas.
marketing discover engorda um request fino num ClientBrief; marketing campaign roda discover→gerar→validar com a Higgsfield FALSA (offline) e devolve dryRun:true. A geração paga (linha tracejada) só dispara com --approve --yes juntos.A sequência real — note que o request.json é exatamente o que os testes do produto usam:
{
"client": { "name": "C.D Advocacia", "website": "https://cd.adv.br" },
"ask": "vídeo vertical cinematográfico em pt para reels"
}
terminal · Fluxo B (dry-run, $0)
# 1. descubra o brief rico a partir do pedido fino — offline $0 alembic marketing discover request.json --out brief.json # → C.D Advocacia · video: cinematic 9:16 (pt) · provenance: offline-request # 2. rode a campanha inteira em DRY-RUN — zero rede, zero gasto, em TODA etapa alembic marketing campaign request.json --out plan.json # → discover→briefToSignal+briefToFactoryOptions→runMarketingFactory(offline) # → →validationPlan→cost preview ; dryRun:true # 3. SÓ AGORA, gated: geração paga de verdade (as DUAS travas juntas) alembic marketing campaign request.json --approve --yes
parseAsk deriva determinísticamente os campos do vídeo a partir do texto livre — 2 campos viram um brief completo, e o que ele não sabe fica no default do schema (nunca fabricado).marketing campaign request.json sozinho toca zero rede e gasta zero. --online liga a pesquisa real (brightdata, custa). --approve --yes juntos ligam a geração paga de vídeo. Um flag sozinho NUNCA gasta — é a mesma regra do marketing video.Tudo em @alembic/marketing-factory (lição 0006), o real CLI higgsfield atrás de uma anti-corruption layer. discoverClientBrief usa parseAsk para extrair determinísticamente a spec do vídeo (aspect/type/language/durationSec/hasSpeech) do texto livre; campos desconhecidos ficam no default do schema (nunca fabricados). briefToSignal projeta o brief de volta em businessSignalSchema para a fábrica existente consumir sem mudança.
runCampaign é o capstone do domínio: dry-run / $0 em cada estágio. briefToValidationPlan é PLAN-ONLY — descreve os critérios que um QA real aplicaria (aspect/lang/checkTranscript/brand/forbiddenVisuals), mas validateVideo não roda (não há artefato real no dry-run). Três travas opt-in: --online (pesquisa real, founder-gated), e --approve + --yes juntos (geração paga). Fail-closed em todo lugar.
O terceiro fluxo coloca uma funcionária para operar o atendimento da venture. A Iris não é código novo: é uma composição — uma identidade (soul) + skills + memória multi-store + connectors + agenda, declaradas num único JSON. Você a inspeciona, entende como ela transforma um objetivo em ação, e roda um turno em preview offline antes de gastar um centavo.
iris.json compõe 5 partes; show/explain/connectors/schedule inspecionam sem gastar; employee run dá o preview $0; --online chama o modelo e o write-back A3b persiste UM registro episódico de volta nos bound stores.A definição real da Iris (exatamente o shape dos testes do produto):
{
"id": "iris",
"soul": {
"agent": "support-agent", "name": "Iris",
"role": "customer support specialist",
"values": ["empathy", "precision"], "expertise": ["billing"]
},
"skills": ["issue-triage", "meeting-notes"],
"memory": { "agentId": "support-agent", "stores": ["episodic", "decision"] },
"connectors": ["gmail", "slack"],
"schedule": [{ "task": "sweep the support inbox", "cron": "0 9 * * 1" }]
}
terminal · Fluxo C (preview offline, $0)
# 1. liste e inspecione — quem é a Iris, o que ela compõe alembic employee list # → iris Iris (customer support specialist) skills:2 connectors:2 # 2. o mapa "reverse-engineer an agent" (observed/inferred/unknown) alembic employee explain iris --goal "responder a dúvida de cobrança de um cliente" # → 10 passos; planning+memory-update = observed; o resto inferred; unknown:2 # 3. o seam de connectors (todos unwired offline — adapters founder-gated) alembic employee connectors iris # → gmail unwired (no adapter) · slack unwired · note: real adapters founder-gated # 4. as agendas → manifests de automação (PAUSED, registrável, não auto-roda) alembic employee schedule iris # → emp-iris-0 [PAUSED] 0 9 * * 1 claude-opus-4-8 · task: sweep the support inbox # 5. rode UM turno — preview $0, NENHUM modelo chamado alembic employee run iris --goal "responder a dúvida de cobrança de um cliente" # → dry-run preview — no model called · model claude-opus-4-8 # → --- system (would be sent) --- You are Iris, customer support specialist. … # 6. SÓ AGORA, gated: chamar o modelo de verdade + write-back episódico alembic employee run iris --goal "…" --online
employee explain tagueia cada um dos 10 passos como observed (lido da config), inferred (comportamento padrão do motor) ou unknown (interno não inspecionável). É a regra anti-fabricação estrutural: o mapa nunca afirma que um subsistema ainda-não-construído (runtime de connector, runner de scheduler) está operacional.Tudo em packages/hermes/src/employee/ (lição 0005). employee run sem flag chama buildEmployeeRunInput (PURO, determinístico): monta o system-prompt (renderEmployeePrompt = soul + ## Skills + ## Connectors + memória composta dos bound stores) e imprime o preview spend-safe — “o prompt que seria enviado” — sem chamar modelo. O modelId sai de soul.modelPreferences.primary ?? fallback ?? local-default.
--online (founder-gated) constrói o adapter real cliproxyapi (preflighted; fail-closed se o gateway/token faltar — sem gasto). O write-back A3b (#102): após um turno --online bem-sucedido, recordEmployeeTurn anexa UM registro episódico HONESTO (o goal real + um excerto da resposta, nunca um “aprendizado” fabricado) ao store episódico bound. É opt-in (sem binding episódico → no-op) e uma falha de escrita nunca quebra o turno. --no-memory-write desliga.
Esta é a seção que você precisa lembrar mais que qualquer outra. Nos três fluxos, o Alembic roda offline e $0 por padrão. Gastar dinheiro ou tocar a internet sempre exige uma flag explícita — e nenhuma flag sozinha gasta. Aqui está o mapa completo de todas as travas dos três fluxos num só diagrama.
--online para rede, --approve --yes juntos para geração paga, e a pausa T4 para o humano no harness.Ligue e desligue as flags e veja, ao vivo, se o comando fica spend-safe ou se entra na zona de gasto. (Demo construído para esta lição.)
.alembic/.
Um flag sozinho nunca gasta. --approve sem --yes continua dry-run. --yes sem --approve continua dry-run. Só os dois juntos liberam a geração paga.
A trava vive no parser de args (apps/cli/src/args.ts), não num aviso verbal. O default é fail-closed: o caminho de gasto precisa ser escolhido, nunca é acidental.
--online sem o gateway/token configurado, o comando falha fechado (erro claro, sem gasto) — ele não silenciosamente finge ter feito. Falta de credencial = erro honesto, não um custo surpresa.Agora o capstone de verdade: um único roteiro que vai do corpus à Iris, encadeando os três fluxos. Cada passo é verificável na fronteira real — e tudo abaixo é $0.
alembic distill ~/corpora/ia-juridica --offline → roteia por T0→T3, deposita LEARNINGS + opportunity. Verifique: alembic status imprime stores: 4 opportunity, 0 learnings.4 opportunity no status é a prova de que o funil cuspiu signals acionáveis.alembic run --goal GOAL.md --plan alembic.plan.ts --yes → o harness corre os 5 gates. Verifique: proofs em units/<id>/proof-results.jsonl; falha fechada se algum proof[] sair não-zero.alembic marketing discover request.json --out brief.json → C.D Advocacia · video: cinematic 9:16 (pt) · provenance: offline-request. Verifique: provenance: offline-request prova que nenhuma rede foi tocada.alembic marketing campaign request.json --out plan.json → dryRun:true. Verifique: o campo dryRun:true no plan.json é a prova de $0.alembic employee list → iris Iris (customer support specialist) skills:2 connectors:2. Verifique: employee connectors iris mostra tudo unwired (adapters founder-gated).alembic employee run iris --goal "responder dúvida de cobrança" → dry-run preview — no model called. Verifique: no model called + o bloco --- system (would be sent) --- mostram o prompt sem gasto.--approve --yes. Fluxo C real: --online. Pesquisa real: --online. Sem nenhuma dessas, todo o roteiro acima é $0.No passo 5, você quer a campanha com pesquisa real (brightdata) mas sem gerar vídeo pago. Qual a linha exata?
alembic marketing campaign request.json --online. O --online liga a pesquisa real (custa); como você não passou --approve --yes juntos, a geração de vídeo continua dry-run/$0. Pesquisa real, geração ainda em ensaio — exatamente as travas independentes.O mesmo organismo, três usos. Note o padrão que se repete: cada fluxo tem um modo padrão $0 e uma trava explícita para o caminho caro.
| Fluxo A · venture | Fluxo B · campanha | Fluxo C · Iris | |
|---|---|---|---|
| Entrada | corpus de IA jurídica | request fino {client, ask} | iris.json (5 partes) |
| Pacote núcleo | @alembic/etl + harness | @alembic/marketing-factory | @alembic/hermes/employee |
| Comando central | distill → run | marketing campaign | employee run |
| Saída $0 | SIGNALS + venture (gates) | plan.json (dryRun:true) | preview do prompt (no model) |
| A trava | tier T4 (pausa humana) | --approve --yes (vídeo) | --online (modelo) |
| Prova de $0 | status stores | provenance: offline-request | no model called |
Result + FsPort + offline-default) e os mesmos stores append-only sob .alembic/.Os três fluxos são o mesmo motor visto de três ângulos. Você sempre roda algo de graça primeiro (um ensaio), confere a prova de que foi de graça, e só então — se quiser — abre uma trava para o passo que custa. É como um estúdio onde você ensaia à vontade e só liga as câmeras (e a conta) quando decide gravar.
Os três compõem a mesma cintura estreita: Result<T, Error> + FsPort + offline-default. O Fluxo A é distill (T0→T3, 2 stores) → run (mission/units/proof, 5 gates). O Fluxo B é discoverClientBrief → briefToSignal/briefToFactoryOptions → runMarketingFactory (Higgsfield fake) → briefToValidationPlan (plan-only). O Fluxo C é loadEmployee → renderEmployeePrompt + memory composer → buildEmployeeRunInput (preview) / runEmployeeTurn (--online) + recordEmployeeTurn (write-back A3b). Stores append-only sob .alembic/.
Cada run<Command> devolve Result<T, Error>; os testes em commands.test.ts exercitam exatamente os shapes de entrada que você colou nesta lição (a Iris, o request da C.D).
Clique em cada cartão para virar (ou tecle Enter/Espaço). Recuperar de cabeça fixa melhor que reler.
alembic status — imprime stores: 4 opportunity, 0 learnings. Os 4 opportunity são os signals.discover prova que nenhuma rede foi tocada?provenance: offline-request. Se fosse --online e aprendesse algo, viraria online-research.--approve OU --yes) gasta dinheiro?--approve E --yes juntos liberam a geração paga. Um sozinho = dry-run.employee explain?corpus de IA jurídica. A → venture; B → campanha C.D; C → Iris. Um só exemplo, três ângulos.Use as setas ← → ou os botões. Seis slides fecham a história inteira.
Caminhe pelo Fluxo A estágio por estágio com o stepper abaixo. Cada estágio mostra o comando real, a saída verbatim e se é livre ($0) ou gated. (Demo construído para esta lição — clique nos pips ou use os botões.)
.alembic/, você pode rm -rf .alembic e começar de novo sem efeito colateral.corpus à Iris, três fluxos, uma história. Qual deles você vai rodar primeiro? Pegue o roteiro da seção 7, escolha um diretório de teste e verifique cada prova ($0). Dúvida frequente: “e quando eu quiser de verdade?” — aí você abre uma trava de cada vez, e o motor te diz exatamente o que vai custar antes de cobrar.--online opta por um backend real (pode custar).Result<T, Error>: funções de biblioteca devolvem sucesso-ou-erro como valor, nunca lançam.approve/reject/propose).units[] e proof[]; cada proof é um bash -c que falha fechado.--approve --yes juntos.employee explain tagueia tudo como observed / inferred / unknown — anti-fabricação estrutural.Três perguntas que cruzam os três fluxos. Sua pontuação corre no rodapé do card.
alembic status reporta o pipeline e os stores; os 4 opportunity são os BUSINESS SIGNALS prontos. Nenhuma rede é necessária — é a saída offline verbatim do RESOURCES.md.--online liga só a pesquisa real (brightdata). A geração paga de vídeo exige --approve E --yes juntos — um flag sozinho nunca gera. As travas são independentes.employee run (sem flag) NÃO gastou?no model called. A (c) está errada: o write-back episódico só ocorre num turno --online bem-sucedido. A (b) está errada: offline, os connectors são todos unwired.