Passo 5 · Módulo 3 · Fábricas · Módulo 3 · Fábricas · AI Employee (a Iris)
Curso do Produto Alembic · Visual Course

AI Employee: a Iris, a maestrina

Você já destilou o corpus, forjou o signal, rodou a campanha da C.D Advocacia. Falta contratar quem opera o atendimento todo dia. Ao fim desta lição você sabe como o Alembic compõe uma persona — a Iris — a partir de soul + skills + memória + connectors + agenda, e como o comando explain te entrega um mapa onde nenhuma afirmação é inventada.

Leia primeiro (fonte primária)
packages/hermes/src/employee/employee.ts — "A camada de composição que une as peças que o Alembic já tinha"

O cabeçalho deste arquivo diz tudo: o AI Employee não inventa identidade, memória ou skills — ele compõe o que já existia solto. Esta lição destila isso na Iris, a funcionária que fecha a história do curso (do corpus à operação real).

Suposições tolas (o que assumimos de você)
  • Você leu as lições 1–4: sabe o que é o funil, o harness, os gates e a cintura estreita (Result<T, Error>).
  • Você sabe abrir um terminal e rodar alembic <comando>. Nada além disso.
  • Você não precisa saber Zod, OAuth ou cron — definimos cada um no primeiro uso, com a camada técnica a um clique.
Leia a versão simples, ou abra a camada técnica em qualquer seção.
1

A grande ideia


Ao fim desta lição você consegue
  • Explicar por que o AI Employee é uma camada de composição, não um motor novo.
  • Nomear os cinco ingredientes de uma persona (soul · skills · memória · connectors · agenda).
  • Ler o mapa explain e classificar cada passo em observed / inferred / unknown.
  • Contratar e rodar a Iris em dry-run $0 e entender por que nada vaza nem gasta.
  • Explicar os três seams — connectors (A3), agenda (A4), write-back (A3b) — e o que cada um destrava.

O Alembic já tinha todas as peças de uma funcionária digital — espalhadas: uma identidade (o soul-loader), uma memória de cinco gavetas (o multi-store), um catálogo de skills, um sistema de automação agendada, e os adapters de modelo. O que faltava era o conceito que amarra tudo numa pessoa só.

O AI Employee é esse conceito. A Iris é a primeira: uma especialista de atendimento que compõe essas peças. Ela tem uma identidade (quem é, o que valoriza), as skills que sabe rodar (ex.: triagem de tickets), uma memória que ela lê e na qual escreve, declarações de quais integrações usa (Gmail, Slack) e uma agenda (varrer a caixa toda manhã).

Pense como… contratar uma pessoa de verdade. Você não constrói um cérebro do zero — você combina uma personalidade, um currículo (skills), a memória do que já viveu, os crachás de acesso aos sistemas (connectors) e um horário de trabalho. Onde a analogia quebra: a Iris é um arquivo iris.json de texto — versionável, auditável, e por padrão sem nenhum crachá realmente ativado (offline, honesto).

Chamada de modelo crua AI Employee (a Iris) prompt ad-hoc, escrito à mão toda vez sem memória — esquece a cada turno sem identidade estável nem skills você lembra de não gastar soul + skills compõem o prompt sozinhos memória multi-store: lê e escreve de volta identidade durável + connectors + agenda dry-run $0 por construção (trava de gasto) o employee não é "um prompt melhor" — é a composição durável que falta entre uma chamada e uma operação
X-vs-Y: a diferença não é o modelo — é tudo o que envolve a chamada. A Iris transforma uma chamada solta numa funcionária que tem identidade, memória, agenda e segurança por padrão.

Por baixo do capô

O pacote é @alembic/hermes, módulo src/employee/. O contrato central é o employeeDefinitionSchema (Zod): ele embute o soulDefinitionSchema já existente e adiciona skills: string[], um memory binding opcional (sobre os 5 substores), connectors: string[] e schedule: {task, cron}[]. O arquivo inventa nenhum desses subsistemas — connectors e schedule são declarações (forward declarations) cabeadas depois nos seams A3 e A4.

Idioma idêntico ao resto do engine: loadEmployee lê via uma porta SoulReader injetada, faz JSON.parse, valida no boundary e nunca lança — uma leitura falha, JSON malformado ou um schema violado vira um err de uma linha. renderEmployeePrompt é puro e determinístico: lidera com o soul e anexa as seções ## Skills e ## Connectors quando não-vazias.

Por que isso importa: a Fase 7 (PRs #95–#99, #102) costurou skills + memória + scheduler + personas — peças já construídas soltas — no "maestro" que faltava. É a maior alavancagem do produto, segundo o próprio REVIEW.md.

A1 #95contrato A5 #96explain A2 #97run A3 #98connectors A4 #99scheduler A3b #102write-back
A ordem em que a Iris ganhou corpo: contrato → mapa → run → os três seams. O loop de memória só fechou no A3b (#102).
2

Em uma imagem


Cinco ingredientes entram; uma persona contratável sai. A maestrina no centro não toca nenhum instrumento — ela rege os que já existiam.

Iris AI Employee iris.json soul identidade · valores skills[] o que sabe fazer memory 5 gavetas connectors[] Gmail · Slack (decl.) schedule[] quando trabalha renderEmployeePrompt → system prompt composição pura · determinística · offline $0
Da esquerda/cima → centro: cinco peças que já existiam separadas convergem numa persona. A Iris não adiciona comportamento a nenhuma; ela as rege.
A wide concept illustration of an orchestra conductor (a maestro) standing on a podium at the center of a warm-lit workshop, raising a baton; instead of musicians, five distinct ar
A wide concept illustration of an orchestra conductor (a maestro) standing on a podium at the center of a warm
O fio condutor. Esta é a quinta parada da mesma história: corpus de IA jurídica → signal "fábrica de petições" → venture → campanha da C.D Advocaciaa Iris, que opera o atendimento dessa venture todo dia.
3

Os cinco ingredientes


Vire cada cartão para fixar o que cada ingrediente é — e o que ele não é (porque dois deles são só declarações até um seam cabear).

soul
O que é a soul de um employee?
virar ↻
A identidade durável: nome, papel, valores, princípios e modelPreferences (modelo preferido). renderSoulPrompt a transforma no início do system prompt: "You are Iris, …".
skills
O que skills[] carrega?
virar ↻
Apenas ids opacos de skills que o employee pode rodar (ex.: issue-triage). Quem resolve cada id é o SkillStore, não o employee. A Iris compõe; não reimplementa.
memory
O que o memory binding faz?
virar ↻
Escolhe quais das 5 gavetas (episodic/semantic/procedural/decision/transcript) a Iris usa e sob qual agentId. Uma gaveta não ligada nunca vaza para o prompt.
connectors
O que é um connector aqui?
virar ↻
Uma declaração de integração (Gmail, Slack, Drive…). É só um nome. Adapters reais (OAuth/chaves) são founder-gated e vivem fora do seam — offline, todo connector é unwired.
schedule
O que schedule[] declara?
virar ↻
Pares {task, cron} — ex.: "daily inbox sweep" às 0 9 * * *. O cron é opaco em A1; um runner só é cabeado em A4 (via mapeamento para @alembic/automation).
composição
O que a Iris adiciona a essas peças?
virar ↻
Nada de comportamento. Ela só compõe: embute o soul, reusa o enum do multi-store, trata skills/connectors como ids. "It composes them" — diz o cabeçalho do arquivo, literalmente.

Declaração vs. implementação — o comparativo que evita confusão

Três dos cinco ingredientes já funcionam na composição. Dois são promessas honestas até um seam cabear. A tabela deixa explícito:

IngredienteEstado em A1Cabeado porO que muda quando cabeia
soulFunciona (embutido)
skills[]Ids resolvidos pelo SkillStore
memoryBinding lido; read em A2A3b (write-back)Passa a escrever de volta, não só ler
connectors[]Declaração (todo unwired)A3 (connector seam)Id resolve para um port real; deixa de ser só nome
schedule[]Declaração (cron opaco)A4 (mapper)Vira manifest do automation; o daemon cron roda
Guarde istoDeclaração ≠ mentira. O Alembic carrega o cron e o nome do connector como escalares opacos antes de existir um runner — exatamente como o subsistema de automação já carrega um rrule antes do seu daemon. Prometer sem fingir que já roda é a regra.
renderEmployeePrompt(iris) → (trecho)
You are Iris, customer support specialist. ## Core Values · ## Operating Principles… ## Skills - issue-triage ## Connectors - gmail - slack
As 5 gavetas da memória (o multi-store)
episodic — o que aconteceu ✓ ligada semantic — conceitos ✓ ligada procedural — receitas (não ligada) decision — decisões (não ligada) transcript — conversas (não ligada)
No código (fonte primária)
packages/hermes/src/memory/multi-store/soul.ts — renderSoulPrompt + soulDefinitionSchema

O soul é a peça mais antiga: um adapt do soul-loader do Agent Swarm, recast no idioma Alembic (Zod no boundary, Result, porta injetada, nunca lança).

A wide editorial illustration of a single index card lying on a clean desk, hand-labeled like an employee dossier, with five neatly drawn rows: a small face glyph, a tool glyph, fi
A wide editorial illustration of a single index card lying on a clean desk, hand-labeled like an employee doss
4

O mapa reverse-engineer (explain)


Aqui está a joia da coroa. Antes de gastar um centavo, você pode pedir um mapa de como a Iris transformaria um objetivo numa ação verificável — passo a passo. E a regra anti-fabricação é estrutural: cada um dos 10 passos é obrigado a carregar uma etiqueta.

Pense como… um raio-X de um motor antes de ligá-lo. Você vê cada engrenagem e, em cada uma, uma cor honesta: verde = "isto eu li na config da Iris", azul = "isto é o comportamento padrão do motor, não a Iris", vermelho = "isto é um interno que não dá pra inspecionar daqui". Onde quebra: não é opinião — o tipo Confidence no código força uma das três cores em cada passo.

Preveja antes de revelar

Dos 10 passos do mapa da Iris, quantos você acha que ganham a etiqueta observed (lido direto da config dela)?

Exatamente 2.planning (porque a Iris fixa um modelo em modelPreferences.primary) e memory-update (porque ela liga gavetas de memória) são observed. Os outros 8 são inferred — comportamento padrão do motor, não pinado pela Iris. É contraintuitivo e é de propósito: o mapa se recusa a chamar de "fato observado" qualquer coisa que ele só infere.
1 message-to-taskinferred 2 context-assemblyinferred 3 planningobserved 4 tool-useinferred 5 verificationinferred 6 outputinferred 7 memory-updateobserved 8 reportinferred 9 next-loopinferred 10 failure-recov.inferred Inferred ledger (2) connector A3 não-built · memória off-by-default Unknown ledger (2) conteúdo da memória · runner do scheduler (A4)
Os 10 passos na ordem em que um run executa. Verde = observed (2: planning, memory-update); azul = inferred (8); embaixo, os ledgers que coletam os caveats — inferred:2, unknown:2.

Por que cada cor cai onde cai

Não é arbitrário. Cada construtor de passo no código decide a cor a partir de um fato verificável. Os três casos mais instrutivos:

observed — planning

A Iris fixa modelPreferences.primary = claude-opus-4-8. Esse é um fato da definição, então o passo é verde. Mas o código é cuidadoso: a cor reflete o modelo pinado, não que um plano já foi produzido (o plano é futuro).

inferred — tool-use

As skills e connectors declarados são inputs observados (aparecem em reads), mas a invocação não aconteceu. O passo descreve a chamada pretendida ("would invoke") e nunca afirma que um connector disparou.

unknown — conteúdo da memória

O binding (quais gavetas) é observado. Mas o que está dentro das gavetas só se sabe lendo em runtime — então isso vai para o ledger unknown, não para o passo.

unknown — runner do scheduler

A agenda é um input observado, mas o runner que a executa (A4) não está construído por padrão. O mapa jamais diz que um subsistema não-built está operacional.

A contagem honesta — os 10 passos por etiqueta (Iris) observed 2 — planning, memory-update inferred 8 — o resto da cadeia unknown 0 passos (mas 2 caveats vão p/ o ledger unknown) Nenhum PASSO é unknown; o que é não-inspecionável (conteúdo da memória, runner A4) vira CAVEAT, não passo.
A mesma história em números: 2 observed, 8 inferred, 0 passos unknown — e 2+2 caveats nos ledgers. A barra inferred domina de propósito: o mapa prefere "inferido" a fingir certeza.

Demo: clique cada passo e revele sua etiqueta

Este é o explain em miniatura. Clique cada engrenagem para ver o que ela lê, o que faz e por que ganha aquela cor. Depois, revele todas as etiquetas de uma vez.

observed — lido da config da Iris inferred — padrão do motor unknown — interno não inspecionável
Clique um passo acima

Cada passo mostra: component (a peça real do motor), reads (o que consome), does e por que ganha sua etiqueta de confiança.

Inferred ledger · 2
  1. um connector é DECLARAÇÃO — o runtime A3 não está construído, então se ele de fato chama é o que ainda não está cabeado
  2. a política de escrita — memória do hermes está off-by-default (A3 pendente)
Unknown ledger · 2
  1. o CONTEÚDO da memória até ser de fato lido em runtime
  2. o RUNNER do scheduler (A4) não está construído — schedule é uma declaração
Detalhe técnicoO tipo é confidenceSchema = z.enum(['observed','inferred','unknown']) e executionChainStepSchema exige um campo confidence em todo passo. Não há como um passo existir sem etiqueta — é por isso que a anti-fabricação é "estrutural", não "advisory". A constante GROUND_RULE é embutida em cada relatório, tornando o contrato parte do próprio artefato.

Por baixo do capô

explainEmployeeExecution(employee, goal, opts) é puro e determinístico (sem clock, sem RNG): roda uma tabela ordenada de STEP_BUILDERS (um por passo), cada um produzindo o passo + os caveats que ele levanta. Os caveats são coletados (de-duplicados, preservando a ordem) nos ledgers inferred e unknown.

Os seams têm flags que derrubam caveats sem mudar a confiança: wiredConnectors (A3) faz o passo tool-use parar de dizer "A3 não-built" para os connectors resolvidos; scheduleWired (A4) derruba o caveat do runner; memoryWriteEnabled (A3b) derruba o "off-by-default". Mas o passo permanece inferred — porque no instante do explain a chamada ainda é futura.

O comando CLI employee explain mantém o comportamento byte-idêntico (não força os flips); os flips são exercitados nos testes do introspect e no comando employee schedule.

A wide illustration of an exploded technical X-ray view of a machine before it is switched on: ten gears arranged in a left-to-right then right-to-left snaking chain, each gear lit
A wide illustration of an exploded technical X-ray view of a machine before it is switched on: ten gears arran
5

Contratar e rodar (run)


O explain te dá o mapa de "would". O run transforma esse "would" numa execução real — mas com uma trava de segurança no centro: por padrão, ele monta o prompt e te mostra, sem chamar nenhum modelo. Custo: $0.

Worked example — o que o dry-run da Iris faz, passo a passo
1
Você roda alembic employee run iris --goal "rascunhe as respostas da caixa desta semana".
2
loadEmployeeiris.json, valida no boundary. Falha vira err fail-closed.
3
buildEmployeeRunInput (puro, sem IO) monta o ModelRunInput: system = renderEmployeePrompt (soul + skills + connectors); userPrompt = o goal.
4
O modelo resolve: soul.modelPreferences.primary ?? fallback ?? local-default. Sem modelo e sem fallback → err (um turno não roda sem modelo).
5
Imprime o preview spend-safe: "the prompt that would be sent". Nenhum modelo é chamado. Você lê exatamente o que seria enviado.
6
Agora você tente: abra a camada técnica abaixo e veja o que muda com --online (founder-gated) — e por que ele falha fechado quando o gateway está ausente.

O que aparece no terminal — a prova real, verbatim do RESOURCES.md:

$ alembic employee run iris --goal "…" (offline, $0)
# dry-run preview — NENHUM modelo chamado
employee: iris (dry-run preview — no model called)
  model   claude-opus-4-8
  --- system (would be sent) ---
  You are Iris, customer support specialist.
  ## Core Values
  …
  ## Skills
  - issue-triage
  --- goal (user prompt) ---
  …
Por que isso é seguro por construção. O caminho offline nunca alcança o código que chama o modelo. Não é uma flag que você esqueceu de ligar — é a estrutura: buildEmployeeRunInput é uma função pura que devolve o input, não o resultado. Gastar exige --online explícito.
offline (default) — $0
loadEmployee buildRunInputpuro · sem IO print preview modelo: NÃO chamado
--online (founder-gated) — custa
preflight adapter.run write-back gateway ausente → err (sem spend) A3b: 1 registro episódico honesto

Por baixo do capô

Duas superfícies em run.ts: buildEmployeeRunInput (pura/determinística — o preview que o dry-run imprime) e runEmployeeTurn (o turno ao vivo). O turno ao vivo compõe a memória best-effort: uma falha ao compor nunca quebra o turno (memória degrada para vazio). Só as gavetas que a Iris liga são lidas — uma gaveta não-ligada recebe um EMPTY_READER, então seus registros nunca vazam para o prompt.

--online constrói o adapter real cliproxyapi, preflightado: se o gateway/token está ausente, falha fechado sem gasto. O modelo vem de modelPreferences.primary; o sampling, das mesmas preferências.

O requestId é derivado deterministicamente do id do employee, então re-rodar dá um input byte-idêntico. (No fixture mínimo de teste, sem modelPreferences, o modelo cai no fallback local-default e o prompt começa "You are Iris, support specialist." — a Iris documentada, com modelo pinado, mostra claude-opus-4-8.)

6

Connectors & agenda — os seams honestos


Lembra que connectors e schedule são declarações? Aqui está como o Alembic os torna runnable sem mentir. Cada um tem um seam: um contrato tipado que separa "o que foi declarado" de "o que está de fato cabeado".

O comando employee connectors iris pega cada connector declarado e pergunta a um provider: "você tem um adapter pra isto?". Offline, o provider honesto responde não para todos. Resultado: Gmail e Slack aparecem como unwired (no adapter) — nada é silenciosamente descartado, nada finge estar vivo.

resolveEmployeeConnectors(employee, provider) é puro: mapeia cada id declarado através do ConnectorProvider, roteando um id resolvido para wired e um não-resolvido para unwired. Ordem preservada, duplicatas colapsam, e wired.length + unwired.length = nº de ids distintos. O offlineConnectorProvider resolve tudo para undefined. Adapters reais (OAuth/chaves por serviço) são founder-gated e vivem fora do seam.

$ alembic employee connectors iris
employee: iris connectors (offline — no adapters wired)
  gmail  unwired (no adapter)
  slack  unwired (no adapter)
  note: real connector adapters
        (per-service OAuth/keys) are
        founder-gated.
$ alembic employee schedule iris
emp-iris-0 [PAUSED] 0 9 * * *
  claude-opus-4-8
  task: daily inbox sweep

O id é determinístico (emp-<id>-<i>); o status nasce PAUSED — registrável, mas nunca auto-roda até um humano ativar. Spend-safe por default.

employee.connectors (declarados) gmail slack ConnectorProvideroffline = honesto no-op wired (ports)offline: vazio unwired (ids)gmail, slack nada é silenciosamente descartado — todo id cai em exatamente uma lista
O seam A3: ids declarados → provider → wired ou unwired. Offline, o provider honesto manda tudo para unwired. Os adapters reais entram por fora, founder-gated.
CuidadoUm connector unwired não é um bug — é o estado honesto. O Alembic se recusa a fingir que um Gmail está conectado quando não há OAuth. Se você precisa de envio real, isso é uma ação founder-gated, fora do seam, deliberadamente.
schedule[{task,cron}]declaração (A1) employeeToAutomationsmapper puro (A4) AutomationManifeststatus PAUSED A4 cabeia employee→automation; NÃO constrói daemon novo (o cron daemon já existe)
O seam A4: cada schedule[i] vira um manifest registrável do @alembic/automation, nascido PAUSED. O cron é carregado como rrule opaco; o daemon existente o interpreta.
A wide illustration of a row of service access badges on a workshop wall, each stamped UNWIRED in muted ink and hanging unplugged, beside a paused wall timer showing a PAUSED state
A wide illustration of a row of service access badges on a workshop wall, each stamped UNWIRED in muted ink an
7

A memória que lembra (write-back)


A lição 3 mostrou a memória sendo lida para dentro do prompt. O write-back (A3b) fecha o loop: depois de um turno bem-sucedido e online, a Iris escreve de volta um registro honesto na sua gaveta episódica. É o "brief once, remembers" — você explica uma vez, ela lembra na próxima.

Pense como… um diário de bordo que a funcionária preenche ao fim do expediente. Onde quebra: o registro é deliberadamente anti-fabricação — ele grava o objetivo real que ela recebeu + um trecho real da resposta do modelo, nunca um "aprendizado" inventado.

episodic storeepisodic.jsonl read (A2) ## Memory no promptturno ao vivo runEmployeeTurn--online · sucesso write-back (A3b) recordEmployeeTurn grava o goal REAL + trecho REAL da resposta — nunca um "aprendizado" inventado opt-in (só se liga episodic) · determinístico (clock injetado) · falha NÃO quebra o turno
O loop completo: read (A2) injeta a memória no prompt; após um turno online bem-sucedido, write-back (A3b) grava um registro honesto. Tudo opt-in e determinístico.
Quatro travas de honestidade. O write-back (1) grava o turno real, nunca um learning inventado; (2) só escreve se o employee liga a gaveta episodic (senão é no-op ok(false)); (3) é determinístico — timestamp é o clock injetado, id derivado, sem Date.now()/randomUUID(); (4) nunca quebra o caller — uma falha de escrita é um err de uma linha; o turno já tinha sucesso.
No código (fonte primária)
packages/hermes/src/employee/writeback.ts — recordEmployeeTurn

"It records the REAL turn, never an invented learning. The episode IS the goal the employee was given; the context IS a truncated excerpt of the model's actual text." — verbatim do cabeçalho.

8

Recapitulando


Seis slides, a história da Iris em sequência. Use as setas ou os botões.

A maestrina

O AI Employee compõe, não inventa

A Iris une cinco peças que o Alembic já tinha soltas: soul + skills + memória + connectors + agenda. Zero comportamento novo.

Iris

Anti-fabricação estrutural

explain: 10 passos, cada um etiquetado

Para a Iris: 2 observed (planning, memory-update), 8 inferred. Ledgers: inferred:2, unknown:2. O tipo Confidence obriga uma etiqueta em todo passo.

observed ×2inferred ×8unknown ×0 passos2 caveats no ledger

Trava de gasto

run: dry-run $0 por construção

O caminho offline monta o prompt e te mostra — sem chamar modelo. Gastar exige --online explícito, preflightado, que falha fechado sem gateway.

buildInputpreview$0

Seams honestos

connectors & agenda: declarar sem fingir

Offline, Gmail/Slack são unwired; a agenda nasce PAUSED. Nada é descartado, nada finge estar vivo. Adapters reais são founder-gated, fora do seam.

gmail · slack: unwiredagenda: PAUSED

O loop fechado

write-back: a memória que lembra

Após um turno online, a Iris grava o goal real + trecho real da resposta na gaveta episódica. Opt-in, determinístico, e uma falha nunca quebra o turno.

O fio condutor

Iris fecha a história do curso

Corpus → signal → venture → campanha da C.D → a Iris opera o atendimento. A próxima lição volta um passo: a Marketing Factory que gerou a campanha dela.

1 / 6setas

Verifique seu entendimento

Revisão acumulada

Três perguntas que amarram a lição. A pontuação corre embaixo.

1. Por que dizemos que o AI Employee é "uma camada de composição"?
O cabeçalho do employee.ts é explícito: "This file invents NONE of those: it composes them." Ele embute o soul, reusa o enum do multi-store e trata skills/connectors como ids opacos.
2. No mapa explain da Iris, por que tool-use é inferred e não observed?
Os ids aparecem em reads (fatos observados), mas o passo descreve a chamada pretendida ("would invoke") — nunca afirma que um connector disparou. Por isso a confiança fica inferred.
3. Você roda employee run iris sem --online. O que acontece com o modelo?
buildEmployeeRunInput é puro: devolve o input, não o resultado. O dry-run imprime o preview spend-safe. O write-back só ocorre num turno --online bem-sucedido.
Acertos: 0/3
As Dez verdades sobre a Iris (e qualquer AI Employee)
  1. Ela é um arquivo iris.json — versionável, auditável, legível.
  2. Compõe cinco peças que já existiam; não adiciona comportamento a nenhuma.
  3. renderEmployeePrompt = soul + ## Skills + ## Connectors, puro e determinístico.
  4. O mapa explain etiqueta todo passo: observed / inferred / unknown. Estrutural, não opcional.
  5. Para a Iris: 2 observed (planning, memory-update), 8 inferred; ledgers 2 e 2.
  6. run é dry-run $0 por padrão; gastar exige --online explícito e preflightado.
  7. Connectors offline são unwired — honesto, não bug. Adapters reais são founder-gated.
  8. A agenda vira manifest PAUSED; nunca auto-roda até um humano ativar.
  9. Write-back grava o goal real + trecho real; nunca um learning inventado.
  10. Uma gaveta de memória não-ligada nunca vaza para o prompt.
9

Experimente


Você já mexeu no mapa interativo da seção 4 — aquele é o explain em miniatura. Agora rode os comandos reais, offline, custo zero. Comece pelos que apenas leem:

Sua sequência de 5 comandos (todos offline, $0)
1
alembic employee list → vê a Iris: iris Iris (customer support specialist) skills:2 connectors:2.
2
alembic employee show iris → a definição completa + o prompt renderizado.
3
alembic employee connectors iris → Gmail e Slack como unwired (no adapter).
4
alembic employee explain iris --goal "responder os tickets de hoje" → o mapa de 10 passos. Conte: 2 observed, ledgers 2/2.
5
alembic employee run iris --goal "rascunhe as respostas da caixa" → o preview spend-safe. Nenhum modelo chamado.
Lembrete do professor: rode employee explain com dois goals diferentes. Note que a estrutura dos 10 passos não muda — só o texto do goal. Isso é o determinismo em ação: a mesma Iris + mesmo goal sempre dá um relatório byte-idêntico.
Você é o professor agora: pergunte-se "se eu quisesse que a Iris realmente enviasse um e-mail, o que faltaria?" (resposta: um adapter real de connector, founder-gated, fora do seam — e o flag --online). Próxima lição → voltamos um passo na história: a Marketing Factory que gerou a campanha da C.D Advocacia que a Iris agora opera — com a mesma trava de gasto ($0 default, --approve --yes para gastar).