From 5097e8cb90bc7fa4c8c1c80814fffe7a092b677d Mon Sep 17 00:00:00 2001 From: Francisco Solla Date: Tue, 15 Sep 2026 06:50:30 -0300 Subject: [PATCH] =?UTF-8?q?docs(plan):=20C166=20+=20C167=20+=20C168=20?= =?UTF-8?q?=E2=80=94=20compartilhar=20trechos=20do=20acervo=20(link,=20cor?= =?UTF-8?q?te=20e=20biblioteca)=20(Related=20#1013,=20#1014,=20#1015)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...166-compartilhar-trecho-link-ui-draft.html | 386 ++++++++++ docs/plans/c166-compartilhar-trecho-link.md | 105 +++ .../c167-cortar-trecho-publicar-ui-draft.html | 579 ++++++++++++++ docs/plans/c167-cortar-trecho-publicar.md | 101 +++ .../c168-biblioteca-cortes-ui-draft.html | 705 ++++++++++++++++++ docs/plans/c168-biblioteca-cortes.md | 108 +++ 6 files changed, 1984 insertions(+) create mode 100644 docs/plans/c166-compartilhar-trecho-link-ui-draft.html create mode 100644 docs/plans/c166-compartilhar-trecho-link.md create mode 100644 docs/plans/c167-cortar-trecho-publicar-ui-draft.html create mode 100644 docs/plans/c167-cortar-trecho-publicar.md create mode 100644 docs/plans/c168-biblioteca-cortes-ui-draft.html create mode 100644 docs/plans/c168-biblioteca-cortes.md diff --git a/docs/plans/c166-compartilhar-trecho-link-ui-draft.html b/docs/plans/c166-compartilhar-trecho-link-ui-draft.html new file mode 100644 index 00000000..66104acd --- /dev/null +++ b/docs/plans/c166-compartilhar-trecho-link-ui-draft.html @@ -0,0 +1,386 @@ + + + + + + + UI draft — C166: selecionar trecho e compartilhar por link + + +
+

+ UI draft — Acervo: selecionar trecho e compartilhar por link (C166) +

+

+ A assessoria de comunicação marca um trecho da fala no player e manda o link do YouTube já + abrindo no ponto escolhido (copiar ou WhatsApp), com o intervalo escrito na mensagem. +

+

+ Cinza = estrutura existente · acento = novo neste item · + barras cinza = conteúdo não especificado. Cenas estáticas: sem interação, sem dados reais. +

+ + +
+

+ Cena 1 · desktop (~1280px) — detalhe com barra de seleção (alças início/fim, duração) + + Compartilhar +

+
+
+

← Voltar ao acervo

+

BREVES COMUNICAÇÕES

+

+ 11/08/2026 · 18:48 · 4min25s · Presidiu: [placeholder] +

+ +
+
+
+
+ ▶ +
+

+ Vídeo da sessão no YouTube +

+
+ +
+
+ + Selecionar trecho — ativo + + + Trecho: + 00:43 → 02:10 + · + 1min27s + +
+ +
+
+
+
+
+ + início + + + fim + +
+
+ 00:00 + 00:43 + 02:10 + 04:25 +
+

+ Clique nas frases: o limite encaixa no segmento (ímã). Arraste as alças para o + ajuste fino. Mínimo 5s · máximo 3min — a duração aparece durante a seleção. +

+
+ +
+ + + +
+ +

+ Transcrição (clique nas frases para marcar o trecho) +

+
+
+ 00:00 + … agradeço, Presidente. … +
+
+ 00:43 + … o acesso a medicamentos na Bahia precisa chegar a quem mora no interior + … +
+
+ 02:10 + … e é preciso garantir o financiamento tripartite … +
+
+ 03:31 + … muito obrigado, Presidente. … +
+
+
+ + +
+
+
+
+ + +
+

+ Cena 2 · popover de compartilhamento aberto — "Copiar link" (estado "Link copiado") e + "Enviar no WhatsApp" +

+
+
+

BREVES COMUNICAÇÕES · trecho 00:43 → 02:10

+
+ + + +
+ +
+
+ ✓ + Link copiado +
+
+ → + Enviar no WhatsApp +
+

+ Trecho de BREVES COMUNICAÇÕES (11/08/2026): de 00:43 a 02:10
+ youtube.com/watch?v=[id]&t=2634 +

+
+ +

+ Antes do clique a primeira opção lê "Copiar link"; o feedback volta sozinho depois de + alguns segundos. O link abre o vídeo em 00:43 da fala (2634s na sessão); o fim vai + escrito na mensagem. +

+
+
+
+ + +
+

+ Cena 3 · fala sem YouTube (só VOD) — sem opção de link + aviso honesto (seleção + preservada) +

+
+
+

← Voltar ao acervo

+

BREVES COMUNICAÇÕES

+

11/08/2026 · 4min25s · só VOD (sem YouTube)

+ +
+
+
+ ▶ +
+

Assistir o trecho

+

+ O trecho deste vídeo é gerado pela Câmara dos Deputados. +

+
+ +
+ + +
+ +
+

+ Compartilhar por link exige o vídeo no YouTube +

+

+ Esta fala não tem vídeo no YouTube — não há link externo que abra no ponto. Você + ainda pode baixar o MP4 ou abrir a fonte oficial, e a seleção de trecho continua + disponível. +

+
+
+ +

Transcrição

+
+
+ 00:00 + … agradeço, Presidente. … +
+
+ 00:43 + … o acesso a medicamentos na Bahia … +
+
+ +

+ Fonte: Câmara dos Deputados · CC BY 4.0 +

+
+
+
+ + +
+

+ Cena 4 · mobile (~390px) — seleção + sheet de compartilhamento aberto +

+
+
+ ← + Comunicação + +
+ +
+
+

Acervo · fala

+

BREVES COMUNICAÇÕES

+
+
+ ▶ +
+
+ +
+
+ Trecho selecionado + 00:43 → 02:10 +
+
+
+
+
+
+
+

+ início 00:43 · fim 02:10 · 1min27s · mínimo 5s · máximo 3min +

+
+ + +
+ +
+
+

Compartilhar trecho

+

O link abre o vídeo no ponto escolhido.

+
+
+ ✓ + Link copiado +
+
+ → + Enviar no WhatsApp +
+
+

+ Trecho de BREVES COMUNICAÇÕES (11/08/2026): de 00:43 a 02:10
+ youtube.com/watch?v=[id]&t=2634 +

+ +
+
+
+
+
+ + diff --git a/docs/plans/c166-compartilhar-trecho-link.md b/docs/plans/c166-compartilhar-trecho-link.md new file mode 100644 index 00000000..a1b55c55 --- /dev/null +++ b/docs/plans/c166-compartilhar-trecho-link.md @@ -0,0 +1,105 @@ +# Acervo: selecionar trecho e compartilhar por link (YouTube no ponto + WhatsApp) + +Status: rascunho +Atualizado em: 2026-09-15 +Issue: #1013 +Priority: P1 +Impeccable: B — encaixe no detalhe do acervo (player + compartilhar) +Rascunho UI: docs/plans/c166-compartilhar-trecho-link-ui-draft.html +Appetite: ~1–1,5 dia eng; um outcome verificável — quem recebe o link abre o YouTube já no ponto do trecho, e o intervalo vai na mensagem +Responsável: — + +## Intenção + +O acervo já deixa achar a fala e assistir no ponto (C154/C162), mas transformar um intervalo exato em algo que circula ainda dá trabalho manual: baixar o MP4, cortar fora da ferramenta, subir em algum lugar. Na comunicação da campanha, o que circula de verdade é link no WhatsApp. Esta fatia fecha o gesto: marcar [início, fim] no player (ímã nas frases, limites de 5 s a 180 s, duração visível) e compartilhar o link do YouTube já abrindo no ponto escolhido — copiando ou mandando no WhatsApp com o intervalo escrito na mensagem. Sem cortar arquivo e sem publicar página: isso é C167/C168. + +## Persona e fluxo + +- **Persona / contexto:** assessoria de comunicação (communicator; coordenação e candidatura também), no escritório ou em campo, com peça no prazo curto, muitas vezes no celular. +- **Job principal:** transformar um trecho exato da fala num link que abre no ponto e mandá-lo no WhatsApp em segundos, sem baixar nem editar vídeo. +- **Fluxo desejado:** abre a fala → ativa "Selecionar trecho" → marca início/fim clicando nas frases (ímã) e ajusta fino nas alças (5 s–180 s; a duração aparece enquanto seleciona) → "Compartilhar" → escolhe "Copiar link" (feedback "Link copiado") ou "Enviar no WhatsApp" (abre o WhatsApp do remetente com o texto pronto) → quem recebe abre o YouTube já no trecho e lê o intervalo na mensagem. +- **Anti-goals de produto:** não é editor de vídeo nem corte/export (C167); não é página pública do trecho (C167) nem biblioteca de cortes (C168); não é segundo player; sem telemetria de compartilhamento; nunca expor o acervo autenticado para fora; sem escrita no servidor, sem `Consent`/collection novos. + +### Esboço de fluxo (B/C/D) + +```text +[fala com YouTube] → "Selecionar trecho" → clique nas frases (ímã) + alças (5s…3min, duração visível) +→ "Compartilhar" → [Copiar link | Enviar no WhatsApp] → [recebe abre o YouTube no ponto; mensagem traz o intervalo] +[fala sem YouTube] → seleção continua disponível (porta do corte no C167); sem opção de link + aviso honesto; MP4/fonte seguem +``` + +### Rascunho UI (B/C/D) + +- Rascunho UI (gate): `docs/plans/c166-compartilhar-trecho-link-ui-draft.html` — cenas: detalhe com barra de seleção (alças/duração/mm:ss) + Compartilhar; popover com "Copiar link" (estado "Copiado") e "Enviar no WhatsApp"; fala sem YouTube (link indisponível + aviso honesto, seleção preservada); mobile com seleção + sheet. + +## Objetivo e aceite + +- Com YouTube: marcar [início, fim] no player com ímã nos limites dos segmentos e ajuste fino; mínimo 5 s, máximo 180 s; duração e `mm:ss` visíveis durante a seleção. +- "Compartilhar" oferece exatamente duas opções: "Copiar link" (com feedback "Link copiado") e "Enviar no WhatsApp" (`wa.me` do remetente, sem destinatário). +- O link é `https://www.youtube.com/watch?v=&t=`, com `t` = offset da sessão + início do trecho; abre já no ponto. O fim não cabe no link — o intervalo vai na mensagem. +- Sem YouTube (só VOD ou sem vídeo): a opção de link não é oferecida — aviso honesto de que compartilhar por link exige YouTube; a seleção continua disponível (é a porta do corte de arquivo no C167) e MP4/fonte continuam. +- Guardrails: nada de link autenticado do acervo para fora; sem escrita no servidor/`Consent`/collection; `advisor` e `leader` seguem negados; crédito "Fonte: Câmara dos Deputados · CC BY 4.0" e o clique-para-posicionar do C162 ficam intactos. + +## Dados (intenção) + +- **Vou apresentar dados?** Não — a superfície é seleção + compartilhamento; duração/`mm:ss` é feedback de ação, não dado do acervo. +- **Decisões desbloqueadas:** a assessoria decide qual intervalo circula e por qual canal (link no ponto ou WhatsApp); quem recebe decide assistir no ponto. +- **Forma:** _adiada ao plano de implementação_ — restrição: sem KPI/telemetria de compartilhamento nesta fatia. + +## Dados da decisão (literais) + +- Link compartilhado (fala com YouTube): `https://www.youtube.com/watch?v=&t=`; `t=` = offset da sessão + início do trecho em segundos (inteiro), a mesma conta do posicionamento do player; o fim NÃO é codificável no link do YouTube. +- Deep link WhatsApp sem destinatário: `https://wa.me/?text=` (padrão do repo de `wa.me/?text` + copiar com feedback "copiado"). +- Texto da mensagem: `Trecho de (): de a ` + URL; ex.: `Trecho de BREVES COMUNICAÇÕES (11/08/2026): de 00:43 a 02:10 https://www.youtube.com/watch?v=&t=2634`. +- Limites do trecho: mínimo 5 s, máximo 180 s; duração visível durante a seleção; alças com ímã nos limites dos segmentos e ajuste fino permitido. +- Rótulos das ações: "Compartilhar" (opções "Copiar link" e "Enviar no WhatsApp"); feedback "Link copiado". +- Fala sem YouTube: nenhuma opção de link; aviso honesto de que o compartilhamento por link exige YouTube; a seleção permanece (porta do corte do C167); nunca compartilhar link autenticado do acervo. +- Sem escrita no servidor; sem `Consent`; sem segunda superfície de player; `advisor`/`leader` permanecem negados. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `src/components/campaign/speech/` (controle de seleção + compartilhar no detalhe), `src/utilities/speech/` (rótulos/segmentos já no view model) e `src/lib/` (montagem pura de link/mensagem). +- **Precedente a olhar:** `src/lib/contentShare.ts` + `src/components/ContentShareButton.tsx` (popover + copiar com feedback), `src/lib/phone.ts` (`buildWhatsAppTextShareUrl` = `wa.me/?text=`), `docs/plans/compartilhar-pagina.md` ("compartilhar não concede acesso", sem server action), C162 em `speechViewModels.ts` (`youtubeVideoId`/`youtubeOffsetSeconds`, segmentos com início/fim). +- **Risco de acoplamento:** o clique na transcrição hoje posiciona o vídeo (contrato C162 pinado em unit/e2e) — a seleção precisa de modo explícito para não regredir; o e2e `campaignSpeechAcervo` e o manifesto de áreas tocadas cobrem `src/components/campaign/speech`/`src/utilities/speech`/`src/lib/speech*`. + +## Dependências + +- Entregues (duras, satisfeitas): C154/C155 (acervo em produção) e C162 (player com YouTube default + offset). Nenhuma dependência aberta. + +## Fora de escopo + +- Cortar/gerar arquivo do trecho (clip/export) e download do clip — C167. +- Página pública do trecho com preview/OG e biblioteca de cortes — C167/C168. +- Compartilhar a partir da lista (só o detalhe nesta fatia). +- Telemetria/UTM, contagem de compartilhamentos e analytics de clique. +- Legendas, marca d'água, thumbnail e encurtador/tracker de link. +- Outros canais (X, Telegram, e-mail) — só WhatsApp + copiar link. +- Escrita no servidor, `Consent`, collection/migration novas; ampliar papéis com acesso. + +## Rabbit holes de produto + +- **Virar editor de vídeo.** Se alguém "só completar": trim, preview renderizado, export, fila de render. **Corte neste item:** só [início,fim] + link; nenhum arquivo novo. +- **Página pública do trecho "para o link abrir bonito".** Se alguém "só completar": rota pública, OG, hospedagem, moderação. **Corte neste item:** o link é do YouTube; C167 é outro item. +- **Encurtador/tracker para medir circulação.** Se alguém "só completar": serviço externo, redirect, privacidade. **Corte neste item:** URL canônica do YouTube; medição é item futuro explícito. +- **Precisão de frame / timeline com zoom.** Se alguém "só completar": snapping complexo e segundo quebrado. **Corte neste item:** segundos inteiros, ímã de frase, alças simples. +- **Segundo player para pré-visualizar o corte.** Se alguém "só completar": duas superfícies de vídeo. **Corte neste item:** a seleção vive no player existente. + +## Questões em aberto (produto) + +- **Fala sem YouTube?** **Opções:** A) esconder a opção de link com aviso honesto, mantendo a seleção para o corte | B) copiar link autenticado do acervo. **Recomendação:** A — B nunca funciona para quem recebe (rota autenticada) e vaza uma URL interna. _(assumido — validar no gate)_ +- **Padrão da seleção?** **Opções:** A) marcar por clique em segmentos inteiros e ajustar com alças | B) só alças livres. **Recomendação:** A com ímã — a frase é a unidade de sentido do discurso; alças livres erram por segundos. _(decidido — A, com ajuste fino permitido)_ +- **Botão?** **Opções:** A) um "Compartilhar" com as duas opções | B) dois botões separados. **Recomendação:** A (pedido do dono: botão com opções); B duplica CTA numa barra já densa. _(decidido — A)_ +- **Clique na transcrição durante a seleção?** **Opções:** A) modo explícito "Selecionar trecho" (fora dele o clique segue posicionando) | B) clicar-e-arrastar sempre. **Recomendação:** A — preserva o contrato C162 e não surpreende quem só quer ouvir. _(assumido)_ +- **YouTube com offset desconhecido?** **Opções:** A) oferecer link sem `t=` com aviso de que abre no início da sessão | B) não oferecer link. **Recomendação:** A — o link é utilizável; nunca inventar `t=` errado. _(assumido)_ + +## Referências + +- GitHub Issue: — (após `pnpm agent:register`) +- Rascunho UI (gate): `docs/plans/c166-compartilhar-trecho-link-ui-draft.html` +- Planos irmãos: [`acervo-vod-sob-demanda.md`](acervo-vod-sob-demanda.md) (C162), [`compartilhar-conteudos-home-whatsapp.md`](compartilhar-conteudos-home-whatsapp.md), [`compartilhar-pagina.md`](compartilhar-pagina.md) +- Arquivos-chave (pista, não contrato): `src/components/campaign/speech/SpeechDetailPlayer.tsx`, `src/utilities/speech/speechViewModels.ts`, `src/lib/contentShare.ts`, `src/lib/phone.ts`, `tests/e2e/campaignSpeechAcervo.e2e.spec.ts` +- `AGENTS.md` — vertical Comunicação, lockdown de papéis e crédito CC BY. + +## Self-score (shaping) + +5/5 — (1) fatia = um outcome verificável (quem recebe abre o YouTube no ponto; o intervalo vai na mensagem) sem cortar arquivo nem publicar página; (2) appetite de ~1–1,5 dia para seleção + compartilhamento sem schema; (3) persona, job e aceite legíveis sem jargão, com as decisões literais separadas; (4) direção no codebase é hipótese com precedentes abertos e o alerta do contrato C162; (5) zero decisão dura de engenharia — nomes, rotas e schema ficam para a implementação. diff --git a/docs/plans/c167-cortar-trecho-publicar-ui-draft.html b/docs/plans/c167-cortar-trecho-publicar-ui-draft.html new file mode 100644 index 00000000..1b973ca2 --- /dev/null +++ b/docs/plans/c167-cortar-trecho-publicar-ui-draft.html @@ -0,0 +1,579 @@ + + + + + + + UI draft — C167 · Cortar o trecho e publicar o corte + + +
+

+ UI draft — Acervo: cortar o trecho [início,fim] e publicar o arquivo numa página + compartilhável (C167) +

+

+ A assessoria seleciona o trecho (C166), confirma o corte com título/descrição sugeridos por + IA, o servidor gera o MP4 exato [início,fim] e publica uma página unlisted com player; o + compartilhamento é por link (preview no WhatsApp) ou baixando o arquivo. +

+

+ Cinza = estrutura existente · acento = novo neste item · + barras cinza = conteúdo não especificado. Cenas estáticas: sem interação, sem dados reais. +

+ + + + +
+

+ Cena 1 · desktop (~1280px) — "Cortar vídeo" a partir do trecho selecionado (C166) +

+
+
+ +
+

← Voltar ao acervo

+

BREVES COMUNICAÇÕES

+

+ 11/08/2026 · 18:48 · Breves Comunicações · 4min25s +

+
+
+
+ +
+
+
+ 00:00 + … agradeço, Presidente. … +
+
+ 00:43 + … o acesso a medicamentos na Bahia precisa chegar a quem mora no interior + … +
+
+ 02:10 + … o financiamento tripartite … +
+
+
+ +
+
+ + +
+
+
+
+

Cortar vídeo

+

+ O arquivo sai com o trecho exato — nada antes, nada depois. +

+
+ + seleção do C166 + +
+ +
+
+ 00:43 → 01:58 + 1min15s · dentro da faixa de 5–180 s +
+

+ "…o acesso a medicamentos na Bahia precisa chegar a quem mora no interior…" +

+
+ +
+ +
+ Acesso a medicamentos na Bahia precisa chegar a quem mora no interior +
+
+ +
+ +
+ Em pronunciamento no plenário, o deputado cobra o financiamento tripartite da + saúde e reforça a necessidade de abastecer as farmácias populares do interior + baiano. +
+
+ +
+ Sugerido por IA — revise antes de publicar. Os dois campos são editáveis. +
+ +
+ + +
+

+ Nada é publicado antes de confirmar. No fim, o corte ganha o link + /corte/123 e o arquivo fica na biblioteca de cortes + (C168). +

+
+
+
+
+
+ + + + +
+

+ Cena 2 · "Preparando o corte…" — espera honesta com o passo atual +

+
+
+
+
+

Preparando o corte…

+

+ Isso costuma levar menos de um minuto. Não feche esta página. +

+
+
+ +
    +
  • + + Localizando o trecho na Câmara + Concluído +
  • +
  • + + Cortando o trecho 00:43 → 01:58 + Em andamento +
  • +
  • + + Gerando título e descrição + Na fila +
  • +
  • + + Publicando a página do corte + Na fila +
  • +
+ +

+ Nada foi publicado ainda. Se algo falhar, você volta ao acervo sem corte — nada fica no + ar pela metade. +

+
+

+ Progresso honesto: mostra o passo atual e o que falta; sem porcentagem inventada. +

+
+ + + + +
+

+ Cena 3 · erro — o corte falhou e nada foi publicado +

+
+
+
+ +
+
+

Não foi possível cortar o trecho

+

+ A Câmara não está entregando o vídeo desta fala agora. Nada foi publicado — o acervo + e o trecho selecionado continuam como estavam. +

+
+
+
+ + +
+

+ O mesmo trecho continua selecionado; tentar de novo não cria corte duplicado. +

+
+
+ + + + +
+

+ Cena 4 · sucesso no detalhe — link público, compartilhar e baixar (+ preview WhatsApp) +

+
+
+
+ +
+

Corte publicado

+

+ O arquivo do trecho está salvo e a página pública já está no ar. +

+
+
+ +

+ Link público (funciona no WhatsApp) +

+
+
+ https://jorgesolla1313.com.br/corte/123 +
+ +
+ +
+ + + Abrir página do corte ↗ +
+ +

+ O arquivo também fica disponível na biblioteca de cortes (C168) — é lá que se + despublica o corte. +

+
+ +
+

+ Preview no WhatsApp (Open Graph) +

+
+
+ capa do YouTube da sessão (quando existir) +
+
+

+ Acesso a medicamentos na Bahia precisa chegar a quem mora no interior +

+

+ Em pronunciamento no plenário, o deputado cobra o financiamento tripartite da + saúde… +

+

+ jorgesolla1313.com.br +

+
+
+

+ Título, descrição e imagem vêm do corte; a página segue unlisted. +

+
+
+
+ + + + +
+

+ Cena 5 · desktop (~1280px) — página pública /corte/123 +

+
+
+
+
+
+
+
+
+ +
+
+
+ +
+ + unlisted · não indexável + +

+ Toca o arquivo MP4 do corte (não o YouTube) +

+
+ +

+ Acesso a medicamentos na Bahia precisa chegar a quem mora no interior +

+

+ Discurso em plenário · 11/08/2026 · 1min15s · + Ver sessão no YouTube ↗ +

+

+ Em pronunciamento no plenário, o deputado cobra o financiamento tripartite da saúde e + reforça a necessidade de abastecer as farmácias populares do interior baiano. +

+ +
+ + + +
+ +

+ Fonte: Câmara dos Deputados · CC BY 4.0 +

+

+ Sem transcrição nem internals nesta página — o contexto mínimo é data, tipo e o link + da sessão. +

+
+
+
+ + + + +
+

+ Cena 6 · mobile (~390px) — mesma hierarquia, ações empilhadas +

+
+
+
+
+
+
+
+
+ +
+

Arquivo MP4 do corte

+
+ +

+ Acesso a medicamentos na Bahia precisa chegar a quem mora no interior +

+

+ Discurso em plenário · 11/08/2026 · 1min15s · + YouTube ↗ +

+

+ Em pronunciamento no plenário, o deputado cobra o financiamento tripartite da saúde e + reforça a necessidade de abastecer as farmácias populares do interior baiano. +

+ + + + + +

+ Fonte: Câmara dos Deputados · CC BY 4.0 +

+

unlisted · não indexável · sem transcrição

+
+
+
+ + + + +
+

+ Cena 7 · público — corte despublicado (kill switch) ou link inválido +

+
+
+
+ +
+

Este corte não está disponível

+

+ O link pode ter sido despublicado ou o endereço está incorreto. +

+ +

+ Mesma resposta para despublicado e id inexistente — não revela se o corte existiu. +

+
+
+
+
+ + diff --git a/docs/plans/c167-cortar-trecho-publicar.md b/docs/plans/c167-cortar-trecho-publicar.md new file mode 100644 index 00000000..bbd85110 --- /dev/null +++ b/docs/plans/c167-cortar-trecho-publicar.md @@ -0,0 +1,101 @@ +# Acervo: cortar o trecho [início,fim] e publicar o arquivo numa página compartilhável + +Status: rascunho +Atualizado em: 2026-09-15 +Issue: #1014 +Priority: P1 +Impeccable: C — fluxo novo no detalhe do acervo + superfície pública nova +Rascunho UI: docs/plans/c167-cortar-trecho-publicar-ui-draft.html +Appetite: ~2–3 dias eng; um outcome verificável — o corte [início,fim] exato sai salvo, tocável e baixável numa página pública compartilhável +Responsável: — + +## Intenção + +O link do YouTube posiciona no ponto, mas a peça exige o arquivo exato. Quem produz conteúdo escolhe um trecho da fala no acervo (C166) e hoje só consegue mandar o link da sessão com o tempo — para editar ou postar, garimpa o vídeo de novo e o trecho vem com o que vier antes e depois. Este item fecha o ciclo: da mesma seleção [início,fim], "Cortar vídeo" gera o arquivo exato, salva no servidor e publica uma página pública com player; o compartilhamento passa a ser por link (com preview no WhatsApp) ou baixando o arquivo. Título e descrição são gerados por IA no momento do corte — editáveis antes de confirmar — e o arquivo fica disponível para a biblioteca de cortes (C168). + +## Persona e fluxo + +- **Persona / contexto:** assessoria de comunicação (communicator, coordenação e candidatura) na mesa, montando peça com prazo curto e com o acervo aberto. +- **Job principal:** transformar o trecho escolhido no arquivo exato [início,fim] e ter um link público para mandar no WhatsApp ou baixar. +- **Fluxo desejado:** abre a fala → seleciona o trecho (C166) → "Cortar vídeo" → título e descrição sugeridos pela IA (edita se quiser) → "Cortar e publicar" → "Preparando o corte…" → pronto: link público + Copiar + WhatsApp + Baixar arquivo; quem recebe abre `/corte/` e assiste/baixa o mesmo arquivo. +- **Anti-goals de produto:** não é editor de vídeo; não aceita upload externo; não expõe transcrição nem internals no público; não cria segundo cadastro de pessoa nem `Consent`; não vira galeria pública indexável; não abre o acervo para quem não lê. + +### Esboço de fluxo (C) + +```text +[detalhe da fala] → seleção [início,fim] (C166) → "Cortar vídeo" +→ formulário: título/descrição IA (editáveis) + "Cortar e publicar" +→ "Preparando o corte…" (espera honesta; falhou → erro claro, nada publicado) +→ corte publicado: link /corte/ + Copiar + WhatsApp + Baixar MP4 +→ quem recebe: player do arquivo exato + compartilhar/baixar (unlisted) +``` + +### Rascunho UI (C) + +- Rascunho UI (gate): `docs/plans/c167-cortar-trecho-publicar-ui-draft.html` — cenas: formulário de corte com título/descrição IA editáveis; "Preparando o corte…"; erro honesto; sucesso no acervo (link + Copiar + WhatsApp + Baixar + preview); página pública desktop e mobile; corte despublicado/indisponível. + +## Objetivo e aceite + +- Da seleção [início,fim] do C166 (5–180 s), "Cortar vídeo" gera e salva o MP4 do trecho EXATO — começa e termina nos marcos escolhidos, sem aproximar keyframe. +- O corte nasce publicado: `/corte/` toca esse mesmo arquivo e o download entrega o mesmo arquivo; o link funciona no WhatsApp com preview (título, descrição e imagem). +- Título e descrição vêm da IA em pt-BR (texto/contexto do trecho), pré-preenchidos e editáveis antes de confirmar; IA indisponível → fallback determinístico, sem bloquear a criação. +- Compartilhar = copiar link público + deep link WhatsApp + baixar arquivo; o mesmo arquivo é baixável direto para compartilhar fora do link. +- Kill switch: despublicar tira o corte do ar na hora (admin; toggle na página interna em C168); o id numérico sobrevive à troca de título. +- **Guardrails:** página pública não indexável (unlisted, só por link; `noindex`); sem transcrição/internals no público; crédito "Fonte: Câmara dos Deputados · CC BY 4.0"; corta quem lê o acervo (communicator/coordinator/candidate), advisor/leader negados fail-closed; falhou o corte, nada é publicado; sem upload externo/Consent/segundo cadastro. + +## Dados (intenção) + +- **Vou apresentar dados?** Não — a superfície é formulário, estados de progresso/erro e player público; nenhum KPI/gráfico novo. +- **Decisões desbloqueadas:** a assessoria decide qual trecho vira peça publicável e compartilha o arquivo exato sem depender do YouTube; a coordenação decide, em C168, o que continua no ar. +- **Forma:** _adiada ao plano de implementação_ — restrição: progresso/erro é feedback de ação, não dado de acervo. + +## Dados da decisão (literais) + +- Rota pública `/corte/` — id numérico sequencial do corte, estável mesmo quando o título muda; enumerável por natureza (trade-off aceito: o conteúdo é fala pública do deputado, e despublicar remove o acesso). Estado do corte: `publicado` (público pelo link) | `despublicado` (link fora do ar) — nasce publicado ao confirmar; despublicar é o kill switch (admin; toggle na página interna em C168). +- Faixa da seleção: 5–180 s — a mesma do C166. +- Arquivo: MP4 do trecho EXATO [início,fim] — começa e termina nos marcos escolhidos (não aproximação de keyframe); salvo no servidor; o player público toca esse arquivo e o download entrega o mesmo arquivo. +- Título/descrição: IA em pt-BR (provider DeepSeek já existente no repo) a partir do texto do trecho/contexto do discurso; pré-preenchidos no formulário de corte e editáveis antes de confirmar; IA indisponível → fallback determinístico `Trecho de — ` + resumo oficial do discurso, sem bloquear a criação. +- Open Graph (WhatsApp): título, descrição e imagem; quando a fala tem YouTube, usar a capa do YouTube da sessão como imagem. Página NÃO indexável (unlisted; só por link) e crédito `Fonte: Câmara dos Deputados · CC BY 4.0`. +- Compartilhar o corte: copiar link público + deep link WhatsApp (`wa.me/?text=`); baixar o arquivo. O arquivo também pode ser baixado direto para compartilhar. +- Quem corta: quem lê o acervo (communicator/coordinator/candidate); advisor/leader negados (fail-closed). Sem expor transcrição/internals na página pública; sem upload externo de vídeo; sem Consent; sem segundo cadastro de pessoa. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** detalhe do acervo (`src/app/(campaign)/campanha/(app)/comunicacao/acervo/[id]/`, `src/components/campaign/speech/`), `src/utilities/speech/` (corte e publicação), ações/rotas de `/campanha` do acervo, superfície pública em `src/app/(frontend)/` (metadata/Open Graph). +- **Precedente a olhar:** resolução VOD sob demanda (`resolver-vod` + `speechVodResolver.ts`); upload programático por buffer já existente (`media`) com S3/Garage e proxy `/api/media/file/...` com Range; IA de texto (`campaignDemandTitle.ts`, `rerankSpeechExcerpts.ts`); páginas públicas com metadata/OG (`[type]/[category]/[slug]/page.tsx`); allowlist de revalidação em `/api/revalidate`. +- **Risco de acoplamento (mecanismo de corte EM ABERTO — decisão do plano de implementação):** `ffmpeg/ffprobe` não existem no repo/Dockerfile (Alpine) e a API da Câmara corta do ponto até o FIM (`trecho=`), então o [início,fim] exato exige corte próprio — servidor, navegador ou serviço externo é trade-off a avaliar; sem infra de fila/job no repo, a criação tende a ser espera com progresso; falha nunca publica; diff em `src/utilities/speech`/`src/components/campaign/speech`/comunicacao acorda o e2e `campaignSpeechAcervo`. + +## Dependências + +- **Dura: C166** — a seleção [início,fim] e o compartilhamento por link do YouTube são a porta de entrada; sem ela não há trecho para cortar. +- Suaves: C168 (biblioteca de cortes — guarda o arquivo e hospeda o toggle de despublicar), C162 (resolução VOD sob demanda), C154 (vertical acervo). + +## Fora de escopo + +- Editar além da seleção do C166 (timeline, preview, ajuste fino), legenda/CC, trilha e capa custom; biblioteca/curadoria/listagem de cortes e o toggle de despublicar (C168); upload externo de vídeo; indexação/SEO público do corte e publicação em YouTube/redes via API. + +## Rabbit holes de produto + +- **Editor de vídeo no browser.** Se alguém "só completar": timeline, filtros, preview de render. **Corte neste item:** o corte é [início,fim] da seleção do C166; sem edição. +- **Fila assíncrona de render com notificação.** Se alguém "só completar": worker, retry, tela de pendências. **Corte nesta fatia:** espera curta com progresso honesto e erro claro; falhou, nada publicado. +- **Legendar/transcrever o arquivo gerado.** Se alguém "só completar": burn-in, `.srt`, tradução. **Corte neste item:** o arquivo vai sem legenda; a transcrição segue só no acervo interno. +- **Galeria pública de cortes ("já que estão no ar").** Se alguém "só completar": índice, busca, perfil. **Corte neste item:** unlisted, só por link. + +## Questões em aberto (produto) + +- **Publicar direto ou pré-visualizar?** **Opções:** A) confirmar já publica (título/descrição editáveis no formulário) | B) gerar rascunho e publicar depois. **Recomendação:** A, com kill switch via admin/C168. _(assumido — validar com produto)_ +- **Indexar no Google?** **Opções:** A) unlisted/`noindex` | B) indexável. **Recomendação:** A — o link funciona no WhatsApp e evita exposição no período eleitoral. +- **Demora do corte:** **Opções:** A) espera curta com progresso honesto e erro claro | B) fila assíncrona com notificação. **Recomendação:** A nesta fatia (fila é rabbit hole). +- **O que a página pública mostra do discurso?** **Opções:** A) só o corte + crédito | B) contexto (data/tipo) e link para o YouTube. **Recomendação:** B minimalista (data/tipo + link; sem transcrição). + +## Referências + +- GitHub Issue: — (após `pnpm agent:register`) +- Rascunho UI (gate): `docs/plans/c167-cortar-trecho-publicar-ui-draft.html` +- Planos irmãos: [`c166-compartilhar-trecho-link.md`](c166-compartilhar-trecho-link.md) (C166), [`c168-biblioteca-cortes.md`](c168-biblioteca-cortes.md) (C168), [`acervo-vod-sob-demanda.md`](acervo-vod-sob-demanda.md) (C162), [`acervo-videos-comunicacao.md`](acervo-videos-comunicacao.md) (C154) +- Arquivos-chave (pista, não contrato): `src/components/campaign/speech/SpeechDetailPlayer.tsx`, `src/utilities/speech/speechVodResolver.ts`, `src/utilities/ai/`, `src/app/(frontend)/`, `scripts/lib/camaraFetch.mjs` +- `AGENTS.md` / `AGENTS-campaign.md` — vertical Comunicação, gate do acervo e crédito CC BY. + +## Self-score (shaping) + +5/5 — (1) fatia = um outcome verificável (o corte [início,fim] exato sai salvo, tocável e baixável numa página pública compartilhável); (2) appetite de ~2–3 dias comporta o fluxo + estados + página pública, com o mecanismo de corte como maior incerteza declarada; (3) persona, job e aceite legíveis sem jargão de stack; (4) direção no codebase é hipótese (áreas, precedentes e o risco ffmpeg/Câmara em aberto); (5) zero decisão dura de engenharia no plano (schema, storage, corte e mecanismo de IA ficam para o plano de implementação). diff --git a/docs/plans/c168-biblioteca-cortes-ui-draft.html b/docs/plans/c168-biblioteca-cortes-ui-draft.html new file mode 100644 index 00000000..600d29b3 --- /dev/null +++ b/docs/plans/c168-biblioteca-cortes-ui-draft.html @@ -0,0 +1,705 @@ + + + + + + + UI draft — C168 · Acervo: biblioteca de cortes + + +
+

+ UI draft — Acervo: biblioteca de cortes (C168) +

+

+ A assessoria reencontra um corte já feito, confere o discurso de origem, ajusta título e + descrição, baixa, compartilha e publica/despublica — sem refazer o corte. +

+

+ Cinza = estrutura existente · âmbar = ação primária / + novo neste item · barras cinza = conteúdo não especificado. Cenas estáticas: sem interação, + sem dados reais. +

+ + + + +
+

+ Cena 1 · desktop (~1280px) — /campanha/comunicacao/acervo/cortes +

+
+
+
+ + +
+
+
+

← Acervo de falas

+

Cortes

+

+ O que já foi cortado — reencontre, ajuste o texto e republique. +

+
+ 12 cortes +
+ +
+ + + + + Buscar por título ou descrição… + Busca +
+ +
+ +
+
+ Publicado + Criado em 12/08/2026 +
+

+ Saúde pública no interior da Bahia +

+
+ Fala · Breves Comunicações · 11/08/2026 + + Ver fala no acervo + + 1min12s +
+
+ + +
+
+ + +
+
+ Publicado + Criado em 10/08/2026 +
+

+ Financiamento tripartite e medicamentos +

+
+ Fala · Breves Comunicações · 09/08/2026 + + Ver fala no acervo + + 2min03s +
+
+ + +
+
+ + +
+
+ Despublicado + Criado em 08/08/2026 +
+

Obras e emprego na Bahia

+
+ Fala · Breves Comunicações · 08/08/2026 + + Ver fala no acervo + + 45s +
+
+ + +
+
+
+ +
+ 1–3 de 12 cortes + + Anterior + Página 1 de 4 + Próxima + +
+
+
+
+
+
+ + + + +
+

+ Cena 2 · desktop — lista vazia ("Nenhum corte ainda") +

+
+
+
+ +
+

← Acervo de falas

+

Cortes

+
+ + + + +

Nenhum corte ainda

+

+ Quando você cortar um trecho de uma fala, ele fica guardado aqui para + reencontrar, baixar, ajustar o texto e republicar. +

+ +
+
+
+
+
+
+ + + + +
+

+ Cena 3 · desktop — /campanha/comunicacao/acervo/cortes/[id] (player, origem, editar, + ações) +

+
+
+
+ + +
+

← Voltar aos cortes

+ +
+
+

Saúde pública no interior da Bahia

+

+ Corte de 1min12s · criado em 12/08/2026 +

+ + +
+
+ ▶ +
+ + Corte · 1min12s + +
+ + + + 00:24 / 01:12 +
+
+ +
+ + + + +
+

+ O link compartilhado é o mesmo da página pública: /corte/123 +

+ + +
+

Editar título e descrição

+

+ O que você salvar aqui aparece na página pública e no preview do link. +

+ +
+ Título +
+ Saúde pública no interior da Bahia +
+
+ +
+ Descrição +
+ O deputado fala sobre o acesso a medicamentos no interior e defende o + financiamento tripartite da saúde. +
+
+ +
+ + +
+
+
+ + +
+
+
+
+
+
+ + + + +
+

+ Cena 4 · desktop — confirmação de despublicar (kill switch) +

+
+
+
+
+

Despublicar este corte?

+ Publicado +
+

Saúde pública no interior da Bahia

+
+
+

+ O link público deixa de funcionar para quem já recebeu. Você pode publicar de novo + quando quiser. +

+

+ O corte continua na biblioteca como despublicado. +

+
+
+ + +
+
+
+
+ + + + +
+

+ Cena 5 · mobile (~390px) — lista de cortes e detalhe +

+
+ +
+
+ ← Acervo + Cortes + 12 +
+
+
+ + + + + Buscar por título ou descrição… +
+ +
+
+
+ Publicado + Criado em 12/08/2026 +
+

+ Saúde pública no interior da Bahia +

+

+ Fala · Breves Comunicações · 11/08/2026 · 1min12s +

+

+ Ver fala no acervo +

+
+ + +
+
+ +
+
+ Despublicado + Criado em 08/08/2026 +
+

Obras e emprego na Bahia

+

+ Fala · Breves Comunicações · 08/08/2026 · 45s +

+

+ Ver fala no acervo +

+
+ + +
+
+
+ +
+ 1–3 de 12 + Página 1 de 4 +
+
+
+ + +
+
+ ← Cortes + Corte + ··· +
+
+

Saúde pública no interior da Bahia

+

Corte de 1min12s · criado em 12/08/2026

+ +
+
+ ▶ +
+ 01:12 +
+ +
+ + +
+ + +
+
+ +
+

+ Discurso de origem +

+

Breves Comunicações · 11/08/2026

+

Trecho 00:43–01:55 da fala

+

+ Ver fala no acervo +

+
+ +
+

Publicação

+
+ Publicado +
+

+ Despublicado, o link público para de funcionar para quem já recebeu. +

+ +
+ +
+

Editar título e descrição

+
+ Título +
+ Saúde pública no interior da Bahia +
+
+
+ Descrição +
+ O deputado fala sobre o acesso a medicamentos no interior. +
+
+ +
+
+
+
+
+
+ + diff --git a/docs/plans/c168-biblioteca-cortes.md b/docs/plans/c168-biblioteca-cortes.md new file mode 100644 index 00000000..c633aedd --- /dev/null +++ b/docs/plans/c168-biblioteca-cortes.md @@ -0,0 +1,108 @@ +# Acervo: biblioteca de cortes (origem, download, compartilhar, editar título/descrição) + +Status: rascunho +Atualizado em: 2026-09-15 +Issue: #1015 +Priority: P2 +Impeccable: C — fluxo novo na vertical Comunicação (lista + detalhe de cortes) +Rascunho UI: docs/plans/c168-biblioteca-cortes-ui-draft.html +Appetite: ~1–1,5 dia eng; um outcome verificável — a assessoria reencontra um corte antigo, edita o texto e republica sem refazer o corte +Responsável: — + +## Intenção + +O corte feito hoje morre no instante em que é enviado: existe para quem recebeu o link e some do radar da assessoria. Reaproveitar um corte antigo — outro formato, outra legenda, o mesmo vídeo — significa refazer o corte do zero (reabrir a fala, achar o trecho, gerar de novo) ou garimpar conversas atrás do link. Este item dá à vertical Comunicação uma biblioteca do que já foi cortado: cada corte guarda o discurso de origem e pode ser reencontrado, ter o texto ajustado, ser baixado, compartilhado e publicado/despublicado sem refazer o vídeo. + +## Persona e fluxo + +- **Persona / contexto:** assessoria de comunicação (`communicator`) e coordenação/candidatura, na mesa ou no celular, sob prazo de peça; quem não é da vertical (`advisor`, `leader`) segue negado. +- **Job principal:** "reencontrar um corte que eu já fiz, ajustar o texto e republicar — sem refazer o corte". +- **Fluxo desejado:** abre Comunicação → Acervo → Cortes → vê os cortes mais recentes (ou busca por título/descrição) → abre um corte → assiste e confere o discurso de origem → edita título/descrição e salva → baixa, copia o link ou compartilha no WhatsApp → publica/despublica → a página pública reflete o texto e o estado. +- **Anti-goals de produto:** não virar editor de vídeo (nada de trocar início/fim ou re-render); não ser um segundo acervo de falas; sem comentários, versionamento, coleções/kits, favoritos ou métricas; sem deletar pela UI. + +### Esboço de fluxo (C) + +```text +[lista de cortes: recentes primeiro + busca por título/descrição] +→ abre o detalhe do corte → assiste e confere o discurso de origem (link) +→ edita título/descrição → salva (a página pública reflete) +→ baixa MP4 / copia link / WhatsApp / publica-despublica (kill switch) +→ [outcome: reencontrou, reaproveitou e republicou sem refazer o corte] +``` + +### Rascunho UI (C) + +- Rascunho UI (gate): `docs/plans/c168-biblioteca-cortes-ui-draft.html` — cenas: lista de cortes desktop e vazia; detalhe com player, origem, edição e ações; confirmação de despublicar; mobile. + +## Objetivo e aceite + +- Existe `/campanha/comunicacao/acervo/cortes`: cortes mais recentes primeiro, cada item com título, discurso de origem (tipo + data, com link para a fala), duração, status (publicado/despublicado) e data de criação; busca por título/descrição e paginação padrão da casa. +- O detalhe do corte mostra o player, o discurso de origem com link e o título/descrição editáveis; salvar reflete na página pública e no preview, sem passo extra. +- No detalhe também se baixa o corte (MP4), copia-se o link e compartilha-se no WhatsApp; o link compartilhado é o mesmo da página pública. +- Publicar/despublicar pela página interna com aviso explícito: despublicado, o link público para de funcionar; o estado aparece na lista. +- **Guardrails de produto:** leem/editam `communicator`, `coordinator` e `candidate`; `advisor` e `leader` ficam de fora (fail-closed). Deletar corte não existe na UI (admin pode). Editar o texto do corte nunca altera a fala original nem o vídeo. + +## Dados (intenção) + +- **Vou apresentar dados?** Não — recorte operacional de itens existentes (lista paginada); status publicado/despublicado é estado do item, não KPI. +- **Decisões desbloqueadas:** a assessoria escolhe qual corte reaproveitar, o que ajustar no texto e o que manter no ar; nenhuma leitura agregada nova. +- **Forma:** _adiada ao plano de implementação_ — aqui só a restrição de produto: sem métricas de vaidade (views/downloads) nem contadores de acervo. + +## Dados da decisão (literais) + +- Rotas internas: `/campanha/comunicacao/acervo/cortes` (lista) e `/campanha/comunicacao/acervo/cortes/[id]` (detalhe). +- Acesso: `communicator`, `coordinator` e `candidate` leem e editam título/descrição/publicação; `advisor` e `leader` negados (fail-closed). +- Lista: mais recentes primeiro; cada item mostra título, discurso de origem (tipo + data, com link para a fala), duração, status (publicado/despublicado) e data de criação; busca por título/descrição; paginação padrão da casa. +- Aviso de despublicar (texto de produto): título "Despublicar este corte?" e corpo "O link público deixa de funcionar para quem já recebeu. Você pode publicar de novo quando quiser." — botões "Cancelar" e "Despublicar". +- Vazio da lista: "Nenhum corte ainda" + caminho para o acervo de falas. +- Publicar/despublicar é kill switch: despublicado, o link público para de funcionar; republicar restaura o mesmo link (o corte continua na biblioteca). +- Sem deletar corte pela UI (admin pode); sem comentários, versionamento, coleções/kits ou métricas de vaidade. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** rotas em `src/app/(campaign)/campanha/(app)/comunicacao/acervo/cortes/` (lista + `[id]`), paths em `src/lib/campaignPaths.ts`, chrome em `src/lib/campaignPageChrome.ts`, componentes na vertical (`src/components/campaign/speech/` ou domínio irmão) e utilitários de leitura/estado ao lado do acervo. +- **Precedente a olhar:** acervo de falas — `acervo/page.tsx` (lista paginada + vazio + footer), `SpeechAcervoFilters.tsx`/`speechListUrl.ts` (busca e estado na URL), `SpeechResultCard.tsx`, `SpeechDetailPlayer.tsx` (player, baixar/abrir fonte) e o detalhe `acervo/[id]/page.tsx`; chrome `campaignPageChrome.ts`; nav do communicator em `src/components/campaign/shell/nav.ts`. +- **Risco de acoplamento:** o `communicator` lê mas não atualiza a fala (`canUpdateSpeech` é de papéis unrestricted) — o texto editável é o do corte, não o da fala; não misturar com o where/ordenação da lista de falas; leader/advisor lockdown e gate `speechCatalog` intocados; a página pública `/corte/` é do C167 (aqui só se reflete). + +## Dependências + +- **Dura: C167** — sem o corte salvo no servidor e a página pública `/corte/`, não há o que listar, baixar, compartilhar nem publicar/despublicar. +- **Indireta: C166** — seleção de trecho [início,fim] e compartilhamento por link do YouTube: é o passo anterior do fluxo; o compartilhar da biblioteca é o link público do corte, não o link do YouTube. +- Suaves: C154/C153 (acervo de falas, gate e chrome) e a vertical Comunicação. + +## Fora de escopo + +- Editar o corte (trocar início/fim, re-render, editor de vídeo). +- Deletar/arquivar corte pela UI (admin pode), lixeira e desfazer. +- Comentários, versionamento/histórico, coleções/kits/playlists, favoritos e métricas (views/downloads). +- Qualquer mudança na página pública além de refletir título/descrição/publicação (a superfície é do C167). +- Ações em lote (baixar/publicar/editar vários) e exportação. + +## Rabbit holes de produto + +- **"Já que tem a lista, deixa ajustar o corte (início/fim)."** Se alguém "só completar": editor/re-render e fila de processamento. **Corte neste item:** só título/descrição/publicação; o vídeo é imutável. +- **"Coleções/kits por tema para organizar."** Se alguém "só completar": segunda taxonomia e curadoria. **Corte neste item:** lista única com busca. +- **"Mostrar views/downloads de cada corte."** Se alguém "só completar": dashboard de vaidade sem decisão nomeável. **Corte neste item:** sem métricas. +- **"Soft delete/desfazer despublicar."** Se alguém "só completar": versionamento e lixeira. **Corte neste item:** kill switch; republicar resolve. +- **"Compartilhar em todas as redes."** Se alguém "só completar": integrações e SDKs. **Corte neste item:** copiar link + WhatsApp (o que o produto pediu). + +## Questões em aberto (produto) + +- **Aba/segmento na lista do acervo (Falas | Cortes) ou rota separada?** **Opções:** A) rota separada `/acervo/cortes` com link no acervo | B) abas na mesma tela. **Recomendação: A** — recortes, filtros e ordenação diferentes; misturar paginação e estado de URL confunde. _(assumido — validar no gate)_ +- **Busca na biblioteca?** **Opções:** A) busca simples por título/descrição | B) sem busca nesta fatia. **Recomendação: A** — é o job do item (reencontrar); barra padrão da casa. _(assumido — validar)_ +- **Ordenação?** **Opções:** A) mais recentes primeiro | B) agrupar por discurso de origem. **Recomendação: A** — o corte é a unidade; a origem é contexto do item, com link para a fala. +- **Quem pode editar título/descrição?** **Opções:** A) qualquer um com acesso ao acervo (communicator+) | B) só quem criou + coordenação. **Recomendação:** A — equipe pequena; o kill switch cobre abuso. _(assumido — validar)_ +- **Despublicar apaga ou só desativa o link?** **Opções:** A) desativa; republicar restaura o mesmo link | B) apaga o corte público. **Recomendação:** A — reverter é barato e o corte continua na biblioteca. + +## Referências + +- GitHub Issue: — (após `pnpm agent:register`) +- Rascunho UI (gate): `docs/plans/c168-biblioteca-cortes-ui-draft.html` +- `src/app/(campaign)/campanha/(app)/comunicacao/acervo/page.tsx` · `acervo/[id]/page.tsx` · `src/components/campaign/speech/` (filtros, card, player) · `src/utilities/speech/speechListUrl.ts`/`speechPageData.ts` +- `src/lib/campaignPageChrome.ts` · `src/lib/campaignPaths.ts` · `src/utilities/campaignPageActor.ts` (gate `speechCatalog`) · `src/utilities/access/speeches.ts` · `src/components/campaign/shell/nav.ts` +- `tests/int/speechCatalog.int.spec.ts` · e2e `campaignSpeechAcervo` +- `AGENTS.md` — vertical Comunicação, leader lockdown, naming/i18n + +## Self-score (shaping) + +5/5 — (1) fatia com um outcome verificável: reencontrar/editar/republicar um corte sem refazer o corte; (2) appetite ~1–1,5 dia declarado e o escopo cabe (reuso do acervo, sem editor nem taxonomia nova); (3) persona, job e aceite em linguagem de usuário; (4) direção no codebase é hipótese com precedente nomeado, sem contrato; (5) zero decisão dura de engenharia (sem schema/collection/migration/signature).