# ENQUADRAMENTO DA DEMANDA 30 — epic `CS-147`

**16 cards · 13 frontend · 3 backend · 19 ecrãs cobertos, um a um.**
Escrito em 30/09 pelo enquadrador, contra o repo em `6dcf051`.

## A ORDEM, e é a do resumo da demanda (decisão 9 do quadro)

```
CS-148  a biblioteca ganha acto  ─┬─────────────────────────────┐
CS-149  Inter auto-alojada       ─┴─ CS-150  a casca por token ─┼─→ os 9 cards de ecrã
CS-151  os seis estados com desenho (dep. CS-148) ──────────────┘
CS-152  GET /vinculos separa-se  ──→ CS-153  o menu (secretaria vê tudo, /sistema sai)
CS-154  a marca dos dez núcleos  ──→ CS-157 · CS-159 · CS-160
```

Três raízes nascem juntas e ⛔ nada as bloqueia: **CS-148** (a biblioteca), **CS-149** (a letra),
**CS-152** e **CS-154** (os dois de servidor). Tudo o mais desce daí.

## PORQUE É QUE A BIBLIOTECA VEM PRIMEIRO, e ⛔ não é preferência

Medido, e é a causa que o texto da demanda ⛔ não tinha: `componentes/base` é um **mostruário**.
`grep -rn "onClick|onChange|onSelect" src/componentes/base/*.tsx` ⟹ **0**. E ⛔ não é só o clique:
`ListaDensa` é fechada em `nome/crm/upa/numero/estado` e ⛔ **não recebe ligação por linha** — está
escrito pelo dev que tropeçou, `app/coordenador/pecas.tsx:111`. ⟹ Repaginar 19 ecrãs antes disto é
multiplicar o embrulho por 19. **Por isso `ListaDensa` e `Cartao` entram no CS-148** (ligação/acto
por linha): sem isso ⛔ nenhum ecrã as pode adoptar, e o card seguinte devolvia.

## O QUE DECIDI, sendo reversível — nomeado para o dono corrigir no aceite

1. **CS-151 (os seis estados com desenho) vem ANTES dos 19 ecrãs**, e ⛔ não em (f) como a ordem do
   resumo punha. Razão **mecânica**: a peça é a mesma nos 19 e fazê-la depois reabria as 19
   capturas ao `rev-design`. **A prioridade é do dono** — se ele a quiser no fim, muda-se uma
   dependência e ⛔ mais nada.
2. **Os 19 ecrãs partem-se em 9 cards por ecrã de trabalho**, ⛔ não um por página (19 cards com a
   mesma cerca a colidir) nem um só (uma cerca de `src/app` inteiro ⛔ não protege ninguém). Cada
   card mata **os seus** embrulhos, dentro da **sua** cerca.
3. **O `Acto` de `app/coordenador/pecas.tsx` morre no CS-156**, que é o card que reescreve aquele
   ecrã — ⛔ não num card de limpeza à parte, que teria de abrir cinco cercas de uma vez.
4. **A contagem GLOBAL a zero** (7 `closest('button')` ⟹ 0 · 3 `display: contents` ⟹ 0 · `<button>`
   crus ⟹ 0) fica como **critério da DEMANDA**, ⛔ não como aceite de card: um card ⛔ não pode
   reprovar por causa do código de outro. Cada card prova **zero na sua cerca**.

## ⚠️ TRÊS MEDIÇÕES MINHAS QUE DIVERGEM DO TEXTO DO RESUMO — fica escrito, ⛔ não escondido

| o resumo diz | eu medi | consequência |
|---|---|---|
| `<button>` cru fora da base: **14** | **11** linhas com `<button` em 8 ficheiros (1 é a casca) | ⛔ nenhuma: o alvo é **0** nos dois casos |
| `Cartao` em **1** ecrã de produto | **2**: `/calendario` (2 usos) e `/especialista/questoes` (1, mas o cartão dali é feito à mão — `rodapeDoCartao`) | o CS-161 mata o cartão feito à mão |
| **39** literais crus na casca | `casca.module.css` dá **48** linhas com `rem`/`px` — a minha sonda conta também os `1px` de contorno, que são o `outline` de 1dp do M3 e **ficam** | o aceite do CS-150 exige zero literais de **espaço, letra, raio e sombra**, e ⛔ não proíbe o contorno de 1px |

## 🩸 OBSERVAÇÕES DE MECANISMO — ⛔ NÃO me impediram de continuar, logo ⛔ NÃO são achado

⚠️ Medido 21/09: 91% dos achados foram escritos por quem ⛔ não estava bloqueado, e cada um pára um
card. Eu entreguei o enquadramento ⟹ isto é observação, e vive aqui, onde quem vem a seguir a lê.

1. **TRÊS DOS QUINZE CRITÉRIOS DA DEMANDA ⛔ NÃO CABEM EM CARD NENHUM**, e a causa é de mecanismo:
   - **critério 12 (a marca: três símbolos + a assinatura do nome)** é trabalho do **estúdio**.
     `fab enquadrar` recusa território sem `/srv/fab/papeis/<t>-dev.md`, e há `estudio.md` mas
     ⛔ não há `estudio-dev.md` ⟹ **⛔ não existe card de estúdio.**
   - **critério 13 (`design.md` posto a dia)**: o ficheiro vive em
     `/srv/produtos/capacitasalvador/_produto/design/design.md`, **FORA do `repo`** —
     `git check-ignore` responde *«outside repository»*. O portão P2 compara a cerca com o **diff do
     git** ⟹ um card que só mexesse ali entregava **diff vazio**.
   - **critério 14 (o `rev-design` julga por captura)**: `grep -rn "rev-design" /srv/fab/bin/` dá
     **zero** ocorrências em `motor` — o motor faz nascer `especificador`, `<t>-dev`, `qa` e
     `rev-qa`, e **⛔ nunca `rev-design` nem `estudio`**. O papel existe e ⛔ nada o acorda.
   ⟹ **Os cards cobrem os critérios 1 a 11 e 15.** Os 12, 13 e 14 precisam do estúdio e do
   `rev-design` a nascer, e isso é da casa, ⛔ não deste epic. Quem fechar a demanda 30 tem de
   contar com isto **antes** de a declarar pronta.
2. **`lib/navegacao.ts` é disputado por SEIS epics ao mesmo tempo.** Medido: `CS-68`, `CS-74`,
   `CS-92`, `CS-98`, `CS-115` já têm esse ficheiro na cerca, e o `CS-153` também. Cada epic tem o
   seu worktree, logo ⛔ não há conflito de hook — mas **há conflito de rebase garantido** em quem
   integrar por último. É a fonte única das portas, e é por isso que é disputada.
3. **⛔ Não há peça para a porta «UPAs» nas 39 do dono.** Lidas as 39 (`PROVENIENCIA.md`): não há
   edifício, unidade nem posto. O `CS-153` põe ícone em cada porta e **escreve e conta a falta** no
   próprio ficheiro, como o `SEM_PECA` do CS-43 já exige — ⛔ não se finge um ícone que minta.
4. 🩸 **A CHAVE DESTE PRODUTO ⛔ NÃO VEM DE RASTREADOR, E ISSO CUSTOU-ME UMA COLISÃO MEDIDA.** A
   regra 3 (o Jira `MSS`) é de âmbito `produto:maissaude`; para o capacitasalvador ⛔ não há regra de
   rastreador — as chaves são a sequência da própria casa. Eu medi o máximo em uso (**CS-119**),
   tomei o bloco `CS-120` + `CS-121…CS-136` e, ao entregar, `fab enquadrar` morreu em
   `IntegrityError: UNIQUE constraint failed: demanda.chave`: **enquanto eu media o repo, a demanda
   29 (o ranking) foi enquadrada e levou `CS-120` e os cards `CS-121…CS-146`.** ⟹ Renumerei para
   **epic `CS-147`, cards `CS-148…CS-163`**. ⚠️ ⛔ Nada se perdeu (a transacção aborta antes de
   escrever os cards), mas fica medido: **sem rastreador, dois enquadradores em paralelo colidem, e
   quem descobre é o segundo, ao entregar.** Quem enquadrar a seguir: mede o máximo **imediatamente
   antes** de chamar o verbo, ⛔ não no início da sessão.

## O QUE ⛔ NÃO ENTRA, e é a letra do resumo

O ranking e a porta dele (demanda 29, pedido 117 na fila do dono) · as portas do médico (regras 114
e 116 — `lib/navegacao.ts` abre-se aqui, mas metê-las era prioridade minha, e prioridade é do dono) ·
direcção nova · cor nova · **`tokens.css` ⛔ não é tocado** (é aceite explícito do CS-149:
`git diff --exit-code -- src/estilo/tokens.css`) · fotografia · e as demandas 31, 32, 33, 34, 29.

## ⛔ NÃO PERGUNTEI NADA AO DONO, e digo porquê
A fila dele está em três, que é o alvo. A direcção está escolhida (79) · a régua são as cinco
capturas (135 §1) · «a secretaria vê tudo» está decidido **com** a fronteira escrita (111) · a cor
institucional está respondida (pedido 44) · a cor por UPA já foi perguntada duas vezes e ⛔ não
bloqueia (vale o caso conservador) · o brasão tem precedente dele (pedido 59) · as marcas dos dez
núcleos ele já viu («ok, gostei dos modelos»). O resto é mecanismo meu, e reversível.
