[
 {
  "chave": "CS-102",
  "territorio": "backend",
  "titulo": "A LEITURA DE ESPECIALISTAS PASSA A EXISTIR — o frontend CHAMA-A DESDE O CS-20 E O SERVIDOR ⛔ NAO A TEM: medido hoje, `utilizadores` da' UMA ocorrencia em `backend/src` e e' um COMENTARIO (`cadastro.servico.ts:98`), e os 12 `@Controller` do produto sao identidade/aulas/vinculos/cadastro/marcas/participacao/parametros/nucleos/chat/questoes/upas — ⛔ nenhum expoe gente. Modulo `utilizador` NOVO com `GET /utilizadores?papel=ESPECIALISTA`, que devolve `{id, nome}` E MAIS NADA — a MESMA forma que o produto ja' publica em toda a linha do calendario (`aula.tipos.ts:20-23`, `ResponsavelPublico`) — ordenado por nome, e ⛔ SEM REMOVIDO. 🩸 A ROTA SERVE SO' O PAPEL ESPECIALISTA: sem `papel`, ou com outro valor, ⛔ 400 — para esta rota ⛔ NAO virar uma lista telefonica do produto por acrescento silencioso. ⚠️ LER E' SO' DA SECRETARIA (`@Papeis(SECRETARIA)`), e e' a escolha CONSERVADORA E REVERSIVEL: os TRES consumidores sao ecras dela (`aulas/nova`, `aulas/[id]`, o painel do CS-106); alargar depois e' aditivo, e a regra 122 ⛔ nao disse quem le' O ROL. ⛔ Email ⛔ nao sai, ⛔ senha ⛔ nunca saiu (R3 do CS-4)",
  "escopo_paths": [
   "backend/src/modules/utilizador/",
   "backend/src/app.module.ts",
   "backend/test/utilizador.e2e-spec.ts"
  ],
  "aceites": [
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci",
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci -t 'com 7 especialistas na base a rota devolve os 7, e nao os 2 que sao responsaveis de aula'",
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci -t 'a resposta traz so id e nome: 0 emails, 0 senhas e 0 papeis no corpo'",
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci -t 'a rota serve so o papel ESPECIALISTA: sem papel da 400 e com outro papel da 400'",
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci -t 'o especialista REMOVIDO nao entra na lista, e a contagem cai de 7 para 6'",
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci -t 'a lista vem ordenada por nome e nao pela ordem de criacao'",
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci -t 'so a secretaria le: coordenador, medico e especialista levam 403'",
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci -t 'sem sessao da 401 e nao 403, porque o guarda de sessao corre antes'",
   "cd backend && npx jest test/utilizador.e2e-spec.ts --runInBand --ci -t 'ler a lista nao escreve uma linha na base, e ler duas vezes da o mesmo corpo'",
   "cd backend && test -d src/modules/utilizador && ! grep -rqE 'prisma\\.[A-Za-z]+\\.(create|update|upsert|delete)' src/modules/utilizador/",
   "cd backend && test -d src/modules/utilizador && ! grep -rqiE 'senhaHash|passwordHash|\\bsenha\\b' src/modules/utilizador/",
   "cd backend && grep -q 'ModuloUtilizador' src/app.module.ts",
   "cd backend && ! grep -rqiE 'especialista_nucleo|especialistaNucleo|artigo|perfil' src/modules/utilizador/",
   "cd backend && npx jest test/identidade.e2e-spec.ts test/aula.e2e-spec.ts --runInBand --ci"
  ],
  "depende_de": []
 },
 {
  "chave": "CS-103",
  "territorio": "backend",
  "titulo": "A LIGACAO EXISTE E E' TABELA, ⛔ NAO CAMPO — e a SECRETARIA ATRIBUI E TIRA: `model EspecialistaNucleo` novo (`especialista_nucleo`), no molde MEDIDO do `VinculoMedicoUpa` (schema.prisma:233-263) — as duas chaves, a ASSINATURA HUMANA (quem atribuiu e quando) e o unico DO BANCO `@@unique([especialistaId, nucleoId])`, porque dois pedidos em paralelo ⛔ nao podem deixar duas linhas iguais. HOJE, MEDIDO: `Nucleo` (schema.prisma:510) tem id, nome, marca, arquivadoEm e as aulas — ⛔ NENHUMA pessoa — e sao 0 ligacoes para 10 nucleos e 7 especialistas. 🩸 ⛔ SEM PENDENTE E ⛔ SEM ACEITAR: a ligacao NASCE ATRIBUIDA (regra 122, «⛔ nao se pede e aceita — atribui-se») ⟹ ⛔ nenhum `situacao`, ⛔ nenhuma rota de aceitar, ⛔ zero ocorrencias de PENDENTE no modulo. 🩸 TIRAR ⛔ NAO APAGA A LINHA (`retiradoEm` + `retiradoPorId`), o mesmo gesto do `vinculo.servico.ts:116-117` e pela mesma razao (R4), e atribuir OUTRA VEZ volta a valer sem criar segunda linha. NUCLEO ARQUIVADO ⛔ NAO ACEITA ATRIBUICAO NOVA (decisao 6 da demanda 24). ⚠️ A UPA ⛔ NAO MUDA: `Upa.coordenadorId` continua UM e obrigatorio (schema.prisma:113) e ⛔ nenhuma linha de `vinculo_medico_upa` e' reescrita. 🩸 E O CADASTRO DE AULA ⛔ NAO GANHA PORTAO NENHUM — prova-se pela POSITIVA nesta mesma bateria (criterio 6: regra 57, «trocavel inclusive»)",
  "escopo_paths": [
   "backend/prisma/schema.prisma",
   "backend/prisma/migrations/",
   "backend/src/modules/especialista-nucleo/",
   "backend/src/app.module.ts",
   "backend/test/especialista-nucleo.e2e-spec.ts"
  ],
  "aceites": [
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'atribuir 3 especialistas ao nucleo de Cardiologia da 3 linhas, contadas na base'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'o mesmo especialista em 2 nucleos da 2 linhas, e e o mesmo id de pessoa nas duas'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'atribuir o mesmo especialista ao mesmo nucleo duas vezes nao cria duas linhas'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'a ligacao nasce atribuida: nao ha estado pendente nem rota de aceitar'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'cada ligacao grava quem atribuiu e quando, desde o instante da atribuicao'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'tirar nao apaga a linha: N linhas antes e N depois, e le-se quem tirou e quando'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'atribuir outra vez o mesmo especialista ao mesmo nucleo volta a valer, e continua a ser uma so linha'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'so a secretaria escreve: coordenador, medico e especialista levam 403 a atribuir e a tirar'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'sem sessao da 401 e nao 403, porque o guarda de sessao corre antes'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'atribuir a um nucleo arquivado e recusado, e a frase diz o que fazer'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'quem nao tem o papel ESPECIALISTA nao se atribui a nucleo nenhum'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'a UPA nao muda: nenhuma linha de vinculo_medico_upa e reescrita e o coordenador continua um'",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts --runInBand --ci -t 'cadastrar uma aula de Pediatria com um especialista que nao e referencia de Pediatria continua a dar 201'",
   "cd backend && grep -q 'model EspecialistaNucleo' prisma/schema.prisma",
   "cd backend && grep -qE '@@unique\\(\\[especialistaId, *nucleoId\\]\\)' prisma/schema.prisma",
   "cd backend && grep -rq 'especialista_nucleo' prisma/migrations/",
   "cd backend && ! (grep -A30 'model EspecialistaNucleo' prisma/schema.prisma | grep -qiE 'pendente|situacao|especialidade|chefe')",
   "cd backend && grep -q 'coordenadorId String' prisma/schema.prisma",
   "cd backend && test -d src/modules/especialista-nucleo && ! grep -rqiE 'pendente|aceitar|situacao|especialidade|chefe|artigo' src/modules/especialista-nucleo/",
   "cd backend && test -d src/modules/especialista-nucleo && ! grep -rqE 'prisma\\.(vinculoMedicoUpa|upa)\\.(create|update|upsert|delete)' src/modules/especialista-nucleo/",
   "cd backend && ! grep -rqiE 'especialistaNucleo|EspecialistaNucleo|especialista_nucleo' src/modules/aula/",
   "cd backend && grep -q 'ModuloEspecialistaNucleo' src/app.module.ts",
   "cd backend && npx jest test/nucleo.e2e-spec.ts test/vinculo.e2e-spec.ts test/upa.e2e-spec.ts test/aula.e2e-spec.ts --runInBand --ci"
  ],
  "depende_de": []
 },
 {
  "chave": "CS-104",
  "territorio": "backend",
  "titulo": "AS DUAS LEITURAS DA LIGACAO, DE QUALQUER SESSAO ACTIVA: `GET /nucleos/:id/especialistas` (quem e' referencia deste nucleo) e `GET /especialistas/:id/nucleos` (de que nucleos ele e' referencia) — as duas com `{id, nome}` MAIS A ASSINATURA (quem atribuiu e quando), e ⛔ NADA ALEM: ⛔ 0 emails no corpo. 🩸 LER E' ABERTO A QUALQUER SESSAO, E A RAZAO E' MEDIDA ⛔ nao gosto: o NOME do especialista JA' E' publico a qualquer sessao — `GET /aulas` devolve-o em toda a linha do calendario (`aula.servico.ts:19` e `:242`, `responsavel: {id, nome}`) — e `GET /nucleos` ⛔ nao tem `@Papeis` DE PROPOSITO (`nucleo.controlador.ts`). ⟹ Isto ⛔ nao revela nada de novo. Sem sessao ⟹ 401, ⛔ e nao 403. QUEM FOI TIRADO ⛔ NAO APARECE, e a linha CONTINUA NA BASE; o NUCLEO ARQUIVADO continua a devolver os que ja' tinha (arquivar ⛔ nao e' apagar). ⚠️ O MODULO SO' LE' aqui: ⛔ zero escrita, e ler duas vezes da' o MESMO corpo. ⚠️ ⛔ NENHUM ECRA nasce neste card, e ⛔ nenhum de PERFIL nasce nesta demanda — a 32 e' que MOSTRA esta leitura, e a 35 e' que a usa como PORTAO",
  "escopo_paths": [
   "backend/src/modules/especialista-nucleo/",
   "backend/test/especialista-nucleo-leitura.e2e-spec.ts"
  ],
  "aceites": [
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'o nucleo de Cardiologia diz 3 especialistas e o especialista diz 2 nucleos, contados'",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'cada ligacao sai com id, nome e a assinatura de quem atribuiu e quando'",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'a resposta nao traz email nenhum nem senha nenhuma'",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'quem foi tirado nao aparece na leitura, e a linha continua na base'",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'ler e de qualquer sessao activa: medico aceito, coordenador e especialista levam 200'",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'sem sessao da 401 e nao 403'",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'o nucleo arquivado continua a devolver os 2 especialistas que ja tinha'",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'ler nao escreve uma linha na base, e ler duas vezes da o mesmo corpo'",
   "cd backend && npx jest test/especialista-nucleo-leitura.e2e-spec.ts --runInBand --ci -t 'um nucleo sem ligacao nenhuma devolve lista vazia com 200, e nao 404'",
   "cd backend && ! grep -rqiE 'especialidade|chefe|artigo' src/modules/especialista-nucleo/",
   "cd backend && npx jest test/especialista-nucleo.e2e-spec.ts test/nucleo.e2e-spec.ts --runInBand --ci"
  ],
  "depende_de": [
   "CS-103"
  ]
 },
 {
  "chave": "CS-105",
  "territorio": "frontend",
  "titulo": "O PAINEL DOS ESPECIALISTAS DE UM NUCLEO, DENTRO DE `/secretaria/nucleos` QUE JA' E' PORTA DELA (`navegacao.ts:118`) — ⛔ NENHUMA PORTA NOVA E ⛔ NENHUMA ROTA NOVA: a secretaria abre a linha do nucleo e LE' quem e' referencia dele, com QUEM ATRIBUIU E QUANDO ao lado de cada nome. Os SEIS ESTADOS (regra 84), e ⛔ nenhum e' opcional: VAZIO — um nucleo sem especialista nenhum DIZ O QUE ALI VAI ESTAR e traz O BOTAO DO ACTO que o preenche, e ⛔ nao parece avaria · A CARREGAR com ESQUELETO DA FORMA FINAL, ⛔ sem brilho a deslizar (o ecra ⛔ nao salta quando o dado chega) · ERRO SO' NO PAINEL AFECTADO, com o que aconteceu e o que fazer, e a lista de nucleos intacta · SEM PERMISSAO a dizer QUE PAPEL ve' aquilo, 🩸 ⛔ SEM deixar ver o dado por baixo e ⛔ NEM DESFOCADO · sucesso · parcial. Material 3 (cartao 12dp, elevacao 1, Inter, tabular nos numeros), foco de teclado VISIVEL, alvo >= 48x48dp e `prefers-reduced-motion` a 0ms com O MESMO PIXEL final. E O NUCLEO APARECE COM A MARCA QUE JA' ESTA' PAGA E APROVADA (`MarcaDoNucleo`, CS-48/CS-52), ⛔ nao um rectangulo vazio. ⚠️ ⛔ Nenhuma peca de desenho se gera e ⛔ nenhum gasto no servico de imagem; `estilo/tokens.css` ⛔ NAO se toca (fora da cerca)",
  "escopo_paths": [
   "frontend/src/app/secretaria/nucleos/",
   "frontend/e2e/nucleos-especialistas.spec.ts",
   "frontend/e2e/nucleos.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'a secretaria abre o nucleo de Cardiologia e ve os 3 especialistas que o servidor devolveu'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'cada nome traz quem atribuiu e quando, e a data vai em tabular'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'o nucleo sem especialista nenhum diz o que ali vai estar e traz o botao do acto, e nao parece avaria'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'a carregar tem o esqueleto da forma final, sem brilho a deslizar, e o ecra nao salta quando o dado chega'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'o erro fica so no painel afectado e a lista de nucleos continua legivel, com o que fazer'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'coordenador, medico e especialista veem SEM PERMISSAO com o papel dito, e nao o dado por baixo nem desfocado'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'os seis estados do painel: vazio, a carregar, erro, sem permissao, sucesso e parcial'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'o nucleo aparece com a marca aprovada e nao com um rectangulo vazio'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'o foco de teclado ve-se em cada peca do painel e o alvo de toque tem 48 por 48'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'com prefers-reduced-motion reduce as duracoes sao zero e o estado final e o mesmo pixel'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts --reporter=line -g 'o menu continua com as mesmas portas e nenhuma rota nova nasce'",
   "cd frontend && ! test -d 'src/app/secretaria/nucleos/[id]'",
   "cd frontend && ! grep -rqE '#[0-9a-fA-F]{3,8}|shimmer|animate-pulse|<progress|LinearProgress|blur\\(' src/app/secretaria/nucleos/",
   "cd frontend && ! grep -rqiE 'artigo|chefe|perfil' src/app/secretaria/nucleos/",
   "cd frontend && grep -rq 'tabular' src/app/secretaria/nucleos/",
   "cd frontend && npx playwright test e2e/nucleos.spec.ts e2e/navegacao.spec.ts e2e/alcance.spec.ts --reporter=line"
  ],
  "depende_de": [
   "CS-104"
  ]
 },
 {
  "chave": "CS-106",
  "territorio": "frontend",
  "titulo": "OS DOIS ACTOS NO PAINEL: ATRIBUIR DE UMA LISTA COMPLETA, E TIRAR SEM APAGAR. 🩸 O SELECTOR OFERECE OS SETE QUE O SERVIDOR DEVOLVE (`GET /utilizadores?papel=ESPECIALISTA`, CS-102) e ⛔ NAO DOIS — HOJE, MEDIDO: 21 aulas e apenas 2 responsaveis DISTINTOS, logo a lista degradada mostraria 2 dos 7, e atribuir escolhendo de uma lista que esconde 5 ⛔ NAO E' ATRIBUIR. ⛔ Nenhum nome cravado em codigo, ⛔ nenhum id escrito a' mao (⛔ 0 uuids no codigo do ecra). Atribuir mostra o nome NA PROPRIA PECA que mudou, com a assinatura — ⛔ SEM TARJA a confirmar o que ja' se ve' (regra 83.6) — e atribuir o MESMO outra vez ⛔ nao poe uma segunda linha no ecra. 🩸 TIRAR E' BOTAO DE TEXTO COM DIALOGO DE CONFIRMACAO, ⛔ NAO UM BOTAO VERMELHO (regras 80.3 e 84.c: ⛔ nenhum vermelho de castigo; vermelho e' so' erro de SISTEMA) — e o dialogo diz a consequencia: a pessoa deixa de ser referencia, o registo FICA. NUCLEO ARQUIVADO ⛔ NAO SE OFERECE para atribuicao nova e CONTINUA A MOSTRAR os que tem. Erro do acto na PECA DO ACTO, com o que fazer, e a lista intacta; botao A TRABALHAR ⛔ nao muda de largura; `prefers-reduced-motion` a 0ms",
  "escopo_paths": [
   "frontend/src/app/secretaria/nucleos/",
   "frontend/e2e/nucleos-atribuir.spec.ts",
   "frontend/e2e/nucleos.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'o selector oferece os 7 especialistas que o servidor devolveu, e nao os 2 que sao responsaveis de aula'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'atribuir mostra o especialista na propria peca que mudou, com quem atribuiu e quando, e sem tarja nenhuma'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'atribuir o mesmo especialista outra vez nao poe uma segunda linha no ecra'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'o mesmo especialista atribuido a 2 nucleos aparece nos 2, e o nucleo de Cardiologia conta 3'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'tirar e botao de texto com dialogo de confirmacao e nao um botao vermelho'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'o dialogo de tirar diz a consequencia: deixa de ser referencia e o registo fica'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'desistir do dialogo nao tira ninguem, e a lista fica igual'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'o nucleo arquivado nao se oferece para atribuicao nova e continua a mostrar os que tem'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'o erro do acto fica na peca do acto, diz o que fazer, e a lista do nucleo continua legivel'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'o botao a trabalhar mantem o rotulo no sitio e nao muda de largura'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'o alvo de toque dos dois actos tem 48 por 48 e o foco de teclado ve-se'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'com prefers-reduced-motion reduce as duracoes sao zero e o estado final e o mesmo pixel'",
   "cd frontend && npx playwright test e2e/nucleos-atribuir.spec.ts --reporter=line -g 'nenhum ecra pede a ninguem para aceitar: a palavra pendente nao aparece no painel'",
   "cd frontend && ! grep -rqE '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' src/app/secretaria/nucleos/",
   "cd frontend && ! grep -rqiE 'pendente|artigo|chefe|perfil' src/app/secretaria/nucleos/",
   "cd frontend && ! test -d 'src/app/secretaria/nucleos/[id]'",
   "cd frontend && npx playwright test e2e/nucleos-especialistas.spec.ts e2e/nucleos.spec.ts e2e/alcance.spec.ts --reporter=line"
  ],
  "depende_de": [
   "CS-105",
   "CS-102"
  ]
 },
 {
  "chave": "CS-107",
  "territorio": "frontend",
  "titulo": "A LISTA DEGRADADA MORRE NOS DOIS ECRAS DE AULA, e conta-se o fim dela: `FRASE_LISTA_DEGRADADA` e `FRASE_ERRO_DOS_ESPECIALISTAS` (`secretaria/aulas/dados.ts:637-653`) DEIXAM DE APARECER em `/secretaria/aulas/nova` e em `/secretaria/aulas/[id]`, porque a leitura que o ecra ja' chamava passou a existir (CS-102). HOJE, MEDIDO E CONFESSADO PELO PROPRIO CODIGO: `secretaria/aulas/nova/page.tsx:138` diz «A leitura de especialistas ⛔ NAO EXISTE no servidor entregue», e a secretaria le' HOJE, ao trocar o responsavel, «o servidor ainda ⛔ nao tem a leitura de especialistas, e os nomes aqui sao os que JA' SAO RESPONSAVEIS de aulas» (`dados.ts:648`) — 21 aulas, 2 responsaveis distintos, 2 de 7. ⟹ O selector do responsavel passa a mostrar OS SETE nos dois ecras, o responsavel ACTUAL continua sempre na lista (mesmo REMOVIDO), e a frase de erro so' aparece quando a leitura FALHA MESMO, com Repetir. 🩸 A TROCA DO RESPONSAVEL ⛔ NAO CAI por nada (regra 57) e ⛔ NENHUMA RESTRICAO NOVA nasce no cadastro: continua a poder indicar-se um especialista que ⛔ nao e' referencia do nucleo da aula. ⚠️ ⛔ Nenhum nome cravado, ⛔ nenhum id a' mao, ⛔ nenhuma porta nova, e o ecra do nucleo ⛔ nao se toca (e' o CS-105/CS-106). 🩸 E `e2e/aulas.spec.ts` ENTRA NA CERCA porque TEM de entrar: tres testes dele AFIRMAM a degradacao hoje (`aulas-lista-degradada` visivel em `:1081` e `:1149`) e passam a afirmar o contrario. ⚠️ OS TITULOS DESSES TRES ⛔ NAO SE MEXEM — muda-se o CORPO: o proprio ficheiro avisa a' cabeca que os titulos sao CONTRATO chamado por `-g` (`:10-12`), e renomear um quebra o aceite de um card ja' aprovado. Com a leitura em baixo o selector fica com o RESPONSAVEL ACTUAL e o erro traz Repetir — ⛔ nunca uma meia lista que esconde 5 dos 7",
  "escopo_paths": [
   "frontend/src/app/secretaria/aulas/",
   "frontend/e2e/aulas-especialistas.spec.ts",
   "frontend/e2e/aulas.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'em aulas nova o selector do responsavel mostra os 7 especialistas que o servidor devolveu'",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'na ficha da aula o selector mostra os 7 e o responsavel actual continua na lista'",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'a frase da lista degradada nao aparece em nenhum dos dois ecras'",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'a frase de erro dos especialistas so aparece quando a leitura falha mesmo, e traz Repetir'",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'com a leitura em baixo a troca do responsavel nao desaparece da ficha'",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'nenhum nome de especialista vem de codigo: com o servidor a devolver 7 nomes novos, sao esses os 7 do ecra'",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'a secretaria cadastra uma aula de Pediatria com um especialista que nao e referencia de Pediatria e o ecra aceita'",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'os seis estados do selector do responsavel: vazio, a carregar, erro, sem permissao, sucesso e parcial'",
   "cd frontend && npx playwright test e2e/aulas-especialistas.spec.ts --reporter=line -g 'com prefers-reduced-motion reduce as duracoes sao zero e o estado final e o mesmo pixel'",
   "cd frontend && ! grep -rq 'FRASE_LISTA_DEGRADADA' src/app/secretaria/aulas/",
   "cd frontend && ! grep -rq 'aulas-lista-degradada' src/app/secretaria/aulas/",
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line -g 'sem a leitura de especialistas so o painel do selector cai em erro'",
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line -g 'a troca continua operavel quando a leitura de especialistas falha'",
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line -g 'com as duas leituras em baixo o selector fica com o responsavel actual e a troca continua de pe'",
   "cd frontend && ! grep -rqE '[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-' src/app/secretaria/aulas/",
   "cd frontend && grep -rq \"papel=ESPECIALISTA\" src/app/secretaria/aulas/dados.ts",
   "cd frontend && ! grep -rqiE 'artigo|chefe|perfil' src/app/secretaria/aulas/",
   "cd frontend && npx playwright test e2e/aulas.spec.ts e2e/calendario.spec.ts e2e/navegacao.spec.ts e2e/alcance.spec.ts --reporter=line"
  ],
  "depende_de": [
   "CS-102"
  ]
 }
]