Backlog Unificado
Projeto: RioNoTeatro. Fonte principal: /www/wwwroot/rionoteatro.com.br/docs/BACKLOG.md.
Modo read-only: ações de escrita ficam disponíveis apenas para o Cérebro.
Sem itens pendentes em /www/wwwroot/rionoteatro.com.br/docs/BACKLOG.md.
Especificações Disponíveis (fora da fila pendente)
- BK-136
- BK-137
- BK-138
- BK-147
- BK-148
- BK-149
- BK-150
- BK-151
- BK-156
- BK-158
- BK-159
- BK-160
- BK-161
- BK-162
- BK-163
- BK-164
- BK-165
- BK-166
- BK-170
- BK-171
- BK-172
- BK-177
- BK-183
- BK-186
- BK-187
- BK-189
- BK-190
- BK-191
- BK-192
- BK-193
- BK-195
- BK-196
- BK-197
- BK-198
- BK-199
- BK-201
- BK-205
- BK-207
- BK-208
- BK-209
- BK-210
- BK-211
- BK-212
- BK-213
- BK-214
- BK-215
- BK-216
- BK-217
- BK-218
- BK-219
- BK-220
- BK-221
- BK-229
- BK-230
- BK-231
- BK-232
- BK-233
- BK-234
- BK-235
- BK-236
- BK-239
- BK-240
- BK-241
- BK-242
- BK-243
- BK-244
- BK-245
- BK-246
- BK-248
- BK-249
- BK-250
- BK-251
- BK-252
- BK-253
- BK-254
- BK-255
- BK-256
- BK-257
- BK-258
- BK-259
- BK-260
- BK-261
- BK-262
- BK-263
- BK-264
- BK-265
- BK-266
- BK-267
- BK-268
- BK-269
- BK-270
- BK-271
- BK-272
- BK-275
- BK-276
- BK-277
- BK-278
- BK-279
- BK-280
- BK-295
- BK-313
Detalhe do BK Selecionado
/www/wwwroot/rionoteatro.com.br/docs/backlog/BK-201-automacao-social-nova-peca-e-squad.md • 2026-04-11T10:27:09.694Z
BK-201 · Automacao social de nova peca + auditoria do Squad
Contexto
- Foi criada uma peca nova e a expectativa operacional era ver desdobramento automatico de conteudo para:
- Instagram Feed
- Instagram Story
- Facebook Feed
- X / Threads
- Na pratica, o fluxo parece cada vez menos automatico e mais manual.
- Em paralelo, o botao
Salvar configuração do Squademadmin/modulos/campanhas/redes_sociais.php#tab-squadaparenta nao responder.
Perguntas deste BK
- O cron diario/manhã deveria detectar peca nova e gerar pauta/copy automaticamente?
- O que hoje e automatico de verdade e o que depende de disparo manual?
- O botao de salvar configuracao do Squad esta quebrado no front, no endpoint ou so sem feedback visivel?
- Como endurecer essa automacao sem deixar o painel opaco?
Evidencias ja coletadas
- A tela principal existe em:
admin/modulos/campanhas/redes_sociais.php- O tab Squad e renderizado por:
admin/modulos/campanhas/redes_sociais_ui_helper.php- O JS do Squad e carregado no final da pagina:
admin/modulos/campanhas/redes_sociais.php- script
redes_sociais_squad.js - O botao de salvar configuracao existe no HTML:
- id
btn-squad-save-settings - O JS liga esse clique em:
admin/modulos/campanhas/redes_sociais_squad.jssaveRuntimeConfig()- O backend exposto para salvar configuracao existe em:
admin/modulos/campanhas/action_squad.phpcmd=save_runtime_config- O helper de persistencia existe em:
admin/modulos/campanhas/social_squad_helper.phprnt_social_squad_runtime_config_save()- O cadastro de peça chama gatilho social em:
admin/modulos/pecas/action.phpsquad_pecas_trigger_event_creation($msg[1])- O helper desse gatilho existe em:
admin/modulos/pecas/squad_pecas_helper.php- Hoje esse helper insere na fila apenas:
type = facebook_event_draftstatus = queued- Exemplo real desta rodada:
- peça
1493/Fanáticos - já apareceu em
social_post_queuecom: facebook_feed/planner_site_entry/pending_approvalinstagram_feed/planner_site_entry/pending_approvalfacebook_story/story_trigger/pending_approvalinstagram_story/story_trigger/pending_approval- O cron social mais importante hoje segue em:
admin/cron/sync_facebook_events.php- A Central de Redes Sociais expõe botões manuais para:
- planner
- dispatcher
- run completa do cron
- reset
- page events
Leitura tecnica atual
- Leitura estatica do codigo:
- o botao
Salvar configuração do Squadparece completo no papel - HTML, binding JS, endpoint e helper de persistencia existem
- Isso sugere que o defeito mais provavel esta em um destes pontos:
- JS nao inicializado/runtime do tab
- erro silencioso no browser
- resposta de rede nao tratada como esperado
- problema de sessao/permissao/contexto do endpoint quando chamado pela tela real
- Sobre a automacao de nova peca:
- existe gatilho automatico real no cadastro de peca, mas ele e parcial
- hoje a peca nova dispara
squad_pecas_trigger_event_creation() - esse helper insere so um item
facebook_event_draftnasocial_post_queue - isso nao equivale a abrir automaticamente uma pauta multi-canal para:
- instagram feed
- instagram story
- facebook feed
- threads
- tiktok
- portanto a sensacao operacional de “cada vez menos automatico” faz sentido: o sistema atual automatiza um rascunho pontual, nao uma esteira completa de nova peca
- o cron
sync_facebook_events.phptrabalha forte sobre a fila social e sobre planejamentos/feed/story, mas a leitura atual nao prova um cron matinal dedicado a “peca nova -> semear campanha multi-canal”
RCA parcial consolidada nesta rodada
- Peça nova
- existe gatilho
- mas ele semeia so
facebook_event_draft - nao existe, pelo que foi lido ate aqui, um fan-out automatico completo por canal para nova peca
- Squad save
- no codigo, a trilha esta completa:
- botao HTML
- binding JS
fetch('action_squad.php?cmd=save_runtime_config')- backend
save_runtime_config - persistencia em
robot_config.chave = squad_social_runtime_config - entao o problema aparente e mais provavelmente:
- runtime/browser
- feedback fraco
- falha de rede/sessao
- erro JS anterior bloqueando a execucao real do clique
- Vazamento de instrução operacional para copy
- a trilha de refresh do approval estava mandando para a IA campos como:
adjustment_requestselected_seed_textcurrent_options- isso aumenta muito o risco de a IA incorporar instruções operacionais como se fossem copy final
- nesta rodada foi aplicada blindagem em:
admin/modulos/campanhas/action_squad.phpadmin/cron/ai_copy_helper.php- regra nova:
- esses campos nao entram mais no payload enriquecido que vai para a IA
- Stories presos no manual
- o cron ainda tratava
manual_notified/preset_story_notified/notifiedcomo bloqueio operacional para sticker/link - a publicacao ficava parada em
notified - nesta rodada foi aplicada mitigacao operacional:
- continuar tentando gerar prova/rascunho
- mas nao bloquear mais a publicacao automatica por causa do sticker
- WhatsApp admin
- a regra canônica passa a separar destinos:
enviar_whatsapp_admin()fica restrito a alertas gerais e usa apenasBOT_WHATSAPP_NUMERO_ALERTA- approvals de postagem saem por
enviar_whatsapp_aprovacao_postagem() - esse destino dedicado deve usar
BOT_WHATSAPP_NUMERO_APROVACAO_POSTAGEMquando existir - fallback operacional atual do approval dedicado:
5521999915554 - Paralelismo entre canais
- feed e story nao ficam bloqueando um ao outro por dependencia funcional direta
- o dispatcher separa as filas por canal:
queue_fb_feedqueue_ig_feedqueue_fb_storyqueue_ig_storyqueue_threads_feedqueue_tiktok_feedqueue_tiktok_story- depois processa cada grupo em sua propria trilha
- se um canal falha, os demais continuam no mesmo run
- Retry real
- existe retry automatico parcial, baseado em status
error - o planner usa
ON DUPLICATE KEY UPDATEpara reabrir itenserrorem alguns tipos: planner_site_entryplanner_weekly_carouselplanner_weekly_editorial_carousel- o dispatcher incrementa
attemptse gravalast_error - isso significa:
- ha reprocessamento automatico para itens de fila planejados
- mas nao ha, pelo que foi lido ate aqui, um orquestrador sofisticado de retry por etapa com backoff semantico por canal
- o modelo atual e mais “erro -> permanece em error -> proxima rodada/planner pode recolocar” do que um retry inteligente multi-estagio
Escopo desta rodada
- mapear a arquitetura atual
- diferenciar automacao real de expectativa operacional
- identificar onde instrumentar melhor a trilha
- decidir BK tecnico futuro para:
- autopauta de nova peca
- approvals automaticos guiados
- melhor feedback do botao do Squad
Proximos passos
- inspecionar:
- scripts/cron que abastecem
social_post_queue - gatilhos apos cadastro/edicao de peca
- fluxo do
tab-squadno browser/network - decidir se a automacao correta para nova peca deve:
- apenas criar rascunho de evento no Facebook
- ou tambem abrir fila multi-canal automaticamente
- se a decisao for multi-canal, o ponto inicial mais provavel de ajuste e:
admin/modulos/pecas/squad_pecas_helper.php- em conjunto com o consumo no
admin/cron/sync_facebook_events.php - revisar o runtime real do tab Squad no navegador para descobrir por que o botao de salvar parece morto apesar do fluxo de codigo existir ponta a ponta
- redesenhar a separacao:
- instrucao operacional
- direcao criativa
- copy final
Atualização de 2026-04-11 07:20 -03
Sintoma novo reportado
- em
redes_sociais.php#tab-squad - a execução fica em
2. copyRunning - depois aparece como
Cancelado - contexto visual reportado:
Tipo: copyAgente: backendIA planejada: geminiIA usada: geminiModelo: gemini-3-flash-preview
Leitura técnica refinada
- o front do Squad não cria sozinho o cancelamento
- em
admin/modulos/campanhas/redes_sociais_squad.js, o statusCanceladosó aparece quando: run.status === 'canceled'- ou chega evento
run_aborted
Trechos relevantes:
mapRunStatus()traduzcanceledparaCanceladoapplyEventToBundle()faz:if (event.event === 'run_aborted') { next.run.status = 'canceled'; }
Implicação
- o cancelamento visto no passo
copyRunningparece vir do runtime externosquad_ws/ Cérebro - não do card em si
Cruzamento com log local
O log admin/logs/ai_copy_pipeline.log mostrou nesta rodada:
primary_startcom:engine=geminiprovider=squad_ws- em várias execuções recentes, o primário concluiu com:
primary_doneerror = null- os ruídos mais frequentes ficaram em:
opencodelateral comempty_opencode_outputmerge_skipmerge_donecomerror = timeoutem alguns casos
Hotfix aplicado nesta rodada
Arquivo alterado:
admin/modulos/campanhas/redes_sociais_squad.js
Objetivo do hotfix:
- parar de mostrar só
Cancelado - expor o motivo real vindo do runtime quando existir
O que entrou:
- persistência de
runtimeIssueeruntimeIssueTypeno resumo da run quando chegar: run_failedrun_aborted- limpeza defensiva de
runtimeIssue/runtimeIssueTypequando a run reinicia (run_started) ou conclui com sucesso (run_completed), para não deixar alerta residual em retry - normalização de payloads estruturados do runtime:
- se
error,reason,summaryoumessagevierem como objeto/array, a UI tenta extrair texto útil em vez de renderizar[object Object] - preservação de
currentStepKeynorun_abortedquando o evento vier semstepKey, para não perder contexto da etapa cancelada - resumo da run agora mostra:
Motivo do cancelamento- ou
Motivo da falha - timeline do front agora também lê:
errorreasonmessagestatusTextpassa a refletir o motivo dorun_failed/run_abortedquando o evento vier com detalhe
Conclusão operacional atual
- o bug principal não parece ser “Gemini sempre cancela”
- o mais provável é:
- aborto/cancelamento no runtime do Cérebro
- ou motivo de falha não propagado bem até a UI
Próximo passo
- reproduzir uma run real no
tab-squad - observar se agora o cancelamento vem com motivo explícito
- com esse motivo em mãos, decidir se o próximo patch é:
- timeout/provider
- fallback automático
- ou ajuste do runtime
squad_ws
Fechamento operacional desta rodada
facebook_feedcom midia de video aprovada passou a subir o arquivo local do RNT via upload binario (source) em vez de depender defile_url- validacao real executada em
03/04/2026: queue_id 1024- peca
Fanáticos - retorno do dispatcher:
SUCESSO! ID: 956902267291295 - o erro
Unable to fetch video file from URLficou tratado para o caso defacebook_feedcom video local do acervo publishInstagramMedia()passou a aguardar o container de video do Instagram ficar pronto antes de publicar- validacoes reais adicionais executadas em
03/04/2026: queue_id 1029- peca
Lisa, Lesa & Louca - retorno do dispatcher:
SUCESSO! ID: 18057407342468316 queue_id 1028- peca
Fanáticos - retorno do dispatcher:
SUCESSO! ID: 18048627641547307 - o
instagram_feeddeFanáticos(queue_id 1025) ainda estavaqueuedpara03/04/2026 12:00, mas a trilha de publish usa o mesmo método endurecido agora validado nos stories de vídeo
Proposta operacional alvo
1. Gatilho de peça nova
- o cadastro de peca deve abrir imediatamente uma pauta multi-canal estruturada, nao so
facebook_event_draft - ao salvar peca nova:
- gerar itens para:
facebook_feedinstagram_feedfacebook_storyinstagram_storythreads_feedtiktok_feedetiktok_storypodem continuar como fase 2/manual-notificado
2. Approval noturno e dispatcher matinal
- melhor politica operacional sugerida:
- noite: gerar approvals e enviar WhatsApp para o admin aprovar com calma
- manhã: dispatcher publica o que já estiver aprovado
- motivacao:
- evita o gargalo “peca entrou e o admin nao viu a tempo”
- deixa a fila pronta para publicar cedo no dia seguinte
- hoje o
planner_site_entryagenda para ~15 minutos apos o run - proposta:
- separar:
- horario de geracao de approval
- horario de publicacao
- separar tambem o destino do WhatsApp:
- numero de approval/autorizacao de postagem nao deve receber alertas gerais de monitoramento
2.1 Regra operacional canônica de cooldown por peça
story-firstcontinua sendo a prioridade da primeira aparição social da peça- peça nova sem histórico social pode abrir a primeira rodada automática com:
facebook_storyinstagram_storyfacebook_feedinstagram_feedthreads_feed- nessa primeira rodada, o criativo deve assumir posicionamento de:
- nova peça
- nova oferta
- desconto em destaque
- informações reais da peça e da próxima sessão
- descontos muito agressivos devem ser destacados com mais força no texto de lançamento
- depois da primeira rodada, qualquer planner automático de feed da mesma peça deve respeitar cooldown mínimo de
24h - a trava vale tanto para:
planner_site_entryplanner_session- se a peça tiver qualquer atividade social recente nas últimas
24h, o feed automático nao nasce - objetivo:
- evitar flood da mesma peça
- impedir que novas rodadas de feed automático atropelem a janela do story
- manter o número de autorização focado apenas em approvals de postagem
2.2 Música em stories/feed
- a integração atual do
FacebookEventServicenao implementa trilha de música/áudio para story ou feed - portanto a primeira rodada automática desta fase continua sem música embarcada via API
- se a operação quiser música canônica, isso precisa virar um slice separado:
- validar suporte real nas APIs dos canais
- decidir catálogo/fonte de áudio
- implementar payload específico por plataforma
2.3 Canais da primeira rodada
- a primeira rodada automática da peça nova deve abrir todos os canais realmente suportados hoje na esteira:
facebook_feedinstagram_feedfacebook_storyinstagram_storythreads_feedX/Twitternao existe como canal implementado nesta base hoje- se o usuário pedir
X, isso deve virar BK separado de implementação, nao só ajuste de planner
3. Paralelismo entre canais
- feed e story podem continuar em paralelo
- nao vale criar dependencia artificial entre:
facebook_feedinstagram_feedfacebook_storyinstagram_story- se um canal falhar, os outros devem continuar no mesmo ciclo
4. Retry/rerun
- modelo alvo:
- erro transitorio:
- retry automatico com backoff
- erro de token/permissao:
- alerta admin + pausa do canal afetado
- erro criativo/approval:
- rerun de copy sem reabrir tudo
- hoje o sistema so chega parcialmente nisso via
status=error,attempts,last_errore reentrada do planner
Atualizacao operacional de 03/04/2026
Confirmado
- o planner da peca nova foi ajustado para abrir a primeira rodada automatica em 5 canais:
facebook_feedinstagram_feedthreads_feedfacebook_storyinstagram_story- o destino de WhatsApp para approval foi segregado do numero de alertas gerais.
- a aprovacao humana continua sendo gate obrigatorio:
pending_approvalnao publica- so
queuedentra no dispatcher - o
approved_payloadpassou a gravar emojis corretamente: config/connect.phpfoi alinhado parautf8mb4admin/data/__CLASS.SQL.phptambem foi alinhado parautf8mb4- a agenda social passou a ser a trilha canonica pos-aprovacao:
- mostra
queue_id - mostra tipo/gatilho humano + codigo tecnico
- mostra horario planejado completo
- mostra texto aprovado
- permite editar texto/midia/agendamento em estados editaveis
- o modal da agenda passou a trabalhar em duas fases:
pending_approval: link para approval quando houver artifactqueued/error/notified: edicao operacional direta- o
facebook_feedcom statusscheduledganhou fluxo deEditar: - cancela o agendamento remoto no Facebook
- volta o item para
queued - libera edicao local no modal
- houve validacao real desse fluxo no caso da
Fanáticos: - o item foi reaberto, reeditado e reagendado com novo rascunho remoto
- o scheduler real da VPS ficou alinhado para:
- planner noturno em
22:00 - dispatcher a cada
10minutos - o pool local de copy deixou de cair sempre em fallback:
- o helper/bridge passou a responder em execucao real
- o soft launch gerou approval real via pool reduzido
Inconsistencias observadas
- houve item orfao de approval:
queue_id = 1028pending_approvalsem artifactpost_1028_*.json- foi necessario regenerar manualmente o artifact para restaurar o link de approval
storyainda estava abrindo approval com 3 opcoes de texto legadas em artifacts antigos.- approvals de
storyainda nao estao no formato canonico final de “midia/link apenas” para todos os casos ja gerados. threads_feedcontinua bloqueado por token invalido no ambiente atual.
Midia e canais
- video-first foi iniciado:
facebook_feedinstagram_feedfacebook_storyinstagram_storythreads_feed- a alternancia semanal de midia foi introduzida com prioridade inicial para video quando existir asset em
/arquivos/pecas/{id}/video. instagram_feedpassou a montar payload deREELSquando houvervideo_url.threads_feedpassou a montar tentativa comvideo_url, mas ainda depende de validacao real porque o canal esta barrado por token/configuracao.storypassou a priorizar video quando existir, sem depender de copy pesada.
Pendencias abertas
- simplificar definitivamente o approval de
storypara: - foco em midia
- foco em link/hint
- sem 3 copys principais
- tratar
pending_approvalsem artifact como erro operacional claro e/ou permitir regeneracao segura. - permitir no modal da agenda:
Aprovar diretoparastory pending_approvalquando a arte ja estiver okEditardescheduledem outros canais depois do caso inicial defacebook_feed
Proximo passo operacional sugerido
- fechar o modo canonico de
storysem copy pesada e regenerar approvals legados quando necessario - corrigir credencial/token do Threads
- falta retry semantico por tipo de falha
5. Contrato de copy
- separar rigidamente 3 camadas:
- instrucao operacional
- ex: “story com foco no clique”
- ex: “usar video se existir”
- direcao criativa
- ex: “urgente, direto, comercial”
- copy final
- somente o texto publicavel
- regra:
- instrucao operacional nao deve entrar no payload bruto da IA como se fosse copy
- direcao criativa pode orientar a IA
- copy final deve sair limpa
6. Approval via WhatsApp
- contrato alvo:
- WhatsApp recebe:
- canal
- peça
- mídia escolhida
- link do approval
- admin:
- aprova 1 opcao
- ou pede rerun
- a tela web continua existindo como fallback/inspecao, nao como centro da operacao
7. Midia
- regra alvo:
- para story, sempre preferir asset em
/arquivos/pecas/{id}/video - se nao houver video valido, usar imagem
- WhatsApp/approval sempre deve explicitar:
- tipo da mídia
- URL do asset
Horario sugerido
- approval de nova peca: assim que a peca entra ou em janela noturna curta
- publish matinal: depois da janela de aprovacao
- desenho sugerido:
run approval: noiterun dispatcher: manhã- definir se a automacao desejada vai nascer:
- no cron diario
- no cadastro da peca
- ou numa fila editorial hibrida
Criterio de aceite
- ficar claro:
- o que hoje e automatico
- o que hoje e manual
- por que a peca nova nao virou pauta automaticamente
- se o botao do Squad esta realmente quebrado ou so sem feedback suficiente