diff --git a/docs/changelog/2026-09-16-c178.md b/docs/changelog/2026-09-16-c178.md
new file mode 100644
index 00000000..7328e1f3
--- /dev/null
+++ b/docs/changelog/2026-09-16-c178.md
@@ -0,0 +1 @@
+**C178 — Acervo: o player do YouTube deixa de ser uma parede de signin (2026-09-16):** o defeito continuava após o C171/#1047: abrir uma fala com vídeo ainda caía primeiro no embed do YouTube, que responde "faça login para exibir o vídeo" — e o app não vê o erro interno do iframe (sem `onError`/`enablejsapi`), então a saída não podia depender de detectar o bloqueio. A resolução é remover a porta de entrada embutida: no `SpeechDetailPlayer`, o `
- ) : resolution.kind === 'failed' ? (
-
- {resolution.message ??
- 'Não foi possível resolver o arquivo deste trecho na Câmara. Tente novamente.'}
-
- O arquivo deste trecho não pôde ser verificado na Câmara agora.
-
- ) : null
- ) : null
+ // C178 — the exit block stays reachable in every state: the app never sees the
+ // reason the video cannot play, so the way out cannot depend on detecting it.
+ // The Câmara panel owns the primary CTA while it is idle ("Assistir o trecho");
+ // once it leaves that state the external exit takes the primary slot.
+ const exitTakesPrimary =
+ Boolean(youtubeWatchUrl) && (!vodResolvable || resolution.kind !== 'idle')
+ const exitVariant = exitTakesPrimary ? 'default' : 'outline'
- // C171 — the exit block stays reachable with the embed playing: the app
- // never sees the iframe's internal error, so the way out cannot depend on
- // detecting the block.
const renderYoutubeExit = (): ReactNode => {
if (!youtubeWatchUrl) return null
+
return (
-
- Se o vídeo não abrir aqui, assista por outro caminho:
-
)
}
@@ -497,10 +472,10 @@ export const SpeechDetailPlayer = ({
) : null}
{vodResolvable ? (
- {inlineNotice}
-
{publishedCut ? : null}
{selection ? (
diff --git a/tests/e2e/campaignSpeechAcervo.e2e.spec.ts b/tests/e2e/campaignSpeechAcervo.e2e.spec.ts
index 6df78d13..8599f4c8 100644
--- a/tests/e2e/campaignSpeechAcervo.e2e.spec.ts
+++ b/tests/e2e/campaignSpeechAcervo.e2e.spec.ts
@@ -9,12 +9,13 @@ import { assertCampaignRedirect, expect, rendered, test } from './fixtures/campa
* C154/C162 — the communication vertical over real HTTP (browserless,
* OPS35/OPS87): role gates, the acervo search rendering (highlight + excerpt),
* the filter URL contract and the detail's player/transcript/actions. The
- * player picks the surface from the row coordinates — YouTube default when the
- * session link parses, stored-VOD capa resolved on click otherwise, honest
- * unavailable state when neither exists — and the stored VOD link itself is
- * never rendered (C162). Playback is browser territory and is not asserted
- * here; the HTML carries the contract (`