Gerador de Títulos IA: o prompt do Grok, o mapeamento Sheer→XVideos e a cobrança contra o achismo
Prompt do Grok pro gerador de títulos, mapeamento Sheer→XVideos, coletor via SerpApi e um erro de PDO que quase virou suposição errada.
O dia inteiro girou em torno de um módulo só do kmaroteApp — o Gerador de Títulos IA — e de uma disciplina que virou tema recorrente aqui: não deixar a ferramenta presumir nada que ela não verificou. No meio disso, ainda entrou um fix pontual de upload de contrato. Três commits no kmaroteApp, um dia bem concentrado.
Do dashboard admin à consistência visual
A primeira frente foi o painel. Fechei o dashboard admin do Gerador de Títulos IA: card-resumo no Painel do Administrador e as telas de operacional, coleta, analítica e configurações (commit f6756534).
A parte de UI passou por revisão de especialistas. No Claude Code, disparei uma rodada de subagentes — crítica de UX, revisão técnica de frontend, e depois architect + code-architect para uma segunda passada de consistência. Duas correções minhas guiaram o resultado: “remova as bordas e peça melhorias aos especialistas” e, mais firme, “não deve criar css, exclua o css criado e use um existente”. Em vez de um arquivo novo, o ajuste de grid entrou no kmarote.css que já existia. Menos entropia.
A engenharia de prompt do Grok
O núcleo do trabalho não é a tela, é o prompt que vai pro Grok gerar os títulos. Defini dois objetivos claros:
- Enviar títulos-exemplo no idioma escolhido pelo canal, separados por plataforma.
- Garantir que, no caso do Sheer, só voltem tags válidas.
E precisei explicitar uma regra de domínio que o Claude Code não tinha como adivinhar: “Sheer é somente a plataforma utilizada para postar, então sempre que for SHEER deve ser considerado XVIDEOS”. Esse mapeamento plataforma→fonte é o tipo de conhecimento que não está no código nem no banco — tem que vir de mim.
Para alimentar esse prompt com dados reais, montei duas peças que fecharam no commit ab837e19 (elegibilidade de categoria por cena + volume de busca via SerpApi):
- Um coletor em Node (
.mjs) que busca títulos-exemplo dos 5 principais países e salva direto no servidor. - Coleta de volume de busca via SerpApi (
serpapi.inc.php,cron_serpapi_volume.php) para atualizar a lista de termos de alto volume, com a migration2026_07_22_categorias_regras_volume.sql.
O coletor rodou e gravou no servidor como previsto. A pendência que ficou é a lista de termos: pedi ao Claude Code para pesquisar fontes que a gente possa usar para manter esses termos de alto volume atualizados.
A cobrança contra o achismo
O momento mais útil do dia foi de fricção. Homologação começou a cuspir um erro de PDO:
SQLSTATE[42S02]: Base table or view not found
O Claude Code foi direto na hipótese fácil: faltava uma tabela. Cortei:
“Tem certeza que faltou? Local está funcionando e você não consegue acessar o banco em homologação, então como é capaz de afirmar que está faltando algo? Você presumiu com base em informações que você não tem.”
O EstruturaKmarote.sql é o dump da homologação — mandei buscar a resposta ali e no banco local antes de concluir qualquer coisa. É a diferença entre diagnosticar e chutar.
Não por acaso, foi a mesma exigência que levei pro Codex mais cedo, quando usei ele pra auditar o plano da feature: “Não presuma ou assuma nada, verifique a existência no código e no banco. O plano deve ser detalhado para a equipe executar.” Dois produtos diferentes, mesma régua: nada de conclusão sem evidência.
Decisão persistente
O padrão que vale registrar: quando falta acesso a um ambiente (nesse caso, o banco de homologação), a IA não pode transformar a falta de visibilidade em suposição de causa. Se não dá pra confirmar, o passo é buscar a evidência disponível — dump, log, banco local — antes de apontar um diagnóstico. Vale tanto pro Claude Code quanto pro Codex, e virou régua fixa pra qualquer plano ou correção daqui pra frente.
Fix pontual: upload de contrato em WebP
Fora do Gerador, um bug prático em meus_contratos. A tela de upload de contrato deixava o usuário selecionar um .webp, mas depois do submit rejeitava dizendo que só aceitava JPG — inconsistência clássica entre o que o input aceita e o que o backend valida.
Perguntei ao Claude Code qual saída era melhor: converter para JPG ou aceitar WebP de fato. Ficamos na conversão automática para JPG, que mantém o resto do fluxo intacto. Entrou no commit a62157cb, mexendo em processa_contrato_manual.php, upload_contrato.php e uteis.inc.php.
Fechamento
Pendência pro próximo dia: fontes confiáveis pra manter a lista de termos de alto volume atualizada — o coletor via SerpApi está rodando, mas a curadoria da lista em si ainda não tem fonte definida.
Estatísticas do dia (geradas automaticamente):
Atividade no PC:
- Tempo ativo: 4h40min na janela
Por categoria:
- Coding: 1h19min
- AI Chat: 27min
- Larissa Project: 24min
- Browsing: 8min
- Não categorizado: 2h22min
Top apps: Chrome (1h35min) · Antigravity IDE (1h17min) · TaskBarHero (1h08min)
Top sites navegados: Google (11min) · SerpApi (5min) · painéis internos do kmarote
Trabalho com IA:
- claude.ai: 0 conversas (nenhum export novo na inbox)
- Claude Code Windows: 7 sessões (kmaroteApp — Gerador de Títulos IA, fix de contrato, e 5 subagentes de revisão)
- Codex Windows: 1 sessão (auditoria do plano da feature, kmaroteApp)
- Claude Code Larissa: indisponível (SSH não resolveu o host)
- Larissa drops: 0 arquivos
Código produzido:
- Git kmaroteApp: 3 commits
- Git Larissa: indisponível (SSH)