{
  "id": "clube-recursao",
  "titulo": "Como explicar recursão?",
  "categoria": "elementos",
  "resumo": "vídeo explicativo de 77 s, em 16:9 e sem narração, que explica recursão sendo ele mesmo uma pilha de chamadas: cada gênero (explainer corporativo, terminal, videogame 8-bit, documentário de natureza, filme noir, TV infantil, infomercial e trailer de cinema) começa a frase, \"chama\" o gênero seguinte, que já está passando numa tela dentro dele, e só termina a frase na volta. No fundo da pilha fica o caso base, uma página HTML sem estilo nenhum. É uma recriação do \"Recursion explained in genres\" de Ethan Mollick (@emollick), publicado no prompt-motion.com (`emollick-8661a8`) e feito numa tentativa só com o Claude Opus 5.5 a partir de uma frase. A recriação trocou a narração por texto na tela, criou uma câmera que mergulha de tela em tela sem cortes (zoom Droste com o conteúdo ao vivo) e vestiu a mesma música com o figurino de cada gênero. Feito em HyperFrames (HTML + GSAP), com cerca de 330 efeitos sonoros.",
  "indicado": "criador ou professor explicando um conceito técnico com humor; conteúdo educativo que quer prender pela forma.",
  "estilo": [
    "metalinguagem",
    "tela dentro da tela",
    "zoom contínuo",
    "oito estilos",
    "personagens animados",
    "paródia de gêneros"
  ],
  "ficha": {
    "formato": "1920×1080, 60 qps, 16:9",
    "duracao": "77,0 s",
    "motor": "html",
    "voz": "sem narração; o texto na tela é a narração, no estilo de cada gênero",
    "musica": "ver o guia de estilo",
    "fontes": "ver o guia de estilo"
  },
  "ferramentas": [
    "Claude Code"
  ],
  "ficha_tecnica": {
    "Duração": "77,0 s",
    "Formato": "1920×1080, 60 qps, 16:9",
    "Voz": "sem narração; o texto na tela é a narração, no estilo de cada gênero",
    "Ferramenta": "HyperFrames 0.8.144 (HTML + GSAP); render a 120 qps juntado em 60 qps com motion blur",
    "Referência": "\"Recursion explained in genres\" (@emollick), 75 s, com narração em TTS; categorias Characters e Code",
    "Trilha": "\"When They Fight, They Fight\" (Generationals) como espinha contínua, tratada por gênero; \"Red Right Hand\" (Nick Cave & The Bad Seeds) só no noir",
    "Som": "cerca de 330 efeitos (334 eventos); mix final a −14,0 LUFS, pico −0,8 dBFS"
  },
  "etapas": [
    {
      "titulo": "O roteiro",
      "texto": "**Resumo:** o roteiro é uma pilha de chamadas. Na descida (0–47 s), cada gênero começa a explicar recursão, para no meio da frase e mergulha no gênero seguinte; no fundo fica o caso base (47–52 s); na subida (52–77 s), cada gênero termina a frase e devolve a vez para o de cima. Não há voz: o texto na tela, em inglês e no estilo de cada gênero, é a narração. Os tempos vêm do cronograma do `hf/CONTRATO-CENAS.md` (120 BPM, uma batida a cada 0,5 s).\n\n## Como a história foi montada\n\n- **Pedido original:** explicar recursão com cada explicação num estilo de vídeo radicalmente diferente, de forma autorreferente, esperta e rápida.\n\n- **Estrutura:** a frase cortada na ida e completada na volta; contador de profundidade com CALL e RETURN; caso base sem estilo nenhum; final que volta ao quadro 0.\n\n- **Regra do texto:** as palavras aparecem quando seriam \"ditas\" (palavra a palavra, máquina de escrever ou do jeito do gênero), grandes o bastante para o celular.\n\n## Cronograma da pilha\n\n | \n\n | Prof.\n | Cena\n | Descida\n | Mergulho no próximo\n | Volta do próximo\n | Subida\n\n | 0\n | intro\n | 0–4,0\n | 4,0–4,5\n | 72,5–73,0\n | 73,0–77,0\n\n | 1\n | explainer\n | 4,5–9,0\n | 9,0–9,5\n | 70,0–70,5\n | 70,5–72,5\n\n | 2\n | terminal\n | 9,5–14,0\n | 14,0–14,5\n | 68,0–68,5\n | 68,5–70,0\n\n | 3\n | 8-bit\n | 14,5–19,0\n | 19,0–19,5\n | 65,5–66,0\n | 66,0–68,0\n\n | 4\n | natureza\n | 19,5–24,0\n | 24,0–24,5\n | 63,0–63,5\n | 63,5–65,5\n\n | 5\n | noir\n | 24,5–29,5\n | 29,5–30,0\n | 60,5–61,0\n | 61,0–63,0\n\n | 6\n | TV infantil\n | 30,0–34,5\n | 34,5–35,0\n | 58,0–58,5\n | 58,5–60,5\n\n | 7\n | infomercial\n | 35,0–40,5\n | 40,5–41,0\n | 55,0–55,5\n | 55,5–58,0\n\n | 8\n | trailer\n | 41,0–46,5\n | 46,5–47,0\n | 52,0–52,5\n | 52,5–55,0\n\n | 9\n | caso base\n | 47,0–52,0\n | —\n | —\n | —\n\n## Texto da tela por gênero\n\n | \n\n | Gênero\n | Na descida\n | Na subida\n\n | Intro\n | `RECURSION?` · `EASY.` · o player sobe e o play é clicado\n | `RECURSION.` · `STILL CONFUSED?` · `WATCH THIS VIDEO.` · o player rebobina e o play é clicado de novo\n\n | Explainer\n | `The super simple guide` · `Recursion is super simple.` · `It's when something is defined in terms of…`\n | a frase termina com a palavra que faltava\n\n | Terminal\n | `man recursion` · `RECURSION(1)` · `recursion — a function that solves a problem by calling` · `explain(smaller(topic)) depth=3` · `◀ you are here`\n | digita `itself.`, que acende; `[3] explain() returned ✓` · `Process finished with exit code 0` · EXIT 0 brilhando\n\n | 8-bit\n | `SUPER RECURSIVE QUEST` · `PRESS START` · `EACH CALL IS A NEW LEVEL.` · `THE GAME SAVES YOUR SPOT,` · `SO YOU CAN COME BACK` · `RIGHT WHERE YOU…`\n | `LEFT OFF!` · `LEVEL CLEAR!` · `SAVING...`\n\n | Natureza\n | `Episode IV` · `RECURSION` · `A Natural History` · `The Recursive Fern` · `Polypodium recursivum` · `Recursion is everywhere in nature.` · `Each frond…` (`smaller…`)\n | `Fronds, all the way down.` · `Magnificent.`\n\n | Noir\n | `The Recursive Case` · `A CASE FILE IN B&W` · `Recursion.` · `A case inside a case inside…` · `And if it never stops…` · `So get yourself a…`\n | o isqueiro acende e o carimbo vermelho `BASE CASE` bate na pasta\n\n | TV infantil\n | `RECURSION TIME!` · `Hi friends!` · `Open a doll…` · `SMALLER doll inside!` · `Keep going,`\n | `…the TINIEST doll!` · `YAAAY!` · `Bye, friends!`\n\n | Infomercial\n | `AS SEEN ON TV` · `INTRODUCING…` · `THE RECURSION-MATIC 3000™` com o selo `SOLVES ANY PROBLEM` · antes: `GOT A BIG PROBLEM?` · depois: `JUST SOLVE A SMALLER COPY OF IT!` · `HOW?` `SIMPLE.` `YOU JUST…` · `BUT WAIT—THERE'S MORE!`\n | a frase do apresentador termina; `CALL NOW!` e as letras miúdas\n\n | Trailer\n | `IN A WORLD…` · `WHERE EVERY PROBLEM` · `HIDES A SMALLER ONE` · `TO REACH…`\n | `BASE CASE.` · `RECURSION` · `COMING SOON.` · `AND AGAIN.` · cartão de classificação e créditos (\"directed by f(f(n))\")\n\n | Caso base\n | `Base case` · `Nothing left to break down, so I just return` · o botão é clicado · `↑ Now, every paused layer finishes its sentence.` · `Best viewed at depth 9.`\n | —\n\n## Momentos para a trilha\n\n- 0–47 s: a espinha muda de figurino a cada mergulho, no meio do zoom, coberta pelo whoosh; cada chamada toca uma nota acima.\n\n- 24,5–30 s e 60,5–63 s: o noir troca para \"Red Right Hand\".\n\n- 47–52 s: caso base em silêncio, só cliques e ruído de sala.\n\n- 52–73 s: a volta acelera (de 2,5 s para 1,5 s por nível); cada retorno toca uma nota abaixo e cada gênero fecha com o seu gesto.\n\n- 73–77 s: intro de novo, pergunta final e o loop para o começo.\n\nOs 334 eventos de som estão em `audio/events.json`; os mergulhos e o loop, em `audio/schedule.json`."
    },
    {
      "titulo": "A identidade visual",
      "texto": "**Resumo:** não existe uma identidade única: cada profundidade da pilha é um gênero de vídeo com paleta, tipografia, textura, câmera e personagens próprios, numa versão \"premium\" do gênero. O que amarra tudo é o motor: a câmera mergulha de tela em tela com zoom de ponto fixo, o HUD da pilha fica sempre no topo e a mesma música atravessa o vídeo trocando só de figurino. Os números saem do `hf/engine.js`, das cenas, do `hf/CONTRATO-CENAS.md` e do `audio/build_audio.py`.\n\n## Os gêneros\n\n | \n\n | Prof.\n | Gênero\n | Fontes\n | Paleta e textura\n | A \"tela\" para o próximo\n\n | 0\n | intro e fecho\n | Anton, JetBrains Mono\n | `#0B0B10`, vermelho `#FF3B30`, amarelo `#FFD60A`; túnel de molduras, granulado\n | um player de vídeo\n\n | 1\n | explainer corporativo (escola Headspace/Slack)\n | Inter\n | creme `#FFF6EA`, roxo `#6C5CE7`, coral `#FF7A59`, sol `#FFC93C`, tinta `#23234A`; ilustração chapada\n | o laptop da apresentadora\n\n | 2\n | terminal\n | VT323\n | fósforo verde `#39FF7A` sobre `#021108`; CRT\n | uma janela de emulador que salta da linha de código\n\n | 3\n | videogame 8-bit, \"SUPER RECURSIVE QUEST\"\n | Press Start 2P\n | canvas de 320×180 ampliado 6×\n | a tela do jogo\n\n | 4\n | documentário de natureza\n | Cormorant Garamond (itálico)\n | bokeh, luz natural; samambaia recursiva em canvas\n | uma gota de orvalho (portal redondo)\n\n | 5\n | filme noir, \"The Recursive Case\"\n | Special Elite, Oswald\n | preto e branco estrito: luz de persiana, fumaça, granulado, tremor de projeção\n | a tela do projetor\n\n | 6\n | TV infantil de feltro, \"RECURSION TIME!\"\n | Fredoka\n | céu `#8FD3FF`, rosa `#FF5FA2`, vermelho `#E8443A`, azul `#3E7BE6`, amarelo `#F5B82E`, verde `#3FB25A`, roxo `#9B5DE5`\n | uma TV de feltro que salta numa mola\n\n | 7\n | infomercial dos anos 90\n | Bangers, Anton\n | magenta `#E0218A`, amarelo `#FFD60A`, roxo `#6A2BD9`; VHS com OSD, linhas e ruído\n | a TV do estúdio\n\n | 8\n | trailer de cinema\n | Cinzel\n | azul-petróleo `#05090B → #0D1C22` com ouro `#FFF3C4 → #E9C46A → #8A5A1C`; névoa, feixes de luz, reflexos anamórficos\n | a tela do cinema\n\n | 9\n | caso base\n | Times New Roman, de propósito\n | HTML padrão: botão padrão, link azul sublinhado, ampliado como num navegador a 250%\n | nenhuma\n\nTexto que é narração: linhas principais de 80 a 160 px, legendas de pelo menos 48 px, cada linha na tela por pelo menos 1,2 s. Todo texto de destaque tem acabamento do gênero (brilho, bisel, metal, extrusão, contorno, textura de tinta), menos no caso base.\n\n## HUD da pilha\n\n- Barra de chamadas no topo à esquerda (y < 100 px): vidro escuro a 62%, borda branca a 14%, um chip no estilo de cada gênero que entra na pilha.\n\n- Contador de profundidade no canto superior direito: Anton de 84 px rolando como odômetro, com a etiqueta \"▼ CALL\" (amarela, `#FFD60A`) na descida e \"▲ RETURN\" (verde, `#34C759`) na volta.\n\n- Na profundidade 9, o HUD perde o estilo: Times, preto e link azul sublinhado.\n\n## Transições\n\nToda troca é um mergulho na tela onde o próximo gênero já está passando:\n\n- **Zoom de ponto fixo:** `Z = 1920/R.w`, `f = Z·R.xy/(Z − 1)`, escala `Z^p` com `p` de 0 a 1. Mãe: `x' = f + Z^p·(x − f)`; filha: a mesma transformação composta com R.\n\n- **Descida:** antecipação de −3% nos 0,28 s antes, mergulho de 0,5 s em `cubic-bezier(.62, 0, .22, 1)`, overshoot de 1,4% e assentamento em 0,45 s.\n\n- **Subida:** a filha empurra 1,8% para dentro (antecipação) e sai em `cubic-bezier(.55, 0, .18, 1)`.\n\n- **Recorte:** `clip-path: inset(0 round r)` com o raio indo a 0 no fim do zoom; na gota, `clip-path: circle()` que abre do círculo inscrito até a meia-diagonal.\n\n- **Camadas:** moldura, vidro, mão e cursor da mãe ficam acima da filha (`z-index` de `1000 − nível`).\n\n- A tela pode se mexer (mola, TV saltando) e a câmera segue, porque o retângulo é recalculado a cada quadro.\n\n## Curvas, molas e câmera\n\n- **Mola padrão:** linear de 0 a 1 em 0,25 s e depois ~112% de overshoot que assenta em ~0,6 s; vale para cartões, balões, selos e palavras.\n\n- **Câmera de cada cena:** `drift(t)` com empurrão lento (~1,2%) e flutuação orgânica (~6 px); a câmera nunca para.\n\n- **Personagens:** SVG de formas simples; squash & stretch em pulos e pousos, antecipação, ação sobreposta (cabelo, gravata, antena e orelhas atrasam), piscar a cada 2–4 s (~0,12 s), boca que mexe enquanto a fala está na tela, respiração (escala vertical 1 ↔ 1,015 a ~0,3 Hz).\n\n- **Acaso com semente:** `hash(n)` e `rng(seed)` só na montagem; texturas geradas uma vez e reaproveitadas.\n\n- **Motion blur:** render a 120 qps e `tmix=frames=2` para 60 qps.\n\n## Trilha\n\n | \n\n | Item\n | Valor\n\n | Espinha\n | \"When They Fight, They Fight\" (Generationals), 120 BPM, contínua desde 30,08 s da faixa (batidas em `0,08 + 0,5·n`)\n\n | Explainer\n | limpa e brilhante\n\n | Terminal\n | alto-falante pequeno (380–3.400 Hz) e leve bitcrush\n\n | 8-bit\n | bitcrush de 5 bits e redução de amostras ×7\n\n | Natureza\n | instrumental com passa-baixa em 1,4 kHz e hall de 3,2 s\n\n | Noir\n | troca para \"Red Right Hand\" (Nick Cave & The Bad Seeds), esticada a 120 BPM (`atempo=1.04`), mono, com estalo de vinil\n\n | TV infantil\n | +4 semitons (rubberband)\n\n | Infomercial\n | som de TV (220–6.500 Hz) com saturação\n\n | Trailer\n | metade da velocidade, uma oitava abaixo, reverb de catedral\n\n | Caso base\n | sem música: só cliques e ruído de sala\n\nAs trocas acontecem no meio de cada mergulho, cobertas pelo whoosh.\n\n## Sound design e mix\n\n- Cada cena registra um evento por ação audível (`{ t, kind, desc }`); são 334 no `audio/events.json`. Tipos: pop, whoosh, impacto, clique, tique, digitação, blip, pulo, moeda, power-up, carimbo, boing, brilho, sino, braam, dinheiro, plateia, \"yay\" de criança, isqueiro, projetor, rebobinar, gota, taça, papel, CRT ligando, estática.\n\n- **Nota da pilha:** cada chamada toca uma nota pluck (Karplus-Strong) uma posição acima na pentatônica de Ré maior; cada retorno, uma abaixo.\n\n- **8-bit sintetizado:** blip, pulo com varredura, moeda (Si → Mi) e power-up em arpejo, em onda quadrada.\n\n- As ambiências (pássaros, chuva, parquinho, plateia, drone escuro) e os golpes cinematográficos vêm da biblioteca premium.\n\n- Trilha a ~−19 LUFS antes da soma, efeitos nivelados ×2,2, `loudnorm` em duas passagens: −14,0 LUFS, pico −0,8 dBFS. Por trecho, os gêneros ficam entre −15,6 e −11,9 LUFS; o caso base, em −25, de propósito.\n\n- Sincronia medida na faixa só de efeitos: cliques e carimbos a 2–46 ms do evento.\n\n## O que é \"humano\" neste vídeo\n\n- Nenhuma cena congela: deriva de câmera, piscadas, poeira, chama e tremor de projeção o tempo todo.\n\n- O próximo gênero já está vivo dentro da tela antes do mergulho, e a cena de cima continua viva enquanto a de baixo encolhe na volta.\n\n- Os personagens atuam: o herói do 8-bit corre e pula, o detetive do noir acende o isqueiro, a TV infantil termina num YAAAY.\n\n- Cada gênero termina a frase com um gesto próprio na volta.\n\n- O caso base é parado e sem graça de propósito, e é por isso que funciona."
    },
    {
      "titulo": "A montagem no HyperFrames",
      "texto": "- **Instale o básico:** Node.js (para o `npx`), ffmpeg e Python 3 com numpy, soundfile, librosa e scipy. As fontes vêm no pacote. O GSAP é carregado do CDN (jsdelivr) no `index.html`: é preciso internet, ou baixe o `gsap.min.js` 3.14.2 para dentro de `hf/` e troque a linha do script.\n\n- **Veja a composição:** dentro de `hf/`, rode `npx --yes hyperframes@0.8.144 preview`. Para conferir uma cena: `npx --yes hyperframes@0.8.144 snapshot --at 31.0,32.4,34.2 --no-end --describe false -o ../revisao/teste .` (cerca de 10 s).\n\n- **Render:** `npx --yes hyperframes@0.8.144 render hf --fps 120 --quality high --workers 4 --output render/video-120.mp4` (levou 14 min 32 s e gera ~500 MB) e depois junte em 60 qps com o áudio: `ffmpeg -i render/video-120.mp4 -i audio/mix_v2.wav -vf \"tmix=frames=2:weights=1 1,fps=60,format=yuv420p\" -map 0:v -map 1:a -c:v libx264 -crf 16 -c:a aac render/final.mp4`.\n\n- **Som** (opcional): aponte `NIV` e `PREM` no `build_audio.py` para `audio/sfx/nivelados` e `audio/sfx/premium` e rode `python audio/build_audio.py audio/events.json audio/mix.wav`, depois `python audio/loudnorm.py audio/mix.wav audio/mix_final.wav`.\n\n**Pegadinhas:** em render paralelo, todo canvas precisa de `getContext('2d', {willReadFrequently: true})`, senão aparecem quadros vazios; as fontes têm de carregar (`document.fonts.load`) antes de registrar a timeline. A fonte Bangers não tem ★ nem ▶: desenhe em SVG. Uma cena vista antes como miniatura não pode sumir e se reconstruir quando o zoom pousa: o estado da miniatura tem de ser o primeiro estado da cena."
    },
    {
      "titulo": "As decisões de direção",
      "texto": "- **A estrutura é a pilha de chamadas.** Na descida, cada gênero começa a frase e é cortado; na subida, termina a frase com um gesto de conclusão (EXIT 0, LEVEL CLEAR, o carimbo BASE CASE, a gota caindo, YAAAY).\n\n- **Zoom Droste com ponto fixo.** Para entrar numa tela de retângulo R: `Z = 1920/R.w`, ponto fixo `f = Z·R.xy/(Z − 1)`, escala `Z^p`. Em `p = 1` a cena filha fica exatamente em tela cheia, sem salto, e a escala logarítmica dá velocidade constante aos olhos.\n\n- **Conteúdo vivo dentro da tela.** A cena seguinte já está passando dentro da tela pelo menos 1,2 s antes do mergulho; moldura, vidro, mão e cursor ficam numa camada acima dela.\n\n- **A mesma música, outro figurino.** A espinha nunca para; só muda o tratamento (alto-falante pequeno no terminal, bitcrush no 8-bit, passa-baixa e hall na natureza, tom acima na TV infantil, TV saturada no infomercial, metade da velocidade e catedral no trailer). O noir troca de música, e o caso base fica sem música.\n\n- **A pilha se ouve.** Cada chamada toca uma nota uma posição acima na pentatônica de Ré maior (o tom da música); cada retorno, uma abaixo.\n\n- **Cada gênero na sua versão premium.** Paleta, tipografia, textura, câmera e personagens próprios; os personagens têm antecipação, squash & stretch, piscadas, boca que acompanha as palavras e cabelo, antena e gravata com atraso.\n\n- **O caso base sem estilo.** Times, um botão padrão, um link azul sublinhado; até o HUD perde o estilo nessa hora.\n\n- **Volta que respira.** A subida acelera de 2,5 s para 1,5 s por nível, e o fim pergunta \"STILL CONFUSED? WATCH THIS VIDEO.\" e volta ao começo.\n\nDetalhes de cores, fontes, curvas e som: estilo.md. Cenas por tempo: roteiro.md. Para fazer um vídeo no mesmo estilo: PROMPT.md."
    },
    {
      "titulo": "As versões até o final",
      "texto": "| \n\n | Versão\n | O que mudou\n\n | v1\n | as dez cenas integradas, revisadas por snapshots e folhas a 4 qps\n\n | **v2**\n | correções da revisão quadro a quadro e mix final; render de 120 qps juntado em 60 qps; existe também uma cópia leve (37 MB) para enviar pelo celular\n\nPonto em aberto: o desfoque com 2 amostras (120 → 60 qps) ainda mostra imagem dupla nos zooms mais rápidos; num próximo, renderizar a 240 qps só nos mergulhos e usar `tmix=frames=4`. A textura de feltro da TV infantil do original é mais rica que a nossa."
    }
  ],
  "pacote": [
    {
      "pasta": "projeto/",
      "conteudo": "`hf/index.html` (a casca, o HUD e o relógio), `hf/engine.js` (câmera recursiva, portais e HUD da pilha), as dez cenas em `hf/scenes/` (intro, explainer, terminal, game, nature, noir, kids, infomercial, trailer, base), as onze fontes do Google Fonts em `hf/assets/fonts/`, o `hf/CONTRATO-CENAS.md`, os arquivos do projeto HyperFrames, o `README.md` do projeto e o `revisao/revisar.py`"
    },
    {
      "pasta": "audio/",
      "conteudo": "mix final (`mix_v2.wav`), o `build_audio.py` (trilha e efeitos), o `loudnorm.py`, os eventos de som (`events.json`) e o cronograma dos mergulhos (`schedule.json`), as duas músicas e as batidas em `audio/src/`, e os efeitos usados em `audio/sfx/`"
    },
    {
      "pasta": "referencias/",
      "conteudo": "o vídeo original, o prompt original, as folhas de contato, a comparação lado a lado e o `APRENDIZADOS.md`"
    },
    {
      "pasta": "render.mp4",
      "conteudo": "o vídeo final"
    },
    {
      "pasta": "hf/engine.js",
      "conteudo": "dono da câmera, dos mergulhos e do HUD: cada cena diz onde está a sua \"tela\" (`portal(t)`) e o motor faz o zoom com ponto fixo até ela, desenhando a cena filha ao vivo lá dentro, em até três níveis"
    },
    {
      "pasta": "hf/scenes/*.js",
      "conteudo": "uma cena por gênero, registrada com `update(t)` (desenha a cena a partir do tempo) e `portal(t)` (o retângulo da tela onde passa o próximo gênero); cada uma empurra os seus eventos de som"
    },
    {
      "pasta": "hf/CONTRATO-CENAS.md",
      "conteudo": "o contrato que permitiu quatro agentes escreverem oito cenas em paralelo sem conflito: API, regras, zonas do HUD e o cronograma"
    },
    {
      "pasta": "hf/index.html",
      "conteudo": "carrega as fontes, inicia o motor e cria um tween de 77 s cujo `onUpdate` chama `ENGINE.render(t)`"
    },
    {
      "pasta": "audio/build_audio.py",
      "conteudo": "a espinha musical contínua (fonte = `t + 30,08 s`), o tratamento de cada gênero, a troca para \"Red Right Hand\" no noir, o silêncio no caso base, os efeitos por evento e as notas da pilha"
    },
    {
      "pasta": "audio/loudnorm.py",
      "conteudo": "`loudnorm` em duas passagens para −14 LUFS e −1 dBTP"
    },
    {
      "pasta": "revisao/revisar.py",
      "conteudo": "detector de saltos entre quadros e de quadros escuros ou vazios, mais folhas de contato"
    }
  ],
  "prompt": "Quero um vídeo explicativo no mesmo estilo do projeto \"Como explicar recursão?\", que está em 07-videos/projetos/recursao/, com o meu assunto.\n\nConceito a explicar: {{CONCEITO}}\nPor que ele combina com a estrutura de \"um dentro do outro\" (camadas, etapas, níveis, histórico…): {{ESTRUTURA}}\nGêneros que eu quero (ou deixe o agente propor de 5 a 8): {{GENEROS}}\nCom narração ou só texto na tela: {{VOZ}} (a referência é só texto)\nDuração e formato: {{FORMATO}} (a referência tem 77 s, 16:9)\n(Se algum desses estiver vazio ou com as chaves, me pergunte antes de começar.)\n\n1. Estude o projeto antes de propor qualquer coisa. Leia, nesta ordem: LEIA-ME.md, estilo.md e roteiro.md da pasta recursao, o referencias/APRENDIZADOS.md e o projeto/hf/CONTRATO-CENAS.md. Abra o projeto/hf/engine.js e uma cena (ex.: projeto/hf/scenes/terminal.js) e me explique em poucas linhas como o motor faz o zoom de ponto fixo, como uma cena declara o portal(t) e como o HUD acompanha a pilha, e o que você vai reaproveitar.\n\n2. Proponha a estrutura antes de construir: a ordem dos gêneros, o que cada um mostra, a frase que ele começa na ida e como a termina na volta, a \"tela\" onde o próximo gênero passa (laptop, TV, gota, projetor…), o caso do fundo (o momento sem estilo) e o fecho que volta ao começo. Monte o cronograma (descida, mergulho, volta, subida) na batida da música e me mostre.\n\n3. Trilha num subagente: uma música real que eu ainda não usei, contínua do começo ao fim, e o tratamento de cada gênero (EQ, bitcrush, reverb, tom, velocidade); troca de figurino no meio de cada mergulho, coberta pelo whoosh. No momento sem estilo, sem música. Uma nota por nível da pilha: sobe na chamada, desce no retorno, no tom da música.\n\n4. Reaproveite o motor, troque as cenas. Mantenha: o engine.js (zoom de ponto fixo com antecipação, overshoot e assentamento; filha ao vivo dentro da tela; camada da mãe acima da filha; HUD da pilha que muda de estilo no fundo), o contrato de cenas com update(t) e portal(t), tudo como função do tempo num único tween, o acaso só por hash com semente, a deriva de câmera em toda cena, a mola padrão e o motion blur por subquadros. Escreva cada gênero na versão \"premium\" dele: paleta, fonte, textura, câmera e personagens próprios, com antecipação, squash & stretch, piscadas e boca acompanhando as palavras. Se valer a pena, divida as cenas entre subagentes em paralelo, cada um mexendo só nos arquivos dele, como no contrato.\n\n5. Texto na tela como narração: as palavras entram quando seriam ditas, linhas principais de 80 a 160 px, cada linha por pelo menos 1,2 s, acabamento do gênero em todo destaque. Passe todo texto pela skill better-portuguese se o vídeo for em português.\n\n6. Som: cada cena registra um evento por ação (entra, sai, bate, pula, clica); efeitos em evento − pico, mesma família por ação. Trilha a ~−19 LUFS antes de somar, efeitos ×2,2, loudnorm em duas passagens a −14 LUFS.\n\n7. Revise com snapshots de cada cena (miniatura dentro da mãe, tela cheia, meio do mergulho, volta) e, depois do render, com o detector de saltos e de quadros vazios. Confira que nenhuma cena some e se reconstrói no pouso do zoom. Em cada movimento, pergunte: está humano ou robotizado? Entregue o vídeo, a ficha do projeto e uma anotação do que aprendeu.",
  "campos": [
    "CONCEITO",
    "ESTRUTURA",
    "FORMATO",
    "GENEROS",
    "VOZ"
  ],
  "fonte": {
    "nome": "Clube do Motion",
    "url": "https://clubedomotion.com/projeto/?id=recursao",
    "uso": "liberado pelo dono do Clube do Motion em 18/10/2026 (docs/permissoes/clube-do-motion.md)"
  }
}