# DEMANDA 57 — RESUMO E CRITERIO PRONTOS, A ESPERA DAS PERGUNTAS 156 E 157

O texto do dono esta INTOCADO na demanda e e' prova. Isto vive AO LADO, nunca por cima.
Quando as duas respostas chegarem, a entrega e' UM comando:
  fab demanda-pronta 57 --resumo "<bloco RESUMO>" --criterio "<bloco CRITERIO>"
As duas respostas mudam DUAS linhas, que estao marcadas com [156] e [157].

===================== RESUMO =====================

A AULA AO VIVO E A GRAVADA PASSAM A FUNCIONAR DE FACTO. Sete coisas que o dono nomeou a' letra em
12/10: a sala abre sozinha a' hora, as pessoas entram, o especialista partilha os slides, ha'
camara, a gravacao e a publicacao acontecem sozinhas depois do ao vivo, ha' onde subir as gravadas
permanentes, e nada do que ja' conta ponto se quebra.

O QUE EU MEDI, TRES SITIOS, ANTES DE PERGUNTAR:
 1. CODIGO (repo no main, commit cfbeb39e): a sala ao vivo ⛔ NAO tem video — e' um botao «Abrir a
    transmissao» para um endereco escrito a' mao (`frontend/src/app/ao-vivo/[aulaId]/page.tsx:759`;
    `Aula.linkTransmissao` e' `String?` em `schema.prisma:254`). A gravacao e' outro endereco a'
    mao (`model Gravacao { url String, dias Int? }`, `schema.prisma:622`, validada por
    `/^https?:\/\/\S+$/i`). Busca em TODO o `backend/src` e `frontend/src` por
    camara/partilha/transmissao/gravacao/reproducao de directo: ZERO ocorrencias. Busca por relogio
    no servidor (`@Cron|ScheduleModule|setInterval|@Interval`): ZERO — ⛔ nenhuma sala pode abrir
    sozinha hoje. E na MAQUINA: `ffmpeg` AUSENTE, `coturn` AUSENTE, ⛔ nenhum servico de video a
    correr. ⟹ Isto ⛔ nao se conserta: NASCE.
 2. REGRAS (ambito do produto, e as doze de 12/10): o mecanismo da aula ja' esta' decidido ate' ao
    detalhe — marca FIXA de 20 em 20 min e 1 bloco = 1 ponto (399.2), o AO VIVO ⛔ NAO PARA na marca
    (399.1), a GRAVADA para, espera 5 min e volta ao ultimo ponto salvo (393), a presenca ⛔ nao se
    acumula (391), a gravada permanente E' aula e DA' ponto (128), a prova da gravada e' chegar ao
    fim com a aba a' frente e sem avancar (49), os avisos sao SO' dentro do produto (398), 50 MB e'
    o tecto do MATERIAL (125). ⟹ ⛔ Nada disto se volta a perguntar.
 3. DEMANDAS ANTERIORES que este texto assenta: 14 (a fatia 1 com a aula ao vivo), 15 (chat na
    sala, ja' a correr no gateway WebSocket), 23 (o minuto validado e a prova), 36 (as gravadas
    permanentes). O que la' foi aprovado e' decisao tomada; o que falhou e' o que esta demanda vem
    consertar — e o que falhou e' UMA coisa so': NUNCA HOUVE IMAGEM.

O QUE JA' EXISTE E ⛔ NAO SE TOCA — esta demanda ASSENTA nisto, ⛔ nao o refaz:
 · `componentes/leitor/LeitorDeGravacao.tsx` — o `<video>` SEM `controls`, que para' na marca e ⛔
   nao deixa adiantar. O video novo entra NESTE leitor.
 · `chat-tempo-real/sala-aula.gateway.ts` — gateway WebSocket vivo (`app.module.ts:162`). A duvida
   e a presenca continuam por aqui, em tempo real, e ⛔ NAO herdam o atraso do video.
 · `BlocoAula`, marcas, `ParticipacaoAula`, `RespostaQuestao`, pontos: o mecanismo da aula esta' de
   pe'. O que falta por baixo dele e' a IMAGEM.
 · `modules/material` — os slides em ficheiro ja' sobem, com tecto de 50 MB (regra 125). ⚠️ VIDEO
   ⛔ NAO ENTRA AQUI: ⛔ nem pelo formato ⛔ nem pelo tecto.

O QUE EU DECIDI SOZINHO, POR SER REVERSIVEL — nomeado para o dono corrigir no aceite:
 1. ONDE MORAM OS VIDEOS e' PARAMETRO, com disco local por omissao, no molde que o produto JA' usa
    e ja' provou (`certificado.armazem.ts:32`, raiz por variavel de ambiente e nome do ficheiro =
    sha256 dos bytes). ⟹ Sobrevive a qualquer resposta sobre balde pago, e ⛔ nao torna ⛔ nada
    irreversivel. ⚠️ A CONTA FICA DITA, medida e ⛔ nao estimada: 62 GB livres de 387 (85%
    ocupado), cada gravacao de 2 h pesa 1-2 GB, 18 aulas por trimestre ⟹ dezenas de GB. E a regra
    125 nasceu porque ESTE disco encheu a's 00:43 e deitou o link dele abaixo. Quando houver numero
    de aulas a serio, a conta sobe-lhe — ⛔ nao antes.
 2. O FORMATO DO VIDEO VALIDA-SE PELOS BYTES, ⛔ nao pela extensao, como o modulo `marca` ja' faz
    (`marca.saneador.ts`). Caminho de subida PROPRIO, com tecto proprio e RETOMA (um ficheiro de
    aula ⛔ nao cabe num pedido). ⛔ NAO se alarga o tecto do `material`.
 3. O atraso aceitavel entre o que o especialista faz e o que o medico ve', a ferramenta, o
    transporte, o esquema do banco e o nome das rotas: meus.

⛔ O QUE ⛔ NAO ENTRA NESTA DEMANDA, e cada um tem a sua razao:
 · A JANELA DE 5 MINUTOS E O REGRESSO AO ULTIMO PONTO SALVO na gravada (regras 393 e 399.1).
   MEDIDO: ⛔ nao existe hoje — o leitor para' na marca e espera sem prazo, e voltar atras e' livre
   (`LeitorDeGravacao.tsx:395`). E' decisao do dono de 12/10 e e' TRABALHO REAL, mas e' o MECANISMO
   da prova, ⛔ nao a imagem: e' DEMANDA PROPRIA. ⚠️ E fica nomeado o atrito que isto cria com o
   ponto 7 do texto dele («⛔ nao pode quebrar»): as 55 provas da aula que hoje passam foram
   escritas CONTRA o mecanismo antigo. Esta demanda ⛔ nao as muda; a demanda da janela vai ter de
   as mudar, e isso ⛔ nao e' quebra — e' a decisao dele de 12/10 a entrar.
 · A CARA destes ecras. A demanda 56 veste a sala ao vivo e o leitor da gravada com a cara aprovada
   em 12/10. ⚠️ MEDIDO: as duas demandas tocam os MESMOS ficheiros (`app/ao-vivo/`,
   `componentes/leitor/`). ⟹ A 56 VESTE o que existe; a 57 ACRESCENTA pecas novas (a imagem, os
   comandos de camara, o botao de partilha, a subida do video permanente). As pecas novas desta
   demanda nascem JA' na cara da 56 — e por isso a 56 vai A' FRENTE. Se o dono quiser o contrario,
   diz-se no aceite: e' prioridade, e' dele.
 · ⛔ NENHUM AVISO POR CORREIO. Regra 398: os avisos sao SO' dentro do produto.

QUANTOS MEDICOS AO MESMO TEMPO — ⛔ NAO PERGUNTEI, e digo porque: o numero muda o dimensionamento,
⛔ nao a forma, e a forma e' o que me impede de fechar. O enquadramento parte com 30 EM SIMULTANEO
como alvo da primeira aula e MEDE a primeira aula a serio com gente dentro (foi o que o proprio
texto da demanda disse: «mede-se com gente a serio na primeira aula»). Se o dono quiser a rede
inteira ao mesmo tempo, corrige no aceite e isso muda a conta, ⛔ nao os cards.

[156] A FORMA DA IMAGEM — resposta do dono a' pergunta 156: <AQUI>
[157] QUEM APARECE NA AULA — resposta do dono a' pergunta 157: <AQUI>

===================== CRITERIO =====================

Esta' pronto quando estes OITO factos se exercerem numa instancia a correr, todos contaveis:

 1. A SALA ABRE SOZINHA. Com uma aula marcada para daqui a 2 minutos e a antecedencia parametrada,
    ⛔ NENHUMA pessoa entra antes da hora e TODAS entram depois, sem ⛔ ninguem carregar em ⛔ nada
    e sem ⛔ ninguem colar endereco nenhum. Fecha em `inicio + duracaoMin`.
 2. DUAS PESSOAS DENTRO, AO MESMO TEMPO. Dois navegadores, dois medicos ACEITES: os dois VEEM e
    OUVEM o especialista, e a contagem de presentes da' 2. O medico PENDENTE ve' o cadeado da regra
    46 e 0 imagem.
 3. OS SLIDES CHEGAM. O que o especialista partilha aparece no ecra do medico — mede-se com um PNG
    conhecido no ecra partilhado e a conferencia do pixel do lado de la'.
 4. CAMARA E MICROFONE [157]. O especialista escolhe dispositivo, corta o som, corta a imagem e
    ve-se a si proprio antes de entrar. A prova corre com camara FALSA
    (`--use-fake-device-for-media-stream`) e o medico recebe imagem COM MOVIMENTO, ⛔ nao um quadro
    preto. ⟹ Se a resposta 157 for «os medicos tambem», a mesma prova corre com UM medico a pedir a
    palavra e os outros a ve-lo.
 5. A GRAVACAO E A PUBLICACAO SAO SOZINHAS. Uma aula de 3 minutos acaba ⟹ em menos de 5 minutos
    existe ficheiro de video, a `Gravacao` dessa aula tem `url` que ⛔ NINGUEM escreveu a' mao, o
    `LeitorDeGravacao` abre-o e PARA NA MARCA, e a janela de dias (CS-12) comeca a contar a partir
    do fim da aula. ⛔ Zero intervencao humana entre o fim do ao vivo e a gravacao no ar.
 6. HA' ONDE SUBIR AS PERMANENTES. Sobe um MP4 de 300 MB (maior que os 50 MB do material) com
    retoma; um `.exe` renomeado para `.mp4` e' RECUSADO pelos BYTES; e a aula permanente abre-o e
    da' ponto como a regra 128 manda.
 7. ⛔ NADA DO QUE JA' CONTA SE QUEBRA. As 55 provas da aula que hoje passam correm nesta arvore e
    passam TODAS: `frontend/e2e/ao-vivo.spec.ts` (11), `gravacao.spec.ts` (13),
    `aulas-permanentes.spec.ts` (6), `backend/test/aula.e2e-spec.ts` (14), `gravacao.e2e-spec.ts`
    (11). E a suite inteira do produto fica VERDE antes de o epic subir ao main (81 provas de ecra
    + 55 de servidor), pela regra 334.
 8. OS SEIS ESTADOS na sala e no leitor: vazio, a carregar, erro, sem permissao, sucesso e PARCIAL.
    ⚠️ E um nono estado que ⛔ nao existia e passa a existir e a ter ecra proprio: A IMAGEM CAIU
    NO MEIO DA AULA — diz-se o que aconteceu e o que fazer, e os minutos ja' validados ⛔ NAO se
    perdem. Captura sem os estados = ⛔ NAO BATE.

[156] ⟹ Se a imagem for de FERRAMENTA DE FORA, os factos 1 a 8 sao os MESMOS e provam-se do mesmo
modo; o que muda e' QUEM serve a imagem, e acrescenta-se um nono facto: com a ferramenta de fora
INDISPONIVEL, a sala diz o que aconteceu, a aula ⛔ nao se perde e ⛔ nenhum ponto se inventa.
