# D24 · CS-42 — O NUCLEO PASSA A EXISTIR, E OS ICONES ENTRAM ONDE SE VEEM
**10 cards · 7 `frontend` · 3 `backend` · 90 aceites.** Enquadrado 29/09 contra o `main`
(`b045518`), com o banco `capacita` vivo. Tudo o que esta aqui foi **MEDIDO**, ⛔ nao lido do texto.

## A CADEIA
```
CS-43 (pecas normalizadas + Icone de ficheiro) ──┬── CS-44 (o play na LIGACAO do cartao) ──┐
                                                 ├── CS-45 (os botoes mudos)  ──────────┐  │
                                                 └── CS-48 (ecra de nucleos) ──┐        │  │
CS-46 (o nucleo existe) ──┬── CS-47 (a aula aponta + migracao dos 58) ─────────┼────────┼──┼── CS-49
                          ├── CS-48 (ecra de nucleos) ──────────────────────── ┴────────┴──┴── CS-50
                          └── CS-51 (carregar: guardar, sanear, servir) ─────────────────────── CS-52
```
CS-43 e CS-46 sao as duas raizes e correm **em paralelo** (uma e frontend, outra e backend, e ⛔ nao
se tocam). 🩸 O dependente so nasce depois de o pai ser **APROVADO PELO QA**.
Profundidade maxima: **4** (CS-43 ⟶ CS-45 ⟶ CS-50; CS-46 ⟶ CS-47 ⟶ CS-50).

---

# SEIS NUMEROS DO CRITERIO MUDARAM, E ESTAO MEDIDOS AQUI
O texto da demanda ⛔ nao se toca. A correccao vive neste ficheiro, como o quadro mandou — e o
quadro tambem ja tinha corrigido o texto do dono. Estas sao as correccoes **ao criterio do quadro**.

### 1 · OS BOTOES MUDOS DE ECRA DE PRODUTO SAO **OITO**, ⛔ NAO ONZE
O criterio (5) diz «11 hoje ⟹ 0 no fim». Medido hoje, varrendo `<Botao` em `frontend/src` **depois
de tirar comentarios**:

| contagem | com comentarios (o que o quadro contou) | REAL |
|---|---:|---:|
| `<Botao>` no total | 42 | **39** |
| com icone | 18 | 18 |
| sem icone | 24 | **21** |
| menos o mostruario `app/sistema/` | −10 | −10 |
| menos as pecas genericas (`Dialogo.tsx:49,50`, `LeitorDeGravacao.tsx:314`) | −3 | −3 |
| **mudos de ecra de produto** | **11** | **8** |

**A causa, medida:** TRES dos «botoes» contados sao **mencoes dentro de comentarios** —
`app/page.tsx:20` e `:26` («⛔ NAO se envolve um `<Botao>` num `<Link>`») e `entrar/page.tsx:109`
(«o `<span>` que envolve o `<Botao>`»). A raiz e a entrada ⛔ nao tem botao mudo nenhum: a raiz ⛔
nao tem `<Botao>` de todo (a accao principal e uma LIGACAO com a forma de botao, por decisao escrita
no CS-30) e a entrada tem um so, que e o «Entrar».

⟹ **OS OITO, um a um** (ficheiro:linha, e sao a cerca do CS-45):
1. `app/cadastro/formulario.tsx:393` — ENVIAR
2. `app/entrar/page.tsx:223` — Entrar
3. `app/especialista/questoes/[aulaId]/page.tsx:283` — Guardar
4. `app/secretaria/aulas/[id]/page.tsx:459` — Trocar responsavel
5. `app/secretaria/aulas/nova/page.tsx:310` — Cadastrar aula
6. `app/secretaria/upas/nova/page.tsx:154` — Cadastrar UPA
7. `app/secretaria/upas/nova/page.tsx:158` — Cancelar
8. `app/secretaria/upas/page.tsx:177` — Copiar link

🩸 **E por isso o aceite conta SEM COMENTARIOS, e isso esta escrito nele.** Se o teste contar
texto cru, alguem «arranja» o numero a apagar um comentario — e o produto fica na mesma.

### 2 · A LIGACAO DO CARTAO **JA TEM** UM ICONE — o criterio (4) esta errado na metade que mede
O criterio diz «HOJE, MEDIDO: essa ligacao ⛔ nao tem icone nenhum». Medido em
`componentes/base/Cartao.tsx:124-128`:
```tsx
<a className={`${estilos.ligacao} ${estilos.foco}`} href={ligacao.href}>
  {ligacao.rotulo}
  <Icone nome="chevron_right" tamanho={18} accao />   ← JA LA ESTA
</a>
```
⟹ Um aceite escrito como «a ligacao do cartao tem um `<Icone>`» **PASSA NA BASE** e o portao
reprova-o (P5). O que falta e a **MARCA DA PORTA A CABECA** — o play em «Entrar na sala» e a sua
marca em «Ver a gravacao» —, ⛔ nao um icone qualquer. E o `chevron_right` do fim ⛔ nao se tira: e
a anatomia do cartao que a regra 85 fixa («link de texto com chevron»).
⟹ O aceite de codigo do CS-44 mede a coisa certa: `interface Porta` (em `calendario/aulas.ts:247`)
passa a carregar a marca — **o endereco e a marca saem do MESMO sitio**, ⛔ nao de uma literal
espalhada pelo componente. Conferido: falha na base.

### 3 · A GALERIA TEM **39** PECAS E COBRE **15 de 15** — ⛔ nao 14
Contado agora em `_produto/design/exports/desenhos/`: **45 SVG**, dos quais 39 sao o conjunto
(`ac-` 7 · `cp-` 6 · `ex-` 15 · `nu-` 6 · `s-` 5) e 6 sao ensaios (`svg-*`, `v3-*`, `traco-1-*`).
**Olhei para as 39, uma a uma, normalizadas e ampliadas** (folha de contacto abaixo):
- os **15 `ex-`** casam com os 15 nomes de `Icone.tsx` **um a um** — incluindo `ex-carregar`, que e
  o arco com falha, ou seja **`progress_activity`**. ⟹ A cobertura e **15/15**, e o criterio (1)
  («>= 14 de 15») cumpre-se com folga. Quem gira e o CSS, ⛔ nao o desenho — e gira respeitando
  `prefers-reduced-motion` (regra 82).
- os **10 nucleos** do dono tem os dez (`nu-urologia · s-cardio · nu-paliativos · nu-urgencia ·
  nu-cirurgia · s-peds · nu-infecto · s-neuro · nu-psiquiatria · s-orto`). Conferidos a olho:
  rim · coracao · mao com coracao · ambulancia · bisturi · crianca · virus · cerebro · cabeca ·
  osso.
- sobram **13** que o produto ainda ⛔ nao tem nome para: `ac-` (certificado/medalha · entrar/porta ·
  estrela · fechar/X · gravacao/seta de repetir · notificacao/sino · podio/trofeu) e `cp-`
  (crm · especialidade/etiqueta · identificacao · nome · senha/chave · titulo/documento).
⟹ **O criterio ⛔ nao fixa numero de pecas: fixa COBERTURA.** Os aceites do CS-43 medem
cobertura e normalizacao, ⛔ nunca «39».

### 4 · A NORMALIZACAO TEM MAIS CASOS DO QUE O TEXTO DIZ — e e' aqui que ela parte se for ingenua
O criterio (2) diz «as CINCO coisas estao em **100%** das pecas». Medido ficheiro a ficheiro:

| defeito | pecas | nota |
|---|---:|---|
| manifesto `c2pa` em `<metadata>` | **39/39** | ~18 KB, 94% do peso |
| `viewBox="0 0 2048 2048"` + `width/height=1024` | 39/39 | |
| `preserveAspectRatio="none"` | 39/39 | |
| `fill="rgb(...)"` literal | 39/39 | |
| **placa branca da tela inteira** | **34/39** | ⚠️ ⛔ NAO sao 100% |
| **branco INTERIOR (recorte, ⛔ nao placa)** | **12/39** | `ex-seta` tem 5, `ex-mais` e `ex-carregar` tem 4 |
| **mais do que UM tom escuro** | **5/39** | `ac-notificacao`, `ex-livro`, `ex-seta`, `nu-paliativos`, `s-cardio` |

🩸 **As duas ultimas linhas sao a armadilha, e ⛔ nao estao no texto da demanda.** As cinco sem
placa sao `ex-carregar`, `ex-mais`, `ex-pessoa`, `ex-seta`, `s-peds`. E um normalizador que
«apague todo o caminho branco» **come o recorte** de 12 pecas (o buraco do `+`, o vazio da seta, o
olho da pessoa) e devolve manchas solidas; um que «ponha tudo a `currentColor`» **achata** as 5
multitom. ⟹ O passo tem de distinguir **placa** (caminho branco do tamanho EXACTO da tela,
`M 0 0 L 2048 0 L 2048 2048 L 0 2048 L 0 0 z`) de **recorte**, e tratar o multitom com regra
escrita. Provei o caminho: a folha de contacto abaixo foi gerada com esse criterio e as 39 leem-se.

### 5 · `Icone.tsx` HOJE E' **TRACO**, E AS PECAS SAO **MANCHA** — a peca de CSS tem de virar
Medido em `base.module.css:530-538`: `.icone { fill: none; stroke: currentColor; stroke-width: 2 }`.
As pecas normalizadas sao **silhuetas cheias** (`fill`), sem traco nenhum. ⟹ Servir o ficheiro com
a classe de hoje da **um icone invisivel**. A classe tem de passar a `fill: currentColor` — e, se
algum nome ficar sem peca, a primitiva temporaria precisa da variante de traco. Isto esta na cerca
do CS-43 (`base.module.css`) de proposito.

### 6 · OS 58 CONFIRMAM-SE, AO NUMERO
`docker exec capacita-postgres psql -U capacita -d capacita`, agora:
`Emergencia` 30 · NULO 13 · `Urgência e emergência` 8 · `Cardiologia` 3 · `Medicina Intensiva` 2 ·
`Clinica` 1 · `Clinica medica` 1 = **58**. ⟹ **casam 11, nulas 13, ⛔ nao casam 34**. Exactamente o
que o criterio (7) diz. ⛔ Nada a corrigir aqui.

---

# TRES DECISOES DE PARTICAO QUE PRECISAM DE SER LIDAS

### A · A COLUNA `especialidade` ⛔ NAO SE APAGA — ela **E'** o texto velho guardado
A decisao 7 do quadro manda guardar o texto velho de quem ⛔ nao casa. A forma mais barata e mais
reversivel de o fazer e **⛔ nao lhe tocar**: `aula.especialidade String?` fica onde esta
(`schema.prisma:139`) e ganha-se `nucleoId String?` ao lado. Ganhos medidos: (a) as 34 ficam com o
texto velho sem coluna nova; (b) ⛔ nenhum dos quatro ecras que hoje leem `especialidade`
(`Calendario.tsx:322`, `secretaria/aulas/pecas.tsx:274`, `secretaria/aulas/[id]:309`,
`especialista/questoes/page.tsx:74`) parte enquanto ⛔ nao for a vez dele; (c) reverter e tirar uma
coluna anulavel. O aceite do CS-47 exige as DUAS palavras no `schema.prisma`.

### B · A MARCA DO NUCLEO ⛔ NAO ENTRA NO `NomeDeIcone`, E ISSO OBRIGA O `Cartao` A MUDAR
`Cartao.tsx:41` declara `iconeDaMateria?: NomeDeIcone` — o **conjunto fechado**. A marca do nucleo
e DADO (decisao 1) e a lista ⛔ nao e fechada (regra 102). ⟹ O cartao passa a aceitar uma marca que
⛔ nao e um nome do conjunto, com queda para a marca por omissao quando a chave ⛔ nao se conhece
(criterio 11). E por isso que `Cartao.tsx` esta na cerca do CS-44 e do CS-49 — e **so** desses dois,
que correm em cadeia e ⛔ nao se pisam.

### C · O ECRA NOVO OBRIGA A MEXER EM `lib/navegacao.ts` — e ⛔ nao e' opcional
`e2e/navegacao.spec.ts:592` **le os ficheiros do backend** e exige que cada pagina em disco esteja
em `PORTAS` ou em `ORFAS_DELIBERADAS`, e que a porta bata com o `@Papeis` do controlador. ⟹ Criar
`/secretaria/nucleos` sem registar a porta **parte o e2e que ja la esta**. `lib/navegacao.ts` e
`e2e/navegacao.spec.ts` estao na cerca do CS-48, e o CS-48 depende do CS-46 **por causa disto**: a
porta so bate se o `nucleo.controlador.ts` com `@Papeis('SECRETARIA')` ja existir no ramo.

---

# 🩸 O PORTAO DE GOSTO — A FOLHA DE CONTACTO ESTA FEITA E ESPERA POR SI
O criterio (13) diz que ⛔ nenhuma peca entra no repo sem o senhor a ter VISTO, pelo mesmo caminho
por que escolheu o traco 3. Esta la:

- **`_produto/design/exports/desenhos/_ver/folha-de-contacto-D24.html`** — as 39 pecas ja
  normalizadas, cada uma a 48dp sobre a superficie do ecra, a 24dp sobre o cartao, a 24dp na cor de
  accao e a 18dp (o tamanho do metadado). E' isto que entra no repo.
- **`_produto/design/exports/desenhos/_ver/folha-de-contacto-D24.png`** — a mesma coisa numa
  imagem so, com os nomes por baixo.

⛔ **Nenhuma peca nova foi gerada para isto** e ⛔ nao se gastou um credito: sao as que o estudio ja
tinha. O que o senhor ⛔ nao quiser, diga e ⛔ nao entra — e o CS-43 traz um
`src/assets/icones/PROVENIENCIA.md` com uma linha por peca, contada pelo aceite, para se saber
sempre de onde veio cada uma.

---

# OBSERVACOES — ⛔ NAO SAO ACHADOS: ⛔ nada disto me impediu de enquadrar

1. 🩸 **O `design.md` §11 ⛔ NAO CABE EM CARD NENHUM, e o criterio (12) exige-o.** Medido:
   `_produto/` **⛔ nao esta dentro do repositorio** (`git ls-files | grep ^_produto` ⟹ 0), e o hook
   da cerca (`/srv/fab/hooks/escopo.sh:81-95`) nega toda a escrita fora do worktree, deixando so
   `/srv/fab/obra/<produto>/`. E `fab enquadrar` exige `papeis/<territorio>-dev.md`: ha
   `estudio.md`, ⛔ nao ha `estudio-dev.md` ⟹ **⛔ nao existe territorio que possa reescrever o
   `design.md`**. ⚠️ **Consequencia medida:** §11 continua a mandar `Material Symbols` e e contra
   ele que o `rev-design` julga (§15 do proprio documento) — se ⛔ nao for reescrito ANTES de o
   CS-43 ser julgado, o revisor reprova os ecras por fazerem exactamente o que esta demanda manda.
   ⟹ **E trabalho do ESTUDIO, fora dos cards.** Quem mandar nascer o estudio a seguir, mande-o
   fazer isto primeiro: trocar §11 por «as pecas sao do conjunto proprio, servidas de
   `frontend/src/assets/icones/`, normalizadas; ⛔ nenhuma chamada de rede (R27)». E o UNICO
   ficheiro de `_produto/design/` que esta demanda toca.
2. **Dois dos oito botoes ⛔ nao tem peca honesta**: «Copiar link» (⛔ nao ha peca de copiar) e
   «Enviar» (a mais proxima e `ex-check`). A trava da regra 100 manda que o simbolo diga o que a
   coisa E'. ⟹ O CS-45 tem uma saida escrita: o botao sem peca honesta entra na MESMA lista de
   excepcoes contadas e justificadas, e ⛔ NAO leva um simbolo que diga outra coisa. ⛔ Nao se gera
   peca nova nesta demanda (criterio 13) e ⛔ nao se pergunta ao dono: isto e oficio, ⛔ nao gosto.
3. **A demanda 23 esta PAUSADA e a cerca cruza-se com a desta em quatro sitios**:
   `schema.prisma`, `prisma/migrations/`, `modules/aula/` e `app/secretaria/aulas/` (cards CS-33 a
   CS-41, todos por integrar — o CS-33 esta `pronto`). ⛔ Nada bloqueia hoje, porque nada do D23
   esta no ramo; mas quem retomar o D23 vai encontrar `nucleoId` na `aula` e um selector no ecra da
   secretaria. ⟹ Diga-se em voz alta em vez de se descobrir num conflito.
4. **A instancia `main` esta viva** (frontend 3002, backend 3003, `em dia` com `b045518`) e o banco
   `capacita` tem os 58. O QA desta demanda tem instancia onde exercer os treze factos — e a prova
   do que tem ecra e **captura de browser**, ⛔ nunca curl (criterio).
5. **O rastreador deste produto e o livro da propria fabrica**, ⛔ nao ha Jira aqui: a regra 3
   (`MSS-<n>` vem do Jira) tem ambito `produto:maissaude`. As chaves `CS-<n>` correm em sequencia
   continua no `estado.db` (CS-1 … CS-41, sem buracos) e o epic toma o numero seguinte, como em
   CS-27 (cards 28-31) e CS-32 (cards 33-41). ⟹ **CS-42 para o epic, CS-43…CS-52 para os cards.**
   ⛔ Nenhuma chave foi improvisada.
