[
 {
  "chave": "CS-43",
  "territorio": "frontend",
  "titulo": "AS PECAS ENTRAM NORMALIZADAS E O `Icone` DEIXA DE SER GEOMETRIA MINHA: o normalizador deterministico tira a placa branca, o c2pa, o #144777 e o preserveAspectRatio, e TODO o nome com peca passa a ser servido do ficheiro (criterio 1, 2, 3)",
  "escopo_paths": [
   "frontend/scripts/normalizar-icones.mjs",
   "frontend/src/assets/icones/",
   "frontend/src/componentes/base/Icone.tsx",
   "frontend/src/componentes/base/PrimitivasTemporarias.tsx",
   "frontend/src/componentes/base/base.module.css",
   "frontend/next.config.js",
   "frontend/e2e/icones.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/icones.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/icones.spec.ts --reporter=line -g 'todo o nome com peca e servido do ficheiro, e os que faltam estao escritos e contados'",
   "cd frontend && npx playwright test e2e/icones.spec.ts --reporter=line -g 'o icone de metadado da onSurfaceVariant e o de accao da primary'",
   "cd frontend && npx playwright test e2e/icones.spec.ts --reporter=line -g 'nenhum 144777 em ecra nenhum e nenhuma placa branca por baixo do icone'",
   "cd frontend && npx playwright test e2e/icones.spec.ts --reporter=line -g 'icone com significado leva palavra ou nome acessivel, e sem ela fica escondido'",
   "cd frontend && test -d src/assets/icones && ! grep -rqE '<metadata|preserveAspectRatio|fill=\"rgb\\(' src/assets/icones/",
   "cd frontend && test -d src/assets/icones && ! grep -rqE '<script|foreignObject|<image|xlink:href|href=\"http' src/assets/icones/",
   "cd frontend && node scripts/normalizar-icones.mjs src/assets/icones src/assets/icones && node scripts/normalizar-icones.mjs src/assets/icones src/assets/icones && git diff --exit-code -- src/assets/icones",
   "cd frontend && ! grep -q 'Material Symbols' src/componentes/base/Icone.tsx",
   "cd frontend && ! grep -qE '<path d=\"M|<circle |<rect ' src/componentes/base/Icone.tsx",
   "cd frontend && grep -q 'SEM_PECA' src/componentes/base/Icone.tsx && grep -q \"'play'\" src/componentes/base/Icone.tsx",
   "cd frontend && test -f src/assets/icones/marcas.ts && grep -q 'nu-urologia' src/assets/icones/marcas.ts && grep -q 's-cardio' src/assets/icones/marcas.ts",
   "cd frontend && test -f src/assets/icones/PROVENIENCIA.md && test $(ls src/assets/icones/*.svg | wc -l) -eq $(grep -c '^| ' src/assets/icones/PROVENIENCIA.md)",
   "cd frontend && ! grep -rqE '#[0-9a-fA-F]{3,8}' src/componentes/base/Icone.tsx",
   "cd frontend && npx playwright test --reporter=line"
  ],
  "depende_de": []
 },
 {
  "chave": "CS-44",
  "territorio": "frontend",
  "titulo": "O PLAY CHEGA AO MEDICO E ⛔ NAO AO MOSTRUARIO: a marca entra na LIGACAO do Cartao (`Cartao.tsx:125`), «Entrar na sala» com play e «Ver a gravacao» com a sua, e o clique continua a levar a /ao-vivo e /gravacao (criterio 4)",
  "escopo_paths": [
   "frontend/src/componentes/base/Cartao.tsx",
   "frontend/src/app/calendario/",
   "frontend/e2e/calendario.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'a aula a decorrer mostra Entrar na sala com a marca do play na ligacao do cartao'",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'a aula realizada mostra Ver a gravacao com a sua marca na ligacao do cartao'",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'clicar na ligacao continua a levar a ao-vivo e a gravacao da mesma aula'",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'a marca da ligacao leva palavra, o foco de teclado e visivel e o alvo mede 48dp'",
   "cd frontend && grep -A6 'export interface Porta' src/app/calendario/aulas.ts | grep -q 'icone'",
   "cd frontend && ! grep -rqE '#[0-9a-fA-F]{3,8}' src/app/calendario/ src/componentes/base/Cartao.tsx",
   "cd frontend && npx playwright test --reporter=line"
  ],
  "depende_de": [
   "CS-43"
  ]
 },
 {
  "chave": "CS-45",
  "territorio": "frontend",
  "titulo": "OS OITO BOTOES MUDOS DE ECRA DE PRODUTO GANHAM MARCA — 8 hoje ⟹ 0 no fim, contados SEM contar comentarios, e as excepcoes (10 do mostruario, 3 de peca generica) ficam ESCRITAS e contadas no codigo (criterio 5)",
  "escopo_paths": [
   "frontend/src/app/cadastro/formulario.tsx",
   "frontend/src/app/entrar/page.tsx",
   "frontend/src/app/especialista/questoes/[aulaId]/page.tsx",
   "frontend/src/app/secretaria/aulas/[id]/page.tsx",
   "frontend/src/app/secretaria/aulas/nova/page.tsx",
   "frontend/src/app/secretaria/upas/nova/page.tsx",
   "frontend/src/app/secretaria/upas/page.tsx",
   "frontend/e2e/botoes.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/botoes.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/botoes.spec.ts --reporter=line -g 'zero botoes mudos em ecra de produto, contados no codigo e sem contar comentarios'",
   "cd frontend && npx playwright test e2e/botoes.spec.ts --reporter=line -g 'as excepcoes estao escritas, contadas e justificadas: o mostruario e as pecas genericas'",
   "cd frontend && npx playwright test e2e/botoes.spec.ts --reporter=line -g 'cada botao que ganhou marca mantem a palavra, o foco visivel e o alvo de 48dp'",
   "cd frontend && npx playwright test e2e/botoes.spec.ts --reporter=line -g 'nenhum botao trocou de significado: a marca diz o que o botao faz'",
   "cd frontend && npx playwright test e2e/entrada.spec.ts e2e/upas.spec.ts e2e/aulas.spec.ts e2e/questoes.spec.ts e2e/cadastro.spec.ts --reporter=line",
   "cd frontend && npx playwright test --reporter=line"
  ],
  "depende_de": [
   "CS-43"
  ]
 },
 {
  "chave": "CS-46",
  "territorio": "backend",
  "titulo": "O NUCLEO EXISTE, NA PALAVRA DELE: entidade com NOME e MARCA, os DEZ do dono semeados como ele os ditou (regra 102), so' a SECRETARIA cria e renomeia, e ARQUIVA-SE — ⛔ nao se apaga (criterio 6, decisoes 1 e 6)",
  "escopo_paths": [
   "backend/prisma/schema.prisma",
   "backend/prisma/migrations/",
   "backend/prisma/seed-nucleos.ts",
   "backend/src/modules/nucleo/",
   "backend/src/app.module.ts",
   "backend/test/nucleo.e2e-spec.ts"
  ],
  "aceites": [
   "cd backend && npx jest test/nucleo.e2e-spec.ts --runInBand --ci",
   "cd backend && npx jest test/nucleo.e2e-spec.ts --runInBand --ci -t 'os dez nucleos do dono estao la, escritos como ele os ditou'",
   "cd backend && npx jest test/nucleo.e2e-spec.ts --runInBand --ci -t 'so a secretaria cria e renomeia: coordenador, medico e especialista levam 403'",
   "cd backend && npx jest test/nucleo.e2e-spec.ts --runInBand --ci -t 'arquivar nao apaga: deixa de se oferecer nas novas e continua a mostrar-se nas velhas'",
   "cd backend && npx jest test/nucleo.e2e-spec.ts --runInBand --ci -t 'a semente corre duas vezes e continua a haver dez'",
   "cd backend && npx jest test/nucleo.e2e-spec.ts --runInBand --ci -t 'nucleo sem marca le-se sem marca e sem erro'",
   "cd backend && grep -q 'model Nucleo' prisma/schema.prisma",
   "cd backend && test -d src/modules/nucleo && ! grep -rqiE 'especialidade|maissaude' src/modules/nucleo/",
   "cd backend && npx jest test/identidade.e2e-spec.ts test/upa.e2e-spec.ts --runInBand --ci"
  ],
  "depende_de": []
 },
 {
  "chave": "CS-47",
  "territorio": "backend",
  "titulo": "A AULA APONTA AO NUCLEO E OS 58 MIGRAM SEM PERDA: casa por texto exacto (so' caixa, acentos e espacos ignorados) ⟹ 11 ligadas, 13 nulas, 34 POR ATRIBUIR COM O TEXTO VELHO GUARDADO, e correr duas vezes da o mesmo (criterio 7, decisoes 5 e 7)",
  "escopo_paths": [
   "backend/prisma/schema.prisma",
   "backend/prisma/migrations/",
   "backend/src/modules/aula/",
   "backend/test/aula.e2e-spec.ts",
   "backend/test/migracao-nucleo.e2e-spec.ts"
  ],
  "aceites": [
   "cd backend && npx jest test/migracao-nucleo.e2e-spec.ts --runInBand --ci",
   "cd backend && npx jest test/migracao-nucleo.e2e-spec.ts --runInBand --ci -t '58 aulas antes, 58 depois: nenhuma adivinhada e nenhuma apagada'",
   "cd backend && npx jest test/migracao-nucleo.e2e-spec.ts --runInBand --ci -t 'as 11 que casam por texto exacto ficam ligadas ao seu nucleo'",
   "cd backend && npx jest test/migracao-nucleo.e2e-spec.ts --runInBand --ci -t 'as 13 nulas ficam nulas e as 34 que nao casam ficam por atribuir com o texto velho guardado'",
   "cd backend && npx jest test/migracao-nucleo.e2e-spec.ts --runInBand --ci -t 'Emergencia nao casa com Urgencia e emergencia e fica por atribuir'",
   "cd backend && npx jest test/migracao-nucleo.e2e-spec.ts --runInBand --ci -t 'correr a migracao duas vezes da o mesmo resultado'",
   "cd backend && npx jest test/aula.e2e-spec.ts --runInBand --ci -t 'a aula continua a poder nascer sem nucleo'",
   "cd backend && npx jest test/aula.e2e-spec.ts --runInBand --ci",
   "cd backend && grep -q 'nucleoId' prisma/schema.prisma && grep -q 'especialidade ' prisma/schema.prisma",
   "cd backend && npx jest test/questao.e2e-spec.ts test/participacao.e2e-spec.ts test/gravacao.e2e-spec.ts --runInBand --ci"
  ],
  "depende_de": [
   "CS-46"
  ]
 },
 {
  "chave": "CS-48",
  "territorio": "frontend",
  "titulo": "A SECRETARIA CRIA UM NUCLEO E ESCOLHE A MARCA DA GALERIA: ecra proprio em /secretaria/nucleos, marca por omissao para quem ⛔ nao escolheu, e quem la chega sem direito ve SEM PERMISSAO — ⛔ nao erro, ⛔ nao vazio (criterio 9, 11)",
  "escopo_paths": [
   "frontend/src/app/secretaria/nucleos/",
   "frontend/src/lib/navegacao.ts",
   "frontend/e2e/nucleos.spec.ts",
   "frontend/e2e/navegacao.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/nucleos.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/nucleos.spec.ts --reporter=line -g 'a secretaria cria Medicina Intensiva e escolhe uma peca da galeria'",
   "cd frontend && npx playwright test e2e/nucleos.spec.ts --reporter=line -g 'coordenador, medico e especialista veem SEM PERMISSAO e nao o dado por baixo'",
   "cd frontend && npx playwright test e2e/nucleos.spec.ts --reporter=line -g 'nucleo criado sem escolher marca mostra a marca por omissao no ecra de nucleos'",
   "cd frontend && npx playwright test e2e/nucleos.spec.ts --reporter=line -g 'os seis estados do ecra de nucleos: vazio, a carregar, erro, sem permissao, sucesso e parcial'",
   "cd frontend && npx playwright test e2e/nucleos.spec.ts --reporter=line -g 'arquivar pede confirmacao e nao e botao vermelho'",
   "cd frontend && npx playwright test e2e/nucleos.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/navegacao.spec.ts --reporter=line",
   "cd frontend && test -d src/app/secretaria/nucleos && ! grep -rqE '#[0-9a-fA-F]{3,8}|shimmer|animate-pulse|snackbar' src/app/secretaria/nucleos/",
   "cd frontend && npx playwright test --reporter=line"
  ],
  "depende_de": [
   "CS-43",
   "CS-46"
  ]
 },
 {
  "chave": "CS-49",
  "territorio": "frontend",
  "titulo": "O CALENDARIO DIZ O NUCLEO, E «POR ATRIBUIR» ⛔ NAO PARECE AVARIA: marca + palavra no cartao da aula, marca por omissao e o TEXTO VELHO legivel para quem vai atribuir — ⛔ sem vermelho e ⛔ sem estado de erro (criterio 8, 11)",
  "escopo_paths": [
   "frontend/src/app/calendario/",
   "frontend/src/componentes/base/Cartao.tsx",
   "frontend/e2e/calendario.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'a aula com nucleo mostra a marca do nucleo e a palavra'",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'a aula por atribuir mostra a marca por omissao e a palavra Por atribuir, sem vermelho e sem estado de erro'",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'o texto velho continua legivel para quem vai atribuir'",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'marca desconhecida cai para a marca por omissao e o cartao nao parte'",
   "cd frontend && npx playwright test e2e/calendario.spec.ts --reporter=line -g 'a marca do nucleo carrega palavra, e nunca vai so a cor'",
   "cd frontend && ! grep -qi 'nucleo' src/componentes/base/Icone.tsx",
   "cd frontend && npx playwright test --reporter=line"
  ],
  "depende_de": [
   "CS-44",
   "CS-47"
  ]
 },
 {
  "chave": "CS-50",
  "territorio": "frontend",
  "titulo": "A SECRETARIA ATRIBUI O NUCLEO A AULA E A LISTA MOSTRA-O: o campo de texto livre da especialidade da lugar a ESCOLHA de um nucleo, o arquivado ⛔ nao se oferece nas novas e continua nas velhas (criterio 9, decisoes 5 e 6)",
  "escopo_paths": [
   "frontend/src/app/secretaria/aulas/",
   "frontend/e2e/aulas.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line -g 'cadastrar uma aula escolhe o nucleo de uma lista e ja nao se escreve a especialidade a mao'",
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line -g 'a aula por atribuir aparece na lista com a marca por omissao e a palavra'",
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line -g 'trocar o nucleo de uma aula ja cadastrada guarda e mostra-se'",
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line -g 'o nucleo arquivado nao se oferece numa aula nova e continua a mostrar-se na aula velha'",
   "cd frontend && npx playwright test e2e/aulas.spec.ts --reporter=line -g 'a aula pode ficar sem nucleo: nenhuma obrigacao nova nasce aqui'",
   "cd frontend && npx playwright test --reporter=line"
  ],
  "depende_de": [
   "CS-45",
   "CS-47",
   "CS-48"
  ]
 },
 {
  "chave": "CS-51",
  "territorio": "backend",
  "titulo": "CARREGAR UMA MARCA ⛔ NAO E ACEITAR QUALQUER COISA: lista fechada de formatos, tecto de tamanho e SVG SANEADO (⛔ sem script, ⛔ sem foreignObject, ⛔ sem referencia externa), servido de modo a ⛔ NAO EXECUTAR, e o recusado diz o que fazer (criterio 10, decisao 9)",
  "escopo_paths": [
   "backend/src/modules/marca/",
   "backend/src/app.module.ts",
   "backend/package.json",
   "backend/package-lock.json",
   "backend/test/marca.e2e-spec.ts"
  ],
  "aceites": [
   "cd backend && npx jest test/marca.e2e-spec.ts --runInBand --ci",
   "cd backend && npx jest test/marca.e2e-spec.ts --runInBand --ci -t 'um SVG com script nao chega a ser servido com o script la dentro'",
   "cd backend && npx jest test/marca.e2e-spec.ts --runInBand --ci -t 'o ficheiro servido tem zero script, zero foreignObject e zero referencia externa'",
   "cd backend && npx jest test/marca.e2e-spec.ts --runInBand --ci -t 'ficheiro acima do tecto e recusado com frase que diz o que aconteceu e o que fazer'",
   "cd backend && npx jest test/marca.e2e-spec.ts --runInBand --ci -t 'formato fora da lista fechada e recusado do mesmo modo'",
   "cd backend && npx jest test/marca.e2e-spec.ts --runInBand --ci -t 'so a secretaria carrega: os outros tres papeis levam 403'",
   "cd backend && npx jest test/marca.e2e-spec.ts --runInBand --ci -t 'a marca servida vai com cabecalhos que a impedem de executar'",
   "cd backend && grep -qE 'multer|FileInterceptor|multipart' package.json",
   "cd backend && npx jest test/nucleo.e2e-spec.ts test/identidade.e2e-spec.ts --runInBand --ci"
  ],
  "depende_de": [
   "CS-46"
  ]
 },
 {
  "chave": "CS-52",
  "territorio": "frontend",
  "titulo": "CARREGAR A MARCA PELO ECRA, e so DEPOIS de ESCOLHER estar fechado: as tres recusas dizem o que fazer, e o que entra ⛔ nao executa nada no browser (criterio 10, decisao 8)",
  "escopo_paths": [
   "frontend/src/app/secretaria/nucleos/",
   "frontend/e2e/nucleos-carregar.spec.ts"
  ],
  "aceites": [
   "cd frontend && npx playwright test e2e/nucleos-carregar.spec.ts --reporter=line",
   "cd frontend && npx playwright test e2e/nucleos-carregar.spec.ts --reporter=line -g 'a secretaria carrega uma peca e ela passa a marcar o nucleo em todo o lado'",
   "cd frontend && npx playwright test e2e/nucleos-carregar.spec.ts --reporter=line -g 'ficheiro acima do tecto e recusado com frase que diz o que fazer'",
   "cd frontend && npx playwright test e2e/nucleos-carregar.spec.ts --reporter=line -g 'formato fora da lista e recusado do mesmo modo'",
   "cd frontend && npx playwright test e2e/nucleos-carregar.spec.ts --reporter=line -g 'o que entra nao executa nada no browser'",
   "cd frontend && npx playwright test e2e/nucleos.spec.ts --reporter=line",
   "cd frontend && npx playwright test --reporter=line"
  ],
  "depende_de": [
   "CS-48",
   "CS-51"
  ]
 }
]