diff --git a/docs/plans/acervo-videos-comunicacao-ui-draft.html b/docs/plans/acervo-videos-comunicacao-ui-draft.html new file mode 100644 index 00000000..840575a6 --- /dev/null +++ b/docs/plans/acervo-videos-comunicacao-ui-draft.html @@ -0,0 +1,434 @@ + + + + + + + UI draft — Vertical Comunicação + Acervo de falas (C154) + + +
+

+ UI draft — Vertical Comunicação + Acervo de falas (C154) +

+

+ Assessor de comunicação busca uma fala por assunto/tema/município, abre no trecho exato, lê + a transcrição clicável e baixa o vídeo. Papel próprio (communicator) com + navegação restrita à vertical. +

+

+ Cinza = estrutura existente · acento = novo neste item. + Cenas estáticas: sem interação, sem dados reais. +

+ +
+

+ Cena 1 · desktop — Acervo: busca e resultados +

+
+
+ + + + +
+
+

Acervo de falas

+

+ Discursos do Deputado Jorge Solla na Câmara +

+
+
+ + Farmácia Popular +
+ +
+
+ Ano: 2026 ▾ + Tema: Saúde ▾ + Alcance ▾ + Fase ▾ + Município ▾ + Duração ▾ + Limpar filtros +
+
+ +
+
+

23 falas encontradas

+

Mais recentes ▾

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

+ … o Governo Lula retomou a + Farmácia Popular + e ampliou o acesso a medicamentos, com recorde de unidades credenciadas na Bahia + … +

+
+ Saúde + Bahia + Farmácia Popular + Medicamento +
+
+ + + Abrir fonte +
+
+ + +
+
+ 05/06/2026 · 16:12 + · + Discussão e Votação + · + 7min02s +
+

+ … defendeu o financiamento do SUS e citou o impacto da + Farmácia Popular + nos municípios baianos, especialmente no interior … +

+
+ Saúde + Brasil + Sistema Único de Saúde (SUS) +
+
+ + + Abrir fonte +
+
+
+
+
+
+
+ +
+

+ Cena 2 · desktop — detalhe da fala (player + transcrição clicável) +

+
+
+

← Voltar ao acervo

+

+ Solla destaca retomada da Farmácia Popular e recorde na Bahia +

+

+ 11/08/2026 · 18:48 · Breves Comunicações · 4min25s · Plenário · Presidiu: + [placeholder] +

+ +
+
+
+
+ ▶ +
+
+
+
+ +
+
+
+ 01:12 + 04:25 +
+
+
+
+ + +
+ +

+ Transcrição (clique para posicionar) +

+
+
+ 00:00 + … agradeço, Presidente. Quero falar sobre a saúde … +
+
+ 01:12 + … o Governo Lula retomou a Farmácia Popular e ampliou o acesso a + medicamentos, com recorde de unidades credenciadas na Bahia … +
+
+ 02:40 + … e é preciso garantir o financiamento tripartite … +
+
+ 03:58 + … muito obrigado, Presidente. … +
+
+
+ + +
+
+
+
+ +
+

+ Cena 3 · mobile (~390px) — busca e resultados +

+
+
+ ☰ + Comunicação + +
+
+
+
+ Farmácia Popular +
+ +
+
+ Ano: 2026 ▾ + Tema: Saúde ▾ + Alcance ▾ +
+

23 falas encontradas

+
+

11/08/2026 · 4min25s

+

+ … retomou a + Farmácia Popular + e ampliou o acesso … +

+
+ Saúde + Bahia +
+ +
+
+
+
+ +
+

+ Cena 4 · estado vazio — nenhum resultado +

+
+

Nenhuma fala encontrada para "termo"

+

+ Tente outro termo, remova filtros ou busque por um tema. +

+
+ Saúde + Educação + Bahia + Limpar filtros +
+
+
+
+ + diff --git a/docs/plans/acervo-videos-comunicacao.md b/docs/plans/acervo-videos-comunicacao.md new file mode 100644 index 00000000..bafb8db8 --- /dev/null +++ b/docs/plans/acervo-videos-comunicacao.md @@ -0,0 +1,93 @@ +# Vertical Comunicação: papel communicator + Acervo pesquisável + +Status: rascunho +Atualizado em: 2026-09-12 +Issue: #956 +Priority: P1 +Impeccable: C — fluxo novo na vertical `/campanha/comunicacao` +Rascunho UI: docs/plans/acervo-videos-comunicacao-ui-draft.html +Appetite: ~2–3 dias; um outcome verificável — o assessor de comunicação entra com acesso próprio, busca uma fala por tema/município e assiste/baixa o trecho +Responsável: — + +## Intenção + +A comunicação da campanha depende de garimpar falas do Solla em YouTube e no portal da Câmara — sem busca, sem minutagem e sem saber o contexto. Este item abre a vertical de comunicação para quem produz conteúdo: um acesso próprio (`communicator`) que mostra só essa área, e o Acervo de falas — busca textual com destaque, filtros por tema/alcance/ano/fase/município e player que já abre no trecho, com transcrição clicável e download. + +## Persona e fluxo + +- **Persona / contexto:** assessoria de comunicação (jornalista/videomaker), no escritório ou em campo, produzindo card, áudio e vídeo com prazo curto; o Sollinha e o resto da campanha não são o trabalho dela. +- **Job principal:** achar a fala/trecho sobre um assunto, tema ou município e levar para a peça — assistindo no ponto exato e baixando o arquivo. +- **Fluxo desejado:** login → nav "Comunicação" → busca (ex.: "Farmácia Popular") → resultados com trecho destacado e chips de tema → abrir o detalhe → player já no timestamp do trecho → ler a transcrição clicável → baixar/abrir a fonte. +- **Anti-goals de produto:** editor de vídeo/corte no browser; segundo cadastro de pessoas; exposição pública do acervo; permissão por município (comunicação é global, não é carteira). + +### Esboço de fluxo (B/C/D) + +```text +[login] → nav Comunicação → busca/filtros → resultado com trecho destacado +→ detalhe: player no timestamp + transcrição clicável + baixar → [outcome: matéria-prima na mão] +``` + +### Rascunho UI (B/C/D) + +- Rascunho UI (gate): `docs/plans/acervo-videos-comunicacao-ui-draft.html` — cenas desktop (resultados e detalhe), mobile (~390px) e vazio. + +## Objetivo e aceite + +- Papel `communicator` ("Assessor de Comunicação"): vê e navega **só** a vertical (nav própria, sem as demais áreas da campanha); `coordinator`/`candidate` também veem; `advisor`/`leader` não têm acesso. +- `/campanha/comunicacao/acervo` com busca textual sobre os segmentos, destaque do termo e filtros: ano, tema, alcance, fase do discurso, município citado, duração. +- Keywords oficiais aparecem como chips e também são pesquisáveis (termo exato). +- Detalhe com player iniciando no trecho, transcrição clicável por segmento, sumário, contexto da sessão (fase, quem presidia) e ações: baixar (VOD) e abrir fonte. +- Estados críticos: vazio (sem resultado), carregando e sem permissão. +- Mobile utilizável (a assessoria trabalha em campo). +- **Guardrails:** vídeo servido do VOD da Câmara nesta fase (sem espelho); crédito à Câmara (CC BY 4.0); nenhum dashboard de vaidade. + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, superfície — resultados com trecho e contagem por faceta. +- **Decisões desbloqueadas:** a assessoria escolhe qual fala cortar para um tema e qual material cobre um município. +- **Forma:** _adiada ao plano de implementação_ — aqui só a restrição: nada de % estadual absoluto nem KPI de vaidade. + +## Dados da decisão (literais) + +- **Papel:** `communicator` — rótulo "Assessor de Comunicação". +- **Rotas:** home da vertical `/campanha/comunicacao`; acervo `/campanha/comunicacao/acervo`; detalhe `/campanha/comunicacao/acervo/[id]`. +- **Filtros:** ano · tema · alcance · fase do discurso · município citado · duração. +- **Facetas (rótulos):** os 18 temas e os 3 alcances definidos no C153. +- **Comportamento do player:** abrir no início do segmento selecionado; transcrição clicável posiciona o vídeo. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** `src/app/(campaign)/campanha/(app)/comunicacao/…` (páginas + server actions), `src/components/campaign/comunicacao/`, `src/lib/campaignRoles.ts` (predicado do papel), `src/components/campaign/shell/nav.ts` (nav do communicator), `src/lib/campaignPageChrome.ts` (título/aba), `src/utilities/campaignPageActor.ts` (gate novo), módulo de access reexportado por `campaignAccess.ts`, e busca em endpoint `POST` no wrapper `campaignJsonMutationRoute`. +- **Precedente a olhar:** `src/components/campaign/supporter/` (lista + filtros), `home-search` (busca com `contains`), `src/app/(campaign)/campanha/(app)/assessores/` (página gated). +- **Risco de acoplamento:** não abrir as demais áreas para o `communicator` (ele não é staff); leader lockdown intocado; nada de permissão por município. + +## Dependências + +- **C153** (acervo no banco) — sem dados não há busca; o rascunho UI pode ser validado antes. + +## Fora de escopo + +- Clipes/editor e espelhamento em S3. +- Busca semântica/IA (item futuro próprio). +- Exposição pública e compartilhamento externo. +- Comissões/audiências (Plenário apenas). +- Notificações, favoritos e listas editoriais (avaliar depois de uso real). + +## Rabbit holes de produto + +- **"Cortar o trecho no browser."** Se alguém "só completar": editor de vídeo, fila de render, storage. **Corte neste item:** player + download; corte é ferramenta externa. +- **"Permissão por município para a comunicação."** Se alguém "só completar": a vertical inteira vira carteira. **Corte neste item:** acesso global à vertical. +- **"Baixar em lote / coleções."** Se alguém "só completar": gerenciador de projetos. **Corte neste item:** busca e download por trecho. + +## Questões em aberto (produto) + +- **Home do communicator?** **Opções:** A) a própria vertical `/campanha/comunicacao` (recomendado) | B) Início genérico da campanha. **Recomendação:** A — ele não pertence ao fluxo de municípios. +- **Buscar também nas keywords cruas?** **Opções:** A) sim, como termo exato (recomendado) | B) só no texto. **Recomendação:** A — captura termos que a taxonomia não tem (ex.: "Banco Master"). +- **Transcrição exibida: oficial ou ASR?** **Opções:** A) oficial para leitura + ASR para posicionar (recomendado) | B) só ASR. **Recomendação:** A — taquigrafia é limpa para citar. + +## Referências + +- GitHub Issue: — (após `pnpm agent:register`) +- Rascunho UI (gate): `docs/plans/acervo-videos-comunicacao-ui-draft.html` +- `AGENTS-campaign.md` (auth e roles) · `src/lib/campaignRoles.ts` · `src/components/campaign/shell/nav.ts` · `docs/research/persona-emendas-coordenador-comunicacao.md` +- C153 (catálogo e facetas) · C155 (backfill/produção) diff --git a/docs/plans/backfill-acervo-falas.md b/docs/plans/backfill-acervo-falas.md new file mode 100644 index 00000000..2297af3a --- /dev/null +++ b/docs/plans/backfill-acervo-falas.md @@ -0,0 +1,80 @@ +# Backfill 2011–2026 + import de produção do acervo de falas + +Status: rascunho +Atualizado em: 2026-09-12 +Issue: #957 +Priority: P2 +Impeccable: A — N/A (dados/ops, sem UI) +Rascunho UI: N/A — sem UI +Appetite: ~1–2 dias + tempo de máquina; um outcome verificável — o acervo completo (54ª–57ª) está em produção com relatório de cobertura por legislatura +Responsável: — + +## Intenção + +O C153 prova o acervo com a 57ª legislatura; o valor pleno da vertical é o histórico — "o Solla sempre defendeu isso" só existe se as falas de 2011–2023 estiverem no catálogo. Este item roda o pipeline no acervo completo (~1.011 discursos) e coloca em produção, com relatório honesto de cobertura: quantos têm vídeo, quantos caíram no fallback, o que ficou de fora e por quê. + +## Persona e fluxo + +- **Persona / contexto:** agente/coordenação técnica rodando o import completo uma vez; a assessoria consome o resultado no Acervo (C154). +- **Job principal:** rodar o backfill, ver o relatório por legislatura e ter os dados disponíveis em produção. +- **Fluxo desejado:** executar o import completo (54ª–57ª) → acompanhar o relatório (processados, sem trecho, falhas) → validar uma amostra no Acervo → registrar pendências. +- **Anti-goals de produto:** não é o momento de expandir fonte (comissões), nem de automatizar recorrência, nem de corrigir sessão faltante à mão. + +## Objetivo e aceite + +- 54ª–57ª processadas com o pipeline do C153; idempotente em reexecução. +- Relatório por legislatura: total, processados, com vídeo, sem trecho, falhas, custo de transcrição e tempo. +- Dados disponíveis em produção (a vertical C154 os enxerga). +- Links do VOD validados na amostra (reprodução e download) e pendências documentadas (sessões sem trecho, limitações de fonte antiga). +- **Guardrail:** nenhuma escrita fora do acervo; nada de mídia espelhada nesta fase; crédito CC BY mantido. + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, derivado — o relatório de cobertura é insumo de decisão sobre o que falta; a superfície de consulta é o C154. +- **Decisões desbloqueadas:** coordenação decide se vale buscar fallback para sessões sem trecho e se o acervo já é suficiente para a produção de conteúdo. +- **Forma:** _adiada ao plano de implementação_ — aqui só a restrição: cobertura relatada por legislatura, sem maquiar falha como sucesso. + +## Dados da decisão (literais) + +- **Acervo esperado (API, em 2026-09-12):** 54ª = 1 · 55ª = 362 · 56ª = 414 · 57ª = 234 (total ~1.011 discursos). +- **Fonte/transcrição:** as mesmas do C152/C153 (`vod.camara.leg.br`; Deep Infra `openai/whisper-large-v3`, US$ 0,00045/min; licença CC BY 4.0). +- **Escopo de fonte:** Plenário apenas (a API de discursos não cobre comissões). +- **Idempotência:** chave natural por áudio+trecho (mesma do C153). + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** mesmo script do C153 (parametrizado por legislatura/período) + execução no ambiente de produção (homeserver) no padrão de manutenção já documentado em `docs/ops/teqo-1313-deploy.md`. +- **Precedente a olhar:** `scripts/recover-media.mjs` (relatório e guard), `scripts/deploy-homeserver.sh` (execução no runner self-hosted). +- **Risco de acoplamento:** produção é dado real — executar com guard explícito e idempotência comprovada antes. + +## Dependências + +- **C153** (pipeline e catálogo) — sem ele não há o que rodar. +- C154 (opcional) — não bloqueia os dados, mas é a validação visual recomendada antes de considerar o acervo entregue. + +## Fora de escopo + +- Comissões/audiências e outras fontes (YouTube próprio, redes). +- Agendamento recorrente do import (avaliar depois; se doer, item próprio). +- Espelhamento de mídia no S3 e geração de clipes. +- Correção manual de sessões sem trecho. +- Busca semântica (item futuro próprio). + +## Rabbit holes de produto + +- **"Cobrir comissões agora."** Se alguém "só completar": segunda fonte, segundo parser, segundo modelo. **Corte neste item:** Plenário apenas; comissões é item futuro. +- **"Completar à mão as sessões sem trecho."** Se alguém "só completar": curadoria manual interminável. **Corte neste item:** relatar e seguir. +- **"Automatizar o refresh semanal."** Se alguém "só completar": scheduler/worker sem demanda. **Corte neste item:** execução manual documentada. + +## Questões em aberto (produto) + +- **Incluir a 54ª legislatura (1 discurso)?** **Opções:** A) sim, por completude | B) não, irrelevante. **Recomendação:** A — custo zero e o relatório fica íntegro. _(assumido)_ +- **O que fazer com sessões sem trecho?** **Opções:** A) fallback YouTube quando houver VOD | B) só reportar. **Recomendação:** A quando viável, B documentado; sem trabalho manual. _(assumido — depende do C152)_ +- **Publicar o acervo completo antes ou depois do C154?** **Opções:** A) importar produção após o C154 validar a experiência | B) importar em paralelo. **Recomendação:** A — evita mexer em produção sem consumidor pronto. _(assumido)_ + +## Referências + +- GitHub Issue: — (após `pnpm agent:register`) +- Rascunho UI: N/A +- `docs/ops/teqo-1313-deploy.md` (execução em produção) · C153 (pipeline) · C154 (consumidor) +- Pesquisa do planejamento (2026-09-12): contagens por legislatura e confirmação do MP4 por trecho no VOD da Câmara. diff --git a/docs/plans/catalogo-falas-solla.md b/docs/plans/catalogo-falas-solla.md new file mode 100644 index 00000000..6967556f --- /dev/null +++ b/docs/plans/catalogo-falas-solla.md @@ -0,0 +1,83 @@ +# Catálogo de falas do Solla: import idempotente e busca textual + +Status: rascunho +Atualizado em: 2026-09-12 +Issue: #955 +Priority: P1 +Impeccable: A — N/A (dados; a superfície de produto é o C154) +Rascunho UI: N/A — sem UI +Appetite: ~2–3 dias; um outcome verificável — o acervo da 57ª legislatura existe no banco, com transcrição, segmentos com minutagem e facetas filtráveis, e pode ser reimportado sem duplicar +Responsável: — + +## Intenção + +O acervo de falas precisa existir antes de virar tela. Este item cria a base de dados do catálogo e o import idempotente que a popula a partir das fontes da Câmara: transcrição oficial, sumário, palavras-chave, segmentos com minutagem e facetas curadas (tema/alcance) mais menções extraídas (municípios, pessoas, programas, projetos). A 57ª legislatura entra como prova de ponta a ponta; o histórico completo é o C155. O texto oficial da taquigrafia é a fonte de leitura; a transcrição ASR entra para dar a minutagem que o texto oficial não tem. + +## Persona e fluxo + +- **Persona / contexto:** agente/coordenação técnica rodando o import; o consumidor final é o assessor de comunicação (UI no C154). +- **Job principal:** rodar o import uma vez e obter o acervo da 57ª legislatura com cobertura e falhas reportadas, podendo re-rodar a qualquer momento sem duplicar. +- **Fluxo desejado:** executar o script → ele varre os discursos, casa evento/trecho, baixa e transcreve, classifica e grava → imprime relatório (processados, com vídeo, sem trecho, falhas, custo). +- **Anti-goals de produto:** não é CMS de vídeo genérico; não é UI; não espelha mídia; não normaliza pessoas citadas como `Contact`. + +## Objetivo e aceite + +- Cada discurso do Solla vira um registro com: data/hora, legislatura, ano, duração, fase do discurso, tipo de sessão, quem presidia, sumário, transcrição oficial, **keywords oficiais preservadas**, segmentos com timestamps, facetas de tema/alcance e menções (municípios/pessoas/programas/projetos), além dos links do VOD (reproduzir/baixar) e do evento. +- Reexecutar o import não duplica registros (chave natural por áudio+trecho) e atualiza o que mudou. +- Relatório por execução: total, com vídeo, sem trecho, falhas, tempo e custo de transcrição. +- A busca textual por palavra funciona sobre os segmentos (acentos/variações ok) e é o motor do C154. +- **Guardrails:** facetas têm proveniência (`gazetteer | llm | manual`); keyword crua nunca é substituída pela faceta; leitura restrita a `communicator`, `coordinator` e `candidate`; nenhum espelhamento de vídeo nesta fase. + +## Dados (intenção) + +- **Vou apresentar dados?** Sim, derivado — a superfície é o C154; aqui o compromisso é que as facetas existem, são filtráveis e as menções são pesquisáveis. +- **Decisões desbloqueadas:** o assessor decide qual fala/trecho cortar por tema, alcance, ano, fase e município citado. +- **Forma:** _adiada ao plano de implementação_ — aqui só a restrição: leitura relativa/local (nada de dashboard de vaidade). + +## Dados da decisão (literais) + +- **Temas (facetas de política pública):** Saúde · Educação · Cultura · Esporte · Segurança Pública · Meio Ambiente · Economia e Trabalho · Direitos Humanos e Assistência Social · Infraestrutura e Transporte · Ciência e Tecnologia · Política e Instituições · Agricultura e Agropecuária · Habitação e Cidades · Comunicação e Mídia · Igualdade Racial · Mulheres e Gênero · Juventude · Pessoa com Deficiência. +- **Alcance:** Bahia · Brasil · Internacional (multi-seleção). +- **Proveniência da classificação:** `classifiedBy`: `gazetteer | llm | manual`. +- **Papel leitor:** `communicator` ("Assessor de Comunicação") + `coordinator`/`candidate`. +- **Fontes:** as mesmas do C152 (discursos, eventos, trecho/VOD, Deep Infra `openai/whisper-large-v3`, US$ 0,00045/min; licença CC BY 4.0 com crédito). +- **Escopo desta prova:** 57ª legislatura (2023+); histórico completo no C155. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** collections novas em `src/collections/` (discurso + segmento), módulo de access em `src/utilities/access/` reexportado por `src/utilities/campaignAccess.ts`, migration + `pnpm generate:types`, script `scripts/…` no padrão de `scripts/recover-media.mjs` (guard de banco local, `--dry-run`, relatório) e índice de busca no padrão `pg_trgm` já existente. +- **Precedente a olhar:** `src/migrations/20260719_020000_add_contact_trgm_index.ts` (índice trigram), `scripts/recover-media.mjs` (script idempotente), `src/utilities/ai/deepInfraTranscribe.ts`. +- **Risco de acoplamento:** não criar um "segundo cadastro de pessoa" para as menções; usar os catálogos existentes de municípios/deputados como gazetteer. + +## Dependências + +- **C152** (piloto da fonte) — decide endpoints/fallbacks antes de modelar. + +## Fora de escopo + +- UI/busca do assessor (C154). +- Backfill 2011–2026 e import de produção (C155). +- Espelhamento no S3 e geração de clipes. +- Comissões/audiências (a API de discursos cobre Plenário). +- Agendamento recorrente do import. +- Busca semântica/IA (item futuro próprio). + +## Rabbit holes de produto + +- **"Normalizar pessoas citadas como `Contact`."** Se alguém "só completar": segundo cadastro de pessoa paralelo. **Corte neste item:** menções como texto pesquisável; normalização é conversa futura. +- **"Classificação perfeita antes de importar."** Se alguém "só completar": taxonomia infinita e curadoria manual de mil discursos. **Corte neste item:** facetas com proveniência + correção manual depois. +- **"Baixar os vídeos para o S3 já."** Se alguém "só completar": ~6 GB e pipeline de mídia. **Corte neste item:** links do VOD da Câmara; espelho é fase própria. +- **"Transcrever por segmento e classificar cada segmento."** Se alguém "só completar": custo/ruído sem ganho — o discurso é a unidade. **Corte neste item:** segmentos herdam as facetas do discurso. + +## Questões em aberto (produto) + +- **Qual LLM classifica as facetas?** **Opções:** A) DeepSeek flash do Sollinha, com saída validada | B) modelo barato da Deep Infra (mesma chave da transcrição) | C) só gazetteers. **Recomendação:** A, com validação e fallback C. _(assumido — validar no gate)_ +- **Classificar no nível do discurso ou do segmento?** **Opções:** A) discurso (segmento herda) | B) segmento. **Recomendação:** A. _(assumido)_ +- **Onde rodar a primeira importação?** **Opções:** A) banco local de dev (recomendado; produção é C155) | B) já em produção. **Recomendação:** A. _(assumido)_ + +## Referências + +- GitHub Issue: — (após `pnpm agent:register`) +- Rascunho UI: N/A +- `AGENTS.md` ("Campaign Municípios model", convenções de access) · `src/utilities/campaignAccess.ts` · `src/lib/municipalityCatalog.ts` +- Pesquisa do planejamento (2026-09-12): keywords oficiais ruidosas (268 distintas em 47 discursos) — preservar cruas e usar como insumo do classificador. diff --git a/docs/plans/piloto-fonte-videos-camara.md b/docs/plans/piloto-fonte-videos-camara.md new file mode 100644 index 00000000..73669d00 --- /dev/null +++ b/docs/plans/piloto-fonte-videos-camara.md @@ -0,0 +1,76 @@ +# Piloto da fonte: vídeos e transcrição minutada de um discurso da Câmara + +Status: rascunho +Atualizado em: 2026-09-12 +Issue: #954 +Priority: P1 +Impeccable: A — N/A (spike de fonte de dados, sem UI) +Rascunho UI: N/A — sem UI +Appetite: ~1 dia; um outcome verificável — 2–3 discursos de legislaturas diferentes processados ponta a ponta com relatório de viabilidade +Responsável: — + +## Intenção + +O catálogo de falas do Solla depende de uma fonte externa (a Câmara dos Deputados) que nunca foi usada neste repo. Antes de construir banco, import e tela, é preciso provar que o caminho existe de ponta a ponta e travar as quatro incógnitas que decidem o desenho do acervo: os links de vídeo por discurso são permanentes? Sessões antigas (2011–2015) têm trechos por orador? A transcrição via Deep Infra devolve segmentos com minutagem? O casamento discurso ↔ evento ↔ trecho funciona em anos antigos? Este item responde isso com 2–3 discursos reais e um relatório curto — sem construir o acervo. + +## Persona e fluxo + +- **Persona / contexto:** agente de engenharia no terminal, sem UI; o resultado interessa a quem vai construir o acervo (C153). +- **Job principal:** processar 2–3 discursos de legislaturas diferentes e responder as quatro incógnitas com evidência (URL, arquivo, JSON). +- **Fluxo desejado:** escolher discursos (um recente, um da 55ª/56ª) → achar o evento e o trecho do orador → baixar o MP4 do VOD → extrair áudio → transcrever com segmentos → imprimir relatório (tempos, custos, links, falhas). +- **Anti-goals de produto:** não é o acervo; não cria collection, UI nem importa em produção; não baixa o acervo inteiro. + +## Objetivo e aceite + +- 2–3 discursos processados ponta a ponta, com o MP4 do VOD baixado e a transcrição com segmentos exibida (início/fim/texto). +- Relatório responde: (1) permanência dos links `vod.camara.leg.br`; (2) cobertura de trechos na 55ª/56ª; (3) timestamps no Deep Infra (qual endpoint/param funciona); (4) casamento discurso ↔ evento ↔ trecho em anos antigos. +- Custos e tempos medidos (download, extração de áudio, transcrição) e fallback recomendado para cada incógnita que falhar. +- **Guardrail:** nada escrito em banco de produção; artefatos do piloto ficam fora do repo (ou em `data/`, gitignored). + +## Dados (intenção) + +- **Vou apresentar dados?** N/A — relatório técnico de engenharia, sem superfície de produto; quem consome é o C153. + +## Dados da decisão (literais) + +- Lista de discursos: `GET https://dadosabertos.camara.leg.br/api/v2/deputados/178857/discursos?dataInicio=…&dataFim=…&itens=100&ordenarPor=dataHoraInicio&ordem=ASC` (header `X-Total-Count`; campos `transcricao`, `sumario`, `keywords`; `urlVideo`/`urlAudio` vêm nulos). +- Eventos: `GET https://dadosabertos.camara.leg.br/api/v2/eventos?dataInicio=…&dataFim=…` e `GET …/eventos/{id}` (campo `urlRegistro` = YouTube do evento). +- Página do evento (trechos por orador): `https://www.camara.leg.br/evento-legislativo/{id}` — cada trecho tem orador, partido, horário, duração, `a` (= idAudio) e `t` (= epoch ms do início). +- Vídeo do trecho: `GET https://www.camara.leg.br/evento-legislativo/{id}/video-sob-demanda?idAudio={a}&trecho={t}` → JSON `{ estado, video: { titulo, subtitulo, duracao, horario, linkParaDownload, linkParaReproducao } }`. +- Fallback YouTube: `startTimestamp` do VOD; offset = `t / 1000 − startTimestamp`. +- Transcrição: Deep Infra `openai/whisper-large-v3`, `language=pt`, US$ 0,00045/min; testar o endpoint compatível (`verbose_json` + segmentos) e, se não houver timestamp, o nativo (`chunk_level: segment|word`). +- Licença da fonte: transmissões de atividades legislativas são CC BY 4.0 — crédito obrigatório, marca d'água intocada. + +## Direção no codebase (hipótese) + +- **Áreas prováveis:** script `.mjs` em `scripts/` no padrão de `scripts/lib/cli.mjs` (`loadCliEnv`, `dieWithLabel`) e `scripts/recover-media.mjs` (download + cache + relatório); sem collection, sem Payload. +- **Precedente a olhar:** `scripts/recover-media.mjs` (download com cache/`sha256`), `src/utilities/ai/deepInfraTranscribe.ts` (chamada Deep Infra existente). +- **Risco de acoplamento:** nenhum com o app; só não deixar artefatos de mídia no git. + +## Dependências + +- Nenhuma — é a raiz do encadeamento (C153 depende deste). + +## Fora de escopo + +- Construir o acervo/import (C153), UI (C154), backfill (C155). +- Classificação por facetas e enriquecimento de metadados. +- ASR local em GPU própria; worker/scheduler; espelhamento em S3. + +## Rabbit holes de produto + +- **"Já baixar o acervo inteiro."** Se alguém "só completar": ~25 GB e horas de máquina antes de validar a fonte. **Corte neste item:** 2–3 discursos. +- **"Montar o pipeline definitivo de import."** Se alguém "só completar": desenho de collection/transação cedo demais. **Corte neste item:** prova descartável + relatório. +- **"Transcrever na GPU local."** Se alguém "só completar": setup CUDA/Blackwell vira o projeto. **Corte neste item:** Deep Infra; GPU é assunto separado. + +## Questões em aberto (produto) + +- **Deep Infra compat ou nativo?** **Opções:** A) endpoint compatível (`/v1/openai/audio/transcriptions` com `verbose_json`) | B) endpoint nativo (`/v1/inference/…` com `chunk_level`). **Recomendação:** A se devolver segmentos (menos código, reusa o padrão do B173); B como fallback. _(assumido — validar no piloto)_ +- **Sessão antiga sem trecho por orador?** **Opções:** A) cair para o YouTube do evento (offset pelo `startTimestamp`) | B) reportar e seguir. **Recomendação:** A quando houver VOD; B documentado no relatório. _(assumido — validar no piloto)_ + +## Referências + +- GitHub Issue: — (após `pnpm agent:register`) +- Rascunho UI: N/A +- `src/utilities/ai/deepInfraTranscribe.ts` · `scripts/recover-media.mjs` · `scripts/lib/cli.mjs` +- Pesquisa do planejamento (2026-09-12): acervo 54ª–57ª = 1/362/414/234 discursos; trechos por orador confirmados na página do evento; MP4 direto do VOD com Range/206.