diff --git a/docs/changelog/2026-09-23-c211-followup-oembed.md b/docs/changelog/2026-09-23-c211-followup-oembed.md new file mode 100644 index 00000000..0dfed419 --- /dev/null +++ b/docs/changelog/2026-09-23-c211-followup-oembed.md @@ -0,0 +1 @@ +**C211-FOLLOWUP-OEMBED — link de terceiro: o oEmbed não permite persistir metadados/conteúdo (2026-09-23):** refinamento documental nos planos do C211, sem tocar código. A questão "Peça por link" (`central-conteudos-ingestao.md:105`) e o literal "Adicionar por link" (`:68`) ganharam anotação datada com o limite provado no C212 §Q2: peça de terceiro circula pelo link; o embed pode ser renderizado no front-end; nada de terceiro é extraído, baixado ou persistido (metadados e thumbnail inclusive) — a doc oficial do Instagram oEmbed proíbe "consuming, manipulating, extracting, or persisting the metadata and content … is strictly prohibited" (consultada em 2026-09-22). No impl do C211 (D4), o gatilho "achados do C212" foi marcado como cumprido e a rejeitada B permanece rejeitada; enriquecimento futuro é render-only e pertence ao item do C212 §Q4(d). O aceite `:49` não prometia thumbnail de terceiro (nada a mudar). Código já alinhado (`contentPieceLink.ts` documenta "NO scraping and no oEmbed"). Follow-up entregue no PR com `Closes #1263`; status dos planos do C211 intocado. diff --git a/docs/plans/c211-followup-oembed-terceiro-impl.md b/docs/plans/c211-followup-oembed-terceiro-impl.md new file mode 100644 index 00000000..e59c1b1d --- /dev/null +++ b/docs/plans/c211-followup-oembed-terceiro-impl.md @@ -0,0 +1,97 @@ +# Impl: C211-FOLLOWUP-OEMBED — C211 — link de terceiro: o oEmbed não permite persistir metadados/conteúdo + +Status: aprovado +Atualizado em: 2026-09-23 +Issue: #1263 +Intenção: docs/plans/c211-followup-oembed-terceiro.md +Appetite restante: herdado (~30 min; documentação apenas — sem código/schema/migration/Consent/URL) +Modo: autônomo (`--auto`) — impl plan nasce aprovado pelo agente. + +## Leitura da intenção + +- **Outcome:** quando o C211 for implementado/refinado, a regra chega ao plano dele — peça de terceiro circula **pelo link**; o embed/thumbnail pode ser **renderizado** (front-end); **nada é extraído, baixado ou persistido** de terceiro (metadados inclusive); extração/catalogação de arquivo só da conta própria via Graph API. Sem código. +- **O que NÃO negociar:** + - **Documentação apenas** — nenhum arquivo de `src/`, `tests/`, schema, migration, Consent ou URL. + - **Não apagar o as-built** — anotação datada (convenção pós-entrega; precedente `docs/plans/gate-push-local.md:3`, "ampliado 2026-07-30"). + - **Não flipar status dos planos do C211** (`central-conteudos-ingestao.md:3` rascunho; impl `:3` em execução) — fora do escopo declarado. + - **Não invadir S27/C212** — `central-conteudos-publica.md` e `central-conteudos-varredura-instagram.md` ficam como estão. + - A regra citada vem de `central-conteudos-varredura-instagram.md` §Q2 + doc oficial datada (Instagram oEmbed, consultada em 2026-09-22). +- **O que reavaliar (hipóteses do follow-up):** + - A condicional do aceite (`c211-followup-oembed-terceiro.md:20`) — "se o aceite `:49` ainda prometer thumbnail de terceiro" — é **falsa**: `central-conteudos-ingestao.md:49` não promete thumbnail; **nada a mudar lá** (registrar). + - A precondição "destrava quando o C211 flipar `done`" (`:5,35`): a entrega do C211 está em `main` (commit `cb61cf11`, changelog `2026-09-22-c211.md`), então o refinamento datado é aditivo e não reabre decisão do C211 — sem flip de status. + +## Abordagem recomendada + +```mermaid +flowchart LR + F["C211-FOLLOWUP-OEMBED #1263"] --> I["central-conteudos-ingestao.md\n:68 literal + :105 questão\n(anotação datada)"] + I --> P["central-conteudos-ingestao-impl.md\nD4 :105 · :195 · :229\n(gatilho C212 cumprido)"] + P --> C["docs/changelog/2026-09-23-c211-followup-oembed.md\n+ follow-up: entregue"] + C --> G["pnpm gate:fast → pnpm push → PR Closes #1263"] + F -. fora do escopo .-> S27["S27 :43,73 preview\n(decisão do S27)"] + F -. fora do escopo .-> X["C212 §Q4(d) render-only"] + F -. fora do escopo .-> Y["src/ e tests/\n(já alinhados)"] +``` + +**Opções consideradas:** A) edição **in-place datada** nos dois arquivos do C211 + changelog novo; B) reescrever as seções afetadas; C) doc/plano de refinamento paralelo; D) editar S27/C212/código agora. +**Recomendação:** **A** — o C211 entregou (`cb61cf11`) e o impl é a fonte do as-built; a convenção do repo para edição pós-entrega é acrescentar linha datada sem apagar história (`gate-push-local.md:3`). Citar §Q2 + doc datada fecha o gatilho da rejeitada B do D4 e põe a regra onde quem implementar o link vai ler. +**Rejeitadas:** **B** porque apaga a decisão e o motivo (as-built é histórico e o C211 entregou em `cb61cf11`); **C** porque cria segunda fonte de verdade — o dono é o plano do C211; **D** porque S27 (`:43,73`) e C212 (§Q4(d)) têm decisão e gatilho próprios, e o código já está alinhado (`src/utilities/content/contentPieceLink.ts:21-32` documenta "NO scraping and no oEmbed"; a UI só diz "Mídia de terceiro nunca é baixada") — mexer seria inventar drift. + +### D1 — Onde/como o refinamento aterrissa + +**Opções:** A) anotação datada nos dois planos do C211 (intenção `:68,105`; impl D4 `:105`, Não escopo `:195`, resumo `:229` — ponteiros pós-edição) + changelog; B) reescrever as seções; C) documento paralelo; D) S27/C212/código. +**Recomendação:** **A** — é o único que mantém o dono (o C211), preserva o as-built e fecha o gatilho "achados do C212" na própria D4. +**Rejeitadas:** B (perde histórico), C (duas verdades), D (escopo alheio; sem drift no código). + +### Componentes / mudanças (edição exata) + +1. **`docs/plans/central-conteudos-ingestao.md`** (aplicado) + - `:4` `Atualizado em: 2026-09-22` → `2026-09-23`. + - `:68` (literal "Adicionar por link") — acrescentado ao fim: `**Refinado 2026-09-23 (oEmbed, C212 §Q2):** thumbnail e metadados de terceiro não são extraídos nem persistidos; renderizar o embed de terceiro é do item futuro do C212 §Q4(d) — o C211 segue sem oEmbed.` + - `:105` (questão "Peça por link") — marcador trocado para `_(decidido — refinado no C212; refinamento datado 2026-09-23 — C211-FOLLOWUP-OEMBED, Issue #1263)_` com o texto: `O oEmbed de terceiro só serve para **renderizar** o post embutido — "consuming, manipulating, extracting, or persisting the metadata and content … is strictly prohibited" (doc datada em 2026-09-22; ver §Q2 de docs/plans/central-conteudos-varredura-instagram.md); a extração de arquivo continua só da conta própria via Graph API.` +2. **`docs/plans/central-conteudos-ingestao-impl.md`** (header `:4` já é 2026-09-23) + - `:105` (fim do D4, pós-edição) — parágrafo acrescentado: `**Refinamento 2026-09-23 (C211-FOLLOWUP-OEMBED, Issue #1263):** gatilho "achados do C212" cumprido — oEmbed do Instagram não entrega metadados sem app (probe sem credencial: 403 "(#200) Provide valid app ID") e a doc proíbe persistir metadados/conteúdo; oEmbed do YouTube dá só título/capa/embed. A rejeitada **B permanece rejeitada**; enriquecimento futuro é render-only e pertence ao item descrito em §Q4(d) da varredura.` + - `:195` (Não escopo, pós-edição) — acrescentado ao bullet: `**Refinado 2026-09-23:** o item futuro do C212 §Q4(d) já nasce render-only; o C211 segue sem oEmbed.` + - `:229` (resumo D4, pós-edição) — `sem oEmbed (C212 decide)` → `sem oEmbed (C212 decidiu 2026-09-22 — render-only, nada de terceiro persistido; refinamento 2026-09-23)`. +3. **`docs/plans/c211-followup-oembed-terceiro.md`** — `:3` `Status: rascunho` → `Status: entregue (2026-09-23 — refinamento datado nos planos do C211; sem código)`; `:4` → `2026-09-23`; `:5` → `Issue: #1263`. +4. **`docs/changelog/2026-09-23-c211-followup-oembed.md`** (novo, uma entrada curta; nunca editar o agregado/HISTORY nem o changelog do C211): `**C211-FOLLOWUP-OEMBED — link de terceiro: o oEmbed não permite persistir metadados/conteúdo (2026-09-23):** refinamento documental nos planos do C211, sem tocar código. A questão "Peça por link" (`central-conteudos-ingestao.md:105`) e o literal "Adicionar por link" (`:68`) ganharam anotação datada com o limite provado no C212 §Q2: peça de terceiro circula pelo link; o embed pode ser renderizado no front-end; nada de terceiro é extraído, baixado ou persistido (metadados e thumbnail inclusive) — a doc oficial do Instagram oEmbed proíbe "consuming, manipulating, extracting, or persisting the metadata and content … is strictly prohibited" (consultada em 2026-09-22). No impl do C211 (D4), o gatilho "achados do C212" foi marcado como cumprido e a rejeitada B permanece rejeitada; enriquecimento futuro é render-only e pertence ao item do C212 §Q4(d). O aceite `:49` não prometia thumbnail de terceiro (nada a mudar). Código já alinhado (`contentPieceLink.ts` documenta "NO scraping and no oEmbed"). Follow-up entregue no PR com `Closes #1263`; status dos planos do C211 intocado.` + +- **Migration:** nenhuma. **Access/Consent:** N/A (sem código; nenhuma chave nova). **UI:** Impeccable A — N/A. + +### Dados → forma (se aplicável) + +N/A — item documental, sem superfície de dado. + +## Fases verificáveis + +1. **Refinamento da intenção (~10 min):** os 3 pontos em `central-conteudos-ingestao.md`. Verificação: `grep -n "Refinado 2026-09-23"` = 2 ocorrências; `git diff` só acrescenta (exceto o marcador `refinar`→`refinado` e o `Atualizado em: 2026-09-22`→`2026-09-23`). +2. **Refinamento do impl (~10 min):** os 3 pontos em `central-conteudos-ingestao-impl.md`. Verificação: `grep -n "(C212 decide)"` = 0; nota do D4 presente. +3. **Fechamento (~10 min):** follow-up (`Status`/`Issue`/data) + changelog novo + `pnpm gate:fast` + `pnpm push` + PR ready base `main` com `Closes #1263` (o changelog fora de `docs/plans/` evita o guard plans-only; incluir no mesmo PR). No merge o workflow flipa a Issue; comentar o desfecho em uma linha. + +## Rabbit holes / Não escopo (engenharia) + +- **S27 (`central-conteudos-publica.md:43,73`)** — promete "preview (título + imagem)" para toda peça publicada; peça-link não tem arquivo. A decisão de placeholder é do S27 (gatilho: implementação do S27); não editar agora. +- **C212 §Q4(d)** — o item futuro já nasce render-only; não é deste follow-up. +- **Código** — `contentPieceLink.ts:21-32` e a UI já documentam a regra; alterar seria drift fabricado. +- **Reescrever as-built / flipar status** — proibido; só anotação datada. +- **Headers do C211 stale** (`central-conteudos-ingestao.md:3` "rascunho"; impl `:3` "em execução" com a Issue #1254 fechada) — pré-existente, fora do escopo declarado; deferido com gatilho: próxima edição do plano do C211 (ou início do item §Q4(d)). +- **Editar o changelog do C211 ou o agregado** — o dono novo é `docs/changelog/2026-09-23-c211-followup-oembed.md`. + +## Riscos e mitigação + +- **Escopo vazar para S27/C212:** não escopo nomeado; diff restrito aos 4 arquivos. +- **"Refinar" virar reescrita:** regra "só acrescenta linha datada"; `git diff` esperado quase só adições. +- **Doc-only sem teste:** verificação por `grep -n` das strings-alvo + `pnpm gate:fast`; nenhum comportamento tocado. +- **`Closes #1263` × guard plans-only** (`scripts/check-plans-only-pr-closes.mjs`): o changelog fora de `docs/plans/` faz o diff não ser plans-only — changelog no mesmo PR é requisito. +- **Editar plano "em execução":** aditivo/datado; precondição satisfeita pela entrega `cb61cf11`; nenhuma decisão do C211 reaberta. + +## Aceite de engenharia + +- [ ] Aceite da intenção coberto: regra (link/render/nada persistido) no plano **e** no impl do C211, citando §Q2 + doc datada; nada além de documentação. +- [ ] Invariantes AGENTS/engineering-standards: sem código/schema/migration/Consent/URL; migrations existentes intocadas; changelog no arquivo novo. +- [ ] Testes de domínio: N/A (nenhum write path/access muda); verificação por grep + gate. +- [ ] `pnpm gate:fast` verde; PR ready com `Closes #1263`. + +## Self-score + +**Self-score decision-quality: 5/5.** (1) A decisão de engenharia (onde/como aterrissa) tem opções + recomendação + rejeitadas explícitas (D1). (2) Cabe no appetite herdado (~30 min; 4 arquivos, zero código). (3) Rabbit holes nomeados (S27, C212, código, reescrita, agregado). (4) Depth check: reusa a convenção de anotação datada e o dono do changelog — nenhum mecanismo novo. (5) Outcome preservado: a engenharia não reescreve o aceite nem invade S27/C212. diff --git a/docs/plans/c211-followup-oembed-terceiro.md b/docs/plans/c211-followup-oembed-terceiro.md index 36a0663a..3dac7396 100644 --- a/docs/plans/c211-followup-oembed-terceiro.md +++ b/docs/plans/c211-followup-oembed-terceiro.md @@ -1,8 +1,8 @@ # C211-FOLLOWUP-OEMBED — C211 — link de terceiro: o oEmbed não permite persistir metadados/conteúdo -Status: rascunho -Atualizado em: 2026-09-22 -Issue: (registrada via `pnpm agent:register`; destrava quando o C211 flipar `done`) +Status: entregue (2026-09-23 — refinamento datado nos planos do C211; sem código) +Atualizado em: 2026-09-23 +Issue: #1263 Priority: P2 Impeccable: A — N/A sem UI Design UI: N/A — sem UI @@ -11,7 +11,7 @@ Responsável: — ## Intenção -A investigação do C212 (Issue #1256, achados em `docs/plans/central-conteudos-varredura-instagram.md` §Q2) provou que o oEmbed do Instagram só serve para **renderizar** o post embutido (visão de front-end): "consuming, manipulating, extracting, or persisting the metadata and content … is strictly prohibited" (doc datada em 2026-09-22; probe sem credencial devolveu 403 `Provide valid app ID` ao pedir metadados). O plano do C211 (Issue #1254, `in-progress`) ainda carrega a hipótese B ("entra com thumbnail/embed quando o caminho oficial permitir") na questão em aberto "Peça por link: circula ou é baixada?" — interpretável como persistir thumbnail de terceiro, o que a plataforma proíbe. +A investigação do C212 (Issue #1256, achados em `docs/plans/central-conteudos-varredura-instagram.md` §Q2) provou que o oEmbed do Instagram só serve para **renderizar** o post embutido (visão de front-end): "consuming, manipulating, extracting, or persisting the metadata and content … is strictly prohibited" (doc datada em 2026-09-22; probe sem credencial devolveu 403 `(#200) Provide valid app ID` ao pedir metadados). A hipótese B ("entra com thumbnail/embed quando o caminho oficial permitir") vivia na questão do **C212** (`central-conteudos-varredura-instagram.md:79`) — o plano do C211 (Issue #1254) nunca a carregou: sua questão "Peça por link: circula ou é baixada?" já dizia "mídia de terceiro nunca é baixada" e ficou marcada "_(decidido — refinar no C212)_", interpretável como persistir thumbnail de terceiro, o que a plataforma proíbe. _(Correção 2026-09-23 — Issue #1263: atribuição corrigida; a premissa original apontava a hipótese B para o plano do C211.)_ Este item garante que, quando o C211 for implementado/refinado, a regra chegue ao plano dele: peça de terceiro circula **pelo link**; o embed pode ser renderizado; **nada é extraído, baixado ou persistido** de terceiro; catalogação/extração de arquivo só da conta própria via Graph API. @@ -19,6 +19,7 @@ Este item garante que, quando o C211 for implementado/refinado, a regra chegue a - Ao destravar (C211 `done`), aplicar no plano/impl do C211 a linha de refinamento na questão "Peça por link" (`docs/plans/central-conteudos-ingestao.md:105`) e, se o aceite `:49` ainda prometer thumbnail de terceiro, alinhar o texto ao limite do oEmbed — citando `docs/plans/central-conteudos-varredura-instagram.md` §Q2. - Nada além de documentação: sem código, sem schema, sem migration, sem Consent, sem URL. +- _(Fechamento 2026-09-23 — Issue #1263)_ Aplicado: a regra entrou em `docs/plans/central-conteudos-ingestao.md:68,105` e no D4 do impl (`central-conteudos-ingestao-impl.md:105,195,229`). O aceite `:49` do C211 **não** prometia thumbnail de terceiro — nada a alinhar lá (condicional do aceite acima resolvida como falsa). ## Dados da decisão (literais) diff --git a/docs/plans/central-conteudos-ingestao-impl.md b/docs/plans/central-conteudos-ingestao-impl.md index cccb55bd..35959186 100644 --- a/docs/plans/central-conteudos-ingestao-impl.md +++ b/docs/plans/central-conteudos-ingestao-impl.md @@ -102,6 +102,8 @@ flowchart LR **Recomendação:** **A** — cumpre a decisão do gate ("mídia extraída e catalogada quando houver caminho oficial") sem scraping e sem baixar mídia de terceiro; a normalização da URL (hosts IG/YT, path, remoção de `igsh`/`utm_*`, forma canônica) é pura e testável, com precedente de parse de host do YouTube em `src/lib/speechVod.ts:138`. **Dedup:** `sourceUrl` normalizada com **unique index** (nullable) + probe na action antes de criar; violação de corrida mapeada para a mesma mensagem segura ("Esta peça já está na Central.") — sem duas peças para o mesmo link. Título inicial identificável (`Instagram · ` / `YouTube · `), substituído pela catalogação (D5) enquanto não curado. **Rejeitadas:** **B** porque oEmbed não entrega arquivo (só embed/thumbnail) e o C212 é quem vai recomendar o mecanismo de enriquecimento — implementar agora seria decidir no lugar dele (gatilho: achados do C212); **C** porque contraria a decisão registrada no gate. +**Refinamento 2026-09-23 (C211-FOLLOWUP-OEMBED, Issue #1263):** gatilho "achados do C212" cumprido — oEmbed do Instagram não entrega metadados sem app (probe sem credencial: 403 "(#200) Provide valid app ID") e a doc proíbe persistir metadados/conteúdo; oEmbed do YouTube dá só título/capa/embed. A rejeitada **B permanece rejeitada**; enriquecimento futuro é render-only e pertence ao item descrito em §Q4(d) da varredura. + ### D5 — Shape da catalogação automática **Opções:** A) gazetteer puro (`classifySpeechByGazetteer`, `src/lib/speechGazetteer.ts:449-476`) + refinamento validado reusando `classifySpeech` (`src/utilities/speech/speechClassifier.ts:76-136`) + **nova** sugestão de título/descrição com prompt de peça (`suggestContentPieceMetadata`, mesmo contrato never-throws/fallback determinístico de `speechCutMetadata.ts:68-114`); B) generalizar `suggestSpeechCutMetadata` para a peça; C) só gazetteer, sem LLM. @@ -190,7 +192,7 @@ N/A — superfície interna de trabalho, sem KPI, agregado ou série; a intenç - **Fila/worker genérico, retomada, chunking de upload, retry global, tempo real** — cortados pela intenção; o lote é fan-out do cliente + estado por peça. - **Entidade de lote / token HMAC / batch collection** — rejeitada em D3. - **Segmentos com timestamp, diarização AssemblyAI, faceta de pessoa** — vocabulário e mecanismos do C199; não copiar cego (D2). -- **oEmbed / scraping / download de mídia de terceiro / varredura do perfil** — o mecanismo é o C212; aqui só o link manual e a conta própria por Graph API. +- **oEmbed / scraping / download de mídia de terceiro / varredura do perfil** — o mecanismo é o C212; aqui só o link manual e a conta própria por Graph API. **Refinado 2026-09-23:** o item futuro do C212 §Q4(d) já nasce render-only; o C211 segue sem oEmbed. - **Página pública, filtros públicos, OG, share, `SHARE_LINK_RESERVED_SLUGS`, serving público** — S27; aqui só `status`/`slug`/`media` + a tag de revalidação. - **Gerar thumbnail/poster das peças, player com trechos, editor de mídia, gerador de card** — o design usa placeholder de asset; preview real é o arquivo na ficha. - **Delete de peça pela Central** — não está nos literais/design; o admin remove se preciso. Gatilho de revisitação: se a assessoria pedir "apagar peça", item curto próprio (com o mesmo padrão do delete de gravação, `actions/recording.ts:232-269`). @@ -224,7 +226,7 @@ N/A — superfície interna de trabalho, sem KPI, agregado ou série; a intenç - **D1 — Upload/serving:** collection **nova** `contentMedia` (privada, no S3) + rota autenticada sob `/campanha`; S27 serve o publicado pela mesma mídia, sem segunda cópia. Rejeitadas: `media` (rascunho vazaria) e reuso de `recordingMedia`/`reelMedia` (acopla donos). - **D2 — Modelo:** **uma** collection `contentPiece` + `contentMedia`, sem segmentos; enums pt-BR (`video|foto|texto|audio|card`, `rascunho|publicado`, `processando|pronto|falhou`, `extraindo|transcrevendo|catalogando|salvando`); `topics` reusa `SPEECH_TOPICS`; cidade única + região derivada; `searchText` com trigram à mão; migration `20260922__add_content_piece`. Rejeitadas: `contentPieceSegment` (sem consumidor) e duas collections arquivo/link (duas verdades). - **D3 — Pipeline/lote:** 1 request/arquivo raw-body (padrão C199) + fan-out no cliente (≤ 2, ≤ 50 arquivos, 4 GiB/arquivo) + `after()` + reaper 60 min + retry condicional; sem entidade de lote; `foto|card` nascem prontos. Rejeitadas: batch collection/token HMAC (estado a mais) e multipart (buffer/isolamento). -- **D4 — Link:** extração só pela Graph API da conta própria (listar mídia e casar permalink) com fallback peça-link; YouTube/terceiros só link; `sourceUrl` normalizada e **única**; sem oEmbed (C212 decide). Rejeitadas: oEmbed agora (não entrega arquivo; invade o C212) e só-link (contraria o gate). +- **D4 — Link:** extração só pela Graph API da conta própria (listar mídia e casar permalink) com fallback peça-link; YouTube/terceiros só link; `sourceUrl` normalizada e **única**; sem oEmbed (C212 decidiu 2026-09-22 — render-only, nada de terceiro persistido; refinamento 2026-09-23). Rejeitadas: oEmbed agora (não entrega arquivo; invade o C212) e só-link (contraria o gate). - **D5 — Catalogação:** gazetteer puro + `classifySpeech` reusado + `suggestContentPieceMetadata` novo (never-throws/fallback); cidade só quando inequívoca; instituição só com match de catálogo. Rejeitadas: generalizar o prompt de corte (semântica errada) e só gazetteer (sem título/descrição automáticos). - **D6 — Concorrência job×curadoria:** `curatedFields` por campo + releitura fresca na transação; o job só escreve campo não curado. Rejeitadas: last-write-wins (clobber) e congelar tudo após editar (mata o enriquecimento). - **D7 — Slug:** gerado no **primeiro publish** do título vigente, único sob advisory lock, imutável depois; despublicar preserva. Rejeitadas: no create (URL ruim) e re-derivado (quebra link). diff --git a/docs/plans/central-conteudos-ingestao.md b/docs/plans/central-conteudos-ingestao.md index a5a45a92..cbf6186e 100644 --- a/docs/plans/central-conteudos-ingestao.md +++ b/docs/plans/central-conteudos-ingestao.md @@ -1,7 +1,7 @@ # C211 — Central de Conteúdos — enviar, transcrever e catalogar as peças de campanha (interno) Status: rascunho -Atualizado em: 2026-09-22 +Atualizado em: 2026-09-23 Issue: #1254 Priority: P1 Impeccable: C — fluxo novo na vertical `/campanha/comunicacao` @@ -65,7 +65,7 @@ Este item é o lado interno: a assessoria envia peças em lote (ou cola um link - **Processamento:** "Processando" | "Pronto" | "Falhou" (com "Reprocessar"). - **Envio em lote:** vários arquivos numa vez → uma peça por arquivo; falha de um não derruba os outros. - **Catalogação automática (revisável):** título, descrição, tipo, temas, cidade, região, instituição, data, duração, transcrição/texto. -- **Adicionar por link:** Instagram/YouTube (colar link) — a peça entra com a mídia extraída e catalogada quando houver caminho oficial; sem caminho oficial, circula pelo link e o arquivo pode ser anexado pela assessoria. Mídia de terceiro nunca é baixada. +- **Adicionar por link:** Instagram/YouTube (colar link) — a peça entra com a mídia extraída e catalogada quando houver caminho oficial; sem caminho oficial, circula pelo link e o arquivo pode ser anexado pela assessoria. Mídia de terceiro nunca é baixada. **Refinado 2026-09-23 (oEmbed, C212 §Q2):** thumbnail e metadados de terceiro não são extraídos nem persistidos; renderizar o embed de terceiro é do item futuro do C212 §Q4(d) — o C211 segue sem oEmbed. - **Varredura automática do Instagram:** investigação aprovada no gate → **C212** (viabilidade com API oficial × scraping; o C211 aplica o mecanismo que ela recomendar). Scraping não é mecanismo — nem no C211 nem no C212. - **Acervo de falas e cortes:** fora por produto; entram só se a assessoria adicionar manualmente como peça. @@ -102,7 +102,7 @@ Este item é o lado interno: a assessoria envia peças em lote (ou cola um link - **Varredura automática do Instagram?** **Decidido no gate:** investigar agora, via **C212** (viabilidade com a API oficial; scraping fora). O C211 mantém o link manual como caminho e aplica o mecanismo que o C212 recomendar. _(decidido)_ - **Peça nasce "Rascunho" ou "Publicado"?** **Opções:** A) "Rascunho" por padrão, publicar é gesto explícito | B) publica no envio | C) escolher no envio. **Recomendação:** A — evita material sem revisão no ar e deixa o kill switch com lugar claro. _(assumido — validar com produto)_ -- **Peça por link: circula ou é baixada?** **Decidido no gate:** extrair e catalogar quando houver caminho oficial (conteúdo próprio); sem caminho oficial, circular pelo link. **Corte que permanece:** mídia de terceiro nunca é baixada. _(decidido — refinar no C212)_ +- **Peça por link: circula ou é baixada?** **Decidido no gate:** extrair e catalogar quando houver caminho oficial (conteúdo próprio); sem caminho oficial, circular pelo link. **Corte que permanece:** mídia de terceiro nunca é baixada. _(decidido — refinado no C212; refinamento datado 2026-09-23 — C211-FOLLOWUP-OEMBED, Issue #1263)_ O oEmbed de terceiro só serve para **renderizar** o post embutido — "consuming, manipulating, extracting, or persisting the metadata and content … is strictly prohibited" (doc datada em 2026-09-22; ver §Q2 de `docs/plans/central-conteudos-varredura-instagram.md`); a extração de arquivo continua só da conta própria via Graph API. - **Limite do envio em lote?** **Opções:** A) limite generoso com aviso claro acima dele | B) sem limite | C) limite baixo (≈10). **Recomendação:** A — o caso real é despejo de material de um evento; o valor é decisão da implementação. _(assumido — validar com produto)_ ## Referências