Mission (Droid) + Workflow (Claude) + Swarm (Kimi) — a mecânica extraída de cada um, as interfaces deles não copiadas — fundidos em verbos de um só arquivo: alembic.plan.ts, executado deterministicamente sob Loop Engineering.
Esta lição destila o spec de fusão real (docs/alembic/03-three-chords-spec.md, de 2026-06-21) e o PROMPT-BLIND-PLANNING.md §Fase 1–2. Toda regra, schema e nome de arquivo aqui sai de um documento real do repo — nada é inventado. O exemplo que seguimos a lição inteira é o plano feature-auth (discover → build → prove) do §2 do spec.
alembic.plan.ts de feature-auth e apontar onde cada verbo (swarm, council, mission, parallel) entra no caminho.O blind planning tem duas fases. Na Fase 1, três investigações independentes fazem engenharia reversa de três ferramentas de agentes. Na Fase 2, a gente não junta as três interfaces num Frankenstein — a gente extrai a mecânica de cada uma e a reescreve como um verbo só do Alembic.
Pense em três bandas tocando músicas diferentes. Droid sabe rodar uma "missão": exige um contrato de aceite antes de começar e valida marco a marco. Claude Code sabe um "workflow": um script determinístico com fases e paralelismo, que dá pra retomar. Kimi sabe um "swarm": disparar muitos agentes pequenos sobre uma lista de itens.
O Alembic não quer ser a quarta banda nem colar pedaços das três. Ele escreve uma partitura nova — o arquivo alembic.plan.ts — que, numa só execução, chama o movimento "missão", o movimento "workflow" e o movimento "swarm" quando precisar. Os três acordes, numa só mão.
Pense como… transcrever as partituras de três bandas — não remontar o palco delas. Você ouve o que cada banda toca de melhor, escreve as notas numa pauta nova e rege você mesmo. A analogia quebra num ponto: aqui a "transcrição" é código tipado que a máquina executa igual toda vez — não interpretação de músico.
A Fase 1 produz três relatórios de RE com piso de tamanho — droid-cli-missions-reverse-engineering.md, claude-code-dynamic-workflows-reverse-engineering.md e kimi-code-agent-swarm-reverse-engineering.md — e cada afirmação de comportamento precisa de prova: a string do binário + um path em disco, ou a linha de um brightdata scrape (a disciplina de evidência do Passo 2). A Fase 2 funde os três contratos numa interface única, AlembicHooks, executada pela VM do plano.
O ponto central do spec (§1): "Um único run pode misturar todos no mesmo arquivo. O Conductor executa o script deterministicamente; o LLM só gera/edita o arquivo antes do run." Ou seja: o modelo escreve a partitura; quem rege é uma máquina previsível.
Os três acordes viram uma só partitura. A mecânica de cada ferramenta é transcrita; a interface de cada uma fica para trás. Fonte: 03-three-chords-spec.md §1.
AlembicHooksAntes do detalhe, a visão de cima: cada acorde traz um verbo (ou um conjuntinho de verbos) para a partitura. Mission traz mission(); Workflow traz phase(), agent() e parallel(); Swarm traz swarm(). E há um verbo extra, council(), que é o portão de decisão GO/NO_GO entre as fases.
AlembicHooks) → uma VM determinística. O council() é o quinto verbo, o portão entre fases. Fonte: 03-three-chords-spec.md §1, §3.Se o Alembic transcreve a mecânica e não a UI, o que ele deliberadamente deixa de fora de cada ferramenta?
A forma mais rápida de "ver" a fusão é alinhar os mesmos conceitos nas quatro colunas. Cada linha é uma pergunta — "qual é a unidade atômica de trabalho?", "como se faz paralelismo?", "onde mora o estado?" — e cada ferramenta responde do seu jeito. A última coluna é como o Alembic unifica.
| Pergunta | Missions (Droid) | Workflows (Claude) | Swarm (Kimi) | Alembic (unificado) |
|---|---|---|---|---|
| Unidade atômica | feature / unit | agent() | um item de items[] | unit / task |
| Paralelismo | validação por milestone | parallel(), cap 16 | rampa 5 + 700 ms | configurável (cap 16) |
| Onde mora o estado | ~/.factory/missions/ | script + cache.json | wire.jsonl por agente | ~/.alembic/runs/ |
| Porta de entrada | validation-contract | export const meta | prompt_template + itens | prelude + plano tipado |
| Retomar | propose → approve | resumeFromRunId | resume_agent_ids | args.resume + checkpoint |
| Verbo no plano | — | — | — | mission() · agent()/phase()/parallel() · swarm() |
Fonte: 03-three-chords-spec.md §4–6, §10 (Mapeamento RE → Alembic verb).
Agora um por um. Cada acorde tem um "DNA" — o punhado de regras de comportamento que o tornam o que é. Use as abas para ver os três; depois a gente liga cada DNA a um trecho de código real.
O DNA dos três acordes, lado a lado. Cada um vira um verbo da interface AlembicHooks. Fonte: 03-three-chords-spec.md §4–6.
A obsessão do Mission é contrato antes de execução. Você não roda nada sem um validation-contract que diga o "done-when" comportamental; cada unit roda numa sessão fresca (sem contaminação de contexto); e cada marco passa por validators.
validation-contract antes de executar → checado no prelude; a VM aborta se ausente (regra R1).freshSessionPerUnit: true por padrão (regra R9).milestoneValidation.scrutiny + userTesting[]; handoff em units/<id>/handoff.json.A obsessão do Workflow é determinismo e retomada. O corpo do plano não pode ter relógio nem aleatório; ele é um script com export const meta literal, fases nomeadas e paralelismo limitado — e dá pra retomar de onde parou via cache.
Date.now() / Math.random() no corpo (regra R2; a VM faz lint + esbuild).export const meta = { ... } as const → metadados literais.phase(name, fn) → emite eventos phase-started/finished; parallel(fns) com cap 16.(prompt, opts) → args.resume + checkpoint em workflows/cache.json.A obsessão do Swarm é fan-out controlado. Você dá um template com {{item}} e uma lista; ele dispara muitos agentes — mas com rampa (pra não explodir tudo de uma vez), um teto, e a regra de que só pode haver um swarm por turno do orquestrador.
prompt_template + {{item}} → obrigatório quando há items; mínimo 2 itens.ramp: { initial: 5, intervalMs: 700 }; teto maxConcurrency: 16.swarm() por turno do orquestrador (regra R3, enforce pela VM).wire.jsonl por agente (append-only, regra R10); fan-in agregado em aggregate.xml + summary.md.alembic.plan.ts de feature-authAqui está a partitura real do exemplo do spec: o plano feature-auth. Leia de cima pra baixo como um caminho: primeiro um swarm read-only mapeia o código; um council decide se vale a pena seguir; um mission constrói em sequência; e dois validators em paralelo provam o resultado. Os três acordes, num arquivo só.
O caminho de um único run que mistura os três acordes — o exemplo feature-auth. Fonte: 03-three-chords-spec.md §2.
export const meta = { name: 'feature-auth', description: 'Tracer bullet auth: discover → build → prove', phases: ['discover', 'build', 'prove'], version: 1, } as const; import type { AlembicHooks } from '@alembic/harness'; export async function run(h: AlembicHooks) { const { phase, mission, swarm, agent, parallel, council } = h;CHORD: Swarm — exploração read-only (DNA Kimi)
await phase('discover', async () => { await swarm({ profile: 'explore', promptTemplate: 'Read-only audit of {{item}}. Return paths + facts. No edits.', items: ['api', 'ui', 'tests', 'migrations', 'docs'], }); });
03-three-chords-spec.md §2, §5.const verdict = await council({ board: 'tech-council', question: 'GO to implement auth tracer bullet?', }); if (verdict === 'NO_GO') return { stopped: true }; // zero workersCHORD: Mission — units em sequência (DNA Droid)
await phase('build', async () => { await mission({ freshSessionPerUnit: true, units: [ { id: 'schema', tier: 'T2', proof: ['pnpm test --filter schema'] }, { id: 'api', tier: 'T2', dependsOn: ['schema'], proof: ['curl -sf http://localhost:3000/health'] }, { id: 'ui', tier: 'T2', dependsOn: ['api'], proof: ['pnpm e2e --grep auth'] }, ], milestoneValidation: { scrutiny: true }, }); });CHORD: Workflow — validators em paralelo (DNA Claude; regra R5)
await phase('prove', async () => { await parallel([ () => agent({ profile: 'validator', tier: 'T3', prompt: 'Scrutiny vs validation-contract. Builder was NOT you.' }), () => agent({ profile: 'validator', tier: 'T3', prompt: 'User-testing: signup + login. PASS/FAIL with evidence.' }), ]); }); }
Todos os verbos vêm de uma só interface (packages/alembic/src/hooks.ts, planejado):
export interface AlembicHooks { phase(name: string, fn: () => Promise<void>): Promise<void>; agent(opts: AgentOptions): Promise<AgentResult>; parallel(fns: Array<() => Promise<AgentResult>>): Promise<AgentResult[]>; mission(opts: MissionOptions): Promise<MissionResult>; swarm(opts: SwarmOptions): Promise<SwarmResult>; council(opts: CouncilOptions): Promise<'GO' | 'NO_GO'>; }
O alembic.plan.ts é açúcar sobre um tasks.json (o RunSpec Zod de @alembic/swarm) para a lógica complexa — condicionais, validators em paralelo. Para runs simples, dá pra escrever o tasks.json direto. Fonte: 03-three-chords-spec.md §3, §7.
swarm() dispara 5 agentes read-only (um por item: api, ui, tests, migrations, docs). Eles só leem e devolvem fatos + paths. Nada é editado.council() pergunta "GO?". Se a resposta é NO_GO, o return encerra o run — e nenhum worker de build é criado (regra R4).mission() roda 3 units em ordem por dependsOn: schema → api → ui. Cada unit, sessão fresca; cada proof[] precisa sair com código 0.parallel() roda 2 validators ao mesmo tempo — scrutiny e user-testing. O prompt diz explícito: "Builder was NOT you" (regra R5).Fundir três coisas só funciona se houver regras que evitem caos. O spec tem uma "tabela master" de dez regras (R1–R10): cada uma diz o quê, de onde veio (qual acorde) e quem a faz cumprir. Esse "quem faz cumprir" é o que torna a fusão real, e não um desejo.
03-three-chords-spec.md §9.| # | Regra | Origem | Quem faz cumprir |
|---|---|---|---|
| R1 | validation-contract antes do runner | Mission | prelude gate |
| R2 | plano determinístico | Workflow | VM lint + esbuild |
| R3 | swarm() exclusivo por turno | Swarm | VM scheduler |
| R4 | Council NO_GO → zero workers | Alembic | HarnessCore.fanout ✅ |
| R5 | validator ≠ builder | Loop Eng | roster + auditoria de log |
| R6 | T4 → park ledger | Swarm | classifyPark ✅ |
| R7 | proof[] na shell real | Loop Eng | Proof Gate runner |
| R8 | 1 unit bounded por passo | Loop Eng | granularidade da unit |
| R9 | sessão fresca por unit | Mission | reset de sessão do adapter |
| R10 | wire.jsonl append-only | Kimi | writer do store |
Fonte: 03-three-chords-spec.md §9 (Regras de fusão — tabela master). O ✅ marca o que o RE achou já implementado no repo.
Date.now(), um new Date() ou um Math.random() dentro de run() quebra a retomada — a VM rejeita o plano no lint. Datas e ids vêm de args, nunca gerados na hora.Clique num acorde. À esquerda você vê o DNA dele; à direita, o trecho real de alembic.plan.ts que o usa. É a mesma coisa nas duas alturas — a regra e o código que a encarna.
Contrato antes de execução. Cada unit roda em sessão fresca e cada marco passa por validators.
alembic.plan.ts da minha tarefa, qual acorde abriria o run?" — quase sempre é o Swarm (mapear o terreno antes) ou o Mission (já sei o que construir). A seguir (0004): o Playbook do prompt cego — como colar os prompts, comparar N planos independentes, pontuar com rubrica e exigir as seções de entrega.Alterne entre a explicação leiga e a precisa. Use a aba "Técnico" quando quiser os nomes reais; a "Simples" quando quiser a intuição.
AlembicHooks com seis verbos (phase, agent, parallel, mission, swarm, council). A VM executa alembic.plan.ts deterministicamente (R2: lint + esbuild rejeitam relógio/RNG no corpo); o prelude exige validation-contract (R1); o scheduler serializa swarms (R3); a Proof Gate roda unit.proof[] como bash -c fail-closed (R7). É açúcar tipado sobre o RunSpec de @alembic/swarm.Vire cada cartão (clique, ou Enter/Espaço) e tente responder antes de ver o verso. É prática de recuperação — vale mais que reler.
council() como portão de decisão.validation-contract, a VM aborta (R1). Sessão fresca por unit (R9) + validators no milestone.Date.now()/Math.random() no corpo (R2); phase()/parallel(); resume por cache.prompt_template + {{item}}, rampa 5+700ms, teto 16, e um swarm por turno (R3). wire.jsonl por agente (R10).council() devolve NO_GO?HarnessCore.fanout. Dúvida custa zero spend.council() como portão.alembic.plan.ts, sob a interface AlembicHooks.phase/parallel + resume.wire.jsonl R10).feature-auth: discover (swarm) → gate (council) → build (mission) → prove (parallel).Três perguntas. Escolha e leia o porquê de cada opção — o feedback ensina tanto quanto a pergunta.
Checagem cumulativa
Acerte as três para fechar a lição. A pontuação aparece abaixo.
alembic.plan.ts.feature-auth, qual verbo abre a fase discover?discover dispara um swarm() read-only sobre ['api','ui','tests','migrations','docs'] — só leitura, devolvendo fatos + paths. O mission() (a) vem na fase build; o council() (b) é o portão entre discover e build.Date.now() no corpo do plano?(prompt, opts) não bate. A VM rejeita relógio/RNG no lint. (b) é falso (não é questão de velocidade) e (c) inventa uma dependência que não existe.