Passo 6 · Módulo 3 · Fábricas · Módulo 3 · Marketing Factory
Curso do Produto Alembic · Visual Course

A Marketing Factory

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.

Leia primeiro (fonte primária)
packages/marketing-factory/src/campaign.ts — "O capstone discover → generate → validate, spend-safe por construção"

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.

Leia a versão simples, ou abra a camada técnica em qualquer seção.
O que assumimos de você (muito pouco)
  • Você já viu um anúncio em vídeo no celular (um Reels, um TikTok). É só isso.
  • Você não precisa saber programar, nem o que é uma API, nem o que é "crédito de IA".
  • Se já leu a lição 0001, sabe que um signal é uma oportunidade que o motor extraiu do corpus. Vamos transformar esse signal em um anúncio real.
Ao fim desta lição você vai conseguir
  • Explicar o pipeline da fábrica em três estações: descobrir → gerar → validar.
  • Dizer o que é um ClientBrief e por que ele torna a fábrica multi-tenant (serve qualquer marca sem mudar código).
  • Recitar as três travas de gasto e provar que uma flag sozinha nunca gasta.
  • Reconhecer a camada anti-corrupção sobre o CLI real do Higgsfield e por que ela existe.
  • Rodar 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.

1

A grande ideia


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.

Por baixo do capô

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;.

BusinessSignalvalidado contexto deposicionamento copy + GTM(via skills) criativo(Higgsfield) filtro deviralidade AssetsManifestversionado · content-hash runMarketingFactory(signal, options) · cada seta é um Result<T>
O motor interno da estação "gerar": seis estágios encadeados, cada um devolvendo Result. Uma falha em qualquer seta faz a fábrica parar fechada — nunca entrega meio-pronto.
A wide illustration of a single assembly line inside an artisan workshop with three sequential stations linked by a conveyor: the first station is a magnifying glass over a small c
A wide illustration of a single assembly line inside an artisan workshop with three sequential stations linked
2

Em seis slides


A lição inteira em seis cartas. Use as setas do teclado ou os botões.

O problema

Uma venture precisa de anúncios

O signal "fábrica de petições" virou uma venture. Agora ela precisa atrair clientes como a C.D Advocacia — e isso pede material de marketing real, não só código.

A linha de montagem

Descobrir → Gerar → Validar

Três estações. Uma aprende sobre o cliente, uma gera o criativo, uma verifica o vídeo. Um comando — marketing campaign — atravessa as três.

O pivô multi-tenant

Tudo vira o ClientBrief

Marca, produto, idioma, tipo de vídeo: tudo é dado num ClientBrief. O mesmo código serve advocacia, tênis ou café — zero mudança por cliente.

A regra de ouro

$0 por padrão · 2 chaves para gastar

Toda etapa roda em ensaio. --online liga a pesquisa real; --approve e --yes juntas ligam a geração paga. Uma chave sozinha nunca gasta.

A fronteira honesta

Anti-corrupção sobre o CLI real

Por trás está o higgsfield de verdade. Uma camada traduz o JSON cru dele em tipos limpos e nunca deixa a forma crua vazar — e marca com [uncertain] o que ainda não foi verificado.

A prova

6 vídeos reais da C.D

Numa execução real e aprovada, a fábrica gerou 6 vídeos Seedance (~216 créditos) e o portão de QA pegou todos — a pronúncia de "Advocacia". O default $0 protege; a flag libera.

1 / 6setas
3

O pipeline: descobrir → gerar → validar


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.

pedido magro {client, ask} 1 · descobrir parseAsk + brief → ClientBrief 2 · gerar copy + criativo → AssetsManifest 3 · validar plano de QA (plan-only) CampaignResult dryRun: true --approve & --yes ? não → fake $0 sim → Higgsfield real
Leia da esquerda → direita: o pedido magro da C.D vira brief, depois manifesto, depois plano de QA. O losango embaixo é a única porta para gasto real — e ela exige as duas chaves.

Dentro da Estação 1: como parseAsk lê a frase

A 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.

frase do ask"...vertical, pt" contém"vertical"? sim → 9:16 não contém"cinematic"? sim → cinematic não contém"pt/português"? sim → pt não campo não-dito → DEFAULT do clientBriefSchema (nunca chutado)
Cada losango testa um pedaço da frase. Casou, vira spec; não casou, cai na faixa pontilhada do default. É a anti-fabricação aplicada à descoberta.
Preveja antes de revelar

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).

As três estações, uma a uma

Estação 1
O que discover faz com a frase "vídeo cinematográfico vertical em pt"?
clique para virar
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.
Estação 2
De onde vem o modelo de geração (imagem vs vídeo)?
clique para virar
briefToFactoryOptions: um brief com fala/cinematic → seedance_2_0 (vídeo); um card estático textgpt_image_2 (imagem). Se o usuário passar --model-id, ele vence.
Estação 3
Por que a validação na campanha é "só-plano"?
clique para virar
Num ensaio não existe vídeo real para validar. Então briefToValidationPlan deriva só os critérios que um QA real aplicaria (aspecto, idioma, marca) — sem baixar nem rodar nada.
Cola tudo
Qual função em flow.ts é o coração da geração?
clique para virar
runMarketingFactory(signal, options): signal → contexto → copy → criativo (Higgsfield) → filtro de viralidade → AssetsManifest versionado. Tudo Result, nunca lança.
A wide illustration of a heavy bank-vault door with TWO separate keyholes side by side and TWO distinct keys hanging nearby, both required to open it; behind the closed door a fain
A wide illustration of a heavy bank-vault door with TWO separate keyholes side by side and TWO distinct keys h
4

O ClientBrief (o pivô multi-tenant)


DicaUm 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.

brief: C.D Advocaciacinematic · 9:16 · pt brief: marca de tênisproduct · 1:1 · en brief: cafeteriamusic · 9:16 · pt runMarketingFactory o MESMO código p/ todos anúncio jurídico anúncio de tênis anúncio de café 0 linhas mudadas
O brief é o único elemento que varia. A máquina no meio — runMarketingFactory — é literalmente o mesmo código para advocacia, tênis e café.

Três projeções puras a partir de UM brief

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.

ClientBrief briefToSignal→ BusinessSignal briefToFactoryOptions→ modelId briefToValidationPlan→ ValidationPlan
Um brief, três projeções puras. É por isso que o CLI consegue dirigir uma campanha inteira a partir de um único documento.
O que muda por clienteOnde ficaExemplo C.D Advocacia
Marca (nome falado, formas proibidas)brief.brand"Cê Dê Advocacia"; aceita initialism
Produto / setorbrief.client.industryserviços jurídicos
Tipo de vídeobrief.video.typecinematic
Formato (aspecto)brief.video.aspect9:16 (vertical)
Idioma faladobrief.video.languagept
O código da fábricanão muda
Guarde istoBrand-agnostic = dados, não código. Sempre que você se perguntar "como o Alembic serve outro cliente?", a resposta é: escreve outro ClientBrief. C.D Advocacia é só o primeiro brief.
5

As três travas de gasto


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.

Aviso — dinheiro realA geração de vídeo é o gasto grande. Na prova real da C.D, 6 vídeos = ~216 créditos. É por isso que destravar a geração exige duas chaves juntas (--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".
Trava 1 · pesquisa --online liga brightdata real custa $ (pesquisa) Trava 2 · geração --approve & --yes as DUAS chaves juntas custa $$$ (Seedance) Trava 3 · validação no dry-run fica plan-only $0 (sem artefato)
Três travas independentes. Repare na Trava 2: ela tem dois furos de fechadura — precisa de --approve E --yes. É o desenho que a lição inteira gira em torno.

A tabela-verdade do gasto

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--yesResultadoGasta?
ensaio (fake Higgsfield, preview $0)Não
ainda ensaio — uma chave só não bastaNão
ainda ensaio — uma chave só não bastaNã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.

216 0 — / —$0 ✓ / —$0 — / ✓$0 ✓ / ✓~216 geração real --approve / --yes
A mesma tabela-verdade, em barras. Três combinações rentes ao chão ($0); só a quarta — as duas chaves — sobe para ~216 créditos. O desenho do gasto é "tudo ou as-duas".

A porta lógica por trás de paid

--approve --yes E paid = true→ Higgsfield real qualquer outra entrada → fake $0 const paid = args.approve && args.yes
A doutrina de gasto é literalmente uma porta E. Só true && true acende o Higgsfield real; true && false, false && true e false && false caem todas no fake $0.
Exemplo resolvido — a campanha da C.D, passo a passo (ensaio $0)
1
Você escreve cd-request.json: { "client": { "name": "C.D Advocacia", "website": "..." }, "ask": "vídeo cinematográfico vertical 9:16 em português" }. Um pedido magro.
2
Roda alembic marketing campaign cd-request.jsonsem flags. A descoberta é offline: parseAsk lê tipo cinematic, aspecto 9:16, idioma pt. Provenance fica offline-request (nada foi pesquisado na web).
3
briefToSignal + briefToFactoryOptions projetam o brief: o signal alimenta a fábrica; o tipo cinematic escolhe o modelo de vídeo seedance_2_0.
4
runMarketingFactory roda com o Higgsfield fake: monta copy a partir das skills e devolve um AssetsManifest de preview — custo $0.
5
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.
6
Sai um 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?
A wide illustration of an anti-corruption airlock between two rooms: on the left a messy room of tangled raw paperwork stamped with snake_case-looking labels feeding into a sealed
A wide illustration of an anti-corruption airlock between two rooms: on the left a messy room of tangled raw p
6

A camada anti-corrupção


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.

higgsfield CLI--json cru camada anti-corrupção (higgsfield.ts) 1 · valida schema RAW{ job_set_type, ... } 2 · mapeia p/ domínio{ id, modality } HiggsfieldJobtipo limpo do Alembic
A forma snake_case do CLI entra à esquerda, é validada e traduzida, e só o tipo limpo (HiggsfieldJob) sai à direita. O dialeto cru morre dentro da parede.
Honestidade estrutural

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.

Para quem quer o detalheO mesmo padrão se repete na porta de pesquisa (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.

Cru × Limpo (a tradução)

O que o CLI devolve (cru)
// envelope --json do higgsfield
{
  "job_set_type": "seedance_2_0",
  "display_name": "Seedance 2.0",
  "type": "video",
  "result_url": "...mp4"
}
O que o Alembic usa (limpo)
// tipo de domínio, via mapJob/mapModel
{
  id: "seedance_2_0",
  name: "Seedance 2.0",
  modality: "video"
}
// camelCase, validado, previsível

Como a fábrica foi construída (a linha do tempo)

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).

#86anti-corrupção #87gate validateVideo #88scene-gen Seedance #89wiring OCR/vision #90multi-tenant #91–#94discover + campaign hoje
Da esquerda para a direita: primeiro a parede anti-corrupção (#86), depois o QA (#87), a geração (#88), os olhos OCR/visão (#89), a generalização multi-tenant (#90) e, por fim, a família discover/campaign que amarra tudo num comando (#91–#94).
A wide illustration of one central template press in a workshop producing the SAME ad frame for several different small brand booths arranged around it — a law-office booth, a snea
A wide illustration of one central template press in a workshop producing the SAME ad frame for several differ
7

O portão de QA do vídeo


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.

video.mp4local formatoaspecto 9:16 · duração (ffprobe) transcriptfala vs script + marca (whisper) framestexto colado (OCR) · proibidos (vision) E pass = truesó se TODAS limpas
Três dimensões, um veredito por porta E: o vídeo passa só quando formato, transcript e frames estão todos limpos. Cada dimensão é opt-in conforme o tipo de anúncio.
O caso real "Advocacia". O Whisper transcreve letras faladas ("Cê Dê") para a forma escrita ("CD"). O portão sabe disso: deriva o initialism, trata como mispronúncia por padrão, mas pode 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.
A wide illustration of a quality-inspection bench examining a single vertical phone-screen video clip: a soundwave being matched against a printed script page, a magnifier scanning
A wide illustration of a quality-inspection bench examining a single vertical phone-screen video clip: a sound
8

No código


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.

apps/cli/src/commands.ts — runMarketingVideo / runMarketingCampaign
// 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,
});

Acesse você mesmo

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.

9

Experimente: o simulador de gasto


Vire as chaves e veja o custo recalcular ao vivo. É a tabela-verdade do gasto, interativa. Note: só uma combinação acende o gasto.

Campanha da C.D Advocacia · simulador de gasto
--online liga a pesquisa real (brightdata)
--approve aprovação do operador
--yes confirmação não-interativa
$0
ensaio · dry-run
Nenhuma chave virada: discovery offline, Higgsfield fake, validação plan-only. 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.

Duas comparações para fechar

Sem a fábrica (manual)

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.

Com a Marketing Factory

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.

discover OFFLINE (default)

parseAsk só. Provenance offline-request. $0, determinístico. Campos não-ditos ficam no default — nada inventado.

discover --online (gated)

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.

offline-requestestado inicial · $0 --online APRENDEU algo (quote/url) online-researchcom evidência --online no-op (nada aprendido) → continua offline-request
A proveniência só vira 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.
As Dez verdades da Marketing Factory
  1. O pipeline é uma linha de montagem: descobrir → gerar → validar.
  2. marketing campaign faz as três de uma vez, em ensaio $0 por padrão.
  3. Tudo que muda por cliente está no ClientBrief — o código não muda (multi-tenant).
  4. Um brief gera três projeções puras: signal, opções de modelo e plano de validação.
  5. $0 por padrão em toda etapa. O ensaio é o default, não uma opção.
  6. Três travas: --online (pesquisa), --approve --yes (geração), validação (plan-only no dry-run).
  7. Uma flag sozinha nunca gasta — a geração exige args.approve && args.yes.
  8. A camada anti-corrupção traduz o CLI higgsfield cru; a forma crua nunca vaza.
  9. O que não foi provado é marcado [uncertain] — honestidade estrutural.
  10. O portão de QA é o E de três dimensões opt-in; pegou os 6 vídeos reais da C.D.
Revisão — três perguntas
Você roda alembic marketing campaign cd.json --approve (só essa flag). O que acontece?
Resposta: B. A trava é 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.
Por que a Marketing Factory é "multi-tenant" sem mudar código?
Resposta: C. Tudo que varia por cliente vive no ClientBrief (dados), não no código. runMarketingFactory é o mesmo para advocacia, tênis ou café — troca-se o brief, troca-se o cliente.
Qual é o papel da camada anti-corrupção sobre o CLI higgsfield?
Resposta: A. Ela valida o envelope --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].
Acertos: 0/3
Verifique na fonte (o repositório)
packages/marketing-factory/src/flow.ts — runMarketingFactory + o ViralityScorer offline

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.

Você é o professor agora: sabendo que a geração exige --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.