# Mensageria — Especificação (v1.15)

**Documentos desta funcionalidade:** [01 - Definição](./01%20-%20Defini%C3%A7%C3%A3o%20v1.15.md) (v1.15) · 02 - Especificação (v1.15) · [03 - Protótipo](./03%20-%20Prot%C3%B3tipo%20v1.15.md) (v1.15, código em `03 - Protótipo v1.15.html`) · [04 - Mapeamento de Banco de Dados](./04%20-%20Mapeamento%20de%20Banco%20de%20Dados%20v1.15.md) (v1.15) · [Cenários de Teste](./Cen%C3%A1rios%20de%20Teste%20v1.15.md) (v1.15) · [05 - Registro de Decisões](./05%20-%20Registro%20de%20Decis%C3%B5es%20v1.15.md) (v1.15)

Regras de negócio: **RN-MSG-001 a RN-MSG-036**, definidas no documento 01 e referenciadas aqui por ID. Regras de outras funcionalidades: RN-CM-015 e RN-CM-022 (Central do Médico), RN-AGM-018 (Agenda do Médico). Decisões transversais: DT-001 (data e fuso da clínica), DT-005, DT-006 (resolver vale para todos), DT-008 (ícones só Lucide ou react-icons), DT-011 (tradução de termos), DT-012 (idioma da clínica).

Marcação: `[PROPOSTA]` é sugestão do Designer que aguarda decisão do solicitante (ver 05 - Registro de Decisões).

---

## 2.1 Premissa de design

Cada decisão de interface vem de um momento do workflow descrito no documento 01 (item 1.5):

- **Ler rápido entre atendimentos** (médico): cartões iguais no painel e na lista, uma linha por informação, sem rolagem horizontal.
- **Saber se o recado foi visto** (recepção): última mensagem e seu autor sempre no cartão; estado e quem finalizou na conversa.
- **Distinguir pessoa de sistema na hora**: ícone de pessoa ou de sino no cartão, antes de ler o texto.
- **Aviso de não lida que não compete com o resto**: borda lateral discreta mais texto da mensagem em peso médio (a cor sozinha não basta; D-MSG-053).
- **Encerrar só depois de abrir**: resolver e descartar ficam dentro da conversa, com confirmação, porque a ação vale para todos e não tem "desfazer" (RN-MSG-008). O cartão só abre a conversa (D-MSG-047).

Mobile first: a largura mínima de referência é 360 px; alvos de toque de pelo menos 44 px; o painel e a lista usam coluna única.

## 2.2 Histórias de usuário

| ID | História |
| --- | --- |
| US-MSG-01 | Como recepcionista, quero enviar um recado ao médico com paciente, processo e prazo, para que ele reconheça o assunto sem me ligar. |
| US-MSG-02 | Como profissional, quero ver minhas conversas abertas, das não lidas para as lidas, para tratar primeiro o que acabou de chegar ou vence. |
| US-MSG-03 | Como profissional, quero responder na própria conversa, para manter tudo em ordem cronológica. |
| US-MSG-04 | Como profissional, quero resolver ou descartar uma conversa, para tirá-la da minha lista e das dos demais participantes. |
| US-MSG-05 | Como remetente, quero ver o estado da conversa e quem a finalizou, para não precisar perguntar. |
| US-MSG-06 | Como membro de equipe, quero receber as mensagens enviadas à equipe e ver o que os colegas fizeram, para não duplicar o trabalho. |
| US-MSG-07 | Como profissional, quero enviar uma mensagem a mim mesmo, para registrar um lembrete. |
| US-MSG-08 | Como médico, quero abrir o prontuário, a prescrição ou a consulta a partir da conversa, para chegar ao contexto com um clique. |
| US-MSG-09 | Como profissional, quero distinguir alertas do sistema de recados de colegas, e resolvê-los ou descartá-los sem responder. |
| US-MSG-10 | Como gestor, quero que as ações de mensageria fiquem registradas na trilha de auditoria, para atender ao SBIS. |

## 2.3 Descrição funcional por tela

### 2.3.1 Cartão de conversa (componente compartilhado)

Usado no painel da Central, na aba "Abertas" e na aba "Finalizadas". Estrutura, de cima para baixo:

1. **Ícone à esquerda** (círculo de 36 px, como o avatar da Central): pessoa (Lucide `user`) quando a última mensagem é de um usuário; sino (Lucide `bell`) quando é do sistema. Sem foto e sem iniciais (decisão do solicitante, 05/11/2026).
2. **Linha 1, a última mensagem (maior destaque, D-MSG-053):** "autor: texto da última mensagem" em até 2 linhas (corpo, 14 px, `--color-neutral-darker`; o autor em `--color-neutral-dark`), truncada com reticências. Autor = "Você" (MSG-TMSG-15), nome do usuário ou "Sistema" (MSG-TMSG-29); em conversa de equipe, o autor que respondeu em nome da equipe aparece como "Sandra (Farmácia)" (RN-MSG-030). À direita, o horário da última mensagem, relativo ao momento atual (RN-MSG-035, D-MSG-032): no mesmo dia e há menos de 1 hora, "Há x min" (MSG-TMSG-39); no mesmo dia, "Há x h" (MSG-TMSG-40); em dia anterior, data e hora. No fuso da clínica (RN-MSG-005), com "dia" de calendário. Quando a última mensagem é do próprio usuário, vem antes da data e hora o ícone Lucide `check` (enviada; `--color-neutral-pure`) ou `check-check` (lida por pelo menos um dos outros participantes; `--color-secondary-dark` **[PROPOSTA]**), de 16 px, com o rótulo MSG-TMSG-31 "Enviada" ou MSG-TMSG-32 "Lida" para leitor de tela e dica.
3. **Linha 2, o título da conversa (segundo destaque):** o assunto, em uma linha, 12 px, `--color-neutral-dark`, truncado com reticências.
4. **Linha 3, contexto (menor destaque):** primeiro o **chip do grau de urgência**, só quando informado (RN-MSG-034, 2.3.8), pequeno, o único elemento com cor cheia; depois, em **texto de 12 px sem chip**, `--color-neutral-pure`, com ícone Lucide de 14 px: paciente (`user`); prazo "Responder até {dt}" (`clock`) ou, vencido, "Vencida desde {dt}" (`triangle-alert`, `--color-error-dark`, peso médio; é o único texto de contexto colorido); "Resolvida" ou "Descartada" na aba "Finalizadas". Ordem do conteúdo: mensagem, título, urgência, outras informações (D-MSG-053). O cartão **não** tem chip de estado de envio (Enviada, Lida, Respondida): a última mensagem e o seu autor já mostram se houve resposta, e o ícone do horário mostra se a mensagem do usuário foi lida (D-MSG-023).
5. **Sem botão de ação** (D-MSG-047): o cartão inteiro é uma só área de toque; abre o modal (no painel) ou a página da conversa (na lista). "Resolvido" e "Descartado" existem só dentro da conversa (2.3.5), para que a leitura venha antes de encerrar, em especial nos alertas do sistema.
6. **Não lida** (RN-MSG-017): borda esquerda de 3 px em `--color-secondary-dark` (6,1:1 no tema claro e 11,1:1 no escuro) e texto da última mensagem em peso médio, como no painel da Central (D-CM-045, D-MSG-021); o ícone de carta (`mail`) deixou de existir (D-MSG-053) e o leitor de tela recebe o texto MSG-TMSG-10. Cartão lido: borda esquerda transparente e texto em peso normal.
7. **Clínica** (RN-MSG-025): quando o usuário atende em mais de uma clínica, o nome curto da clínica de origem, com o ícone Lucide `building-2` de 14 px e texto de 12 px em `--color-neutral-pure`, sem chip (Central, D-CM-064, D-CM-066). Com uma só clínica, não aparece.
8. **Aparência do cartão** (D-MSG-045, D-MSG-053): cartões separados entre si, cada um com cantos arredondados (`--radius-m`, 8 px), borda de 1 px em `--color-base-dark` e espaço vertical entre eles (`--sp-2`), fundo `--color-base-dark` ao passar o mouse, como os cartões do painel da Central (D-CM-045). O estado "não lida" muda só a borda esquerda (item 6). O painel tem cabeçalho com fundo `--color-base-dark`, altura mínima de 52 px e a contagem em pílula neutra clara, como os painéis da Central. Vale para o painel e para a lista (abas Abertas e Finalizadas).

Estados do cartão (cartão separado, com cantos arredondados, item 8): padrão, não lida, vencida, finalizada (sem botão), foco (anel de foco do Design System), pressionado. Em modo escuro, usar os tokens do Design System; nenhuma cor fixa no código.

### 2.3.2 Painel de Mensagens (Central do Médico)

- Título "Mensagens" (link para a lista) com a contagem de conversas abertas.
- Todas as conversas abertas, sem limite de cartões (RN-MSG-001, RN-MSG-002), na ordem de RN-MSG-002. O painel tem rolagem própria, como os demais painéis da Central (Especificação da Central, 2.5), e o título é o link para a lista (D-MSG-049). Não há link "Ver todas as mensagens".
- Estado vazio: "Nenhuma conversa em aberto." (MSG-TMSG-02).
- Estado de carregamento: esqueleto de cartões. Falha de atualização: faixa de sem conexão do Design System (reuso do texto da Central).
- Atualização automática a cada 1 minuto (como o painel atual da Central, RN-CM-017).

### 2.3.3 Tela de Mensagens (lista)

- Acesso: item de menu "Mensagens" e link do painel.
- Linha de fuso da clínica no topo (MSG-TAGM-09; destacada com MSG-TAGM-10 quando o aparelho está em outro fuso), como na Agenda (RN-MSG-005).
- Botão "Nova mensagem" (primário: `--color-primary-strong` com texto `--color-on-primary-strong`, Lucide `plus`); aparece só para quem tem o direito Enviar (RN-MSG-024).
- Duas abas com contagem: "Abertas" e "Finalizadas" (RN-MSG-011).
- **Ordem em "Abertas"** (RN-MSG-002): primeiro as não lidas, depois as lidas pendentes; em cada grupo, a mais nova primeiro, usando a chave "maior entre a última mensagem e o prazo".
- **Ordem em "Finalizadas"** [PROPOSTA]: pela data e hora da finalização, da mais nova para a mais antiga (P-MSG-11).
- Paginação por rolagem, 20 por página [PROPOSTA]. Estado vazio por aba (MSG-TMSG-02 e MSG-TMSG-03).

### 2.3.4 Nova mensagem


Campos, nesta ordem, com rótulo fixo acima (sem rótulo flutuante). Os campos de busca (destinatário, paciente e item do processo) seguem o comportamento de 2.3.9:


| Campo | Obrigatório | Regra |
| --- | --- | --- |
| Destinatário | sim | **Busca com autocomplete** (RN-MSG-036; D-MSG-038): o usuário digita o nome e escolhe um resultado; seleção única. Os resultados vêm em dois grupos, **"Equipes" primeiro** (com o número de membros) **e "Pessoas" depois** (inclui o usuário, marcado "(você)"). RN-MSG-007, RN-MSG-015 |
| Assunto | sim | Até 200 caracteres, com contador |
| Mensagem | sim | Texto livre, até 2000 caracteres, com contador "n/2000" no componente de texto (D-MSG-030); o mesmo limite e contador no campo de resposta |
| *Opcionais* | — | Subtítulo "Opcionais" (MSG-LMSG-20) antes dos quatro campos seguintes, nesta ordem (D-MSG-040) |
| Grau de urgência | não | Quatro botões de rádio lado a lado ("Rotina", "Urgente", "Quanto antes", "Imediato"), nenhum marcado por padrão; tocar na opção marcada a desmarca (volta a "Não informado"). Texto de ajuda: o grau não pode ser alterado depois do envio (MSG-TMSG-37 e 38). Formato do controle: **[PROPOSTA, E-MSG-016]**. RN-MSG-034 |
| Prazo para resposta | não | Um único campo de data e hora, com máscara do idioma da clínica, 24 h (RN-MSG-012), que aceita só datas existentes (31/02 é recusado com MSG-EMSG-05). Não pode ser anterior ao envio (RN-MSG-004) |
| Paciente | não | **Busca com autocomplete pelo nome** (a mesma da Central, 2.8.8); uma seleção. RN-MSG-020, RN-MSG-036 |
| Processo relacionado | não | Atalho rápido para o objeto a que se quer direcionar quem lê. **Um só tipo por conversa:** Paciente (prontuário), Prescrição, Documento ou Registro clínico (D-MSG-035, 037). **Escolha em três etapas (D-MSG-036):** (1) o paciente, que é o campo "Paciente" do formulário; (2) o tipo de objeto (lista de quatro opções), que só habilita depois do paciente; (3) o **item, por busca com autocomplete** entre os do paciente escolhido (RN-MSG-036): Prescrição, pela identificação da prescrição (qualquer parte do texto); Documento, pelo nome, exibido com a data; Registro clínico, pela data do evento, exibido com a data, o modelo e o profissional, com tratamento e apelido (D-MSG-050, 051; origem dos dados em 04, 4.4.1). O tipo Paciente não tem etapa 3. Trocar o paciente zera o tipo e o item **[PROPOSTA, E-MSG-020]**. RN-MSG-021 |

Botões: "Enviar" (primário) e "Cancelar". "Enviar" fica desabilitado enquanto a requisição está em curso. Sucesso: volta à lista, **não** à conversa, e mostra "Mensagem enviada." (MSG-TMSG-26). O padrão de botões é o do Design System, seção 12 (D-MSG-022): um só preenchido por região, em verde escuro; "Cancelar" com contorno.

### 2.3.5 Conversa (página e modal)

Mesmo conteúdo na página (a partir da lista) e no modal (a partir do painel). No celular o modal é uma folha inferior; em telas largas, caixa centralizada.

- **Estado:** chip "Resolvida" ou "Descartada" só quando a conversa está finalizada (MSG-TMSG-08 e 09). Nas conversas abertas, cada mensagem do usuário mostra o ícone `check` ou `check-check` ao lado da data e hora, com a mesma regra do cartão **[PROPOSTA]**.
- **Cabeçalho:** botão Voltar (Lucide `arrow-left`) sempre à esquerda; assunto; linhas "De" e "Para" (RN-MSG-006; MSG-TMSG-12, 13, 14); chips (paciente, grau de urgência quando informado, prazo e, se finalizada, Resolvida ou Descartada); atalho de processo, quando houver (RN-MSG-021): "Abrir prontuário", "Abrir prescrição" ou "Abrir consulta".
- **Conversa finalizada:** linha "Resolvida por {name} em {dt}" ou "Descartada por {name} em {dt}" (MSG-TMSG-16/17), sem campo de resposta e sem botões, com o aviso MSG-TMSG-19 (RN-MSG-009).
- **Mensagens:** em ordem cronológica; as do usuário logado alinhadas à direita; cada uma com autor, data e hora. Mensagens do sistema com o sino e "Sistema". Mensagem do sistema acrescentada a um alerta aberto (autor nulo, sequência maior que 1) rotulada "Atualização do sistema" [PROPOSTA, MSG-TMSG-30]; o tipo gravado é sempre `Response` (04, 4.1).
- **Campo de resposta** (RN-MSG-019): placeholder "Escreva uma resposta..." (MSG-LMSG-14) e botão "Responder" (Lucide `send`). Ausente em conversa finalizada e em alerta do sistema (aviso MSG-TMSG-20, RN-MSG-010).
- **Ações:** "Resolvido" e "Descartado", cada uma com confirmação (2.3.6).
- Ao abrir, a conversa é marcada como lida para o usuário (RN-MSG-017).

### 2.3.6 Confirmação de resolver e descartar

Caixa de diálogo com os textos já existentes da Central (reuso): título, corpo e botão de confirmação de `MSG_resolveConfirm*` e `MSG_discardConfirm*`. Foco inicial em "Cancelar"; Esc cancela. Depois de confirmar: toast "Conversa resolvida." (MSG-TMSG-24) ou "Conversa descartada." (MSG-TMSG-25); a conversa sai da aba "Abertas" e do painel (RN-MSG-001).

### 2.3.7 Regras de apresentação da ordem e do estado

- **Ordem:** dentro de cada camada (não lidas, lidas pendentes), primeiro o grau de urgência (Imediato, Quanto antes, Urgente, Rotina e, por último, sem grau, que conta como 0) e, dentro do mesmo grau, a **chave de data** `max(dataHoraUltimaMensagem, prazo)` quando há prazo; senão, `dataHoraUltimaMensagem`. Empate: a mais recente criada primeiro (RN-MSG-002, D-MSG-026).
- **Horário relativo do cartão** (RN-MSG-035): `agora` e a data da mensagem são convertidos para o fuso da clínica (`serverNow`, nunca o relógio do aparelho). Mesmo dia de calendário: `x = minutos decorridos` se menor que 60 ("Há x min"), senão `x = horas decorridas` ("Há x h"). Outro dia: data e hora no formato do idioma. **[PROPOSTA, E-MSG-019]:** x é o inteiro por truncamento, com mínimo de 1 min; dentro da conversa, o horário de cada mensagem continua em data e hora; o texto relativo é recalculado a cada atualização automática de 1 minuto.
- **Vencida:** `prazo < agora` em conversa aberta, incluindo alertas do sistema. Calculado na API com a hora do servidor (`serverNow`), nunca com o relógio do aparelho.
- **Não lida** para o usuário: existe mensagem de sequência maior que a última lida por ele. Quem acabou de enviar ou responder tem a conversa como lida.
- **Participante:** quem enviou, ou quem está entre os destinatários copiados no envio. Só participantes veem a conversa (RN-MSG-031); a clínica da conversa é a do remetente (RN-MSG-025).

### 2.3.8 Grau de urgência (RN-MSG-034)

Chip de urgência, família nova do Design System para alertas que pedem ação (seção 13; D-MSG-027). Aparece só quando a conversa tem grau, no cartão (painel, Abertas e Finalizadas), como primeiro item da linha de contexto, antes do paciente e do prazo, e no cabeçalho da conversa, depois do chip do paciente e antes do de prazo **[PROPOSTA, E-MSG-017]**. O texto visível é **só o nome do grau** ("Rotina", "Urgente", "Quanto antes", "Imediato"; MSG-IND-1 a 4), porque "Urgência Urgente" seria repetido; o título e o nome acessível são "Grau de urgência: {nome}" (MSG-TMSG-36) **[PROPOSTA, E-MSG-022]**. Ícone Lucide `flag` de 14 px, peso `font-weight-medium`, altura mínima de 24 px, raio de pílula. No cartão, o chip é o único elemento de contexto com fundo colorido (paciente e prazo viram texto; D-MSG-053).

| Valor | Nome | Preenchimento | Texto e ícone | Contorno | Ícone |
| --- | --- | --- | --- | --- | --- |
| `stat` | Imediato | `--color-alert-fill` | `--color-base-pure` (5,0:1 no claro; 4,6:1 no escuro) | nenhum | `flag` preenchida |
| `asap` | Quanto antes | `--color-error-light` | `--color-error-dark` (5,5:1 no claro; 6,3:1 no escuro) | 1 px `--color-error-dark` | `flag` só contorno |
| `urgent` | Urgente | `--color-neutral-lighter` | `--color-neutral-dark` (12,1:1 no claro; 8,8:1 no escuro) | nenhum | `flag` só contorno |
| `routine` | Rotina | transparente | `--color-neutral-dark` | 1 px `--color-neutral-light` | `flag` só contorno |

A correspondência dos quatro valores com os quatro estilos do Design System (seção 13), do mais forte ao mais discreto, é **[PROPOSTA, E-MSG-022]**; as cores e contrastes são os já aprovados (D-MSG-027).

O grau Rotina também aparece como chip (D-MSG-043). Sem amarelo: o amarelo é do prazo (`highlight`), e no tema escuro um chip amarelo para o penúltimo nível chamava mais atenção do que o último (D-MSG-027). O contorno é decorativo; a informação está no texto e no ícone. Cada tema usa os tokens do próprio tema; nenhuma cor fixa no código.

### 2.3.9 Campos de busca com autocomplete (RN-MSG-036)

Decisão do solicitante (D-MSG-038): destinatário, paciente e item do processo são campos de busca com autocomplete. Os detalhes abaixo são **[PROPOSTA, E-MSG-021]**:

- **Busca:** a cada digitação, com atraso de 300 ms; sem texto, mostra as primeiras 8 opções (no destinatário, equipes primeiro). Ignora maiúsculas e acentos; vários termos separados por espaço, todos devem aparecer ("20/10 ana").
- **Resultados:** até 8, em lista abaixo do campo; no destinatário, os grupos "Equipes" (MSG-LMSG-03) e "Pessoas" (MSG-LMSG-02) com cabeçalho; havendo mais, o aviso MSG-TMSG-42; sem resultado, MSG-TMSG-41.
- **Chaves de busca e exibição do item (D-MSG-050):** Prescrição: busca em `Prescricao.Identificacao`, por qualquer parte do texto; mostra a identificação e, como apoio, a data da prescrição. Documento: busca pelo nome; mostra o nome e a data. Registro clínico: busca pela data do evento, em "dd/mm" ou "dd/mm/aaaa" (por exemplo "21/10" ou "21/10/2026"); mostra data do evento, modelo e profissional (tratamento e apelido, por exemplo "Dr. Carlos"; ordem confirmada, D-MSG-052). Paciente: busca pelo nome. Cada tipo busca só no campo indicado (não busca nos outros campos mostrados). A busca ignora maiúsculas e acentos e combina vários termos (RN-MSG-036). Colunas e tabelas em 04, 4.4.1.
- **Escolha:** clicar ou tocar no resultado, ou Enter no resultado destacado; o campo passa a mostrar o rótulo escolhido. Digitar de novo limpa a escolha.
- **Teclado e leitor de tela:** padrão de caixa de combinação (campo com papel `combobox`, lista com papel `listbox`, `aria-expanded`, `aria-activedescendant`); setas movem o destaque, Enter escolhe, Esc fecha; alvo de toque dos resultados de pelo menos 44 px.
- **Ordem dos itens do processo:** pela data do evento, do mais recente ao mais antigo (Documento, pela data exibida; Registro clínico, pela data do registro; Prescrição, pela data da prescrição). A direção é **[PROPOSTA]**; a regra de ordem pode mudar quando esses módulos forem detalhados (D-MSG-044; P-MSG-34).
- **API:** as buscas são feitas no servidor (2.8.7 a 2.8.9), com `q` e `limit`.

## 2.4 Critérios de aceitação

| ID | Critério | História | RN |
| --- | --- | --- | --- |
| CA-MSG-001.1 | **Dado** que tenho conversas abertas lidas e não lidas, **quando** abro o painel, **então** vejo todas elas como cartões, os não lidos primeiro, e cada grupo da mais nova para a mais antiga | US-MSG-02 | RN-MSG-001, 002 |
| CA-MSG-001.2 | **Dado** duas conversas lidas, uma com prazo mais recente do que a última mensagem da outra, que não tem prazo, **então** a de prazo vem primeiro | US-MSG-02 | RN-MSG-002 |
| CA-MSG-001.3 | **Dado** que as conversas abertas não cabem na altura do painel, **então** o painel rola dentro do próprio quadro, sem limite de cartões e sem link "Ver todas as mensagens" | US-MSG-02 | RN-MSG-001; D-MSG-049 |
| CA-MSG-001.4 | **Dado** que não há conversa aberta, **então** o painel mostra "Nenhuma conversa em aberto." | US-MSG-02 | RN-MSG-001 |
| CA-MSG-001.5 | **Dado** uma conversa resolvida ou descartada, **então** ela não aparece no painel e aparece na aba "Finalizadas" | US-MSG-04 | RN-MSG-001, 011 |
| CA-MSG-002.1 | **Dado** uma conversa cujo prazo passou, **então** o cartão mostra o chip "Vencida desde {dt}"; ao resolvê-la ou descartá-la o chip some | US-MSG-02 | RN-MSG-003 |
| CA-MSG-002.2 | **Dado** um alerta do sistema com prazo vencido, **então** ele também mostra "Vencida" | US-MSG-09 | RN-MSG-003 |
| CA-MSG-002.3 | **Dado** que informo um prazo anterior ao momento do envio, **então** o formulário mostra MSG-EMSG-04 e a API recusa com 400, mesmo se a validação do formulário for contornada | US-MSG-01 | RN-MSG-004 |
| CA-MSG-002.4 | **Dado** que o aparelho está em fuso diferente do da clínica, **então** os horários são os da clínica e a linha de fuso aparece destacada | US-MSG-02 | RN-MSG-005 |
| CA-MSG-003.1 | **Dado** uma conversa não lida, **então** o cartão mostra a borda lateral e a última mensagem em peso médio; depois de aberta, ambos somem | US-MSG-02 | RN-MSG-017 |
| CA-MSG-003.2 | **Dado** que outro participante leu a conversa, **então** ela continua não lida para mim | US-MSG-06 | RN-MSG-017 |
| CA-MSG-003.3 | **Dado** que acabei de enviar uma mensagem, **então** a conversa não aparece como não lida para mim | US-MSG-01 | RN-MSG-017 |
| CA-MSG-004.1 | **Dado** a última mensagem de um usuário, **então** o cartão mostra o ícone de pessoa; se do sistema, o sino e "Sistema:" | US-MSG-09 | RN-MSG-014, 028 |
| CA-MSG-004.2 | **Dado** a primeira linha do cartão, **então** ela mostra "autor: texto" da última mensagem, em até 2 linhas, com "Você", o nome ou "Sistema"; o assunto vem logo abaixo, em texto menor | US-MSG-05 | RN-MSG-018; D-MSG-053 |
| CA-MSG-005.1 | **Dado** que abro a conversa e escolho "Resolvido", **então** aparece a confirmação com foco em "Cancelar"; ao confirmar, a conversa é resolvida para todos os participantes | US-MSG-04 | RN-MSG-008 |
| CA-MSG-005.2 | **Dado** que sou o remetente, **então** também posso resolver ou descartar | US-MSG-04 | RN-MSG-008 |
| CA-MSG-005.3 | **Dado** uma conversa de equipe finalizada por um membro, **então** todos os membros a veem finalizada, com o nome de quem finalizou | US-MSG-06 | RN-MSG-018 |
| CA-MSG-005.4 | **Dado** uma conversa finalizada, **então** a tela não mostra campo de resposta nem botões de ação, e a API recusa resposta e nova finalização com 409 | US-MSG-04 | RN-MSG-009 |
| CA-MSG-005.5 | **Dado** que finalizo uma conversa sem que ninguém tenha respondido, **então** nenhuma mensagem é criada e o cabeçalho mostra "Resolvida por {name} em {dt}" | US-MSG-04 | RN-MSG-009 |
| CA-MSG-006.1 | **Dado** um alerta do sistema, **então** não há campo de resposta, aparece MSG-TMSG-20, e a API recusa resposta com 409 | US-MSG-09 | RN-MSG-010 |
| CA-MSG-007.1 | **Dado** que abro "Nova mensagem", **então** vejo meu nome na lista de pessoas como "(você)" e posso enviar a mim mesmo | US-MSG-07 | RN-MSG-007 |
| CA-MSG-007.2 | **Dado** uma mensagem a uma equipe da qual faço parte, **então** eu a recebo como os demais membros | US-MSG-06 | RN-MSG-015 |
| CA-MSG-007.3 | **Dado** que um usuário entrou na equipe depois do envio, **então** ele não vê a conversa | US-MSG-06 | RN-MSG-015 |
| CA-MSG-008.1 | **Dado** o formulário com destinatário, assunto ou mensagem vazios, **então** aparecem MSG-EMSG-01, 02 e 03 e nada é enviado | US-MSG-01 | RN-MSG-015, 027 |
| CA-MSG-008.2 | **Dado** que informo a data do prazo sem a hora, **então** aparece MSG-EMSG-05 com o formato esperado | US-MSG-01 | RN-MSG-012 |
| CA-MSG-008.3 | **Dado** que escolho um processo, **então** só um tipo pode ser escolhido por conversa (Paciente, Prescrição, Documento ou Registro clínico) | US-MSG-08 | RN-MSG-020, 021 |
| CA-MSG-009.1 | **Dado** uma conversa com processo, **então** o atalho correspondente aparece e leva ao módulo; se o usuário não tiver acesso, o módulo de destino mostra a recusa | US-MSG-08 | RN-MSG-021 |
| CA-MSG-010.1 | **Dado** um usuário sem o direito Visualizar (mesmo que tenha Enviar), **então** o item de menu e o painel não aparecem e todas as chamadas da API retornam 403 | US-MSG-10 | RN-MSG-024 |
| CA-MSG-010.2 | **Dado** um usuário com Visualizar e sem Enviar, **então** o botão "Nova mensagem" e o campo de resposta não aparecem e a API recusa o envio com 403; ele ainda pode resolver e descartar [PROPOSTA, P-MSG-12] | US-MSG-10 | RN-MSG-024 |
| CA-MSG-010.3 | **Dado** qualquer ação (enviar, ler, responder, resolver, descartar), **então** um registro de auditoria é gravado sem o conteúdo da mensagem e sem identificação do paciente | US-MSG-10 | RN-MSG-023 |
| CA-MSG-011.1 | **Dado** o idioma da clínica, **então** todos os textos aparecem nesse idioma (pt-BR, en-US ou es-419) | todas | RN-MSG-013 |
| CA-MSG-012.1 | **Dado** uma mensagem enviada, **então** não existe ação de editar ou excluir o texto | US-MSG-03 | RN-MSG-022 |
| CA-MSG-012.2 | **Dado** que o módulo de origem repete o pedido do mesmo alerta, **então** nenhuma conversa duplicada é criada | US-MSG-09 | RN-MSG-029 |
| CA-MSG-013.1 | **Dado** uma anomalia que persiste depois de o alerta anterior ser resolvido, **então** o módulo pode abrir nova conversa ligada à anterior; a anterior continua finalizada | US-MSG-09 | RN-MSG-016 |
| CA-MSG-014.1 | **Dado** que respondo em conversa endereçada à minha equipe, **então** minhas mensagens mostram "Nome (Equipe)"; se não sou da equipe, mostram só o nome | US-MSG-03 | RN-MSG-030 |
| CA-MSG-016.1 | **Dado** que a última mensagem da conversa é do usuário e não é de alerta do sistema, **então** o cartão mostra `check` quando nenhum outro participante leu até ela e `check-check` quando pelo menos um leu; num autoenvio, `check-check` desde o envio | US-MSG-05 | RN-MSG-016, 018 |
| CA-MSG-016.2 | **Dado** que outro participante respondeu, **então** o cartão passa a mostrar a resposta como última mensagem, com o autor e a data e hora, e o sinal de não lida; o cartão não tem chip "Respondida" nem ícone de lida | US-MSG-05 | RN-MSG-016, 017 |
| CA-MSG-017.1 | **Dado** que abro "Nova mensagem", **então** o grau de urgência é opcional, vem sem seleção e oferece "Rotina", "Urgente", "Quanto antes" e "Imediato"; tocar na opção marcada a desmarca | US-MSG-01 | RN-MSG-034 |
| CA-MSG-017.2 | **Dado** uma conversa enviada sem grau, **então** nenhum chip de urgência aparece em nenhuma tela | US-MSG-01 | RN-MSG-034 |
| CA-MSG-017.3 | **Dado** uma conversa com grau, **então** o chip com o nome do grau (por exemplo, "Imediato") aparece no cartão (painel, Abertas e Finalizadas) e no cabeçalho da conversa, para quem enviou e para os destinatários | US-MSG-02 | RN-MSG-034 |
| CA-MSG-017.4 | **Dado** uma conversa já enviada, **então** nenhuma tela nem endpoint altera o grau, e uma resposta ou uma atualização do sistema não o muda | US-MSG-03 | RN-MSG-034 |
| CA-MSG-017.5 | **Dado** conversas da mesma camada com graus diferentes e sem grau, **então** a ordem é Imediato, Quanto antes, Urgente, Rotina e sem grau, e dentro do mesmo grau a mais recente primeiro | US-MSG-02 | RN-MSG-002, 034 |
| CA-MSG-017.6 | **Dado** um alerta do sistema cujo módulo de origem informou o grau, **então** o chip é o mesmo das conversas de pessoas; sem grau informado, não aparece chip | US-MSG-09 | RN-MSG-028, 034 |
| CA-MSG-017.7 | **Dado** um envio com `urgencyLevel` diferente de `routine`, `urgent`, `asap` e `stat`, **então** a API recusa com 400 e a mensagem MSG-EMSG-13; `urgencyLevel` ausente ou nulo é aceito | US-MSG-01 | RN-MSG-034 |
| CA-MSG-017.8 | **Dado** os temas claro e escuro, **então** cada nível tem texto com contraste mínimo de 4,5:1, o nível é identificável sem a cor (texto e ícone) e o leitor de tela anuncia "urgência {nome}" | todas | RN-MSG-034 |
| CA-MSG-018.1 | **Dado** uma conversa cuja última mensagem foi enviada hoje há menos de 1 hora, **então** o cartão mostra "Há x min" | US-MSG-02 | RN-MSG-035 |
| CA-MSG-018.2 | **Dado** uma última mensagem enviada hoje há 1 hora ou mais, **então** o cartão mostra "Há x h" | US-MSG-02 | RN-MSG-035 |
| CA-MSG-018.3 | **Dado** uma última mensagem de dia anterior (dia de calendário da clínica), **então** o cartão mostra data e hora, mesmo que tenha menos de 1 hora; dentro da conversa o horário é sempre data e hora | US-MSG-02 | RN-MSG-035 |
| CA-MSG-018.4 | **Dado** o campo de mensagem ou de resposta, **então** o contador mostra "n/2000", o campo não aceita o caractere 2001 e a API recusa texto maior com 400 | US-MSG-01 | RN-MSG-032; D-MSG-030 |
| CA-MSG-018.5 | **Dado** uma anomalia que se agrava, **quando** o módulo de origem publica um novo alerta com o novo grau, **então** o alerta anterior fica Descartado (ação sem usuário, autor exibido como "Sistema") e a nova conversa fica ligada a ele | US-MSG-09 | RN-MSG-016, 034 |
| CA-MSG-019.1 | **Dado** o formulário sem paciente, **então** o campo de tipo de processo fica desabilitado | US-MSG-08 | RN-MSG-021 |
| CA-MSG-019.2 | **Dado** um paciente escolhido e o tipo Prescrição, Documento ou Registro clínico, **então** aparece o campo do item, só com os itens desse paciente; enviar sem item mostra MSG-EMSG-14 | US-MSG-08 | RN-MSG-021 |
| CA-MSG-019.3 | **Dado** o tipo Paciente, **então** não há campo de item, e o atalho da conversa leva ao prontuário do paciente | US-MSG-08 | RN-MSG-021 |
| CA-MSG-019.4 | **Dado** processo já escolhido, **quando** troco o paciente, **então** o tipo e o item são limpos | US-MSG-08 | RN-MSG-021 (E-MSG-020) |
| CA-MSG-020.1 | **Dado** que abro "Nova mensagem", **então** os campos vêm nesta ordem: Destinatário, Assunto, Mensagem e, sob o subtítulo "Opcionais", Grau de urgência, Prazo para resposta, Paciente e Processo relacionado | US-MSG-01 | D-MSG-040 |
| CA-MSG-020.2 | **Dado** o campo Destinatário, **quando** digito parte do nome, **então** vejo os resultados que contêm o texto, com "Equipes" antes de "Pessoas", e escolho um | US-MSG-01 | RN-MSG-036, 007, 015 |
| CA-MSG-020.3 | **Dado** o campo Paciente, **quando** digito parte do nome, **então** vejo os pacientes que o contêm | US-MSG-08 | RN-MSG-036, 020 |
| CA-MSG-020.4 | **Dado** o item do processo, **então** a busca usa: `Prescricao.Identificacao`, por qualquer parte do texto (Prescrição); o nome (Documento, exibido com a data); a data (Registro clínico, exibido com data, modelo e profissional); vários termos são combinados | US-MSG-08 | RN-MSG-036, 021; D-MSG-050 |
| CA-MSG-020.5 | **Dado** uma busca sem resultado, **então** aparece MSG-TMSG-41; **dado** mais resultados que o limite, **então** aparece MSG-TMSG-42 | US-MSG-01 | RN-MSG-036 |
| CA-MSG-020.6 | **Dado** o teclado, **então** as setas movem o destaque, Enter escolhe e Esc fecha a lista, e o leitor de tela anuncia o campo como caixa de combinação com o número de resultados | US-MSG-01 | RN-MSG-036; 2.10 |
| CA-MSG-021.1 | **Dado** uma conversa com grau `routine`, **então** o chip "Rotina" aparece como os demais graus | US-MSG-02 | RN-MSG-034 |
| CA-MSG-021.2 | **Dado** o painel ou a lista, **então** os cartões são separados entre si, com cantos arredondados e borda de 1 px, e não linhas coladas com divisória | US-MSG-02 | 2.3.1, item 8 |
| CA-MSG-021.3 | **Dado** a lista de itens do processo, **então** vem do mais recente ao mais antigo pela data do evento | US-MSG-08 | RN-MSG-036 |
| CA-MSG-021.4 | **Dado** o cartão no painel ou na lista, **então** não há botão de ação nele; só a conversa aberta oferece "Resolvido" e "Descartado" | US-MSG-04 | D-MSG-047 |
| CA-MSG-031.1 | **Dado** um usuário que não é participante, **então** a API responde 404 e a conversa não aparece em nenhuma lista | US-MSG-10 | RN-MSG-031 |
| CA-MSG-015.1 | **Dado** o tema escuro, **então** todos os componentes usam os tokens do Design System e atendem ao contraste mínimo | todas | RN-MSG-027 |

## 2.5 Fluxos de exceção

| ID | Gatilho | Comportamento | Recuperação |
| --- | --- | --- | --- |
| EX-MSG-01 | Falha ao carregar o painel ou a lista (erro de servidor) | Estado de erro no lugar da lista com MSG-EMSG-07 e botão "Tentar novamente" | O botão repete a consulta |
| EX-MSG-02 | Falha de conexão na atualização automática | Os dados anteriores permanecem; aparece a faixa de sem conexão (reuso da Central) | A faixa some na próxima atualização bem-sucedida |
| EX-MSG-03 | Falha ao enviar (rede ou servidor) | O formulário permanece preenchido; aparece MSG-EMSG-08. Falha ao responder, resolver ou descartar: MSG-EMSG-12 | O usuário repete "Enviar"; a API usa uma chave de requisição para não duplicar |
| EX-MSG-04 | Conversa finalizada por outro participante enquanto o usuário escreve ou age | A API responde 409; a tela recarrega a conversa e mostra o estado final com MSG-TMSG-19 | Nenhuma; a resposta digitada permanece visível para copiar |
| EX-MSG-05 | Conversa inexistente ou de outro usuário | 404 (sem revelar se existe); a tela mostra MSG-EMSG-09 e volta à lista | Voltar |
| EX-MSG-06 | Usuário sem permissão | 403; tela de acesso negado padrão do sistema | — |
| EX-MSG-07 | Destinatário inativo, equipe sem membros ativos ou equipe inativa no momento do envio | A API recusa com 422; o formulário mostra MSG-EMSG-10 | Escolher outro destinatário |
| EX-MSG-08 | Paciente ou processo informado não existe ou não pertence à clínica | A API recusa com 422; o formulário mostra MSG-EMSG-11 | Corrigir a seleção |
| EX-MSG-09 | Tentativa de editar o remetente, o conteúdo, o paciente ou o processo depois do envio | Não há endpoint; qualquer tentativa direta retorna 405 | — |

## 2.6 Validações de campos

| Campo | Tipo | Formato e limites | Obrigatório | Mensagem |
| --- | --- | --- | --- | --- |
| Destinatário | pessoa ou equipe | id inteiro (pessoa) ou uuid (equipe); da mesma clínica; com direito Visualizar (pessoa) ou ativa (equipe) | sim | MSG-EMSG-01, 10 |
| Assunto | texto | 1 a 200 caracteres, sem só espaços | sim | MSG-EMSG-02 |
| Grau de urgência | texto | `routine`, `urgent`, `asap` ou `stat` (sempre minúsculas, como no HL7; outra grafia é recusada com 400); ausente ou nulo = Não informado | não | MSG-EMSG-13 |
| Mensagem | texto | 1 a 2000 caracteres (D-MSG-030), sem só espaços | sim | MSG-EMSG-03 |
| Paciente | inteiro | existente na clínica | não | MSG-EMSG-11 |
| Processo | tipo + chave | um só tipo; `Paciente` (prontuário), `Prescricao`, `Documento` ou `RegistroClinico`; exige paciente; o item é obrigatório, exceto no tipo `Paciente` (chave = paciente); novos tipos entram sem mudança de estrutura | não | MSG-EMSG-11, 14 |
| Prazo | data e hora | formato do idioma da clínica, 24 h; convertido para UTC pelo fuso da clínica; ≥ momento do envio | não | MSG-EMSG-04, 05 |
| Resposta | texto | 1 a 2000 caracteres (D-MSG-030) | sim, ao responder | MSG-EMSG-03 |

Toda validação é repetida no servidor (SBIS NGS1.05.02); a do formulário é só conveniência.

## 2.7 Mapeamento de componentes de interface

Variantes, estados e tokens do Design System. Cores só por token.

| Componente | Variante | Estados | Observações |
| --- | --- | --- | --- |
| Cartão de conversa | Lista (altura livre, até 5 linhas) | padrão, não lida, vencida, finalizada, foco, pressionado | 2.3.1 |
| Ícone de origem | Círculo 40 px, `user` ou `bell` | padrão | Sem foto |
| Chip de paciente | `secondary-light` / `secondary-dark` | padrão | Nome (social, se houver) |
| Chip de prazo | `highlight` (futuro) ou `error` (vencida) | padrão | Texto e ícone, nunca só cor |
| Chip de urgência | `alert-fill` (Imediato), `error-light` com contorno (Quanto antes), `neutral-lighter` (Urgente), contorno neutro (Rotina) | padrão | 2.3.8 e Design System, seção 13. Ícone `flag`, texto e cor, nunca só a cor |
| Seletor de grau de urgência | Quatro botões de rádio, com o nome | padrão, marcado, foco, desabilitado (enquanto o envio está em curso) | 2.3.4; alvo de toque de 44 px |
| Campo de busca (autocomplete) | Campo de texto com lista de resultados | padrão, com foco, buscando, com resultados, sem resultado, desabilitado (tipo de processo sem paciente) | 2.3.9; alvo de toque dos resultados de 44 px |
| Chip de estado | Resolvida (verde), Descartada (contorno) | padrão | Só em Finalizadas e na conversa |
| Botões "Resolvido"/"Descartado" na conversa | Resolvido: primário (verde escuro); Descartado: secundário (contorno); um só preenchido por região | idem | Confirmação: Cancelar com contorno e foco inicial; Resolver primário; Descartar com o estilo de ação destrutiva, ainda não definido no Design System (seção 12) |
| Abas Abertas/Finalizadas | Abas do Design System com contagem | ativa, inativa, foco | |
| Campo de data e hora | Campo único mascarado, altura 56 | vazio, preenchido, erro, desabilitado | 2.3.4; componente React a definir (P-MSG-04, em aberto) |
| Seleção de destinatário | Lista agrupada Pessoas/Equipes | aberta, fechada, erro | |
| Busca de paciente | A da Central | idem | |
| Modal de conversa | Folha inferior (celular) / caixa (largura) | aberto, fechando | |
| Diálogo de confirmação | Padrão do sistema | foco em Cancelar | |
| Faixa de sem conexão | Padrão do Design System | visível, oculta | |
| Esqueleto | Cartões | carregando | |

## 2.8 Integração com o backend

Todos os endpoints exigem usuário autenticado e clínica ativa; retornam 401 sem sessão e 403 sem o direito necessário. Datas em ISO 8601 UTC; a API também devolve `serverNow` e o fuso da clínica, e o front-end formata no fuso da clínica (DT-001). Ids de conversa e de mensagem são `uuid`; ids de usuário e de paciente são inteiros.

### 2.8.1 Listar conversas

- **Função:** conversas do usuário logado, por aba.
- **GET** `/api/v1/conversations?tab=open|closed&limit=20&cursor=`
- **Response 200:** `{ "serverNow": "...Z", "timeZone": "America/Sao_Paulo", "counts": { "open": 7, "closed": 31 }, "items": [ ConversationSummary ], "nextCursor": "…|null" }`
- **ConversationSummary:** `{ id, subject, sourceType: "user|system", clinic: { id, shortName }|null, lastAuthor: { id|null, name, onBehalfOfTeam|null }, lastMessage, lastMessageAt, deadline|null, overdue: boolean, urgencyLevel: { key: "routine|urgent|asap|stat", name }|null, unread: boolean, readByOthers: boolean|null, status, patient: { id, preferredName, legalName }|null, process: { type, key }|null, closedBy: { id, name }|null, closedAt|null }`
- **`readByOthers`:** só tem valor quando a última mensagem é do usuário (nulo em alerta do sistema e quando a última é de outra pessoa). É verdadeiro quando algum outro participante tem `UltimaSequenciaLida` maior ou igual à sequência dessa mensagem; num autoenvio, é verdadeiro. Calculado na consulta, sem coluna nova (04, 4.1).
- **Escopo de clínica (RN-MSG-025, DT-013):** para o médico, as conversas das clínicas do cliente em que ele atende; para os demais profissionais, só as da clínica do login. `clinic` vem preenchido quando o usuário atende em mais de uma clínica e é nulo caso contrário (D-CM-064).
- **`urgencyLevel`:** nulo quando "Não informado". `key` é o valor do domínio HL7 (`routine`, `urgent`, `asap` ou `stat`) e `name` já vem traduzido para o idioma da clínica, de `IpTerminologia.Indicadores` e `TermoTraducao` (DT-011, DT-012); o front-end não mantém a lista de nomes. A ordem do grau (do menos ao mais urgente: `routine`, `urgent`, `asap`, `stat`) é aplicada no servidor. **[PROPOSTA de contrato, E-MSG-018, revista por D-MSG-039]**
- **Ordem:** em `open`, a de 2.3.7 (grau de urgência e depois a chave de data; calculada no servidor); em `closed`, por `closedAt` decrescente. O painel usa `limit=4`.
- **BD:** `mensageria.Conversa`, `ConversaDestinatario`, `ConversaLeitura`, `Mensagem`, `ConversaAcao`; `Paciente`; IpSeguranca.Usuario (04, 4.1 e 4.2).
- **Códigos:** 200, 400 (aba ou cursor inválido), 401, 403.
- **Paginação [PROPOSTA]:** o cursor é a posição na ordem calculada (grupo, grau, chave, id). Como abrir uma conversa a muda de grupo, uma conversa pode aparecer em duas páginas seguidas ou ser pulada; o front remove duplicados por `id` e recarrega a primeira página ao voltar à lista.
- **Atualização automática:** o front consulta a cada 1 minuto (painel e aba aberta). O endpoint específico da Central (`GET /api/v1/cockpit/doctor/conversations`) permanece, e o contrato dele deve ser alinhado a este (P-MSG-09).

### 2.8.2 Detalhar conversa

- **GET** `/api/v1/conversations/{id}`
- **Response 200:** `{ id, subject, sourceType, moduleOrigin|null, sender: { id|null, name }, recipient: { type: "user|team", userId|null, teamId|null, name, memberCount|null, isSelf }, patient, process, deadline, overdue, urgencyLevel, status, closedBy, closedAt, canReply: boolean, canClose: boolean, messages: [ { id, sequence, author: { id|null, name, onBehalfOfTeam|null }, content, createdAt, readByOthers: boolean|null } ] }`
- O tipo gravado da mensagem é sempre `Response` (Log de Mudanças, 26/10/2026); a mensagem inicial é a de `sequence` 1 e a mensagem do sistema tem `author.id` nulo.
- `canReply` é falso em conversa finalizada, em alerta do sistema e para quem não tem o direito Enviar; `canClose` é falso em conversa finalizada.
- **Códigos:** 200, 401, 403, 404 (inexistente ou fora da participação).

### 2.8.3 Criar conversa

- **POST** `/api/v1/conversations` (cabeçalho `Idempotency-Key`, opção B de P-MSG-25: guardada em `AlertaPublicacao` com `ModuloOrigem = 'User'`, sem comparação do conteúdo; ver 04 L-06)
- **Request:** `{ recipient: { type: "user|team", id }, subject, content, patientId|null, process: { type, key }|null, deadline|null, urgencyLevel: "routine|urgent|asap|stat"|null }`
- **Efeito:** cria `Conversa` (status `Sent`, grau de urgência do pedido), `Mensagem` (sequência 1, tipo `Response`), copia os destinatários (`ConversaDestinatario`), grava a leitura do remetente, a ação `Send` e o evento de auditoria; tudo em uma transação.
- **Response 201:** `{ id }`. **Códigos:** 400 (validação, inclusive prazo anterior ao envio), 401, 403 (sem Enviar ou sem Visualizar), 422 (destinatário, paciente ou processo inválido), Chave repetida: 200 com o `id` da conversa já criada, **sem** comparar o conteúdo (opção B, D-MSG-020); por isso uma chave repetida com texto diferente também devolve a conversa antiga e o texto novo é ignorado. A chave vale por usuário: a Mensageria grava `{IdUsuario}:{Idempotency-Key}` **[PROPOSTA]**.

### 2.8.4 Marcar como lida

- **POST** `/api/v1/conversations/{id}/read` — atualiza a leitura do usuário para a última sequência e, se o status era `Sent` e o usuário não é o remetente, muda para `Read`. Idempotente: só grava ação `Read` e auditoria quando a leitura avança, com `StatusNovo` igual ao status atual. A conversa passa a `Read` quando um destinatário que não é o remetente a abre pela primeira vez; num autoenvio, nasce `Read`. **Códigos:** 204, 401, 403, 404.

### 2.8.5 Responder

- **POST** `/api/v1/conversations/{id}/reply`
- **Request:** `{ content }`. **Efeito:** nova `Mensagem` (`Response`), `UltimaSequencia + 1`, status `Responded`, leitura do autor atualizada, ação `Response`, auditoria. Em equipe, o autor é gravado com a equipe de origem quando é membro (RN-MSG-030).
- **Response 201:** `{ messageId, sequence }`. **Códigos:** 400, 401, 403 (sem Enviar), 404, 409 (finalizada ou alerta do sistema).

### 2.8.6 Resolver e descartar

- **PATCH** `/api/v1/conversations/{id}/resolve` e `/discard`. Sem corpo. **Efeito:** status `Resolved` ou `Dismissed`, ação `Resolve` ou `Dismiss` com o usuário, auditoria. Nenhuma mensagem é criada (RN-MSG-009). **Códigos:** 204, 401, 403, 404, 409 (já finalizada; a resposta traz quem finalizou e quando).
- Concorrência: se a versão da conversa mudou por outra causa (leitura ou resposta), a API relê e repete; só devolve 409 se a conversa já estiver finalizada. O primeiro pedido de finalização vence e o segundo recebe 409 (EX-MSG-04). Resolver e descartar exigem o direito Visualizar (E-MSG-010).

### 2.8.7 Destinatários possíveis

- **GET** `/api/v1/conversations/recipients?q=&limit=8` — `{ teams: [ { id, name, memberCount } ], people: [ { id, name, isSelf } ], hasMore }` (equipes antes das pessoas; RN-MSG-036). Exige o direito Enviar (e Visualizar). Pessoas: usuários ativos da clínica com o direito Visualizar, inclusive o próprio. Equipes: ativas, com pelo menos um membro ativo. `q` ignora maiúsculas e acentos; sem `q`, devolve as primeiras opções. **Códigos:** 200, 401, 403.

### 2.8.8 Busca de paciente

- Reuso de `GET /api/v1/patients/search` (Central do Médico), por nome, com `q` e `limit=8`; devolve `hasMore` para o aviso MSG-TMSG-42 (se o serviço atual não tiver o limite, ele é acrescentado).

### 2.8.9 Opções de processo [PROPOSTA]

- **GET** `/api/v1/conversations/process-options?patientId=&type=&q=&limit=8` — `patientId` obrigatório. Sem `type`: `{ types: [ "Paciente|Prescricao|Documento|RegistroClinico" ] }` (etapa 2). Com `type`: `{ options: [ { key, label, detail }], hasMore }`, só os itens do paciente, filtrados por `q` (etapa 3): Prescrição, por `Prescricao.Identificacao` em qualquer parte do texto (`label` é a identificação; `detail`, a data da prescrição); Documento, por nome (`label` é o nome; `detail`, a data); Registro clínico, por data (`label` é data, modelo e profissional); cada tipo filtra só pelo seu campo (D-MSG-050); no tipo `Paciente` devolve só o próprio paciente. Cada módulo fornece os seus itens e novos tipos entram sem mudar a mensageria. Tipo desconhecido (por exemplo `Agenda`): 400 MSG-EMSG-11. A mensageria só consolida (P-MSG-07).

### 2.8.10 Publicação de alerta pelo sistema [PROPOSTA]

- Interface de integração entre módulos (serviço interno, não exposta ao front-end): `PublishAlert { clinicId, moduleOrigin, idempotencyKey, recipient: { type, id }, subject, content, patientId?, process?, deadline?, urgencyLevel?, previousConversationId? }`.
- **Efeito:** cria `Conversa` com `OrigemTipo = System`, a `Mensagem` inicial (sem autor), os destinatários, o registro em `AlertaPublicacao` e o evento em `OutboxEvento`. Uma segunda chamada com a mesma chave (clínica, módulo, chave) devolve a conversa já criada (RN-MSG-029).
- Anomalia que persiste (RN-MSG-016): com a conversa **aberta**, o módulo chama `AppendAlertUpdate { conversationId, idempotencyKey, content }` (sem `urgencyLevel`: o grau da conversa não muda, RN-MSG-034). **Anomalia que se agrava (D-MSG-033):** o módulo publica um novo alerta, com o novo grau e `previousConversationId`, e descarta o anterior; o descarte grava a ação `Dismiss` sem usuário (`IdUsuarioAtor` nulo, 04, ConversaAcao), exibida como "Descartada por Sistema". **[PROPOSTA de mecanismo, E-MSG-019]:** chamada `DismissAlert { conversationId, idempotencyKey }`, que acrescenta uma mensagem do sistema, de tipo `Response` e autor nulo (cada atualização tem a sua chave, registrada em `AlertaPublicacao`); com a conversa **finalizada**, chama `PublishAlert` com `previousConversationId`. A interface recusa `previousConversationId` que aponte para conversa ainda aberta.

## 2.9 Catálogo de mensagens e termos de interface (i18n)

Os textos são cadastrados como termos traduzíveis (DT-011) e exibidos no idioma da clínica (DT-012). Variáveis entre chaves: `{dt}` data e hora no fuso e idioma da clínica; `{name}` nome; `{n}` número de membros; `{fmt}` formato esperado. Os IDs marcados "reuso" já existem em outras funcionalidades e não devem ser duplicados. MSG-TMSG-35 é a forma singular de MSG-TMSG-14 (um membro). IDs numerados com saltos (por exemplo, MSG-TMSG-04) não são reaproveitados.

| ID | Uso | pt-BR | en-US | es-419 |
|---|---|---|---|---|
| MSG-TMSG-01 | Texto | Mensagens | Messages | Mensajes |
| MSG-TMSG-02 | Texto | Nenhuma conversa em aberto. | No open conversations. | No hay conversaciones abiertas. |
| MSG-TMSG-03 | Texto | Nenhuma conversa finalizada. | No closed conversations. | No hay conversaciones finalizadas. |
| MSG-TMSG-05 | Texto | Responder até {dt} | Reply by {dt} | Responder hasta {dt} |
| MSG-TMSG-06 | Texto | Vencida desde {dt} | Overdue since {dt} | Vencida desde {dt} |
| MSG-TMSG-07 | Texto | Aberta | Open | Abierta |
| MSG-TMSG-08 | Texto | Resolvida | Resolved | Resuelta |
| MSG-TMSG-09 | Texto | Descartada | Discarded | Descartada |
| MSG-TMSG-10 | Texto | Não lida | Unread | No leída |
| MSG-TMSG-11 | Texto | Alerta do sistema | System alert | Alerta del sistema |
| MSG-TMSG-12 | Texto | De | From | De |
| MSG-TMSG-13 | Texto | Para | To | Para |
| MSG-TMSG-14 | Texto | Equipe {name} · {n} membros | Team {name} · {n} members | Equipo {name} · {n} miembros |
| MSG-TMSG-15 | Texto | Você | You | Usted |
| MSG-TMSG-16 | Texto | Resolvida por {name} em {dt} | Resolved by {name} on {dt} | Resuelta por {name} el {dt} |
| MSG-TMSG-17 | Texto | Descartada por {name} em {dt} | Discarded by {name} on {dt} | Descartada por {name} el {dt} |
| MSG-TMSG-19 | Texto | Esta conversa foi finalizada. Não é possível responder. | This conversation is closed. You can no longer reply. | Esta conversación está finalizada. Ya no es posible responder. |
| MSG-TMSG-20 | Texto | Alertas do sistema não recebem resposta. | System alerts cannot be replied to. | Las alertas del sistema no admiten respuesta. |
| MSG-TMSG-24 | Texto | Conversa resolvida. | Conversation resolved. | Conversación resuelta. |
| MSG-TMSG-25 | Texto | Conversa descartada. | Conversation discarded. | Conversación descartada. |
| MSG-TMSG-26 | Texto | Mensagem enviada. | Message sent. | Mensaje enviado. |
| MSG-TMSG-27 | Texto | Resposta enviada. | Reply sent. | Respuesta enviada. |
| MSG-TMSG-29 | Texto | Sistema | System | Sistema |
| MSG-TMSG-30 | Texto | Atualização do sistema | System update | Actualización del sistema |
| MSG-TMSG-31 | Texto | Enviada | Sent | Enviada |
| MSG-TMSG-32 | Texto | Lida | Read | Leída |
| MSG-TMSG-34 | Texto | (você) | (you) | (usted) |
| MSG-TMSG-35 | Texto | Equipe {name} · 1 membro | Team {name} · 1 member | Equipo {name} · 1 miembro |
| MSG-TMSG-36 | Texto (título e nome acessível do chip) | Grau de urgência: {name} | Urgency level: {name} | Grado de urgencia: {name} |
| MSG-TMSG-37 | Texto | Nenhum grau selecionado: a conversa será enviada sem grau. Depois do envio, o grau não pode ser alterado. | No level selected: the conversation is sent without an urgency level. It cannot be changed after sending. | Ningún grado seleccionado: la conversación se enviará sin grado de urgencia. No se puede cambiar después del envío. |
| MSG-TMSG-38 | Texto | Depois do envio, o grau não pode ser alterado. | It cannot be changed after sending. | No se puede cambiar después del envío. |
| MSG-TMSG-39 | Texto | Há {n} min | {n} min ago | Hace {n} min |
| MSG-TMSG-40 | Texto | Há {n} h | {n} h ago | Hace {n} h |
| MSG-TMSG-41 | Texto | Nenhum resultado para "{q}". | No results for "{q}". | Sin resultados para "{q}". |
| MSG-TMSG-42 | Texto | Há mais resultados. Refine a busca. | There are more results. Refine your search. | Hay más resultados. Refine la búsqueda. |
| MSG-LMSG-01 | Rótulo | Destinatário | Recipient | Destinatario |
| MSG-LMSG-02 | Rótulo | Pessoas | People | Personas |
| MSG-LMSG-03 | Rótulo | Equipes | Teams | Equipos |
| MSG-LMSG-04 | Placeholder | Selecione | Select | Seleccione |
| MSG-LMSG-05 | Rótulo | Assunto | Subject | Asunto |
| MSG-LMSG-06 | Rótulo | Mensagem | Message | Mensaje |
| MSG-LMSG-07 | Rótulo | Paciente (opcional) | Patient (optional) | Paciente (opcional) |
| MSG-LMSG-08 | Rótulo | Prazo para resposta (opcional) | Reply deadline (optional) | Plazo de respuesta (opcional) |
| MSG-LMSG-09 | Rótulo | Processo relacionado (opcional) | Related process (optional) | Proceso relacionado (opcional) |
| MSG-LMSG-10 | Opção | Paciente | Patient | Paciente |
| MSG-LMSG-11 | Placeholder | dd/mm/aaaa hh:mm | mm/dd/yyyy hh:mm | dd/mm/aaaa hh:mm |
| MSG-LMSG-12 | Opção | Prescrição | Prescription | Prescripción |
| MSG-LMSG-13 | Opção | Nenhum | None | Ninguno |
| MSG-LMSG-14 | Placeholder | Escreva uma resposta... | Write a reply... | Escriba una respuesta... |
| MSG-LMSG-15 | Opção | Consulta (sem uso desde a v1.5; Agenda saiu, D-MSG-037) | Appointment | Consulta |
| MSG-LMSG-16 | Rótulo | Grau de urgência (opcional) | Urgency level (optional) | Grado de urgencia (opcional) |
| MSG-LMSG-17 | Opção | Documento | Document | Documento |
| MSG-LMSG-18 | Opção | Registro clínico | Clinical record | Registro clínico |
| MSG-LMSG-19 | Rótulo | Item do processo | Process item | Elemento del proceso |
| MSG-LMSG-20 | Subtítulo | Opcionais | Optional | Opcionales |
| MSG-LMSG-21 | Marcador do campo | Digite para buscar | Type to search | Escriba para buscar |
| MSG-LMSG-22 | Marcador do campo | Identificação da prescrição (qualquer parte) | Prescription ID (any part) | Identificación de la prescripción (cualquier parte) |
| MSG-LMSG-23 | Marcador do campo | Nome do documento | Document name | Nombre del documento |
| MSG-LMSG-24 | Marcador do campo | Data do registro, por exemplo 21/10/2026 | Record date, for example 21/10/2026 | Fecha del registro, por ejemplo 21/10/2026 |
| MSG-LMSG-25 | Marcador do campo | Nome do paciente | Patient name | Nombre del paciente |
| MSG-IND-1 | Termo (Indicadores), chave `routine` | Rotina | Routine | Rutina |
| MSG-IND-2 | Termo (Indicadores), chave `urgent` | Urgente | Urgent | Urgente |
| MSG-IND-3 | Termo (Indicadores), chave `asap` | Quanto antes | ASAP | Cuanto antes |
| MSG-IND-4 | Termo (Indicadores), chave `stat` | Imediato | STAT | Inmediato |
| MSG-EMSG-01 | Erro | Informe o destinatário. | Select a recipient. | Indique el destinatario. |
| MSG-EMSG-02 | Erro | Informe o assunto. | Enter a subject. | Indique el asunto. |
| MSG-EMSG-03 | Erro | Escreva a mensagem. | Write the message. | Escriba el mensaje. |
| MSG-EMSG-04 | Erro | O prazo não pode ser anterior ao momento do envio. | The deadline cannot be earlier than the moment of sending. | El plazo no puede ser anterior al momento del envío. |
| MSG-EMSG-05 | Erro | Informe data e hora completas ({fmt}). | Enter a complete date and time ({fmt}). | Indique fecha y hora completas ({fmt}). |
| MSG-EMSG-07 | Erro | Não foi possível carregar as mensagens. Tente novamente. | Could not load messages. Try again. | No fue posible cargar los mensajes. Intente de nuevo. |
| MSG-EMSG-08 | Erro | Não foi possível enviar. Tente novamente. | Could not send. Try again. | No fue posible enviar. Intente de nuevo. |
| MSG-EMSG-09 | Erro | Conversa não encontrada. | Conversation not found. | Conversación no encontrada. |
| MSG-EMSG-10 | Erro | Este destinatário não pode receber mensagens agora. | This recipient cannot receive messages right now. | Este destinatario no puede recibir mensajes ahora. |
| MSG-EMSG-11 | Erro | Paciente ou processo inválido. | Invalid patient or process. | Paciente o proceso no válido. |
| MSG-EMSG-12 | Erro | Não foi possível concluir a ação. Tente novamente. | Could not complete the action. Try again. | No fue posible completar la acción. Intente de nuevo. |
| MSG-EMSG-13 | Erro | Grau de urgência inválido. | Invalid urgency level. | Grado de urgencia no válido. |
| MSG-EMSG-14 | Erro | Escolha o item do processo. | Choose the process item. | Elija el elemento del proceso. |
| MSG-BMSG-01 | Botão | Nova mensagem | New message | Nuevo mensaje |
| MSG-BMSG-02 | Botão | Enviar | Send | Enviar |
| MSG-BMSG-03 | Botão | Cancelar | Cancel | Cancelar |
| MSG-BMSG-04 | Botão | Voltar | Back | Volver |
| MSG-BMSG-05 | Botão | Responder | Reply | Responder |
| MSG-BMSG-06 | Botão | Resolvido | Resolved | Resuelto |
| MSG-BMSG-07 | Botão | Descartado | Discarded | Descartado |
| MSG-BMSG-08 | Aba | Abertas | Open | Abiertas |
| MSG-BMSG-09 | Aba | Finalizadas | Closed | Finalizadas |
| MSG-BMSG-10 | Link | (sem uso desde a v1.10: o painel não tem mais o link "Ver todas as mensagens"; D-MSG-049) | — | — |
| MSG-BMSG-11 | Botão | Fechar | Close | Cerrar |
| MSG-BMSG-12 | Botão | Abrir prontuário | Open medical record | Abrir historia clínica |
| MSG-BMSG-13 | Botão | Abrir prescrição | Open prescription | Abrir prescripción |
| MSG-BMSG-14 | Botão | Abrir consulta (sem uso desde a v1.5) | Open appointment | Abrir consulta |
| MSG-BMSG-15 | Botão | Abrir documento | Open document | Abrir documento |
| MSG-BMSG-16 | Botão | Abrir registro clínico | Open clinical record | Abrir registro clínico |
| MSG-BMSG-15 | Botão | Tentar novamente | Try again | Intentar de nuevo |
| MSG_resolveConfirmTitle (reuso, Central) | Confirmação | Resolver conversa? | Resolve conversation? | ¿Resolver la conversación? |
| MSG_resolveConfirmBody (reuso) | Confirmação | A conversa será marcada como resolvida para todos os destinatários. | The conversation will be marked as resolved for all recipients. | La conversación se marcará como resuelta para todos los destinatarios. |
| MSG_resolveConfirmOk (reuso) | Confirmação | Resolver | Resolve | Resolver |
| MSG_discardConfirmTitle (reuso) | Confirmação | Descartar conversa? | Discard conversation? | ¿Descartar la conversación? |
| MSG_discardConfirmBody (reuso) | Confirmação | A conversa será descartada para todos os destinatários. | The conversation will be discarded for all recipients. | La conversación se descartará para todos los destinatarios. |
| MSG_discardConfirmOk (reuso) | Confirmação | Descartar | Discard | Descartar |
| MSG-TAGM-09 (reuso, Agenda) | Fuso | Fuso horário: {name} ({gmt}) | Time zone: {name} ({gmt}) | Huso horario: {name} ({gmt}) |
| MSG-TAGM-10 (reuso, Agenda) | Fuso | — diferente do fuso deste aparelho | — different from this device's time zone | — distinto del huso de este dispositivo |
| MSG_connectionLost (reuso, Central) | Faixa | Sem conexão — dados atualizados às {hh:mm} | No connection — data updated at {hh:mm} | Sin conexión — datos actualizados a las {hh:mm} |

Nota: o texto da faixa de sem conexão deve ser conferido contra o catálogo da Central antes da implementação (a versão acima reproduz o padrão da Agenda, MSG-TAGM-03).

## 2.10 Acessibilidade

- Cartão: um único elemento clicável (link ou botão) com nome acessível "assunto, autor, última mensagem, data, estado (não lida, vencida), grau de urgência (quando informado)".
- A borda de não lida é decorativa; a informação equivalente está no nome acessível ("não lida") e no texto oculto "Não lida" lido antes da mensagem.
- Chip de urgência: o nome do grau é o texto visível, o título e o nome acessível são "Grau de urgência: {nome}" e o ícone é decorativo; a cor reforça, mas nunca é o único sinal; contraste do texto de pelo menos 4,5:1 em cada nível e tema (2.3.8). Seletor de grau: grupo de rádio com legenda "Grau de urgência (opcional)"; as setas mudam a opção e a barra de espaço na opção marcada a desmarca. Campos de busca: padrão de caixa de combinação (2.3.9).
- Confirmação: foco inicial em "Cancelar", Esc cancela, foco volta ao elemento que abriu o diálogo.
- Campo de data e hora com rótulo, máscara anunciada ("dd/mm/aaaa hh:mm") e mensagem de erro associada ao campo.
- Atualização automática não anuncia a lista inteira; só a mudança de contagem de não lidas.
- Contraste mínimo de 4,5:1 para texto e 3:1 para elementos não textuais, nos temas claro e escuro. Alvo de toque de 44 px.
- Respeitar a preferência de reduzir movimento.

## 2.11 Conformidade SBIS (detalhamento)

Requisitos identificados no documento 01 (item 1.10), conferidos contra o arquivo de requisitos SBIS v5.2 (coluna do estágio para clínica/ambulatório). **Atende** = coberto pelo desenho; **Parcial** = depende de proposta pendente; **Não se aplica** = justificado.

| Requisito (estágio) | Como é atendido | Situação |
| --- | --- | --- |
| NGS1.03.01 (1) Impedir acesso de não autorizados | Todos os endpoints exigem sessão autenticada; participação na conversa verificada no servidor (404 fora da participação) | Atende |
| NGS1.03.03 (1) Perfis e permissões | Direitos Visualizar e Enviar no perfil de acesso (seeds em 04, item 4.6) | Atende, depende dos seeds [PROPOSTA] |
| NGS1.03.04 (2) Segregação por tipo de operação | Visualizar e Enviar independentes; resolver e descartar seguem Visualizar [PROPOSTA, P-MSG-12] | Parcial até decisão |
| NGS1.03.09 (1) Identidade única | Toda mensagem e ação guarda o usuário; o remetente é imutável (RN-MSG-014); alerta guarda o módulo | Atende |
| NGS1.05.01 (1) Comunicação segura | Tráfego exclusivamente por canal seguro entre o front-end e a API | Atende (padrão da plataforma) |
| NGS1.05.02 (1) Processamento no servidor | Ordem, "vencida", "não lida", permissões e todas as validações no servidor (2.6, 2.8) | Atende |
| NGS1.06.01 (1) SGBD | Dados no banco do cliente (04) | Atende |
| NGS1.07.01 (1) Auditoria contínua | Evento de auditoria para envio, leitura, resposta, resolução e descarte | Atende, depende do componente de auditoria |
| NGS1.07.02 (1) Proteção da trilha | A trilha de auditoria fica na trilha central de segurança (E-MSG-009), fora do schema da mensageria. O acesso à trilha só por auditor ou administrador pertence ao componente de auditoria. A integridade do histórico da conversa (cascata de exclusão) é a lacuna L-02 do Mapeamento | Atende, depende do componente de auditoria |
| NGS1.07.03 (1) Eventos registrados | Eventos listados acima, com o módulo gerador nos alertas (04, L-03) | Atende |
| NGS1.07.05 (1) Informações do registro | Usuário, data e hora, identificador da conversa e tipo de ação. **Lacuna:** endereço de origem não está na tabela de ações (04, L-01) | Parcial |
| NGS1.07.06 (1) Privacidade na trilha | Nem o texto da mensagem nem a identificação do paciente entram na trilha; só identificadores | Atende |
| ECF.15.01 (2) Notas vinculadas a paciente | Associação opcional a paciente (RN-MSG-020), exibida no cartão. O requisito pede a nota visível no prontuário; a conversa **não** aparece no prontuário (RN-MSG-026) | Parcial |
| ECF.15.02 (3) Notas para o profissional | Mensagem a si mesmo ou a outro profissional | Atende |
| ECF.15.03 (3) Mensagens coletivas | Envio a equipes (RN-MSG-015). Não há envio agendado | Parcial |
| ECF.17.01 (1) Profissional responsável pelo evento | Autor de cada mensagem e ator de cada ação | Atende |
| ECF.17.02 (1) Registro de tempo | Data e hora de cada mensagem e ação, em UTC, exibidas no fuso da clínica | Atende |
| ECF.17.03 (1) Tempo da ocorrência | Data e hora de cada mensagem e ação gravadas no momento em que ocorrem; não há registro retroativo | Atende |
| ECF.17.04 (1) Cronologia de eventos | Mensagens por sequência; ações por data e hora. A ordem da lista de conversas (2.3.3) é de prioridade, não cronológica | Parcial |
| ECF.17.05 (1) Consistência cronológica | O prazo não pode ser anterior ao envio (RN-MSG-004), validado no servidor | Atende |
| ECF.17.18 (1) Idioma | O requisito exige todos os textos em português do Brasil. O pt-BR é completo; en-US e es-419 complementam (RN-MSG-013, D-MSG-019). Os termos vindos do banco passam por `TermoTraducao` (DT-011); o pt-BR precisa ter todas as linhas | Atende, com a carga de pt-BR completa (CT-MSG-265) |
| ECF.17.18 e ECF.17.19 aplicados ao grau de urgência (1) | Os quatro nomes existem em pt-BR (Rotina, Urgente, Quanto antes, Imediato), en-US e es-419, cadastrados em `TermoTraducao` (MSG-IND-1 a 4); o pt-BR é completo | Atende, depende do seed (04, item 4.6) |
| ECF.17.19 (1) Mensagens do sistema | Catálogo de mensagens em linguagem não técnica (2.9), com o pt-BR completo | Atende (CT-MSG-265) |

Pendência herdada da Central do Médico: P-CM-026(a), em que o consultor jurídico quer a mensageria fora do escopo SBIS, segue em aberto; esta especificação documenta o caso em que ela está dentro.

---

## Histórico de Versões

- **v1.0** (22/10/2026) — Criação da Especificação da Mensageria, a pedido do solicitante, a partir da Definição v1.0, do documento anexado "Especificação Funcional Consolidado, Serviço de Comunicação Entre Profissionais, v1.0" (12/08/2026), da auditoria das telas implementadas (21/10/2026), do redesenho e das decisões de 21 e 22/10/2026 (que prevalecem nas divergências). Incorpora e substitui o documento "(MSG-Redesenho) Regras e textos 22-10-2026", cujo conteúdo foi absorvido (cartão 2.3.1, telas 2.3.2 a 2.3.6, catálogo 2.9). Decisões do solicitante refletidas: o usuário recebe mensagens da equipe da qual faz parte (P-MSG-02); data e hora em um campo único, componente React em aberto (P-MSG-04); o padrão de cor dos botões fica em aberto (P-MSG-01); ordem das abertas por "maior entre última mensagem e prazo" (aceita a sugestão). Conformidade SBIS conferida contra o arquivo de requisitos (resposta a P-MSG-05): lacunas L-01 e L-02 do Mapeamento. Itens [PROPOSTA] novos nesta versão: limite de 4000 caracteres, paginação de 20, ordem de "Finalizadas", processo condicionado a paciente, Idempotency-Key, interface de publicação de alerta, MSG-TMSG-30 e textos de erro MSG-EMSG-07 a 11. Revisão por Dois Críticos: ver entrada seguinte.
- **v1.0, revisão por Dois Críticos** (22/10/2026) — Crítico técnico independente, 43 achados, conferidos contra o DDL, o arquivo de requisitos SBIS e o protótipo executado. Aplicados: estado Enviada, Lida e Respondida visível (CA-MSG-016.1, textos MSG-TMSG-31 a 35) e regra de leitura e autoenvio; contrato de atualização de alerta alinhado a RN-MSG-016 (`AppendAlertUpdate`); idempotência do envio condicionada à nova estrutura (04, L-06); regras novas na Definição (RN-MSG-031 a 033); Enviar exige Visualizar; concorrência de finalização sem 409 indevido; paginação com ordem mutável; conformidade SBIS corrigida (ECF.17.18 e 17.19 exigem português do Brasil, ECF.17.04 parcial, ECF.17.03 e 17.05 acrescentados, ECF.14.36 retirado, NGS1.07.02 reescrito); CA-MSG-001.2 reescrito; protótipo corrigido (envio volta à lista, atalho no modal, validação de data, estrutura HTML). Registrados como risco ou questão aberta: efeito da ordem por prazo distante (um lembrete com prazo em meses fica no topo do seu grupo; o vencido afunda abaixo de mensagens novas), uso da fila de eventos, índice por remetente e idioma (P-MSG-24). Não aplicados: nenhum falso positivo claro; "Esc sempre chama render" e foco no diálogo ficam para a revisão de UI/UX da versão aprovada.
- **v1.1** (27/10/2026) — Respostas do solicitante e alinhamento com a Central do Médico v5.15, DT-013 e o Log de Mudanças: (1) borda de não lida de 3 px em `secondary-dark`, como na Central (P-MSG-09, D-CM-045); (2) cartão com a linha da clínica quando o usuário atende em mais de uma (DT-013, D-CM-064) e `clinic` no contrato; (3) botões: um só preenchido por região, em verde escuro (`--color-primary-strong`), secundário com contorno, "Resolvido" do cartão com contorno (P-MSG-01, Design System seção 12); (4) idempotência do envio pela opção B, sem comparar o conteúdo, e chave por usuário [PROPOSTA] (P-MSG-25); (5) tipo gravado da mensagem sempre `Response`, sem `Initial` nem `Update` (Log de Mudanças, 26/10/2026); (6) ECF.17.18 e 17.19 atendidos com o pt-BR completo (P-MSG-24). Em aberto: o selo de estado do cartão (P-MSG-13).
- **v1.2** (27/10/2026) — Respostas do solicitante (P-MSG-13, P-MSG-29): (1) o cartão não tem mais chip de estado de envio; mostra assunto e data e hora à direita (mantidos assim por decisão do solicitante), "autor: mensagem" e, quando a última mensagem é do usuário, `check` ou `check-check` (D-MSG-023); (2) `readByOthers` no contrato; (3) CA-MSG-016.1 reescrito e CA-MSG-016.2 novo; (4) MSG-TMSG-33 ("Respondida") retirado do catálogo; MSG-TMSG-31 e 32 passam a ser rótulos dos ícones; (5) o ícone também aparece nas mensagens do usuário dentro da conversa **[PROPOSTA]**.
- **v1.3** (28/10/2026) — Grau de urgência (D-MSG-025 a 027): nova seção 2.3.8 (chip, quatro níveis e tokens); campo no formulário (2.3.4) e validação (2.6); chip no cartão e no cabeçalho (2.3.1, 2.3.5); ordem por grau antes da data (2.3.7, 2.8.1); contrato com `urgency` na listagem, no detalhe, na criação e em `PublishAlert` (sem `urgency` em `AppendAlertUpdate`); critérios CA-MSG-017.1 a 017.8; textos MSG-TMSG-36 a 38, MSG-LMSG-16, MSG-IND-1 a 4 e MSG-EMSG-13; acessibilidade e SBIS (ECF.17.18 e 17.19). A coluna `GrauUrgencia` e os seeds de `Indicadores` são **[PROPOSTA]** (04, L-09 e L-10).
- **v1.4** (28/10/2026) — Respostas do solicitante ao Registro v1.3 (D-MSG-029 a 034): horário relativo no cartão pela regra da Central (2.3.1, 2.3.7; RN-MSG-035); limite de 2000 caracteres com contador na mensagem e na resposta (2.3.4, 2.6); processo como atalho de um só tipo por conversa, sem depender do paciente, com tipo Documento (2.3.4, 2.6, 2.8.9; RN-MSG-021); alerta que se agrava abre nova conversa e descarta a anterior (2.8.10); critérios CA-MSG-018.1 a 018.5 e CA-MSG-008.3 reescrito; textos MSG-TMSG-39 e 40, MSG-LMSG-17 e MSG-BMSG-15. Contrato de `urgency` e formato do chip confirmados.
- **v1.5** (28/10/2026) — Respostas do solicitante ao P-MSG-33 (D-MSG-035 a 037): tipo Paciente (prontuário), Prescrição, Documento e Registro clínico; Agenda sai; escolha em três etapas (paciente, tipo, item) com o processo exigindo paciente; 2.3.4, 2.6, 2.8.9, CA-MSG-008.3 e 019.1 a 019.4; textos MSG-LMSG-10 (Paciente), 18, 19, MSG-BMSG-16 e MSG-EMSG-14.
- **v1.6** (28/10/2026) — Grau de urgência no domínio HL7 (`Routine`, `Urgent`, `ASAP`, `STAT`; Rotina, Urgente, Quanto antes, Imediato), chip só com o nome, contrato com `key` (D-MSG-039; 2.3.8, 2.6, 2.8); formulário com a nova ordem (Destinatário, Assunto, Mensagem e, em "Opcionais", grau, prazo, paciente e processo; D-MSG-040); destinatário, paciente e item do processo por busca com autocomplete (nova 2.3.9, D-MSG-038; 2.8.7 a 2.8.9); CA-MSG-020.1 a 020.6; textos MSG-LMSG-20 a 25, MSG-TMSG-41 e 42, MSG-IND-1 a 4 e MSG-TMSG-36 atualizados.
- **v1.7** (29/10/2026) — Respostas do solicitante: Rotina aparece como chip (2.3.8; D-MSG-043); itens do processo por data do evento (2.3.9; D-MSG-044); aparência do cartão separado, com cantos arredondados, como na Central (2.3.1, item 8; D-MSG-045); CA-MSG-021.1 a 021.3.
- **v1.9** (29/10/2026) — Campo do grau na API e no código passa de `urgency` a `urgencyLevel` (2.6, 2.8; D-MSG-048). A coluna `GrauUrgencia` não muda.
- **v1.8** (29/10/2026) — Botão "Resolvido" retirado do cartão (2.3.1 item 5, 2.10, tabela de componentes; CA-MSG-005.1 e 021.4; D-MSG-047); chaves do grau em minúsculas na API e na tabela de chips (D-MSG-046).
- **v1.10** (29/10/2026) — Painel sem limite de 4 cartões e sem o link "Ver todas as mensagens"; rolagem própria como os demais painéis da Central (2.3.2; CA-MSG-001.1 e 001.3; MSG-BMSG-10 sem uso; D-MSG-049).
- **v1.11** (29/10/2026) — Campos de busca e de exibição do item do processo corrigidos: Prescrição por `Prescricao.Identificacao` (qualquer parte), Documento por nome (exibe nome e data), Registro clínico por data (exibe data, modelo e profissional) (formulário; 2.3.9; CA-MSG-020.4; 2.8.9; MSG-LMSG-22 a 24; D-MSG-050).
- **v1.12** (30/10/2026) — Registro clínico: data do evento, modelo e profissional com origem definida (D-MSG-051; 04, 4.4.1). Documento sem mudança, por ora.
- **v1.13** (30/10/2026) — Registro clínico: formato da busca por data e ordem do profissional confirmados (D-MSG-052).
- **v1.14** (30/10/2026) — Sem mudança de conteúdo; acompanha a correção do Mapeamento (nome da coluna `SegurancaUsuarioId`).
- **v1.15** (05/11/2026) — Novo visual do cartão e do cabeçalho do painel, alinhados à Central: ordem de importância mensagem, título, urgência, demais informações; paciente e prazo em texto sem chip; sem ícone de carta; avatar de 36 px (2.3.1 itens 1 a 4, 6 e 8; 2.3.8; CA-MSG-004.2; D-MSG-053).
