Cerebro Studio · Backlog · Changelog
RioNoTeatro • /www/wwwroot/rionoteatro.com.br/docs/BACKLOG.md
Abrir Studio Projeto externo em modo read-only; encaminhamento permitido, escrita bloqueada.

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)

Detalhe do BK Selecionado

/www/wwwroot/rionoteatro.com.br/docs/backlog/BK-253-story-composer-meta-automacao.md • 2026-04-11T08:33:28.854Z

BK-253 - Automacao do Story Composer Meta com link da peça

Objetivo

  • criar uma frente separada da automação social atual para operar o story_composer do Meta Business Suite
  • automatizar o preenchimento do composer para stories Facebook + Instagram
  • preencher automaticamente o campo Link da web com a URL pública canônica da peça
  • manter a frente isolada do fluxo já estável de:
  • facebook_feed
  • instagram_feed
  • threads_feed
  • nova peça
  • ideias/copies do Squad

Motivação operacional

  • o fluxo atual por API publica stories, mas a regra histórica do projeto já reconhece limite para sticker/link via API pública
  • na tela real do composer do Meta Business Suite foi validado que existe:
  • escolha de Facebook e Instagram no mesmo agendamento
  • campo Link da web
  • agendamento futuro por data/hora
  • o link desejado nesta frente é a URL pública da peça:
  • https://rionoteatro.com.br/<slug>
  • URL-base atualmente validada pelo operador no ambiente real:
  • https://business.facebook.com/latest/story_composer/?asset_id=105537999536136&business_id=158453615039152
  • parâmetros já conhecidos desta conta:
  • asset_id = 105537999536136
  • business_id = 158453615039152
  • leitura atual:
  • este link serve como base canonica do MVP 1 para abrir o composer
  • a versão mínima com apenas asset_id + business_id é a preferida para a automação
  • o preenchimento automatizado posterior deve tratar esses parâmetros como configuráveis, não hardcoded irreversíveis
  • validação humana desta rodada: a URL mínima abriu corretamente no ambiente real

Decisão de arquitetura desta frente

  • não acoplar esta automação ao pipeline atual de feed/texto
  • não reescrever redes_sociais.php para virar o orquestrador principal do composer
  • sim reaproveitar, quando fizer sentido:
  • contexto da peça
  • agenda/fila social
  • status operacionais
  • runtime de prova visual
  • infraestrutura de browser automation já existente no projeto/Cérebro

Regras canônicas

  • o campo Link da web do composer deve receber a URL pública canônica da peça
  • formato:
  • https://rionoteatro.com.br/<slug-da-peca>
  • nesta frente, não usar:
  • https://rionoteatro.com.br/go/<slug>

2. Separação de escopo

  • esta frente não substitui o fluxo atual de feed
  • esta frente não substitui a criação social de nova peça
  • esta frente não substitui as ideias/copies do Squad
  • o composer do Meta deve ser tratado como canal/browser-flow separado

3. Natureza da automação

  • a automação do composer é best effort
  • não é API pública com contrato estável
  • depende de:
  • sessão autenticada no Business Suite
  • DOM/UI interna do Meta
  • parâmetros como asset_id e business_id
  • portanto precisa de:
  • fallback explícito
  • prova visual
  • registro claro de erro

Estado conhecido antes da implementação

  • docs internos do RNT já registravam que story com link ficava melhor no modo manual/notificado
  • o cron atual de stories está inconsistente com essa leitura porque em alguns pontos ainda ignora o manual_notified e segue para autopublicação
  • o composer real mostrou:
  • seleção de Facebook + Instagram
  • agendamento de ambos
  • Link da web

Primeira entrega sugerida

MVP 1

  • criar uma trilha própria de story composer meta
  • receber:
  • peça
  • slug
  • mídia final
  • data/hora
  • destino FB/IG
  • abrir o composer do Meta
  • abrir o composer a partir da URL-base validada com asset_id e business_id
  • preencher:
  • mídia
  • link da peça
  • data/hora
  • seleção FB/IG
  • gerar:
  • screenshot/prova
  • status final
  • erro operacional detalhado quando falhar

Estado após a primeira rodada técnica

  • já existe uma tela admin separada:
  • admin/modulos/campanhas/story_composer_meta.php
  • já existe um helper/config separado:
  • admin/modulos/campanhas/story_composer_meta_helper.php
  • já existe um atalho discreto no módulo de campanhas:
  • admin/modulos/campanhas/index.php

O que essa rodada já entrega

  • seleção manual de peça ativa
  • leitura da URL pública canônica da peça
  • exibição da URL-base validada do composer
  • seleção inicial de data/hora
  • flags de destino para Facebook e Instagram
  • detecção automática de mídia em:
  • /arquivos/pecas/{id}/video
  • /arquivos/pecas/{id}/large
  • /arquivos/pecas/{id}/media
  • payload resumido do MVP para a futura automação do browser flow
  • helper já ajustado para gerar a URL mínima do composer apenas com:
  • asset_id
  • business_id
  • tela já exibe:
  • input payload do browser runner
  • comando exato do browser_profile_runner.js
  • botão para executar a prova segura do browser control
  • a tela bloqueia a prova quando a peça não tiver media_url detectado
  • a listagem e o fetch_piece agora seguem o mesmo filtro da vitrine pecas.php
  • integração com profile dedicado no Cérebro:
  • rnt-meta-story-composer-schedule-proof-v1
  • storage state renovado com captura local e importado para o runtime web:
  • /tmp/cerebro-browser-storage-state-www/facebook-rnt.json
  • comando web do runner validado com:
  • CEREBRO_BROWSER_EXECUTABLE=/usr/bin/google-chrome-stable
  • upload real da mídia já comprovado no composer:
  • clique em Adicionar foto/vídeo
  • abertura do filechooser
  • setFiles() concluído
  • preview renderizado no composer
  • o Cérebro ganhou suporte novo no executor para:
  • wait_for_filechooser
  • hover

O que ainda não entrega

  • automação real do browser preenchendo os campos do Meta
  • execução autenticada com prova visual já foi ligada na UI, mas ainda depende de validação humana do run real
  • persistência própria de jobs/estado do composer
  • reconciliação final com manual_notified da fila social
  • submissão/agendamento automático no próprio composer
  • clique final de Programar/Publicar

Estado operacional confirmado em 2026-04-11 04:16 -03

  • o storage state antigo não servia para business.facebook.com; foi necessário:
  • capturar state novo localmente
  • importar para /tmp/cerebro-browser-storage-state-www/facebook-rnt.json
  • no contexto do php-fpm, chromium-browser via snap falha; a execução correta ficou:
  • /usr/bin/google-chrome-stable
  • o upload não usa input[type=file] no DOM:
  • o Meta dispara filechooser nativo
  • por isso o profile migrou de set_input_files para wait_for_filechooser
  • após o upload, o composer exibe com segurança:
  • Programar
  • Compartilhar agora
  • Story do Facebook
  • Story do Instagram
  • campos de data/hora quando entra em Programar
  • leitura humana do operador:
  • depois que a mídia sobe, aparecem Editar, Adicionar link e lixeira no preview
  • depois de clicar em Adicionar link, aparecem:
  • Ver link da loja
  • Link da web
  • Sem link de deslizar para cima
  • bloqueio atual do browser flow:
  • em headless, o runner ainda não revelou Adicionar link no DOM automatizado
  • o gargalo mais atual está em acertar o alvo/estratégia do hover ou trigger do overlay do preview da mídia
  • o fluxo de schedule já é conhecido, mas o submit final azul Programar ainda não foi automatizado porque a frente está em modo prova

Estado operacional confirmado em 2026-04-11 04:50 -03

  • o browser flow passou ponta a ponta no ambiente real do composer
  • a estratégia vencedora combinou:
  • upload por filechooser
  • fallback por coordenada para o fluxo de link:
  • Adicionar foto/vídeo em x=495, y=439
  • Adicionar link
  • Link da web
  • foco no campo do link
  • Tab x3 + Enter no botão Aplicar para salvar o link
  • o agendamento em headless passou a usar os seletores reais do DOM:
  • data:
  • xpath=(//input[@placeholder='dd/mm/aaaa'])[1|2]
  • hora:
  • xpath=(//input[@role='spinbutton' and @aria-label='horas'])[1|2]
  • minutos:
  • xpath=(//input[@role='spinbutton' and @aria-label='minutos'])[1|2]
  • o helper do RNT agora deriva:
  • schedule_date_br
  • schedule_hour
  • schedule_minute
  • o submit final azul Programar foi automatizado por seletor explícito do footer:
  • [data-surface$='stories_composer:footer/lib:stories_composer:publish_button']
  • sequência humana confirmada do fluxo de link:
  • click 1: x=495, y=439 em Adicionar foto/vídeo
  • click 2: x=715, y=300 em Adicionar link
  • click 3: x=348, y=395 em Link da web
  • click 4: x=409, y=438 para focar o campo do link
  • depois:
  • Tab
  • Tab
  • Tab
  • Enter no botão Aplicar
  • sequência operacional confirmada do schedule após clicar em Programar:
  • Tab 1: campo de data do Facebook
  • Tab 2: campo de hora do Facebook
  • Tab 3: campo de minutos do Facebook
  • Tab 4: campo de data do story do Instagram
  • Tab 5: campo de hora do story do Instagram
  • Tab 6: campo de minutos do story do Instagram
  • Tab x5 adicionais: botão final Programar no fluxo humano/manual
  • run real validado nesta rodada:
  • data alvo: 2026-04-15
  • horário alvo: 04:55
  • run id:
  • rnt-meta-story-composer-schedule-proof-v1-1775893826123
  • artefatos:
  • /tmp/cerebro-browser-runs-www/rnt-meta-story-composer-schedule-proof-v1-1775893826123/

Estado operacional confirmado em 2026-04-11 05:28 -03

  • o problema da mídia não era path
  • o arquivo original da peça estava em:
  • HEVC / H.265
  • 1080x1920
  • ~37 MB
  • no Meta Story Composer esse arquivo ficava preso em:
  • Carregando mídia
  • a hipótese foi confirmada ao gerar derivado:
  • H.264
  • yuv420p
  • AAC
  • ~7.9 MB
  • com a versão H.264 o Carregando mídia some e o composer avança

Decisão de implementação

  • não abrir cron paralelo novo
  • integrar a geração do derivado ao cron social já existente:
  • admin/cron/sync_facebook_events.php
  • o próprio cron agora pré-gera e reutiliza vídeo story Meta-ready ao resolver o asset de story
  • a tela do composer também usa a mesma lógica:
  • primeiro procura o derivado já gerado
  • se não existir, gera sob demanda

Arquivo derivado canônico

  • diretório:
  • /www/wwwroot/rionoteatro.com.br/uploads/social_meta_assets/video/
  • URL pública:
  • https://rionoteatro.com.br/uploads/social_meta_assets/video/
  • helper compartilhado:
  • admin/modulos/campanhas/meta_story_video_helper.php

Política atual

  • cron social:
  • gera/reusa derivado H.264/AAC para vídeo story
  • faz limpeza de antigos nesse diretório
  • tela do composer:
  • prefere media.path local do derivado
  • só cai em URL se não houver path local válido

Write set esperado para a implementação

  • admin/modulos/campanhas/story_composer_meta_helper.php
  • admin/modulos/campanhas/story_composer_meta.php
  • admin/modulos/campanhas/index.php
  • docs/backlog/BK-253-story-composer-meta-automacao.md
  • docs/documentacao_tecnica/campanha_track/STORY_COMPOSER_AUTOMACAO_META.md

Riscos assumidos

  • mudança de UI do Meta sem aviso
  • perda de sessão/autenticação
  • checkpoint/2FA
  • anti-bot
  • falha silenciosa do browser flow

Critério de sucesso do BK

  • automação documentada e separada do fluxo atual
  • prova visual de execução
  • uso da URL pública da peça no campo de link
  • fallback claro sem quebrar feed/Squad/nova peça