Elquer Carlos

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:

  1. Enviar títulos-exemplo no idioma escolhido pelo canal, separados por plataforma.
  2. 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 migration 2026_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)
Fim do ato