Pegamos a venture que nasceu do nosso signal e rodamos uma campanha real para um cliente — a C.D Advocacia — por um único comando, descobrir → gerar → validar, com a regra de ouro de que nada gasta dinheiro por acidente: $0 por padrão, gasto real só com flags explícitas.
Esta lição destila daí a doutrina central da fábrica: o pipeline de uma campanha inteira é dryRun = true por default, e cada gasto exige uma chave explícita. Importa para a MISSÃO porque é o que transforma o signal "fábrica de petições" em material de marketing real sem queimar crédito por engano.
alembic marketing discover e alembic marketing campaign e ler a prova de que foi dryRun:true.Até agora, a história foi: um corpus de IA jurídica virou o signal "fábrica de petições personalizadas", e o signal virou uma venture. Mas uma venture precisa de clientes — e clientes precisam ver anúncios. A Marketing Factory é a metade do Alembic que pega esse signal e produz material de marketing real: copy, posicionamento e criativos (imagens e vídeos), terminando em um anúncio validado para um cliente específico. Nesta lição, esse cliente é a C.D Advocacia.
A Marketing Factory é uma linha de montagem para anúncios. Na ponta de entrada você descreve um cliente em uma frase ("a C.D Advocacia quer um vídeo cinematográfico vertical em português"). Na ponta de saída sai um anúncio pronto e verificado. No meio, três estações fazem o trabalho: uma descobre tudo sobre o cliente, uma gera o criativo, e uma valida o resultado.
A regra que governa tudo é uma só: nada gasta dinheiro por acidente. Gerar uma imagem ou um vídeo de IA custa créditos (dinheiro real). Então, por padrão, toda a fábrica roda em "ensaio" ($0) — ela mostra exatamente o que faria, sem fazer. Para gastar de verdade, você precisa virar chaves explícitas. Esquecer de virar uma chave significa que você não gastou nada — nunca o contrário.
Pense como… uma cozinha profissional com um modo degustação: o chef monta o prato inteiro no papel — ingredientes, custo, tempo — e te mostra antes de acender o fogão. Você só "acende o fogão" (gasta gás e ingredientes) quando aprova com duas mãos no balcão. A analogia quebra num ponto: na cozinha o ensaio é opcional; aqui o ensaio é o default, e cozinhar de verdade é que exige um gesto deliberado.
O pacote é @alembic/marketing-factory. O coração é runMarketingFactory(signal, options) em flow.ts: ele valida um BusinessSignal na fronteira, monta contexto de posicionamento + copy a partir de skills (markdown de product-marketing/copywriting/launch), pede um criativo ao Higgsfield, filtra por um ViralityScorer e devolve um AssetsManifest versionado e content-addressed.
Tudo é a cintura estreita do Alembic: cada função devolve Result<T, Error> e nunca lança exceção. Uma falha numa etapa faz early return err(...) — a fábrica falha fechada, nunca "meio-gerando".
Os quatro subcomandos que a lição cobre — marketing discover, marketing campaign, marketing video, marketing validate — mais o marketing <signal|brief> base, são wirados em apps/cli/src/commands.ts. A doutrina de gasto vive lá: const paid = args.approve && args.yes;.
Result. Uma falha em qualquer seta faz a fábrica parar fechada — nunca entrega meio-pronto.A lição inteira em seis cartas. Use as setas do teclado ← → ou os botões.
O comando-capstone é alembic marketing campaign. Ele faz a história inteira de uma vez: parte de um pedido magro ("a C.D Advocacia quer um vídeo"), descobre um brief rico, gera os criativos e produz um plano de validação — tudo em ensaio $0 por padrão.
parseAsk lê a fraseA descoberta é determinística: a frase livre só vira um campo do spec quando ela claramente implica esse campo. Se a frase é ambígua, o campo fica no default do schema — o sistema nunca chuta.
Você roda alembic marketing campaign cd-request.json sem nenhuma flag. Quantos créditos isso gasta, e a internet é tocada?
Zero créditos, zero rede. Sem flags, dryRun é true: a descoberta é offline (sem porta de pesquisa), a geração usa o Higgsfield fake (manifesto de preview $0), e a validação é só-plano (o validateVideo real nem roda — não existe vídeo). É exatamente o que a prova mostra: dryRun:true. Para gastar, você teria que ligar --online (pesquisa) e/ou --approve --yes (geração).
discover faz com a frase "vídeo cinematográfico vertical em pt"?parseAsk extrai o spec determinístico: tipo cinematic, aspecto 9:16, idioma pt. Campos que a frase não diz ficam no default do schema — nunca chutados.briefToFactoryOptions: um brief com fala/cinematic → seedance_2_0 (vídeo); um card estático text → gpt_image_2 (imagem). Se o usuário passar --model-id, ele vence.briefToValidationPlan deriva só os critérios que um QA real aplicaria (aspecto, idioma, marca) — sem baixar nem rodar nada.flow.ts é o coração da geração?runMarketingFactory(signal, options): signal → contexto → copy → criativo (Higgsfield) → filtro de viralidade → AssetsManifest versionado. Tudo Result, nunca lança.ClientBrief é só um arquivo JSON. Você pode escrevê-lo à mão, ou deixar o marketing discover aprender um a partir de uma frase. Os dois caminhos terminam no mesmo formato que a fábrica consome."Multi-tenant" é uma palavra cara para uma ideia simples: uma fábrica, muitos clientes, zero mudança de código. O segredo é que tudo que muda de cliente para cliente — a marca, o produto, o idioma, o tipo de vídeo — não está no código; está em um documento de dados chamado ClientBrief. Troque o brief, troque de cliente. A linha de montagem é a mesma.
A C.D Advocacia é o cliente número 1. Mas o brief de uma marca de tênis ou de uma cafeteria entra pela mesma porta e sai pela mesma máquina.
runMarketingFactory — é literalmente o mesmo código para advocacia, tênis e café.Do mesmo ClientBrief saem três coisas, cada uma por uma função pura (sem relógio, sem aleatório): o signal que a fábrica consome, as opções de geração, e o plano de validação.
| O que muda por cliente | Onde fica | Exemplo C.D Advocacia |
|---|---|---|
| Marca (nome falado, formas proibidas) | brief.brand | "Cê Dê Advocacia"; aceita initialism |
| Produto / setor | brief.client.industry | serviços jurídicos |
| Tipo de vídeo | brief.video.type | cinematic |
| Formato (aspecto) | brief.video.aspect | 9:16 (vertical) |
| Idioma falado | brief.video.language | pt |
| O código da fábrica | — | não muda |
ClientBrief. C.D Advocacia é só o primeiro brief.Esta é a seção mais importante da lição. Gerar criativos de IA custa dinheiro real. A fábrica trata isso com uma doutrina rígida: $0 por padrão, em toda etapa. Existem exatamente três travas, e cada uma precisa ser destravada de propósito. A regra que você nunca pode esquecer: uma flag sozinha nunca gasta.
--approve e --yes), e não uma. Passar só --yes, ou só --approve, mantém o ensaio $0. Esquecer uma chave = você não gastou. Esse é o erro "seguro".--approve E --yes. É o desenho que a lição inteira gira em torno.O comando marketing video e o marketing campaign usam a mesma regra: const paid = args.approve && args.yes;. Um E lógico. Veja todas as combinações:
--approve | --yes | Resultado | Gasta? |
|---|---|---|---|
| — | — | ensaio (fake Higgsfield, preview $0) | Não |
| ✓ | — | ainda ensaio — uma chave só não basta | Não |
| — | ✓ | ainda ensaio — uma chave só não basta | Não |
| ✓ | ✓ | geração REAL (Higgsfield real, Seedance) | SIM |
A única linha que gasta é a última. Três das quatro combinações são $0 — o sistema é enviesado para a segurança.
paidtrue && true acende o Higgsfield real; true && false, false && true e false && false caem todas no fake $0.cd-request.json: { "client": { "name": "C.D Advocacia", "website": "..." }, "ask": "vídeo cinematográfico vertical 9:16 em português" }. Um pedido magro.alembic marketing campaign cd-request.json — sem flags. A descoberta é offline: parseAsk lê tipo cinematic, aspecto 9:16, idioma pt. Provenance fica offline-request (nada foi pesquisado na web).briefToSignal + briefToFactoryOptions projetam o brief: o signal alimenta a fábrica; o tipo cinematic escolhe o modelo de vídeo seedance_2_0.runMarketingFactory roda com o Higgsfield fake: monta copy a partir das skills e devolve um AssetsManifest de preview — custo $0.briefToValidationPlan deriva o que um QA real aplicaria: aspecto 9:16, idioma pt, checar transcript (tem fala), marca "Cê Dê Advocacia". Mas nada é baixado ou rodado.CampaignResult com dryRun:true. Agora você tente: que UMA flag você adicionaria para fazer a pesquisa de mercado ser real (e custar)? E que par de flags faria a geração ser real?O Alembic não gera vídeo sozinho. Por trás, ele chama uma ferramenta de verdade: o CLI higgsfield. O problema é que ferramentas externas falam um "dialeto" próprio e bagunçado (JSON com nomes em snake_case, campos que mudam de forma). Se esse dialeto vazasse para dentro do Alembic, qualquer mudança no Higgsfield quebraria tudo.
A solução é uma camada anti-corrupção (um termo de arquitetura de software): uma parede de tradução. Toda chamada ao higgsfield passa por ela, que (1) valida o JSON cru contra um schema que espelha o formato do CLI, e (2) traduz para um tipo limpo do domínio Alembic. O dialeto cru nunca escapa desse módulo.
Pense como… a sala de tradução de uma embaixada: ninguém fala direto com o estrangeiro. Tudo passa por um tradutor juramentado que entrega frases limpas e padronizadas para dentro. Se o estrangeiro mudar de sotaque, só o tradutor precisa se ajustar — a embaixada inteira continua trabalhando igual.
snake_case do CLI entra à esquerda, é validada e traduzida, e só o tipo limpo (HiggsfieldJob) sai à direita. O dialeto cru morre dentro da parede.Partes da fronteira do Higgsfield só são confirmáveis numa execução real e paga (founder-gated). Em vez de fingir certeza, o código marca essas partes com [uncertain] nos comentários (ex.: a forma exata do envelope dtc-ads, a grafia dos flags do Seedance). É a mesma disciplina anti-fabricação que governa o curso inteiro: nunca afirme o que não foi provado.
research.ts sobre o brightdata): schemas RAW .passthrough() toleram campos extras e formas que só serão confirmadas num run real pago. Tolerar a deriva é deliberado — a forma exata é [uncertain] até a prova.// envelope --json do higgsfield { "job_set_type": "seedance_2_0", "display_name": "Seedance 2.0", "type": "video", "result_url": "...mp4" }
// tipo de domínio, via mapJob/mapModel { id: "seedance_2_0", name: "Seedance 2.0", modality: "video" } // camelCase, validado, previsível
A Marketing Factory não nasceu pronta — foi montada em PRs incrementais, cada um adicionando uma peça verificável. Esta é a sequência real (de REVIEW.md).
discover/campaign que amarra tudo num comando (#91–#94).Gerar não basta — um anúncio ruim que vai ao ar é pior que nenhum. O comando alembic marketing validate é o controle de qualidade: ele pega um arquivo de vídeo local e o submete a três inspeções independentes. O vídeo só passa se todas estiverem limpas.
O detalhe esperto: cada inspeção é opt-in. Um anúncio com narração liga a checagem de transcript; um anúncio só com música pula essa parte. É isso que faz um portão servir qualquer tipo de vídeo.
aceitar o initialism com a nota "verifique o sotaque de ouvido". Na execução real da C.D, foi a dimensão de transcript que pegou os 6 vídeos pela pronúncia da marca.O coração da doutrina de gasto cabe em uma linha. Abaixo está o trecho real do wiring do CLI: a geração paga só acontece quando as duas flags são verdadeiras; caso contrário, injeta-se o Higgsfield fake.
// Paid generation requires BOTH --approve and --yes; otherwise dry-run preview. const paid = args.approve && args.yes; const cli = paid ? createHiggsfieldCli({ binary: 'higgsfield' }) // real, paga : fakeHiggsfieldCli(videoModel); // ensaio, $0 const result = await generateAdScenes(parsed.data, { cli, modelId: videoModel, dryRun: !paid, approve: paid, });
No repositório /Users/acf/Documents/Projects/appfy/alembic, abra apps/cli/src/commands.ts e procure por runMarketingVideo e runMarketingCampaign. A trava de geração — const paid = args.approve && args.yes — aparece em ambos, idêntica. A lógica da fábrica em si está em packages/marketing-factory/src/: flow.ts (o pipeline), discover.ts (a descoberta), campaign.ts (o capstone), higgsfield.ts (a anti-corrupção), validate.ts (o portão de QA).
Rode os comandos offline ($0) para ver a prova: alembic marketing discover req.json e alembic marketing campaign req.json.
Vire as chaves e veja o custo recalcular ao vivo. É a tabela-verdade do gasto, interativa. Note: só uma combinação acende o gasto.
--online
liga a pesquisa real (brightdata)
--approve
aprovação do operador
--yes
confirmação não-interativa
dryRun:true. Nada gasta.Tente virar só --approve, ou só --yes: o custo de geração continua $0. A geração só acende com as duas juntas — exatamente args.approve && args.yes.
Briefing por e-mail → designer → ida-e-volta → render manual → revisão a olho → cada cliente é um projeto do zero. Caro, lento, sem trava de gasto, sem prova reproduzível.
Um ClientBrief → um comando → preview $0 → aprova com duas chaves → QA automático em 3 dimensões → manifesto versionado. Mesmo código para todo cliente.
parseAsk só. Provenance offline-request. $0, determinístico. Campos não-ditos ficam no default — nada inventado.
Liga a porta brightdata real: cada campo aprendido carrega uma evidência {quote,url}. Provenance vira online-research — só se algo foi de fato aprendido.
online-research quando a pesquisa de fato aprendeu algo com evidência. Uma porta que não achou nada não pode fingir que pesquisou — nem ganhar o bônus de confiança.marketing campaign faz as três de uma vez, em ensaio $0 por padrão.--online (pesquisa), --approve --yes (geração), validação (plan-only no dry-run).args.approve && args.yes.higgsfield cru; a forma crua nunca vaza.[uncertain] — honestidade estrutural.alembic marketing campaign cd.json --approve (só essa flag). O que acontece?args.approve && args.yes — um E lógico. Com só --approve, paid é falso: injeta-se o Higgsfield fake e o resultado sai dryRun:true. Para gastar, precisaria também de --yes.ClientBrief (dados), não no código. runMarketingFactory é o mesmo para advocacia, tênis ou café — troca-se o brief, troca-se o cliente.higgsfield?--json cru (snake_case) contra um schema RAW e mapeia para um tipo de domínio limpo (camelCase). A forma crua do CLI nunca escapa do módulo — e o que não foi verificado fica marcado [uncertain].A fonte da verdade deste produto é o código. Abra flow.ts, campaign.ts e higgsfield.ts e leia os comentários: a doutrina de gasto e os [uncertain] estão escritos lá, não na memória de ninguém.
--approve --yes juntas, por que a pesquisa (--online) basta com uma flag só? (Dica: pense no tamanho do gasto de cada uma.) Na próxima lição — 0007 · Factory, Forge & cursos — vemos a fábrica que constrói software e o motor que gerou este próprio curso.