Trabalho de produto agent-first em um app de oração
O produto é oração guiada. Dois ou três minutos para uma situação real: ansiedade, luto, dinheiro, família. Entregue primeiro pelo WhatsApp, com um app ao lado. Eu trabalhei em trazê-lo para o Brasil.
O produto é conteúdo, então fazer conteúdo era o trabalho. A parte interessante é que eu não escrevi o conteúdo. Eu construí o loop que produz o conteúdo e as checagens que o mantêm honesto, e assinei o que saiu.
O loop
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ texto │──▶│ parsear │──▶│ rotular │──▶│ julgar │
│ fonte │ │passagens │ │ situação │ │ (agente) │
└──────────┘ └──────────┘ └──────────┘ └────┬─────┘
▲ │
│ ▼
┌─────┴────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ melhorar │◀──│registrar │◀──│ corrigir │◀──│ amostrar │
│ pipeline │ │ decisão │ │ pipeline │ │ à mão │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
Um agente produz. Um segundo agente julga. Uma pessoa faz a amostragem. Cada erro volta para o pipeline, nunca para os dados à mão, para que a próxima rodada não consiga repeti-lo. Depois a decisão que saiu dali ganha um arquivo, e o loop roda de novo.
As camadas
┌──────────────────────────────┐
│ eu: prioridades, assinatura │
└──────────────┬───────────────┘
│
┌──────────────▼───────────────┐
│ agentes: conteúdo e pesquisa│
└───────┬──────────────┬───────┘
│ │
┌─────────────▼────┐ ┌─────▼──────────────┐
│ memória │ │ ferramentas │
│ │ │ │
│ arquivo handoff │ │ parser, montador │
│ 1 arquivo/decisão│ │ rotulador, juízes │
│ diário por dia │ │ gerador de episódio│
│ runbooks │ │ staging, publicação│
└─────────────┬────┘ └─────┬──────────────┘
│ │
┌───────▼──────────────▼───────┐
│ avaliação │
│ │
│ juiz de registro │
│ juiz de segurança pastoral │
│ auditoria mecânica (scripts)│
│ amostra humana │
│ harness de conversas │
└──────────────────────────────┘
A camada de memória é markdown puro. Um arquivo de handoff que qualquer sessão nova lê primeiro, um arquivo por decisão, um diário por dia, e um runbook para qualquer coisa feita duas vezes. Foi isso que me deixou alternar entre chats, e entre a noite e a manhã, sem perder estado.
Fonte e parse
O Brasil precisava de uma tradução católica. A fonte era uma edição impressa, então o primeiro trabalho foi transformá-la em passagens: dois a cinco versículos que se sustentam sozinhos.
O primeiro montador cortou 10,4% das passagens no meio da frase, numa vírgula ou num ponto e vírgula. A correção foi um look-ahead no montador, não uma edição da saída. A taxa caiu para 0,58% na sondagem e 2,0% na rodada completa de 12.774 passagens, com todos os versículos cobertos.
Rotular e julgar
Cada passagem recebe as situações que ela atende: ansiedade e medo, luto, solidão, culpa e perdão, trabalho e dinheiro, família, gratidão, discernimento. As tags são o que a busca usa, então uma tag errada é uma resposta errada para alguém num momento ruim.
Três juízes rodaram sobre o corpus rotulado, cada um um agente separado com uma única pergunta.
passagens rotuladas (12.774)
│
├─ juiz de registro ─── narrativa | mista | oferta
│ 5.949 prontas para inserir · 657 retidas
│
├─ scan imprecatório ── 291 achados · 101 retidas de
│ situações sensíveis
│
└─ segurança pastoral ─ só as 969 passagens que servem
aflição: "uma pessoa nesse estado se
sentiria pior lendo isto agora?"
segura | risco | dúvida
O juiz pastoral existe por causa da amostra humana. Vinte salmos lidos à mão encontraram cinco problemas reais, um deles um versículo sobre pecadores tratados como escória, servido para ansiedade, sem nenhuma palavra do léxico de ansiedade nele. Uma lista de palavras não enxerga significado. Então o juiz só roda onde um match ruim causa dano, 19% do corpus, e o prompt dele diz explicitamente que lamento não é risco. Sem essa linha ele teria cortado o melhor material. Custou uns vinte centavos.
O que foi para produção: 5.105 passagens.
Busca que dá para testar
"estou com medo de perder o emprego"
│
▼
situação: ansiedade + trabalho ──▶ escopo de fé: católico
│
▼
Filipenses 4:4-7 (luto → Salmo 142, culpa → Salmo 37)
Dez mensagens realistas em português, dez passagens no tema de volta. Para continuar assim existe um harness que roda conversas inteiras contra o modelo real e o corpus real sem mandar nada para ninguém. Quando uma mudança no agente conversacional quebrou a busca, o harness mostrou que a causa não estava onde o sintoma estava. Essa mudança foi revertida de propósito, e o motivo está num arquivo.
Episódios diários
O conteúdo de lançamento era uma série devocional de 46 dias, um episódio em áudio por dia, amarrado ao calendário. O dia um diz "hoje começa" e nomeia a festa. Publicar atrasado faria o conteúdo mentir, então a data era o contrato.
brief ──▶ roteiro (3 revisões) ──▶ voz (ElevenLabs,
casting regional)
│
┌──────────────────────────────────────┘
▼
auditoria mecânica, por script e não por leitura
texto fixo de oração byte a byte 15/15
versículos literais vs a fonte 16/16
hashes texto / áudio / alinhamento 5/5
datas vs dia da semana, dia 1 e 46 ok
│
▼
agente audita ──▶ pessoa assina ──▶ stage ──▶ dry run
│
▼
publicar ──▶ slot diário ──▶ cron 5:30
A auditoria do agente não é o veredito pastoral. É a entrada dele. Uma pessoa assina; o pipeline registra quem e quando. Os dez primeiros episódios saíram no prazo. Mais dez ficaram prontos antes das suas datas. O gerador e o runbook foram escritos para que os restantes pudessem ser produzidos por qualquer pessoa com o brief.
Decisões, medidas
A empresa roda em dados, não em narrativa. Toda pergunta de produto começava com o que os usuários de fato fizeram, puxado do analytics, e terminava em algo que a gente conseguia medir rápido.
A mesma regra valia para mim. Em vez de "isso vai funcionar", aprendi a dizer "em uma hora eu te digo se funciona", e aí construir o harness capaz de dizer.
O jeito de trabalhar
Os agentes neste projeto não esperam por tarefas. O padrão é decisão anunciada, não permissão pedida.
noite manhã
─────────────────────── ───────────────────────
agente roda a fila eu leio o relatório
regras duras: sem commit, um commit por vez:
sem banco, sem push entender
decide, documenta, segue trazer os arquivos
lista cada arquivo tocado ver o diff
escreve decisions/ e um relatório checar (comando + "verde")
commit
Uma rodada noturna recebe um plano com regras duras e uma fila. De manhã eu recebo um relatório e um arquivo de entrega com cinco checkboxes por commit. Nada sobe sem que eu tenha lido e verificado. Autonomia não é o agente fazendo o que quiser. É o agente fazendo o trabalho e deixando um rastro que uma pessoa consegue conferir mais rápido do que levaria para fazer.
Por que isso não é sobre oração
app de oração qualquer negócio de conteúdo
───────────────────────── ─────────────────────────────
tradução-fonte sua matéria-prima
passagens rotuladas por tema unidades rotuladas pelo que servem
juiz de registro + segurança agentes que checam os agentes
vinte salmos à mão a amostra humana, sempre
corrigir o montador corrigir o pipeline, nunca os dados
decisions/ + handoff memória que sobrevive ao chat
auditoria mecânica checagens que um script roda
a data como contrato o prazo embutido no conteúdo
A parte difícil não foi gerar texto. Foi saber qual texto estava errado, em escala, antes que uma pessoa num momento ruim o lesse. Isso exigiu um segundo agente com uma única pergunta, uma amostra humana pequena o bastante para ser feita de verdade, e uma regra de que cada erro muda a ferramenta.
O que eu fiz
Eu não escrevi as passagens nem os episódios. Construí o parser e o montador, desenhei os juízes e seus prompts, rodei as amostras humanas, escrevi os runbooks e o processo de entrega, e assinei o que foi ao ar. Cada lição terminou num arquivo que a próxima sessão leria primeiro.