# ENQUADRAMENTO · demanda 44 · epic **CS-164**

A lista de aulas da secretaria (`/secretaria/aulas`) ganha a 5.ª aba «Permanentes».
Negócio INTEIRAMENTE fixado pela **regra 292** (decisão do dono 02/10, «ganha aba», pedido p136).
⛔ **Nenhuma pergunta subiu** — as quatro coisas que havia para decidir já estavam decididas.

## Porque são DOIS cards e ⛔ não um
Medido no código (main, `de9779e`), ⛔ não adivinhado:

| onde | o que se mediu |
|---|---|
| `frontend/src/app/secretaria/aulas/dados.ts:137,195` | a lista pede `GET /aulas` |
| `backend/src/modules/aula/aula.servico.ts:269` | servido por `calendario()` |
| `…aula.servico.ts:283` | `where: { permanente: false }` **SEMPRE** |
| `…aula.servico.ts:306` | e ainda **OMITE** as linhas de `inicio` nulo |
| `backend/src/modules/aula/aula.tipos.ts:64` | `AulaNoCalendario` ⛔ sem `permanente`, `inicio: Date` ⛔ não anulável |

⟹ **Hoje a permanente ⛔ NÃO aparece na secretaria — ⛔ nem em «Todas»**, e o §3 da regra 292
(«continua a aparecer em Todas») ⛔ já não é verdade. ⟹ A aba, posta sozinha, nascia SEMPRE VAZIA.
⟹ **Peça 1: o dado chegar (backend). Peça 2: a aba (frontend).** Territórios diferentes ⟹ dois
cards, com dependência declarada — o frontend só nasce depois de o backend ser **aprovado pelo QA**.

## O que já está feito e ⛔ não se refaz
`AulaNaLista` já tem `permanente: boolean` e `inicio: string | null` (`dados.ts:93-95`) · o
classificador canónico do CS-91 já devolve `ETIQUETA_PERMANENTE` sem instante (`dados.ts:548-552`,
`:603-612`) · `aulasDaAba` já filtra pelo rótulo desse classificador (`:1040-1056`) · a linha já diz
«Não expira» no lugar do dia e hora (`pecas.tsx:288-325`).

## Os cards

| chave | território | o que faz | depois de |
|---|---|---|---|
| **CS-165** | backend | `GET /aulas/secretaria` — ao vivo **e** permanentes, ordenadas, com `permanente` e `inicio` anulável. `GET /aulas` ⛔ não se toca | — |
| **CS-166** | frontend | o ecrã passa a pedir essa leitura e ganha a 5.ª aba «Permanentes», em último | CS-165 |

### Rota nova e ⛔ não parâmetro na velha — a razão é medida
Aquele `permanente: false` é **deliberado e de âmbito**: o comentário ao lado diz que é «uma lista de
HORÁRIOS» e que a permanente «⛔ não teria onde se encaixar». `GET /aulas` é **o calendário do
médico** (CS-17, CS-89). Um parâmetro mexeria no mesmo manipulador e no mesmo serviço; uma rota
separada faz do «⛔ não se toca» uma coisa **provável por diff**, é **aditiva** logo **reversível**,
e permite a fechadura própria (`@Papeis(SECRETARIA)`) que o ecrã já declara (`dados.ts:755-758`).

### A ordem, e ⛔ não se intercala
Primeiro as de instante por `inicio` ascendente; **depois** as permanentes por `criadoEm`
descendente com desempate por `id` ascendente — a ordem que o produto **já tem** (`aula.servico.ts:339`),
e o desempate ⛔ não é zelo (duas aulas semeadas no mesmo milissegundo). Feito com **duas leituras
concatenadas**, ⛔ não com `orderBy` sobre coluna anulável: a posição dos NULOS é do motor do banco.
No ecrã ⛔ nenhum `sort` nasce: **filtrar ⛔ não é reordenar** (R1.3 do CS-160).

### O que o CS-166 obriga a emendar, e ⛔ não é surpresa
As e2e são **herméticas** (`page.route('**/api/v1/**')`). Trocar a rota do ecrã parte-as:
`aulas.spec.ts:476` e `permanente-secretaria.spec.ts:301` casam a lista por `endsWith('/aulas')`, e
o `/\/aulas\/[^/]+$/` de `:304` apanharia `/aulas/secretaria` como DETALHE; `alcance.spec.ts:1312`
só conhece `caminho === '/aulas'` e exige que `porSimular` acabe **vazio**. ⟹ Os três ficheiros
estão na cerca do card.

## OBSERVAÇÃO (⛔ não achado — ⛔ não me impediu de continuar)
🩸 **O rastreador deste produto ⛔ não esteve alcançável nesta sessão.** O rastreador do Capacita é
o **Jira, sigla CS** (decisão do dono registada em `PLANO.md:12088`: «a sigla do Jira é CS, e a
fábrica ⛔ não cria o projecto: é acto no espaço dele»). Medido agora: ⛔ não há ferramenta MCP do
Atlassian exposta a este papel (`papeis/enquadrador.md` dá `Skill, Read, Grep, Glob, Bash, Write,
Edit`), e `curl https://mais-saude-salvador.atlassian.net/rest/api/3/myself` dá **401** — ⛔ não há
credencial na caixa (`_produto/teste.env` tem só `FAL_KEY` e `RECRAFT_API_TOKEN`).
⟹ **As chaves ⛔ NÃO foram improvisadas**: saíram do registo local, que é de facto a fonte das 16
chaves anteriores deste produto (CS-148…CS-163, demanda 30). Máximo em uso, medido em
`estado.db` sobre `card` ∪ `demanda`: **CS-163** ⟹ epic **CS-164**, cards **CS-165** e **CS-166**.
⚠️ Quem criar as issues no Jira tem de usar exactamente estas três — ⛔ não outras.
